Commit ea377dca authored by David S. Miller's avatar David S. Miller

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

Tony Nguyen says:

====================
Intel Wired LAN Driver Updates 2021-08-09

This series contains updates to ice and iavf drivers.

Ani prevents the ice driver from accidentally being probed to a virtual
function and stops processing of VF messages when VFs are being torn
down.

Brett prevents the ice driver from deleting is own MAC address.

Fahad ensures the RSS LUT and key are always set following reset for
iavf.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 143a8526 a7550f8b
...@@ -1506,11 +1506,6 @@ static int iavf_reinit_interrupt_scheme(struct iavf_adapter *adapter) ...@@ -1506,11 +1506,6 @@ static int iavf_reinit_interrupt_scheme(struct iavf_adapter *adapter)
set_bit(__IAVF_VSI_DOWN, adapter->vsi.state); set_bit(__IAVF_VSI_DOWN, adapter->vsi.state);
iavf_map_rings_to_vectors(adapter); iavf_map_rings_to_vectors(adapter);
if (RSS_AQ(adapter))
adapter->aq_required |= IAVF_FLAG_AQ_CONFIGURE_RSS;
else
err = iavf_init_rss(adapter);
err: err:
return err; return err;
} }
...@@ -2200,6 +2195,14 @@ static void iavf_reset_task(struct work_struct *work) ...@@ -2200,6 +2195,14 @@ static void iavf_reset_task(struct work_struct *work)
goto reset_err; goto reset_err;
} }
if (RSS_AQ(adapter)) {
adapter->aq_required |= IAVF_FLAG_AQ_CONFIGURE_RSS;
} else {
err = iavf_init_rss(adapter);
if (err)
goto reset_err;
}
adapter->aq_required |= IAVF_FLAG_AQ_GET_CONFIG; adapter->aq_required |= IAVF_FLAG_AQ_GET_CONFIG;
adapter->aq_required |= IAVF_FLAG_AQ_MAP_VECTORS; adapter->aq_required |= IAVF_FLAG_AQ_MAP_VECTORS;
......
...@@ -234,6 +234,7 @@ enum ice_pf_state { ...@@ -234,6 +234,7 @@ enum ice_pf_state {
ICE_VFLR_EVENT_PENDING, ICE_VFLR_EVENT_PENDING,
ICE_FLTR_OVERFLOW_PROMISC, ICE_FLTR_OVERFLOW_PROMISC,
ICE_VF_DIS, ICE_VF_DIS,
ICE_VF_DEINIT_IN_PROGRESS,
ICE_CFG_BUSY, ICE_CFG_BUSY,
ICE_SERVICE_SCHED, ICE_SERVICE_SCHED,
ICE_SERVICE_DIS, ICE_SERVICE_DIS,
......
...@@ -191,6 +191,14 @@ static int ice_add_mac_to_unsync_list(struct net_device *netdev, const u8 *addr) ...@@ -191,6 +191,14 @@ static int ice_add_mac_to_unsync_list(struct net_device *netdev, const u8 *addr)
struct ice_netdev_priv *np = netdev_priv(netdev); struct ice_netdev_priv *np = netdev_priv(netdev);
struct ice_vsi *vsi = np->vsi; struct ice_vsi *vsi = np->vsi;
/* Under some circumstances, we might receive a request to delete our
* own device address from our uc list. Because we store the device
* address in the VSI's MAC filter list, we need to ignore such
* requests and not delete our device address from this list.
*/
if (ether_addr_equal(addr, netdev->dev_addr))
return 0;
if (ice_fltr_add_mac_to_list(vsi, &vsi->tmp_unsync_list, addr, if (ice_fltr_add_mac_to_list(vsi, &vsi->tmp_unsync_list, addr,
ICE_FWD_TO_VSI)) ICE_FWD_TO_VSI))
return -EINVAL; return -EINVAL;
...@@ -4194,6 +4202,11 @@ ice_probe(struct pci_dev *pdev, const struct pci_device_id __always_unused *ent) ...@@ -4194,6 +4202,11 @@ ice_probe(struct pci_dev *pdev, const struct pci_device_id __always_unused *ent)
struct ice_hw *hw; struct ice_hw *hw;
int i, err; int i, err;
if (pdev->is_virtfn) {
dev_err(dev, "can't probe a virtual function\n");
return -EINVAL;
}
/* this driver uses devres, see /* this driver uses devres, see
* Documentation/driver-api/driver-model/devres.rst * Documentation/driver-api/driver-model/devres.rst
*/ */
...@@ -5119,7 +5132,7 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi) ...@@ -5119,7 +5132,7 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi)
return -EADDRNOTAVAIL; return -EADDRNOTAVAIL;
if (ether_addr_equal(netdev->dev_addr, mac)) { if (ether_addr_equal(netdev->dev_addr, mac)) {
netdev_warn(netdev, "already using mac %pM\n", mac); netdev_dbg(netdev, "already using mac %pM\n", mac);
return 0; return 0;
} }
...@@ -5130,6 +5143,7 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi) ...@@ -5130,6 +5143,7 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi)
return -EBUSY; return -EBUSY;
} }
netif_addr_lock_bh(netdev);
/* Clean up old MAC filter. Not an error if old filter doesn't exist */ /* Clean up old MAC filter. Not an error if old filter doesn't exist */
status = ice_fltr_remove_mac(vsi, netdev->dev_addr, ICE_FWD_TO_VSI); status = ice_fltr_remove_mac(vsi, netdev->dev_addr, ICE_FWD_TO_VSI);
if (status && status != ICE_ERR_DOES_NOT_EXIST) { if (status && status != ICE_ERR_DOES_NOT_EXIST) {
...@@ -5139,30 +5153,28 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi) ...@@ -5139,30 +5153,28 @@ static int ice_set_mac_address(struct net_device *netdev, void *pi)
/* Add filter for new MAC. If filter exists, return success */ /* Add filter for new MAC. If filter exists, return success */
status = ice_fltr_add_mac(vsi, mac, ICE_FWD_TO_VSI); status = ice_fltr_add_mac(vsi, mac, ICE_FWD_TO_VSI);
if (status == ICE_ERR_ALREADY_EXISTS) { if (status == ICE_ERR_ALREADY_EXISTS)
/* Although this MAC filter is already present in hardware it's /* Although this MAC filter is already present in hardware it's
* possible in some cases (e.g. bonding) that dev_addr was * possible in some cases (e.g. bonding) that dev_addr was
* modified outside of the driver and needs to be restored back * modified outside of the driver and needs to be restored back
* to this value. * to this value.
*/ */
memcpy(netdev->dev_addr, mac, netdev->addr_len);
netdev_dbg(netdev, "filter for MAC %pM already exists\n", mac); netdev_dbg(netdev, "filter for MAC %pM already exists\n", mac);
return 0; else if (status)
}
/* error if the new filter addition failed */ /* error if the new filter addition failed */
if (status)
err = -EADDRNOTAVAIL; err = -EADDRNOTAVAIL;
err_update_filters: err_update_filters:
if (err) { if (err) {
netdev_err(netdev, "can't set MAC %pM. filter update failed\n", netdev_err(netdev, "can't set MAC %pM. filter update failed\n",
mac); mac);
netif_addr_unlock_bh(netdev);
return err; return err;
} }
/* change the netdev's MAC address */ /* change the netdev's MAC address */
memcpy(netdev->dev_addr, mac, netdev->addr_len); memcpy(netdev->dev_addr, mac, netdev->addr_len);
netif_addr_unlock_bh(netdev);
netdev_dbg(vsi->netdev, "updated MAC address to %pM\n", netdev_dbg(vsi->netdev, "updated MAC address to %pM\n",
netdev->dev_addr); netdev->dev_addr);
......
...@@ -615,6 +615,8 @@ void ice_free_vfs(struct ice_pf *pf) ...@@ -615,6 +615,8 @@ void ice_free_vfs(struct ice_pf *pf)
struct ice_hw *hw = &pf->hw; struct ice_hw *hw = &pf->hw;
unsigned int tmp, i; unsigned int tmp, i;
set_bit(ICE_VF_DEINIT_IN_PROGRESS, pf->state);
if (!pf->vf) if (!pf->vf)
return; return;
...@@ -680,6 +682,7 @@ void ice_free_vfs(struct ice_pf *pf) ...@@ -680,6 +682,7 @@ void ice_free_vfs(struct ice_pf *pf)
i); i);
clear_bit(ICE_VF_DIS, pf->state); clear_bit(ICE_VF_DIS, pf->state);
clear_bit(ICE_VF_DEINIT_IN_PROGRESS, pf->state);
clear_bit(ICE_FLAG_SRIOV_ENA, pf->flags); clear_bit(ICE_FLAG_SRIOV_ENA, pf->flags);
} }
...@@ -4415,6 +4418,10 @@ void ice_vc_process_vf_msg(struct ice_pf *pf, struct ice_rq_event_info *event) ...@@ -4415,6 +4418,10 @@ void ice_vc_process_vf_msg(struct ice_pf *pf, struct ice_rq_event_info *event)
struct device *dev; struct device *dev;
int err = 0; int err = 0;
/* if de-init is underway, don't process messages from VF */
if (test_bit(ICE_VF_DEINIT_IN_PROGRESS, pf->state))
return;
dev = ice_pf_to_dev(pf); dev = ice_pf_to_dev(pf);
if (ice_validate_vf_id(pf, vf_id)) { if (ice_validate_vf_id(pf, vf_id)) {
err = -EINVAL; err = -EINVAL;
......
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