cxgb4: Add FORCE_PAUSE bit to 32 bit port caps
authorGanesh Goudar <ganeshgr@chelsio.com>
Wed, 30 May 2018 11:45:50 +0000 (17:15 +0530)
committerDavid S. Miller <davem@davemloft.net>
Thu, 31 May 2018 19:23:26 +0000 (15:23 -0400)
Add FORCE_PAUSE bit to force local pause settings instead
of using auto negotiated values.

Signed-off-by: Santosh Rastapur <santosh@chelsio.com>
Signed-off-by: Casey Leedom <leedom@chelsio.com>
Signed-off-by: Ganesh Goudar <ganeshgr@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
drivers/net/ethernet/chelsio/cxgb4/t4fw_api.h

index 39da7e3c804b79cf824ae62b30f5445f96e16ed3..974a868a4824b78dc8cb7225f37b5d2cf8b24b32 100644 (file)
@@ -3941,6 +3941,7 @@ static fw_port_cap32_t fwcaps16_to_caps32(fw_port_cap16_t caps16)
        CAP16_TO_CAP32(FC_RX);
        CAP16_TO_CAP32(FC_TX);
        CAP16_TO_CAP32(ANEG);
+       CAP16_TO_CAP32(FORCE_PAUSE);
        CAP16_TO_CAP32(MDIAUTO);
        CAP16_TO_CAP32(MDISTRAIGHT);
        CAP16_TO_CAP32(FEC_RS);
@@ -3982,6 +3983,7 @@ static fw_port_cap16_t fwcaps32_to_caps16(fw_port_cap32_t caps32)
        CAP32_TO_CAP16(802_3_PAUSE);
        CAP32_TO_CAP16(802_3_ASM_DIR);
        CAP32_TO_CAP16(ANEG);
+       CAP32_TO_CAP16(FORCE_PAUSE);
        CAP32_TO_CAP16(MDIAUTO);
        CAP32_TO_CAP16(MDISTRAIGHT);
        CAP32_TO_CAP16(FEC_RS);
@@ -4014,6 +4016,8 @@ static inline fw_port_cap32_t cc_to_fwcap_pause(enum cc_pause cc_pause)
                fw_pause |= FW_PORT_CAP32_FC_RX;
        if (cc_pause & PAUSE_TX)
                fw_pause |= FW_PORT_CAP32_FC_TX;
+       if (!(cc_pause & PAUSE_AUTONEG))
+               fw_pause |= FW_PORT_CAP32_FORCE_PAUSE;
 
        return fw_pause;
 }
@@ -4101,7 +4105,11 @@ int t4_link_l1cfg_core(struct adapter *adapter, unsigned int mbox,
                rcap = lc->acaps | fw_fc | fw_fec | fw_mdi;
        }
 
-       if (rcap & ~lc->pcaps) {
+       /* Note that older Firmware doesn't have FW_PORT_CAP32_FORCE_PAUSE, so
+        * we need to exclude this from this check in order to maintain
+        * compatibility ...
+        */
+       if ((rcap & ~lc->pcaps) & ~FW_PORT_CAP32_FORCE_PAUSE) {
                dev_err(adapter->pdev_dev,
                        "Requested Port Capabilities %#x exceed Physical Port Capabilities %#x\n",
                        rcap, lc->pcaps);
index 2d91480a5a0e6d883ad10f3c79fd525877400d0d..f1967cf6d43c4b614aba152b7e6e53d0e8b5e644 100644 (file)
@@ -2475,7 +2475,7 @@ enum fw_port_cap {
        FW_PORT_CAP_MDISTRAIGHT         = 0x0400,
        FW_PORT_CAP_FEC_RS              = 0x0800,
        FW_PORT_CAP_FEC_BASER_RS        = 0x1000,
-       FW_PORT_CAP_FEC_RESERVED        = 0x2000,
+       FW_PORT_CAP_FORCE_PAUSE         = 0x2000,
        FW_PORT_CAP_802_3_PAUSE         = 0x4000,
        FW_PORT_CAP_802_3_ASM_DIR       = 0x8000,
 };
@@ -2522,7 +2522,8 @@ enum fw_port_mdi {
 #define        FW_PORT_CAP32_FEC_RESERVED1     0x02000000UL
 #define        FW_PORT_CAP32_FEC_RESERVED2     0x04000000UL
 #define        FW_PORT_CAP32_FEC_RESERVED3     0x08000000UL
-#define        FW_PORT_CAP32_RESERVED2         0xf0000000UL
+#define FW_PORT_CAP32_FORCE_PAUSE      0x10000000UL
+#define FW_PORT_CAP32_RESERVED2                0xe0000000UL
 
 #define FW_PORT_CAP32_SPEED_S  0
 #define FW_PORT_CAP32_SPEED_M  0xfff