diff options
Diffstat (limited to 'drivers/net/tg3.c')
-rw-r--r-- | drivers/net/tg3.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 6575e9bc170f..3caead4c2702 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -1695,7 +1695,7 @@ static void tg3_setup_flow_control(struct tg3 *tp, u32 local_adv, u32 remote_adv | |||
1695 | u32 old_tx_mode = tp->tx_mode; | 1695 | u32 old_tx_mode = tp->tx_mode; |
1696 | 1696 | ||
1697 | if (tp->tg3_flags & TG3_FLAG_PAUSE_AUTONEG) { | 1697 | if (tp->tg3_flags & TG3_FLAG_PAUSE_AUTONEG) { |
1698 | if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) | 1698 | if (tp->tg3_flags2 & (TG3_FLG2_MII_SERDES|TG3_FLG2_HW_AUTONEG)) |
1699 | new_tg3_flags = tg3_resolve_flowctrl_1000X(local_adv, | 1699 | new_tg3_flags = tg3_resolve_flowctrl_1000X(local_adv, |
1700 | remote_adv); | 1700 | remote_adv); |
1701 | else | 1701 | else |
@@ -2658,6 +2658,7 @@ static void tg3_init_bcm8002(struct tg3 *tp) | |||
2658 | 2658 | ||
2659 | static int tg3_setup_fiber_hw_autoneg(struct tg3 *tp, u32 mac_status) | 2659 | static int tg3_setup_fiber_hw_autoneg(struct tg3 *tp, u32 mac_status) |
2660 | { | 2660 | { |
2661 | u16 flowctrl; | ||
2661 | u32 sg_dig_ctrl, sg_dig_status; | 2662 | u32 sg_dig_ctrl, sg_dig_status; |
2662 | u32 serdes_cfg, expected_sg_dig_ctrl; | 2663 | u32 serdes_cfg, expected_sg_dig_ctrl; |
2663 | int workaround, port_a; | 2664 | int workaround, port_a; |
@@ -2706,11 +2707,11 @@ static int tg3_setup_fiber_hw_autoneg(struct tg3 *tp, u32 mac_status) | |||
2706 | /* Want auto-negotiation. */ | 2707 | /* Want auto-negotiation. */ |
2707 | expected_sg_dig_ctrl = SG_DIG_USING_HW_AUTONEG | SG_DIG_COMMON_SETUP; | 2708 | expected_sg_dig_ctrl = SG_DIG_USING_HW_AUTONEG | SG_DIG_COMMON_SETUP; |
2708 | 2709 | ||
2709 | /* Pause capability */ | 2710 | flowctrl = tg3_advert_flowctrl_1000X(tp->link_config.flowctrl); |
2710 | expected_sg_dig_ctrl |= SG_DIG_PAUSE_CAP; | 2711 | if (flowctrl & ADVERTISE_1000XPAUSE) |
2711 | 2712 | expected_sg_dig_ctrl |= SG_DIG_PAUSE_CAP; | |
2712 | /* Asymettric pause */ | 2713 | if (flowctrl & ADVERTISE_1000XPSE_ASYM) |
2713 | expected_sg_dig_ctrl |= SG_DIG_ASYM_PAUSE; | 2714 | expected_sg_dig_ctrl |= SG_DIG_ASYM_PAUSE; |
2714 | 2715 | ||
2715 | if (sg_dig_ctrl != expected_sg_dig_ctrl) { | 2716 | if (sg_dig_ctrl != expected_sg_dig_ctrl) { |
2716 | if ((tp->tg3_flags2 & TG3_FLG2_PARALLEL_DETECT) && | 2717 | if ((tp->tg3_flags2 & TG3_FLG2_PARALLEL_DETECT) && |
@@ -2738,14 +2739,17 @@ restart_autoneg: | |||
2738 | 2739 | ||
2739 | if ((sg_dig_status & SG_DIG_AUTONEG_COMPLETE) && | 2740 | if ((sg_dig_status & SG_DIG_AUTONEG_COMPLETE) && |
2740 | (mac_status & MAC_STATUS_PCS_SYNCED)) { | 2741 | (mac_status & MAC_STATUS_PCS_SYNCED)) { |
2741 | u32 local_adv, remote_adv; | 2742 | u32 local_adv = 0, remote_adv = 0; |
2743 | |||
2744 | if (sg_dig_ctrl & SG_DIG_PAUSE_CAP) | ||
2745 | local_adv |= ADVERTISE_1000XPAUSE; | ||
2746 | if (sg_dig_ctrl & SG_DIG_ASYM_PAUSE) | ||
2747 | local_adv |= ADVERTISE_1000XPSE_ASYM; | ||
2742 | 2748 | ||
2743 | local_adv = ADVERTISE_PAUSE_CAP; | ||
2744 | remote_adv = 0; | ||
2745 | if (sg_dig_status & SG_DIG_PARTNER_PAUSE_CAPABLE) | 2749 | if (sg_dig_status & SG_DIG_PARTNER_PAUSE_CAPABLE) |
2746 | remote_adv |= LPA_PAUSE_CAP; | 2750 | remote_adv |= LPA_1000XPAUSE; |
2747 | if (sg_dig_status & SG_DIG_PARTNER_ASYM_PAUSE) | 2751 | if (sg_dig_status & SG_DIG_PARTNER_ASYM_PAUSE) |
2748 | remote_adv |= LPA_PAUSE_ASYM; | 2752 | remote_adv |= LPA_1000XPAUSE_ASYM; |
2749 | 2753 | ||
2750 | tg3_setup_flow_control(tp, local_adv, remote_adv); | 2754 | tg3_setup_flow_control(tp, local_adv, remote_adv); |
2751 | current_link_up = 1; | 2755 | current_link_up = 1; |