aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/forcedeth.c
diff options
context:
space:
mode:
authorAyaz Abdulla <aabdulla@nvidia.com>2006-10-30 17:31:51 -0500
committerJeff Garzik <jeff@garzik.org>2006-12-02 00:12:01 -0500
commit7e680c22c0579f1db7b84a7b155755a2754f9557 (patch)
tree713d8b13aeae3f43932a571476c824e2a312fe68 /drivers/net/forcedeth.c
parentb2e68aa337f950e4a8c893a82b95b1755309bc56 (diff)
[PATCH] forcedeth: add mgmt unit support
This patch adds support for the mgmt unit in certain chipsets. The MAC and the mgmt unit share the PHY and therefore proper intialization procedures are needed for them to maintain coexistense. Signed-Off-By: Ayaz Abdulla <aabdulla@nvidia.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/net/forcedeth.c')
-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};