diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_main.c | 59 | 
1 files changed, 34 insertions, 25 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c index 567694bf098b..42c318ceff61 100644 --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c @@ -1393,6 +1393,8 @@ static void ice_aq_cancel_waiting_tasks(struct ice_pf *pf)  	wake_up(&pf->aq_wait_queue);  } +#define ICE_MBX_OVERFLOW_WATERMARK 64 +  /**   * __ice_clean_ctrlq - helper function to clean controlq rings   * @pf: ptr to struct ice_pf @@ -1483,6 +1485,7 @@ static int __ice_clean_ctrlq(struct ice_pf *pf, enum ice_ctl_q q_type)  		return 0;  	do { +		struct ice_mbx_data data = {};  		u16 opcode;  		int ret; @@ -1509,8 +1512,12 @@ static int __ice_clean_ctrlq(struct ice_pf *pf, enum ice_ctl_q q_type)  			ice_vf_lan_overflow_event(pf, &event);  			break;  		case ice_mbx_opc_send_msg_to_pf: -			if (!ice_is_malicious_vf(pf, &event, i, pending)) -				ice_vc_process_vf_msg(pf, &event); +			data.num_msg_proc = i; +			data.num_pending_arq = pending; +			data.max_num_msgs_mbx = hw->mailboxq.num_rq_entries; +			data.async_watermark_val = ICE_MBX_OVERFLOW_WATERMARK; + +			ice_vc_process_vf_msg(pf, &event, &data);  			break;  		case ice_aqc_opc_fw_logging:  			ice_output_fw_log(hw, &event.desc, event.msg_buf); @@ -2316,18 +2323,15 @@ static void ice_service_task(struct work_struct *work)  		}  	} -	if (test_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags)) { -		/* Plug aux device per request */ -		ice_plug_aux_dev(pf); +	/* unplug aux dev per request, if an unplug request came in +	 * while processing a plug request, this will handle it +	 */ +	if (test_and_clear_bit(ICE_FLAG_UNPLUG_AUX_DEV, pf->flags)) +		ice_unplug_aux_dev(pf); -		/* Mark plugging as done but check whether unplug was -		 * requested during ice_plug_aux_dev() call -		 * (e.g. from ice_clear_rdma_cap()) and if so then -		 * plug aux device. -		 */ -		if (!test_and_clear_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags)) -			ice_unplug_aux_dev(pf); -	} +	/* Plug aux device per request */ +	if (test_and_clear_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags)) +		ice_plug_aux_dev(pf);  	if (test_and_clear_bit(ICE_FLAG_MTU_CHANGED, pf->flags)) {  		struct iidc_event *event; @@ -3891,6 +3895,7 @@ static int ice_init_pf(struct ice_pf *pf)  	mutex_init(&pf->vfs.table_lock);  	hash_init(pf->vfs.table); +	ice_mbx_init_snapshot(&pf->hw);  	return 0;  } @@ -4644,6 +4649,12 @@ static int ice_start_eth(struct ice_vsi *vsi)  	return err;  } +static void ice_stop_eth(struct ice_vsi *vsi) +{ +	ice_fltr_remove_all(vsi); +	ice_vsi_close(vsi); +} +  static int ice_init_eth(struct ice_pf *pf)  {  	struct ice_vsi *vsi = ice_get_main_vsi(pf); @@ -4791,9 +4802,13 @@ err_init_pf:  static void ice_deinit_dev(struct ice_pf *pf)  {  	ice_free_irq_msix_misc(pf); -	ice_clear_interrupt_scheme(pf);  	ice_deinit_pf(pf);  	ice_deinit_hw(&pf->hw); + +	/* Service task is already stopped, so call reset directly. */ +	ice_reset(&pf->hw, ICE_RESET_PFR); +	pci_wait_for_pending_transaction(pf->pdev); +	ice_clear_interrupt_scheme(pf);  }  static void ice_init_features(struct ice_pf *pf) @@ -5083,10 +5098,6 @@ int ice_load(struct ice_pf *pf)  	struct ice_vsi *vsi;  	int err; -	err = ice_reset(&pf->hw, ICE_RESET_PFR); -	if (err) -		return err; -  	err = ice_init_dev(pf);  	if (err)  		return err; @@ -5132,7 +5143,7 @@ void ice_unload(struct ice_pf *pf)  {  	ice_deinit_features(pf);  	ice_deinit_rdma(pf); -	ice_vsi_close(ice_get_main_vsi(pf)); +	ice_stop_eth(ice_get_main_vsi(pf));  	ice_vsi_decfg(ice_get_main_vsi(pf));  	ice_deinit_dev(pf);  } @@ -5343,12 +5354,6 @@ static void ice_remove(struct pci_dev *pdev)  	ice_setup_mc_magic_wake(pf);  	ice_set_wake(pf); -	/* Issue a PFR as part of the prescribed driver unload flow.  Do not -	 * do it via ice_schedule_reset() since there is no need to rebuild -	 * and the service task is already stopped. -	 */ -	ice_reset(&pf->hw, ICE_RESET_PFR); -	pci_wait_for_pending_transaction(pdev);  	pci_disable_device(pdev);  } @@ -7045,6 +7050,10 @@ int ice_down(struct ice_vsi *vsi)  	ice_for_each_txq(vsi, i)  		ice_clean_tx_ring(vsi->tx_rings[i]); +	if (ice_is_xdp_ena_vsi(vsi)) +		ice_for_each_xdp_txq(vsi, i) +			ice_clean_tx_ring(vsi->xdp_rings[i]); +  	ice_for_each_rxq(vsi, i)  		ice_clean_rx_ring(vsi->rx_rings[i]);  |