|
|
1.1 root 1: /* atp.c: Attached (pocket) ethernet adapter driver for linux. */
2: /*
3: This is a driver for commonly OEMed pocket (parallel port)
4: ethernet adapters based on the Realtek RTL8002 and RTL8012 chips.
5:
6: Written 1993-95,1997 by Donald Becker.
7:
8: Copyright 1993 United States Government as represented by the
9: Director, National Security Agency.
10:
11: This software may be used and distributed according to the terms
12: of the GNU Public License, incorporated herein by reference.
13:
14: The author may be reached as [email protected], or C/O
15: Center of Excellence in Space Data and Information Sciences
16: Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771
17:
18: The timer-based reset code was written by Bill Carlson, [email protected].
19: */
20:
21: static const char *version =
22: "atp.c:v1.08 4/1/97 Donald Becker ([email protected])\n";
23:
24: /* Operational parameters that may be safely changed. */
25: /* Time in jiffies before concluding the transmitter is hung. */
26: #define TX_TIMEOUT ((400*HZ)/1000)
27:
28: /*
29: This file is a device driver for the RealTek (aka AT-Lan-Tec) pocket
30: ethernet adapter. This is a common low-cost OEM pocket ethernet
31: adapter, sold under many names.
32:
33: Sources:
34: This driver was written from the packet driver assembly code provided by
35: Vincent Bono of AT-Lan-Tec. Ever try to figure out how a complicated
36: device works just from the assembly code? It ain't pretty. The following
37: description is written based on guesses and writing lots of special-purpose
38: code to test my theorized operation.
39:
40: In 1997 Realtek made available the documentation for the second generation
41: RTL8012 chip, which has lead to several driver improvements.
42: http://www.realtek.com.tw/cn/cn.html
43:
44: Theory of Operation
45:
46: The RTL8002 adapter seems to be built around a custom spin of the SEEQ
47: controller core. It probably has a 16K or 64K internal packet buffer, of
48: which the first 4K is devoted to transmit and the rest to receive.
49: The controller maintains the queue of received packet and the packet buffer
50: access pointer internally, with only 'reset to beginning' and 'skip to next
51: packet' commands visible. The transmit packet queue holds two (or more?)
52: packets: both 'retransmit this packet' (due to collision) and 'transmit next
53: packet' commands must be started by hand.
54:
55: The station address is stored in a standard bit-serial EEPROM which must be
56: read (ughh) by the device driver. (Provisions have been made for
57: substituting a 74S288 PROM, but I haven't gotten reports of any models
58: using it.) Unlike built-in devices, a pocket adapter can temporarily lose
59: power without indication to the device driver. The major effect is that
60: the station address, receive filter (promiscuous, etc.) and transceiver
61: must be reset.
62:
63: The controller itself has 16 registers, some of which use only the lower
64: bits. The registers are read and written 4 bits at a time. The four bit
65: register address is presented on the data lines along with a few additional
66: timing and control bits. The data is then read from status port or written
67: to the data port.
68:
69: Correction: the controller has two banks of 16 registers. The second
70: bank contains only the multicast filter table (now used) and the EEPROM
71: access registers.
72:
73: Since the bulk data transfer of the actual packets through the slow
74: parallel port dominates the driver's running time, four distinct data
75: (non-register) transfer modes are provided by the adapter, two in each
76: direction. In the first mode timing for the nibble transfers is
77: provided through the data port. In the second mode the same timing is
78: provided through the control port. In either case the data is read from
79: the status port and written to the data port, just as it is accessing
80: registers.
81:
82: In addition to the basic data transfer methods, several more are modes are
83: created by adding some delay by doing multiple reads of the data to allow
84: it to stabilize. This delay seems to be needed on most machines.
85:
86: The data transfer mode is stored in the 'dev->if_port' field. Its default
87: value is '4'. It may be overridden at boot-time using the third parameter
88: to the "ether=..." initialization.
89:
90: The header file <atp.h> provides inline functions that encapsulate the
91: register and data access methods. These functions are hand-tuned to
92: generate reasonable object code. This header file also documents my
93: interpretations of the device registers.
94: */
95: #include <linux/config.h>
96: #ifdef MODULE
97: #include <linux/module.h>
98: #include <linux/version.h>
99: #else
100: #define MOD_INC_USE_COUNT
101: #define MOD_DEC_USE_COUNT
102: #endif
103:
104: #include <linux/kernel.h>
105: #include <linux/sched.h>
106: #include <linux/types.h>
107: #include <linux/fcntl.h>
108: #include <linux/interrupt.h>
109: #include <linux/ptrace.h>
110: #include <linux/ioport.h>
111: #include <linux/in.h>
112: #include <linux/malloc.h>
113: #include <linux/string.h>
114: #include <asm/system.h>
115: #include <asm/bitops.h>
116: #include <asm/io.h>
117: #include <asm/dma.h>
118: #include <linux/errno.h>
119:
120: #include <linux/netdevice.h>
121: #include <linux/etherdevice.h>
122: #include <linux/skbuff.h>
123:
124: #include "atp.h"
125:
126: /* Kernel compatibility defines, common to David Hind's PCMCIA package.
127: This is only in the support-all-kernels source code. */
128: #include <linux/version.h> /* Evil, but neccessary */
129:
130: #if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE < 0x10300
131: #define RUN_AT(x) (x) /* What to put in timer->expires. */
132: #define DEV_ALLOC_SKB(len) alloc_skb(len, GFP_ATOMIC)
133: #define virt_to_bus(addr) ((unsigned long)addr)
134: #define bus_to_virt(addr) ((void*)addr)
135:
136: #else /* 1.3.0 and later */
137: #define RUN_AT(x) (jiffies + (x))
138: #define DEV_ALLOC_SKB(len) dev_alloc_skb(len + 2)
139: #endif
140: #if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE < 0x10338
141: #ifdef MODULE
142: #if !defined(CONFIG_MODVERSIONS) && !defined(__NO_VERSION__)
143: char kernel_version[] = UTS_RELEASE;
144: #endif
145: #else
146: #undef MOD_INC_USE_COUNT
147: #define MOD_INC_USE_COUNT
148: #undef MOD_DEC_USE_COUNT
149: #define MOD_DEC_USE_COUNT
150: #endif
151: #endif /* 1.3.38 */
152:
153: #if (LINUX_VERSION_CODE >= 0x10344)
154: #define NEW_MULTICAST
155: #include <linux/delay.h>
156: #endif
157:
158: #ifdef SA_SHIRQ
159: #define FREE_IRQ(irqnum, dev) free_irq(irqnum, dev)
160: #define REQUEST_IRQ(i,h,f,n, instance) request_irq(i,h,f,n, instance)
161: #define IRQ(irq, dev_id, pt_regs) (irq, dev_id, pt_regs)
162: #else
163: #define FREE_IRQ(irqnum, dev) free_irq(irqnum)
164: #define REQUEST_IRQ(i,h,f,n, instance) request_irq(i,h,f,n)
165: #define IRQ(irq, dev_id, pt_regs) (irq, pt_regs)
166: #endif
167: /* End of kernel compatibility defines. */
168:
169: /* use 0 for production, 1 for verification, >2 for debug */
170: #ifndef NET_DEBUG
171: #define NET_DEBUG 1
172: #endif
173: static unsigned int net_debug = NET_DEBUG;
174:
175: /* The number of low I/O ports used by the ethercard. */
176: #define ETHERCARD_TOTAL_SIZE 3
177:
178: /* Sequence to switch an 8012 from printer mux to ethernet mode. */
179: static char mux_8012[] = { 0xff, 0xf7, 0xff, 0xfb, 0xf3, 0xfb, 0xff, 0xf7,};
180:
181: /* This code, written by [email protected], resets the adapter every
182: TIMED_CHECKER ticks. This recovers from an unknown error which
183: hangs the device. */
184: #define TIMED_CHECKER (HZ/4)
185: #ifdef TIMED_CHECKER
186: #include <linux/timer.h>
187: static void atp_timed_checker(unsigned long ignored);
188: #endif
189:
190: /* Index to functions, as function prototypes. */
191:
192: extern int atp_init(struct device *dev);
193:
194: static int atp_probe1(struct device *dev, short ioaddr);
195: static void get_node_ID(struct device *dev);
196: static unsigned short eeprom_op(short ioaddr, unsigned int cmd);
197: static int net_open(struct device *dev);
198: static void hardware_init(struct device *dev);
199: static void write_packet(short ioaddr, int length, unsigned char *packet, int mode);
200: static void trigger_send(short ioaddr, int length);
201: static int net_send_packet(struct sk_buff *skb, struct device *dev);
202: static void net_interrupt IRQ(int irq, void *dev_id, struct pt_regs *regs);
203: static void net_rx(struct device *dev);
204: static void read_block(short ioaddr, int length, unsigned char *buffer, int data_mode);
205: static int net_close(struct device *dev);
206: static struct enet_statistics *net_get_stats(struct device *dev);
207: #ifdef NEW_MULTICAST
208: static void set_rx_mode_8002(struct device *dev);
209: static void set_rx_mode_8012(struct device *dev);
210: #else
211: static void set_rx_mode_8002(struct device *dev, int num_addrs, void *addrs);
212: static void set_rx_mode_8012(struct device *dev, int num_addrs, void *addrs);
213: #endif
214:
215:
216: /* A list of all installed ATP devices, for removing the driver module. */
217: static struct device *root_atp_dev = NULL;
218:
219: /* Check for a network adapter of this type, and return '0' iff one exists.
220: If dev->base_addr == 0, probe all likely locations.
221: If dev->base_addr == 1, always return failure.
222: If dev->base_addr == 2, allocate space for the device and return success
223: (detachable devices only).
224: */
225: int
226: atp_init(struct device *dev)
227: {
228: int *port, ports[] = {0x378, 0x278, 0x3bc, 0};
229: int base_addr = dev ? dev->base_addr : 0;
230:
231: if (base_addr > 0x1ff) /* Check a single specified location. */
232: return atp_probe1(dev, base_addr);
233: else if (base_addr == 1) /* Don't probe at all. */
234: return ENXIO;
235:
236: for (port = ports; *port; port++) {
237: int ioaddr = *port;
238: outb(0x57, ioaddr + PAR_DATA);
239: if (inb(ioaddr + PAR_DATA) != 0x57)
240: continue;
241: if (atp_probe1(dev, ioaddr) == 0)
242: return 0;
243: }
244:
245: return ENODEV;
246: }
247:
248: static int atp_probe1(struct device *dev, short ioaddr)
249: {
250: struct net_local *lp;
251: int saved_ctrl_reg, status, i;
252:
253: outb(0xff, ioaddr + PAR_DATA);
254: /* Save the original value of the Control register, in case we guessed
255: wrong. */
256: saved_ctrl_reg = inb(ioaddr + PAR_CONTROL);
257: /* IRQEN=0, SLCTB=high INITB=high, AUTOFDB=high, STBB=high. */
258: outb(0x04, ioaddr + PAR_CONTROL);
259: /* Turn off the printer multiplexer on the 8012. */
260: for (i = 0; i < 8; i++)
261: outb(mux_8012[i], ioaddr + PAR_DATA);
262: write_reg_high(ioaddr, CMR1, CMR1h_RESET);
263: eeprom_delay(2048);
264: status = read_nibble(ioaddr, CMR1);
265:
266: if ((status & 0x78) != 0x08) {
267: /* The pocket adapter probe failed, restore the control register. */
268: outb(saved_ctrl_reg, ioaddr + PAR_CONTROL);
269: return 1;
270: }
271: status = read_nibble(ioaddr, CMR2_h);
272: if ((status & 0x78) != 0x10) {
273: outb(saved_ctrl_reg, ioaddr + PAR_CONTROL);
274: return 1;
275: }
276:
277: dev = init_etherdev(dev, sizeof(struct net_local));
278:
279: /* Find the IRQ used by triggering an interrupt. */
280: write_reg_byte(ioaddr, CMR2, 0x01); /* No accept mode, IRQ out. */
281: write_reg_high(ioaddr, CMR1, CMR1h_RxENABLE | CMR1h_TxENABLE); /* Enable Tx and Rx. */
282:
283: /* Omit autoIRQ routine for now. Use "table lookup" instead. Uhgggh. */
284: if (ioaddr == 0x378)
285: dev->irq = 7;
286: else
287: dev->irq = 5;
288: write_reg_high(ioaddr, CMR1, CMR1h_TxRxOFF); /* Disable Tx and Rx units. */
289: write_reg(ioaddr, CMR2, CMR2_NULL);
290:
291: dev->base_addr = ioaddr;
292:
293: /* Read the station address PROM. */
294: get_node_ID(dev);
295:
296: printk("%s: Pocket adapter found at %#3lx, IRQ %d, SAPROM "
297: "%02X:%02X:%02X:%02X:%02X:%02X.\n", dev->name, dev->base_addr,
298: dev->irq, dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
299: dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
300:
301: /* Reset the ethernet hardware and activate the printer pass-through. */
302: write_reg_high(ioaddr, CMR1, CMR1h_RESET | CMR1h_MUX);
303:
304: if (net_debug)
305: printk(version);
306:
307: /* Initialize the device structure. */
308: ether_setup(dev);
309: if (dev->priv == NULL)
310: dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
311: if (dev->priv == NULL)
312: return -ENOMEM;
313: memset(dev->priv, 0, sizeof(struct net_local));
314:
315: lp = (struct net_local *)dev->priv;
316: lp->chip_type = RTL8002;
317: lp->addr_mode = CMR2h_Normal;
318:
319: lp->next_module = root_atp_dev;
320: root_atp_dev = dev;
321:
322: /* For the ATP adapter the "if_port" is really the data transfer mode. */
323: dev->if_port = (dev->mem_start & 0xf) ? (dev->mem_start & 0x7) : 4;
324: if (dev->mem_end & 0xf)
325: net_debug = dev->mem_end & 7;
326:
327: dev->open = net_open;
328: dev->stop = net_close;
329: dev->hard_start_xmit = net_send_packet;
330: dev->get_stats = net_get_stats;
331: dev->set_multicast_list =
332: lp->chip_type == RTL8002 ? &set_rx_mode_8002 : &set_rx_mode_8012;
333:
334: return 0;
335: }
336:
337: /* Read the station address PROM, usually a word-wide EEPROM. */
338: static void get_node_ID(struct device *dev)
339: {
340: short ioaddr = dev->base_addr;
341: int sa_offset = 0;
342: int i;
343:
344: write_reg(ioaddr, CMR2, CMR2_EEPROM); /* Point to the EEPROM control registers. */
345:
346: /* Some adapters have the station address at offset 15 instead of offset
347: zero. Check for it, and fix it if needed. */
348: if (eeprom_op(ioaddr, EE_READ(0)) == 0xffff)
349: sa_offset = 15;
350:
351: for (i = 0; i < 3; i++)
352: ((unsigned short *)dev->dev_addr)[i] =
353: ntohs(eeprom_op(ioaddr, EE_READ(sa_offset + i)));
354:
355: write_reg(ioaddr, CMR2, CMR2_NULL);
356: }
357:
358: /*
359: An EEPROM read command starts by shifting out 0x60+address, and then
360: shifting in the serial data. See the NatSemi databook for details.
361: * ________________
362: * CS : __|
363: * ___ ___
364: * CLK: ______| |___| |
365: * __ _______ _______
366: * DI : __X_______X_______X
367: * DO : _________X_______X
368: */
369:
370: static unsigned short eeprom_op(short ioaddr, unsigned int cmd)
371: {
372: unsigned eedata_out = 0;
373: int num_bits = EE_CMD_SIZE;
374:
375: while (--num_bits >= 0) {
376: char outval = test_bit(num_bits, &cmd) ? EE_DATA_WRITE : 0;
377: write_reg_high(ioaddr, PROM_CMD, outval | EE_CLK_LOW);
378: eeprom_delay(5);
379: write_reg_high(ioaddr, PROM_CMD, outval | EE_CLK_HIGH);
380: eedata_out <<= 1;
381: if (read_nibble(ioaddr, PROM_DATA) & EE_DATA_READ)
382: eedata_out++;
383: eeprom_delay(5);
384: }
385: write_reg_high(ioaddr, PROM_CMD, EE_CLK_LOW & ~EE_CS);
386: return eedata_out;
387: }
388:
389:
390: /* Open/initialize the board. This is called (in the current kernel)
391: sometime after booting when the 'ifconfig' program is run.
392:
393: This routine sets everything up anew at each open, even
394: registers that "should" only need to be set once at boot, so that
395: there is non-reboot way to recover if something goes wrong.
396:
397: This is an attachable device: if there is no dev->priv entry then it wasn't
398: probed for at boot-time, and we need to probe for it again.
399: */
400: static int net_open(struct device *dev)
401: {
402: struct net_local *lp = (struct net_local *)dev->priv;
403:
404: /* The interrupt line is turned off (tri-stated) when the device isn't in
405: use. That's especially important for "attached" interfaces where the
406: port or interrupt may be shared. */
407: #ifndef SA_SHIRQ
408: if (irq2dev_map[dev->irq] != 0
409: || (irq2dev_map[dev->irq] = dev) == 0
410: || REQUEST_IRQ(dev->irq, &net_interrupt, 0, "ATP", dev)) {
411: return -EAGAIN;
412: }
413: #else
414: if (request_irq(dev->irq, &net_interrupt, 0, "ATP Ethernet", dev))
415: return -EAGAIN;
416: #endif
417:
418: MOD_INC_USE_COUNT;
419: hardware_init(dev);
420: dev->start = 1;
421:
422: init_timer(&lp->timer);
423: lp->timer.expires = RUN_AT(TIMED_CHECKER);
424: lp->timer.data = (unsigned long)dev;
425: lp->timer.function = &atp_timed_checker; /* timer handler */
426: add_timer(&lp->timer);
427:
428: return 0;
429: }
430:
431: /* This routine resets the hardware. We initialize everything, assuming that
432: the hardware may have been temporarily detached. */
433: static void hardware_init(struct device *dev)
434: {
435: struct net_local *lp = (struct net_local *)dev->priv;
436: int ioaddr = dev->base_addr;
437: int i;
438:
439: /* Turn off the printer multiplexer on the 8012. */
440: for (i = 0; i < 8; i++)
441: outb(mux_8012[i], ioaddr + PAR_DATA);
442: write_reg_high(ioaddr, CMR1, CMR1h_RESET);
443:
444: for (i = 0; i < 6; i++)
445: write_reg_byte(ioaddr, PAR0 + i, dev->dev_addr[i]);
446:
447: write_reg_high(ioaddr, CMR2, lp->addr_mode);
448:
449: if (net_debug > 2) {
450: printk("%s: Reset: current Rx mode %d.\n", dev->name,
451: (read_nibble(ioaddr, CMR2_h) >> 3) & 0x0f);
452: }
453:
454: write_reg(ioaddr, CMR2, CMR2_IRQOUT);
455: write_reg_high(ioaddr, CMR1, CMR1h_RxENABLE | CMR1h_TxENABLE);
456:
457: /* Enable the interrupt line from the serial port. */
458: outb(Ctrl_SelData + Ctrl_IRQEN, ioaddr + PAR_CONTROL);
459:
460: /* Unmask the interesting interrupts. */
461: write_reg(ioaddr, IMR, ISR_RxOK | ISR_TxErr | ISR_TxOK);
462: write_reg_high(ioaddr, IMR, ISRh_RxErr);
463:
464: lp->tx_unit_busy = 0;
465: lp->pac_cnt_in_tx_buf = 0;
466: lp->saved_tx_size = 0;
467:
468: dev->tbusy = 0;
469: dev->interrupt = 0;
470: }
471:
472: static void trigger_send(short ioaddr, int length)
473: {
474: write_reg_byte(ioaddr, TxCNT0, length & 0xff);
475: write_reg(ioaddr, TxCNT1, length >> 8);
476: write_reg(ioaddr, CMR1, CMR1_Xmit);
477: }
478:
479: static void write_packet(short ioaddr, int length, unsigned char *packet, int data_mode)
480: {
481: length = (length + 1) & ~1; /* Round up to word length. */
482: outb(EOC+MAR, ioaddr + PAR_DATA);
483: if ((data_mode & 1) == 0) {
484: /* Write the packet out, starting with the write addr. */
485: outb(WrAddr+MAR, ioaddr + PAR_DATA);
486: do {
487: write_byte_mode0(ioaddr, *packet++);
488: } while (--length > 0) ;
489: } else {
490: /* Write the packet out in slow mode. */
491: unsigned char outbyte = *packet++;
492:
493: outb(Ctrl_LNibWrite + Ctrl_IRQEN, ioaddr + PAR_CONTROL);
494: outb(WrAddr+MAR, ioaddr + PAR_DATA);
495:
496: outb((outbyte & 0x0f)|0x40, ioaddr + PAR_DATA);
497: outb(outbyte & 0x0f, ioaddr + PAR_DATA);
498: outbyte >>= 4;
499: outb(outbyte & 0x0f, ioaddr + PAR_DATA);
500: outb(Ctrl_HNibWrite + Ctrl_IRQEN, ioaddr + PAR_CONTROL);
501: while (--length > 0)
502: write_byte_mode1(ioaddr, *packet++);
503: }
504: /* Terminate the Tx frame. End of write: ECB. */
505: outb(0xff, ioaddr + PAR_DATA);
506: outb(Ctrl_HNibWrite | Ctrl_SelData | Ctrl_IRQEN, ioaddr + PAR_CONTROL);
507: }
508:
509: static int
510: net_send_packet(struct sk_buff *skb, struct device *dev)
511: {
512: struct net_local *lp = (struct net_local *)dev->priv;
513: int ioaddr = dev->base_addr;
514:
515: #ifndef final_version
516: if (skb == NULL || skb->len <= 0) {
517: printk("%s: Obsolete driver layer request made: skbuff==NULL.\n",
518: dev->name);
519: dev_tint(dev);
520: return 0;
521: }
522: #endif
523:
524: /* Use transmit-while-tbusy as a crude error timer. */
525: if (set_bit(0, (void*)&dev->tbusy) != 0) {
526: if (jiffies - dev->trans_start < TX_TIMEOUT)
527: return 1;
528: printk("%s: transmit timed out, %s?\n", dev->name,
529: inb(ioaddr + PAR_CONTROL) & 0x10 ? "network cable problem"
530: : "IRQ conflict");
531: lp->stats.tx_errors++;
532: /* Try to restart the adapter. */
533: hardware_init(dev);
534: dev->tbusy=0;
535: dev->trans_start = jiffies;
536: return 1;
537: } else {
538: short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
539: unsigned char *buf = skb->data;
540: int flags;
541:
542: /* Disable interrupts by writing 0x00 to the Interrupt Mask Register.
543: This sequence must not be interrupted by an incoming packet. */
544: save_flags(flags);
545: cli();
546: write_reg(ioaddr, IMR, 0);
547: write_reg_high(ioaddr, IMR, 0);
548: restore_flags(flags);
549:
550: write_packet(ioaddr, length, buf, dev->if_port);
551:
552: lp->pac_cnt_in_tx_buf++;
553: if (lp->tx_unit_busy == 0) {
554: trigger_send(ioaddr, length);
555: lp->saved_tx_size = 0; /* Redundant */
556: lp->re_tx = 0;
557: lp->tx_unit_busy = 1;
558: } else
559: lp->saved_tx_size = length;
560:
561: dev->trans_start = jiffies;
562: /* Re-enable the LPT interrupts. */
563: write_reg(ioaddr, IMR, ISR_RxOK | ISR_TxErr | ISR_TxOK);
564: write_reg_high(ioaddr, IMR, ISRh_RxErr);
565: }
566:
567: dev_kfree_skb (skb, FREE_WRITE);
568:
569: return 0;
570: }
571:
572: /* The typical workload of the driver:
573: Handle the network interface interrupts. */
574: static void
575: net_interrupt IRQ(int irq, void *dev_instance, struct pt_regs * regs)
576: {
577: #ifdef SA_SHIRQ
578: struct device *dev = (struct device *)dev_instance;
579: #else
580: struct device *dev = (struct device *)(irq2dev_map[irq]);
581: #endif
582: struct net_local *lp;
583: int ioaddr, status, boguscount = 20;
584: static int num_tx_since_rx = 0;
585:
586: if (dev == NULL) {
587: printk ("ATP_interrupt(): irq %d for unknown device.\n", irq);
588: return;
589: }
590: dev->interrupt = 1;
591:
592: ioaddr = dev->base_addr;
593: lp = (struct net_local *)dev->priv;
594:
595: /* Disable additional spurious interrupts. */
596: outb(Ctrl_SelData, ioaddr + PAR_CONTROL);
597:
598: /* The adapter's output is currently the IRQ line, switch it to data. */
599: write_reg(ioaddr, CMR2, CMR2_NULL);
600: write_reg(ioaddr, IMR, 0);
601:
602: if (net_debug > 5) printk("%s: In interrupt ", dev->name);
603: while (--boguscount > 0) {
604: status = read_nibble(ioaddr, ISR);
605: if (net_debug > 5) printk("loop status %02x..", status);
606:
607: if (status & (ISR_RxOK<<3)) {
608: write_reg(ioaddr, ISR, ISR_RxOK); /* Clear the Rx interrupt. */
609: do {
610: int read_status = read_nibble(ioaddr, CMR1);
611: if (net_debug > 6)
612: printk("handling Rx packet %02x..", read_status);
613: /* We acknowledged the normal Rx interrupt, so if the interrupt
614: is still outstanding we must have a Rx error. */
615: if (read_status & (CMR1_IRQ << 3)) { /* Overrun. */
616: lp->stats.rx_over_errors++;
617: /* Set to no-accept mode long enough to remove a packet. */
618: write_reg_high(ioaddr, CMR2, CMR2h_OFF);
619: net_rx(dev);
620: /* Clear the interrupt and return to normal Rx mode. */
621: write_reg_high(ioaddr, ISR, ISRh_RxErr);
622: write_reg_high(ioaddr, CMR2, lp->addr_mode);
623: } else if ((read_status & (CMR1_BufEnb << 3)) == 0) {
624: net_rx(dev);
625: dev->last_rx = jiffies;
626: num_tx_since_rx = 0;
627: } else
628: break;
629: } while (--boguscount > 0);
630: } else if (status & ((ISR_TxErr + ISR_TxOK)<<3)) {
631: if (net_debug > 6) printk("handling Tx done..");
632: /* Clear the Tx interrupt. We should check for too many failures
633: and reinitialize the adapter. */
634: write_reg(ioaddr, ISR, ISR_TxErr + ISR_TxOK);
635: if (status & (ISR_TxErr<<3)) {
636: lp->stats.collisions++;
637: if (++lp->re_tx > 15) {
638: lp->stats.tx_aborted_errors++;
639: hardware_init(dev);
640: break;
641: }
642: /* Attempt to retransmit. */
643: if (net_debug > 6) printk("attempting to ReTx");
644: write_reg(ioaddr, CMR1, CMR1_ReXmit + CMR1_Xmit);
645: } else {
646: /* Finish up the transmit. */
647: lp->stats.tx_packets++;
648: lp->pac_cnt_in_tx_buf--;
649: if ( lp->saved_tx_size) {
650: trigger_send(ioaddr, lp->saved_tx_size);
651: lp->saved_tx_size = 0;
652: lp->re_tx = 0;
653: } else
654: lp->tx_unit_busy = 0;
655: dev->tbusy = 0;
656: mark_bh(NET_BH); /* Inform upper layers. */
657: }
658: num_tx_since_rx++;
659: } else if (num_tx_since_rx > 8
660: && jiffies > dev->last_rx + 100) {
661: if (net_debug > 2)
662: printk("%s: Missed packet? No Rx after %d Tx and %ld jiffies"
663: " status %02x CMR1 %02x.\n", dev->name,
664: num_tx_since_rx, jiffies - dev->last_rx, status,
665: (read_nibble(ioaddr, CMR1) >> 3) & 15);
666: lp->stats.rx_missed_errors++;
667: hardware_init(dev);
668: num_tx_since_rx = 0;
669: break;
670: } else
671: break;
672: }
673:
674: /* This following code fixes a rare (and very difficult to track down)
675: problem where the adapter forgets its ethernet address. */
676: {
677: int i;
678: for (i = 0; i < 6; i++)
679: write_reg_byte(ioaddr, PAR0 + i, dev->dev_addr[i]);
680: }
681:
682: /* Tell the adapter that it can go back to using the output line as IRQ. */
683: write_reg(ioaddr, CMR2, CMR2_IRQOUT);
684: /* Enable the physical interrupt line, which is sure to be low until.. */
685: outb(Ctrl_SelData + Ctrl_IRQEN, ioaddr + PAR_CONTROL);
686: /* .. we enable the interrupt sources. */
687: write_reg(ioaddr, IMR, ISR_RxOK | ISR_TxErr | ISR_TxOK);
688: write_reg_high(ioaddr, IMR, ISRh_RxErr); /* Hmmm, really needed? */
689:
690: if (net_debug > 5) printk("exiting interrupt.\n");
691:
692: dev->interrupt = 0;
693:
694: return;
695: }
696:
697: #ifdef TIMED_CHECKER
698: /* This following code fixes a rare (and very difficult to track down)
699: problem where the adapter forgets its ethernet address. */
700: static void atp_timed_checker(unsigned long data)
701: {
702: struct device *dev = (struct device *)data;
703: int ioaddr = dev->base_addr;
704: struct net_local *lp = (struct net_local *)dev->priv;
705: int tickssofar = jiffies - lp->last_rx_time;
706: int i;
707:
708: if (tickssofar > 2*HZ && dev->interrupt == 0) {
709: #if 1
710: for (i = 0; i < 6; i++)
711: write_reg_byte(ioaddr, PAR0 + i, dev->dev_addr[i]);
712: lp->last_rx_time = jiffies;
713: #else
714: for (i = 0; i < 6; i++)
715: if (read_cmd_byte(ioaddr, PAR0 + i) != atp_timed_dev->dev_addr[i])
716: {
717: struct net_local *lp = (struct net_local *)atp_timed_dev->priv;
718: write_reg_byte(ioaddr, PAR0 + i, atp_timed_dev->dev_addr[i]);
719: if (i == 2)
720: lp->stats.tx_errors++;
721: else if (i == 3)
722: lp->stats.tx_dropped++;
723: else if (i == 4)
724: lp->stats.collisions++;
725: else
726: lp->stats.rx_errors++;
727: }
728: #endif
729: }
730: lp->timer.expires = RUN_AT(TIMED_CHECKER);
731: add_timer(&lp->timer);
732: }
733: #endif
734:
735: /* We have a good packet(s), get it/them out of the buffers. */
736: static void net_rx(struct device *dev)
737: {
738: struct net_local *lp = (struct net_local *)dev->priv;
739: int ioaddr = dev->base_addr;
740: struct rx_header rx_head;
741:
742: /* Process the received packet. */
743: outb(EOC+MAR, ioaddr + PAR_DATA);
744: read_block(ioaddr, 8, (unsigned char*)&rx_head, dev->if_port);
745: if (net_debug > 5)
746: printk(" rx_count %04x %04x %04x %04x..", rx_head.pad,
747: rx_head.rx_count, rx_head.rx_status, rx_head.cur_addr);
748: if ((rx_head.rx_status & 0x77) != 0x01) {
749: lp->stats.rx_errors++;
750: if (rx_head.rx_status & 0x0004) lp->stats.rx_frame_errors++;
751: else if (rx_head.rx_status & 0x0002) lp->stats.rx_crc_errors++;
752: if (net_debug > 3) printk("%s: Unknown ATP Rx error %04x.\n",
753: dev->name, rx_head.rx_status);
754: if (rx_head.rx_status & 0x0020) {
755: lp->stats.rx_fifo_errors++;
756: write_reg_high(ioaddr, CMR1, CMR1h_TxENABLE);
757: write_reg_high(ioaddr, CMR1, CMR1h_RxENABLE | CMR1h_TxENABLE);
758: } else if (rx_head.rx_status & 0x0050)
759: hardware_init(dev);
760: return;
761: } else {
762: /* Malloc up new buffer. The "-4" is omits the FCS (CRC). */
763: int pkt_len = (rx_head.rx_count & 0x7ff) - 4;
764: struct sk_buff *skb;
765:
766: skb = DEV_ALLOC_SKB(pkt_len + 2);
767: if (skb == NULL) {
768: printk("%s: Memory squeeze, dropping packet.\n", dev->name);
769: lp->stats.rx_dropped++;
770: goto done;
771: }
772: skb->dev = dev;
773:
774: #if LINUX_VERSION_CODE >= 0x10300
775: skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */
776: read_block(ioaddr, pkt_len, skb_put(skb,pkt_len), dev->if_port);
777: skb->protocol = eth_type_trans(skb, dev);
778: #else
779: read_block(ioaddr, pkt_len, skb->data, dev->if_port);
780: skb->len = pkt_len;
781: #endif
782: netif_rx(skb);
783: lp->stats.rx_packets++;
784: }
785: done:
786: write_reg(ioaddr, CMR1, CMR1_NextPkt);
787: lp->last_rx_time = jiffies;
788: return;
789: }
790:
791: static void read_block(short ioaddr, int length, unsigned char *p, int data_mode)
792: {
793:
794: if (data_mode <= 3) { /* Mode 0 or 1 */
795: outb(Ctrl_LNibRead, ioaddr + PAR_CONTROL);
796: outb(length == 8 ? RdAddr | HNib | MAR : RdAddr | MAR,
797: ioaddr + PAR_DATA);
798: if (data_mode <= 1) { /* Mode 0 or 1 */
799: do *p++ = read_byte_mode0(ioaddr); while (--length > 0);
800: } else /* Mode 2 or 3 */
801: do *p++ = read_byte_mode2(ioaddr); while (--length > 0);
802: } else if (data_mode <= 5)
803: do *p++ = read_byte_mode4(ioaddr); while (--length > 0);
804: else
805: do *p++ = read_byte_mode6(ioaddr); while (--length > 0);
806:
807: outb(EOC+HNib+MAR, ioaddr + PAR_DATA);
808: outb(Ctrl_SelData, ioaddr + PAR_CONTROL);
809: }
810:
811: /* The inverse routine to net_open(). */
812: static int
813: net_close(struct device *dev)
814: {
815: struct net_local *lp = (struct net_local *)dev->priv;
816: int ioaddr = dev->base_addr;
817:
818: dev->tbusy = 1;
819: dev->start = 0;
820:
821: del_timer(&lp->timer);
822:
823: /* Flush the Tx and disable Rx here. */
824: lp->addr_mode = CMR2h_OFF;
825: write_reg_high(ioaddr, CMR2, CMR2h_OFF);
826:
827: /* Free the IRQ line. */
828: outb(0x00, ioaddr + PAR_CONTROL);
829: FREE_IRQ(dev->irq, dev);
830: #ifndef SA_SHIRQ
831: irq2dev_map[dev->irq] = 0;
832: #endif
833:
834: /* Reset the ethernet hardware and activate the printer pass-through. */
835: write_reg_high(ioaddr, CMR1, CMR1h_RESET | CMR1h_MUX);
836:
837: MOD_DEC_USE_COUNT;
838:
839: return 0;
840: }
841:
842: /* Get the current statistics. This may be called with the card open or
843: closed. */
844: static struct enet_statistics *
845: net_get_stats(struct device *dev)
846: {
847: struct net_local *lp = (struct net_local *)dev->priv;
848: return &lp->stats;
849: }
850:
851: /*
852: * Set or clear the multicast filter for this adapter.
853: */
854:
855: /* The little-endian AUTODIN32 ethernet CRC calculation.
856: This is common code and should be moved to net/core/crc.c */
857: static unsigned const ethernet_polynomial_le = 0xedb88320U;
858: static inline unsigned ether_crc_le(int length, unsigned char *data)
859: {
860: unsigned int crc = 0xffffffff; /* Initial value. */
861: while(--length >= 0) {
862: unsigned char current_octet = *data++;
863: int bit;
864: for (bit = 8; --bit >= 0; current_octet >>= 1) {
865: if ((crc ^ current_octet) & 1) {
866: crc >>= 1;
867: crc ^= ethernet_polynomial_le;
868: } else
869: crc >>= 1;
870: }
871: }
872: return crc;
873: }
874:
875: static void
876: #ifdef NEW_MULTICAST
877: set_rx_mode_8002(struct device *dev)
878: #else
879: static void set_rx_mode_8002(struct device *dev, int num_addrs, void *addrs);
880: #endif
881: {
882: struct net_local *lp = (struct net_local *)dev->priv;
883: short ioaddr = dev->base_addr;
884:
885: if ( dev->mc_count > 0 || (dev->flags & (IFF_ALLMULTI|IFF_PROMISC))) {
886: /* We must make the kernel realise we had to move
887: * into promisc mode or we start all out war on
888: * the cable. - AC
889: */
890: dev->flags|=IFF_PROMISC;
891: lp->addr_mode = CMR2h_PROMISC;
892: } else
893: lp->addr_mode = CMR2h_Normal;
894: write_reg_high(ioaddr, CMR2, lp->addr_mode);
895: }
896:
897: static void
898: #ifdef NEW_MULTICAST
899: set_rx_mode_8012(struct device *dev)
900: #else
901: static void set_rx_mode_8012(struct device *dev, int num_addrs, void *addrs);
902: #endif
903: {
904: struct net_local *lp = (struct net_local *)dev->priv;
905: short ioaddr = dev->base_addr;
906: unsigned char new_mode, mc_filter[8]; /* Multicast hash filter */
907: int i;
908:
909: if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */
910: new_mode = CMR2h_PROMISC;
911: } else if ((dev->mc_count > 1000) || (dev->flags & IFF_ALLMULTI)) {
912: /* Too many to filter perfectly -- accept all multicasts. */
913: memset(mc_filter, 0xff, sizeof(mc_filter));
914: new_mode = CMR2h_Normal;
915: } else {
916: struct dev_mc_list *mclist;
917:
918: memset(mc_filter, 0, sizeof(mc_filter));
919: for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
920: i++, mclist = mclist->next)
921: set_bit(ether_crc_le(ETH_ALEN, mclist->dmi_addr) & 0x3f,
922: mc_filter);
923: new_mode = CMR2h_Normal;
924: }
925: lp->addr_mode = new_mode;
926: write_reg(ioaddr, CMR2, CMR2_IRQOUT | 0x04); /* Switch to page 1. */
927: for (i = 0; i < 8; i++)
928: write_reg_byte(ioaddr, i, mc_filter[i]);
929: if (net_debug > 2 || 1) {
930: lp->addr_mode = 1;
931: printk("%s: Mode %d, setting multicast filter to",
932: dev->name, lp->addr_mode);
933: for (i = 0; i < 8; i++)
934: printk(" %2.2x", mc_filter[i]);
935: printk(".\n");
936: }
937:
938: write_reg_high(ioaddr, CMR2, lp->addr_mode);
939: write_reg(ioaddr, CMR2, CMR2_IRQOUT); /* Switch back to page 0 */
940: }
941:
942: #ifdef MODULE
943: static int debug = 1;
944: int
945: init_module(void)
946: {
947: net_debug = debug;
948: root_atp_dev = NULL;
949: atp_init(0);
950: return 0;
951: }
952:
953: void
954: cleanup_module(void)
955: {
956: struct device *next_dev;
957:
958: /* No need to check MOD_IN_USE, as sys_delete_module() checks. */
959: /* No need to release_region(), since we never snarf it. */
960: while (root_atp_dev) {
961: next_dev = ((struct net_local *)root_atp_dev->priv)->next_module;
962: unregister_netdev(root_atp_dev);
963: kfree(root_atp_dev);
964: root_atp_dev = next_dev;
965: }
966: }
967: #endif /* MODULE */
968:
969:
970: /*
971: * Local variables:
972: * compile-command: "gcc -DMODULE -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -c atp.c"
973: * version-control: t
974: * kept-new-versions: 5
975: * tab-width: 4
976: * End:
977: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.