i40e/i40evf updates
Subsystems (2)
cover i40e/i40evf updates
Anjali fixes Rx hash reported to the stack by our driver, adds fix for recursive RTNL lock during PROMISC change, fixes RSS rx-flow-hash configuration through ethtool, makes some changes in the nvm read code, and cleans up the code with respect to restarting autoneg.
Catherine replaces X722 mac check in ethtool get_settings.
Jesse removes forever unused ID, makes tunnels generic, and updates features with right offload.
Kiran adds mac_filter_element at the end of the list instead of HEAD.
Mitch allows channel bonding of VFs, and nulls out ring pointers on free.
Shannon defines function capabilities in only one place.
drivers/net/ethernet/intel/i40e/i40e.h | 4 +- drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h | 1 + drivers/net/ethernet/intel/i40e/i40e_common.c | 86 +++++++--------------- drivers/net/ethernet/intel/i40e/i40e_devids.h | 1 - drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 16 ++-- drivers/net/ethernet/intel/i40e/i40e_main.c | 27 ++++--- drivers/net/ethernet/intel/i40e/i40e_nvm.c | 70 +++++++++++++++--- drivers/net/ethernet/intel/i40e/i40e_txrx.c | 61 ++++++++------- drivers/net/ethernet/intel/i40e/i40e_txrx.h | 2 +- .../net/ethernet/intel/i40evf/i40e_adminq_cmd.h | 1 + drivers/net/ethernet/intel/i40evf/i40e_common.c | 1 - drivers/net/ethernet/intel/i40evf/i40e_devids.h | 1 - drivers/net/ethernet/intel/i40evf/i40e_txrx.c | 56 +++++++------- drivers/net/ethernet/intel/i40evf/i40e_txrx.h | 2 +- drivers/net/ethernet/intel/i40evf/i40evf.h | 1 + drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c | 40 ++-------- drivers/net/ethernet/intel/i40evf/i40evf_main.c | 11 ++- .../net/ethernet/intel/i40evf/i40evf_virtchnl.c | 2 + 18 files changed, 196 insertions(+), 187 deletions(-)
Signature · 1 line
2.1.0
PATCH 1/13 i40e: Fix Rx hash reported to the stack by our driver
From: Anjali Singhai Jain <[email protected]>
If the driver calls skb_set_hash even with a zero hash, that indicates to the stack that the hash calculation is offloaded in hardware. So the Stack doesn't do a SW hash which is required for load balancing if the user decides to turn of rx-hashing on our device.
This patch fixes the path so that we do not call skb_set_hash if the feature is disabled.
---
Testing Hints:Test interrupt overload x710 Apart from the interrupt overload, the user sees a problem where the stack is not calculating the hash when rx-hasing is turned off which is resulting in tpacket_v3 not balancing the load across multiple threads.
drivers/net/ethernet/intel/i40e/i40e_txrx.c | 54 ++++++++++++++------------- drivers/net/ethernet/intel/i40evf/i40e_txrx.c | 54 ++++++++++++++------------- 2 files changed, 58 insertions(+), 50 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_txrx.c +29 -25
@@ -1422,31 +1422,12 @@ checksum_fail: }/** -* i40e_rx_hash - returns the hash value from the Rx descriptor -* @ring: descriptor ring -* @rx_desc: specific descriptor -**/ -static inline u32 i40e_rx_hash (struct i40e_ring *ring, -union i40e_rx_desc *rx_desc) -{ -const __le64 rss_mask = -cpu_to_le64 ((u64 )I40E_RX_DESC_FLTSTAT_RSS_HASH << -I40E_RX_DESC_STATUS_FLTSTAT_SHIFT ); - -if ((ring->netdev->features &NETIF_F_RXHASH ) && - (rx_desc->wb.qword1.status_error_len & rss_mask) == rss_mask) -return le32_to_cpu (rx_desc->wb.qword0.hi_dword.rss); -else -return 0 ; -} - -/** -* i40e_ptype_to_hash - get a hash type +* i40e_ptype_to_htype - get a hash type * @ptype: the ptype value from the descriptor * * Returns a hash type to be used by skb_set_hash **/ -static inline enum pkt_hash_types i40e_ptype_to_hash (u8 ptype) +static inline enum pkt_hash_types i40e_ptype_to_htype (u8 ptype) {struct i40e_rx_ptype_decoded decoded =decode_rx_desc_ptype (ptype);
@@ -1464,6 +1445,30 @@ static inline enum pkt_hash_types i40e_ptype_to_hash(u8 ptype) }/** +* i40e_rx_hash - set the hash value in the skb +* @ring: descriptor ring +* @rx_desc: specific descriptor +**/ +static inline void i40e_rx_hash (struct i40e_ring *ring, +union i40e_rx_desc *rx_desc, +struct sk_buff *skb, +u8 rx_ptype) +{ +u32 hash; +const __le64 rss_mask = +cpu_to_le64 ((u64 )I40E_RX_DESC_FLTSTAT_RSS_HASH << +I40E_RX_DESC_STATUS_FLTSTAT_SHIFT ); + +if (ring->netdev->features &NETIF_F_RXHASH ) +return ; + +if ((rx_desc->wb.qword1.status_error_len & rss_mask) == rss_mask) { + hash =le32_to_cpu (rx_desc->wb.qword0.hi_dword.rss); +skb_set_hash (skb, hash,i40e_ptype_to_htype (rx_ptype)); + } +} + +/** * i40e_clean_rx_irq_ps - Reclaim resources after receive; packet split * @rx_ring: rx ring to clean * @budget: how many cleans we're allowed
@@ -1612,8 +1617,8 @@ static int i40e_clean_rx_irq_ps(struct i40e_ring *rx_ring, int budget)continue ; } -skb_set_hash (skb,i40e_rx_hash (rx_ring, rx_desc), -i40e_ptype_to_hash (rx_ptype)); +i40e_rx_hash (rx_ring, rx_desc, skb, rx_ptype); +if (unlikely (rx_status &I40E_RXD_QW1_STATUS_TSYNVALID_MASK )) { i40e_ptp_rx_hwtstamp(vsi->back, skb, (rx_status & I40E_RXD_QW1_STATUS_TSYNINDX_MASK) >>
@@ -1741,8 +1746,7 @@ static int i40e_clean_rx_irq_1buf(struct i40e_ring *rx_ring, int budget)continue ; } -skb_set_hash (skb,i40e_rx_hash (rx_ring, rx_desc), -i40e_ptype_to_hash (rx_ptype)); +i40e_rx_hash (rx_ring, rx_desc, skb, rx_ptype);if (unlikely (rx_status &I40E_RXD_QW1_STATUS_TSYNVALID_MASK )) { i40e_ptp_rx_hwtstamp(vsi->back, skb, (rx_status & I40E_RXD_QW1_STATUS_TSYNINDX_MASK) >>
drivers/net/ethernet/intel/i40evf/i40e_txrx.c +29 -25
82 lines not on this page · raw message
Signature · 1 line
2.1.0
Bowers
PATCH 1/13 i40e: Fix Rx hash reported to the stack by our driver
Quoted 26 lines
-----Original Message-----
From: Intel-wired-lan [mailto:intel-wired-lan-bounces at lists.osuosl.org] On Behalf Of Joshua Hay
Sent: Wednesday, December 09, 2015 3:50 PM
To: intel-wired-lan at lists.osuosl.org
Subject: [Intel-wired-lan] [next PATCH S23 01/13] i40e: Fix Rx hash reported to the stack by our driverFrom: Anjali Singhai Jain <[email protected]>
If the driver calls
skb_set_hasheven with a zero hash, that indicates to the stack that the hash calculation is offloaded in hardware. So the Stack doesn't do a SW hash which is required for load balancing if the user decides to turn of rx-hashing on our device.This patch fixes the path so that we do not call
skb_set_hashif the feature is disabled.Signed-off-by Anjali Singhai Jain <[email protected]>Change-ID Ic4debfa4ff91b5a72e447348a75768ed7a2d3e1b---
Testing Hints:Test interrupt overload x710 Apart from the interrupt overload, the user sees a problem where the stack is not calculating the hash when rx- hasing is turned off which is resulting intpacket_v3not balancing the load across multiple threads.
Quoted 5 lines
drivers/net/ethernet/intel/i40e/i40e_txrx.c | 54 ++++++++++++++---------- --- drivers/net/ethernet/intel/i40evf/i40e_txrx.c | 54 ++++++++++++++--------- ---- 2 files changed, 58 insertions(+), 50 deletions(-)
Patch code changes correctly applied, load properly balances across queues with hashing enabled and disabled
PATCH 2/13 i40e: remove forever unused ID
In reply to Joshua HayFrom: Jesse Brandeburg <[email protected]>
Somehow an ID that has never been productized is in the code. There are no plans to use it, so just get rid of it.
---
Testing Hints: make sure the code is all gone that refers to it.
drivers/net/ethernet/intel/i40e/i40e_common.c | 1 - drivers/net/ethernet/intel/i40e/i40e_devids.h | 1 - drivers/net/ethernet/intel/i40e/i40e_main.c | 1 - drivers/net/ethernet/intel/i40evf/i40e_common.c | 1 - drivers/net/ethernet/intel/i40evf/i40e_devids.h | 1 - 5 files changed, 5 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_common.c +0 -1
@@ -44,7 +44,6 @@ static i40e_status i40e_set_mac_type(struct i40e_hw *hw)switch (hw->device_id) {case I40E_DEV_ID_SFP_XL710 :case I40E_DEV_ID_QEMU : -case I40E_DEV_ID_KX_A :case I40E_DEV_ID_KX_B :case I40E_DEV_ID_KX_C :case I40E_DEV_ID_QSFP_A :
drivers/net/ethernet/intel/i40e/i40e_devids.h +0 -1
@@ -30,7 +30,6 @@/* Device IDs */ #define I40E_DEV_ID_SFP_XL710 0x1572#define I40E_DEV_ID_QEMU 0x1574 -#define I40E_DEV_ID_KX_A 0x157F#define I40E_DEV_ID_KX_B 0x1580#define I40E_DEV_ID_KX_C 0x1581#define I40E_DEV_ID_QSFP_A 0x1583
drivers/net/ethernet/intel/i40e/i40e_main.c +0 -1
@@ -79,7 +79,6 @@ static int i40e_veb_get_bw_info(struct i40e_veb *veb);static const struct pci_device_id i40e_pci_tbl[] = { {PCI_VDEVICE (INTEL ,I40E_DEV_ID_SFP_XL710 ),0 }, {PCI_VDEVICE (INTEL ,I40E_DEV_ID_QEMU ),0 }, - {PCI_VDEVICE (INTEL ,I40E_DEV_ID_KX_A ),0 }, {PCI_VDEVICE (INTEL ,I40E_DEV_ID_KX_B ),0 }, {PCI_VDEVICE (INTEL ,I40E_DEV_ID_KX_C ),0 }, {PCI_VDEVICE (INTEL ,I40E_DEV_ID_QSFP_A ),0 },
drivers/net/ethernet/intel/i40evf/i40e_common.c +0 -1
@@ -44,7 +44,6 @@ i40e_status i40e_set_mac_type(struct i40e_hw *hw)switch (hw->device_id) {case I40E_DEV_ID_SFP_XL710 :case I40E_DEV_ID_QEMU : -case I40E_DEV_ID_KX_A :case I40E_DEV_ID_KX_B :case I40E_DEV_ID_KX_C :case I40E_DEV_ID_QSFP_A :
drivers/net/ethernet/intel/i40evf/i40e_devids.h +0 -1
@@ -30,7 +30,6 @@/* Device IDs */ #define I40E_DEV_ID_SFP_XL710 0x1572#define I40E_DEV_ID_QEMU 0x1574 -#define I40E_DEV_ID_KX_A 0x157F#define I40E_DEV_ID_KX_B 0x1580#define I40E_DEV_ID_KX_C 0x1581#define I40E_DEV_ID_QSFP_A 0x1583
Signature · 1 line
2.1.0
Bowers
PATCH 2/13 i40e: remove forever unused ID
Quoted 19 lines
-----Original Message-----
From: Intel-wired-lan [mailto:intel-wired-lan-bounces at lists.osuosl.org] On Behalf Of Joshua Hay
Sent: Wednesday, December 09, 2015 3:50 PM
To: intel-wired-lan at lists.osuosl.org
Subject: [Intel-wired-lan] [next PATCH S23 02/13] i40e: remove forever unused IDFrom: Jesse Brandeburg <[email protected]>
Somehow an ID that has never been productized is in the code. There are no plans to use it, so just get rid of it.
Signed-off-by Jesse Brandeburg <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>Change-ID I59117d48ea9ee0360b0fe33833ac8092f8a24b4c---
Testing Hints: make sure the code is all gone that refers to it.
Quoted 6 lines
drivers/net/ethernet/intel/i40e/i40e_common.c | 1 - drivers/net/ethernet/intel/i40e/i40e_devids.h | 1 - drivers/net/ethernet/intel/i40e/i40e_main.c | 1 - drivers/net/ethernet/intel/i40evf/i40e_common.c | 1 - drivers/net/ethernet/intel/i40evf/i40e_devids.h | 1 - 5 files changed, 5 deletions(-)
Patch code changes correctly applied
PATCH 3/13 i40e: Add mac_filter_element at the end of the list instead of HEAD
In reply to Joshua HayFrom: Kiran Patil <[email protected]>
Add MAC filter element to the end of the list in the given order, just to be tidy, and just in case there are ever any ordering issues in the future.
---
Testing Hints: There is no straight targeted test for this issue.
drivers/net/ethernet/intel/i40e/i40e_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/intel/i40e/i40e_main.c +1 -1
@@ -1365,7 +1365,7 @@ struct i40e_mac_filter *i40e_add_filter(struct i40e_vsi *vsi, f->changed = true;INIT_LIST_HEAD (&f->list); -list_add (&f->list, &vsi->mac_filter_list); +list_add_tail (&f->list, &vsi->mac_filter_list); }/* increment counter and add a new flag if needed */
Signature · 1 line
2.1.0
Bowers
PATCH 3/13 i40e: Add mac_filter_element at the end of the list instead of HEAD
Quoted 13 lines
-----Original Message-----
From: Intel-wired-lan [mailto:intel-wired-lan-bounces at lists.osuosl.org] On Behalf Of Joshua Hay
Sent: Wednesday, December 09, 2015 3:50 PM
To: intel-wired-lan at lists.osuosl.org
Subject: [Intel-wired-lan] [next PATCH S23 03/13] i40e: Addmac_filter_elementat the end of the list instead of HEADFrom: Kiran Patil <[email protected]>
Add MAC filter element to the end of the list in the given order, just to be tidy, and just in case there are ever any ordering issues in the future.
Quoted 7 lines
Signed-off-by Kiran Patil <[email protected]>Change-ID Idc15276147593ea9393ac72c861f9c7905a791b4---
Testing Hints: There is no straight targeted test for this issue.drivers/net/ethernet/intel/i40e/i40e_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Patch code changes correctly applied
PATCH 4/13 i40e/i40evf: Fix RSS rx-flow-hash configuration through ethtool
In reply to Joshua HayFrom: Anjali Singhai Jain <[email protected]>
This patch fixes the Hash PCTYPE enable for X722 since it supports a broader selection of PCTYPES for TCP and UDP.
This patch also fixes a bug in XL710, X710, X722 support for RSS, as of now we cannot reduce the (4)tuple for RSS for TCP/IPv4/IPV6 or UDP/IPv4/IPv6 packets since this requires a product feature change that comes in a later release.
A VF should never be allowed to change the tuples for RSS for any PCTYPE since that's a global setting for the device in case of i40e devices.
--- drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 14 +++----- drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c | 40 +++++----------------- 2 files changed, 12 insertions(+), 42 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_ethtool.c +4 -10
@@ -2166,8 +2166,7 @@ static int i40e_set_rss_hash_opt(struct i40e_pf *pf, struct ethtool_rxnfc *nfc)case TCP_V4_FLOW :switch (nfc->data & (RXH_L4_B_0_1 |RXH_L4_B_2_3 )) {case 0 : - hena &= ~BIT_ULL (I40E_FILTER_PCTYPE_NONF_IPV4_TCP ); -break ; +return -EINVAL ;case (RXH_L4_B_0_1 |RXH_L4_B_2_3 ): hena |=BIT_ULL (I40E_FILTER_PCTYPE_NONF_IPV4_TCP );break ;
@@ -2178,8 +2177,7 @@ static int i40e_set_rss_hash_opt(struct i40e_pf *pf, struct ethtool_rxnfc *nfc)case TCP_V6_FLOW :switch (nfc->data & (RXH_L4_B_0_1 |RXH_L4_B_2_3 )) {case 0 : - hena &= ~BIT_ULL (I40E_FILTER_PCTYPE_NONF_IPV6_TCP ); -break ; +return -EINVAL ;case (RXH_L4_B_0_1 |RXH_L4_B_2_3 ): hena |=BIT_ULL (I40E_FILTER_PCTYPE_NONF_IPV6_TCP );break ;
@@ -2190,9 +2188,7 @@ static int i40e_set_rss_hash_opt(struct i40e_pf *pf, struct ethtool_rxnfc *nfc)case UDP_V4_FLOW :switch (nfc->data & (RXH_L4_B_0_1 |RXH_L4_B_2_3 )) {case 0 : - hena &= ~(BIT_ULL (I40E_FILTER_PCTYPE_NONF_IPV4_UDP ) | -BIT_ULL (I40E_FILTER_PCTYPE_FRAG_IPV4 )); -break ; +return -EINVAL ;case (RXH_L4_B_0_1 |RXH_L4_B_2_3 ): hena |= (BIT_ULL (I40E_FILTER_PCTYPE_NONF_IPV4_UDP ) |BIT_ULL (I40E_FILTER_PCTYPE_FRAG_IPV4 ));
@@ -2204,9 +2200,7 @@ static int i40e_set_rss_hash_opt(struct i40e_pf *pf, struct ethtool_rxnfc *nfc)case UDP_V6_FLOW :switch (nfc->data & (RXH_L4_B_0_1 |RXH_L4_B_2_3 )) {case 0 : - hena &= ~(BIT_ULL (I40E_FILTER_PCTYPE_NONF_IPV6_UDP ) | -BIT_ULL (I40E_FILTER_PCTYPE_FRAG_IPV6 )); -break ; +return -EINVAL ;case (RXH_L4_B_0_1 |RXH_L4_B_2_3 ): hena |= (BIT_ULL (I40E_FILTER_PCTYPE_NONF_IPV6_UDP ) |BIT_ULL (I40E_FILTER_PCTYPE_FRAG_IPV6 ));
drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c +8 -32
@@ -477,54 +477,30 @@ static int i40evf_set_rss_hash_opt(struct i40evf_adapter *adapter,switch (nfc->flow_type) {case TCP_V4_FLOW : -switch (nfc->data & (RXH_L4_B_0_1 |RXH_L4_B_2_3 )) { -case 0 : - hena &= ~BIT_ULL (I40E_FILTER_PCTYPE_NONF_IPV4_TCP ); -break ; -case (RXH_L4_B_0_1 |RXH_L4_B_2_3 ): +if (nfc->data & (RXH_L4_B_0_1 |RXH_L4_B_2_3 )) hena |=BIT_ULL (I40E_FILTER_PCTYPE_NONF_IPV4_TCP ); -break ; -default : +else return -EINVAL ; - }break ;case TCP_V6_FLOW : -switch (nfc->data & (RXH_L4_B_0_1 |RXH_L4_B_2_3 )) { -case 0 : - hena &= ~BIT_ULL (I40E_FILTER_PCTYPE_NONF_IPV6_TCP ); -break ; -case (RXH_L4_B_0_1 |RXH_L4_B_2_3 ): +if (nfc->data & (RXH_L4_B_0_1 |RXH_L4_B_2_3 )) hena |=BIT_ULL (I40E_FILTER_PCTYPE_NONF_IPV6_TCP ); -break ; -default : +else return -EINVAL ; - }break ;case UDP_V4_FLOW : -switch (nfc->data & (RXH_L4_B_0_1 |RXH_L4_B_2_3 )) { -case 0 : - hena &= ~(BIT_ULL (I40E_FILTER_PCTYPE_NONF_IPV4_UDP ) | -BIT_ULL (I40E_FILTER_PCTYPE_FRAG_IPV4 )); -break ; -case (RXH_L4_B_0_1 |RXH_L4_B_2_3 ): +if (nfc->data & (RXH_L4_B_0_1 |RXH_L4_B_2_3 )) { hena |= (BIT_ULL (I40E_FILTER_PCTYPE_NONF_IPV4_UDP ) |BIT_ULL (I40E_FILTER_PCTYPE_FRAG_IPV4 )); -break ; -default : + }else {return -EINVAL ; }break ;case UDP_V6_FLOW : -switch (nfc->data & (RXH_L4_B_0_1 |RXH_L4_B_2_3 )) { -case 0 : - hena &= ~(BIT_ULL (I40E_FILTER_PCTYPE_NONF_IPV6_UDP ) | -BIT_ULL (I40E_FILTER_PCTYPE_FRAG_IPV6 )); -break ; -case (RXH_L4_B_0_1 |RXH_L4_B_2_3 ): +if (nfc->data & (RXH_L4_B_0_1 |RXH_L4_B_2_3 )) { hena |= (BIT_ULL (I40E_FILTER_PCTYPE_NONF_IPV6_UDP ) |BIT_ULL (I40E_FILTER_PCTYPE_FRAG_IPV6 )); -break ; -default : + }else {return -EINVAL ; }break ;
Signature · 1 line
2.1.0
Bowers
PATCH 4/13 i40e/i40evf: Fix RSS rx-flow-hash configuration through ethtool
Quoted 21 lines
-----Original Message-----
From: Intel-wired-lan [mailto:intel-wired-lan-bounces at lists.osuosl.org] On Behalf Of Joshua Hay
Sent: Wednesday, December 09, 2015 3:50 PM
To: intel-wired-lan at lists.osuosl.org
Subject: [Intel-wired-lan] [next PATCH S23 04/13] i40e/i40evf: Fix RSS rx- flow-hash configuration through ethtoolFrom: Anjali Singhai Jain <[email protected]>
This patch fixes the Hash PCTYPE enable for X722 since it supports a broader selection of PCTYPES for TCP and UDP.
This patch also fixes a bug in XL710, X710, X722 support for RSS, as of now we cannot reduce the (4)tuple for RSS for TCP/IPv4/IPV6 or UDP/IPv4/IPv6 packets since this requires a product feature change that comes in a later release.
A VF should never be allowed to change the tuples for RSS for any PCTYPE since that's a global setting for the device in case of i40e devices.
Quoted 6 lines
Signed-off-by Anjali Singhai Jain <[email protected]>Change-ID I0ee7203c9b24813260f58f3220798bc9d9ac4a12--- drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 14 +++----- drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c | 40 +++++----------------- 2 files changed, 12 insertions(+), 42 deletions(-)
Patch code changes correctly applied, RSS works correctly on PF and VF with UDP and TCP traffic
PATCH 5/13 i40e: Replace X722 mac check in ethtool get_settings
In reply to Joshua HayFrom: Catherine Sullivan <[email protected]>
100M SGMII is only supported on X722. Replace the mac check with a feature flag check that is only set for the X722 device.
---
Testing Hints: Check that 100M SGMII is not listed as supported on X710 devices and is listed as supported on X722 devices.
drivers/net/ethernet/intel/i40e/i40e.h | 3 ++- drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/i40e/i40e.h +2 -1
@@ -334,7 +334,8 @@ struct i40e_pf {#define I40E_FLAG_MULTIPLE_TCP_UDP_RSS_PCTYPE BIT_ULL(38)#define I40E_FLAG_LINK_POLLING_ENABLED BIT_ULL(39)#define I40E_FLAG_VEB_MODE_ENABLED BIT_ULL(40) -#define I40E_FLAG_NO_PCI_LINK_CHECK BIT_ULL(42) +#define I40E_FLAG_NO_PCI_LINK_CHECK BIT_ULL(41) +#define I40E_FLAG_100M_SGMII_CAPABLE BIT_ULL(42)/* tracks features that get auto disabled by errors */ u64 auto_disable_flags;
drivers/net/ethernet/intel/i40e/i40e_ethtool.c +1 -1
@@ -340,7 +340,7 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw, SUPPORTED_1000baseT_Full;if (hw_link_info->requested_speeds &I40E_LINK_SPEED_1GB ) ecmd->advertising |= ADVERTISED_1000baseT_Full; -if (pf->hw.mac.type ==I40E_MAC_X722 ) { +if (pf->flags &I40E_FLAG_100M_SGMII_CAPABLE ) { ecmd->supported |= SUPPORTED_100baseT_Full;if (hw_link_info->requested_speeds &I40E_LINK_SPEED_100MB )
Signature · 1 line
2.1.0
Bowers
PATCH 5/13 i40e: Replace X722 mac check in ethtool get_settings
Quoted 15 lines
-----Original Message-----
From: Intel-wired-lan [mailto:intel-wired-lan-bounces at lists.osuosl.org] On Behalf Of Joshua Hay
Sent: Wednesday, December 09, 2015 3:50 PM
To: intel-wired-lan at lists.osuosl.org
Subject: [Intel-wired-lan] [next PATCH S23 05/13] i40e: Replace X722 mac check in ethtoolget_settingsFrom: Catherine Sullivan <[email protected]>
100M SGMII is only supported on X722. Replace the mac check with a feature flag check that is only set for the X722 device.
Signed-off-by Catherine Sullivan <[email protected]>Change-ID I53452d9af6af8cd9dca8500215fbc6ce93418f52
Quoted 7 lines
---
Testing Hints: Check that 100M SGMII is not listed as supported on X710 devices and is listed as supported on X722 devices.drivers/net/ethernet/intel/i40e/i40e.h | 3 ++- drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-)
Patch code changes correctly applied, does not break base driver
PATCH 6/13 i40e/i40evf: tunnels can be generic
In reply to Joshua HayFrom: Jesse Brandeburg <[email protected]>
Since the i40e driver now supports VxLAN, GRE, and soon to be Geneve tunnels, the driver can just note that an skb contains a tunneled packet generically, instead of calling out VXLAN specifically. The tunnel set up we do for hardware is almost always the same for all tunnel types.
This specifically enables ATR/Flow Director on GRE packets which increases performance/scaling. Without this patch GRE RX packets end up on a random RSS assigned queue.
--- drivers/net/ethernet/intel/i40e/i40e_txrx.c | 7 ++++--- drivers/net/ethernet/intel/i40e/i40e_txrx.h | 2 +- drivers/net/ethernet/intel/i40evf/i40e_txrx.c | 2 +- drivers/net/ethernet/intel/i40evf/i40e_txrx.h | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_txrx.c +4 -3
@@ -2005,7 +2005,7 @@ static void i40e_atr(struct i40e_ring *tx_ring, struct sk_buff *skb,if (!(tx_flags & (I40E_TX_FLAGS_IPV4 |I40E_TX_FLAGS_IPV6 )))return ; -if (!(tx_flags &I40E_TX_FLAGS_VXLAN_TUNNEL )) { +if ((tx_flags &I40E_TX_FLAGS_TUNNEL )) {/* snag network header to get L4 type and address */ hdr.network =skb_network_header (skb);
@@ -2090,7 +2090,7 @@ static void i40e_atr(struct i40e_ring *tx_ring, struct sk_buff *skb,I40E_TXD_FLTR_QW1_FD_STATUS_SHIFT ; dtype_cmd |=I40E_TXD_FLTR_QW1_CNT_ENA_MASK ; -if (!(tx_flags &I40E_TX_FLAGS_VXLAN_TUNNEL )) +if (!(tx_flags &I40E_TX_FLAGS_TUNNEL )) dtype_cmd |= ((u32 )I40E_FD_ATR_STAT_IDX (pf->hw.pf_id) << I40E_TXD_FLTR_QW1_CNTINDEX_SHIFT) &
@@ -2323,10 +2323,11 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags, oudph =udp_hdr (skb); oiph =ip_hdr (skb); l4_tunnel =I40E_TXD_CTX_UDP_TUNNELING ; - *tx_flags |=I40E_TX_FLAGS_VXLAN_TUNNEL ; + *tx_flags |=I40E_TX_FLAGS_TUNNEL ;break ;case IPPROTO_GRE : l4_tunnel =I40E_TXD_CTX_GRE_TUNNELING ; + *tx_flags |=I40E_TX_FLAGS_TUNNEL ;break ;default :return ;
drivers/net/ethernet/intel/i40e/i40e_txrx.h +1 -1
@@ -163,7 +163,7 @@ enum i40e_dyn_idx_t {#define I40E_TX_FLAGS_FSO BIT(7)#define I40E_TX_FLAGS_TSYN BIT(8)#define I40E_TX_FLAGS_FD_SB BIT(9) -#define I40E_TX_FLAGS_VXLAN_TUNNEL BIT(10) +#define I40E_TX_FLAGS_TUNNEL BIT(10)#define I40E_TX_FLAGS_VLAN_MASK 0xffff0000#define I40E_TX_FLAGS_VLAN_PRIO_MASK 0xe0000000#define I40E_TX_FLAGS_VLAN_PRIO_SHIFT 29
drivers/net/ethernet/intel/i40evf/i40e_txrx.c +1 -1
@@ -1521,7 +1521,7 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags, oudph =udp_hdr (skb); oiph =ip_hdr (skb); l4_tunnel =I40E_TXD_CTX_UDP_TUNNELING ; - *tx_flags |=I40E_TX_FLAGS_VXLAN_TUNNEL ; + *tx_flags |=I40E_TX_FLAGS_TUNNEL ;break ;default :return ;
drivers/net/ethernet/intel/i40evf/i40e_txrx.h +1 -1
@@ -162,7 +162,7 @@ enum i40e_dyn_idx_t {#define I40E_TX_FLAGS_FCCRC BIT(6)#define I40E_TX_FLAGS_FSO BIT(7)#define I40E_TX_FLAGS_FD_SB BIT(9) -#define I40E_TX_FLAGS_VXLAN_TUNNEL BIT(10) +#define I40E_TX_FLAGS_TUNNEL BIT(10)#define I40E_TX_FLAGS_VLAN_MASK 0xffff0000#define I40E_TX_FLAGS_VLAN_PRIO_MASK 0xe0000000#define I40E_TX_FLAGS_VLAN_PRIO_SHIFT 29
Signature · 1 line
2.1.0
Bowers
PATCH 6/13 i40e/i40evf: tunnels can be generic
Quoted 19 lines
-----Original Message-----
From: Intel-wired-lan [mailto:intel-wired-lan-bounces at lists.osuosl.org] On Behalf Of Joshua Hay
Sent: Wednesday, December 09, 2015 3:50 PM
To: intel-wired-lan at lists.osuosl.org
Subject: [Intel-wired-lan] [next PATCH S23 06/13] i40e/i40evf: tunnels can be genericFrom: Jesse Brandeburg <[email protected]>
Since the i40e driver now supports VxLAN, GRE, and soon to be Geneve tunnels, the driver can just note that an skb contains a tunneled packet generically, instead of calling out VXLAN specifically. The tunnel set up we do for hardware is almost always the same for all tunnel types.
This specifically enables ATR/Flow Director on GRE packets which increases performance/scaling. Without this patch GRE RX packets end up on a random RSS assigned queue.
Quoted 8 lines
Signed-off-by Jesse Brandeburg <[email protected]>Change-ID Ie8e205603654910d2f718592cbef8132ae0719e4--- drivers/net/ethernet/intel/i40e/i40e_txrx.c | 7 ++++--- drivers/net/ethernet/intel/i40e/i40e_txrx.h | 2 +- drivers/net/ethernet/intel/i40evf/i40e_txrx.c | 2 +- drivers/net/ethernet/intel/i40evf/i40e_txrx.h | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-)
Patch code changes correctly applied
PATCH 6/13 i40e/i40evf: tunnels can be generic
In reply to Joshua HayQuoted 27 lines · Joshua A
From: Jesse Brandeburg <[email protected]>
Since the i40e driver now supports VxLAN, GRE, and soon to be Geneve tunnels, the driver can just note that an skb contains a tunneled packet generically, instead of calling out VXLAN specifically. The tunnel set up we do for hardware is almost always the same for all tunnel types.
This specifically enables ATR/Flow Director on GRE packets which increases performance/scaling. Without this patch GRE RX packets end up on a random RSS assigned queue.
Signed-off-by Jesse Brandeburg <[email protected]>Change-ID Ie8e205603654910d2f718592cbef8132ae0719e4Tested-by Andrew Bowers <[email protected]>--- drivers/net/ethernet/intel/i40e/i40e_txrx.c | 7 ++++--- drivers/net/ethernet/intel/i40e/i40e_txrx.h | 2 +- drivers/net/ethernet/intel/i40evf/i40e_txrx.c | 2 +- drivers/net/ethernet/intel/i40evf/i40e_txrx.h | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-)drivers/net/ethernet/intel/i40e/i40e_txrx.c +0
-0
drivers/net/ethernet/intel/i40e/i40e_txrx.c static void i40e_atr(struct i40e_ring *tx_ring, struct sk_buff *skb, · line 2011
Quoted 8 lines
drivers/net/ethernet/intel/i40e/i40e_txrx.c +1
-1@@ -2005,7 +2005,7 @@ static void i40e_atr(struct i40e_ring *tx_ring, struct sk_buff *skb,if (!(tx_flags & (I40E_TX_FLAGS_IPV4 |I40E_TX_FLAGS_IPV6 )))return ; -if (!(tx_flags &I40E_TX_FLAGS_VXLAN_TUNNEL )) { +if ((tx_flags &I40E_TX_FLAGS_TUNNEL )) {/* snag network header to get L4 type and address */ hdr.network =skb_network_header (skb);
So this patch has a major bug right here. Specifically it is disabling ATR for everything since the logic got flipped an you are checking the outer headers for tunneled frames, and the inner headers for non-tunneled frames.
There is another bug a bit further down from here where the variable protocol is used which means it is outer header only and as such breaks any cases where you have v4 over v6 or v6 over v4.
Quoted 62 lines
drivers/net/ethernet/intel/i40e/i40e_txrx.c +3
-2@@ -2090,7 +2090,7 @@ static void i40e_atr(struct i40e_ring *tx_ring, struct sk_buff *skb,I40E_TXD_FLTR_QW1_FD_STATUS_SHIFT ; dtype_cmd |=I40E_TXD_FLTR_QW1_CNT_ENA_MASK ; -if (!(tx_flags &I40E_TX_FLAGS_VXLAN_TUNNEL )) +if (!(tx_flags &I40E_TX_FLAGS_TUNNEL )) dtype_cmd |= ((u32 )I40E_FD_ATR_STAT_IDX (pf->hw.pf_id) << I40E_TXD_FLTR_QW1_CNTINDEX_SHIFT) &@@ -2323,10 +2323,11 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags, oudph =udp_hdr (skb); oiph =ip_hdr (skb); l4_tunnel =I40E_TXD_CTX_UDP_TUNNELING ; - *tx_flags |=I40E_TX_FLAGS_VXLAN_TUNNEL ; + *tx_flags |=I40E_TX_FLAGS_TUNNEL ;break ;case IPPROTO_GRE : l4_tunnel =I40E_TXD_CTX_GRE_TUNNELING ; + *tx_flags |=I40E_TX_FLAGS_TUNNEL ;break ;default :return ;drivers/net/ethernet/intel/i40e/i40e_txrx.h +1
-1@@ -163,7 +163,7 @@ enum i40e_dyn_idx_t {#define I40E_TX_FLAGS_FSO BIT(7)#define I40E_TX_FLAGS_TSYN BIT(8)#define I40E_TX_FLAGS_FD_SB BIT(9) -#define I40E_TX_FLAGS_VXLAN_TUNNEL BIT(10) +#define I40E_TX_FLAGS_TUNNEL BIT(10)#define I40E_TX_FLAGS_VLAN_MASK 0xffff0000#define I40E_TX_FLAGS_VLAN_PRIO_MASK 0xe0000000#define I40E_TX_FLAGS_VLAN_PRIO_SHIFT 29drivers/net/ethernet/intel/i40evf/i40e_txrx.c +1
-1@@ -1521,7 +1521,7 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags, oudph =udp_hdr (skb); oiph =ip_hdr (skb); l4_tunnel =I40E_TXD_CTX_UDP_TUNNELING ; - *tx_flags |=I40E_TX_FLAGS_VXLAN_TUNNEL ; + *tx_flags |=I40E_TX_FLAGS_TUNNEL ;break ;default :return ;drivers/net/ethernet/intel/i40evf/i40e_txrx.h +1
-1@@ -162,7 +162,7 @@ enum i40e_dyn_idx_t {#define I40E_TX_FLAGS_FCCRC BIT(6)#define I40E_TX_FLAGS_FSO BIT(7)#define I40E_TX_FLAGS_FD_SB BIT(9) -#define I40E_TX_FLAGS_VXLAN_TUNNEL BIT(10) +#define I40E_TX_FLAGS_TUNNEL BIT(10)#define I40E_TX_FLAGS_VLAN_MASK 0xffff0000#define I40E_TX_FLAGS_VLAN_PRIO_MASK 0xe0000000#define I40E_TX_FLAGS_VLAN_PRIO_SHIFT 29
PATCH 6/13 i40e/i40evf: tunnels can be generic
Quoted 46 lines · Alexander Duyck
Quoted 15 lines · Joshua A
From: Jesse Brandeburg <[email protected]>
Since the i40e driver now supports VxLAN, GRE, and soon to be Geneve tunnels, the driver can just note that an skb contains a tunneled packet generically, instead of calling out VXLAN specifically.? The tunnel set up we do for hardware is almost always the same for all tunnel types.
This specifically enables ATR/Flow Director on GRE packets which increases performance/scaling.? Without this patch GRE RX packets end up on a random RSS assigned queue.
Signed-off-by Jesse Brandeburg <[email protected]>Change-ID Ie8e205603654910d2f718592cbef8132ae0719e4Tested-by Andrew Bowers <[email protected]>Review
Quoted 8 lines
---
?? drivers/net/ethernet/intel/i40e/i40e_txrx.c?? | 7 ++++--- ?? drivers/net/ethernet/intel/i40e/i40e_txrx.h?? | 2 +- ?? drivers/net/ethernet/intel/i40evf/i40e_txrx.c | 2 +- ?? drivers/net/ethernet/intel/i40evf/i40e_txrx.h | 2 +-?? 4 files changed, 7 insertions(+), 6 deletions(-)
(quoted diff) +0
-0
b/drivers/net/ethernet/intel/i40e/i40e_txrx.cdrivers/net/ethernet/intel/i40e/i40e_txrx.c static void i40e_atr(struct i40e_ring
Quoted 4 lines
index 28d2943..ba79f67 100644
drivers/net/ethernet/intel/i40e/i40e_txrx.c +0
-0@@ -2005,7 +2005,7 @@ static void i40e_atr(struct i40e_ring
*tx_ring, structsk_buff*skb,Quoted 8 lines
drivers/net/ethernet/intel/i40e/i40e_txrx.c +1
-1???????if (!(tx_flags & (I40E_TX_FLAGS_IPV4 | I40E_TX_FLAGS_IPV6))) ???????????????return; -?????if (!(tx_flags & I40E_TX_FLAGS_VXLAN_TUNNEL)) { +?????if ((tx_flags & I40E_TX_FLAGS_TUNNEL)) {???????????????/* snag network header to get L4 type and address */ ???????????????hdr.network =
skb_network_header(skb);So this patch has a major bug right here.? Specifically it is disabling?
ATR for everything since the logic got flipped an you are checking the?
outer headers for tunneled frames, and the inner headers for? non-tunneled frames.
Quoted 4 lines
There is another bug a bit further down from here where the variable? protocol is used which means it is outer header only and as such breaks?
any cases where you have v4 over v6 or v6 over v4.
Thanks Alex for finding this, Jesse is working on a revised patch right
now.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part
URL: <http://lists.osuosl.org/pipermail/intel-wired-lan/attachments/20160120/f6e716a6/attachment.asc>
PATCH 6/13 i40e/i40evf: tunnels can be generic
In reply to Alexander DuyckQuoted 12 lines · On Tue, 19 Jan 2016 19:54:07 -0800 Alexander Duyck <[email protected]>…
drivers/net/ethernet/intel/i40e/i40e_txrx.c static void i40e_atr(struct i40e_ring *tx_ring, struct sk_buff *skb, · line 2010
Quoted 6 lines · Joshua A
From: Jesse Brandeburg <[email protected]>
drivers/net/ethernet/intel/i40e/i40e_txrx.c +1
-1-if (!(tx_flags &I40E_TX_FLAGS_VXLAN_TUNNEL )) { +if ((tx_flags &I40E_TX_FLAGS_TUNNEL )) {/* snag network header to get L4 type and address */ hdr.network =skb_network_header (skb);So this patch has a major bug right here. Specifically it is disabling ATR for everything since the logic got flipped an you are checking the outer headers for tunneled frames, and the inner headers for non-tunneled frames.
I've got a patch ready that fixes the "major bug" part, which appears to be due to be a combination of several factors leading to this point where the code was broken. Thank you VERY much for catching this.
Quoted 3 lines
There is another bug a bit further down from here where the variable protocol is used which means it is outer header only and as such breaks any cases where you have v4 over v6 or v6 over v4.
Since this issue was not introduced in this patch, I'm going to punt to a separate patch to fix the "protocol".
PATCH 6/13 i40e/i40evf: tunnels can be generic
Quoted 20 lines · Jesse Brandeburg
Quoted 8 lines · On Tue, 19 Jan 2016 19:54:07 -0800 Alexander Duyck <[email protected]>…
drivers/net/ethernet/intel/i40e/i40e_txrx.c static void i40e_atr(struct i40e_ring *tx_ring, struct sk_buff *skb, · line 2010
Quoted 6 lines · Joshua A
From: Jesse Brandeburg <[email protected]>
drivers/net/ethernet/intel/i40e/i40e_txrx.c +1
-1-if (!(tx_flags &I40E_TX_FLAGS_VXLAN_TUNNEL )) { +if ((tx_flags &I40E_TX_FLAGS_TUNNEL )) {/* snag network header to get L4 type and address */ hdr.network =skb_network_header (skb);Quoted 4 lines
So this patch has a major bug right here. Specifically it is disabling ATR for everything since the logic got flipped an you are checking the outer headers for tunneled frames, and the inner headers for non-tunneled frames.
I've got a patch ready that fixes the "major bug" part, which appears to be due to be a combination of several factors leading to this point where the code was broken. Thank you VERY much for catching this.
Quoted 7 lines
Quoted 3 lines
There is another bug a bit further down from here where the variable protocol is used which means it is outer header only and as such breaks any cases where you have v4 over v6 or v6 over v4.
Since this issue was not introduced in this patch, I'm going to punt to a separate patch to fix the "protocol".
That's fine with me. I actually have a patch already put together to address the protocol bug. I just have to finish up sorting out the ATA issues I am having with the current net-next and once I have that resolved I will hopefully be able to work on splitting up the patches a bit more and will submit my v2 either tonight or early tomorrow.
- Alex
PATCH 7/13 i40evf: allow channel bonding of VFs
In reply to Joshua HayFrom: Mitch Williams <[email protected]>
In some modes, bonding would not enslave VF interfaces. This is due to bonding calling change_mtu and the immediately calling open. Because of the asynchronous nature of the admin queue mechanism, the VF returns -EBUSY to the open call, because it knows the previous operation hasn't finished yet. This causes bonding to fail with a less-than-useful error message.
To fix this, remove the check for pending operations at the beginning of open. But this introduces a new bug where the driver will panic on a quick close/open cycle. To fix that, we add a new driver state, __I40EVF_DOWN_PENDING, that the driver enters when down is called. The driver finally transitions to a fully DOWN state when it receives confirmation from the PF driver that all the queues are disabled. This allows open to complete even if there is a pending mtu change, and bonding is finally happy.
--- drivers/net/ethernet/intel/i40evf/i40evf.h | 1 + drivers/net/ethernet/intel/i40evf/i40evf_main.c | 9 +++++---- drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c | 2 ++ 3 files changed, 8 insertions(+), 4 deletions(-)
drivers/net/ethernet/intel/i40evf/i40evf.h +1 -0
@@ -173,6 +173,7 @@ enum i40evf_state_t { __I40EVF_RESETTING,/* in reset */ /* Below here, watchdog is running */ __I40EVF_DOWN,/* ready, can be opened */ + __I40EVF_DOWN_PENDING,/* descending, waiting for watchdog */ __I40EVF_TESTING,/* in ethtool self-test */ __I40EVF_RUNNING, /* opened, working */ };
drivers/net/ethernet/intel/i40evf/i40evf_main.c +5 -4
@@ -1032,7 +1032,7 @@ void i40evf_down(struct i40evf_adapter *adapter)struct net_device *netdev = adapter->netdev;struct i40evf_mac_filter *f; -if (adapter->state == __I40EVF_DOWN) +if (adapter->state <= __I40EVF_DOWN_PENDING)return ; while (test_and_set_bit(__I40EVF_IN_CRITICAL_TASK,
@@ -2142,7 +2142,8 @@ static int i40evf_open(struct net_device *netdev)dev_err (&adapter->pdev->dev,"Unable to open device due to PF driver failure.\n" );return -EIO ; } -if (adapter->state != __I40EVF_DOWN || adapter->aq_required) + +if (adapter->state != __I40EVF_DOWN)return -EBUSY ;/* allocate transmit descriptors */
@@ -2197,14 +2198,14 @@ static int i40evf_close(struct net_device *netdev) {struct i40evf_adapter *adapter =netdev_priv (netdev); -if (adapter->state <= __I40EVF_DOWN) +if (adapter->state <= __I40EVF_DOWN_PENDING)return 0 ;set_bit (__I40E_DOWN, &adapter->vsi.state);i40evf_down (adapter); - adapter->state = __I40EVF_DOWN; + adapter->state = __I40EVF_DOWN_PENDING;i40evf_free_traffic_irqs (adapter);return 0 ;
drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c +2 -0
@@ -804,6 +804,8 @@ void i40evf_virtchnl_completion(struct i40evf_adapter *adapter,case I40E_VIRTCHNL_OP_DISABLE_QUEUES :i40evf_free_all_tx_resources (adapter);i40evf_free_all_rx_resources (adapter); +if (adapter->state == __I40EVF_DOWN_PENDING) + adapter->state = __I40EVF_DOWN;break ;case I40E_VIRTCHNL_OP_VERSION :case I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP :
Signature · 1 line
2.1.0
Bowers
PATCH 7/13 i40evf: allow channel bonding of VFs
Quoted 25 lines
-----Original Message-----
From: Intel-wired-lan [mailto:intel-wired-lan-bounces at lists.osuosl.org] On Behalf Of Joshua Hay
Sent: Wednesday, December 09, 2015 3:50 PM
To: intel-wired-lan at lists.osuosl.org
Subject: [Intel-wired-lan] [next PATCH S23 07/13] i40evf: allow channel bonding of VFsFrom: Mitch Williams <[email protected]>
In some modes, bonding would not enslave VF interfaces. This is due to bonding calling
change_mtuand the immediately calling open. Because of the asynchronous nature of the admin queue mechanism, the VF returns - EBUSY to the open call, because it knows the previous operation hasn't finished yet. This causes bonding to fail with a less-than-useful error message.To fix this, remove the check for pending operations at the beginning of open. But this introduces a new bug where the driver will panic on a quick close/open cycle. To fix that, we add a new driver state,
__I40EVF_DOWN_PENDING, that the driver enters when down is called. The driver finally transitions to a fully DOWN state when it receives confirmation from the PF driver that all the queues are disabled. This allows open to complete even if there is a pending mtu change, and bonding is finally happy.
Quoted 7 lines
Signed-off-by Mitch Williams <[email protected]>Change-ID I06f4c7e435d5bacbfceaa7c3f209e0ff04be21cc--- drivers/net/ethernet/intel/i40evf/i40evf.h | 1 + drivers/net/ethernet/intel/i40evf/i40evf_main.c | 9 +++++---- drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c | 2 ++ 3 files changed, 8 insertions(+), 4 deletions(-)
Patch code changes correctly applied
PATCH 8/13 i40e: define function capabilities in only one place
In reply to Joshua HayFrom: Shannon Nelson <[email protected]>
The device capabilities were defined in two places, and neither had all the definitions. It really belongs with the AQ API definition, so this patch removes the other set of definitions and fills out the missing item.
---
Testing Hints: Apply and compile cleanly
drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h | 1 + drivers/net/ethernet/intel/i40e/i40e_common.c | 85 +++++++--------------- .../net/ethernet/intel/i40evf/i40e_adminq_cmd.h | 1 + 3 files changed, 30 insertions(+), 57 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h +1 -0
@@ -422,6 +422,7 @@ struct i40e_aqc_list_capabilities_element_resp {#define I40E_AQ_CAP_ID_LED 0x0061#define I40E_AQ_CAP_ID_SDP 0x0062#define I40E_AQ_CAP_ID_MDIO 0x0063 +#define I40E_AQ_CAP_ID_WSR_PROT 0x0064#define I40E_AQ_CAP_ID_FLEX10 0x00F1#define I40E_AQ_CAP_ID_CEM 0x00F2
drivers/net/ethernet/intel/i40e/i40e_common.c +28 -57
180 lines not on this page · raw message
drivers/net/ethernet/intel/i40evf/i40e_adminq_cmd.h +1 -0
@@ -419,6 +419,7 @@ struct i40e_aqc_list_capabilities_element_resp {#define I40E_AQ_CAP_ID_LED 0x0061#define I40E_AQ_CAP_ID_SDP 0x0062#define I40E_AQ_CAP_ID_MDIO 0x0063 +#define I40E_AQ_CAP_ID_WSR_PROT 0x0064#define I40E_AQ_CAP_ID_FLEX10 0x00F1#define I40E_AQ_CAP_ID_CEM 0x00F2
Signature · 1 line
2.1.0
PATCH 8/13 i40e: define function capabilities in only one place
Quoted 9 lines · On Wed, 9 Dec 2015 15:50:28 -0800 Joshua Hay <[email protected]> wrote:
From: Shannon Nelson <[email protected]>
The device capabilities were defined in two places, and neither had all the definitions. It really belongs with the AQ API definition, so this patch removes the other set of definitions and fills out the missing item.
Signed-off-by Shannon Nelson <[email protected]>Acked-by Jesse Brandeburg <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>
Only the Author's S.O.B should be included when submitting upstream, until Jeff adds his own S.O.B as part of the upstreaming process.
Bowers
PATCH 8/13 i40e: define function capabilities in only one place
In reply to Joshua HayQuoted 18 lines
-----Original Message-----
From: Intel-wired-lan [mailto:intel-wired-lan-bounces at lists.osuosl.org] On Behalf Of Joshua Hay
Sent: Wednesday, December 09, 2015 3:50 PM
To: intel-wired-lan at lists.osuosl.org
Subject: [Intel-wired-lan] [next PATCH S23 08/13] i40e: define function capabilities in only one placeFrom: Shannon Nelson <[email protected]>
The device capabilities were defined in two places, and neither had all the definitions. It really belongs with the AQ API definition, so this patch removes the other set of definitions and fills out the missing item.
Signed-off-by Shannon Nelson <[email protected]>Acked-by Jesse Brandeburg <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>Change-ID I273ba7d79a476cd11d2e0ca5825fec1716740de2
Quoted 8 lines
---
Testing Hints: Apply and compile cleanlydrivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h | 1 + drivers/net/ethernet/intel/i40e/i40e_common.c | 85 +++++++------------- -- .../net/ethernet/intel/i40evf/i40e_adminq_cmd.h | 1 + 3 files changed, 30 insertions(+), 57 deletions(-)
Patch code changes correctly applied
Bowers
PATCH 8/13 i40e: define function capabilities in only one place
Quoted 31 lines
-----Original Message-----
From: Intel-wired-lan [mailto:intel-wired-lan-bounces at lists.osuosl.org] On Behalf Of Bowers, AndrewX
Sent: Thursday, December 17, 2015 8:54 AM
To: intel-wired-lan at lists.osuosl.org
Subject: Re: [Intel-wired-lan] [next PATCH S23 08/13] i40e: define function capabilities in only one placeQuoted 9 lines
-----Original Message-----
From: Intel-wired-lan
[mailto:intel-wired-lan-bounces at lists.osuosl.org] On Behalf Of Joshua Hay
Sent: Wednesday, December 09, 2015 3:50 PM
To: intel-wired-lan at lists.osuosl.org
Subject: [Intel-wired-lan] [next PATCH S23 08/13] i40e: define function capabilities in only one placeQuoted 5 lines
From: Shannon Nelson <[email protected]>
The device capabilities were defined in two places, and neither had all the definitions. It really belongs with the AQ API definition, so this patch removes the other set of definitions and fills out the missing
item.
Quoted 8 lines
Signed-off-by Shannon Nelson <[email protected]>Acked-by Jesse Brandeburg <[email protected]>Signed-off-by Jeff Kirsher <[email protected]>Change-ID I273ba7d79a476cd11d2e0ca5825fec1716740de2---
Testing Hints: Apply and compile cleanly
Quoted 6 lines
Quoted 2 lines
drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h | 1 + drivers/net/ethernet/intel/i40e/i40e_common.c | 85 +++++++-------------
Quoted 3 lines
--
.../net/ethernet/intel/i40evf/i40e_adminq_cmd.h | 1 + 3 files changed, 30 insertions(+), 57 deletions(-)
Patch code changes correctly applied
PATCH 9/13 i40e: Make some changes in the nvm read code
In reply to Joshua HayFrom: Anjali Singhai Jain <[email protected]>
In X722, NVM reads can't be done through SRCTL registers. And require AQ calls, which require grabbing the NVM lock. Unfortunately some paths need the lock to be acquired once and do a whole bunch of stuff and then release it. This patch creates an unsafe version of the read calls, so that it can be called from the paths that need the bulk access.
---
Testing Hints: Also make sure LAN driver
sees the correct NVM version and does not fail verify checksum during init and during reset.
drivers/net/ethernet/intel/i40e/i40e_nvm.c | 70 +++++++++++++++++++++++++----- 1 file changed, 59 insertions(+), 11 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_nvm.c +59 -11
@@ -212,6 +212,24 @@ read_nvm_exit: }/** +* __i40e_read_nvm_word - Reads nvm word, assumes caller does the locking +* @hw: pointer to the HW structure +* @offset: offset of the Shadow RAM word to read (0x000000 - 0x001FFF) +* @data: word read from the Shadow RAM +* +* Reads one 16 bit word from the Shadow RAM using the GLNVM_SRCTL register. +**/ +static i40e_status __i40e_read_nvm_word (struct i40e_hw *hw, +u16 offset, +u16 *data) +{ +i40e_status ret_code =0 ; + + ret_code =i40e_read_nvm_word_srctl (hw, offset, data); +return ret_code; +} + +/** * i40e_read_nvm_aq - Read Shadow RAM. * @hw: pointer to the HW structure. * @module_pointer: module pointer location in words from the NVM beginning
@@ -280,7 +298,7 @@ static i40e_status i40e_read_nvm_word_aq(struct i40e_hw *hw, u16 offset, }/** -* i40e_read_nvm_word - Reads Shadow RAM +* i40e_read_nvm_word - Reads nvm word and acquire lock if necessary * @hw: pointer to the HW structure * @offset: offset of the Shadow RAM word to read (0x000000 - 0x001FFF) * @data: word read from the Shadow RAM
@@ -393,7 +411,28 @@ read_nvm_buffer_aq_exit: }/** -* i40e_read_nvm_buffer - Reads Shadow RAM buffer +* __i40e_read_nvm_buffer - Reads nvm buffer, caller must acquire lock +* @hw: pointer to the HW structure +* @offset: offset of the Shadow RAM word to read (0x000000 - 0x001FFF). +* @words: (in) number of words to read; (out) number of words actually read +* @data: words read from the Shadow RAM +* +* Reads 16 bit words (data buffer) from the SR using the i40e_read_nvm_srrd() +* method. The buffer read is preceded by the NVM ownership take +* and followed by the release. +**/ +static i40e_status __i40e_read_nvm_buffer (struct i40e_hw *hw, +u16 offset, +u16 *words,u16 *data) +{ +i40e_status ret_code =0 ; + + ret_code =i40e_read_nvm_buffer_srctl (hw, offset, words, data); +return ret_code; +} + +/** +* i40e_read_nvm_buffer - Reads Shadow RAM buffer and acuire lock if necessary * @hw: pointer to the HW structure * @offset: offset of the Shadow RAM word to read (0x000000 - 0x001FFF). * @words: (in) number of words to read; (out) number of words actually read
@@ -499,15 +538,17 @@ static i40e_status i40e_calc_nvm_checksum(struct i40e_hw *hw, data = (u16 *)vmem.va;/* read pointer to VPD area */ - ret_code =i40e_read_nvm_word (hw,I40E_SR_VPD_PTR , &vpd_module); + ret_code =__i40e_read_nvm_word (hw,I40E_SR_VPD_PTR , + &vpd_module);if (ret_code) { ret_code =I40E_ERR_NVM_CHECKSUM ; goto i40e_calc_nvm_checksum_exit; }/* read pointer to PCIe Alt Auto-load module */ - ret_code =i40e_read_nvm_word (hw,I40E_SR_PCIE_ALT_AUTO_LOAD_PTR , - &pcie_alt_module); + ret_code =__i40e_read_nvm_word (hw, +I40E_SR_PCIE_ALT_AUTO_LOAD_PTR , + &pcie_alt_module);if (ret_code) { ret_code =I40E_ERR_NVM_CHECKSUM ; goto i40e_calc_nvm_checksum_exit;
@@ -521,7 +562,7 @@ static i40e_status i40e_calc_nvm_checksum(struct i40e_hw *hw,if ((i %I40E_SR_SECTOR_SIZE_IN_WORDS ) ==0 ) {u16 words =I40E_SR_SECTOR_SIZE_IN_WORDS ; - ret_code =i40e_read_nvm_buffer (hw, i, &words, data); + ret_code =__i40e_read_nvm_buffer (hw, i, &words, data);if (ret_code) { ret_code =I40E_ERR_NVM_CHECKSUM ; goto i40e_calc_nvm_checksum_exit;
@@ -593,13 +634,18 @@ i40e_status i40e_validate_nvm_checksum(struct i40e_hw *hw,u16 checksum_sr =0 ;u16 checksum_local =0 ; - ret_code =i40e_calc_nvm_checksum (hw, &checksum_local); -if (ret_code) +if (hw->flags &I40E_HW_FLAG_AQ_SRCTL_ACCESS_ENABLE ) + ret_code =i40e_acquire_nvm (hw,I40E_RESOURCE_READ ); +if (!ret_code) { + ret_code =i40e_calc_nvm_checksum (hw, &checksum_local); +if (hw->flags &I40E_HW_FLAG_AQ_SRCTL_ACCESS_ENABLE ) +i40e_release_nvm (hw); +if (ret_code) + goto i40e_validate_nvm_checksum_exit; + }else { goto i40e_validate_nvm_checksum_exit; + } -/* Do not use i40e_read_nvm_word() because we do not want to take -* the synchronization semaphores twice here. -*/ i40e_read_nvm_word (hw,I40E_SR_SW_CHECKSUM_WORD , &checksum_sr);/* Verify read checksum from EEPROM is the same as
@@ -958,6 +1004,7 @@ retry:break ;case I40E_NVMUPD_CSUM_CON : +/* Assumes the caller has acquired the nvm */ status =i40e_update_nvm_checksum (hw);if (status) { *perrno = hw->aq.asq_last_status ?
@@ -971,6 +1018,7 @@ retry:break ;case I40E_NVMUPD_CSUM_LCB : +/* Assumes the caller has acquired the nvm */ status =i40e_update_nvm_checksum (hw);if (status) { *perrno = hw->aq.asq_last_status ?
Signature · 1 line
2.1.0
PATCH 10/13 i40evf: null out ring pointers on free
In reply to Joshua HayFrom: Mitch Williams <[email protected]>
Since we check these ring pointers to make sure we don't double-allocate or double-free the rings, we had better null them out after we free them. In very rare cases this can cause a panic if the driver is removed during reset recovery.
--- drivers/net/ethernet/intel/i40evf/i40evf_main.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/ethernet/intel/i40evf/i40evf_main.c +2 -0
@@ -1122,7 +1122,9 @@ static void i40evf_free_queues(struct i40evf_adapter *adapter)if (!adapter->vsi_res)return ;kfree (adapter->tx_rings); + adapter->tx_rings =NULL ;kfree (adapter->rx_rings); + adapter->rx_rings =NULL ; }/**
Signature · 1 line
2.1.0
Bowers
PATCH 10/13 i40evf: null out ring pointers on free
Quoted 15 lines
-----Original Message-----
From: Intel-wired-lan [mailto:intel-wired-lan-bounces at lists.osuosl.org] On Behalf Of Joshua Hay
Sent: Wednesday, December 09, 2015 3:51 PM
To: intel-wired-lan at lists.osuosl.org
Subject: [Intel-wired-lan] [next PATCH S23 10/13] i40evf: null out ring pointers on freeFrom: Mitch Williams <[email protected]>
Since we check these ring pointers to make sure we don't double-allocate or double-free the rings, we had better null them out after we free them. In very rare cases this can cause a panic if the driver is removed during reset recovery.
Quoted 5 lines
Signed-off-by Mitch Williams <[email protected]>Change-ID Ib06eb4910a3058275c8f7ec5ef7f45baa4674f96--- drivers/net/ethernet/intel/i40evf/i40evf_main.c | 2 ++ 1 file changed, 2 insertions(+)
Patch code changes correctly applied
PATCH 11/13 i40e: Cleanup the code with respect to restarting autoneg
In reply to Joshua HayFrom: Anjali Singhai Jain <[email protected]>
The restart-autoneg work around does not apply to X722. Added a flag to set it only for the right MAC and right FW version where the work around should be applied.
--- drivers/net/ethernet/intel/i40e/i40e.h | 1 + drivers/net/ethernet/intel/i40e/i40e_main.c | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-)
drivers/net/ethernet/intel/i40e/i40e.h +1 -0
@@ -336,6 +336,7 @@ struct i40e_pf {#define I40E_FLAG_VEB_MODE_ENABLED BIT_ULL(40)#define I40E_FLAG_NO_PCI_LINK_CHECK BIT_ULL(41)#define I40E_FLAG_100M_SGMII_CAPABLE BIT_ULL(42) +#define I40E_FLAG_RESTART_AUTONEG BIT_ULL(43)/* tracks features that get auto disabled by errors */ u64 auto_disable_flags;
drivers/net/ethernet/intel/i40e/i40e_main.c +8 -4
@@ -6882,8 +6882,7 @@ static void i40e_reset_and_rebuild(struct i40e_pf *pf, bool reinit)wr32 (hw,I40E_REG_MSS , val); } -if (((pf->hw.aq.fw_maj_ver ==4 ) && (pf->hw.aq.fw_min_ver <33 )) || - (pf->hw.aq.fw_maj_ver <4 )) { +if (pf->flags &I40E_FLAG_RESTART_AUTONEG ) {msleep (75 ); ret =i40e_aq_set_link_restart_an (&pf->hw, true,NULL );if (ret)
@@ -8362,6 +8361,12 @@ static int i40e_sw_init(struct i40e_pf *pf) pf->hw.func_caps.fd_filters_best_effort; } +if (((pf->hw.mac.type ==I40E_MAC_X710 ) || + (pf->hw.mac.type ==I40E_MAC_XL710 )) && + (((pf->hw.aq.fw_maj_ver ==4 ) && (pf->hw.aq.fw_min_ver <33 )) || + (pf->hw.aq.fw_maj_ver <4 ))) + pf->flags |=I40E_FLAG_RESTART_AUTONEG ; +if (pf->hw.func_caps.vmdq) { pf->num_vmdq_vsis =I40E_DEFAULT_NUM_VMDQ_VSI ; pf->flags |=I40E_FLAG_VMDQ_ENABLED ;
@@ -10791,8 +10796,7 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)wr32 (hw,I40E_REG_MSS , val); } -if (((pf->hw.aq.fw_maj_ver ==4 ) && (pf->hw.aq.fw_min_ver <33 )) || - (pf->hw.aq.fw_maj_ver <4 )) { +if (pf->flags &I40E_FLAG_RESTART_AUTONEG ) {msleep (75 ); err =i40e_aq_set_link_restart_an (&pf->hw, true,NULL );if (err)
Signature · 1 line
2.1.0
Bowers
PATCH 11/13 i40e: Cleanup the code with respect to restarting autoneg
Quoted 14 lines
-----Original Message-----
From: Intel-wired-lan [mailto:intel-wired-lan-bounces at lists.osuosl.org] On Behalf Of Joshua Hay
Sent: Wednesday, December 09, 2015 3:51 PM
To: intel-wired-lan at lists.osuosl.org
Subject: [Intel-wired-lan] [next PATCH S23 11/13] i40e: Cleanup the code with respect to restarting autonegFrom: Anjali Singhai Jain <[email protected]>
The restart-autoneg work around does not apply to X722.
Added a flag to set it only for the right MAC and right FW version where the work around should be applied.
Quoted 6 lines
Signed-off-by Anjali Singhai Jain <[email protected]>Change-ID I942c3ff40cccd1e56f424b1da776b020fe3c9d2a--- drivers/net/ethernet/intel/i40e/i40e.h | 1 + drivers/net/ethernet/intel/i40e/i40e_main.c | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-)
Patch code changes correctly applied
PATCH 12/13 i40e: update features with right offload
In reply to Joshua HayFrom: Jesse Brandeburg <[email protected]>
Synchronize code bases and add SCTP offload support.
---
Testing Hints: Test SCTP in a tunnel like vxlan and make sure TSO is still working. Test GRE tunnels and make sure they work. See already applied GRE upstream commit for instructions.
drivers/net/ethernet/intel/i40e/i40e_main.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_main.c +6 -4
@@ -8847,10 +8847,12 @@ static int i40e_config_netdev(struct i40e_vsi *vsi) np =netdev_priv (netdev); np->vsi = vsi; - netdev->hw_enc_features |=NETIF_F_IP_CSUM | -NETIF_F_GSO_UDP_TUNNEL | -NETIF_F_GSO_GRE | -NETIF_F_TSO ; + netdev->hw_enc_features |=NETIF_F_IP_CSUM | +NETIF_F_SCTP_CSUM | +NETIF_F_GSO_UDP_TUNNEL | +NETIF_F_GSO_GRE | +NETIF_F_TSO | +0 ; netdev->features =NETIF_F_SG | NETIF_F_IP_CSUM |
Signature · 1 line
2.1.0
PATCH 12/13 i40e: update features with right offload
Quoted 6 lines · On Wed, 9 Dec 2015 15:50:32 -0800 Joshua Hay <[email protected]> wrote:
From: Jesse Brandeburg <[email protected]>
Synchronize code bases and add SCTP offload support.
Signed-off-by Jesse Brandeburg <[email protected]>Reviewed-by Brandeburg, Jesse <[email protected]>
signed off by and reviewed by the same person looks bogus. Please only include the originator's S.O.B. when generating upstream commits.
PATCH 13/13 i40e: bump version to 1.4.10
In reply to Joshua HayFrom: Catherine Sullivan <[email protected]>
Bump.
Change-Id: I81c407a988a8ff3c0b3ae64b4330800c95e6c31b
---
Testing Hints: check version
drivers/net/ethernet/intel/i40e/i40e_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/intel/i40e/i40e_main.c +1 -1
@@ -48,7 +48,7 @@ static const char i40e_driver_string[] =#define DRV_VERSION_MAJOR 1#define DRV_VERSION_MINOR 4 -#define DRV_VERSION_BUILD 8 +#define DRV_VERSION_BUILD 10#define DRV_VERSION __stringify(DRV_VERSION_MAJOR) "." \ __stringify(DRV_VERSION_MINOR) "." \ __stringify(DRV_VERSION_BUILD) DRV_KERN
Signature · 1 line
2.1.0
Bowers
PATCH 13/13 i40e: bump version to 1.4.10
Quoted 14 lines
-----Original Message-----
From: Intel-wired-lan [mailto:intel-wired-lan-bounces at lists.osuosl.org] On Behalf Of Joshua Hay
Sent: Wednesday, December 09, 2015 3:51 PM
To: intel-wired-lan at lists.osuosl.org
Subject: [Intel-wired-lan] [next PATCH S23 13/13] i40e: bump version to 1.4.10From: Catherine Sullivan <[email protected]>
Bump.
Change-Id: I81c407a988a8ff3c0b3ae64b4330800c95e6c31b
Quoted 7 lines
Signed-off-by Catherine Sullivan <[email protected]>Change-ID Ic9a495feb9ab0606f953c3848b0acf67169d3930---
Testing Hints: check versiondrivers/net/ethernet/intel/i40e/i40e_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Patch code changes correctly applied, modinfo/ethtool show correct version