aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYaniv Rosner <yanivr@broadcom.com>2011-06-13 21:34:27 -0400
committerDavid S. Miller <davem@conan.davemloft.net>2011-06-15 10:56:57 -0400
commit0d40f0d425ec632956547bd8efd8965e5945e1dc (patch)
treeb2e2f76c427c8a6f130b82d1942fd3e57e82a6a5
parent6c3218c6f7e5be6d785486797d48203d54cfd893 (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.c85
-rw-r--r--drivers/net/bnx2x/bnx2x_main.c47
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
9202static 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
9201static int bnx2x_848x3_config_init(struct bnx2x_phy *phy, 9247static 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
1958int 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
1958int bnx2x_set_gpio_int(struct bnx2x *bp, int gpio_num, u32 mode, u8 port) 2005int 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 */