diff options
author | Manfred Spraul <manfred@colorfullife.com> | 2005-07-31 12:26:05 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-07-31 12:59:56 -0400 |
commit | dc8216c192795b62f30ca34299fb79e897438372 (patch) | |
tree | 383af26fbfd1ae517cbc7ad4626ca3c1ba751da1 /drivers/net/forcedeth.c | |
parent | d81c0983de80c956cf37835b0d35adb3ab4bb03a (diff) |
[PATCH] forcedeth: Improve ethtool support
This is a multi-part message in MIME format.
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
Diffstat (limited to 'drivers/net/forcedeth.c')
-rw-r--r-- | drivers/net/forcedeth.c | 171 |
1 files changed, 90 insertions, 81 deletions
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index 91f09e583cea..9c49c5ec89bf 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c | |||
@@ -85,7 +85,8 @@ | |||
85 | * 0.33: 16 May 2005: Support for MCP51 added. | 85 | * 0.33: 16 May 2005: Support for MCP51 added. |
86 | * 0.34: 18 Jun 2005: Add DEV_NEED_LINKTIMER to all nForce nics. | 86 | * 0.34: 18 Jun 2005: Add DEV_NEED_LINKTIMER to all nForce nics. |
87 | * 0.35: 26 Jun 2005: Support for MCP55 added. | 87 | * 0.35: 26 Jun 2005: Support for MCP55 added. |
88 | * 0.36: 28 Jul 2005: Add jumbo frame support. | 88 | * 0.36: 28 Jun 2005: Add jumbo frame support. |
89 | * 0.37: 10 Jul 2005: Additional ethtool support, cleanup of pci id list | ||
89 | * | 90 | * |
90 | * Known bugs: | 91 | * Known bugs: |
91 | * We suspect that on some hardware no TX done interrupts are generated. | 92 | * We suspect that on some hardware no TX done interrupts are generated. |
@@ -97,7 +98,7 @@ | |||
97 | * DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few | 98 | * DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few |
98 | * superfluous timer interrupts from the nic. | 99 | * superfluous timer interrupts from the nic. |
99 | */ | 100 | */ |
100 | #define FORCEDETH_VERSION "0.36" | 101 | #define FORCEDETH_VERSION "0.37" |
101 | #define DRV_NAME "forcedeth" | 102 | #define DRV_NAME "forcedeth" |
102 | 103 | ||
103 | #include <linux/module.h> | 104 | #include <linux/module.h> |
@@ -137,6 +138,7 @@ | |||
137 | #define DEV_IRQMASK_2 0x0004 /* use NVREG_IRQMASK_WANTED_2 for irq mask */ | 138 | #define DEV_IRQMASK_2 0x0004 /* use NVREG_IRQMASK_WANTED_2 for irq mask */ |
138 | #define DEV_NEED_TIMERIRQ 0x0008 /* set the timer irq flag in the irq mask */ | 139 | #define DEV_NEED_TIMERIRQ 0x0008 /* set the timer irq flag in the irq mask */ |
139 | #define DEV_NEED_LINKTIMER 0x0010 /* poll link settings. Relies on the timer irq */ | 140 | #define DEV_NEED_LINKTIMER 0x0010 /* poll link settings. Relies on the timer irq */ |
141 | #define DEV_HAS_LARGEDESC 0x0020 /* device supports jumbo frames and needs packet format 2 */ | ||
140 | 142 | ||
141 | enum { | 143 | enum { |
142 | NvRegIrqStatus = 0x000, | 144 | NvRegIrqStatus = 0x000, |
@@ -1846,6 +1848,50 @@ static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | |||
1846 | return 0; | 1848 | return 0; |
1847 | } | 1849 | } |
1848 | 1850 | ||
1851 | #define FORCEDETH_REGS_VER 1 | ||
1852 | #define FORCEDETH_REGS_SIZE 0x400 /* 256 32-bit registers */ | ||
1853 | |||
1854 | static int nv_get_regs_len(struct net_device *dev) | ||
1855 | { | ||
1856 | return FORCEDETH_REGS_SIZE; | ||
1857 | } | ||
1858 | |||
1859 | static void nv_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *buf) | ||
1860 | { | ||
1861 | struct fe_priv *np = get_nvpriv(dev); | ||
1862 | u8 __iomem *base = get_hwbase(dev); | ||
1863 | u32 *rbuf = buf; | ||
1864 | int i; | ||
1865 | |||
1866 | regs->version = FORCEDETH_REGS_VER; | ||
1867 | spin_lock_irq(&np->lock); | ||
1868 | for (i=0;i<FORCEDETH_REGS_SIZE/sizeof(u32);i++) | ||
1869 | rbuf[i] = readl(base + i*sizeof(u32)); | ||
1870 | spin_unlock_irq(&np->lock); | ||
1871 | } | ||
1872 | |||
1873 | static int nv_nway_reset(struct net_device *dev) | ||
1874 | { | ||
1875 | struct fe_priv *np = get_nvpriv(dev); | ||
1876 | int ret; | ||
1877 | |||
1878 | spin_lock_irq(&np->lock); | ||
1879 | if (np->autoneg) { | ||
1880 | int bmcr; | ||
1881 | |||
1882 | bmcr = mii_rw(dev, np->phyaddr, MII_BMCR, MII_READ); | ||
1883 | bmcr |= (BMCR_ANENABLE | BMCR_ANRESTART); | ||
1884 | mii_rw(dev, np->phyaddr, MII_BMCR, bmcr); | ||
1885 | |||
1886 | ret = 0; | ||
1887 | } else { | ||
1888 | ret = -EINVAL; | ||
1889 | } | ||
1890 | spin_unlock_irq(&np->lock); | ||
1891 | |||
1892 | return ret; | ||
1893 | } | ||
1894 | |||
1849 | static struct ethtool_ops ops = { | 1895 | static struct ethtool_ops ops = { |
1850 | .get_drvinfo = nv_get_drvinfo, | 1896 | .get_drvinfo = nv_get_drvinfo, |
1851 | .get_link = ethtool_op_get_link, | 1897 | .get_link = ethtool_op_get_link, |
@@ -1853,6 +1899,9 @@ static struct ethtool_ops ops = { | |||
1853 | .set_wol = nv_set_wol, | 1899 | .set_wol = nv_set_wol, |
1854 | .get_settings = nv_get_settings, | 1900 | .get_settings = nv_get_settings, |
1855 | .set_settings = nv_set_settings, | 1901 | .set_settings = nv_set_settings, |
1902 | .get_regs_len = nv_get_regs_len, | ||
1903 | .get_regs = nv_get_regs, | ||
1904 | .nway_reset = nv_nway_reset, | ||
1856 | }; | 1905 | }; |
1857 | 1906 | ||
1858 | static int nv_open(struct net_device *dev) | 1907 | static int nv_open(struct net_device *dev) |
@@ -2092,18 +2141,13 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i | |||
2092 | } | 2141 | } |
2093 | 2142 | ||
2094 | /* handle different descriptor versions */ | 2143 | /* handle different descriptor versions */ |
2095 | if (pci_dev->device == PCI_DEVICE_ID_NVIDIA_NVENET_1 || | 2144 | np->desc_ver = DESC_VER_1; |
2096 | pci_dev->device == PCI_DEVICE_ID_NVIDIA_NVENET_2 || | 2145 | np->pkt_limit = NV_PKTLIMIT_1; |
2097 | pci_dev->device == PCI_DEVICE_ID_NVIDIA_NVENET_3 || | 2146 | if (id->driver_data & DEV_HAS_LARGEDESC) { |
2098 | pci_dev->device == PCI_DEVICE_ID_NVIDIA_NVENET_12 || | ||
2099 | pci_dev->device == PCI_DEVICE_ID_NVIDIA_NVENET_13) { | ||
2100 | np->desc_ver = DESC_VER_1; | ||
2101 | np->pkt_limit = NV_PKTLIMIT_1; | ||
2102 | } else { | ||
2103 | np->desc_ver = DESC_VER_2; | 2147 | np->desc_ver = DESC_VER_2; |
2104 | np->pkt_limit = NV_PKTLIMIT_2; | 2148 | np->pkt_limit = NV_PKTLIMIT_2; |
2105 | } | 2149 | } |
2106 | 2150 | ||
2107 | err = -ENOMEM; | 2151 | err = -ENOMEM; |
2108 | np->base = ioremap(addr, NV_PCI_REGSZ); | 2152 | np->base = ioremap(addr, NV_PCI_REGSZ); |
2109 | if (!np->base) | 2153 | if (!np->base) |
@@ -2284,109 +2328,74 @@ static void __devexit nv_remove(struct pci_dev *pci_dev) | |||
2284 | 2328 | ||
2285 | static struct pci_device_id pci_tbl[] = { | 2329 | static struct pci_device_id pci_tbl[] = { |
2286 | { /* nForce Ethernet Controller */ | 2330 | { /* nForce Ethernet Controller */ |
2287 | .vendor = PCI_VENDOR_ID_NVIDIA, | 2331 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_1), |
2288 | .device = PCI_DEVICE_ID_NVIDIA_NVENET_1, | ||
2289 | .subvendor = PCI_ANY_ID, | ||
2290 | .subdevice = PCI_ANY_ID, | ||
2291 | .driver_data = DEV_IRQMASK_1|DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER, | 2332 | .driver_data = DEV_IRQMASK_1|DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER, |
2292 | }, | 2333 | }, |
2293 | { /* nForce2 Ethernet Controller */ | 2334 | { /* nForce2 Ethernet Controller */ |
2294 | .vendor = PCI_VENDOR_ID_NVIDIA, | 2335 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_2), |
2295 | .device = PCI_DEVICE_ID_NVIDIA_NVENET_2, | ||
2296 | .subvendor = PCI_ANY_ID, | ||
2297 | .subdevice = PCI_ANY_ID, | ||
2298 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER, | 2336 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER, |
2299 | }, | 2337 | }, |
2300 | { /* nForce3 Ethernet Controller */ | 2338 | { /* nForce3 Ethernet Controller */ |
2301 | .vendor = PCI_VENDOR_ID_NVIDIA, | 2339 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_3), |
2302 | .device = PCI_DEVICE_ID_NVIDIA_NVENET_3, | ||
2303 | .subvendor = PCI_ANY_ID, | ||
2304 | .subdevice = PCI_ANY_ID, | ||
2305 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER, | 2340 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER, |
2306 | }, | 2341 | }, |
2307 | { /* nForce3 Ethernet Controller */ | 2342 | { /* nForce3 Ethernet Controller */ |
2308 | .vendor = PCI_VENDOR_ID_NVIDIA, | 2343 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_4), |
2309 | .device = PCI_DEVICE_ID_NVIDIA_NVENET_4, | 2344 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ| |
2310 | .subvendor = PCI_ANY_ID, | 2345 | DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC, |
2311 | .subdevice = PCI_ANY_ID, | ||
2312 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER, | ||
2313 | }, | 2346 | }, |
2314 | { /* nForce3 Ethernet Controller */ | 2347 | { /* nForce3 Ethernet Controller */ |
2315 | .vendor = PCI_VENDOR_ID_NVIDIA, | 2348 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_5), |
2316 | .device = PCI_DEVICE_ID_NVIDIA_NVENET_5, | 2349 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ| |
2317 | .subvendor = PCI_ANY_ID, | 2350 | DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC, |
2318 | .subdevice = PCI_ANY_ID, | ||
2319 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER, | ||
2320 | }, | 2351 | }, |
2321 | { /* nForce3 Ethernet Controller */ | 2352 | { /* nForce3 Ethernet Controller */ |
2322 | .vendor = PCI_VENDOR_ID_NVIDIA, | 2353 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_6), |
2323 | .device = PCI_DEVICE_ID_NVIDIA_NVENET_6, | 2354 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ| |
2324 | .subvendor = PCI_ANY_ID, | 2355 | DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC, |
2325 | .subdevice = PCI_ANY_ID, | ||
2326 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER, | ||
2327 | }, | 2356 | }, |
2328 | { /* nForce3 Ethernet Controller */ | 2357 | { /* nForce3 Ethernet Controller */ |
2329 | .vendor = PCI_VENDOR_ID_NVIDIA, | 2358 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_7), |
2330 | .device = PCI_DEVICE_ID_NVIDIA_NVENET_7, | 2359 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ| |
2331 | .subvendor = PCI_ANY_ID, | 2360 | DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC, |
2332 | .subdevice = PCI_ANY_ID, | ||
2333 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER, | ||
2334 | }, | 2361 | }, |
2335 | { /* CK804 Ethernet Controller */ | 2362 | { /* CK804 Ethernet Controller */ |
2336 | .vendor = PCI_VENDOR_ID_NVIDIA, | 2363 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_8), |
2337 | .device = PCI_DEVICE_ID_NVIDIA_NVENET_8, | 2364 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ| |
2338 | .subvendor = PCI_ANY_ID, | 2365 | DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC, |
2339 | .subdevice = PCI_ANY_ID, | ||
2340 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER, | ||
2341 | }, | 2366 | }, |
2342 | { /* CK804 Ethernet Controller */ | 2367 | { /* CK804 Ethernet Controller */ |
2343 | .vendor = PCI_VENDOR_ID_NVIDIA, | 2368 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_9), |
2344 | .device = PCI_DEVICE_ID_NVIDIA_NVENET_9, | 2369 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ| |
2345 | .subvendor = PCI_ANY_ID, | 2370 | DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC, |
2346 | .subdevice = PCI_ANY_ID, | ||
2347 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER, | ||
2348 | }, | 2371 | }, |
2349 | { /* MCP04 Ethernet Controller */ | 2372 | { /* MCP04 Ethernet Controller */ |
2350 | .vendor = PCI_VENDOR_ID_NVIDIA, | 2373 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_10), |
2351 | .device = PCI_DEVICE_ID_NVIDIA_NVENET_10, | 2374 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ| |
2352 | .subvendor = PCI_ANY_ID, | 2375 | DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC, |
2353 | .subdevice = PCI_ANY_ID, | ||
2354 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER, | ||
2355 | }, | 2376 | }, |
2356 | { /* MCP04 Ethernet Controller */ | 2377 | { /* MCP04 Ethernet Controller */ |
2357 | .vendor = PCI_VENDOR_ID_NVIDIA, | 2378 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_11), |
2358 | .device = PCI_DEVICE_ID_NVIDIA_NVENET_11, | 2379 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ| |
2359 | .subvendor = PCI_ANY_ID, | 2380 | DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC, |
2360 | .subdevice = PCI_ANY_ID, | ||
2361 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER, | ||
2362 | }, | 2381 | }, |
2363 | { /* MCP51 Ethernet Controller */ | 2382 | { /* MCP51 Ethernet Controller */ |
2364 | .vendor = PCI_VENDOR_ID_NVIDIA, | 2383 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_12), |
2365 | .device = PCI_DEVICE_ID_NVIDIA_NVENET_12, | ||
2366 | .subvendor = PCI_ANY_ID, | ||
2367 | .subdevice = PCI_ANY_ID, | ||
2368 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER, | 2384 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER, |
2369 | }, | 2385 | }, |
2370 | { /* MCP51 Ethernet Controller */ | 2386 | { /* MCP51 Ethernet Controller */ |
2371 | .vendor = PCI_VENDOR_ID_NVIDIA, | 2387 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_13), |
2372 | .device = PCI_DEVICE_ID_NVIDIA_NVENET_13, | ||
2373 | .subvendor = PCI_ANY_ID, | ||
2374 | .subdevice = PCI_ANY_ID, | ||
2375 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER, | 2388 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER, |
2376 | }, | 2389 | }, |
2377 | { /* MCP55 Ethernet Controller */ | 2390 | { /* MCP55 Ethernet Controller */ |
2378 | .vendor = PCI_VENDOR_ID_NVIDIA, | 2391 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_14), |
2379 | .device = PCI_DEVICE_ID_NVIDIA_NVENET_14, | 2392 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ| |
2380 | .subvendor = PCI_ANY_ID, | 2393 | DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC, |
2381 | .subdevice = PCI_ANY_ID, | ||
2382 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER, | ||
2383 | }, | 2394 | }, |
2384 | { /* MCP55 Ethernet Controller */ | 2395 | { /* MCP55 Ethernet Controller */ |
2385 | .vendor = PCI_VENDOR_ID_NVIDIA, | 2396 | PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_15), |
2386 | .device = PCI_DEVICE_ID_NVIDIA_NVENET_15, | 2397 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ| |
2387 | .subvendor = PCI_ANY_ID, | 2398 | DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC, |
2388 | .subdevice = PCI_ANY_ID, | ||
2389 | .driver_data = DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER, | ||
2390 | }, | 2399 | }, |
2391 | {0,}, | 2400 | {0,}, |
2392 | }; | 2401 | }; |