|
|
1.1 root 1: /*
2: * ni6510 (am7990 'lance' chip) driver for Linux-net-3
3: * BETAcode v0.71 (96/09/29) for 2.0.0 (or later)
4: * copyrights (c) 1994,1995,1996 by M.Hipp
5: *
6: * This driver can handle the old ni6510 board and the newer ni6510
7: * EtherBlaster. (probably it also works with every full NE2100
8: * compatible card)
9: *
10: * To compile as module, type:
11: * gcc -O2 -fomit-frame-pointer -m486 -D__KERNEL__ -DMODULE -c ni65.c
12: * driver probes: io: 0x360,0x300,0x320,0x340 / dma: 3,5,6,7
13: *
14: * This is an extension to the Linux operating system, and is covered by the
15: * same Gnu Public License that covers the Linux-kernel.
16: *
17: * comments/bugs/suggestions can be sent to:
18: * Michael Hipp
19: * email: [email protected]
20: *
21: * sources:
22: * some things are from the 'ni6510-packet-driver for dos by Russ Nelson'
23: * and from the original drivers by D.Becker
24: *
25: * known problems:
26: * - on some PCI boards (including my own) the card/board/ISA-bridge has
27: * problems with bus master DMA. This results in lotsa overruns.
28: * It may help to '#define RCV_PARANOIA_CHECK' or try to #undef
29: * the XMT and RCV_VIA_SKB option .. this reduces driver performance.
30: * Or just play with your BIOS options to optimize ISA-DMA access.
31: * Maybe you also wanna play with the LOW_PERFORAMCE and MID_PERFORMANCE
32: * defines -> please report me your experience then
33: * - Harald reported for ASUS SP3G mainboards, that you should use
34: * the 'optimal settings' from the user's manual on page 3-12!
35: *
36: * credits:
37: * thanx to Jason Sullivan for sending me a ni6510 card!
38: * lot of debug runs with ASUS SP3G Boards (Intel Saturn) by Harald Koenig
39: *
40: * simple performance test: (486DX-33/Ni6510-EB receives from 486DX4-100/Ni6510-EB)
41: * average: FTP -> 8384421 bytes received in 8.5 seconds
42: * (no RCV_VIA_SKB,no XMT_VIA_SKB,PARANOIA_CHECK,4 XMIT BUFS, 8 RCV_BUFFS)
43: * peak: FTP -> 8384421 bytes received in 7.5 seconds
44: * (RCV_VIA_SKB,XMT_VIA_SKB,no PARANOIA_CHECK,1(!) XMIT BUF, 16 RCV BUFFS)
45: */
46:
47: /*
48: * 96.Sept.29: virt_to_bus stuff added for new memory modell
49: * 96.April.29: Added Harald Koenig's Patches (MH)
50: * 96.April.13: enhanced error handling .. more tests (MH)
51: * 96.April.5/6: a lot of performance tests. Got it stable now (hopefully) (MH)
52: * 96.April.1: (no joke ;) .. added EtherBlaster and Module support (MH)
53: * 96.Feb.19: fixed a few bugs .. cleanups .. tested for 1.3.66 (MH)
54: * hopefully no more 16MB limit
55: *
56: * 95.Nov.18: multicast tweaked (AC).
57: *
58: * 94.Aug.22: changes in xmit_intr (ack more than one xmitted-packet), ni65_send_packet (p->lock) (MH)
59: *
60: * 94.July.16: fixed bugs in recv_skb and skb-alloc stuff (MH)
61: */
62:
63: #include <linux/kernel.h>
64: #include <linux/sched.h>
65: #include <linux/string.h>
66: #include <linux/ptrace.h>
67: #include <linux/errno.h>
68: #include <linux/ioport.h>
69: #include <linux/malloc.h>
70: #include <linux/interrupt.h>
71: #include <linux/delay.h>
72: #include <asm/bitops.h>
73: #include <asm/io.h>
74: #include <asm/dma.h>
75:
76: #include <linux/netdevice.h>
77: #include <linux/etherdevice.h>
78: #include <linux/skbuff.h>
79:
80: #include <linux/version.h>
81: #include <linux/module.h>
82:
83: #include "ni65.h"
84:
85: /*
86: * the current setting allows an acceptable performance
87: * for 'RCV_PARANOIA_CHECK' read the 'known problems' part in
88: * the header of this file
89: * 'invert' the defines for max. performance. This may cause DMA problems
90: * on some boards (e.g on my ASUS SP3G)
91: */
92: #undef XMT_VIA_SKB
93: #undef RCV_VIA_SKB
94: #define RCV_PARANOIA_CHECK
95:
96: #define MID_PERFORMANCE
97:
98: #if defined( LOW_PERFORMANCE )
99: static int isa0=7,isa1=7,csr80=0x0c10;
100: #elif defined( MID_PERFORMANCE )
101: static int isa0=5,isa1=5,csr80=0x2810;
102: #else /* high performance */
103: static int isa0=4,isa1=4,csr80=0x0017;
104: #endif
105:
106: /*
107: * a few card/vendor specific defines
108: */
109: #define NI65_ID0 0x00
110: #define NI65_ID1 0x55
111: #define NI65_EB_ID0 0x52
112: #define NI65_EB_ID1 0x44
113: #define NE2100_ID0 0x57
114: #define NE2100_ID1 0x57
115:
116: #define PORT p->cmdr_addr
117:
118: /*
119: * buffer configuration
120: */
121: #if 1
122: #define RMDNUM 16
123: #define RMDNUMMASK 0x80000000
124: #else
125: #define RMDNUM 8
126: #define RMDNUMMASK 0x60000000 /* log2(RMDNUM)<<29 */
127: #endif
128:
129: #if 0
130: #define TMDNUM 1
131: #define TMDNUMMASK 0x00000000
132: #else
133: #define TMDNUM 4
134: #define TMDNUMMASK 0x40000000 /* log2(TMDNUM)<<29 */
135: #endif
136:
137: /* slightly oversized */
138: #define R_BUF_SIZE 1544
139: #define T_BUF_SIZE 1544
140:
141: /*
142: * lance register defines
143: */
144: #define L_DATAREG 0x00
145: #define L_ADDRREG 0x02
146: #define L_RESET 0x04
147: #define L_CONFIG 0x05
148: #define L_BUSIF 0x06
149:
150: /*
151: * to access the lance/am7990-regs, you have to write
152: * reg-number into L_ADDRREG, then you can access it using L_DATAREG
153: */
154: #define CSR0 0x00
155: #define CSR1 0x01
156: #define CSR2 0x02
157: #define CSR3 0x03
158:
159: #define INIT_RING_BEFORE_START 0x1
160: #define FULL_RESET_ON_ERROR 0x2
161:
162: #if 0
163: #define writereg(val,reg) {outw(reg,PORT+L_ADDRREG);inw(PORT+L_ADDRREG); \
164: outw(val,PORT+L_DATAREG);inw(PORT+L_DATAREG);}
165: #define readreg(reg) (outw(reg,PORT+L_ADDRREG),inw(PORT+L_ADDRREG),\
166: inw(PORT+L_DATAREG))
167: #if 0
168: #define writedatareg(val) {outw(val,PORT+L_DATAREG);inw(PORT+L_DATAREG);}
169: #else
170: #define writedatareg(val) { writereg(val,CSR0); }
171: #endif
172: #else
173: #define writereg(val,reg) {outw(reg,PORT+L_ADDRREG);outw(val,PORT+L_DATAREG);}
174: #define readreg(reg) (outw(reg,PORT+L_ADDRREG),inw(PORT+L_DATAREG))
175: #define writedatareg(val) { writereg(val,CSR0); }
176: #endif
177:
178: static unsigned char ni_vendor[] = { 0x02,0x07,0x01 };
179:
180: static struct card {
181: unsigned char id0,id1;
182: short id_offset;
183: short total_size;
184: short cmd_offset;
185: short addr_offset;
186: unsigned char *vendor_id;
187: char *cardname;
188: unsigned char config;
189: } cards[] = {
190: { NI65_ID0,NI65_ID1,0x0e,0x10,0x0,0x8,ni_vendor,"ni6510", 0x1 } ,
191: { NI65_EB_ID0,NI65_EB_ID1,0x0e,0x18,0x10,0x0,ni_vendor,"ni6510 EtherBlaster", 0x2 } ,
192: { NE2100_ID0,NE2100_ID1,0x0e,0x18,0x10,0x0,NULL,"generic NE2100", 0x0 }
193: };
194: #define NUM_CARDS 3
195:
196: struct priv
197: {
198: struct rmd rmdhead[RMDNUM];
199: struct tmd tmdhead[TMDNUM];
200: struct init_block ib;
201: int rmdnum;
202: int tmdnum,tmdlast;
203: #ifdef RCV_VIA_SKB
204: struct sk_buff *recv_skb[RMDNUM];
205: #else
206: void *recvbounce[RMDNUM];
207: #endif
208: #ifdef XMT_VIA_SKB
209: struct sk_buff *tmd_skb[TMDNUM];
210: #endif
211: void *tmdbounce[TMDNUM];
212: int tmdbouncenum;
213: int lock,xmit_queued;
214: struct enet_statistics stats;
215: void *self;
216: int cmdr_addr;
217: int cardno;
218: int features;
219: };
220:
221: static int ni65_probe1(struct device *dev,int);
222: static void ni65_interrupt(int irq, void * dev_id, struct pt_regs *regs);
223: static void ni65_recv_intr(struct device *dev,int);
224: static void ni65_xmit_intr(struct device *dev,int);
225: static int ni65_open(struct device *dev);
226: static int ni65_lance_reinit(struct device *dev);
227: static void ni65_init_lance(struct priv *p,unsigned char*,int,int);
228: static int ni65_send_packet(struct sk_buff *skb, struct device *dev);
229: static int ni65_close(struct device *dev);
230: static int ni65_alloc_buffer(struct device *dev);
231: static void ni65_free_buffer(struct priv *p);
232: static struct enet_statistics *ni65_get_stats(struct device *);
233: static void set_multicast_list(struct device *dev);
234:
235: static int irqtab[] = { 9,12,15,5 }; /* irq config-translate */
236: static int dmatab[] = { 0,3,5,6,7 }; /* dma config-translate and autodetect */
237:
238: static int debuglevel = 1;
239:
240: /*
241: * set 'performance' registers .. we must STOP lance for that
242: */
243: static void ni65_set_performance(struct priv *p)
244: {
245: writereg(CSR0_STOP | CSR0_CLRALL,CSR0); /* STOP */
246:
247: if( !(cards[p->cardno].config & 0x02) )
248: return;
249:
250: outw(80,PORT+L_ADDRREG);
251: if(inw(PORT+L_ADDRREG) != 80)
252: return;
253:
254: writereg( (csr80 & 0x3fff) ,80); /* FIFO watermarks */
255: outw(0,PORT+L_ADDRREG);
256: outw((short)isa0,PORT+L_BUSIF); /* write ISA 0: DMA_R : isa0 * 50ns */
257: outw(1,PORT+L_ADDRREG);
258: outw((short)isa1,PORT+L_BUSIF); /* write ISA 1: DMA_W : isa1 * 50ns */
259:
260: outw(CSR0,PORT+L_ADDRREG); /* switch back to CSR0 */
261: }
262:
263: /*
264: * open interface (up)
265: */
266: static int ni65_open(struct device *dev)
267: {
268: struct priv *p = (struct priv *) dev->priv;
269: int irqval = request_irq(dev->irq, &ni65_interrupt,0,
270: cards[p->cardno].cardname,NULL);
271: if (irqval) {
272: printk ("%s: unable to get IRQ %d (irqval=%d).\n",
273: dev->name,dev->irq, irqval);
274: return -EAGAIN;
275: }
276: irq2dev_map[dev->irq] = dev;
277:
278: if(ni65_lance_reinit(dev))
279: {
280: dev->tbusy = 0;
281: dev->interrupt = 0;
282: dev->start = 1;
283: MOD_INC_USE_COUNT;
284: return 0;
285: }
286: else
287: {
288: irq2dev_map[dev->irq] = NULL;
289: free_irq(dev->irq,NULL);
290: dev->start = 0;
291: return -EAGAIN;
292: }
293: }
294:
295: /*
296: * close interface (down)
297: */
298: static int ni65_close(struct device *dev)
299: {
300: struct priv *p = (struct priv *) dev->priv;
301:
302: outw(inw(PORT+L_RESET),PORT+L_RESET); /* that's the hard way */
303:
304: #ifdef XMT_VIA_SKB
305: {
306: int i;
307: for(i=0;i<TMDNUM;i++)
308: {
309: if(p->tmd_skb[i]) {
310: dev_kfree_skb(p->tmd_skb[i],FREE_WRITE);
311: p->tmd_skb[i] = NULL;
312: }
313: }
314: }
315: #endif
316: irq2dev_map[dev->irq] = NULL;
317: free_irq(dev->irq,NULL);
318: dev->tbusy = 1;
319: dev->start = 0;
320: MOD_DEC_USE_COUNT;
321: return 0;
322: }
323:
324: /*
325: * Probe The Card (not the lance-chip)
326: */
327: #ifdef MODULE
328: static
329: #endif
330: int ni65_probe(struct device *dev)
331: {
332: int *port;
333: static int ports[] = {0x360,0x300,0x320,0x340, 0};
334:
335: if (dev->base_addr > 0x1ff) /* Check a single specified location. */
336: return ni65_probe1(dev, dev->base_addr);
337: else if (dev->base_addr > 0) /* Don't probe at all. */
338: return -ENXIO;
339:
340: for (port = ports; *port; port++)
341: {
342: if (ni65_probe1(dev, *port) == 0)
343: return 0;
344: }
345:
346: return -ENODEV;
347: }
348:
349: /*
350: * this is the real card probe ..
351: */
352: static int ni65_probe1(struct device *dev,int ioaddr)
353: {
354: int i,j;
355: struct priv *p;
356:
357: for(i=0;i<NUM_CARDS;i++) {
358: if(check_region(ioaddr, cards[i].total_size))
359: continue;
360: if(cards[i].id_offset >= 0) {
361: if(inb(ioaddr+cards[i].id_offset+0) != cards[i].id0 ||
362: inb(ioaddr+cards[i].id_offset+1) != cards[i].id1) {
363: continue;
364: }
365: }
366: if(cards[i].vendor_id) {
367: for(j=0;j<3;j++)
368: if(inb(ioaddr+cards[i].addr_offset+j) != cards[i].vendor_id[j])
369: continue;
370: }
371: break;
372: }
373: if(i == NUM_CARDS)
374: return -ENODEV;
375:
376: for(j=0;j<6;j++)
377: dev->dev_addr[j] = inb(ioaddr+cards[i].addr_offset+j);
378:
379: if( (j=ni65_alloc_buffer(dev)) < 0)
380: return j;
381: p = (struct priv *) dev->priv;
382: p->cmdr_addr = ioaddr + cards[i].cmd_offset;
383: p->cardno = i;
384:
385: printk("%s: %s found at %#3x, ", dev->name, cards[p->cardno].cardname , ioaddr);
386:
387: outw(inw(PORT+L_RESET),PORT+L_RESET); /* first: reset the card */
388: if( (j=readreg(CSR0)) != 0x4) {
389: printk(KERN_ERR "can't RESET card: %04x\n",j);
390: ni65_free_buffer(p);
391: return -EAGAIN;
392: }
393:
394: outw(88,PORT+L_ADDRREG);
395: if(inw(PORT+L_ADDRREG) == 88) {
396: unsigned long v;
397: v = inw(PORT+L_DATAREG);
398: v <<= 16;
399: outw(89,PORT+L_ADDRREG);
400: v |= inw(PORT+L_DATAREG);
401: printk("Version %#08lx, ",v);
402: p->features = INIT_RING_BEFORE_START;
403: }
404: else {
405: printk("ancient LANCE, ");
406: p->features = 0x0;
407: }
408:
409: if(test_bit(0,&cards[i].config)) {
410: dev->irq = irqtab[(inw(ioaddr+L_CONFIG)>>2)&3];
411: dev->dma = dmatab[inw(ioaddr+L_CONFIG)&3];
412: printk("IRQ %d (from card), DMA %d (from card).\n",dev->irq,dev->dma);
413: }
414: else {
415: if(dev->dma == 0) {
416: /* 'stuck test' from lance.c */
417: int dma_channels = ((inb(DMA1_STAT_REG) >> 4) & 0x0f) | (inb(DMA2_STAT_REG) & 0xf0);
418: for(i=1;i<5;i++) {
419: int dma = dmatab[i];
420: if(test_bit(dma,&dma_channels) || request_dma(dma,"ni6510"))
421: continue;
422: disable_dma(dma);
423: set_dma_mode(dma,DMA_MODE_CASCADE);
424: enable_dma(dma);
425: ni65_init_lance(p,dev->dev_addr,0,0); /* trigger memory access */
426: disable_dma(dma);
427: free_dma(dma);
428: if(readreg(CSR0) & CSR0_IDON)
429: break;
430: }
431: if(i == 5) {
432: printk("Can't detect DMA channel!\n");
433: ni65_free_buffer(p);
434: return -EAGAIN;
435: }
436: dev->dma = dmatab[i];
437: printk("DMA %d (autodetected), ",dev->dma);
438: }
439: else
440: printk("DMA %d (assigned), ",dev->dma);
441:
442: if(dev->irq < 2)
443: {
444: ni65_init_lance(p,dev->dev_addr,0,0);
445: autoirq_setup(0);
446: writereg(CSR0_INIT|CSR0_INEA,CSR0); /* trigger interrupt */
447:
448: if(!(dev->irq = autoirq_report(2)))
449: {
450: printk("Failed to detect IRQ line!\n");
451: ni65_free_buffer(p);
452: return -EAGAIN;
453: }
454: printk("IRQ %d (autodetected).\n",dev->irq);
455: }
456: else
457: printk("IRQ %d (assigned).\n",dev->irq);
458: }
459:
460: if(request_dma(dev->dma, cards[p->cardno].cardname ) != 0)
461: {
462: printk("%s: Can't request dma-channel %d\n",dev->name,(int) dev->dma);
463: ni65_free_buffer(p);
464: return -EAGAIN;
465: }
466:
467: /*
468: * Grab the region so we can find another board.
469: */
470: request_region(ioaddr,cards[p->cardno].total_size,cards[p->cardno].cardname);
471:
472: dev->base_addr = ioaddr;
473:
474: dev->open = ni65_open;
475: dev->stop = ni65_close;
476: dev->hard_start_xmit = ni65_send_packet;
477: dev->get_stats = ni65_get_stats;
478: dev->set_multicast_list = set_multicast_list;
479:
480: ether_setup(dev);
481:
482: dev->interrupt = 0;
483: dev->tbusy = 0;
484: dev->start = 0;
485:
486: return 0; /* everything is OK */
487: }
488:
489: /*
490: * set lance register and trigger init
491: */
492: static void ni65_init_lance(struct priv *p,unsigned char *daddr,int filter,int mode)
493: {
494: int i;
495: u32 pib;
496:
497: writereg(CSR0_CLRALL|CSR0_STOP,CSR0);
498:
499: for(i=0;i<6;i++)
500: p->ib.eaddr[i] = daddr[i];
501:
502: for(i=0;i<8;i++)
503: p->ib.filter[i] = filter;
504: p->ib.mode = mode;
505:
506: p->ib.trp = (u32) virt_to_bus(p->tmdhead) | TMDNUMMASK;
507: p->ib.rrp = (u32) virt_to_bus(p->rmdhead) | RMDNUMMASK;
508: writereg(0,CSR3); /* busmaster/no word-swap */
509: pib = (u32) virt_to_bus(&p->ib);
510: writereg(pib & 0xffff,CSR1);
511: writereg(pib >> 16,CSR2);
512:
513: writereg(CSR0_INIT,CSR0); /* this changes L_ADDRREG to CSR0 */
514:
515: for(i=0;i<32;i++)
516: {
517: udelay(4000);
518: if(inw(PORT+L_DATAREG) & (CSR0_IDON | CSR0_MERR) )
519: break; /* init ok ? */
520: }
521: }
522:
523: /*
524: * allocate memory area and check the 16MB border
525: */
526: static void *ni65_alloc_mem(struct device *dev,char *what,int size,int type)
527: {
528: struct sk_buff *skb=NULL;
529: unsigned char *ptr;
530: void *ret;
531:
532: if(type) {
533: ret = skb = alloc_skb(2+16+size,GFP_KERNEL|GFP_DMA);
534: if(!skb) {
535: printk("%s: unable to allocate %s memory.\n",dev->name,what);
536: return NULL;
537: }
538: skb->dev = dev;
539: skb_reserve(skb,2+16);
540: skb_put(skb,R_BUF_SIZE); /* grab the whole space .. (not necessary) */
541: ptr = skb->data;
542: }
543: else {
544: ret = ptr = kmalloc(T_BUF_SIZE,GFP_KERNEL | GFP_DMA);
545: if(!ret) {
546: printk("%s: unable to allocate %s memory.\n",dev->name,what);
547: return NULL;
548: }
549: }
550: if( (u32) virt_to_bus(ptr+size) > 0x1000000) {
551: printk("%s: unable to allocate %s memory in lower 16MB!\n",dev->name,what);
552: if(type)
553: kfree_skb(skb,FREE_WRITE);
554: else
555: kfree(ptr);
556: return NULL;
557: }
558: return ret;
559: }
560:
561: /*
562: * allocate all memory structures .. send/recv buffers etc ...
563: */
564: static int ni65_alloc_buffer(struct device *dev)
565: {
566: unsigned char *ptr;
567: struct priv *p;
568: int i;
569:
570: /*
571: * we need 8-aligned memory ..
572: */
573: ptr = ni65_alloc_mem(dev,"BUFFER",sizeof(struct priv)+8,0);
574: if(!ptr)
575: return -ENOMEM;
576:
577: p = dev->priv = (struct priv *) (((unsigned long) ptr + 7) & ~0x7);
578: memset((char *) dev->priv,0,sizeof(struct priv));
579: p->self = ptr;
580:
581: for(i=0;i<TMDNUM;i++)
582: {
583: #ifdef XMT_VIA_SKB
584: p->tmd_skb[i] = NULL;
585: #endif
586: p->tmdbounce[i] = ni65_alloc_mem(dev,"XMIT",T_BUF_SIZE,0);
587: if(!p->tmdbounce[i]) {
588: ni65_free_buffer(p);
589: return -ENOMEM;
590: }
591: }
592:
593: for(i=0;i<RMDNUM;i++)
594: {
595: #ifdef RCV_VIA_SKB
596: p->recv_skb[i] = ni65_alloc_mem(dev,"RECV",R_BUF_SIZE,1);
597: if(!p->recv_skb[i]) {
598: ni65_free_buffer(p);
599: return -ENOMEM;
600: }
601: #else
602: p->recvbounce[i] = ni65_alloc_mem(dev,"RECV",R_BUF_SIZE,0);
603: if(!p->recvbounce[i]) {
604: ni65_free_buffer(p);
605: return -ENOMEM;
606: }
607: #endif
608: }
609:
610: return 0; /* everything is OK */
611: }
612:
613: /*
614: * free buffers and private struct
615: */
616: static void ni65_free_buffer(struct priv *p)
617: {
618: int i;
619:
620: if(!p)
621: return;
622:
623: for(i=0;i<TMDNUM;i++) {
624: if(p->tmdbounce[i])
625: kfree(p->tmdbounce[i]);
626: #ifdef XMT_VIA_SKB
627: if(p->tmd_skb[i])
628: dev_kfree_skb(p->tmd_skb[i],FREE_WRITE);
629: #endif
630: }
631:
632: for(i=0;i<RMDNUM;i++)
633: {
634: #ifdef RCV_VIA_SKB
635: if(p->recv_skb[i])
636: dev_kfree_skb(p->recv_skb[i],FREE_WRITE);
637: #else
638: if(p->recvbounce[i])
639: kfree(p->recvbounce[i]);
640: #endif
641: }
642: if(p->self)
643: kfree(p->self);
644: }
645:
646:
647: /*
648: * stop and (re)start lance .. e.g after an error
649: */
650: static void ni65_stop_start(struct device *dev,struct priv *p)
651: {
652: int csr0 = CSR0_INEA;
653:
654: writedatareg(CSR0_STOP);
655:
656: if(debuglevel > 1)
657: printk("ni65_stop_start\n");
658:
659: if(p->features & INIT_RING_BEFORE_START) {
660: int i;
661: #ifdef XMT_VIA_SKB
662: struct sk_buff *skb_save[TMDNUM];
663: #endif
664: unsigned long buffer[TMDNUM];
665: short blen[TMDNUM];
666:
667: if(p->xmit_queued) {
668: while(1) {
669: if((p->tmdhead[p->tmdlast].u.s.status & XMIT_OWN))
670: break;
671: p->tmdlast = (p->tmdlast + 1) & (TMDNUM-1);
672: if(p->tmdlast == p->tmdnum)
673: break;
674: }
675: }
676:
677: for(i=0;i<TMDNUM;i++) {
678: struct tmd *tmdp = p->tmdhead + i;
679: #ifdef XMT_VIA_SKB
680: skb_save[i] = p->tmd_skb[i];
681: #endif
682: buffer[i] = (u32) bus_to_virt(tmdp->u.buffer);
683: blen[i] = tmdp->blen;
684: tmdp->u.s.status = 0x0;
685: }
686:
687: for(i=0;i<RMDNUM;i++) {
688: struct rmd *rmdp = p->rmdhead + i;
689: rmdp->u.s.status = RCV_OWN;
690: }
691: p->tmdnum = p->xmit_queued = 0;
692: writedatareg(CSR0_STRT | csr0);
693:
694: for(i=0;i<TMDNUM;i++) {
695: int num = (i + p->tmdlast) & (TMDNUM-1);
696: p->tmdhead[i].u.buffer = (u32) virt_to_bus((char *)buffer[num]); /* status is part of buffer field */
697: p->tmdhead[i].blen = blen[num];
698: if(p->tmdhead[i].u.s.status & XMIT_OWN) {
699: p->tmdnum = (p->tmdnum + 1) & (TMDNUM-1);
700: p->xmit_queued = 1;
701: writedatareg(CSR0_TDMD | CSR0_INEA | csr0);
702: }
703: #ifdef XMT_VIA_SKB
704: p->tmd_skb[i] = skb_save[num];
705: #endif
706: }
707: p->rmdnum = p->tmdlast = 0;
708: if(!p->lock)
709: dev->tbusy = (p->tmdnum || !p->xmit_queued) ? 0 : 1;
710: dev->trans_start = jiffies;
711: }
712: else
713: writedatareg(CSR0_STRT | csr0);
714: }
715:
716: /*
717: * init lance (write init-values .. init-buffers) (open-helper)
718: */
719: static int ni65_lance_reinit(struct device *dev)
720: {
721: int i;
722: struct priv *p = (struct priv *) dev->priv;
723:
724: p->lock = 0;
725: p->xmit_queued = 0;
726:
727: disable_dma(dev->dma); /* I've never worked with dma, but we do it like the packetdriver */
728: set_dma_mode(dev->dma,DMA_MODE_CASCADE);
729: enable_dma(dev->dma);
730:
731: outw(inw(PORT+L_RESET),PORT+L_RESET); /* first: reset the card */
732: if( (i=readreg(CSR0) ) != 0x4)
733: {
734: printk(KERN_ERR "%s: can't RESET %s card: %04x\n",dev->name,
735: cards[p->cardno].cardname,(int) i);
736: disable_dma(dev->dma);
737: return 0;
738: }
739:
740: p->rmdnum = p->tmdnum = p->tmdlast = p->tmdbouncenum = 0;
741: for(i=0;i<TMDNUM;i++)
742: {
743: struct tmd *tmdp = p->tmdhead + i;
744: #ifdef XMT_VIA_SKB
745: if(p->tmd_skb[i]) {
746: dev_kfree_skb(p->tmd_skb[i],FREE_WRITE);
747: p->tmd_skb[i] = NULL;
748: }
749: #endif
750: tmdp->u.buffer = 0x0;
751: tmdp->u.s.status = XMIT_START | XMIT_END;
752: tmdp->blen = tmdp->status2 = 0;
753: }
754:
755: for(i=0;i<RMDNUM;i++)
756: {
757: struct rmd *rmdp = p->rmdhead + i;
758: #ifdef RCV_VIA_SKB
759: rmdp->u.buffer = (u32) virt_to_bus(p->recv_skb[i]->data);
760: #else
761: rmdp->u.buffer = (u32) virt_to_bus(p->recvbounce[i]);
762: #endif
763: rmdp->blen = -(R_BUF_SIZE-8);
764: rmdp->mlen = 0;
765: rmdp->u.s.status = RCV_OWN;
766: }
767:
768: if(dev->flags & IFF_PROMISC)
769: ni65_init_lance(p,dev->dev_addr,0x00,M_PROM);
770: else if(dev->mc_count || dev->flags & IFF_ALLMULTI)
771: ni65_init_lance(p,dev->dev_addr,0xff,0x0);
772: else
773: ni65_init_lance(p,dev->dev_addr,0x00,0x00);
774:
775: /*
776: * ni65_set_lance_mem() sets L_ADDRREG to CSR0
777: * NOW, WE WILL NEVER CHANGE THE L_ADDRREG, CSR0 IS ALWAYS SELECTED
778: */
779:
780: if(inw(PORT+L_DATAREG) & CSR0_IDON) {
781: ni65_set_performance(p);
782: /* init OK: start lance , enable interrupts */
783: writedatareg(CSR0_CLRALL | CSR0_INEA | CSR0_STRT);
784: return 1; /* ->OK */
785: }
786: printk(KERN_ERR "%s: can't init lance, status: %04x\n",dev->name,(int) inw(PORT+L_DATAREG));
787: disable_dma(dev->dma);
788: return 0; /* ->Error */
789: }
790:
791: /*
792: * interrupt handler
793: */
794: static void ni65_interrupt(int irq, void * dev_id, struct pt_regs * regs)
795: {
796: int csr0;
797: struct device *dev = (struct device *) irq2dev_map[irq];
798: struct priv *p;
799: int bcnt = 32;
800:
801: if (dev == NULL) {
802: printk (KERN_ERR "ni65_interrupt(): irq %d for unknown device.\n", irq);
803: return;
804: }
805:
806: if(set_bit(0,(int *) &dev->interrupt)) {
807: printk("ni65: oops .. interrupt while proceeding interrupt\n");
808: return;
809: }
810: p = (struct priv *) dev->priv;
811:
812: while(--bcnt) {
813: csr0 = inw(PORT+L_DATAREG);
814:
815: #if 0
816: writedatareg( (csr0 & CSR0_CLRALL) ); /* ack interrupts, disable int. */
817: #else
818: writedatareg( (csr0 & CSR0_CLRALL) | CSR0_INEA ); /* ack interrupts, interrupts enabled */
819: #endif
820:
821: if(!(csr0 & (CSR0_ERR | CSR0_RINT | CSR0_TINT)))
822: break;
823:
824: if(csr0 & CSR0_RINT) /* RECV-int? */
825: ni65_recv_intr(dev,csr0);
826: if(csr0 & CSR0_TINT) /* XMIT-int? */
827: ni65_xmit_intr(dev,csr0);
828:
829: if(csr0 & CSR0_ERR)
830: {
831: struct priv *p = (struct priv *) dev->priv;
832: if(debuglevel > 1)
833: printk("%s: general error: %04x.\n",dev->name,csr0);
834: if(csr0 & CSR0_BABL)
835: p->stats.tx_errors++;
836: if(csr0 & CSR0_MISS) {
837: int i;
838: for(i=0;i<RMDNUM;i++)
839: printk("%02x ",p->rmdhead[i].u.s.status);
840: printk("\n");
841: p->stats.rx_errors++;
842: }
843: if(csr0 & CSR0_MERR) {
844: if(debuglevel > 1)
845: printk("%s: Ooops .. memory error: %04x.\n",dev->name,csr0);
846: ni65_stop_start(dev,p);
847: }
848: }
849: }
850:
851: #ifdef RCV_PARANOIA_CHECK
852: {
853: int j;
854: for(j=0;j<RMDNUM;j++)
855: {
856: struct priv *p = (struct priv *) dev->priv;
857: int i,k,num1,num2;
858: for(i=RMDNUM-1;i>0;i--) {
859: num2 = (p->rmdnum + i) & (RMDNUM-1);
860: if(!(p->rmdhead[num2].u.s.status & RCV_OWN))
861: break;
862: }
863:
864: if(i) {
865: for(k=0;k<RMDNUM;k++) {
866: num1 = (p->rmdnum + k) & (RMDNUM-1);
867: if(!(p->rmdhead[num1].u.s.status & RCV_OWN))
868: break;
869: }
870: if(!k)
871: break;
872:
873: if(debuglevel > 0)
874: {
875: char buf[256],*buf1;
876: int k;
877: buf1 = buf;
878: for(k=0;k<RMDNUM;k++) {
879: sprintf(buf1,"%02x ",(p->rmdhead[k].u.s.status)); /* & RCV_OWN) ); */
880: buf1 += 3;
881: }
882: *buf1 = 0;
883: printk(KERN_ERR "%s: Ooops, receive ring corrupted %2d %2d | %s\n",dev->name,p->rmdnum,i,buf);
884: }
885:
886: p->rmdnum = num1;
887: ni65_recv_intr(dev,csr0);
888: if((p->rmdhead[num2].u.s.status & RCV_OWN))
889: break; /* ok, we are 'in sync' again */
890: }
891: else
892: break;
893: }
894: }
895: #endif
896:
897: if( (csr0 & (CSR0_RXON | CSR0_TXON)) != (CSR0_RXON | CSR0_TXON) ) {
898: printk("%s: RX or TX was offline -> restart\n",dev->name);
899: ni65_stop_start(dev,p);
900: }
901: else
902: writedatareg(CSR0_INEA);
903:
904: dev->interrupt = 0;
905:
906: return;
907: }
908:
909: /*
910: * We have received an Xmit-Interrupt ..
911: * send a new packet if necessary
912: */
913: static void ni65_xmit_intr(struct device *dev,int csr0)
914: {
915: struct priv *p = (struct priv *) dev->priv;
916:
917: while(p->xmit_queued)
918: {
919: struct tmd *tmdp = p->tmdhead + p->tmdlast;
920: int tmdstat = tmdp->u.s.status;
921:
922: if(tmdstat & XMIT_OWN)
923: break;
924:
925: if(tmdstat & XMIT_ERR)
926: {
927: #if 0
928: if(tmdp->status2 & XMIT_TDRMASK && debuglevel > 3)
929: printk(KERN_ERR "%s: tdr-problems (e.g. no resistor)\n",dev->name);
930: #endif
931: /* checking some errors */
932: if(tmdp->status2 & XMIT_RTRY)
933: p->stats.tx_aborted_errors++;
934: if(tmdp->status2 & XMIT_LCAR)
935: p->stats.tx_carrier_errors++;
936: if(tmdp->status2 & (XMIT_BUFF | XMIT_UFLO )) {
937: /* this stops the xmitter */
938: p->stats.tx_fifo_errors++;
939: if(debuglevel > 0)
940: printk(KERN_ERR "%s: Xmit FIFO/BUFF error\n",dev->name);
941: if(p->features & INIT_RING_BEFORE_START) {
942: tmdp->u.s.status = XMIT_OWN | XMIT_START | XMIT_END; /* test: resend this frame */
943: ni65_stop_start(dev,p);
944: break; /* no more Xmit processing .. */
945: }
946: else
947: ni65_stop_start(dev,p);
948: }
949: if(debuglevel > 2)
950: printk(KERN_ERR "%s: xmit-error: %04x %02x-%04x\n",dev->name,csr0,(int) tmdstat,(int) tmdp->status2);
951: if(!(csr0 & CSR0_BABL)) /* don't count errors twice */
952: p->stats.tx_errors++;
953: tmdp->status2 = 0;
954: }
955: else
956: p->stats.tx_packets++;
957:
958: #ifdef XMT_VIA_SKB
959: if(p->tmd_skb[p->tmdlast]) {
960: dev_kfree_skb(p->tmd_skb[p->tmdlast],FREE_WRITE);
961: p->tmd_skb[p->tmdlast] = NULL;
962: }
963: #endif
964:
965: p->tmdlast = (p->tmdlast + 1) & (TMDNUM-1);
966: if(p->tmdlast == p->tmdnum)
967: p->xmit_queued = 0;
968: }
969: dev->tbusy = 0;
970: mark_bh(NET_BH);
971: }
972:
973: /*
974: * We have received a packet
975: */
976: static void ni65_recv_intr(struct device *dev,int csr0)
977: {
978: struct rmd *rmdp;
979: int rmdstat,len;
980: int cnt=0;
981: struct priv *p = (struct priv *) dev->priv;
982:
983: rmdp = p->rmdhead + p->rmdnum;
984: while(!( (rmdstat = rmdp->u.s.status) & RCV_OWN))
985: {
986: cnt++;
987: if( (rmdstat & (RCV_START | RCV_END | RCV_ERR)) != (RCV_START | RCV_END) ) /* error or oversized? */
988: {
989: if(!(rmdstat & RCV_ERR)) {
990: if(rmdstat & RCV_START)
991: {
992: p->stats.rx_length_errors++;
993: printk(KERN_ERR "%s: recv, packet too long: %d\n",dev->name,rmdp->mlen & 0x0fff);
994: }
995: }
996: else {
997: if(debuglevel > 2)
998: printk(KERN_ERR "%s: receive-error: %04x, lance-status: %04x/%04x\n",
999: dev->name,(int) rmdstat,csr0,(int) inw(PORT+L_DATAREG) );
1000: if(rmdstat & RCV_FRAM)
1001: p->stats.rx_frame_errors++;
1002: if(rmdstat & RCV_OFLO)
1003: p->stats.rx_over_errors++;
1004: if(rmdstat & RCV_CRC)
1005: p->stats.rx_crc_errors++;
1006: if(rmdstat & RCV_BUF_ERR)
1007: p->stats.rx_fifo_errors++;
1008: }
1009: if(!(csr0 & CSR0_MISS)) /* don't count errors twice */
1010: p->stats.rx_errors++;
1011: }
1012: else if( (len = (rmdp->mlen & 0x0fff) - 4) >= 60)
1013: {
1014: #ifdef RCV_VIA_SKB
1015: struct sk_buff *skb = alloc_skb(R_BUF_SIZE+2+16,GFP_ATOMIC);
1016: if (skb)
1017: skb_reserve(skb,16);
1018: #else
1019: struct sk_buff *skb = dev_alloc_skb(len+2);
1020: #endif
1021: if(skb)
1022: {
1023: skb_reserve(skb,2);
1024: skb->dev = dev;
1025: #ifdef RCV_VIA_SKB
1026: if( (unsigned long) (skb->data + R_BUF_SIZE) > 0x1000000) {
1027: skb_put(skb,len);
1028: eth_copy_and_sum(skb, (unsigned char *)(p->recv_skb[p->rmdnum]->data),len,0);
1029: }
1030: else {
1031: struct sk_buff *skb1 = p->recv_skb[p->rmdnum];
1032: skb_put(skb,R_BUF_SIZE);
1033: p->recv_skb[p->rmdnum] = skb;
1034: rmdp->u.buffer = (u32) virt_to_bus(skb->data);
1035: skb = skb1;
1036: skb_trim(skb,len);
1037: }
1038: #else
1039: skb_put(skb,len);
1040: eth_copy_and_sum(skb, (unsigned char *) p->recvbounce[p->rmdnum],len,0);
1041: #endif
1042: p->stats.rx_packets++;
1043: skb->protocol=eth_type_trans(skb,dev);
1044: netif_rx(skb);
1045: }
1046: else
1047: {
1048: printk(KERN_ERR "%s: can't alloc new sk_buff\n",dev->name);
1049: p->stats.rx_dropped++;
1050: }
1051: }
1052: else {
1053: printk(KERN_INFO "%s: received runt packet\n",dev->name);
1054: p->stats.rx_errors++;
1055: }
1056: rmdp->blen = -(R_BUF_SIZE-8);
1057: rmdp->mlen = 0;
1058: rmdp->u.s.status = RCV_OWN; /* change owner */
1059: p->rmdnum = (p->rmdnum + 1) & (RMDNUM-1);
1060: rmdp = p->rmdhead + p->rmdnum;
1061: }
1062: }
1063:
1064: /*
1065: * kick xmitter ..
1066: */
1067: static int ni65_send_packet(struct sk_buff *skb, struct device *dev)
1068: {
1069: struct priv *p = (struct priv *) dev->priv;
1070:
1071: if(dev->tbusy)
1072: {
1073: int tickssofar = jiffies - dev->trans_start;
1074: if (tickssofar < 50)
1075: return 1;
1076:
1077: printk(KERN_ERR "%s: xmitter timed out, try to restart!\n",dev->name);
1078: {
1079: int i;
1080: for(i=0;i<TMDNUM;i++)
1081: printk("%02x ",p->tmdhead[i].u.s.status);
1082: printk("\n");
1083: }
1084: ni65_lance_reinit(dev);
1085: dev->tbusy=0;
1086: dev->trans_start = jiffies;
1087: }
1088:
1089: if(skb == NULL) {
1090: dev_tint(dev);
1091: return 0;
1092: }
1093:
1094: if (skb->len <= 0)
1095: return 0;
1096:
1097: if (set_bit(0, (void*)&dev->tbusy) != 0) {
1098: printk(KERN_ERR "%s: Transmitter access conflict.\n", dev->name);
1099: return 1;
1100: }
1101: if (set_bit(0, (void*)&p->lock)) {
1102: printk(KERN_ERR "%s: Queue was locked.\n", dev->name);
1103: return 1;
1104: }
1105:
1106: {
1107: short len = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
1108: struct tmd *tmdp;
1109: long flags;
1110:
1111: #ifdef XMT_VIA_SKB
1112: if( (unsigned long) (skb->data + skb->len) > 0x1000000) {
1113: #endif
1114:
1115: memcpy((char *) p->tmdbounce[p->tmdbouncenum] ,(char *)skb->data,
1116: (skb->len > T_BUF_SIZE) ? T_BUF_SIZE : skb->len);
1117: dev_kfree_skb (skb, FREE_WRITE);
1118:
1119: save_flags(flags);
1120: cli();
1121:
1122: tmdp = p->tmdhead + p->tmdnum;
1123: tmdp->u.buffer = (u32) virt_to_bus(p->tmdbounce[p->tmdbouncenum]);
1124: p->tmdbouncenum = (p->tmdbouncenum + 1) & (TMDNUM - 1);
1125:
1126: #ifdef XMT_VIA_SKB
1127: }
1128: else {
1129: save_flags(flags);
1130: cli();
1131:
1132: tmdp = p->tmdhead + p->tmdnum;
1133: tmdp->u.buffer = (u32) virt_to_bus(skb->data);
1134: p->tmd_skb[p->tmdnum] = skb;
1135: }
1136: #endif
1137: tmdp->blen = -len;
1138:
1139: tmdp->u.s.status = XMIT_OWN | XMIT_START | XMIT_END;
1140: writedatareg(CSR0_TDMD | CSR0_INEA); /* enable xmit & interrupt */
1141:
1142: p->xmit_queued = 1;
1143: p->tmdnum = (p->tmdnum + 1) & (TMDNUM-1);
1144:
1145: dev->tbusy = (p->tmdnum == p->tmdlast) ? 1 : 0;
1146: p->lock = 0;
1147: dev->trans_start = jiffies;
1148:
1149: restore_flags(flags);
1150: }
1151:
1152: return 0;
1153: }
1154:
1155: static struct enet_statistics *ni65_get_stats(struct device *dev)
1156: {
1157:
1158: #if 0
1159: int i;
1160: struct priv *p = (struct priv *) dev->priv;
1161: for(i=0;i<RMDNUM;i++) {
1162: struct rmd *rmdp = p->rmdhead + ((p->rmdnum + i) & (RMDNUM-1));
1163: printk("%02x ",rmdp->u.s.status);
1164: }
1165: printk("\n");
1166: #endif
1167:
1168: return &((struct priv *) dev->priv)->stats;
1169: }
1170:
1171: static void set_multicast_list(struct device *dev)
1172: {
1173: if(!ni65_lance_reinit(dev))
1174: printk(KERN_ERR "%s: Can't switch card into MC mode!\n",dev->name);
1175: dev->tbusy = 0;
1176: }
1177:
1178: #ifdef MODULE
1179: static struct device dev_ni65 = {
1180: " ", /* "ni6510": device name inserted by net_init.c */
1181: 0, 0, 0, 0,
1182: 0x360, 9, /* I/O address, IRQ */
1183: 0, 0, 0, NULL, ni65_probe };
1184:
1185: /* set: io,irq,dma or set it when calling insmod */
1186: static int irq=0;
1187: static int io=0;
1188: static int dma=0;
1189:
1190: int init_module(void)
1191: {
1192: #if 0
1193: if(io <= 0x0 || irq < 2) {
1194: printk("ni65: Autoprobing not allowed for modules.\n");
1195: printk("ni65: Set symbols 'io' 'irq' and 'dma'\n");
1196: return -ENODEV;
1197: }
1198: #endif
1199: dev_ni65.irq = irq;
1200: dev_ni65.dma = dma;
1201: dev_ni65.base_addr = io;
1202: if (register_netdev(&dev_ni65) != 0)
1203: return -EIO;
1204: return 0;
1205: }
1206:
1207: void cleanup_module(void)
1208: {
1209: struct priv *p;
1210: p = (struct priv *) dev_ni65.priv;
1211: if(!p) {
1212: printk("Ooops .. no privat struct\n");
1213: return;
1214: }
1215: disable_dma(dev_ni65.dma);
1216: free_dma(dev_ni65.dma);
1217: release_region(dev_ni65.base_addr,cards[p->cardno].total_size);
1218: ni65_free_buffer(p);
1219: dev_ni65.priv = NULL;
1220: unregister_netdev(&dev_ni65);
1221: }
1222: #endif /* MODULE */
1223:
1224: /*
1225: * END of ni65.c
1226: */
1227:
1228:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.