ice: move ice_vsi_update_l2tsel to ice_lib.c

A future change is going to need to call ice_vsi_update_l2tsel from a new
context outside of ice_virtchnl.c

Since this function deals with a generic VSI, move it into ice_lib.c to
enable calling it from other places in the ice driver.

Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Reviewed-by: Madhu Chittim <madhu.chittim@intel.com>
Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
Jacob Keller 2025-06-18 15:24:39 -07:00 committed by Tony Nguyen
parent 5ff8d95623
commit 4f98ac2d8e
3 changed files with 43 additions and 42 deletions

View File

@ -4020,3 +4020,38 @@ ice_vsi_update_local_lb(struct ice_vsi *vsi, bool set)
vsi->info = ctx.info;
return 0;
}
/**
* ice_vsi_update_l2tsel - update l2tsel field for all Rx rings on this VSI
* @vsi: VSI used to update l2tsel on
* @l2tsel: l2tsel setting requested
*
* Use the l2tsel setting to update all of the Rx queue context bits for l2tsel.
* This will modify which descriptor field the first offloaded VLAN will be
* stripped into.
*/
void ice_vsi_update_l2tsel(struct ice_vsi *vsi, enum ice_l2tsel l2tsel)
{
struct ice_hw *hw = &vsi->back->hw;
u32 l2tsel_bit;
int i;
if (l2tsel == ICE_L2TSEL_EXTRACT_FIRST_TAG_L2TAG2_2ND)
l2tsel_bit = 0;
else
l2tsel_bit = BIT(ICE_L2TSEL_BIT_OFFSET);
for (i = 0; i < vsi->alloc_rxq; i++) {
u16 pfq = vsi->rxq_map[i];
u32 qrx_context_offset;
u32 regval;
qrx_context_offset =
QRX_CONTEXT(ICE_L2TSEL_QRX_CONTEXT_REG_IDX, pfq);
regval = rd32(hw, qrx_context_offset);
regval &= ~BIT(ICE_L2TSEL_BIT_OFFSET);
regval |= l2tsel_bit;
wr32(hw, qrx_context_offset, regval);
}
}

View File

@ -11,6 +11,13 @@
#define ICE_VSI_FLAG_INIT BIT(0)
#define ICE_VSI_FLAG_NO_INIT 0
#define ICE_L2TSEL_QRX_CONTEXT_REG_IDX 3
#define ICE_L2TSEL_BIT_OFFSET 23
enum ice_l2tsel {
ICE_L2TSEL_EXTRACT_FIRST_TAG_L2TAG2_2ND,
ICE_L2TSEL_EXTRACT_FIRST_TAG_L2TAG1,
};
const char *ice_vsi_type_str(enum ice_vsi_type vsi_type);
bool ice_pf_state_is_nominal(struct ice_pf *pf);
@ -116,4 +123,5 @@ void ice_set_feature_support(struct ice_pf *pf, enum ice_feature f);
void ice_clear_feature_support(struct ice_pf *pf, enum ice_feature f);
void ice_init_feature_support(struct ice_pf *pf);
bool ice_vsi_is_rx_queue_active(struct ice_vsi *vsi);
void ice_vsi_update_l2tsel(struct ice_vsi *vsi, enum ice_l2tsel l2tsel);
#endif /* !_ICE_LIB_H_ */

View File

@ -3860,48 +3860,6 @@ ice_vc_ena_vlan_offload(struct ice_vsi *vsi,
return 0;
}
#define ICE_L2TSEL_QRX_CONTEXT_REG_IDX 3
#define ICE_L2TSEL_BIT_OFFSET 23
enum ice_l2tsel {
ICE_L2TSEL_EXTRACT_FIRST_TAG_L2TAG2_2ND,
ICE_L2TSEL_EXTRACT_FIRST_TAG_L2TAG1,
};
/**
* ice_vsi_update_l2tsel - update l2tsel field for all Rx rings on this VSI
* @vsi: VSI used to update l2tsel on
* @l2tsel: l2tsel setting requested
*
* Use the l2tsel setting to update all of the Rx queue context bits for l2tsel.
* This will modify which descriptor field the first offloaded VLAN will be
* stripped into.
*/
static void ice_vsi_update_l2tsel(struct ice_vsi *vsi, enum ice_l2tsel l2tsel)
{
struct ice_hw *hw = &vsi->back->hw;
u32 l2tsel_bit;
int i;
if (l2tsel == ICE_L2TSEL_EXTRACT_FIRST_TAG_L2TAG2_2ND)
l2tsel_bit = 0;
else
l2tsel_bit = BIT(ICE_L2TSEL_BIT_OFFSET);
for (i = 0; i < vsi->alloc_rxq; i++) {
u16 pfq = vsi->rxq_map[i];
u32 qrx_context_offset;
u32 regval;
qrx_context_offset =
QRX_CONTEXT(ICE_L2TSEL_QRX_CONTEXT_REG_IDX, pfq);
regval = rd32(hw, qrx_context_offset);
regval &= ~BIT(ICE_L2TSEL_BIT_OFFSET);
regval |= l2tsel_bit;
wr32(hw, qrx_context_offset, regval);
}
}
/**
* ice_vc_ena_vlan_stripping_v2_msg
* @vf: VF the message was received from