Ok. I didn't make 2.4.0 in 2000. Tough. I tried, but we had some
[davej-history.git] / drivers / net / znet.c
blobd4e52f92b9ca5dce0f6241de8356daf24381fd1b
1 /* znet.c: An Zenith Z-Note ethernet driver for linux. */
3 static const char*version ="znet.c:v1.02 9/23/94 becker@cesdis.gsfc.nasa.gov\n";
5 /*
6 Written by Donald Becker.
8 The author may be reached as becker@cesdis.gsfc.nasa.gov.
9 This driver is based on the Linux skeleton driver. The copyright of the
10 skeleton driver is held by the United States Government, as represented
11 by DIRNSA, and it is released under the GPL.
13 Thanks to Mike Hollick for alpha testing and suggestions.
15 References:
16 The Crynwr packet driver.
18 "82593 CSMA/CD Core LAN Controller" Intel datasheet, 1992
19 Intel Microcommunications Databook, Vol. 1, 1990.
20 As usual with Intel, the documentation is incomplete and inaccurate.
21 I had to read the Crynwr packet driver to figure out how to actually
22 use the i82593, and guess at what register bits matched the loosely
23 related i82586.
25 Theory of Operation
27 The i82593 used in the Zenith Z-Note series operates using two(!) slave
28 DMA channels, one interrupt, and one 8-bit I/O port.
30 While there several ways to configure '593 DMA system, I chose the one
31 that seemed commensurate with the highest system performance in the face
32 of moderate interrupt latency: Both DMA channels are configured as
33 recirculating ring buffers, with one channel (#0) dedicated to Rx and
34 the other channel (#1) to Tx and configuration. (Note that this is
35 different than the Crynwr driver, where the Tx DMA channel is initialized
36 before each operation. That approach simplifies operation and Tx error
37 recovery, but requires additional I/O in normal operation and precludes
38 transmit buffer chaining.)
40 Both rings are set to 8192 bytes using {TX,RX}_RING_SIZE. This provides
41 a reasonable ring size for Rx, while simplifying DMA buffer allocation --
42 DMA buffers must not cross a 128K boundary. (In truth the size selection
43 was influenced by my lack of '593 documentation. I thus was constrained
44 to use the Crynwr '593 initialization table, which sets the Rx ring size
45 to 8K.)
47 Despite my usual low opinion about Intel-designed parts, I must admit
48 that the bulk data handling of the i82593 is a good design for
49 an integrated system, like a laptop, where using two slave DMA channels
50 doesn't pose a problem. I still take issue with using only a single I/O
51 port. In the same controlled environment there are essentially no
52 limitations on I/O space, and using multiple locations would eliminate
53 the need for multiple operations when looking at status registers,
54 setting the Rx ring boundary, or switching to promiscuous mode.
56 I also question Zenith's selection of the '593: one of the advertised
57 advantages of earlier Intel parts was that if you figured out the magic
58 initialization incantation you could use the same part on many different
59 network types. Zenith's use of the "FriendlyNet" (sic) connector rather
60 than an on-board transceiver leads me to believe that they were planning
61 to take advantage of this. But, uhmmm, the '593 omits all but ethernet
62 functionality from the serial subsystem.
65 #include <linux/kernel.h>
66 #include <linux/sched.h>
67 #include <linux/string.h>
68 #include <linux/ptrace.h>
69 #include <linux/errno.h>
70 #include <linux/interrupt.h>
71 #include <linux/ioport.h>
72 #include <linux/init.h>
73 #include <asm/system.h>
74 #include <asm/bitops.h>
75 #include <asm/io.h>
76 #include <asm/dma.h>
78 #include <linux/netdevice.h>
79 #include <linux/etherdevice.h>
80 #include <linux/skbuff.h>
81 #include <linux/if_arp.h>
83 #ifndef ZNET_DEBUG
84 #define ZNET_DEBUG 1
85 #endif
86 static unsigned int znet_debug = ZNET_DEBUG;
88 /* The DMA modes we need aren't in <dma.h>. */
89 #define DMA_RX_MODE 0x14/* Auto init, I/O to mem, ++, demand. */
90 #define DMA_TX_MODE 0x18/* Auto init, Mem to I/O, ++, demand. */
91 #define dma_page_eq(ptr1, ptr2) ((long)(ptr1)>>17 == (long)(ptr2)>>17)
92 #define DMA_BUF_SIZE 8192
93 #define RX_BUF_SIZE 8192
94 #define TX_BUF_SIZE 8192
96 /* Commands to the i82593 channel 0. */
97 #define CMD0_CHNL_0 0x00
98 #define CMD0_CHNL_1 0x10/* Switch to channel 1. */
99 #define CMD0_NOP (CMD0_CHNL_0)
100 #define CMD0_PORT_1 CMD0_CHNL_1
101 #define CMD1_PORT_0 1
102 #define CMD0_IA_SETUP 1
103 #define CMD0_CONFIGURE 2
104 #define CMD0_MULTICAST_LIST 3
105 #define CMD0_TRANSMIT 4
106 #define CMD0_DUMP 6
107 #define CMD0_DIAGNOSE 7
108 #define CMD0_Rx_ENABLE 8
109 #define CMD0_Rx_DISABLE 10
110 #define CMD0_Rx_STOP 11
111 #define CMD0_RETRANSMIT 12
112 #define CMD0_ABORT 13
113 #define CMD0_RESET 14
115 #define CMD0_ACK 0x80
117 #define CMD0_STAT0 (0 << 5)
118 #define CMD0_STAT1 (1 << 5)
119 #define CMD0_STAT2 (2 << 5)
120 #define CMD0_STAT3 (3 << 5)
122 #define TX_TIMEOUT 10
124 #define net_local znet_private
125 struct znet_private {
126 int rx_dma, tx_dma;
127 struct net_device_stats stats;
128 spinlock_t lock;
129 /* The starting, current, and end pointers for the packet buffers. */
130 ushort *rx_start, *rx_cur, *rx_end;
131 ushort *tx_start, *tx_cur, *tx_end;
132 ushort tx_buf_len;/* Tx buffer length, in words. */
135 /* Only one can be built-in;-> */
136 static struct znet_private zn;
137 static ushort dma_buffer1[DMA_BUF_SIZE/2];
138 static ushort dma_buffer2[DMA_BUF_SIZE/2];
139 static ushort dma_buffer3[DMA_BUF_SIZE/2+8];
141 /* The configuration block. What an undocumented nightmare. The first
142 set of values are those suggested (without explanation) for ethernet
143 in the Intel 82586 databook. The rest appear to be completely undocumented,
144 except for cryptic notes in the Crynwr packet driver. This driver uses
145 the Crynwr values verbatim. */
147 static unsigned char i593_init[] = {
148 0xAA,/* 0: 16-byte input & 80-byte output FIFO. */
149 /* threshold, 96-byte FIFO, 82593 mode. */
150 0x88,/* 1: Continuous w/interrupts, 128-clock DMA.*/
151 0x2E,/* 2: 8-byte preamble, NO address insertion, */
152 /* 6-byte Ethernet address, loopback off.*/
153 0x00,/* 3: Default priorities & backoff methods. */
154 0x60,/* 4: 96-bit interframe spacing. */
155 0x00,/* 5: 512-bit slot time (low-order). */
156 0xF2,/* 6: Slot time (high-order), 15 COLL retries. */
157 0x00,/* 7: Promisc-off, broadcast-on, default CRC. */
158 0x00,/* 8: Default carrier-sense, collision-detect. */
159 0x40,/* 9: 64-byte minimum frame length. */
160 0x5F,/* A: Type/length checks OFF, no CRC input,
161 "jabber" termination, etc. */
162 0x00,/* B: Full-duplex disabled. */
163 0x3F,/* C: Default multicast addresses & backoff. */
164 0x07,/* D: Default IFS retriggering. */
165 0x31,/* E: Internal retransmit, drop "runt" packets,
166 synchr. DRQ deassertion, 6 status bytes. */
167 0x22,/* F: Receive ring-buffer size (8K),
168 receive-stop register enable. */
171 struct netidblk {
172 char magic[8];/* The magic number (string) "NETIDBLK" */
173 unsigned char netid[8];/* The physical station address */
174 char nettype, globalopt;
175 char vendor[8];/* The machine vendor and product name. */
176 char product[8];
177 char irq1, irq2;/* Interrupts, only one is currently used. */
178 char dma1, dma2;
179 short dma_mem_misc[8];/* DMA buffer locations (unused in Linux). */
180 short iobase1, iosize1;
181 short iobase2, iosize2;/* Second iobase unused. */
182 char driver_options;/* Misc. bits */
183 char pad;
186 intznet_probe(struct net_device *dev);
187 static intznet_open(struct net_device *dev);
188 static intznet_send_packet(struct sk_buff *skb,struct net_device *dev);
189 static voidznet_interrupt(int irq,void*dev_id,struct pt_regs *regs);
190 static voidznet_rx(struct net_device *dev);
191 static intznet_close(struct net_device *dev);
192 static struct net_device_stats *net_get_stats(struct net_device *dev);
193 static voidset_multicast_list(struct net_device *dev);
194 static voidhardware_init(struct net_device *dev);
195 static voidupdate_stop_hit(short ioaddr,unsigned short rx_stop_offset);
196 static voidznet_tx_timeout(struct net_device *dev);
198 #ifdef notdef
199 static struct sigaction znet_sigaction = { &znet_interrupt,0,0, NULL, };
200 #endif
203 /* The Z-Note probe is pretty easy. The NETIDBLK exists in the safe-to-probe
204 BIOS area. We just scan for the signature, and pull the vital parameters
205 out of the structure. */
207 int __init znet_probe(struct net_device *dev)
209 int i;
210 struct netidblk *netinfo;
211 char*p;
213 /* This code scans the region 0xf0000 to 0xfffff for a "NETIDBLK". */
214 for(p = (char*)phys_to_virt(0xf0000); p < (char*)phys_to_virt(0x100000); p++)
215 if(*p =='N'&&strncmp(p,"NETIDBLK",8) ==0)
216 break;
218 if(p >= (char*)phys_to_virt(0x100000)) {
219 if(znet_debug >1)
220 printk(KERN_INFO "No Z-Note ethernet adaptor found.\n");
221 return-ENODEV;
223 netinfo = (struct netidblk *)p;
224 dev->base_addr = netinfo->iobase1;
225 dev->irq = netinfo->irq1;
227 printk(KERN_INFO "%s: ZNET at %#3lx,", dev->name, dev->base_addr);
229 /* The station address is in the "netidblk" at 0x0f0000. */
230 for(i =0; i <6; i++)
231 printk(" %2.2x", dev->dev_addr[i] = netinfo->netid[i]);
233 printk(", using IRQ %d DMA %d and %d.\n", dev->irq, netinfo->dma1,
234 netinfo->dma2);
236 if(znet_debug >1) {
237 printk(KERN_INFO "%s: vendor '%16.16s' IRQ1 %d IRQ2 %d DMA1 %d DMA2 %d.\n",
238 dev->name, netinfo->vendor,
239 netinfo->irq1, netinfo->irq2,
240 netinfo->dma1, netinfo->dma2);
241 printk(KERN_INFO "%s: iobase1 %#x size %d iobase2 %#x size %d net type %2.2x.\n",
242 dev->name, netinfo->iobase1, netinfo->iosize1,
243 netinfo->iobase2, netinfo->iosize2, netinfo->nettype);
246 if(znet_debug >0)
247 printk("%s%s", KERN_INFO, version);
249 dev->priv = (void*) &zn;
250 zn.rx_dma = netinfo->dma1;
251 zn.tx_dma = netinfo->dma2;
252 zn.lock = SPIN_LOCK_UNLOCKED;
254 /* These should never fail. You can't add devices to a sealed box! */
255 if(request_irq(dev->irq, &znet_interrupt,0,"ZNet", dev)
256 ||request_dma(zn.rx_dma,"ZNet rx")
257 ||request_dma(zn.tx_dma,"ZNet tx")) {
258 printk(KERN_WARNING "%s: Not opened -- resource busy?!?\n", dev->name);
259 return-EBUSY;
262 /* Allocate buffer memory. We can cross a 128K boundary, so we
263 must be careful about the allocation. It's easiest to waste 8K. */
264 if(dma_page_eq(dma_buffer1, &dma_buffer1[RX_BUF_SIZE/2-1]))
265 zn.rx_start = dma_buffer1;
266 else
267 zn.rx_start = dma_buffer2;
269 if(dma_page_eq(dma_buffer3, &dma_buffer3[RX_BUF_SIZE/2-1]))
270 zn.tx_start = dma_buffer3;
271 else
272 zn.tx_start = dma_buffer2;
273 zn.rx_end = zn.rx_start + RX_BUF_SIZE/2;
274 zn.tx_buf_len = TX_BUF_SIZE/2;
275 zn.tx_end = zn.tx_start + zn.tx_buf_len;
277 /* The ZNET-specific entries in the device structure. */
278 dev->open = &znet_open;
279 dev->hard_start_xmit = &znet_send_packet;
280 dev->stop = &znet_close;
281 dev->get_stats = net_get_stats;
282 dev->set_multicast_list = &set_multicast_list;
283 dev->tx_timeout = znet_tx_timeout;
284 dev->watchdog_timeo = TX_TIMEOUT;
286 /* Fill in the 'dev' with ethernet-generic values. */
287 ether_setup(dev);
289 return0;
293 static intznet_open(struct net_device *dev)
295 int ioaddr = dev->base_addr;
297 if(znet_debug >2)
298 printk(KERN_DEBUG "%s: znet_open() called.\n", dev->name);
300 /* Turn on the 82501 SIA, using zenith-specific magic. */
301 outb(0x10,0xe6);/* Select LAN control register */
302 outb(inb(0xe7) |0x84,0xe7);/* Turn on LAN power (bit 2). */
303 /* According to the Crynwr driver we should wait 50 msec. for the
304 LAN clock to stabilize. My experiments indicates that the '593 can
305 be initialized immediately. The delay is probably needed for the
306 DC-to-DC converter to come up to full voltage, and for the oscillator
307 to be spot-on at 20Mhz before transmitting.
308 Until this proves to be a problem we rely on the higher layers for the
309 delay and save allocating a timer entry. */
311 /* This follows the packet driver's lead, and checks for success. */
312 if(inb(ioaddr) !=0x10&&inb(ioaddr) !=0x00)
313 printk(KERN_WARNING "%s: Problem turning on the transceiver power.\n",
314 dev->name);
316 hardware_init(dev);
317 netif_start_queue(dev);
319 return0;
323 static voidznet_tx_timeout(struct net_device *dev)
325 int ioaddr = dev->base_addr;
326 ushort event, tx_status, rx_offset, state;
328 outb(CMD0_STAT0, ioaddr);
329 event =inb(ioaddr);
330 outb(CMD0_STAT1, ioaddr);
331 tx_status =inw(ioaddr);
332 outb(CMD0_STAT2, ioaddr);
333 rx_offset =inw(ioaddr);
334 outb(CMD0_STAT3, ioaddr);
335 state =inb(ioaddr);
336 printk(KERN_WARNING "%s: transmit timed out, status %02x %04x %04x %02x,"
337 " resetting.\n", dev->name, event, tx_status, rx_offset, state);
338 if(tx_status ==0x0400)
339 printk(KERN_WARNING "%s: Tx carrier error, check transceiver cable.\n",
340 dev->name);
341 outb(CMD0_RESET, ioaddr);
342 hardware_init(dev);
343 netif_start_queue(dev);
346 static intznet_send_packet(struct sk_buff *skb,struct net_device *dev)
348 int ioaddr = dev->base_addr;
349 struct net_local *lp = (struct net_local *)dev->priv;
350 unsigned long flags;
352 if(znet_debug >4)
353 printk(KERN_DEBUG "%s: ZNet_send_packet.\n", dev->name);
355 netif_stop_queue(dev);
357 /* Check that the part hasn't reset itself, probably from suspend. */
358 outb(CMD0_STAT0, ioaddr);
359 if(inw(ioaddr) ==0x0010
360 &&inw(ioaddr) ==0x0000
361 &&inw(ioaddr) ==0x0010)
362 hardware_init(dev);
364 if(1) {
365 short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
366 unsigned char*buf = (void*)skb->data;
367 ushort *tx_link = zn.tx_cur -1;
368 ushort rnd_len = (length +1)>>1;
370 lp->stats.tx_bytes+=length;
373 short dma_port = ((zn.tx_dma&3)<<2) + IO_DMA2_BASE;
374 unsigned addr =inb(dma_port);
375 addr |=inb(dma_port) <<8;
376 addr <<=1;
377 if(((int)zn.tx_cur &0x1ffff) != addr)
378 printk(KERN_WARNING "Address mismatch at Tx: %#x vs %#x.\n",
379 (int)zn.tx_cur &0xffff, addr);
380 zn.tx_cur = (ushort *)(((int)zn.tx_cur &0xfe0000) | addr);
383 if(zn.tx_cur >= zn.tx_end)
384 zn.tx_cur = zn.tx_start;
385 *zn.tx_cur++ = length;
386 if(zn.tx_cur + rnd_len +1> zn.tx_end) {
387 int semi_cnt = (zn.tx_end - zn.tx_cur)<<1;/* Cvrt to byte cnt. */
388 memcpy(zn.tx_cur, buf, semi_cnt);
389 rnd_len -= semi_cnt>>1;
390 memcpy(zn.tx_start, buf + semi_cnt, length - semi_cnt);
391 zn.tx_cur = zn.tx_start + rnd_len;
392 }else{
393 memcpy(zn.tx_cur, buf, skb->len);
394 zn.tx_cur += rnd_len;
396 *zn.tx_cur++ =0;
398 spin_lock_irqsave(&lp->lock, flags);
400 *tx_link = CMD0_TRANSMIT + CMD0_CHNL_1;
401 /* Is this always safe to do? */
402 outb(CMD0_TRANSMIT + CMD0_CHNL_1,ioaddr);
404 spin_unlock_irqrestore(&lp->lock, flags);
406 dev->trans_start = jiffies;
407 netif_start_queue(dev);
409 if(znet_debug >4)
410 printk(KERN_DEBUG "%s: Transmitter queued, length %d.\n", dev->name, length);
412 dev_kfree_skb(skb);
413 return0;
416 /* The ZNET interrupt handler. */
417 static voidznet_interrupt(int irq,void*dev_id,struct pt_regs * regs)
419 struct net_device *dev = dev_id;
420 struct net_local *lp = (struct net_local *)dev->priv;
421 int ioaddr;
422 int boguscnt =20;
424 if(dev == NULL) {
425 printk(KERN_WARNING "znet_interrupt(): IRQ %d for unknown device.\n", irq);
426 return;
429 spin_lock(&lp->lock);
431 ioaddr = dev->base_addr;
433 outb(CMD0_STAT0, ioaddr);
435 ushort status =inb(ioaddr);
436 if(znet_debug >5) {
437 ushort result, rx_ptr, running;
438 outb(CMD0_STAT1, ioaddr);
439 result =inw(ioaddr);
440 outb(CMD0_STAT2, ioaddr);
441 rx_ptr =inw(ioaddr);
442 outb(CMD0_STAT3, ioaddr);
443 running =inb(ioaddr);
444 printk(KERN_DEBUG "%s: interrupt, status %02x, %04x %04x %02x serial %d.\n",
445 dev->name, status, result, rx_ptr, running, boguscnt);
447 if((status &0x80) ==0)
448 break;
450 if((status &0x0F) ==4) {/* Transmit done. */
451 int tx_status;
452 outb(CMD0_STAT1, ioaddr);
453 tx_status =inw(ioaddr);
454 /* It's undocumented, but tx_status seems to match the i82586. */
455 if(tx_status &0x2000) {
456 lp->stats.tx_packets++;
457 lp->stats.collisions += tx_status &0xf;
458 }else{
459 if(tx_status &0x0600) lp->stats.tx_carrier_errors++;
460 if(tx_status &0x0100) lp->stats.tx_fifo_errors++;
461 if(!(tx_status &0x0040)) lp->stats.tx_heartbeat_errors++;
462 if(tx_status &0x0020) lp->stats.tx_aborted_errors++;
463 /* ...and the catch-all. */
464 if((tx_status |0x0760) !=0x0760)
465 lp->stats.tx_errors++;
467 netif_wake_queue(dev);
470 if((status &0x40)
471 || (status &0x0f) ==11) {
472 znet_rx(dev);
474 /* Clear the interrupts we've handled. */
475 outb(CMD0_ACK,ioaddr);
476 }while(boguscnt--);
478 spin_unlock(&lp->lock);
480 return;
483 static voidznet_rx(struct net_device *dev)
485 struct net_local *lp = (struct net_local *)dev->priv;
486 int ioaddr = dev->base_addr;
487 int boguscount =1;
488 short next_frame_end_offset =0;/* Offset of next frame start. */
489 short*cur_frame_end;
490 short cur_frame_end_offset;
492 outb(CMD0_STAT2, ioaddr);
493 cur_frame_end_offset =inw(ioaddr);
495 if(cur_frame_end_offset == zn.rx_cur - zn.rx_start) {
496 printk(KERN_WARNING "%s: Interrupted, but nothing to receive, offset %03x.\n",
497 dev->name, cur_frame_end_offset);
498 return;
501 /* Use same method as the Crynwr driver: construct a forward list in
502 the same area of the backwards links we now have. This allows us to
503 pass packets to the upper layers in the order they were received --
504 important for fast-path sequential operations. */
505 while(zn.rx_start + cur_frame_end_offset != zn.rx_cur
506 && ++boguscount <5) {
507 unsigned short hi_cnt, lo_cnt, hi_status, lo_status;
508 int count, status;
510 if(cur_frame_end_offset <4) {
511 /* Oh no, we have a special case: the frame trailer wraps around
512 the end of the ring buffer. We've saved space at the end of
513 the ring buffer for just this problem. */
514 memcpy(zn.rx_end, zn.rx_start,8);
515 cur_frame_end_offset += (RX_BUF_SIZE/2);
517 cur_frame_end = zn.rx_start + cur_frame_end_offset -4;
519 lo_status = *cur_frame_end++;
520 hi_status = *cur_frame_end++;
521 status = ((hi_status &0xff) <<8) + (lo_status &0xff);
522 lo_cnt = *cur_frame_end++;
523 hi_cnt = *cur_frame_end++;
524 count = ((hi_cnt &0xff) <<8) + (lo_cnt &0xff);
526 if(znet_debug >5)
527 printk(KERN_DEBUG "Constructing trailer at location %03x, %04x %04x %04x %04x"
528 " count %#x status %04x.\n",
529 cur_frame_end_offset<<1, lo_status, hi_status, lo_cnt, hi_cnt,
530 count, status);
531 cur_frame_end[-4] = status;
532 cur_frame_end[-3] = next_frame_end_offset;
533 cur_frame_end[-2] = count;
534 next_frame_end_offset = cur_frame_end_offset;
535 cur_frame_end_offset -= ((count +1)>>1) +3;
536 if(cur_frame_end_offset <0)
537 cur_frame_end_offset += RX_BUF_SIZE/2;
540 /* Now step forward through the list. */
542 ushort *this_rfp_ptr = zn.rx_start + next_frame_end_offset;
543 int status = this_rfp_ptr[-4];
544 int pkt_len = this_rfp_ptr[-2];
546 if(znet_debug >5)
547 printk(KERN_DEBUG "Looking at trailer ending at %04x status %04x length %03x"
548 " next %04x.\n", next_frame_end_offset<<1, status, pkt_len,
549 this_rfp_ptr[-3]<<1);
550 /* Once again we must assume that the i82586 docs apply. */
551 if( ! (status &0x2000)) {/* There was an error. */
552 lp->stats.rx_errors++;
553 if(status &0x0800) lp->stats.rx_crc_errors++;
554 if(status &0x0400) lp->stats.rx_frame_errors++;
555 if(status &0x0200) lp->stats.rx_over_errors++;/* Wrong. */
556 if(status &0x0100) lp->stats.rx_fifo_errors++;
557 if(status &0x0080) lp->stats.rx_length_errors++;
558 }else if(pkt_len >1536) {
559 lp->stats.rx_length_errors++;
560 }else{
561 /* Malloc up new buffer. */
562 struct sk_buff *skb;
564 skb =dev_alloc_skb(pkt_len);
565 if(skb == NULL) {
566 if(znet_debug)
567 printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
568 lp->stats.rx_dropped++;
569 break;
571 skb->dev = dev;
573 if(&zn.rx_cur[(pkt_len+1)>>1] > zn.rx_end) {
574 int semi_cnt = (zn.rx_end - zn.rx_cur)<<1;
575 memcpy(skb_put(skb,semi_cnt), zn.rx_cur, semi_cnt);
576 memcpy(skb_put(skb,pkt_len-semi_cnt), zn.rx_start,
577 pkt_len - semi_cnt);
578 }else{
579 memcpy(skb_put(skb,pkt_len), zn.rx_cur, pkt_len);
580 if(znet_debug >6) {
581 unsigned int*packet = (unsigned int*) skb->data;
582 printk(KERN_DEBUG "Packet data is %08x %08x %08x %08x.\n", packet[0],
583 packet[1], packet[2], packet[3]);
586 skb->protocol=eth_type_trans(skb,dev);
587 netif_rx(skb);
588 lp->stats.rx_packets++;
590 zn.rx_cur = this_rfp_ptr;
591 if(zn.rx_cur >= zn.rx_end)
592 zn.rx_cur -= RX_BUF_SIZE/2;
593 update_stop_hit(ioaddr, (zn.rx_cur - zn.rx_start)<<1);
594 next_frame_end_offset = this_rfp_ptr[-3];
595 if(next_frame_end_offset ==0)/* Read all the frames? */
596 break;/* Done for now */
597 this_rfp_ptr = zn.rx_start + next_frame_end_offset;
598 }while(--boguscount);
600 /* If any worth-while packets have been received, dev_rint()
601 has done a mark_bh(INET_BH) for us and will work on them
602 when we get to the bottom-half routine. */
603 return;
606 /* The inverse routine to znet_open(). */
607 static intznet_close(struct net_device *dev)
609 unsigned long flags;
610 int ioaddr = dev->base_addr;
612 netif_stop_queue(dev);
614 outb(CMD0_RESET, ioaddr);/* CMD0_RESET */
616 flags=claim_dma_lock();
617 disable_dma(zn.rx_dma);
618 disable_dma(zn.tx_dma);
619 release_dma_lock(flags);
621 free_irq(dev->irq, dev);
623 if(znet_debug >1)
624 printk(KERN_DEBUG "%s: Shutting down ethercard.\n", dev->name);
625 /* Turn off transceiver power. */
626 outb(0x10,0xe6);/* Select LAN control register */
627 outb(inb(0xe7) & ~0x84,0xe7);/* Turn on LAN power (bit 2). */
629 return0;
632 /* Get the current statistics. This may be called with the card open or
633 closed. */
634 static struct net_device_stats *net_get_stats(struct net_device *dev)
636 struct net_local *lp = (struct net_local *)dev->priv;
638 return&lp->stats;
641 /* Set or clear the multicast filter for this adaptor.
642 As a side effect this routine must also initialize the device parameters.
643 This is taken advantage of in open().
645 N.B. that we change i593_init[] in place. This (properly) makes the
646 mode change persistent, but must be changed if this code is moved to
647 a multiple adaptor environment.
649 static voidset_multicast_list(struct net_device *dev)
651 short ioaddr = dev->base_addr;
653 if(dev->flags&IFF_PROMISC) {
654 /* Enable promiscuous mode */
655 i593_init[7] &= ~3; i593_init[7] |=1;
656 i593_init[13] &= ~8; i593_init[13] |=8;
657 }else if(dev->mc_list || (dev->flags&IFF_ALLMULTI)) {
658 /* Enable accept-all-multicast mode */
659 i593_init[7] &= ~3; i593_init[7] |=0;
660 i593_init[13] &= ~8; i593_init[13] |=8;
661 }else{/* Enable normal mode. */
662 i593_init[7] &= ~3; i593_init[7] |=0;
663 i593_init[13] &= ~8; i593_init[13] |=0;
665 *zn.tx_cur++ =sizeof(i593_init);
666 memcpy(zn.tx_cur, i593_init,sizeof(i593_init));
667 zn.tx_cur +=sizeof(i593_init)/2;
668 outb(CMD0_CONFIGURE+CMD0_CHNL_1, ioaddr);
669 #ifdef not_tested
670 if(num_addrs >0) {
671 int addrs_len =6*num_addrs;
672 *zn.tx_cur++ = addrs_len;
673 memcpy(zn.tx_cur, addrs, addrs_len);
674 outb(CMD0_MULTICAST_LIST+CMD0_CHNL_1, ioaddr);
675 zn.tx_cur += addrs_len>>1;
677 #endif
680 voidshow_dma(void)
682 unsigned long flags;
683 short dma_port = ((zn.tx_dma&3)<<2) + IO_DMA2_BASE;
684 unsigned addr =inb(dma_port);
685 addr |=inb(dma_port) <<8;
687 flags=claim_dma_lock();
688 printk("Addr: %04x cnt:%3x...", addr<<1,get_dma_residue(zn.tx_dma));
689 release_dma_lock(flags);
692 /* Initialize the hardware. We have to do this when the board is open()ed
693 or when we come out of suspend mode. */
694 static voidhardware_init(struct net_device *dev)
696 unsigned long flags;
697 short ioaddr = dev->base_addr;
699 zn.rx_cur = zn.rx_start;
700 zn.tx_cur = zn.tx_start;
702 /* Reset the chip, and start it up. */
703 outb(CMD0_RESET, ioaddr);
705 flags=claim_dma_lock();
706 disable_dma(zn.rx_dma);/* reset by an interrupting task. */
707 clear_dma_ff(zn.rx_dma);
708 set_dma_mode(zn.rx_dma, DMA_RX_MODE);
709 set_dma_addr(zn.rx_dma, (unsigned int) zn.rx_start);
710 set_dma_count(zn.rx_dma, RX_BUF_SIZE);
711 enable_dma(zn.rx_dma);
712 /* Now set up the Tx channel. */
713 disable_dma(zn.tx_dma);
714 clear_dma_ff(zn.tx_dma);
715 set_dma_mode(zn.tx_dma, DMA_TX_MODE);
716 set_dma_addr(zn.tx_dma, (unsigned int) zn.tx_start);
717 set_dma_count(zn.tx_dma, zn.tx_buf_len<<1);
718 enable_dma(zn.tx_dma);
719 release_dma_lock(flags);
721 if(znet_debug >1)
722 printk(KERN_DEBUG "%s: Initializing the i82593, tx buf %p... ", dev->name,
723 zn.tx_start);
724 /* Do an empty configure command, just like the Crynwr driver. This
725 resets to chip to its default values. */
726 *zn.tx_cur++ =0;
727 *zn.tx_cur++ =0;
728 printk("stat:%02x ",inb(ioaddr));show_dma();
729 outb(CMD0_CONFIGURE+CMD0_CHNL_1, ioaddr);
730 *zn.tx_cur++ =sizeof(i593_init);
731 memcpy(zn.tx_cur, i593_init,sizeof(i593_init));
732 zn.tx_cur +=sizeof(i593_init)/2;
733 printk("stat:%02x ",inb(ioaddr));show_dma();
734 outb(CMD0_CONFIGURE+CMD0_CHNL_1, ioaddr);
735 *zn.tx_cur++ =6;
736 memcpy(zn.tx_cur, dev->dev_addr,6);
737 zn.tx_cur +=3;
738 printk("stat:%02x ",inb(ioaddr));show_dma();
739 outb(CMD0_IA_SETUP + CMD0_CHNL_1, ioaddr);
740 printk("stat:%02x ",inb(ioaddr));show_dma();
742 update_stop_hit(ioaddr,8192);
743 if(znet_debug >1)printk("enabling Rx.\n");
744 outb(CMD0_Rx_ENABLE+CMD0_CHNL_0, ioaddr);
745 netif_start_queue(dev);
748 static voidupdate_stop_hit(short ioaddr,unsigned short rx_stop_offset)
750 outb(CMD0_PORT_1, ioaddr);
751 if(znet_debug >5)
752 printk(KERN_DEBUG "Updating stop hit with value %02x.\n",
753 (rx_stop_offset >>6) |0x80);
754 outb((rx_stop_offset >>6) |0x80, ioaddr);
755 outb(CMD1_PORT_0, ioaddr);
759 * Local variables:
760 * compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c znet.c"
761 * version-control: t
762 * kept-new-versions: 5
763 * c-indent-level: 4
764 * tab-width: 4
765 * End:
close