i40e: Fix addition of RX filters after enabling FW LLDP agent
authorMateusz Palczewski <mateusz.palczewski@intel.com>
Fri, 27 Nov 2020 10:39:03 +0000 (10:39 +0000)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Thu, 18 Feb 2021 18:21:17 +0000 (10:21 -0800)
Fix addition of VLAN filter for PF after enabling FW LLDP agent.
Changing LLDP Agent causes FW to re-initialize per NVM settings.
Remove default PF filter and move "Enable/Disable" to currently used
reset flag.
Without this patch PF would try to add MAC VLAN filter with default
switch filter present. This causes AQ error and sets promiscuous mode
on.

Fixes: c65e78f87f81 ("i40e: Further implementation of LLDP")
Signed-off-by: Przemyslaw Patynowski <przemyslawx.patynowski@intel.com>
Signed-off-by: Mateusz Palczewski <mateusz.palczewski@intel.com>
Reviewed-by: Sylwester Dziedziuch <sylwesterx.dziedziuch@intel.com>
Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
Tested-by: Tony Brelinski <tonyx.brelinski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/i40e/i40e_ethtool.c
drivers/net/ethernet/intel/i40e/i40e_main.c

index 26ba1f3eb2d85a1cd940d2ee8753b484ea75fa7f..9e81f85ee2d8d6044ea6d76613efdfee8dfc8fa6 100644 (file)
@@ -4878,7 +4878,7 @@ static int i40e_set_priv_flags(struct net_device *dev, u32 flags)
        enum i40e_admin_queue_err adq_err;
        struct i40e_vsi *vsi = np->vsi;
        struct i40e_pf *pf = vsi->back;
-       bool is_reset_needed;
+       u32 reset_needed = 0;
        i40e_status status;
        u32 i, j;
 
@@ -4923,9 +4923,11 @@ static int i40e_set_priv_flags(struct net_device *dev, u32 flags)
 flags_complete:
        changed_flags = orig_flags ^ new_flags;
 
-       is_reset_needed = !!(changed_flags & (I40E_FLAG_VEB_STATS_ENABLED |
-               I40E_FLAG_LEGACY_RX | I40E_FLAG_SOURCE_PRUNING_DISABLED |
-               I40E_FLAG_DISABLE_FW_LLDP));
+       if (changed_flags & I40E_FLAG_DISABLE_FW_LLDP)
+               reset_needed = I40E_PF_RESET_AND_REBUILD_FLAG;
+       if (changed_flags & (I40E_FLAG_VEB_STATS_ENABLED |
+           I40E_FLAG_LEGACY_RX | I40E_FLAG_SOURCE_PRUNING_DISABLED))
+               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.
@@ -5057,7 +5059,7 @@ flags_complete:
                                case I40E_AQ_RC_EEXIST:
                                        dev_warn(&pf->pdev->dev,
                                                 "FW LLDP agent is already running\n");
-                                       is_reset_needed = false;
+                                       reset_needed = 0;
                                        break;
                                case I40E_AQ_RC_EPERM:
                                        dev_warn(&pf->pdev->dev,
@@ -5086,8 +5088,8 @@ flags_complete:
        /* Issue reset to cause things to take effect, as additional bits
         * are added we will need to create a mask of bits requiring reset
         */
-       if (is_reset_needed)
-               i40e_do_reset(pf, BIT(__I40E_PF_RESET_REQUESTED), true);
+       if (reset_needed)
+               i40e_do_reset(pf, reset_needed, true);
 
        return 0;
 }
index 53efb3a53df2f1402fa0eb10a2070095c8ec06b8..3505d641660beacd313bec4b804d19a483e988d7 100644 (file)
@@ -8537,11 +8537,6 @@ void i40e_do_reset(struct i40e_pf *pf, u32 reset_flags, bool lock_acquired)
                dev_dbg(&pf->pdev->dev, "PFR requested\n");
                i40e_handle_reset_warning(pf, lock_acquired);
 
-               dev_info(&pf->pdev->dev,
-                        pf->flags & I40E_FLAG_DISABLE_FW_LLDP ?
-                        "FW LLDP is disabled\n" :
-                        "FW LLDP is enabled\n");
-
        } else if (reset_flags & I40E_PF_RESET_AND_REBUILD_FLAG) {
                /* Request a PF Reset
                 *
@@ -8549,6 +8544,10 @@ void i40e_do_reset(struct i40e_pf *pf, u32 reset_flags, bool lock_acquired)
                 */
                i40e_prep_for_reset(pf, lock_acquired);
                i40e_reset_and_rebuild(pf, true, lock_acquired);
+               dev_info(&pf->pdev->dev,
+                        pf->flags & I40E_FLAG_DISABLE_FW_LLDP ?
+                        "FW LLDP is disabled\n" :
+                        "FW LLDP is enabled\n");
 
        } else if (reset_flags & BIT_ULL(__I40E_REINIT_REQUESTED)) {
                int v;