Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland...
[safe/jmp/linux-2.6] / drivers / net / bnx2x_link.c
index 4c16a46..32e79c3 100644 (file)
@@ -14,6 +14,8 @@
  *
  */
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/pci.h>
@@ -1930,6 +1932,8 @@ static u8 bnx2x_link_settings_status(struct link_params *params,
                    (XGXS_EXT_PHY_TYPE(params->ext_phy_config) ==
                     PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8705) ||
                    (XGXS_EXT_PHY_TYPE(params->ext_phy_config) ==
+                    PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8706) ||
+                   (XGXS_EXT_PHY_TYPE(params->ext_phy_config) ==
                     PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726))) {
                        vars->autoneg = AUTO_NEG_ENABLED;
 
@@ -2198,6 +2202,8 @@ static void bnx2x_ext_phy_reset(struct link_params *params,
                                       MDIO_PMA_REG_CTRL,
                                       1<<15);
                        break;
+               case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84823:
+                       break;
                case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_FAILURE:
                        DP(NETIF_MSG_LINK, "XGXS PHY Failure detected\n");
                        break;
@@ -2588,16 +2594,11 @@ static void bnx2x_bcm8726_external_rom_boot(struct link_params *params)
        /* Need to wait 100ms after reset */
        msleep(100);
 
-       /* Set serial boot control for external load */
-       bnx2x_cl45_write(bp, port, ext_phy_type, ext_phy_addr,
-                      MDIO_PMA_DEVAD,
-                      MDIO_PMA_REG_MISC_CTRL1, 0x0001);
-
        /* Micro controller re-boot */
        bnx2x_cl45_write(bp, port, ext_phy_type, ext_phy_addr,
                       MDIO_PMA_DEVAD,
                       MDIO_PMA_REG_GEN_CTRL,
-                      MDIO_PMA_REG_GEN_CTRL_ROM_RESET_INTERNAL_MP);
+                      0x018B);
 
        /* Set soft reset */
        bnx2x_cl45_write(bp, port, ext_phy_type, ext_phy_addr,
@@ -2605,14 +2606,10 @@ static void bnx2x_bcm8726_external_rom_boot(struct link_params *params)
                       MDIO_PMA_REG_GEN_CTRL,
                       MDIO_PMA_REG_GEN_CTRL_ROM_MICRO_RESET);
 
-       /* Set PLL register value to be same like in P13 ver */
        bnx2x_cl45_write(bp, port, ext_phy_type, ext_phy_addr,
                       MDIO_PMA_DEVAD,
-                      MDIO_PMA_REG_PLL_CTRL,
-                      0x73A0);
+                      MDIO_PMA_REG_MISC_CTRL1, 0x0001);
 
-       /* Clear soft reset.
-       Will automatically reset micro-controller re-boot */
        bnx2x_cl45_write(bp, port, ext_phy_type, ext_phy_addr,
                       MDIO_PMA_DEVAD,
                       MDIO_PMA_REG_GEN_CTRL,
@@ -2992,11 +2989,8 @@ static u8 bnx2x_verify_sfp_module(struct link_params *params)
        else
                vendor_pn[SFP_EEPROM_PART_NO_SIZE] = '\0';
 
-       printk(KERN_INFO PFX  "Warning: "
-                        "Unqualified SFP+ module "
-                        "detected on %s, Port %d from %s part number %s\n"
-                       , bp->dev->name, params->port,
-                       vendor_name, vendor_pn);
+       netdev_info(bp->dev, "Warning: Unqualified SFP+ module detected, Port %d from %s part number %s\n",
+                   params->port, vendor_name, vendor_pn);
        return -EINVAL;
 }
 
@@ -3538,8 +3532,8 @@ static void bnx2x_8481_set_10G_led_mode(struct link_params *params,
                       MDIO_PMA_REG_8481_LINK_SIGNAL,
                       &val1);
        /* Set bit 2 to 0, and bits [1:0] to 10 */
