aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorYaniv Rosner <yanivr@broadcom.com>2012-10-31 01:46:54 -0400
committerDavid S. Miller <davem@davemloft.net>2012-11-01 11:31:53 -0400
commitcd1a26a3bbc797100c55594bac0546204ccb1107 (patch)
tree8163ad7068e440b1944ead5932a029943ead6023 /drivers/net
parenta75bb0010026f39910cd01d33a5baa47191539a0 (diff)
bnx2x: Restore global registers back to default.
Several KR registers were not set correctly back to default after loopback test, so set those global registers over the global WC lane (zero) rather than the current lane. Signed-off-by: Yaniv Rosner <yanivr@broadcom.com> Signed-off-by: Barak Witkowski <barak@broadcom.com> Signed-off-by: Dmitry Kravkov <dmitry@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c78
1 files changed, 56 insertions, 22 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
index f2436ea641a6..5e8f7b7a8f65 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
@@ -3558,13 +3558,11 @@ static void bnx2x_warpcore_set_lpi_passthrough(struct bnx2x_phy *phy,
3558static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy, 3558static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,
3559 struct link_params *params, 3559 struct link_params *params,
3560 struct link_vars *vars) { 3560 struct link_vars *vars) {
3561 u16 val16 = 0, lane, i, cl72_ctrl; 3561 u16 lane, i, cl72_ctrl, an_adv = 0;
3562 u16 ucode_ver;
3562 struct bnx2x *bp = params->bp; 3563 struct bnx2x *bp = params->bp;
3563 static struct bnx2x_reg_set reg_set[] = { 3564 static struct bnx2x_reg_set reg_set[] = {
3564 {MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2, 0x7}, 3565 {MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2, 0x7},
3565 {MDIO_AN_DEVAD, MDIO_WC_REG_PAR_DET_10G_CTRL, 0},
3566 {MDIO_WC_DEVAD, MDIO_WC_REG_XGXSBLK1_LANECTRL0, 0xff},
3567 {MDIO_WC_DEVAD, MDIO_WC_REG_XGXSBLK1_LANECTRL1, 0x5555},
3568 {MDIO_PMA_DEVAD, MDIO_WC_REG_IEEE0BLK_AUTONEGNP, 0x0}, 3566 {MDIO_PMA_DEVAD, MDIO_WC_REG_IEEE0BLK_AUTONEGNP, 0x0},
3569 {MDIO_WC_DEVAD, MDIO_WC_REG_RX66_CONTROL, 0x7415}, 3567 {MDIO_WC_DEVAD, MDIO_WC_REG_RX66_CONTROL, 0x7415},
3570 {MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_MISC2, 0x6190}, 3568 {MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_MISC2, 0x6190},
@@ -3589,7 +3587,7 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,
3589 (phy->speed_cap_mask & PORT_HW_CFG_SPEED_CAPABILITY_D0_1G)) || 3587 (phy->speed_cap_mask & PORT_HW_CFG_SPEED_CAPABILITY_D0_1G)) ||
3590 (vars->line_speed == SPEED_1000)) { 3588 (vars->line_speed == SPEED_1000)) {
3591 u32 addr = MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2; 3589 u32 addr = MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2;
3592 val16 |= (1<<5); 3590 an_adv |= (1<<5);
3593 3591
3594 /* Enable CL37 1G Parallel Detect */ 3592 /* Enable CL37 1G Parallel Detect */
3595 bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD, addr, 0x1); 3593 bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD, addr, 0x1);
@@ -3599,11 +3597,14 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,
3599 (phy->speed_cap_mask & PORT_HW_CFG_SPEED_CAPABILITY_D0_10G)) || 3597 (phy->speed_cap_mask & PORT_HW_CFG_SPEED_CAPABILITY_D0_10G)) ||
3600 (vars->line_speed == SPEED_10000)) { 3598 (vars->line_speed == SPEED_10000)) {
3601 /* Check adding advertisement for 10G KR */ 3599 /* Check adding advertisement for 10G KR */
3602 val16 |= (1<<7); 3600 an_adv |= (1<<7);
3603 /* Enable 10G Parallel Detect */ 3601 /* Enable 10G Parallel Detect */
3602 CL22_WR_OVER_CL45(bp, phy, MDIO_REG_BANK_AER_BLOCK,
3603 MDIO_AER_BLOCK_AER_REG, 0);
3604
3604 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, 3605 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD,
3605 MDIO_WC_REG_PAR_DET_10G_CTRL, 1); 3606 MDIO_WC_REG_PAR_DET_10G_CTRL, 1);
3606 3607 bnx2x_set_aer_mmd(params, phy);
3607 DP(NETIF_MSG_LINK, "Advertize 10G\n"); 3608 DP(NETIF_MSG_LINK, "Advertize 10G\n");
3608 } 3609 }
3609 3610
@@ -3623,7 +3624,7 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,
3623 3624
3624 /* Advertised speeds */ 3625 /* Advertised speeds */
3625 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, 3626 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD,
3626 MDIO_WC_REG_AN_IEEE1BLK_AN_ADVERTISEMENT1, val16); 3627 MDIO_WC_REG_AN_IEEE1BLK_AN_ADVERTISEMENT1, an_adv);
3627 3628
3628 /* Advertised and set FEC (Forward Error Correction) */ 3629 /* Advertised and set FEC (Forward Error Correction) */
3629 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD, 3630 bnx2x_cl45_write(bp, phy, MDIO_AN_DEVAD,
@@ -3647,9 +3648,10 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,
3647 /* Set KR Autoneg Work-Around flag for Warpcore version older than D108 3648 /* Set KR Autoneg Work-Around flag for Warpcore version older than D108
3648 */ 3649 */
3649 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, 3650 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD,
3650 MDIO_WC_REG_UC_INFO_B1_VERSION, &val16); 3651 MDIO_WC_REG_UC_INFO_B1_VERSION, &ucode_ver);
3651 if (val16 < 0xd108) { 3652 if (ucode_ver < 0xd108) {
3652 DP(NETIF_MSG_LINK, "Enable AN KR work-around\n"); 3653 DP(NETIF_MSG_LINK, "Enable AN KR work-around. WC ver:0x%x\n",
3654 ucode_ver);
3653 vars->rx_tx_asic_rst = MAX_KR_LINK_RETRY; 3655 vars->rx_tx_asic_rst = MAX_KR_LINK_RETRY;
3654 } 3656 }
3655 bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD, 3657 bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD,
@@ -3670,21 +3672,16 @@ static void bnx2x_warpcore_set_10G_KR(struct bnx2x_phy *phy,
3670 struct link_vars *vars) 3672 struct link_vars *vars)
3671{ 3673{
3672 struct bnx2x *bp = params->bp; 3674 struct bnx2x *bp = params->bp;
3673 u16 i; 3675 u16 val16, i, lane;
3674 static struct bnx2x_reg_set reg_set[] = { 3676 static struct bnx2x_reg_set reg_set[] = {
3675 /* Disable Autoneg */ 3677 /* Disable Autoneg */
3676 {MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2, 0x7}, 3678 {MDIO_WC_DEVAD, MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X2, 0x7},
3677 {MDIO_AN_DEVAD, MDIO_WC_REG_PAR_DET_10G_CTRL, 0},
3678 {MDIO_WC_DEVAD, MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, 3679 {MDIO_WC_DEVAD, MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL,
3679 0x3f00}, 3680 0x3f00},
3680 {MDIO_AN_DEVAD, MDIO_WC_REG_AN_IEEE1BLK_AN_ADVERTISEMENT1, 0}, 3681 {MDIO_AN_DEVAD, MDIO_WC_REG_AN_IEEE1BLK_AN_ADVERTISEMENT1, 0},
3681 {MDIO_AN_DEVAD, MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x0}, 3682 {MDIO_AN_DEVAD, MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x0},
3682 {MDIO_WC_DEVAD, MDIO_WC_REG_DIGITAL3_UP1, 0x1}, 3683 {MDIO_WC_DEVAD, MDIO_WC_REG_DIGITAL3_UP1, 0x1},
3683 {MDIO_WC_DEVAD, MDIO_WC_REG_DIGITAL5_MISC7, 0xa}, 3684 {MDIO_WC_DEVAD, MDIO_WC_REG_DIGITAL5_MISC7, 0xa},
3684 /* Disable CL36 PCS Tx */
3685 {MDIO_WC_DEVAD, MDIO_WC_REG_XGXSBLK1_LANECTRL0, 0x0},
3686 /* Double Wide Single Data Rate @ pll rate */
3687 {MDIO_WC_DEVAD, MDIO_WC_REG_XGXSBLK1_LANECTRL1, 0xFFFF},
3688 /* Leave cl72 training enable, needed for KR */ 3685 /* Leave cl72 training enable, needed for KR */
3689 {MDIO_PMA_DEVAD, 3686 {MDIO_PMA_DEVAD,
3690 MDIO_WC_REG_PMD_IEEE9BLK_TENGBASE_KR_PMD_CONTROL_REGISTER_150, 3687 MDIO_WC_REG_PMD_IEEE9BLK_TENGBASE_KR_PMD_CONTROL_REGISTER_150,
@@ -3695,11 +3692,24 @@ static void bnx2x_warpcore_set_10G_KR(struct bnx2x_phy *phy,
3695 bnx2x_cl45_write(bp, phy, reg_set[i].devad, reg_set[i].reg, 3692 bnx2x_cl45_write(bp, phy, reg_set[i].devad, reg_set[i].reg,
3696 reg_set[i].val); 3693 reg_set[i].val);
3697 3694
3698 /* Leave CL72 enabled */ 3695 lane = bnx2x_get_warpcore_lane(phy, params);
3699 bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD, 3696 /* Global registers */
3700 MDIO_WC_REG_CL72_USERB0_CL72_MISC1_CONTROL, 3697 CL22_WR_OVER_CL45(bp, phy, MDIO_REG_BANK_AER_BLOCK,
3701 0x3800); 3698 MDIO_AER_BLOCK_AER_REG, 0);
3699 /* Disable CL36 PCS Tx */
3700 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD,
3701 MDIO_WC_REG_XGXSBLK1_LANECTRL0, &val16);
3702 val16 &= ~(0x0011 << lane);
3703 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
3704 MDIO_WC_REG_XGXSBLK1_LANECTRL0, val16);
3702 3705
3706 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD,
3707 MDIO_WC_REG_XGXSBLK1_LANECTRL1, &val16);
3708 val16 |= (0x0303 << (lane << 1));
3709 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
3710 MDIO_WC_REG_XGXSBLK1_LANECTRL1, val16);
3711 /* Restore AER */
3712 bnx2x_set_aer_mmd(params, phy);
3703 /* Set speed via PMA/PMD register */ 3713 /* Set speed via PMA/PMD register */
3704 bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, 3714 bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD,
3705 MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x2040); 3715 MDIO_WC_REG_IEEE0BLK_MIICNTL, 0x2040);
@@ -4322,7 +4332,7 @@ static void bnx2x_warpcore_link_reset(struct bnx2x_phy *phy,
4322 struct link_params *params) 4332 struct link_params *params)
4323{ 4333{
4324 struct bnx2x *bp = params->bp; 4334 struct bnx2x *bp = params->bp;
4325 u16 val16; 4335 u16 val16, lane;
4326 bnx2x_sfp_e3_set_transmitter(params, phy, 0); 4336 bnx2x_sfp_e3_set_transmitter(params, phy, 0);
4327 bnx2x_set_mdio_clk(bp, params->chip_id, params->port); 4337 bnx2x_set_mdio_clk(bp, params->chip_id, params->port);
4328 bnx2x_set_aer_mmd(params, phy); 4338 bnx2x_set_aer_mmd(params, phy);
@@ -4359,6 +4369,30 @@ static void bnx2x_warpcore_link_reset(struct bnx2x_phy *phy,
4359 MDIO_WC_REG_XGXSBLK1_LANECTRL2, 4369 MDIO_WC_REG_XGXSBLK1_LANECTRL2,
4360 val16 & 0xff00); 4370 val16 & 0xff00);
4361 4371
4372 lane = bnx2x_get_warpcore_lane(phy, params);
4373 /* Disable CL36 PCS Tx */
4374 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD,
4375 MDIO_WC_REG_XGXSBLK1_LANECTRL0, &val16);
4376 val16 |= (0x11 << lane);
4377 if (phy->flags & FLAGS_WC_DUAL_MODE)
4378 val16 |= (0x22 << lane);
4379 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
4380 MDIO_WC_REG_XGXSBLK1_LANECTRL0, val16);
4381
4382 bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD,
4383 MDIO_WC_REG_XGXSBLK1_LANECTRL1, &val16);
4384 val16 &= ~(0x0303 << (lane << 1));
4385 val16 |= (0x0101 << (lane << 1));
4386 if (phy->flags & FLAGS_WC_DUAL_MODE) {
4387 val16 &= ~(0x0c0c << (lane << 1));
4388 val16 |= (0x0404 << (lane << 1));
4389 }
4390
4391 bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD,
4392 MDIO_WC_REG_XGXSBLK1_LANECTRL1, val16);
4393 /* Restore AER */
4394 bnx2x_set_aer_mmd(params, phy);
4395
4362} 4396}
4363 4397
4364static void bnx2x_set_warpcore_loopback(struct bnx2x_phy *phy, 4398static void bnx2x_set_warpcore_loopback(struct bnx2x_phy *phy,