]> www.infradead.org Git - users/hch/dma-mapping.git/commitdiff
bnxt_en: Properly report no pause support on some cards
authorMichael Chan <michael.chan@broadcom.com>
Sat, 5 Mar 2022 08:54:38 +0000 (03:54 -0500)
committerDavid S. Miller <davem@davemloft.net>
Sat, 5 Mar 2022 11:16:56 +0000 (11:16 +0000)
Some cards are configured to never support link pause or PFC.  Discover
these cards and properly report no pause support to ethtool.  Disable
PFC settings from DCBNL if PFC is unsupported.

Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_dcb.c
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index 1ed71b6fed8a4d915a8d9db04b40e3b98a544a9c..2280b189f3d67c7b14305a80aff6df37ef05bb5e 100644 (file)
@@ -9416,7 +9416,7 @@ static int bnxt_hwrm_phy_qcaps(struct bnxt *bp)
        if (rc)
                goto hwrm_phy_qcaps_exit;
 
-       bp->phy_flags = resp->flags;
+       bp->phy_flags = resp->flags | (le16_to_cpu(resp->flags2) << 8);
        if (resp->flags & PORT_PHY_QCAPS_RESP_FLAGS_EEE_SUPPORTED) {
                struct ethtool_eee *eee = &bp->eee;
                u16 fw_speeds = le16_to_cpu(resp->supported_speeds_eee_mode);
index 5d743976cb35c0079f557c9100755c1976f833dc..447a9406b8a27137ef97214506fefa45abd3f54e 100644 (file)
@@ -2104,8 +2104,8 @@ struct bnxt {
        u32                     lpi_tmr_lo;
        u32                     lpi_tmr_hi;
 
-       /* copied from flags in hwrm_port_phy_qcaps_output */
-       u                     phy_flags;
+       /* copied from flags and flags2 in hwrm_port_phy_qcaps_output */
+       u32                     phy_flags;
 #define BNXT_PHY_FL_EEE_CAP            PORT_PHY_QCAPS_RESP_FLAGS_EEE_SUPPORTED
 #define BNXT_PHY_FL_EXT_LPBK           PORT_PHY_QCAPS_RESP_FLAGS_EXTERNAL_LPBK_SUPPORTED
 #define BNXT_PHY_FL_AN_PHY_LPBK                PORT_PHY_QCAPS_RESP_FLAGS_AUTONEG_LPBK_SUPPORTED
@@ -2114,6 +2114,8 @@ struct bnxt {
 #define BNXT_PHY_FL_NO_PHY_LPBK                PORT_PHY_QCAPS_RESP_FLAGS_LOCAL_LPBK_NOT_SUPPORTED
 #define BNXT_PHY_FL_FW_MANAGED_LKDN    PORT_PHY_QCAPS_RESP_FLAGS_FW_MANAGED_LINK_DOWN
 #define BNXT_PHY_FL_NO_FCS             PORT_PHY_QCAPS_RESP_FLAGS_NO_FCS
+#define BNXT_PHY_FL_NO_PAUSE           (PORT_PHY_QCAPS_RESP_FLAGS2_PAUSE_UNSUPPORTED << 8)
+#define BNXT_PHY_FL_NO_PFC             (PORT_PHY_QCAPS_RESP_FLAGS2_PFC_UNSUPPORTED << 8)
 
        u8                      num_tests;
        struct bnxt_test_info   *test_info;
index 217ff597cdf2fbc679722a73730f6a5c098bd4a9..caab3d626a2a92a065e586f050a27442b66bea60 100644 (file)
@@ -627,7 +627,8 @@ static int bnxt_dcbnl_ieee_setpfc(struct net_device *dev, struct ieee_pfc *pfc)
        int rc;
 
        if (!(bp->dcbx_cap & DCB_CAP_DCBX_VER_IEEE) ||
-           !(bp->dcbx_cap & DCB_CAP_DCBX_HOST))
+           !(bp->dcbx_cap & DCB_CAP_DCBX_HOST) ||
+           (bp->phy_flags & BNXT_PHY_FL_NO_PAUSE))
                return -EINVAL;
 
        if (!my_pfc) {
index 519edad70f162f74d72519a94988fee6becf97a5..7cc69957e529eff594370d9023c82b19f337b85b 100644 (file)
@@ -1662,15 +1662,19 @@ static void bnxt_fw_to_ethtool_support_fec(struct bnxt_link_info *link_info,
 static void bnxt_fw_to_ethtool_support_spds(struct bnxt_link_info *link_info,
                                struct ethtool_link_ksettings *lk_ksettings)
 {
+       struct bnxt *bp = container_of(link_info, struct bnxt, link_info);
        u16 fw_speeds = link_info->support_speeds;
 
        BNXT_FW_TO_ETHTOOL_SPDS(fw_speeds, 0, lk_ksettings, supported);
        fw_speeds = link_info->support_pam4_speeds;
        BNXT_FW_TO_ETHTOOL_PAM4_SPDS(fw_speeds, lk_ksettings, supported);
 
-       ethtool_link_ksettings_add_link_mode(lk_ksettings, supported, Pause);
-       ethtool_link_ksettings_add_link_mode(lk_ksettings, supported,
-                                            Asym_Pause);
+       if (!(bp->phy_flags & BNXT_PHY_FL_NO_PAUSE)) {
+               ethtool_link_ksettings_add_link_mode(lk_ksettings, supported,
+                                                    Pause);
+               ethtool_link_ksettings_add_link_mode(lk_ksettings, supported,
+                                                    Asym_Pause);
+       }
 
        if (link_info->support_auto_speeds ||
            link_info->support_pam4_auto_speeds)
@@ -1901,7 +1905,8 @@ static int bnxt_set_link_ksettings(struct net_device *dev,
                /* any change to autoneg will cause link change, therefore the
                 * driver should put back the original pause setting in autoneg
                 */
-               set_pause = true;
+               if (!(bp->phy_flags & BNXT_PHY_FL_NO_PAUSE))
+                       set_pause = true;
        } else {
                u8 phy_type = link_info->phy_type;
 
@@ -2093,7 +2098,7 @@ static int bnxt_set_pauseparam(struct net_device *dev,
        struct bnxt *bp = netdev_priv(dev);
        struct bnxt_link_info *link_info = &bp->link_info;
 
-       if (!BNXT_PHY_CFG_ABLE(bp))
+       if (!BNXT_PHY_CFG_ABLE(bp) || (bp->phy_flags & BNXT_PHY_FL_NO_PAUSE))
                return -EOPNOTSUPP;
 
        mutex_lock(&bp->link_lock);