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