|
|
1.1 root 1: /* rtl8139.c: A RealTek RTL8129/8139 Fast Ethernet driver for Linux. */
2: /*
3: Written 1997-1998 by Donald Becker.
4:
5: This software may be used and distributed according to the terms
6: of the GNU Public License, incorporated herein by reference.
7: All other rights reserved.
8:
9: This driver is for boards based on the RTL8129 and RTL8139 PCI ethernet
10: chips.
11:
12: The author may be reached as [email protected], or C/O
13: Center of Excellence in Space Data and Information Sciences
14: Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771
15:
16: Support and updates available at
17: http://cesdis.gsfc.nasa.gov/linux/drivers/rtl8139.html
18:
19: Twister-tuning code contributed by Kinston <[email protected]>.
20: */
21:
22: static const char *version =
23: "rtl8139.c:v0.99B 4/7/98 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/rtl8139.html\n";
24:
25: /* A few user-configurable values. */
26: /* Maximum events (Rx packets, etc.) to handle at each interrupt. */
27: static int max_interrupt_work = 10;
28:
29: /* Size of the in-memory receive ring. */
30: #define RX_BUF_LEN_IDX 3 /* 0==8K, 1==16K, 2==32K, 3==64K */
31: #define RX_BUF_LEN (8192 << RX_BUF_LEN_IDX)
32: /* Size of the Tx bounce buffers -- must be at least (dev->mtu+14+4). */
33: #define TX_BUF_SIZE 1536
34:
35: /* PCI Tuning Parameters
36: Threshold is bytes transferred to chip before transmission starts. */
37: #define TX_FIFO_THRESH 256 /* In bytes, rounded down to 32 byte units. */
38:
39: /* The following settings are log_2(bytes)-4: 0 == 16 bytes .. 6==1024. */
40: #define RX_FIFO_THRESH 4 /* Rx buffer level before first PCI xfer. */
41: #define RX_DMA_BURST 4 /* Maximum PCI burst, '4' is 256 bytes */
42: #define TX_DMA_BURST 4
43:
44: /* Operational parameters that usually are not changed. */
45: /* Time in jiffies before concluding the transmitter is hung. */
46: #define TX_TIMEOUT ((4000*HZ)/1000)
47:
48: #ifdef MODULE
49: #ifdef MODVERSIONS
50: #include <linux/modversions.h>
51: #endif
52: #include <linux/module.h>
53: #include <linux/version.h>
54: #else
55: #define MOD_INC_USE_COUNT
56: #define MOD_DEC_USE_COUNT
57: #endif
58:
59: #include <linux/kernel.h>
60: #include <linux/sched.h>
61: #include <linux/string.h>
62: #include <linux/timer.h>
63: #include <linux/ptrace.h>
64: #include <linux/errno.h>
65: #include <linux/ioport.h>
66: #include <linux/malloc.h>
67: #include <linux/interrupt.h>
68: #include <linux/pci.h>
69: #include <linux/bios32.h>
70: #include <asm/processor.h> /* Processor type for cache alignment. */
71: #include <asm/bitops.h>
72: #include <asm/io.h>
73: #include <asm/dma.h>
74:
75: #include <linux/netdevice.h>
76: #include <linux/etherdevice.h>
77: #include <linux/skbuff.h>
78:
79: #define RUN_AT(x) (jiffies + (x))
80:
81: #include <linux/delay.h>
82:
83: #if (LINUX_VERSION_CODE < 0x20123)
84: #define test_and_set_bit(val, addr) set_bit(val, addr)
85: #endif
86:
87: /* The I/O extent. */
88: #define RTL8129_TOTAL_SIZE 0x80
89:
90: #ifdef HAVE_DEVLIST
91: struct netdev_entry rtl8139_drv =
92: {"RTL8139", rtl8139_probe, RTL8129_TOTAL_SIZE, NULL};
93: #endif
94:
95: static int rtl8129_debug = 1;
96:
97: /*
98: Theory of Operation
99:
100: I. Board Compatibility
101:
102: This device driver is designed for the RealTek RTL8129, the RealTek Fast
103: Ethernet controllers for PCI. This chip is used on a few clone boards.
104:
105:
106: II. Board-specific settings
107:
108: PCI bus devices are configured by the system at boot time, so no jumpers
109: need to be set on the board. The system BIOS will assign the
110: PCI INTA signal to a (preferably otherwise unused) system IRQ line.
111: Note: Kernel versions earlier than 1.3.73 do not support shared PCI
112: interrupt lines.
113:
114: III. Driver operation
115:
116: IIIa. Rx Ring buffers
117:
118: The receive unit uses a single linear ring buffer rather than the more
119: common (and more efficient) descriptor-based architecture. Incoming frames
120: are sequentially stored into the Rx region, and the host copies them into
121: skbuffs.
122:
123: Comment: While it is theoretically possible to process many frames in place,
124: any delay in Rx processing would cause us to drop frames. More importantly,
125: the Linux protocol stack is not designed to operate in this manner.
126:
127: IIIb. Tx operation
128:
129: The RTL8129 uses a fixed set of four Tx descriptors in register space.
130: In a stunningly bad design choice, Tx frames must be 32 bit aligned. Linux
131: aligns the IP header on word boundaries, and 14 byte ethernet header means
132: that almost all frames will need to be copied to an alignment buffer.
133:
134: IVb. References
135:
136: http://www.realtek.com.tw/cn/cn.html
137: http://cesdis.gsfc.nasa.gov/linux/misc/NWay.html
138:
139: IVc. Errata
140:
141: */
142:
143: #ifndef PCI_VENDOR_ID_REALTEK
144: #define PCI_VENDOR_ID_REALTEK 0x10ec
145: #endif
146: #ifndef PCI_DEVICE_ID_REALTEK_8129
147: #define PCI_DEVICE_ID_REALTEK_8129 0x8129
148: #endif
149: #ifndef PCI_DEVICE_ID_REALTEK_8139
150: #define PCI_DEVICE_ID_REALTEK_8139 0x8139
151: #endif
152:
153: /* The rest of these values should never change. */
154: #define NUM_TX_DESC 4 /* Number of Tx descriptor registers. */
155:
156: /* Symbolic offsets to registers. */
157: enum RTL8129_registers {
158: MAC0=0, /* Ethernet hardware address. */
159: MAR0=8, /* Multicast filter. */
160: TxStat0=0x10, /* Transmit status (Four 32bit registers). */
161: TxAddr0=0x20, /* Tx descriptors (also four 32bit). */
162: RxBuf=0x30, RxEarlyCnt=0x34, RxEarlyStatus=0x36,
163: ChipCmd=0x37, RxBufPtr=0x38, RxBufAddr=0x3A,
164: IntrMask=0x3C, IntrStatus=0x3E,
165: TxConfig=0x40, RxConfig=0x44,
166: Timer=0x48, /* A general-purpose counter. */
167: RxMissed=0x4C, /* 24 bits valid, write clears. */
168: Cfg9346=0x50, Config0=0x51, Config1=0x52,
169: FlashReg=0x54, GPPinData=0x58, GPPinDir=0x59, MII_SMI=0x5A, HltClk=0x5B,
170: MultiIntr=0x5C, TxSummary=0x60,
171: BMCR=0x62, BMSR=0x64, NWayAdvert=0x66, NWayLPAR=0x68, NWayExpansion=0x6A,
172: /* Undocumented registers, but required for proper operation. */
173: FIFOTMS=0x70, /* FIFO Test Mode Select */
174: CSCR=0x74, /* Chip Status and Configuration Register. */
175: PARA78=0x78, PARA7c=0x7c, /* Magic transceiver parameter register. */
176: };
177:
178: enum ChipCmdBits {
179: CmdReset=0x10, CmdRxEnb=0x08, CmdTxEnb=0x04, RxBufEmpty=0x01, };
180:
181: /* Interrupt register bits, using my own meaningful names. */
182: enum IntrStatusBits {
183: PCIErr=0x8000, PCSTimeout=0x4000,
184: RxFIFOOver=0x40, RxUnderrun=0x20, RxOverflow=0x10,
185: TxErr=0x08, TxOK=0x04, RxErr=0x02, RxOK=0x01,
186: };
187: enum TxStatusBits {
188: TxHostOwns=0x2000, TxUnderrun=0x4000, TxStatOK=0x8000,
189: TxOutOfWindow=0x20000000, TxAborted=0x40000000, TxCarrierLost=0x80000000,
190: };
191: enum RxStatusBits {
192: RxMulticast=0x8000, RxPhysical=0x4000, RxBroadcast=0x2000,
193: RxBadSymbol=0x0020, RxRunt=0x0010, RxTooLong=0x0008, RxCRCErr=0x0004,
194: RxBadAlign=0x0002, RxStatusOK=0x0001,
195: };
196:
197: enum CSCRBits {
198: CSCR_LinkOKBit=0x0400, CSCR_LinkChangeBit=0x0800,
199: CSCR_LinkStatusBits=0x0f000, CSCR_LinkDownOffCmd=0x003c0,
200: CSCR_LinkDownCmd=0x0f3c0,
201: };
202:
203: /* Twister tuning parameters from RealTek. Completely undocumented. */
204: unsigned long param[4][4]={
205: {0x0cb39de43,0x0cb39ce43,0x0fb38de03,0x0cb38de43},
206: {0x0cb39de43,0x0cb39ce43,0x0cb39ce83,0x0cb39ce83},
207: {0x0cb39de43,0x0cb39ce43,0x0cb39ce83,0x0cb39ce83},
208: {0x0bb39de43,0x0bb39ce43,0x0bb39ce83,0x0bb39ce83}
209: };
210:
211: struct rtl8129_private {
212: char devname[8]; /* Used only for kernel debugging. */
213: const char *product_name;
214: struct device *next_module;
215: int chip_id;
216: int chip_revision;
217: #if LINUX_VERSION_CODE > 0x20139
218: struct net_device_stats stats;
219: #else
220: struct enet_statistics stats;
221: #endif
222: struct timer_list timer; /* Media selection timer. */
223: unsigned int cur_rx, cur_tx; /* The next free and used entries */
224: unsigned int dirty_rx, dirty_tx;
225: /* The saved address of a sent-in-place packet/buffer, for skfree(). */
226: struct sk_buff* tx_skbuff[NUM_TX_DESC];
227: unsigned char *tx_buf[NUM_TX_DESC]; /* Tx bounce buffers */
228: unsigned char *rx_ring;
229: unsigned char *tx_bufs; /* Tx bounce buffer region. */
230: unsigned char mc_filter[8]; /* Current multicast filter. */
231: char phys[4]; /* MII device addresses. */
232: int in_interrupt; /* Alpha needs word-wide lock. */
233: unsigned int tx_full:1; /* The Tx queue is full. */
234: unsigned int full_duplex:1; /* Full-duplex operation requested. */
235: unsigned int default_port:4; /* Last dev->if_port value. */
236: unsigned int media2:4; /* Secondary monitored media port. */
237: unsigned int medialock:1; /* Don't sense media type. */
238: unsigned int mediasense:1; /* Media sensing in progress. */
239: };
240:
241: #ifdef MODULE
242: /* Used to pass the full-duplex flag, etc. */
243: static int options[] = {-1, -1, -1, -1, -1, -1, -1, -1};
244: static int full_duplex[] = {-1, -1, -1, -1, -1, -1, -1, -1};
245: #if LINUX_VERSION_CODE > 0x20118
246: MODULE_AUTHOR("Donald Becker <[email protected]>");
247: MODULE_DESCRIPTION("RealTek RTL8129/8139 Fast Ethernet driver");
248: MODULE_PARM(debug, "i");
249: MODULE_PARM(options, "1-" __MODULE_STRING(8) "i");
250: MODULE_PARM(full_duplex, "1-" __MODULE_STRING(8) "i");
251: MODULE_PARM(max_interrupt_work, "i");
252: #endif
253: #endif
254:
255: static struct device *rtl8129_probe1(struct device *dev, int ioaddr, int irq,
256: int chip_id, int options, int card_idx);
257: static int rtl8129_open(struct device *dev);
258: static int read_eeprom(int ioaddr, int location);
259: static int mdio_read(int ioaddr, int phy_id, int location);
260: static void rtl8129_timer(unsigned long data);
261: static void rtl8129_tx_timeout(struct device *dev);
262: static void rtl8129_init_ring(struct device *dev);
263: static int rtl8129_start_xmit(struct sk_buff *skb, struct device *dev);
264: static int rtl8129_rx(struct device *dev);
265: static void rtl8129_interrupt(int irq, void *dev_instance, struct pt_regs *regs);
266: static int rtl8129_close(struct device *dev);
267: static struct enet_statistics *rtl8129_get_stats(struct device *dev);
268: static void set_rx_mode(struct device *dev);
269:
270:
271: #ifdef MODULE
272: /* A list of all installed RTL8129 devices, for removing the driver module. */
273: static struct device *root_rtl8129_dev = NULL;
274: #endif
275:
276: int rtl8139_probe(struct device *dev)
277: {
278: int cards_found = 0;
279: static int pci_index = 0; /* Static, for multiple probe calls. */
280:
281: /* Ideally we would detect all network cards in slot order. That would
282: be best done a central PCI probe dispatch, which wouldn't work
283: well with the current structure. So instead we detect just the
284: Rtl81*9 cards in slot order. */
285:
286: if (pcibios_present()) {
287: unsigned char pci_bus, pci_device_fn;
288:
289: for (;pci_index < 0xff; pci_index++) {
290: u8 pci_irq_line, pci_latency;
291: u16 pci_command, new_command, vendor, device;
292: u32 pci_ioaddr;
293:
294: if (pcibios_find_class (PCI_CLASS_NETWORK_ETHERNET << 8,
295: #ifdef REVERSE_PROBE_ORDER
296: 0xff - pci_index,
297: #else
298: pci_index,
299: #endif
300: &pci_bus, &pci_device_fn)
301: != PCIBIOS_SUCCESSFUL)
302: break;
303: pcibios_read_config_word(pci_bus, pci_device_fn,
304: PCI_VENDOR_ID, &vendor);
305: if (vendor != PCI_VENDOR_ID_REALTEK)
306: continue;
307:
308: pcibios_read_config_word(pci_bus, pci_device_fn,
309: PCI_DEVICE_ID, &device);
310: pcibios_read_config_byte(pci_bus, pci_device_fn,
311: PCI_INTERRUPT_LINE, &pci_irq_line);
312: pcibios_read_config_dword(pci_bus, pci_device_fn,
313: PCI_BASE_ADDRESS_0, &pci_ioaddr);
314: /* Remove I/O space marker in bit 0. */
315: pci_ioaddr &= ~3;
316:
317: if (device != PCI_DEVICE_ID_REALTEK_8129
318: && device != PCI_DEVICE_ID_REALTEK_8139) {
319: printk(KERN_NOTICE "Unknown RealTek PCI ethernet chip type "
320: "%4.4x detected: not configured.\n", device);
321: continue;
322: }
323: if (check_region(pci_ioaddr, RTL8129_TOTAL_SIZE))
324: continue;
325:
326: /* Activate the card: fix for brain-damaged Win98 BIOSes. */
327: pcibios_read_config_word(pci_bus, pci_device_fn,
328: PCI_COMMAND, &pci_command);
329: new_command = pci_command | PCI_COMMAND_MASTER|PCI_COMMAND_IO;
330: if (pci_command != new_command) {
331: printk(KERN_INFO " The PCI BIOS has not enabled this"
332: " device! Updating PCI config %4.4x->%4.4x.\n",
333: pci_command, new_command);
334: pcibios_write_config_word(pci_bus, pci_device_fn,
335: PCI_COMMAND, new_command);
336: }
337:
338: #ifdef MODULE
339: dev = rtl8129_probe1(dev, pci_ioaddr, pci_irq_line, device,
340: options[cards_found], cards_found);
341: #else
342: dev = rtl8129_probe1(dev, pci_ioaddr, pci_irq_line, device,
343: dev ? dev->mem_start : 0, -1);
344: #endif
345:
346: if (dev) {
347: pcibios_read_config_byte(pci_bus, pci_device_fn,
348: PCI_LATENCY_TIMER, &pci_latency);
349: if (pci_latency < 32) {
350: printk(KERN_NOTICE" PCI latency timer (CFLT) is "
351: "unreasonably low at %d. Setting to 64 clocks.\n",
352: pci_latency);
353: pcibios_write_config_byte(pci_bus, pci_device_fn,
354: PCI_LATENCY_TIMER, 64);
355: } else if (rtl8129_debug > 1)
356: printk(KERN_INFO" PCI latency timer (CFLT) is %#x.\n",
357: pci_latency);
358: dev = 0;
359: cards_found++;
360: }
361: }
362: }
363:
364: #if defined (MODULE)
365: return cards_found;
366: #else
367: return cards_found ? 0 : -ENODEV;
368: #endif
369: }
370:
371: static struct device *rtl8129_probe1(struct device *dev, int ioaddr, int irq,
372: int chip_id, int options, int card_idx)
373: {
374: static int did_version = 0; /* Already printed version info. */
375: struct rtl8129_private *tp;
376: int i;
377:
378: if (rtl8129_debug > 0 && did_version++ == 0)
379: printk(KERN_INFO "%s", version);
380:
381: dev = init_etherdev(dev, 0);
382:
383: printk(KERN_INFO "%s: RealTek RTL%x at %#3x, IRQ %d, ",
384: dev->name, chip_id, ioaddr, irq);
385:
386: /* Bring the chip out of low-power mode. */
387: outb(0x00, ioaddr + Config1);
388:
389: /* Perhaps this should be read from the EEPROM? */
390: for (i = 0; i < 6; i++)
391: dev->dev_addr[i] = inb(ioaddr + MAC0 + i);
392:
393: for (i = 0; i < 5; i++)
394: printk("%2.2x:", dev->dev_addr[i]);
395: printk("%2.2x.\n", dev->dev_addr[i]);
396:
397: if (rtl8129_debug > 1) {
398: printk(KERN_INFO "%s: EEPROM contents\n", dev->name);
399: for (i = 0; i < 64; i++)
400: printk(" %4.4x%s", read_eeprom(ioaddr, i),
401: i%16 == 15 ? "\n"KERN_INFO : "");
402: }
403:
404: /* We do a request_region() to register /proc/ioports info. */
405: request_region(ioaddr, RTL8129_TOTAL_SIZE, "RealTek RTL8129/39 Fast Ethernet");
406:
407: dev->base_addr = ioaddr;
408: dev->irq = irq;
409:
410: /* Some data structures must be quadword aligned. */
411: tp = kmalloc(sizeof(*tp), GFP_KERNEL | GFP_DMA);
412: memset(tp, 0, sizeof(*tp));
413: dev->priv = tp;
414:
415: #ifdef MODULE
416: tp->next_module = root_rtl8129_dev;
417: root_rtl8129_dev = dev;
418: #endif
419:
420: tp->chip_id = chip_id;
421:
422: /* Find the connected MII xcvrs.
423: Doing this in open() would allow detecting external xcvrs later, but
424: takes too much time. */
425: if (chip_id == 0x8129) {
426: int phy, phy_idx;
427: for (phy = 0, phy_idx = 0; phy < 32 && phy_idx < sizeof(tp->phys);
428: phy++) {
429: int mii_status = mdio_read(ioaddr, phy, 1);
430:
431: if (mii_status != 0xffff && mii_status != 0x0000) {
432: tp->phys[phy_idx++] = phy;
433: printk(KERN_INFO "%s: MII transceiver found at address %d.\n",
434: dev->name, phy);
435: }
436: }
437: if (phy_idx == 0) {
438: printk(KERN_INFO "%s: No MII transceivers found! Assuming SYM "
439: "transceiver.\n",
440: dev->name);
441: tp->phys[0] = -1;
442: }
443: } else {
444: tp->phys[0] = -1;
445: }
446:
447: /* Put the chip into low-power mode. */
448: outb(0xC0, ioaddr + Cfg9346);
449: outb(0x03, ioaddr + Config1);
450: outb('H', ioaddr + HltClk); /* 'R' would leave the clock running. */
451:
452: /* The lower four bits are the media type. */
453: if (options > 0) {
454: tp->full_duplex = (options & 16) ? 1 : 0;
455: tp->default_port = options & 15;
456: if (tp->default_port)
457: tp->medialock = 1;
458: }
459: #ifdef MODULE
460: if (card_idx >= 0) {
461: if (full_duplex[card_idx] >= 0)
462: tp->full_duplex = full_duplex[card_idx];
463: }
464: #endif
465:
466: /* The Rtl8129-specific entries in the device structure. */
467: dev->open = &rtl8129_open;
468: dev->hard_start_xmit = &rtl8129_start_xmit;
469: dev->stop = &rtl8129_close;
470: dev->get_stats = &rtl8129_get_stats;
471: dev->set_multicast_list = &set_rx_mode;
472:
473: return dev;
474: }
475:
476: /* Serial EEPROM section. */
477:
478: /* EEPROM_Ctrl bits. */
479: #define EE_SHIFT_CLK 0x04 /* EEPROM shift clock. */
480: #define EE_CS 0x08 /* EEPROM chip select. */
481: #define EE_DATA_WRITE 0x02 /* EEPROM chip data in. */
482: #define EE_WRITE_0 0x00
483: #define EE_WRITE_1 0x02
484: #define EE_DATA_READ 0x01 /* EEPROM chip data out. */
485: #define EE_ENB (0x80 | EE_CS)
486:
487: /* Delay between EEPROM clock transitions.
488: No extra delay is needed with 33Mhz PCI, but 66Mhz is untested.
489: */
490:
491: #ifdef _LINUX_DELAY_H
492: #define eeprom_delay(nanosec) udelay(1)
493: #else
494: #define eeprom_delay(nanosec) do { ; } while (0)
495: #endif
496:
497: /* The EEPROM commands include the alway-set leading bit. */
498: #define EE_WRITE_CMD (5 << 6)
499: #define EE_READ_CMD (6 << 6)
500: #define EE_ERASE_CMD (7 << 6)
501:
502: static int read_eeprom(int ioaddr, int location)
503: {
504: int i;
505: unsigned retval = 0;
506: int ee_addr = ioaddr + Cfg9346;
507: int read_cmd = location | EE_READ_CMD;
508:
509: outb(EE_ENB & ~EE_CS, ee_addr);
510: outb(EE_ENB, ee_addr);
511:
512: /* Shift the read command bits out. */
513: for (i = 10; i >= 0; i--) {
514: int dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0;
515: outb(EE_ENB | dataval, ee_addr);
516: eeprom_delay(100);
517: outb(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr);
518: eeprom_delay(150);
519: outb(EE_ENB | dataval, ee_addr); /* Finish EEPROM a clock tick. */
520: eeprom_delay(250);
521: }
522: outb(EE_ENB, ee_addr);
523:
524: for (i = 16; i > 0; i--) {
525: outb(EE_ENB | EE_SHIFT_CLK, ee_addr);
526: eeprom_delay(100);
527: retval = (retval << 1) | ((inb(ee_addr) & EE_DATA_READ) ? 1 : 0);
528: outb(EE_ENB, ee_addr);
529: eeprom_delay(100);
530: }
531:
532: /* Terminate the EEPROM access. */
533: outb(~EE_CS, ee_addr);
534: return retval;
535: }
536:
537: /* MII serial management: mostly bogus for now. */
538: /* Read and write the MII management registers using software-generated
539: serial MDIO protocol.
540: The maximum data clock rate is 2.5 Mhz. The minimum timing is usually
541: met by back-to-back PCI I/O cycles, but we insert a delay to avoid
542: "overclocking" issues. */
543: #define MDIO_DIR 0x80
544: #define MDIO_DATA_OUT 0x04
545: #define MDIO_DATA_IN 0x02
546: #define MDIO_CLK 0x01
547: #ifdef _LINUX_DELAY_H
548: #define mdio_delay() udelay(1) /* Really 400ns. */
549: #else
550: #define mdio_delay() do { ; } while (0)
551: #endif
552:
553: /* Syncronize the MII management interface by shifting 32 one bits out. */
554: static void mdio_sync(int ioaddr)
555: {
556: int i;
557: int mdio_addr = ioaddr + MII_SMI;
558:
559: for (i = 32; i >= 0; i--) {
560: outb(MDIO_DIR | MDIO_DATA_OUT, mdio_addr);
561: mdio_delay();
562: outb(MDIO_DIR | MDIO_DATA_OUT | MDIO_CLK, mdio_addr);
563: mdio_delay();
564: }
565: return;
566: }
567: static int mdio_read(int ioaddr, int phy_id, int location)
568: {
569: int i;
570: int read_cmd = (0xf6 << 10) | (phy_id << 5) | location;
571: int retval = 0;
572: int mdio_addr = ioaddr + MII_SMI;
573:
574: mdio_sync(ioaddr);
575: /* Shift the read command bits out. */
576: for (i = 15; i >= 0; i--) {
577: int dataval =
578: (read_cmd & (1 << i)) ? MDIO_DATA_OUT : 0;
579:
580: outb(MDIO_DIR | dataval, mdio_addr);
581: mdio_delay();
582: outb(MDIO_DIR | dataval | MDIO_CLK, mdio_addr);
583: mdio_delay();
584: }
585:
586: /* Read the two transition, 16 data, and wire-idle bits. */
587: for (i = 19; i > 0; i--) {
588: outb(0, mdio_addr);
589: mdio_delay();
590: retval = (retval << 1) | ((inb(mdio_addr) & MDIO_DATA_IN) ? 1 : 0);
591: outb(MDIO_CLK, mdio_addr);
592: mdio_delay();
593: }
594: return (retval>>1) & 0xffff;
595: }
596:
597: static int
598: rtl8129_open(struct device *dev)
599: {
600: struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;
601: int ioaddr = dev->base_addr;
602: int i;
603: int full_duplex = 0;
604:
605: /* Soft reset the chip. */
606: outb(CmdReset, ioaddr + ChipCmd);
607:
608: if (request_irq(dev->irq, &rtl8129_interrupt, SA_SHIRQ, dev->name, dev)) {
609: return -EAGAIN;
610: }
611:
612: MOD_INC_USE_COUNT;
613:
614: tp->tx_bufs = kmalloc(TX_BUF_SIZE * NUM_TX_DESC, GFP_KERNEL);
615: tp->rx_ring = kmalloc(RX_BUF_LEN + 16, GFP_KERNEL);
616: if (tp->tx_bufs == NULL || tp->rx_ring == NULL) {
617: if (tp->tx_bufs)
618: kfree(tp->tx_bufs);
619: if (rtl8129_debug > 0)
620: printk(KERN_ERR "%s: Couldn't allocate a %d byte receive ring.\n",
621: dev->name, RX_BUF_LEN);
622: return -ENOMEM;
623: }
624: rtl8129_init_ring(dev);
625:
626: /* Check that the chip has finished the reset. */
627: for (i = 1000; i > 0; i--)
628: if ((inb(ioaddr + ChipCmd) & CmdReset) == 0)
629: break;
630:
631: for (i = 0; i < 6; i++)
632: outb(dev->dev_addr[i], ioaddr + MAC0 + i);
633:
634: /* Must enable Tx/Rx before setting transfer thresholds! */
635: outb(CmdRxEnb | CmdTxEnb, ioaddr + ChipCmd);
636: outl((RX_FIFO_THRESH << 13) | (RX_BUF_LEN_IDX << 11) | (RX_DMA_BURST<<8),
637: ioaddr + RxConfig);
638: outl((TX_DMA_BURST<<8)|0x03000000, ioaddr + TxConfig);
639:
640: full_duplex = tp->full_duplex;
641: if (tp->phys[0] >= 0 || tp->chip_id == 0x8139) {
642: u16 mii_reg5;
643: if (tp->chip_id == 0x8139)
644: mii_reg5 = inw(ioaddr + NWayLPAR);
645: else
646: mii_reg5 = mdio_read(ioaddr, tp->phys[0], 5);
647: if (mii_reg5 == 0xffff)
648: ; /* Not there */
649: else if ((mii_reg5 & 0x0100) == 0x0100
650: || (mii_reg5 & 0x00C0) == 0x0040)
651: full_duplex = 1;
652: if (rtl8129_debug > 1)
653: printk(KERN_INFO"%s: Setting %s%s-duplex based on"
654: " auto-negotiated partner ability %4.4x.\n", dev->name,
655: mii_reg5 == 0 ? "" :
656: (mii_reg5 & 0x0180) ? "100mbps " : "10mbps ",
657: full_duplex ? "full" : "half", mii_reg5);
658: }
659:
660: outb(0xC0, ioaddr + Cfg9346);
661: outb(full_duplex ? 0x60 : 0x20, ioaddr + Config1);
662: outb(0x00, ioaddr + Cfg9346);
663:
664: outl(virt_to_bus(tp->rx_ring), ioaddr + RxBuf);
665:
666: /* Start the chip's Tx and Rx process. */
667: outl(0, ioaddr + RxMissed);
668: set_rx_mode(dev);
669:
670: outb(CmdRxEnb | CmdTxEnb, ioaddr + ChipCmd);
671:
672: dev->tbusy = 0;
673: dev->interrupt = 0;
674: dev->start = 1;
675:
676: /* Enable all known interrupts by setting the interrupt mask. */
677: outw(PCIErr | PCSTimeout | RxUnderrun | RxOverflow | RxFIFOOver
678: | TxErr | TxOK | RxErr | RxOK, ioaddr + IntrMask);
679:
680: if (rtl8129_debug > 1)
681: printk(KERN_DEBUG"%s: rtl8129_open() ioaddr %4.4x IRQ %d"
682: " GP Pins %2.2x %s-duplex.\n",
683: dev->name, ioaddr, dev->irq, inb(ioaddr + GPPinData),
684: full_duplex ? "full" : "half");
685:
686: /* Set the timer to switch to check for link beat and perhaps switch
687: to an alternate media type. */
688: init_timer(&tp->timer);
689: tp->timer.expires = RUN_AT((24*HZ)/10); /* 2.4 sec. */
690: tp->timer.data = (unsigned long)dev;
691: tp->timer.function = &rtl8129_timer; /* timer handler */
692: add_timer(&tp->timer);
693:
694: return 0;
695: }
696:
697: static void rtl8129_timer(unsigned long data)
698: {
699: struct device *dev = (struct device *)data;
700: struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;
701: int ioaddr = dev->base_addr;
702: int next_tick = 0;
703:
704: if (tp->chip_id == 0x8139) {
705: u16 mii_reg5 = inw(ioaddr + NWayLPAR);
706: if ((mii_reg5 & 0x0100) == 0x0100
707: || (mii_reg5 & 0x00C0) == 0x0040)
708: if ( ! tp->full_duplex) {
709: tp->full_duplex = 1;
710: if (rtl8129_debug > 0)
711: printk(KERN_INFO "%s: Switching to full-duplex based on "
712: "link partner ability of %4.4x.\n",
713: dev->name, mii_reg5);
714: outb(0xC0, ioaddr + Cfg9346);
715: outb(tp->full_duplex ? 0x60 : 0x20, ioaddr + Config1);
716: outb(0x00, ioaddr + Cfg9346);
717: }
718: }
719: if (rtl8129_debug > 2) {
720: if (tp->chip_id == 0x8129)
721: printk(KERN_DEBUG"%s: Media selection tick, GP pins %2.2x.\n",
722: dev->name, inb(ioaddr + GPPinData));
723: else
724: printk(KERN_DEBUG"%s: Media selection tick, Link partner %4.4x.\n",
725: dev->name, inw(ioaddr + NWayLPAR));
726: printk(KERN_DEBUG"%s: Other registers are IntMask %4.4x IntStatus %4.4x"
727: " RxStatus %4.4x.\n",
728: dev->name, inw(ioaddr + IntrMask), inw(ioaddr + IntrStatus),
729: inl(ioaddr + RxEarlyStatus));
730: printk(KERN_DEBUG"%s: Chip config %2.2x %2.2x.\n",
731: dev->name, inb(ioaddr + Config0), inb(ioaddr + Config1));
732: }
733:
734: if (next_tick) {
735: tp->timer.expires = RUN_AT(next_tick);
736: add_timer(&tp->timer);
737: }
738: }
739:
740: static void rtl8129_tx_timeout(struct device *dev)
741: {
742: struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;
743: int ioaddr = dev->base_addr;
744: int i;
745:
746: /* Disable interrupts by clearing the interrupt mask. */
747: outw(0x0000, ioaddr + IntrMask);
748:
749: if (rtl8129_debug > 0)
750: printk(KERN_WARNING "%s: Transmit timeout, status %2.2x %4.4x.\n",
751: dev->name, inb(ioaddr + ChipCmd), inw(ioaddr + IntrStatus));
752: /* Emit info to figure out what went wrong. */
753: for (i = 0; i < NUM_TX_DESC; i++)
754: printk(KERN_DEBUG"%s: Tx descriptor %d is %8.8x.%s\n",
755: dev->name, i, inl(ioaddr + TxStat0 + i*4),
756: i == tp->dirty_tx % NUM_TX_DESC ? " (queue head)" : "");
757: if (tp->chip_id == 0x8129) {
758: int mii_reg;
759: printk(KERN_DEBUG"%s: MII #%d registers are:", dev->name, tp->phys[0]);
760: for (mii_reg = 0; mii_reg < 8; mii_reg++)
761: printk(" %4.4x", mdio_read(ioaddr, tp->phys[0], mii_reg));
762: printk(".\n");
763: } else {
764: printk(KERN_DEBUG"%s: MII status register is %4.4x.\n",
765: dev->name, inw(ioaddr + BMSR));
766: }
767:
768: /* Soft reset the chip. */
769: outb(CmdReset, ioaddr + ChipCmd);
770: for (i = 0; i < 6; i++)
771: outb(dev->dev_addr[i], ioaddr + MAC0 + i);
772:
773: { /* Save the unsent Tx packets. */
774: struct sk_buff *saved_skb[NUM_TX_DESC], *skb;
775: int j = 0;
776: for (; tp->cur_tx - tp->dirty_tx > 0 ; tp->dirty_tx++)
777: saved_skb[j++] = tp->tx_skbuff[tp->dirty_tx % NUM_TX_DESC];
778: tp->dirty_tx = tp->cur_tx = 0;
779:
780: for (i = 0; i < j; i++) {
781: skb = tp->tx_skbuff[i] = saved_skb[i];
782: if ((long)skb->data & 3) { /* Must use alignment buffer. */
783: memcpy(tp->tx_buf[i], skb->data, skb->len);
784: outl(virt_to_bus(tp->tx_buf[i]), ioaddr + TxAddr0 + i*4);
785: } else
786: outl(virt_to_bus(skb->data), ioaddr + TxAddr0 + i*4);
787: /* Note: the chip doesn't have auto-pad! */
788: outl(((TX_FIFO_THRESH<<11) & 0x003f0000) |
789: (skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN),
790: ioaddr + TxStat0 + i*4);
791: }
792: tp->cur_tx = i;
793: while (i < NUM_TX_DESC)
794: tp->tx_skbuff[i] = 0;
795: if (tp->cur_tx - tp->dirty_tx < NUM_TX_DESC) {/* Typical path */
796: dev->tbusy = 0;
797: } else {
798: tp->tx_full = 1;
799: }
800: }
801:
802: /* Must enable Tx/Rx before setting transfer thresholds! */
803: set_rx_mode(dev);
804: outb(CmdRxEnb | CmdTxEnb, ioaddr + ChipCmd);
805: outl((RX_FIFO_THRESH << 13) | (RX_BUF_LEN_IDX << 11) | (RX_DMA_BURST<<8),
806: ioaddr + RxConfig);
807: outl((TX_DMA_BURST<<8), ioaddr + TxConfig);
808:
809: dev->trans_start = jiffies;
810: tp->stats.tx_errors++;
811: /* Enable all known interrupts by setting the interrupt mask. */
812: outw(PCIErr | PCSTimeout | RxUnderrun | RxOverflow | RxFIFOOver
813: | TxErr | TxOK | RxErr | RxOK, ioaddr + IntrMask);
814: return;
815: }
816:
817:
818: /* Initialize the Rx and Tx rings, along with various 'dev' bits. */
819: static void
820: rtl8129_init_ring(struct device *dev)
821: {
822: struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;
823: int i;
824:
825: tp->tx_full = 0;
826: tp->cur_rx = tp->cur_tx = 0;
827: tp->dirty_rx = tp->dirty_tx = 0;
828:
829: for (i = 0; i < NUM_TX_DESC; i++) {
830: tp->tx_skbuff[i] = 0;
831: tp->tx_buf[i] = &tp->tx_bufs[i*TX_BUF_SIZE];
832: }
833: }
834:
835: static int
836: rtl8129_start_xmit(struct sk_buff *skb, struct device *dev)
837: {
838: struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;
839: int ioaddr = dev->base_addr;
840: int entry;
841:
842: /* Block a timer-based transmit from overlapping. This could better be
843: done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */
844: if (test_and_set_bit(0, (void*)&dev->tbusy) != 0) {
845: if (jiffies - dev->trans_start < TX_TIMEOUT)
846: return 1;
847: rtl8129_tx_timeout(dev);
848: return 1;
849: }
850:
851: /* Calculate the next Tx descriptor entry. */
852: entry = tp->cur_tx % NUM_TX_DESC;
853:
854: tp->tx_skbuff[entry] = skb;
855: if ((long)skb->data & 3) { /* Must use alignment buffer. */
856: memcpy(tp->tx_buf[entry], skb->data, skb->len);
857: outl(virt_to_bus(tp->tx_buf[entry]), ioaddr + TxAddr0 + entry*4);
858: } else
859: outl(virt_to_bus(skb->data), ioaddr + TxAddr0 + entry*4);
860: /* Note: the chip doesn't have auto-pad! */
861: outl(((TX_FIFO_THRESH<<11) & 0x003f0000) |
862: (skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN),
863: ioaddr + TxStat0 + entry*4);
864:
865: if (++tp->cur_tx - tp->dirty_tx < NUM_TX_DESC) {/* Typical path */
866: dev->tbusy = 0;
867: } else {
868: tp->tx_full = 1;
869: }
870:
871: dev->trans_start = jiffies;
872: if (rtl8129_debug > 4)
873: printk(KERN_DEBUG"%s: Queued Tx packet at %p size %ld to slot %d.\n",
874: dev->name, skb->data, skb->len, entry);
875:
876: return 0;
877: }
878:
879: /* The interrupt handler does all of the Rx thread work and cleans up
880: after the Tx thread. */
881: static void rtl8129_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
882: {
883: struct device *dev = (struct device *)dev_instance;
884: struct rtl8129_private *tp;
885: int ioaddr, boguscnt = max_interrupt_work;
886: int status;
887:
888: if (dev == NULL) {
889: printk (KERN_ERR"rtl8139_interrupt(): IRQ %d for unknown device.\n",
890: irq);
891: return;
892: }
893:
894: ioaddr = dev->base_addr;
895: tp = (struct rtl8129_private *)dev->priv;
896: if (test_and_set_bit(0, (void*)&tp->in_interrupt)) {
897: printk(KERN_ERR "%s: Re-entering the interrupt handler.\n", dev->name);
898: return;
899: }
900: dev->interrupt = 1;
901:
902: do {
903: status = inw(ioaddr + IntrStatus);
904: /* Acknowledge all of the current interrupt sources ASAP. */
905: outw(status, ioaddr + IntrStatus);
906:
907: if (rtl8129_debug > 4)
908: printk(KERN_DEBUG"%s: interrupt status=%#4.4x new intstat=%#4.4x.\n",
909: dev->name, status, inw(ioaddr + IntrStatus));
910:
911: if ((status & (PCIErr|PCSTimeout|RxUnderrun|RxOverflow|RxFIFOOver
912: |TxErr|TxOK|RxErr|RxOK)) == 0)
913: break;
914:
915: if (status & (RxOK|RxUnderrun|RxOverflow|RxFIFOOver))/* Rx interrupt */
916: rtl8129_rx(dev);
917:
918: if (status & (TxOK | TxErr)) {
919: unsigned int dirty_tx;
920:
921: for (dirty_tx = tp->dirty_tx; dirty_tx < tp->cur_tx; dirty_tx++) {
922: int entry = dirty_tx % NUM_TX_DESC;
923: int txstatus = inl(ioaddr + TxStat0 + entry*4);
924:
925: if ( ! (txstatus & TxHostOwns))
926: break; /* It still hasn't been Txed */
927:
928: /* Note: TxCarrierLost is always asserted at 100mbps. */
929: if (txstatus & (TxOutOfWindow | TxAborted)) {
930: /* There was an major error, log it. */
931: #ifndef final_version
932: if (rtl8129_debug > 1)
933: printk(KERN_NOTICE"%s: Transmit error, Tx status %8.8x.\n",
934: dev->name, txstatus);
935: #endif
936: tp->stats.tx_errors++;
937: if (txstatus&TxAborted) {
938: tp->stats.tx_aborted_errors++;
939: outl((TX_DMA_BURST<<8)|0x03000001, ioaddr + TxConfig);
940: }
941: if (txstatus&TxCarrierLost) tp->stats.tx_carrier_errors++;
942: if (txstatus&TxOutOfWindow) tp->stats.tx_window_errors++;
943: #ifdef ETHER_STATS
944: if ((txstatus & 0x0f000000) == 0x0f000000)
945: tp->stats.collisions16++;
946: #endif
947: } else {
948: #ifdef ETHER_STATS
949: /* No count for tp->stats.tx_deferred */
950: #endif
951: if (txstatus & TxUnderrun) {
952: /* Todo: increase the Tx FIFO threshold. */
953: tp->stats.tx_fifo_errors++;
954: }
955: tp->stats.collisions += (txstatus >> 24) & 15;
956: #if LINUX_VERSION_CODE > 0x20119
957: tp->stats.tx_bytes += txstatus & 0x7ff;
958: #endif
959: tp->stats.tx_packets++;
960: }
961:
962: /* Free the original skb. */
963: dev_kfree_skb(tp->tx_skbuff[entry], FREE_WRITE);
964: tp->tx_skbuff[entry] = 0;
965: }
966:
967: #ifndef final_version
968: if (tp->cur_tx - dirty_tx > NUM_TX_DESC) {
969: printk(KERN_ERR"%s: Out-of-sync dirty pointer, %d vs. %d, full=%d.\n",
970: dev->name, dirty_tx, tp->cur_tx, tp->tx_full);
971: dirty_tx += NUM_TX_DESC;
972: }
973: #endif
974:
975: if (tp->tx_full && dev->tbusy
976: && dirty_tx > tp->cur_tx - NUM_TX_DESC) {
977: /* The ring is no longer full, clear tbusy. */
978: tp->tx_full = 0;
979: dev->tbusy = 0;
980: mark_bh(NET_BH);
981: }
982:
983: tp->dirty_tx = dirty_tx;
984: }
985:
986: /* Check uncommon events with one test. */
987: if (status & (PCIErr|PCSTimeout |RxUnderrun|RxOverflow|RxFIFOOver
988: |TxErr|RxErr)) {
989: /* Update the error count. */
990: tp->stats.rx_missed_errors += inl(ioaddr + RxMissed);
991: outl(0, ioaddr + RxMissed);
992:
993: if (status & (RxUnderrun | RxOverflow | RxErr | RxFIFOOver))
994: tp->stats.rx_errors++;
995:
996: if (status & (PCSTimeout)) tp->stats.rx_length_errors++;
997: if (status & (RxUnderrun|RxFIFOOver)) tp->stats.rx_fifo_errors++;
998: if (status & RxOverflow) {
999: tp->stats.rx_over_errors++;
1000: tp->cur_rx = inw(ioaddr + RxBufAddr) % RX_BUF_LEN;
1001: outw(tp->cur_rx - 16, ioaddr + RxBufPtr);
1002: }
1003: /* Error sources cleared above. */
1004: }
1005: if (--boguscnt < 0) {
1006: printk(KERN_WARNING"%s: Too much work at interrupt, "
1007: "IntrStatus=0x%4.4x.\n",
1008: dev->name, status);
1009: /* Clear all interrupt sources. */
1010: outw(0xffff, ioaddr + IntrStatus);
1011: break;
1012: }
1013: } while (1);
1014:
1015: if (rtl8129_debug > 3)
1016: printk(KERN_DEBUG"%s: exiting interrupt, intr_status=%#4.4x.\n",
1017: dev->name, inl(ioaddr + IntrStatus));
1018:
1019: dev->interrupt = 0;
1020: clear_bit(0, (void*)&tp->in_interrupt);
1021: return;
1022: }
1023:
1024: /* The data sheet doesn't describe the Rx ring at all, so I'm guessing at the
1025: field alignments and semantics. */
1026: static int
1027: rtl8129_rx(struct device *dev)
1028: {
1029: struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;
1030: int ioaddr = dev->base_addr;
1031: unsigned char *rx_ring = tp->rx_ring;
1032: u16 cur_rx = tp->cur_rx;
1033:
1034: if (rtl8129_debug > 4)
1035: printk(KERN_DEBUG"%s: In rtl8129_rx(), current %4.4x BufAddr %4.4x,"
1036: " free to %4.4x, Cmd %2.2x.\n",
1037: dev->name, cur_rx, inw(ioaddr + RxBufAddr),
1038: inw(ioaddr + RxBufPtr), inb(ioaddr + ChipCmd));
1039:
1040: while ((inb(ioaddr + ChipCmd) & 1) == 0) {
1041: int ring_offset = cur_rx % RX_BUF_LEN;
1042: u32 rx_status = *(u32*)(rx_ring + ring_offset);
1043: int rx_size = rx_status >> 16;
1044:
1045: if (rtl8129_debug > 4) {
1046: int i;
1047: printk(KERN_DEBUG"%s: rtl8129_rx() status %4.4x, size %4.4x, cur %4.4x.\n",
1048: dev->name, rx_status, rx_size, cur_rx);
1049: printk(KERN_DEBUG"%s: Frame contents ", dev->name);
1050: for (i = 0; i < 70; i++)
1051: printk(" %2.2x", rx_ring[ring_offset + i]);
1052: printk(".\n");
1053: }
1054: if (rx_status & RxTooLong) {
1055: if (rtl8129_debug > 0)
1056: printk(KERN_NOTICE"%s: Oversized Ethernet frame, status %4.4x!\n",
1057: dev->name, rx_status);
1058: tp->stats.rx_length_errors++;
1059: } else if (rx_status &
1060: (RxBadSymbol|RxRunt|RxTooLong|RxCRCErr|RxBadAlign)) {
1061: if (rtl8129_debug > 1)
1062: printk(KERN_DEBUG"%s: Ethernet frame had errors,"
1063: " status %4.4x.\n", dev->name, rx_status);
1064: tp->stats.rx_errors++;
1065: if (rx_status & (RxBadSymbol|RxBadAlign))
1066: tp->stats.rx_frame_errors++;
1067: if (rx_status & (RxRunt|RxTooLong)) tp->stats.rx_length_errors++;
1068: if (rx_status & RxCRCErr) tp->stats.rx_crc_errors++;
1069: /* Reset the receiver, based on RealTek recommendation. (Bug?) */
1070: tp->cur_rx = 0;
1071: outb(CmdTxEnb, ioaddr + ChipCmd);
1072: outb(CmdRxEnb | CmdTxEnb, ioaddr + ChipCmd);
1073: outl((RX_FIFO_THRESH << 13) | (RX_BUF_LEN_IDX << 11) |
1074: (RX_DMA_BURST<<8), ioaddr + RxConfig);
1075: } else {
1076: /* Malloc up new buffer, compatible with net-2e. */
1077: /* Omit the four octet CRC from the length. */
1078: struct sk_buff *skb;
1079:
1080: skb = dev_alloc_skb(rx_size + 2);
1081: if (skb == NULL) {
1082: printk(KERN_WARNING"%s: Memory squeeze, deferring packet.\n",
1083: dev->name);
1084: /* We should check that some rx space is free.
1085: If not, free one and mark stats->rx_dropped++. */
1086: tp->stats.rx_dropped++;
1087: break;
1088: }
1089: skb->dev = dev;
1090: skb_reserve(skb, 2); /* 16 byte align the IP fields. */
1091: if (ring_offset+rx_size+4 > RX_BUF_LEN) {
1092: int semi_count = RX_BUF_LEN - ring_offset - 4;
1093: memcpy(skb_put(skb, semi_count), &rx_ring[ring_offset + 4],
1094: semi_count);
1095: memcpy(skb_put(skb, rx_size-semi_count), rx_ring,
1096: rx_size-semi_count);
1097: if (rtl8129_debug > 4) {
1098: int i;
1099: printk(KERN_DEBUG"%s: Frame wrap @%d",
1100: dev->name, semi_count);
1101: for (i = 0; i < 16; i++)
1102: printk(" %2.2x", rx_ring[i]);
1103: printk(".\n");
1104: memset(rx_ring, 0xcc, 16);
1105: }
1106: } else
1107: memcpy(skb_put(skb, rx_size), &rx_ring[ring_offset + 4],
1108: rx_size);
1109: skb->protocol = eth_type_trans(skb, dev);
1110: netif_rx(skb);
1111: #if LINUX_VERSION_CODE > 0x20119
1112: tp->stats.rx_bytes += rx_size;
1113: #endif
1114: tp->stats.rx_packets++;
1115: }
1116:
1117: cur_rx += rx_size + 4;
1118: cur_rx = (cur_rx + 3) & ~3;
1119: outw(cur_rx - 16, ioaddr + RxBufPtr);
1120: }
1121: if (rtl8129_debug > 4)
1122: printk(KERN_DEBUG"%s: Done rtl8129_rx(), current %4.4x BufAddr %4.4x,"
1123: " free to %4.4x, Cmd %2.2x.\n",
1124: dev->name, cur_rx, inw(ioaddr + RxBufAddr),
1125: inw(ioaddr + RxBufPtr), inb(ioaddr + ChipCmd));
1126: tp->cur_rx = cur_rx;
1127: return 0;
1128: }
1129:
1130: static int
1131: rtl8129_close(struct device *dev)
1132: {
1133: int ioaddr = dev->base_addr;
1134: struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;
1135: int i;
1136:
1137: dev->start = 0;
1138: dev->tbusy = 1;
1139:
1140: if (rtl8129_debug > 1)
1141: printk(KERN_DEBUG"%s: Shutting down ethercard, status was 0x%4.4x.\n",
1142: dev->name, inw(ioaddr + IntrStatus));
1143:
1144: /* Disable interrupts by clearing the interrupt mask. */
1145: outw(0x0000, ioaddr + IntrMask);
1146:
1147: /* Stop the chip's Tx and Rx DMA processes. */
1148: outb(0x00, ioaddr + ChipCmd);
1149:
1150: /* Update the error counts. */
1151: tp->stats.rx_missed_errors += inl(ioaddr + RxMissed);
1152: outl(0, ioaddr + RxMissed);
1153:
1154: del_timer(&tp->timer);
1155:
1156: free_irq(dev->irq, dev);
1157:
1158: for (i = 0; i < NUM_TX_DESC; i++) {
1159: if (tp->tx_skbuff[i])
1160: dev_kfree_skb(tp->tx_skbuff[i], FREE_WRITE);
1161: tp->tx_skbuff[i] = 0;
1162: }
1163: kfree(tp->rx_ring);
1164: kfree(tp->tx_bufs);
1165:
1166: /* Green! Put the chip in low-power mode. */
1167: outb(0xC0, ioaddr + Cfg9346);
1168: outb(0x03, ioaddr + Config1);
1169: outb('H', ioaddr + HltClk); /* 'R' would leave the clock running. */
1170:
1171: MOD_DEC_USE_COUNT;
1172:
1173: return 0;
1174: }
1175:
1176: static struct enet_statistics *
1177: rtl8129_get_stats(struct device *dev)
1178: {
1179: struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;
1180: int ioaddr = dev->base_addr;
1181:
1182: if (dev->start) {
1183: tp->stats.rx_missed_errors += inl(ioaddr + RxMissed);
1184: outl(0, ioaddr + RxMissed);
1185: }
1186:
1187: return &tp->stats;
1188: }
1189:
1190: /* Set or clear the multicast filter for this adaptor.
1191: Note that we only use exclusion around actually queueing the
1192: new frame, not around filling tp->setup_frame. This is non-deterministic
1193: when re-entered but still correct. */
1194:
1195: /* The little-endian AUTODIN II ethernet CRC calculation.
1196: N.B. Do not use for bulk data, use a table-based routine instead.
1197: This is common code and should be moved to net/core/crc.c */
1198: static unsigned const ethernet_polynomial_le = 0xedb88320U;
1199: static inline unsigned ether_crc_le(int length, unsigned char *data)
1200: {
1201: unsigned int crc = 0xffffffff; /* Initial value. */
1202: while(--length >= 0) {
1203: unsigned char current_octet = *data++;
1204: int bit;
1205: for (bit = 8; --bit >= 0; current_octet >>= 1) {
1206: if ((crc ^ current_octet) & 1) {
1207: crc >>= 1;
1208: crc ^= ethernet_polynomial_le;
1209: } else
1210: crc >>= 1;
1211: }
1212: }
1213: return crc;
1214: }
1215:
1216: static void set_rx_mode(struct device *dev)
1217: {
1218: int ioaddr = dev->base_addr;
1219: struct rtl8129_private *tp = (struct rtl8129_private *)dev->priv;
1220: unsigned char mc_filter[8]; /* Multicast hash filter */
1221: int i;
1222:
1223: if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */
1224: /* Unconditionally log net taps. */
1225: printk(KERN_NOTICE"%s: Promiscuous mode enabled.\n", dev->name);
1226: memset(mc_filter, 0xff, sizeof(mc_filter));
1227: outb(0x0F, ioaddr + RxConfig);
1228: } else if ((dev->mc_count > 1000) || (dev->flags & IFF_ALLMULTI)) {
1229: /* Too many to filter perfectly -- accept all multicasts. */
1230: memset(mc_filter, 0xff, sizeof(mc_filter));
1231: outb(0x0E, ioaddr + RxConfig);
1232: } else if (dev->mc_count == 0) {
1233: outb(0x0A, ioaddr + RxConfig);
1234: return;
1235: } else {
1236: struct dev_mc_list *mclist;
1237:
1238: memset(mc_filter, 0, sizeof(mc_filter));
1239: for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
1240: i++, mclist = mclist->next)
1241: set_bit(ether_crc_le(ETH_ALEN, mclist->dmi_addr) & 0x3f,
1242: mc_filter);
1243: }
1244: /* ToDo: perhaps we need to stop the Tx and Rx process here? */
1245: if (memcmp(mc_filter, tp->mc_filter, sizeof(mc_filter))) {
1246: for (i = 0; i < 2; i++)
1247: outl(((u32 *)mc_filter)[i], ioaddr + MAR0 + i*4);
1248: memcpy(tp->mc_filter, mc_filter, sizeof(mc_filter));
1249: }
1250: if (rtl8129_debug > 3)
1251: printk(KERN_DEBUG"%s: set_rx_mode(%4.4x) done -- Rx config %8.8x.\n",
1252: dev->name, dev->flags, inl(ioaddr + RxConfig));
1253: return;
1254: }
1255:
1256: #ifdef MODULE
1257:
1258: /* An additional parameter that may be passed in... */
1259: static int debug = -1;
1260:
1261: int
1262: init_module(void)
1263: {
1264: int cards_found;
1265:
1266: if (debug >= 0)
1267: rtl8129_debug = debug;
1268:
1269: root_rtl8129_dev = NULL;
1270: cards_found = rtl8139_probe(0);
1271:
1272: return cards_found ? 0 : -ENODEV;
1273: }
1274:
1275: void
1276: cleanup_module(void)
1277: {
1278: struct device *next_dev;
1279:
1280: /* No need to check MOD_IN_USE, as sys_delete_module() checks. */
1281: while (root_rtl8129_dev) {
1282: next_dev = ((struct rtl8129_private *)root_rtl8129_dev->priv)->next_module;
1283: unregister_netdev(root_rtl8129_dev);
1284: release_region(root_rtl8129_dev->base_addr, RTL8129_TOTAL_SIZE);
1285: kfree(root_rtl8129_dev);
1286: root_rtl8129_dev = next_dev;
1287: }
1288: }
1289:
1290: #endif /* MODULE */
1291:
1292: /*
1293: * Local variables:
1294: * compile-command: "gcc -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c rtl8139.c `[ -f /usr/include/linux/modversions.h ] && echo -DMODVERSIONS`"
1295: * SMP-compile-command: "gcc -D__SMP__ -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c rtl8139.c `[ -f /usr/include/linux/modversions.h ] && echo -DMODVERSIONS`"
1296: * c-indent-level: 4
1297: * c-basic-offset: 4
1298: * tab-width: 4
1299: * End:
1300: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.