Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 72b74869 authored by Anjali Singhai Jain's avatar Anjali Singhai Jain Committed by Jeff Kirsher
Browse files

i40e: add priv flag for automatic rule eviction



The X722 can support automatic rule eviction for automatically added
flow director rules.  Feature is (should be) disabled by default.

Signed-off-by: default avatarAnjali Singhai Jain <anjali.singhai@intel.com>
Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent a340c789
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -104,6 +104,7 @@
#define I40E_PRIV_FLAGS_FD_ATR		BIT(2)
#define I40E_PRIV_FLAGS_VEB_STATS	BIT(3)
#define I40E_PRIV_FLAGS_PS		BIT(4)
#define I40E_PRIV_FLAGS_HW_ATR_EVICT	BIT(5)

#define I40E_NVM_VERSION_LO_SHIFT  0
#define I40E_NVM_VERSION_LO_MASK   (0xff << I40E_NVM_VERSION_LO_SHIFT)
+9 −0
Original line number Diff line number Diff line
@@ -235,6 +235,7 @@ static const char i40e_priv_flags_strings[][ETH_GSTRING_LEN] = {
	"flow-director-atr",
	"veb-stats",
	"packet-split",
	"hw-atr-eviction",
};

#define I40E_PRIV_FLAGS_STR_LEN ARRAY_SIZE(i40e_priv_flags_strings)
@@ -2731,6 +2732,8 @@ static u32 i40e_get_priv_flags(struct net_device *dev)
		I40E_PRIV_FLAGS_VEB_STATS : 0;
	ret_flags |= pf->flags & I40E_FLAG_RX_PS_ENABLED ?
		I40E_PRIV_FLAGS_PS : 0;
	ret_flags |= pf->auto_disable_flags & I40E_FLAG_HW_ATR_EVICT_CAPABLE ?
		0 : I40E_PRIV_FLAGS_HW_ATR_EVICT;

	return ret_flags;
}
@@ -2787,6 +2790,12 @@ static int i40e_set_priv_flags(struct net_device *dev, u32 flags)
	else
		pf->flags &= ~I40E_FLAG_VEB_STATS_ENABLED;

	if ((flags & I40E_PRIV_FLAGS_HW_ATR_EVICT) &&
	    (pf->flags & I40E_FLAG_HW_ATR_EVICT_CAPABLE))
		pf->auto_disable_flags &= ~I40E_FLAG_HW_ATR_EVICT_CAPABLE;
	else
		pf->auto_disable_flags |= I40E_FLAG_HW_ATR_EVICT_CAPABLE;

	/* if needed, issue reset to cause things to take effect */
	if (reset_required)
		i40e_do_reset(pf, BIT(__I40E_PF_RESET_REQUESTED));
+3 −0
Original line number Diff line number Diff line
@@ -8464,6 +8464,9 @@ static int i40e_sw_init(struct i40e_pf *pf)
		    (pf->hw.aq.api_min_ver > 4))) {
		/* Supported in FW API version higher than 1.4 */
		pf->flags |= I40E_FLAG_GENEVE_OFFLOAD_CAPABLE;
		pf->auto_disable_flags = I40E_FLAG_HW_ATR_EVICT_CAPABLE;
	} else {
		pf->auto_disable_flags = I40E_FLAG_HW_ATR_EVICT_CAPABLE;
	}

	pf->eeprom_version = 0xDEAD;
+4 −2
Original line number Diff line number Diff line
@@ -2047,7 +2047,8 @@ static void i40e_atr(struct i40e_ring *tx_ring, struct sk_buff *skb,
	/* Due to lack of space, no more new filters can be programmed */
	if (th->syn && (pf->auto_disable_flags & I40E_FLAG_FD_ATR_ENABLED))
		return;
	if (pf->flags & I40E_FLAG_HW_ATR_EVICT_CAPABLE) {
	if ((pf->flags & I40E_FLAG_HW_ATR_EVICT_CAPABLE) &&
	    (!(pf->auto_disable_flags & I40E_FLAG_HW_ATR_EVICT_CAPABLE))) {
		/* HW ATR eviction will take care of removing filters on FIN
		 * and RST packets.
		 */
@@ -2109,7 +2110,8 @@ static void i40e_atr(struct i40e_ring *tx_ring, struct sk_buff *skb,
			I40E_TXD_FLTR_QW1_CNTINDEX_SHIFT) &
			I40E_TXD_FLTR_QW1_CNTINDEX_MASK;

	if (pf->flags & I40E_FLAG_HW_ATR_EVICT_CAPABLE)
	if ((pf->flags & I40E_FLAG_HW_ATR_EVICT_CAPABLE) &&
	    (!(pf->auto_disable_flags & I40E_FLAG_HW_ATR_EVICT_CAPABLE)))
		dtype_cmd |= I40E_TXD_FLTR_QW1_ATR_MASK;

	fdir_desc->qindex_flex_ptype_vsi = cpu_to_le32(flex_ptype);
+4 −0
Original line number Diff line number Diff line
@@ -1098,6 +1098,10 @@ enum i40e_filter_program_desc_pcmd {
					 I40E_TXD_FLTR_QW1_CMD_SHIFT)
#define I40E_TXD_FLTR_QW1_ATR_MASK	BIT_ULL(I40E_TXD_FLTR_QW1_ATR_SHIFT)

#define I40E_TXD_FLTR_QW1_ATR_SHIFT	(0xEULL + \
					 I40E_TXD_FLTR_QW1_CMD_SHIFT)
#define I40E_TXD_FLTR_QW1_ATR_MASK	BIT_ULL(I40E_TXD_FLTR_QW1_ATR_SHIFT)

#define I40E_TXD_FLTR_QW1_CNTINDEX_SHIFT 20
#define I40E_TXD_FLTR_QW1_CNTINDEX_MASK	(0x1FFUL << \
					 I40E_TXD_FLTR_QW1_CNTINDEX_SHIFT)