[Intel-wired-lan] [PATCH net 02/13] ice: Fix VFR issues for AVF drivers that expect ATQLEN cleared

Jankowski, Konrad0 konrad0.jankowski at intel.com
Wed Apr 21 19:18:12 UTC 2021



> -----Original Message-----
> From: Intel-wired-lan <intel-wired-lan-bounces at osuosl.org> On Behalf Of
> Tony Nguyen
> Sent: piątek, 26 lutego 2021 22:19
> To: intel-wired-lan at lists.osuosl.org
> Subject: [Intel-wired-lan] [PATCH net 02/13] ice: Fix VFR issues for AVF
> drivers that expect ATQLEN cleared
> 
> From: Brett Creeley <brett.creeley at intel.com>
> 
> Some AVF drivers expect the VF_MBX_ATQLEN register to be cleared for any
> type of VFR/VFLR. Fix this by clearing the VF_MBX_ATQLEN register at the
> same time as VF_MBX_ARQLEN.
> 
> Fixes: 82ba01282cf8 ("ice: clear VF ARQLEN register on reset")
> Signed-off-by: Brett Creeley <brett.creeley at intel.com>
> Signed-off-by: Tony Nguyen <anthony.l.nguyen at intel.com>
> ---
>  drivers/net/ethernet/intel/ice/ice_hw_autogen.h  |  1 +
> drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c | 12 +++++++-----
>  2 files changed, 8 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/ice/ice_hw_autogen.h
> b/drivers/net/ethernet/intel/ice/ice_hw_autogen.h
> index 093a1818a392..1998821896c0 100644
> --- a/drivers/net/ethernet/intel/ice/ice_hw_autogen.h
> +++ b/drivers/net/ethernet/intel/ice/ice_hw_autogen.h
> @@ -31,6 +31,7 @@
>  #define PF_FW_ATQLEN_ATQOVFL_M			BIT(29)
>  #define PF_FW_ATQLEN_ATQCRIT_M			BIT(30)
>  #define VF_MBX_ARQLEN(_VF)			(0x0022BC00 + ((_VF)
> * 4))
> +#define VF_MBX_ATQLEN(_VF)			(0x0022A800 + ((_VF)
> * 4))
>  #define PF_FW_ATQLEN_ATQENABLE_M		BIT(31)
>  #define PF_FW_ATQT				0x00080400
>  #define PF_MBX_ARQBAH				0x0022E400
> diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c
> b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c
> index 1f38a8d0c525..0f2a4d48574e 100644
> --- a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c
> +++ b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c
> @@ -435,13 +435,15 @@ static void ice_trigger_vf_reset(struct ice_vf *vf,
> bool is_vflr, bool is_pfr)
>  	 */
>  	clear_bit(ICE_VF_STATE_INIT, vf->vf_states);
> 
> -	/* VF_MBX_ARQLEN is cleared by PFR, so the driver needs to clear it
> -	 * in the case of VFR. If this is done for PFR, it can mess up VF
> -	 * resets because the VF driver may already have started cleanup
> -	 * by the time we get here.
> +	/* VF_MBX_ARQLEN and VF_MBX_ATQLEN are cleared by PFR, so
> the driver
> +	 * needs to clear them in the case of VFR/VFLR. If this is done for
> +	 * PFR, it can mess up VF resets because the VF driver may already
> +	 * have started cleanup by the time we get here.
>  	 */
> -	if (!is_pfr)
> +	if (!is_pfr) {
>  		wr32(hw, VF_MBX_ARQLEN(vf->vf_id), 0);
> +		wr32(hw, VF_MBX_ATQLEN(vf->vf_id), 0);
> +	}
> 
>  	/* In the case of a VFLR, the HW has already reset the VF and we
>  	 * just need to clean up, so don't hit the VFRTRIG register.

Tested-by: Konrad Jankowski <konrad0.jankowski at intel.com>


More information about the Intel-wired-lan mailing list