-       val1 &= ~((1<<0) | (1<<2)); /* Clear bits 0,2*/
-       val1 |= (1<<1); /* Set bit 1 */
+       val1 &= ~((1<<0) | (1<<2) | (1<<7)); /* Clear bits 0,2,7*/
+       val1 |= ((1<<1) | (1<<6)); /* Set bit 1, 6 */
 
        bnx2x_cl45_write(bp, params->port,
                       ext_phy_type,
@@ -3573,36 +3567,19 @@ static void bnx2x_8481_set_10G_led_mode(struct link_params *params,
                       MDIO_PMA_REG_8481_LED2_MASK,
                       0);
 
-       /* LED3 (10G/1G/100/10G Activity) */
-       bnx2x_cl45_read(bp, params->port,
-                     ext_phy_type,
-                     ext_phy_addr,
-                     MDIO_PMA_DEVAD,
-                     MDIO_PMA_REG_8481_LINK_SIGNAL,
-                     &val1);
-       /* Enable blink based on source 4(Activity) */
-       val1 &= ~((1<<7) | (1<<8)); /* Clear bits 7,8 */
-       val1 |= (1<<6); /* Set only bit 6 */
+       /* Unmask LED3 for 10G link */
        bnx2x_cl45_write(bp, params->port,
                       ext_phy_type,
                       ext_phy_addr,
                       MDIO_PMA_DEVAD,
-                      MDIO_PMA_REG_8481_LINK_SIGNAL,
-                      val1);
-
-       bnx2x_cl45_read(bp, params->port,
-                     ext_phy_type,
-                     ext_phy_addr,
-                     MDIO_PMA_DEVAD,
                      MDIO_PMA_REG_8481_LED3_MASK,
-                     &val1);
-       val1 |= (1<<4); /* Unmask LED3 for 10G link */
+                      0x6);
        bnx2x_cl45_write(bp, params->port,
                       ext_phy_type,
                       ext_phy_addr,
                       MDIO_PMA_DEVAD,
-                      MDIO_PMA_REG_8481_LED3_MASK,
-                      val1);
+                      MDIO_PMA_REG_8481_LED3_BLINK,
+                      0);
 }
 
 
@@ -3772,19 +3749,6 @@ static u8 bnx2x_ext_phy_init(struct link_params *params, struct link_vars *vars)
                                }
                        }
                        /* Force speed */
-                       /* First enable LASI */
-                       bnx2x_cl45_write(bp, params->port,
-                                      ext_phy_type,
-                                      ext_phy_addr,
-                                      MDIO_PMA_DEVAD,
-                                      MDIO_PMA_REG_RX_ALARM_CTRL,
-                                      0x0400);
-                       bnx2x_cl45_write(bp, params->port,
-                                      ext_phy_type,
-                                      ext_phy_addr,
-                                      MDIO_PMA_DEVAD,
-                                      MDIO_PMA_REG_LASI_CTRL, 0x0004);
-
                        if (params->req_line_speed == SPEED_10000) {
                                DP(NETIF_MSG_LINK, "XGXS 8706 force 10Gbps\n");
 
@@ -3794,6 +3758,9 @@ static u8 bnx2x_ext_phy_init(struct link_params *params, struct link_vars *vars)
                                               MDIO_PMA_DEVAD,
                                               MDIO_PMA_REG_DIGITAL_CTRL,
                                               0x400);
+                               bnx2x_cl45_write(bp, params->port, ext_phy_type,
+                                              ext_phy_addr, MDIO_PMA_DEVAD,
+                                              MDIO_PMA_REG_LASI_CTRL, 1);
                        } else {
                                /* Force 1Gbps using autoneg with 1G
                                advertisment */
@@ -3835,6 +3802,17 @@ static u8 bnx2x_ext_phy_init(struct link_params *params, struct link_vars *vars)
                                               MDIO_AN_DEVAD,
                                               MDIO_AN_REG_CTRL,
                                               0x1200);
+                               bnx2x_cl45_write(bp, params->port,
+                                              ext_phy_type,
+                                              ext_phy_addr,
+                                              MDIO_PMA_DEVAD,
+                                              MDIO_PMA_REG_RX_ALARM_CTRL,
+                                              0x0400);
+                               bnx2x_cl45_write(bp, params->port,
+                                              ext_phy_type,
+                                              ext_phy_addr,
+                                              MDIO_PMA_DEVAD,
+                                              MDIO_PMA_REG_LASI_CTRL, 0x0004);
 
                        }
                        bnx2x_save_bcm_spirom_ver(bp, params->port,
@@ -4370,6 +4348,7 @@ static u8 bnx2x_ext_phy_init(struct link_params *params, struct link_vars *vars)
                        break;
                }
                case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481:
