[S390] pm: dcssblk power management callbacks.
[safe/jmp/linux-2.6] / drivers / net / bnx2x_link.c
index 4a594b8..ed648ac 100644 (file)
 #include <linux/ethtool.h>
 #include <linux/mutex.h>
 
-#include "bnx2x_reg.h"
-#include "bnx2x_fw_defs.h"
-#include "bnx2x_hsi.h"
-#include "bnx2x_link.h"
 #include "bnx2x.h"
 
 /********************************************************/
@@ -1927,9 +1923,6 @@ static void bnx2x_ext_phy_reset(struct link_params *params,
                        break;
                case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073:
                        {
-                       u16 emac_base;
-                       emac_base = (params->port) ? GRCBASE_EMAC0 :
-                                       GRCBASE_EMAC1;
 
                        /* Restore normal power mode*/
                        bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2,
@@ -2094,7 +2087,7 @@ static u8 bnx2x_8073_is_snr_needed(struct link_params *params)
                      PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073,
                      ext_phy_addr,
                      MDIO_PMA_DEVAD,
-                     0xc801, &val);
+                     MDIO_PMA_REG_8073_CHIP_REV, &val);
 
        if (val != 1) {
                /* No need to workaround in 8073 A1 */
@@ -2126,7 +2119,7 @@ static u8 bnx2x_bcm8073_xaui_wa(struct link_params *params)
                      PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073,
                      ext_phy_addr,
                      MDIO_PMA_DEVAD,
-                     0xc801, &val);
+                     MDIO_PMA_REG_8073_CHIP_REV, &val);
 
        if (val > 0) {
                /* No need to workaround in 8073 A1 */
@@ -2142,7 +2135,8 @@ static u8 bnx2x_bcm8073_xaui_wa(struct link_params *params)
                              PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073,
                              ext_phy_addr,
                              MDIO_PMA_DEVAD,
-                             0xc820, &val);
+                             MDIO_PMA_REG_8073_SPEED_LINK_STATUS,
+                             &val);
                  /* If bit [14] = 0 or bit [13] = 0, continue on with
                   system initialization (XAUI work-around not required,
                    as these bits indicate 2.5G or 1G link up). */
@@ -2160,7 +2154,7 @@ static u8 bnx2x_bcm8073_xaui_wa(struct link_params *params)
                                        PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073,
                                        ext_phy_addr,
                                        MDIO_PMA_DEVAD,
-                                       0xc841, &val);
+                                       MDIO_PMA_REG_8073_XAUI_WA, &val);
                                if (val & (1<<15)) {
                                        DP(NETIF_MSG_LINK,
                                          "XAUI workaround has completed\n");
@@ -2264,6 +2258,11 @@ static void bnx2x_bcm8726_external_rom_boot(struct link_params *params)
                       MDIO_PMA_REG_GEN_CTRL,
                       MDIO_PMA_REG_GEN_CTRL_ROM_MICRO_RESET);
 
+       bnx2x_cl45_write(bp, port, ext_phy_type, ext_phy_addr,
+                      MDIO_PMA_DEVAD,
+                      MDIO_PMA_REG_GEN_CTRL2,
+                      0x73A0);
+
        /* Clear soft reset.
        Will automatically reset micro-controller re-boot */
        bnx2x_cl45_write(bp, port, ext_phy_type, ext_phy_addr,
@@ -2271,8 +2270,8 @@ static void bnx2x_bcm8726_external_rom_boot(struct link_params *params)
                       MDIO_PMA_REG_GEN_CTRL,
                       MDIO_PMA_REG_GEN_CTRL_ROM_RESET_INTERNAL_MP);
 
