i40e/i40evf updates
Subsystems (2)
cover i40e/i40evf updates
Anjali Singhai Jain adds a Virtchnl offload for RSS PCTYPE V2, and a new offload for RSS PCTYPE V2.
Jesse Brandeburg chomps the BIT(_ULL), fixes mismatched declaration, and also fixes W=1 warning.
Kamil Krawczyk adds 'use explicit cast from u16 to u8'.
Michal Kosiarz adds opcode and structures required by OEM Post Update AQ command and a new NVM arq message.
Mitch Williams adds proper deletion of VF MAC filters, and removes zero MAC filter. Also checks rings before freeing resources, changes version string generation, and adds hush little warnings.
Shannon Nelson cleans whole mac filter list.
drivers/net/ethernet/intel/i40e/i40e.h | 4 +- drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h | 21 +++++ drivers/net/ethernet/intel/i40e/i40e_lan_hmc.c | 2 +- drivers/net/ethernet/intel/i40e/i40e_main.c | 105 +++++++++++++++------ drivers/net/ethernet/intel/i40e/i40e_virtchnl.h | 1 + drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 23 +++-- .../net/ethernet/intel/i40evf/i40e_adminq_cmd.h | 21 +++++ drivers/net/ethernet/intel/i40evf/i40e_virtchnl.h | 1 + drivers/net/ethernet/intel/i40evf/i40evf_main.c | 27 ++++-- .../net/ethernet/intel/i40evf/i40evf_virtchnl.c | 4 +- 10 files changed, 162 insertions(+), 47 deletions(-)
Signature · 1 line
2.1.0
PATCH 1/14 i40e/i40evf: use logical operator
From: Mitch Williams <[email protected]>
We shouldn't be using a bitwise operator here; it's not a bitwise operation. Use a logical operator instead. Why doesn't c have a logical-or-and-assign operator?
--- drivers/net/ethernet/intel/i40e/i40e_txrx.c | 2 +- drivers/net/ethernet/intel/i40evf/i40e_txrx.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_txrx.c +1 -1
@@ -1908,7 +1908,7 @@ int i40e_napi_poll(struct napi_struct *napi, int budget)*/ i40e_for_each_ring (ring, q_vector->tx) { clean_complete &=i40e_clean_tx_irq (ring, vsi->work_limit); - arm_wb |= ring->arm_wb; + arm_wb = arm_wb || ring->arm_wb; ring->arm_wb = false; }
drivers/net/ethernet/intel/i40evf/i40e_txrx.c +1 -1
@@ -1332,7 +1332,7 @@ int i40evf_napi_poll(struct napi_struct *napi, int budget)*/ i40e_for_each_ring (ring, q_vector->tx) { clean_complete &=i40e_clean_tx_irq (ring, vsi->work_limit); - arm_wb |= ring->arm_wb; + arm_wb = arm_wb || ring->arm_wb; ring->arm_wb = false; }
Signature · 1 line
2.1.0
PATCH 2/14 i40e: chomp the BIT(_ULL)
In reply to Deepthi KavalurFrom: Jesse Brandeburg <[email protected]>
BIT_ULL was used on a u32 or less where it can simply be BIT. This fixes some trivial static analyzer warnings. Chomp, chomp.
Tested with objdump of binary before and after, no changes to code.
--- drivers/net/ethernet/intel/i40e/i40e_main.c | 30 ++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_main.c +15 -15
@@ -1531,7 +1531,7 @@ static void i40e_vsi_setup_queue_map(struct i40e_vsi *vsi,if (enabled_tc && (vsi->back->flags &I40E_FLAG_DCB_ENABLED )) {/* Find numtc from enabled TC bitmap */ for (i =0 ; i <I40E_MAX_TRAFFIC_CLASS ; i++) { -if (enabled_tc &BIT_ULL (i))/* TC is enabled */ +if (enabled_tc &BIT (i))/* TC is enabled */ numtc++; }if (!numtc) {
@@ -1560,7 +1560,7 @@ static void i40e_vsi_setup_queue_map(struct i40e_vsi *vsi,/* Setup queue offset/count for all TCs for given VSI */ for (i =0 ; i <I40E_MAX_TRAFFIC_CLASS ; i++) {/* See if the given TC is enabled for the given VSI */ -if (vsi->tc_config.enabled_tc &BIT_ULL (i)) { +if (vsi->tc_config.enabled_tc &BIT (i)) {/* TC is enabled */ int pow, num_qps;
@@ -4433,7 +4433,7 @@ static u8 i40e_get_iscsi_tc_map(struct i40e_pf *pf)if (app.selector ==I40E_APP_SEL_TCPIP && app.protocolid ==I40E_APP_PROTOID_ISCSI ) { tc = dcbcfg->etscfg.prioritytable[app.priority]; - enabled_tc |=BIT_ULL (tc); + enabled_tc |=BIT (tc);break ; } }
@@ -4517,7 +4517,7 @@ static u8 i40e_pf_get_num_tc(struct i40e_pf *pf)/* At least have TC0 */ enabled_tc = (enabled_tc ? enabled_tc :0x1 );for (i =0 ; i <I40E_MAX_TRAFFIC_CLASS ; i++) { -if (enabled_tc &BIT_ULL (i)) +if (enabled_tc &BIT (i)) num_tc++; }return num_tc;
@@ -4539,7 +4539,7 @@ static u8 i40e_pf_get_default_tc(struct i40e_pf *pf)/* Find the first enabled TC */ for (i =0 ; i <I40E_MAX_TRAFFIC_CLASS ; i++) { -if (enabled_tc &BIT_ULL (i)) +if (enabled_tc &BIT (i))break ; }
@@ -4699,7 +4699,7 @@ static void i40e_vsi_config_netdev_tc(struct i40e_vsi *vsi, u8 enabled_tc)* will set the numtc for netdev as 2 that will be * referenced by the netdev layer as TC 0 and 1. */ -if (vsi->tc_config.enabled_tc &BIT_ULL (i)) +if (vsi->tc_config.enabled_tc &BIT (i)) netdev_set_tc_queue(netdev, vsi->tc_config.tc_info[i].netdev_tc, vsi->tc_config.tc_info[i].qcount,
@@ -4761,7 +4761,7 @@ static int i40e_vsi_config_tc(struct i40e_vsi *vsi, u8 enabled_tc)/* Enable ETS TCs with equal BW Share for now across all VSIs */ for (i =0 ; i <I40E_MAX_TRAFFIC_CLASS ; i++) { -if (enabled_tc &BIT_ULL (i)) +if (enabled_tc &BIT (i)) bw_share[i] =1 ; }
@@ -4835,7 +4835,7 @@ int i40e_veb_config_tc(struct i40e_veb *veb, u8 enabled_tc)/* Enable ETS TCs with equal BW Share for now */ for (i =0 ; i <I40E_MAX_TRAFFIC_CLASS ; i++) { -if (enabled_tc &BIT_ULL (i)) +if (enabled_tc &BIT (i)) bw_data.tc_bw_share_credits[i] =1 ; }
@@ -5232,7 +5232,7 @@ static int i40e_setup_tc(struct net_device *netdev, u8 tc)/* Generate TC map for number of tc requested */ for (i =0 ; i < tc; i++) - enabled_tc |=BIT_ULL (i); + enabled_tc |=BIT (i);/* Requesting same TC configuration as already enabled */ if (enabled_tc == vsi->tc_config.enabled_tc)
@@ -6096,23 +6096,23 @@ static void i40e_reset_subtask(struct i40e_pf *pf)rtnl_lock ();if (test_bit (__I40E_REINIT_REQUESTED, &pf->state)) { - reset_flags |=BIT_ULL (__I40E_REINIT_REQUESTED); + reset_flags |=BIT (__I40E_REINIT_REQUESTED);clear_bit (__I40E_REINIT_REQUESTED, &pf->state); }if (test_bit (__I40E_PF_RESET_REQUESTED, &pf->state)) { - reset_flags |=BIT_ULL (__I40E_PF_RESET_REQUESTED); + reset_flags |=BIT (__I40E_PF_RESET_REQUESTED);clear_bit (__I40E_PF_RESET_REQUESTED, &pf->state); }if (test_bit (__I40E_CORE_RESET_REQUESTED, &pf->state)) { - reset_flags |=BIT_ULL (__I40E_CORE_RESET_REQUESTED); + reset_flags |=BIT (__I40E_CORE_RESET_REQUESTED);clear_bit (__I40E_CORE_RESET_REQUESTED, &pf->state); }if (test_bit (__I40E_GLOBAL_RESET_REQUESTED, &pf->state)) { - reset_flags |=BIT_ULL (__I40E_GLOBAL_RESET_REQUESTED); + reset_flags |=BIT (__I40E_GLOBAL_RESET_REQUESTED);clear_bit (__I40E_GLOBAL_RESET_REQUESTED, &pf->state); }if (test_bit (__I40E_DOWN_REQUESTED, &pf->state)) { - reset_flags |=BIT_ULL (__I40E_DOWN_REQUESTED); + reset_flags |=BIT (__I40E_DOWN_REQUESTED);clear_bit (__I40E_DOWN_REQUESTED, &pf->state); }
@@ -10571,7 +10571,7 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)/* NVM bit on means WoL disabled for the port */ i40e_read_nvm_word (hw,I40E_SR_NVM_WAKE_ON_LAN , &wol_nvm_bits); -if ((1 << hw->port) & wol_nvm_bits || hw->partition_id !=1 ) +if (BIT (hw->port) & wol_nvm_bits || hw->partition_id !=1 ) pf->wol_en = false;else pf->wol_en = true;
Signature · 1 line
2.1.0
PATCH 3/14 i40e: fix mismatched declaration
In reply to Deepthi KavalurFrom: Jesse Brandeburg <[email protected]>
i40e_vsi_add_pvid() was declared in the i40e.h file as a different return type than the function implementation.
--- drivers/net/ethernet/intel/i40e/i40e.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/intel/i40e/i40e.h +1 -1
@@ -717,7 +717,7 @@ struct i40e_veb *i40e_veb_setup(struct i40e_pf *pf, u16 flags, u16 uplink_seid,void i40e_veb_release (struct i40e_veb *veb);int i40e_veb_config_tc (struct i40e_veb *veb,u8 enabled_tc); -i40e_status i40e_vsi_add_pvid (struct i40e_vsi *vsi,u16 vid); +int i40e_vsi_add_pvid (struct i40e_vsi *vsi,u16 vid);void i40e_vsi_remove_pvid (struct i40e_vsi *vsi);void i40e_vsi_reset_stats (struct i40e_vsi *vsi);void i40e_pf_reset_stats (struct i40e_pf *pf);
Signature · 1 line
2.1.0
PATCH 4/14 i40e: properly delete VF MAC filters
In reply to Deepthi KavalurFrom: Mitch Williams <[email protected]>
The virtual channel interface was using incorrect semantics to remove MAC addresses, which would leave incorrect filters active when using VLANs. To correct this, add a new function that unconditionally removes MAC addresses from all VLANs, and call this function when the VF requests a MAC filter removal.
--- drivers/net/ethernet/intel/i40e/i40e.h | 2 ++ drivers/net/ethernet/intel/i40e/i40e_main.c | 36 ++++++++++++++++++++++ drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 8 +++-- 3 files changed, 44 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/i40e/i40e.h +2 -0
@@ -775,6 +775,8 @@ int i40e_vsi_add_vlan(struct i40e_vsi *vsi, s16 vid);int i40e_vsi_kill_vlan (struct i40e_vsi *vsi,s16 vid);struct i40e_mac_filter *i40e_put_mac_in_vlan (struct i40e_vsi *vsi,u8 *macaddr,bool is_vf,bool is_netdev); +int i40e_del_mac_all_vlan (struct i40e_vsi *vsi,u8 *macaddr, +bool is_vf,bool is_netdev);bool i40e_is_vsi_in_vlan (struct i40e_vsi *vsi);struct i40e_mac_filter *i40e_find_mac (struct i40e_vsi *vsi,u8 *macaddr,bool is_vf,bool is_netdev);
drivers/net/ethernet/intel/i40e/i40e_main.c +36 -0
@@ -1259,6 +1259,42 @@ struct i40e_mac_filter *i40e_put_mac_in_vlan(struct i40e_vsi *vsi, u8 *macaddr, }/** +* i40e_del_mac_all_vlan - Remove a MAC filter from all VLANS +* @vsi: the VSI to be searched +* @macaddr: the mac address to be removed +* @is_vf: true if it is a VF +* @is_netdev: true if it is a netdev +* +* Removes a given MAC address from a VSI, regardless of VLAN +* +* Returns 0 for success, or error +**/ +int i40e_del_mac_all_vlan (struct i40e_vsi *vsi,u8 *macaddr, +bool is_vf,bool is_netdev) +{ +struct i40e_mac_filter *f =NULL ; +int changed =0 ; + +WARN (!spin_is_locked (&vsi->mac_filter_list_lock), +"Missing mac_filter_list_lock\n" ); +list_for_each_entry (f, &vsi->mac_filter_list, list) { +if ((ether_addr_equal (macaddr, f->macaddr)) && + (is_vf == f->is_vf) && + (is_netdev == f->is_netdev)) { + f->counter--; + f->changed = true; + changed =1 ; + } + } +if (changed) { + vsi->flags |=I40E_VSI_FLAG_FILTER_CHANGED ; + vsi->back->flags |=I40E_FLAG_FILTER_SYNC ; +return 0 ; + } +return -ENOENT ; +} + +/** * i40e_rm_default_mac_filter - Remove the default MAC filter set by NVM * @vsi: the PF Main VSI - inappropriate for any other VSI * @macaddr: the MAC address
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +6 -2
@@ -1683,8 +1683,12 @@ static int i40e_vc_del_mac_addr_msg(struct i40e_vf *vf, u8 *msg, u16 msglen)spin_lock_bh (&vsi->mac_filter_list_lock);/* delete addresses from the list */ for (i =0 ; i < al->num_elements; i++) -i40e_del_filter (vsi, al->list[i].addr, -I40E_VLAN_ANY , true, false); +if (i40e_del_mac_all_vlan (vsi, al->list[i].addr, true, false)) { + ret =I40E_ERR_INVALID_MAC_ADDR ; +spin_unlock_bh (&vsi->mac_filter_list_lock); + goto error_param; + } +spin_unlock_bh (&vsi->mac_filter_list_lock);/* program the updated filter list */
Signature · 1 line
2.1.0
PATCH 5/14 i40e: don't add zero MAC filter
In reply to Deepthi KavalurFrom: Mitch Williams <[email protected]>
When VFs are created, the MAC address defaults to all zeros, indicating to the VF driver that it should use a random MAC address. However, the PF driver was incorrectly adding this zero MAC to the filter table, along with the VF's randomly generated MAC address.
Check for a good address before adding the default filter. While we're at it, make the error message a bit more useful.
--- drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +9 -6
@@ -549,12 +549,15 @@ static int i40e_alloc_vsi_res(struct i40e_vf *vf, enum i40e_vsi_type type)i40e_vsi_add_pvid (vsi, vf->port_vlan_id);spin_lock_bh (&vsi->mac_filter_list_lock); - f =i40e_add_filter (vsi, vf->default_lan_addr.addr, - vf->port_vlan_id ? vf->port_vlan_id :-1 , - true, false); -if (!f) -dev_info (&pf->pdev->dev, -"Could not allocate VF MAC addr\n" ); +if (is_valid_ether_addr (vf->default_lan_addr.addr)) { + f =i40e_add_filter (vsi, vf->default_lan_addr.addr, + vf->port_vlan_id ? vf->port_vlan_id :-1 , + true, false); +if (!f) +dev_info (&pf->pdev->dev, +"Could not add MAC filter %pM for VF %d\n" , + vf->default_lan_addr.addr, vf->vf_id); + } f =i40e_add_filter (vsi, brdcast, vf->port_vlan_id ? vf->port_vlan_id :-1 , true, false);
Signature · 1 line
2.1.0
PATCH 6/14 i40evf: check rings before freeing resources
In reply to Deepthi KavalurFrom: Mitch Williams <[email protected]>
If the driver gets unloaded during reset recovery, it's possible that it will attempt to free resources when they're already free.
Add a check to make sure that the tx and rx rings actually exist before dereferencing them to free resources.
--- drivers/net/ethernet/intel/i40evf/i40evf_main.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/ethernet/intel/i40evf/i40evf_main.c +6 -0
@@ -2034,6 +2034,9 @@ void i40evf_free_all_tx_resources(struct i40evf_adapter *adapter) {int i; +if (!adapter->tx_rings) +return ; +for (i =0 ; i < adapter->num_active_queues; i++)if (adapter->tx_rings[i].desc)i40evf_free_tx_resources (&adapter->tx_rings[i]);
@@ -2102,6 +2105,9 @@ void i40evf_free_all_rx_resources(struct i40evf_adapter *adapter) {int i; +if (!adapter->rx_rings) +return ; +for (i =0 ; i < adapter->num_active_queues; i++)if (adapter->rx_rings[i].desc)i40evf_free_rx_resources (&adapter->rx_rings[i]);
Signature · 1 line
2.1.0
PATCH 7/14 i40e: use explicit cast from u16 to u8
In reply to Deepthi KavalurFrom: Kamil Krawczyk <[email protected]>
Current implementation generates compilation warnings.
--- drivers/net/ethernet/intel/i40e/i40e_lan_hmc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/intel/i40e/i40e_lan_hmc.c +1 -1
@@ -762,7 +762,7 @@ static void i40e_write_byte(u8 *hmc_bits,/* prepare the bits and mask */ shift_width = ce_info->lsb %8 ; - mask =BIT (ce_info->width) -1 ; + mask = (u8)(BIT (ce_info->width) -1 ); src_byte = *from; src_byte &= mask;
Signature · 1 line
2.1.0
PATCH 8/14 i40e: Opcode and structures required by OEM Post Update AQ command and add new NVM arq message
In reply to Deepthi KavalurFrom: Michal Kosiarz <[email protected]>
This is a part of implementation which contains data structures and opcode for new AQ command. There's a new ARQ message that gets sent near the end of the NVM update process that the driver should recognize and ignore, rather than printing an Unknown Event error.
---
Testing Hints :
Do an nvmupdate with the current version of nvmupdate tool before and after this patch is applied and watch the kernel log for the message
"ARQ Error: Unknown event 0x0720 received"
Using "nvmupdate -f" will allow you to "update" your NVM with the same version NVM, over and over; useful for this kind of testing.
drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h | 21 +++++++++++++++++++++ drivers/net/ethernet/intel/i40e/i40e_main.c | 1 + drivers/net/ethernet/intel/i40evf/i40e_adminq_cmd.h | 21 +++++++++++++++++++++ 3 files changed, 43 insertions(+)
drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h +21 -0
@@ -227,6 +227,7 @@ enum i40e_admin_queue_opc { i40e_aqc_opc_nvm_update =0x0703 , i40e_aqc_opc_nvm_config_read =0x0704 , i40e_aqc_opc_nvm_config_write =0x0705 , + i40e_aqc_opc_oem_post_update =0x0720 ,/* virtualization commands */ i40e_aqc_opc_send_msg_to_pf = 0x0801,
@@ -1891,6 +1892,26 @@ struct i40e_aqc_nvm_config_data_immediate_field {I40E_CHECK_STRUCT_LEN (0xc , i40e_aqc_nvm_config_data_immediate_field); +/* OEM Post Update (indirect 0x0720) +* no command data struct used +*/ +struct i40e_aqc_nvm_oem_post_update { +#define I40E_AQ_NVM_OEM_POST_UPDATE_EXTERNAL_DATA 0x01 +u8 sel_data; +u8 reserved[7 ]; +}; + +I40E_CHECK_STRUCT_LEN (0x8 , i40e_aqc_nvm_oem_post_update); + +struct i40e_aqc_nvm_oem_post_update_buffer { +u8 str_len; +u8 dev_addr; +__le16 eeprom_addr; +u8 data[36 ]; +}; + +I40E_CHECK_STRUCT_LEN (0x28 , i40e_aqc_nvm_oem_post_update_buffer); +/* Send to PF command (indirect 0x0801) id is only used by PF * Send to VF command (indirect 0x0802) id is only used by PF * Send to Peer PF command (indirect 0x0803)
drivers/net/ethernet/intel/i40e/i40e_main.c +1 -0
@@ -6295,6 +6295,7 @@ static void i40e_clean_adminq_subtask(struct i40e_pf *pf)break ;case i40e_aqc_opc_nvm_erase:case i40e_aqc_opc_nvm_update: +case i40e_aqc_opc_oem_post_update:i40e_debug (&pf->hw,I40E_DEBUG_NVM ,"ARQ NVM operation completed\n" );break ;default :
drivers/net/ethernet/intel/i40evf/i40e_adminq_cmd.h +21 -0
@@ -227,6 +227,7 @@ enum i40e_admin_queue_opc { i40e_aqc_opc_nvm_update =0x0703 , i40e_aqc_opc_nvm_config_read =0x0704 , i40e_aqc_opc_nvm_config_write =0x0705 , + i40e_aqc_opc_oem_post_update =0x0720 ,/* virtualization commands */ i40e_aqc_opc_send_msg_to_pf = 0x0801,
@@ -1888,6 +1889,26 @@ struct i40e_aqc_nvm_config_data_immediate_field {I40E_CHECK_STRUCT_LEN (0xc , i40e_aqc_nvm_config_data_immediate_field); +/* OEM Post Update (indirect 0x0720) +* no command data struct used +*/ +struct i40e_aqc_nvm_oem_post_update { +#define I40E_AQ_NVM_OEM_POST_UPDATE_EXTERNAL_DATA 0x01 +u8 sel_data; +u8 reserved[7 ]; +}; + +I40E_CHECK_STRUCT_LEN (0x8 , i40e_aqc_nvm_oem_post_update); + +struct i40e_aqc_nvm_oem_post_update_buffer { +u8 str_len; +u8 dev_addr; +__le16 eeprom_addr; +u8 data[36 ]; +}; + +I40E_CHECK_STRUCT_LEN (0x28 , i40e_aqc_nvm_oem_post_update_buffer); +/* Send to PF command (indirect 0x0801) id is only used by PF * Send to VF command (indirect 0x0802) id is only used by PF * Send to Peer PF command (indirect 0x0803)
Signature · 1 line
2.1.0
PATCH 9/14 i40e: hush little warnings
In reply to Deepthi KavalurFrom: Mitch Williams <[email protected]>
These messages seem big and scary, but they're really not. The driver can fully recover from any of these. The overflow error in particular can happen when enabling a bunch of VFs and the VF driver is not blacklisted.
Since these messages are really for debugging purposes, reclassify them as such.
--- drivers/net/ethernet/intel/i40e/i40e_main.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_main.c +12 -6
@@ -6219,15 +6219,18 @@ static void i40e_clean_adminq_subtask(struct i40e_pf *pf) val =rd32 (&pf->hw, pf->hw.aq.arq.len); oldval = val;if (val &I40E_PF_ARQLEN_ARQVFE_MASK ) { -dev_info (&pf->pdev->dev,"ARQ VF Error detected\n" ); +if (hw->debug_mask &I40E_DEBUG_AQ ) +dev_info (&pf->pdev->dev,"ARQ VF Error detected\n" ); val &= ~I40E_PF_ARQLEN_ARQVFE_MASK ; }if (val &I40E_PF_ARQLEN_ARQOVFL_MASK ) { -dev_info (&pf->pdev->dev,"ARQ Overflow Error detected\n" ); +if (hw->debug_mask &I40E_DEBUG_AQ ) +dev_info (&pf->pdev->dev,"ARQ Overflow Error detected\n" ); val &= ~I40E_PF_ARQLEN_ARQOVFL_MASK ; }if (val &I40E_PF_ARQLEN_ARQCRIT_MASK ) { -dev_info (&pf->pdev->dev,"ARQ Critical Error detected\n" ); +if (hw->debug_mask &I40E_DEBUG_AQ ) +dev_info (&pf->pdev->dev,"ARQ Critical Error detected\n" ); val &= ~I40E_PF_ARQLEN_ARQCRIT_MASK ; }if (oldval != val)
@@ -6236,15 +6239,18 @@ static void i40e_clean_adminq_subtask(struct i40e_pf *pf) val =rd32 (&pf->hw, pf->hw.aq.asq.len); oldval = val;if (val &I40E_PF_ATQLEN_ATQVFE_MASK ) { -dev_info (&pf->pdev->dev,"ASQ VF Error detected\n" ); +if (pf->hw.debug_mask &I40E_DEBUG_AQ ) +dev_info (&pf->pdev->dev,"ASQ VF Error detected\n" ); val &= ~I40E_PF_ATQLEN_ATQVFE_MASK ; }if (val &I40E_PF_ATQLEN_ATQOVFL_MASK ) { -dev_info (&pf->pdev->dev,"ASQ Overflow Error detected\n" ); +if (pf->hw.debug_mask &I40E_DEBUG_AQ ) +dev_info (&pf->pdev->dev,"ASQ Overflow Error detected\n" ); val &= ~I40E_PF_ATQLEN_ATQOVFL_MASK ; }if (val &I40E_PF_ATQLEN_ATQCRIT_MASK ) { -dev_info (&pf->pdev->dev,"ASQ Critical Error detected\n" ); +if (pf->hw.debug_mask &I40E_DEBUG_AQ ) +dev_info (&pf->pdev->dev,"ASQ Critical Error detected\n" ); val &= ~I40E_PF_ATQLEN_ATQCRIT_MASK ; }if (oldval != val)
Signature · 1 line
2.1.0
PATCH 10/14 i40e: Add a Virtchnl offload for RSS PCTYPE V2
In reply to Deepthi KavalurFrom: Anjali Singhai Jain <[email protected]>
X722 supports Expanded version of TCP, UDP PCTYPES for RSS. Add a Virtchnl offload to support this.
Without this patch VF drivers will not be able to support the correct PCTYPES for X722 and UDP flows will not fan out.
---
Testing Hints:
After applying the right driver changes to support the offload for X722, try multiple UDP flows on VF driver to see they get spread out by RSS.
drivers/net/ethernet/intel/i40e/i40e_virtchnl.h | 1 + drivers/net/ethernet/intel/i40evf/i40e_virtchnl.h | 1 + 2 files changed, 2 insertions(+)
drivers/net/ethernet/intel/i40e/i40e_virtchnl.h +1 -0
@@ -153,6 +153,7 @@ struct i40e_virtchnl_vsi_resource {#define I40E_VIRTCHNL_VF_OFFLOAD_WB_ON_ITR 0x00000020#define I40E_VIRTCHNL_VF_OFFLOAD_VLAN 0x00010000#define I40E_VIRTCHNL_VF_OFFLOAD_RX_POLLING 0x00020000 +#define I40E_VIRTCHNL_VF_OFFLOAD_RSS_PCTYPE_V2 0x00040000struct i40e_virtchnl_vf_resource {u16 num_vsis;
drivers/net/ethernet/intel/i40evf/i40e_virtchnl.h +1 -0
@@ -153,6 +153,7 @@ struct i40e_virtchnl_vsi_resource {#define I40E_VIRTCHNL_VF_OFFLOAD_WB_ON_ITR 0x00000020#define I40E_VIRTCHNL_VF_OFFLOAD_VLAN 0x00010000#define I40E_VIRTCHNL_VF_OFFLOAD_RX_POLLING 0x00020000 +#define I40E_VIRTCHNL_VF_OFFLOAD_RSS_PCTYPE_V2 0x00040000struct i40e_virtchnl_vf_resource {u16 num_vsis;
Signature · 1 line
2.1.0
PATCH 11/14 i40e: clean whole mac filter list
In reply to Deepthi KavalurFrom: Shannon Nelson <[email protected]>
Clean the whole mac filter list when resetting after an intermediate add or delete push to the firmware. The code had evolved from using a list from the stack to a heap allocation, but the memset() didn't follow the change correctly. This now cleans the whole list rather that just part of the first element.
---
Testing Hints :
Compile and run the driver with basic ping tests. Also add and remove additional address filters and make sure they work as expected.
drivers/net/ethernet/intel/i40e/i40e_main.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_main.c +10 -8
@@ -1917,11 +1917,12 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi, bool grab_rtnl)/* Now process 'del_list' outside the lock */ if (!list_empty (&tmp_del_list)) { +int del_list_size; filter_list_len = pf->hw.aq.asq_buf_size /sizeof (struct i40e_aqc_remove_macvlan_element_data ); - del_list =kcalloc (filter_list_len, -sizeof (struct i40e_aqc_remove_macvlan_element_data ), -GFP_KERNEL ); + del_list_size = filter_list_len * +sizeof (struct i40e_aqc_remove_macvlan_element_data ); + del_list =kzalloc (del_list_size,GFP_KERNEL );if (!del_list) {i40e_cleanup_add_list (&tmp_add_list);
@@ -1956,7 +1957,7 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi, bool grab_rtnl) NULL); aq_err = pf->hw.aq.asq_last_status; num_del =0 ; -memset (del_list,0 ,sizeof (*del_list)); +memset (del_list,0 , del_list_size);if (aq_ret && aq_err !=I40E_AQ_RC_ENOENT ) { retval = -EIO ;
@@ -1992,13 +1993,14 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi, bool grab_rtnl) }if (!list_empty (&tmp_add_list)) { +int add_list_size;/* do all the adds now */ filter_list_len = pf->hw.aq.asq_buf_size /sizeof (struct i40e_aqc_add_macvlan_element_data ), - add_list =kcalloc (filter_list_len, -sizeof (struct i40e_aqc_add_macvlan_element_data ), -GFP_KERNEL ); + add_list_size = filter_list_len * +sizeof (struct i40e_aqc_add_macvlan_element_data ); + add_list =kzalloc (add_list_size,GFP_KERNEL );if (!add_list) {/* Purge element from temporary lists */ i40e_cleanup_add_list (&tmp_add_list);
@@ -2037,7 +2039,7 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi, bool grab_rtnl)if (aq_ret)break ; -memset (add_list,0 ,sizeof (*add_list)); +memset (add_list,0 , add_list_size); }/* Entries from tmp_add_list were cloned from MAC * filter list, hence clean those cloned entries
Signature · 1 line
2.1.0
PATCH 12/14 i40e/i40evf: Add a new offload for RSS PCTYPE V2 for X722
In reply to Deepthi KavalurFrom: Anjali Singhai Jain <[email protected]>
X722 supports Expanded version of TCP, UDP PCTYPES for RSS. Add a Virtchnl offload to support this.
Without this patch with X722 devices, driver will set wrong PCTYPES for VF and UDP flows will not fan out.
---
Testing-Hints:
Try multiple UDP flows on VF driver to see they get spread out by RSS.
drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c +3 -1
@@ -157,7 +157,9 @@ int i40evf_send_vf_config_msg(struct i40evf_adapter *adapter)I40E_VIRTCHNL_VF_OFFLOAD_RSS_AQ |I40E_VIRTCHNL_VF_OFFLOAD_RSS_REG |I40E_VIRTCHNL_VF_OFFLOAD_VLAN | -I40E_VIRTCHNL_VF_OFFLOAD_WB_ON_ITR ; +I40E_VIRTCHNL_VF_OFFLOAD_WB_ON_ITR | +I40E_VIRTCHNL_VF_OFFLOAD_RSS_PCTYPE_V2 ; + adapter->current_op =I40E_VIRTCHNL_OP_GET_VF_RESOURCES ; adapter->aq_required &= ~I40EVF_FLAG_AQ_GET_CONFIG ;if (PF_IS_V11 (adapter))
Signature · 1 line
2.1.0
PATCH 12/14 i40e/i40evf: Add a new offload for RSS PCTYPE V2 for X722
Quoted 22 lines · On Fri, 13 Nov 2015 15:47:12 -0800 Deepthi Kavalur <[email protected]>…
From: Anjali Singhai Jain <[email protected]>
X722 supports Expanded version of TCP, UDP PCTYPES for RSS. Add a Virtchnl offload to support this.
Without this patch with X722 devices, driver will set wrong PCTYPES for VF and UDP flows will not fan out.
Signed-off-by Anjali Singhai Jain <[email protected]>Change-ID I04fe4988253b7cd108c9179a643c969764efcb76---
Testing-Hints:
Try multiple UDP flows on VF driver to see they get spread out by RSS.drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c +0
-0
drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c int i40evf_send_vf_config_msg(struct i40evf_adapter *adapter) · line 165
Quoted 10 lines
drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c +3
-1@@ -157,7 +157,9 @@ int i40evf_send_vf_config_msg(struct i40evf_adapter *adapter)I40E_VIRTCHNL_VF_OFFLOAD_RSS_AQ |I40E_VIRTCHNL_VF_OFFLOAD_RSS_REG |I40E_VIRTCHNL_VF_OFFLOAD_VLAN | -I40E_VIRTCHNL_VF_OFFLOAD_WB_ON_ITR ; +I40E_VIRTCHNL_VF_OFFLOAD_WB_ON_ITR | +I40E_VIRTCHNL_VF_OFFLOAD_RSS_PCTYPE_V2 ; + adapter->current_op =I40E_VIRTCHNL_OP_GET_VF_RESOURCES ; adapter->aq_required &= ~I40EVF_FLAG_AQ_GET_CONFIG ;if (PF_IS_V11 (adapter))
This patch should be squashed on 10/14 which just declares these new defines. The description should be used from this patch for the combined set.
PATCH 13/14 i40evf: change version string generation
In reply to Deepthi KavalurFrom: Mitch Williams <[email protected]>
Generate version strings like the PF driver does. This gives us more flexibility to add suffixes to the version string at build time.
Added in support of X722 prerelease driver in the component tool
--- drivers/net/ethernet/intel/i40evf/i40evf_main.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
drivers/net/ethernet/intel/i40evf/i40evf_main.c +9 -1
@@ -34,7 +34,15 @@ char i40evf_driver_name[] = "i40evf";static const char i40evf_driver_string[] ="Intel(R) XL710/X710 Virtual Function Network Driver" ; -#define DRV_VERSION "1.4.1" +#define DRV_KERN "-k" + +#define DRV_VERSION_MAJOR 1 +#define DRV_VERSION_MINOR 4 +#define DRV_VERSION_BUILD 1 +#define DRV_VERSION __stringify(DRV_VERSION_MAJOR) "." \ + __stringify(DRV_VERSION_MINOR) "." \ + __stringify(DRV_VERSION_BUILD) \ + DRV_KERNconst char i40evf_driver_version[] =DRV_VERSION ;static const char i40evf_copyright[] ="Copyright (c) 2013 - 2015 Intel Corporation." ;
Signature · 1 line
2.1.0
PATCH 14/14 i40e/i40evf: Bump version to 1.4.7 for i40e and 1.4.3 for i40evf
In reply to Deepthi KavalurFrom: Catherine Sullivan <[email protected]>
Bump.
--- drivers/net/ethernet/intel/i40e/i40e_main.c | 2 +- drivers/net/ethernet/intel/i40evf/i40evf_main.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_main.c +1 -1
@@ -39,7 +39,7 @@ static const char i40e_driver_string[] =#define DRV_VERSION_MAJOR 1#define DRV_VERSION_MINOR 4 -#define DRV_VERSION_BUILD 4 +#define DRV_VERSION_BUILD 7#define DRV_VERSION __stringify(DRV_VERSION_MAJOR) "." \ __stringify(DRV_VERSION_MINOR) "." \ __stringify(DRV_VERSION_BUILD) DRV_KERN
drivers/net/ethernet/intel/i40evf/i40evf_main.c +1 -1
@@ -38,7 +38,7 @@ static const char i40evf_driver_string[] =#define DRV_VERSION_MAJOR 1#define DRV_VERSION_MINOR 4 -#define DRV_VERSION_BUILD 1 +#define DRV_VERSION_BUILD 3#define DRV_VERSION __stringify(DRV_VERSION_MAJOR) "." \ __stringify(DRV_VERSION_MINOR) "." \ __stringify(DRV_VERSION_BUILD) \
Signature · 1 line
2.1.0