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#include <linux/module.h>
104
105
106
107
108
109
110
111#ifndef CONFIG_ISA_DMA_API
112#define ALLOW_DMA 0
113#else
114#define ALLOW_DMA 1
115#endif
116
117
118
119
120
121#define DEBUGGING 1
122
123
124
125
126
127
128
129
130
131
132#include <linux/errno.h>
133#include <linux/netdevice.h>
134#include <linux/etherdevice.h>
135#include <linux/kernel.h>
136#include <linux/types.h>
137#include <linux/fcntl.h>
138#include <linux/interrupt.h>
139#include <linux/ioport.h>
140#include <linux/in.h>
141#include <linux/skbuff.h>
142#include <linux/slab.h>
143#include <linux/spinlock.h>
144#include <linux/string.h>
145#include <linux/init.h>
146#include <linux/bitops.h>
147#include <linux/delay.h>
148
149#include <asm/system.h>
150#include <asm/io.h>
151#include <asm/irq.h>
152#if ALLOW_DMA
153#include <asm/dma.h>
154#endif
155
156#include "cs89x0.h"
157
158static char version[] __initdata =
159"cs89x0.c: v2.4.3-pre1 Russell Nelson <nelson@crynwr.com>, Andrew Morton <andrewm@uow.edu.au>\n";
160
161#define DRV_NAME "cs89x0"
162
163
164
165
166
167
168
169
170
171
172
173
174#ifdef CONFIG_ARCH_CLPS7500
175static unsigned int netcard_portlist[] __used __initdata =
176 { 0x80090303, 0x300, 0x320, 0x340, 0x360, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x2e0, 0};
177static unsigned int cs8900_irq_map[] = {12,0,0,0};
178#elif defined(CONFIG_SH_HICOSH4)
179static unsigned int netcard_portlist[] __used __initdata =
180 { 0x0300, 0};
181static unsigned int cs8900_irq_map[] = {1,0,0,0};
182#elif defined(CONFIG_MACH_IXDP2351)
183static unsigned int netcard_portlist[] __used __initdata = {IXDP2351_VIRT_CS8900_BASE, 0};
184static unsigned int cs8900_irq_map[] = {IRQ_IXDP2351_CS8900, 0, 0, 0};
185#include <asm/irq.h>
186#elif defined(CONFIG_ARCH_IXDP2X01)
187#include <asm/irq.h>
188static unsigned int netcard_portlist[] __used __initdata = {IXDP2X01_CS8900_VIRT_BASE, 0};
189static unsigned int cs8900_irq_map[] = {IRQ_IXDP2X01_CS8900, 0, 0, 0};
190#elif defined(CONFIG_ARCH_PNX010X)
191#include <asm/irq.h>
192#include <mach/gpio.h>
193#define CIRRUS_DEFAULT_BASE IO_ADDRESS(EXT_STATIC2_s0_BASE + 0x200000)
194#define CIRRUS_DEFAULT_IRQ VH_INTC_INT_NUM_CASCADED_INTERRUPT_1
195static unsigned int netcard_portlist[] __used __initdata = {CIRRUS_DEFAULT_BASE, 0};
196static unsigned int cs8900_irq_map[] = {CIRRUS_DEFAULT_IRQ, 0, 0, 0};
197#else
198static unsigned int netcard_portlist[] __used __initdata =
199 { 0x300, 0x320, 0x340, 0x360, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x2e0, 0};
200static unsigned int cs8900_irq_map[] = {10,11,12,5};
201#endif
202
203#if DEBUGGING
204static unsigned int net_debug = DEBUGGING;
205#else
206#define net_debug 0
207#endif
208
209
210#define NETCARD_IO_EXTENT 16
211
212
213#define FORCE_RJ45 0x0001
214#define FORCE_AUI 0x0002
215#define FORCE_BNC 0x0004
216
217#define FORCE_AUTO 0x0010
218#define FORCE_HALF 0x0020
219#define FORCE_FULL 0x0030
220
221
222struct net_local {
223 struct net_device_stats stats;
224 int chip_type;
225 char chip_revision;
226 int send_cmd;
227 int auto_neg_cnf;
228 int adapter_cnf;
229 int isa_config;
230 int irq_map;
231 int rx_mode;
232 int curr_rx_cfg;
233 int linectl;
234 int send_underrun;
235 int force;
236 spinlock_t lock;
237#if ALLOW_DMA
238 int use_dma;
239 int dma;
240 int dmasize;
241 unsigned char *dma_buff;
242 unsigned char *end_dma_buff;
243 unsigned char *rx_dma_ptr;
244#endif
245};
246
247
248
249static int cs89x0_probe1(struct net_device *dev, int ioaddr, int modular);
250static int net_open(struct net_device *dev);
251static int net_send_packet(struct sk_buff *skb, struct net_device *dev);
252static irqreturn_t net_interrupt(int irq, void *dev_id);
253static void set_multicast_list(struct net_device *dev);
254static void net_timeout(struct net_device *dev);
255static void net_rx(struct net_device *dev);
256static int net_close(struct net_device *dev);
257static struct net_device_stats *net_get_stats(struct net_device *dev);
258static void reset_chip(struct net_device *dev);
259static int get_eeprom_data(struct net_device *dev, int off, int len, int *buffer);
260static int get_eeprom_cksum(int off, int len, int *buffer);
261static int set_mac_address(struct net_device *dev, void *addr);
262static void count_rx_errors(int status, struct net_local *lp);
263#ifdef CONFIG_NET_POLL_CONTROLLER
264static void net_poll_controller(struct net_device *dev);
265#endif
266#if ALLOW_DMA
267static void get_dma_channel(struct net_device *dev);
268static void release_dma_buff(struct net_local *lp);
269#endif
270
271
272#define tx_done(dev) 1
273
274
275
276
277#if !defined(MODULE) && (ALLOW_DMA != 0)
278static int g_cs89x0_dma;
279
280static int __init dma_fn(char *str)
281{
282 g_cs89x0_dma = simple_strtol(str,NULL,0);
283 return 1;
284}
285
286__setup("cs89x0_dma=", dma_fn);
287#endif
288
289#ifndef MODULE
290static int g_cs89x0_media__force;
291
292static int __init media_fn(char *str)
293{
294 if (!strcmp(str, "rj45")) g_cs89x0_media__force = FORCE_RJ45;
295 else if (!strcmp(str, "aui")) g_cs89x0_media__force = FORCE_AUI;
296 else if (!strcmp(str, "bnc")) g_cs89x0_media__force = FORCE_BNC;
297 return 1;
298}
299
300__setup("cs89x0_media=", media_fn);
301
302
303
304
305
306
307
308
309
310
311struct net_device * __init cs89x0_probe(int unit)
312{
313 struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
314 unsigned *port;
315 int err = 0;
316 int irq;
317 int io;
318
319 if (!dev)
320 return ERR_PTR(-ENODEV);
321
322 sprintf(dev->name, "eth%d", unit);
323 netdev_boot_setup_check(dev);
324 io = dev->base_addr;
325 irq = dev->irq;
326
327 if (net_debug)
328 printk("cs89x0:cs89x0_probe(0x%x)\n", io);
329
330 if (io > 0x1ff) {
331 err = cs89x0_probe1(dev, io, 0);
332 } else if (io != 0) {
333 err = -ENXIO;
334 } else {
335 for (port = netcard_portlist; *port; port++) {
336 if (cs89x0_probe1(dev, *port, 0) == 0)
337 break;
338 dev->irq = irq;
339 }
340 if (!*port)
341 err = -ENODEV;
342 }
343 if (err)
344 goto out;
345 return dev;
346out:
347 free_netdev(dev);
348 printk(KERN_WARNING "cs89x0: no cs8900 or cs8920 detected. Be sure to disable PnP with SETUP\n");
349 return ERR_PTR(err);
350}
351#endif
352
353#if defined(CONFIG_MACH_IXDP2351)
354static u16
355readword(unsigned long base_addr, int portno)
356{
357 return __raw_readw(base_addr + (portno << 1));
358}
359
360static void
361writeword(unsigned long base_addr, int portno, u16 value)
362{
363 __raw_writew(value, base_addr + (portno << 1));
364}
365#elif defined(CONFIG_ARCH_IXDP2X01)
366static u16
367readword(unsigned long base_addr, int portno)
368{
369 return __raw_readl(base_addr + (portno << 1));
370}
371
372static void
373writeword(unsigned long base_addr, int portno, u16 value)
374{
375 __raw_writel(value, base_addr + (portno << 1));
376}
377#elif defined(CONFIG_ARCH_PNX010X)
378static u16
379readword(unsigned long base_addr, int portno)
380{
381 return inw(base_addr + (portno << 1));
382}
383
384static void
385writeword(unsigned long base_addr, int portno, u16 value)
386{
387 outw(value, base_addr + (portno << 1));
388}
389#else
390static u16
391readword(unsigned long base_addr, int portno)
392{
393 return inw(base_addr + portno);
394}
395
396static void
397writeword(unsigned long base_addr, int portno, u16 value)
398{
399 outw(value, base_addr + portno);
400}
401#endif
402
403static void
404readwords(unsigned long base_addr, int portno, void *buf, int length)
405{
406 u8 *buf8 = (u8 *)buf;
407
408 do {
409 u16 tmp16;
410
411 tmp16 = readword(base_addr, portno);
412 *buf8++ = (u8)tmp16;
413 *buf8++ = (u8)(tmp16 >> 8);
414 } while (--length);
415}
416
417static void
418writewords(unsigned long base_addr, int portno, void *buf, int length)
419{
420 u8 *buf8 = (u8 *)buf;
421
422 do {
423 u16 tmp16;
424
425 tmp16 = *buf8++;
426 tmp16 |= (*buf8++) << 8;
427 writeword(base_addr, portno, tmp16);
428 } while (--length);
429}
430
431static u16
432readreg(struct net_device *dev, u16 regno)
433{
434 writeword(dev->base_addr, ADD_PORT, regno);
435 return readword(dev->base_addr, DATA_PORT);
436}
437
438static void
439writereg(struct net_device *dev, u16 regno, u16 value)
440{
441 writeword(dev->base_addr, ADD_PORT, regno);
442 writeword(dev->base_addr, DATA_PORT, value);
443}
444
445static int __init
446wait_eeprom_ready(struct net_device *dev)
447{
448 int timeout = jiffies;
449
450
451
452 while(readreg(dev, PP_SelfST) & SI_BUSY)
453 if (jiffies - timeout >= 40)
454 return -1;
455 return 0;
456}
457
458static int __init
459get_eeprom_data(struct net_device *dev, int off, int len, int *buffer)
460{
461 int i;
462
463 if (net_debug > 3) printk("EEPROM data from %x for %x:\n",off,len);
464 for (i = 0; i < len; i++) {
465 if (wait_eeprom_ready(dev) < 0) return -1;
466
467 writereg(dev, PP_EECMD, (off + i) | EEPROM_READ_CMD);
468 if (wait_eeprom_ready(dev) < 0) return -1;
469 buffer[i] = readreg(dev, PP_EEData);
470 if (net_debug > 3) printk("%04x ", buffer[i]);
471 }
472 if (net_debug > 3) printk("\n");
473 return 0;
474}
475
476static int __init
477get_eeprom_cksum(int off, int len, int *buffer)
478{
479 int i, cksum;
480
481 cksum = 0;
482 for (i = 0; i < len; i++)
483 cksum += buffer[i];
484 cksum &= 0xffff;
485 if (cksum == 0)
486 return 0;
487 return -1;
488}
489
490#ifdef CONFIG_NET_POLL_CONTROLLER
491
492
493
494
495static void net_poll_controller(struct net_device *dev)
496{
497 disable_irq(dev->irq);
498 net_interrupt(dev->irq, dev);
499 enable_irq(dev->irq);
500}
501#endif
502
503
504
505
506
507
508
509static int __init
510cs89x0_probe1(struct net_device *dev, int ioaddr, int modular)
511{
512 struct net_local *lp = netdev_priv(dev);
513 static unsigned version_printed;
514 int i;
515 int tmp;
516 unsigned rev_type = 0;
517 int eeprom_buff[CHKSUM_LEN];
518 int retval;
519 DECLARE_MAC_BUF(mac);
520
521
522 if (!modular) {
523 memset(lp, 0, sizeof(*lp));
524 spin_lock_init(&lp->lock);
525#ifndef MODULE
526#if ALLOW_DMA
527 if (g_cs89x0_dma) {
528 lp->use_dma = 1;
529 lp->dma = g_cs89x0_dma;
530 lp->dmasize = 16;
531 }
532#endif
533 lp->force = g_cs89x0_media__force;
534#endif
535 }
536
537#ifdef CONFIG_ARCH_PNX010X
538 initialize_ebi();
539
540
541 if (map_cirrus_gpio() < 0)
542 return -ENODEV;
543
544 reset_cirrus();
545
546
547 if (map_event_router() < 0)
548 return -ENODEV;
549
550 enable_cirrus_irq();
551
552 unmap_cirrus_gpio();
553 unmap_event_router();
554
555 dev->base_addr = ioaddr;
556
557 for (i = 0 ; i < 3 ; i++)
558 readreg(dev, 0);
559#endif
560
561
562
563 if (!request_region(ioaddr & ~3, NETCARD_IO_EXTENT, DRV_NAME)) {
564 printk(KERN_ERR "%s: request_region(0x%x, 0x%x) failed\n",
565 DRV_NAME, ioaddr, NETCARD_IO_EXTENT);
566 retval = -EBUSY;
567 goto out1;
568 }
569
570#ifdef CONFIG_SH_HICOSH4
571
572 writeword(ioaddr, ADD_PORT, 0x0114);
573 writeword(ioaddr, DATA_PORT, 0x0040);
574#endif
575
576
577
578
579
580 if (ioaddr & 1) {
581 if (net_debug > 1)
582 printk(KERN_INFO "%s: odd ioaddr 0x%x\n", dev->name, ioaddr);
583 if ((ioaddr & 2) != 2)
584 if ((readword(ioaddr & ~3, ADD_PORT) & ADD_MASK) != ADD_SIG) {
585 printk(KERN_ERR "%s: bad signature 0x%x\n",
586 dev->name, readword(ioaddr & ~3, ADD_PORT));
587 retval = -ENODEV;
588 goto out2;
589 }
590 }
591
592 ioaddr &= ~3;
593 printk(KERN_DEBUG "PP_addr at %x[%x]: 0x%x\n",
594 ioaddr, ADD_PORT, readword(ioaddr, ADD_PORT));
595 writeword(ioaddr, ADD_PORT, PP_ChipID);
596
597 tmp = readword(ioaddr, DATA_PORT);
598 if (tmp != CHIP_EISA_ID_SIG) {
599 printk(KERN_DEBUG "%s: incorrect signature at %x[%x]: 0x%x!="
600 CHIP_EISA_ID_SIG_STR "\n",
601 dev->name, ioaddr, DATA_PORT, tmp);
602 retval = -ENODEV;
603 goto out2;
604 }
605
606
607 dev->base_addr = ioaddr;
608
609
610 rev_type = readreg(dev, PRODUCT_ID_ADD);
611 lp->chip_type = rev_type &~ REVISON_BITS;
612 lp->chip_revision = ((rev_type & REVISON_BITS) >> 8) + 'A';
613
614
615
616 lp->send_cmd = TX_AFTER_381;
617 if (lp->chip_type == CS8900 && lp->chip_revision >= 'F')
618 lp->send_cmd = TX_NOW;
619 if (lp->chip_type != CS8900 && lp->chip_revision >= 'C')
620 lp->send_cmd = TX_NOW;
621
622 if (net_debug && version_printed++ == 0)
623 printk(version);
624
625 printk(KERN_INFO "%s: cs89%c0%s rev %c found at %#3lx ",
626 dev->name,
627 lp->chip_type==CS8900?'0':'2',
628 lp->chip_type==CS8920M?"M":"",
629 lp->chip_revision,
630 dev->base_addr);
631
632 reset_chip(dev);
633
634
635
636
637
638
639
640
641#ifdef CONFIG_SH_HICOSH4
642 if (1) {
643
644
645
646 __u16 *confd;
647 short cnt;
648 if (((* (volatile __u32 *) 0xa0013ff0) & 0x00ffffff)
649 == 0x006c3000) {
650 confd = (__u16*) 0xa0013fc0;
651 } else {
652 confd = (__u16*) 0xa001ffc0;
653 }
654 cnt = (*confd++ & 0x00ff) >> 1;
655 while (--cnt > 0) {
656 __u16 j = *confd++;
657
658 switch (j & 0x0fff) {
659 case PP_IA:
660 for (i = 0; i < ETH_ALEN/2; i++) {
661 dev->dev_addr[i*2] = confd[i] & 0xFF;
662 dev->dev_addr[i*2+1] = confd[i] >> 8;
663 }
664 break;
665 }
666 j = (j >> 12) + 1;
667 confd += j;
668 cnt -= j;
669 }
670 } else
671#endif
672
673 if ((readreg(dev, PP_SelfST) & (EEPROM_OK | EEPROM_PRESENT)) ==
674 (EEPROM_OK|EEPROM_PRESENT)) {
675
676 for (i=0; i < ETH_ALEN/2; i++) {
677 unsigned int Addr;
678 Addr = readreg(dev, PP_IA+i*2);
679 dev->dev_addr[i*2] = Addr & 0xFF;
680 dev->dev_addr[i*2+1] = Addr >> 8;
681 }
682
683
684
685
686
687
688
689
690
691
692
693 lp->adapter_cnf = 0;
694 i = readreg(dev, PP_LineCTL);
695
696 if ((i & (HCB1 | HCB1_ENBL)) == (HCB1 | HCB1_ENBL))
697 lp->adapter_cnf |= A_CNF_DC_DC_POLARITY;
698
699 if ((i & LOW_RX_SQUELCH) == LOW_RX_SQUELCH)
700 lp->adapter_cnf |= A_CNF_EXTND_10B_2 | A_CNF_LOW_RX_SQUELCH;
701
702 if ((i & (AUI_ONLY | AUTO_AUI_10BASET)) == 0)
703 lp->adapter_cnf |= A_CNF_10B_T | A_CNF_MEDIA_10B_T;
704
705 if ((i & (AUI_ONLY | AUTO_AUI_10BASET)) == AUI_ONLY)
706 lp->adapter_cnf |= A_CNF_AUI | A_CNF_MEDIA_AUI;
707
708 if ((i & (AUI_ONLY | AUTO_AUI_10BASET)) == AUTO_AUI_10BASET)
709 lp->adapter_cnf |= A_CNF_AUI | A_CNF_10B_T |
710 A_CNF_MEDIA_AUI | A_CNF_MEDIA_10B_T | A_CNF_MEDIA_AUTO;
711
712 if (net_debug > 1)
713 printk(KERN_INFO "%s: PP_LineCTL=0x%x, adapter_cnf=0x%x\n",
714 dev->name, i, lp->adapter_cnf);
715
716
717 if (lp->chip_type == CS8900)
718 lp->isa_config = readreg(dev, PP_CS8900_ISAINT) & INT_NO_MASK;
719
720 printk( "[Cirrus EEPROM] ");
721 }
722
723 printk("\n");
724
725
726#ifdef CONFIG_SH_HICOSH4
727 if (1) {
728 printk(KERN_NOTICE "cs89x0: No EEPROM on HiCO.SH4\n");
729 } else
730#endif
731 if ((readreg(dev, PP_SelfST) & EEPROM_PRESENT) == 0)
732 printk(KERN_WARNING "cs89x0: No EEPROM, relying on command line....\n");
733 else if (get_eeprom_data(dev, START_EEPROM_DATA,CHKSUM_LEN,eeprom_buff) < 0) {
734 printk(KERN_WARNING "\ncs89x0: EEPROM read failed, relying on command line.\n");
735 } else if (get_eeprom_cksum(START_EEPROM_DATA,CHKSUM_LEN,eeprom_buff) < 0) {
736
737
738 if ((readreg(dev, PP_SelfST) & (EEPROM_OK | EEPROM_PRESENT)) !=
739 (EEPROM_OK|EEPROM_PRESENT))
740 printk(KERN_WARNING "cs89x0: Extended EEPROM checksum bad and no Cirrus EEPROM, relying on command line\n");
741
742 } else {
743
744
745
746
747 if (!lp->auto_neg_cnf) lp->auto_neg_cnf = eeprom_buff[AUTO_NEG_CNF_OFFSET/2];
748
749 if (!lp->adapter_cnf) lp->adapter_cnf = eeprom_buff[ADAPTER_CNF_OFFSET/2];
750
751 lp->isa_config = eeprom_buff[ISA_CNF_OFFSET/2];
752 dev->mem_start = eeprom_buff[PACKET_PAGE_OFFSET/2] << 8;
753
754
755
756 for (i = 0; i < ETH_ALEN/2; i++) {
757 dev->dev_addr[i*2] = eeprom_buff[i];
758 dev->dev_addr[i*2+1] = eeprom_buff[i] >> 8;
759 }
760 if (net_debug > 1)
761 printk(KERN_DEBUG "%s: new adapter_cnf: 0x%x\n",
762 dev->name, lp->adapter_cnf);
763 }
764
765
766 {
767 int count = 0;
768 if (lp->force & FORCE_RJ45) {lp->adapter_cnf |= A_CNF_10B_T; count++; }
769 if (lp->force & FORCE_AUI) {lp->adapter_cnf |= A_CNF_AUI; count++; }
770 if (lp->force & FORCE_BNC) {lp->adapter_cnf |= A_CNF_10B_2; count++; }
771 if (count > 1) {lp->adapter_cnf |= A_CNF_MEDIA_AUTO; }
772 else if (lp->force & FORCE_RJ45){lp->adapter_cnf |= A_CNF_MEDIA_10B_T; }
773 else if (lp->force & FORCE_AUI) {lp->adapter_cnf |= A_CNF_MEDIA_AUI; }
774 else if (lp->force & FORCE_BNC) {lp->adapter_cnf |= A_CNF_MEDIA_10B_2; }
775 }
776
777 if (net_debug > 1)
778 printk(KERN_DEBUG "%s: after force 0x%x, adapter_cnf=0x%x\n",
779 dev->name, lp->force, lp->adapter_cnf);
780
781
782
783
784
785
786
787
788 printk(KERN_INFO "cs89x0 media %s%s%s",
789 (lp->adapter_cnf & A_CNF_10B_T)?"RJ-45,":"",
790 (lp->adapter_cnf & A_CNF_AUI)?"AUI,":"",
791 (lp->adapter_cnf & A_CNF_10B_2)?"BNC,":"");
792
793 lp->irq_map = 0xffff;
794
795
796 if (lp->chip_type != CS8900 &&
797
798 (i = readreg(dev, PP_CS8920_ISAINT) & 0xff,
799 (i != 0 && i < CS8920_NO_INTS))) {
800 if (!dev->irq)
801 dev->irq = i;
802 } else {
803 i = lp->isa_config & INT_NO_MASK;
804 if (lp->chip_type == CS8900) {
805#if defined(CONFIG_MACH_IXDP2351) || defined(CONFIG_ARCH_IXDP2X01) || defined(CONFIG_ARCH_PNX010X)
806 i = cs8900_irq_map[0];
807#else
808
809 if (i >= ARRAY_SIZE(cs8900_irq_map))
810 printk("\ncs89x0: invalid ISA interrupt number %d\n", i);
811 else
812 i = cs8900_irq_map[i];
813
814 lp->irq_map = CS8900_IRQ_MAP;
815 } else {
816 int irq_map_buff[IRQ_MAP_LEN/2];
817
818 if (get_eeprom_data(dev, IRQ_MAP_EEPROM_DATA,
819 IRQ_MAP_LEN/2,
820 irq_map_buff) >= 0) {
821 if ((irq_map_buff[0] & 0xff) == PNP_IRQ_FRMT)
822 lp->irq_map = (irq_map_buff[0]>>8) | (irq_map_buff[1] << 8);
823 }
824#endif
825 }
826 if (!dev->irq)
827 dev->irq = i;
828 }
829
830 printk(" IRQ %d", dev->irq);
831
832#if ALLOW_DMA
833 if (lp->use_dma) {
834 get_dma_channel(dev);
835 printk(", DMA %d", dev->dma);
836 }
837 else
838#endif
839 {
840 printk(", programmed I/O");
841 }
842
843
844 printk(", MAC %s", print_mac(mac, dev->dev_addr));
845
846 dev->open = net_open;
847 dev->stop = net_close;
848 dev->tx_timeout = net_timeout;
849 dev->watchdog_timeo = HZ;
850 dev->hard_start_xmit = net_send_packet;
851 dev->get_stats = net_get_stats;
852 dev->set_multicast_list = set_multicast_list;
853 dev->set_mac_address = set_mac_address;
854#ifdef CONFIG_NET_POLL_CONTROLLER
855 dev->poll_controller = net_poll_controller;
856#endif
857
858 printk("\n");
859 if (net_debug)
860 printk("cs89x0_probe1() successful\n");
861
862 retval = register_netdev(dev);
863 if (retval)
864 goto out3;
865 return 0;
866out3:
867 writeword(dev->base_addr, ADD_PORT, PP_ChipID);
868out2:
869 release_region(ioaddr & ~3, NETCARD_IO_EXTENT);
870out1:
871 return retval;
872}
873
874
875
876
877
878
879#if ALLOW_DMA
880
881#define dma_page_eq(ptr1, ptr2) ((long)(ptr1)>>17 == (long)(ptr2)>>17)
882
883static void
884get_dma_channel(struct net_device *dev)
885{
886 struct net_local *lp = netdev_priv(dev);
887
888 if (lp->dma) {
889 dev->dma = lp->dma;
890 lp->isa_config |= ISA_RxDMA;
891 } else {
892 if ((lp->isa_config & ANY_ISA_DMA) == 0)
893 return;
894 dev->dma = lp->isa_config & DMA_NO_MASK;
895 if (lp->chip_type == CS8900)
896 dev->dma += 5;
897 if (dev->dma < 5 || dev->dma > 7) {
898 lp->isa_config &= ~ANY_ISA_DMA;
899 return;
900 }
901 }
902 return;
903}
904
905static void
906write_dma(struct net_device *dev, int chip_type, int dma)
907{
908 struct net_local *lp = netdev_priv(dev);
909 if ((lp->isa_config & ANY_ISA_DMA) == 0)
910 return;
911 if (chip_type == CS8900) {
912 writereg(dev, PP_CS8900_ISADMA, dma-5);
913 } else {
914 writereg(dev, PP_CS8920_ISADMA, dma);
915 }
916}
917
918static void
919set_dma_cfg(struct net_device *dev)
920{
921 struct net_local *lp = netdev_priv(dev);
922
923 if (lp->use_dma) {
924 if ((lp->isa_config & ANY_ISA_DMA) == 0) {
925 if (net_debug > 3)
926 printk("set_dma_cfg(): no DMA\n");
927 return;
928 }
929 if (lp->isa_config & ISA_RxDMA) {
930 lp->curr_rx_cfg |= RX_DMA_ONLY;
931 if (net_debug > 3)
932 printk("set_dma_cfg(): RX_DMA_ONLY\n");
933 } else {
934 lp->curr_rx_cfg |= AUTO_RX_DMA;
935 if (net_debug > 3)
936 printk("set_dma_cfg(): AUTO_RX_DMA\n");
937 }
938 }
939}
940
941static int
942dma_bufcfg(struct net_device *dev)
943{
944 struct net_local *lp = netdev_priv(dev);
945 if (lp->use_dma)
946 return (lp->isa_config & ANY_ISA_DMA)? RX_DMA_ENBL : 0;
947 else
948 return 0;
949}
950
951static int
952dma_busctl(struct net_device *dev)
953{
954 int retval = 0;
955 struct net_local *lp = netdev_priv(dev);
956 if (lp->use_dma) {
957 if (lp->isa_config & ANY_ISA_DMA)
958 retval |= RESET_RX_DMA;
959 if (lp->isa_config & DMA_BURST)
960 retval |= DMA_BURST_MODE;
961 if (lp->dmasize == 64)
962 retval |= RX_DMA_SIZE_64K;
963 retval |= MEMORY_ON;
964 }
965 return retval;
966}
967
968static void
969dma_rx(struct net_device *dev)
970{
971 struct net_local *lp = netdev_priv(dev);
972 struct sk_buff *skb;
973 int status, length;
974 unsigned char *bp = lp->rx_dma_ptr;
975
976 status = bp[0] + (bp[1]<<8);
977 length = bp[2] + (bp[3]<<8);
978 bp += 4;
979 if (net_debug > 5) {
980 printk( "%s: receiving DMA packet at %lx, status %x, length %x\n",
981 dev->name, (unsigned long)bp, status, length);
982 }
983 if ((status & RX_OK) == 0) {
984 count_rx_errors(status, lp);
985 goto skip_this_frame;
986 }
987
988
989 skb = dev_alloc_skb(length + 2);
990 if (skb == NULL) {
991 if (net_debug)
992 printk("%s: Memory squeeze, dropping packet.\n", dev->name);
993 lp->stats.rx_dropped++;
994
995
996skip_this_frame:
997 bp += (length + 3) & ~3;
998 if (bp >= lp->end_dma_buff) bp -= lp->dmasize*1024;
999 lp->rx_dma_ptr = bp;
1000 return;
1001 }
1002 skb_reserve(skb, 2);
1003
1004 if (bp + length > lp->end_dma_buff) {
1005 int semi_cnt = lp->end_dma_buff - bp;
1006 memcpy(skb_put(skb,semi_cnt), bp, semi_cnt);
1007 memcpy(skb_put(skb,length - semi_cnt), lp->dma_buff,
1008 length - semi_cnt);
1009 } else {
1010 memcpy(skb_put(skb,length), bp, length);
1011 }
1012 bp += (length + 3) & ~3;
1013 if (bp >= lp->end_dma_buff) bp -= lp->dmasize*1024;
1014 lp->rx_dma_ptr = bp;
1015
1016 if (net_debug > 3) {
1017 printk( "%s: received %d byte DMA packet of type %x\n",
1018 dev->name, length,
1019 (skb->data[ETH_ALEN+ETH_ALEN] << 8) | skb->data[ETH_ALEN+ETH_ALEN+1]);
1020 }
1021 skb->protocol=eth_type_trans(skb,dev);
1022 netif_rx(skb);
1023 dev->last_rx = jiffies;
1024 lp->stats.rx_packets++;
1025 lp->stats.rx_bytes += length;
1026}
1027
1028#endif
1029
1030void __init reset_chip(struct net_device *dev)
1031{
1032#if !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01)
1033 struct net_local *lp = netdev_priv(dev);
1034 int ioaddr = dev->base_addr;
1035#endif
1036 int reset_start_time;
1037
1038 writereg(dev, PP_SelfCTL, readreg(dev, PP_SelfCTL) | POWER_ON_RESET);
1039
1040
1041 msleep(30);
1042
1043#if !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01)
1044 if (lp->chip_type != CS8900) {
1045
1046 writeword(ioaddr, ADD_PORT, PP_CS8920_ISAINT);
1047 outb(dev->irq, ioaddr + DATA_PORT);
1048 outb(0, ioaddr + DATA_PORT + 1);
1049
1050 writeword(ioaddr, ADD_PORT, PP_CS8920_ISAMemB);
1051 outb((dev->mem_start >> 16) & 0xff, ioaddr + DATA_PORT);
1052 outb((dev->mem_start >> 8) & 0xff, ioaddr + DATA_PORT + 1);
1053 }
1054#endif
1055
1056
1057 reset_start_time = jiffies;
1058 while( (readreg(dev, PP_SelfST) & INIT_DONE) == 0 && jiffies - reset_start_time < 2)
1059 ;
1060}
1061
1062
1063static void
1064control_dc_dc(struct net_device *dev, int on_not_off)
1065{
1066 struct net_local *lp = netdev_priv(dev);
1067 unsigned int selfcontrol;
1068 int timenow = jiffies;
1069
1070
1071
1072
1073 selfcontrol = HCB1_ENBL;
1074 if (((lp->adapter_cnf & A_CNF_DC_DC_POLARITY) != 0) ^ on_not_off)
1075 selfcontrol |= HCB1;
1076 else
1077 selfcontrol &= ~HCB1;
1078 writereg(dev, PP_SelfCTL, selfcontrol);
1079
1080
1081 while (jiffies - timenow < HZ)
1082 ;
1083}
1084
1085#define DETECTED_NONE 0
1086#define DETECTED_RJ45H 1
1087#define DETECTED_RJ45F 2
1088#define DETECTED_AUI 3
1089#define DETECTED_BNC 4
1090
1091static int
1092detect_tp(struct net_device *dev)
1093{
1094 struct net_local *lp = netdev_priv(dev);
1095 int timenow = jiffies;
1096 int fdx;
1097
1098 if (net_debug > 1) printk("%s: Attempting TP\n", dev->name);
1099
1100
1101
1102
1103
1104
1105 writereg(dev, PP_LineCTL, lp->linectl &~ AUI_ONLY);
1106 control_dc_dc(dev, 0);
1107
1108
1109 for (timenow = jiffies; jiffies - timenow < 15; )
1110 ;
1111 if ((readreg(dev, PP_LineST) & LINK_OK) == 0)
1112 return DETECTED_NONE;
1113
1114 if (lp->chip_type == CS8900) {
1115 switch (lp->force & 0xf0) {
1116#if 0
1117 case FORCE_AUTO:
1118 printk("%s: cs8900 doesn't autonegotiate\n",dev->name);
1119 return DETECTED_NONE;
1120#endif
1121
1122 case FORCE_AUTO:
1123 lp->force &= ~FORCE_AUTO;
1124 lp->force |= FORCE_HALF;
1125 break;
1126 case FORCE_HALF:
1127 break;
1128 case FORCE_FULL:
1129 writereg(dev, PP_TestCTL, readreg(dev, PP_TestCTL) | FDX_8900);
1130 break;
1131 }
1132 fdx = readreg(dev, PP_TestCTL) & FDX_8900;
1133 } else {
1134 switch (lp->force & 0xf0) {
1135 case FORCE_AUTO:
1136 lp->auto_neg_cnf = AUTO_NEG_ENABLE;
1137 break;
1138 case FORCE_HALF:
1139 lp->auto_neg_cnf = 0;
1140 break;
1141 case FORCE_FULL:
1142 lp->auto_neg_cnf = RE_NEG_NOW | ALLOW_FDX;
1143 break;
1144 }
1145
1146 writereg(dev, PP_AutoNegCTL, lp->auto_neg_cnf & AUTO_NEG_MASK);
1147
1148 if ((lp->auto_neg_cnf & AUTO_NEG_BITS) == AUTO_NEG_ENABLE) {
1149 printk(KERN_INFO "%s: negotiating duplex...\n",dev->name);
1150 while (readreg(dev, PP_AutoNegST) & AUTO_NEG_BUSY) {
1151 if (jiffies - timenow > 4000) {
1152 printk(KERN_ERR "**** Full / half duplex auto-negotiation timed out ****\n");
1153 break;
1154 }
1155 }
1156 }
1157 fdx = readreg(dev, PP_AutoNegST) & FDX_ACTIVE;
1158 }
1159 if (fdx)
1160 return DETECTED_RJ45F;
1161 else
1162 return DETECTED_RJ45H;
1163}
1164
1165
1166static int
1167send_test_pkt(struct net_device *dev)
1168{
1169 char test_packet[] = { 0,0,0,0,0,0, 0,0,0,0,0,0,
1170 0, 46,
1171 0, 0,
1172 0xf3, 0 };
1173 long timenow = jiffies;
1174
1175 writereg(dev, PP_LineCTL, readreg(dev, PP_LineCTL) | SERIAL_TX_ON);
1176
1177 memcpy(test_packet, dev->dev_addr, ETH_ALEN);
1178 memcpy(test_packet+ETH_ALEN, dev->dev_addr, ETH_ALEN);
1179
1180 writeword(dev->base_addr, TX_CMD_PORT, TX_AFTER_ALL);
1181 writeword(dev->base_addr, TX_LEN_PORT, ETH_ZLEN);
1182
1183
1184 while (jiffies - timenow < 5)
1185 if (readreg(dev, PP_BusST) & READY_FOR_TX_NOW)
1186 break;
1187 if (jiffies - timenow >= 5)
1188 return 0;
1189
1190
1191 writewords(dev->base_addr, TX_FRAME_PORT,test_packet,(ETH_ZLEN+1) >>1);
1192
1193 if (net_debug > 1) printk("Sending test packet ");
1194
1195 for (timenow = jiffies; jiffies - timenow < 3; )
1196 ;
1197 if ((readreg(dev, PP_TxEvent) & TX_SEND_OK_BITS) == TX_OK) {
1198 if (net_debug > 1) printk("succeeded\n");
1199 return 1;
1200 }
1201 if (net_debug > 1) printk("failed\n");
1202 return 0;
1203}
1204
1205
1206static int
1207detect_aui(struct net_device *dev)
1208{
1209 struct net_local *lp = netdev_priv(dev);
1210
1211 if (net_debug > 1) printk("%s: Attempting AUI\n", dev->name);
1212 control_dc_dc(dev, 0);
1213
1214 writereg(dev, PP_LineCTL, (lp->linectl &~ AUTO_AUI_10BASET) | AUI_ONLY);
1215
1216 if (send_test_pkt(dev))
1217 return DETECTED_AUI;
1218 else
1219 return DETECTED_NONE;
1220}
1221
1222static int
1223detect_bnc(struct net_device *dev)
1224{
1225 struct net_local *lp = netdev_priv(dev);
1226
1227 if (net_debug > 1) printk("%s: Attempting BNC\n", dev->name);
1228 control_dc_dc(dev, 1);
1229
1230 writereg(dev, PP_LineCTL, (lp->linectl &~ AUTO_AUI_10BASET) | AUI_ONLY);
1231
1232 if (send_test_pkt(dev))
1233 return DETECTED_BNC;
1234 else
1235 return DETECTED_NONE;
1236}
1237
1238
1239static void
1240write_irq(struct net_device *dev, int chip_type, int irq)
1241{
1242 int i;
1243
1244 if (chip_type == CS8900) {
1245
1246 for (i = 0; i != ARRAY_SIZE(cs8900_irq_map); i++)
1247 if (cs8900_irq_map[i] == irq)
1248 break;
1249
1250 if (i == ARRAY_SIZE(cs8900_irq_map))
1251 i = 3;
1252 writereg(dev, PP_CS8900_ISAINT, i);
1253 } else {
1254 writereg(dev, PP_CS8920_ISAINT, irq);
1255 }
1256}
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268static int
1269net_open(struct net_device *dev)
1270{
1271 struct net_local *lp = netdev_priv(dev);
1272 int result = 0;
1273 int i;
1274 int ret;
1275
1276#if !defined(CONFIG_SH_HICOSH4) && !defined(CONFIG_ARCH_PNX010X)
1277 if (dev->irq < 2) {
1278
1279
1280#if 0
1281 writereg(dev, PP_BusCTL, readreg(dev, PP_BusCTL)|ENABLE_IRQ );
1282#endif
1283
1284 writereg(dev, PP_BusCTL, ENABLE_IRQ | MEMORY_ON);
1285
1286 for (i = 2; i < CS8920_NO_INTS; i++) {
1287 if ((1 << i) & lp->irq_map) {
1288 if (request_irq(i, net_interrupt, 0, dev->name, dev) == 0) {
1289 dev->irq = i;
1290 write_irq(dev, lp->chip_type, i);
1291
1292 break;
1293 }
1294 }
1295 }
1296
1297 if (i >= CS8920_NO_INTS) {
1298 writereg(dev, PP_BusCTL, 0);
1299 printk(KERN_ERR "cs89x0: can't get an interrupt\n");
1300 ret = -EAGAIN;
1301 goto bad_out;
1302 }
1303 }
1304 else
1305#endif
1306 {
1307#if !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01) && !defined(CONFIG_ARCH_PNX010X)
1308 if (((1 << dev->irq) & lp->irq_map) == 0) {
1309 printk(KERN_ERR "%s: IRQ %d is not in our map of allowable IRQs, which is %x\n",
1310 dev->name, dev->irq, lp->irq_map);
1311 ret = -EAGAIN;
1312 goto bad_out;
1313 }
1314#endif
1315
1316 writereg(dev, PP_BusCTL, readreg(dev, PP_BusCTL)|ENABLE_IRQ );
1317
1318#if 0
1319 writereg(dev, PP_BusCTL, ENABLE_IRQ | MEMORY_ON);
1320#endif
1321 write_irq(dev, lp->chip_type, dev->irq);
1322 ret = request_irq(dev->irq, &net_interrupt, 0, dev->name, dev);
1323 if (ret) {
1324 if (net_debug)
1325 printk(KERN_DEBUG "cs89x0: request_irq(%d) failed\n", dev->irq);
1326 goto bad_out;
1327 }
1328 }
1329
1330#if ALLOW_DMA
1331 if (lp->use_dma) {
1332 if (lp->isa_config & ANY_ISA_DMA) {
1333 unsigned long flags;
1334 lp->dma_buff = (unsigned char *)__get_dma_pages(GFP_KERNEL,
1335 get_order(lp->dmasize * 1024));
1336
1337 if (!lp->dma_buff) {
1338 printk(KERN_ERR "%s: cannot get %dK memory for DMA\n", dev->name, lp->dmasize);
1339 goto release_irq;
1340 }
1341 if (net_debug > 1) {
1342 printk( "%s: dma %lx %lx\n",
1343 dev->name,
1344 (unsigned long)lp->dma_buff,
1345 (unsigned long)isa_virt_to_bus(lp->dma_buff));
1346 }
1347 if ((unsigned long) lp->dma_buff >= MAX_DMA_ADDRESS ||
1348 !dma_page_eq(lp->dma_buff, lp->dma_buff+lp->dmasize*1024-1)) {
1349 printk(KERN_ERR "%s: not usable as DMA buffer\n", dev->name);
1350 goto release_irq;
1351 }
1352 memset(lp->dma_buff, 0, lp->dmasize * 1024);
1353 if (request_dma(dev->dma, dev->name)) {
1354 printk(KERN_ERR "%s: cannot get dma channel %d\n", dev->name, dev->dma);
1355 goto release_irq;
1356 }
1357 write_dma(dev, lp->chip_type, dev->dma);
1358 lp->rx_dma_ptr = lp->dma_buff;
1359 lp->end_dma_buff = lp->dma_buff + lp->dmasize*1024;
1360 spin_lock_irqsave(&lp->lock, flags);
1361 disable_dma(dev->dma);
1362 clear_dma_ff(dev->dma);
1363 set_dma_mode(dev->dma, 0x14);
1364 set_dma_addr(dev->dma, isa_virt_to_bus(lp->dma_buff));
1365 set_dma_count(dev->dma, lp->dmasize*1024);
1366 enable_dma(dev->dma);
1367 spin_unlock_irqrestore(&lp->lock, flags);
1368 }
1369 }
1370#endif
1371
1372
1373 for (i=0; i < ETH_ALEN/2; i++)
1374 writereg(dev, PP_IA+i*2, dev->dev_addr[i*2] | (dev->dev_addr[i*2+1] << 8));
1375
1376
1377 writereg(dev, PP_BusCTL, MEMORY_ON);
1378
1379
1380 if ((lp->adapter_cnf & A_CNF_EXTND_10B_2) && (lp->adapter_cnf & A_CNF_LOW_RX_SQUELCH))
1381 lp->linectl = LOW_RX_SQUELCH;
1382 else
1383 lp->linectl = 0;
1384
1385
1386 switch(lp->adapter_cnf & A_CNF_MEDIA_TYPE) {
1387 case A_CNF_MEDIA_10B_T: result = lp->adapter_cnf & A_CNF_10B_T; break;
1388 case A_CNF_MEDIA_AUI: result = lp->adapter_cnf & A_CNF_AUI; break;
1389 case A_CNF_MEDIA_10B_2: result = lp->adapter_cnf & A_CNF_10B_2; break;
1390 default: result = lp->adapter_cnf & (A_CNF_10B_T | A_CNF_AUI | A_CNF_10B_2);
1391 }
1392#ifdef CONFIG_ARCH_PNX010X
1393 result = A_CNF_10B_T;
1394#endif
1395 if (!result) {
1396 printk(KERN_ERR "%s: EEPROM is configured for unavailable media\n", dev->name);
1397release_dma:
1398#if ALLOW_DMA
1399 free_dma(dev->dma);
1400#endif
1401release_irq:
1402#if ALLOW_DMA
1403 release_dma_buff(lp);
1404#endif
1405 writereg(dev, PP_LineCTL, readreg(dev, PP_LineCTL) & ~(SERIAL_TX_ON | SERIAL_RX_ON));
1406 free_irq(dev->irq, dev);
1407 ret = -EAGAIN;
1408 goto bad_out;
1409 }
1410
1411
1412 switch(lp->adapter_cnf & A_CNF_MEDIA_TYPE) {
1413 case A_CNF_MEDIA_10B_T:
1414 result = detect_tp(dev);
1415 if (result==DETECTED_NONE) {
1416 printk(KERN_WARNING "%s: 10Base-T (RJ-45) has no cable\n", dev->name);
1417 if (lp->auto_neg_cnf & IMM_BIT)
1418 result = DETECTED_RJ45H;
1419 }
1420 break;
1421 case A_CNF_MEDIA_AUI:
1422 result = detect_aui(dev);
1423 if (result==DETECTED_NONE) {
1424 printk(KERN_WARNING "%s: 10Base-5 (AUI) has no cable\n", dev->name);
1425 if (lp->auto_neg_cnf & IMM_BIT)
1426 result = DETECTED_AUI;
1427 }
1428 break;
1429 case A_CNF_MEDIA_10B_2:
1430 result = detect_bnc(dev);
1431 if (result==DETECTED_NONE) {
1432 printk(KERN_WARNING "%s: 10Base-2 (BNC) has no cable\n", dev->name);
1433 if (lp->auto_neg_cnf & IMM_BIT)
1434 result = DETECTED_BNC;
1435 }
1436 break;
1437 case A_CNF_MEDIA_AUTO:
1438 writereg(dev, PP_LineCTL, lp->linectl | AUTO_AUI_10BASET);
1439 if (lp->adapter_cnf & A_CNF_10B_T)
1440 if ((result = detect_tp(dev)) != DETECTED_NONE)
1441 break;
1442 if (lp->adapter_cnf & A_CNF_AUI)
1443 if ((result = detect_aui(dev)) != DETECTED_NONE)
1444 break;
1445 if (lp->adapter_cnf & A_CNF_10B_2)
1446 if ((result = detect_bnc(dev)) != DETECTED_NONE)
1447 break;
1448 printk(KERN_ERR "%s: no media detected\n", dev->name);
1449 goto release_dma;
1450 }
1451 switch(result) {
1452 case DETECTED_NONE:
1453 printk(KERN_ERR "%s: no network cable attached to configured media\n", dev->name);
1454 goto release_dma;
1455 case DETECTED_RJ45H:
1456 printk(KERN_INFO "%s: using half-duplex 10Base-T (RJ-45)\n", dev->name);
1457 break;
1458 case DETECTED_RJ45F:
1459 printk(KERN_INFO "%s: using full-duplex 10Base-T (RJ-45)\n", dev->name);
1460 break;
1461 case DETECTED_AUI:
1462 printk(KERN_INFO "%s: using 10Base-5 (AUI)\n", dev->name);
1463 break;
1464 case DETECTED_BNC:
1465 printk(KERN_INFO "%s: using 10Base-2 (BNC)\n", dev->name);
1466 break;
1467 }
1468
1469
1470 writereg(dev, PP_LineCTL, readreg(dev, PP_LineCTL) | SERIAL_RX_ON | SERIAL_TX_ON);
1471
1472
1473 lp->rx_mode = 0;
1474 writereg(dev, PP_RxCTL, DEF_RX_ACCEPT);
1475
1476 lp->curr_rx_cfg = RX_OK_ENBL | RX_CRC_ERROR_ENBL;
1477
1478 if (lp->isa_config & STREAM_TRANSFER)
1479 lp->curr_rx_cfg |= RX_STREAM_ENBL;
1480#if ALLOW_DMA
1481 set_dma_cfg(dev);
1482#endif
1483 writereg(dev, PP_RxCFG, lp->curr_rx_cfg);
1484
1485 writereg(dev, PP_TxCFG, TX_LOST_CRS_ENBL | TX_SQE_ERROR_ENBL | TX_OK_ENBL |
1486 TX_LATE_COL_ENBL | TX_JBR_ENBL | TX_ANY_COL_ENBL | TX_16_COL_ENBL);
1487
1488 writereg(dev, PP_BufCFG, READY_FOR_TX_ENBL | RX_MISS_COUNT_OVRFLOW_ENBL |
1489#if ALLOW_DMA
1490 dma_bufcfg(dev) |
1491#endif
1492 TX_COL_COUNT_OVRFLOW_ENBL | TX_UNDERRUN_ENBL);
1493
1494
1495 writereg(dev, PP_BusCTL, ENABLE_IRQ
1496 | (dev->mem_start?MEMORY_ON : 0)
1497#if ALLOW_DMA
1498 | dma_busctl(dev)
1499#endif
1500 );
1501 netif_start_queue(dev);
1502 if (net_debug > 1)
1503 printk("cs89x0: net_open() succeeded\n");
1504 return 0;
1505bad_out:
1506 return ret;
1507}
1508
1509static void net_timeout(struct net_device *dev)
1510{
1511
1512
1513 if (net_debug > 0) printk("%s: transmit timed out, %s?\n", dev->name,
1514 tx_done(dev) ? "IRQ conflict ?" : "network cable problem");
1515
1516 netif_wake_queue(dev);
1517}
1518
1519static int net_send_packet(struct sk_buff *skb, struct net_device *dev)
1520{
1521 struct net_local *lp = netdev_priv(dev);
1522
1523 if (net_debug > 3) {
1524 printk("%s: sent %d byte packet of type %x\n",
1525 dev->name, skb->len,
1526 (skb->data[ETH_ALEN+ETH_ALEN] << 8) | skb->data[ETH_ALEN+ETH_ALEN+1]);
1527 }
1528
1529
1530
1531
1532
1533 spin_lock_irq(&lp->lock);
1534 netif_stop_queue(dev);
1535
1536
1537 writeword(dev->base_addr, TX_CMD_PORT, lp->send_cmd);
1538 writeword(dev->base_addr, TX_LEN_PORT, skb->len);
1539
1540
1541 if ((readreg(dev, PP_BusST) & READY_FOR_TX_NOW) == 0) {
1542
1543
1544
1545
1546
1547 spin_unlock_irq(&lp->lock);
1548 if (net_debug) printk("cs89x0: Tx buffer not free!\n");
1549 return 1;
1550 }
1551
1552 writewords(dev->base_addr, TX_FRAME_PORT,skb->data,(skb->len+1) >>1);
1553 spin_unlock_irq(&lp->lock);
1554 lp->stats.tx_bytes += skb->len;
1555 dev->trans_start = jiffies;
1556 dev_kfree_skb (skb);
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569 return 0;
1570}
1571
1572
1573
1574
1575static irqreturn_t net_interrupt(int irq, void *dev_id)
1576{
1577 struct net_device *dev = dev_id;
1578 struct net_local *lp;
1579 int ioaddr, status;
1580 int handled = 0;
1581
1582 ioaddr = dev->base_addr;
1583 lp = netdev_priv(dev);
1584
1585
1586
1587
1588
1589
1590
1591
1592 while ((status = readword(dev->base_addr, ISQ_PORT))) {
1593 if (net_debug > 4)printk("%s: event=%04x\n", dev->name, status);
1594 handled = 1;
1595 switch(status & ISQ_EVENT_MASK) {
1596 case ISQ_RECEIVER_EVENT:
1597
1598 net_rx(dev);
1599 break;
1600 case ISQ_TRANSMITTER_EVENT:
1601 lp->stats.tx_packets++;
1602 netif_wake_queue(dev);
1603 if ((status & ( TX_OK |
1604 TX_LOST_CRS |
1605 TX_SQE_ERROR |
1606 TX_LATE_COL |
1607 TX_16_COL)) != TX_OK) {
1608 if ((status & TX_OK) == 0) lp->stats.tx_errors++;
1609 if (status & TX_LOST_CRS) lp->stats.tx_carrier_errors++;
1610 if (status & TX_SQE_ERROR) lp->stats.tx_heartbeat_errors++;
1611 if (status & TX_LATE_COL) lp->stats.tx_window_errors++;
1612 if (status & TX_16_COL) lp->stats.tx_aborted_errors++;
1613 }
1614 break;
1615 case ISQ_BUFFER_EVENT:
1616 if (status & READY_FOR_TX) {
1617
1618
1619
1620
1621
1622 netif_wake_queue(dev);
1623 }
1624 if (status & TX_UNDERRUN) {
1625 if (net_debug > 0) printk("%s: transmit underrun\n", dev->name);
1626 lp->send_underrun++;
1627 if (lp->send_underrun == 3) lp->send_cmd = TX_AFTER_381;
1628 else if (lp->send_underrun == 6) lp->send_cmd = TX_AFTER_ALL;
1629
1630
1631
1632
1633
1634 netif_wake_queue(dev);
1635 }
1636#if ALLOW_DMA
1637 if (lp->use_dma && (status & RX_DMA)) {
1638 int count = readreg(dev, PP_DmaFrameCnt);
1639 while(count) {
1640 if (net_debug > 5)
1641 printk("%s: receiving %d DMA frames\n", dev->name, count);
1642 if (net_debug > 2 && count >1)
1643 printk("%s: receiving %d DMA frames\n", dev->name, count);
1644 dma_rx(dev);
1645 if (--count == 0)
1646 count = readreg(dev, PP_DmaFrameCnt);
1647 if (net_debug > 2 && count > 0)
1648 printk("%s: continuing with %d DMA frames\n", dev->name, count);
1649 }
1650 }
1651#endif
1652 break;
1653 case ISQ_RX_MISS_EVENT:
1654 lp->stats.rx_missed_errors += (status >>6);
1655 break;
1656 case ISQ_TX_COL_EVENT:
1657 lp->stats.collisions += (status >>6);
1658 break;
1659 }
1660 }
1661 return IRQ_RETVAL(handled);
1662}
1663
1664static void
1665count_rx_errors(int status, struct net_local *lp)
1666{
1667 lp->stats.rx_errors++;
1668 if (status & RX_RUNT) lp->stats.rx_length_errors++;
1669 if (status & RX_EXTRA_DATA) lp->stats.rx_length_errors++;
1670 if (status & RX_CRC_ERROR) if (!(status & (RX_EXTRA_DATA|RX_RUNT)))
1671
1672 lp->stats.rx_crc_errors++;
1673 if (status & RX_DRIBBLE) lp->stats.rx_frame_errors++;
1674 return;
1675}
1676
1677
1678static void
1679net_rx(struct net_device *dev)
1680{
1681 struct net_local *lp = netdev_priv(dev);
1682 struct sk_buff *skb;
1683 int status, length;
1684
1685 int ioaddr = dev->base_addr;
1686 status = readword(ioaddr, RX_FRAME_PORT);
1687 length = readword(ioaddr, RX_FRAME_PORT);
1688
1689 if ((status & RX_OK) == 0) {
1690 count_rx_errors(status, lp);
1691 return;
1692 }
1693
1694
1695 skb = dev_alloc_skb(length + 2);
1696 if (skb == NULL) {
1697#if 0
1698 printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
1699#endif
1700 lp->stats.rx_dropped++;
1701 return;
1702 }
1703 skb_reserve(skb, 2);
1704
1705 readwords(ioaddr, RX_FRAME_PORT, skb_put(skb, length), length >> 1);
1706 if (length & 1)
1707 skb->data[length-1] = readword(ioaddr, RX_FRAME_PORT);
1708
1709 if (net_debug > 3) {
1710 printk( "%s: received %d byte packet of type %x\n",
1711 dev->name, length,
1712 (skb->data[ETH_ALEN+ETH_ALEN] << 8) | skb->data[ETH_ALEN+ETH_ALEN+1]);
1713 }
1714
1715 skb->protocol=eth_type_trans(skb,dev);
1716 netif_rx(skb);
1717 dev->last_rx = jiffies;
1718 lp->stats.rx_packets++;
1719 lp->stats.rx_bytes += length;
1720}
1721
1722#if ALLOW_DMA
1723static void release_dma_buff(struct net_local *lp)
1724{
1725 if (lp->dma_buff) {
1726 free_pages((unsigned long)(lp->dma_buff), get_order(lp->dmasize * 1024));
1727 lp->dma_buff = NULL;
1728 }
1729}
1730#endif
1731
1732
1733static int
1734net_close(struct net_device *dev)
1735{
1736#if ALLOW_DMA
1737 struct net_local *lp = netdev_priv(dev);
1738#endif
1739
1740 netif_stop_queue(dev);
1741
1742 writereg(dev, PP_RxCFG, 0);
1743 writereg(dev, PP_TxCFG, 0);
1744 writereg(dev, PP_BufCFG, 0);
1745 writereg(dev, PP_BusCTL, 0);
1746
1747 free_irq(dev->irq, dev);
1748
1749#if ALLOW_DMA
1750 if (lp->use_dma && lp->dma) {
1751 free_dma(dev->dma);
1752 release_dma_buff(lp);
1753 }
1754#endif
1755
1756
1757 return 0;
1758}
1759
1760
1761
1762static struct net_device_stats *
1763net_get_stats(struct net_device *dev)
1764{
1765 struct net_local *lp = netdev_priv(dev);
1766 unsigned long flags;
1767
1768 spin_lock_irqsave(&lp->lock, flags);
1769
1770 lp->stats.rx_missed_errors += (readreg(dev, PP_RxMiss) >> 6);
1771 lp->stats.collisions += (readreg(dev, PP_TxCol) >> 6);
1772 spin_unlock_irqrestore(&lp->lock, flags);
1773
1774 return &lp->stats;
1775}
1776
1777static void set_multicast_list(struct net_device *dev)
1778{
1779 struct net_local *lp = netdev_priv(dev);
1780 unsigned long flags;
1781
1782 spin_lock_irqsave(&lp->lock, flags);
1783 if(dev->flags&IFF_PROMISC)
1784 {
1785 lp->rx_mode = RX_ALL_ACCEPT;
1786 }
1787 else if((dev->flags&IFF_ALLMULTI)||dev->mc_list)
1788 {
1789
1790
1791 lp->rx_mode = RX_MULTCAST_ACCEPT;
1792 }
1793 else
1794 lp->rx_mode = 0;
1795
1796 writereg(dev, PP_RxCTL, DEF_RX_ACCEPT | lp->rx_mode);
1797
1798
1799 writereg(dev, PP_RxCFG, lp->curr_rx_cfg |
1800 (lp->rx_mode == RX_ALL_ACCEPT? (RX_CRC_ERROR_ENBL|RX_RUNT_ENBL|RX_EXTRA_DATA_ENBL) : 0));
1801 spin_unlock_irqrestore(&lp->lock, flags);
1802}
1803
1804
1805static int set_mac_address(struct net_device *dev, void *p)
1806{
1807 int i;
1808 struct sockaddr *addr = p;
1809
1810 if (netif_running(dev))
1811 return -EBUSY;
1812
1813 memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
1814
1815 if (net_debug) {
1816 DECLARE_MAC_BUF(mac);
1817 printk("%s: Setting MAC address to %s.\n",
1818 dev->name, print_mac(mac, dev->dev_addr));
1819 }
1820
1821 for (i=0; i < ETH_ALEN/2; i++)
1822 writereg(dev, PP_IA+i*2, dev->dev_addr[i*2] | (dev->dev_addr[i*2+1] << 8));
1823
1824 return 0;
1825}
1826
1827#ifdef MODULE
1828
1829static struct net_device *dev_cs89x0;
1830
1831
1832
1833
1834
1835
1836static int io;
1837static int irq;
1838static int debug;
1839static char media[8];
1840static int duplex=-1;
1841
1842static int use_dma;
1843static int dma;
1844static int dmasize=16;
1845
1846module_param(io, int, 0);
1847module_param(irq, int, 0);
1848module_param(debug, int, 0);
1849module_param_string(media, media, sizeof(media), 0);
1850module_param(duplex, int, 0);
1851module_param(dma , int, 0);
1852module_param(dmasize , int, 0);
1853module_param(use_dma , int, 0);
1854MODULE_PARM_DESC(io, "cs89x0 I/O base address");
1855MODULE_PARM_DESC(irq, "cs89x0 IRQ number");
1856#if DEBUGGING
1857MODULE_PARM_DESC(debug, "cs89x0 debug level (0-6)");
1858#else
1859MODULE_PARM_DESC(debug, "(ignored)");
1860#endif
1861MODULE_PARM_DESC(media, "Set cs89x0 adapter(s) media type(s) (rj45,bnc,aui)");
1862
1863MODULE_PARM_DESC(duplex, "(ignored)");
1864#if ALLOW_DMA
1865MODULE_PARM_DESC(dma , "cs89x0 ISA DMA channel; ignored if use_dma=0");
1866MODULE_PARM_DESC(dmasize , "cs89x0 DMA size in kB (16,64); ignored if use_dma=0");
1867MODULE_PARM_DESC(use_dma , "cs89x0 using DMA (0-1)");
1868#else
1869MODULE_PARM_DESC(dma , "(ignored)");
1870MODULE_PARM_DESC(dmasize , "(ignored)");
1871MODULE_PARM_DESC(use_dma , "(ignored)");
1872#endif
1873
1874MODULE_AUTHOR("Mike Cruse, Russwll Nelson <nelson@crynwr.com>, Andrew Morton <andrewm@uow.edu.au>");
1875MODULE_LICENSE("GPL");
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904int __init init_module(void)
1905{
1906 struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
1907 struct net_local *lp;
1908 int ret = 0;
1909
1910#if DEBUGGING
1911 net_debug = debug;
1912#else
1913 debug = 0;
1914#endif
1915 if (!dev)
1916 return -ENOMEM;
1917
1918 dev->irq = irq;
1919 dev->base_addr = io;
1920 lp = netdev_priv(dev);
1921
1922#if ALLOW_DMA
1923 if (use_dma) {
1924 lp->use_dma = use_dma;
1925 lp->dma = dma;
1926 lp->dmasize = dmasize;
1927 }
1928#endif
1929
1930 spin_lock_init(&lp->lock);
1931
1932
1933 if (!strcmp(media, "rj45"))
1934 lp->adapter_cnf = A_CNF_MEDIA_10B_T | A_CNF_10B_T;
1935 else if (!strcmp(media, "aui"))
1936 lp->adapter_cnf = A_CNF_MEDIA_AUI | A_CNF_AUI;
1937 else if (!strcmp(media, "bnc"))
1938 lp->adapter_cnf = A_CNF_MEDIA_10B_2 | A_CNF_10B_2;
1939 else
1940 lp->adapter_cnf = A_CNF_MEDIA_10B_T | A_CNF_10B_T;
1941
1942 if (duplex==-1)
1943 lp->auto_neg_cnf = AUTO_NEG_ENABLE;
1944
1945 if (io == 0) {
1946 printk(KERN_ERR "cs89x0.c: Module autoprobing not allowed.\n");
1947 printk(KERN_ERR "cs89x0.c: Append io=0xNNN\n");
1948 ret = -EPERM;
1949 goto out;
1950 } else if (io <= 0x1ff) {
1951 ret = -ENXIO;
1952 goto out;
1953 }
1954
1955#if ALLOW_DMA
1956 if (use_dma && dmasize != 16 && dmasize != 64) {
1957 printk(KERN_ERR "cs89x0.c: dma size must be either 16K or 64K, not %dK\n", dmasize);
1958 ret = -EPERM;
1959 goto out;
1960 }
1961#endif
1962 ret = cs89x0_probe1(dev, io, 1);
1963 if (ret)
1964 goto out;
1965
1966 dev_cs89x0 = dev;
1967 return 0;
1968out:
1969 free_netdev(dev);
1970 return ret;
1971}
1972
1973void __exit
1974cleanup_module(void)
1975{
1976 unregister_netdev(dev_cs89x0);
1977 writeword(dev_cs89x0->base_addr, ADD_PORT, PP_ChipID);
1978 release_region(dev_cs89x0->base_addr, NETCARD_IO_EXTENT);
1979 free_netdev(dev_cs89x0);
1980}
1981#endif
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992