+               case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84823:
                        /* This phy uses the NIG latch mechanism since link
                                indication arrives through its LED4 and not via
                                its LASI signal, so we get steady signal
@@ -4377,6 +4356,12 @@ static u8 bnx2x_ext_phy_init(struct link_params *params, struct link_vars *vars)
                        bnx2x_bits_en(bp, NIG_REG_LATCH_BC_0 + params->port*4,
                                    1 << NIG_LATCH_BC_ENABLE_MI_INT);
 
+                       bnx2x_cl45_write(bp, params->port,
+                                      PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481,
+                                      ext_phy_addr,
+                                      MDIO_PMA_DEVAD,
+                                      MDIO_PMA_REG_CTRL, 0x0000);
+
                        bnx2x_8481_set_led4(params, ext_phy_type, ext_phy_addr);
                        if (params->req_line_speed == SPEED_AUTO_NEG) {
 
@@ -4473,17 +4458,12 @@ static u8 bnx2x_ext_phy_init(struct link_params *params, struct link_vars *vars)
                                    PORT_HW_CFG_SPEED_CAPABILITY_D0_10G) {
                                        DP(NETIF_MSG_LINK, "Advertising 10G\n");
                                        /* Restart autoneg for 10G*/
-                       bnx2x_cl45_read(bp, params->port,
-                                     ext_phy_type,
-                                     ext_phy_addr,
-                                     MDIO_AN_DEVAD,
-                                     MDIO_AN_REG_CTRL, &val);
-                       val |= 0x200;
+
                        bnx2x_cl45_write(bp, params->port,
                                       ext_phy_type,
                                       ext_phy_addr,
                                       MDIO_AN_DEVAD,
-                                      MDIO_AN_REG_CTRL, val);
+                                      MDIO_AN_REG_CTRL, 0x3200);
                                }
                        } else {
                                /* Force speed */
@@ -4736,8 +4716,8 @@ static u8 bnx2x_ext_phy_is_link_up(struct link_params *params,
                                      0xc809, &val1);
 
                        DP(NETIF_MSG_LINK, "8705 1.c809 val=0x%x\n", val1);
-                       ext_phy_link_up = ((rx_sd & 0x1) && (val1 & (1<<9))
-                                          && ((val1 & (1<<8)) == 0));
+                       ext_phy_link_up = ((rx_sd & 0x1) && (val1 & (1<<9)) &&
+                                          ((val1 & (1<<8)) == 0));
                        if (ext_phy_link_up)
                                vars->line_speed = SPEED_10000;
                        break;
@@ -4865,16 +4845,8 @@ static u8 bnx2x_ext_phy_is_link_up(struct link_params *params,
                                                     " has been detected on "
                                                     "port %d\n",
                                                 params->port);
-                                       printk(KERN_ERR PFX  "Error:  Power"
-                                                " fault on %s Port %d has"
-                                                " been detected and the"
-                                                " power to that SFP+ module"
-                                                " has been removed to prevent"
-                                                " failure of the card. Please"
-                                                " remove the SFP+ module and"
-                                                " restart the system to clear"
-                                                " this error.\n"
-                       , bp->dev->name, params->port);
+                                       netdev_err(bp->dev, "Error:  Power fault on Port %d has been detected and the power to that SFP+ module has been removed to prevent failure of the card. Please remove the SFP+ module and restart the system to clear this error.\n",
+                                                  params->port);
                                        /*
                                         * Disable all RX_ALARMs except for
                                         * mod_abs
@@ -5227,6 +5199,7 @@ static u8 bnx2x_ext_phy_is_link_up(struct link_params *params,
                        }
                        break;
                case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481:
+               case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84823:
                        /* Check 10G-BaseT link status */
                        /* Check PMD signal ok */
                        bnx2x_cl45_read(bp, params->port, ext_phy_type,
@@ -5442,8 +5415,10 @@ static void bnx2x_link_int_ack(struct link_params *params,
                     (NIG_STATUS_XGXS0_LINK10G |
                      NIG_STATUS_XGXS0_LINK_STATUS |
                      NIG_STATUS_SERDES0_LINK_STATUS));
-       if (XGXS_EXT_PHY_TYPE(params->ext_phy_config)
-           == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481) {
+       if ((XGXS_EXT_PHY_TYPE(params->ext_phy_config)
+               == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481) ||
+       (XGXS_EXT_PHY_TYPE(params->ext_phy_config)
+               == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84823)) {
                bnx2x_8481_rearm_latch_signal(bp, port, is_mi_int);
        }
        if (vars->phy_link_up) {
@@ -5556,6 +5531,7 @@ u8 bnx2x_get_ext_phy_fw_version(struct link_params *params, u8 driver_loaded,
                status = bnx2x_format_ver(spirom_ver, version, len);
                break;
        case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481:
+       case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84823:
                spirom_ver = ((spirom_ver & 0xF80) >> 7) << 16 |
                        (spirom_ver & 0x7F);
                status = bnx2x_format_ver(spirom_ver, version, len);
@@ -5952,6 +5928,7 @@ static u8 bnx2x_link_initialize(struct link_params *params,
 
        if (non_ext_phy ||
            (ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8705) ||
+           (ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8706) ||
            (ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726) ||
            (params->loopback_mode == LOOPBACK_EXT_PHY)) {
                if (params->req_line_speed == SPEED_AUTO_NEG)
@@ -6246,6 +6223,22 @@ u8 bnx2x_link_reset(struct link_params *params, struct link_vars *vars,
                        bnx2x_8726_reset_phy(bp, params->port, ext_phy_addr);
                        break;
                }
+               case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84823:
+               {
+                       u8 ext_phy_addr =
+                               XGXS_EXT_PHY_ADDR(params->ext_phy_config);
+                       bnx2x_cl45_write(bp, port,
+                                      PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481,
+                                      ext_phy_addr,
+                                      MDIO_AN_DEVAD,
+                                      MDIO_AN_REG_CTRL, 0x0000);
+                       bnx2x_cl45_write(bp, port,
+                                      PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481,
+                                      ext_phy_addr,
+                                      MDIO_PMA_DEVAD,
+                                      MDIO_PMA_REG_CTRL, 1);
+                       break;
+               }
                default:
                        /* HW reset */
                        bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_1,
@@ -6320,10 +6313,11 @@ static u8 bnx2x_update_link_up(struct link_params *params,
                bnx2x_bmac_enable(params, vars, 0);
                bnx2x_set_led(params, LED_MODE_OPER, SPEED_10000);
        } else {
-               bnx2x_emac_enable(params, vars, 0);
                rc = bnx2x_emac_program(params, vars->line_speed,
                                      vars->duplex);
 
+               bnx2x_emac_enable(params, vars, 0);
+
                /* AN complete? */
                if (gp_status & MDIO_AN_CL73_OR_37_COMPLETE) {
                        if (!(vars->phy_flags &
@@ -6421,6 +6415,7 @@ u8 bnx2x_link_update(struct link_params *params, struct link_vars *vars)
 
        if ((ext_phy_type != PORT_HW_CFG_SERDES_EXT_PHY_TYPE_DIRECT) &&
            (ext_phy_type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8705) &&
+           (ext_phy_type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8706) &&
            (ext_phy_type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726) &&
            (ext_phy_link_up && !vars->phy_link_up))
                bnx2x_init_internal_phy(params, vars, 0);
@@ -6656,6 +6651,13 @@ static u8 bnx2x_8726_common_init_phy(struct bnx2x *bp, u32 shmem_base)
        return 0;
 }
 
+
+static u8 bnx2x_84823_common_init_phy(struct bnx2x *bp, u32 shmem_base)
+{
+       /* HW reset */
+       bnx2x_ext_phy_hw_reset(bp, 1);
+       return 0;
+}
 u8 bnx2x_common_init_phy(struct bnx2x *bp, u32 shmem_base)
 {
        u8 rc = 0;
@@ -6685,7 +6687,9 @@ u8 bnx2x_common_init_phy(struct bnx2x *bp, u32 shmem_base)
                /* GPIO1 affects both ports, so there's need to pull
                it for single port alone */
                rc = bnx2x_8726_common_init_phy(bp, shmem_base);
-
+               break;
+       case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84823:
+               rc = bnx2x_84823_common_init_phy(bp, shmem_base);
                break;
        default:
                DP(NETIF_MSG_LINK,