diff options
author | Yaniv Rosner <yanivr@broadcom.com> | 2011-06-13 21:34:27 -0400 |
---|---|---|
committer | David S. Miller <davem@conan.davemloft.net> | 2011-06-15 10:56:57 -0400 |
commit | 0d40f0d425ec632956547bd8efd8965e5945e1dc (patch) | |
tree | b2e2f76c427c8a6f130b82d1942fd3e57e82a6a5 | |
parent | 6c3218c6f7e5be6d785486797d48203d54cfd893 (diff) |
bnx2x: Adjust BCM84833 to BCM578xx
Signed-off-by: Yaniv Rosner <yanivr@broadcom.com>
Signed-off-by: Vladislav Zolotarov <vladz@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: David S. Miller <davem@conan.davemloft.net>
-rw-r--r-- | drivers/net/bnx2x/bnx2x_link.c | 85 | ||||
-rw-r--r-- | drivers/net/bnx2x/bnx2x_main.c | 47 |
2 files changed, 127 insertions, 5 deletions
diff --git a/drivers/net/bnx2x/bnx2x_link.c b/drivers/net/bnx2x/bnx2x_link.c index a5c34880b39e..241b1e42c375 100644 --- a/drivers/net/bnx2x/bnx2x_link.c +++ b/drivers/net/bnx2x/bnx2x_link.c | |||
@@ -9198,6 +9198,52 @@ static int bnx2x_84833_pair_swap_cfg(struct bnx2x_phy *phy, | |||
9198 | return 0; | 9198 | return 0; |
9199 | } | 9199 | } |
9200 | 9200 | ||
9201 | |||
9202 | static int bnx2x_84833_common_init_phy(struct bnx2x *bp, | ||
9203 | u32 shmem_base_path[], | ||
9204 | u32 chip_id) | ||
9205 | { | ||
9206 | u32 reset_pin[2]; | ||
9207 | u32 idx; | ||
9208 | u8 reset_gpios; | ||
9209 | if (CHIP_IS_E3(bp)) { | ||
9210 | /* Assume that these will be GPIOs, not EPIOs. */ | ||
9211 | for (idx = 0; idx < 2; idx++) { | ||
9212 | /* Map config param to register bit. */ | ||
9213 | reset_pin[idx] = REG_RD(bp, shmem_base_path[idx] + | ||
9214 | offsetof(struct shmem_region, | ||
9215 | dev_info.port_hw_config[0].e3_cmn_pin_cfg)); | ||
9216 | reset_pin[idx] = (reset_pin[idx] & | ||
9217 | PORT_HW_CFG_E3_PHY_RESET_MASK) >> | ||
9218 | PORT_HW_CFG_E3_PHY_RESET_SHIFT; | ||
9219 | reset_pin[idx] -= PIN_CFG_GPIO0_P0; | ||
9220 | reset_pin[idx] = (1 << reset_pin[idx]); | ||
9221 | } | ||
9222 | reset_gpios = (u8)(reset_pin[0] | reset_pin[1]); | ||
9223 | } else { | ||
9224 | /* E2, look from diff place of shmem. */ | ||
9225 | for (idx = 0; idx < 2; idx++) { | ||
9226 | reset_pin[idx] = REG_RD(bp, shmem_base_path[idx] + | ||
9227 | offsetof(struct shmem_region, | ||
9228 | dev_info.port_hw_config[0].default_cfg)); | ||
9229 | reset_pin[idx] &= PORT_HW_CFG_EXT_PHY_GPIO_RST_MASK; | ||
9230 | reset_pin[idx] -= PORT_HW_CFG_EXT_PHY_GPIO_RST_GPIO0_P0; | ||
9231 | reset_pin[idx] >>= PORT_HW_CFG_EXT_PHY_GPIO_RST_SHIFT; | ||
9232 | reset_pin[idx] = (1 << reset_pin[idx]); | ||
9233 | } | ||
9234 | reset_gpios = (u8)(reset_pin[0] | reset_pin[1]); | ||
9235 | } | ||
9236 | |||
9237 | bnx2x_set_mult_gpio(bp, reset_gpios, MISC_REGISTERS_GPIO_OUTPUT_LOW); | ||
9238 | udelay(10); | ||
9239 | bnx2x_set_mult_gpio(bp, reset_gpios, MISC_REGISTERS_GPIO_OUTPUT_HIGH); | ||
9240 | msleep(800); | ||
9241 | DP(NETIF_MSG_LINK, "84833 reset pulse on pin values 0x%x\n", | ||
9242 | reset_gpios); | ||
9243 | |||
9244 | return 0; | ||
9245 | } | ||
9246 | |||
9201 | static int bnx2x_848x3_config_init(struct bnx2x_phy *phy, | 9247 | static int bnx2x_848x3_config_init(struct bnx2x_phy *phy, |
9202 | struct link_params *params, | 9248 | struct link_params *params, |
9203 | struct link_vars *vars) | 9249 | struct link_vars *vars) |
@@ -9263,8 +9309,14 @@ static int bnx2x_848x3_config_init(struct bnx2x_phy *phy, | |||
9263 | MDIO_CTL_REG_84823_MEDIA_COPPER_CORE_DOWN | | 9309 | MDIO_CTL_REG_84823_MEDIA_COPPER_CORE_DOWN | |
9264 | MDIO_CTL_REG_84823_MEDIA_PRIORITY_MASK | | 9310 | MDIO_CTL_REG_84823_MEDIA_PRIORITY_MASK | |
9265 | MDIO_CTL_REG_84823_MEDIA_FIBER_1G); | 9311 | MDIO_CTL_REG_84823_MEDIA_FIBER_1G); |
9266 | val |= MDIO_CTL_REG_84823_CTRL_MAC_XFI | | 9312 | |
9267 | MDIO_CTL_REG_84823_MEDIA_LINE_XAUI_L; | 9313 | if (CHIP_IS_E3(bp)) { |
9314 | val &= ~(MDIO_CTL_REG_84823_MEDIA_MAC_MASK | | ||
9315 | MDIO_CTL_REG_84823_MEDIA_LINE_MASK); | ||
9316 | } else { | ||
9317 | val |= (MDIO_CTL_REG_84823_CTRL_MAC_XFI | | ||
9318 | MDIO_CTL_REG_84823_MEDIA_LINE_XAUI_L); | ||
9319 | } | ||
9268 | 9320 | ||
9269 | actual_phy_selection = bnx2x_phy_selection(params); | 9321 | actual_phy_selection = bnx2x_phy_selection(params); |
9270 | 9322 | ||
@@ -9435,6 +9487,7 @@ static void bnx2x_848x3_link_reset(struct bnx2x_phy *phy, | |||
9435 | { | 9487 | { |
9436 | struct bnx2x *bp = params->bp; | 9488 | struct bnx2x *bp = params->bp; |
9437 | u8 port; | 9489 | u8 port; |
9490 | u16 val16; | ||
9438 | 9491 | ||
9439 | if (!(CHIP_IS_E1(bp))) | 9492 | if (!(CHIP_IS_E1(bp))) |
9440 | port = BP_PATH(bp); | 9493 | port = BP_PATH(bp); |
@@ -9446,9 +9499,14 @@ static void bnx2x_848x3_link_reset(struct bnx2x_phy *phy, | |||
9446 | MISC_REGISTERS_GPIO_OUTPUT_LOW, | 9499 | MISC_REGISTERS_GPIO_OUTPUT_LOW, |
9447 | port); | 9500 | port); |
9448 | } else { | 9501 | } else { |
9449 | bnx2x_cl45_write(bp, phy, | 9502 | bnx2x_cl45_read(bp, phy, |
9450 | MDIO_PMA_DEVAD, | 9503 | MDIO_CTL_DEVAD, |
9451 | MDIO_PMA_REG_CTRL, 0x800); | 9504 | 0x400f, &val16); |
9505 | /* Put to low power mode on newer FW */ | ||
9506 | if ((val16 & 0x303f) > 0x1009) | ||
9507 | bnx2x_cl45_write(bp, phy, | ||
9508 | MDIO_PMA_DEVAD, | ||
9509 | MDIO_PMA_REG_CTRL, 0x800); | ||
9452 | } | 9510 | } |
9453 | } | 9511 | } |
9454 | 9512 | ||
@@ -9647,7 +9705,17 @@ static void bnx2x_848xx_set_link_led(struct bnx2x_phy *phy, | |||
9647 | } | 9705 | } |
9648 | break; | 9706 | break; |
9649 | } | 9707 | } |
9708 | |||
9709 | /* | ||
9710 | * This is a workaround for E3+84833 until autoneg | ||
9711 | * restart is fixed in f/w | ||
9712 | */ | ||
9713 | if (CHIP_IS_E3(bp)) { | ||
9714 | bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, | ||
9715 | MDIO_WC_REG_GP2_STATUS_GP_2_1, &val); | ||
9716 | } | ||
9650 | } | 9717 | } |
9718 | |||
9651 | /******************************************************************/ | 9719 | /******************************************************************/ |
9652 | /* 54616S PHY SECTION */ | 9720 | /* 54616S PHY SECTION */ |
9653 | /******************************************************************/ | 9721 | /******************************************************************/ |
@@ -11700,6 +11768,13 @@ static int bnx2x_ext_phy_common_init(struct bnx2x *bp, u32 shmem_base_path[], | |||
11700 | shmem2_base_path, | 11768 | shmem2_base_path, |
11701 | phy_index, chip_id); | 11769 | phy_index, chip_id); |
11702 | break; | 11770 | break; |
11771 | case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833: | ||
11772 | /* | ||
11773 | * GPIO3's are linked, and so both need to be toggled | ||
11774 | * to obtain required 2us pulse. | ||
11775 | */ | ||
11776 | rc = bnx2x_84833_common_init_phy(bp, shmem_base_path, chip_id); | ||
11777 | break; | ||
11703 | case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_FAILURE: | 11778 | case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_FAILURE: |
11704 | rc = -EINVAL; | 11779 | rc = -EINVAL; |
11705 | break; | 11780 | break; |
diff --git a/drivers/net/bnx2x/bnx2x_main.c b/drivers/net/bnx2x/bnx2x_main.c index 0dddba9532c1..29c67029c756 100644 --- a/drivers/net/bnx2x/bnx2x_main.c +++ b/drivers/net/bnx2x/bnx2x_main.c | |||
@@ -1955,6 +1955,53 @@ int bnx2x_set_gpio(struct bnx2x *bp, int gpio_num, u32 mode, u8 port) | |||
1955 | return 0; | 1955 | return 0; |
1956 | } | 1956 | } |
1957 | 1957 | ||
1958 | int bnx2x_set_mult_gpio(struct bnx2x *bp, u8 pins, u32 mode) | ||
1959 | { | ||
1960 | u32 gpio_reg = 0; | ||
1961 | int rc = 0; | ||
1962 | |||
1963 | /* Any port swapping should be handled by caller. */ | ||
1964 | |||
1965 | bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_GPIO); | ||
1966 | /* read GPIO and mask except the float bits */ | ||
1967 | gpio_reg = REG_RD(bp, MISC_REG_GPIO); | ||
1968 | gpio_reg &= ~(pins << MISC_REGISTERS_GPIO_FLOAT_POS); | ||
1969 | gpio_reg &= ~(pins << MISC_REGISTERS_GPIO_CLR_POS); | ||
1970 | gpio_reg &= ~(pins << MISC_REGISTERS_GPIO_SET_POS); | ||
1971 | |||
1972 | switch (mode) { | ||
1973 | case MISC_REGISTERS_GPIO_OUTPUT_LOW: | ||
1974 | DP(NETIF_MSG_LINK, "Set GPIO 0x%x -> output low\n", pins); | ||
1975 | /* set CLR */ | ||
1976 | gpio_reg |= (pins << MISC_REGISTERS_GPIO_CLR_POS); | ||
1977 | break; | ||
1978 | |||
1979 | case MISC_REGISTERS_GPIO_OUTPUT_HIGH: | ||
1980 | DP(NETIF_MSG_LINK, "Set GPIO 0x%x -> output high\n", pins); | ||
1981 | /* set SET */ | ||
1982 | gpio_reg |= (pins << MISC_REGISTERS_GPIO_SET_POS); | ||
1983 | break; | ||
1984 | |||
1985 | case MISC_REGISTERS_GPIO_INPUT_HI_Z: | ||
1986 | DP(NETIF_MSG_LINK, "Set GPIO 0x%x -> input\n", pins); | ||
1987 | /* set FLOAT */ | ||
1988 | gpio_reg |= (pins << MISC_REGISTERS_GPIO_FLOAT_POS); | ||
1989 | break; | ||
1990 | |||
1991 | default: | ||
1992 | BNX2X_ERR("Invalid GPIO mode assignment %d\n", mode); | ||
1993 | rc = -EINVAL; | ||
1994 | break; | ||
1995 | } | ||
1996 | |||
1997 | if (rc == 0) | ||
1998 | REG_WR(bp, MISC_REG_GPIO, gpio_reg); | ||
1999 | |||
2000 | bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_GPIO); | ||
2001 | |||
2002 | return rc; | ||
2003 | } | ||
2004 | |||
1958 | int bnx2x_set_gpio_int(struct bnx2x *bp, int gpio_num, u32 mode, u8 port) | 2005 | int bnx2x_set_gpio_int(struct bnx2x *bp, int gpio_num, u32 mode, u8 port) |
1959 | { | 2006 | { |
1960 | /* The GPIO should be swapped if swap register is set and active */ | 2007 | /* The GPIO should be swapped if swap register is set and active */ |