Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[firefly-linux-kernel-4.4.55.git] / drivers / net / ethernet / broadcom / bnx2x / bnx2x_link.c
index 77ebae0ac64aa9a4e681a506129c5a835d85ef4e..40f58d73de78ae297f38fe7397d3cc35eaf7a28e 100644 (file)
 #include "bnx2x.h"
 #include "bnx2x_cmn.h"
 
+typedef int (*read_sfp_module_eeprom_func_p)(struct bnx2x_phy *phy,
+                                            struct link_params *params,
+                                            u8 dev_addr, u16 addr, u8 byte_cnt,
+                                            u8 *o_buf, u8);
 /********************************************************/
 #define ETH_HLEN                       14
 /* L2 header size + 2*VLANs (8 bytes) + LLC SNAP (8 bytes) */
 #define SFP_EEPROM_CON_TYPE_ADDR               0x2
        #define SFP_EEPROM_CON_TYPE_VAL_LC      0x7
        #define SFP_EEPROM_CON_TYPE_VAL_COPPER  0x21
+       #define SFP_EEPROM_CON_TYPE_VAL_RJ45    0x22
 
 
 #define SFP_EEPROM_COMP_CODE_ADDR              0x3
@@ -3127,11 +3132,6 @@ static int bnx2x_bsc_read(struct link_params *params,
        int rc = 0;
        struct bnx2x *bp = params->bp;
 
-       if ((sl_devid != 0xa0) && (sl_devid != 0xa2)) {
-               DP(NETIF_MSG_LINK, "invalid sl_devid 0x%x\n", sl_devid);
-               return -EINVAL;
-       }
-
        if (xfer_cnt > 16) {
                DP(NETIF_MSG_LINK, "invalid xfer_cnt %d. Max is 16 bytes\n",
                                        xfer_cnt);
@@ -3629,6 +3629,16 @@ static u8 bnx2x_ext_phy_resolve_fc(struct bnx2x_phy *phy,
  * init configuration, and set/clear SGMII flag. Internal
  * phy init is done purely in phy_init stage.
  */
+#define WC_TX_DRIVER(post2, idriver, ipre) \
+       ((post2 << MDIO_WC_REG_TX0_TX_DRIVER_POST2_COEFF_OFFSET) | \
+        (idriver << MDIO_WC_REG_TX0_TX_DRIVER_IDRIVER_OFFSET) | \
+        (ipre << MDIO_WC_REG_TX0_TX_DRIVER_IPRE_DRIVER_OFFSET))
+
+#define WC_TX_FIR(post, main, pre) \
+       ((post << MDIO_WC_REG_TX_FIR_TAP_POST_TAP_OFFSET) | \
+        (main << MDIO_WC_REG_TX_FIR_TAP_MAIN_TAP_OFFSET) | \
+        (pre << MDIO_WC_REG_TX_FIR_TAP_PRE_TAP_OFFSET))
+
 static void bnx2x_warpcore_enable_AN_KR2(struct bnx2x_phy *phy,
                                         struct link_params *params,
                                         struct link_vars *vars)
@@ -3728,7 +3738,7 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,
        if (((vars->line_speed == SPEED_AUTO_NEG) &&
             (phy->speed_cap_mask & PORT_HW_CFG_SPEED_CAPABILITY_D0_1G)) ||
            (vars->line_speed == SPEED_1000)) {
-               u32 addr = MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2;
+               u16 addr = MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2;
                an_adv |= (1<<5);
 
                /* Enable CL37 1G Parallel Detect */
@@ -3753,20 +3763,13 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,
        /* Set Transmit PMD settings */
        lane = bnx2x_get_warpcore_lane(phy, params);
        bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
-                     MDIO_WC_REG_TX0_TX_DRIVER + 0x10*lane,
-                    ((0x02 << MDIO_WC_REG_TX0_TX_DRIVER_POST2_COEFF_OFFSET) |
-                     (0x06 << MDIO_WC_REG_TX0_TX_DRIVER_IDRIVER_OFFSET) |
-                     (0x09 << MDIO_WC_REG_TX0_TX_DRIVER_IPRE_DRIVER_OFFSET)));
+                        MDIO_WC_REG_TX0_TX_DRIVER + 0x10*lane,
+                        WC_TX_DRIVER(0x02, 0x06, 0x09));
        /* Configure the next lane if dual mode */
        if (phy->flags & FLAGS_WC_DUAL_MODE)
                bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
                                 MDIO_WC_REG_TX0_TX_DRIVER + 0x10*(lane+1),
-                                ((0x02 <<
-                                MDIO_WC_REG_TX0_TX_DRIVER_POST2_COEFF_OFFSET) |
-                                 (0x06 <<
-                                  MDIO_WC_REG_TX0_TX_DRIVER_IDRIVER_OFFSET) |
-                                 (0x09 <<
-                               MDIO_WC_REG_TX0_TX_DRIVER_IPRE_DRIVER_OFFSET)));
+                                WC_TX_DRIVER(0x02, 0x06, 0x09));
        bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
                         MDIO_WC_REG_CL72_USERB0_CL72_OS_DEF_CTRL,
                         0x03f0);
@@ -3909,6 +3912,8 @@ static void bnx2x_warpcore_set_10G_XFI(struct bnx2x_phy *phy,
 {
        struct bnx2x *bp = params->bp;
        u16 misc1_val, tap_val, tx_driver_val, lane, val;
+       u32 cfg_tap_val, tx_drv_brdct, tx_equal;
+
        /* Hold rxSeqStart */
        bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD,
                                 MDIO_WC_REG_DSC2B0_DSC_MISC_CTRL0, 0x8000);
@@ -3952,23 +3957,33 @@ static void bnx2x_warpcore_set_10G_XFI(struct bnx2x_phy *phy,
 
        if (is_xfi) {
                misc1_val |= 0x5;
-               tap_val = ((0x08 << MDIO_WC_REG_TX_FIR_TAP_POST_TAP_OFFSET) |
-                          (0x37 << MDIO_WC_REG_TX_FIR_TAP_MAIN_TAP_OFFSET) |
-                          (0x00 << MDIO_WC_REG_TX_FIR_TAP_PRE_TAP_OFFSET));
-               tx_driver_val =
-                     ((0x00 << MDIO_WC_REG_TX0_TX_DRIVER_POST2_COEFF_OFFSET) |
-                      (0x02 << MDIO_WC_REG_TX0_TX_DRIVER_IDRIVER_OFFSET) |
-                      (0x03 << MDIO_WC_REG_TX0_TX_DRIVER_IPRE_DRIVER_OFFSET));
-
+               tap_val = WC_TX_FIR(0x08, 0x37, 0x00);
+               tx_driver_val = WC_TX_DRIVER(0x00, 0x02, 0x03);
        } else {
+               cfg_tap_val = REG_RD(bp, params->shmem_base +
+                                    offsetof(struct shmem_region, dev_info.
+                                             port_hw_config[params->port].
+                                             sfi_tap_values));
+
+               tx_equal = cfg_tap_val & PORT_HW_CFG_TX_EQUALIZATION_MASK;
+
+               tx_drv_brdct = (cfg_tap_val &
+                               PORT_HW_CFG_TX_DRV_BROADCAST_MASK) >>
+                              PORT_HW_CFG_TX_DRV_BROADCAST_SHIFT;
+
                misc1_val |= 0x9;
-               tap_val = ((0x0f << MDIO_WC_REG_TX_FIR_TAP_POST_TAP_OFFSET) |
-                          (0x2b << MDIO_WC_REG_TX_FIR_TAP_MAIN_TAP_OFFSET) |
-                          (0x02 << MDIO_WC_REG_TX_FIR_TAP_PRE_TAP_OFFSET));
-               tx_driver_val =
-                     ((0x03 << MDIO_WC_REG_TX0_TX_DRIVER_POST2_COEFF_OFFSET) |
-                      (0x02 << MDIO_WC_REG_TX0_TX_DRIVER_IDRIVER_OFFSET) |
-                      (0x06 << MDIO_WC_REG_TX0_TX_DRIVER_IPRE_DRIVER_OFFSET));
+
+               /* TAP values are controlled by nvram, if value there isn't 0 */
+               if (tx_equal)
+                       tap_val = (u16)tx_equal;
+               else
+                       tap_val = WC_TX_FIR(0x0f, 0x2b, 0x02);
+
+               if (tx_drv_brdct)
+                       tx_driver_val = WC_TX_DRIVER(0x03, (u16)tx_drv_brdct,
+                                                    0x06);
+               else
+                       tx_driver_val = WC_TX_DRIVER(0x03, 0x02, 0x06);
        }
        bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
                         MDIO_WC_REG_SERDESDIGITAL_MISC1, misc1_val);
@@ -4105,15 +4120,11 @@ static void bnx2x_warpcore_set_20G_DXGXS(struct bnx2x *bp,
        /* Set Transmit PMD settings */
        bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
                         MDIO_WC_REG_TX_FIR_TAP,
-                       ((0x12 << MDIO_WC_REG_TX_FIR_TAP_POST_TAP_OFFSET) |
-                        (0x2d << MDIO_WC_REG_TX_FIR_TAP_MAIN_TAP_OFFSET) |
-                        (0x00 << MDIO_WC_REG_TX_FIR_TAP_PRE_TAP_OFFSET) |
-                        MDIO_WC_REG_TX_FIR_TAP_ENABLE));
+                        (WC_TX_FIR(0x12, 0x2d, 0x00) |
+                         MDIO_WC_REG_TX_FIR_TAP_ENABLE));
        bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
