aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/forcedeth.c151
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
178enum { 180enum {
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 */
4046static 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 */
4080static 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
4033static int nv_open(struct net_device *dev) 4093static 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
4567out_error: 4677out_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);
4569out_freering: 4683out_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};