1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20static const char version[] = "madgemc.c: v0.91 23/01/2000 by Adam Fritzler\n";
21
22#include <linux/module.h>
23#include <linux/mca.h>
24#include <linux/kernel.h>
25#include <linux/errno.h>
26#include <linux/init.h>
27#include <linux/netdevice.h>
28#include <linux/trdevice.h>
29
30#include <asm/system.h>
31#include <asm/io.h>
32#include <asm/irq.h>
33
34#include "tms380tr.h"
35#include "madgemc.h"
36
37#define MADGEMC_IO_EXTENT 32
38#define MADGEMC_SIF_OFFSET 0x08
39
40struct card_info {
41
42
43
44 unsigned int manid;
45 unsigned int cardtype;
46 unsigned int cardrev;
47 unsigned int ramsize;
48
49
50
51
52 unsigned int burstmode:2;
53 unsigned int fairness:1;
54 unsigned int arblevel:4;
55 unsigned int ringspeed:2;
56 unsigned int cabletype:1;
57};
58
59static int madgemc_open(struct net_device *dev);
60static int madgemc_close(struct net_device *dev);
61static int madgemc_chipset_init(struct net_device *dev);
62static void madgemc_read_rom(struct net_device *dev, struct card_info *card);
63static unsigned short madgemc_setnselout_pins(struct net_device *dev);
64static void madgemc_setcabletype(struct net_device *dev, int type);
65
66static int madgemc_mcaproc(char *buf, int slot, void *d);
67
68static void madgemc_setregpage(struct net_device *dev, int page);
69static void madgemc_setsifsel(struct net_device *dev, int val);
70static void madgemc_setint(struct net_device *dev, int val);
71
72static irqreturn_t madgemc_interrupt(int irq, void *dev_id);
73
74
75
76
77
78#define SIFREADB(reg) (inb(dev->base_addr + ((reg<0x8)?reg:reg-0x8)))
79#define SIFWRITEB(val, reg) (outb(val, dev->base_addr + ((reg<0x8)?reg:reg-0x8)))
80#define SIFREADW(reg) (inw(dev->base_addr + ((reg<0x8)?reg:reg-0x8)))
81#define SIFWRITEW(val, reg) (outw(val, dev->base_addr + ((reg<0x8)?reg:reg-0x8)))
82
83
84
85
86static unsigned short madgemc_sifreadb(struct net_device *dev, unsigned short reg)
87{
88 unsigned short ret;
89 if (reg<0x8)
90 ret = SIFREADB(reg);
91 else {
92 madgemc_setregpage(dev, 1);
93 ret = SIFREADB(reg);
94 madgemc_setregpage(dev, 0);
95 }
96 return ret;
97}
98
99
100
101
102static void madgemc_sifwriteb(struct net_device *dev, unsigned short val, unsigned short reg)
103{
104 if (reg<0x8)
105 SIFWRITEB(val, reg);
106 else {
107 madgemc_setregpage(dev, 1);
108 SIFWRITEB(val, reg);
109 madgemc_setregpage(dev, 0);
110 }
111 return;
112}
113
114
115
116
117static unsigned short madgemc_sifreadw(struct net_device *dev, unsigned short reg)
118{
119 unsigned short ret;
120 if (reg<0x8)
121 ret = SIFREADW(reg);
122 else {
123 madgemc_setregpage(dev, 1);
124 ret = SIFREADW(reg);
125 madgemc_setregpage(dev, 0);
126 }
127 return ret;
128}
129
130
131
132
133static void madgemc_sifwritew(struct net_device *dev, unsigned short val, unsigned short reg)
134{
135 if (reg<0x8)
136 SIFWRITEW(val, reg);
137 else {
138 madgemc_setregpage(dev, 1);
139 SIFWRITEW(val, reg);
140 madgemc_setregpage(dev, 0);
141 }
142 return;
143}
144
145static struct net_device_ops madgemc_netdev_ops __read_mostly;
146
147static int __devinit madgemc_probe(struct device *device)
148{
149 static int versionprinted;
150 struct net_device *dev;
151 struct net_local *tp;
152 struct card_info *card;
153 struct mca_device *mdev = to_mca_device(device);
154 int ret = 0;
155
156 if (versionprinted++ == 0)
157 printk("%s", version);
158
159 if(mca_device_claimed(mdev))
160 return -EBUSY;
161 mca_device_set_claim(mdev, 1);
162
163 dev = alloc_trdev(sizeof(struct net_local));
164 if (!dev) {
165 printk("madgemc: unable to allocate dev space\n");
166 mca_device_set_claim(mdev, 0);
167 ret = -ENOMEM;
168 goto getout;
169 }
170
171 dev->netdev_ops = &madgemc_netdev_ops;
172
173 card = kmalloc(sizeof(struct card_info), GFP_KERNEL);
174 if (card==NULL) {
175 printk("madgemc: unable to allocate card struct\n");
176 ret = -ENOMEM;
177 goto getout1;
178 }
179
180
181
182
183
184
185
186
187
188
189 dev->base_addr = 0x0a20 +
190 ((mdev->pos[2] & MC16_POS2_ADDR2)?0x0400:0) +
191 ((mdev->pos[0] & MC16_POS0_ADDR1)?0x1000:0) +
192 ((mdev->pos[3] & MC16_POS3_ADDR3)?0x2000:0);
193
194
195
196
197 switch(mdev->pos[0] >> 6) {
198 case 0x1: dev->irq = 3; break;
199 case 0x2: dev->irq = 9; break;
200 case 0x3: dev->irq = 10; break;
201 default: dev->irq = 0; break;
202 }
203
204 if (dev->irq == 0) {
205 printk("%s: invalid IRQ\n", dev->name);
206 ret = -EBUSY;
207 goto getout2;
208 }
209
210 if (!request_region(dev->base_addr, MADGEMC_IO_EXTENT,
211 "madgemc")) {
212 printk(KERN_INFO "madgemc: unable to setup Smart MC in slot %d because of I/O base conflict at 0x%04lx\n", mdev->slot, dev->base_addr);
213 dev->base_addr += MADGEMC_SIF_OFFSET;
214 ret = -EBUSY;
215 goto getout2;
216 }
217 dev->base_addr += MADGEMC_SIF_OFFSET;
218
219
220
221
222 card->arblevel = ((mdev->pos[0] >> 1) & 0x7) + 8;
223
224
225
226
227 card->burstmode = ((mdev->pos[2] >> 6) & 0x3);
228 card->fairness = ((mdev->pos[2] >> 4) & 0x1);
229
230
231
232
233 if ((mdev->pos[1] >> 2)&0x1)
234 card->ringspeed = 2;
235 else if ((mdev->pos[2] >> 5) & 0x1)
236 card->ringspeed = 1;
237 else
238 card->ringspeed = 0;
239
240
241
242
243 if ((mdev->pos[1] >> 6)&0x1)
244 card->cabletype = 1;
245 else
246 card->cabletype = 0;
247
248
249
250
251
252
253
254 madgemc_read_rom(dev, card);
255
256 if (card->manid != 0x4d) {
257 printk(KERN_INFO "%s: Madge MC ROM read failed (unknown manufacturer ID %02x)\n", dev->name, card->manid);
258 goto getout3;
259 }
260
261 if ((card->cardtype != 0x08) && (card->cardtype != 0x0d)) {
262 printk(KERN_INFO "%s: Madge MC ROM read failed (unknown card ID %02x)\n", dev->name, card->cardtype);
263 ret = -EIO;
264 goto getout3;
265 }
266
267
268 if ((card->cardtype == 0x08) && (card->cardrev <= 0x01))
269 card->ramsize = 128;
270 else
271 card->ramsize = 256;
272
273 printk("%s: %s Rev %d at 0x%04lx IRQ %d\n",
274 dev->name,
275 (card->cardtype == 0x08)?MADGEMC16_CARDNAME:
276 MADGEMC32_CARDNAME, card->cardrev,
277 dev->base_addr, dev->irq);
278
279 if (card->cardtype == 0x0d)
280 printk("%s: Warning: MC32 support is experimental and highly untested\n", dev->name);
281
282 if (card->ringspeed==2) {
283 printk("%s: Warning: Ring speed not set in POS -- Please run the reference disk and set it!\n", dev->name);
284 card->ringspeed = 1;
285 }
286
287 printk("%s: RAM Size: %dKB\n", dev->name, card->ramsize);
288
289 printk("%s: Ring Speed: %dMb/sec on %s\n", dev->name,
290 (card->ringspeed)?16:4,
291 card->cabletype?"STP/DB9":"UTP/RJ-45");
292 printk("%s: Arbitration Level: %d\n", dev->name,
293 card->arblevel);
294
295 printk("%s: Burst Mode: ", dev->name);
296 switch(card->burstmode) {
297 case 0: printk("Cycle steal"); break;
298 case 1: printk("Limited burst"); break;
299 case 2: printk("Delayed release"); break;
300 case 3: printk("Immediate release"); break;
301 }
302 printk(" (%s)\n", (card->fairness)?"Unfair":"Fair");
303
304
305
306
307
308
309
310 outb(0, dev->base_addr + MC_CONTROL_REG0);
311 madgemc_setsifsel(dev, 1);
312 if (request_irq(dev->irq, madgemc_interrupt, IRQF_SHARED,
313 "madgemc", dev)) {
314 ret = -EBUSY;
315 goto getout3;
316 }
317
318 madgemc_chipset_init(dev);
319 madgemc_setcabletype(dev, card->cabletype);
320
321
322 mca_device_set_name(mdev, (card->cardtype == 0x08)?MADGEMC16_CARDNAME:MADGEMC32_CARDNAME);
323 mca_set_adapter_procfn(mdev->slot, madgemc_mcaproc, dev);
324
325 printk("%s: Ring Station Address: %pM\n",
326 dev->name, dev->dev_addr);
327
328 if (tmsdev_init(dev, device)) {
329 printk("%s: unable to get memory for dev->priv.\n",
330 dev->name);
331 ret = -ENOMEM;
332 goto getout4;
333 }
334 tp = netdev_priv(dev);
335
336
337
338
339
340
341
342 tp->setnselout = madgemc_setnselout_pins;
343 tp->sifwriteb = madgemc_sifwriteb;
344 tp->sifreadb = madgemc_sifreadb;
345 tp->sifwritew = madgemc_sifwritew;
346 tp->sifreadw = madgemc_sifreadw;
347 tp->DataRate = (card->ringspeed)?SPEED_16:SPEED_4;
348
349 memcpy(tp->ProductID, "Madge MCA 16/4 ", PROD_ID_SIZE + 1);
350
351 tp->tmspriv = card;
352 dev_set_drvdata(device, dev);
353
354 if (register_netdev(dev) == 0)
355 return 0;
356
357 dev_set_drvdata(device, NULL);
358 ret = -ENOMEM;
359getout4:
360 free_irq(dev->irq, dev);
361getout3:
362 release_region(dev->base_addr-MADGEMC_SIF_OFFSET,
363 MADGEMC_IO_EXTENT);
364getout2:
365 kfree(card);
366getout1:
367 free_netdev(dev);
368getout:
369 mca_device_set_claim(mdev, 0);
370 return ret;
371}
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412static irqreturn_t madgemc_interrupt(int irq, void *dev_id)
413{
414 int pending,reg1;
415 struct net_device *dev;
416
417 if (!dev_id) {
418 printk("madgemc_interrupt: was not passed a dev_id!\n");
419 return IRQ_NONE;
420 }
421
422 dev = (struct net_device *)dev_id;
423
424
425 pending = inb(dev->base_addr + MC_CONTROL_REG0);
426 if (!(pending & MC_CONTROL_REG0_SINTR))
427 return IRQ_NONE;
428
429
430
431
432
433
434
435 pending = STS_SYSTEM_IRQ;
436 do {
437 if (pending & STS_SYSTEM_IRQ) {
438
439
440 reg1 = inb(dev->base_addr + MC_CONTROL_REG1);
441 outb(reg1 ^ MC_CONTROL_REG1_SINTEN,
442 dev->base_addr + MC_CONTROL_REG1);
443 outb(reg1, dev->base_addr + MC_CONTROL_REG1);
444
445
446 tms380tr_interrupt(irq, dev_id);
447
448 pending = SIFREADW(SIFSTS);
449
450 } else
451 return IRQ_HANDLED;
452 } while (1);
453
454 return IRQ_HANDLED;
455}
456
457
458
459
460
461
462
463
464
465
466static unsigned short madgemc_setnselout_pins(struct net_device *dev)
467{
468 unsigned char reg1;
469 struct net_local *tp = netdev_priv(dev);
470
471 reg1 = inb(dev->base_addr + MC_CONTROL_REG1);
472
473 if(tp->DataRate == SPEED_16)
474 reg1 |= MC_CONTROL_REG1_SPEED_SEL;
475 else if (reg1 & MC_CONTROL_REG1_SPEED_SEL)
476 reg1 ^= MC_CONTROL_REG1_SPEED_SEL;
477 outb(reg1, dev->base_addr + MC_CONTROL_REG1);
478
479 return 0;
480}
481
482
483
484
485
486
487
488
489
490
491
492
493static void madgemc_setregpage(struct net_device *dev, int page)
494{
495 static int reg1;
496
497 reg1 = inb(dev->base_addr + MC_CONTROL_REG1);
498 if ((page == 0) && (reg1 & MC_CONTROL_REG1_SRSX)) {
499 outb(reg1 ^ MC_CONTROL_REG1_SRSX,
500 dev->base_addr + MC_CONTROL_REG1);
501 }
502 else if (page == 1) {
503 outb(reg1 | MC_CONTROL_REG1_SRSX,
504 dev->base_addr + MC_CONTROL_REG1);
505 }
506 reg1 = inb(dev->base_addr + MC_CONTROL_REG1);
507
508 return;
509}
510
511
512
513
514
515
516static void madgemc_setsifsel(struct net_device *dev, int val)
517{
518 unsigned int reg0;
519
520 reg0 = inb(dev->base_addr + MC_CONTROL_REG0);
521 if ((val == 0) && (reg0 & MC_CONTROL_REG0_SIFSEL)) {
522 outb(reg0 ^ MC_CONTROL_REG0_SIFSEL,
523 dev->base_addr + MC_CONTROL_REG0);
524 } else if (val == 1) {
525 outb(reg0 | MC_CONTROL_REG0_SIFSEL,
526 dev->base_addr + MC_CONTROL_REG0);
527 }
528 reg0 = inb(dev->base_addr + MC_CONTROL_REG0);
529
530 return;
531}
532
533
534
535
536
537
538
539
540static void madgemc_setint(struct net_device *dev, int val)
541{
542 unsigned int reg1;
543
544 reg1 = inb(dev->base_addr + MC_CONTROL_REG1);
545 if ((val == 0) && (reg1 & MC_CONTROL_REG1_SINTEN)) {
546 outb(reg1 ^ MC_CONTROL_REG1_SINTEN,
547 dev->base_addr + MC_CONTROL_REG1);
548 } else if (val == 1) {
549 outb(reg1 | MC_CONTROL_REG1_SINTEN,
550 dev->base_addr + MC_CONTROL_REG1);
551 }
552
553 return;
554}
555
556
557
558
559
560static void madgemc_setcabletype(struct net_device *dev, int type)
561{
562 outb((type==0)?MC_CONTROL_REG7_CABLEUTP:MC_CONTROL_REG7_CABLESTP,
563 dev->base_addr + MC_CONTROL_REG7);
564}
565
566
567
568
569
570static int madgemc_chipset_init(struct net_device *dev)
571{
572 outb(0, dev->base_addr + MC_CONTROL_REG1);
573 tms380tr_wait(100);
574
575
576 outb(MC_CONTROL_REG1_NSRESET, dev->base_addr + MC_CONTROL_REG1);
577
578
579 madgemc_setsifsel(dev, 1);
580
581
582 madgemc_setint(dev, 1);
583
584 return 0;
585}
586
587
588
589
590static void madgemc_chipset_close(struct net_device *dev)
591{
592
593 madgemc_setint(dev, 0);
594
595 madgemc_setsifsel(dev, 0);
596
597 return;
598}
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629static void madgemc_read_rom(struct net_device *dev, struct card_info *card)
630{
631 unsigned long ioaddr;
632 unsigned char reg0, reg1, tmpreg0, i;
633
634 ioaddr = dev->base_addr;
635
636 reg0 = inb(ioaddr + MC_CONTROL_REG0);
637 reg1 = inb(ioaddr + MC_CONTROL_REG1);
638
639
640 tmpreg0 = reg0 & ~(MC_CONTROL_REG0_PAGE + MC_CONTROL_REG0_SIFSEL);
641 outb(tmpreg0, ioaddr + MC_CONTROL_REG0);
642
643 card->manid = inb(ioaddr + MC_ROM_MANUFACTURERID);
644 card->cardtype = inb(ioaddr + MC_ROM_ADAPTERID);
645 card->cardrev = inb(ioaddr + MC_ROM_REVISION);
646
647
648 outb(tmpreg0 | MC_CONTROL_REG0_PAGE, ioaddr + MC_CONTROL_REG0);
649
650
651 dev->addr_len = 6;
652 for (i = 0; i < 6; i++)
653 dev->dev_addr[i] = inb(ioaddr + MC_ROM_BIA_START + i);
654
655
656 outb(reg0, ioaddr + MC_CONTROL_REG0);
657 outb(reg1, ioaddr + MC_CONTROL_REG1);
658
659 return;
660}
661
662static int madgemc_open(struct net_device *dev)
663{
664
665
666
667
668 madgemc_chipset_init(dev);
669 tms380tr_open(dev);
670 return 0;
671}
672
673static int madgemc_close(struct net_device *dev)
674{
675 tms380tr_close(dev);
676 madgemc_chipset_close(dev);
677 return 0;
678}
679
680
681
682
683static int madgemc_mcaproc(char *buf, int slot, void *d)
684{
685 struct net_device *dev = (struct net_device *)d;
686 struct net_local *tp = netdev_priv(dev);
687 struct card_info *curcard = tp->tmspriv;
688 int len = 0;
689
690 len += sprintf(buf+len, "-------\n");
691 if (curcard) {
692 len += sprintf(buf+len, "Card Revision: %d\n", curcard->cardrev);
693 len += sprintf(buf+len, "RAM Size: %dkb\n", curcard->ramsize);
694 len += sprintf(buf+len, "Cable type: %s\n", (curcard->cabletype)?"STP/DB9":"UTP/RJ-45");
695 len += sprintf(buf+len, "Configured ring speed: %dMb/sec\n", (curcard->ringspeed)?16:4);
696 len += sprintf(buf+len, "Running ring speed: %dMb/sec\n", (tp->DataRate==SPEED_16)?16:4);
697 len += sprintf(buf+len, "Device: %s\n", dev->name);
698 len += sprintf(buf+len, "IO Port: 0x%04lx\n", dev->base_addr);
699 len += sprintf(buf+len, "IRQ: %d\n", dev->irq);
700 len += sprintf(buf+len, "Arbitration Level: %d\n", curcard->arblevel);
701 len += sprintf(buf+len, "Burst Mode: ");
702 switch(curcard->burstmode) {
703 case 0: len += sprintf(buf+len, "Cycle steal"); break;
704 case 1: len += sprintf(buf+len, "Limited burst"); break;
705 case 2: len += sprintf(buf+len, "Delayed release"); break;
706 case 3: len += sprintf(buf+len, "Immediate release"); break;
707 }
708 len += sprintf(buf+len, " (%s)\n", (curcard->fairness)?"Unfair":"Fair");
709
710 len += sprintf(buf+len, "Ring Station Address: %pM\n",
711 dev->dev_addr);
712 } else
713 len += sprintf(buf+len, "Card not configured\n");
714
715 return len;
716}
717
718static int __devexit madgemc_remove(struct device *device)
719{
720 struct net_device *dev = dev_get_drvdata(device);
721 struct net_local *tp;
722 struct card_info *card;
723
724 BUG_ON(!dev);
725
726 tp = netdev_priv(dev);
727 card = tp->tmspriv;
728 kfree(card);
729 tp->tmspriv = NULL;
730
731 unregister_netdev(dev);
732 release_region(dev->base_addr-MADGEMC_SIF_OFFSET, MADGEMC_IO_EXTENT);
733 free_irq(dev->irq, dev);
734 tmsdev_term(dev);
735 free_netdev(dev);
736 dev_set_drvdata(device, NULL);
737
738 return 0;
739}
740
741static short madgemc_adapter_ids[] __initdata = {
742 0x002d,
743 0x0000
744};
745
746static struct mca_driver madgemc_driver = {
747 .id_table = madgemc_adapter_ids,
748 .driver = {
749 .name = "madgemc",
750 .bus = &mca_bus_type,
751 .probe = madgemc_probe,
752 .remove = __devexit_p(madgemc_remove),
753 },
754};
755
756static int __init madgemc_init (void)
757{
758 madgemc_netdev_ops = tms380tr_netdev_ops;
759 madgemc_netdev_ops.ndo_open = madgemc_open;
760 madgemc_netdev_ops.ndo_stop = madgemc_close;
761
762 return mca_register_driver (&madgemc_driver);
763}
764
765static void __exit madgemc_exit (void)
766{
767 mca_unregister_driver (&madgemc_driver);
768}
769
770module_init(madgemc_init);
771module_exit(madgemc_exit);
772
773MODULE_LICENSE("GPL");
774
775