-                     MDIO_WC_REG_TX0_TX_DRIVER + 0x10*lane,
-                    ((0x02 << MDIO_WC_REG_TX0_TX_DRIVER_POST2_COEFF_OFFSET) |
-                     (0x02 << MDIO_WC_REG_TX0_TX_DRIVER_IDRIVER_OFFSET) |
-                     (0x02 << MDIO_WC_REG_TX0_TX_DRIVER_IPRE_DRIVER_OFFSET)));
+                        MDIO_WC_REG_TX0_TX_DRIVER + 0x10*lane,
+                        WC_TX_DRIVER(0x02, 0x02, 0x02));
 }
 
 static void bnx2x_warpcore_set_sgmii_speed(struct bnx2x_phy *phy,
@@ -4750,8 +4761,8 @@ void bnx2x_link_status_update(struct link_params *params,
                                            port_mb[port].link_status));
 
        /* Force link UP in non LOOPBACK_EXT loopback mode(s) */
-       if (bp->link_params.loopback_mode != LOOPBACK_NONE &&
-           bp->link_params.loopback_mode != LOOPBACK_EXT)
+       if (params->loopback_mode != LOOPBACK_NONE &&
+           params->loopback_mode != LOOPBACK_EXT)
                vars->link_status |= LINK_STATUS_LINK_UP;
 
        if (bnx2x_eee_has_cap(params))
