Commit 75887e88 authored by David S. Miller's avatar David S. Miller

Merge branch '40GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue

Tony Nguyen says:

====================
Intel Wired LAN Driver Updates 2021-03-25

This series contains updates to virtchnl header file and i40e driver.

Norbert removes added padding from virtchnl RSS structures as this
causes issues when iterating over the arrays.

Mateusz adds Asym_Pause as supported to allow these settings to be set
as the hardware supports it.

Eryk fixes an issue where encountering a VF reset alongside releasing
VFs could cause a call trace.

Arkadiusz moves TC setup before resource setup as previously it was
possible to enter with a null q_vector causing a kernel oops.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 3a87571f f2916ae9
...@@ -142,6 +142,7 @@ enum i40e_state_t { ...@@ -142,6 +142,7 @@ enum i40e_state_t {
__I40E_VIRTCHNL_OP_PENDING, __I40E_VIRTCHNL_OP_PENDING,
__I40E_RECOVERY_MODE, __I40E_RECOVERY_MODE,
__I40E_VF_RESETS_DISABLED, /* disable resets during i40e_remove */ __I40E_VF_RESETS_DISABLED, /* disable resets during i40e_remove */
__I40E_VFS_RELEASING,
/* This must be last as it determines the size of the BITMAP */ /* This must be last as it determines the size of the BITMAP */
__I40E_STATE_SIZE__, __I40E_STATE_SIZE__,
}; };
......
...@@ -1101,6 +1101,7 @@ static int i40e_get_link_ksettings(struct net_device *netdev, ...@@ -1101,6 +1101,7 @@ static int i40e_get_link_ksettings(struct net_device *netdev,
/* Set flow control settings */ /* Set flow control settings */
ethtool_link_ksettings_add_link_mode(ks, supported, Pause); ethtool_link_ksettings_add_link_mode(ks, supported, Pause);
ethtool_link_ksettings_add_link_mode(ks, supported, Asym_Pause);
switch (hw->fc.requested_mode) { switch (hw->fc.requested_mode) {
case I40E_FC_FULL: case I40E_FC_FULL:
......
...@@ -10573,12 +10573,6 @@ static void i40e_rebuild(struct i40e_pf *pf, bool reinit, bool lock_acquired) ...@@ -10573,12 +10573,6 @@ static void i40e_rebuild(struct i40e_pf *pf, bool reinit, bool lock_acquired)
goto end_core_reset; goto end_core_reset;
} }
if (!lock_acquired)
rtnl_lock();
ret = i40e_setup_pf_switch(pf, reinit);
if (ret)
goto end_unlock;
#ifdef CONFIG_I40E_DCB #ifdef CONFIG_I40E_DCB
/* Enable FW to write a default DCB config on link-up /* Enable FW to write a default DCB config on link-up
* unless I40E_FLAG_TC_MQPRIO was enabled or DCB * unless I40E_FLAG_TC_MQPRIO was enabled or DCB
...@@ -10607,6 +10601,11 @@ static void i40e_rebuild(struct i40e_pf *pf, bool reinit, bool lock_acquired) ...@@ -10607,6 +10601,11 @@ static void i40e_rebuild(struct i40e_pf *pf, bool reinit, bool lock_acquired)
} }
#endif /* CONFIG_I40E_DCB */ #endif /* CONFIG_I40E_DCB */
if (!lock_acquired)
rtnl_lock();
ret = i40e_setup_pf_switch(pf, reinit);
if (ret)
goto end_unlock;
/* The driver only wants link up/down and module qualification /* The driver only wants link up/down and module qualification
* reports from firmware. Note the negative logic. * reports from firmware. Note the negative logic.
......
...@@ -137,6 +137,7 @@ void i40e_vc_notify_vf_reset(struct i40e_vf *vf) ...@@ -137,6 +137,7 @@ void i40e_vc_notify_vf_reset(struct i40e_vf *vf)
**/ **/
static inline void i40e_vc_disable_vf(struct i40e_vf *vf) static inline void i40e_vc_disable_vf(struct i40e_vf *vf)
{ {
struct i40e_pf *pf = vf->pf;
int i; int i;
i40e_vc_notify_vf_reset(vf); i40e_vc_notify_vf_reset(vf);
...@@ -147,6 +148,11 @@ static inline void i40e_vc_disable_vf(struct i40e_vf *vf) ...@@ -147,6 +148,11 @@ static inline void i40e_vc_disable_vf(struct i40e_vf *vf)
* ensure a reset. * ensure a reset.
*/ */
for (i = 0; i < 20; i++) { for (i = 0; i < 20; i++) {
/* If PF is in VFs releasing state reset VF is impossible,
* so leave it.
*/
if (test_bit(__I40E_VFS_RELEASING, pf->state))
return;
if (i40e_reset_vf(vf, false)) if (i40e_reset_vf(vf, false))
return; return;
usleep_range(10000, 20000); usleep_range(10000, 20000);
...@@ -1574,6 +1580,8 @@ void i40e_free_vfs(struct i40e_pf *pf) ...@@ -1574,6 +1580,8 @@ void i40e_free_vfs(struct i40e_pf *pf)
if (!pf->vf) if (!pf->vf)
return; return;
set_bit(__I40E_VFS_RELEASING, pf->state);
while (test_and_set_bit(__I40E_VF_DISABLE, pf->state)) while (test_and_set_bit(__I40E_VF_DISABLE, pf->state))
usleep_range(1000, 2000); usleep_range(1000, 2000);
...@@ -1631,6 +1639,7 @@ void i40e_free_vfs(struct i40e_pf *pf) ...@@ -1631,6 +1639,7 @@ void i40e_free_vfs(struct i40e_pf *pf)
} }
} }
clear_bit(__I40E_VF_DISABLE, pf->state); clear_bit(__I40E_VF_DISABLE, pf->state);
clear_bit(__I40E_VFS_RELEASING, pf->state);
} }
#ifdef CONFIG_PCI_IOV #ifdef CONFIG_PCI_IOV
......
...@@ -476,7 +476,6 @@ struct virtchnl_rss_key { ...@@ -476,7 +476,6 @@ struct virtchnl_rss_key {
u16 vsi_id; u16 vsi_id;
u16 key_len; u16 key_len;
u8 key[1]; /* RSS hash key, packed bytes */ u8 key[1]; /* RSS hash key, packed bytes */
u8 pad[1];
}; };
VIRTCHNL_CHECK_STRUCT_LEN(6, virtchnl_rss_key); VIRTCHNL_CHECK_STRUCT_LEN(6, virtchnl_rss_key);
...@@ -485,7 +484,6 @@ struct virtchnl_rss_lut { ...@@ -485,7 +484,6 @@ struct virtchnl_rss_lut {
u16 vsi_id; u16 vsi_id;
u16 lut_entries; u16 lut_entries;
u8 lut[1]; /* RSS lookup table */ u8 lut[1]; /* RSS lookup table */
u8 pad[1];
}; };
VIRTCHNL_CHECK_STRUCT_LEN(6, virtchnl_rss_lut); VIRTCHNL_CHECK_STRUCT_LEN(6, virtchnl_rss_lut);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment