1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88#include <linux/module.h>
89#include <linux/kernel.h>
90#include <linux/string.h>
91#include <linux/errno.h>
92#include <linux/interrupt.h>
93#include <linux/ioport.h>
94#include <linux/init.h>
95#include <linux/delay.h>
96#include <linux/netdevice.h>
97#include <linux/etherdevice.h>
98#include <linux/skbuff.h>
99#include <linux/if_arp.h>
100#include <linux/bitops.h>
101
102#include <asm/system.h>
103#include <asm/io.h>
104#include <asm/dma.h>
105
106
107#include "wireless/i82593.h"
108
109static char version[] __initdata = "znet.c:v1.02 9/23/94 becker@scyld.com\n";
110
111#ifndef ZNET_DEBUG
112#define ZNET_DEBUG 1
113#endif
114static unsigned int znet_debug = ZNET_DEBUG;
115module_param (znet_debug, int, 0);
116MODULE_PARM_DESC (znet_debug, "ZNet debug level");
117MODULE_LICENSE("GPL");
118
119
120#define DMA_RX_MODE 0x14
121#define DMA_TX_MODE 0x18
122#define dma_page_eq(ptr1, ptr2) ((long)(ptr1)>>17 == (long)(ptr2)>>17)
123#define RX_BUF_SIZE 8192
124#define TX_BUF_SIZE 8192
125#define DMA_BUF_SIZE (RX_BUF_SIZE + 16)
126
127#define TX_TIMEOUT 10
128
129struct znet_private {
130 int rx_dma, tx_dma;
131 spinlock_t lock;
132 short sia_base, sia_size, io_size;
133 struct i82593_conf_block i593_init;
134
135 ushort *rx_start, *rx_cur, *rx_end;
136 ushort *tx_start, *tx_cur, *tx_end;
137 ushort tx_buf_len;
138};
139
140
141static struct net_device *znet_dev;
142
143struct netidblk {
144 char magic[8];
145 unsigned char netid[8];
146 char nettype, globalopt;
147 char vendor[8];
148 char product[8];
149 char irq1, irq2;
150 char dma1, dma2;
151 short dma_mem_misc[8];
152 short iobase1, iosize1;
153 short iobase2, iosize2;
154 char driver_options;
155 char pad;
156};
157
158static int znet_open(struct net_device *dev);
159static int znet_send_packet(struct sk_buff *skb, struct net_device *dev);
160static irqreturn_t znet_interrupt(int irq, void *dev_id);
161static void znet_rx(struct net_device *dev);
162static int znet_close(struct net_device *dev);
163static void hardware_init(struct net_device *dev);
164static void update_stop_hit(short ioaddr, unsigned short rx_stop_offset);
165static void znet_tx_timeout (struct net_device *dev);
166
167
168static int znet_request_resources (struct net_device *dev)
169{
170 struct znet_private *znet = dev->priv;
171 unsigned long flags;
172
173 if (request_irq (dev->irq, &znet_interrupt, 0, "ZNet", dev))
174 goto failed;
175 if (request_dma (znet->rx_dma, "ZNet rx"))
176 goto free_irq;
177 if (request_dma (znet->tx_dma, "ZNet tx"))
178 goto free_rx_dma;
179 if (!request_region (znet->sia_base, znet->sia_size, "ZNet SIA"))
180 goto free_tx_dma;
181 if (!request_region (dev->base_addr, znet->io_size, "ZNet I/O"))
182 goto free_sia;
183
184 return 0;
185
186 free_sia:
187 release_region (znet->sia_base, znet->sia_size);
188 free_tx_dma:
189 flags = claim_dma_lock();
190 free_dma (znet->tx_dma);
191 release_dma_lock (flags);
192 free_rx_dma:
193 flags = claim_dma_lock();
194 free_dma (znet->rx_dma);
195 release_dma_lock (flags);
196 free_irq:
197 free_irq (dev->irq, dev);
198 failed:
199 return -1;
200}
201
202static void znet_release_resources (struct net_device *dev)
203{
204 struct znet_private *znet = dev->priv;
205 unsigned long flags;
206
207 release_region (znet->sia_base, znet->sia_size);
208 release_region (dev->base_addr, znet->io_size);
209 flags = claim_dma_lock();
210 free_dma (znet->tx_dma);
211 free_dma (znet->rx_dma);
212 release_dma_lock (flags);
213 free_irq (dev->irq, dev);
214}
215
216
217static void znet_transceiver_power (struct net_device *dev, int on)
218{
219 struct znet_private *znet = dev->priv;
220 unsigned char v;
221
222
223
224 outb(0x10, znet->sia_base);
225
226 if (on)
227 v = inb(znet->sia_base + 1) | 0x84;
228 else
229 v = inb(znet->sia_base + 1) & ~0x84;
230
231 outb(v, znet->sia_base+1);
232}
233
234
235
236static void znet_set_multicast_list (struct net_device *dev)
237{
238 struct znet_private *znet = dev->priv;
239 short ioaddr = dev->base_addr;
240 struct i82593_conf_block *cfblk = &znet->i593_init;
241
242 memset(cfblk, 0x00, sizeof(struct i82593_conf_block));
243
244
245
246
247
248
249
250
251
252
253
254 cfblk->fifo_limit = 10;
255 cfblk->forgnesi = 0;
256 cfblk->fifo_32 = 1;
257 cfblk->d6mod = 0;
258 cfblk->throttle_enb = 1;
259
260
261 cfblk->throttle = 8;
262 cfblk->cntrxint = 0;
263 cfblk->contin = 1;
264
265
266 cfblk->addr_len = ETH_ALEN;
267 cfblk->acloc = 1;
268 cfblk->preamb_len = 2;
269 cfblk->loopback = 0;
270
271
272 cfblk->lin_prio = 0;
273 cfblk->tbofstop = 0;
274 cfblk->exp_prio = 0;
275 cfblk->bof_met = 0;
276
277
278 cfblk->ifrm_spc = 6;
279
280
281 cfblk->slottim_low = 0;
282
283
284 cfblk->slottim_hi = 2;
285 cfblk->max_retr = 15;
286
287
288 cfblk->prmisc = ((dev->flags & IFF_PROMISC) ? 1 : 0);
289 cfblk->bc_dis = 0;
290 cfblk->crs_1 = 0;
291 cfblk->nocrc_ins = 0;
292 cfblk->crc_1632 = 0;
293 cfblk->crs_cdt = 0;
294
295
296 cfblk->cs_filter = 0;
297 cfblk->crs_src = 0;
298 cfblk->cd_filter = 0;
299
300
301 cfblk->min_fr_len = ETH_ZLEN >> 2;
302
303
304 cfblk->lng_typ = 1;
305 cfblk->lng_fld = 1;
306 cfblk->rxcrc_xf = 1;
307 cfblk->artx = 1;
308 cfblk->sarec = 1;
309 cfblk->tx_jabber = 0;
310 cfblk->hash_1 = 1;
311 cfblk->lbpkpol = 0;
312
313
314 cfblk->fdx = 0;
315
316
317 cfblk->dummy_6 = 0x3f;
318 cfblk->mult_ia = 0;
319 cfblk->dis_bof = 0;
320
321
322 cfblk->dummy_1 = 1;
323 cfblk->tx_ifs_retrig = 3;
324 cfblk->mc_all = (dev->mc_list || (dev->flags&IFF_ALLMULTI));
325 cfblk->rcv_mon = 0;
326 cfblk->frag_acpt = 0;
327 cfblk->tstrttrs = 0;
328
329
330 cfblk->fretx = 1;
331 cfblk->runt_eop = 0;
332 cfblk->hw_sw_pin = 0;
333 cfblk->big_endn = 0;
334 cfblk->syncrqs = 1;
335 cfblk->sttlen = 1;
336 cfblk->rx_eop = 0;
337 cfblk->tx_eop = 0;
338
339
340 cfblk->rbuf_size = RX_BUF_SIZE >> 12;
341 cfblk->rcvstop = 1;
342
343 if (znet_debug > 2) {
344 int i;
345 unsigned char *c;
346
347 for (i = 0, c = (char *) cfblk; i < sizeof (*cfblk); i++)
348 printk ("%02X ", c[i]);
349 printk ("\n");
350 }
351
352 *znet->tx_cur++ = sizeof(struct i82593_conf_block);
353 memcpy(znet->tx_cur, cfblk, sizeof(struct i82593_conf_block));
354 znet->tx_cur += sizeof(struct i82593_conf_block)/2;
355 outb(OP0_CONFIGURE | CR0_CHNL, ioaddr);
356
357
358
359}
360
361
362
363
364
365static int __init znet_probe (void)
366{
367 int i;
368 struct netidblk *netinfo;
369 struct znet_private *znet;
370 struct net_device *dev;
371 char *p;
372 int err = -ENOMEM;
373 DECLARE_MAC_BUF(mac);
374
375
376 for(p = (char *)phys_to_virt(0xf0000); p < (char *)phys_to_virt(0x100000); p++)
377 if (*p == 'N' && strncmp(p, "NETIDBLK", 8) == 0)
378 break;
379
380 if (p >= (char *)phys_to_virt(0x100000)) {
381 if (znet_debug > 1)
382 printk(KERN_INFO "No Z-Note ethernet adaptor found.\n");
383 return -ENODEV;
384 }
385
386 dev = alloc_etherdev(sizeof(struct znet_private));
387 if (!dev)
388 return -ENOMEM;
389
390 znet = dev->priv;
391
392 netinfo = (struct netidblk *)p;
393 dev->base_addr = netinfo->iobase1;
394 dev->irq = netinfo->irq1;
395
396
397 for (i = 0; i < 6; i++)
398 dev->dev_addr[i] = netinfo->netid[i];
399
400 printk(KERN_INFO "%s: ZNET at %#3lx, %s"
401 ", using IRQ %d DMA %d and %d.\n",
402 dev->name, dev->base_addr, print_mac(mac, dev->dev_addr),
403 dev->irq, netinfo->dma1, netinfo->dma2);
404
405 if (znet_debug > 1) {
406 printk(KERN_INFO "%s: vendor '%16.16s' IRQ1 %d IRQ2 %d DMA1 %d DMA2 %d.\n",
407 dev->name, netinfo->vendor,
408 netinfo->irq1, netinfo->irq2,
409 netinfo->dma1, netinfo->dma2);
410 printk(KERN_INFO "%s: iobase1 %#x size %d iobase2 %#x size %d net type %2.2x.\n",
411 dev->name, netinfo->iobase1, netinfo->iosize1,
412 netinfo->iobase2, netinfo->iosize2, netinfo->nettype);
413 }
414
415 if (znet_debug > 0)
416 printk(KERN_INFO "%s", version);
417
418 znet->rx_dma = netinfo->dma1;
419 znet->tx_dma = netinfo->dma2;
420 spin_lock_init(&znet->lock);
421 znet->sia_base = 0xe6;
422 znet->sia_size = 2;
423
424
425
426 znet->io_size = 2;
427
428 if (!(znet->rx_start = kmalloc (DMA_BUF_SIZE, GFP_KERNEL | GFP_DMA)))
429 goto free_dev;
430 if (!(znet->tx_start = kmalloc (DMA_BUF_SIZE, GFP_KERNEL | GFP_DMA)))
431 goto free_rx;
432
433 if (!dma_page_eq (znet->rx_start, znet->rx_start + (RX_BUF_SIZE/2-1)) ||
434 !dma_page_eq (znet->tx_start, znet->tx_start + (TX_BUF_SIZE/2-1))) {
435 printk (KERN_WARNING "tx/rx crossing DMA frontiers, giving up\n");
436 goto free_tx;
437 }
438
439 znet->rx_end = znet->rx_start + RX_BUF_SIZE/2;
440 znet->tx_buf_len = TX_BUF_SIZE/2;
441 znet->tx_end = znet->tx_start + znet->tx_buf_len;
442
443
444 dev->open = &znet_open;
445 dev->hard_start_xmit = &znet_send_packet;
446 dev->stop = &znet_close;
447 dev->set_multicast_list = &znet_set_multicast_list;
448 dev->tx_timeout = znet_tx_timeout;
449 dev->watchdog_timeo = TX_TIMEOUT;
450 err = register_netdev(dev);
451 if (err)
452 goto free_tx;
453 znet_dev = dev;
454 return 0;
455
456 free_tx:
457 kfree(znet->tx_start);
458 free_rx:
459 kfree(znet->rx_start);
460 free_dev:
461 free_netdev(dev);
462 return err;
463}
464
465
466static int znet_open(struct net_device *dev)
467{
468 int ioaddr = dev->base_addr;
469
470 if (znet_debug > 2)
471 printk(KERN_DEBUG "%s: znet_open() called.\n", dev->name);
472
473
474 if (znet_request_resources (dev)) {
475 printk(KERN_WARNING "%s: Not opened -- resource busy?!?\n", dev->name);
476 return -EBUSY;
477 }
478
479 znet_transceiver_power (dev, 1);
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494 mdelay (50);
495
496
497 if (inb(ioaddr) != 0x10 && inb(ioaddr) != 0x00)
498 printk(KERN_WARNING "%s: Problem turning on the transceiver power.\n",
499 dev->name);
500
501 hardware_init(dev);
502 netif_start_queue (dev);
503
504 return 0;
505}
506
507
508static void znet_tx_timeout (struct net_device *dev)
509{
510 int ioaddr = dev->base_addr;
511 ushort event, tx_status, rx_offset, state;
512
513 outb (CR0_STATUS_0, ioaddr);
514 event = inb (ioaddr);
515 outb (CR0_STATUS_1, ioaddr);
516 tx_status = inw (ioaddr);
517 outb (CR0_STATUS_2, ioaddr);
518 rx_offset = inw (ioaddr);
519 outb (CR0_STATUS_3, ioaddr);
520 state = inb (ioaddr);
521 printk (KERN_WARNING "%s: transmit timed out, status %02x %04x %04x %02x,"
522 " resetting.\n", dev->name, event, tx_status, rx_offset, state);
523 if (tx_status == TX_LOST_CRS)
524 printk (KERN_WARNING "%s: Tx carrier error, check transceiver cable.\n",
525 dev->name);
526 outb (OP0_RESET, ioaddr);
527 hardware_init (dev);
528 netif_wake_queue (dev);
529}
530
531static int znet_send_packet(struct sk_buff *skb, struct net_device *dev)
532{
533 int ioaddr = dev->base_addr;
534 struct znet_private *znet = dev->priv;
535 unsigned long flags;
536 short length = skb->len;
537
538 if (znet_debug > 4)
539 printk(KERN_DEBUG "%s: ZNet_send_packet.\n", dev->name);
540
541 if (length < ETH_ZLEN) {
542 if (skb_padto(skb, ETH_ZLEN))
543 return 0;
544 length = ETH_ZLEN;
545 }
546
547 netif_stop_queue (dev);
548
549
550 outb(CR0_STATUS_0, ioaddr);
551 if (inw(ioaddr) == 0x0010 &&
552 inw(ioaddr) == 0x0000 &&
553 inw(ioaddr) == 0x0010) {
554 if (znet_debug > 1)
555 printk (KERN_WARNING "%s : waking up\n", dev->name);
556 hardware_init(dev);
557 znet_transceiver_power (dev, 1);
558 }
559
560 if (1) {
561 unsigned char *buf = (void *)skb->data;
562 ushort *tx_link = znet->tx_cur - 1;
563 ushort rnd_len = (length + 1)>>1;
564
565 dev->stats.tx_bytes+=length;
566
567 if (znet->tx_cur >= znet->tx_end)
568 znet->tx_cur = znet->tx_start;
569 *znet->tx_cur++ = length;
570 if (znet->tx_cur + rnd_len + 1 > znet->tx_end) {
571 int semi_cnt = (znet->tx_end - znet->tx_cur)<<1;
572 memcpy(znet->tx_cur, buf, semi_cnt);
573 rnd_len -= semi_cnt>>1;
574 memcpy(znet->tx_start, buf + semi_cnt, length - semi_cnt);
575 znet->tx_cur = znet->tx_start + rnd_len;
576 } else {
577 memcpy(znet->tx_cur, buf, skb->len);
578 znet->tx_cur += rnd_len;
579 }
580 *znet->tx_cur++ = 0;
581
582 spin_lock_irqsave(&znet->lock, flags);
583 {
584 *tx_link = OP0_TRANSMIT | CR0_CHNL;
585
586 outb(OP0_TRANSMIT | CR0_CHNL, ioaddr);
587 }
588 spin_unlock_irqrestore (&znet->lock, flags);
589
590 dev->trans_start = jiffies;
591 netif_start_queue (dev);
592
593 if (znet_debug > 4)
594 printk(KERN_DEBUG "%s: Transmitter queued, length %d.\n", dev->name, length);
595 }
596 dev_kfree_skb(skb);
597 return 0;
598}
599
600
601static irqreturn_t znet_interrupt(int irq, void *dev_id)
602{
603 struct net_device *dev = dev_id;
604 struct znet_private *znet = dev->priv;
605 int ioaddr;
606 int boguscnt = 20;
607 int handled = 0;
608
609 spin_lock (&znet->lock);
610
611 ioaddr = dev->base_addr;
612
613 outb(CR0_STATUS_0, ioaddr);
614 do {
615 ushort status = inb(ioaddr);
616 if (znet_debug > 5) {
617 ushort result, rx_ptr, running;
618 outb(CR0_STATUS_1, ioaddr);
619 result = inw(ioaddr);
620 outb(CR0_STATUS_2, ioaddr);
621 rx_ptr = inw(ioaddr);
622 outb(CR0_STATUS_3, ioaddr);
623 running = inb(ioaddr);
624 printk(KERN_DEBUG "%s: interrupt, status %02x, %04x %04x %02x serial %d.\n",
625 dev->name, status, result, rx_ptr, running, boguscnt);
626 }
627 if ((status & SR0_INTERRUPT) == 0)
628 break;
629
630 handled = 1;
631
632 if ((status & SR0_EVENT_MASK) == SR0_TRANSMIT_DONE ||
633 (status & SR0_EVENT_MASK) == SR0_RETRANSMIT_DONE ||
634 (status & SR0_EVENT_MASK) == SR0_TRANSMIT_NO_CRC_DONE) {
635 int tx_status;
636 outb(CR0_STATUS_1, ioaddr);
637 tx_status = inw(ioaddr);
638
639 if (tx_status & TX_OK) {
640 dev->stats.tx_packets++;
641 dev->stats.collisions += tx_status & TX_NCOL_MASK;
642 } else {
643 if (tx_status & (TX_LOST_CTS | TX_LOST_CRS))
644 dev->stats.tx_carrier_errors++;
645 if (tx_status & TX_UND_RUN)
646 dev->stats.tx_fifo_errors++;
647 if (!(tx_status & TX_HRT_BEAT))
648 dev->stats.tx_heartbeat_errors++;
649 if (tx_status & TX_MAX_COL)
650 dev->stats.tx_aborted_errors++;
651
652 if ((tx_status | (TX_LOST_CRS | TX_LOST_CTS | TX_UND_RUN | TX_HRT_BEAT | TX_MAX_COL)) != (TX_LOST_CRS | TX_LOST_CTS | TX_UND_RUN | TX_HRT_BEAT | TX_MAX_COL))
653 dev->stats.tx_errors++;
654
655
656
657
658
659
660
661 znet_transceiver_power (dev, 0);
662 znet_transceiver_power (dev, 1);
663 }
664 netif_wake_queue (dev);
665 }
666
667 if ((status & SR0_RECEPTION) ||
668 (status & SR0_EVENT_MASK) == SR0_STOP_REG_HIT) {
669 znet_rx(dev);
670 }
671
672 outb(CR0_INT_ACK, ioaddr);
673 } while (boguscnt--);
674
675 spin_unlock (&znet->lock);
676
677 return IRQ_RETVAL(handled);
678}
679
680static void znet_rx(struct net_device *dev)
681{
682 struct znet_private *znet = dev->priv;
683 int ioaddr = dev->base_addr;
684 int boguscount = 1;
685 short next_frame_end_offset = 0;
686 short *cur_frame_end;
687 short cur_frame_end_offset;
688
689 outb(CR0_STATUS_2, ioaddr);
690 cur_frame_end_offset = inw(ioaddr);
691
692 if (cur_frame_end_offset == znet->rx_cur - znet->rx_start) {
693 printk(KERN_WARNING "%s: Interrupted, but nothing to receive, offset %03x.\n",
694 dev->name, cur_frame_end_offset);
695 return;
696 }
697
698
699
700
701
702 while (znet->rx_start + cur_frame_end_offset != znet->rx_cur
703 && ++boguscount < 5) {
704 unsigned short hi_cnt, lo_cnt, hi_status, lo_status;
705 int count, status;
706
707 if (cur_frame_end_offset < 4) {
708
709
710
711 memcpy(znet->rx_end, znet->rx_start, 8);
712 cur_frame_end_offset += (RX_BUF_SIZE/2);
713 }
714 cur_frame_end = znet->rx_start + cur_frame_end_offset - 4;
715
716 lo_status = *cur_frame_end++;
717 hi_status = *cur_frame_end++;
718 status = ((hi_status & 0xff) << 8) + (lo_status & 0xff);
719 lo_cnt = *cur_frame_end++;
720 hi_cnt = *cur_frame_end++;
721 count = ((hi_cnt & 0xff) << 8) + (lo_cnt & 0xff);
722
723 if (znet_debug > 5)
724 printk(KERN_DEBUG "Constructing trailer at location %03x, %04x %04x %04x %04x"
725 " count %#x status %04x.\n",
726 cur_frame_end_offset<<1, lo_status, hi_status, lo_cnt, hi_cnt,
727 count, status);
728 cur_frame_end[-4] = status;
729 cur_frame_end[-3] = next_frame_end_offset;
730 cur_frame_end[-2] = count;
731 next_frame_end_offset = cur_frame_end_offset;
732 cur_frame_end_offset -= ((count + 1)>>1) + 3;
733 if (cur_frame_end_offset < 0)
734 cur_frame_end_offset += RX_BUF_SIZE/2;
735 };
736
737
738 do {
739 ushort *this_rfp_ptr = znet->rx_start + next_frame_end_offset;
740 int status = this_rfp_ptr[-4];
741 int pkt_len = this_rfp_ptr[-2];
742
743 if (znet_debug > 5)
744 printk(KERN_DEBUG "Looking at trailer ending at %04x status %04x length %03x"
745 " next %04x.\n", next_frame_end_offset<<1, status, pkt_len,
746 this_rfp_ptr[-3]<<1);
747
748 if ( ! (status & RX_RCV_OK)) {
749 dev->stats.rx_errors++;
750 if (status & RX_CRC_ERR) dev->stats.rx_crc_errors++;
751 if (status & RX_ALG_ERR) dev->stats.rx_frame_errors++;
752#if 0
753 if (status & 0x0200) dev->stats.rx_over_errors++;
754 if (status & 0x0100) dev->stats.rx_fifo_errors++;
755#else
756
757 if (status & RX_OVRRUN) dev->stats.rx_over_errors++;
758#endif
759 if (status & RX_SRT_FRM) dev->stats.rx_length_errors++;
760 } else if (pkt_len > 1536) {
761 dev->stats.rx_length_errors++;
762 } else {
763
764 struct sk_buff *skb;
765
766 skb = dev_alloc_skb(pkt_len);
767 if (skb == NULL) {
768 if (znet_debug)
769 printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
770 dev->stats.rx_dropped++;
771 break;
772 }
773
774 if (&znet->rx_cur[(pkt_len+1)>>1] > znet->rx_end) {
775 int semi_cnt = (znet->rx_end - znet->rx_cur)<<1;
776 memcpy(skb_put(skb,semi_cnt), znet->rx_cur, semi_cnt);
777 memcpy(skb_put(skb,pkt_len-semi_cnt), znet->rx_start,
778 pkt_len - semi_cnt);
779 } else {
780 memcpy(skb_put(skb,pkt_len), znet->rx_cur, pkt_len);
781 if (znet_debug > 6) {
782 unsigned int *packet = (unsigned int *) skb->data;
783 printk(KERN_DEBUG "Packet data is %08x %08x %08x %08x.\n", packet[0],
784 packet[1], packet[2], packet[3]);
785 }
786 }
787 skb->protocol=eth_type_trans(skb,dev);
788 netif_rx(skb);
789 dev->last_rx = jiffies;
790 dev->stats.rx_packets++;
791 dev->stats.rx_bytes += pkt_len;
792 }
793 znet->rx_cur = this_rfp_ptr;
794 if (znet->rx_cur >= znet->rx_end)
795 znet->rx_cur -= RX_BUF_SIZE/2;
796 update_stop_hit(ioaddr, (znet->rx_cur - znet->rx_start)<<1);
797 next_frame_end_offset = this_rfp_ptr[-3];
798 if (next_frame_end_offset == 0)
799 break;
800 this_rfp_ptr = znet->rx_start + next_frame_end_offset;
801 } while (--boguscount);
802
803
804
805
806 return;
807}
808
809
810static int znet_close(struct net_device *dev)
811{
812 int ioaddr = dev->base_addr;
813
814 netif_stop_queue (dev);
815
816 outb(OP0_RESET, ioaddr);
817
818 if (znet_debug > 1)
819 printk(KERN_DEBUG "%s: Shutting down ethercard.\n", dev->name);
820
821 znet_transceiver_power (dev, 0);
822
823 znet_release_resources (dev);
824
825 return 0;
826}
827
828static void show_dma(struct net_device *dev)
829{
830 short ioaddr = dev->base_addr;
831 unsigned char stat = inb (ioaddr);
832 struct znet_private *znet = dev->priv;
833 unsigned long flags;
834 short dma_port = ((znet->tx_dma&3)<<2) + IO_DMA2_BASE;
835 unsigned addr = inb(dma_port);
836 short residue;
837
838 addr |= inb(dma_port) << 8;
839 residue = get_dma_residue(znet->tx_dma);
840
841 if (znet_debug > 1) {
842 flags=claim_dma_lock();
843 printk(KERN_DEBUG "Stat:%02x Addr: %04x cnt:%3x\n",
844 stat, addr<<1, residue);
845 release_dma_lock(flags);
846 }
847}
848
849
850
851static void hardware_init(struct net_device *dev)
852{
853 unsigned long flags;
854 short ioaddr = dev->base_addr;
855 struct znet_private *znet = dev->priv;
856
857 znet->rx_cur = znet->rx_start;
858 znet->tx_cur = znet->tx_start;
859
860
861 outb(OP0_RESET, ioaddr);
862
863 flags=claim_dma_lock();
864 disable_dma(znet->rx_dma);
865 clear_dma_ff(znet->rx_dma);
866 set_dma_mode(znet->rx_dma, DMA_RX_MODE);
867 set_dma_addr(znet->rx_dma, (unsigned int) znet->rx_start);
868 set_dma_count(znet->rx_dma, RX_BUF_SIZE);
869 enable_dma(znet->rx_dma);
870
871 disable_dma(znet->tx_dma);
872 clear_dma_ff(znet->tx_dma);
873 set_dma_mode(znet->tx_dma, DMA_TX_MODE);
874 set_dma_addr(znet->tx_dma, (unsigned int) znet->tx_start);
875 set_dma_count(znet->tx_dma, znet->tx_buf_len<<1);
876 enable_dma(znet->tx_dma);
877 release_dma_lock(flags);
878
879 if (znet_debug > 1)
880 printk(KERN_DEBUG "%s: Initializing the i82593, rx buf %p tx buf %p\n",
881 dev->name, znet->rx_start,znet->tx_start);
882
883
884 *znet->tx_cur++ = 0;
885 *znet->tx_cur++ = 0;
886 show_dma(dev);
887 outb(OP0_CONFIGURE | CR0_CHNL, ioaddr);
888
889 znet_set_multicast_list (dev);
890
891 *znet->tx_cur++ = 6;
892 memcpy(znet->tx_cur, dev->dev_addr, 6);
893 znet->tx_cur += 3;
894 show_dma(dev);
895 outb(OP0_IA_SETUP | CR0_CHNL, ioaddr);
896 show_dma(dev);
897
898 update_stop_hit(ioaddr, 8192);
899 if (znet_debug > 1) printk(KERN_DEBUG "enabling Rx.\n");
900 outb(OP0_RCV_ENABLE, ioaddr);
901 netif_start_queue (dev);
902}
903
904static void update_stop_hit(short ioaddr, unsigned short rx_stop_offset)
905{
906 outb(OP0_SWIT_TO_PORT_1 | CR0_CHNL, ioaddr);
907 if (znet_debug > 5)
908 printk(KERN_DEBUG "Updating stop hit with value %02x.\n",
909 (rx_stop_offset >> 6) | CR1_STOP_REG_UPDATE);
910 outb((rx_stop_offset >> 6) | CR1_STOP_REG_UPDATE, ioaddr);
911 outb(OP1_SWIT_TO_PORT_0, ioaddr);
912}
913
914static __exit void znet_cleanup (void)
915{
916 if (znet_dev) {
917 struct znet_private *znet = znet_dev->priv;
918
919 unregister_netdev (znet_dev);
920 kfree (znet->rx_start);
921 kfree (znet->tx_start);
922 free_netdev (znet_dev);
923 }
924}
925
926module_init (znet_probe);
927module_exit (znet_cleanup);
928