Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 27922b4260f65d317aabda37e42bbbff > files > 2373

kernel-2.6.18-238.el5.src.rpm

From: Ivan Vecera <ivecera@redhat.com>
Date: Thu, 18 Nov 2010 14:07:43 -0500
Subject: [net] be2net: Update be2net to version 2.102.512r
Message-id: <1290089263-1824-1-git-send-email-ivecera@redhat.com>
Patchwork-id: 29486
O-Subject: [RHEL5.6 PATCH] be2net: Update be2net to version 2.102.512r
Bugzilla: 647259
RH-Acked-by: Stanislaw Gruszka <sgruszka@redhat.com>
RH-Acked-by: David S. Miller <davem@redhat.com>
RH-Acked-by: Thomas Graf <tgraf@redhat.com>

BZs:
#647259 - [Emulex 5.6 bug] Update be2net to version 2.102.512r

Description:
This patch updates be2net driver to version 2.102.512r (adds 3 important
upstream bugfixes - see below).

Test status:
Build OK. Tested by Emulex and also by myself.

Upstream commits:
63a7694 be2net: Call netif_carier_off() after register_netdev()
c6ce2f4 be2net: Fix CSO for UDP packets
f203af7 be2net: Schedule/Destroy worker thread in probe()/remove() rather than open()/close()

Signed-off-by: Ivan Vecera <ivecera@redhat.com>

diff --git a/drivers/net/benet/be.h b/drivers/net/benet/be.h
index cc12c54..151b4ea 100644
--- a/drivers/net/benet/be.h
+++ b/drivers/net/benet/be.h
@@ -34,7 +34,7 @@
 
 #include "be_hw.h"
 
-#define DRV_VER			"2.102.453r"
+#define DRV_VER			"2.102.512r"
 #define DRV_NAME		"be2net"
 #define BE_NAME			"ServerEngines BladeEngine2 10Gbps NIC"
 #define BE3_NAME		"ServerEngines BladeEngine3 10Gbps NIC"
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c
index 02f039b..1c9740c 100644
--- a/drivers/net/benet/be_main.c
+++ b/drivers/net/benet/be_main.c
@@ -687,20 +687,16 @@ static void be_rx_stats_update(struct be_adapter *adapter,
 	stats->be_rx_pkts++;
 }
 
-static inline bool do_pkt_csum(struct be_eth_rx_compl *rxcp, bool cso)
+static inline bool csum_passed(struct be_eth_rx_compl *rxcp)
 {
-	u8 l4_cksm, ip_version, ipcksm, tcpf = 0, udpf = 0, ipv6_chk;
+	u8 l4_cksm, ipv6, ipcksm;
 
 	l4_cksm = AMAP_GET_BITS(struct amap_eth_rx_compl, l4_cksm, rxcp);
 	ipcksm = AMAP_GET_BITS(struct amap_eth_rx_compl, ipcksm, rxcp);
-	ip_version = AMAP_GET_BITS(struct amap_eth_rx_compl, ip_version, rxcp);
-	if (ip_version) {
-		tcpf = AMAP_GET_BITS(struct amap_eth_rx_compl, tcpf, rxcp);
-		udpf = AMAP_GET_BITS(struct amap_eth_rx_compl, udpf, rxcp);
-	}
-	ipv6_chk = (ip_version && (tcpf || udpf));
+	ipv6 = AMAP_GET_BITS(struct amap_eth_rx_compl, ip_version, rxcp);
 
-	return ((l4_cksm && ipv6_chk && ipcksm) && cso) ? false : true;
+	/* Ignore ipcksm for ipv6 pkts */
+	return l4_cksm && (ipcksm || ipv6);
 }
 
 static struct be_rx_page_info *
@@ -851,10 +847,10 @@ static void be_rx_compl_process(struct be_adapter *adapter,
 
 	skb_fill_rx_data(adapter, skb, rxcp, num_rcvd);
 
-	if (do_pkt_csum(rxcp, adapter->rx_csum))
-		skb->ip_summed = CHECKSUM_NONE;
-	else
+	if (likely(adapter->rx_csum && csum_passed(rxcp)))
 		skb->ip_summed = CHECKSUM_UNNECESSARY;
+	else
+		skb->ip_summed = CHECKSUM_NONE;
 
 	skb->truesize = skb->len + sizeof(struct sk_buff);
 	skb->protocol = eth_type_trans(skb, adapter->netdev);
@@ -1567,6 +1563,20 @@ static void be_worker(void *data)
 		container_of(work, struct be_adapter, work.work);
 	int status;
 
+	/* when interrupts are not yet enabled, just reap any pending
+	* mcc completions */
+	if (!netif_running(adapter->netdev)) {
+		int mcc_compl;
+
+		mcc_compl = be_process_mcc(adapter);
+
+		if (mcc_compl) {
+			struct be_mcc_obj *mcc_obj = &adapter->mcc_obj;
+			be_cq_notify(adapter, mcc_obj->cq.id, false, mcc_compl);
+		}
+		goto reschedule;
+	}
+
 	/* Get Stats */
 	status = be_cmd_get_stats(adapter, &adapter->stats.cmd);
 	if (!status)
@@ -1583,6 +1593,7 @@ static void be_worker(void *data)
 		be_post_rx_frags(adapter);
 	}
 
+reschedule:
 	schedule_delayed_work(&adapter->work.work, msecs_to_jiffies(1000));
 }
 
@@ -1726,8 +1737,6 @@ static int be_close(struct net_device *netdev)
 	struct be_eq_obj *be_eq = &adapter->be_eq;
 	int vec;
 
-	cancel_delayed_work_sync(&adapter->work);
-
 	be_async_mcc_disable(adapter);
 
 	netif_stop_queue(netdev);
@@ -1781,8 +1790,6 @@ static int be_open(struct net_device *netdev)
 	/* Now that interrupts are on we can process async mcc */
 	be_async_mcc_enable(adapter);
 
-	schedule_delayed_work(&adapter->work.work, msecs_to_jiffies(100));
-
 	status = be_cmd_link_status_query(adapter, &link_up, &mac_speed,
 			&link_speed);
 	if (status)
@@ -2261,7 +2268,6 @@ static void be_netdev_init(struct net_device *netdev)
 	netdev->poll = be_poll_compat;
 	adapter->napi.dev = netdev;
 
-	netif_carrier_off(netdev);
 	netif_stop_queue(netdev);
 }
 
@@ -2454,6 +2460,8 @@ static void __devexit be_remove(struct pci_dev *pdev)
 
 	sysfs_remove_group(&adapter->netdev->class_dev.kobj, &benet_attr_group);
 
+	cancel_delayed_work_sync(&adapter->work);
+
 	unregister_netdev(adapter->netdev);
 
 	be_clear(adapter);
@@ -2608,12 +2616,14 @@ static int __devinit be_probe(struct pci_dev *pdev,
 	status = register_netdev(netdev);
 	if (status != 0)
 		goto unsetup;
+	netif_carrier_off(netdev);
 
 	if (sysfs_create_group(&adapter->netdev->class_dev.kobj,
 			       &benet_attr_group))
 		dev_err(&pdev->dev, "Could not create sysfs group\n");
 
 	dev_info(&pdev->dev, "%s - %s\n", netdev->name, nic_name(pdev));
+	schedule_delayed_work(&adapter->work.work, msecs_to_jiffies(100));
 	return 0;
 
 unsetup: