diff options
| author | Steve French <sfrench@us.ibm.com> | 2005-12-31 13:27:22 -0500 |
|---|---|---|
| committer | Steve French <sfrench@us.ibm.com> | 2005-12-31 13:27:22 -0500 |
| commit | eea60caef610c7a6c58c0de9c80ae1e438e01301 (patch) | |
| tree | 25e19289bba003fe085e589430d0d981fd6b73a7 /drivers/net | |
| parent | da8543ef125afc7bba4da526b61a1ae07dc25109 (diff) | |
| parent | 82c9df820112c6286a8e8fbe482e94b65b49062c (diff) | |
Merge with /pub/scm/linux/kernel/git/torvalds/linux-2.6.git
Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'drivers/net')
| -rw-r--r-- | drivers/net/forcedeth.c | 15 | ||||
| -rw-r--r-- | drivers/net/phy/phy_device.c | 4 | ||||
| -rw-r--r-- | drivers/net/ppp_generic.c | 3 | ||||
| -rw-r--r-- | drivers/net/s2io.c | 10 | ||||
| -rw-r--r-- | drivers/net/sungem.c | 4 | ||||
| -rw-r--r-- | drivers/net/tg3.c | 255 | ||||
| -rw-r--r-- | drivers/net/tg3.h | 14 | ||||
| -rw-r--r-- | drivers/net/wireless/orinoco_nortel.c | 6 |
8 files changed, 200 insertions, 111 deletions
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index 525624fc03b4..c39344adecce 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * trademarks of NVIDIA Corporation in the United States and other | 10 | * trademarks of NVIDIA Corporation in the United States and other |
| 11 | * countries. | 11 | * countries. |
| 12 | * | 12 | * |
| 13 | * Copyright (C) 2003,4 Manfred Spraul | 13 | * Copyright (C) 2003,4,5 Manfred Spraul |
| 14 | * Copyright (C) 2004 Andrew de Quincey (wol support) | 14 | * Copyright (C) 2004 Andrew de Quincey (wol support) |
| 15 | * Copyright (C) 2004 Carl-Daniel Hailfinger (invalid MAC handling, insane | 15 | * Copyright (C) 2004 Carl-Daniel Hailfinger (invalid MAC handling, insane |
| 16 | * IRQ rate fixes, bigendian fixes, cleanups, verification) | 16 | * IRQ rate fixes, bigendian fixes, cleanups, verification) |
| @@ -100,6 +100,7 @@ | |||
| 100 | * 0.45: 18 Sep 2005: Remove nv_stop/start_rx from every link check | 100 | * 0.45: 18 Sep 2005: Remove nv_stop/start_rx from every link check |
| 101 | * 0.46: 20 Oct 2005: Add irq optimization modes. | 101 | * 0.46: 20 Oct 2005: Add irq optimization modes. |
| 102 | * 0.47: 26 Oct 2005: Add phyaddr 0 in phy scan. | 102 | * 0.47: 26 Oct 2005: Add phyaddr 0 in phy scan. |
| 103 | * 0.48: 24 Dec 2005: Disable TSO, bugfix for pci_map_single | ||
| 103 | * | 104 | * |
| 104 | * Known bugs: | 105 | * Known bugs: |
| 105 | * We suspect that on some hardware no TX done interrupts are generated. | 106 | * We suspect that on some hardware no TX done interrupts are generated. |
| @@ -111,7 +112,7 @@ | |||
| 111 | * DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few | 112 | * DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few |
| 112 | * superfluous timer interrupts from the nic. | 113 | * superfluous timer interrupts from the nic. |
| 113 | */ | 114 | */ |
| 114 | #define FORCEDETH_VERSION "0.47" | 115 | #define FORCEDETH_VERSION "0.48" |
| 115 | #define DRV_NAME "forcedeth" | 116 | #define DRV_NAME "forcedeth" |
| 116 | 117 | ||
| 117 | #include <linux/module.h> | 118 | #include <linux/module.h> |
| @@ -871,8 +872,8 @@ static int nv_alloc_rx(struct net_device *dev) | |||
| 871 | } else { | 872 | } else { |
| 872 | skb = np->rx_skbuff[nr]; | 873 | skb = np->rx_skbuff[nr]; |
| 873 | } | 874 | } |
| 874 | np->rx_dma[nr] = pci_map_single(np->pci_dev, skb->data, skb->len, | 875 | np->rx_dma[nr] = pci_map_single(np->pci_dev, skb->data, |
| 875 | PCI_DMA_FROMDEVICE); | 876 | skb->end-skb->data, PCI_DMA_FROMDEVICE); |
| 876 | if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { | 877 | if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { |
| 877 | np->rx_ring.orig[nr].PacketBuffer = cpu_to_le32(np->rx_dma[nr]); | 878 | np->rx_ring.orig[nr].PacketBuffer = cpu_to_le32(np->rx_dma[nr]); |
| 878 | wmb(); | 879 | wmb(); |
| @@ -999,7 +1000,7 @@ static void nv_drain_rx(struct net_device *dev) | |||
| 999 | wmb(); | 1000 | wmb(); |
| 1000 | if (np->rx_skbuff[i]) { | 1001 | if (np->rx_skbuff[i]) { |
| 1001 | pci_unmap_single(np->pci_dev, np->rx_dma[i], | 1002 | pci_unmap_single(np->pci_dev, np->rx_dma[i], |
| 1002 | np->rx_skbuff[i]->len, | 1003 | np->rx_skbuff[i]->end-np->rx_skbuff[i]->data, |
| 1003 | PCI_DMA_FROMDEVICE); | 1004 | PCI_DMA_FROMDEVICE); |
| 1004 | dev_kfree_skb(np->rx_skbuff[i]); | 1005 | dev_kfree_skb(np->rx_skbuff[i]); |
| 1005 | np->rx_skbuff[i] = NULL; | 1006 | np->rx_skbuff[i] = NULL; |
| @@ -1334,7 +1335,7 @@ static void nv_rx_process(struct net_device *dev) | |||
| 1334 | * the performance. | 1335 | * the performance. |
| 1335 | */ | 1336 | */ |
| 1336 | pci_unmap_single(np->pci_dev, np->rx_dma[i], | 1337 | pci_unmap_single(np->pci_dev, np->rx_dma[i], |
| 1337 | np->rx_skbuff[i]->len, | 1338 | np->rx_skbuff[i]->end-np->rx_skbuff[i]->data, |
| 1338 | PCI_DMA_FROMDEVICE); | 1339 | PCI_DMA_FROMDEVICE); |
| 1339 | 1340 | ||
| 1340 | { | 1341 | { |
| @@ -2455,7 +2456,7 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i | |||
| 2455 | np->txrxctl_bits |= NVREG_TXRXCTL_RXCHECK; | 2456 | np->txrxctl_bits |= NVREG_TXRXCTL_RXCHECK; |
| 2456 | dev->features |= NETIF_F_HW_CSUM | NETIF_F_SG; | 2457 | dev->features |= NETIF_F_HW_CSUM | NETIF_F_SG; |
| 2457 | #ifdef NETIF_F_TSO | 2458 | #ifdef NETIF_F_TSO |
| 2458 | dev->features |= NETIF_F_TSO; | 2459 | /* disabled dev->features |= NETIF_F_TSO; */ |
| 2459 | #endif | 2460 | #endif |
| 2460 | } | 2461 | } |
| 2461 | 2462 | ||
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 16bebe7a7ce1..7da0e3dd5fe3 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c | |||
| @@ -38,6 +38,10 @@ | |||
| 38 | #include <asm/irq.h> | 38 | #include <asm/irq.h> |
| 39 | #include <asm/uaccess.h> | 39 | #include <asm/uaccess.h> |
| 40 | 40 | ||
| 41 | MODULE_DESCRIPTION("PHY library"); | ||
| 42 | MODULE_AUTHOR("Andy Fleming"); | ||
| 43 | MODULE_LICENSE("GPL"); | ||
| 44 | |||
| 41 | static struct phy_driver genphy_driver; | 45 | static struct phy_driver genphy_driver; |
| 42 | extern int mdio_bus_init(void); | 46 | extern int mdio_bus_init(void); |
| 43 | extern void mdio_bus_exit(void); | 47 | extern void mdio_bus_exit(void); |
diff --git a/drivers/net/ppp_generic.c b/drivers/net/ppp_generic.c index 50430f79f8cf..1c6d328165bb 100644 --- a/drivers/net/ppp_generic.c +++ b/drivers/net/ppp_generic.c | |||
| @@ -524,9 +524,6 @@ static int get_filter(void __user *arg, struct sock_filter **p) | |||
| 524 | if (copy_from_user(&uprog, arg, sizeof(uprog))) | 524 | if (copy_from_user(&uprog, arg, sizeof(uprog))) |
| 525 | return -EFAULT; | 525 | return -EFAULT; |
| 526 | 526 | ||
| 527 | if (uprog.len > BPF_MAXINSNS) | ||
| 528 | return -EINVAL; | ||
| 529 | |||
| 530 | if (!uprog.len) { | 527 | if (!uprog.len) { |
| 531 | *p = NULL; | 528 | *p = NULL; |
| 532 | return 0; | 529 | return 0; |
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index e57df8dfe6b4..669dd52c412a 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
| @@ -3078,7 +3078,7 @@ int s2io_set_swapper(nic_t * sp) | |||
| 3078 | 3078 | ||
| 3079 | static int wait_for_msix_trans(nic_t *nic, int i) | 3079 | static int wait_for_msix_trans(nic_t *nic, int i) |
| 3080 | { | 3080 | { |
| 3081 | XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0; | 3081 | XENA_dev_config_t __iomem *bar0 = nic->bar0; |
| 3082 | u64 val64; | 3082 | u64 val64; |
| 3083 | int ret = 0, cnt = 0; | 3083 | int ret = 0, cnt = 0; |
| 3084 | 3084 | ||
| @@ -3099,7 +3099,7 @@ static int wait_for_msix_trans(nic_t *nic, int i) | |||
| 3099 | 3099 | ||
| 3100 | void restore_xmsi_data(nic_t *nic) | 3100 | void restore_xmsi_data(nic_t *nic) |
| 3101 | { | 3101 | { |
| 3102 | XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0; | 3102 | XENA_dev_config_t __iomem *bar0 = nic->bar0; |
| 3103 | u64 val64; | 3103 | u64 val64; |
| 3104 | int i; | 3104 | int i; |
| 3105 | 3105 | ||
| @@ -3117,7 +3117,7 @@ void restore_xmsi_data(nic_t *nic) | |||
| 3117 | 3117 | ||
| 3118 | static void store_xmsi_data(nic_t *nic) | 3118 | static void store_xmsi_data(nic_t *nic) |
| 3119 | { | 3119 | { |
| 3120 | XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0; | 3120 | XENA_dev_config_t __iomem *bar0 = nic->bar0; |
| 3121 | u64 val64, addr, data; | 3121 | u64 val64, addr, data; |
| 3122 | int i; | 3122 | int i; |
| 3123 | 3123 | ||
| @@ -3140,7 +3140,7 @@ static void store_xmsi_data(nic_t *nic) | |||
| 3140 | 3140 | ||
| 3141 | int s2io_enable_msi(nic_t *nic) | 3141 | int s2io_enable_msi(nic_t *nic) |
| 3142 | { | 3142 | { |
| 3143 | XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0; | 3143 | XENA_dev_config_t __iomem *bar0 = nic->bar0; |
| 3144 | u16 msi_ctrl, msg_val; | 3144 | u16 msi_ctrl, msg_val; |
| 3145 | struct config_param *config = &nic->config; | 3145 | struct config_param *config = &nic->config; |
| 3146 | struct net_device *dev = nic->dev; | 3146 | struct net_device *dev = nic->dev; |
| @@ -3190,7 +3190,7 @@ int s2io_enable_msi(nic_t *nic) | |||
| 3190 | 3190 | ||
| 3191 | int s2io_enable_msi_x(nic_t *nic) | 3191 | int s2io_enable_msi_x(nic_t *nic) |
| 3192 | { | 3192 | { |
| 3193 | XENA_dev_config_t *bar0 = (XENA_dev_config_t *) nic->bar0; | 3193 | XENA_dev_config_t __iomem *bar0 = nic->bar0; |
| 3194 | u64 tx_mat, rx_mat; | 3194 | u64 tx_mat, rx_mat; |
| 3195 | u16 msi_control; /* Temp variable */ | 3195 | u16 msi_control; /* Temp variable */ |
| 3196 | int ret, i, j, msix_indx = 1; | 3196 | int ret, i, j, msix_indx = 1; |
diff --git a/drivers/net/sungem.c b/drivers/net/sungem.c index 081717d01374..28ce47a02408 100644 --- a/drivers/net/sungem.c +++ b/drivers/net/sungem.c | |||
| @@ -2907,7 +2907,7 @@ static int __devinit gem_get_device_address(struct gem *gp) | |||
| 2907 | return 0; | 2907 | return 0; |
| 2908 | } | 2908 | } |
| 2909 | 2909 | ||
| 2910 | static void __devexit gem_remove_one(struct pci_dev *pdev) | 2910 | static void gem_remove_one(struct pci_dev *pdev) |
| 2911 | { | 2911 | { |
| 2912 | struct net_device *dev = pci_get_drvdata(pdev); | 2912 | struct net_device *dev = pci_get_drvdata(pdev); |
| 2913 | 2913 | ||
| @@ -3181,7 +3181,7 @@ static struct pci_driver gem_driver = { | |||
| 3181 | .name = GEM_MODULE_NAME, | 3181 | .name = GEM_MODULE_NAME, |
| 3182 | .id_table = gem_pci_tbl, | 3182 | .id_table = gem_pci_tbl, |
| 3183 | .probe = gem_init_one, | 3183 | .probe = gem_init_one, |
| 3184 | .remove = __devexit_p(gem_remove_one), | 3184 | .remove = gem_remove_one, |
| 3185 | #ifdef CONFIG_PM | 3185 | #ifdef CONFIG_PM |
| 3186 | .suspend = gem_suspend, | 3186 | .suspend = gem_suspend, |
| 3187 | .resume = gem_resume, | 3187 | .resume = gem_resume, |
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 47bd4a394420..2fc9893d69e1 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
| @@ -68,8 +68,8 @@ | |||
| 68 | 68 | ||
| 69 | #define DRV_MODULE_NAME "tg3" | 69 | #define DRV_MODULE_NAME "tg3" |
| 70 | #define PFX DRV_MODULE_NAME ": " | 70 | #define PFX DRV_MODULE_NAME ": " |
| 71 | #define DRV_MODULE_VERSION "3.44" | 71 | #define DRV_MODULE_VERSION "3.47" |
| 72 | #define DRV_MODULE_RELDATE "Dec 6, 2005" | 72 | #define DRV_MODULE_RELDATE "Dec 28, 2005" |
| 73 | 73 | ||
| 74 | #define TG3_DEF_MAC_MODE 0 | 74 | #define TG3_DEF_MAC_MODE 0 |
| 75 | #define TG3_DEF_RX_MODE 0 | 75 | #define TG3_DEF_RX_MODE 0 |
| @@ -341,6 +341,16 @@ static struct { | |||
| 341 | { "interrupt test (offline)" }, | 341 | { "interrupt test (offline)" }, |
| 342 | }; | 342 | }; |
| 343 | 343 | ||
| 344 | static void tg3_write32(struct tg3 *tp, u32 off, u32 val) | ||
| 345 | { | ||
| 346 | writel(val, tp->regs + off); | ||
| 347 | } | ||
| 348 | |||
| 349 | static u32 tg3_read32(struct tg3 *tp, u32 off) | ||
| 350 | { | ||
| 351 | return (readl(tp->regs + off)); | ||
| 352 | } | ||
| 353 | |||
| 344 | static void tg3_write_indirect_reg32(struct tg3 *tp, u32 off, u32 val) | 354 | static void tg3_write_indirect_reg32(struct tg3 *tp, u32 off, u32 val) |
| 345 | { | 355 | { |
| 346 | unsigned long flags; | 356 | unsigned long flags; |
| @@ -411,13 +421,29 @@ static u32 tg3_read_indirect_mbox(struct tg3 *tp, u32 off) | |||
| 411 | return val; | 421 | return val; |
| 412 | } | 422 | } |
| 413 | 423 | ||
| 414 | static void _tw32_flush(struct tg3 *tp, u32 off, u32 val) | 424 | /* usec_wait specifies the wait time in usec when writing to certain registers |
| 425 | * where it is unsafe to read back the register without some delay. | ||
| 426 | * GRC_LOCAL_CTRL is one example if the GPIOs are toggled to switch power. | ||
| 427 | * TG3PCI_CLOCK_CTRL is another example if the clock frequencies are changed. | ||
| 428 | */ | ||
| 429 | static void _tw32_flush(struct tg3 *tp, u32 off, u32 val, u32 usec_wait) | ||
| 415 | { | 430 | { |
| 416 | tp->write32(tp, off, val); | 431 | if ((tp->tg3_flags & TG3_FLAG_PCIX_TARGET_HWBUG) || |
| 417 | if (!(tp->tg3_flags & TG3_FLAG_PCIX_TARGET_HWBUG) && | 432 | (tp->tg3_flags2 & TG3_FLG2_ICH_WORKAROUND)) |
| 418 | !(tp->tg3_flags & TG3_FLAG_5701_REG_WRITE_BUG) && | 433 | /* Non-posted methods */ |
| 419 | !(tp->tg3_flags2 & TG3_FLG2_ICH_WORKAROUND)) | 434 | tp->write32(tp, off, val); |
| 420 | tp->read32(tp, off); /* flush */ | 435 | else { |
| 436 | /* Posted method */ | ||
| 437 | tg3_write32(tp, off, val); | ||
| 438 | if (usec_wait) | ||
| 439 | udelay(usec_wait); | ||
| 440 | tp->read32(tp, off); | ||
| 441 | } | ||
| 442 | /* Wait again after the read for the posted method to guarantee that | ||
| 443 | * the wait time is met. | ||
| 444 | */ | ||
| 445 | if (usec_wait) | ||
| 446 | udelay(usec_wait); | ||
| 421 | } | 447 | } |
| 422 | 448 | ||
| 423 | static inline void tw32_mailbox_flush(struct tg3 *tp, u32 off, u32 val) | 449 | static inline void tw32_mailbox_flush(struct tg3 *tp, u32 off, u32 val) |
| @@ -438,16 +464,6 @@ static void tg3_write32_tx_mbox(struct tg3 *tp, u32 off, u32 val) | |||
| 438 | readl(mbox); | 464 | readl(mbox); |
| 439 | } | 465 | } |
| 440 | 466 | ||
| 441 | static void tg3_write32(struct tg3 *tp, u32 off, u32 val) | ||
| 442 | { | ||
| 443 | writel(val, tp->regs + off); | ||
| 444 | } | ||
| 445 | |||
| 446 | static u32 tg3_read32(struct tg3 *tp, u32 off) | ||
| 447 | { | ||
| 448 | return (readl(tp->regs + off)); | ||
| 449 | } | ||
| 450 | |||
| 451 | #define tw32_mailbox(reg, val) tp->write32_mbox(tp, reg, val) | 467 | #define tw32_mailbox(reg, val) tp->write32_mbox(tp, reg, val) |
| 452 | #define tw32_mailbox_f(reg, val) tw32_mailbox_flush(tp, (reg), (val)) | 468 | #define tw32_mailbox_f(reg, val) tw32_mailbox_flush(tp, (reg), (val)) |
| 453 | #define tw32_rx_mbox(reg, val) tp->write32_rx_mbox(tp, reg, val) | 469 | #define tw32_rx_mbox(reg, val) tp->write32_rx_mbox(tp, reg, val) |
| @@ -455,7 +471,8 @@ static u32 tg3_read32(struct tg3 *tp, u32 off) | |||
| 455 | #define tr32_mailbox(reg) tp->read32_mbox(tp, reg) | 471 | #define tr32_mailbox(reg) tp->read32_mbox(tp, reg) |
| 456 | 472 | ||
| 457 | #define tw32(reg,val) tp->write32(tp, reg, val) | 473 | #define tw32(reg,val) tp->write32(tp, reg, val) |
| 458 | #define tw32_f(reg,val) _tw32_flush(tp,(reg),(val)) | 474 | #define tw32_f(reg,val) _tw32_flush(tp,(reg),(val), 0) |
| 475 | #define tw32_wait_f(reg,val,us) _tw32_flush(tp,(reg),(val), (us)) | ||
| 459 | #define tr32(reg) tp->read32(tp, reg) | 476 | #define tr32(reg) tp->read32(tp, reg) |
| 460 | 477 | ||
| 461 | static void tg3_write_mem(struct tg3 *tp, u32 off, u32 val) | 478 | static void tg3_write_mem(struct tg3 *tp, u32 off, u32 val) |
| @@ -595,21 +612,19 @@ static void tg3_switch_clocks(struct tg3 *tp) | |||
| 595 | 612 | ||
| 596 | if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) { | 613 | if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) { |
| 597 | if (orig_clock_ctrl & CLOCK_CTRL_625_CORE) { | 614 | if (orig_clock_ctrl & CLOCK_CTRL_625_CORE) { |
| 598 | tw32_f(TG3PCI_CLOCK_CTRL, | 615 | tw32_wait_f(TG3PCI_CLOCK_CTRL, |
| 599 | clock_ctrl | CLOCK_CTRL_625_CORE); | 616 | clock_ctrl | CLOCK_CTRL_625_CORE, 40); |
| 600 | udelay(40); | ||
| 601 | } | 617 | } |
| 602 | } else if ((orig_clock_ctrl & CLOCK_CTRL_44MHZ_CORE) != 0) { | 618 | } else if ((orig_clock_ctrl & CLOCK_CTRL_44MHZ_CORE) != 0) { |
| 603 | tw32_f(TG3PCI_CLOCK_CTRL, | 619 | tw32_wait_f(TG3PCI_CLOCK_CTRL, |
| 604 | clock_ctrl | | 620 | clock_ctrl | |
| 605 | (CLOCK_CTRL_44MHZ_CORE | CLOCK_CTRL_ALTCLK)); | 621 | (CLOCK_CTRL_44MHZ_CORE | CLOCK_CTRL_ALTCLK), |
| 606 | udelay(40); | 622 | 40); |
| 607 | tw32_f(TG3PCI_CLOCK_CTRL, | 623 | tw32_wait_f(TG3PCI_CLOCK_CTRL, |
| 608 | clock_ctrl | (CLOCK_CTRL_ALTCLK)); | 624 | clock_ctrl | (CLOCK_CTRL_ALTCLK), |
| 609 | udelay(40); | 625 | 40); |
| 610 | } | 626 | } |
| 611 | tw32_f(TG3PCI_CLOCK_CTRL, clock_ctrl); | 627 | tw32_wait_f(TG3PCI_CLOCK_CTRL, clock_ctrl, 40); |
| 612 | udelay(40); | ||
| 613 | } | 628 | } |
| 614 | 629 | ||
| 615 | #define PHY_BUSY_LOOPS 5000 | 630 | #define PHY_BUSY_LOOPS 5000 |
| @@ -1017,37 +1032,50 @@ static void tg3_frob_aux_power(struct tg3 *tp) | |||
| 1017 | if ((tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) != 0) | 1032 | if ((tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) != 0) |
| 1018 | return; | 1033 | return; |
| 1019 | 1034 | ||
| 1020 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) { | 1035 | if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) || |
| 1021 | tp_peer = pci_get_drvdata(tp->pdev_peer); | 1036 | (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714)) { |
| 1022 | if (!tp_peer) | 1037 | struct net_device *dev_peer; |
| 1038 | |||
| 1039 | dev_peer = pci_get_drvdata(tp->pdev_peer); | ||
| 1040 | if (!dev_peer) | ||
| 1023 | BUG(); | 1041 | BUG(); |
| 1042 | tp_peer = netdev_priv(dev_peer); | ||
| 1024 | } | 1043 | } |
| 1025 | 1044 | ||
| 1026 | |||
| 1027 | if ((tp->tg3_flags & TG3_FLAG_WOL_ENABLE) != 0 || | 1045 | if ((tp->tg3_flags & TG3_FLAG_WOL_ENABLE) != 0 || |
| 1028 | (tp_peer->tg3_flags & TG3_FLAG_WOL_ENABLE) != 0) { | 1046 | (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0 || |
| 1047 | (tp_peer->tg3_flags & TG3_FLAG_WOL_ENABLE) != 0 || | ||
| 1048 | (tp_peer->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0) { | ||
| 1029 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || | 1049 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || |
| 1030 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) { | 1050 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) { |
| 1031 | tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl | | 1051 | tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl | |
| 1032 | (GRC_LCLCTRL_GPIO_OE0 | | 1052 | (GRC_LCLCTRL_GPIO_OE0 | |
| 1033 | GRC_LCLCTRL_GPIO_OE1 | | 1053 | GRC_LCLCTRL_GPIO_OE1 | |
| 1034 | GRC_LCLCTRL_GPIO_OE2 | | 1054 | GRC_LCLCTRL_GPIO_OE2 | |
| 1035 | GRC_LCLCTRL_GPIO_OUTPUT0 | | 1055 | GRC_LCLCTRL_GPIO_OUTPUT0 | |
| 1036 | GRC_LCLCTRL_GPIO_OUTPUT1)); | 1056 | GRC_LCLCTRL_GPIO_OUTPUT1), |
| 1037 | udelay(100); | 1057 | 100); |
| 1038 | } else { | 1058 | } else { |
| 1039 | u32 no_gpio2; | 1059 | u32 no_gpio2; |
| 1040 | u32 grc_local_ctrl; | 1060 | u32 grc_local_ctrl = 0; |
| 1041 | 1061 | ||
| 1042 | if (tp_peer != tp && | 1062 | if (tp_peer != tp && |
| 1043 | (tp_peer->tg3_flags & TG3_FLAG_INIT_COMPLETE) != 0) | 1063 | (tp_peer->tg3_flags & TG3_FLAG_INIT_COMPLETE) != 0) |
| 1044 | return; | 1064 | return; |
| 1045 | 1065 | ||
| 1066 | /* Workaround to prevent overdrawing Amps. */ | ||
| 1067 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == | ||
| 1068 | ASIC_REV_5714) { | ||
| 1069 | grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE3; | ||
| 1070 | tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl | | ||
| 1071 | grc_local_ctrl, 100); | ||
| 1072 | } | ||
| 1073 | |||
| 1046 | /* On 5753 and variants, GPIO2 cannot be used. */ | 1074 | /* On 5753 and variants, GPIO2 cannot be used. */ |
| 1047 | no_gpio2 = tp->nic_sram_data_cfg & | 1075 | no_gpio2 = tp->nic_sram_data_cfg & |
| 1048 | NIC_SRAM_DATA_CFG_NO_GPIO2; | 1076 | NIC_SRAM_DATA_CFG_NO_GPIO2; |
| 1049 | 1077 | ||
| 1050 | grc_local_ctrl = GRC_LCLCTRL_GPIO_OE0 | | 1078 | grc_local_ctrl |= GRC_LCLCTRL_GPIO_OE0 | |
| 1051 | GRC_LCLCTRL_GPIO_OE1 | | 1079 | GRC_LCLCTRL_GPIO_OE1 | |
| 1052 | GRC_LCLCTRL_GPIO_OE2 | | 1080 | GRC_LCLCTRL_GPIO_OE2 | |
| 1053 | GRC_LCLCTRL_GPIO_OUTPUT1 | | 1081 | GRC_LCLCTRL_GPIO_OUTPUT1 | |
| @@ -1056,21 +1084,18 @@ static void tg3_frob_aux_power(struct tg3 *tp) | |||
| 1056 | grc_local_ctrl &= ~(GRC_LCLCTRL_GPIO_OE2 | | 1084 | grc_local_ctrl &= ~(GRC_LCLCTRL_GPIO_OE2 | |
| 1057 | GRC_LCLCTRL_GPIO_OUTPUT2); | 1085 | GRC_LCLCTRL_GPIO_OUTPUT2); |
| 1058 | } | 1086 | } |
| 1059 | tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl | | 1087 | tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl | |
| 1060 | grc_local_ctrl); | 1088 | grc_local_ctrl, 100); |
| 1061 | udelay(100); | ||
| 1062 | 1089 | ||
| 1063 | grc_local_ctrl |= GRC_LCLCTRL_GPIO_OUTPUT0; | 1090 | grc_local_ctrl |= GRC_LCLCTRL_GPIO_OUTPUT0; |
| 1064 | 1091 | ||
| 1065 | tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl | | 1092 | tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl | |
| 1066 | grc_local_ctrl); | 1093 | grc_local_ctrl, 100); |
| 1067 | udelay(100); | ||
| 1068 | 1094 | ||
| 1069 | if (!no_gpio2) { | 1095 | if (!no_gpio2) { |
| 1070 | grc_local_ctrl &= ~GRC_LCLCTRL_GPIO_OUTPUT2; | 1096 | grc_local_ctrl &= ~GRC_LCLCTRL_GPIO_OUTPUT2; |
| 1071 | tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl | | 1097 | tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl | |
| 1072 | grc_local_ctrl); | 1098 | grc_local_ctrl, 100); |
| 1073 | udelay(100); | ||
| 1074 | } | 1099 | } |
| 1075 | } | 1100 | } |
| 1076 | } else { | 1101 | } else { |
| @@ -1080,19 +1105,16 @@ static void tg3_frob_aux_power(struct tg3 *tp) | |||
| 1080 | (tp_peer->tg3_flags & TG3_FLAG_INIT_COMPLETE) != 0) | 1105 | (tp_peer->tg3_flags & TG3_FLAG_INIT_COMPLETE) != 0) |
| 1081 | return; | 1106 | return; |
| 1082 | 1107 | ||
| 1083 | tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl | | 1108 | tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl | |
| 1084 | (GRC_LCLCTRL_GPIO_OE1 | | 1109 | (GRC_LCLCTRL_GPIO_OE1 | |
| 1085 | GRC_LCLCTRL_GPIO_OUTPUT1)); | 1110 | GRC_LCLCTRL_GPIO_OUTPUT1), 100); |
| 1086 | udelay(100); | ||
| 1087 | 1111 | ||
| 1088 | tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl | | 1112 | tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl | |
| 1089 | (GRC_LCLCTRL_GPIO_OE1)); | 1113 | GRC_LCLCTRL_GPIO_OE1, 100); |
| 1090 | udelay(100); | ||
| 1091 | 1114 | ||
| 1092 | tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl | | 1115 | tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl | |
| 1093 | (GRC_LCLCTRL_GPIO_OE1 | | 1116 | (GRC_LCLCTRL_GPIO_OE1 | |
| 1094 | GRC_LCLCTRL_GPIO_OUTPUT1)); | 1117 | GRC_LCLCTRL_GPIO_OUTPUT1), 100); |
| 1095 | udelay(100); | ||
| 1096 | } | 1118 | } |
| 1097 | } | 1119 | } |
| 1098 | } | 1120 | } |
| @@ -1105,6 +1127,8 @@ static int tg3_setup_phy(struct tg3 *, int); | |||
| 1105 | 1127 | ||
| 1106 | static void tg3_write_sig_post_reset(struct tg3 *, int); | 1128 | static void tg3_write_sig_post_reset(struct tg3 *, int); |
| 1107 | static int tg3_halt_cpu(struct tg3 *, u32); | 1129 | static int tg3_halt_cpu(struct tg3 *, u32); |
| 1130 | static int tg3_nvram_lock(struct tg3 *); | ||
| 1131 | static void tg3_nvram_unlock(struct tg3 *); | ||
| 1108 | 1132 | ||
| 1109 | static int tg3_set_power_state(struct tg3 *tp, int state) | 1133 | static int tg3_set_power_state(struct tg3 *tp, int state) |
| 1110 | { | 1134 | { |
| @@ -1133,10 +1157,8 @@ static int tg3_set_power_state(struct tg3 *tp, int state) | |||
| 1133 | udelay(100); /* Delay after power state change */ | 1157 | udelay(100); /* Delay after power state change */ |
| 1134 | 1158 | ||
| 1135 | /* Switch out of Vaux if it is not a LOM */ | 1159 | /* Switch out of Vaux if it is not a LOM */ |
| 1136 | if (!(tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT)) { | 1160 | if (!(tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT)) |
| 1137 | tw32_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl); | 1161 | tw32_wait_f(GRC_LOCAL_CTRL, tp->grc_local_ctrl, 100); |
| 1138 | udelay(100); | ||
| 1139 | } | ||
| 1140 | 1162 | ||
| 1141 | return 0; | 1163 | return 0; |
| 1142 | 1164 | ||
| @@ -1179,6 +1201,21 @@ static int tg3_set_power_state(struct tg3 *tp, int state) | |||
| 1179 | tg3_setup_phy(tp, 0); | 1201 | tg3_setup_phy(tp, 0); |
| 1180 | } | 1202 | } |
| 1181 | 1203 | ||
| 1204 | if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) { | ||
| 1205 | int i; | ||
| 1206 | u32 val; | ||
| 1207 | |||
| 1208 | for (i = 0; i < 200; i++) { | ||
| 1209 | tg3_read_mem(tp, NIC_SRAM_FW_ASF_STATUS_MBOX, &val); | ||
| 1210 | if (val == ~NIC_SRAM_FIRMWARE_MBOX_MAGIC1) | ||
| 1211 | break; | ||
| 1212 | msleep(1); | ||
| 1213 | } | ||
| 1214 | } | ||
| 1215 | tg3_write_mem(tp, NIC_SRAM_WOL_MBOX, WOL_SIGNATURE | | ||
| 1216 | WOL_DRV_STATE_SHUTDOWN | | ||
| 1217 | WOL_DRV_WOL | WOL_SET_MAGIC_PKT); | ||
| 1218 | |||
| 1182 | pci_read_config_word(tp->pdev, pm + PCI_PM_PMC, &power_caps); | 1219 | pci_read_config_word(tp->pdev, pm + PCI_PM_PMC, &power_caps); |
| 1183 | 1220 | ||
| 1184 | if (tp->tg3_flags & TG3_FLAG_WOL_ENABLE) { | 1221 | if (tp->tg3_flags & TG3_FLAG_WOL_ENABLE) { |
| @@ -1220,10 +1257,8 @@ static int tg3_set_power_state(struct tg3 *tp, int state) | |||
| 1220 | base_val |= (CLOCK_CTRL_RXCLK_DISABLE | | 1257 | base_val |= (CLOCK_CTRL_RXCLK_DISABLE | |
| 1221 | CLOCK_CTRL_TXCLK_DISABLE); | 1258 | CLOCK_CTRL_TXCLK_DISABLE); |
| 1222 | 1259 | ||
| 1223 | tw32_f(TG3PCI_CLOCK_CTRL, base_val | | 1260 | tw32_wait_f(TG3PCI_CLOCK_CTRL, base_val | CLOCK_CTRL_ALTCLK | |
| 1224 | CLOCK_CTRL_ALTCLK | | 1261 | CLOCK_CTRL_PWRDOWN_PLL133, 40); |
| 1225 | CLOCK_CTRL_PWRDOWN_PLL133); | ||
| 1226 | udelay(40); | ||
| 1227 | } else if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS) { | 1262 | } else if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS) { |
| 1228 | /* do nothing */ | 1263 | /* do nothing */ |
| 1229 | } else if (!((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) && | 1264 | } else if (!((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) && |
| @@ -1244,11 +1279,11 @@ static int tg3_set_power_state(struct tg3 *tp, int state) | |||
| 1244 | newbits2 = newbits1 | CLOCK_CTRL_44MHZ_CORE; | 1279 | newbits2 = newbits1 | CLOCK_CTRL_44MHZ_CORE; |
| 1245 | } | 1280 | } |
| 1246 | 1281 | ||
| 1247 | tw32_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits1); | 1282 | tw32_wait_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits1, |
| 1248 | udelay(40); | 1283 | 40); |
| 1249 | 1284 | ||
| 1250 | tw32_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits2); | 1285 | tw32_wait_f(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits2, |
| 1251 | udelay(40); | 1286 | 40); |
| 1252 | 1287 | ||
| 1253 | if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) { | 1288 | if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) { |
| 1254 | u32 newbits3; | 1289 | u32 newbits3; |
| @@ -1262,9 +1297,20 @@ static int tg3_set_power_state(struct tg3 *tp, int state) | |||
| 1262 | newbits3 = CLOCK_CTRL_44MHZ_CORE; | 1297 | newbits3 = CLOCK_CTRL_44MHZ_CORE; |
| 1263 | } | 1298 | } |
| 1264 | 1299 | ||
| 1265 | tw32_f(TG3PCI_CLOCK_CTRL, | 1300 | tw32_wait_f(TG3PCI_CLOCK_CTRL, |
| 1266 | tp->pci_clock_ctrl | newbits3); | 1301 | tp->pci_clock_ctrl | newbits3, 40); |
| 1267 | udelay(40); | 1302 | } |
| 1303 | } | ||
| 1304 | |||
| 1305 | if (!(tp->tg3_flags & TG3_FLAG_WOL_ENABLE) && | ||
| 1306 | !(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) { | ||
| 1307 | /* Turn off the PHY */ | ||
| 1308 | if (!(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) { | ||
| 1309 | tg3_writephy(tp, MII_TG3_EXT_CTRL, | ||
| 1310 | MII_TG3_EXT_CTRL_FORCE_LED_OFF); | ||
| 1311 | tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x01b2); | ||
| 1312 | if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700) | ||
| 1313 | tg3_writephy(tp, MII_BMCR, BMCR_PDOWN); | ||
| 1268 | } | 1314 | } |
| 1269 | } | 1315 | } |
| 1270 | 1316 | ||
| @@ -1277,8 +1323,12 @@ static int tg3_set_power_state(struct tg3 *tp, int state) | |||
| 1277 | 1323 | ||
| 1278 | val &= ~((1 << 16) | (1 << 4) | (1 << 2) | (1 << 1) | 1); | 1324 | val &= ~((1 << 16) | (1 << 4) | (1 << 2) | (1 << 1) | 1); |
| 1279 | tw32(0x7d00, val); | 1325 | tw32(0x7d00, val); |
| 1280 | if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) | 1326 | if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF)) { |
| 1327 | tg3_nvram_lock(tp); | ||
| 1281 | tg3_halt_cpu(tp, RX_CPU_BASE); | 1328 | tg3_halt_cpu(tp, RX_CPU_BASE); |
| 1329 | tw32_f(NVRAM_SWARB, SWARB_REQ_CLR0); | ||
| 1330 | tg3_nvram_unlock(tp); | ||
| 1331 | } | ||
| 1282 | } | 1332 | } |
| 1283 | 1333 | ||
| 1284 | /* Finally, set the new power state. */ | 1334 | /* Finally, set the new power state. */ |
| @@ -1812,7 +1862,7 @@ static int tg3_setup_copper_phy(struct tg3 *tp, int force_reset) | |||
| 1812 | } | 1862 | } |
| 1813 | } | 1863 | } |
| 1814 | relink: | 1864 | relink: |
| 1815 | if (current_link_up == 0) { | 1865 | if (current_link_up == 0 || tp->link_config.phy_is_low_power) { |
| 1816 | u32 tmp; | 1866 | u32 tmp; |
| 1817 | 1867 | ||
| 1818 | tg3_phy_copper_begin(tp); | 1868 | tg3_phy_copper_begin(tp); |
| @@ -7101,8 +7151,13 @@ do { p = (u32 *)(orig_p + (reg)); \ | |||
| 7101 | GET_REG32_LOOP(BUFMGR_MODE, 0x58); | 7151 | GET_REG32_LOOP(BUFMGR_MODE, 0x58); |
| 7102 | GET_REG32_LOOP(RDMAC_MODE, 0x08); | 7152 | GET_REG32_LOOP(RDMAC_MODE, 0x08); |
| 7103 | GET_REG32_LOOP(WDMAC_MODE, 0x08); | 7153 | GET_REG32_LOOP(WDMAC_MODE, 0x08); |
| 7104 | GET_REG32_LOOP(RX_CPU_BASE, 0x280); | 7154 | GET_REG32_1(RX_CPU_MODE); |
| 7105 | GET_REG32_LOOP(TX_CPU_BASE, 0x280); | 7155 | GET_REG32_1(RX_CPU_STATE); |
| 7156 | GET_REG32_1(RX_CPU_PGMCTR); | ||
| 7157 | GET_REG32_1(RX_CPU_HWBKPT); | ||
| 7158 | GET_REG32_1(TX_CPU_MODE); | ||
| 7159 | GET_REG32_1(TX_CPU_STATE); | ||
| 7160 | GET_REG32_1(TX_CPU_PGMCTR); | ||
| 7106 | GET_REG32_LOOP(GRCMBOX_INTERRUPT_0, 0x110); | 7161 | GET_REG32_LOOP(GRCMBOX_INTERRUPT_0, 0x110); |
| 7107 | GET_REG32_LOOP(FTQ_RESET, 0x120); | 7162 | GET_REG32_LOOP(FTQ_RESET, 0x120); |
| 7108 | GET_REG32_LOOP(MSGINT_MODE, 0x0c); | 7163 | GET_REG32_LOOP(MSGINT_MODE, 0x0c); |
| @@ -7925,13 +7980,12 @@ static int tg3_test_memory(struct tg3 *tp) | |||
| 7925 | u32 offset; | 7980 | u32 offset; |
| 7926 | u32 len; | 7981 | u32 len; |
| 7927 | } mem_tbl_570x[] = { | 7982 | } mem_tbl_570x[] = { |
| 7928 | { 0x00000000, 0x01000}, | 7983 | { 0x00000000, 0x00b50}, |
| 7929 | { 0x00002000, 0x1c000}, | 7984 | { 0x00002000, 0x1c000}, |
| 7930 | { 0xffffffff, 0x00000} | 7985 | { 0xffffffff, 0x00000} |
| 7931 | }, mem_tbl_5705[] = { | 7986 | }, mem_tbl_5705[] = { |
| 7932 | { 0x00000100, 0x0000c}, | 7987 | { 0x00000100, 0x0000c}, |
| 7933 | { 0x00000200, 0x00008}, | 7988 | { 0x00000200, 0x00008}, |
| 7934 | { 0x00000b50, 0x00400}, | ||
| 7935 | { 0x00004000, 0x00800}, | 7989 | { 0x00004000, 0x00800}, |
| 7936 | { 0x00006000, 0x01000}, | 7990 | { 0x00006000, 0x01000}, |
| 7937 | { 0x00008000, 0x02000}, | 7991 | { 0x00008000, 0x02000}, |
| @@ -8533,6 +8587,7 @@ static void __devinit tg3_nvram_init(struct tg3 *tp) | |||
| 8533 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) { | 8587 | GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) { |
| 8534 | tp->tg3_flags |= TG3_FLAG_NVRAM; | 8588 | tp->tg3_flags |= TG3_FLAG_NVRAM; |
| 8535 | 8589 | ||
| 8590 | tg3_nvram_lock(tp); | ||
| 8536 | tg3_enable_nvram_access(tp); | 8591 | tg3_enable_nvram_access(tp); |
| 8537 | 8592 | ||
| 8538 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752) | 8593 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5752) |
| @@ -8543,6 +8598,7 @@ static void __devinit tg3_nvram_init(struct tg3 *tp) | |||
| 8543 | tg3_get_nvram_size(tp); | 8598 | tg3_get_nvram_size(tp); |
| 8544 | 8599 | ||
| 8545 | tg3_disable_nvram_access(tp); | 8600 | tg3_disable_nvram_access(tp); |
| 8601 | tg3_nvram_unlock(tp); | ||
| 8546 | 8602 | ||
| 8547 | } else { | 8603 | } else { |
| 8548 | tp->tg3_flags &= ~(TG3_FLAG_NVRAM | TG3_FLAG_NVRAM_BUFFERED); | 8604 | tp->tg3_flags &= ~(TG3_FLAG_NVRAM | TG3_FLAG_NVRAM_BUFFERED); |
| @@ -8640,10 +8696,10 @@ static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val) | |||
| 8640 | if (ret == 0) | 8696 | if (ret == 0) |
| 8641 | *val = swab32(tr32(NVRAM_RDDATA)); | 8697 | *val = swab32(tr32(NVRAM_RDDATA)); |
| 8642 | 8698 | ||
| 8643 | tg3_nvram_unlock(tp); | ||
| 8644 | |||
| 8645 | tg3_disable_nvram_access(tp); | 8699 | tg3_disable_nvram_access(tp); |
| 8646 | 8700 | ||
| 8701 | tg3_nvram_unlock(tp); | ||
| 8702 | |||
| 8647 | return ret; | 8703 | return ret; |
| 8648 | } | 8704 | } |
| 8649 | 8705 | ||
| @@ -8728,6 +8784,10 @@ static int tg3_nvram_write_block_unbuffered(struct tg3 *tp, u32 offset, u32 len, | |||
| 8728 | 8784 | ||
| 8729 | offset = offset + (pagesize - page_off); | 8785 | offset = offset + (pagesize - page_off); |
| 8730 | 8786 | ||
| 8787 | /* Nvram lock released by tg3_nvram_read() above, | ||
| 8788 | * so need to get it again. | ||
| 8789 | */ | ||
| 8790 | tg3_nvram_lock(tp); | ||
| 8731 | tg3_enable_nvram_access(tp); | 8791 | tg3_enable_nvram_access(tp); |
| 8732 | 8792 | ||
| 8733 | /* | 8793 | /* |
| @@ -10426,7 +10486,7 @@ static char * __devinit tg3_bus_string(struct tg3 *tp, char *str) | |||
| 10426 | return str; | 10486 | return str; |
| 10427 | } | 10487 | } |
| 10428 | 10488 | ||
| 10429 | static struct pci_dev * __devinit tg3_find_5704_peer(struct tg3 *tp) | 10489 | static struct pci_dev * __devinit tg3_find_peer(struct tg3 *tp) |
| 10430 | { | 10490 | { |
| 10431 | struct pci_dev *peer; | 10491 | struct pci_dev *peer; |
| 10432 | unsigned int func, devnr = tp->pdev->devfn & ~7; | 10492 | unsigned int func, devnr = tp->pdev->devfn & ~7; |
| @@ -10437,8 +10497,13 @@ static struct pci_dev * __devinit tg3_find_5704_peer(struct tg3 *tp) | |||
| 10437 | break; | 10497 | break; |
| 10438 | pci_dev_put(peer); | 10498 | pci_dev_put(peer); |
| 10439 | } | 10499 | } |
| 10440 | if (!peer || peer == tp->pdev) | 10500 | /* 5704 can be configured in single-port mode, set peer to |
| 10441 | BUG(); | 10501 | * tp->pdev in that case. |
| 10502 | */ | ||
| 10503 | if (!peer) { | ||
| 10504 | peer = tp->pdev; | ||
| 10505 | return peer; | ||
| 10506 | } | ||
| 10442 | 10507 | ||
| 10443 | /* | 10508 | /* |
| 10444 | * We don't need to keep the refcount elevated; there's no way | 10509 | * We don't need to keep the refcount elevated; there's no way |
| @@ -10674,8 +10739,9 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
| 10674 | tp->rx_pending = 63; | 10739 | tp->rx_pending = 63; |
| 10675 | } | 10740 | } |
| 10676 | 10741 | ||
| 10677 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) | 10742 | if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) || |
| 10678 | tp->pdev_peer = tg3_find_5704_peer(tp); | 10743 | (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5714)) |
| 10744 | tp->pdev_peer = tg3_find_peer(tp); | ||
| 10679 | 10745 | ||
| 10680 | err = tg3_get_device_address(tp); | 10746 | err = tg3_get_device_address(tp); |
| 10681 | if (err) { | 10747 | if (err) { |
| @@ -10820,12 +10886,14 @@ static int tg3_suspend(struct pci_dev *pdev, pm_message_t state) | |||
| 10820 | 10886 | ||
| 10821 | tg3_full_lock(tp, 0); | 10887 | tg3_full_lock(tp, 0); |
| 10822 | tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); | 10888 | tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); |
| 10889 | tp->tg3_flags &= ~TG3_FLAG_INIT_COMPLETE; | ||
| 10823 | tg3_full_unlock(tp); | 10890 | tg3_full_unlock(tp); |
| 10824 | 10891 | ||
| 10825 | err = tg3_set_power_state(tp, pci_choose_state(pdev, state)); | 10892 | err = tg3_set_power_state(tp, pci_choose_state(pdev, state)); |
| 10826 | if (err) { | 10893 | if (err) { |
| 10827 | tg3_full_lock(tp, 0); | 10894 | tg3_full_lock(tp, 0); |
| 10828 | 10895 | ||
| 10896 | tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE; | ||
| 10829 | tg3_init_hw(tp); | 10897 | tg3_init_hw(tp); |
| 10830 | 10898 | ||
| 10831 | tp->timer.expires = jiffies + tp->timer_offset; | 10899 | tp->timer.expires = jiffies + tp->timer_offset; |
| @@ -10859,6 +10927,7 @@ static int tg3_resume(struct pci_dev *pdev) | |||
| 10859 | 10927 | ||
| 10860 | tg3_full_lock(tp, 0); | 10928 | tg3_full_lock(tp, 0); |
| 10861 | 10929 | ||
| 10930 | tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE; | ||
| 10862 | tg3_init_hw(tp); | 10931 | tg3_init_hw(tp); |
| 10863 | 10932 | ||
| 10864 | tp->timer.expires = jiffies + tp->timer_offset; | 10933 | tp->timer.expires = jiffies + tp->timer_offset; |
diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h index fb7e2a5f4a08..890e1635996b 100644 --- a/drivers/net/tg3.h +++ b/drivers/net/tg3.h | |||
| @@ -1124,7 +1124,14 @@ | |||
| 1124 | /* 0x280 --> 0x400 unused */ | 1124 | /* 0x280 --> 0x400 unused */ |
| 1125 | 1125 | ||
| 1126 | #define RX_CPU_BASE 0x00005000 | 1126 | #define RX_CPU_BASE 0x00005000 |
| 1127 | #define RX_CPU_MODE 0x00005000 | ||
| 1128 | #define RX_CPU_STATE 0x00005004 | ||
| 1129 | #define RX_CPU_PGMCTR 0x0000501c | ||
| 1130 | #define RX_CPU_HWBKPT 0x00005034 | ||
| 1127 | #define TX_CPU_BASE 0x00005400 | 1131 | #define TX_CPU_BASE 0x00005400 |
| 1132 | #define TX_CPU_MODE 0x00005400 | ||
| 1133 | #define TX_CPU_STATE 0x00005404 | ||
| 1134 | #define TX_CPU_PGMCTR 0x0000541c | ||
| 1128 | 1135 | ||
| 1129 | /* Mailboxes */ | 1136 | /* Mailboxes */ |
| 1130 | #define GRCMBOX_INTERRUPT_0 0x00005800 /* 64-bit */ | 1137 | #define GRCMBOX_INTERRUPT_0 0x00005800 /* 64-bit */ |
| @@ -1529,6 +1536,12 @@ | |||
| 1529 | #define NIC_SRAM_MAC_ADDR_HIGH_MBOX 0x00000c14 | 1536 | #define NIC_SRAM_MAC_ADDR_HIGH_MBOX 0x00000c14 |
| 1530 | #define NIC_SRAM_MAC_ADDR_LOW_MBOX 0x00000c18 | 1537 | #define NIC_SRAM_MAC_ADDR_LOW_MBOX 0x00000c18 |
| 1531 | 1538 | ||
| 1539 | #define NIC_SRAM_WOL_MBOX 0x00000d30 | ||
| 1540 | #define WOL_SIGNATURE 0x474c0000 | ||
| 1541 | #define WOL_DRV_STATE_SHUTDOWN 0x00000001 | ||
| 1542 | #define WOL_DRV_WOL 0x00000002 | ||
| 1543 | #define WOL_SET_MAGIC_PKT 0x00000004 | ||
| 1544 | |||
| 1532 | #define NIC_SRAM_DATA_CFG_2 0x00000d38 | 1545 | #define NIC_SRAM_DATA_CFG_2 0x00000d38 |
| 1533 | 1546 | ||
| 1534 | #define SHASTA_EXT_LED_MODE_MASK 0x00018000 | 1547 | #define SHASTA_EXT_LED_MODE_MASK 0x00018000 |
| @@ -1565,6 +1578,7 @@ | |||
| 1565 | #define MII_TG3_EXT_CTRL 0x10 /* Extended control register */ | 1578 | #define MII_TG3_EXT_CTRL 0x10 /* Extended control register */ |
| 1566 | #define MII_TG3_EXT_CTRL_FIFO_ELASTIC 0x0001 | 1579 | #define MII_TG3_EXT_CTRL_FIFO_ELASTIC 0x0001 |
| 1567 | #define MII_TG3_EXT_CTRL_LNK3_LED_MODE 0x0002 | 1580 | #define MII_TG3_EXT_CTRL_LNK3_LED_MODE 0x0002 |
| 1581 | #define MII_TG3_EXT_CTRL_FORCE_LED_OFF 0x0008 | ||
| 1568 | #define MII_TG3_EXT_CTRL_TBI 0x8000 | 1582 | #define MII_TG3_EXT_CTRL_TBI 0x8000 |
| 1569 | 1583 | ||
| 1570 | #define MII_TG3_EXT_STAT 0x11 /* Extended status register */ | 1584 | #define MII_TG3_EXT_STAT 0x11 /* Extended status register */ |
diff --git a/drivers/net/wireless/orinoco_nortel.c b/drivers/net/wireless/orinoco_nortel.c index d8afd51ff8a5..d1a670b35338 100644 --- a/drivers/net/wireless/orinoco_nortel.c +++ b/drivers/net/wireless/orinoco_nortel.c | |||
| @@ -1,6 +1,8 @@ | |||
| 1 | /* orinoco_nortel.c | 1 | /* orinoco_nortel.c |
| 2 | * | 2 | * |
| 3 | * Driver for Prism II devices which would usually be driven by orinoco_cs, | 3 | * Driver for Prism II devices which would usually be driven by orinoco_cs, |
| 4 | * but are connected to the PCI bus by a PCI-to-PCMCIA adapter used in | ||
| 5 | * Nortel emobility, Symbol LA-4113 and Symbol LA-4123. | ||
| 4 | * but are connected to the PCI bus by a Nortel PCI-PCMCIA-Adapter. | 6 | * but are connected to the PCI bus by a Nortel PCI-PCMCIA-Adapter. |
| 5 | * | 7 | * |
| 6 | * Copyright (C) 2002 Tobias Hoffmann | 8 | * Copyright (C) 2002 Tobias Hoffmann |
| @@ -165,7 +167,7 @@ static int nortel_pci_init_one(struct pci_dev *pdev, | |||
| 165 | goto fail_resources; | 167 | goto fail_resources; |
| 166 | } | 168 | } |
| 167 | 169 | ||
| 168 | iomem = pci_iomap(pdev, 3, 0); | 170 | iomem = pci_iomap(pdev, 2, 0); |
| 169 | if (!iomem) { | 171 | if (!iomem) { |
| 170 | err = -ENOMEM; | 172 | err = -ENOMEM; |
| 171 | goto fail_map_io; | 173 | goto fail_map_io; |
| @@ -265,6 +267,8 @@ static void __devexit nortel_pci_remove_one(struct pci_dev *pdev) | |||
| 265 | static struct pci_device_id nortel_pci_id_table[] = { | 267 | static struct pci_device_id nortel_pci_id_table[] = { |
| 266 | /* Nortel emobility PCI */ | 268 | /* Nortel emobility PCI */ |
| 267 | {0x126c, 0x8030, PCI_ANY_ID, PCI_ANY_ID,}, | 269 | {0x126c, 0x8030, PCI_ANY_ID, PCI_ANY_ID,}, |
| 270 | /* Symbol LA-4123 PCI */ | ||
| 271 | {0x1562, 0x0001, PCI_ANY_ID, PCI_ANY_ID,}, | ||
| 268 | {0,}, | 272 | {0,}, |
| 269 | }; | 273 | }; |
| 270 | 274 | ||
