ice: support Total Port Shutdown on devices that support it
authorBruce Allan <bruce.w.allan@intel.com>
Thu, 9 Jul 2020 16:16:08 +0000 (09:16 -0700)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Thu, 23 Jul 2020 22:26:09 +0000 (15:26 -0700)
When the Port Disable bit is set in the Link Default Override Mask TLV PFA
module in the NVM, Total Port Shutdown mode is supported and enabled.  In
this mode, the driver should act as if the link-down-on-close ethtool
private flag is always enabled and dis-allow any change to that flag.

Signed-off-by: Bruce Allan <bruce.w.allan@intel.com>
Signed-off-by: Paul Greenwalt <paul.greenwalt@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/ice/ice.h
drivers/net/ethernet/intel/ice/ice_ethtool.c
drivers/net/ethernet/intel/ice/ice_main.c

index e67f4290fa92d20b3756d7d79f201b64c80decb7..c665220bb6379aa842f74b761d6acfe4ec50941e 100644 (file)
@@ -359,6 +359,7 @@ enum ice_pf_flags {
        ICE_FLAG_FD_ENA,
        ICE_FLAG_ADV_FEATURES,
        ICE_FLAG_LINK_DOWN_ON_CLOSE_ENA,
+       ICE_FLAG_TOTAL_PORT_SHUTDOWN_ENA,
        ICE_FLAG_NO_MEDIA,
        ICE_FLAG_FW_LLDP_AGENT,
        ICE_FLAG_ETHTOOL_CTXT,          /* set when ethtool holds RTNL lock */
index f382faaf64e390ede03d9bb101d8691c1b92b37a..60abd261b8bf7c48fd4b716b18009732ef53ff76 100644 (file)
@@ -1196,6 +1196,17 @@ static int ice_set_priv_flags(struct net_device *netdev, u32 flags)
 
        bitmap_xor(change_flags, pf->flags, orig_flags, ICE_PF_FLAGS_NBITS);
 
+       /* Do not allow change to link-down-on-close when Total Port Shutdown
+        * is enabled.
+        */
+       if (test_bit(ICE_FLAG_LINK_DOWN_ON_CLOSE_ENA, change_flags) &&
+           test_bit(ICE_FLAG_TOTAL_PORT_SHUTDOWN_ENA, pf->flags)) {
+               dev_err(dev, "Setting link-down-on-close not supported on this port\n");
+               set_bit(ICE_FLAG_LINK_DOWN_ON_CLOSE_ENA, pf->flags);
+               ret = -EINVAL;
+               goto ethtool_exit;
+       }
+
        if (test_bit(ICE_FLAG_FW_LLDP_AGENT, change_flags)) {
                if (!test_bit(ICE_FLAG_FW_LLDP_AGENT, pf->flags)) {
                        enum ice_status status;
@@ -1283,6 +1294,7 @@ static int ice_set_priv_flags(struct net_device *netdev, u32 flags)
                change_bit(ICE_FLAG_VF_TRUE_PROMISC_ENA, pf->flags);
                ret = -EAGAIN;
        }
+ethtool_exit:
        clear_bit(ICE_FLAG_ETHTOOL_CTXT, pf->flags);
        return ret;
 }
index 9580c6096e569ea754d56435fe8af1911823e384..c8c570f95b92ca79e3ce2608ef7d1229b7490c1d 100644 (file)
@@ -1446,6 +1446,8 @@ out:
 /**
  * ice_init_link_dflt_override - Initialize link default override
  * @pi: port info structure
+ *
+ * Initialize link default override and PHY total port shutdown during probe
  */
 static void ice_init_link_dflt_override(struct ice_port_info *pi)
 {
@@ -1453,7 +1455,17 @@ static void ice_init_link_dflt_override(struct ice_port_info *pi)
        struct ice_pf *pf = pi->hw->back;
 
        ldo = &pf->link_dflt_override;
-       ice_get_link_default_override(ldo, pi);
+       if (ice_get_link_default_override(ldo, pi))
+               return;
+
+       if (!(ldo->options & ICE_LINK_OVERRIDE_PORT_DIS))
+               return;
+
+       /* Enable Total Port Shutdown (override/replace link-down-on-close
+        * ethtool private flag) for ports with Port Disable bit set.
+        */
+       set_bit(ICE_FLAG_TOTAL_PORT_SHUTDOWN_ENA, pf->flags);
+       set_bit(ICE_FLAG_LINK_DOWN_ON_CLOSE_ENA, pf->flags);
 }
 
 /**