diff options
author | Michael Chan <mchan@broadcom.com> | 2006-09-27 19:06:21 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-09-28 21:01:40 -0400 |
commit | b5d3772ccbe0bc5ac8ffbb5356b74ca698aee28c (patch) | |
tree | ef5f1e64d6e656a4931e22efed5809eb42d0e39f /drivers | |
parent | 7a6f4369449a471a6e5718a87c53ac75a46960ba (diff) |
[TG3]: Add basic 5906 support.
Add support for the new 5709 device. This is a new 10/100 Mbps chip.
The mailbox access and firmware interface are quite different from
all other tg3 chips.
Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/tg3.c | 126 | ||||
-rw-r--r-- | drivers/net/tg3.h | 28 |
2 files changed, 139 insertions, 15 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index eafca2a0dd00..2b062d776511 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -199,6 +199,8 @@ static struct pci_device_id tg3_pci_tbl[] = { | |||
199 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5780)}, | 199 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5780)}, |
200 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5780S)}, | 200 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5780S)}, |
201 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5781)}, | 201 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5781)}, |
202 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5906)}, | ||
203 | {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5906M)}, | ||
202 | {PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9DXX)}, | 204 | {PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9DXX)}, |
203 | {PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9MXX)}, | 205 | {PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_9MXX)}, |
204 | {PCI_DEVICE(PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1000)}, | 206 | {PCI_DEVICE(PCI_VENDOR_ID_ALTIMA, PCI_DEVICE_ID_ALTIMA_AC1000)}, |
@@ -426,6 +428,16 @@ static void tg3_write32_tx_mbox(struct tg3 *tp, u32 off, u32 val) | |||
426 | readl(mbox); | 428 | readl(mbox); |
427 | } | 429 | } |
428 | 430 | ||
431 | static u32 tg3_read32_mbox_5906(struct tg3 *tp, u32 off) | ||
432 | { | ||
433 | return (readl(tp->regs + off + GRCMBOX_BASE)); | ||
434 | } | ||
435 | |||
436 | static void tg3_write32_mbox_5906(struct tg3 *tp, u32 off, u32 val) | ||
437 | { | ||
438 | writel(val, tp->regs + off + GRCMBOX_BASE); | ||
439 | } | ||
440 | |||
429 | #define tw32_mailbox(reg, val) tp->write32_mbox(tp, reg, val) | 441 | #define tw32_mailbox(reg, val) tp->write32_mbox(tp, reg, val) |
430 | #define tw32_mailbox_f(reg, val) tw32_mailbox_flush(tp, (reg), (val)) | 442 | #define tw32_mailbox_f(reg, val) tw32_mailbox_flush(tp, (reg), (val)) |
431 | #define tw32_rx_mbox(reg, val) tp->write32_rx_mbox(tp, reg, val) | 443 | #define tw32_rx_mbox(reg, val) tp->write32_rx_mbox(tp, reg, val) |
@@ -441,6 +453,10 @@ static void tg3_write_mem(struct tg3 *tp, u32 off, u32 val) | |||
441 | { | 453 | { |
442 | unsigned long flags; | 454 | unsigned long flags; |
443 | 455 | ||
456 | if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) && | ||
457 | (off >= NIC_SRAM_STATS_BLK) && (off < NIC_SRAM_TX_BUFFER_DESC)) | ||
458 | return; | ||
459 | |||
444 | spin_lock_irqsave(&tp->indirect_lock, flags); | 460 | spin_lock_irqsave(&tp->indirect_lock, flags); |
445 | if (tp->tg3_flags & TG3_FLAG_SRAM_USE_CONFIG) { | 461 | if (tp->tg3_flags & TG3_FLAG_SRAM_USE_CONFIG) { |
446 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off); | 462 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off); |
@@ -462,6 +478,12 @@ static void tg3_read_mem(struct tg3 *tp, u32 off, u32 *val) | |||
462 | { | 478 | { |
463 | unsigned long flags; | 479 | unsigned long flags; |
464 | 480 | ||
481 | if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) && | ||
482 | (off >= NIC_SRAM_STATS_BLK) && (off < NIC_SRAM_TX_BUFFER_DESC)) { | ||
483 | *val = 0; | ||
484 | return; | ||
485 | } | ||
486 | |||
465 | spin_lock_irqsave(&tp->indirect_lock, flags); | 487 | spin_lock_irqsave(&tp->indirect_lock, flags); |
466 | if (tp->tg3_flags & TG3_FLAG_SRAM_USE_CONFIG) { | 488 | if (tp->tg3_flags & TG3_FLAG_SRAM_USE_CONFIG) { |
467 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off); | 489 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off); |
@@ -491,6 +513,9 @@ static inline void tg3_cond_int(struct tg3 *tp) | |||
491 | if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) && | 513 | if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS) && |
492 | (tp->hw_status->status & SD_STATUS_UPDATED)) | 514 | (tp->hw_status->status & SD_STATUS_UPDATED)) |
493 | tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl | GRC_LCLCTRL_SETINT); | 515 | tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl | GRC_LCLCTRL_SETINT); |
516 | else | ||
517 | tw32(HOSTCC_MODE, tp->coalesce_mode | | ||
518 | (HOSTCC_MODE_ENABLE | HOSTCC_MODE_NOW)); | ||
494 | } | 519 | } |
495 | 520 | ||
496 | static void tg3_enable_ints(struct tg3 *tp) | 521 | static void tg3_enable_ints(struct tg3 *tp) |
@@ -656,6 +681,10 @@ static int tg3_writephy(struct tg3 *tp, int reg, u32 val) | |||
656 | unsigned int loops; | 681 | unsigned int loops; |
657 | int ret; | 682 | int ret; |
658 | 683 | ||
684 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906 && | ||
685 | (reg == MII_TG3_CTRL || reg == MII_TG3_AUX_CTRL)) | ||
686 | return 0; | ||
687 | |||
659 | if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) { | 688 | if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) { |
660 | tw32_f(MAC_MI_MODE, | 689 | tw32_f(MAC_MI_MODE, |
661 | (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL)); | 690 | (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL)); |
@@ -1207,7 +1236,12 @@ static int tg3_set_power_state(struct tg3 *tp, pci_power_t state) | |||
1207 | tg3_setup_phy(tp, 0); | 1236 | tg3_setup_phy(tp, 0); |
1208 | } | 1237 | } |
1209 | 1238 | ||
1210 | if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) { | 1239 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { |
1240 | u32 val; | ||
1241 | |||
1242 | val = tr32(GRC_VCPU_EXT_CTRL); | ||
1243 | tw32(GRC_VCPU_EXT_CTRL, val | GRC_VCPU_EXT_CTRL_DISABLE_WOL); | ||
1244 | } else if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) { | ||
1211 | int i; | 1245 | int i; |
1212 | u32 val; | 1246 | u32 val; |
1213 | 1247 | ||
@@ -4667,6 +4701,15 @@ static int tg3_poll_fw(struct tg3 *tp) | |||
4667 | int i; | 4701 | int i; |
4668 | u32 val; | 4702 | u32 val; |
4669 | 4703 | ||
4704 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { | ||
4705 | for (i = 0; i < 400; i++) { | ||
4706 | if (tr32(VCPU_STATUS) & VCPU_STATUS_INIT_DONE) | ||
4707 | return 0; | ||
4708 | udelay(10); | ||
4709 | } | ||
4710 | return -ENODEV; | ||
4711 | } | ||
4712 | |||
4670 | /* Wait for firmware initialization to complete. */ | 4713 | /* Wait for firmware initialization to complete. */ |
4671 | for (i = 0; i < 100000; i++) { | 4714 | for (i = 0; i < 100000; i++) { |
4672 | tg3_read_mem(tp, NIC_SRAM_FIRMWARE_MBOX, &val); | 4715 | tg3_read_mem(tp, NIC_SRAM_FIRMWARE_MBOX, &val); |
@@ -4735,6 +4778,12 @@ static int tg3_chip_reset(struct tg3 *tp) | |||
4735 | } | 4778 | } |
4736 | } | 4779 | } |
4737 | 4780 | ||
4781 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { | ||
4782 | tw32(VCPU_STATUS, tr32(VCPU_STATUS) | VCPU_STATUS_DRV_RESET); | ||
4783 | tw32(GRC_VCPU_EXT_CTRL, | ||
4784 | tr32(GRC_VCPU_EXT_CTRL) & ~GRC_VCPU_EXT_CTRL_HALT_CPU); | ||
4785 | } | ||
4786 | |||
4738 | if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) | 4787 | if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) |
4739 | val |= GRC_MISC_CFG_KEEP_GPHY_POWER; | 4788 | val |= GRC_MISC_CFG_KEEP_GPHY_POWER; |
4740 | tw32(GRC_MISC_CFG, val); | 4789 | tw32(GRC_MISC_CFG, val); |
@@ -5066,6 +5115,12 @@ static int tg3_halt_cpu(struct tg3 *tp, u32 offset) | |||
5066 | BUG_ON(offset == TX_CPU_BASE && | 5115 | BUG_ON(offset == TX_CPU_BASE && |
5067 | (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)); | 5116 | (tp->tg3_flags2 & TG3_FLG2_5705_PLUS)); |
5068 | 5117 | ||
5118 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { | ||
5119 | u32 val = tr32(GRC_VCPU_EXT_CTRL); | ||
5120 | |||
5121 | tw32(GRC_VCPU_EXT_CTRL, val | GRC_VCPU_EXT_CTRL_HALT_CPU); | ||
5122 | return 0; | ||
5123 | } | ||
5069 | if (offset == RX_CPU_BASE) { | 5124 | if (offset == RX_CPU_BASE) { |
5070 | for (i = 0; i < 10000; i++) { | 5125 | for (i = 0; i < 10000; i++) { |
5071 | tw32(offset + CPU_STATE, 0xffffffff); | 5126 | tw32(offset + CPU_STATE, 0xffffffff); |
@@ -6070,6 +6125,13 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) | |||
6070 | val = 1; | 6125 | val = 1; |
6071 | else if (val > tp->rx_std_max_post) | 6126 | else if (val > tp->rx_std_max_post) |
6072 | val = tp->rx_std_max_post; | 6127 | val = tp->rx_std_max_post; |
6128 | else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { | ||
6129 | if (tp->pci_chip_rev_id == CHIPREV_ID_5906_A1) | ||
6130 | tw32(ISO_PKT_TX, (tr32(ISO_PKT_TX) & ~0x3) | 0x2); | ||
6131 | |||
6132 | if (val > (TG3_RX_INTERNAL_RING_SZ_5906 / 2)) | ||
6133 | val = TG3_RX_INTERNAL_RING_SZ_5906 / 2; | ||
6134 | } | ||
6073 | 6135 | ||
6074 | tw32(RCVBDI_STD_THRESH, val); | 6136 | tw32(RCVBDI_STD_THRESH, val); |
6075 | 6137 | ||
@@ -6984,9 +7046,10 @@ static int tg3_open(struct net_device *dev) | |||
6984 | 7046 | ||
6985 | if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { | 7047 | if (tp->tg3_flags2 & TG3_FLG2_USING_MSI) { |
6986 | if (tp->tg3_flags2 & TG3_FLG2_1SHOT_MSI) { | 7048 | if (tp->tg3_flags2 & TG3_FLG2_1SHOT_MSI) { |
6987 | u32 val = tr32(0x7c04); | 7049 | u32 val = tr32(PCIE_TRANSACTION_CFG); |
6988 | 7050 | ||
6989 | tw32(0x7c04, val | (1 << 29)); | 7051 | tw32(PCIE_TRANSACTION_CFG, |
7052 | val | PCIE_TRANS_CFG_1SHOT_MSI); | ||
6990 | } | 7053 | } |
6991 | } | 7054 | } |
6992 | } | 7055 | } |
@@ -7941,7 +8004,8 @@ static int tg3_set_tso(struct net_device *dev, u32 value) | |||
7941 | return -EINVAL; | 8004 | return -EINVAL; |
7942 | return 0; | 8005 | return 0; |
7943 | } | 8006 | } |
7944 | if (tp->tg3_flags2 & TG3_FLG2_HW_TSO_2) { | 8007 | if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO_2) && |
8008 | (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906)) { | ||
7945 | if (value) | 8009 | if (value) |
7946 | dev->features |= NETIF_F_TSO6; | 8010 | dev->features |= NETIF_F_TSO6; |
7947 | else | 8011 | else |
@@ -9257,6 +9321,13 @@ static void __devinit tg3_get_5787_nvram_info(struct tg3 *tp) | |||
9257 | } | 9321 | } |
9258 | } | 9322 | } |
9259 | 9323 | ||
9324 | static void __devinit tg3_get_5906_nvram_info(struct tg3 *tp) | ||
9325 | { | ||
9326 | tp->nvram_jedecnum = JEDEC_ATMEL; | ||
9327 | tp->tg3_flags |= TG3_FLAG_NVRAM_BUFFERED; | ||
9328 | tp->nvram_pagesize = ATMEL_AT24C512_CHIP_SIZE; | ||
9329 | } | ||
9330 | |||
9260 | /* Chips other than 5700/5701 use the NVRAM for fetching info. */ | 9331 | /* Chips other than 5700/5701 use the NVRAM for fetching info. */ |
9261 | static void __devinit tg3_nvram_init(struct tg3 *tp) | 9332 | static void __devinit tg3_nvram_init(struct tg3 *tp) |
9262 | { | 9333 | { |
@@ -9293,6 +9364,8 @@ static void __devinit tg3_nvram_init(struct tg3 *tp) | |||
9293 | tg3_get_5755_nvram_info(tp); | 9364 | tg3_get_5755_nvram_info(tp); |
9294 | else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) | 9365 | else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) |
9295 | tg3_get_5787_nvram_info(tp); | 9366 | tg3_get_5787_nvram_info(tp); |
9367 | else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) | ||
9368 | tg3_get_5906_nvram_info(tp); | ||
9296 | else | 9369 | else |
9297 | tg3_get_nvram_info(tp); | 9370 | tg3_get_nvram_info(tp); |
9298 | 9371 | ||
@@ -9766,6 +9839,12 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp) | |||
9766 | /* Assume an onboard device by default. */ | 9839 | /* Assume an onboard device by default. */ |
9767 | tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT; | 9840 | tp->tg3_flags |= TG3_FLAG_EEPROM_WRITE_PROT; |
9768 | 9841 | ||
9842 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { | ||
9843 | if (!(tr32(PCIE_TRANSACTION_CFG) & PCIE_TRANS_CFG_LOM)) | ||
9844 | tp->tg3_flags &= ~TG3_FLAG_EEPROM_WRITE_PROT; | ||
9845 | return; | ||
9846 | } | ||
9847 | |||
9769 | tg3_read_mem(tp, NIC_SRAM_DATA_SIG, &val); | 9848 | tg3_read_mem(tp, NIC_SRAM_DATA_SIG, &val); |
9770 | if (val == NIC_SRAM_DATA_SIG_MAGIC) { | 9849 | if (val == NIC_SRAM_DATA_SIG_MAGIC) { |
9771 | u32 nic_cfg, led_cfg; | 9850 | u32 nic_cfg, led_cfg; |
@@ -10097,7 +10176,10 @@ static void __devinit tg3_read_partno(struct tg3 *tp) | |||
10097 | } | 10176 | } |
10098 | 10177 | ||
10099 | out_not_found: | 10178 | out_not_found: |
10100 | strcpy(tp->board_part_number, "none"); | 10179 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) |
10180 | strcpy(tp->board_part_number, "BCM95906"); | ||
10181 | else | ||
10182 | strcpy(tp->board_part_number, "none"); | ||
10101 | } | 10183 | } |
10102 | 10184 | ||
10103 | static void __devinit tg3_read_fw_ver(struct tg3 *tp) | 10185 | static void __devinit tg3_read_fw_ver(struct tg3 *tp) |
@@ -10299,6 +10381,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
10299 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 || | 10381 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752 || |
10300 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || | 10382 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || |
10301 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 || | 10383 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 || |
10384 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906 || | ||
10302 | (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)) | 10385 | (tp->tg3_flags2 & TG3_FLG2_5780_CLASS)) |
10303 | tp->tg3_flags2 |= TG3_FLG2_5750_PLUS; | 10386 | tp->tg3_flags2 |= TG3_FLG2_5750_PLUS; |
10304 | 10387 | ||
@@ -10308,7 +10391,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
10308 | 10391 | ||
10309 | if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) { | 10392 | if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) { |
10310 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || | 10393 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || |
10311 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) { | 10394 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 || |
10395 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { | ||
10312 | tp->tg3_flags2 |= TG3_FLG2_HW_TSO_2; | 10396 | tp->tg3_flags2 |= TG3_FLG2_HW_TSO_2; |
10313 | tp->tg3_flags2 |= TG3_FLG2_1SHOT_MSI; | 10397 | tp->tg3_flags2 |= TG3_FLG2_1SHOT_MSI; |
10314 | } else { | 10398 | } else { |
@@ -10325,7 +10409,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
10325 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5750 && | 10409 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5750 && |
10326 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5752 && | 10410 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5752 && |
10327 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5755 && | 10411 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5755 && |
10328 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787) | 10412 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787 && |
10413 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906) | ||
10329 | tp->tg3_flags2 |= TG3_FLG2_JUMBO_CAPABLE; | 10414 | tp->tg3_flags2 |= TG3_FLG2_JUMBO_CAPABLE; |
10330 | 10415 | ||
10331 | if (pci_find_capability(tp->pdev, PCI_CAP_ID_EXP) != 0) | 10416 | if (pci_find_capability(tp->pdev, PCI_CAP_ID_EXP) != 0) |
@@ -10455,6 +10540,12 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
10455 | pci_cmd &= ~PCI_COMMAND_MEMORY; | 10540 | pci_cmd &= ~PCI_COMMAND_MEMORY; |
10456 | pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd); | 10541 | pci_write_config_word(tp->pdev, PCI_COMMAND, pci_cmd); |
10457 | } | 10542 | } |
10543 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { | ||
10544 | tp->read32_mbox = tg3_read32_mbox_5906; | ||
10545 | tp->write32_mbox = tg3_write32_mbox_5906; | ||
10546 | tp->write32_tx_mbox = tg3_write32_mbox_5906; | ||
10547 | tp->write32_rx_mbox = tg3_write32_mbox_5906; | ||
10548 | } | ||
10458 | 10549 | ||
10459 | if (tp->write32 == tg3_write_indirect_reg32 || | 10550 | if (tp->write32 == tg3_write_indirect_reg32 || |
10460 | ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) && | 10551 | ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) && |
@@ -10526,6 +10617,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
10526 | ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) && | 10617 | ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) && |
10527 | (tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) && | 10618 | (tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) && |
10528 | (tp->pci_chip_rev_id != CHIPREV_ID_5705_A1)) || | 10619 | (tp->pci_chip_rev_id != CHIPREV_ID_5705_A1)) || |
10620 | (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) || | ||
10529 | (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES)) | 10621 | (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES)) |
10530 | tp->tg3_flags2 |= TG3_FLG2_NO_ETH_WIRE_SPEED; | 10622 | tp->tg3_flags2 |= TG3_FLG2_NO_ETH_WIRE_SPEED; |
10531 | 10623 | ||
@@ -10539,7 +10631,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
10539 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || | 10631 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || |
10540 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) | 10632 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) |
10541 | tp->tg3_flags2 |= TG3_FLG2_PHY_JITTER_BUG; | 10633 | tp->tg3_flags2 |= TG3_FLG2_PHY_JITTER_BUG; |
10542 | else | 10634 | else if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906) |
10543 | tp->tg3_flags2 |= TG3_FLG2_PHY_BER_BUG; | 10635 | tp->tg3_flags2 |= TG3_FLG2_PHY_BER_BUG; |
10544 | } | 10636 | } |
10545 | 10637 | ||
@@ -10629,7 +10721,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
10629 | tp->pdev->device == PCI_DEVICE_ID_TIGON3_5705F)) || | 10721 | tp->pdev->device == PCI_DEVICE_ID_TIGON3_5705F)) || |
10630 | (tp->pdev->vendor == PCI_VENDOR_ID_BROADCOM && | 10722 | (tp->pdev->vendor == PCI_VENDOR_ID_BROADCOM && |
10631 | (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5751F || | 10723 | (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5751F || |
10632 | tp->pdev->device == PCI_DEVICE_ID_TIGON3_5753F))) | 10724 | tp->pdev->device == PCI_DEVICE_ID_TIGON3_5753F)) || |
10725 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) | ||
10633 | tp->tg3_flags |= TG3_FLAG_10_100_ONLY; | 10726 | tp->tg3_flags |= TG3_FLAG_10_100_ONLY; |
10634 | 10727 | ||
10635 | err = tg3_phy_probe(tp); | 10728 | err = tg3_phy_probe(tp); |
@@ -10680,7 +10773,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
10680 | * straddle the 4GB address boundary in some cases. | 10773 | * straddle the 4GB address boundary in some cases. |
10681 | */ | 10774 | */ |
10682 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || | 10775 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 || |
10683 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) | 10776 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787 || |
10777 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) | ||
10684 | tp->dev->hard_start_xmit = tg3_start_xmit; | 10778 | tp->dev->hard_start_xmit = tg3_start_xmit; |
10685 | else | 10779 | else |
10686 | tp->dev->hard_start_xmit = tg3_start_xmit_dma_bug; | 10780 | tp->dev->hard_start_xmit = tg3_start_xmit_dma_bug; |
@@ -10761,6 +10855,8 @@ static int __devinit tg3_get_device_address(struct tg3 *tp) | |||
10761 | else | 10855 | else |
10762 | tg3_nvram_unlock(tp); | 10856 | tg3_nvram_unlock(tp); |
10763 | } | 10857 | } |
10858 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) | ||
10859 | mac_offset = 0x10; | ||
10764 | 10860 | ||
10765 | /* First try to get it from MAC address mailbox. */ | 10861 | /* First try to get it from MAC address mailbox. */ |
10766 | tg3_read_mem(tp, NIC_SRAM_MAC_ADDR_HIGH_MBOX, &hi); | 10862 | tg3_read_mem(tp, NIC_SRAM_MAC_ADDR_HIGH_MBOX, &hi); |
@@ -11244,6 +11340,12 @@ static void __devinit tg3_init_bufmgr_config(struct tg3 *tp) | |||
11244 | DEFAULT_MB_MACRX_LOW_WATER_5705; | 11340 | DEFAULT_MB_MACRX_LOW_WATER_5705; |
11245 | tp->bufmgr_config.mbuf_high_water = | 11341 | tp->bufmgr_config.mbuf_high_water = |
11246 | DEFAULT_MB_HIGH_WATER_5705; | 11342 | DEFAULT_MB_HIGH_WATER_5705; |
11343 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { | ||
11344 | tp->bufmgr_config.mbuf_mac_rx_low_water = | ||
11345 | DEFAULT_MB_MACRX_LOW_WATER_5906; | ||
11346 | tp->bufmgr_config.mbuf_high_water = | ||
11347 | DEFAULT_MB_HIGH_WATER_5906; | ||
11348 | } | ||
11247 | 11349 | ||
11248 | tp->bufmgr_config.mbuf_read_dma_low_water_jumbo = | 11350 | tp->bufmgr_config.mbuf_read_dma_low_water_jumbo = |
11249 | DEFAULT_MB_RDMA_LOW_WATER_JUMBO_5780; | 11351 | DEFAULT_MB_RDMA_LOW_WATER_JUMBO_5780; |
@@ -11288,6 +11390,7 @@ static char * __devinit tg3_phy_string(struct tg3 *tp) | |||
11288 | case PHY_ID_BCM5755: return "5755"; | 11390 | case PHY_ID_BCM5755: return "5755"; |
11289 | case PHY_ID_BCM5787: return "5787"; | 11391 | case PHY_ID_BCM5787: return "5787"; |
11290 | case PHY_ID_BCM5756: return "5722/5756"; | 11392 | case PHY_ID_BCM5756: return "5722/5756"; |
11393 | case PHY_ID_BCM5906: return "5906"; | ||
11291 | case PHY_ID_BCM8002: return "8002/serdes"; | 11394 | case PHY_ID_BCM8002: return "8002/serdes"; |
11292 | case 0: return "serdes"; | 11395 | case 0: return "serdes"; |
11293 | default: return "unknown"; | 11396 | default: return "unknown"; |
@@ -11590,7 +11693,8 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
11590 | */ | 11693 | */ |
11591 | if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) { | 11694 | if (tp->tg3_flags2 & TG3_FLG2_HW_TSO) { |
11592 | dev->features |= NETIF_F_TSO; | 11695 | dev->features |= NETIF_F_TSO; |
11593 | if (tp->tg3_flags2 & TG3_FLG2_HW_TSO_2) | 11696 | if ((tp->tg3_flags2 & TG3_FLG2_HW_TSO_2) && |
11697 | (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906)) | ||
11594 | dev->features |= NETIF_F_TSO6; | 11698 | dev->features |= NETIF_F_TSO6; |
11595 | } | 11699 | } |
11596 | 11700 | ||
diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h index feed13dc8719..2f5e00c96016 100644 --- a/drivers/net/tg3.h +++ b/drivers/net/tg3.h | |||
@@ -24,6 +24,8 @@ | |||
24 | 24 | ||
25 | #define RX_COPY_THRESHOLD 256 | 25 | #define RX_COPY_THRESHOLD 256 |
26 | 26 | ||
27 | #define TG3_RX_INTERNAL_RING_SZ_5906 32 | ||
28 | |||
27 | #define RX_STD_MAX_SIZE 1536 | 29 | #define RX_STD_MAX_SIZE 1536 |
28 | #define RX_STD_MAX_SIZE_5705 512 | 30 | #define RX_STD_MAX_SIZE_5705 512 |
29 | #define RX_JUMBO_MAX_SIZE 0xdeadbeef /* XXX */ | 31 | #define RX_JUMBO_MAX_SIZE 0xdeadbeef /* XXX */ |
@@ -129,6 +131,7 @@ | |||
129 | #define CHIPREV_ID_5752_A0_HW 0x5000 | 131 | #define CHIPREV_ID_5752_A0_HW 0x5000 |
130 | #define CHIPREV_ID_5752_A0 0x6000 | 132 | #define CHIPREV_ID_5752_A0 0x6000 |
131 | #define CHIPREV_ID_5752_A1 0x6001 | 133 | #define CHIPREV_ID_5752_A1 0x6001 |
134 | #define CHIPREV_ID_5906_A1 0xc001 | ||
132 | #define GET_ASIC_REV(CHIP_REV_ID) ((CHIP_REV_ID) >> 12) | 135 | #define GET_ASIC_REV(CHIP_REV_ID) ((CHIP_REV_ID) >> 12) |
133 | #define ASIC_REV_5700 0x07 | 136 | #define ASIC_REV_5700 0x07 |
134 | #define ASIC_REV_5701 0x00 | 137 | #define ASIC_REV_5701 0x00 |
@@ -141,6 +144,7 @@ | |||
141 | #define ASIC_REV_5714 0x09 | 144 | #define ASIC_REV_5714 0x09 |
142 | #define ASIC_REV_5755 0x0a | 145 | #define ASIC_REV_5755 0x0a |
143 | #define ASIC_REV_5787 0x0b | 146 | #define ASIC_REV_5787 0x0b |
147 | #define ASIC_REV_5906 0x0c | ||
144 | #define GET_CHIP_REV(CHIP_REV_ID) ((CHIP_REV_ID) >> 8) | 148 | #define GET_CHIP_REV(CHIP_REV_ID) ((CHIP_REV_ID) >> 8) |
145 | #define CHIPREV_5700_AX 0x70 | 149 | #define CHIPREV_5700_AX 0x70 |
146 | #define CHIPREV_5700_BX 0x71 | 150 | #define CHIPREV_5700_BX 0x71 |
@@ -646,7 +650,8 @@ | |||
646 | #define SNDDATAI_SCTRL_FORCE_ZERO 0x00000010 | 650 | #define SNDDATAI_SCTRL_FORCE_ZERO 0x00000010 |
647 | #define SNDDATAI_STATSENAB 0x00000c0c | 651 | #define SNDDATAI_STATSENAB 0x00000c0c |
648 | #define SNDDATAI_STATSINCMASK 0x00000c10 | 652 | #define SNDDATAI_STATSINCMASK 0x00000c10 |
649 | /* 0xc14 --> 0xc80 unused */ | 653 | #define ISO_PKT_TX 0x00000c20 |
654 | /* 0xc24 --> 0xc80 unused */ | ||
650 | #define SNDDATAI_COS_CNT_0 0x00000c80 | 655 | #define SNDDATAI_COS_CNT_0 0x00000c80 |
651 | #define SNDDATAI_COS_CNT_1 0x00000c84 | 656 | #define SNDDATAI_COS_CNT_1 0x00000c84 |
652 | #define SNDDATAI_COS_CNT_2 0x00000c88 | 657 | #define SNDDATAI_COS_CNT_2 0x00000c88 |
@@ -997,11 +1002,13 @@ | |||
997 | #define BUFMGR_MB_MACRX_LOW_WATER 0x00004414 | 1002 | #define BUFMGR_MB_MACRX_LOW_WATER 0x00004414 |
998 | #define DEFAULT_MB_MACRX_LOW_WATER 0x00000020 | 1003 | #define DEFAULT_MB_MACRX_LOW_WATER 0x00000020 |
999 | #define DEFAULT_MB_MACRX_LOW_WATER_5705 0x00000010 | 1004 | #define DEFAULT_MB_MACRX_LOW_WATER_5705 0x00000010 |
1005 | #define DEFAULT_MB_MACRX_LOW_WATER_5906 0x00000004 | ||
1000 | #define DEFAULT_MB_MACRX_LOW_WATER_JUMBO 0x00000098 | 1006 | #define DEFAULT_MB_MACRX_LOW_WATER_JUMBO 0x00000098 |
1001 | #define DEFAULT_MB_MACRX_LOW_WATER_JUMBO_5780 0x0000004b | 1007 | #define DEFAULT_MB_MACRX_LOW_WATER_JUMBO_5780 0x0000004b |
1002 | #define BUFMGR_MB_HIGH_WATER 0x00004418 | 1008 | #define BUFMGR_MB_HIGH_WATER 0x00004418 |
1003 | #define DEFAULT_MB_HIGH_WATER 0x00000060 | 1009 | #define DEFAULT_MB_HIGH_WATER 0x00000060 |
1004 | #define DEFAULT_MB_HIGH_WATER_5705 0x00000060 | 1010 | #define DEFAULT_MB_HIGH_WATER_5705 0x00000060 |
1011 | #define DEFAULT_MB_HIGH_WATER_5906 0x00000010 | ||
1005 | #define DEFAULT_MB_HIGH_WATER_JUMBO 0x0000017c | 1012 | #define DEFAULT_MB_HIGH_WATER_JUMBO 0x0000017c |
1006 | #define DEFAULT_MB_HIGH_WATER_JUMBO_5780 0x00000096 | 1013 | #define DEFAULT_MB_HIGH_WATER_JUMBO_5780 0x00000096 |
1007 | #define BUFMGR_RX_MB_ALLOC_REQ 0x0000441c | 1014 | #define BUFMGR_RX_MB_ALLOC_REQ 0x0000441c |
@@ -1138,7 +1145,12 @@ | |||
1138 | #define TX_CPU_STATE 0x00005404 | 1145 | #define TX_CPU_STATE 0x00005404 |
1139 | #define TX_CPU_PGMCTR 0x0000541c | 1146 | #define TX_CPU_PGMCTR 0x0000541c |
1140 | 1147 | ||
1148 | #define VCPU_STATUS 0x00005100 | ||
1149 | #define VCPU_STATUS_INIT_DONE 0x04000000 | ||
1150 | #define VCPU_STATUS_DRV_RESET 0x08000000 | ||
1151 | |||
1141 | /* Mailboxes */ | 1152 | /* Mailboxes */ |
1153 | #define GRCMBOX_BASE 0x00005600 | ||
1142 | #define GRCMBOX_INTERRUPT_0 0x00005800 /* 64-bit */ | 1154 | #define GRCMBOX_INTERRUPT_0 0x00005800 /* 64-bit */ |
1143 | #define GRCMBOX_INTERRUPT_1 0x00005808 /* 64-bit */ | 1155 | #define GRCMBOX_INTERRUPT_1 0x00005808 /* 64-bit */ |
1144 | #define GRCMBOX_INTERRUPT_2 0x00005810 /* 64-bit */ | 1156 | #define GRCMBOX_INTERRUPT_2 0x00005810 /* 64-bit */ |
@@ -1398,7 +1410,10 @@ | |||
1398 | #define GRC_EEPROM_CTRL 0x00006840 | 1410 | #define GRC_EEPROM_CTRL 0x00006840 |
1399 | #define GRC_MDI_CTRL 0x00006844 | 1411 | #define GRC_MDI_CTRL 0x00006844 |
1400 | #define GRC_SEEPROM_DELAY 0x00006848 | 1412 | #define GRC_SEEPROM_DELAY 0x00006848 |
1401 | /* 0x684c --> 0x6c00 unused */ | 1413 | /* 0x684c --> 0x6890 unused */ |
1414 | #define GRC_VCPU_EXT_CTRL 0x00006890 | ||
1415 | #define GRC_VCPU_EXT_CTRL_HALT_CPU 0x00400000 | ||
1416 | #define GRC_VCPU_EXT_CTRL_DISABLE_WOL 0x20000000 | ||
1402 | #define GRC_FASTBOOT_PC 0x00006894 /* 5752, 5755, 5787 */ | 1417 | #define GRC_FASTBOOT_PC 0x00006894 /* 5752, 5755, 5787 */ |
1403 | 1418 | ||
1404 | /* 0x6c00 --> 0x7000 unused */ | 1419 | /* 0x6c00 --> 0x7000 unused */ |
@@ -1485,7 +1500,11 @@ | |||
1485 | #define NVRAM_WRITE1 0x00007028 | 1500 | #define NVRAM_WRITE1 0x00007028 |
1486 | /* 0x702c --> 0x7400 unused */ | 1501 | /* 0x702c --> 0x7400 unused */ |
1487 | 1502 | ||
1488 | /* 0x7400 --> 0x8000 unused */ | 1503 | /* 0x7400 --> 0x7c00 unused */ |
1504 | #define PCIE_TRANSACTION_CFG 0x00007c04 | ||
1505 | #define PCIE_TRANS_CFG_1SHOT_MSI 0x20000000 | ||
1506 | #define PCIE_TRANS_CFG_LOM 0x00000020 | ||
1507 | |||
1489 | 1508 | ||
1490 | #define TG3_EEPROM_MAGIC 0x669955aa | 1509 | #define TG3_EEPROM_MAGIC 0x669955aa |
1491 | 1510 | ||
@@ -2283,6 +2302,7 @@ struct tg3 { | |||
2283 | #define PHY_ID_BCM5755 0xbc050cc0 | 2302 | #define PHY_ID_BCM5755 0xbc050cc0 |
2284 | #define PHY_ID_BCM5787 0xbc050ce0 | 2303 | #define PHY_ID_BCM5787 0xbc050ce0 |
2285 | #define PHY_ID_BCM5756 0xbc050ed0 | 2304 | #define PHY_ID_BCM5756 0xbc050ed0 |
2305 | #define PHY_ID_BCM5906 0xdc00ac40 | ||
2286 | #define PHY_ID_BCM8002 0x60010140 | 2306 | #define PHY_ID_BCM8002 0x60010140 |
2287 | #define PHY_ID_INVALID 0xffffffff | 2307 | #define PHY_ID_INVALID 0xffffffff |
2288 | #define PHY_ID_REV_MASK 0x0000000f | 2308 | #define PHY_ID_REV_MASK 0x0000000f |
@@ -2310,7 +2330,7 @@ struct tg3 { | |||
2310 | (X) == PHY_ID_BCM5752 || (X) == PHY_ID_BCM5714 || \ | 2330 | (X) == PHY_ID_BCM5752 || (X) == PHY_ID_BCM5714 || \ |
2311 | (X) == PHY_ID_BCM5780 || (X) == PHY_ID_BCM5787 || \ | 2331 | (X) == PHY_ID_BCM5780 || (X) == PHY_ID_BCM5787 || \ |
2312 | (X) == PHY_ID_BCM5755 || (X) == PHY_ID_BCM5756 || \ | 2332 | (X) == PHY_ID_BCM5755 || (X) == PHY_ID_BCM5756 || \ |
2313 | (X) == PHY_ID_BCM8002) | 2333 | (X) == PHY_ID_BCM5906 || (X) == PHY_ID_BCM8002) |
2314 | 2334 | ||
2315 | struct tg3_hw_stats *hw_stats; | 2335 | struct tg3_hw_stats *hw_stats; |
2316 | dma_addr_t stats_mapping; | 2336 | dma_addr_t stats_mapping; |