ice: Allow 100M speeds for some devices
authorAnirudh Venkataramanan <anirudh.venkataramanan@intel.com>
Fri, 12 Aug 2022 14:36:07 +0000 (16:36 +0200)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Thu, 18 Aug 2022 15:23:44 +0000 (08:23 -0700)
For certain devices, 100M speeds are supported. Do not mask off
100M speed for these devices.

Signed-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com>
Co-developed-by: Chinh T Cao <chinh.t.cao@intel.com>
Signed-off-by: Chinh T Cao <chinh.t.cao@intel.com>
Signed-off-by: Mikael Barsehyan <mikael.barsehyan@intel.com>
Tested-by: Kavya AV <kavyax.av@intel.com> (A Contingent worker at Intel)
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/ice/ice_common.c
drivers/net/ethernet/intel/ice/ice_common.h
drivers/net/ethernet/intel/ice/ice_ethtool.c

index 27d0cbbd29dad9736b527e3e83570d49095d1ba2..c8d95b299fee18fff3752a777cf3e6a3adcbc1ba 100644 (file)
@@ -2775,6 +2775,26 @@ ice_aq_set_port_params(struct ice_port_info *pi, bool double_vlan,
        return ice_aq_send_cmd(hw, &desc, NULL, 0, cd);
 }
 
+/**
+ * ice_is_100m_speed_supported
+ * @hw: pointer to the HW struct
+ *
+ * returns true if 100M speeds are supported by the device,
+ * false otherwise.
+ */
+bool ice_is_100m_speed_supported(struct ice_hw *hw)
+{
+       switch (hw->device_id) {
+       case ICE_DEV_ID_E822C_SGMII:
+       case ICE_DEV_ID_E822L_SGMII:
+       case ICE_DEV_ID_E823L_1GBE:
+       case ICE_DEV_ID_E823C_SGMII:
+               return true;
+       default:
+               return false;
+       }
+}
+
 /**
  * ice_get_link_speed_based_on_phy_type - returns link speed
  * @phy_type_low: lower part of phy_type
index 61b7c60db689151d0a75d01d7cf6eb691bfd3123..d08f7f9ea8b7bbf2a91a2040029c3d5995011981 100644 (file)
@@ -204,6 +204,7 @@ ice_aq_set_gpio(struct ice_hw *hw, u16 gpio_ctrl_handle, u8 pin_idx, bool value,
 int
 ice_aq_get_gpio(struct ice_hw *hw, u16 gpio_ctrl_handle, u8 pin_idx,
                bool *value, struct ice_sq_cd *cd);
+bool ice_is_100m_speed_supported(struct ice_hw *hw);
 int
 ice_aq_set_lldp_mib(struct ice_hw *hw, u8 mib_type, void *buf, u16 buf_size,
                    struct ice_sq_cd *cd);
index ad6cffb2d3e011923036fc5a176194af699044bc..b7be84bbe72d666b4844f372496aeec47ba079ae 100644 (file)
@@ -1470,20 +1470,22 @@ ice_get_ethtool_stats(struct net_device *netdev,
 
 /**
  * ice_mask_min_supported_speeds
+ * @hw: pointer to the HW structure
  * @phy_types_high: PHY type high
  * @phy_types_low: PHY type low to apply minimum supported speeds mask
  *
  * Apply minimum supported speeds mask to PHY type low. These are the speeds
  * for ethtool supported link mode.
  */
-static
-void ice_mask_min_supported_speeds(u64 phy_types_high, u64 *phy_types_low)
+static void
+ice_mask_min_supported_speeds(struct ice_hw *hw,
+                             u64 phy_types_high, u64 *phy_types_low)
 {
        /* if QSFP connection with 100G speed, minimum supported speed is 25G */
        if (*phy_types_low & ICE_PHY_TYPE_LOW_MASK_100G ||
            phy_types_high & ICE_PHY_TYPE_HIGH_MASK_100G)
                *phy_types_low &= ~ICE_PHY_TYPE_LOW_MASK_MIN_25G;
-       else
+       else if (!ice_is_100m_speed_supported(hw))
                *phy_types_low &= ~ICE_PHY_TYPE_LOW_MASK_MIN_1G;
 }
 
@@ -1533,7 +1535,8 @@ ice_phy_type_to_ethtool(struct net_device *netdev,
                phy_types_low = le64_to_cpu(pf->nvm_phy_type_lo);
                phy_types_high = le64_to_cpu(pf->nvm_phy_type_hi);
 
-               ice_mask_min_supported_speeds(phy_types_high, &phy_types_low);
+               ice_mask_min_supported_speeds(&pf->hw, phy_types_high,
+                                             &phy_types_low);
                /* determine advertised modes based on link override only
                 * if it's supported and if the FW doesn't abstract the
                 * driver from having to account for link overrides