diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_main.c | 35 | 
1 files changed, 23 insertions, 12 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c index 173fe6c31341..e109cb93886b 100644 --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c @@ -2399,8 +2399,6 @@ int ice_schedule_reset(struct ice_pf *pf, enum ice_reset_req reset)  		return -EBUSY;  	} -	ice_unplug_aux_dev(pf); -  	switch (reset) {  	case ICE_RESET_PFR:  		set_bit(ICE_PFR_REQ, pf->state); @@ -2898,10 +2896,18 @@ ice_xdp_setup_prog(struct ice_vsi *vsi, struct bpf_prog *prog,  			if (xdp_ring_err)  				NL_SET_ERR_MSG_MOD(extack, "Setting up XDP Tx resources failed");  		} +		/* reallocate Rx queues that are used for zero-copy */ +		xdp_ring_err = ice_realloc_zc_buf(vsi, true); +		if (xdp_ring_err) +			NL_SET_ERR_MSG_MOD(extack, "Setting up XDP Rx resources failed");  	} else if (ice_is_xdp_ena_vsi(vsi) && !prog) {  		xdp_ring_err = ice_destroy_xdp_rings(vsi);  		if (xdp_ring_err)  			NL_SET_ERR_MSG_MOD(extack, "Freeing XDP Tx resources failed"); +		/* reallocate Rx queues that were used for zero-copy */ +		xdp_ring_err = ice_realloc_zc_buf(vsi, false); +		if (xdp_ring_err) +			NL_SET_ERR_MSG_MOD(extack, "Freeing XDP Rx resources failed");  	} else {  		/* safe to call even when prog == vsi->xdp_prog as  		 * dev_xdp_install in net/core/dev.c incremented prog's @@ -3905,7 +3911,7 @@ static int ice_init_pf(struct ice_pf *pf)  	pf->avail_rxqs = bitmap_zalloc(pf->max_pf_rxqs, GFP_KERNEL);  	if (!pf->avail_rxqs) { -		devm_kfree(ice_pf_to_dev(pf), pf->avail_txqs); +		bitmap_free(pf->avail_txqs);  		pf->avail_txqs = NULL;  		return -ENOMEM;  	} @@ -6643,7 +6649,7 @@ static void ice_napi_disable_all(struct ice_vsi *vsi)   */  int ice_down(struct ice_vsi *vsi)  { -	int i, tx_err, rx_err, link_err = 0, vlan_err = 0; +	int i, tx_err, rx_err, vlan_err = 0;  	WARN_ON(!test_bit(ICE_VSI_DOWN, vsi->state)); @@ -6677,20 +6683,13 @@ int ice_down(struct ice_vsi *vsi)  	ice_napi_disable_all(vsi); -	if (test_bit(ICE_FLAG_LINK_DOWN_ON_CLOSE_ENA, vsi->back->flags)) { -		link_err = ice_force_phys_link_state(vsi, false); -		if (link_err) -			netdev_err(vsi->netdev, "Failed to set physical link down, VSI %d error %d\n", -				   vsi->vsi_num, link_err); -	} -  	ice_for_each_txq(vsi, i)  		ice_clean_tx_ring(vsi->tx_rings[i]);  	ice_for_each_rxq(vsi, i)  		ice_clean_rx_ring(vsi->rx_rings[i]); -	if (tx_err || rx_err || link_err || vlan_err) { +	if (tx_err || rx_err || vlan_err) {  		netdev_err(vsi->netdev, "Failed to close VSI 0x%04X on switch 0x%04X\n",  			   vsi->vsi_num, vsi->vsw->sw_id);  		return -EIO; @@ -6852,6 +6851,8 @@ int ice_vsi_open(struct ice_vsi *vsi)  	if (err)  		goto err_setup_rx; +	ice_vsi_cfg_netdev_tc(vsi, vsi->tc_cfg.ena_tc); +  	if (vsi->type == ICE_VSI_PF) {  		/* Notify the stack of the actual queue counts. */  		err = netif_set_real_num_tx_queues(vsi->netdev, vsi->num_txq); @@ -8884,6 +8885,16 @@ int ice_stop(struct net_device *netdev)  		return -EBUSY;  	} +	if (test_bit(ICE_FLAG_LINK_DOWN_ON_CLOSE_ENA, vsi->back->flags)) { +		int link_err = ice_force_phys_link_state(vsi, false); + +		if (link_err) { +			netdev_err(vsi->netdev, "Failed to set physical link down, VSI %d error %d\n", +				   vsi->vsi_num, link_err); +			return -EIO; +		} +	} +  	ice_vsi_close(vsi);  	return 0;  | 
