diff --git a/debian/changelog b/debian/changelog index 54b0e5189..85db98389 100644 --- a/debian/changelog +++ b/debian/changelog @@ -42,6 +42,20 @@ linux (3.2.36-1) UNRELEASED; urgency=low - [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. diff --git a/debian/patches/features/all/be2net/0059-be2net-do-not-modify-PCI-MaxReadReq-size.patch b/debian/patches/features/all/be2net/0059-be2net-do-not-modify-PCI-MaxReadReq-size.patch new file mode 100644 index 000000000..2750aba22 --- /dev/null +++ b/debian/patches/features/all/be2net/0059-be2net-do-not-modify-PCI-MaxReadReq-size.patch @@ -0,0 +1,41 @@ +From 21ba34daa00d71715d5d49740ebc8caac5e522d5 Mon Sep 17 00:00:00 2001 +From: Sathya Perla +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 +Signed-off-by: Sathya Perla +Signed-off-by: David S. Miller +--- + 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 + diff --git a/debian/patches/features/all/be2net/0060-be2net-fix-reporting-number-of-actual-rx-queues.patch b/debian/patches/features/all/be2net/0060-be2net-fix-reporting-number-of-actual-rx-queues.patch new file mode 100644 index 000000000..82bf857d6 --- /dev/null +++ b/debian/patches/features/all/be2net/0060-be2net-fix-reporting-number-of-actual-rx-queues.patch @@ -0,0 +1,42 @@ +From 4df5eb92325bde926fc45d8609a1cac6ceef6bc5 Mon Sep 17 00:00:00 2001 +From: Sathya Perla +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 +Signed-off-by: David S. Miller +--- + 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 + diff --git a/debian/patches/features/all/be2net/0061-be2net-do-not-use-SCRATCHPAD-register.patch b/debian/patches/features/all/be2net/0061-be2net-do-not-use-SCRATCHPAD-register.patch new file mode 100644 index 000000000..bc14ff11e --- /dev/null +++ b/debian/patches/features/all/be2net/0061-be2net-do-not-use-SCRATCHPAD-register.patch @@ -0,0 +1,78 @@ +From 798402055b562b87e4e9a1b6caf5e9e1d685af22 Mon Sep 17 00:00:00 2001 +From: Sathya Perla +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 +Signed-off-by: David S. Miller +--- + 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 + diff --git a/debian/patches/features/all/be2net/0062-be2net-reduce-gso_max_size-setting-to-account-for-et.patch b/debian/patches/features/all/be2net/0062-be2net-reduce-gso_max_size-setting-to-account-for-et.patch new file mode 100644 index 000000000..ce66a08b1 --- /dev/null +++ b/debian/patches/features/all/be2net/0062-be2net-reduce-gso_max_size-setting-to-account-for-et.patch @@ -0,0 +1,33 @@ +From cdabe042d89c1fc8cb8cf7aaaf0d902b1bab5549 Mon Sep 17 00:00:00 2001 +From: Sarveshwar Bandi +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 +Signed-off-by: David S. Miller +--- + 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 + diff --git a/debian/patches/features/all/be2net/0063-be2net-Increase-statistics-structure-size-for-skyhaw.patch b/debian/patches/features/all/be2net/0063-be2net-Increase-statistics-structure-size-for-skyhaw.patch new file mode 100644 index 000000000..b3f4a6e9c --- /dev/null +++ b/debian/patches/features/all/be2net/0063-be2net-Increase-statistics-structure-size-for-skyhaw.patch @@ -0,0 +1,32 @@ +From 779671a8948dd9d4c2b1394f7cd3a7608b56488f Mon Sep 17 00:00:00 2001 +From: Vasundhara Volam +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 +Signed-off-by: David S. Miller +--- + 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 + diff --git a/debian/patches/features/all/be2net/0064-be2net-Explicitly-clear-the-reserved-field-in-the-Tx.patch b/debian/patches/features/all/be2net/0064-be2net-Explicitly-clear-the-reserved-field-in-the-Tx.patch new file mode 100644 index 000000000..525f20611 --- /dev/null +++ b/debian/patches/features/all/be2net/0064-be2net-Explicitly-clear-the-reserved-field-in-the-Tx.patch @@ -0,0 +1,29 @@ +From fcbdb4746284b89d8d81bef4efbbe082b5862fad Mon Sep 17 00:00:00 2001 +From: Somnath Kotur +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 +Signed-off-by: David S. Miller +--- + 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 + diff --git a/debian/patches/features/all/be2net/0065-be2net-Regression-bug-wherein-VFs-creation-broken-fo.patch b/debian/patches/features/all/be2net/0065-be2net-Regression-bug-wherein-VFs-creation-broken-fo.patch new file mode 100644 index 000000000..4147a6e4a --- /dev/null +++ b/debian/patches/features/all/be2net/0065-be2net-Regression-bug-wherein-VFs-creation-broken-fo.patch @@ -0,0 +1,33 @@ +From c6edc77cb260e386ccc2d0270bf1dfd6159171a7 Mon Sep 17 00:00:00 2001 +From: Somnath Kotur +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 +Signed-off-by: David S. Miller +--- + 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 + diff --git a/debian/patches/features/all/be2net/0066-be2net-Fix-to-trim-skb-for-padded-vlan-packets-to-wo.patch b/debian/patches/features/all/be2net/0066-be2net-Fix-to-trim-skb-for-padded-vlan-packets-to-wo.patch new file mode 100644 index 000000000..aaa3a5a68 --- /dev/null +++ b/debian/patches/features/all/be2net/0066-be2net-Fix-to-trim-skb-for-padded-vlan-packets-to-wo.patch @@ -0,0 +1,126 @@ +From 13cc6abaa4635ed09e676a68aeb17e9f62405469 Mon Sep 17 00:00:00 2001 +From: Somnath Kotur +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 +Signed-off-by: David S. Miller +--- + 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 + diff --git a/debian/patches/features/all/be2net/0067-be2net-Fix-Endian.patch b/debian/patches/features/all/be2net/0067-be2net-Fix-Endian.patch new file mode 100644 index 000000000..7e158206d --- /dev/null +++ b/debian/patches/features/all/be2net/0067-be2net-Fix-Endian.patch @@ -0,0 +1,35 @@ +From 1dbfee7f77c8b507207a89fe576d1cd4485672ca Mon Sep 17 00:00:00 2001 +From: Li RongQing +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 +Signed-off-by: Li RongQing +Acked-by: Somnath Kotur +Signed-off-by: David S. Miller +--- + 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 + diff --git a/debian/patches/features/all/be2net/0068-be2net-Enable-RSS-UDP-hashing-for-Lancer-and-Skyhawk.patch b/debian/patches/features/all/be2net/0068-be2net-Enable-RSS-UDP-hashing-for-Lancer-and-Skyhawk.patch new file mode 100644 index 000000000..8c7280f6a --- /dev/null +++ b/debian/patches/features/all/be2net/0068-be2net-Enable-RSS-UDP-hashing-for-Lancer-and-Skyhawk.patch @@ -0,0 +1,64 @@ +From 9818fbc76520775e4087141bfa23ede010063ea5 Mon Sep 17 00:00:00 2001 +From: Padmanabh Ratnakar +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 +Signed-off-by: David S. Miller +--- + 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 + diff --git a/debian/patches/features/all/be2net/0069-be2net-dont-pull-too-much-data-in-skb-linear-part.patch b/debian/patches/features/all/be2net/0069-be2net-dont-pull-too-much-data-in-skb-linear-part.patch new file mode 100644 index 000000000..c7a8003d9 --- /dev/null +++ b/debian/patches/features/all/be2net/0069-be2net-dont-pull-too-much-data-in-skb-linear-part.patch @@ -0,0 +1,49 @@ +From 6c7d98f7988abe6d28de0acd0ee0eaecea61ac79 Mon Sep 17 00:00:00 2001 +From: Eric Dumazet +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 +Acked-by: Padmanabh Ratnakar +Signed-off-by: David S. Miller +--- + 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 + diff --git a/debian/patches/features/all/be2net/0070-be2net-Fix-to-parse-RSS-hash-from-Receive-completion.patch b/debian/patches/features/all/be2net/0070-be2net-Fix-to-parse-RSS-hash-from-Receive-completion.patch new file mode 100644 index 000000000..c8685d077 --- /dev/null +++ b/debian/patches/features/all/be2net/0070-be2net-Fix-to-parse-RSS-hash-from-Receive-completion.patch @@ -0,0 +1,42 @@ +From 3a194352de63562cbc39ad9b394df45cd01c2564 Mon Sep 17 00:00:00 2001 +From: Sarveshwar Bandi +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 +Signed-off-by: David S. Miller +--- + 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 + diff --git a/debian/patches/features/all/be2net/0071-netpoll-revert-6bdb7fe3104-and-fix-be_poll-instead.patch b/debian/patches/features/all/be2net/0071-netpoll-revert-6bdb7fe3104-and-fix-be_poll-instead.patch new file mode 100644 index 000000000..bd580f212 --- /dev/null +++ b/debian/patches/features/all/be2net/0071-netpoll-revert-6bdb7fe3104-and-fix-be_poll-instead.patch @@ -0,0 +1,110 @@ +From ecc8aa51db91b113fd17027733636de37f2760e6 Mon Sep 17 00:00:00 2001 +From: Amerigo Wang +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] [] ? warn_slowpath_common+0x87/0xc0 +[100718.051075] [] ? warn_slowpath_null+0x1a/0x20 +[100718.051077] [] ? local_bh_enable_ip+0x7d/0xb0 +[100718.051080] [] ? _spin_unlock_bh+0x1b/0x20 +[100718.051085] [] ? be_process_mcc+0x74/0x230 [be2net] +[100718.051088] [] ? be_poll_tx_mcc+0x16c/0x290 [be2net] +[100718.051090] [] ? netpoll_poll_dev+0xd6/0x490 +[100718.051095] [] ? bond_poll_controller+0x75/0x80 [bonding] +[100718.051097] [] ? netpoll_poll_dev+0x45/0x490 +[100718.051100] [] ? ksize+0x19/0x80 +[100718.051102] [] ? 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 +Reported-by: Sylvain Munaut +Cc: Sylvain Munaut +Cc: Andrew Morton +Cc: David Miller +Cc: Sathya Perla +Cc: Subbu Seetharaman +Cc: Ajit Khaparde +Signed-off-by: Cong Wang +Tested-by: Sylvain Munaut +Signed-off-by: David S. Miller +[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 + diff --git a/debian/patches/series b/debian/patches/series index 592ac8788..5fd939ac3 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -262,6 +262,19 @@ features/all/be2net/0055-be2net-Fix-to-apply-duplex-value-as-unknown-when-lin.pa 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