diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_main.c | 58 | 
1 files changed, 47 insertions, 11 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c index a9a7f8b52140..8ec24f6cf6be 100644 --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c @@ -275,6 +275,8 @@ static int ice_set_promisc(struct ice_vsi *vsi, u8 promisc_m)  	if (status && status != -EEXIST)  		return status; +	netdev_dbg(vsi->netdev, "set promisc filter bits for VSI %i: 0x%x\n", +		   vsi->vsi_num, promisc_m);  	return 0;  } @@ -300,6 +302,8 @@ static int ice_clear_promisc(struct ice_vsi *vsi, u8 promisc_m)  						    promisc_m, 0);  	} +	netdev_dbg(vsi->netdev, "clear promisc filter bits for VSI %i: 0x%x\n", +		   vsi->vsi_num, promisc_m);  	return status;  } @@ -414,6 +418,16 @@ static int ice_vsi_sync_fltr(struct ice_vsi *vsi)  				}  				err = 0;  				vlan_ops->dis_rx_filtering(vsi); + +				/* promiscuous mode implies allmulticast so +				 * that VSIs that are in promiscuous mode are +				 * subscribed to multicast packets coming to +				 * the port +				 */ +				err = ice_set_promisc(vsi, +						      ICE_MCAST_PROMISC_BITS); +				if (err) +					goto out_promisc;  			}  		} else {  			/* Clear Rx filter to remove traffic from wire */ @@ -430,6 +444,18 @@ static int ice_vsi_sync_fltr(struct ice_vsi *vsi)  				    NETIF_F_HW_VLAN_CTAG_FILTER)  					vlan_ops->ena_rx_filtering(vsi);  			} + +			/* disable allmulti here, but only if allmulti is not +			 * still enabled for the netdev +			 */ +			if (!(vsi->current_netdev_flags & IFF_ALLMULTI)) { +				err = ice_clear_promisc(vsi, +							ICE_MCAST_PROMISC_BITS); +				if (err) { +					netdev_err(netdev, "Error %d clearing multicast promiscuous on VSI %i\n", +						   err, vsi->vsi_num); +				} +			}  		}  	}  	goto exit; @@ -4195,12 +4221,13 @@ bool ice_is_wol_supported(struct ice_hw *hw)   * @vsi: VSI being changed   * @new_rx: new number of Rx queues   * @new_tx: new number of Tx queues + * @locked: is adev device_lock held   *   * Only change the number of queues if new_tx, or new_rx is non-0.   *   * Returns 0 on success.   */ -int ice_vsi_recfg_qs(struct ice_vsi *vsi, int new_rx, int new_tx) +int ice_vsi_recfg_qs(struct ice_vsi *vsi, int new_rx, int new_tx, bool locked)  {  	struct ice_pf *pf = vsi->back;  	int err = 0, timeout = 50; @@ -4229,7 +4256,7 @@ int ice_vsi_recfg_qs(struct ice_vsi *vsi, int new_rx, int new_tx)  	ice_vsi_close(vsi);  	ice_vsi_rebuild(vsi, false); -	ice_pf_dcb_recfg(pf); +	ice_pf_dcb_recfg(pf, locked);  	ice_vsi_open(vsi);  done:  	clear_bit(ICE_CFG_BUSY, pf->state); @@ -4590,7 +4617,7 @@ static void ice_print_wake_reason(struct ice_pf *pf)  }  /** - * ice_register_netdev - register netdev and devlink port + * ice_register_netdev - register netdev   * @pf: pointer to the PF struct   */  static int ice_register_netdev(struct ice_pf *pf) @@ -4602,11 +4629,6 @@ static int ice_register_netdev(struct ice_pf *pf)  	if (!vsi || !vsi->netdev)  		return -EIO; -	err = ice_devlink_create_pf_port(pf); -	if (err) -		goto err_devlink_create; - -	SET_NETDEV_DEVLINK_PORT(vsi->netdev, &pf->devlink_port);  	err = register_netdev(vsi->netdev);  	if (err)  		goto err_register_netdev; @@ -4617,8 +4639,6 @@ static int ice_register_netdev(struct ice_pf *pf)  	return 0;  err_register_netdev: -	ice_devlink_destroy_pf_port(pf); -err_devlink_create:  	free_netdev(vsi->netdev);  	vsi->netdev = NULL;  	clear_bit(ICE_VSI_NETDEV_ALLOCD, vsi->state); @@ -4636,6 +4656,7 @@ static int  ice_probe(struct pci_dev *pdev, const struct pci_device_id __always_unused *ent)  {  	struct device *dev = &pdev->dev; +	struct ice_vsi *vsi;  	struct ice_pf *pf;  	struct ice_hw *hw;  	int i, err; @@ -4918,6 +4939,18 @@ ice_probe(struct pci_dev *pdev, const struct pci_device_id __always_unused *ent)  	pcie_print_link_status(pf->pdev);  probe_done: +	err = ice_devlink_create_pf_port(pf); +	if (err) +		goto err_create_pf_port; + +	vsi = ice_get_main_vsi(pf); +	if (!vsi || !vsi->netdev) { +		err = -EINVAL; +		goto err_netdev_reg; +	} + +	SET_NETDEV_DEVLINK_PORT(vsi->netdev, &pf->devlink_port); +  	err = ice_register_netdev(pf);  	if (err)  		goto err_netdev_reg; @@ -4955,6 +4988,8 @@ err_init_aux_unroll:  err_devlink_reg_param:  	ice_devlink_unregister_params(pf);  err_netdev_reg: +	ice_devlink_destroy_pf_port(pf); +err_create_pf_port:  err_send_version_unroll:  	ice_vsi_release_all(pf);  err_alloc_sw_unroll: @@ -5083,6 +5118,7 @@ static void ice_remove(struct pci_dev *pdev)  	ice_setup_mc_magic_wake(pf);  	ice_vsi_release_all(pf);  	mutex_destroy(&(&pf->hw)->fdir_fltr_lock); +	ice_devlink_destroy_pf_port(pf);  	ice_set_wake(pf);  	ice_free_irq_msix_misc(pf);  	ice_for_each_vsi(pf, i) { @@ -5531,7 +5567,7 @@ static int __init ice_module_init(void)  	pr_info("%s\n", ice_driver_string);  	pr_info("%s\n", ice_copyright); -	ice_wq = alloc_workqueue("%s", WQ_MEM_RECLAIM, 0, KBUILD_MODNAME); +	ice_wq = alloc_workqueue("%s", 0, 0, KBUILD_MODNAME);  	if (!ice_wq) {  		pr_err("Failed to create workqueue\n");  		return -ENOMEM;  |