diff options
Diffstat (limited to 'drivers/net/tg3.c')
-rw-r--r-- | drivers/net/tg3.c | 417 |
1 files changed, 364 insertions, 53 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 54640686e983..201a550f0bcc 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -66,8 +66,8 @@ | |||
66 | 66 | ||
67 | #define DRV_MODULE_NAME "tg3" | 67 | #define DRV_MODULE_NAME "tg3" |
68 | #define PFX DRV_MODULE_NAME ": " | 68 | #define PFX DRV_MODULE_NAME ": " |
69 | #define DRV_MODULE_VERSION "3.33" | 69 | #define DRV_MODULE_VERSION "3.34" |
70 | #define DRV_MODULE_RELDATE "July 5, 2005" | 70 | #define DRV_MODULE_RELDATE "July 25, 2005" |
71 | 71 | ||
72 | #define TG3_DEF_MAC_MODE 0 | 72 | #define TG3_DEF_MAC_MODE 0 |
73 | #define TG3_DEF_RX_MODE 0 | 73 | #define TG3_DEF_RX_MODE 0 |
@@ -90,7 +90,7 @@ | |||
90 | /* hardware minimum and maximum for a single frame's data payload */ | 90 | /* hardware minimum and maximum for a single frame's data payload */ |
91 | #define TG3_MIN_MTU 60 | 91 | #define TG3_MIN_MTU 60 |
92 | #define TG3_MAX_MTU(tp) \ | 92 | #define TG3_MAX_MTU(tp) \ |
93 | (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS) ? 9000 : 1500) | 93 | ((tp->tg3_flags2 & TG3_FLG2_JUMBO_CAPABLE) ? 9000 : 1500) |
94 | 94 | ||
95 | /* These numbers seem to be hard coded in the NIC firmware somehow. | 95 | /* These numbers seem to be hard coded in the NIC firmware somehow. |
96 | * You can't change the ring sizes, but you can change where you place | 96 | * You can't change the ring sizes, but you can change where you place |
@@ -221,6 +221,10 @@ static struct pci_device_id tg3_pci_tbl[] = { | |||
221 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, | 221 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, |
222 | { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753F, | 222 | { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5753F, |
223 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, | 223 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, |
224 | { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5780, | ||
225 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, | ||
226 | { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5780S, | ||
227 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, | ||
224 | { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5781, | 228 | { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5781, |
225 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, | 229 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, |
226 | { PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9DXX, | 230 | { PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9DXX, |
@@ -508,6 +512,9 @@ static void tg3_switch_clocks(struct tg3 *tp) | |||
508 | u32 clock_ctrl = tr32(TG3PCI_CLOCK_CTRL); | 512 | u32 clock_ctrl = tr32(TG3PCI_CLOCK_CTRL); |
509 | u32 orig_clock_ctrl; | 513 | u32 orig_clock_ctrl; |
510 | 514 | ||
515 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780) | ||
516 | return; | ||
517 | |||
511 | orig_clock_ctrl = clock_ctrl; | 518 | orig_clock_ctrl = clock_ctrl; |
512 | clock_ctrl &= (CLOCK_CTRL_FORCE_CLKRUN | | 519 | clock_ctrl &= (CLOCK_CTRL_FORCE_CLKRUN | |
513 | CLOCK_CTRL_CLKRUN_OENABLE | | 520 | CLOCK_CTRL_CLKRUN_OENABLE | |
@@ -907,7 +914,7 @@ out: | |||
907 | if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) { | 914 | if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) { |
908 | /* Cannot do read-modify-write on 5401 */ | 915 | /* Cannot do read-modify-write on 5401 */ |
909 | tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4c20); | 916 | tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4c20); |
910 | } else if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) { | 917 | } else if (tp->tg3_flags2 & TG3_FLG2_JUMBO_CAPABLE) { |
911 | u32 phy_reg; | 918 | u32 phy_reg; |
912 | 919 | ||
913 | /* Set bit 14 with read-modify-write to preserve other bits */ | 920 | /* Set bit 14 with read-modify-write to preserve other bits */ |
@@ -919,7 +926,7 @@ out: | |||
919 | /* Set phy register 0x10 bit 0 to high fifo elasticity to support | 926 | /* Set phy register 0x10 bit 0 to high fifo elasticity to support |
920 | * jumbo frames transmission. | 927 | * jumbo frames transmission. |
921 | */ | 928 | */ |
922 | if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) { | 929 | if (tp->tg3_flags2 & TG3_FLG2_JUMBO_CAPABLE) { |
923 | u32 phy_reg; | 930 | u32 phy_reg; |
924 | 931 | ||
925 | if (!tg3_readphy(tp, MII_TG3_EXT_CTRL, &phy_reg)) | 932 | if (!tg3_readphy(tp, MII_TG3_EXT_CTRL, &phy_reg)) |
@@ -1093,7 +1100,7 @@ static int tg3_set_power_state(struct tg3 *tp, int state) | |||
1093 | tp->link_config.orig_autoneg = tp->link_config.autoneg; | 1100 | tp->link_config.orig_autoneg = tp->link_config.autoneg; |
1094 | } | 1101 | } |
1095 | 1102 | ||
1096 | if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) { | 1103 | if (!(tp->tg3_flags2 & TG3_FLG2_ANY_SERDES)) { |
1097 | tp->link_config.speed = SPEED_10; | 1104 | tp->link_config.speed = SPEED_10; |
1098 | tp->link_config.duplex = DUPLEX_HALF; | 1105 | tp->link_config.duplex = DUPLEX_HALF; |
1099 | tp->link_config.autoneg = AUTONEG_ENABLE; | 1106 | tp->link_config.autoneg = AUTONEG_ENABLE; |
@@ -1145,6 +1152,8 @@ static int tg3_set_power_state(struct tg3 *tp, int state) | |||
1145 | CLOCK_CTRL_ALTCLK | | 1152 | CLOCK_CTRL_ALTCLK | |
1146 | CLOCK_CTRL_PWRDOWN_PLL133); | 1153 | CLOCK_CTRL_PWRDOWN_PLL133); |
1147 | udelay(40); | 1154 | udelay(40); |
1155 | } else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780) { | ||
1156 | /* do nothing */ | ||
1148 | } else if (!((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) && | 1157 | } else if (!((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) && |
1149 | (tp->tg3_flags & TG3_FLAG_ENABLE_ASF))) { | 1158 | (tp->tg3_flags & TG3_FLAG_ENABLE_ASF))) { |
1150 | u32 newbits1, newbits2; | 1159 | u32 newbits1, newbits2; |
@@ -1238,6 +1247,25 @@ static void tg3_setup_flow_control(struct tg3 *tp, u32 local_adv, u32 remote_adv | |||
1238 | u32 old_tx_mode = tp->tx_mode; | 1247 | u32 old_tx_mode = tp->tx_mode; |
1239 | 1248 | ||
1240 | if (tp->tg3_flags & TG3_FLAG_PAUSE_AUTONEG) { | 1249 | if (tp->tg3_flags & TG3_FLAG_PAUSE_AUTONEG) { |
1250 | |||
1251 | /* Convert 1000BaseX flow control bits to 1000BaseT | ||
1252 | * bits before resolving flow control. | ||
1253 | */ | ||
1254 | if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) { | ||
1255 | local_adv &= ~(ADVERTISE_PAUSE_CAP | | ||
1256 | ADVERTISE_PAUSE_ASYM); | ||
1257 | remote_adv &= ~(LPA_PAUSE_CAP | LPA_PAUSE_ASYM); | ||
1258 | |||
1259 | if (local_adv & ADVERTISE_1000XPAUSE) | ||
1260 | local_adv |= ADVERTISE_PAUSE_CAP; | ||
1261 | if (local_adv & ADVERTISE_1000XPSE_ASYM) | ||
1262 | local_adv |= ADVERTISE_PAUSE_ASYM; | ||
1263 | if (remote_adv & LPA_1000XPAUSE) | ||
1264 | remote_adv |= LPA_PAUSE_CAP; | ||
1265 | if (remote_adv & LPA_1000XPAUSE_ASYM) | ||
1266 | remote_adv |= LPA_PAUSE_ASYM; | ||
1267 | } | ||
1268 | |||
1241 | if (local_adv & ADVERTISE_PAUSE_CAP) { | 1269 | if (local_adv & ADVERTISE_PAUSE_CAP) { |
1242 | if (local_adv & ADVERTISE_PAUSE_ASYM) { | 1270 | if (local_adv & ADVERTISE_PAUSE_ASYM) { |
1243 | if (remote_adv & LPA_PAUSE_CAP) | 1271 | if (remote_adv & LPA_PAUSE_CAP) |
@@ -2498,12 +2526,226 @@ static int tg3_setup_fiber_phy(struct tg3 *tp, int force_reset) | |||
2498 | return 0; | 2526 | return 0; |
2499 | } | 2527 | } |
2500 | 2528 | ||
2529 | static int tg3_setup_fiber_mii_phy(struct tg3 *tp, int force_reset) | ||
2530 | { | ||
2531 | int current_link_up, err = 0; | ||
2532 | u32 bmsr, bmcr; | ||
2533 | u16 current_speed; | ||
2534 | u8 current_duplex; | ||
2535 | |||
2536 | tp->mac_mode |= MAC_MODE_PORT_MODE_GMII; | ||
2537 | tw32_f(MAC_MODE, tp->mac_mode); | ||
2538 | udelay(40); | ||
2539 | |||
2540 | tw32(MAC_EVENT, 0); | ||
2541 | |||
2542 | tw32_f(MAC_STATUS, | ||
2543 | (MAC_STATUS_SYNC_CHANGED | | ||
2544 | MAC_STATUS_CFG_CHANGED | | ||
2545 | MAC_STATUS_MI_COMPLETION | | ||
2546 | MAC_STATUS_LNKSTATE_CHANGED)); | ||
2547 | udelay(40); | ||
2548 | |||
2549 | if (force_reset) | ||
2550 | tg3_phy_reset(tp); | ||
2551 | |||
2552 | current_link_up = 0; | ||
2553 | current_speed = SPEED_INVALID; | ||
2554 | current_duplex = DUPLEX_INVALID; | ||
2555 | |||
2556 | err |= tg3_readphy(tp, MII_BMSR, &bmsr); | ||
2557 | err |= tg3_readphy(tp, MII_BMSR, &bmsr); | ||
2558 | |||
2559 | err |= tg3_readphy(tp, MII_BMCR, &bmcr); | ||
2560 | |||
2561 | if ((tp->link_config.autoneg == AUTONEG_ENABLE) && !force_reset && | ||
2562 | (tp->tg3_flags2 & TG3_FLG2_PARALLEL_DETECT)) { | ||
2563 | /* do nothing, just check for link up at the end */ | ||
2564 | } else if (tp->link_config.autoneg == AUTONEG_ENABLE) { | ||
2565 | u32 adv, new_adv; | ||
2566 | |||
2567 | err |= tg3_readphy(tp, MII_ADVERTISE, &adv); | ||
2568 | new_adv = adv & ~(ADVERTISE_1000XFULL | ADVERTISE_1000XHALF | | ||
2569 | ADVERTISE_1000XPAUSE | | ||
2570 | ADVERTISE_1000XPSE_ASYM | | ||
2571 | ADVERTISE_SLCT); | ||
2572 | |||
2573 | /* Always advertise symmetric PAUSE just like copper */ | ||
2574 | new_adv |= ADVERTISE_1000XPAUSE; | ||
2575 | |||
2576 | if (tp->link_config.advertising & ADVERTISED_1000baseT_Half) | ||
2577 | new_adv |= ADVERTISE_1000XHALF; | ||
2578 | if (tp->link_config.advertising & ADVERTISED_1000baseT_Full) | ||
2579 | new_adv |= ADVERTISE_1000XFULL; | ||
2580 | |||
2581 | if ((new_adv != adv) || !(bmcr & BMCR_ANENABLE)) { | ||
2582 | tg3_writephy(tp, MII_ADVERTISE, new_adv); | ||
2583 | bmcr |= BMCR_ANENABLE | BMCR_ANRESTART; | ||
2584 | tg3_writephy(tp, MII_BMCR, bmcr); | ||
2585 | |||
2586 | tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED); | ||
2587 | tp->tg3_flags2 |= TG3_FLG2_PHY_JUST_INITTED; | ||
2588 | tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT; | ||
2589 | |||
2590 | return err; | ||
2591 | } | ||
2592 | } else { | ||
2593 | u32 new_bmcr; | ||
2594 | |||
2595 | bmcr &= ~BMCR_SPEED1000; | ||
2596 | new_bmcr = bmcr & ~(BMCR_ANENABLE | BMCR_FULLDPLX); | ||
2597 | |||
2598 | if (tp->link_config.duplex == DUPLEX_FULL) | ||
2599 | new_bmcr |= BMCR_FULLDPLX; | ||
2600 | |||
2601 | if (new_bmcr != bmcr) { | ||
2602 | /* BMCR_SPEED1000 is a reserved bit that needs | ||
2603 | * to be set on write. | ||
2604 | */ | ||
2605 | new_bmcr |= BMCR_SPEED1000; | ||
2606 | |||
2607 | /* Force a linkdown */ | ||
2608 | if (netif_carrier_ok(tp->dev)) { | ||
2609 | u32 adv; | ||
2610 | |||
2611 | err |= tg3_readphy(tp, MII_ADVERTISE, &adv); | ||
2612 | adv &= ~(ADVERTISE_1000XFULL | | ||
2613 | ADVERTISE_1000XHALF | | ||
2614 | ADVERTISE_SLCT); | ||
2615 | tg3_writephy(tp, MII_ADVERTISE, adv); | ||
2616 | tg3_writephy(tp, MII_BMCR, bmcr | | ||
2617 | BMCR_ANRESTART | | ||
2618 | BMCR_ANENABLE); | ||
2619 | udelay(10); | ||
2620 | netif_carrier_off(tp->dev); | ||
2621 | } | ||
2622 | tg3_writephy(tp, MII_BMCR, new_bmcr); | ||
2623 | bmcr = new_bmcr; | ||
2624 | err |= tg3_readphy(tp, MII_BMSR, &bmsr); | ||
2625 | err |= tg3_readphy(tp, MII_BMSR, &bmsr); | ||
2626 | tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT; | ||
2627 | } | ||
2628 | } | ||
2629 | |||
2630 | if (bmsr & BMSR_LSTATUS) { | ||
2631 | current_speed = SPEED_1000; | ||
2632 | current_link_up = 1; | ||
2633 | if (bmcr & BMCR_FULLDPLX) | ||
2634 | current_duplex = DUPLEX_FULL; | ||
2635 | else | ||
2636 | current_duplex = DUPLEX_HALF; | ||
2637 | |||
2638 | if (bmcr & BMCR_ANENABLE) { | ||
2639 | u32 local_adv, remote_adv, common; | ||
2640 | |||
2641 | err |= tg3_readphy(tp, MII_ADVERTISE, &local_adv); | ||
2642 | err |= tg3_readphy(tp, MII_LPA, &remote_adv); | ||
2643 | common = local_adv & remote_adv; | ||
2644 | if (common & (ADVERTISE_1000XHALF | | ||
2645 | ADVERTISE_1000XFULL)) { | ||
2646 | if (common & ADVERTISE_1000XFULL) | ||
2647 | current_duplex = DUPLEX_FULL; | ||
2648 | else | ||
2649 | current_duplex = DUPLEX_HALF; | ||
2650 | |||
2651 | tg3_setup_flow_control(tp, local_adv, | ||
2652 | remote_adv); | ||
2653 | } | ||
2654 | else | ||
2655 | current_link_up = 0; | ||
2656 | } | ||
2657 | } | ||
2658 | |||
2659 | tp->mac_mode &= ~MAC_MODE_HALF_DUPLEX; | ||
2660 | if (tp->link_config.active_duplex == DUPLEX_HALF) | ||
2661 | tp->mac_mode |= MAC_MODE_HALF_DUPLEX; | ||
2662 | |||
2663 | tw32_f(MAC_MODE, tp->mac_mode); | ||
2664 | udelay(40); | ||
2665 | |||
2666 | tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED); | ||
2667 | |||
2668 | tp->link_config.active_speed = current_speed; | ||
2669 | tp->link_config.active_duplex = current_duplex; | ||
2670 | |||
2671 | if (current_link_up != netif_carrier_ok(tp->dev)) { | ||
2672 | if (current_link_up) | ||
2673 | netif_carrier_on(tp->dev); | ||
2674 | else { | ||
2675 | netif_carrier_off(tp->dev); | ||
2676 | tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT; | ||
2677 | } | ||
2678 | tg3_link_report(tp); | ||
2679 | } | ||
2680 | return err; | ||
2681 | } | ||
2682 | |||
2683 | static void tg3_serdes_parallel_detect(struct tg3 *tp) | ||
2684 | { | ||
2685 | if (tp->tg3_flags2 & TG3_FLG2_PHY_JUST_INITTED) { | ||
2686 | /* Give autoneg time to complete. */ | ||
2687 | tp->tg3_flags2 &= ~TG3_FLG2_PHY_JUST_INITTED; | ||
2688 | return; | ||
2689 | } | ||
2690 | if (!netif_carrier_ok(tp->dev) && | ||
2691 | (tp->link_config.autoneg == AUTONEG_ENABLE)) { | ||
2692 | u32 bmcr; | ||
2693 | |||
2694 | tg3_readphy(tp, MII_BMCR, &bmcr); | ||
2695 | if (bmcr & BMCR_ANENABLE) { | ||
2696 | u32 phy1, phy2; | ||
2697 | |||
2698 | /* Select shadow register 0x1f */ | ||
2699 | tg3_writephy(tp, 0x1c, 0x7c00); | ||
2700 | tg3_readphy(tp, 0x1c, &phy1); | ||
2701 | |||
2702 | /* Select expansion interrupt status register */ | ||
2703 | tg3_writephy(tp, 0x17, 0x0f01); | ||
2704 | tg3_readphy(tp, 0x15, &phy2); | ||
2705 | tg3_readphy(tp, 0x15, &phy2); | ||
2706 | |||
2707 | if ((phy1 & 0x10) && !(phy2 & 0x20)) { | ||
2708 | /* We have signal detect and not receiving | ||
2709 | * config code words, link is up by parallel | ||
2710 | * detection. | ||
2711 | */ | ||
2712 | |||
2713 | bmcr &= ~BMCR_ANENABLE; | ||
2714 | bmcr |= BMCR_SPEED1000 | BMCR_FULLDPLX; | ||
2715 | tg3_writephy(tp, MII_BMCR, bmcr); | ||
2716 | tp->tg3_flags2 |= TG3_FLG2_PARALLEL_DETECT; | ||
2717 | } | ||
2718 | } | ||
2719 | } | ||
2720 | else if (netif_carrier_ok(tp->dev) && | ||
2721 | (tp->link_config.autoneg == AUTONEG_ENABLE) && | ||
2722 | (tp->tg3_flags2 & TG3_FLG2_PARALLEL_DETECT)) { | ||
2723 | u32 phy2; | ||
2724 | |||
2725 | /* Select expansion interrupt status register */ | ||
2726 | tg3_writephy(tp, 0x17, 0x0f01); | ||
2727 | tg3_readphy(tp, 0x15, &phy2); | ||
2728 | if (phy2 & 0x20) { | ||
2729 | u32 bmcr; | ||
2730 | |||
2731 | /* Config code words received, turn on autoneg. */ | ||
2732 | tg3_readphy(tp, MII_BMCR, &bmcr); | ||
2733 | tg3_writephy(tp, MII_BMCR, bmcr | BMCR_ANENABLE); | ||
2734 | |||
2735 | tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT; | ||
2736 | |||
2737 | } | ||
2738 | } | ||
2739 | } | ||
2740 | |||
2501 | static int tg3_setup_phy(struct tg3 *tp, int force_reset) | 2741 | static int tg3_setup_phy(struct tg3 *tp, int force_reset) |
2502 | { | 2742 | { |
2503 | int err; | 2743 | int err; |
2504 | 2744 | ||
2505 | if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) { | 2745 | if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) { |
2506 | err = tg3_setup_fiber_phy(tp, force_reset); | 2746 | err = tg3_setup_fiber_phy(tp, force_reset); |
2747 | } else if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) { | ||
2748 | err = tg3_setup_fiber_mii_phy(tp, force_reset); | ||
2507 | } else { | 2749 | } else { |
2508 | err = tg3_setup_copper_phy(tp, force_reset); | 2750 | err = tg3_setup_copper_phy(tp, force_reset); |
2509 | } | 2751 | } |
@@ -2612,7 +2854,7 @@ static int tg3_alloc_rx_skb(struct tg3 *tp, u32 opaque_key, | |||
2612 | map = &tp->rx_std_buffers[dest_idx]; | 2854 | map = &tp->rx_std_buffers[dest_idx]; |
2613 | if (src_idx >= 0) | 2855 | if (src_idx >= 0) |
2614 | src_map = &tp->rx_std_buffers[src_idx]; | 2856 | src_map = &tp->rx_std_buffers[src_idx]; |
2615 | skb_size = RX_PKT_BUF_SZ; | 2857 | skb_size = tp->rx_pkt_buf_sz; |
2616 | break; | 2858 | break; |
2617 | 2859 | ||
2618 | case RXD_OPAQUE_RING_JUMBO: | 2860 | case RXD_OPAQUE_RING_JUMBO: |
@@ -3434,10 +3676,18 @@ static inline void tg3_set_mtu(struct net_device *dev, struct tg3 *tp, | |||
3434 | { | 3676 | { |
3435 | dev->mtu = new_mtu; | 3677 | dev->mtu = new_mtu; |
3436 | 3678 | ||
3437 | if (new_mtu > ETH_DATA_LEN) | 3679 | if (new_mtu > ETH_DATA_LEN) { |
3438 | tp->tg3_flags |= TG3_FLAG_JUMBO_ENABLE; | 3680 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780) { |
3439 | else | 3681 | tp->tg3_flags2 &= ~TG3_FLG2_TSO_CAPABLE; |
3440 | tp->tg3_flags &= ~TG3_FLAG_JUMBO_ENABLE; | 3682 | ethtool_op_set_tso(dev, 0); |
3683 | } | ||
3684 | else | ||
3685 | tp->tg3_flags |= TG3_FLAG_JUMBO_RING_ENABLE; | ||
3686 | } else { | ||
3687 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780) | ||
3688 | tp->tg3_flags2 |= TG3_FLG2_TSO_CAPABLE; | ||
3689 | tp->tg3_flags &= ~TG3_FLAG_JUMBO_RING_ENABLE; | ||
3690 | } | ||
3441 | } | 3691 | } |
3442 | 3692 | ||
3443 | static int tg3_change_mtu(struct net_device *dev, int new_mtu) | 3693 | static int tg3_change_mtu(struct net_device *dev, int new_mtu) |
@@ -3491,7 +3741,7 @@ static void tg3_free_rings(struct tg3 *tp) | |||
3491 | continue; | 3741 | continue; |
3492 | pci_unmap_single(tp->pdev, | 3742 | pci_unmap_single(tp->pdev, |
3493 | pci_unmap_addr(rxp, mapping), | 3743 | pci_unmap_addr(rxp, mapping), |
3494 | RX_PKT_BUF_SZ - tp->rx_offset, | 3744 | tp->rx_pkt_buf_sz - tp->rx_offset, |
3495 | PCI_DMA_FROMDEVICE); | 3745 | PCI_DMA_FROMDEVICE); |
3496 | dev_kfree_skb_any(rxp->skb); | 3746 | dev_kfree_skb_any(rxp->skb); |
3497 | rxp->skb = NULL; | 3747 | rxp->skb = NULL; |
@@ -3564,6 +3814,11 @@ static void tg3_init_rings(struct tg3 *tp) | |||
3564 | memset(tp->rx_rcb, 0, TG3_RX_RCB_RING_BYTES(tp)); | 3814 | memset(tp->rx_rcb, 0, TG3_RX_RCB_RING_BYTES(tp)); |
3565 | memset(tp->tx_ring, 0, TG3_TX_RING_BYTES); | 3815 | memset(tp->tx_ring, 0, TG3_TX_RING_BYTES); |
3566 | 3816 | ||
3817 | tp->rx_pkt_buf_sz = RX_PKT_BUF_SZ; | ||
3818 | if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780) && | ||
3819 | (tp->dev->mtu > ETH_DATA_LEN)) | ||
3820 | tp->rx_pkt_buf_sz = RX_JUMBO_PKT_BUF_SZ; | ||
3821 | |||
3567 | /* Initialize invariants of the rings, we only set this | 3822 | /* Initialize invariants of the rings, we only set this |
3568 | * stuff once. This works because the card does not | 3823 | * stuff once. This works because the card does not |
3569 | * write into the rx buffer posting rings. | 3824 | * write into the rx buffer posting rings. |
@@ -3572,14 +3827,14 @@ static void tg3_init_rings(struct tg3 *tp) | |||
3572 | struct tg3_rx_buffer_desc *rxd; | 3827 | struct tg3_rx_buffer_desc *rxd; |
3573 | 3828 | ||
3574 | rxd = &tp->rx_std[i]; | 3829 | rxd = &tp->rx_std[i]; |
3575 | rxd->idx_len = (RX_PKT_BUF_SZ - tp->rx_offset - 64) | 3830 | rxd->idx_len = (tp->rx_pkt_buf_sz - tp->rx_offset - 64) |
3576 | << RXD_LEN_SHIFT; | 3831 | << RXD_LEN_SHIFT; |
3577 | rxd->type_flags = (RXD_FLAG_END << RXD_FLAGS_SHIFT); | 3832 | rxd->type_flags = (RXD_FLAG_END << RXD_FLAGS_SHIFT); |
3578 | rxd->opaque = (RXD_OPAQUE_RING_STD | | 3833 | rxd->opaque = (RXD_OPAQUE_RING_STD | |
3579 | (i << RXD_OPAQUE_INDEX_SHIFT)); | 3834 | (i << RXD_OPAQUE_INDEX_SHIFT)); |
3580 | } | 3835 | } |
3581 | 3836 | ||
3582 | if (tp->tg3_flags & TG3_FLAG_JUMBO_ENABLE) { | 3837 | if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) { |
3583 | for (i = 0; i < TG3_RX_JUMBO_RING_SIZE; i++) { | 3838 | for (i = 0; i < TG3_RX_JUMBO_RING_SIZE; i++) { |
3584 | struct tg3_rx_buffer_desc *rxd; | 3839 | struct tg3_rx_buffer_desc *rxd; |
3585 | 3840 | ||
@@ -3600,7 +3855,7 @@ static void tg3_init_rings(struct tg3 *tp) | |||
3600 | break; | 3855 | break; |
3601 | } | 3856 | } |
3602 | 3857 | ||
3603 | if (tp->tg3_flags & TG3_FLAG_JUMBO_ENABLE) { | 3858 | if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) { |
3604 | for (i = 0; i < tp->rx_jumbo_pending; i++) { | 3859 | for (i = 0; i < tp->rx_jumbo_pending; i++) { |
3605 | if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_JUMBO, | 3860 | if (tg3_alloc_rx_skb(tp, RXD_OPAQUE_RING_JUMBO, |
3606 | -1, i) < 0) | 3861 | -1, i) < 0) |
@@ -4056,7 +4311,30 @@ static int tg3_chip_reset(struct tg3 *tp) | |||
4056 | val &= ~PCIX_CAPS_RELAXED_ORDERING; | 4311 | val &= ~PCIX_CAPS_RELAXED_ORDERING; |
4057 | pci_write_config_dword(tp->pdev, TG3PCI_X_CAPS, val); | 4312 | pci_write_config_dword(tp->pdev, TG3PCI_X_CAPS, val); |
4058 | 4313 | ||
4059 | tw32(MEMARB_MODE, MEMARB_MODE_ENABLE); | 4314 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780) { |
4315 | u32 val; | ||
4316 | |||
4317 | /* Chip reset on 5780 will reset MSI enable bit, | ||
4318 | * so need to restore it. | ||
4319 | */ | ||
4320 | if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { | ||
4321 | u16 ctrl; | ||
4322 | |||
4323 | pci_read_config_word(tp->pdev, | ||
4324 | tp->msi_cap + PCI_MSI_FLAGS, | ||
4325 | &ctrl); | ||
4326 | pci_write_config_word(tp->pdev, | ||
4327 | tp->msi_cap + PCI_MSI_FLAGS, | ||
4328 | ctrl | PCI_MSI_FLAGS_ENABLE); | ||
4329 | val = tr32(MSGINT_MODE); | ||
4330 | tw32(MSGINT_MODE, val | MSGINT_MODE_ENABLE); | ||
4331 | } | ||
4332 | |||
4333 | val = tr32(MEMARB_MODE); | ||
4334 | tw32(MEMARB_MODE, val | MEMARB_MODE_ENABLE); | ||
4335 | |||
4336 | } else | ||
4337 | tw32(MEMARB_MODE, MEMARB_MODE_ENABLE); | ||
4060 | 4338 | ||
4061 | if (tp->pci_chip_rev_id == CHIPREV_ID_5750_A3) { | 4339 | if (tp->pci_chip_rev_id == CHIPREV_ID_5750_A3) { |
4062 | tg3_stop_fw(tp); | 4340 | tg3_stop_fw(tp); |
@@ -4082,6 +4360,9 @@ static int tg3_chip_reset(struct tg3 *tp) | |||
4082 | if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) { | 4360 | if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) { |
4083 | tp->mac_mode = MAC_MODE_PORT_MODE_TBI; | 4361 | tp->mac_mode = MAC_MODE_PORT_MODE_TBI; |
4084 | tw32_f(MAC_MODE, tp->mac_mode); | 4362 | tw32_f(MAC_MODE, tp->mac_mode); |
4363 | } else if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) { | ||
4364 | tp->mac_mode = MAC_MODE_PORT_MODE_GMII; | ||
4365 | tw32_f(MAC_MODE, tp->mac_mode); | ||
4085 | } else | 4366 | } else |
4086 | tw32_f(MAC_MODE, 0); | 4367 | tw32_f(MAC_MODE, 0); |
4087 | udelay(40); | 4368 | udelay(40); |
@@ -5245,7 +5526,7 @@ static int tg3_reset_hw(struct tg3 *tp) | |||
5245 | } | 5526 | } |
5246 | #endif | 5527 | #endif |
5247 | 5528 | ||
5248 | if (!(tp->tg3_flags & TG3_FLAG_JUMBO_ENABLE)) { | 5529 | if (tp->dev->mtu <= ETH_DATA_LEN) { |
5249 | tw32(BUFMGR_MB_RDMA_LOW_WATER, | 5530 | tw32(BUFMGR_MB_RDMA_LOW_WATER, |
5250 | tp->bufmgr_config.mbuf_read_dma_low_water); | 5531 | tp->bufmgr_config.mbuf_read_dma_low_water); |
5251 | tw32(BUFMGR_MB_MACRX_LOW_WATER, | 5532 | tw32(BUFMGR_MB_MACRX_LOW_WATER, |
@@ -5320,7 +5601,7 @@ static int tg3_reset_hw(struct tg3 *tp) | |||
5320 | /* Setup replenish threshold. */ | 5601 | /* Setup replenish threshold. */ |
5321 | tw32(RCVBDI_JUMBO_THRESH, tp->rx_jumbo_pending / 8); | 5602 | tw32(RCVBDI_JUMBO_THRESH, tp->rx_jumbo_pending / 8); |
5322 | 5603 | ||
5323 | if (tp->tg3_flags & TG3_FLAG_JUMBO_ENABLE) { | 5604 | if (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) { |
5324 | tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH, | 5605 | tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH, |
5325 | ((u64) tp->rx_jumbo_mapping >> 32)); | 5606 | ((u64) tp->rx_jumbo_mapping >> 32)); |
5326 | tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW, | 5607 | tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW, |
@@ -5381,7 +5662,7 @@ static int tg3_reset_hw(struct tg3 *tp) | |||
5381 | tw32_rx_mbox(MAILBOX_RCV_STD_PROD_IDX + TG3_64BIT_REG_LOW, | 5662 | tw32_rx_mbox(MAILBOX_RCV_STD_PROD_IDX + TG3_64BIT_REG_LOW, |
5382 | tp->rx_std_ptr); | 5663 | tp->rx_std_ptr); |
5383 | 5664 | ||
5384 | tp->rx_jumbo_ptr = (tp->tg3_flags & TG3_FLAG_JUMBO_ENABLE) ? | 5665 | tp->rx_jumbo_ptr = (tp->tg3_flags & TG3_FLAG_JUMBO_RING_ENABLE) ? |
5385 | tp->rx_jumbo_pending : 0; | 5666 | tp->rx_jumbo_pending : 0; |
5386 | tw32_rx_mbox(MAILBOX_RCV_JUMBO_PROD_IDX + TG3_64BIT_REG_LOW, | 5667 | tw32_rx_mbox(MAILBOX_RCV_JUMBO_PROD_IDX + TG3_64BIT_REG_LOW, |
5387 | tp->rx_jumbo_ptr); | 5668 | tp->rx_jumbo_ptr); |
@@ -5683,7 +5964,8 @@ static int tg3_reset_hw(struct tg3 *tp) | |||
5683 | tw32(MAC_RCV_RULE_1, 0x86000004 & RCV_RULE_DISABLE_MASK); | 5964 | tw32(MAC_RCV_RULE_1, 0x86000004 & RCV_RULE_DISABLE_MASK); |
5684 | tw32(MAC_RCV_VALUE_1, 0xffffffff & RCV_RULE_DISABLE_MASK); | 5965 | tw32(MAC_RCV_VALUE_1, 0xffffffff & RCV_RULE_DISABLE_MASK); |
5685 | 5966 | ||
5686 | if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) | 5967 | if ((tp->tg3_flags2 & TG3_FLG2_5705_PLUS) && |
5968 | (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5780)) | ||
5687 | limit = 8; | 5969 | limit = 8; |
5688 | else | 5970 | else |
5689 | limit = 16; | 5971 | limit = 16; |
@@ -5865,7 +6147,8 @@ static void tg3_timer(unsigned long __opaque) | |||
5865 | udelay(40); | 6147 | udelay(40); |
5866 | tg3_setup_phy(tp, 0); | 6148 | tg3_setup_phy(tp, 0); |
5867 | } | 6149 | } |
5868 | } | 6150 | } else if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) |
6151 | tg3_serdes_parallel_detect(tp); | ||
5869 | 6152 | ||
5870 | tp->timer_counter = tp->timer_multiplier; | 6153 | tp->timer_counter = tp->timer_multiplier; |
5871 | } | 6154 | } |
@@ -8569,8 +8852,12 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp) | |||
8569 | eeprom_phy_id = 0; | 8852 | eeprom_phy_id = 0; |
8570 | 8853 | ||
8571 | tp->phy_id = eeprom_phy_id; | 8854 | tp->phy_id = eeprom_phy_id; |
8572 | if (eeprom_phy_serdes) | 8855 | if (eeprom_phy_serdes) { |
8573 | tp->tg3_flags2 |= TG3_FLG2_PHY_SERDES; | 8856 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780) |
8857 | tp->tg3_flags2 |= TG3_FLG2_MII_SERDES; | ||
8858 | else | ||
8859 | tp->tg3_flags2 |= TG3_FLG2_PHY_SERDES; | ||
8860 | } | ||
8574 | 8861 | ||
8575 | if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) | 8862 | if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) |
8576 | led_cfg = cfg2 & (NIC_SRAM_DATA_CFG_LED_MODE_MASK | | 8863 | led_cfg = cfg2 & (NIC_SRAM_DATA_CFG_LED_MODE_MASK | |
@@ -8705,7 +8992,7 @@ static int __devinit tg3_phy_probe(struct tg3 *tp) | |||
8705 | } | 8992 | } |
8706 | } | 8993 | } |
8707 | 8994 | ||
8708 | if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) && | 8995 | if (!(tp->tg3_flags2 & TG3_FLG2_ANY_SERDES) && |
8709 | !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) { | 8996 | !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) { |
8710 | u32 bmsr, adv_reg, tg3_ctrl; | 8997 | u32 bmsr, adv_reg, tg3_ctrl; |
8711 | 8998 | ||
@@ -8758,7 +9045,7 @@ skip_phy_reset: | |||
8758 | err = tg3_init_5401phy_dsp(tp); | 9045 | err = tg3_init_5401phy_dsp(tp); |
8759 | } | 9046 | } |
8760 | 9047 | ||
8761 | if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) | 9048 | if (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES) |
8762 | tp->link_config.advertising = | 9049 | tp->link_config.advertising = |
8763 | (ADVERTISED_1000baseT_Half | | 9050 | (ADVERTISED_1000baseT_Half | |
8764 | ADVERTISED_1000baseT_Full | | 9051 | ADVERTISED_1000baseT_Full | |
@@ -8928,6 +9215,10 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
8928 | if (tp->pci_chip_rev_id == CHIPREV_ID_5752_A0_HW) | 9215 | if (tp->pci_chip_rev_id == CHIPREV_ID_5752_A0_HW) |
8929 | tp->pci_chip_rev_id = CHIPREV_ID_5752_A0; | 9216 | tp->pci_chip_rev_id = CHIPREV_ID_5752_A0; |
8930 | 9217 | ||
9218 | /* Find msi capability. */ | ||
9219 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780) | ||
9220 | tp->msi_cap = pci_find_capability(tp->pdev, PCI_CAP_ID_MSI); | ||
9221 | |||
8931 | /* Initialize misc host control in PCI block. */ | 9222 | /* Initialize misc host control in PCI block. */ |
8932 | tp->misc_host_ctrl |= (misc_ctrl_reg & | 9223 | tp->misc_host_ctrl |= (misc_ctrl_reg & |
8933 | MISC_HOST_CTRL_CHIPREV); | 9224 | MISC_HOST_CTRL_CHIPREV); |
@@ -8943,7 +9234,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
8943 | tp->pci_bist = (cacheline_sz_reg >> 24) & 0xff; | 9234 | tp->pci_bist = (cacheline_sz_reg >> 24) & 0xff; |
8944 | 9235 | ||
8945 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750 || | 9236 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750 || |
8946 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752) | 9237 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 || |
9238 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780) | ||
8947 | tp->tg3_flags2 |= TG3_FLG2_5750_PLUS; | 9239 | tp->tg3_flags2 |= TG3_FLG2_5750_PLUS; |
8948 | 9240 | ||
8949 | if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) || | 9241 | if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) || |
@@ -8953,6 +9245,11 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
8953 | if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) | 9245 | if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) |
8954 | tp->tg3_flags2 |= TG3_FLG2_HW_TSO; | 9246 | tp->tg3_flags2 |= TG3_FLG2_HW_TSO; |
8955 | 9247 | ||
9248 | if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705 && | ||
9249 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5750 && | ||
9250 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5752) | ||
9251 | tp->tg3_flags2 |= TG3_FLG2_JUMBO_CAPABLE; | ||
9252 | |||
8956 | if (pci_find_capability(tp->pdev, PCI_CAP_ID_EXP) != 0) | 9253 | if (pci_find_capability(tp->pdev, PCI_CAP_ID_EXP) != 0) |
8957 | tp->tg3_flags2 |= TG3_FLG2_PCI_EXPRESS; | 9254 | tp->tg3_flags2 |= TG3_FLG2_PCI_EXPRESS; |
8958 | 9255 | ||
@@ -9079,8 +9376,9 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
9079 | /* Derive initial jumbo mode from MTU assigned in | 9376 | /* Derive initial jumbo mode from MTU assigned in |
9080 | * ether_setup() via the alloc_etherdev() call | 9377 | * ether_setup() via the alloc_etherdev() call |
9081 | */ | 9378 | */ |
9082 | if (tp->dev->mtu > ETH_DATA_LEN) | 9379 | if (tp->dev->mtu > ETH_DATA_LEN && |
9083 | tp->tg3_flags |= TG3_FLAG_JUMBO_ENABLE; | 9380 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5780) |
9381 | tp->tg3_flags |= TG3_FLAG_JUMBO_RING_ENABLE; | ||
9084 | 9382 | ||
9085 | /* Determine WakeOnLan speed to use. */ | 9383 | /* Determine WakeOnLan speed to use. */ |
9086 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || | 9384 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || |
@@ -9096,7 +9394,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
9096 | if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700) || | 9394 | if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700) || |
9097 | ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) && | 9395 | ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) && |
9098 | (tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) && | 9396 | (tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) && |
9099 | (tp->pci_chip_rev_id != CHIPREV_ID_5705_A1))) | 9397 | (tp->pci_chip_rev_id != CHIPREV_ID_5705_A1)) || |
9398 | (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES)) | ||
9100 | tp->tg3_flags2 |= TG3_FLG2_NO_ETH_WIRE_SPEED; | 9399 | tp->tg3_flags2 |= TG3_FLG2_NO_ETH_WIRE_SPEED; |
9101 | 9400 | ||
9102 | if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5703_AX || | 9401 | if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5703_AX || |
@@ -9305,8 +9604,9 @@ static int __devinit tg3_get_device_address(struct tg3 *tp) | |||
9305 | #endif | 9604 | #endif |
9306 | 9605 | ||
9307 | mac_offset = 0x7c; | 9606 | mac_offset = 0x7c; |
9308 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 && | 9607 | if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 && |
9309 | !(tp->tg3_flags & TG3_FLG2_SUN_570X)) { | 9608 | !(tp->tg3_flags & TG3_FLG2_SUN_570X)) || |
9609 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780) { | ||
9310 | if (tr32(TG3PCI_DUAL_MAC_CTRL) & DUAL_MAC_CTRL_ID) | 9610 | if (tr32(TG3PCI_DUAL_MAC_CTRL) & DUAL_MAC_CTRL_ID) |
9311 | mac_offset = 0xcc; | 9611 | mac_offset = 0xcc; |
9312 | if (tg3_nvram_lock(tp)) | 9612 | if (tg3_nvram_lock(tp)) |
@@ -9620,6 +9920,9 @@ static int __devinit tg3_test_dma(struct tg3 *tp) | |||
9620 | 9920 | ||
9621 | /* Set bit 23 to enable PCIX hw bug fix */ | 9921 | /* Set bit 23 to enable PCIX hw bug fix */ |
9622 | tp->dma_rwctrl |= 0x009f0000; | 9922 | tp->dma_rwctrl |= 0x009f0000; |
9923 | } else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780) { | ||
9924 | /* 5780 always in PCIX mode */ | ||
9925 | tp->dma_rwctrl |= 0x00144000; | ||
9623 | } else { | 9926 | } else { |
9624 | tp->dma_rwctrl |= 0x001b000f; | 9927 | tp->dma_rwctrl |= 0x001b000f; |
9625 | } | 9928 | } |
@@ -9773,19 +10076,35 @@ static void __devinit tg3_init_link_config(struct tg3 *tp) | |||
9773 | 10076 | ||
9774 | static void __devinit tg3_init_bufmgr_config(struct tg3 *tp) | 10077 | static void __devinit tg3_init_bufmgr_config(struct tg3 *tp) |
9775 | { | 10078 | { |
9776 | tp->bufmgr_config.mbuf_read_dma_low_water = | 10079 | if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) { |
9777 | DEFAULT_MB_RDMA_LOW_WATER; | 10080 | tp->bufmgr_config.mbuf_read_dma_low_water = |
9778 | tp->bufmgr_config.mbuf_mac_rx_low_water = | 10081 | DEFAULT_MB_RDMA_LOW_WATER_5705; |
9779 | DEFAULT_MB_MACRX_LOW_WATER; | 10082 | tp->bufmgr_config.mbuf_mac_rx_low_water = |
9780 | tp->bufmgr_config.mbuf_high_water = | 10083 | DEFAULT_MB_MACRX_LOW_WATER_5705; |
9781 | DEFAULT_MB_HIGH_WATER; | 10084 | tp->bufmgr_config.mbuf_high_water = |
10085 | DEFAULT_MB_HIGH_WATER_5705; | ||
10086 | |||
10087 | tp->bufmgr_config.mbuf_read_dma_low_water_jumbo = | ||
10088 | DEFAULT_MB_RDMA_LOW_WATER_JUMBO_5780; | ||
10089 | tp->bufmgr_config.mbuf_mac_rx_low_water_jumbo = | ||
10090 | DEFAULT_MB_MACRX_LOW_WATER_JUMBO_5780; | ||
10091 | tp->bufmgr_config.mbuf_high_water_jumbo = | ||
10092 | DEFAULT_MB_HIGH_WATER_JUMBO_5780; | ||
10093 | } else { | ||
10094 | tp->bufmgr_config.mbuf_read_dma_low_water = | ||
10095 | DEFAULT_MB_RDMA_LOW_WATER; | ||
10096 | tp->bufmgr_config.mbuf_mac_rx_low_water = | ||
10097 | DEFAULT_MB_MACRX_LOW_WATER; | ||
10098 | tp->bufmgr_config.mbuf_high_water = | ||
10099 | DEFAULT_MB_HIGH_WATER; | ||
9782 | 10100 | ||
9783 | tp->bufmgr_config.mbuf_read_dma_low_water_jumbo = | 10101 | tp->bufmgr_config.mbuf_read_dma_low_water_jumbo = |
9784 | DEFAULT_MB_RDMA_LOW_WATER_JUMBO; | 10102 | DEFAULT_MB_RDMA_LOW_WATER_JUMBO; |
9785 | tp->bufmgr_config.mbuf_mac_rx_low_water_jumbo = | 10103 | tp->bufmgr_config.mbuf_mac_rx_low_water_jumbo = |
9786 | DEFAULT_MB_MACRX_LOW_WATER_JUMBO; | 10104 | DEFAULT_MB_MACRX_LOW_WATER_JUMBO; |
9787 | tp->bufmgr_config.mbuf_high_water_jumbo = | 10105 | tp->bufmgr_config.mbuf_high_water_jumbo = |
9788 | DEFAULT_MB_HIGH_WATER_JUMBO; | 10106 | DEFAULT_MB_HIGH_WATER_JUMBO; |
10107 | } | ||
9789 | 10108 | ||
9790 | tp->bufmgr_config.dma_low_water = DEFAULT_DMA_LOW_WATER; | 10109 | tp->bufmgr_config.dma_low_water = DEFAULT_DMA_LOW_WATER; |
9791 | tp->bufmgr_config.dma_high_water = DEFAULT_DMA_HIGH_WATER; | 10110 | tp->bufmgr_config.dma_high_water = DEFAULT_DMA_HIGH_WATER; |
@@ -9803,6 +10122,7 @@ static char * __devinit tg3_phy_string(struct tg3 *tp) | |||
9803 | case PHY_ID_BCM5705: return "5705"; | 10122 | case PHY_ID_BCM5705: return "5705"; |
9804 | case PHY_ID_BCM5750: return "5750"; | 10123 | case PHY_ID_BCM5750: return "5750"; |
9805 | case PHY_ID_BCM5752: return "5752"; | 10124 | case PHY_ID_BCM5752: return "5752"; |
10125 | case PHY_ID_BCM5780: return "5780"; | ||
9806 | case PHY_ID_BCM8002: return "8002/serdes"; | 10126 | case PHY_ID_BCM8002: return "8002/serdes"; |
9807 | case 0: return "serdes"; | 10127 | case 0: return "serdes"; |
9808 | default: return "unknown"; | 10128 | default: return "unknown"; |
@@ -9998,8 +10318,6 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
9998 | 10318 | ||
9999 | tg3_init_link_config(tp); | 10319 | tg3_init_link_config(tp); |
10000 | 10320 | ||
10001 | tg3_init_bufmgr_config(tp); | ||
10002 | |||
10003 | tp->rx_pending = TG3_DEF_RX_RING_PENDING; | 10321 | tp->rx_pending = TG3_DEF_RX_RING_PENDING; |
10004 | tp->rx_jumbo_pending = TG3_DEF_RX_JUMBO_RING_PENDING; | 10322 | tp->rx_jumbo_pending = TG3_DEF_RX_JUMBO_RING_PENDING; |
10005 | tp->tx_pending = TG3_DEF_TX_RING_PENDING; | 10323 | tp->tx_pending = TG3_DEF_TX_RING_PENDING; |
@@ -10028,14 +10346,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
10028 | goto err_out_iounmap; | 10346 | goto err_out_iounmap; |
10029 | } | 10347 | } |
10030 | 10348 | ||
10031 | if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) { | 10349 | tg3_init_bufmgr_config(tp); |
10032 | tp->bufmgr_config.mbuf_read_dma_low_water = | ||
10033 | DEFAULT_MB_RDMA_LOW_WATER_5705; | ||
10034 | tp->bufmgr_config.mbuf_mac_rx_low_water = | ||
10035 | DEFAULT_MB_MACRX_LOW_WATER_5705; | ||
10036 | tp->bufmgr_config.mbuf_high_water = | ||
10037 | DEFAULT_MB_HIGH_WATER_5705; | ||
10038 | } | ||
10039 | 10350 | ||
10040 | #if TG3_TSO_SUPPORT != 0 | 10351 | #if TG3_TSO_SUPPORT != 0 |
10041 | if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) { | 10352 | if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) { |