-       /* wait for 100ms for microcode load */
-       msleep(100);
+       /* wait for 150ms for microcode load */
+       msleep(150);
 
        /* Disable serial boot control, tristates pins SS_N, SCK, MOSI, MISO */
        bnx2x_cl45_write(bp, port, ext_phy_type, ext_phy_addr,
@@ -2530,7 +2529,7 @@ static u8 bnx2x_bcm8726_set_limiting_mode(struct link_params *params,
        u8 ext_phy_addr = ((params->ext_phy_config &
                            PORT_HW_CFG_XGXS_EXT_PHY_ADDR_MASK) >>
                           PORT_HW_CFG_XGXS_EXT_PHY_ADDR_SHIFT);
-
+       u16 cur_limiting_mode;
        if (bnx2x_read_sfp_module_eeprom(params,
                                       SFP_EEPROM_OPTIONS_ADDR,
                                       SFP_EEPROM_OPTIONS_SIZE,
@@ -2541,6 +2540,16 @@ static u8 bnx2x_bcm8726_set_limiting_mode(struct link_params *params,
        }
        limiting_mode = !(options[0] &
                          SFP_EEPROM_OPTIONS_LINEAR_RX_OUT_MASK);
+
+       bnx2x_cl45_read(bp, port,
+                     PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726,
+                     ext_phy_addr,
+                     MDIO_PMA_DEVAD,
+                     MDIO_PMA_REG_ROM_VER2,
+                     &cur_limiting_mode);
+       DP(NETIF_MSG_LINK, "Current Limiting mode is 0x%x\n",
+                cur_limiting_mode);
+
        if (limiting_mode &&
            (module_type != SFP_MODULE_TYPE_PASSIVE_COPPER_CABLE)) {
                DP(NETIF_MSG_LINK,
@@ -2553,17 +2562,10 @@ static u8 bnx2x_bcm8726_set_limiting_mode(struct link_params *params,
                               MDIO_PMA_REG_ROM_VER2,
                               SFP_LIMITING_MODE_VALUE);
        } else { /* LRM mode ( default )*/
-               u16 cur_limiting_mode;
+
                DP(NETIF_MSG_LINK, "Module options = 0x%x.Setting LRM MODE\n",
                         options[0]);
 
-               bnx2x_cl45_read(bp, port,
-                              PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726,
-                              ext_phy_addr,
-                              MDIO_PMA_DEVAD,
-                              MDIO_PMA_REG_ROM_VER2,
-                              &cur_limiting_mode);
-
                /* Changing to LRM mode takes quite few seconds.
                So do it only if current mode is limiting
                ( default is LRM )*/
@@ -2666,11 +2668,7 @@ static u8 bnx2x_sfp_module_detection(struct link_params *params)
                          params->port);
 
        /* Check and set limiting mode / LRM mode */
-       if (bnx2x_bcm8726_set_limiting_mode(params, module_type)
-            != 0) {
-               DP(NETIF_MSG_LINK, "Setting limiting mode failed!!\n");
-               return -EINVAL;
-       }
+       bnx2x_bcm8726_set_limiting_mode(params, module_type);
 
        /* Enable transmit for this module */
        bnx2x_bcm8726_set_transmitter(bp, params->port,
@@ -2758,7 +2756,7 @@ static void bnx2x_bcm8073_set_xaui_low_power_mode(struct link_params *params)
                      PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073,
                      ext_phy_addr,
                      MDIO_PMA_DEVAD,
-                     0xc801, &val);
+                     MDIO_PMA_REG_8073_CHIP_REV, &val);
 
        if (val == 0) {
                /* Mustn't set low power mode in 8073 A0 */
@@ -3035,10 +3033,9 @@ static u8 bnx2x_ext_phy_init(struct link_params *params, struct link_vars *vars)
                                       MDIO_WIS_DEVAD,
                                       MDIO_WIS_REG_LASI_CNTL, 0x1);
 
-                       bnx2x_save_bcm_spirom_ver(bp, params->port,
-                                               ext_phy_type,
-                                               ext_phy_addr,
-                                               params->shmem_base);
+                       /* BCM8705 doesn't have microcode, hence the 0 */
+                       bnx2x_save_spirom_version(bp, params->port,
+                                               params->shmem_base, 0);
                        break;
 
                case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8706:
@@ -3283,7 +3280,7 @@ static u8 bnx2x_ext_phy_init(struct link_params *params, struct link_vars *vars)
                                      ext_phy_type,
                                      ext_phy_addr,
                                      MDIO_PMA_DEVAD,
-                                     0xca13,
+                                     MDIO_PMA_REG_M8051_MSGOUT_REG,
                                      &tmp1);
 
                        bnx2x_cl45_read(bp, params->port,
@@ -3350,7 +3347,7 @@ static u8 bnx2x_ext_phy_init(struct link_params *params, struct link_vars *vars)
                                              ext_phy_type,
                                              ext_phy_addr,
                                              MDIO_AN_DEVAD,
-                                             0x8329, &tmp1);
+                                             MDIO_AN_REG_8073_2_5G, &tmp1);
 
                                if (((params->speed_cap_mask &
                                      PORT_HW_CFG_SPEED_CAPABILITY_D0_2_5G) &&
@@ -3364,7 +3361,7 @@ static u8 bnx2x_ext_phy_init(struct link_params *params, struct link_vars *vars)
                                         PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073,
                                         ext_phy_addr,
                                         MDIO_PMA_DEVAD,
-                                        0xc801, &phy_ver);
+                                        MDIO_PMA_REG_8073_CHIP_REV, &phy_ver);
                                        DP(NETIF_MSG_LINK, "Add 2.5G\n");
                                        if (phy_ver > 0)
                                                tmp1 |= 1;
@@ -3379,7 +3376,7 @@ static u8 bnx2x_ext_phy_init(struct link_params *params, struct link_vars *vars)
                                               ext_phy_type,
                                               ext_phy_addr,
                                               MDIO_AN_DEVAD,
-                                              0x8329, tmp1);
+                                              MDIO_AN_REG_8073_2_5G, tmp1);
                        }
 
                        /* Add support for CL37 (passive mode) II */
