diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-29 14:29:33 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-29 14:29:33 -0500 |
commit | f3cab8a0b1a772dc8b055b7affa567a366627c9e (patch) | |
tree | 39c4736047e7f1f6617a4703b3ebf62df1d68d34 /drivers/net | |
parent | 76babde121d2ffef04ca692ce64ef9f8a9866086 (diff) | |
parent | 65b4b4e81a5094d52cbe372b887b1779abe53f9b (diff) |
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6:
[NETFILTER]: Rename init functions.
[TCP]: Fix RFC2465 typo.
[INET]: Introduce tunnel4/tunnel6
[NET]: deinline 200+ byte inlines in sock.h
[ECONET]: Convert away from SOCKOPS_WRAPPED
[NET]: Fix ipx/econet/appletalk/irda ioctl crashes
[NET]: Kill Documentation/networking/TODO
[TG3]: Update version and reldate
[TG3]: Skip timer code during full lock
[TG3]: Speed up SRAM access
[TG3]: Fix PHY loopback on 5700
[TG3]: Fix bug in 40-bit DMA workaround code
[TG3]: Fix probe failure due to invalid MAC address
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/tg3.c | 118 |
1 files changed, 69 insertions, 49 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index b5473325bff4..964c09644832 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -69,8 +69,8 @@ | |||
69 | 69 | ||
70 | #define DRV_MODULE_NAME "tg3" | 70 | #define DRV_MODULE_NAME "tg3" |
71 | #define PFX DRV_MODULE_NAME ": " | 71 | #define PFX DRV_MODULE_NAME ": " |
72 | #define DRV_MODULE_VERSION "3.54" | 72 | #define DRV_MODULE_VERSION "3.55" |
73 | #define DRV_MODULE_RELDATE "Mar 23, 2006" | 73 | #define DRV_MODULE_RELDATE "Mar 27, 2006" |
74 | 74 | ||
75 | #define TG3_DEF_MAC_MODE 0 | 75 | #define TG3_DEF_MAC_MODE 0 |
76 | #define TG3_DEF_RX_MODE 0 | 76 | #define TG3_DEF_RX_MODE 0 |
@@ -497,21 +497,20 @@ static void tg3_write_mem(struct tg3 *tp, u32 off, u32 val) | |||
497 | unsigned long flags; | 497 | unsigned long flags; |
498 | 498 | ||
499 | spin_lock_irqsave(&tp->indirect_lock, flags); | 499 | spin_lock_irqsave(&tp->indirect_lock, flags); |
500 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off); | 500 | if (tp->write32 != tg3_write_indirect_reg32) { |
501 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val); | 501 | tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, off); |
502 | tw32_f(TG3PCI_MEM_WIN_DATA, val); | ||
502 | 503 | ||
503 | /* Always leave this as zero. */ | 504 | /* Always leave this as zero. */ |
504 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0); | 505 | tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, 0); |
505 | spin_unlock_irqrestore(&tp->indirect_lock, flags); | 506 | } else { |
506 | } | 507 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off); |
508 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val); | ||
507 | 509 | ||
508 | static void tg3_write_mem_fast(struct tg3 *tp, u32 off, u32 val) | 510 | /* Always leave this as zero. */ |
509 | { | 511 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0); |
510 | /* If no workaround is needed, write to mem space directly */ | 512 | } |
511 | if (tp->write32 != tg3_write_indirect_reg32) | 513 | spin_unlock_irqrestore(&tp->indirect_lock, flags); |
512 | tw32(NIC_SRAM_WIN_BASE + off, val); | ||
513 | else | ||
514 | tg3_write_mem(tp, off, val); | ||
515 | } | 514 | } |
516 | 515 | ||
517 | static void tg3_read_mem(struct tg3 *tp, u32 off, u32 *val) | 516 | static void tg3_read_mem(struct tg3 *tp, u32 off, u32 *val) |
@@ -519,11 +518,19 @@ static void tg3_read_mem(struct tg3 *tp, u32 off, u32 *val) | |||
519 | unsigned long flags; | 518 | unsigned long flags; |
520 | 519 | ||
521 | spin_lock_irqsave(&tp->indirect_lock, flags); | 520 | spin_lock_irqsave(&tp->indirect_lock, flags); |
522 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off); | 521 | if (tp->write32 != tg3_write_indirect_reg32) { |
523 | pci_read_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val); | 522 | tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, off); |
523 | *val = tr32(TG3PCI_MEM_WIN_DATA); | ||
524 | 524 | ||
525 | /* Always leave this as zero. */ | 525 | /* Always leave this as zero. */ |
526 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0); | 526 | tw32_f(TG3PCI_MEM_WIN_BASE_ADDR, 0); |
527 | } else { | ||
528 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, off); | ||
529 | pci_read_config_dword(tp->pdev, TG3PCI_MEM_WIN_DATA, val); | ||
530 | |||
531 | /* Always leave this as zero. */ | ||
532 | pci_write_config_dword(tp->pdev, TG3PCI_MEM_WIN_BASE_ADDR, 0); | ||
533 | } | ||
527 | spin_unlock_irqrestore(&tp->indirect_lock, flags); | 534 | spin_unlock_irqrestore(&tp->indirect_lock, flags); |
528 | } | 535 | } |
529 | 536 | ||
@@ -1367,12 +1374,12 @@ static int tg3_set_power_state(struct tg3 *tp, pci_power_t state) | |||
1367 | } | 1374 | } |
1368 | } | 1375 | } |
1369 | 1376 | ||
1377 | tg3_write_sig_post_reset(tp, RESET_KIND_SHUTDOWN); | ||
1378 | |||
1370 | /* Finally, set the new power state. */ | 1379 | /* Finally, set the new power state. */ |
1371 | pci_write_config_word(tp->pdev, pm + PCI_PM_CTRL, power_control); | 1380 | pci_write_config_word(tp->pdev, pm + PCI_PM_CTRL, power_control); |
1372 | udelay(100); /* Delay after power state change */ | 1381 | udelay(100); /* Delay after power state change */ |
1373 | 1382 | ||
1374 | tg3_write_sig_post_reset(tp, RESET_KIND_SHUTDOWN); | ||
1375 | |||
1376 | return 0; | 1383 | return 0; |
1377 | } | 1384 | } |
1378 | 1385 | ||
@@ -3600,7 +3607,7 @@ static inline int tg3_40bit_overflow_test(struct tg3 *tp, dma_addr_t mapping, | |||
3600 | int len) | 3607 | int len) |
3601 | { | 3608 | { |
3602 | #if defined(CONFIG_HIGHMEM) && (BITS_PER_LONG == 64) | 3609 | #if defined(CONFIG_HIGHMEM) && (BITS_PER_LONG == 64) |
3603 | if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS) | 3610 | if (tp->tg3_flags & TG3_FLAG_40BIT_DMA_BUG) |
3604 | return (((u64) mapping + len) > DMA_40BIT_MASK); | 3611 | return (((u64) mapping + len) > DMA_40BIT_MASK); |
3605 | return 0; | 3612 | return 0; |
3606 | #else | 3613 | #else |
@@ -6461,6 +6468,9 @@ static void tg3_timer(unsigned long __opaque) | |||
6461 | { | 6468 | { |
6462 | struct tg3 *tp = (struct tg3 *) __opaque; | 6469 | struct tg3 *tp = (struct tg3 *) __opaque; |
6463 | 6470 | ||
6471 | if (tp->irq_sync) | ||
6472 | goto restart_timer; | ||
6473 | |||
6464 | spin_lock(&tp->lock); | 6474 | spin_lock(&tp->lock); |
6465 | 6475 | ||
6466 | if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)) { | 6476 | if (!(tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)) { |
@@ -6537,11 +6547,11 @@ static void tg3_timer(unsigned long __opaque) | |||
6537 | if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) { | 6547 | if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) { |
6538 | u32 val; | 6548 | u32 val; |
6539 | 6549 | ||
6540 | tg3_write_mem_fast(tp, NIC_SRAM_FW_CMD_MBOX, | 6550 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, |
6541 | FWCMD_NICDRV_ALIVE2); | 6551 | FWCMD_NICDRV_ALIVE2); |
6542 | tg3_write_mem_fast(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4); | 6552 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4); |
6543 | /* 5 seconds timeout */ | 6553 | /* 5 seconds timeout */ |
6544 | tg3_write_mem_fast(tp, NIC_SRAM_FW_CMD_DATA_MBOX, 5); | 6554 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, 5); |
6545 | val = tr32(GRC_RX_CPU_EVENT); | 6555 | val = tr32(GRC_RX_CPU_EVENT); |
6546 | val |= (1 << 14); | 6556 | val |= (1 << 14); |
6547 | tw32(GRC_RX_CPU_EVENT, val); | 6557 | tw32(GRC_RX_CPU_EVENT, val); |
@@ -6551,6 +6561,7 @@ static void tg3_timer(unsigned long __opaque) | |||
6551 | 6561 | ||
6552 | spin_unlock(&tp->lock); | 6562 | spin_unlock(&tp->lock); |
6553 | 6563 | ||
6564 | restart_timer: | ||
6554 | tp->timer.expires = jiffies + tp->timer_offset; | 6565 | tp->timer.expires = jiffies + tp->timer_offset; |
6555 | add_timer(&tp->timer); | 6566 | add_timer(&tp->timer); |
6556 | } | 6567 | } |
@@ -8399,8 +8410,11 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode) | |||
8399 | } | 8410 | } |
8400 | mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) | | 8411 | mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) | |
8401 | MAC_MODE_LINK_POLARITY | MAC_MODE_PORT_MODE_GMII; | 8412 | MAC_MODE_LINK_POLARITY | MAC_MODE_PORT_MODE_GMII; |
8402 | if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) | 8413 | if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) { |
8403 | mac_mode &= ~MAC_MODE_LINK_POLARITY; | 8414 | mac_mode &= ~MAC_MODE_LINK_POLARITY; |
8415 | tg3_writephy(tp, MII_TG3_EXT_CTRL, | ||
8416 | MII_TG3_EXT_CTRL_LNK3_LED_MODE); | ||
8417 | } | ||
8404 | tw32(MAC_MODE, mac_mode); | 8418 | tw32(MAC_MODE, mac_mode); |
8405 | } | 8419 | } |
8406 | else | 8420 | else |
@@ -10531,6 +10545,7 @@ static int __devinit tg3_get_device_address(struct tg3 *tp) | |||
10531 | { | 10545 | { |
10532 | struct net_device *dev = tp->dev; | 10546 | struct net_device *dev = tp->dev; |
10533 | u32 hi, lo, mac_offset; | 10547 | u32 hi, lo, mac_offset; |
10548 | int addr_ok = 0; | ||
10534 | 10549 | ||
10535 | #ifdef CONFIG_SPARC64 | 10550 | #ifdef CONFIG_SPARC64 |
10536 | if (!tg3_get_macaddr_sparc(tp)) | 10551 | if (!tg3_get_macaddr_sparc(tp)) |
@@ -10560,29 +10575,34 @@ static int __devinit tg3_get_device_address(struct tg3 *tp) | |||
10560 | dev->dev_addr[3] = (lo >> 16) & 0xff; | 10575 | dev->dev_addr[3] = (lo >> 16) & 0xff; |
10561 | dev->dev_addr[4] = (lo >> 8) & 0xff; | 10576 | dev->dev_addr[4] = (lo >> 8) & 0xff; |
10562 | dev->dev_addr[5] = (lo >> 0) & 0xff; | 10577 | dev->dev_addr[5] = (lo >> 0) & 0xff; |
10563 | } | ||
10564 | /* Next, try NVRAM. */ | ||
10565 | else if (!(tp->tg3_flags & TG3_FLG2_SUN_570X) && | ||
10566 | !tg3_nvram_read(tp, mac_offset + 0, &hi) && | ||
10567 | !tg3_nvram_read(tp, mac_offset + 4, &lo)) { | ||
10568 | dev->dev_addr[0] = ((hi >> 16) & 0xff); | ||
10569 | dev->dev_addr[1] = ((hi >> 24) & 0xff); | ||
10570 | dev->dev_addr[2] = ((lo >> 0) & 0xff); | ||
10571 | dev->dev_addr[3] = ((lo >> 8) & 0xff); | ||
10572 | dev->dev_addr[4] = ((lo >> 16) & 0xff); | ||
10573 | dev->dev_addr[5] = ((lo >> 24) & 0xff); | ||
10574 | } | ||
10575 | /* Finally just fetch it out of the MAC control regs. */ | ||
10576 | else { | ||
10577 | hi = tr32(MAC_ADDR_0_HIGH); | ||
10578 | lo = tr32(MAC_ADDR_0_LOW); | ||
10579 | 10578 | ||
10580 | dev->dev_addr[5] = lo & 0xff; | 10579 | /* Some old bootcode may report a 0 MAC address in SRAM */ |
10581 | dev->dev_addr[4] = (lo >> 8) & 0xff; | 10580 | addr_ok = is_valid_ether_addr(&dev->dev_addr[0]); |
10582 | dev->dev_addr[3] = (lo >> 16) & 0xff; | 10581 | } |
10583 | dev->dev_addr[2] = (lo >> 24) & 0xff; | 10582 | if (!addr_ok) { |
10584 | dev->dev_addr[1] = hi & 0xff; | 10583 | /* Next, try NVRAM. */ |
10585 | dev->dev_addr[0] = (hi >> 8) & 0xff; | 10584 | if (!(tp->tg3_flags & TG3_FLG2_SUN_570X) && |
10585 | !tg3_nvram_read(tp, mac_offset + 0, &hi) && | ||
10586 | !tg3_nvram_read(tp, mac_offset + 4, &lo)) { | ||
10587 | dev->dev_addr[0] = ((hi >> 16) & 0xff); | ||
10588 | dev->dev_addr[1] = ((hi >> 24) & 0xff); | ||
10589 | dev->dev_addr[2] = ((lo >> 0) & 0xff); | ||
10590 | dev->dev_addr[3] = ((lo >> 8) & 0xff); | ||
10591 | dev->dev_addr[4] = ((lo >> 16) & 0xff); | ||
10592 | dev->dev_addr[5] = ((lo >> 24) & 0xff); | ||
10593 | } | ||
10594 | /* Finally just fetch it out of the MAC control regs. */ | ||
10595 | else { | ||
10596 | hi = tr32(MAC_ADDR_0_HIGH); | ||
10597 | lo = tr32(MAC_ADDR_0_LOW); | ||
10598 | |||
10599 | dev->dev_addr[5] = lo & 0xff; | ||
10600 | dev->dev_addr[4] = (lo >> 8) & 0xff; | ||
10601 | dev->dev_addr[3] = (lo >> 16) & 0xff; | ||
10602 | dev->dev_addr[2] = (lo >> 24) & 0xff; | ||
10603 | dev->dev_addr[1] = hi & 0xff; | ||
10604 | dev->dev_addr[0] = (hi >> 8) & 0xff; | ||
10605 | } | ||
10586 | } | 10606 | } |
10587 | 10607 | ||
10588 | if (!is_valid_ether_addr(&dev->dev_addr[0])) { | 10608 | if (!is_valid_ether_addr(&dev->dev_addr[0])) { |