ice: Fix state bits on LLDP mode switch
authorDave Ertman <david.m.ertman@intel.com>
Sat, 21 Nov 2020 00:38:35 +0000 (16:38 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 4 Mar 2021 10:38:17 +0000 (11:38 +0100)
[ Upstream commit 0d4907f65dc8fc5e897ad19956fca1acb3b33bc8 ]

DCBX_CAP bits were not being adjusted when switching
between SW and FW controlled LLDP.

Adjust bits to correctly indicate which mode the
LLDP logic is in.

Fixes: b94b013eb626 ("ice: Implement DCBNL support")
Signed-off-by: Dave Ertman <david.m.ertman@intel.com>
Tested-by: Tony Brelinski <tonyx.brelinski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/intel/ice/ice.h
drivers/net/ethernet/intel/ice/ice_dcb_nl.c
drivers/net/ethernet/intel/ice/ice_ethtool.c

index 54cf382..5b3f2bb 100644 (file)
@@ -444,9 +444,7 @@ struct ice_pf {
        struct ice_hw_port_stats stats_prev;
        struct ice_hw hw;
        u8 stat_prev_loaded:1; /* has previous stats been loaded */
-#ifdef CONFIG_DCB
        u16 dcbx_cap;
-#endif /* CONFIG_DCB */
        u32 tx_timeout_count;
        unsigned long tx_timeout_last_recovery;
        u32 tx_timeout_recovery_level;
index 842d44b..8c133a8 100644 (file)
@@ -160,6 +160,10 @@ static u8 ice_dcbnl_setdcbx(struct net_device *netdev, u8 mode)
 {
        struct ice_pf *pf = ice_netdev_to_pf(netdev);
 
+       /* if FW LLDP agent is running, DCBNL not allowed to change mode */
+       if (test_bit(ICE_FLAG_FW_LLDP_AGENT, pf->flags))
+               return ICE_DCB_NO_HW_CHG;
+
        /* No support for LLD_MANAGED modes or CEE+IEEE */
        if ((mode & DCB_CAP_DCBX_LLD_MANAGED) ||
            ((mode & DCB_CAP_DCBX_VER_IEEE) && (mode & DCB_CAP_DCBX_VER_CEE)) ||
index 69c113a..d27b9cb 100644 (file)
@@ -8,6 +8,7 @@
 #include "ice_fltr.h"
 #include "ice_lib.h"
 #include "ice_dcb_lib.h"
+#include <net/dcbnl.h>
 
 struct ice_stats {
        char stat_string[ETH_GSTRING_LEN];
@@ -1238,6 +1239,9 @@ static int ice_set_priv_flags(struct net_device *netdev, u32 flags)
                        status = ice_init_pf_dcb(pf, true);
                        if (status)
                                dev_warn(dev, "Fail to init DCB\n");
+
+                       pf->dcbx_cap &= ~DCB_CAP_DCBX_LLD_MANAGED;
+                       pf->dcbx_cap |= DCB_CAP_DCBX_HOST;
                } else {
                        enum ice_status status;
                        bool dcbx_agent_status;
@@ -1280,6 +1284,9 @@ static int ice_set_priv_flags(struct net_device *netdev, u32 flags)
                        if (status)
                                dev_dbg(dev, "Fail to enable MIB change events\n");
 
+                       pf->dcbx_cap &= ~DCB_CAP_DCBX_HOST;
+                       pf->dcbx_cap |= DCB_CAP_DCBX_LLD_MANAGED;
+
                        ice_nway_reset(netdev);
                }
        }