Merge branch '40GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue
Nguyen, Anthony L says: ==================== Intel Wired LAN Driver Updates 2021-05-07 This series contains updates to i40e driver only. Magnus fixes XDP by adding and correcting checks that were caused by a previous commit which introduced a new variable but did not account for it in all paths. Yunjian Wang adds a return in an error path to prevent reading a freed pointer. Jaroslaw forces link reset when changing FEC so that changes take affect. Mateusz fixes PHY types for 2.5G and 5G as there is a differentiation on PHY identifiers based on operation. Arkadiusz removes filtering of LLDP frames for software DCB as this is preventing them from being properly transmitted. * '40GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue: i40e: Remove LLDP frame filters i40e: Fix PHY type identifiers for 2.5G and 5G adapters i40e: fix the restart auto-negotiation after FEC modified i40e: Fix use-after-free in i40e_client_subtask() i40e: fix broken XDP support ==================== Link: https://lore.kernel.org/r/20210507164151.2878147-1-anthony.l.nguyen@intel.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
e4d4a27220
@ -1144,7 +1144,6 @@ static inline bool i40e_is_sw_dcb(struct i40e_pf *pf)
|
|||||||
return !!(pf->flags & I40E_FLAG_DISABLE_FW_LLDP);
|
return !!(pf->flags & I40E_FLAG_DISABLE_FW_LLDP);
|
||||||
}
|
}
|
||||||
|
|
||||||
void i40e_set_lldp_forwarding(struct i40e_pf *pf, bool enable);
|
|
||||||
#ifdef CONFIG_I40E_DCB
|
#ifdef CONFIG_I40E_DCB
|
||||||
void i40e_dcbnl_flush_apps(struct i40e_pf *pf,
|
void i40e_dcbnl_flush_apps(struct i40e_pf *pf,
|
||||||
struct i40e_dcbx_config *old_cfg,
|
struct i40e_dcbx_config *old_cfg,
|
||||||
|
@ -1566,8 +1566,10 @@ enum i40e_aq_phy_type {
|
|||||||
I40E_PHY_TYPE_25GBASE_LR = 0x22,
|
I40E_PHY_TYPE_25GBASE_LR = 0x22,
|
||||||
I40E_PHY_TYPE_25GBASE_AOC = 0x23,
|
I40E_PHY_TYPE_25GBASE_AOC = 0x23,
|
||||||
I40E_PHY_TYPE_25GBASE_ACC = 0x24,
|
I40E_PHY_TYPE_25GBASE_ACC = 0x24,
|
||||||
I40E_PHY_TYPE_2_5GBASE_T = 0x30,
|
I40E_PHY_TYPE_2_5GBASE_T = 0x26,
|
||||||
I40E_PHY_TYPE_5GBASE_T = 0x31,
|
I40E_PHY_TYPE_5GBASE_T = 0x27,
|
||||||
|
I40E_PHY_TYPE_2_5GBASE_T_LINK_STATUS = 0x30,
|
||||||
|
I40E_PHY_TYPE_5GBASE_T_LINK_STATUS = 0x31,
|
||||||
I40E_PHY_TYPE_MAX,
|
I40E_PHY_TYPE_MAX,
|
||||||
I40E_PHY_TYPE_NOT_SUPPORTED_HIGH_TEMP = 0xFD,
|
I40E_PHY_TYPE_NOT_SUPPORTED_HIGH_TEMP = 0xFD,
|
||||||
I40E_PHY_TYPE_EMPTY = 0xFE,
|
I40E_PHY_TYPE_EMPTY = 0xFE,
|
||||||
|
@ -375,6 +375,7 @@ void i40e_client_subtask(struct i40e_pf *pf)
|
|||||||
clear_bit(__I40E_CLIENT_INSTANCE_OPENED,
|
clear_bit(__I40E_CLIENT_INSTANCE_OPENED,
|
||||||
&cdev->state);
|
&cdev->state);
|
||||||
i40e_client_del_instance(pf);
|
i40e_client_del_instance(pf);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1154,8 +1154,8 @@ static enum i40e_media_type i40e_get_media_type(struct i40e_hw *hw)
|
|||||||
break;
|
break;
|
||||||
case I40E_PHY_TYPE_100BASE_TX:
|
case I40E_PHY_TYPE_100BASE_TX:
|
||||||
case I40E_PHY_TYPE_1000BASE_T:
|
case I40E_PHY_TYPE_1000BASE_T:
|
||||||
case I40E_PHY_TYPE_2_5GBASE_T:
|
case I40E_PHY_TYPE_2_5GBASE_T_LINK_STATUS:
|
||||||
case I40E_PHY_TYPE_5GBASE_T:
|
case I40E_PHY_TYPE_5GBASE_T_LINK_STATUS:
|
||||||
case I40E_PHY_TYPE_10GBASE_T:
|
case I40E_PHY_TYPE_10GBASE_T:
|
||||||
media = I40E_MEDIA_TYPE_BASET;
|
media = I40E_MEDIA_TYPE_BASET;
|
||||||
break;
|
break;
|
||||||
|
@ -841,8 +841,8 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
|
|||||||
10000baseT_Full);
|
10000baseT_Full);
|
||||||
break;
|
break;
|
||||||
case I40E_PHY_TYPE_10GBASE_T:
|
case I40E_PHY_TYPE_10GBASE_T:
|
||||||
case I40E_PHY_TYPE_5GBASE_T:
|
case I40E_PHY_TYPE_5GBASE_T_LINK_STATUS:
|
||||||
case I40E_PHY_TYPE_2_5GBASE_T:
|
case I40E_PHY_TYPE_2_5GBASE_T_LINK_STATUS:
|
||||||
case I40E_PHY_TYPE_1000BASE_T:
|
case I40E_PHY_TYPE_1000BASE_T:
|
||||||
case I40E_PHY_TYPE_100BASE_TX:
|
case I40E_PHY_TYPE_100BASE_TX:
|
||||||
ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
|
ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
|
||||||
@ -1409,7 +1409,8 @@ static int i40e_set_fec_cfg(struct net_device *netdev, u8 fec_cfg)
|
|||||||
|
|
||||||
memset(&config, 0, sizeof(config));
|
memset(&config, 0, sizeof(config));
|
||||||
config.phy_type = abilities.phy_type;
|
config.phy_type = abilities.phy_type;
|
||||||
config.abilities = abilities.abilities;
|
config.abilities = abilities.abilities |
|
||||||
|
I40E_AQ_PHY_ENABLE_ATOMIC_LINK;
|
||||||
config.phy_type_ext = abilities.phy_type_ext;
|
config.phy_type_ext = abilities.phy_type_ext;
|
||||||
config.link_speed = abilities.link_speed;
|
config.link_speed = abilities.link_speed;
|
||||||
config.eee_capability = abilities.eee_capability;
|
config.eee_capability = abilities.eee_capability;
|
||||||
@ -5281,7 +5282,6 @@ flags_complete:
|
|||||||
i40e_aq_cfg_lldp_mib_change_event(&pf->hw, false, NULL);
|
i40e_aq_cfg_lldp_mib_change_event(&pf->hw, false, NULL);
|
||||||
i40e_aq_stop_lldp(&pf->hw, true, false, NULL);
|
i40e_aq_stop_lldp(&pf->hw, true, false, NULL);
|
||||||
} else {
|
} else {
|
||||||
i40e_set_lldp_forwarding(pf, false);
|
|
||||||
status = i40e_aq_start_lldp(&pf->hw, false, NULL);
|
status = i40e_aq_start_lldp(&pf->hw, false, NULL);
|
||||||
if (status) {
|
if (status) {
|
||||||
adq_err = pf->hw.aq.asq_last_status;
|
adq_err = pf->hw.aq.asq_last_status;
|
||||||
|
@ -6879,40 +6879,6 @@ out:
|
|||||||
}
|
}
|
||||||
#endif /* CONFIG_I40E_DCB */
|
#endif /* CONFIG_I40E_DCB */
|
||||||
|
|
||||||
/**
|
|
||||||
* i40e_set_lldp_forwarding - set forwarding of lldp frames
|
|
||||||
* @pf: PF being configured
|
|
||||||
* @enable: if forwarding to OS shall be enabled
|
|
||||||
*
|
|
||||||
* Toggle forwarding of lldp frames behavior,
|
|
||||||
* When passing DCB control from firmware to software
|
|
||||||
* lldp frames must be forwarded to the software based
|
|
||||||
* lldp agent.
|
|
||||||
*/
|
|
||||||
void i40e_set_lldp_forwarding(struct i40e_pf *pf, bool enable)
|
|
||||||
{
|
|
||||||
if (pf->lan_vsi == I40E_NO_VSI)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!pf->vsi[pf->lan_vsi])
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* No need to check the outcome, commands may fail
|
|
||||||
* if desired value is already set
|
|
||||||
*/
|
|
||||||
i40e_aq_add_rem_control_packet_filter(&pf->hw, NULL, ETH_P_LLDP,
|
|
||||||
I40E_AQC_ADD_CONTROL_PACKET_FLAGS_TX |
|
|
||||||
I40E_AQC_ADD_CONTROL_PACKET_FLAGS_IGNORE_MAC,
|
|
||||||
pf->vsi[pf->lan_vsi]->seid, 0,
|
|
||||||
enable, NULL, NULL);
|
|
||||||
|
|
||||||
i40e_aq_add_rem_control_packet_filter(&pf->hw, NULL, ETH_P_LLDP,
|
|
||||||
I40E_AQC_ADD_CONTROL_PACKET_FLAGS_RX |
|
|
||||||
I40E_AQC_ADD_CONTROL_PACKET_FLAGS_IGNORE_MAC,
|
|
||||||
pf->vsi[pf->lan_vsi]->seid, 0,
|
|
||||||
enable, NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* i40e_print_link_message - print link up or down
|
* i40e_print_link_message - print link up or down
|
||||||
* @vsi: the VSI for which link needs a message
|
* @vsi: the VSI for which link needs a message
|
||||||
@ -10736,10 +10702,6 @@ static void i40e_rebuild(struct i40e_pf *pf, bool reinit, bool lock_acquired)
|
|||||||
*/
|
*/
|
||||||
i40e_add_filter_to_drop_tx_flow_control_frames(&pf->hw,
|
i40e_add_filter_to_drop_tx_flow_control_frames(&pf->hw,
|
||||||
pf->main_vsi_seid);
|
pf->main_vsi_seid);
|
||||||
#ifdef CONFIG_I40E_DCB
|
|
||||||
if (pf->flags & I40E_FLAG_DISABLE_FW_LLDP)
|
|
||||||
i40e_set_lldp_forwarding(pf, true);
|
|
||||||
#endif /* CONFIG_I40E_DCB */
|
|
||||||
|
|
||||||
/* restart the VSIs that were rebuilt and running before the reset */
|
/* restart the VSIs that were rebuilt and running before the reset */
|
||||||
i40e_pf_unquiesce_all_vsi(pf);
|
i40e_pf_unquiesce_all_vsi(pf);
|
||||||
@ -15772,10 +15734,6 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
*/
|
*/
|
||||||
i40e_add_filter_to_drop_tx_flow_control_frames(&pf->hw,
|
i40e_add_filter_to_drop_tx_flow_control_frames(&pf->hw,
|
||||||
pf->main_vsi_seid);
|
pf->main_vsi_seid);
|
||||||
#ifdef CONFIG_I40E_DCB
|
|
||||||
if (pf->flags & I40E_FLAG_DISABLE_FW_LLDP)
|
|
||||||
i40e_set_lldp_forwarding(pf, true);
|
|
||||||
#endif /* CONFIG_I40E_DCB */
|
|
||||||
|
|
||||||
if ((pf->hw.device_id == I40E_DEV_ID_10G_BASE_T) ||
|
if ((pf->hw.device_id == I40E_DEV_ID_10G_BASE_T) ||
|
||||||
(pf->hw.device_id == I40E_DEV_ID_10G_BASE_T4))
|
(pf->hw.device_id == I40E_DEV_ID_10G_BASE_T4))
|
||||||
|
@ -1961,10 +1961,6 @@ static bool i40e_cleanup_headers(struct i40e_ring *rx_ring, struct sk_buff *skb,
|
|||||||
union i40e_rx_desc *rx_desc)
|
union i40e_rx_desc *rx_desc)
|
||||||
|
|
||||||
{
|
{
|
||||||
/* XDP packets use error pointer so abort at this point */
|
|
||||||
if (IS_ERR(skb))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
/* ERR_MASK will only have valid bits if EOP set, and
|
/* ERR_MASK will only have valid bits if EOP set, and
|
||||||
* what we are doing here is actually checking
|
* what we are doing here is actually checking
|
||||||
* I40E_RX_DESC_ERROR_RXE_SHIFT, since it is the zeroth bit in
|
* I40E_RX_DESC_ERROR_RXE_SHIFT, since it is the zeroth bit in
|
||||||
@ -2534,7 +2530,7 @@ static int i40e_clean_rx_irq(struct i40e_ring *rx_ring, int budget)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* exit if we failed to retrieve a buffer */
|
/* exit if we failed to retrieve a buffer */
|
||||||
if (!skb) {
|
if (!xdp_res && !skb) {
|
||||||
rx_ring->rx_stats.alloc_buff_failed++;
|
rx_ring->rx_stats.alloc_buff_failed++;
|
||||||
rx_buffer->pagecnt_bias++;
|
rx_buffer->pagecnt_bias++;
|
||||||
break;
|
break;
|
||||||
@ -2547,7 +2543,7 @@ static int i40e_clean_rx_irq(struct i40e_ring *rx_ring, int budget)
|
|||||||
if (i40e_is_non_eop(rx_ring, rx_desc))
|
if (i40e_is_non_eop(rx_ring, rx_desc))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (i40e_cleanup_headers(rx_ring, skb, rx_desc)) {
|
if (xdp_res || i40e_cleanup_headers(rx_ring, skb, rx_desc)) {
|
||||||
skb = NULL;
|
skb = NULL;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -239,11 +239,8 @@ struct i40e_phy_info {
|
|||||||
#define I40E_CAP_PHY_TYPE_25GBASE_ACC BIT_ULL(I40E_PHY_TYPE_25GBASE_ACC + \
|
#define I40E_CAP_PHY_TYPE_25GBASE_ACC BIT_ULL(I40E_PHY_TYPE_25GBASE_ACC + \
|
||||||
I40E_PHY_TYPE_OFFSET)
|
I40E_PHY_TYPE_OFFSET)
|
||||||
/* Offset for 2.5G/5G PHY Types value to bit number conversion */
|
/* Offset for 2.5G/5G PHY Types value to bit number conversion */
|
||||||
#define I40E_PHY_TYPE_OFFSET2 (-10)
|
#define I40E_CAP_PHY_TYPE_2_5GBASE_T BIT_ULL(I40E_PHY_TYPE_2_5GBASE_T)
|
||||||
#define I40E_CAP_PHY_TYPE_2_5GBASE_T BIT_ULL(I40E_PHY_TYPE_2_5GBASE_T + \
|
#define I40E_CAP_PHY_TYPE_5GBASE_T BIT_ULL(I40E_PHY_TYPE_5GBASE_T)
|
||||||
I40E_PHY_TYPE_OFFSET2)
|
|
||||||
#define I40E_CAP_PHY_TYPE_5GBASE_T BIT_ULL(I40E_PHY_TYPE_5GBASE_T + \
|
|
||||||
I40E_PHY_TYPE_OFFSET2)
|
|
||||||
#define I40E_HW_CAP_MAX_GPIO 30
|
#define I40E_HW_CAP_MAX_GPIO 30
|
||||||
/* Capabilities of a PF or a VF or the whole device */
|
/* Capabilities of a PF or a VF or the whole device */
|
||||||
struct i40e_hw_capabilities {
|
struct i40e_hw_capabilities {
|
||||||
|
Loading…
Reference in New Issue
Block a user