[kernel] r19717 - in dists/sid/linux/debian: . patches patches/features/all/be2net
Ben Hutchings
benh at alioth.debian.org
Sun Jan 6 22:22:25 UTC 2013
Author: benh
Date: Sun Jan 6 22:22:24 2013
New Revision: 19717
Log:
be2net: Apply backported fixes requested by Emulex (Closes: #697479)
Added:
dists/sid/linux/debian/patches/features/all/be2net/0059-be2net-do-not-modify-PCI-MaxReadReq-size.patch
dists/sid/linux/debian/patches/features/all/be2net/0060-be2net-fix-reporting-number-of-actual-rx-queues.patch
dists/sid/linux/debian/patches/features/all/be2net/0061-be2net-do-not-use-SCRATCHPAD-register.patch
dists/sid/linux/debian/patches/features/all/be2net/0062-be2net-reduce-gso_max_size-setting-to-account-for-et.patch
dists/sid/linux/debian/patches/features/all/be2net/0063-be2net-Increase-statistics-structure-size-for-skyhaw.patch
dists/sid/linux/debian/patches/features/all/be2net/0064-be2net-Explicitly-clear-the-reserved-field-in-the-Tx.patch
dists/sid/linux/debian/patches/features/all/be2net/0065-be2net-Regression-bug-wherein-VFs-creation-broken-fo.patch
dists/sid/linux/debian/patches/features/all/be2net/0066-be2net-Fix-to-trim-skb-for-padded-vlan-packets-to-wo.patch
dists/sid/linux/debian/patches/features/all/be2net/0067-be2net-Fix-Endian.patch
dists/sid/linux/debian/patches/features/all/be2net/0068-be2net-Enable-RSS-UDP-hashing-for-Lancer-and-Skyhawk.patch
dists/sid/linux/debian/patches/features/all/be2net/0069-be2net-dont-pull-too-much-data-in-skb-linear-part.patch
dists/sid/linux/debian/patches/features/all/be2net/0070-be2net-Fix-to-parse-RSS-hash-from-Receive-completion.patch
dists/sid/linux/debian/patches/features/all/be2net/0071-netpoll-revert-6bdb7fe3104-and-fix-be_poll-instead.patch
Modified:
dists/sid/linux/debian/changelog
dists/sid/linux/debian/patches/series
Modified: dists/sid/linux/debian/changelog
==============================================================================
--- dists/sid/linux/debian/changelog Sun Jan 6 21:24:30 2013 (r19716)
+++ dists/sid/linux/debian/changelog Sun Jan 6 22:22:24 2013 (r19717)
@@ -42,6 +42,20 @@
- [armhf/vexpress] Add usb-modules
- Add standard set of USB drivers to nic-usb-modules
- Add nic-wireless-modules
+ * be2net: Apply backported fixes requested by Emulex (Closes: #697479)
+ - be2net: do not modify PCI MaxReadReq size
+ - be2net: fix reporting number of actual rx queues
+ - be2net: do not use SCRATCHPAD register
+ - be2net: reduce gso_max_size setting to account for ethernet header.
+ - be2net: Increase statistics structure size for skyhawk.
+ - be2net: Explicitly clear the reserved field in the Tx Descriptor
+ - be2net: Regression bug wherein VFs creation broken for multiple cards.
+ - be2net: Fix to trim skb for padded vlan packets to workaround an ASIC Bug
+ - be2net: Fix Endian
+ - be2net: Enable RSS UDP hashing for Lancer and Skyhawk
+ - be2net: dont pull too much data in skb linear part
+ - be2net: Fix to parse RSS hash from Receive completions correctly.
+ - be2net: Avoid disabling BH in be_poll()
[ Aurelien Jarno ]
* [armhf/vexpress] Add kernel udebs.
Added: dists/sid/linux/debian/patches/features/all/be2net/0059-be2net-do-not-modify-PCI-MaxReadReq-size.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/all/be2net/0059-be2net-do-not-modify-PCI-MaxReadReq-size.patch Sun Jan 6 22:22:24 2013 (r19717)
@@ -0,0 +1,41 @@
+From 21ba34daa00d71715d5d49740ebc8caac5e522d5 Mon Sep 17 00:00:00 2001
+From: Sathya Perla <sathya.perla at emulex.com>
+Date: Tue, 5 Jun 2012 19:37:19 +0000
+Subject: [PATCH 01/13] be2net: do not modify PCI MaxReadReq size
+
+commit 0513ac3d2212072c6694430b1003ad4246a35466 upstream.
+
+Setting the PCI MRRS to a value of 4096 (overriding the system decided
+value) had provided perf improvement in TX.
+But, IBM has provided feedback that on POWER platforms, this value is set
+by the system firmware, and drivers modifying this value can cause
+unpredictable results (like EEH errors.) So, backing off this change.
+On POWER7 platforms most slots, it seems, do get a MRRS of 4096.
+
+This patch reverts the following commit:
+"be2net: Modified PCI MaxReadReq size to 4096 bytes"
+commit 5a56eb10babbcd7b3796dc3c28c271260aa3608d.
+
+Suggested-by: Brian King <bjking1 at us.ibm.com>
+Signed-off-by: Sathya Perla <sathya.perla at emulex.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/ethernet/emulex/benet/be_main.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
+index 8b6ce5b..2cf02d6 100644
+--- a/drivers/net/ethernet/emulex/benet/be_main.c
++++ b/drivers/net/ethernet/emulex/benet/be_main.c
+@@ -2745,8 +2745,6 @@ static int be_setup(struct be_adapter *adapter)
+ be_cmd_set_flow_control(adapter, adapter->tx_fc,
+ adapter->rx_fc);
+
+- pcie_set_readrq(adapter->pdev, 4096);
+-
+ if (be_physfn(adapter) && num_vfs) {
+ if (adapter->dev_num_vfs)
+ be_vf_setup(adapter);
+--
+1.7.10.4
+
Added: dists/sid/linux/debian/patches/features/all/be2net/0060-be2net-fix-reporting-number-of-actual-rx-queues.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/all/be2net/0060-be2net-fix-reporting-number-of-actual-rx-queues.patch Sun Jan 6 22:22:24 2013 (r19717)
@@ -0,0 +1,42 @@
+From 4df5eb92325bde926fc45d8609a1cac6ceef6bc5 Mon Sep 17 00:00:00 2001
+From: Sathya Perla <sathya.perla at emulex.com>
+Date: Tue, 5 Jun 2012 19:37:20 +0000
+Subject: [PATCH 02/13] be2net: fix reporting number of actual rx queues
+
+commit 7f6400626631454f5b535eb92c09a35390777a52 upstream.
+
+Signed-off-by: Sathya Perla <sathya.perla at emulex.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/ethernet/emulex/benet/be_main.c | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
+index 2cf02d6..4e1305f 100644
+--- a/drivers/net/ethernet/emulex/benet/be_main.c
++++ b/drivers/net/ethernet/emulex/benet/be_main.c
+@@ -1890,6 +1890,12 @@ static int be_rx_cqs_create(struct be_adapter *adapter)
+ */
+ adapter->num_rx_qs = (num_irqs(adapter) > 1) ?
+ num_irqs(adapter) + 1 : 1;
++ if (adapter->num_rx_qs != MAX_RX_QS) {
++ rtnl_lock();
++ netif_set_real_num_rx_queues(adapter->netdev,
++ adapter->num_rx_qs);
++ rtnl_unlock();
++ }
+
+ adapter->big_page_size = (1 << get_order(rx_frag_size)) * PAGE_SIZE;
+ for_all_rx_queues(adapter, rxo, i) {
+@@ -3640,7 +3646,7 @@ static int __devinit be_probe(struct pci_dev *pdev,
+ goto disable_dev;
+ pci_set_master(pdev);
+
+- netdev = alloc_etherdev_mq(sizeof(struct be_adapter), MAX_TX_QS);
++ netdev = alloc_etherdev_mqs(sizeof(*adapter), MAX_TX_QS, MAX_RX_QS);
+ if (netdev == NULL) {
+ status = -ENOMEM;
+ goto rel_reg;
+--
+1.7.10.4
+
Added: dists/sid/linux/debian/patches/features/all/be2net/0061-be2net-do-not-use-SCRATCHPAD-register.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/all/be2net/0061-be2net-do-not-use-SCRATCHPAD-register.patch Sun Jan 6 22:22:24 2013 (r19717)
@@ -0,0 +1,78 @@
+From 798402055b562b87e4e9a1b6caf5e9e1d685af22 Mon Sep 17 00:00:00 2001
+From: Sathya Perla <sathya.perla at emulex.com>
+Date: Tue, 5 Jun 2012 19:37:22 +0000
+Subject: [PATCH 03/13] be2net: do not use SCRATCHPAD register
+
+commit d79c0a207aa3be002e1d9473ea98cc4f838e5a8b upstream.
+
+The CUST_SCRATCHPAD_CSR register is used for marking if FW cleanup is
+needed. This is used in a crash kernel scenario. Do no use this register as
+it is not available for some functions. Instead, always issue an FLR when
+a function is probed *except* when VFs are preset (enabled in the previous
+PF load).
+
+Signed-off-by: Sathya Perla <sathya.perla at emulex.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/ethernet/emulex/benet/be_hw.h | 2 --
+ drivers/net/ethernet/emulex/benet/be_main.c | 10 +++-------
+ 2 files changed, 3 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/net/ethernet/emulex/benet/be_hw.h b/drivers/net/ethernet/emulex/benet/be_hw.h
+index f38b58c..0949aa6 100644
+--- a/drivers/net/ethernet/emulex/benet/be_hw.h
++++ b/drivers/net/ethernet/emulex/benet/be_hw.h
+@@ -58,8 +58,6 @@
+
+ #define SLI_PORT_CONTROL_IP_MASK 0x08000000
+
+-#define PCICFG_CUST_SCRATCHPAD_CSR 0x1EC
+-
+ /********* Memory BAR register ************/
+ #define PCICFG_MEMBAR_CTRL_INT_CTRL_OFFSET 0xfc
+ /* Host Interrupt Enable, if set interrupts are enabled although "PCI Interrupt
+diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
+index 4e1305f..24bd2cb 100644
+--- a/drivers/net/ethernet/emulex/benet/be_main.c
++++ b/drivers/net/ethernet/emulex/benet/be_main.c
+@@ -1049,6 +1049,8 @@ static int be_find_vfs(struct be_adapter *adapter, int vf_state)
+ u16 offset, stride;
+
+ pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_SRIOV);
++ if (!pos)
++ return 0;
+ pci_read_config_word(pdev, pos + PCI_SRIOV_VF_OFFSET, &offset);
+ pci_read_config_word(pdev, pos + PCI_SRIOV_VF_STRIDE, &stride);
+
+@@ -2522,7 +2524,6 @@ static int be_clear(struct be_adapter *adapter)
+ be_cmd_fw_clean(adapter);
+
+ be_msix_disable(adapter);
+- pci_write_config_dword(adapter->pdev, PCICFG_CUST_SCRATCHPAD_CSR, 0);
+ return 0;
+ }
+
+@@ -2764,8 +2765,6 @@ static int be_setup(struct be_adapter *adapter)
+
+ schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000));
+ adapter->flags |= BE_FLAGS_WORKER_SCHEDULED;
+-
+- pci_write_config_dword(adapter->pdev, PCICFG_CUST_SCRATCHPAD_CSR, 1);
+ return 0;
+ err:
+ be_clear(adapter);
+@@ -3624,10 +3623,7 @@ reschedule:
+
+ static bool be_reset_required(struct be_adapter *adapter)
+ {
+- u32 reg;
+-
+- pci_read_config_dword(adapter->pdev, PCICFG_CUST_SCRATCHPAD_CSR, ®);
+- return reg;
++ return be_find_vfs(adapter, ENABLED) > 0 ? false : true;
+ }
+
+ static int __devinit be_probe(struct pci_dev *pdev,
+--
+1.7.10.4
+
Added: dists/sid/linux/debian/patches/features/all/be2net/0062-be2net-reduce-gso_max_size-setting-to-account-for-et.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/all/be2net/0062-be2net-reduce-gso_max_size-setting-to-account-for-et.patch Sun Jan 6 22:22:24 2013 (r19717)
@@ -0,0 +1,33 @@
+From cdabe042d89c1fc8cb8cf7aaaf0d902b1bab5549 Mon Sep 17 00:00:00 2001
+From: Sarveshwar Bandi <sarveshwar.bandi at emulex.com>
+Date: Wed, 13 Jun 2012 19:51:43 +0000
+Subject: [PATCH 04/13] be2net: reduce gso_max_size setting to account for
+ ethernet header.
+
+commit b7e5887e0e414bde0a2f311ae3fbea5611562e29 upstream.
+
+The maximum size of packet that can be handled by controller including ethernet
+header is 65535. Reducing gso_max_size accordingly.
+
+Signed-off-by: Sarveshwar Bandi <sarveshwar.bandi at emulex.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/ethernet/emulex/benet/be_main.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
+index 24bd2cb..9c42942 100644
+--- a/drivers/net/ethernet/emulex/benet/be_main.c
++++ b/drivers/net/ethernet/emulex/benet/be_main.c
+@@ -3212,7 +3212,7 @@ static void be_netdev_init(struct net_device *netdev)
+
+ netdev->flags |= IFF_MULTICAST;
+
+- netif_set_gso_max_size(netdev, 65535);
++ netif_set_gso_max_size(netdev, 65535 - ETH_HLEN);
+
+ netdev->netdev_ops = &be_netdev_ops;
+
+--
+1.7.10.4
+
Added: dists/sid/linux/debian/patches/features/all/be2net/0063-be2net-Increase-statistics-structure-size-for-skyhaw.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/all/be2net/0063-be2net-Increase-statistics-structure-size-for-skyhaw.patch Sun Jan 6 22:22:24 2013 (r19717)
@@ -0,0 +1,32 @@
+From 779671a8948dd9d4c2b1394f7cd3a7608b56488f Mon Sep 17 00:00:00 2001
+From: Vasundhara Volam <vasundhara.volam at emulex.com>
+Date: Wed, 13 Jun 2012 19:51:45 +0000
+Subject: [PATCH 05/13] be2net: Increase statistics structure size for
+ skyhawk.
+
+commit 0b3f0e7ae0765c81c7d659811595ea5058ae05a7 upstream.
+
+Increasing the hardware statistics structure to accomodate statistics for skyhawk.
+
+Signed-off-by: Vasundhara Volam <vasundhara.volam at emulex.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/ethernet/emulex/benet/be_cmds.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.h b/drivers/net/ethernet/emulex/benet/be_cmds.h
+index 944f031..c3d881f 100644
+--- a/drivers/net/ethernet/emulex/benet/be_cmds.h
++++ b/drivers/net/ethernet/emulex/benet/be_cmds.h
+@@ -1563,7 +1563,7 @@ struct be_hw_stats_v1 {
+ u32 rsvd0[BE_TXP_SW_SZ];
+ struct be_erx_stats_v1 erx;
+ struct be_pmem_stats pmem;
+- u32 rsvd1[3];
++ u32 rsvd1[18];
+ };
+
+ struct be_cmd_req_get_stats_v1 {
+--
+1.7.10.4
+
Added: dists/sid/linux/debian/patches/features/all/be2net/0064-be2net-Explicitly-clear-the-reserved-field-in-the-Tx.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/all/be2net/0064-be2net-Explicitly-clear-the-reserved-field-in-the-Tx.patch Sun Jan 6 22:22:24 2013 (r19717)
@@ -0,0 +1,29 @@
+From fcbdb4746284b89d8d81bef4efbbe082b5862fad Mon Sep 17 00:00:00 2001
+From: Somnath Kotur <somnath.kotur at emulex.com>
+Date: Sun, 24 Jun 2012 19:40:55 +0000
+Subject: [PATCH 06/13] be2net: Explicitly clear the reserved field in the Tx
+ Descriptor
+
+commit 89b1f496d2b659eaaac5a8d80b801661ab03854f upstream.
+
+Signed-off-by: Somnath Kotur <somnath.kotur at emulex.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/ethernet/emulex/benet/be_main.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
+index 9c42942..3041436 100644
+--- a/drivers/net/ethernet/emulex/benet/be_main.c
++++ b/drivers/net/ethernet/emulex/benet/be_main.c
+@@ -558,6 +558,7 @@ static inline void wrb_fill(struct be_eth_wrb *wrb, u64 addr, int len)
+ wrb->frag_pa_hi = upper_32_bits(addr);
+ wrb->frag_pa_lo = addr & 0xFFFFFFFF;
+ wrb->frag_len = len & ETH_WRB_FRAG_LEN_MASK;
++ wrb->rsvd0 = 0;
+ }
+
+ static inline u16 be_get_tx_vlan_tag(struct be_adapter *adapter,
+--
+1.7.10.4
+
Added: dists/sid/linux/debian/patches/features/all/be2net/0065-be2net-Regression-bug-wherein-VFs-creation-broken-fo.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/all/be2net/0065-be2net-Regression-bug-wherein-VFs-creation-broken-fo.patch Sun Jan 6 22:22:24 2013 (r19717)
@@ -0,0 +1,33 @@
+From c6edc77cb260e386ccc2d0270bf1dfd6159171a7 Mon Sep 17 00:00:00 2001
+From: Somnath Kotur <somnath.kotur at emulex.com>
+Date: Sun, 24 Jun 2012 19:42:00 +0000
+Subject: [PATCH 07/13] be2net: Regression bug wherein VFs creation broken for
+ multiple cards.
+
+commit 7665de15642dfb1709177517aa0488162727342c upstream.
+
+Fix be_find_vfs() to check for matching bus number as well along with devfn
+
+Signed-off-by: Somnath Kotur <somnath.kotur at emulex.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/ethernet/emulex/benet/be_main.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
+index 3041436..dc10904 100644
+--- a/drivers/net/ethernet/emulex/benet/be_main.c
++++ b/drivers/net/ethernet/emulex/benet/be_main.c
+@@ -1058,7 +1058,8 @@ static int be_find_vfs(struct be_adapter *adapter, int vf_state)
+ dev = pci_get_device(pdev->vendor, PCI_ANY_ID, NULL);
+ while (dev) {
+ vf_fn = (pdev->devfn + offset + stride * vfs) & 0xFFFF;
+- if (dev->is_virtfn && dev->devfn == vf_fn) {
++ if (dev->is_virtfn && dev->devfn == vf_fn &&
++ dev->bus->number == pdev->bus->number) {
+ vfs++;
+ if (dev->dev_flags & PCI_DEV_FLAGS_ASSIGNED)
+ assigned_vfs++;
+--
+1.7.10.4
+
Added: dists/sid/linux/debian/patches/features/all/be2net/0066-be2net-Fix-to-trim-skb-for-padded-vlan-packets-to-wo.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/all/be2net/0066-be2net-Fix-to-trim-skb-for-padded-vlan-packets-to-wo.patch Sun Jan 6 22:22:24 2013 (r19717)
@@ -0,0 +1,126 @@
+From 13cc6abaa4635ed09e676a68aeb17e9f62405469 Mon Sep 17 00:00:00 2001
+From: Somnath Kotur <somnath.kotur at emulex.com>
+Date: Tue, 26 Jun 2012 22:32:10 +0000
+Subject: [PATCH 08/13] be2net: Fix to trim skb for padded vlan packets to
+ workaround an ASIC Bug
+
+commit 93040ae5cc8dcc893eca4a4366dc8415af278edf upstream.
+
+Fixed spelling error in a comment as pointed out by DaveM.
+Also refactored existing code a bit to provide placeholders for another ASIC
+Bug workaround that will be checked-in soon after this.
+
+Signed-off-by: Somnath Kotur <somnath.kotur at emulex.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/ethernet/emulex/benet/be.h | 5 +++
+ drivers/net/ethernet/emulex/benet/be_main.c | 57 ++++++++++++++++++++-------
+ 2 files changed, 48 insertions(+), 14 deletions(-)
+
+diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h
+index ecf1a81..d1a17dc 100644
+--- a/drivers/net/ethernet/emulex/benet/be.h
++++ b/drivers/net/ethernet/emulex/benet/be.h
+@@ -555,6 +555,11 @@ static inline u8 is_udp_pkt(struct sk_buff *skb)
+ return val;
+ }
+
++static inline bool is_ipv4_pkt(struct sk_buff *skb)
++{
++ return skb->protocol == ntohs(ETH_P_IP) && ip_hdr(skb)->version == 4;
++}
++
+ static inline void be_vf_eth_addr_generate(struct be_adapter *adapter, u8 *mac)
+ {
+ u32 addr;
+diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
+index dc10904..ec72318 100644
+--- a/drivers/net/ethernet/emulex/benet/be_main.c
++++ b/drivers/net/ethernet/emulex/benet/be_main.c
+@@ -577,6 +577,11 @@ static inline u16 be_get_tx_vlan_tag(struct be_adapter *adapter,
+ return vlan_tag;
+ }
+
++static int be_vlan_tag_chk(struct be_adapter *adapter, struct sk_buff *skb)
++{
++ return vlan_tx_tag_present(skb) || adapter->pvid;
++}
++
+ static void wrb_fill_hdr(struct be_adapter *adapter, struct be_eth_hdr_wrb *hdr,
+ struct sk_buff *skb, u32 wrb_cnt, u32 len)
+ {
+@@ -704,33 +709,57 @@ dma_err:
+ return 0;
+ }
+
++static struct sk_buff *be_insert_vlan_in_pkt(struct be_adapter *adapter,
++ struct sk_buff *skb)
++{
++ u16 vlan_tag = 0;
++
++ skb = skb_share_check(skb, GFP_ATOMIC);
++ if (unlikely(!skb))
++ return skb;
++
++ if (vlan_tx_tag_present(skb)) {
++ vlan_tag = be_get_tx_vlan_tag(adapter, skb);
++ __vlan_put_tag(skb, vlan_tag);
++ skb->vlan_tci = 0;
++ }
++
++ return skb;
++}
++
++
+ static netdev_tx_t be_xmit(struct sk_buff *skb,
+ struct net_device *netdev)
+ {
+ struct be_adapter *adapter = netdev_priv(netdev);
+ struct be_tx_obj *txo = &adapter->tx_obj[skb_get_queue_mapping(skb)];
+ struct be_queue_info *txq = &txo->q;
++ struct iphdr *ip = NULL;
+ u32 wrb_cnt = 0, copied = 0;
+- u32 start = txq->head;
++ u32 start = txq->head, eth_hdr_len;
+ bool dummy_wrb, stopped = false;
+
+- /* For vlan tagged pkts, BE
+- * 1) calculates checksum even when CSO is not requested
+- * 2) calculates checksum wrongly for padded pkt less than
+- * 60 bytes long.
+- * As a workaround disable TX vlan offloading in such cases.
++ eth_hdr_len = ntohs(skb->protocol) == ETH_P_8021Q ?
++ VLAN_ETH_HLEN : ETH_HLEN;
++
++ /* HW has a bug which considers padding bytes as legal
++ * and modifies the IPv4 hdr's 'tot_len' field
+ */
+- if (unlikely(vlan_tx_tag_present(skb) &&
+- (skb->ip_summed != CHECKSUM_PARTIAL || skb->len <= 60))) {
+- skb = skb_share_check(skb, GFP_ATOMIC);
+- if (unlikely(!skb))
+- goto tx_drop;
++ if (skb->len <= 60 && be_vlan_tag_chk(adapter, skb) &&
++ is_ipv4_pkt(skb)) {
++ ip = (struct iphdr *)ip_hdr(skb);
++ pskb_trim(skb, eth_hdr_len + ntohs(ip->tot_len));
++ }
+
+- skb = __vlan_put_tag(skb, be_get_tx_vlan_tag(adapter, skb));
++ /* HW has a bug wherein it will calculate CSUM for VLAN
++ * pkts even though it is disabled.
++ * Manually insert VLAN in pkt.
++ */
++ if (skb->ip_summed != CHECKSUM_PARTIAL &&
++ be_vlan_tag_chk(adapter, skb)) {
++ skb = be_insert_vlan_in_pkt(adapter, skb);
+ if (unlikely(!skb))
+ goto tx_drop;
+-
+- skb->vlan_tci = 0;
+ }
+
+ wrb_cnt = wrb_cnt_for_skb(adapter, skb, &dummy_wrb);
+--
+1.7.10.4
+
Added: dists/sid/linux/debian/patches/features/all/be2net/0067-be2net-Fix-Endian.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/all/be2net/0067-be2net-Fix-Endian.patch Sun Jan 6 22:22:24 2013 (r19717)
@@ -0,0 +1,35 @@
+From 1dbfee7f77c8b507207a89fe576d1cd4485672ca Mon Sep 17 00:00:00 2001
+From: Li RongQing <roy.qing.li at gmail.com>
+Date: Wed, 4 Jul 2012 16:05:42 +0000
+Subject: [PATCH 09/13] be2net: Fix Endian
+
+commit e8efcec5394cbf7ae67ccb137cb1a45ae3e6f6c8 upstream.
+
+ETH_P_IP is host Endian, skb->protocol is big Endian, when
+compare them, we should change ETH_P_IP from host endian
+to big endian, htons, not ntohs.
+
+CC: Somnath Kotur <somnath.kotur at emulex.com>
+Signed-off-by: Li RongQing <roy.qing.li at gmail.com>
+Acked-by: Somnath Kotur <somnath.kotur at emulex.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/ethernet/emulex/benet/be.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h
+index d1a17dc..75d9b60 100644
+--- a/drivers/net/ethernet/emulex/benet/be.h
++++ b/drivers/net/ethernet/emulex/benet/be.h
+@@ -557,7 +557,7 @@ static inline u8 is_udp_pkt(struct sk_buff *skb)
+
+ static inline bool is_ipv4_pkt(struct sk_buff *skb)
+ {
+- return skb->protocol == ntohs(ETH_P_IP) && ip_hdr(skb)->version == 4;
++ return skb->protocol == htons(ETH_P_IP) && ip_hdr(skb)->version == 4;
+ }
+
+ static inline void be_vf_eth_addr_generate(struct be_adapter *adapter, u8 *mac)
+--
+1.7.10.4
+
Added: dists/sid/linux/debian/patches/features/all/be2net/0068-be2net-Enable-RSS-UDP-hashing-for-Lancer-and-Skyhawk.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/all/be2net/0068-be2net-Enable-RSS-UDP-hashing-for-Lancer-and-Skyhawk.patch Sun Jan 6 22:22:24 2013 (r19717)
@@ -0,0 +1,64 @@
+From 9818fbc76520775e4087141bfa23ede010063ea5 Mon Sep 17 00:00:00 2001
+From: Padmanabh Ratnakar <padmanabh.ratnakar at emulex.com>
+Date: Thu, 12 Jul 2012 03:57:47 +0000
+Subject: [PATCH 10/13] be2net: Enable RSS UDP hashing for Lancer and Skyhawk
+
+commit d3bd3a5eeb087bf6a06e9bdfc589096608f933a0 upstream.
+
+Signed-off-by: Padmanabh Ratnakar <padmanabh.ratnakar at emulex.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/ethernet/emulex/benet/be.h | 4 ++++
+ drivers/net/ethernet/emulex/benet/be_cmds.c | 7 +++++++
+ drivers/net/ethernet/emulex/benet/be_cmds.h | 2 ++
+ 3 files changed, 13 insertions(+)
+
+diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h
+index 75d9b60..c648a40 100644
+--- a/drivers/net/ethernet/emulex/benet/be.h
++++ b/drivers/net/ethernet/emulex/benet/be.h
+@@ -440,6 +440,10 @@ struct be_adapter {
+ #define lancer_chip(adapter) ((adapter->pdev->device == OC_DEVICE_ID3) || \
+ (adapter->pdev->device == OC_DEVICE_ID4))
+
++#define skyhawk_chip(adapter) (adapter->pdev->device == OC_DEVICE_ID5)
++
++
++
+ extern const struct ethtool_ops be_ethtool_ops;
+
+ #define msix_enabled(adapter) (adapter->num_msix_vec > 0)
+diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c
+index 43167e8..0757df4 100644
+--- a/drivers/net/ethernet/emulex/benet/be_cmds.c
++++ b/drivers/net/ethernet/emulex/benet/be_cmds.c
+@@ -1727,6 +1727,13 @@ int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable, u16 table_size)
+ req->if_id = cpu_to_le32(adapter->if_handle);
+ req->enable_rss = cpu_to_le16(RSS_ENABLE_TCP_IPV4 | RSS_ENABLE_IPV4 |
+ RSS_ENABLE_TCP_IPV6 | RSS_ENABLE_IPV6);
++
++ if (lancer_chip(adapter) || skyhawk_chip(adapter)) {
++ req->hdr.version = 1;
++ req->enable_rss |= cpu_to_le16(RSS_ENABLE_UDP_IPV4 |
++ RSS_ENABLE_UDP_IPV6);
++ }
++
+ req->cpu_table_size_log2 = cpu_to_le16(fls(table_size) - 1);
+ memcpy(req->cpu_table, rsstable, table_size);
+ memcpy(req->hash, myhash, sizeof(myhash));
+diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.h b/drivers/net/ethernet/emulex/benet/be_cmds.h
+index c3d881f..d42b3b9 100644
+--- a/drivers/net/ethernet/emulex/benet/be_cmds.h
++++ b/drivers/net/ethernet/emulex/benet/be_cmds.h
+@@ -1085,6 +1085,8 @@ struct be_cmd_resp_query_fw_cfg {
+ #define RSS_ENABLE_TCP_IPV4 0x2
+ #define RSS_ENABLE_IPV6 0x4
+ #define RSS_ENABLE_TCP_IPV6 0x8
++#define RSS_ENABLE_UDP_IPV4 0x10
++#define RSS_ENABLE_UDP_IPV6 0x20
+
+ struct be_cmd_req_rss_config {
+ struct be_cmd_req_hdr hdr;
+--
+1.7.10.4
+
Added: dists/sid/linux/debian/patches/features/all/be2net/0069-be2net-dont-pull-too-much-data-in-skb-linear-part.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/all/be2net/0069-be2net-dont-pull-too-much-data-in-skb-linear-part.patch Sun Jan 6 22:22:24 2013 (r19717)
@@ -0,0 +1,49 @@
+From 6c7d98f7988abe6d28de0acd0ee0eaecea61ac79 Mon Sep 17 00:00:00 2001
+From: Eric Dumazet <edumazet at google.com>
+Date: Fri, 13 Jul 2012 03:19:41 +0000
+Subject: [PATCH 11/13] be2net: dont pull too much data in skb linear part
+
+commit ac1ae5f33fd225f46da0072e2091962410a0431b upstream.
+
+skb_fill_rx_data() pulls 64 byte of data in skb->data
+
+Its too much for TCP (with no options) on IPv4, as total size of headers
+is 14 + 40 = 54
+
+This means tcp stack and splice() are suboptimal, since tcp payload
+is in part in tcp->data, and in part in skb frag.
+
+Signed-off-by: Eric Dumazet <edumazet at google.com>
+Acked-by: Padmanabh Ratnakar <padmanabh.ratnakar at emulex.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/ethernet/emulex/benet/be_main.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
+index ec72318..e2e2472 100644
+--- a/drivers/net/ethernet/emulex/benet/be_main.c
++++ b/drivers/net/ethernet/emulex/benet/be_main.c
+@@ -1228,16 +1228,16 @@ static void skb_fill_rx_data(struct be_rx_obj *rxo, struct sk_buff *skb,
+ /* Copy data in the first descriptor of this completion */
+ curr_frag_len = min(rxcp->pkt_size, rx_frag_size);
+
+- /* Copy the header portion into skb_data */
+- hdr_len = min(BE_HDR_LEN, curr_frag_len);
+- memcpy(skb->data, start, hdr_len);
+ skb->len = curr_frag_len;
+ if (curr_frag_len <= BE_HDR_LEN) { /* tiny packet */
++ memcpy(skb->data, start, curr_frag_len);
+ /* Complete packet has now been moved to data */
+ put_page(page_info->page);
+ skb->data_len = 0;
+ skb->tail += curr_frag_len;
+ } else {
++ hdr_len = ETH_HLEN;
++ memcpy(skb->data, start, hdr_len);
+ skb_shinfo(skb)->nr_frags = 1;
+ skb_frag_set_page(skb, 0, page_info->page);
+ skb_shinfo(skb)->frags[0].page_offset =
+--
+1.7.10.4
+
Added: dists/sid/linux/debian/patches/features/all/be2net/0070-be2net-Fix-to-parse-RSS-hash-from-Receive-completion.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/all/be2net/0070-be2net-Fix-to-parse-RSS-hash-from-Receive-completion.patch Sun Jan 6 22:22:24 2013 (r19717)
@@ -0,0 +1,42 @@
+From 3a194352de63562cbc39ad9b394df45cd01c2564 Mon Sep 17 00:00:00 2001
+From: Sarveshwar Bandi <sarveshwar.bandi at emulex.com>
+Date: Wed, 25 Jul 2012 21:29:50 +0000
+Subject: [PATCH 12/13] be2net: Fix to parse RSS hash from Receive completions
+ correctly.
+
+commit c297977ec18deb36b2c0a5ee57101f7ab736ec00 upstream.
+
+Wrong pointer variable is being used to parse the rss hash from
+receive completions leading to corrupted rss_hash values filled into skb.
+
+Signed-off-by: Sarveshwar Bandi <sarveshwar.bandi at emulex.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/ethernet/emulex/benet/be_main.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
+index e2e2472..19307ad 100644
+--- a/drivers/net/ethernet/emulex/benet/be_main.c
++++ b/drivers/net/ethernet/emulex/benet/be_main.c
+@@ -1397,7 +1397,7 @@ static void be_parse_rx_compl_v1(struct be_eth_rx_compl *compl,
+ rxcp->pkt_type =
+ AMAP_GET_BITS(struct amap_eth_rx_compl_v1, cast_enc, compl);
+ rxcp->rss_hash =
+- AMAP_GET_BITS(struct amap_eth_rx_compl_v1, rsshash, rxcp);
++ AMAP_GET_BITS(struct amap_eth_rx_compl_v1, rsshash, compl);
+ if (rxcp->vlanf) {
+ rxcp->vtm = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, vtm,
+ compl);
+@@ -1429,7 +1429,7 @@ static void be_parse_rx_compl_v0(struct be_eth_rx_compl *compl,
+ rxcp->pkt_type =
+ AMAP_GET_BITS(struct amap_eth_rx_compl_v0, cast_enc, compl);
+ rxcp->rss_hash =
+- AMAP_GET_BITS(struct amap_eth_rx_compl_v0, rsshash, rxcp);
++ AMAP_GET_BITS(struct amap_eth_rx_compl_v0, rsshash, compl);
+ if (rxcp->vlanf) {
+ rxcp->vtm = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, vtm,
+ compl);
+--
+1.7.10.4
+
Added: dists/sid/linux/debian/patches/features/all/be2net/0071-netpoll-revert-6bdb7fe3104-and-fix-be_poll-instead.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux/debian/patches/features/all/be2net/0071-netpoll-revert-6bdb7fe3104-and-fix-be_poll-instead.patch Sun Jan 6 22:22:24 2013 (r19717)
@@ -0,0 +1,110 @@
+From ecc8aa51db91b113fd17027733636de37f2760e6 Mon Sep 17 00:00:00 2001
+From: Amerigo Wang <amwang at redhat.com>
+Date: Fri, 24 Aug 2012 21:41:11 +0000
+Subject: [PATCH 13/13] netpoll: revert 6bdb7fe3104 and fix be_poll() instead
+
+commit 072a9c48600409d72aeb0d5b29fbb75861a06631 upstream.
+
+Against -net.
+
+In the patch "netpoll: re-enable irq in poll_napi()", I tried to
+fix the following warning:
+
+[100718.051041] ------------[ cut here ]------------
+[100718.051048] WARNING: at kernel/softirq.c:159 local_bh_enable_ip+0x7d/0xb0()
+(Not tainted)
+[100718.051049] Hardware name: ProLiant BL460c G7
+...
+[100718.051068] Call Trace:
+[100718.051073] [<ffffffff8106b747>] ? warn_slowpath_common+0x87/0xc0
+[100718.051075] [<ffffffff8106b79a>] ? warn_slowpath_null+0x1a/0x20
+[100718.051077] [<ffffffff810747ed>] ? local_bh_enable_ip+0x7d/0xb0
+[100718.051080] [<ffffffff8150041b>] ? _spin_unlock_bh+0x1b/0x20
+[100718.051085] [<ffffffffa00ee974>] ? be_process_mcc+0x74/0x230 [be2net]
+[100718.051088] [<ffffffffa00ea68c>] ? be_poll_tx_mcc+0x16c/0x290 [be2net]
+[100718.051090] [<ffffffff8144fe76>] ? netpoll_poll_dev+0xd6/0x490
+[100718.051095] [<ffffffffa01d24a5>] ? bond_poll_controller+0x75/0x80 [bonding]
+[100718.051097] [<ffffffff8144fde5>] ? netpoll_poll_dev+0x45/0x490
+[100718.051100] [<ffffffff81161b19>] ? ksize+0x19/0x80
+[100718.051102] [<ffffffff81450437>] ? netpoll_send_skb_on_dev+0x157/0x240
+
+by reenabling IRQ before calling ->poll, but it seems more
+problems are introduced after that patch:
+
+http://ozlabs.org/~akpm/stuff/IMG_20120824_122054.jpg
+http://marc.info/?l=linux-netdev&m=134563282530588&w=2
+
+So it is safe to fix be2net driver code directly.
+
+This patch reverts the offending commit and fixes be_poll() by
+avoid disabling BH there, this is okay because be_poll()
+can be called either by poll_napi() which already disables
+IRQ, or by net_rx_action() which already disables BH.
+
+Reported-by: Andrew Morton <akpm at linux-foundation.org>
+Reported-by: Sylvain Munaut <s.munaut at whatever-company.com>
+Cc: Sylvain Munaut <s.munaut at whatever-company.com>
+Cc: Andrew Morton <akpm at linux-foundation.org>
+Cc: David Miller <davem at davemloft.net>
+Cc: Sathya Perla <sathya.perla at emulex.com>
+Cc: Subbu Seetharaman <subbu.seetharaman at emulex.com>
+Cc: Ajit Khaparde <ajit.khaparde at emulex.com>
+Signed-off-by: Cong Wang <amwang at redhat.com>
+Tested-by: Sylvain Munaut <s.munaut at whatever-company.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+[bwh: Restricted to drivers/net/ethernet/emulex/benet/; commit 6bdb7fe3104
+ has not been applied here]
+---
+ drivers/net/ethernet/emulex/benet/be_cmds.c | 6 ++++--
+ drivers/net/ethernet/emulex/benet/be_main.c | 2 ++
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c
+index 0757df4..5d42468 100644
+--- a/drivers/net/ethernet/emulex/benet/be_cmds.c
++++ b/drivers/net/ethernet/emulex/benet/be_cmds.c
+@@ -256,7 +256,7 @@ int be_process_mcc(struct be_adapter *adapter)
+ int num = 0, status = 0;
+ struct be_mcc_obj *mcc_obj = &adapter->mcc_obj;
+
+- spin_lock_bh(&adapter->mcc_cq_lock);
++ spin_lock(&adapter->mcc_cq_lock);
+ while ((compl = be_mcc_compl_get(adapter))) {
+ if (compl->flags & CQE_FLAGS_ASYNC_MASK) {
+ /* Interpret flags as an async trailer */
+@@ -277,7 +277,7 @@ int be_process_mcc(struct be_adapter *adapter)
+ if (num)
+ be_cq_notify(adapter, mcc_obj->cq.id, mcc_obj->rearm_cq, num);
+
+- spin_unlock_bh(&adapter->mcc_cq_lock);
++ spin_unlock(&adapter->mcc_cq_lock);
+ return status;
+ }
+
+@@ -292,7 +292,9 @@ static int be_mcc_wait_compl(struct be_adapter *adapter)
+ if (be_error(adapter))
+ return -EIO;
+
++ local_bh_disable();
+ status = be_process_mcc(adapter);
++ local_bh_enable();
+
+ if (atomic_read(&mcc_obj->q.used) == 0)
+ break;
+diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
+index 19307ad..3a21dda 100644
+--- a/drivers/net/ethernet/emulex/benet/be_main.c
++++ b/drivers/net/ethernet/emulex/benet/be_main.c
+@@ -3625,7 +3625,9 @@ static void be_worker(struct work_struct *work)
+ /* when interrupts are not yet enabled, just reap any pending
+ * mcc completions */
+ if (!netif_running(adapter->netdev)) {
++ local_bh_disable();
+ be_process_mcc(adapter);
++ local_bh_enable();
+ goto reschedule;
+ }
+
+--
+1.7.10.4
+
Modified: dists/sid/linux/debian/patches/series
==============================================================================
--- dists/sid/linux/debian/patches/series Sun Jan 6 21:24:30 2013 (r19716)
+++ dists/sid/linux/debian/patches/series Sun Jan 6 22:22:24 2013 (r19717)
@@ -262,6 +262,19 @@
features/all/be2net/0056-be2net-Record-receive-queue-index-in-skb-to-aid-RPS.patch
features/all/be2net/0057-be2net-Fix-EEH-error-reset-before-a-flash-dump-compl.patch
features/all/be2net/0058-be2net-avoid-disabling-sriov-while-VFs-are-assigned.patch
+features/all/be2net/0059-be2net-do-not-modify-PCI-MaxReadReq-size.patch
+features/all/be2net/0060-be2net-fix-reporting-number-of-actual-rx-queues.patch
+features/all/be2net/0061-be2net-do-not-use-SCRATCHPAD-register.patch
+features/all/be2net/0062-be2net-reduce-gso_max_size-setting-to-account-for-et.patch
+features/all/be2net/0063-be2net-Increase-statistics-structure-size-for-skyhaw.patch
+features/all/be2net/0064-be2net-Explicitly-clear-the-reserved-field-in-the-Tx.patch
+features/all/be2net/0065-be2net-Regression-bug-wherein-VFs-creation-broken-fo.patch
+features/all/be2net/0066-be2net-Fix-to-trim-skb-for-padded-vlan-packets-to-wo.patch
+features/all/be2net/0067-be2net-Fix-Endian.patch
+features/all/be2net/0068-be2net-Enable-RSS-UDP-hashing-for-Lancer-and-Skyhawk.patch
+features/all/be2net/0069-be2net-dont-pull-too-much-data-in-skb-linear-part.patch
+features/all/be2net/0070-be2net-Fix-to-parse-RSS-hash-from-Receive-completion.patch
+features/all/be2net/0071-netpoll-revert-6bdb7fe3104-and-fix-be_poll-instead.patch
# Add CoDel from 3.5, and prerequisites
features/all/net-introduce-skb_flow_dissect.patch
More information about the Kernel-svn-changes
mailing list