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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114#define DRV_NAME "nmclan_cs"
115#define DRV_VERSION "0.16"
116
117
118
119
120
121
122#define MULTI_TX 0
123#define RESET_ON_TIMEOUT 1
124#define TX_INTERRUPTABLE 1
125#define RESET_XILINX 0
126
127
128
129
130
131#include <linux/module.h>
132#include <linux/kernel.h>
133#include <linux/init.h>
134#include <linux/ptrace.h>
135#include <linux/slab.h>
136#include <linux/string.h>
137#include <linux/timer.h>
138#include <linux/interrupt.h>
139#include <linux/in.h>
140#include <linux/delay.h>
141#include <linux/ethtool.h>
142#include <linux/netdevice.h>
143#include <linux/etherdevice.h>
144#include <linux/skbuff.h>
145#include <linux/if_arp.h>
146#include <linux/ioport.h>
147
148#include <pcmcia/version.h>
149#include <pcmcia/cs_types.h>
150#include <pcmcia/cs.h>
151#include <pcmcia/cisreg.h>
152#include <pcmcia/cistpl.h>
153#include <pcmcia/ds.h>
154
155#include <asm/uaccess.h>
156#include <asm/io.h>
157#include <asm/system.h>
158#include <asm/bitops.h>
159
160
161
162
163
164#define ETHER_ADDR_LEN ETH_ALEN
165
166#define MACE_LADRF_LEN 8
167
168
169
170#define MACE_MAX_IR_ITERATIONS 10
171#define MACE_MAX_RX_ITERATIONS 12
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187#define AM2150_MAX_TX_FRAMES 4
188#define AM2150_MAX_RX_FRAMES 12
189
190
191#define AM2150_RCV 0x00
192#define AM2150_XMT 0x04
193#define AM2150_XMT_SKIP 0x09
194#define AM2150_RCV_NEXT 0x0A
195#define AM2150_RCV_FRAME_COUNT 0x0B
196#define AM2150_MACE_BANK 0x0C
197#define AM2150_MACE_BASE 0x10
198
199
200#define MACE_RCVFIFO 0
201#define MACE_XMTFIFO 1
202#define MACE_XMTFC 2
203#define MACE_XMTFS 3
204#define MACE_XMTRC 4
205#define MACE_RCVFC 5
206#define MACE_RCVFS 6
207#define MACE_FIFOFC 7
208#define MACE_IR 8
209#define MACE_IMR 9
210#define MACE_PR 10
211#define MACE_BIUCC 11
212#define MACE_FIFOCC 12
213#define MACE_MACCC 13
214#define MACE_PLSCC 14
215#define MACE_PHYCC 15
216#define MACE_CHIPIDL 16
217#define MACE_CHIPIDH 17
218#define MACE_IAC 18
219
220#define MACE_LADRF 20
221#define MACE_PADR 21
222
223
224#define MACE_MPC 24
225
226#define MACE_RNTPC 26
227#define MACE_RCVCC 27
228
229#define MACE_UTR 29
230#define MACE_RTR1 30
231#define MACE_RTR2 31
232
233
234#define MACE_XMTRC_EXDEF 0x80
235#define MACE_XMTRC_XMTRC 0x0F
236
237#define MACE_XMTFS_XMTSV 0x80
238#define MACE_XMTFS_UFLO 0x40
239#define MACE_XMTFS_LCOL 0x20
240#define MACE_XMTFS_MORE 0x10
241#define MACE_XMTFS_ONE 0x08
242#define MACE_XMTFS_DEFER 0x04
243#define MACE_XMTFS_LCAR 0x02
244#define MACE_XMTFS_RTRY 0x01
245
246#define MACE_RCVFS_RCVSTS 0xF000
247#define MACE_RCVFS_OFLO 0x8000
248#define MACE_RCVFS_CLSN 0x4000
249#define MACE_RCVFS_FRAM 0x2000
250#define MACE_RCVFS_FCS 0x1000
251
252#define MACE_FIFOFC_RCVFC 0xF0
253#define MACE_FIFOFC_XMTFC 0x0F
254
255#define MACE_IR_JAB 0x80
256#define MACE_IR_BABL 0x40
257#define MACE_IR_CERR 0x20
258#define MACE_IR_RCVCCO 0x10
259#define MACE_IR_RNTPCO 0x08
260#define MACE_IR_MPCO 0x04
261#define MACE_IR_RCVINT 0x02
262#define MACE_IR_XMTINT 0x01
263
264#define MACE_MACCC_PROM 0x80
265#define MACE_MACCC_DXMT2PD 0x40
266#define MACE_MACCC_EMBA 0x20
267#define MACE_MACCC_RESERVED 0x10
268#define MACE_MACCC_DRCVPA 0x08
269#define MACE_MACCC_DRCVBC 0x04
270#define MACE_MACCC_ENXMT 0x02
271#define MACE_MACCC_ENRCV 0x01
272
273#define MACE_PHYCC_LNKFL 0x80
274#define MACE_PHYCC_DLNKTST 0x40
275#define MACE_PHYCC_REVPOL 0x20
276#define MACE_PHYCC_DAPC 0x10
277#define MACE_PHYCC_LRT 0x08
278#define MACE_PHYCC_ASEL 0x04
279#define MACE_PHYCC_RWAKE 0x02
280#define MACE_PHYCC_AWAKE 0x01
281
282#define MACE_IAC_ADDRCHG 0x80
283#define MACE_IAC_PHYADDR 0x04
284#define MACE_IAC_LOGADDR 0x02
285
286#define MACE_UTR_RTRE 0x80
287#define MACE_UTR_RTRD 0x40
288#define MACE_UTR_RPA 0x20
289#define MACE_UTR_FCOLL 0x10
290#define MACE_UTR_RCVFCSE 0x08
291#define MACE_UTR_LOOP_INCL_MENDEC 0x06
292#define MACE_UTR_LOOP_NO_MENDEC 0x04
293#define MACE_UTR_LOOP_EXTERNAL 0x02
294#define MACE_UTR_LOOP_NONE 0x00
295#define MACE_UTR_RESERVED 0x01
296
297
298#define MACEBANK(win_num) outb((win_num), ioaddr + AM2150_MACE_BANK)
299
300#define MACE_IMR_DEFAULT \
301 (0xFF - \
302 ( \
303 MACE_IR_CERR | \
304 MACE_IR_RCVCCO | \
305 MACE_IR_RNTPCO | \
306 MACE_IR_MPCO | \
307 MACE_IR_RCVINT | \
308 MACE_IR_XMTINT \
309 ) \
310 )
311#undef MACE_IMR_DEFAULT
312#define MACE_IMR_DEFAULT 0x00
313
314#define TX_TIMEOUT ((400*HZ)/1000)
315
316
317
318
319
320typedef struct _mace_statistics {
321
322 int xmtsv;
323 int uflo;
324 int lcol;
325 int more;
326 int one;
327 int defer;
328 int lcar;
329 int rtry;
330
331
332 int exdef;
333 int xmtrc;
334
335
336 int oflo;
337 int clsn;
338 int fram;
339 int fcs;
340
341
342 int rfs_rntpc;
343
344
345 int rfs_rcvcc;
346
347
348 int jab;
349 int babl;
350 int cerr;
351 int rcvcco;
352 int rntpco;
353 int mpco;
354
355
356 int mpc;
357
358
359 int rntpc;
360
361
362 int rcvcc;
363} mace_statistics;
364
365typedef struct _mace_private {
366 dev_link_t link;
367 dev_node_t node;
368 struct net_device_stats linux_stats;
369 mace_statistics mace_stats;
370
371
372 int multicast_ladrf[MACE_LADRF_LEN];
373 int multicast_num_addrs;
374
375 char tx_free_frames;
376 char tx_irq_disabled;
377
378 spinlock_t bank_lock;
379} mace_private;
380
381
382
383
384
385#ifdef PCMCIA_DEBUG
386static char rcsid[] =
387"nmclan_cs.c,v 0.16 1995/07/01 06:42:17 rpao Exp rpao";
388static char *version =
389DRV_NAME " " DRV_VERSION " (Roger C. Pao)";
390#endif
391
392static dev_info_t dev_info="nmclan_cs";
393static dev_link_t *dev_list;
394
395static char *if_names[]={
396 "Auto", "10baseT", "BNC",
397};
398
399
400
401
402
403
404
405MODULE_DESCRIPTION("New Media PCMCIA ethernet driver");
406MODULE_LICENSE("GPL");
407
408#define INT_MODULE_PARM(n, v) static int n = v; MODULE_PARM(n, "i")
409
410static int irq_list[4] = { -1 };
411MODULE_PARM(irq_list, "1-4i");
412
413
414INT_MODULE_PARM(if_port, 0);
415
416INT_MODULE_PARM(irq_mask, 0xdeb8);
417
418#ifdef PCMCIA_DEBUG
419INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
420#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
421#else
422#define DEBUG(n, args...)
423#endif
424
425
426
427
428
429static void nmclan_config(dev_link_t *link);
430static void nmclan_release(dev_link_t *link);
431static int nmclan_event(event_t event, int priority,
432 event_callback_args_t *args);
433
434static void nmclan_reset(struct net_device *dev);
435static int mace_config(struct net_device *dev, struct ifmap *map);
436static int mace_open(struct net_device *dev);
437static int mace_close(struct net_device *dev);
438static int mace_start_xmit(struct sk_buff *skb, struct net_device *dev);
439static void mace_tx_timeout(struct net_device *dev);
440static irqreturn_t mace_interrupt(int irq, void *dev_id, struct pt_regs *regs);
441static struct net_device_stats *mace_get_stats(struct net_device *dev);
442static int mace_rx(struct net_device *dev, unsigned char RxCnt);
443static void restore_multicast_list(struct net_device *dev);
444static void set_multicast_list(struct net_device *dev);
445static struct ethtool_ops netdev_ethtool_ops;
446
447
448static dev_link_t *nmclan_attach(void);
449static void nmclan_detach(dev_link_t *);
450
451
452
453
454
455
456
457
458static dev_link_t *nmclan_attach(void)
459{
460 mace_private *lp;
461 dev_link_t *link;
462 struct net_device *dev;
463 client_reg_t client_reg;
464 int i, ret;
465
466 DEBUG(0, "nmclan_attach()\n");
467 DEBUG(1, "%s\n", rcsid);
468
469
470 dev = alloc_etherdev(sizeof(mace_private));
471 if (!dev)
472 return NULL;
473 lp = dev->priv;
474 link = &lp->link;
475 link->priv = dev;
476
477 spin_lock_init(&lp->bank_lock);
478 link->io.NumPorts1 = 32;
479 link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
480 link->io.IOAddrLines = 5;
481 link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT;
482 link->irq.IRQInfo1 = IRQ_INFO2_VALID|IRQ_LEVEL_ID;
483 if (irq_list[0] == -1)
484 link->irq.IRQInfo2 = irq_mask;
485 else
486 for (i = 0; i < 4; i++)
487 link->irq.IRQInfo2 |= 1 << irq_list[i];
488 link->irq.Handler = &mace_interrupt;
489 link->irq.Instance = dev;
490 link->conf.Attributes = CONF_ENABLE_IRQ;
491 link->conf.Vcc = 50;
492 link->conf.IntType = INT_MEMORY_AND_IO;
493 link->conf.ConfigIndex = 1;
494 link->conf.Present = PRESENT_OPTION;
495
496 lp->tx_free_frames=AM2150_MAX_TX_FRAMES;
497
498 SET_MODULE_OWNER(dev);
499 dev->hard_start_xmit = &mace_start_xmit;
500 dev->set_config = &mace_config;
501 dev->get_stats = &mace_get_stats;
502 dev->set_multicast_list = &set_multicast_list;
503 SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
504 dev->open = &mace_open;
505 dev->stop = &mace_close;
506#ifdef HAVE_TX_TIMEOUT
507 dev->tx_timeout = mace_tx_timeout;
508 dev->watchdog_timeo = TX_TIMEOUT;
509#endif
510
511
512 link->next = dev_list;
513 dev_list = link;
514 client_reg.dev_info = &dev_info;
515 client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE;
516 client_reg.EventMask =
517 CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL |
518 CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET |
519 CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME;
520 client_reg.event_handler = &nmclan_event;
521 client_reg.Version = 0x0210;
522 client_reg.event_callback_args.client_data = link;
523 ret = CardServices(RegisterClient, &link->handle, &client_reg);
524 if (ret != 0) {
525 cs_error(link->handle, RegisterClient, ret);
526 nmclan_detach(link);
527 return NULL;
528 }
529
530 return link;
531}
532
533
534
535
536
537
538
539
540
541static void nmclan_detach(dev_link_t *link)
542{
543 struct net_device *dev = link->priv;
544 dev_link_t **linkp;
545
546 DEBUG(0, "nmclan_detach(0x%p)\n", link);
547
548
549 for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next)
550 if (*linkp == link) break;
551 if (*linkp == NULL)
552 return;
553
554 if (link->state & DEV_CONFIG) {
555 nmclan_release(link);
556 if (link->state & DEV_STALE_CONFIG)
557 return;
558 }
559
560 if (link->handle)
561 CardServices(DeregisterClient, link->handle);
562
563
564 *linkp = link->next;
565 if (link->dev) {
566 unregister_netdev(dev);
567 free_netdev(dev);
568 } else
569 kfree(dev);
570
571}
572
573
574
575
576
577
578
579
580static int mace_read(mace_private *lp, ioaddr_t ioaddr, int reg)
581{
582 int data = 0xFF;
583 unsigned long flags;
584
585 switch (reg >> 4) {
586 case 0:
587 data = inb(ioaddr + AM2150_MACE_BASE + reg);
588 break;
589 case 1:
590 spin_lock_irqsave(&lp->bank_lock, flags);
591 MACEBANK(1);
592 data = inb(ioaddr + AM2150_MACE_BASE + (reg & 0x0F));
593 MACEBANK(0);
594 spin_unlock_irqrestore(&lp->bank_lock, flags);
595 break;
596 }
597 return (data & 0xFF);
598}
599
600
601
602
603
604
605
606
607static void mace_write(mace_private *lp, ioaddr_t ioaddr, int reg, int data)
608{
609 unsigned long flags;
610
611 switch (reg >> 4) {
612 case 0:
613 outb(data & 0xFF, ioaddr + AM2150_MACE_BASE + reg);
614 break;
615 case 1:
616 spin_lock_irqsave(&lp->bank_lock, flags);
617 MACEBANK(1);
618 outb(data & 0xFF, ioaddr + AM2150_MACE_BASE + (reg & 0x0F));
619 MACEBANK(0);
620 spin_unlock_irqrestore(&lp->bank_lock, flags);
621 break;
622 }
623}
624
625
626
627
628
629static int mace_init(mace_private *lp, ioaddr_t ioaddr, char *enet_addr)
630{
631 int i;
632 int ct = 0;
633
634
635 mace_write(lp, ioaddr, MACE_BIUCC, 1);
636 while (mace_read(lp, ioaddr, MACE_BIUCC) & 0x01) {
637 ;
638 if(++ct > 500)
639 {
640 printk(KERN_ERR "mace: reset failed, card removed ?\n");
641 return -1;
642 }
643 udelay(1);
644 }
645 mace_write(lp, ioaddr, MACE_BIUCC, 0);
646
647
648 mace_write(lp, ioaddr, MACE_FIFOCC, 0x0F);
649
650 mace_write(lp,ioaddr, MACE_RCVFC, 0);
651 mace_write(lp, ioaddr, MACE_IMR, 0xFF);
652
653
654
655
656
657
658
659
660
661
662
663
664
665 switch (if_port) {
666 case 1:
667 mace_write(lp, ioaddr, MACE_PLSCC, 0x02);
668 break;
669 case 2:
670 mace_write(lp, ioaddr, MACE_PLSCC, 0x00);
671 break;
672 default:
673 mace_write(lp, ioaddr, MACE_PHYCC, 4);
674
675
676
677 break;
678 }
679
680 mace_write(lp, ioaddr, MACE_IAC, MACE_IAC_ADDRCHG | MACE_IAC_PHYADDR);
681
682 ct = 0;
683 while (mace_read(lp, ioaddr, MACE_IAC) & MACE_IAC_ADDRCHG)
684 {
685 if(++ ct > 500)
686 {
687 printk(KERN_ERR "mace: ADDRCHG timeout, card removed ?\n");
688 return -1;
689 }
690 }
691
692 for (i = 0; i < ETHER_ADDR_LEN; i++)
693 mace_write(lp, ioaddr, MACE_PADR, enet_addr[i]);
694
695
696
697
698 mace_write(lp, ioaddr, MACE_MACCC, 0x00);
699 return 0;
700}
701
702
703
704
705
706
707
708
709#define CS_CHECK(fn, args...) \
710while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed
711
712static void nmclan_config(dev_link_t *link)
713{
714 client_handle_t handle = link->handle;
715 struct net_device *dev = link->priv;
716 mace_private *lp = dev->priv;
717 tuple_t tuple;
718 cisparse_t parse;
719 u_char buf[64];
720 int i, last_ret, last_fn;
721 ioaddr_t ioaddr;
722
723 DEBUG(0, "nmclan_config(0x%p)\n", link);
724
725 tuple.Attributes = 0;
726 tuple.TupleData = buf;
727 tuple.TupleDataMax = 64;
728 tuple.TupleOffset = 0;
729 tuple.DesiredTuple = CISTPL_CONFIG;
730 CS_CHECK(GetFirstTuple, handle, &tuple);
731 CS_CHECK(GetTupleData, handle, &tuple);
732 CS_CHECK(ParseTuple, handle, &tuple, &parse);
733 link->conf.ConfigBase = parse.config.base;
734
735
736 link->state |= DEV_CONFIG;
737
738 CS_CHECK(RequestIO, handle, &link->io);
739 CS_CHECK(RequestIRQ, handle, &link->irq);
740 CS_CHECK(RequestConfiguration, handle, &link->conf);
741 dev->irq = link->irq.AssignedIRQ;
742 dev->base_addr = link->io.BasePort1;
743 i = register_netdev(dev);
744 if (i != 0) {
745 printk(KERN_NOTICE "nmclan_cs: register_netdev() failed\n");
746 goto failed;
747 }
748
749 ioaddr = dev->base_addr;
750
751
752 tuple.DesiredTuple = 0x80 ;
753 tuple.TupleData = buf;
754 tuple.TupleDataMax = 64;
755 tuple.TupleOffset = 0;
756 CS_CHECK(GetFirstTuple, handle, &tuple);
757 CS_CHECK(GetTupleData, handle, &tuple);
758 memcpy(dev->dev_addr, tuple.TupleData, ETHER_ADDR_LEN);
759
760
761 {
762 char sig[2];
763
764 sig[0] = mace_read(lp, ioaddr, MACE_CHIPIDL);
765 sig[1] = mace_read(lp, ioaddr, MACE_CHIPIDH);
766 if ((sig[0] == 0x40) && ((sig[1] & 0x0F) == 0x09)) {
767 DEBUG(0, "nmclan_cs configured: mace id=%x %x\n",
768 sig[0], sig[1]);
769 } else {
770 printk(KERN_NOTICE "nmclan_cs: mace id not found: %x %x should"
771 " be 0x40 0x?9\n", sig[0], sig[1]);
772 link->state &= ~DEV_CONFIG_PENDING;
773 return;
774 }
775 }
776
777 if(mace_init(lp, ioaddr, dev->dev_addr) == -1)
778 goto failed;
779
780
781 if (if_port <= 2)
782 dev->if_port = if_port;
783 else
784 printk(KERN_NOTICE "nmclan_cs: invalid if_port requested\n");
785
786 strcpy(lp->node.dev_name, dev->name);
787 link->dev = &lp->node;
788 link->state &= ~DEV_CONFIG_PENDING;
789
790 printk(KERN_INFO "%s: nmclan: port %#3lx, irq %d, %s port, hw_addr ",
791 dev->name, dev->base_addr, dev->irq, if_names[dev->if_port]);
792 for (i = 0; i < 6; i++)
793 printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n"));
794 return;
795
796cs_failed:
797 cs_error(link->handle, last_fn, last_ret);
798failed:
799 nmclan_release(link);
800 return;
801
802}
803
804
805
806
807
808
809
810static void nmclan_release(dev_link_t *link)
811{
812
813 DEBUG(0, "nmclan_release(0x%p)\n", link);
814
815 if (link->open) {
816 DEBUG(1, "nmclan_cs: release postponed, '%s' "
817 "still open\n", link->dev->dev_name);
818 link->state |= DEV_STALE_CONFIG;
819 return;
820 }
821
822 CardServices(ReleaseConfiguration, link->handle);
823 CardServices(ReleaseIO, link->handle, &link->io);
824 CardServices(ReleaseIRQ, link->handle, &link->irq);
825
826 link->state &= ~DEV_CONFIG;
827
828 if (link->state & DEV_STALE_CONFIG)
829 nmclan_detach(link);
830}
831
832
833
834
835
836
837
838
839static int nmclan_event(event_t event, int priority,
840 event_callback_args_t *args)
841{
842 dev_link_t *link = args->client_data;
843 struct net_device *dev = link->priv;
844
845 DEBUG(1, "nmclan_event(0x%06x)\n", event);
846
847 switch (event) {
848 case CS_EVENT_CARD_REMOVAL:
849 link->state &= ~DEV_PRESENT;
850 if (link->state & DEV_CONFIG) {
851 netif_device_detach(dev);
852 nmclan_release(link);
853 }
854 break;
855 case CS_EVENT_CARD_INSERTION:
856 link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
857 nmclan_config(link);
858 break;
859 case CS_EVENT_PM_SUSPEND:
860 link->state |= DEV_SUSPEND;
861
862 case CS_EVENT_RESET_PHYSICAL:
863 if (link->state & DEV_CONFIG) {
864 if (link->open)
865 netif_device_detach(dev);
866 CardServices(ReleaseConfiguration, link->handle);
867 }
868 break;
869 case CS_EVENT_PM_RESUME:
870 link->state &= ~DEV_SUSPEND;
871
872 case CS_EVENT_CARD_RESET:
873 if (link->state & DEV_CONFIG) {
874 CardServices(RequestConfiguration, link->handle, &link->conf);
875 if (link->open) {
876 nmclan_reset(dev);
877 netif_device_attach(dev);
878 }
879 }
880 break;
881 case CS_EVENT_RESET_REQUEST:
882 return 1;
883 break;
884 }
885 return 0;
886}
887
888
889
890
891
892static void nmclan_reset(struct net_device *dev)
893{
894 mace_private *lp = dev->priv;
895
896#if RESET_XILINX
897 dev_link_t *link = &lp->link;
898 conf_reg_t reg;
899 u_long OrigCorValue;
900
901
902 reg.Function = 0;
903 reg.Action = CS_READ;
904 reg.Offset = CISREG_COR;
905 reg.Value = 0;
906 CardServices(AccessConfigurationRegister, link->handle, ®);
907 OrigCorValue = reg.Value;
908
909
910 reg.Action = CS_WRITE;
911 reg.Offset = CISREG_COR;
912 DEBUG(1, "nmclan_reset: OrigCorValue=0x%lX, resetting...\n",
913 OrigCorValue);
914 reg.Value = COR_SOFT_RESET;
915 CardServices(AccessConfigurationRegister, link->handle, ®);
916
917
918
919 reg.Value = COR_LEVEL_REQ | (OrigCorValue & COR_CONFIG_MASK);
920 CardServices(AccessConfigurationRegister, link->handle, ®);
921
922 lp->tx_free_frames=AM2150_MAX_TX_FRAMES;
923
924#endif
925
926
927 lp->tx_free_frames=AM2150_MAX_TX_FRAMES;
928
929
930 mace_init(lp, dev->base_addr, dev->dev_addr);
931 mace_write(lp, dev->base_addr, MACE_IMR, MACE_IMR_DEFAULT);
932
933
934 restore_multicast_list(dev);
935}
936
937
938
939
940
941
942
943static int mace_config(struct net_device *dev, struct ifmap *map)
944{
945 if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {
946 if (map->port <= 2) {
947 dev->if_port = map->port;
948 printk(KERN_INFO "%s: switched to %s port\n", dev->name,
949 if_names[dev->if_port]);
950 } else
951 return -EINVAL;
952 }
953 return 0;
954}
955
956
957
958
959
960static int mace_open(struct net_device *dev)
961{
962 ioaddr_t ioaddr = dev->base_addr;
963 mace_private *lp = dev->priv;
964 dev_link_t *link = &lp->link;
965
966 if (!DEV_OK(link))
967 return -ENODEV;
968
969 link->open++;
970
971 MACEBANK(0);
972
973 netif_start_queue(dev);
974 nmclan_reset(dev);
975
976 return 0;
977}
978
979
980
981
982
983static int mace_close(struct net_device *dev)
984{
985 ioaddr_t ioaddr = dev->base_addr;
986 mace_private *lp = dev->priv;
987 dev_link_t *link = &lp->link;
988
989 DEBUG(2, "%s: shutting down ethercard.\n", dev->name);
990
991
992 outb(0xFF, ioaddr + AM2150_MACE_BASE + MACE_IMR);
993
994 link->open--;
995 netif_stop_queue(dev);
996 if (link->state & DEV_STALE_CONFIG)
997 nmclan_release(link);
998
999 return 0;
1000}
1001
1002static void netdev_get_drvinfo(struct net_device *dev,
1003 struct ethtool_drvinfo *info)
1004{
1005 strcpy(info->driver, DRV_NAME);
1006 strcpy(info->version, DRV_VERSION);
1007 sprintf(info->bus_info, "PCMCIA 0x%lx", dev->base_addr);
1008}
1009
1010#ifdef PCMCIA_DEBUG
1011static u32 netdev_get_msglevel(struct net_device *dev)
1012{
1013 return pc_debug;
1014}
1015
1016static void netdev_set_msglevel(struct net_device *dev, u32 level)
1017{
1018 pc_debug = level;
1019}
1020#endif
1021
1022static struct ethtool_ops netdev_ethtool_ops = {
1023 .get_drvinfo = netdev_get_drvinfo,
1024#ifdef PCMCIA_DEBUG
1025 .get_msglevel = netdev_get_msglevel,
1026 .set_msglevel = netdev_set_msglevel,
1027#endif
1028};
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041static void mace_tx_timeout(struct net_device *dev)
1042{
1043 mace_private *lp = (mace_private *)dev->priv;
1044 dev_link_t *link = &lp->link;
1045
1046 printk(KERN_NOTICE "%s: transmit timed out -- ", dev->name);
1047#if RESET_ON_TIMEOUT
1048 printk("resetting card\n");
1049 CardServices(ResetCard, link->handle);
1050#else
1051 printk("NOT resetting card\n");
1052#endif
1053 dev->trans_start = jiffies;
1054 netif_wake_queue(dev);
1055}
1056
1057static int mace_start_xmit(struct sk_buff *skb, struct net_device *dev)
1058{
1059 mace_private *lp = (mace_private *)dev->priv;
1060 ioaddr_t ioaddr = dev->base_addr;
1061
1062 netif_stop_queue(dev);
1063
1064 DEBUG(3, "%s: mace_start_xmit(length = %ld) called.\n",
1065 dev->name, (long)skb->len);
1066
1067#if (!TX_INTERRUPTABLE)
1068
1069 outb(MACE_IMR_DEFAULT | MACE_IR_XMTINT,
1070 ioaddr + AM2150_MACE_BASE + MACE_IMR);
1071 lp->tx_irq_disabled=1;
1072#endif
1073
1074 {
1075
1076
1077
1078
1079
1080
1081 lp->linux_stats.tx_bytes += skb->len;
1082 lp->tx_free_frames--;
1083
1084
1085
1086 outw(skb->len, ioaddr + AM2150_XMT);
1087
1088 outsw(ioaddr + AM2150_XMT, skb->data, skb->len >> 1);
1089 if (skb->len & 1) {
1090
1091 outb(skb->data[skb->len-1], ioaddr + AM2150_XMT);
1092 }
1093
1094 dev->trans_start = jiffies;
1095
1096#if MULTI_TX
1097 if (lp->tx_free_frames > 0)
1098 netif_start_queue(dev);
1099#endif
1100 }
1101
1102#if (!TX_INTERRUPTABLE)
1103
1104 lp->tx_irq_disabled=0;
1105 outb(MACE_IMR_DEFAULT, ioaddr + AM2150_MACE_BASE + MACE_IMR);
1106#endif
1107
1108 dev_kfree_skb(skb);
1109
1110 return 0;
1111}
1112
1113
1114
1115
1116
1117static irqreturn_t mace_interrupt(int irq, void *dev_id, struct pt_regs *regs)
1118{
1119 struct net_device *dev = (struct net_device *) dev_id;
1120 mace_private *lp = dev->priv;
1121 ioaddr_t ioaddr = dev->base_addr;
1122 int status;
1123 int IntrCnt = MACE_MAX_IR_ITERATIONS;
1124
1125 if (dev == NULL) {
1126 DEBUG(2, "mace_interrupt(): irq 0x%X for unknown device.\n",
1127 irq);
1128 return IRQ_NONE;
1129 }
1130
1131 if (lp->tx_irq_disabled) {
1132 printk(
1133 (lp->tx_irq_disabled?
1134 KERN_NOTICE "%s: Interrupt with tx_irq_disabled "
1135 "[isr=%02X, imr=%02X]\n":
1136 KERN_NOTICE "%s: Re-entering the interrupt handler "
1137 "[isr=%02X, imr=%02X]\n"),
1138 dev->name,
1139 inb(ioaddr + AM2150_MACE_BASE + MACE_IR),
1140 inb(ioaddr + AM2150_MACE_BASE + MACE_IMR)
1141 );
1142
1143 return IRQ_NONE;
1144 }
1145
1146 if (!netif_device_present(dev)) {
1147 DEBUG(2, "%s: interrupt from dead card\n", dev->name);
1148 return IRQ_NONE;
1149 }
1150
1151 do {
1152
1153 status = inb(ioaddr + AM2150_MACE_BASE + MACE_IR);
1154
1155 DEBUG(3, "mace_interrupt: irq 0x%X status 0x%X.\n", irq, status);
1156
1157 if (status & MACE_IR_RCVINT) {
1158 mace_rx(dev, MACE_MAX_RX_ITERATIONS);
1159 }
1160
1161 if (status & MACE_IR_XMTINT) {
1162 unsigned char fifofc;
1163 unsigned char xmtrc;
1164 unsigned char xmtfs;
1165
1166 fifofc = inb(ioaddr + AM2150_MACE_BASE + MACE_FIFOFC);
1167 if ((fifofc & MACE_FIFOFC_XMTFC)==0) {
1168 lp->linux_stats.tx_errors++;
1169 outb(0xFF, ioaddr + AM2150_XMT_SKIP);
1170 }
1171
1172
1173 xmtrc = inb(ioaddr + AM2150_MACE_BASE + MACE_XMTRC);
1174 if (xmtrc & MACE_XMTRC_EXDEF) lp->mace_stats.exdef++;
1175 lp->mace_stats.xmtrc += (xmtrc & MACE_XMTRC_XMTRC);
1176
1177 if (
1178 (xmtfs = inb(ioaddr + AM2150_MACE_BASE + MACE_XMTFS)) &
1179 MACE_XMTFS_XMTSV
1180 ) {
1181 lp->mace_stats.xmtsv++;
1182
1183 if (xmtfs & ~MACE_XMTFS_XMTSV) {
1184 if (xmtfs & MACE_XMTFS_UFLO) {
1185
1186
1187 lp->mace_stats.uflo++;
1188 }
1189 if (xmtfs & MACE_XMTFS_LCOL) {
1190
1191 lp->mace_stats.lcol++;
1192 }
1193 if (xmtfs & MACE_XMTFS_MORE) {
1194
1195 lp->mace_stats.more++;
1196 }
1197 if (xmtfs & MACE_XMTFS_ONE) {
1198
1199 lp->mace_stats.one++;
1200 }
1201 if (xmtfs & MACE_XMTFS_DEFER) {
1202
1203 lp->mace_stats.defer++;
1204 }
1205 if (xmtfs & MACE_XMTFS_LCAR) {
1206
1207 lp->mace_stats.lcar++;
1208 }
1209 if (xmtfs & MACE_XMTFS_RTRY) {
1210
1211 lp->mace_stats.rtry++;
1212 }
1213 }
1214
1215 }
1216
1217 lp->linux_stats.tx_packets++;
1218 lp->tx_free_frames++;
1219 netif_wake_queue(dev);
1220 }
1221
1222 if (status & ~MACE_IMR_DEFAULT & ~MACE_IR_RCVINT & ~MACE_IR_XMTINT) {
1223 if (status & MACE_IR_JAB) {
1224
1225 lp->mace_stats.jab++;
1226 }
1227 if (status & MACE_IR_BABL) {
1228
1229 lp->mace_stats.babl++;
1230 }
1231 if (status & MACE_IR_CERR) {
1232
1233
1234
1235 lp->mace_stats.cerr++;
1236 }
1237 if (status & MACE_IR_RCVCCO) {
1238
1239 lp->mace_stats.rcvcco++;
1240 }
1241 if (status & MACE_IR_RNTPCO) {
1242
1243 lp->mace_stats.rntpco++;
1244 }
1245 if (status & MACE_IR_MPCO) {
1246
1247 lp->mace_stats.mpco++;
1248 }
1249 }
1250
1251 } while ((status & ~MACE_IMR_DEFAULT) && (--IntrCnt));
1252
1253 return IRQ_HANDLED;
1254}
1255
1256
1257
1258
1259
1260static int mace_rx(struct net_device *dev, unsigned char RxCnt)
1261{
1262 mace_private *lp = (mace_private *)dev->priv;
1263 ioaddr_t ioaddr = dev->base_addr;
1264 unsigned char rx_framecnt;
1265 unsigned short rx_status;
1266
1267 while (
1268 ((rx_framecnt = inb(ioaddr + AM2150_RCV_FRAME_COUNT)) > 0) &&
1269 (rx_framecnt <= 12) &&
1270 (RxCnt--)
1271 ) {
1272 rx_status = inw(ioaddr + AM2150_RCV);
1273
1274 DEBUG(3, "%s: in mace_rx(), framecnt 0x%X, rx_status"
1275 " 0x%X.\n", dev->name, rx_framecnt, rx_status);
1276
1277 if (rx_status & MACE_RCVFS_RCVSTS) {
1278 lp->linux_stats.rx_errors++;
1279 if (rx_status & MACE_RCVFS_OFLO) {
1280 lp->mace_stats.oflo++;
1281 }
1282 if (rx_status & MACE_RCVFS_CLSN) {
1283 lp->mace_stats.clsn++;
1284 }
1285 if (rx_status & MACE_RCVFS_FRAM) {
1286 lp->mace_stats.fram++;
1287 }
1288 if (rx_status & MACE_RCVFS_FCS) {
1289 lp->mace_stats.fcs++;
1290 }
1291 } else {
1292 short pkt_len = (rx_status & ~MACE_RCVFS_RCVSTS) - 4;
1293
1294 struct sk_buff *skb;
1295
1296 lp->mace_stats.rfs_rntpc += inb(ioaddr + AM2150_RCV);
1297
1298 lp->mace_stats.rfs_rcvcc += inb(ioaddr + AM2150_RCV);
1299
1300
1301 DEBUG(3, " receiving packet size 0x%X rx_status"
1302 " 0x%X.\n", pkt_len, rx_status);
1303
1304 skb = dev_alloc_skb(pkt_len+2);
1305
1306 if (skb != NULL) {
1307 skb->dev = dev;
1308
1309 skb_reserve(skb, 2);
1310 insw(ioaddr + AM2150_RCV, skb_put(skb, pkt_len), pkt_len>>1);
1311 if (pkt_len & 1)
1312 *(skb->tail-1) = inb(ioaddr + AM2150_RCV);
1313 skb->protocol = eth_type_trans(skb, dev);
1314
1315 netif_rx(skb);
1316
1317 dev->last_rx = jiffies;
1318 lp->linux_stats.rx_packets++;
1319 lp->linux_stats.rx_bytes += skb->len;
1320 outb(0xFF, ioaddr + AM2150_RCV_NEXT);
1321 continue;
1322 } else {
1323 DEBUG(1, "%s: couldn't allocate a sk_buff of size"
1324 " %d.\n", dev->name, pkt_len);
1325 lp->linux_stats.rx_dropped++;
1326 }
1327 }
1328 outb(0xFF, ioaddr + AM2150_RCV_NEXT);
1329 }
1330
1331 return 0;
1332}
1333
1334
1335
1336
1337static void pr_linux_stats(struct net_device_stats *pstats)
1338{
1339 DEBUG(2, "pr_linux_stats\n");
1340 DEBUG(2, " rx_packets=%-7ld tx_packets=%ld\n",
1341 (long)pstats->rx_packets, (long)pstats->tx_packets);
1342 DEBUG(2, " rx_errors=%-7ld tx_errors=%ld\n",
1343 (long)pstats->rx_errors, (long)pstats->tx_errors);
1344 DEBUG(2, " rx_dropped=%-7ld tx_dropped=%ld\n",
1345 (long)pstats->rx_dropped, (long)pstats->tx_dropped);
1346 DEBUG(2, " multicast=%-7ld collisions=%ld\n",
1347 (long)pstats->multicast, (long)pstats->collisions);
1348
1349 DEBUG(2, " rx_length_errors=%-7ld rx_over_errors=%ld\n",
1350 (long)pstats->rx_length_errors, (long)pstats->rx_over_errors);
1351 DEBUG(2, " rx_crc_errors=%-7ld rx_frame_errors=%ld\n",
1352 (long)pstats->rx_crc_errors, (long)pstats->rx_frame_errors);
1353 DEBUG(2, " rx_fifo_errors=%-7ld rx_missed_errors=%ld\n",
1354 (long)pstats->rx_fifo_errors, (long)pstats->rx_missed_errors);
1355
1356 DEBUG(2, " tx_aborted_errors=%-7ld tx_carrier_errors=%ld\n",
1357 (long)pstats->tx_aborted_errors, (long)pstats->tx_carrier_errors);
1358 DEBUG(2, " tx_fifo_errors=%-7ld tx_heartbeat_errors=%ld\n",
1359 (long)pstats->tx_fifo_errors, (long)pstats->tx_heartbeat_errors);
1360 DEBUG(2, " tx_window_errors=%ld\n",
1361 (long)pstats->tx_window_errors);
1362}
1363
1364
1365
1366
1367static void pr_mace_stats(mace_statistics *pstats)
1368{
1369 DEBUG(2, "pr_mace_stats\n");
1370
1371 DEBUG(2, " xmtsv=%-7d uflo=%d\n",
1372 pstats->xmtsv, pstats->uflo);
1373 DEBUG(2, " lcol=%-7d more=%d\n",
1374 pstats->lcol, pstats->more);
1375 DEBUG(2, " one=%-7d defer=%d\n",
1376 pstats->one, pstats->defer);
1377 DEBUG(2, " lcar=%-7d rtry=%d\n",
1378 pstats->lcar, pstats->rtry);
1379
1380
1381 DEBUG(2, " exdef=%-7d xmtrc=%d\n",
1382 pstats->exdef, pstats->xmtrc);
1383
1384
1385 DEBUG(2, " oflo=%-7d clsn=%d\n",
1386 pstats->oflo, pstats->clsn);
1387 DEBUG(2, " fram=%-7d fcs=%d\n",
1388 pstats->fram, pstats->fcs);
1389
1390
1391
1392 DEBUG(2, " rfs_rntpc=%-7d rfs_rcvcc=%d\n",
1393 pstats->rfs_rntpc, pstats->rfs_rcvcc);
1394
1395
1396 DEBUG(2, " jab=%-7d babl=%d\n",
1397 pstats->jab, pstats->babl);
1398 DEBUG(2, " cerr=%-7d rcvcco=%d\n",
1399 pstats->cerr, pstats->rcvcco);
1400 DEBUG(2, " rntpco=%-7d mpco=%d\n",
1401 pstats->rntpco, pstats->mpco);
1402
1403
1404 DEBUG(2, " mpc=%d\n", pstats->mpc);
1405
1406
1407 DEBUG(2, " rntpc=%d\n", pstats->rntpc);
1408
1409
1410 DEBUG(2, " rcvcc=%d\n", pstats->rcvcc);
1411
1412}
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427static void update_stats(ioaddr_t ioaddr, struct net_device *dev)
1428{
1429 mace_private *lp = (mace_private *)dev->priv;
1430
1431 lp->mace_stats.rcvcc += mace_read(lp, ioaddr, MACE_RCVCC);
1432 lp->mace_stats.rntpc += mace_read(lp, ioaddr, MACE_RNTPC);
1433 lp->mace_stats.mpc += mace_read(lp, ioaddr, MACE_MPC);
1434
1435
1436
1437
1438
1439
1440
1441 lp->linux_stats.collisions =
1442 lp->mace_stats.rcvcco * 256 + lp->mace_stats.rcvcc;
1443
1444
1445
1446
1447
1448
1449 lp->linux_stats.rx_length_errors =
1450 lp->mace_stats.rntpco * 256 + lp->mace_stats.rntpc;
1451
1452 lp->linux_stats.rx_crc_errors = lp->mace_stats.fcs;
1453 lp->linux_stats.rx_frame_errors = lp->mace_stats.fram;
1454 lp->linux_stats.rx_fifo_errors = lp->mace_stats.oflo;
1455 lp->linux_stats.rx_missed_errors =
1456 lp->mace_stats.mpco * 256 + lp->mace_stats.mpc;
1457
1458
1459 lp->linux_stats.tx_aborted_errors = lp->mace_stats.rtry;
1460 lp->linux_stats.tx_carrier_errors = lp->mace_stats.lcar;
1461
1462 lp->linux_stats.tx_fifo_errors = lp->mace_stats.uflo;
1463 lp->linux_stats.tx_heartbeat_errors = lp->mace_stats.cerr;
1464
1465
1466 return;
1467}
1468
1469
1470
1471
1472
1473static struct net_device_stats *mace_get_stats(struct net_device *dev)
1474{
1475 mace_private *lp = (mace_private *)dev->priv;
1476
1477 update_stats(dev->base_addr, dev);
1478
1479 DEBUG(1, "%s: updating the statistics.\n", dev->name);
1480 pr_linux_stats(&lp->linux_stats);
1481 pr_mace_stats(&lp->mace_stats);
1482
1483 return &lp->linux_stats;
1484}
1485
1486
1487
1488
1489
1490
1491#if BROKEN_MULTICAST
1492
1493static void updateCRC(int *CRC, int bit)
1494{
1495 int poly[]={
1496 1,1,1,0, 1,1,0,1,
1497 1,0,1,1, 1,0,0,0,
1498 1,0,0,0, 0,0,1,1,
1499 0,0,1,0, 0,0,0,0
1500 };
1501
1502
1503 int j;
1504
1505
1506 for (j = 32; j > 0; j--)
1507 CRC[j] = CRC[j-1];
1508 CRC[0] = 0;
1509
1510
1511 if (bit ^ CRC[32])
1512 for (j = 0; j < 32; j++)
1513 CRC[j] ^= poly[j];
1514}
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525static void BuildLAF(int *ladrf, int *adr)
1526{
1527 int CRC[33]={1};
1528
1529 int i, byte;
1530 int hashcode;
1531
1532 CRC[32]=0;
1533
1534 for (byte = 0; byte < 6; byte++)
1535 for (i = 0; i < 8; i++)
1536 updateCRC(CRC, (adr[byte] >> i) & 1);
1537
1538 hashcode = 0;
1539 for (i = 0; i < 6; i++)
1540 hashcode = (hashcode << 1) + CRC[i];
1541
1542 byte = hashcode >> 3;
1543 ladrf[byte] |= (1 << (hashcode & 7));
1544
1545#ifdef PCMCIA_DEBUG
1546 if (pc_debug > 2) {
1547 printk(KERN_DEBUG " adr =");
1548 for (i = 0; i < 6; i++)
1549 printk(" %02X", adr[i]);
1550 printk("\n" KERN_DEBUG " hashcode = %d(decimal), ladrf[0:63]"
1551 " =", hashcode);
1552 for (i = 0; i < 8; i++)
1553 printk(" %02X", ladrf[i]);
1554 printk("\n");
1555 }
1556#endif
1557}
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568static void restore_multicast_list(struct net_device *dev)
1569{
1570 mace_private *lp = (mace_private *)dev->priv;
1571 int num_addrs = lp->multicast_num_addrs;
1572 int *ladrf = lp->multicast_ladrf;
1573 ioaddr_t ioaddr = dev->base_addr;
1574 int i;
1575
1576 DEBUG(2, "%s: restoring Rx mode to %d addresses.\n",
1577 dev->name, num_addrs);
1578
1579 if (num_addrs > 0) {
1580
1581 DEBUG(1, "Attempt to restore multicast list detected.\n");
1582
1583 mace_write(lp, ioaddr, MACE_IAC, MACE_IAC_ADDRCHG | MACE_IAC_LOGADDR);
1584
1585 while (mace_read(lp, ioaddr, MACE_IAC) & MACE_IAC_ADDRCHG)
1586 ;
1587
1588 for (i = 0; i < MACE_LADRF_LEN; i++)
1589 mace_write(lp, ioaddr, MACE_LADRF, ladrf[i]);
1590
1591 mace_write(lp, ioaddr, MACE_UTR, MACE_UTR_RCVFCSE | MACE_UTR_LOOP_EXTERNAL);
1592 mace_write(lp, ioaddr, MACE_MACCC, MACE_MACCC_ENXMT | MACE_MACCC_ENRCV);
1593
1594 } else if (num_addrs < 0) {
1595
1596
1597 mace_write(lp, ioaddr, MACE_UTR, MACE_UTR_LOOP_EXTERNAL);
1598 mace_write(lp, ioaddr, MACE_MACCC,
1599 MACE_MACCC_PROM | MACE_MACCC_ENXMT | MACE_MACCC_ENRCV
1600 );
1601
1602 } else {
1603
1604
1605 mace_write(lp, ioaddr, MACE_UTR, MACE_UTR_LOOP_EXTERNAL);
1606 mace_write(lp, ioaddr, MACE_MACCC, MACE_MACCC_ENXMT | MACE_MACCC_ENRCV);
1607
1608 }
1609}
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625static void set_multicast_list(struct net_device *dev)
1626{
1627 mace_private *lp = (mace_private *)dev->priv;
1628 int adr[ETHER_ADDR_LEN] = {0};
1629 int i;
1630 struct dev_mc_list *dmi = dev->mc_list;
1631
1632#ifdef PCMCIA_DEBUG
1633 if (pc_debug > 1) {
1634 static int old;
1635 if (dev->mc_count != old) {
1636 old = dev->mc_count;
1637 DEBUG(0, "%s: setting Rx mode to %d addresses.\n",
1638 dev->name, old);
1639 }
1640 }
1641#endif
1642
1643
1644 lp->multicast_num_addrs = dev->mc_count;
1645
1646
1647 if (num_addrs > 0) {
1648
1649 memset(lp->multicast_ladrf, 0, MACE_LADRF_LEN);
1650 for (i = 0; i < dev->mc_count; i++) {
1651 memcpy(adr, dmi->dmi_addr, ETHER_ADDR_LEN);
1652 dmi = dmi->next;
1653 BuildLAF(lp->multicast_ladrf, adr);
1654 }
1655 }
1656
1657 restore_multicast_list(dev);
1658
1659}
1660
1661#endif
1662
1663static void restore_multicast_list(struct net_device *dev)
1664{
1665 ioaddr_t ioaddr = dev->base_addr;
1666 mace_private *lp = (mace_private *)dev->priv;
1667
1668 DEBUG(2, "%s: restoring Rx mode to %d addresses.\n", dev->name,
1669 ((mace_private *)(dev->priv))->multicast_num_addrs);
1670
1671 if (dev->flags & IFF_PROMISC) {
1672
1673 mace_write(lp,ioaddr, MACE_UTR, MACE_UTR_LOOP_EXTERNAL);
1674 mace_write(lp, ioaddr, MACE_MACCC,
1675 MACE_MACCC_PROM | MACE_MACCC_ENXMT | MACE_MACCC_ENRCV
1676 );
1677 } else {
1678
1679 mace_write(lp, ioaddr, MACE_UTR, MACE_UTR_LOOP_EXTERNAL);
1680 mace_write(lp, ioaddr, MACE_MACCC, MACE_MACCC_ENXMT | MACE_MACCC_ENRCV);
1681 }
1682}
1683
1684static void set_multicast_list(struct net_device *dev)
1685{
1686 mace_private *lp = (mace_private *)dev->priv;
1687
1688#ifdef PCMCIA_DEBUG
1689 if (pc_debug > 1) {
1690 static int old;
1691 if (dev->mc_count != old) {
1692 old = dev->mc_count;
1693 DEBUG(0, "%s: setting Rx mode to %d addresses.\n",
1694 dev->name, old);
1695 }
1696 }
1697#endif
1698
1699 lp->multicast_num_addrs = dev->mc_count;
1700 restore_multicast_list(dev);
1701
1702}
1703
1704static struct pcmcia_driver nmclan_cs_driver = {
1705 .owner = THIS_MODULE,
1706 .drv = {
1707 .name = "nmclan_cs",
1708 },
1709 .attach = nmclan_attach,
1710 .detach = nmclan_detach,
1711};
1712
1713static int __init init_nmclan_cs(void)
1714{
1715 return pcmcia_register_driver(&nmclan_cs_driver);
1716}
1717
1718static void __exit exit_nmclan_cs(void)
1719{
1720 pcmcia_unregister_driver(&nmclan_cs_driver);
1721 while (dev_list != NULL)
1722 nmclan_detach(dev_list);
1723}
1724
1725module_init(init_nmclan_cs);
1726module_exit(exit_nmclan_cs);
1727