@@ -3737,7 +3734,7 @@ static u8 bnx2x_ext_phy_is_link_up(struct link_params *params,
                                      ext_phy_type,
                                      ext_phy_addr,
                                      MDIO_PMA_DEVAD,
-                                     0xca13,
+                                     MDIO_PMA_REG_M8051_MSGOUT_REG,
                                      &val1);
 
                        /* Check the LASI */
@@ -3782,17 +3779,17 @@ static u8 bnx2x_ext_phy_is_link_up(struct link_params *params,
                                        }
                                }
                                bnx2x_cl45_read(bp, params->port,
-                                                     ext_phy_type,
-                                                     ext_phy_addr,
-                                                     MDIO_AN_DEVAD,
-                                                     0x8304,
-                                                     &an1000_status);
+                                             ext_phy_type,
+                                             ext_phy_addr,
+                                             MDIO_AN_DEVAD,
+                                             MDIO_AN_REG_LINK_STATUS,
+                                             &an1000_status);
                                bnx2x_cl45_read(bp, params->port,
-                                                     ext_phy_type,
-                                                     ext_phy_addr,
-                                                     MDIO_AN_DEVAD,
-                                                     0x8304,
-                                                     &an1000_status);
+                                             ext_phy_type,
+                                             ext_phy_addr,
+                                             MDIO_AN_DEVAD,
+                                             MDIO_AN_REG_LINK_STATUS,
+                                             &an1000_status);
 
                                /* Check the link status on 1.1.2 */
                                bnx2x_cl45_read(bp, params->port,
@@ -3809,7 +3806,7 @@ static u8 bnx2x_ext_phy_is_link_up(struct link_params *params,
                                             "an_link_status=0x%x\n",
                                          val2, val1, an1000_status);
 
-                                       ext_phy_link_up = (((val1 & 4) == 4) ||
+                               ext_phy_link_up = (((val1 & 4) == 4) ||
                                                (an1000_status & (1<<1)));
                                if (ext_phy_link_up &&
                                    bnx2x_8073_is_snr_needed(params)) {
@@ -3837,11 +3834,11 @@ static u8 bnx2x_ext_phy_is_link_up(struct link_params *params,
 
                                }
                                bnx2x_cl45_read(bp, params->port,
-                                                     ext_phy_type,
-                                                     ext_phy_addr,
-                                                     MDIO_PMA_DEVAD,
-                                                     0xc820,
-                                                     &link_status);
+                                          ext_phy_type,
+                                          ext_phy_addr,
+                                          MDIO_PMA_DEVAD,
+                                          MDIO_PMA_REG_8073_SPEED_LINK_STATUS,
+                                          &link_status);
 
                                /* Bits 0..2 --> speed detected,
                                   bits 13..15--> link is down */
@@ -3875,17 +3872,17 @@ static u8 bnx2x_ext_phy_is_link_up(struct link_params *params,
                        } else {
                                /* See if 1G link is up for the 8072 */
                                bnx2x_cl45_read(bp, params->port,
-                                                     ext_phy_type,
-                                                     ext_phy_addr,
-                                                     MDIO_AN_DEVAD,
-                                                     0x8304,
-                                                     &an1000_status);
+                                             ext_phy_type,
+                                             ext_phy_addr,
+                                             MDIO_AN_DEVAD,
+                                             MDIO_AN_REG_LINK_STATUS,
+                                             &an1000_status);
                                bnx2x_cl45_read(bp, params->port,
-                                                     ext_phy_type,
-                                                     ext_phy_addr,
-                                                     MDIO_AN_DEVAD,
-                                                     0x8304,
-                                                     &an1000_status);
+                                             ext_phy_type,
+                                             ext_phy_addr,
+                                             MDIO_AN_DEVAD,
+                                             MDIO_AN_REG_LINK_STATUS,
+                                             &an1000_status);
                                if (an1000_status & (1<<1)) {
                                        ext_phy_link_up = 1;
                                        vars->line_speed = SPEED_1000;
@@ -4191,7 +4188,7 @@ static void bnx2x_turn_on_ef(struct bnx2x *bp, u8 port, u8 ext_phy_addr,
                              ext_phy_addr,
                              MDIO_PMA_DEVAD,
                              MDIO_PMA_REG_CTRL,
-                              &ctrl);
+                             &ctrl);
                if (!(ctrl & (1<<15))) {
                        DP(NETIF_MSG_LINK, "Reset completed\n\n");
                                break;
@@ -4247,6 +4244,7 @@ u8 bnx2x_get_ext_phy_fw_version(struct link_params *params, u8 driver_loaded,
        case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8705:
        case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8706:
        case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726:
+       case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481:
                status = bnx2x_format_ver(spirom_ver, version, len);
                break;
        case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT:
@@ -4626,13 +4624,13 @@ static u8 bnx2x_link_initialize(struct link_params *params,
 
        /* init ext phy and enable link state int */
        non_ext_phy = ((ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT) ||
-                      (params->loopback_mode == LOOPBACK_XGXS_10) ||
-                      (params->loopback_mode == LOOPBACK_EXT_PHY));
+                      (params->loopback_mode == LOOPBACK_XGXS_10));
 
        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_BCM8726) ||
-           (ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481)) {
+           (ext_phy_type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481) ||
+           (params->loopback_mode == LOOPBACK_EXT_PHY)) {
                if (params->req_line_speed == SPEED_AUTO_NEG)
                        bnx2x_set_parallel_detection(params, vars->phy_flags);
                bnx2x_init_internal_phy(params, vars);
@@ -4826,6 +4824,7 @@ u8 bnx2x_phy_init(struct link_params *params, struct link_vars *vars)
                        return -EINVAL;
                        break;
                }
+               DP(NETIF_MSG_LINK, "Phy address = 0x%x\n", params->phy_addr);
 
                bnx2x_link_initialize(params, vars);
                msleep(30);
@@ -5182,7 +5181,7 @@ static u8 bnx2x_8073_common_init_phy(struct bnx2x *bp, u32 shmem_base)
 
        /* PART3 - complete TX_POWER_DOWN process, and set GPIO2 back to low */
        for (port = PORT_MAX - 1; port >= PORT_0; port--) {
-               /* Phase2 of POWER_DOWN_RESET*/
+               /* Phase2 of POWER_DOWN_RESET */
                /* Release bit 10 (Release Tx power down) */
                bnx2x_cl45_read(bp, port,
                              PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073,
@@ -5261,7 +5260,7 @@ u8 bnx2x_common_init_phy(struct bnx2x *bp, u32 shmem_base)
        u8 rc = 0;
        u32 ext_phy_type;
 
-       DP(NETIF_MSG_LINK, "bnx2x_common_init_phy\n");
+       DP(NETIF_MSG_LINK, "Begin common phy init\n");
 
        /* Read the ext_phy_type for arbitrary port(0) */
        ext_phy_type = XGXS_EXT_PHY_TYPE(