From: Mohammad Heib <redacted>
Toggling flow-director-atr via ethtool private flags does not trigger a
ring reset. If ATR was disabled while fd_ena was cleared in the TX queue
HW context (e.g. after a ring reset with both ATR and ntuple off),
re-enabling ATR causes i40e_atr() to inject FDIR descriptors into a
queue where fd_ena is still 0.
Trigger a PF reset when ATR is re-enabled so that fd_ena is re-evaluated
based on the current flag state.
Signed-off-by: Mohammad Heib <redacted>
---
drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index 6d2b076049f7..bb37f8cc4643 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -5301,6 +5301,13 @@ static int i40e_set_priv_flags(struct net_device *dev, u32 flags)
test_bit(I40E_FLAG_SOURCE_PRUNING_DIS, changed_flags))
reset_needed = BIT(__I40E_PF_RESET_REQUESTED);
+ /* Re-enabling ATR requires a reset to update fd_ena in the
+ * TX queue HW context.
+ */
+ if (test_bit(I40E_FLAG_FD_ATR_ENA, changed_flags) &&
+ test_bit(I40E_FLAG_FD_ATR_ENA, new_flags))
+ reset_needed = BIT(__I40E_PF_RESET_REQUESTED);
+
/* Before we finalize any flag changes, we need to perform some
* checks to ensure that the changes are supported and safe.
*/
--
2.53.0