diff options
-rw-r--r-- | drivers/net/forcedeth.c | 151 |
1 files changed, 134 insertions, 17 deletions
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index 87af5e497c51..5472d12122b4 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c | |||
@@ -110,6 +110,7 @@ | |||
110 | * 0.55: 22 Mar 2006: Add flow control (pause frame). | 110 | * 0.55: 22 Mar 2006: Add flow control (pause frame). |
111 | * 0.56: 22 Mar 2006: Additional ethtool config and moduleparam support. | 111 | * 0.56: 22 Mar 2006: Additional ethtool config and moduleparam support. |
112 | * 0.57: 14 May 2006: Mac address set in probe/remove and order corrections. | 112 | * 0.57: 14 May 2006: Mac address set in probe/remove and order corrections. |
113 | * 0.58: 30 Oct 2006: Added support for sideband management unit. | ||
113 | * | 114 | * |
114 | * Known bugs: | 115 | * Known bugs: |
115 | * We suspect that on some hardware no TX done interrupts are generated. | 116 | * We suspect that on some hardware no TX done interrupts are generated. |
@@ -126,7 +127,7 @@ | |||
126 | #else | 127 | #else |
127 | #define DRIVERNAPI | 128 | #define DRIVERNAPI |
128 | #endif | 129 | #endif |
129 | #define FORCEDETH_VERSION "0.57" | 130 | #define FORCEDETH_VERSION "0.58" |
130 | #define DRV_NAME "forcedeth" | 131 | #define DRV_NAME "forcedeth" |
131 | 132 | ||
132 | #include <linux/module.h> | 133 | #include <linux/module.h> |
@@ -174,6 +175,7 @@ | |||
174 | #define DEV_HAS_PAUSEFRAME_TX 0x0200 /* device supports tx pause frames */ | 175 | #define DEV_HAS_PAUSEFRAME_TX 0x0200 /* device supports tx pause frames */ |
175 | #define DEV_HAS_STATISTICS 0x0400 /* device supports hw statistics */ | 176 | #define DEV_HAS_STATISTICS 0x0400 /* device supports hw statistics */ |
176 | #define DEV_HAS_TEST_EXTENDED 0x0800 /* device supports extended diagnostic test */ | 177 | #define DEV_HAS_TEST_EXTENDED 0x0800 /* device supports extended diagnostic test */ |
178 | #define DEV_HAS_MGMT_UNIT 0x1000 /* device supports management unit */ | ||
177 | 179 | ||
178 | enum { | 180 | enum { |
179 | NvRegIrqStatus = 0x000, | 181 | NvRegIrqStatus = 0x000, |
@@ -222,6 +224,15 @@ enum { | |||
222 | #define NVREG_MAC_RESET_ASSERT 0x0F3 | 224 | #define NVREG_MAC_RESET_ASSERT 0x0F3 |
223 | NvRegTransmitterControl = 0x084, | 225 | NvRegTransmitterControl = 0x084, |
224 | #define NVREG_XMITCTL_START 0x01 | 226 | #define NVREG_XMITCTL_START 0x01 |
227 | #define NVREG_XMITCTL_MGMT_ST 0x40000000 | ||
228 | #define NVREG_XMITCTL_SYNC_MASK 0x000f0000 | ||
229 | #define NVREG_XMITCTL_SYNC_NOT_READY 0x0 | ||
230 | #define NVREG_XMITCTL_SYNC_PHY_INIT 0x00040000 | ||
231 | #define NVREG_XMITCTL_MGMT_SEMA_MASK 0x00000f00 | ||
232 | #define NVREG_XMITCTL_MGMT_SEMA_FREE 0x0 | ||
233 | #define NVREG_XMITCTL_HOST_SEMA_MASK 0x0000f000 | ||
234 | #define NVREG_XMITCTL_HOST_SEMA_ACQ 0x0000f000 | ||
235 | #define NVREG_XMITCTL_HOST_LOADED 0x00004000 | ||
225 | NvRegTransmitterStatus = 0x088, | 236 | NvRegTransmitterStatus = 0x088, |
226 | #define NVREG_XMITSTAT_BUSY 0x01 | 237 | #define NVREG_XMITSTAT_BUSY 0x01 |
227 | 238 | ||
@@ -304,8 +315,8 @@ enum { | |||
304 | #define NVREG_MIISTAT_LINKCHANGE 0x0008 | 315 | #define NVREG_MIISTAT_LINKCHANGE 0x0008 |
305 | #define NVREG_MIISTAT_MASK 0x000f | 316 | #define NVREG_MIISTAT_MASK 0x000f |
306 | #define NVREG_MIISTAT_MASK2 0x000f | 317 | #define NVREG_MIISTAT_MASK2 0x000f |
307 | NvRegUnknownSetupReg4 = 0x184, | 318 | NvRegMIIMask = 0x184, |
308 | #define NVREG_UNKSETUP4_VAL 8 | 319 | #define NVREG_MII_LINKCHANGE 0x0008 |
309 | 320 | ||
310 | NvRegAdapterControl = 0x188, | 321 | NvRegAdapterControl = 0x188, |
311 | #define NVREG_ADAPTCTL_START 0x02 | 322 | #define NVREG_ADAPTCTL_START 0x02 |
@@ -719,6 +730,7 @@ struct fe_priv { | |||
719 | u32 driver_data; | 730 | u32 driver_data; |
720 | u32 register_size; | 731 | u32 register_size; |
721 | int rx_csum; | 732 | int rx_csum; |
733 | u32 mac_in_use; | ||
722 | 734 | ||
723 | void __iomem *base; | 735 | void __iomem *base; |
724 | 736 | ||
@@ -4030,6 +4042,54 @@ static void nv_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | |||
4030 | /* nothing to do */ | 4042 | /* nothing to do */ |
4031 | }; | 4043 | }; |
4032 | 4044 | ||
4045 | /* The mgmt unit and driver use a semaphore to access the phy during init */ | ||
4046 | static int nv_mgmt_acquire_sema(struct net_device *dev) | ||
4047 | { | ||
4048 | u8 __iomem *base = get_hwbase(dev); | ||
4049 | int i; | ||
4050 | u32 tx_ctrl, mgmt_sema; | ||
4051 | |||
4052 | for (i = 0; i < 10; i++) { | ||
4053 | mgmt_sema = readl(base + NvRegTransmitterControl) & NVREG_XMITCTL_MGMT_SEMA_MASK; | ||
4054 | if (mgmt_sema == NVREG_XMITCTL_MGMT_SEMA_FREE) | ||
4055 | break; | ||
4056 | msleep(500); | ||
4057 | } | ||
4058 | |||
4059 | if (mgmt_sema != NVREG_XMITCTL_MGMT_SEMA_FREE) | ||
4060 | return 0; | ||
4061 | |||
4062 | for (i = 0; i < 2; i++) { | ||
4063 | tx_ctrl = readl(base + NvRegTransmitterControl); | ||
4064 | tx_ctrl |= NVREG_XMITCTL_HOST_SEMA_ACQ; | ||
4065 | writel(tx_ctrl, base + NvRegTransmitterControl); | ||
4066 | |||
4067 | /* verify that semaphore was acquired */ | ||
4068 | tx_ctrl = readl(base + NvRegTransmitterControl); | ||
4069 | if (((tx_ctrl & NVREG_XMITCTL_HOST_SEMA_MASK) == NVREG_XMITCTL_HOST_SEMA_ACQ) && | ||
4070 | ((tx_ctrl & NVREG_XMITCTL_MGMT_SEMA_MASK) == NVREG_XMITCTL_MGMT_SEMA_FREE)) | ||
4071 | return 1; | ||
4072 | else | ||
4073 | udelay(50); | ||
4074 | } | ||
4075 | |||
4076 | return 0; | ||
4077 | } | ||
4078 | |||
4079 | /* Indicate to mgmt unit whether driver is loaded or not */ | ||
4080 | static void nv_mgmt_driver_loaded(struct net_device *dev, int loaded) | ||
4081 | { | ||
4082 | u8 __iomem *base = get_hwbase(dev); | ||
4083 | u32 tx_ctrl; | ||
4084 | |||
4085 | tx_ctrl = readl(base + NvRegTransmitterControl); | ||
4086 | if (loaded) | ||
4087 | tx_ctrl |= NVREG_XMITCTL_HOST_LOADED; | ||
4088 | else | ||
4089 | tx_ctrl &= ~NVREG_XMITCTL_HOST_LOADED; | ||
4090 | writel(tx_ctrl, base + NvRegTransmitterControl); | ||
4091 | } | ||
4092 | |||
4033 | static int nv_open(struct net_device *dev) | 4093 | static int nv_open(struct net_device *dev) |
4034 | { | 4094 | { |
4035 | struct fe_priv *np = netdev_priv(dev); | 4095 | struct fe_priv *np = netdev_priv(dev); |
@@ -4085,7 +4145,7 @@ static int nv_open(struct net_device *dev) | |||
4085 | NV_SETUP5_DELAY, NV_SETUP5_DELAYMAX, | 4145 | NV_SETUP5_DELAY, NV_SETUP5_DELAYMAX, |
4086 | KERN_INFO "open: SetupReg5, Bit 31 remained off\n"); | 4146 | KERN_INFO "open: SetupReg5, Bit 31 remained off\n"); |
4087 | 4147 | ||
4088 | writel(0, base + NvRegUnknownSetupReg4); | 4148 | writel(0, base + NvRegMIIMask); |
4089 | writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus); | 4149 | writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus); |
4090 | writel(NVREG_MIISTAT_MASK2, base + NvRegMIIStatus); | 4150 | writel(NVREG_MIISTAT_MASK2, base + NvRegMIIStatus); |
4091 | 4151 | ||
@@ -4111,7 +4171,7 @@ static int nv_open(struct net_device *dev) | |||
4111 | writel((np->phyaddr << NVREG_ADAPTCTL_PHYSHIFT)|NVREG_ADAPTCTL_PHYVALID|NVREG_ADAPTCTL_RUNNING, | 4171 | writel((np->phyaddr << NVREG_ADAPTCTL_PHYSHIFT)|NVREG_ADAPTCTL_PHYVALID|NVREG_ADAPTCTL_RUNNING, |
4112 | base + NvRegAdapterControl); | 4172 | base + NvRegAdapterControl); |
4113 | writel(NVREG_MIISPEED_BIT8|NVREG_MIIDELAY, base + NvRegMIISpeed); | 4173 | writel(NVREG_MIISPEED_BIT8|NVREG_MIIDELAY, base + NvRegMIISpeed); |
4114 | writel(NVREG_UNKSETUP4_VAL, base + NvRegUnknownSetupReg4); | 4174 | writel(NVREG_MII_LINKCHANGE, base + NvRegMIIMask); |
4115 | if (np->wolenabled) | 4175 | if (np->wolenabled) |
4116 | writel(NVREG_WAKEUPFLAGS_ENABLE , base + NvRegWakeUpFlags); | 4176 | writel(NVREG_WAKEUPFLAGS_ENABLE , base + NvRegWakeUpFlags); |
4117 | 4177 | ||
@@ -4230,6 +4290,8 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i | |||
4230 | u8 __iomem *base; | 4290 | u8 __iomem *base; |
4231 | int err, i; | 4291 | int err, i; |
4232 | u32 powerstate, txreg; | 4292 | u32 powerstate, txreg; |
4293 | u32 phystate_orig = 0, phystate; | ||
4294 | int phyinitialized = 0; | ||
4233 | 4295 | ||
4234 | dev = alloc_etherdev(sizeof(struct fe_priv)); | 4296 | dev = alloc_etherdev(sizeof(struct fe_priv)); |
4235 | err = -ENOMEM; | 4297 | err = -ENOMEM; |
@@ -4514,6 +4576,48 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i | |||
4514 | np->need_linktimer = 0; | 4576 | np->need_linktimer = 0; |
4515 | } | 4577 | } |
4516 | 4578 | ||
4579 | /* clear phy state and temporarily halt phy interrupts */ | ||
4580 | writel(0, base + NvRegMIIMask); | ||
4581 | phystate = readl(base + NvRegAdapterControl); | ||
4582 | if (phystate & NVREG_ADAPTCTL_RUNNING) { | ||
4583 | phystate_orig = 1; | ||
4584 | phystate &= ~NVREG_ADAPTCTL_RUNNING; | ||
4585 | writel(phystate, base + NvRegAdapterControl); | ||
4586 | } | ||
4587 | writel(NVREG_MIISTAT_MASK, base + NvRegMIIStatus); | ||
4588 | |||
4589 | if (id->driver_data & DEV_HAS_MGMT_UNIT) { | ||
4590 | writel(0x1, base + 0x204); pci_push(base); | ||
4591 | msleep(500); | ||
4592 | /* management unit running on the mac? */ | ||
4593 | np->mac_in_use = readl(base + NvRegTransmitterControl) & NVREG_XMITCTL_MGMT_ST; | ||
4594 | if (np->mac_in_use) { | ||
4595 | u32 mgmt_sync; | ||
4596 | /* management unit setup the phy already? */ | ||
4597 | mgmt_sync = readl(base + NvRegTransmitterControl) & NVREG_XMITCTL_SYNC_MASK; | ||
4598 | if (mgmt_sync == NVREG_XMITCTL_SYNC_NOT_READY) { | ||
4599 | if (!nv_mgmt_acquire_sema(dev)) { | ||
4600 | for (i = 0; i < 5000; i++) { | ||
4601 | msleep(1); | ||
4602 | mgmt_sync = readl(base + NvRegTransmitterControl) & NVREG_XMITCTL_SYNC_MASK; | ||
4603 | if (mgmt_sync == NVREG_XMITCTL_SYNC_NOT_READY) | ||
4604 | continue; | ||
4605 | if (mgmt_sync == NVREG_XMITCTL_SYNC_PHY_INIT) | ||
4606 | phyinitialized = 1; | ||
4607 | break; | ||
4608 | } | ||
4609 | } else { | ||
4610 | /* we need to init the phy */ | ||
4611 | } | ||
4612 | } else if (mgmt_sync == NVREG_XMITCTL_SYNC_PHY_INIT) { | ||
4613 | /* phy is inited by SMU */ | ||
4614 | phyinitialized = 1; | ||
4615 | } else { | ||
4616 | /* we need to init the phy */ | ||
4617 | } | ||
4618 | } | ||
4619 | } | ||
4620 | |||
4517 | /* find a suitable phy */ | 4621 | /* find a suitable phy */ |
4518 | for (i = 1; i <= 32; i++) { | 4622 | for (i = 1; i <= 32; i++) { |
4519 | int id1, id2; | 4623 | int id1, id2; |
@@ -4545,8 +4649,14 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i | |||
4545 | goto out_error; | 4649 | goto out_error; |
4546 | } | 4650 | } |
4547 | 4651 | ||
4548 | /* reset it */ | 4652 | if (!phyinitialized) { |
4549 | phy_init(dev); | 4653 | /* reset it */ |
4654 | phy_init(dev); | ||
4655 | } | ||
4656 | |||
4657 | if (id->driver_data & DEV_HAS_MGMT_UNIT) { | ||
4658 | nv_mgmt_driver_loaded(dev, 1); | ||
4659 | } | ||
4550 | 4660 | ||
4551 | /* set default link speed settings */ | 4661 | /* set default link speed settings */ |
4552 | np->linkspeed = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; | 4662 | np->linkspeed = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; |
@@ -4565,6 +4675,10 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i | |||
4565 | return 0; | 4675 | return 0; |
4566 | 4676 | ||
4567 | out_error: | 4677 | out_error: |
4678 | if (phystate_orig) | ||
4679 | writel(phystate|NVREG_ADAPTCTL_RUNNING, base + NvRegAdapterControl); | ||
4680 | if (np->mac_in_use) | ||
4681 | nv_mgmt_driver_loaded(dev, 0); | ||
4568 | pci_set_drvdata(pci_dev, NULL); | 4682 | pci_set_drvdata(pci_dev, NULL); |
4569 | out_freering: | 4683 | out_freering: |
4570 | free_rings(dev); | 4684 | free_rings(dev); |
@@ -4594,6 +4708,9 @@ static void __devexit nv_remove(struct pci_dev *pci_dev) | |||
4594 | writel(np->orig_mac[0], base + NvRegMacAddrA); | 4708 | writel(np->orig_mac[0], base + NvRegMacAddrA); |
4595 | writel(np->orig_mac[1], base + NvRegMacAddrB); | 4709 | writel(np->orig_mac[1], base + NvRegMacAddrB); |
4596 | 4710 | ||
4711 | if (np->mac_in_use) | ||
4712 | nv_mgmt_driver_loaded(dev, 0); | ||
4713 | |||
4597 | /* free all structures */ | 4714 | /* free all structures */ |
4598 | free_rings(dev); | 4715 | free_rings(dev); |
4599 | iounmap(get_hwbase(dev)); | 4716 | iounmap(get_hwbase(dev)); |
@@ -4702,43 +4819,43 @@ static struct pci_device_id pci_tbl[] = { | |||
4702 | }, | 4819 | }, |
4703 | { /* MCP55 Ethernet Controller */ | 4820 | { /* MCP55 Ethernet Controller */ |
4704 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_14), | 4821 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_14), |
4705 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_VLAN|DEV_HAS_MSI|DEV_HAS_MSI_X|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED, | 4822 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_VLAN|DEV_HAS_MSI|DEV_HAS_MSI_X|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT, |
4706 | }, | 4823 | }, |
4707 | { /* MCP55 Ethernet Controller */ | 4824 | { /* MCP55 Ethernet Controller */ |
4708 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_15), | 4825 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_15), |
4709 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_VLAN|DEV_HAS_MSI|DEV_HAS_MSI_X|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED, | 4826 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_VLAN|DEV_HAS_MSI|DEV_HAS_MSI_X|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT, |
4710 | }, | 4827 | }, |
4711 | { /* MCP61 Ethernet Controller */ | 4828 | { /* MCP61 Ethernet Controller */ |
4712 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_16), | 4829 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_16), |
4713 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED, | 4830 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT, |
4714 | }, | 4831 | }, |
4715 | { /* MCP61 Ethernet Controller */ | 4832 | { /* MCP61 Ethernet Controller */ |
4716 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_17), | 4833 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_17), |
4717 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED, | 4834 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT, |
4718 | }, | 4835 | }, |
4719 | { /* MCP61 Ethernet Controller */ | 4836 | { /* MCP61 Ethernet Controller */ |
4720 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_18), | 4837 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_18), |
4721 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED, | 4838 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT, |
4722 | }, | 4839 | }, |
4723 | { /* MCP61 Ethernet Controller */ | 4840 | { /* MCP61 Ethernet Controller */ |
4724 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_19), | 4841 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_19), |
4725 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED, | 4842 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT, |
4726 | }, | 4843 | }, |
4727 | { /* MCP65 Ethernet Controller */ | 4844 | { /* MCP65 Ethernet Controller */ |
4728 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_20), | 4845 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_20), |
4729 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED, | 4846 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT, |
4730 | }, | 4847 | }, |
4731 | { /* MCP65 Ethernet Controller */ | 4848 | { /* MCP65 Ethernet Controller */ |
4732 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_21), | 4849 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_21), |
4733 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED, | 4850 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT, |
4734 | }, | 4851 | }, |
4735 | { /* MCP65 Ethernet Controller */ | 4852 | { /* MCP65 Ethernet Controller */ |
4736 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_22), | 4853 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_22), |
4737 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED, | 4854 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT, |
4738 | }, | 4855 | }, |
4739 | { /* MCP65 Ethernet Controller */ | 4856 | { /* MCP65 Ethernet Controller */ |
4740 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_23), | 4857 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_23), |
4741 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED, | 4858 | .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL|DEV_HAS_MSI|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT, |
4742 | }, | 4859 | }, |
4743 | {0,}, | 4860 | {0,}, |
4744 | }; | 4861 | }; |