blob: 4930f9dbc493d50d2b46f7829d62541bc8b1e646 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/* via-rhine.c: A Linux Ethernet device driver for VIA Rhine family chips. */
2/*
3 Written 1998-2001 by Donald Becker.
4
5 Current Maintainer: Roger Luethi <rl@hellgate.ch>
6
7 This software may be used and distributed according to the terms of
8 the GNU General Public License (GPL), incorporated herein by reference.
9 Drivers based on or derived from this code fall under the GPL and must
10 retain the authorship, copyright and license notice. This file is not
11 a complete program and may only be used when the entire operating
12 system is licensed under the GPL.
13
14 This driver is designed for the VIA VT86C100A Rhine-I.
15 It also works with the Rhine-II (6102) and Rhine-III (6105/6105L/6105LOM
16 and management NIC 6105M).
17
18 The author may be reached as becker@scyld.com, or C/O
19 Scyld Computing Corporation
20 410 Severn Ave., Suite 210
21 Annapolis MD 21403
22
23
24 This driver contains some changes from the original Donald Becker
25 version. He may or may not be interested in bug reports on this
26 code. You can find his versions at:
27 http://www.scyld.com/network/via-rhine.html
Jeff Garzik03a8c662006-06-27 07:57:22 -040028 [link no longer provides useful info -jgarzik]
Linus Torvalds1da177e2005-04-16 15:20:36 -070029
30*/
31
32#define DRV_NAME "via-rhine"
Roger Luethie84df482007-03-06 19:57:37 +010033#define DRV_VERSION "1.4.3"
34#define DRV_RELDATE "2007-03-06"
Linus Torvalds1da177e2005-04-16 15:20:36 -070035
36
37/* A few user-configurable values.
38 These may be modified when a driver module is loaded. */
39
40static int debug = 1; /* 1 normal messages, 0 quiet .. 7 verbose. */
41static int max_interrupt_work = 20;
42
43/* Set the copy breakpoint for the copy-only-tiny-frames scheme.
44 Setting to > 1518 effectively disables this feature. */
Joe Perches8e95a202009-12-03 07:58:21 +000045#if defined(__alpha__) || defined(__arm__) || defined(__hppa__) || \
46 defined(CONFIG_SPARC) || defined(__ia64__) || \
47 defined(__sh__) || defined(__mips__)
Dustin Marquessb47157f2007-08-10 14:05:15 -070048static int rx_copybreak = 1518;
49#else
Linus Torvalds1da177e2005-04-16 15:20:36 -070050static int rx_copybreak;
Dustin Marquessb47157f2007-08-10 14:05:15 -070051#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070052
Roger Luethib933b4d2006-08-14 23:00:21 -070053/* Work-around for broken BIOSes: they are unable to get the chip back out of
54 power state D3 so PXE booting fails. bootparam(7): via-rhine.avoid_D3=1 */
55static int avoid_D3;
56
Linus Torvalds1da177e2005-04-16 15:20:36 -070057/*
58 * In case you are looking for 'options[]' or 'full_duplex[]', they
59 * are gone. Use ethtool(8) instead.
60 */
61
62/* Maximum number of multicast addresses to filter (vs. rx-all-multicast).
63 The Rhine has a 64 element 8390-like hash table. */
64static const int multicast_filter_limit = 32;
65
66
67/* Operational parameters that are set at compile time. */
68
69/* Keep the ring sizes a power of two for compile efficiency.
70 The compiler will convert <unsigned>'%'<2^N> into a bit mask.
71 Making the Tx ring too large decreases the effectiveness of channel
72 bonding and packet priority.
73 There are no ill effects from too-large receive rings. */
74#define TX_RING_SIZE 16
75#define TX_QUEUE_LEN 10 /* Limit ring entries actually used. */
Roger Luethi633949a2006-08-14 23:00:17 -070076#define RX_RING_SIZE 64
Linus Torvalds1da177e2005-04-16 15:20:36 -070077
78/* Operational parameters that usually are not changed. */
79
80/* Time in jiffies before concluding the transmitter is hung. */
81#define TX_TIMEOUT (2*HZ)
82
83#define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/
84
85#include <linux/module.h>
86#include <linux/moduleparam.h>
87#include <linux/kernel.h>
88#include <linux/string.h>
89#include <linux/timer.h>
90#include <linux/errno.h>
91#include <linux/ioport.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070092#include <linux/interrupt.h>
93#include <linux/pci.h>
Domen Puncer1e7f0bd2005-06-26 18:22:14 -040094#include <linux/dma-mapping.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070095#include <linux/netdevice.h>
96#include <linux/etherdevice.h>
97#include <linux/skbuff.h>
98#include <linux/init.h>
99#include <linux/delay.h>
100#include <linux/mii.h>
101#include <linux/ethtool.h>
102#include <linux/crc32.h>
103#include <linux/bitops.h>
Jarek Poplawskic0d7a022009-12-23 21:54:29 -0800104#include <linux/workqueue.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700105#include <asm/processor.h> /* Processor type for cache alignment. */
106#include <asm/io.h>
107#include <asm/irq.h>
108#include <asm/uaccess.h>
Roger Luethie84df482007-03-06 19:57:37 +0100109#include <linux/dmi.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700110
111/* These identify the driver base version and may not be removed. */
Stephen Hemmingerc8de1fc2009-02-26 10:19:31 +0000112static const char version[] __devinitconst =
113 KERN_INFO DRV_NAME ".c:v1.10-LK" DRV_VERSION " " DRV_RELDATE
114 " Written by Donald Becker\n";
Linus Torvalds1da177e2005-04-16 15:20:36 -0700115
116/* This driver was written to use PCI memory space. Some early versions
117 of the Rhine may only work correctly with I/O space accesses. */
118#ifdef CONFIG_VIA_RHINE_MMIO
119#define USE_MMIO
120#else
121#endif
122
123MODULE_AUTHOR("Donald Becker <becker@scyld.com>");
124MODULE_DESCRIPTION("VIA Rhine PCI Fast Ethernet driver");
125MODULE_LICENSE("GPL");
126
127module_param(max_interrupt_work, int, 0);
128module_param(debug, int, 0);
129module_param(rx_copybreak, int, 0);
Roger Luethib933b4d2006-08-14 23:00:21 -0700130module_param(avoid_D3, bool, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700131MODULE_PARM_DESC(max_interrupt_work, "VIA Rhine maximum events handled per interrupt");
132MODULE_PARM_DESC(debug, "VIA Rhine debug level (0-7)");
133MODULE_PARM_DESC(rx_copybreak, "VIA Rhine copy breakpoint for copy-only-tiny-frames");
Roger Luethib933b4d2006-08-14 23:00:21 -0700134MODULE_PARM_DESC(avoid_D3, "Avoid power state D3 (work-around for broken BIOSes)");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700135
136/*
137 Theory of Operation
138
139I. Board Compatibility
140
141This driver is designed for the VIA 86c100A Rhine-II PCI Fast Ethernet
142controller.
143
144II. Board-specific settings
145
146Boards with this chip are functional only in a bus-master PCI slot.
147
148Many operational settings are loaded from the EEPROM to the Config word at
149offset 0x78. For most of these settings, this driver assumes that they are
150correct.
151If this driver is compiled to use PCI memory space operations the EEPROM
152must be configured to enable memory ops.
153
154III. Driver operation
155
156IIIa. Ring buffers
157
158This driver uses two statically allocated fixed-size descriptor lists
159formed into rings by a branch from the final descriptor to the beginning of
160the list. The ring sizes are set at compile time by RX/TX_RING_SIZE.
161
162IIIb/c. Transmit/Receive Structure
163
164This driver attempts to use a zero-copy receive and transmit scheme.
165
166Alas, all data buffers are required to start on a 32 bit boundary, so
167the driver must often copy transmit packets into bounce buffers.
168
169The driver allocates full frame size skbuffs for the Rx ring buffers at
170open() time and passes the skb->data field to the chip as receive data
171buffers. When an incoming frame is less than RX_COPYBREAK bytes long,
172a fresh skbuff is allocated and the frame is copied to the new skbuff.
173When the incoming frame is larger, the skbuff is passed directly up the
174protocol stack. Buffers consumed this way are replaced by newly allocated
175skbuffs in the last phase of rhine_rx().
176
177The RX_COPYBREAK value is chosen to trade-off the memory wasted by
178using a full-sized skbuff for small frames vs. the copying costs of larger
179frames. New boards are typically used in generously configured machines
180and the underfilled buffers have negligible impact compared to the benefit of
181a single allocation size, so the default value of zero results in never
182copying packets. When copying is done, the cost is usually mitigated by using
183a combined copy/checksum routine. Copying also preloads the cache, which is
184most useful with small frames.
185
186Since the VIA chips are only able to transfer data to buffers on 32 bit
187boundaries, the IP header at offset 14 in an ethernet frame isn't
188longword aligned for further processing. Copying these unaligned buffers
189has the beneficial effect of 16-byte aligning the IP header.
190
191IIId. Synchronization
192
193The driver runs as two independent, single-threaded flows of control. One
194is the send-packet routine, which enforces single-threaded use by the
Wang Chenb74ca3a2008-12-08 01:14:16 -0800195netdev_priv(dev)->lock spinlock. The other thread is the interrupt handler,
196which is single threaded by the hardware and interrupt handling software.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700197
198The send packet thread has partial control over the Tx ring. It locks the
Wang Chenb74ca3a2008-12-08 01:14:16 -0800199netdev_priv(dev)->lock whenever it's queuing a Tx packet. If the next slot in
200the ring is not available it stops the transmit queue by
201calling netif_stop_queue.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700202
203The interrupt handler has exclusive control over the Rx ring and records stats
204from the Tx ring. After reaping the stats, it marks the Tx queue entry as
205empty by incrementing the dirty_tx mark. If at least half of the entries in
206the Rx ring are available the transmit queue is woken up if it was stopped.
207
208IV. Notes
209
210IVb. References
211
212Preliminary VT86C100A manual from http://www.via.com.tw/
213http://www.scyld.com/expert/100mbps.html
214http://www.scyld.com/expert/NWay.html
215ftp://ftp.via.com.tw/public/lan/Products/NIC/VT86C100A/Datasheet/VT86C100A03.pdf
216ftp://ftp.via.com.tw/public/lan/Products/NIC/VT6102/Datasheet/VT6102_021.PDF
217
218
219IVc. Errata
220
221The VT86C100A manual is not reliable information.
222The 3043 chip does not handle unaligned transmit or receive buffers, resulting
223in significant performance degradation for bounce buffer copies on transmit
224and unaligned IP headers on receive.
225The chip does not pad to minimum transmit length.
226
227*/
228
229
230/* This table drives the PCI probe routines. It's mostly boilerplate in all
231 of the drivers, and will likely be provided by some future kernel.
232 Note the matching code -- the first table entry matchs all 56** cards but
233 second only the 1234 card.
234*/
235
236enum rhine_revs {
237 VT86C100A = 0x00,
238 VTunknown0 = 0x20,
239 VT6102 = 0x40,
240 VT8231 = 0x50, /* Integrated MAC */
241 VT8233 = 0x60, /* Integrated MAC */
242 VT8235 = 0x74, /* Integrated MAC */
243 VT8237 = 0x78, /* Integrated MAC */
244 VTunknown1 = 0x7C,
245 VT6105 = 0x80,
246 VT6105_B0 = 0x83,
247 VT6105L = 0x8A,
248 VT6107 = 0x8C,
249 VTunknown2 = 0x8E,
250 VT6105M = 0x90, /* Management adapter */
251};
252
253enum rhine_quirks {
254 rqWOL = 0x0001, /* Wake-On-LAN support */
255 rqForceReset = 0x0002,
256 rq6patterns = 0x0040, /* 6 instead of 4 patterns for WOL */
257 rqStatusWBRace = 0x0080, /* Tx Status Writeback Error possible */
258 rqRhineI = 0x0100, /* See comment below */
259};
260/*
261 * rqRhineI: VT86C100A (aka Rhine-I) uses different bits to enable
262 * MMIO as well as for the collision counter and the Tx FIFO underflow
263 * indicator. In addition, Tx and Rx buffers need to 4 byte aligned.
264 */
265
266/* Beware of PCI posted writes */
267#define IOSYNC do { ioread8(ioaddr + StationAddr); } while (0)
268
Alexey Dobriyana3aa1882010-01-07 11:58:11 +0000269static DEFINE_PCI_DEVICE_TABLE(rhine_pci_tbl) = {
Jeff Garzik46009c82006-06-27 09:12:38 -0400270 { 0x1106, 0x3043, PCI_ANY_ID, PCI_ANY_ID, }, /* VT86C100A */
271 { 0x1106, 0x3065, PCI_ANY_ID, PCI_ANY_ID, }, /* VT6102 */
272 { 0x1106, 0x3106, PCI_ANY_ID, PCI_ANY_ID, }, /* 6105{,L,LOM} */
273 { 0x1106, 0x3053, PCI_ANY_ID, PCI_ANY_ID, }, /* VT6105M */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700274 { } /* terminate list */
275};
276MODULE_DEVICE_TABLE(pci, rhine_pci_tbl);
277
278
279/* Offsets to the device registers. */
280enum register_offsets {
281 StationAddr=0x00, RxConfig=0x06, TxConfig=0x07, ChipCmd=0x08,
282 ChipCmd1=0x09,
283 IntrStatus=0x0C, IntrEnable=0x0E,
284 MulticastFilter0=0x10, MulticastFilter1=0x14,
285 RxRingPtr=0x18, TxRingPtr=0x1C, GFIFOTest=0x54,
286 MIIPhyAddr=0x6C, MIIStatus=0x6D, PCIBusConfig=0x6E,
287 MIICmd=0x70, MIIRegAddr=0x71, MIIData=0x72, MACRegEEcsr=0x74,
288 ConfigA=0x78, ConfigB=0x79, ConfigC=0x7A, ConfigD=0x7B,
289 RxMissed=0x7C, RxCRCErrs=0x7E, MiscCmd=0x81,
290 StickyHW=0x83, IntrStatus2=0x84,
291 WOLcrSet=0xA0, PwcfgSet=0xA1, WOLcgSet=0xA3, WOLcrClr=0xA4,
292 WOLcrClr1=0xA6, WOLcgClr=0xA7,
293 PwrcsrSet=0xA8, PwrcsrSet1=0xA9, PwrcsrClr=0xAC, PwrcsrClr1=0xAD,
294};
295
296/* Bits in ConfigD */
297enum backoff_bits {
298 BackOptional=0x01, BackModify=0x02,
299 BackCaptureEffect=0x04, BackRandom=0x08
300};
301
302#ifdef USE_MMIO
303/* Registers we check that mmio and reg are the same. */
304static const int mmio_verify_registers[] = {
305 RxConfig, TxConfig, IntrEnable, ConfigA, ConfigB, ConfigC, ConfigD,
306 0
307};
308#endif
309
310/* Bits in the interrupt status/mask registers. */
311enum intr_status_bits {
312 IntrRxDone=0x0001, IntrRxErr=0x0004, IntrRxEmpty=0x0020,
313 IntrTxDone=0x0002, IntrTxError=0x0008, IntrTxUnderrun=0x0210,
314 IntrPCIErr=0x0040,
315 IntrStatsMax=0x0080, IntrRxEarly=0x0100,
316 IntrRxOverflow=0x0400, IntrRxDropped=0x0800, IntrRxNoBuf=0x1000,
317 IntrTxAborted=0x2000, IntrLinkChange=0x4000,
318 IntrRxWakeUp=0x8000,
319 IntrNormalSummary=0x0003, IntrAbnormalSummary=0xC260,
320 IntrTxDescRace=0x080000, /* mapped from IntrStatus2 */
321 IntrTxErrSummary=0x082218,
322};
323
324/* Bits in WOLcrSet/WOLcrClr and PwrcsrSet/PwrcsrClr */
325enum wol_bits {
326 WOLucast = 0x10,
327 WOLmagic = 0x20,
328 WOLbmcast = 0x30,
329 WOLlnkon = 0x40,
330 WOLlnkoff = 0x80,
331};
332
333/* The Rx and Tx buffer descriptors. */
334struct rx_desc {
Al Viro53c03f52007-08-23 02:33:30 -0400335 __le32 rx_status;
336 __le32 desc_length; /* Chain flag, Buffer/frame length */
337 __le32 addr;
338 __le32 next_desc;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700339};
340struct tx_desc {
Al Viro53c03f52007-08-23 02:33:30 -0400341 __le32 tx_status;
342 __le32 desc_length; /* Chain flag, Tx Config, Frame length */
343 __le32 addr;
344 __le32 next_desc;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700345};
346
347/* Initial value for tx_desc.desc_length, Buffer size goes to bits 0-10 */
348#define TXDESC 0x00e08000
349
350enum rx_status_bits {
351 RxOK=0x8000, RxWholePkt=0x0300, RxErr=0x008F
352};
353
354/* Bits in *_desc.*_status */
355enum desc_status_bits {
356 DescOwn=0x80000000
357};
358
359/* Bits in ChipCmd. */
360enum chip_cmd_bits {
361 CmdInit=0x01, CmdStart=0x02, CmdStop=0x04, CmdRxOn=0x08,
362 CmdTxOn=0x10, Cmd1TxDemand=0x20, CmdRxDemand=0x40,
363 Cmd1EarlyRx=0x01, Cmd1EarlyTx=0x02, Cmd1FDuplex=0x04,
364 Cmd1NoTxPoll=0x08, Cmd1Reset=0x80,
365};
366
367struct rhine_private {
368 /* Descriptor rings */
369 struct rx_desc *rx_ring;
370 struct tx_desc *tx_ring;
371 dma_addr_t rx_ring_dma;
372 dma_addr_t tx_ring_dma;
373
374 /* The addresses of receive-in-place skbuffs. */
375 struct sk_buff *rx_skbuff[RX_RING_SIZE];
376 dma_addr_t rx_skbuff_dma[RX_RING_SIZE];
377
378 /* The saved address of a sent-in-place packet/buffer, for later free(). */
379 struct sk_buff *tx_skbuff[TX_RING_SIZE];
380 dma_addr_t tx_skbuff_dma[TX_RING_SIZE];
381
Roger Luethi4be5de22006-04-04 20:49:16 +0200382 /* Tx bounce buffers (Rhine-I only) */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700383 unsigned char *tx_buf[TX_RING_SIZE];
384 unsigned char *tx_bufs;
385 dma_addr_t tx_bufs_dma;
386
387 struct pci_dev *pdev;
388 long pioaddr;
Stephen Hemmingerbea33482007-10-03 16:41:36 -0700389 struct net_device *dev;
390 struct napi_struct napi;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700391 spinlock_t lock;
Jarek Poplawskic0d7a022009-12-23 21:54:29 -0800392 struct work_struct reset_task;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700393
394 /* Frequently used values: keep some adjacent for cache effect. */
395 u32 quirks;
396 struct rx_desc *rx_head_desc;
397 unsigned int cur_rx, dirty_rx; /* Producer/consumer ring indices */
398 unsigned int cur_tx, dirty_tx;
399 unsigned int rx_buf_sz; /* Based on MTU+slack. */
400 u8 wolopts;
401
402 u8 tx_thresh, rx_thresh;
403
404 struct mii_if_info mii_if;
405 void __iomem *base;
406};
407
408static int mdio_read(struct net_device *dev, int phy_id, int location);
409static void mdio_write(struct net_device *dev, int phy_id, int location, int value);
410static int rhine_open(struct net_device *dev);
Jarek Poplawskic0d7a022009-12-23 21:54:29 -0800411static void rhine_reset_task(struct work_struct *work);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700412static void rhine_tx_timeout(struct net_device *dev);
Stephen Hemminger613573252009-08-31 19:50:58 +0000413static netdev_tx_t rhine_start_tx(struct sk_buff *skb,
414 struct net_device *dev);
David Howells7d12e782006-10-05 14:55:46 +0100415static irqreturn_t rhine_interrupt(int irq, void *dev_instance);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416static void rhine_tx(struct net_device *dev);
Roger Luethi633949a2006-08-14 23:00:17 -0700417static int rhine_rx(struct net_device *dev, int limit);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700418static void rhine_error(struct net_device *dev, int intr_status);
419static void rhine_set_rx_mode(struct net_device *dev);
420static struct net_device_stats *rhine_get_stats(struct net_device *dev);
421static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
Jeff Garzik7282d492006-09-13 14:30:00 -0400422static const struct ethtool_ops netdev_ethtool_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700423static int rhine_close(struct net_device *dev);
Greg Kroah-Hartmand18c3db2005-06-23 17:35:56 -0700424static void rhine_shutdown (struct pci_dev *pdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700425
426#define RHINE_WAIT_FOR(condition) do { \
427 int i=1024; \
428 while (!(condition) && --i) \
429 ; \
430 if (debug > 1 && i < 512) \
431 printk(KERN_INFO "%s: %4d cycles used @ %s:%d\n", \
432 DRV_NAME, 1024-i, __func__, __LINE__); \
433} while(0)
434
435static inline u32 get_intr_status(struct net_device *dev)
436{
437 struct rhine_private *rp = netdev_priv(dev);
438 void __iomem *ioaddr = rp->base;
439 u32 intr_status;
440
441 intr_status = ioread16(ioaddr + IntrStatus);
442 /* On Rhine-II, Bit 3 indicates Tx descriptor write-back race. */
443 if (rp->quirks & rqStatusWBRace)
444 intr_status |= ioread8(ioaddr + IntrStatus2) << 16;
445 return intr_status;
446}
447
448/*
449 * Get power related registers into sane state.
450 * Notify user about past WOL event.
451 */
452static void rhine_power_init(struct net_device *dev)
453{
454 struct rhine_private *rp = netdev_priv(dev);
455 void __iomem *ioaddr = rp->base;
456 u16 wolstat;
457
458 if (rp->quirks & rqWOL) {
459 /* Make sure chip is in power state D0 */
460 iowrite8(ioread8(ioaddr + StickyHW) & 0xFC, ioaddr + StickyHW);
461
462 /* Disable "force PME-enable" */
463 iowrite8(0x80, ioaddr + WOLcgClr);
464
465 /* Clear power-event config bits (WOL) */
466 iowrite8(0xFF, ioaddr + WOLcrClr);
467 /* More recent cards can manage two additional patterns */
468 if (rp->quirks & rq6patterns)
469 iowrite8(0x03, ioaddr + WOLcrClr1);
470
471 /* Save power-event status bits */
472 wolstat = ioread8(ioaddr + PwrcsrSet);
473 if (rp->quirks & rq6patterns)
474 wolstat |= (ioread8(ioaddr + PwrcsrSet1) & 0x03) << 8;
475
476 /* Clear power-event status bits */
477 iowrite8(0xFF, ioaddr + PwrcsrClr);
478 if (rp->quirks & rq6patterns)
479 iowrite8(0x03, ioaddr + PwrcsrClr1);
480
481 if (wolstat) {
482 char *reason;
483 switch (wolstat) {
484 case WOLmagic:
485 reason = "Magic packet";
486 break;
487 case WOLlnkon:
488 reason = "Link went up";
489 break;
490 case WOLlnkoff:
491 reason = "Link went down";
492 break;
493 case WOLucast:
494 reason = "Unicast packet";
495 break;
496 case WOLbmcast:
497 reason = "Multicast/broadcast packet";
498 break;
499 default:
500 reason = "Unknown";
501 }
502 printk(KERN_INFO "%s: Woke system up. Reason: %s.\n",
503 DRV_NAME, reason);
504 }
505 }
506}
507
508static void rhine_chip_reset(struct net_device *dev)
509{
510 struct rhine_private *rp = netdev_priv(dev);
511 void __iomem *ioaddr = rp->base;
512
513 iowrite8(Cmd1Reset, ioaddr + ChipCmd1);
514 IOSYNC;
515
516 if (ioread8(ioaddr + ChipCmd1) & Cmd1Reset) {
517 printk(KERN_INFO "%s: Reset not complete yet. "
518 "Trying harder.\n", DRV_NAME);
519
520 /* Force reset */
521 if (rp->quirks & rqForceReset)
522 iowrite8(0x40, ioaddr + MiscCmd);
523
524 /* Reset can take somewhat longer (rare) */
525 RHINE_WAIT_FOR(!(ioread8(ioaddr + ChipCmd1) & Cmd1Reset));
526 }
527
528 if (debug > 1)
529 printk(KERN_INFO "%s: Reset %s.\n", dev->name,
530 (ioread8(ioaddr + ChipCmd1) & Cmd1Reset) ?
531 "failed" : "succeeded");
532}
533
534#ifdef USE_MMIO
535static void enable_mmio(long pioaddr, u32 quirks)
536{
537 int n;
538 if (quirks & rqRhineI) {
539 /* More recent docs say that this bit is reserved ... */
540 n = inb(pioaddr + ConfigA) | 0x20;
541 outb(n, pioaddr + ConfigA);
542 } else {
543 n = inb(pioaddr + ConfigD) | 0x80;
544 outb(n, pioaddr + ConfigD);
545 }
546}
547#endif
548
549/*
550 * Loads bytes 0x00-0x05, 0x6E-0x6F, 0x78-0x7B from EEPROM
551 * (plus 0x6C for Rhine-I/II)
552 */
553static void __devinit rhine_reload_eeprom(long pioaddr, struct net_device *dev)
554{
555 struct rhine_private *rp = netdev_priv(dev);
556 void __iomem *ioaddr = rp->base;
557
558 outb(0x20, pioaddr + MACRegEEcsr);
559 RHINE_WAIT_FOR(!(inb(pioaddr + MACRegEEcsr) & 0x20));
560
561#ifdef USE_MMIO
562 /*
563 * Reloading from EEPROM overwrites ConfigA-D, so we must re-enable
564 * MMIO. If reloading EEPROM was done first this could be avoided, but
565 * it is not known if that still works with the "win98-reboot" problem.
566 */
567 enable_mmio(pioaddr, rp->quirks);
568#endif
569
570 /* Turn off EEPROM-controlled wake-up (magic packet) */
571 if (rp->quirks & rqWOL)
572 iowrite8(ioread8(ioaddr + ConfigA) & 0xFC, ioaddr + ConfigA);
573
574}
575
576#ifdef CONFIG_NET_POLL_CONTROLLER
577static void rhine_poll(struct net_device *dev)
578{
579 disable_irq(dev->irq);
David Howells7d12e782006-10-05 14:55:46 +0100580 rhine_interrupt(dev->irq, (void *)dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700581 enable_irq(dev->irq);
582}
583#endif
584
Stephen Hemmingerbea33482007-10-03 16:41:36 -0700585static int rhine_napipoll(struct napi_struct *napi, int budget)
Roger Luethi633949a2006-08-14 23:00:17 -0700586{
Stephen Hemmingerbea33482007-10-03 16:41:36 -0700587 struct rhine_private *rp = container_of(napi, struct rhine_private, napi);
588 struct net_device *dev = rp->dev;
Roger Luethi633949a2006-08-14 23:00:17 -0700589 void __iomem *ioaddr = rp->base;
Stephen Hemmingerbea33482007-10-03 16:41:36 -0700590 int work_done;
Roger Luethi633949a2006-08-14 23:00:17 -0700591
Stephen Hemmingerbea33482007-10-03 16:41:36 -0700592 work_done = rhine_rx(dev, budget);
Roger Luethi633949a2006-08-14 23:00:17 -0700593
Stephen Hemmingerbea33482007-10-03 16:41:36 -0700594 if (work_done < budget) {
Ben Hutchings288379f2009-01-19 16:43:59 -0800595 napi_complete(napi);
Roger Luethi633949a2006-08-14 23:00:17 -0700596
597 iowrite16(IntrRxDone | IntrRxErr | IntrRxEmpty| IntrRxOverflow |
598 IntrRxDropped | IntrRxNoBuf | IntrTxAborted |
599 IntrTxDone | IntrTxError | IntrTxUnderrun |
600 IntrPCIErr | IntrStatsMax | IntrLinkChange,
601 ioaddr + IntrEnable);
Roger Luethi633949a2006-08-14 23:00:17 -0700602 }
Stephen Hemmingerbea33482007-10-03 16:41:36 -0700603 return work_done;
Roger Luethi633949a2006-08-14 23:00:17 -0700604}
Roger Luethi633949a2006-08-14 23:00:17 -0700605
Adrian Bunkde4e7c82008-01-30 22:02:05 +0200606static void __devinit rhine_hw_init(struct net_device *dev, long pioaddr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700607{
608 struct rhine_private *rp = netdev_priv(dev);
609
610 /* Reset the chip to erase previous misconfiguration. */
611 rhine_chip_reset(dev);
612
613 /* Rhine-I needs extra time to recuperate before EEPROM reload */
614 if (rp->quirks & rqRhineI)
615 msleep(5);
616
617 /* Reload EEPROM controlled bytes cleared by soft reset */
618 rhine_reload_eeprom(pioaddr, dev);
619}
620
Stephen Hemminger5d1d07d2008-11-21 17:30:11 -0800621static const struct net_device_ops rhine_netdev_ops = {
622 .ndo_open = rhine_open,
623 .ndo_stop = rhine_close,
624 .ndo_start_xmit = rhine_start_tx,
625 .ndo_get_stats = rhine_get_stats,
626 .ndo_set_multicast_list = rhine_set_rx_mode,
Ben Hutchings635ecaa2009-07-09 17:59:01 +0000627 .ndo_change_mtu = eth_change_mtu,
Stephen Hemminger5d1d07d2008-11-21 17:30:11 -0800628 .ndo_validate_addr = eth_validate_addr,
Stephen Hemmingerfe96aaa2009-01-09 11:13:14 +0000629 .ndo_set_mac_address = eth_mac_addr,
Stephen Hemminger5d1d07d2008-11-21 17:30:11 -0800630 .ndo_do_ioctl = netdev_ioctl,
631 .ndo_tx_timeout = rhine_tx_timeout,
632#ifdef CONFIG_NET_POLL_CONTROLLER
633 .ndo_poll_controller = rhine_poll,
634#endif
635};
636
Linus Torvalds1da177e2005-04-16 15:20:36 -0700637static int __devinit rhine_init_one(struct pci_dev *pdev,
638 const struct pci_device_id *ent)
639{
640 struct net_device *dev;
641 struct rhine_private *rp;
642 int i, rc;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700643 u32 quirks;
644 long pioaddr;
645 long memaddr;
646 void __iomem *ioaddr;
647 int io_size, phy_id;
648 const char *name;
649#ifdef USE_MMIO
650 int bar = 1;
651#else
652 int bar = 0;
653#endif
654
655/* when built into the kernel, we only print version if device is found */
656#ifndef MODULE
657 static int printed_version;
658 if (!printed_version++)
659 printk(version);
660#endif
661
Linus Torvalds1da177e2005-04-16 15:20:36 -0700662 io_size = 256;
663 phy_id = 0;
664 quirks = 0;
665 name = "Rhine";
Auke Kok44c10132007-06-08 15:46:36 -0700666 if (pdev->revision < VTunknown0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700667 quirks = rqRhineI;
668 io_size = 128;
669 }
Auke Kok44c10132007-06-08 15:46:36 -0700670 else if (pdev->revision >= VT6102) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700671 quirks = rqWOL | rqForceReset;
Auke Kok44c10132007-06-08 15:46:36 -0700672 if (pdev->revision < VT6105) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700673 name = "Rhine II";
674 quirks |= rqStatusWBRace; /* Rhine-II exclusive */
675 }
676 else {
677 phy_id = 1; /* Integrated PHY, phy_id fixed to 1 */
Auke Kok44c10132007-06-08 15:46:36 -0700678 if (pdev->revision >= VT6105_B0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700679 quirks |= rq6patterns;
Auke Kok44c10132007-06-08 15:46:36 -0700680 if (pdev->revision < VT6105M)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700681 name = "Rhine III";
682 else
683 name = "Rhine III (Management Adapter)";
684 }
685 }
686
687 rc = pci_enable_device(pdev);
688 if (rc)
689 goto err_out;
690
691 /* this should always be supported */
Yang Hongyang284901a2009-04-06 19:01:15 -0700692 rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700693 if (rc) {
694 printk(KERN_ERR "32-bit PCI DMA addresses not supported by "
695 "the card!?\n");
696 goto err_out;
697 }
698
699 /* sanity check */
700 if ((pci_resource_len(pdev, 0) < io_size) ||
701 (pci_resource_len(pdev, 1) < io_size)) {
702 rc = -EIO;
703 printk(KERN_ERR "Insufficient PCI resources, aborting\n");
704 goto err_out;
705 }
706
707 pioaddr = pci_resource_start(pdev, 0);
708 memaddr = pci_resource_start(pdev, 1);
709
710 pci_set_master(pdev);
711
712 dev = alloc_etherdev(sizeof(struct rhine_private));
713 if (!dev) {
714 rc = -ENOMEM;
715 printk(KERN_ERR "alloc_etherdev failed\n");
716 goto err_out;
717 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700718 SET_NETDEV_DEV(dev, &pdev->dev);
719
720 rp = netdev_priv(dev);
Stephen Hemmingerbea33482007-10-03 16:41:36 -0700721 rp->dev = dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700722 rp->quirks = quirks;
723 rp->pioaddr = pioaddr;
724 rp->pdev = pdev;
725
726 rc = pci_request_regions(pdev, DRV_NAME);
727 if (rc)
728 goto err_out_free_netdev;
729
730 ioaddr = pci_iomap(pdev, bar, io_size);
731 if (!ioaddr) {
732 rc = -EIO;
733 printk(KERN_ERR "ioremap failed for device %s, region 0x%X "
734 "@ 0x%lX\n", pci_name(pdev), io_size, memaddr);
735 goto err_out_free_res;
736 }
737
738#ifdef USE_MMIO
739 enable_mmio(pioaddr, quirks);
740
741 /* Check that selected MMIO registers match the PIO ones */
742 i = 0;
743 while (mmio_verify_registers[i]) {
744 int reg = mmio_verify_registers[i++];
745 unsigned char a = inb(pioaddr+reg);
746 unsigned char b = readb(ioaddr+reg);
747 if (a != b) {
748 rc = -EIO;
749 printk(KERN_ERR "MMIO do not match PIO [%02x] "
750 "(%02x != %02x)\n", reg, a, b);
751 goto err_out_unmap;
752 }
753 }
754#endif /* USE_MMIO */
755
756 dev->base_addr = (unsigned long)ioaddr;
757 rp->base = ioaddr;
758
759 /* Get chip registers into a sane state */
760 rhine_power_init(dev);
761 rhine_hw_init(dev, pioaddr);
762
763 for (i = 0; i < 6; i++)
764 dev->dev_addr[i] = ioread8(ioaddr + StationAddr + i);
John W. Linvilleb81e8e12005-09-12 10:48:58 -0400765 memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700766
John W. Linvilleb81e8e12005-09-12 10:48:58 -0400767 if (!is_valid_ether_addr(dev->perm_addr)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700768 rc = -EIO;
769 printk(KERN_ERR "Invalid MAC address\n");
770 goto err_out_unmap;
771 }
772
773 /* For Rhine-I/II, phy_id is loaded from EEPROM */
774 if (!phy_id)
775 phy_id = ioread8(ioaddr + 0x6C);
776
777 dev->irq = pdev->irq;
778
779 spin_lock_init(&rp->lock);
Jarek Poplawskic0d7a022009-12-23 21:54:29 -0800780 INIT_WORK(&rp->reset_task, rhine_reset_task);
781
Linus Torvalds1da177e2005-04-16 15:20:36 -0700782 rp->mii_if.dev = dev;
783 rp->mii_if.mdio_read = mdio_read;
784 rp->mii_if.mdio_write = mdio_write;
785 rp->mii_if.phy_id_mask = 0x1f;
786 rp->mii_if.reg_num_mask = 0x1f;
787
788 /* The chip-specific entries in the device structure. */
Stephen Hemminger5d1d07d2008-11-21 17:30:11 -0800789 dev->netdev_ops = &rhine_netdev_ops;
790 dev->ethtool_ops = &netdev_ethtool_ops,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700791 dev->watchdog_timeo = TX_TIMEOUT;
Stephen Hemminger5d1d07d2008-11-21 17:30:11 -0800792
Stephen Hemmingerbea33482007-10-03 16:41:36 -0700793 netif_napi_add(dev, &rp->napi, rhine_napipoll, 64);
Francois Romieu32b0f532008-07-11 00:30:14 +0200794
Linus Torvalds1da177e2005-04-16 15:20:36 -0700795 if (rp->quirks & rqRhineI)
796 dev->features |= NETIF_F_SG|NETIF_F_HW_CSUM;
797
798 /* dev->name not defined before register_netdev()! */
799 rc = register_netdev(dev);
800 if (rc)
801 goto err_out_unmap;
802
Johannes Berge1749612008-10-27 15:59:26 -0700803 printk(KERN_INFO "%s: VIA %s at 0x%lx, %pM, IRQ %d.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700804 dev->name, name,
805#ifdef USE_MMIO
Joe Perches0795af52007-10-03 17:59:30 -0700806 memaddr,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700807#else
Joe Perches0795af52007-10-03 17:59:30 -0700808 (long)ioaddr,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700809#endif
Johannes Berge1749612008-10-27 15:59:26 -0700810 dev->dev_addr, pdev->irq);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700811
812 pci_set_drvdata(pdev, dev);
813
814 {
815 u16 mii_cmd;
816 int mii_status = mdio_read(dev, phy_id, 1);
817 mii_cmd = mdio_read(dev, phy_id, MII_BMCR) & ~BMCR_ISOLATE;
818 mdio_write(dev, phy_id, MII_BMCR, mii_cmd);
819 if (mii_status != 0xffff && mii_status != 0x0000) {
820 rp->mii_if.advertising = mdio_read(dev, phy_id, 4);
821 printk(KERN_INFO "%s: MII PHY found at address "
822 "%d, status 0x%4.4x advertising %4.4x "
823 "Link %4.4x.\n", dev->name, phy_id,
824 mii_status, rp->mii_if.advertising,
825 mdio_read(dev, phy_id, 5));
826
827 /* set IFF_RUNNING */
828 if (mii_status & BMSR_LSTATUS)
829 netif_carrier_on(dev);
830 else
831 netif_carrier_off(dev);
832
833 }
834 }
835 rp->mii_if.phy_id = phy_id;
Roger Luethib933b4d2006-08-14 23:00:21 -0700836 if (debug > 1 && avoid_D3)
837 printk(KERN_INFO "%s: No D3 power state at shutdown.\n",
838 dev->name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700839
840 return 0;
841
842err_out_unmap:
843 pci_iounmap(pdev, ioaddr);
844err_out_free_res:
845 pci_release_regions(pdev);
846err_out_free_netdev:
847 free_netdev(dev);
848err_out:
849 return rc;
850}
851
852static int alloc_ring(struct net_device* dev)
853{
854 struct rhine_private *rp = netdev_priv(dev);
855 void *ring;
856 dma_addr_t ring_dma;
857
858 ring = pci_alloc_consistent(rp->pdev,
859 RX_RING_SIZE * sizeof(struct rx_desc) +
860 TX_RING_SIZE * sizeof(struct tx_desc),
861 &ring_dma);
862 if (!ring) {
863 printk(KERN_ERR "Could not allocate DMA memory.\n");
864 return -ENOMEM;
865 }
866 if (rp->quirks & rqRhineI) {
867 rp->tx_bufs = pci_alloc_consistent(rp->pdev,
868 PKT_BUF_SZ * TX_RING_SIZE,
869 &rp->tx_bufs_dma);
870 if (rp->tx_bufs == NULL) {
871 pci_free_consistent(rp->pdev,
872 RX_RING_SIZE * sizeof(struct rx_desc) +
873 TX_RING_SIZE * sizeof(struct tx_desc),
874 ring, ring_dma);
875 return -ENOMEM;
876 }
877 }
878
879 rp->rx_ring = ring;
880 rp->tx_ring = ring + RX_RING_SIZE * sizeof(struct rx_desc);
881 rp->rx_ring_dma = ring_dma;
882 rp->tx_ring_dma = ring_dma + RX_RING_SIZE * sizeof(struct rx_desc);
883
884 return 0;
885}
886
887static void free_ring(struct net_device* dev)
888{
889 struct rhine_private *rp = netdev_priv(dev);
890
891 pci_free_consistent(rp->pdev,
892 RX_RING_SIZE * sizeof(struct rx_desc) +
893 TX_RING_SIZE * sizeof(struct tx_desc),
894 rp->rx_ring, rp->rx_ring_dma);
895 rp->tx_ring = NULL;
896
897 if (rp->tx_bufs)
898 pci_free_consistent(rp->pdev, PKT_BUF_SZ * TX_RING_SIZE,
899 rp->tx_bufs, rp->tx_bufs_dma);
900
901 rp->tx_bufs = NULL;
902
903}
904
905static void alloc_rbufs(struct net_device *dev)
906{
907 struct rhine_private *rp = netdev_priv(dev);
908 dma_addr_t next;
909 int i;
910
911 rp->dirty_rx = rp->cur_rx = 0;
912
913 rp->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32);
914 rp->rx_head_desc = &rp->rx_ring[0];
915 next = rp->rx_ring_dma;
916
917 /* Init the ring entries */
918 for (i = 0; i < RX_RING_SIZE; i++) {
919 rp->rx_ring[i].rx_status = 0;
920 rp->rx_ring[i].desc_length = cpu_to_le32(rp->rx_buf_sz);
921 next += sizeof(struct rx_desc);
922 rp->rx_ring[i].next_desc = cpu_to_le32(next);
923 rp->rx_skbuff[i] = NULL;
924 }
925 /* Mark the last entry as wrapping the ring. */
926 rp->rx_ring[i-1].next_desc = cpu_to_le32(rp->rx_ring_dma);
927
928 /* Fill in the Rx buffers. Handle allocation failure gracefully. */
929 for (i = 0; i < RX_RING_SIZE; i++) {
Kevin Lob26b5552008-08-27 11:35:09 +0800930 struct sk_buff *skb = netdev_alloc_skb(dev, rp->rx_buf_sz);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700931 rp->rx_skbuff[i] = skb;
932 if (skb == NULL)
933 break;
934 skb->dev = dev; /* Mark as being used by this device. */
935
936 rp->rx_skbuff_dma[i] =
David S. Miller689be432005-06-28 15:25:31 -0700937 pci_map_single(rp->pdev, skb->data, rp->rx_buf_sz,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700938 PCI_DMA_FROMDEVICE);
939
940 rp->rx_ring[i].addr = cpu_to_le32(rp->rx_skbuff_dma[i]);
941 rp->rx_ring[i].rx_status = cpu_to_le32(DescOwn);
942 }
943 rp->dirty_rx = (unsigned int)(i - RX_RING_SIZE);
944}
945
946static void free_rbufs(struct net_device* dev)
947{
948 struct rhine_private *rp = netdev_priv(dev);
949 int i;
950
951 /* Free all the skbuffs in the Rx queue. */
952 for (i = 0; i < RX_RING_SIZE; i++) {
953 rp->rx_ring[i].rx_status = 0;
954 rp->rx_ring[i].addr = cpu_to_le32(0xBADF00D0); /* An invalid address. */
955 if (rp->rx_skbuff[i]) {
956 pci_unmap_single(rp->pdev,
957 rp->rx_skbuff_dma[i],
958 rp->rx_buf_sz, PCI_DMA_FROMDEVICE);
959 dev_kfree_skb(rp->rx_skbuff[i]);
960 }
961 rp->rx_skbuff[i] = NULL;
962 }
963}
964
965static void alloc_tbufs(struct net_device* dev)
966{
967 struct rhine_private *rp = netdev_priv(dev);
968 dma_addr_t next;
969 int i;
970
971 rp->dirty_tx = rp->cur_tx = 0;
972 next = rp->tx_ring_dma;
973 for (i = 0; i < TX_RING_SIZE; i++) {
974 rp->tx_skbuff[i] = NULL;
975 rp->tx_ring[i].tx_status = 0;
976 rp->tx_ring[i].desc_length = cpu_to_le32(TXDESC);
977 next += sizeof(struct tx_desc);
978 rp->tx_ring[i].next_desc = cpu_to_le32(next);
Roger Luethi4be5de22006-04-04 20:49:16 +0200979 if (rp->quirks & rqRhineI)
980 rp->tx_buf[i] = &rp->tx_bufs[i * PKT_BUF_SZ];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700981 }
982 rp->tx_ring[i-1].next_desc = cpu_to_le32(rp->tx_ring_dma);
983
984}
985
986static void free_tbufs(struct net_device* dev)
987{
988 struct rhine_private *rp = netdev_priv(dev);
989 int i;
990
991 for (i = 0; i < TX_RING_SIZE; i++) {
992 rp->tx_ring[i].tx_status = 0;
993 rp->tx_ring[i].desc_length = cpu_to_le32(TXDESC);
994 rp->tx_ring[i].addr = cpu_to_le32(0xBADF00D0); /* An invalid address. */
995 if (rp->tx_skbuff[i]) {
996 if (rp->tx_skbuff_dma[i]) {
997 pci_unmap_single(rp->pdev,
998 rp->tx_skbuff_dma[i],
999 rp->tx_skbuff[i]->len,
1000 PCI_DMA_TODEVICE);
1001 }
1002 dev_kfree_skb(rp->tx_skbuff[i]);
1003 }
1004 rp->tx_skbuff[i] = NULL;
1005 rp->tx_buf[i] = NULL;
1006 }
1007}
1008
1009static void rhine_check_media(struct net_device *dev, unsigned int init_media)
1010{
1011 struct rhine_private *rp = netdev_priv(dev);
1012 void __iomem *ioaddr = rp->base;
1013
1014 mii_check_media(&rp->mii_if, debug, init_media);
1015
1016 if (rp->mii_if.full_duplex)
1017 iowrite8(ioread8(ioaddr + ChipCmd1) | Cmd1FDuplex,
1018 ioaddr + ChipCmd1);
1019 else
1020 iowrite8(ioread8(ioaddr + ChipCmd1) & ~Cmd1FDuplex,
1021 ioaddr + ChipCmd1);
Roger Luethi00b428c2006-03-28 20:53:56 +02001022 if (debug > 1)
1023 printk(KERN_INFO "%s: force_media %d, carrier %d\n", dev->name,
1024 rp->mii_if.force_media, netif_carrier_ok(dev));
1025}
1026
1027/* Called after status of force_media possibly changed */
Adrian Bunk0761be42006-04-10 23:22:21 -07001028static void rhine_set_carrier(struct mii_if_info *mii)
Roger Luethi00b428c2006-03-28 20:53:56 +02001029{
1030 if (mii->force_media) {
1031 /* autoneg is off: Link is always assumed to be up */
1032 if (!netif_carrier_ok(mii->dev))
1033 netif_carrier_on(mii->dev);
1034 }
1035 else /* Let MMI library update carrier status */
1036 rhine_check_media(mii->dev, 0);
1037 if (debug > 1)
1038 printk(KERN_INFO "%s: force_media %d, carrier %d\n",
1039 mii->dev->name, mii->force_media,
1040 netif_carrier_ok(mii->dev));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001041}
1042
1043static void init_registers(struct net_device *dev)
1044{
1045 struct rhine_private *rp = netdev_priv(dev);
1046 void __iomem *ioaddr = rp->base;
1047 int i;
1048
1049 for (i = 0; i < 6; i++)
1050 iowrite8(dev->dev_addr[i], ioaddr + StationAddr + i);
1051
1052 /* Initialize other registers. */
1053 iowrite16(0x0006, ioaddr + PCIBusConfig); /* Tune configuration??? */
1054 /* Configure initial FIFO thresholds. */
1055 iowrite8(0x20, ioaddr + TxConfig);
1056 rp->tx_thresh = 0x20;
1057 rp->rx_thresh = 0x60; /* Written in rhine_set_rx_mode(). */
1058
1059 iowrite32(rp->rx_ring_dma, ioaddr + RxRingPtr);
1060 iowrite32(rp->tx_ring_dma, ioaddr + TxRingPtr);
1061
1062 rhine_set_rx_mode(dev);
1063
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001064 napi_enable(&rp->napi);
Stephen Hemmingerab197662006-08-14 23:00:18 -07001065
Linus Torvalds1da177e2005-04-16 15:20:36 -07001066 /* Enable interrupts by setting the interrupt mask. */
1067 iowrite16(IntrRxDone | IntrRxErr | IntrRxEmpty| IntrRxOverflow |
1068 IntrRxDropped | IntrRxNoBuf | IntrTxAborted |
1069 IntrTxDone | IntrTxError | IntrTxUnderrun |
1070 IntrPCIErr | IntrStatsMax | IntrLinkChange,
1071 ioaddr + IntrEnable);
1072
1073 iowrite16(CmdStart | CmdTxOn | CmdRxOn | (Cmd1NoTxPoll << 8),
1074 ioaddr + ChipCmd);
1075 rhine_check_media(dev, 1);
1076}
1077
1078/* Enable MII link status auto-polling (required for IntrLinkChange) */
1079static void rhine_enable_linkmon(void __iomem *ioaddr)
1080{
1081 iowrite8(0, ioaddr + MIICmd);
1082 iowrite8(MII_BMSR, ioaddr + MIIRegAddr);
1083 iowrite8(0x80, ioaddr + MIICmd);
1084
1085 RHINE_WAIT_FOR((ioread8(ioaddr + MIIRegAddr) & 0x20));
1086
1087 iowrite8(MII_BMSR | 0x40, ioaddr + MIIRegAddr);
1088}
1089
1090/* Disable MII link status auto-polling (required for MDIO access) */
1091static void rhine_disable_linkmon(void __iomem *ioaddr, u32 quirks)
1092{
1093 iowrite8(0, ioaddr + MIICmd);
1094
1095 if (quirks & rqRhineI) {
1096 iowrite8(0x01, ioaddr + MIIRegAddr); // MII_BMSR
1097
John W. Linville38bb6b22006-05-19 10:51:21 -04001098 /* Can be called from ISR. Evil. */
1099 mdelay(1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001100
1101 /* 0x80 must be set immediately before turning it off */
1102 iowrite8(0x80, ioaddr + MIICmd);
1103
1104 RHINE_WAIT_FOR(ioread8(ioaddr + MIIRegAddr) & 0x20);
1105
1106 /* Heh. Now clear 0x80 again. */
1107 iowrite8(0, ioaddr + MIICmd);
1108 }
1109 else
1110 RHINE_WAIT_FOR(ioread8(ioaddr + MIIRegAddr) & 0x80);
1111}
1112
1113/* Read and write over the MII Management Data I/O (MDIO) interface. */
1114
1115static int mdio_read(struct net_device *dev, int phy_id, int regnum)
1116{
1117 struct rhine_private *rp = netdev_priv(dev);
1118 void __iomem *ioaddr = rp->base;
1119 int result;
1120
1121 rhine_disable_linkmon(ioaddr, rp->quirks);
1122
1123 /* rhine_disable_linkmon already cleared MIICmd */
1124 iowrite8(phy_id, ioaddr + MIIPhyAddr);
1125 iowrite8(regnum, ioaddr + MIIRegAddr);
1126 iowrite8(0x40, ioaddr + MIICmd); /* Trigger read */
1127 RHINE_WAIT_FOR(!(ioread8(ioaddr + MIICmd) & 0x40));
1128 result = ioread16(ioaddr + MIIData);
1129
1130 rhine_enable_linkmon(ioaddr);
1131 return result;
1132}
1133
1134static void mdio_write(struct net_device *dev, int phy_id, int regnum, int value)
1135{
1136 struct rhine_private *rp = netdev_priv(dev);
1137 void __iomem *ioaddr = rp->base;
1138
1139 rhine_disable_linkmon(ioaddr, rp->quirks);
1140
1141 /* rhine_disable_linkmon already cleared MIICmd */
1142 iowrite8(phy_id, ioaddr + MIIPhyAddr);
1143 iowrite8(regnum, ioaddr + MIIRegAddr);
1144 iowrite16(value, ioaddr + MIIData);
1145 iowrite8(0x20, ioaddr + MIICmd); /* Trigger write */
1146 RHINE_WAIT_FOR(!(ioread8(ioaddr + MIICmd) & 0x20));
1147
1148 rhine_enable_linkmon(ioaddr);
1149}
1150
1151static int rhine_open(struct net_device *dev)
1152{
1153 struct rhine_private *rp = netdev_priv(dev);
1154 void __iomem *ioaddr = rp->base;
1155 int rc;
1156
Julia Lawall76781382009-11-18 08:23:53 +00001157 rc = request_irq(rp->pdev->irq, rhine_interrupt, IRQF_SHARED, dev->name,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001158 dev);
1159 if (rc)
1160 return rc;
1161
1162 if (debug > 1)
1163 printk(KERN_DEBUG "%s: rhine_open() irq %d.\n",
1164 dev->name, rp->pdev->irq);
1165
1166 rc = alloc_ring(dev);
1167 if (rc) {
1168 free_irq(rp->pdev->irq, dev);
1169 return rc;
1170 }
1171 alloc_rbufs(dev);
1172 alloc_tbufs(dev);
1173 rhine_chip_reset(dev);
1174 init_registers(dev);
1175 if (debug > 2)
1176 printk(KERN_DEBUG "%s: Done rhine_open(), status %4.4x "
1177 "MII status: %4.4x.\n",
1178 dev->name, ioread16(ioaddr + ChipCmd),
1179 mdio_read(dev, rp->mii_if.phy_id, MII_BMSR));
1180
1181 netif_start_queue(dev);
1182
1183 return 0;
1184}
1185
Jarek Poplawskic0d7a022009-12-23 21:54:29 -08001186static void rhine_reset_task(struct work_struct *work)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001187{
Jarek Poplawskic0d7a022009-12-23 21:54:29 -08001188 struct rhine_private *rp = container_of(work, struct rhine_private,
1189 reset_task);
1190 struct net_device *dev = rp->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001191
1192 /* protect against concurrent rx interrupts */
1193 disable_irq(rp->pdev->irq);
1194
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001195 napi_disable(&rp->napi);
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001196
Jarek Poplawskic0d7a022009-12-23 21:54:29 -08001197 spin_lock_bh(&rp->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001198
1199 /* clear all descriptors */
1200 free_tbufs(dev);
1201 free_rbufs(dev);
1202 alloc_tbufs(dev);
1203 alloc_rbufs(dev);
1204
1205 /* Reinitialize the hardware. */
1206 rhine_chip_reset(dev);
1207 init_registers(dev);
1208
Jarek Poplawskic0d7a022009-12-23 21:54:29 -08001209 spin_unlock_bh(&rp->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001210 enable_irq(rp->pdev->irq);
1211
Eric Dumazet1ae5dc32010-05-10 05:01:31 -07001212 dev->trans_start = jiffies; /* prevent tx timeout */
Eric Dumazet553e2332009-05-27 10:34:50 +00001213 dev->stats.tx_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001214 netif_wake_queue(dev);
1215}
1216
Jarek Poplawskic0d7a022009-12-23 21:54:29 -08001217static void rhine_tx_timeout(struct net_device *dev)
1218{
1219 struct rhine_private *rp = netdev_priv(dev);
1220 void __iomem *ioaddr = rp->base;
1221
1222 printk(KERN_WARNING "%s: Transmit timed out, status %4.4x, PHY status "
1223 "%4.4x, resetting...\n",
1224 dev->name, ioread16(ioaddr + IntrStatus),
1225 mdio_read(dev, rp->mii_if.phy_id, MII_BMSR));
1226
1227 schedule_work(&rp->reset_task);
1228}
1229
Stephen Hemminger613573252009-08-31 19:50:58 +00001230static netdev_tx_t rhine_start_tx(struct sk_buff *skb,
1231 struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001232{
1233 struct rhine_private *rp = netdev_priv(dev);
1234 void __iomem *ioaddr = rp->base;
1235 unsigned entry;
Dongdong Deng22580f82009-08-13 19:12:31 +00001236 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001237
1238 /* Caution: the write order is important here, set the field
1239 with the "ownership" bits last. */
1240
1241 /* Calculate the next Tx descriptor entry. */
1242 entry = rp->cur_tx % TX_RING_SIZE;
1243
Herbert Xu5b057c62006-06-23 02:06:41 -07001244 if (skb_padto(skb, ETH_ZLEN))
Patrick McHardy6ed10652009-06-23 06:03:08 +00001245 return NETDEV_TX_OK;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001246
1247 rp->tx_skbuff[entry] = skb;
1248
1249 if ((rp->quirks & rqRhineI) &&
Patrick McHardy84fa7932006-08-29 16:44:56 -07001250 (((unsigned long)skb->data & 3) || skb_shinfo(skb)->nr_frags != 0 || skb->ip_summed == CHECKSUM_PARTIAL)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001251 /* Must use alignment buffer. */
1252 if (skb->len > PKT_BUF_SZ) {
1253 /* packet too long, drop it */
1254 dev_kfree_skb(skb);
1255 rp->tx_skbuff[entry] = NULL;
Eric Dumazet553e2332009-05-27 10:34:50 +00001256 dev->stats.tx_dropped++;
Patrick McHardy6ed10652009-06-23 06:03:08 +00001257 return NETDEV_TX_OK;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001258 }
Craig Brind3e0d1672006-04-27 02:30:46 -07001259
1260 /* Padding is not copied and so must be redone. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001261 skb_copy_and_csum_dev(skb, rp->tx_buf[entry]);
Craig Brind3e0d1672006-04-27 02:30:46 -07001262 if (skb->len < ETH_ZLEN)
1263 memset(rp->tx_buf[entry] + skb->len, 0,
1264 ETH_ZLEN - skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001265 rp->tx_skbuff_dma[entry] = 0;
1266 rp->tx_ring[entry].addr = cpu_to_le32(rp->tx_bufs_dma +
1267 (rp->tx_buf[entry] -
1268 rp->tx_bufs));
1269 } else {
1270 rp->tx_skbuff_dma[entry] =
1271 pci_map_single(rp->pdev, skb->data, skb->len,
1272 PCI_DMA_TODEVICE);
1273 rp->tx_ring[entry].addr = cpu_to_le32(rp->tx_skbuff_dma[entry]);
1274 }
1275
1276 rp->tx_ring[entry].desc_length =
1277 cpu_to_le32(TXDESC | (skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN));
1278
1279 /* lock eth irq */
Dongdong Deng22580f82009-08-13 19:12:31 +00001280 spin_lock_irqsave(&rp->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001281 wmb();
1282 rp->tx_ring[entry].tx_status = cpu_to_le32(DescOwn);
1283 wmb();
1284
1285 rp->cur_tx++;
1286
1287 /* Non-x86 Todo: explicitly flush cache lines here. */
1288
1289 /* Wake the potentially-idle transmit channel */
1290 iowrite8(ioread8(ioaddr + ChipCmd1) | Cmd1TxDemand,
1291 ioaddr + ChipCmd1);
1292 IOSYNC;
1293
1294 if (rp->cur_tx == rp->dirty_tx + TX_QUEUE_LEN)
1295 netif_stop_queue(dev);
1296
Dongdong Deng22580f82009-08-13 19:12:31 +00001297 spin_unlock_irqrestore(&rp->lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001298
1299 if (debug > 4) {
1300 printk(KERN_DEBUG "%s: Transmit frame #%d queued in slot %d.\n",
1301 dev->name, rp->cur_tx-1, entry);
1302 }
Patrick McHardy6ed10652009-06-23 06:03:08 +00001303 return NETDEV_TX_OK;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001304}
1305
1306/* The interrupt handler does all of the Rx thread work and cleans up
1307 after the Tx thread. */
David Howells7d12e782006-10-05 14:55:46 +01001308static irqreturn_t rhine_interrupt(int irq, void *dev_instance)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001309{
1310 struct net_device *dev = dev_instance;
1311 struct rhine_private *rp = netdev_priv(dev);
1312 void __iomem *ioaddr = rp->base;
1313 u32 intr_status;
1314 int boguscnt = max_interrupt_work;
1315 int handled = 0;
1316
1317 while ((intr_status = get_intr_status(dev))) {
1318 handled = 1;
1319
1320 /* Acknowledge all of the current interrupt sources ASAP. */
1321 if (intr_status & IntrTxDescRace)
1322 iowrite8(0x08, ioaddr + IntrStatus2);
1323 iowrite16(intr_status & 0xffff, ioaddr + IntrStatus);
1324 IOSYNC;
1325
1326 if (debug > 4)
1327 printk(KERN_DEBUG "%s: Interrupt, status %8.8x.\n",
1328 dev->name, intr_status);
1329
1330 if (intr_status & (IntrRxDone | IntrRxErr | IntrRxDropped |
Roger Luethi633949a2006-08-14 23:00:17 -07001331 IntrRxWakeUp | IntrRxEmpty | IntrRxNoBuf)) {
Roger Luethi633949a2006-08-14 23:00:17 -07001332 iowrite16(IntrTxAborted |
1333 IntrTxDone | IntrTxError | IntrTxUnderrun |
1334 IntrPCIErr | IntrStatsMax | IntrLinkChange,
1335 ioaddr + IntrEnable);
1336
Ben Hutchings288379f2009-01-19 16:43:59 -08001337 napi_schedule(&rp->napi);
Roger Luethi633949a2006-08-14 23:00:17 -07001338 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001339
1340 if (intr_status & (IntrTxErrSummary | IntrTxDone)) {
1341 if (intr_status & IntrTxErrSummary) {
1342 /* Avoid scavenging before Tx engine turned off */
1343 RHINE_WAIT_FOR(!(ioread8(ioaddr+ChipCmd) & CmdTxOn));
1344 if (debug > 2 &&
1345 ioread8(ioaddr+ChipCmd) & CmdTxOn)
1346 printk(KERN_WARNING "%s: "
Joe Perches24500222007-11-19 17:48:28 -08001347 "rhine_interrupt() Tx engine "
Linus Torvalds1da177e2005-04-16 15:20:36 -07001348 "still on.\n", dev->name);
1349 }
1350 rhine_tx(dev);
1351 }
1352
1353 /* Abnormal error summary/uncommon events handlers. */
1354 if (intr_status & (IntrPCIErr | IntrLinkChange |
1355 IntrStatsMax | IntrTxError | IntrTxAborted |
1356 IntrTxUnderrun | IntrTxDescRace))
1357 rhine_error(dev, intr_status);
1358
1359 if (--boguscnt < 0) {
1360 printk(KERN_WARNING "%s: Too much work at interrupt, "
1361 "status=%#8.8x.\n",
1362 dev->name, intr_status);
1363 break;
1364 }
1365 }
1366
1367 if (debug > 3)
1368 printk(KERN_DEBUG "%s: exiting interrupt, status=%8.8x.\n",
1369 dev->name, ioread16(ioaddr + IntrStatus));
1370 return IRQ_RETVAL(handled);
1371}
1372
1373/* This routine is logically part of the interrupt handler, but isolated
1374 for clarity. */
1375static void rhine_tx(struct net_device *dev)
1376{
1377 struct rhine_private *rp = netdev_priv(dev);
1378 int txstatus = 0, entry = rp->dirty_tx % TX_RING_SIZE;
1379
1380 spin_lock(&rp->lock);
1381
1382 /* find and cleanup dirty tx descriptors */
1383 while (rp->dirty_tx != rp->cur_tx) {
1384 txstatus = le32_to_cpu(rp->tx_ring[entry].tx_status);
1385 if (debug > 6)
Denis Vlasenkoed4030d2005-06-17 08:23:17 +03001386 printk(KERN_DEBUG "Tx scavenge %d status %8.8x.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001387 entry, txstatus);
1388 if (txstatus & DescOwn)
1389 break;
1390 if (txstatus & 0x8000) {
1391 if (debug > 1)
1392 printk(KERN_DEBUG "%s: Transmit error, "
1393 "Tx status %8.8x.\n",
1394 dev->name, txstatus);
Eric Dumazet553e2332009-05-27 10:34:50 +00001395 dev->stats.tx_errors++;
1396 if (txstatus & 0x0400)
1397 dev->stats.tx_carrier_errors++;
1398 if (txstatus & 0x0200)
1399 dev->stats.tx_window_errors++;
1400 if (txstatus & 0x0100)
1401 dev->stats.tx_aborted_errors++;
1402 if (txstatus & 0x0080)
1403 dev->stats.tx_heartbeat_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001404 if (((rp->quirks & rqRhineI) && txstatus & 0x0002) ||
1405 (txstatus & 0x0800) || (txstatus & 0x1000)) {
Eric Dumazet553e2332009-05-27 10:34:50 +00001406 dev->stats.tx_fifo_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001407 rp->tx_ring[entry].tx_status = cpu_to_le32(DescOwn);
1408 break; /* Keep the skb - we try again */
1409 }
1410 /* Transmitter restarted in 'abnormal' handler. */
1411 } else {
1412 if (rp->quirks & rqRhineI)
Eric Dumazet553e2332009-05-27 10:34:50 +00001413 dev->stats.collisions += (txstatus >> 3) & 0x0F;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001414 else
Eric Dumazet553e2332009-05-27 10:34:50 +00001415 dev->stats.collisions += txstatus & 0x0F;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001416 if (debug > 6)
1417 printk(KERN_DEBUG "collisions: %1.1x:%1.1x\n",
1418 (txstatus >> 3) & 0xF,
1419 txstatus & 0xF);
Eric Dumazet553e2332009-05-27 10:34:50 +00001420 dev->stats.tx_bytes += rp->tx_skbuff[entry]->len;
1421 dev->stats.tx_packets++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001422 }
1423 /* Free the original skb. */
1424 if (rp->tx_skbuff_dma[entry]) {
1425 pci_unmap_single(rp->pdev,
1426 rp->tx_skbuff_dma[entry],
1427 rp->tx_skbuff[entry]->len,
1428 PCI_DMA_TODEVICE);
1429 }
1430 dev_kfree_skb_irq(rp->tx_skbuff[entry]);
1431 rp->tx_skbuff[entry] = NULL;
1432 entry = (++rp->dirty_tx) % TX_RING_SIZE;
1433 }
1434 if ((rp->cur_tx - rp->dirty_tx) < TX_QUEUE_LEN - 4)
1435 netif_wake_queue(dev);
1436
1437 spin_unlock(&rp->lock);
1438}
1439
Roger Luethi633949a2006-08-14 23:00:17 -07001440/* Process up to limit frames from receive ring */
1441static int rhine_rx(struct net_device *dev, int limit)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001442{
1443 struct rhine_private *rp = netdev_priv(dev);
Roger Luethi633949a2006-08-14 23:00:17 -07001444 int count;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001445 int entry = rp->cur_rx % RX_RING_SIZE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001446
1447 if (debug > 4) {
1448 printk(KERN_DEBUG "%s: rhine_rx(), entry %d status %8.8x.\n",
1449 dev->name, entry,
1450 le32_to_cpu(rp->rx_head_desc->rx_status));
1451 }
1452
1453 /* If EOP is set on the next entry, it's a new packet. Send it up. */
Roger Luethi633949a2006-08-14 23:00:17 -07001454 for (count = 0; count < limit; ++count) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001455 struct rx_desc *desc = rp->rx_head_desc;
1456 u32 desc_status = le32_to_cpu(desc->rx_status);
1457 int data_size = desc_status >> 16;
1458
Roger Luethi633949a2006-08-14 23:00:17 -07001459 if (desc_status & DescOwn)
1460 break;
1461
Linus Torvalds1da177e2005-04-16 15:20:36 -07001462 if (debug > 4)
Denis Vlasenkoed4030d2005-06-17 08:23:17 +03001463 printk(KERN_DEBUG "rhine_rx() status is %8.8x.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001464 desc_status);
Roger Luethi633949a2006-08-14 23:00:17 -07001465
Linus Torvalds1da177e2005-04-16 15:20:36 -07001466 if ((desc_status & (RxWholePkt | RxErr)) != RxWholePkt) {
1467 if ((desc_status & RxWholePkt) != RxWholePkt) {
1468 printk(KERN_WARNING "%s: Oversized Ethernet "
1469 "frame spanned multiple buffers, entry "
1470 "%#x length %d status %8.8x!\n",
1471 dev->name, entry, data_size,
1472 desc_status);
1473 printk(KERN_WARNING "%s: Oversized Ethernet "
1474 "frame %p vs %p.\n", dev->name,
1475 rp->rx_head_desc, &rp->rx_ring[entry]);
Eric Dumazet553e2332009-05-27 10:34:50 +00001476 dev->stats.rx_length_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001477 } else if (desc_status & RxErr) {
1478 /* There was a error. */
1479 if (debug > 2)
Denis Vlasenkoed4030d2005-06-17 08:23:17 +03001480 printk(KERN_DEBUG "rhine_rx() Rx "
Linus Torvalds1da177e2005-04-16 15:20:36 -07001481 "error was %8.8x.\n",
1482 desc_status);
Eric Dumazet553e2332009-05-27 10:34:50 +00001483 dev->stats.rx_errors++;
1484 if (desc_status & 0x0030)
1485 dev->stats.rx_length_errors++;
1486 if (desc_status & 0x0048)
1487 dev->stats.rx_fifo_errors++;
1488 if (desc_status & 0x0004)
1489 dev->stats.rx_frame_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001490 if (desc_status & 0x0002) {
1491 /* this can also be updated outside the interrupt handler */
1492 spin_lock(&rp->lock);
Eric Dumazet553e2332009-05-27 10:34:50 +00001493 dev->stats.rx_crc_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001494 spin_unlock(&rp->lock);
1495 }
1496 }
1497 } else {
Eric Dumazet89d71a62009-10-13 05:34:20 +00001498 struct sk_buff *skb = NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001499 /* Length should omit the CRC */
1500 int pkt_len = data_size - 4;
1501
1502 /* Check if the packet is long enough to accept without
1503 copying to a minimally-sized skbuff. */
Eric Dumazet89d71a62009-10-13 05:34:20 +00001504 if (pkt_len < rx_copybreak)
1505 skb = netdev_alloc_skb_ip_align(dev, pkt_len);
1506 if (skb) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001507 pci_dma_sync_single_for_cpu(rp->pdev,
1508 rp->rx_skbuff_dma[entry],
1509 rp->rx_buf_sz,
1510 PCI_DMA_FROMDEVICE);
1511
David S. Miller8c7b7fa2007-07-10 22:08:12 -07001512 skb_copy_to_linear_data(skb,
David S. Miller689be432005-06-28 15:25:31 -07001513 rp->rx_skbuff[entry]->data,
David S. Miller8c7b7fa2007-07-10 22:08:12 -07001514 pkt_len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001515 skb_put(skb, pkt_len);
1516 pci_dma_sync_single_for_device(rp->pdev,
1517 rp->rx_skbuff_dma[entry],
1518 rp->rx_buf_sz,
1519 PCI_DMA_FROMDEVICE);
1520 } else {
1521 skb = rp->rx_skbuff[entry];
1522 if (skb == NULL) {
1523 printk(KERN_ERR "%s: Inconsistent Rx "
1524 "descriptor chain.\n",
1525 dev->name);
1526 break;
1527 }
1528 rp->rx_skbuff[entry] = NULL;
1529 skb_put(skb, pkt_len);
1530 pci_unmap_single(rp->pdev,
1531 rp->rx_skbuff_dma[entry],
1532 rp->rx_buf_sz,
1533 PCI_DMA_FROMDEVICE);
1534 }
1535 skb->protocol = eth_type_trans(skb, dev);
Roger Luethi633949a2006-08-14 23:00:17 -07001536 netif_receive_skb(skb);
Eric Dumazet553e2332009-05-27 10:34:50 +00001537 dev->stats.rx_bytes += pkt_len;
1538 dev->stats.rx_packets++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001539 }
1540 entry = (++rp->cur_rx) % RX_RING_SIZE;
1541 rp->rx_head_desc = &rp->rx_ring[entry];
1542 }
1543
1544 /* Refill the Rx ring buffers. */
1545 for (; rp->cur_rx - rp->dirty_rx > 0; rp->dirty_rx++) {
1546 struct sk_buff *skb;
1547 entry = rp->dirty_rx % RX_RING_SIZE;
1548 if (rp->rx_skbuff[entry] == NULL) {
Kevin Lob26b5552008-08-27 11:35:09 +08001549 skb = netdev_alloc_skb(dev, rp->rx_buf_sz);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001550 rp->rx_skbuff[entry] = skb;
1551 if (skb == NULL)
1552 break; /* Better luck next round. */
1553 skb->dev = dev; /* Mark as being used by this device. */
1554 rp->rx_skbuff_dma[entry] =
David S. Miller689be432005-06-28 15:25:31 -07001555 pci_map_single(rp->pdev, skb->data,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001556 rp->rx_buf_sz,
1557 PCI_DMA_FROMDEVICE);
1558 rp->rx_ring[entry].addr = cpu_to_le32(rp->rx_skbuff_dma[entry]);
1559 }
1560 rp->rx_ring[entry].rx_status = cpu_to_le32(DescOwn);
1561 }
Roger Luethi633949a2006-08-14 23:00:17 -07001562
1563 return count;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001564}
1565
1566/*
1567 * Clears the "tally counters" for CRC errors and missed frames(?).
1568 * It has been reported that some chips need a write of 0 to clear
1569 * these, for others the counters are set to 1 when written to and
1570 * instead cleared when read. So we clear them both ways ...
1571 */
1572static inline void clear_tally_counters(void __iomem *ioaddr)
1573{
1574 iowrite32(0, ioaddr + RxMissed);
1575 ioread16(ioaddr + RxCRCErrs);
1576 ioread16(ioaddr + RxMissed);
1577}
1578
1579static void rhine_restart_tx(struct net_device *dev) {
1580 struct rhine_private *rp = netdev_priv(dev);
1581 void __iomem *ioaddr = rp->base;
1582 int entry = rp->dirty_tx % TX_RING_SIZE;
1583 u32 intr_status;
1584
1585 /*
1586 * If new errors occured, we need to sort them out before doing Tx.
1587 * In that case the ISR will be back here RSN anyway.
1588 */
1589 intr_status = get_intr_status(dev);
1590
1591 if ((intr_status & IntrTxErrSummary) == 0) {
1592
1593 /* We know better than the chip where it should continue. */
1594 iowrite32(rp->tx_ring_dma + entry * sizeof(struct tx_desc),
1595 ioaddr + TxRingPtr);
1596
1597 iowrite8(ioread8(ioaddr + ChipCmd) | CmdTxOn,
1598 ioaddr + ChipCmd);
1599 iowrite8(ioread8(ioaddr + ChipCmd1) | Cmd1TxDemand,
1600 ioaddr + ChipCmd1);
1601 IOSYNC;
1602 }
1603 else {
1604 /* This should never happen */
1605 if (debug > 1)
1606 printk(KERN_WARNING "%s: rhine_restart_tx() "
1607 "Another error occured %8.8x.\n",
1608 dev->name, intr_status);
1609 }
1610
1611}
1612
1613static void rhine_error(struct net_device *dev, int intr_status)
1614{
1615 struct rhine_private *rp = netdev_priv(dev);
1616 void __iomem *ioaddr = rp->base;
1617
1618 spin_lock(&rp->lock);
1619
1620 if (intr_status & IntrLinkChange)
John W. Linville38bb6b22006-05-19 10:51:21 -04001621 rhine_check_media(dev, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001622 if (intr_status & IntrStatsMax) {
Eric Dumazet553e2332009-05-27 10:34:50 +00001623 dev->stats.rx_crc_errors += ioread16(ioaddr + RxCRCErrs);
1624 dev->stats.rx_missed_errors += ioread16(ioaddr + RxMissed);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001625 clear_tally_counters(ioaddr);
1626 }
1627 if (intr_status & IntrTxAborted) {
1628 if (debug > 1)
1629 printk(KERN_INFO "%s: Abort %8.8x, frame dropped.\n",
1630 dev->name, intr_status);
1631 }
1632 if (intr_status & IntrTxUnderrun) {
1633 if (rp->tx_thresh < 0xE0)
1634 iowrite8(rp->tx_thresh += 0x20, ioaddr + TxConfig);
1635 if (debug > 1)
1636 printk(KERN_INFO "%s: Transmitter underrun, Tx "
1637 "threshold now %2.2x.\n",
1638 dev->name, rp->tx_thresh);
1639 }
1640 if (intr_status & IntrTxDescRace) {
1641 if (debug > 2)
1642 printk(KERN_INFO "%s: Tx descriptor write-back race.\n",
1643 dev->name);
1644 }
1645 if ((intr_status & IntrTxError) &&
1646 (intr_status & (IntrTxAborted |
1647 IntrTxUnderrun | IntrTxDescRace)) == 0) {
1648 if (rp->tx_thresh < 0xE0) {
1649 iowrite8(rp->tx_thresh += 0x20, ioaddr + TxConfig);
1650 }
1651 if (debug > 1)
1652 printk(KERN_INFO "%s: Unspecified error. Tx "
1653 "threshold now %2.2x.\n",
1654 dev->name, rp->tx_thresh);
1655 }
1656 if (intr_status & (IntrTxAborted | IntrTxUnderrun | IntrTxDescRace |
1657 IntrTxError))
1658 rhine_restart_tx(dev);
1659
1660 if (intr_status & ~(IntrLinkChange | IntrStatsMax | IntrTxUnderrun |
1661 IntrTxError | IntrTxAborted | IntrNormalSummary |
1662 IntrTxDescRace)) {
1663 if (debug > 1)
1664 printk(KERN_ERR "%s: Something Wicked happened! "
1665 "%8.8x.\n", dev->name, intr_status);
1666 }
1667
1668 spin_unlock(&rp->lock);
1669}
1670
1671static struct net_device_stats *rhine_get_stats(struct net_device *dev)
1672{
1673 struct rhine_private *rp = netdev_priv(dev);
1674 void __iomem *ioaddr = rp->base;
1675 unsigned long flags;
1676
1677 spin_lock_irqsave(&rp->lock, flags);
Eric Dumazet553e2332009-05-27 10:34:50 +00001678 dev->stats.rx_crc_errors += ioread16(ioaddr + RxCRCErrs);
1679 dev->stats.rx_missed_errors += ioread16(ioaddr + RxMissed);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001680 clear_tally_counters(ioaddr);
1681 spin_unlock_irqrestore(&rp->lock, flags);
1682
Eric Dumazet553e2332009-05-27 10:34:50 +00001683 return &dev->stats;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001684}
1685
1686static void rhine_set_rx_mode(struct net_device *dev)
1687{
1688 struct rhine_private *rp = netdev_priv(dev);
1689 void __iomem *ioaddr = rp->base;
1690 u32 mc_filter[2]; /* Multicast hash filter */
1691 u8 rx_mode; /* Note: 0x02=accept runt, 0x01=accept errs */
1692
1693 if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001694 rx_mode = 0x1C;
1695 iowrite32(0xffffffff, ioaddr + MulticastFilter0);
1696 iowrite32(0xffffffff, ioaddr + MulticastFilter1);
Jiri Pirko4cd24ea2010-02-08 04:30:35 +00001697 } else if ((netdev_mc_count(dev) > multicast_filter_limit) ||
Joe Perches8e95a202009-12-03 07:58:21 +00001698 (dev->flags & IFF_ALLMULTI)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001699 /* Too many to match, or accept all multicasts. */
1700 iowrite32(0xffffffff, ioaddr + MulticastFilter0);
1701 iowrite32(0xffffffff, ioaddr + MulticastFilter1);
1702 rx_mode = 0x0C;
1703 } else {
Jiri Pirko22bedad32010-04-01 21:22:57 +00001704 struct netdev_hw_addr *ha;
Jiri Pirko567ec872010-02-23 23:17:07 +00001705
Linus Torvalds1da177e2005-04-16 15:20:36 -07001706 memset(mc_filter, 0, sizeof(mc_filter));
Jiri Pirko22bedad32010-04-01 21:22:57 +00001707 netdev_for_each_mc_addr(ha, dev) {
1708 int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001709
1710 mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
1711 }
1712 iowrite32(mc_filter[0], ioaddr + MulticastFilter0);
1713 iowrite32(mc_filter[1], ioaddr + MulticastFilter1);
1714 rx_mode = 0x0C;
1715 }
1716 iowrite8(rp->rx_thresh | rx_mode, ioaddr + RxConfig);
1717}
1718
1719static void netdev_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
1720{
1721 struct rhine_private *rp = netdev_priv(dev);
1722
1723 strcpy(info->driver, DRV_NAME);
1724 strcpy(info->version, DRV_VERSION);
1725 strcpy(info->bus_info, pci_name(rp->pdev));
1726}
1727
1728static int netdev_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
1729{
1730 struct rhine_private *rp = netdev_priv(dev);
1731 int rc;
1732
1733 spin_lock_irq(&rp->lock);
1734 rc = mii_ethtool_gset(&rp->mii_if, cmd);
1735 spin_unlock_irq(&rp->lock);
1736
1737 return rc;
1738}
1739
1740static int netdev_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
1741{
1742 struct rhine_private *rp = netdev_priv(dev);
1743 int rc;
1744
1745 spin_lock_irq(&rp->lock);
1746 rc = mii_ethtool_sset(&rp->mii_if, cmd);
1747 spin_unlock_irq(&rp->lock);
Roger Luethi00b428c2006-03-28 20:53:56 +02001748 rhine_set_carrier(&rp->mii_if);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001749
1750 return rc;
1751}
1752
1753static int netdev_nway_reset(struct net_device *dev)
1754{
1755 struct rhine_private *rp = netdev_priv(dev);
1756
1757 return mii_nway_restart(&rp->mii_if);
1758}
1759
1760static u32 netdev_get_link(struct net_device *dev)
1761{
1762 struct rhine_private *rp = netdev_priv(dev);
1763
1764 return mii_link_ok(&rp->mii_if);
1765}
1766
1767static u32 netdev_get_msglevel(struct net_device *dev)
1768{
1769 return debug;
1770}
1771
1772static void netdev_set_msglevel(struct net_device *dev, u32 value)
1773{
1774 debug = value;
1775}
1776
1777static void rhine_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
1778{
1779 struct rhine_private *rp = netdev_priv(dev);
1780
1781 if (!(rp->quirks & rqWOL))
1782 return;
1783
1784 spin_lock_irq(&rp->lock);
1785 wol->supported = WAKE_PHY | WAKE_MAGIC |
1786 WAKE_UCAST | WAKE_MCAST | WAKE_BCAST; /* Untested */
1787 wol->wolopts = rp->wolopts;
1788 spin_unlock_irq(&rp->lock);
1789}
1790
1791static int rhine_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
1792{
1793 struct rhine_private *rp = netdev_priv(dev);
1794 u32 support = WAKE_PHY | WAKE_MAGIC |
1795 WAKE_UCAST | WAKE_MCAST | WAKE_BCAST; /* Untested */
1796
1797 if (!(rp->quirks & rqWOL))
1798 return -EINVAL;
1799
1800 if (wol->wolopts & ~support)
1801 return -EINVAL;
1802
1803 spin_lock_irq(&rp->lock);
1804 rp->wolopts = wol->wolopts;
1805 spin_unlock_irq(&rp->lock);
1806
1807 return 0;
1808}
1809
Jeff Garzik7282d492006-09-13 14:30:00 -04001810static const struct ethtool_ops netdev_ethtool_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001811 .get_drvinfo = netdev_get_drvinfo,
1812 .get_settings = netdev_get_settings,
1813 .set_settings = netdev_set_settings,
1814 .nway_reset = netdev_nway_reset,
1815 .get_link = netdev_get_link,
1816 .get_msglevel = netdev_get_msglevel,
1817 .set_msglevel = netdev_set_msglevel,
1818 .get_wol = rhine_get_wol,
1819 .set_wol = rhine_set_wol,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001820};
1821
1822static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1823{
1824 struct rhine_private *rp = netdev_priv(dev);
1825 int rc;
1826
1827 if (!netif_running(dev))
1828 return -EINVAL;
1829
1830 spin_lock_irq(&rp->lock);
1831 rc = generic_mii_ioctl(&rp->mii_if, if_mii(rq), cmd, NULL);
1832 spin_unlock_irq(&rp->lock);
Roger Luethi00b428c2006-03-28 20:53:56 +02001833 rhine_set_carrier(&rp->mii_if);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001834
1835 return rc;
1836}
1837
1838static int rhine_close(struct net_device *dev)
1839{
1840 struct rhine_private *rp = netdev_priv(dev);
1841 void __iomem *ioaddr = rp->base;
1842
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001843 napi_disable(&rp->napi);
Jarek Poplawskic0d7a022009-12-23 21:54:29 -08001844 cancel_work_sync(&rp->reset_task);
1845 netif_stop_queue(dev);
1846
1847 spin_lock_irq(&rp->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001848
1849 if (debug > 1)
1850 printk(KERN_DEBUG "%s: Shutting down ethercard, "
1851 "status was %4.4x.\n",
1852 dev->name, ioread16(ioaddr + ChipCmd));
1853
1854 /* Switch to loopback mode to avoid hardware races. */
1855 iowrite8(rp->tx_thresh | 0x02, ioaddr + TxConfig);
1856
1857 /* Disable interrupts by clearing the interrupt mask. */
1858 iowrite16(0x0000, ioaddr + IntrEnable);
1859
1860 /* Stop the chip's Tx and Rx processes. */
1861 iowrite16(CmdStop, ioaddr + ChipCmd);
1862
1863 spin_unlock_irq(&rp->lock);
1864
1865 free_irq(rp->pdev->irq, dev);
1866 free_rbufs(dev);
1867 free_tbufs(dev);
1868 free_ring(dev);
1869
1870 return 0;
1871}
1872
1873
1874static void __devexit rhine_remove_one(struct pci_dev *pdev)
1875{
1876 struct net_device *dev = pci_get_drvdata(pdev);
1877 struct rhine_private *rp = netdev_priv(dev);
1878
1879 unregister_netdev(dev);
1880
1881 pci_iounmap(pdev, rp->base);
1882 pci_release_regions(pdev);
1883
1884 free_netdev(dev);
1885 pci_disable_device(pdev);
1886 pci_set_drvdata(pdev, NULL);
1887}
1888
Greg Kroah-Hartmand18c3db2005-06-23 17:35:56 -07001889static void rhine_shutdown (struct pci_dev *pdev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001890{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001891 struct net_device *dev = pci_get_drvdata(pdev);
1892 struct rhine_private *rp = netdev_priv(dev);
1893 void __iomem *ioaddr = rp->base;
1894
1895 if (!(rp->quirks & rqWOL))
1896 return; /* Nothing to do for non-WOL adapters */
1897
1898 rhine_power_init(dev);
1899
1900 /* Make sure we use pattern 0, 1 and not 4, 5 */
1901 if (rp->quirks & rq6patterns)
Laura Garciaf11cf252008-02-23 18:56:35 +01001902 iowrite8(0x04, ioaddr + WOLcgClr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001903
1904 if (rp->wolopts & WAKE_MAGIC) {
1905 iowrite8(WOLmagic, ioaddr + WOLcrSet);
1906 /*
1907 * Turn EEPROM-controlled wake-up back on -- some hardware may
1908 * not cooperate otherwise.
1909 */
1910 iowrite8(ioread8(ioaddr + ConfigA) | 0x03, ioaddr + ConfigA);
1911 }
1912
1913 if (rp->wolopts & (WAKE_BCAST|WAKE_MCAST))
1914 iowrite8(WOLbmcast, ioaddr + WOLcgSet);
1915
1916 if (rp->wolopts & WAKE_PHY)
1917 iowrite8(WOLlnkon | WOLlnkoff, ioaddr + WOLcrSet);
1918
1919 if (rp->wolopts & WAKE_UCAST)
1920 iowrite8(WOLucast, ioaddr + WOLcrSet);
1921
1922 if (rp->wolopts) {
1923 /* Enable legacy WOL (for old motherboards) */
1924 iowrite8(0x01, ioaddr + PwcfgSet);
1925 iowrite8(ioread8(ioaddr + StickyHW) | 0x04, ioaddr + StickyHW);
1926 }
1927
1928 /* Hit power state D3 (sleep) */
Roger Luethib933b4d2006-08-14 23:00:21 -07001929 if (!avoid_D3)
1930 iowrite8(ioread8(ioaddr + StickyHW) | 0x03, ioaddr + StickyHW);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001931
1932 /* TODO: Check use of pci_enable_wake() */
1933
1934}
1935
1936#ifdef CONFIG_PM
1937static int rhine_suspend(struct pci_dev *pdev, pm_message_t state)
1938{
1939 struct net_device *dev = pci_get_drvdata(pdev);
1940 struct rhine_private *rp = netdev_priv(dev);
1941 unsigned long flags;
1942
1943 if (!netif_running(dev))
1944 return 0;
1945
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001946 napi_disable(&rp->napi);
Francois Romieu32b0f532008-07-11 00:30:14 +02001947
Linus Torvalds1da177e2005-04-16 15:20:36 -07001948 netif_device_detach(dev);
1949 pci_save_state(pdev);
1950
1951 spin_lock_irqsave(&rp->lock, flags);
Greg Kroah-Hartmand18c3db2005-06-23 17:35:56 -07001952 rhine_shutdown(pdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001953 spin_unlock_irqrestore(&rp->lock, flags);
1954
1955 free_irq(dev->irq, dev);
1956 return 0;
1957}
1958
1959static int rhine_resume(struct pci_dev *pdev)
1960{
1961 struct net_device *dev = pci_get_drvdata(pdev);
1962 struct rhine_private *rp = netdev_priv(dev);
1963 unsigned long flags;
1964 int ret;
1965
1966 if (!netif_running(dev))
1967 return 0;
1968
Thomas Gleixner1fb9df52006-07-01 19:29:39 -07001969 if (request_irq(dev->irq, rhine_interrupt, IRQF_SHARED, dev->name, dev))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001970 printk(KERN_ERR "via-rhine %s: request_irq failed\n", dev->name);
1971
1972 ret = pci_set_power_state(pdev, PCI_D0);
1973 if (debug > 1)
1974 printk(KERN_INFO "%s: Entering power state D0 %s (%d).\n",
1975 dev->name, ret ? "failed" : "succeeded", ret);
1976
1977 pci_restore_state(pdev);
1978
1979 spin_lock_irqsave(&rp->lock, flags);
1980#ifdef USE_MMIO
1981 enable_mmio(rp->pioaddr, rp->quirks);
1982#endif
1983 rhine_power_init(dev);
1984 free_tbufs(dev);
1985 free_rbufs(dev);
1986 alloc_tbufs(dev);
1987 alloc_rbufs(dev);
1988 init_registers(dev);
1989 spin_unlock_irqrestore(&rp->lock, flags);
1990
1991 netif_device_attach(dev);
1992
1993 return 0;
1994}
1995#endif /* CONFIG_PM */
1996
1997static struct pci_driver rhine_driver = {
1998 .name = DRV_NAME,
1999 .id_table = rhine_pci_tbl,
2000 .probe = rhine_init_one,
2001 .remove = __devexit_p(rhine_remove_one),
2002#ifdef CONFIG_PM
2003 .suspend = rhine_suspend,
2004 .resume = rhine_resume,
2005#endif /* CONFIG_PM */
Greg Kroah-Hartmand18c3db2005-06-23 17:35:56 -07002006 .shutdown = rhine_shutdown,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002007};
2008
Roger Luethie84df482007-03-06 19:57:37 +01002009static struct dmi_system_id __initdata rhine_dmi_table[] = {
2010 {
2011 .ident = "EPIA-M",
2012 .matches = {
2013 DMI_MATCH(DMI_BIOS_VENDOR, "Award Software International, Inc."),
2014 DMI_MATCH(DMI_BIOS_VERSION, "6.00 PG"),
2015 },
2016 },
2017 {
2018 .ident = "KV7",
2019 .matches = {
2020 DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"),
2021 DMI_MATCH(DMI_BIOS_VERSION, "6.00 PG"),
2022 },
2023 },
2024 { NULL }
2025};
Linus Torvalds1da177e2005-04-16 15:20:36 -07002026
2027static int __init rhine_init(void)
2028{
2029/* when a module, this is printed whether or not devices are found in probe */
2030#ifdef MODULE
2031 printk(version);
2032#endif
Roger Luethie84df482007-03-06 19:57:37 +01002033 if (dmi_check_system(rhine_dmi_table)) {
2034 /* these BIOSes fail at PXE boot if chip is in D3 */
2035 avoid_D3 = 1;
2036 printk(KERN_WARNING "%s: Broken BIOS detected, avoid_D3 "
2037 "enabled.\n",
2038 DRV_NAME);
2039 }
2040 else if (avoid_D3)
2041 printk(KERN_INFO "%s: avoid_D3 set.\n", DRV_NAME);
2042
Jeff Garzik29917622006-08-19 17:48:59 -04002043 return pci_register_driver(&rhine_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002044}
2045
2046
2047static void __exit rhine_cleanup(void)
2048{
2049 pci_unregister_driver(&rhine_driver);
2050}
2051
2052
2053module_init(rhine_init);
2054module_exit(rhine_cleanup);