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
89
90
91
92
93#ifdef __alpha__
94#define LOCKUP16 1
95#endif
96#ifndef LOCKUP16
97#define LOCKUP16 0
98#endif
99
100#include <linux/module.h>
101#include <linux/kernel.h>
102#include <linux/types.h>
103#include <linux/fcntl.h>
104#include <linux/interrupt.h>
105#include <linux/ioport.h>
106#include <linux/string.h>
107#include <linux/in.h>
108#include <linux/delay.h>
109#include <linux/errno.h>
110#include <linux/init.h>
111#include <linux/netdevice.h>
112#include <linux/etherdevice.h>
113#include <linux/skbuff.h>
114#include <linux/slab.h>
115#include <linux/mca-legacy.h>
116#include <linux/spinlock.h>
117#include <linux/bitops.h>
118#include <linux/jiffies.h>
119
120#include <asm/system.h>
121#include <asm/io.h>
122#include <asm/irq.h>
123
124#ifndef NET_DEBUG
125#define NET_DEBUG 4
126#endif
127
128#include "eexpress.h"
129
130#define EEXP_IO_EXTENT 16
131
132
133
134
135
136struct net_local
137{
138 unsigned long last_tx;
139 unsigned long init_time;
140 unsigned short rx_first;
141 unsigned short rx_last;
142 unsigned short rx_ptr;
143 unsigned short tx_head;
144 unsigned short tx_reap;
145 unsigned short tx_tail;
146 unsigned short tx_link;
147 unsigned short last_tx_restart;
148
149 unsigned char started;
150 unsigned short rx_buf_start;
151 unsigned short rx_buf_end;
152 unsigned short num_tx_bufs;
153 unsigned short num_rx_bufs;
154 unsigned char width;
155 unsigned char was_promisc;
156 unsigned char old_mc_count;
157 spinlock_t lock;
158};
159
160
161
162
163
164static unsigned short start_code[] = {
165
166 0x0001,
167 0x0008,0x0000,0x0000,
168
169 0x0000,0x0000,
170 0x0000,0x0000,
171
172 0x0000,0x0000,
173 0x0000,0x0000,
174
175 0x0000,0x0000,
176 0x0000,0x0000,
177
178
179#define CONF_LINK 0x20
180 0x0000,Cmd_Config,
181 0x0032,
182 0x080c,
183 0x2e40,
184
185
186
187
188 0x6000,
189
190 0xf200,
191
192#define CONF_PROMISC 0x2e
193 0x0000,
194
195 0x003c,
196
197 0x0000,Cmd_SetAddr,
198 0x003e,
199#define CONF_HWADDR 0x38
200 0x0000,0x0000,0x0000,
201
202 0x0000,Cmd_MCast,
203 0x0076,
204#define CONF_NR_MULTICAST 0x44
205 0x0000,
206#define CONF_MULTICAST 0x46
207 0x0000, 0x0000, 0x0000,
208 0x0000, 0x0000, 0x0000,
209 0x0000, 0x0000, 0x0000,
210 0x0000, 0x0000, 0x0000,
211 0x0000, 0x0000, 0x0000,
212 0x0000, 0x0000, 0x0000,
213 0x0000, 0x0000, 0x0000,
214 0x0000, 0x0000, 0x0000,
215
216#define CONF_DIAG_RESULT 0x76
217 0x0000, Cmd_Diag,
218 0x007c,
219
220 0x0000,Cmd_TDR|Cmd_INT,
221 0x0084,
222#define CONF_TDR_RESULT 0x82
223 0x0000,
224
225 0x0000,Cmd_END|Cmd_Nop,
226 0x0084
227};
228
229
230static char irqrmap[] = { 0,0,1,2,3,4,0,0,0,1,5,6,0,0,0,0 };
231
232#ifdef CONFIG_MCA_LEGACY
233
234static unsigned short mca_iomap[] = {
235 0x270, 0x260, 0x250, 0x240, 0x230, 0x220, 0x210, 0x200,
236 0x370, 0x360, 0x350, 0x340, 0x330, 0x320, 0x310, 0x300
237};
238
239static char mca_irqmap[] = { 12, 9, 3, 4, 5, 10, 11, 15 };
240#endif
241
242
243
244
245
246static int eexp_open(struct net_device *dev);
247static int eexp_close(struct net_device *dev);
248static void eexp_timeout(struct net_device *dev);
249static netdev_tx_t eexp_xmit(struct sk_buff *buf,
250 struct net_device *dev);
251
252static irqreturn_t eexp_irq(int irq, void *dev_addr);
253static void eexp_set_multicast(struct net_device *dev);
254
255
256
257
258
259static void eexp_hw_rx_pio(struct net_device *dev);
260static void eexp_hw_tx_pio(struct net_device *dev, unsigned short *buf,
261 unsigned short len);
262static int eexp_hw_probe(struct net_device *dev,unsigned short ioaddr);
263static unsigned short eexp_hw_readeeprom(unsigned short ioaddr,
264 unsigned char location);
265
266static unsigned short eexp_hw_lasttxstat(struct net_device *dev);
267static void eexp_hw_txrestart(struct net_device *dev);
268
269static void eexp_hw_txinit (struct net_device *dev);
270static void eexp_hw_rxinit (struct net_device *dev);
271
272static void eexp_hw_init586 (struct net_device *dev);
273static void eexp_setup_filter (struct net_device *dev);
274
275static char *eexp_ifmap[]={"AUI", "BNC", "RJ45"};
276enum eexp_iftype {AUI=0, BNC=1, TPE=2};
277
278#define STARTED_RU 2
279#define STARTED_CU 1
280
281
282
283
284
285static inline unsigned short scb_status(struct net_device *dev)
286{
287 return inw(dev->base_addr + 0xc008);
288}
289
290static inline unsigned short scb_rdcmd(struct net_device *dev)
291{
292 return inw(dev->base_addr + 0xc00a);
293}
294
295static inline void scb_command(struct net_device *dev, unsigned short cmd)
296{
297 outw(cmd, dev->base_addr + 0xc00a);
298}
299
300static inline void scb_wrcbl(struct net_device *dev, unsigned short val)
301{
302 outw(val, dev->base_addr + 0xc00c);
303}
304
305static inline void scb_wrrfa(struct net_device *dev, unsigned short val)
306{
307 outw(val, dev->base_addr + 0xc00e);
308}
309
310static inline void set_loopback(struct net_device *dev)
311{
312 outb(inb(dev->base_addr + Config) | 2, dev->base_addr + Config);
313}
314
315static inline void clear_loopback(struct net_device *dev)
316{
317 outb(inb(dev->base_addr + Config) & ~2, dev->base_addr + Config);
318}
319
320static inline unsigned short int SHADOW(short int addr)
321{
322 addr &= 0x1f;
323 if (addr > 0xf) addr += 0x3ff0;
324 return addr + 0x4000;
325}
326
327
328
329
330
331
332
333
334
335static int __init do_express_probe(struct net_device *dev)
336{
337 unsigned short *port;
338 static unsigned short ports[] = { 0x240,0x300,0x310,0x270,0x320,0x340,0 };
339 unsigned short ioaddr = dev->base_addr;
340 int dev_irq = dev->irq;
341 int err;
342
343 dev->if_port = 0xff;
344
345#ifdef CONFIG_MCA_LEGACY
346 if (MCA_bus) {
347 int slot = 0;
348
349
350
351
352
353
354
355 while (slot != MCA_NOTFOUND) {
356 int pos0, pos1;
357
358 slot = mca_find_unused_adapter(0x628B, slot);
359 if (slot == MCA_NOTFOUND)
360 break;
361
362 pos0 = mca_read_stored_pos(slot, 2);
363 pos1 = mca_read_stored_pos(slot, 3);
364 ioaddr = mca_iomap[pos1&0xf];
365
366 dev->irq = mca_irqmap[(pos1>>4)&0x7];
367
368
369
370
371
372
373
374
375 if ((pos0 & 0x7) == 0x1)
376 dev->if_port = AUI;
377 else if ((pos0 & 0x7) == 0x5) {
378 if (pos1 & 0x80)
379 dev->if_port = BNC;
380 else
381 dev->if_port = TPE;
382 }
383
384 mca_set_adapter_name(slot, "Intel EtherExpress 16 MCA");
385 mca_set_adapter_procfn(slot, NULL, dev);
386 mca_mark_as_used(slot);
387
388 break;
389 }
390 }
391#endif
392 if (ioaddr&0xfe00) {
393 if (!request_region(ioaddr, EEXP_IO_EXTENT, "EtherExpress"))
394 return -EBUSY;
395 err = eexp_hw_probe(dev,ioaddr);
396 release_region(ioaddr, EEXP_IO_EXTENT);
397 return err;
398 } else if (ioaddr)
399 return -ENXIO;
400
401 for (port=&ports[0] ; *port ; port++ )
402 {
403 unsigned short sum = 0;
404 int i;
405 if (!request_region(*port, EEXP_IO_EXTENT, "EtherExpress"))
406 continue;
407 for ( i=0 ; i<4 ; i++ )
408 {
409 unsigned short t;
410 t = inb(*port + ID_PORT);
411 sum |= (t>>4) << ((t & 0x03)<<2);
412 }
413 if (sum==0xbaba && !eexp_hw_probe(dev,*port)) {
414 release_region(*port, EEXP_IO_EXTENT);
415 return 0;
416 }
417 release_region(*port, EEXP_IO_EXTENT);
418 dev->irq = dev_irq;
419 }
420 return -ENODEV;
421}
422
423#ifndef MODULE
424struct net_device * __init express_probe(int unit)
425{
426 struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
427 int err;
428
429 if (!dev)
430 return ERR_PTR(-ENOMEM);
431
432 sprintf(dev->name, "eth%d", unit);
433 netdev_boot_setup_check(dev);
434
435 err = do_express_probe(dev);
436 if (!err)
437 return dev;
438 free_netdev(dev);
439 return ERR_PTR(err);
440}
441#endif
442
443
444
445
446
447static int eexp_open(struct net_device *dev)
448{
449 int ret;
450 unsigned short ioaddr = dev->base_addr;
451 struct net_local *lp = netdev_priv(dev);
452
453#if NET_DEBUG > 6
454 printk(KERN_DEBUG "%s: eexp_open()\n", dev->name);
455#endif
456
457 if (!dev->irq || !irqrmap[dev->irq])
458 return -ENXIO;
459
460 ret = request_irq(dev->irq, &eexp_irq, 0, dev->name, dev);
461 if (ret)
462 return ret;
463
464 if (!request_region(ioaddr, EEXP_IO_EXTENT, "EtherExpress")) {
465 printk(KERN_WARNING "EtherExpress io port %x, is busy.\n"
466 , ioaddr);
467 goto err_out1;
468 }
469 if (!request_region(ioaddr+0x4000, EEXP_IO_EXTENT, "EtherExpress shadow")) {
470 printk(KERN_WARNING "EtherExpress io port %x, is busy.\n"
471 , ioaddr+0x4000);
472 goto err_out2;
473 }
474 if (!request_region(ioaddr+0x8000, EEXP_IO_EXTENT, "EtherExpress shadow")) {
475 printk(KERN_WARNING "EtherExpress io port %x, is busy.\n"
476 , ioaddr+0x8000);
477 goto err_out3;
478 }
479 if (!request_region(ioaddr+0xc000, EEXP_IO_EXTENT, "EtherExpress shadow")) {
480 printk(KERN_WARNING "EtherExpress io port %x, is busy.\n"
481 , ioaddr+0xc000);
482 goto err_out4;
483 }
484
485 if (lp->width) {
486 printk("%s: forcing ASIC to 8-bit mode\n", dev->name);
487 outb(inb(dev->base_addr+Config)&~4, dev->base_addr+Config);
488 }
489
490 eexp_hw_init586(dev);
491 netif_start_queue(dev);
492#if NET_DEBUG > 6
493 printk(KERN_DEBUG "%s: leaving eexp_open()\n", dev->name);
494#endif
495 return 0;
496
497 err_out4:
498 release_region(ioaddr+0x8000, EEXP_IO_EXTENT);
499 err_out3:
500 release_region(ioaddr+0x4000, EEXP_IO_EXTENT);
501 err_out2:
502 release_region(ioaddr, EEXP_IO_EXTENT);
503 err_out1:
504 free_irq(dev->irq, dev);
505 return -EBUSY;
506}
507
508
509
510
511
512static int eexp_close(struct net_device *dev)
513{
514 unsigned short ioaddr = dev->base_addr;
515 struct net_local *lp = netdev_priv(dev);
516
517 int irq = dev->irq;
518
519 netif_stop_queue(dev);
520
521 outb(SIRQ_dis|irqrmap[irq],ioaddr+SET_IRQ);
522 lp->started = 0;
523 scb_command(dev, SCB_CUsuspend|SCB_RUsuspend);
524 outb(0,ioaddr+SIGNAL_CA);
525 free_irq(irq,dev);
526 outb(i586_RST,ioaddr+EEPROM_Ctrl);
527 release_region(ioaddr, EEXP_IO_EXTENT);
528 release_region(ioaddr+0x4000, 16);
529 release_region(ioaddr+0x8000, 16);
530 release_region(ioaddr+0xc000, 16);
531
532 return 0;
533}
534
535
536
537
538
539
540static void unstick_cu(struct net_device *dev)
541{
542 struct net_local *lp = netdev_priv(dev);
543 unsigned short ioaddr = dev->base_addr;
544
545 if (lp->started)
546 {
547 if (time_after(jiffies, dev->trans_start + 50))
548 {
549 if (lp->tx_link==lp->last_tx_restart)
550 {
551 unsigned short boguscount=200,rsst;
552 printk(KERN_WARNING "%s: Retransmit timed out, status %04x, resetting...\n",
553 dev->name, scb_status(dev));
554 eexp_hw_txinit(dev);
555 lp->last_tx_restart = 0;
556 scb_wrcbl(dev, lp->tx_link);
557 scb_command(dev, SCB_CUstart);
558 outb(0,ioaddr+SIGNAL_CA);
559 while (!SCB_complete(rsst=scb_status(dev)))
560 {
561 if (!--boguscount)
562 {
563 boguscount=200;
564 printk(KERN_WARNING "%s: Reset timed out status %04x, retrying...\n",
565 dev->name,rsst);
566 scb_wrcbl(dev, lp->tx_link);
567 scb_command(dev, SCB_CUstart);
568 outb(0,ioaddr+SIGNAL_CA);
569 }
570 }
571 netif_wake_queue(dev);
572 }
573 else
574 {
575 unsigned short status = scb_status(dev);
576 if (SCB_CUdead(status))
577 {
578 unsigned short txstatus = eexp_hw_lasttxstat(dev);
579 printk(KERN_WARNING "%s: Transmit timed out, CU not active status %04x %04x, restarting...\n",
580 dev->name, status, txstatus);
581 eexp_hw_txrestart(dev);
582 }
583 else
584 {
585 unsigned short txstatus = eexp_hw_lasttxstat(dev);
586 if (netif_queue_stopped(dev) && !txstatus)
587 {
588 printk(KERN_WARNING "%s: CU wedged, status %04x %04x, resetting...\n",
589 dev->name,status,txstatus);
590 eexp_hw_init586(dev);
591 netif_wake_queue(dev);
592 }
593 else
594 {
595 printk(KERN_WARNING "%s: transmit timed out\n", dev->name);
596 }
597 }
598 }
599 }
600 }
601 else
602 {
603 if (time_after(jiffies, lp->init_time + 10))
604 {
605 unsigned short status = scb_status(dev);
606 printk(KERN_WARNING "%s: i82586 startup timed out, status %04x, resetting...\n",
607 dev->name, status);
608 eexp_hw_init586(dev);
609 netif_wake_queue(dev);
610 }
611 }
612}
613
614static void eexp_timeout(struct net_device *dev)
615{
616 struct net_local *lp = netdev_priv(dev);
617#ifdef CONFIG_SMP
618 unsigned long flags;
619#endif
620 int status;
621
622 disable_irq(dev->irq);
623
624
625
626
627
628
629#ifdef CONFIG_SMP
630 spin_lock_irqsave(&lp->lock, flags);
631#endif
632
633 status = scb_status(dev);
634 unstick_cu(dev);
635 printk(KERN_INFO "%s: transmit timed out, %s?\n", dev->name,
636 (SCB_complete(status)?"lost interrupt":
637 "board on fire"));
638 dev->stats.tx_errors++;
639 lp->last_tx = jiffies;
640 if (!SCB_complete(status)) {
641 scb_command(dev, SCB_CUabort);
642 outb(0,dev->base_addr+SIGNAL_CA);
643 }
644 netif_wake_queue(dev);
645#ifdef CONFIG_SMP
646 spin_unlock_irqrestore(&lp->lock, flags);
647#endif
648}
649
650
651
652
653
654static netdev_tx_t eexp_xmit(struct sk_buff *buf, struct net_device *dev)
655{
656 short length = buf->len;
657#ifdef CONFIG_SMP
658 struct net_local *lp = netdev_priv(dev);
659 unsigned long flags;
660#endif
661
662#if NET_DEBUG > 6
663 printk(KERN_DEBUG "%s: eexp_xmit()\n", dev->name);
664#endif
665
666 if (buf->len < ETH_ZLEN) {
667 if (skb_padto(buf, ETH_ZLEN))
668 return NETDEV_TX_OK;
669 length = ETH_ZLEN;
670 }
671
672 disable_irq(dev->irq);
673
674
675
676
677
678
679#ifdef CONFIG_SMP
680 spin_lock_irqsave(&lp->lock, flags);
681#endif
682
683 {
684 unsigned short *data = (unsigned short *)buf->data;
685
686 dev->stats.tx_bytes += length;
687
688 eexp_hw_tx_pio(dev,data,length);
689 }
690 dev_kfree_skb(buf);
691#ifdef CONFIG_SMP
692 spin_unlock_irqrestore(&lp->lock, flags);
693#endif
694 enable_irq(dev->irq);
695 return NETDEV_TX_OK;
696}
697
698
699
700
701
702
703
704
705static unsigned short eexp_start_irq(struct net_device *dev,
706 unsigned short status)
707{
708 unsigned short ack_cmd = SCB_ack(status);
709 struct net_local *lp = netdev_priv(dev);
710 unsigned short ioaddr = dev->base_addr;
711 if ((dev->flags & IFF_UP) && !(lp->started & STARTED_CU)) {
712 short diag_status, tdr_status;
713 while (SCB_CUstat(status)==2)
714 status = scb_status(dev);
715#if NET_DEBUG > 4
716 printk("%s: CU went non-active (status %04x)\n",
717 dev->name, status);
718#endif
719
720 outw(CONF_DIAG_RESULT & ~31, ioaddr + SM_PTR);
721 diag_status = inw(ioaddr + SHADOW(CONF_DIAG_RESULT));
722 if (diag_status & 1<<11) {
723 printk(KERN_WARNING "%s: 82586 failed self-test\n",
724 dev->name);
725 } else if (!(diag_status & 1<<13)) {
726 printk(KERN_WARNING "%s: 82586 self-test failed to complete\n", dev->name);
727 }
728
729 outw(CONF_TDR_RESULT & ~31, ioaddr + SM_PTR);
730 tdr_status = inw(ioaddr + SHADOW(CONF_TDR_RESULT));
731 if (tdr_status & (TDR_SHORT|TDR_OPEN)) {
732 printk(KERN_WARNING "%s: TDR reports cable %s at %d tick%s\n", dev->name, (tdr_status & TDR_SHORT)?"short":"broken", tdr_status & TDR_TIME, ((tdr_status & TDR_TIME) != 1) ? "s" : "");
733 }
734 else if (tdr_status & TDR_XCVRPROBLEM) {
735 printk(KERN_WARNING "%s: TDR reports transceiver problem\n", dev->name);
736 }
737 else if (tdr_status & TDR_LINKOK) {
738#if NET_DEBUG > 4
739 printk(KERN_DEBUG "%s: TDR reports link OK\n", dev->name);
740#endif
741 } else {
742 printk("%s: TDR is ga-ga (status %04x)\n", dev->name,
743 tdr_status);
744 }
745
746 lp->started |= STARTED_CU;
747 scb_wrcbl(dev, lp->tx_link);
748
749 if (!(lp->started & STARTED_RU)) {
750 ack_cmd |= SCB_RUstart;
751 scb_wrrfa(dev, lp->rx_buf_start);
752 lp->rx_ptr = lp->rx_buf_start;
753 lp->started |= STARTED_RU;
754 }
755 ack_cmd |= SCB_CUstart | 0x2000;
756 }
757
758 if ((dev->flags & IFF_UP) && !(lp->started & STARTED_RU) && SCB_RUstat(status)==4)
759 lp->started|=STARTED_RU;
760
761 return ack_cmd;
762}
763
764static void eexp_cmd_clear(struct net_device *dev)
765{
766 unsigned long int oldtime = jiffies;
767 while (scb_rdcmd(dev) && (time_before(jiffies, oldtime + 10)));
768 if (scb_rdcmd(dev)) {
769 printk("%s: command didn't clear\n", dev->name);
770 }
771}
772
773static irqreturn_t eexp_irq(int dummy, void *dev_info)
774{
775 struct net_device *dev = dev_info;
776 struct net_local *lp;
777 unsigned short ioaddr,status,ack_cmd;
778 unsigned short old_read_ptr, old_write_ptr;
779
780 lp = netdev_priv(dev);
781 ioaddr = dev->base_addr;
782
783 spin_lock(&lp->lock);
784
785 old_read_ptr = inw(ioaddr+READ_PTR);
786 old_write_ptr = inw(ioaddr+WRITE_PTR);
787
788 outb(SIRQ_dis|irqrmap[dev->irq], ioaddr+SET_IRQ);
789
790 status = scb_status(dev);
791
792#if NET_DEBUG > 4
793 printk(KERN_DEBUG "%s: interrupt (status %x)\n", dev->name, status);
794#endif
795
796 if (lp->started == (STARTED_CU | STARTED_RU)) {
797
798 do {
799 eexp_cmd_clear(dev);
800
801 ack_cmd = SCB_ack(status);
802 scb_command(dev, ack_cmd);
803 outb(0,ioaddr+SIGNAL_CA);
804
805 eexp_cmd_clear(dev);
806
807 if (SCB_complete(status)) {
808 if (!eexp_hw_lasttxstat(dev)) {
809 printk("%s: tx interrupt but no status\n", dev->name);
810 }
811 }
812
813 if (SCB_rxdframe(status))
814 eexp_hw_rx_pio(dev);
815
816 status = scb_status(dev);
817 } while (status & 0xc000);
818
819 if (SCB_RUdead(status))
820 {
821 printk(KERN_WARNING "%s: RU stopped: status %04x\n",
822 dev->name,status);
823#if 0
824 printk(KERN_WARNING "%s: cur_rfd=%04x, cur_rbd=%04x\n", dev->name, lp->cur_rfd, lp->cur_rbd);
825 outw(lp->cur_rfd, ioaddr+READ_PTR);
826 printk(KERN_WARNING "%s: [%04x]\n", dev->name, inw(ioaddr+DATAPORT));
827 outw(lp->cur_rfd+6, ioaddr+READ_PTR);
828 printk(KERN_WARNING "%s: rbd is %04x\n", dev->name, rbd= inw(ioaddr+DATAPORT));
829 outw(rbd, ioaddr+READ_PTR);
830 printk(KERN_WARNING "%s: [%04x %04x] ", dev->name, inw(ioaddr+DATAPORT), inw(ioaddr+DATAPORT));
831 outw(rbd+8, ioaddr+READ_PTR);
832 printk("[%04x]\n", inw(ioaddr+DATAPORT));
833#endif
834 dev->stats.rx_errors++;
835#if 1
836 eexp_hw_rxinit(dev);
837#else
838 lp->cur_rfd = lp->first_rfd;
839#endif
840 scb_wrrfa(dev, lp->rx_buf_start);
841 scb_command(dev, SCB_RUstart);
842 outb(0,ioaddr+SIGNAL_CA);
843 }
844 } else {
845 if (status & 0x8000)
846 ack_cmd = eexp_start_irq(dev, status);
847 else
848 ack_cmd = SCB_ack(status);
849 scb_command(dev, ack_cmd);
850 outb(0,ioaddr+SIGNAL_CA);
851 }
852
853 eexp_cmd_clear(dev);
854
855 outb(SIRQ_en|irqrmap[dev->irq], ioaddr+SET_IRQ);
856
857#if NET_DEBUG > 6
858 printk("%s: leaving eexp_irq()\n", dev->name);
859#endif
860 outw(old_read_ptr, ioaddr+READ_PTR);
861 outw(old_write_ptr, ioaddr+WRITE_PTR);
862
863 spin_unlock(&lp->lock);
864 return IRQ_HANDLED;
865}
866
867
868
869
870
871
872
873
874
875static void eexp_hw_set_interface(struct net_device *dev)
876{
877 unsigned char oldval = inb(dev->base_addr + 0x300e);
878 oldval &= ~0x82;
879 switch (dev->if_port) {
880 case TPE:
881 oldval |= 0x2;
882 case BNC:
883 oldval |= 0x80;
884 break;
885 }
886 outb(oldval, dev->base_addr+0x300e);
887 mdelay(20);
888}
889
890
891
892
893
894
895
896static void eexp_hw_rx_pio(struct net_device *dev)
897{
898 struct net_local *lp = netdev_priv(dev);
899 unsigned short rx_block = lp->rx_ptr;
900 unsigned short boguscount = lp->num_rx_bufs;
901 unsigned short ioaddr = dev->base_addr;
902 unsigned short status;
903
904#if NET_DEBUG > 6
905 printk(KERN_DEBUG "%s: eexp_hw_rx()\n", dev->name);
906#endif
907
908 do {
909 unsigned short rfd_cmd, rx_next, pbuf, pkt_len;
910
911 outw(rx_block, ioaddr + READ_PTR);
912 status = inw(ioaddr + DATAPORT);
913
914 if (FD_Done(status))
915 {
916 rfd_cmd = inw(ioaddr + DATAPORT);
917 rx_next = inw(ioaddr + DATAPORT);
918 pbuf = inw(ioaddr + DATAPORT);
919
920 outw(pbuf, ioaddr + READ_PTR);
921 pkt_len = inw(ioaddr + DATAPORT);
922
923 if (rfd_cmd!=0x0000)
924 {
925 printk(KERN_WARNING "%s: rfd_cmd not zero:0x%04x\n",
926 dev->name, rfd_cmd);
927 continue;
928 }
929 else if (pbuf!=rx_block+0x16)
930 {
931 printk(KERN_WARNING "%s: rfd and rbd out of sync 0x%04x 0x%04x\n",
932 dev->name, rx_block+0x16, pbuf);
933 continue;
934 }
935 else if ((pkt_len & 0xc000)!=0xc000)
936 {
937 printk(KERN_WARNING "%s: EOF or F not set on received buffer (%04x)\n",
938 dev->name, pkt_len & 0xc000);
939 continue;
940 }
941 else if (!FD_OK(status))
942 {
943 dev->stats.rx_errors++;
944 if (FD_CRC(status))
945 dev->stats.rx_crc_errors++;
946 if (FD_Align(status))
947 dev->stats.rx_frame_errors++;
948 if (FD_Resrc(status))
949 dev->stats.rx_fifo_errors++;
950 if (FD_DMA(status))
951 dev->stats.rx_over_errors++;
952 if (FD_Short(status))
953 dev->stats.rx_length_errors++;
954 }
955 else
956 {
957 struct sk_buff *skb;
958 pkt_len &= 0x3fff;
959 skb = dev_alloc_skb(pkt_len+16);
960 if (skb == NULL)
961 {
962 printk(KERN_WARNING "%s: Memory squeeze, dropping packet\n",dev->name);
963 dev->stats.rx_dropped++;
964 break;
965 }
966 skb_reserve(skb, 2);
967 outw(pbuf+10, ioaddr+READ_PTR);
968 insw(ioaddr+DATAPORT, skb_put(skb,pkt_len),(pkt_len+1)>>1);
969 skb->protocol = eth_type_trans(skb,dev);
970 netif_rx(skb);
971 dev->stats.rx_packets++;
972 dev->stats.rx_bytes += pkt_len;
973 }
974 outw(rx_block, ioaddr+WRITE_PTR);
975 outw(0, ioaddr+DATAPORT);
976 outw(0, ioaddr+DATAPORT);
977 rx_block = rx_next;
978 }
979 } while (FD_Done(status) && boguscount--);
980 lp->rx_ptr = rx_block;
981}
982
983
984
985
986
987
988
989
990static void eexp_hw_tx_pio(struct net_device *dev, unsigned short *buf,
991 unsigned short len)
992{
993 struct net_local *lp = netdev_priv(dev);
994 unsigned short ioaddr = dev->base_addr;
995
996 if (LOCKUP16 || lp->width) {
997
998
999
1000
1001
1002 scb_command(dev, SCB_CUsuspend);
1003 outw(0xFFFF, ioaddr+SIGNAL_CA);
1004 }
1005
1006 outw(lp->tx_head, ioaddr + WRITE_PTR);
1007
1008 outw(0x0000, ioaddr + DATAPORT);
1009 outw(Cmd_INT|Cmd_Xmit, ioaddr + DATAPORT);
1010 outw(lp->tx_head+0x08, ioaddr + DATAPORT);
1011 outw(lp->tx_head+0x0e, ioaddr + DATAPORT);
1012
1013 outw(0x0000, ioaddr + DATAPORT);
1014 outw(0x0000, ioaddr + DATAPORT);
1015 outw(lp->tx_head+0x08, ioaddr + DATAPORT);
1016
1017 outw(0x8000|len, ioaddr + DATAPORT);
1018 outw(-1, ioaddr + DATAPORT);
1019 outw(lp->tx_head+0x16, ioaddr + DATAPORT);
1020 outw(0, ioaddr + DATAPORT);
1021
1022 outsw(ioaddr + DATAPORT, buf, (len+1)>>1);
1023
1024 outw(lp->tx_tail+0xc, ioaddr + WRITE_PTR);
1025 outw(lp->tx_head, ioaddr + DATAPORT);
1026
1027 dev->trans_start = jiffies;
1028 lp->tx_tail = lp->tx_head;
1029 if (lp->tx_head==TX_BUF_START+((lp->num_tx_bufs-1)*TX_BUF_SIZE))
1030 lp->tx_head = TX_BUF_START;
1031 else
1032 lp->tx_head += TX_BUF_SIZE;
1033 if (lp->tx_head != lp->tx_reap)
1034 netif_wake_queue(dev);
1035
1036 if (LOCKUP16 || lp->width) {
1037
1038
1039 scb_command(dev, SCB_CUresume);
1040 outw(0xFFFF, ioaddr+SIGNAL_CA);
1041 }
1042
1043 dev->stats.tx_packets++;
1044 lp->last_tx = jiffies;
1045}
1046
1047static const struct net_device_ops eexp_netdev_ops = {
1048 .ndo_open = eexp_open,
1049 .ndo_stop = eexp_close,
1050 .ndo_start_xmit = eexp_xmit,
1051 .ndo_set_multicast_list = eexp_set_multicast,
1052 .ndo_tx_timeout = eexp_timeout,
1053 .ndo_change_mtu = eth_change_mtu,
1054 .ndo_set_mac_address = eth_mac_addr,
1055 .ndo_validate_addr = eth_validate_addr,
1056};
1057
1058
1059
1060
1061
1062
1063
1064
1065static int __init eexp_hw_probe(struct net_device *dev, unsigned short ioaddr)
1066{
1067 unsigned short hw_addr[3];
1068 unsigned char buswidth;
1069 unsigned int memory_size;
1070 int i;
1071 unsigned short xsum = 0;
1072 struct net_local *lp = netdev_priv(dev);
1073
1074 printk("%s: EtherExpress 16 at %#x ",dev->name,ioaddr);
1075
1076 outb(ASIC_RST, ioaddr+EEPROM_Ctrl);
1077 outb(0, ioaddr+EEPROM_Ctrl);
1078 udelay(500);
1079 outb(i586_RST, ioaddr+EEPROM_Ctrl);
1080
1081 hw_addr[0] = eexp_hw_readeeprom(ioaddr,2);
1082 hw_addr[1] = eexp_hw_readeeprom(ioaddr,3);
1083 hw_addr[2] = eexp_hw_readeeprom(ioaddr,4);
1084
1085
1086 if (!((hw_addr[2]==0x00aa && ((hw_addr[1] & 0xff00)==0x0000)) ||
1087 (hw_addr[2]==0x0080 && ((hw_addr[1] & 0xff00)==0x5F00))))
1088 {
1089 printk(" rejected: invalid address %04x%04x%04x\n",
1090 hw_addr[2],hw_addr[1],hw_addr[0]);
1091 return -ENODEV;
1092 }
1093
1094
1095
1096
1097 for (i = 0; i < 64; i++)
1098 xsum += eexp_hw_readeeprom(ioaddr, i);
1099 if (xsum != 0xbaba)
1100 printk(" (bad EEPROM xsum 0x%02x)", xsum);
1101
1102 dev->base_addr = ioaddr;
1103 for ( i=0 ; i<6 ; i++ )
1104 dev->dev_addr[i] = ((unsigned char *)hw_addr)[5-i];
1105
1106 {
1107 static char irqmap[]={0, 9, 3, 4, 5, 10, 11, 0};
1108 unsigned short setupval = eexp_hw_readeeprom(ioaddr,0);
1109
1110
1111 if (!dev->irq)
1112 dev->irq = irqmap[setupval>>13];
1113
1114 if (dev->if_port == 0xff) {
1115 dev->if_port = !(setupval & 0x1000) ? AUI :
1116 eexp_hw_readeeprom(ioaddr,5) & 0x1 ? TPE : BNC;
1117 }
1118
1119 buswidth = !((setupval & 0x400) >> 10);
1120 }
1121
1122 memset(lp, 0, sizeof(struct net_local));
1123 spin_lock_init(&lp->lock);
1124
1125 printk("(IRQ %d, %s connector, %d-bit bus", dev->irq,
1126 eexp_ifmap[dev->if_port], buswidth?8:16);
1127
1128 if (!request_region(dev->base_addr + 0x300e, 1, "EtherExpress"))
1129 return -EBUSY;
1130
1131 eexp_hw_set_interface(dev);
1132
1133 release_region(dev->base_addr + 0x300e, 1);
1134
1135
1136 outw(0, dev->base_addr + WRITE_PTR);
1137 for (i = 0; i < 32768; i++)
1138 outw(0, dev->base_addr + DATAPORT);
1139
1140 for (memory_size = 0; memory_size < 64; memory_size++)
1141 {
1142 outw(memory_size<<10, dev->base_addr + READ_PTR);
1143 if (inw(dev->base_addr+DATAPORT))
1144 break;
1145 outw(memory_size<<10, dev->base_addr + WRITE_PTR);
1146 outw(memory_size | 0x5000, dev->base_addr+DATAPORT);
1147 outw(memory_size<<10, dev->base_addr + READ_PTR);
1148 if (inw(dev->base_addr+DATAPORT) != (memory_size | 0x5000))
1149 break;
1150 }
1151
1152
1153
1154
1155 lp->num_tx_bufs = 4;
1156 lp->rx_buf_end = 0x3ff6;
1157 switch (memory_size)
1158 {
1159 case 64:
1160 lp->rx_buf_end += 0x4000;
1161 case 48:
1162 lp->num_tx_bufs += 4;
1163 lp->rx_buf_end += 0x4000;
1164 case 32:
1165 lp->rx_buf_end += 0x4000;
1166 case 16:
1167 printk(", %dk RAM)\n", memory_size);
1168 break;
1169 default:
1170 printk(") bad memory size (%dk).\n", memory_size);
1171 return -ENODEV;
1172 break;
1173 }
1174
1175 lp->rx_buf_start = TX_BUF_START + (lp->num_tx_bufs*TX_BUF_SIZE);
1176 lp->width = buswidth;
1177
1178 dev->netdev_ops = &eexp_netdev_ops;
1179 dev->watchdog_timeo = 2*HZ;
1180
1181 return register_netdev(dev);
1182}
1183
1184
1185
1186
1187
1188static unsigned short __init eexp_hw_readeeprom(unsigned short ioaddr,
1189 unsigned char location)
1190{
1191 unsigned short cmd = 0x180|(location&0x7f);
1192 unsigned short rval = 0,wval = EC_CS|i586_RST;
1193 int i;
1194
1195 outb(EC_CS|i586_RST,ioaddr+EEPROM_Ctrl);
1196 for (i=0x100 ; i ; i>>=1 )
1197 {
1198 if (cmd&i)
1199 wval |= EC_Wr;
1200 else
1201 wval &= ~EC_Wr;
1202
1203 outb(wval,ioaddr+EEPROM_Ctrl);
1204 outb(wval|EC_Clk,ioaddr+EEPROM_Ctrl);
1205 eeprom_delay();
1206 outb(wval,ioaddr+EEPROM_Ctrl);
1207 eeprom_delay();
1208 }
1209 wval &= ~EC_Wr;
1210 outb(wval,ioaddr+EEPROM_Ctrl);
1211 for (i=0x8000 ; i ; i>>=1 )
1212 {
1213 outb(wval|EC_Clk,ioaddr+EEPROM_Ctrl);
1214 eeprom_delay();
1215 if (inb(ioaddr+EEPROM_Ctrl)&EC_Rd)
1216 rval |= i;
1217 outb(wval,ioaddr+EEPROM_Ctrl);
1218 eeprom_delay();
1219 }
1220 wval &= ~EC_CS;
1221 outb(wval|EC_Clk,ioaddr+EEPROM_Ctrl);
1222 eeprom_delay();
1223 outb(wval,ioaddr+EEPROM_Ctrl);
1224 eeprom_delay();
1225 return rval;
1226}
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238static unsigned short eexp_hw_lasttxstat(struct net_device *dev)
1239{
1240 struct net_local *lp = netdev_priv(dev);
1241 unsigned short tx_block = lp->tx_reap;
1242 unsigned short status;
1243
1244 if (!netif_queue_stopped(dev) && lp->tx_head==lp->tx_reap)
1245 return 0x0000;
1246
1247 do
1248 {
1249 outw(tx_block & ~31, dev->base_addr + SM_PTR);
1250 status = inw(dev->base_addr + SHADOW(tx_block));
1251 if (!Stat_Done(status))
1252 {
1253 lp->tx_link = tx_block;
1254 return status;
1255 }
1256 else
1257 {
1258 lp->last_tx_restart = 0;
1259 dev->stats.collisions += Stat_NoColl(status);
1260 if (!Stat_OK(status))
1261 {
1262 char *whatsup = NULL;
1263 dev->stats.tx_errors++;
1264 if (Stat_Abort(status))
1265 dev->stats.tx_aborted_errors++;
1266 if (Stat_TNoCar(status)) {
1267 whatsup = "aborted, no carrier";
1268 dev->stats.tx_carrier_errors++;
1269 }
1270 if (Stat_TNoCTS(status)) {
1271 whatsup = "aborted, lost CTS";
1272 dev->stats.tx_carrier_errors++;
1273 }
1274 if (Stat_TNoDMA(status)) {
1275 whatsup = "FIFO underran";
1276 dev->stats.tx_fifo_errors++;
1277 }
1278 if (Stat_TXColl(status)) {
1279 whatsup = "aborted, too many collisions";
1280 dev->stats.tx_aborted_errors++;
1281 }
1282 if (whatsup)
1283 printk(KERN_INFO "%s: transmit %s\n",
1284 dev->name, whatsup);
1285 }
1286 else
1287 dev->stats.tx_packets++;
1288 }
1289 if (tx_block == TX_BUF_START+((lp->num_tx_bufs-1)*TX_BUF_SIZE))
1290 lp->tx_reap = tx_block = TX_BUF_START;
1291 else
1292 lp->tx_reap = tx_block += TX_BUF_SIZE;
1293 netif_wake_queue(dev);
1294 }
1295 while (lp->tx_reap != lp->tx_head);
1296
1297 lp->tx_link = lp->tx_tail + 0x08;
1298
1299 return status;
1300}
1301
1302
1303
1304
1305
1306
1307
1308static void eexp_hw_txrestart(struct net_device *dev)
1309{
1310 struct net_local *lp = netdev_priv(dev);
1311 unsigned short ioaddr = dev->base_addr;
1312
1313 lp->last_tx_restart = lp->tx_link;
1314 scb_wrcbl(dev, lp->tx_link);
1315 scb_command(dev, SCB_CUstart);
1316 outb(0,ioaddr+SIGNAL_CA);
1317
1318 {
1319 unsigned short boguscount=50,failcount=5;
1320 while (!scb_status(dev))
1321 {
1322 if (!--boguscount)
1323 {
1324 if (--failcount)
1325 {
1326 printk(KERN_WARNING "%s: CU start timed out, status %04x, cmd %04x\n", dev->name, scb_status(dev), scb_rdcmd(dev));
1327 scb_wrcbl(dev, lp->tx_link);
1328 scb_command(dev, SCB_CUstart);
1329 outb(0,ioaddr+SIGNAL_CA);
1330 boguscount = 100;
1331 }
1332 else
1333 {
1334 printk(KERN_WARNING "%s: Failed to restart CU, resetting board...\n",dev->name);
1335 eexp_hw_init586(dev);
1336 netif_wake_queue(dev);
1337 return;
1338 }
1339 }
1340 }
1341 }
1342}
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353static void eexp_hw_txinit(struct net_device *dev)
1354{
1355 struct net_local *lp = netdev_priv(dev);
1356 unsigned short tx_block = TX_BUF_START;
1357 unsigned short curtbuf;
1358 unsigned short ioaddr = dev->base_addr;
1359
1360 for ( curtbuf=0 ; curtbuf<lp->num_tx_bufs ; curtbuf++ )
1361 {
1362 outw(tx_block, ioaddr + WRITE_PTR);
1363
1364 outw(0x0000, ioaddr + DATAPORT);
1365 outw(Cmd_INT|Cmd_Xmit, ioaddr + DATAPORT);
1366 outw(tx_block+0x08, ioaddr + DATAPORT);
1367 outw(tx_block+0x0e, ioaddr + DATAPORT);
1368
1369 outw(0x0000, ioaddr + DATAPORT);
1370 outw(0x0000, ioaddr + DATAPORT);
1371 outw(tx_block+0x08, ioaddr + DATAPORT);
1372
1373 outw(0x8000, ioaddr + DATAPORT);
1374 outw(-1, ioaddr + DATAPORT);
1375 outw(tx_block+0x16, ioaddr + DATAPORT);
1376 outw(0x0000, ioaddr + DATAPORT);
1377
1378 tx_block += TX_BUF_SIZE;
1379 }
1380 lp->tx_head = TX_BUF_START;
1381 lp->tx_reap = TX_BUF_START;
1382 lp->tx_tail = tx_block - TX_BUF_SIZE;
1383 lp->tx_link = lp->tx_tail + 0x08;
1384 lp->rx_buf_start = tx_block;
1385
1386}
1387
1388
1389
1390
1391
1392
1393
1394
1395static void eexp_hw_rxinit(struct net_device *dev)
1396{
1397 struct net_local *lp = netdev_priv(dev);
1398 unsigned short rx_block = lp->rx_buf_start;
1399 unsigned short ioaddr = dev->base_addr;
1400
1401 lp->num_rx_bufs = 0;
1402 lp->rx_first = lp->rx_ptr = rx_block;
1403 do
1404 {
1405 lp->num_rx_bufs++;
1406
1407 outw(rx_block, ioaddr + WRITE_PTR);
1408
1409 outw(0, ioaddr + DATAPORT); outw(0, ioaddr+DATAPORT);
1410 outw(rx_block + RX_BUF_SIZE, ioaddr+DATAPORT);
1411 outw(0xffff, ioaddr+DATAPORT);
1412
1413 outw(0x0000, ioaddr+DATAPORT);
1414 outw(0xdead, ioaddr+DATAPORT);
1415 outw(0xdead, ioaddr+DATAPORT);
1416 outw(0xdead, ioaddr+DATAPORT);
1417 outw(0xdead, ioaddr+DATAPORT);
1418 outw(0xdead, ioaddr+DATAPORT);
1419 outw(0xdead, ioaddr+DATAPORT);
1420
1421 outw(0x0000, ioaddr+DATAPORT);
1422 outw(rx_block + RX_BUF_SIZE + 0x16, ioaddr+DATAPORT);
1423 outw(rx_block + 0x20, ioaddr+DATAPORT);
1424 outw(0, ioaddr+DATAPORT);
1425 outw(RX_BUF_SIZE-0x20, ioaddr+DATAPORT);
1426
1427 lp->rx_last = rx_block;
1428 rx_block += RX_BUF_SIZE;
1429 } while (rx_block <= lp->rx_buf_end-RX_BUF_SIZE);
1430
1431
1432
1433
1434 outw(lp->rx_first + 6, ioaddr+WRITE_PTR);
1435 outw(lp->rx_first + 0x16, ioaddr+DATAPORT);
1436
1437
1438 outw(lp->rx_last + 4, ioaddr+WRITE_PTR);
1439 outw(lp->rx_first, ioaddr+DATAPORT);
1440
1441
1442 outw(lp->rx_last + 0x16 + 2, ioaddr+WRITE_PTR);
1443 outw(lp->rx_first + 0x16, ioaddr+DATAPORT);
1444
1445}
1446
1447
1448
1449
1450
1451
1452
1453
1454static void eexp_hw_init586(struct net_device *dev)
1455{
1456 struct net_local *lp = netdev_priv(dev);
1457 unsigned short ioaddr = dev->base_addr;
1458 int i;
1459
1460#if NET_DEBUG > 6
1461 printk("%s: eexp_hw_init586()\n", dev->name);
1462#endif
1463
1464 lp->started = 0;
1465
1466 set_loopback(dev);
1467
1468 outb(SIRQ_dis|irqrmap[dev->irq],ioaddr+SET_IRQ);
1469
1470
1471 outw(lp->rx_buf_end & ~31, ioaddr + SM_PTR);
1472 outw(lp->width?0x0001:0x0000, ioaddr + 0x8006);
1473 outw(0x0000, ioaddr + 0x8008);
1474 outw(0x0000, ioaddr + 0x800a);
1475 outw(0x0000, ioaddr + 0x800c);
1476 outw(0x0000, ioaddr + 0x800e);
1477
1478 for (i = 0; i < ARRAY_SIZE(start_code) * 2; i+=32) {
1479 int j;
1480 outw(i, ioaddr + SM_PTR);
1481 for (j = 0; j < 16 && (i+j)/2 < ARRAY_SIZE(start_code); j+=2)
1482 outw(start_code[(i+j)/2],
1483 ioaddr+0x4000+j);
1484 for (j = 0; j < 16 && (i+j+16)/2 < ARRAY_SIZE(start_code); j+=2)
1485 outw(start_code[(i+j+16)/2],
1486 ioaddr+0x8000+j);
1487 }
1488
1489
1490 outw(CONF_PROMISC & ~31, ioaddr+SM_PTR);
1491 i = inw(ioaddr+SHADOW(CONF_PROMISC));
1492 outw((dev->flags & IFF_PROMISC)?(i|1):(i & ~1),
1493 ioaddr+SHADOW(CONF_PROMISC));
1494 lp->was_promisc = dev->flags & IFF_PROMISC;
1495#if 0
1496 eexp_setup_filter(dev);
1497#endif
1498
1499
1500 outw(CONF_HWADDR & ~31, ioaddr+SM_PTR);
1501 outw(((unsigned short *)dev->dev_addr)[0], ioaddr+SHADOW(CONF_HWADDR));
1502 outw(((unsigned short *)dev->dev_addr)[1],
1503 ioaddr+SHADOW(CONF_HWADDR+2));
1504 outw(((unsigned short *)dev->dev_addr)[2],
1505 ioaddr+SHADOW(CONF_HWADDR+4));
1506
1507 eexp_hw_txinit(dev);
1508 eexp_hw_rxinit(dev);
1509
1510 outb(0,ioaddr+EEPROM_Ctrl);
1511 mdelay(5);
1512
1513 scb_command(dev, 0xf000);
1514 outb(0,ioaddr+SIGNAL_CA);
1515
1516 outw(0, ioaddr+SM_PTR);
1517
1518 {
1519 unsigned short rboguscount=50,rfailcount=5;
1520 while (inw(ioaddr+0x4000))
1521 {
1522 if (!--rboguscount)
1523 {
1524 printk(KERN_WARNING "%s: i82586 reset timed out, kicking...\n",
1525 dev->name);
1526 scb_command(dev, 0);
1527 outb(0,ioaddr+SIGNAL_CA);
1528 rboguscount = 100;
1529 if (!--rfailcount)
1530 {
1531 printk(KERN_WARNING "%s: i82586 not responding, giving up.\n",
1532 dev->name);
1533 return;
1534 }
1535 }
1536 }
1537 }
1538
1539 scb_wrcbl(dev, CONF_LINK);
1540 scb_command(dev, 0xf000|SCB_CUstart);
1541 outb(0,ioaddr+SIGNAL_CA);
1542
1543 {
1544 unsigned short iboguscount=50,ifailcount=5;
1545 while (!scb_status(dev))
1546 {
1547 if (!--iboguscount)
1548 {
1549 if (--ifailcount)
1550 {
1551 printk(KERN_WARNING "%s: i82586 initialization timed out, status %04x, cmd %04x\n",
1552 dev->name, scb_status(dev), scb_rdcmd(dev));
1553 scb_wrcbl(dev, CONF_LINK);
1554 scb_command(dev, 0xf000|SCB_CUstart);
1555 outb(0,ioaddr+SIGNAL_CA);
1556 iboguscount = 100;
1557 }
1558 else
1559 {
1560 printk(KERN_WARNING "%s: Failed to initialize i82586, giving up.\n",dev->name);
1561 return;
1562 }
1563 }
1564 }
1565 }
1566
1567 clear_loopback(dev);
1568 outb(SIRQ_en|irqrmap[dev->irq],ioaddr+SET_IRQ);
1569
1570 lp->init_time = jiffies;
1571#if NET_DEBUG > 6
1572 printk("%s: leaving eexp_hw_init586()\n", dev->name);
1573#endif
1574 return;
1575}
1576
1577static void eexp_setup_filter(struct net_device *dev)
1578{
1579 struct dev_mc_list *dmi;
1580 unsigned short ioaddr = dev->base_addr;
1581 int count = dev->mc_count;
1582 int i;
1583 if (count > 8) {
1584 printk(KERN_INFO "%s: too many multicast addresses (%d)\n",
1585 dev->name, count);
1586 count = 8;
1587 }
1588
1589 outw(CONF_NR_MULTICAST & ~31, ioaddr+SM_PTR);
1590 outw(6*count, ioaddr+SHADOW(CONF_NR_MULTICAST));
1591 for (i = 0, dmi = dev->mc_list; i < count; i++, dmi = dmi->next) {
1592 unsigned short *data;
1593 if (!dmi) {
1594 printk(KERN_INFO "%s: too few multicast addresses\n", dev->name);
1595 break;
1596 }
1597 if (dmi->dmi_addrlen != ETH_ALEN) {
1598 printk(KERN_INFO "%s: invalid multicast address length given.\n", dev->name);
1599 continue;
1600 }
1601 data = (unsigned short *)dmi->dmi_addr;
1602 outw((CONF_MULTICAST+(6*i)) & ~31, ioaddr+SM_PTR);
1603 outw(data[0], ioaddr+SHADOW(CONF_MULTICAST+(6*i)));
1604 outw((CONF_MULTICAST+(6*i)+2) & ~31, ioaddr+SM_PTR);
1605 outw(data[1], ioaddr+SHADOW(CONF_MULTICAST+(6*i)+2));
1606 outw((CONF_MULTICAST+(6*i)+4) & ~31, ioaddr+SM_PTR);
1607 outw(data[2], ioaddr+SHADOW(CONF_MULTICAST+(6*i)+4));
1608 }
1609}
1610
1611
1612
1613
1614static void
1615eexp_set_multicast(struct net_device *dev)
1616{
1617 unsigned short ioaddr = dev->base_addr;
1618 struct net_local *lp = netdev_priv(dev);
1619 int kick = 0, i;
1620 if ((dev->flags & IFF_PROMISC) != lp->was_promisc) {
1621 outw(CONF_PROMISC & ~31, ioaddr+SM_PTR);
1622 i = inw(ioaddr+SHADOW(CONF_PROMISC));
1623 outw((dev->flags & IFF_PROMISC)?(i|1):(i & ~1),
1624 ioaddr+SHADOW(CONF_PROMISC));
1625 lp->was_promisc = dev->flags & IFF_PROMISC;
1626 kick = 1;
1627 }
1628 if (!(dev->flags & IFF_PROMISC)) {
1629 eexp_setup_filter(dev);
1630 if (lp->old_mc_count != dev->mc_count) {
1631 kick = 1;
1632 lp->old_mc_count = dev->mc_count;
1633 }
1634 }
1635 if (kick) {
1636 unsigned long oj;
1637 scb_command(dev, SCB_CUsuspend);
1638 outb(0, ioaddr+SIGNAL_CA);
1639 outb(0, ioaddr+SIGNAL_CA);
1640#if 0
1641 printk("%s: waiting for CU to go suspended\n", dev->name);
1642#endif
1643 oj = jiffies;
1644 while ((SCB_CUstat(scb_status(dev)) == 2) &&
1645 (time_before(jiffies, oj + 2000)));
1646 if (SCB_CUstat(scb_status(dev)) == 2)
1647 printk("%s: warning, CU didn't stop\n", dev->name);
1648 lp->started &= ~(STARTED_CU);
1649 scb_wrcbl(dev, CONF_LINK);
1650 scb_command(dev, SCB_CUstart);
1651 outb(0, ioaddr+SIGNAL_CA);
1652 }
1653}
1654
1655
1656
1657
1658
1659
1660#ifdef MODULE
1661
1662#define EEXP_MAX_CARDS 4
1663
1664static struct net_device *dev_eexp[EEXP_MAX_CARDS];
1665static int irq[EEXP_MAX_CARDS];
1666static int io[EEXP_MAX_CARDS];
1667
1668module_param_array(io, int, NULL, 0);
1669module_param_array(irq, int, NULL, 0);
1670MODULE_PARM_DESC(io, "EtherExpress 16 I/O base address(es)");
1671MODULE_PARM_DESC(irq, "EtherExpress 16 IRQ number(s)");
1672MODULE_LICENSE("GPL");
1673
1674
1675
1676
1677
1678
1679int __init init_module(void)
1680{
1681 struct net_device *dev;
1682 int this_dev, found = 0;
1683
1684 for (this_dev = 0; this_dev < EEXP_MAX_CARDS; this_dev++) {
1685 dev = alloc_etherdev(sizeof(struct net_local));
1686 dev->irq = irq[this_dev];
1687 dev->base_addr = io[this_dev];
1688 if (io[this_dev] == 0) {
1689 if (this_dev)
1690 break;
1691 printk(KERN_NOTICE "eexpress.c: Module autoprobe not recommended, give io=xx.\n");
1692 }
1693 if (do_express_probe(dev) == 0) {
1694 dev_eexp[this_dev] = dev;
1695 found++;
1696 continue;
1697 }
1698 printk(KERN_WARNING "eexpress.c: Failed to register card at 0x%x.\n", io[this_dev]);
1699 free_netdev(dev);
1700 break;
1701 }
1702 if (found)
1703 return 0;
1704 return -ENXIO;
1705}
1706
1707void __exit cleanup_module(void)
1708{
1709 int this_dev;
1710
1711 for (this_dev = 0; this_dev < EEXP_MAX_CARDS; this_dev++) {
1712 struct net_device *dev = dev_eexp[this_dev];
1713 if (dev) {
1714 unregister_netdev(dev);
1715 free_netdev(dev);
1716 }
1717 }
1718}
1719#endif
1720
1721
1722
1723
1724
1725
1726
1727