@@ -7758,7 +7769,8 @@ static void bnx2x_sfp_set_transmitter(struct link_params *params,
 
 static int bnx2x_8726_read_sfp_module_eeprom(struct bnx2x_phy *phy,
                                             struct link_params *params,
-                                            u16 addr, u8 byte_cnt, u8 *o_buf)
+                                            u8 dev_addr, u16 addr, u8 byte_cnt,
+                                            u8 *o_buf, u8 is_init)
 {
        struct bnx2x *bp = params->bp;
        u16 val = 0;
@@ -7771,7 +7783,7 @@ static int bnx2x_8726_read_sfp_module_eeprom(struct bnx2x_phy *phy,
        /* Set the read command byte count */
        bnx2x_cl45_write(bp, phy,
                         MDIO_PMA_DEVAD, MDIO_PMA_REG_SFP_TWO_WIRE_BYTE_CNT,
-                        (byte_cnt | 0xa000));
+                        (byte_cnt | (dev_addr << 8)));
 
        /* Set the read command address */
        bnx2x_cl45_write(bp, phy,
@@ -7845,6 +7857,7 @@ static void bnx2x_warpcore_power_module(struct link_params *params,
 }
 static int bnx2x_warpcore_read_sfp_module_eeprom(struct bnx2x_phy *phy,
                                                 struct link_params *params,
+                                                u8 dev_addr,
                                                 u16 addr, u8 byte_cnt,
                                                 u8 *o_buf, u8 is_init)
 {
@@ -7869,7 +7882,7 @@ static int bnx2x_warpcore_read_sfp_module_eeprom(struct bnx2x_phy *phy,
                        usleep_range(1000, 2000);
                        bnx2x_warpcore_power_module(params, 1);
                }
-               rc = bnx2x_bsc_read(params, phy, 0xa0, addr32, 0, byte_cnt,
+               rc = bnx2x_bsc_read(params, phy, dev_addr, addr32, 0, byte_cnt,
                                    data_array);
        } while ((rc != 0) && (++cnt < I2C_WA_RETRY_CNT));
 
@@ -7885,7 +7898,8 @@ static int bnx2x_warpcore_read_sfp_module_eeprom(struct bnx2x_phy *phy,
 
 static int bnx2x_8727_read_sfp_module_eeprom(struct bnx2x_phy *phy,
                                             struct link_params *params,
-                                            u16 addr, u8 byte_cnt, u8 *o_buf)
+                                            u8 dev_addr, u16 addr, u8 byte_cnt,
+                                            u8 *o_buf, u8 is_init)
 {
        struct bnx2x *bp = params->bp;
        u16 val, i;
@@ -7896,6 +7910,15 @@ static int bnx2x_8727_read_sfp_module_eeprom(struct bnx2x_phy *phy,
                return -EINVAL;
        }
 
+       /* Set 2-wire transfer rate of SFP+ module EEPROM
+        * to 100Khz since some DACs(direct attached cables) do
+        * not work at 400Khz.
+        */
+       bnx2x_cl45_write(bp, phy,
+                        MDIO_PMA_DEVAD,
+                        MDIO_PMA_REG_8727_TWO_WIRE_SLAVE_ADDR,
+                        ((dev_addr << 8) | 1));
+
        /* Need to read from 1.8000 to clear it */
        bnx2x_cl45_read(bp, phy,
                        MDIO_PMA_DEVAD,
@@ -7968,26 +7991,44 @@ static int bnx2x_8727_read_sfp_module_eeprom(struct bnx2x_phy *phy,
 
        return -EINVAL;
 }
-
 int bnx2x_read_sfp_module_eeprom(struct bnx2x_phy *phy,
-                                struct link_params *params, u16 addr,
-                                u8 byte_cnt, u8 *o_buf)
+                                struct link_params *params, u8 dev_addr,
+                                u16 addr, u16 byte_cnt, u8 *o_buf)
 {
-       int rc = -EOPNOTSUPP;
+       int rc = 0;
+       struct bnx2x *bp = params->bp;
+       u8 xfer_size;
+       u8 *user_data = o_buf;
+       read_sfp_module_eeprom_func_p read_func;
+
+       if ((dev_addr != 0xa0) && (dev_addr != 0xa2)) {
+               DP(NETIF_MSG_LINK, "invalid dev_addr 0x%x\n", dev_addr);
+               return -EINVAL;
+       }
+
        switch (phy->type) {
        case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726:
-               rc = bnx2x_8726_read_sfp_module_eeprom(phy, params, addr,
-                                                      byte_cnt, o_buf);
-       break;
+               read_func = bnx2x_8726_read_sfp_module_eeprom;
+               break;
        case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727:
        case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8722:
-               rc = bnx2x_8727_read_sfp_module_eeprom(phy, params, addr,
-                                                      byte_cnt, o_buf);
-       break;
+               read_func = bnx2x_8727_read_sfp_module_eeprom;
+               break;
        case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT:
-               rc = bnx2x_warpcore_read_sfp_module_eeprom(phy, params, addr,
-                                                          byte_cnt, o_buf, 0);
-       break;
+               read_func = bnx2x_warpcore_read_sfp_module_eeprom;
+               break;
+       default:
+               return -EOPNOTSUPP;
+       }
+
+       while (!rc && (byte_cnt > 0)) {
+               xfer_size = (byte_cnt > SFP_EEPROM_PAGE_SIZE) ?
+                       SFP_EEPROM_PAGE_SIZE : byte_cnt;
+               rc = read_func(phy, params, dev_addr, addr, xfer_size,
+                              user_data, 0);
+               byte_cnt -= xfer_size;
+               user_data += xfer_size;
+               addr += xfer_size;
        }
        return rc;
 }
@@ -8004,6 +8045,7 @@ static int bnx2x_get_edc_mode(struct bnx2x_phy *phy,
        /* First check for copper cable */
        if (bnx2x_read_sfp_module_eeprom(phy,
                                         params,
+                                        I2C_DEV_ADDR_A0,
                                         SFP_EEPROM_CON_TYPE_ADDR,
                                         2,
                                         (u8 *)val) != 0) {
@@ -8021,6 +8063,7 @@ static int bnx2x_get_edc_mode(struct bnx2x_phy *phy,
                 */
                if (bnx2x_read_sfp_module_eeprom(phy,
                                               params,
+                                              I2C_DEV_ADDR_A0,
                                               SFP_EEPROM_FC_TX_TECH_ADDR,
                                               1,
                                               &copper_module_type) != 0) {
@@ -8049,20 +8092,24 @@ static int bnx2x_get_edc_mode(struct bnx2x_phy *phy,
                break;
        }
        case SFP_EEPROM_CON_TYPE_VAL_LC:
+       case SFP_EEPROM_CON_TYPE_VAL_RJ45:
                check_limiting_mode = 1;
                if ((val[1] & (SFP_EEPROM_COMP_CODE_SR_MASK |
                               SFP_EEPROM_COMP_CODE_LR_MASK |
                               SFP_EEPROM_COMP_CODE_LRM_MASK)) == 0) {
-                       DP(NETIF_MSG_LINK, "1G Optic module detected\n");
+                       DP(NETIF_MSG_LINK, "1G SFP module detected\n");
                        gport = params->port;
                        phy->media_type = ETH_PHY_SFP_1G_FIBER;
-                       phy->req_line_speed = SPEED_1000;
-                       if (!CHIP_IS_E1x(bp))
-                               gport = BP_PATH(bp) + (params->port << 1);
-                       netdev_err(bp->dev, "Warning: Link speed was forced to 1000Mbps."
-                             " Current SFP module in port %d is not"
-                             " compliant with 10G Ethernet\n",
-                        gport);
+                       if (phy->req_line_speed != SPEED_1000) {
+                               phy->req_line_speed = SPEED_1000;
+                               if (!CHIP_IS_E1x(bp)) {
+                                       gport = BP_PATH(bp) +
+                                       (params->port << 1);
+                               }
+                               netdev_err(bp->dev,
+                                          "Warning: Link speed was forced to 1000Mbps. Current SFP module in port %d is not compliant with 10G Ethernet\n",
+                                          gport);
+                       }
                } else {
                        int idx, cfg_idx = 0;
                        DP(NETIF_MSG_LINK, "10G Optic module detected\n");
@@ -8101,6 +8148,7 @@ static int bnx2x_get_edc_mode(struct bnx2x_phy *phy,
                u8 options[SFP_EEPROM_OPTIONS_SIZE];
                if (bnx2x_read_sfp_module_eeprom(phy,
                                                 params,
+                                                I2C_DEV_ADDR_A0,
                                                 SFP_EEPROM_OPTIONS_ADDR,
                                                 SFP_EEPROM_OPTIONS_SIZE,
                                                 options) != 0) {
@@ -8167,6 +8215,7 @@ static int bnx2x_verify_sfp_module(struct bnx2x_phy *phy,
        /* Format the warning message */
        if (bnx2x_read_sfp_module_eeprom(phy,
                                         params,
+                                        I2C_DEV_ADDR_A0,
                                         SFP_EEPROM_VENDOR_NAME_ADDR,
                                         SFP_EEPROM_VENDOR_NAME_SIZE,
                                         (u8 *)vendor_name))
@@ -8175,6 +8224,7 @@ static int bnx2x_verify_sfp_module(struct bnx2x_phy *phy,
                vendor_name[SFP_EEPROM_VENDOR_NAME_SIZE] = '\0';
        if (bnx2x_read_sfp_module_eeprom(phy,
                                         params,
+                                        I2C_DEV_ADDR_A0,
                                         SFP_EEPROM_PART_NO_ADDR,
                                         SFP_EEPROM_PART_NO_SIZE,
                                         (u8 *)vendor_pn))
@@ -8205,12 +8255,13 @@ static int bnx2x_wait_for_sfp_module_initialized(struct bnx2x_phy *phy,
 
        for (timeout = 0; timeout < 60; timeout++) {
                if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT)
-                       rc = bnx2x_warpcore_read_sfp_module_eeprom(phy,
-                                                                  params, 1,
-                                                                  1, &val, 1);
+                       rc = bnx2x_warpcore_read_sfp_module_eeprom(
+                               phy, params, I2C_DEV_ADDR_A0, 1, 1, &val,
+                               1);
                else
-                       rc = bnx2x_read_sfp_module_eeprom(phy, params, 1, 1,
-                                                         &val);
+                       rc = bnx2x_read_sfp_module_eeprom(phy, params,
+                                                         I2C_DEV_ADDR_A0,
+                                                         1, 1, &val);
                if (rc == 0) {
                        DP(NETIF_MSG_LINK,
                           "SFP+ module initialization took %d ms\n",
@@ -8219,7 +8270,8 @@ static int bnx2x_wait_for_sfp_module_initialized(struct bnx2x_phy *phy,
                }
                usleep_range(5000, 10000);
        }
-       rc = bnx2x_read_sfp_module_eeprom(phy, params, 1, 1, &val);
+       rc = bnx2x_read_sfp_module_eeprom(phy, params, I2C_DEV_ADDR_A0,
+                                         1, 1, &val);
        return rc;
 }
 
@@ -8376,15 +8428,6 @@ static void bnx2x_8727_specific_func(struct bnx2x_phy *phy,
                bnx2x_cl45_write(bp, phy,
                                 MDIO_PMA_DEVAD, MDIO_PMA_REG_8727_PCS_OPT_CTRL,
                                 val);
-
-               /* Set 2-wire transfer rate of SFP+ module EEPROM
-                * to 100Khz since some DACs(direct attached cables) do
-                * not work at 400Khz.
-                */
-               bnx2x_cl45_write(bp, phy,
-                                MDIO_PMA_DEVAD,
-                                MDIO_PMA_REG_8727_TWO_WIRE_SLAVE_ADDR,
-                                0xa001);
                break;
        default:
                DP(NETIF_MSG_LINK, "Function 0x%x not supported by 8727\n",
@@ -9528,8 +9571,7 @@ static void bnx2x_save_848xx_spirom_version(struct bnx2x_phy *phy,
        } else {
                /* For 32-bit registers in 848xx, access via MDIO2ARM i/f. */
                /* (1) set reg 0xc200_0014(SPI_BRIDGE_CTRL_2) to 0x03000000 */
-               for (i = 0; i < ARRAY_SIZE(reg_set);
-                     i++)
+               for (i = 0; i < ARRAY_SIZE(reg_set); i++)
                        bnx2x_cl45_write(bp, phy, reg_set[i].devad,
                                         reg_set[i].reg, reg_set[i].val);
 
@@ -10281,7 +10323,8 @@ static u8 bnx2x_848xx_read_status(struct bnx2x_phy *phy,
                                LINK_STATUS_LINK_PARTNER_10GXFD_CAPABLE;
 
                /* Determine if EEE was negotiated */
-               if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833)
+               if ((phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) ||
+                   (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84834))
                        bnx2x_eee_an_resolve(phy, params, vars);
        }
 
@@ -12242,7 +12285,7 @@ static void bnx2x_init_bmac_loopback(struct link_params *params,
 
                bnx2x_xgxs_deassert(params);
 
-               /* set bmac loopback */
+               /* Set bmac loopback */
                bnx2x_bmac_enable(params, vars, 1, 1);
 
                REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0);
@@ -12261,7 +12304,7 @@ static void bnx2x_init_emac_loopback(struct link_params *params,
                vars->phy_flags = PHY_XGXS_FLAG;
 
                bnx2x_xgxs_deassert(params);
-               /* set bmac loopback */
+               /* Set bmac loopback */
                bnx2x_emac_enable(params, vars, 1);
                bnx2x_emac_program(params, vars);
                REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0);
@@ -12521,6 +12564,7 @@ int bnx2x_phy_init(struct link_params *params, struct link_vars *vars)
                   params->req_line_speed[0], params->req_flow_ctrl[0]);
        DP(NETIF_MSG_LINK, "(2) req_speed %d, req_flowctrl %d\n",
                   params->req_line_speed[1], params->req_flow_ctrl[1]);
+       DP(NETIF_MSG_LINK, "req_adv_flow_ctrl 0x%x\n", params->req_fc_auto_adv);
        vars->link_status = 0;
        vars->phy_link_up = 0;
        vars->link_up = 0;
@@ -13437,23 +13481,27 @@ static void bnx2x_check_kr2_wa(struct link_params *params,
 {
        struct bnx2x *bp = params->bp;
        u16 base_page, next_page, not_kr2_device, lane;
-       int sigdet = bnx2x_warpcore_get_sigdet(phy, params);
-
-       if (!sigdet) {
-               if (!(vars->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE))
-                       bnx2x_kr2_recovery(params, vars, phy);
-               return;
-       }
+       int sigdet;
 
        /* Once KR2 was disabled, wait 5 seconds before checking KR2 recovery
-        * since some switches tend to reinit the AN process and clear the
-        * advertised BP/NP after ~2 seconds causing the KR2 to be disabled
+        * Since some switches tend to reinit the AN process and clear the
+        * the advertised BP/NP after ~2 seconds causing the KR2 to be disabled
         * and recovered many times
         */
        if (vars->check_kr2_recovery_cnt > 0) {
                vars->check_kr2_recovery_cnt--;
                return;
        }
+
+       sigdet = bnx2x_warpcore_get_sigdet(phy, params);
+       if (!sigdet) {
+               if (!(vars->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) {
+                       bnx2x_kr2_recovery(params, vars, phy);
+                       DP(NETIF_MSG_LINK, "No sigdet\n");
+               }
+               return;
+       }
+
        lane = bnx2x_get_warpcore_lane(phy, params);
        CL22_WR_OVER_CL45(bp, phy, MDIO_REG_BANK_AER_BLOCK,
                          MDIO_AER_BLOCK_AER_REG, lane);
@@ -13465,8 +13513,10 @@ static void bnx2x_check_kr2_wa(struct link_params *params,
 
        /* CL73 has not begun yet */
        if (base_page == 0) {
-               if (!(vars->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE))
+               if (!(vars->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) {
                        bnx2x_kr2_recovery(params, vars, phy);
+                       DP(NETIF_MSG_LINK, "No BP\n");
+               }
                return;
        }
 
@@ -13482,7 +13532,7 @@ static void bnx2x_check_kr2_wa(struct link_params *params,
        if (!(vars->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) {
                if (!not_kr2_device) {
                        DP(NETIF_MSG_LINK, "BP=0x%x, NP=0x%x\n", base_page,
-                                      next_page);
+                          next_page);
                        bnx2x_kr2_recovery(params, vars, phy);
                }
                return;