|
|
1.1 root 1: /* eth16i.c An ICL EtherTeam 16i and 32 EISA ethernet driver for Linux
2:
3: Written 1994-1998 by Mika Kuoppala
4:
5: Copyright (C) 1994-1998 by Mika Kuoppala
6: Based on skeleton.c and heavily on at1700.c by Donald Becker
7:
8: This software may be used and distributed according to the terms
9: of the GNU Public Licence, incorporated herein by reference.
10:
11: The author may be reached as [email protected]
12:
13: This driver supports following cards :
14: - ICL EtherTeam 16i
15: - ICL EtherTeam 32 EISA
16: (Uses true 32 bit transfers rather than 16i compability mode)
17:
18: Example Module usage:
19: insmod eth16i.o ioaddr=0x2a0 mediatype=bnc
20:
21: mediatype can be one of the following: bnc,tp,dix,auto,eprom
22:
23: 'auto' will try to autoprobe mediatype.
24: 'eprom' will use whatever type defined in eprom.
25:
26: I have benchmarked driver with PII/300Mhz as a ftp client
27: and 486/33Mhz as a ftp server. Top speed was 1128.37 kilobytes/sec.
28:
29: Sources:
30: - skeleton.c a sample network driver core for linux,
31: written by Donald Becker <[email protected]>
32: - at1700.c a driver for Allied Telesis AT1700, written
33: by Donald Becker.
34: - e16iSRV.asm a Netware 3.X Server Driver for ICL EtherTeam16i
35: written by Markku Viima
36: - The Fujitsu MB86965 databook.
37:
38: Author thanks following persons due to their valueble assistance:
39: Markku Viima (ICL)
40: Ari Valve (ICL)
41: Donald Becker
42: Kurt Huwig <[email protected]>
43:
44: Revision history:
45:
46: Version Date Description
47:
48: 0.01 15.12-94 Initial version (card detection)
49: 0.02 23.01-95 Interrupt is now hooked correctly
50: 0.03 01.02-95 Rewrote initialization part
51: 0.04 07.02-95 Base skeleton done...
52: Made a few changes to signature checking
53: to make it a bit reliable.
54: - fixed bug in tx_buf mapping
55: - fixed bug in initialization (DLC_EN
56: wasn't enabled when initialization
57: was done.)
58: 0.05 08.02-95 If there were more than one packet to send,
59: transmit was jammed due to invalid
60: register write...now fixed
61: 0.06 19.02-95 Rewrote interrupt handling
62: 0.07 13.04-95 Wrote EEPROM read routines
63: Card configuration now set according to
64: data read from EEPROM
65: 0.08 23.06-95 Wrote part that tries to probe used interface
66: port if AUTO is selected
67:
68: 0.09 01.09-95 Added module support
69:
70: 0.10 04.09-95 Fixed receive packet allocation to work
71: with kernels > 1.3.x
72:
73: 0.20 20.09-95 Added support for EtherTeam32 EISA
74:
75: 0.21 17.10-95 Removed the unnecessary extern
76: init_etherdev() declaration. Some
77: other cleanups.
78:
79: 0.22 22.02-96 Receive buffer was not flushed
80: correctly when faulty packet was
81: received. Now fixed.
82:
83: 0.23 26.02-96 Made resetting the adapter
84: more reliable.
85:
86: 0.24 27.02-96 Rewrote faulty packet handling in eth16i_rx
87:
88: 0.25 22.05-96 kfree() was missing from cleanup_module.
89:
90: 0.26 11.06-96 Sometimes card was not found by
91: check_signature(). Now made more reliable.
92:
93: 0.27 23.06-96 Oops. 16 consecutive collisions halted
94: adapter. Now will try to retransmit
95: MAX_COL_16 times before finally giving up.
96:
97: 0.28 28.10-97 Added dev_id parameter (NULL) for free_irq
98:
99: 0.29 29.10-97 Multiple card support for module users
100:
101: 0.30 30.10-97 Fixed irq allocation bug.
102: (request_irq moved from probe to open)
103:
104: 0.30a 21.08-98 Card detection made more relaxed. Driver
105: had problems with some TCP/IP-PROM boots
106: to find the card. Suggested by
107: Kurt Huwig <[email protected]>
108:
109: 0.31 28.08-98 Media interface port can now be selected
110: with module parameters or kernel
111: boot parameters.
112:
113: 0.32 31.08-98 IRQ was never freed if open/close
114: pair wasn't called. Now fixed.
115:
116: 0.33 10.09-98 When eth16i_open() was called after
117: eth16i_close() chip never recovered.
118: Now more shallow reset is made on
119: close.
120:
121: Bugs:
122: In some cases the media interface autoprobing code doesn't find
123: the correct interface type. In this case you can
124: manually choose the interface type in DOS with E16IC.EXE which is
125: configuration software for EtherTeam16i and EtherTeam32 cards.
126: This is also true for IRQ setting. You cannot use module
127: parameter to configure IRQ of the card (yet).
128:
129: To do:
130: - Real multicast support
131: - Rewrite the media interface autoprobing code. Its _horrible_ !
132: - Possibly merge all the MB86965 specific code to external
133: module for use by eth16.c and Donald's at1700.c
134: - IRQ configuration with module parameter. I will do
135: this when i will get enough info about setting
136: irq without configuration utility.
137: */
138:
139: static char *version =
140: "eth16i.c: v0.33 10-09-98 Mika Kuoppala ([email protected])\n";
141:
142: #include <linux/module.h>
143:
144: #include <linux/kernel.h>
145: #include <linux/sched.h>
146: #include <linux/types.h>
147: #include <linux/fcntl.h>
148: #include <linux/interrupt.h>
149: #include <linux/ptrace.h>
150: #include <linux/ioport.h>
151: #include <linux/in.h>
152: #include <linux/malloc.h>
153: #include <linux/string.h>
154: #include <linux/errno.h>
155:
156: #include <linux/netdevice.h>
157: #include <linux/etherdevice.h>
158: #include <linux/skbuff.h>
159:
160: #include <asm/system.h>
161: #include <asm/bitops.h>
162: #include <asm/io.h>
163: #include <asm/dma.h>
164:
165: #ifndef LINUX_VERSION_CODE
166: #include <linux/version.h>
167: #endif
168:
169: #if LINUX_VERSION_CODE >= 0x20123
170: #include <linux/init.h>
171: #else
172: #define __init
173: #define __initdata
174: #define __initfunc(x) x
175: #endif
176:
177: #if LINUX_VERSION_CODE < 0x20138
178: #define test_and_set_bit(val,addr) set_bit(val,addr)
179: #endif
180:
181: #if LINUX_VERSION_CODE < 0x020100
182: typedef struct enet_statistics eth16i_stats_type;
183: #else
184: typedef struct net_device_stats eth16i_stats_type;
185: #endif
186:
187: /* Few macros */
188: #define BIT(a) ( (1 << (a)) )
189: #define BITSET(ioaddr, bnum) ((outb(((inb(ioaddr)) | (bnum)), ioaddr)))
190: #define BITCLR(ioaddr, bnum) ((outb(((inb(ioaddr)) & (~(bnum))), ioaddr)))
191:
192: /* This is the I/O address space for Etherteam 16i adapter. */
193: #define ETH16I_IO_EXTENT 32
194:
195: /* Ticks before deciding that transmit has timed out */
196: #define TX_TIMEOUT (400*HZ/1000)
197:
198: /* Maximum loop count when receiving packets */
199: #define MAX_RX_LOOP 20
200:
201: /* Some interrupt masks */
202: #define ETH16I_INTR_ON 0xef8a /* Higher is receive mask */
203: #define ETH16I_INTR_OFF 0x0000
204:
205: /* Buffers header status byte meanings */
206: #define PKT_GOOD BIT(5)
207: #define PKT_GOOD_RMT BIT(4)
208: #define PKT_SHORT BIT(3)
209: #define PKT_ALIGN_ERR BIT(2)
210: #define PKT_CRC_ERR BIT(1)
211: #define PKT_RX_BUF_OVERFLOW BIT(0)
212:
213: /* Transmit status register (DLCR0) */
214: #define TX_STATUS_REG 0
215: #define TX_DONE BIT(7)
216: #define NET_BUSY BIT(6)
217: #define TX_PKT_RCD BIT(5)
218: #define CR_LOST BIT(4)
219: #define TX_JABBER_ERR BIT(3)
220: #define COLLISION BIT(2)
221: #define COLLISIONS_16 BIT(1)
222:
223: /* Receive status register (DLCR1) */
224: #define RX_STATUS_REG 1
225: #define RX_PKT BIT(7) /* Packet received */
226: #define BUS_RD_ERR BIT(6)
227: #define SHORT_PKT_ERR BIT(3)
228: #define ALIGN_ERR BIT(2)
229: #define CRC_ERR BIT(1)
230: #define RX_BUF_OVERFLOW BIT(0)
231:
232: /* Transmit Interrupt Enable Register (DLCR2) */
233: #define TX_INTR_REG 2
234: #define TX_INTR_DONE BIT(7)
235: #define TX_INTR_COL BIT(2)
236: #define TX_INTR_16_COL BIT(1)
237:
238: /* Receive Interrupt Enable Register (DLCR3) */
239: #define RX_INTR_REG 3
240: #define RX_INTR_RECEIVE BIT(7)
241: #define RX_INTR_SHORT_PKT BIT(3)
242: #define RX_INTR_CRC_ERR BIT(1)
243: #define RX_INTR_BUF_OVERFLOW BIT(0)
244:
245: /* Transmit Mode Register (DLCR4) */
246: #define TRANSMIT_MODE_REG 4
247: #define LOOPBACK_CONTROL BIT(1)
248: #define CONTROL_OUTPUT BIT(2)
249:
250: /* Receive Mode Register (DLCR5) */
251: #define RECEIVE_MODE_REG 5
252: #define RX_BUFFER_EMPTY BIT(6)
253: #define ACCEPT_BAD_PACKETS BIT(5)
254: #define RECEIVE_SHORT_ADDR BIT(4)
255: #define ACCEPT_SHORT_PACKETS BIT(3)
256: #define REMOTE_RESET BIT(2)
257:
258: #define ADDRESS_FILTER_MODE BIT(1) | BIT(0)
259: #define REJECT_ALL 0
260: #define ACCEPT_ALL 3
261: #define MODE_1 1 /* NODE ID, BC, MC, 2-24th bit */
262: #define MODE_2 2 /* NODE ID, BC, MC, Hash Table */
263:
264: /* Configuration Register 0 (DLCR6) */
265: #define CONFIG_REG_0 6
266: #define DLC_EN BIT(7)
267: #define SRAM_CYCLE_TIME_100NS BIT(6)
268: #define SYSTEM_BUS_WIDTH_8 BIT(5) /* 1 = 8bit, 0 = 16bit */
269: #define BUFFER_WIDTH_8 BIT(4) /* 1 = 8bit, 0 = 16bit */
270: #define TBS1 BIT(3)
271: #define TBS0 BIT(2)
272: #define SRAM_BS1 BIT(1) /* 00=8kb, 01=16kb */
273: #define SRAM_BS0 BIT(0) /* 10=32kb, 11=64kb */
274:
275: #ifndef ETH16I_TX_BUF_SIZE /* 0 = 2kb, 1 = 4kb */
276: #define ETH16I_TX_BUF_SIZE 3 /* 2 = 8kb, 3 = 16kb */
277: #endif
278: #define TX_BUF_1x2048 0
279: #define TX_BUF_2x2048 1
280: #define TX_BUF_2x4098 2
281: #define TX_BUF_2x8192 3
282:
283: /* Configuration Register 1 (DLCR7) */
284: #define CONFIG_REG_1 7
285: #define POWERUP BIT(5)
286:
287: /* Transmit start register */
288: #define TRANSMIT_START_REG 10
289: #define TRANSMIT_START_RB 2
290: #define TX_START BIT(7) /* Rest of register bit indicate*/
291: /* number of packets in tx buffer*/
292: /* Node ID registers (DLCR8-13) */
293: #define NODE_ID_0 8
294: #define NODE_ID_RB 0
295:
296: /* Hash Table registers (HT8-15) */
297: #define HASH_TABLE_0 8
298: #define HASH_TABLE_RB 1
299:
300: /* Buffer memory ports */
301: #define BUFFER_MEM_PORT_LB 8
302: #define DATAPORT BUFFER_MEM_PORT_LB
303: #define BUFFER_MEM_PORT_HB 9
304:
305: /* 16 Collision control register (BMPR11) */
306: #define COL_16_REG 11
307: #define HALT_ON_16 0x00
308: #define RETRANS_AND_HALT_ON_16 0x02
309:
310: /* Maximum number of attempts to send after 16 concecutive collisions */
311: #define MAX_COL_16 10
312:
313: /* DMA Burst and Transceiver Mode Register (BMPR13) */
314: #define TRANSCEIVER_MODE_REG 13
315: #define TRANSCEIVER_MODE_RB 2
316: #define IO_BASE_UNLOCK BIT(7)
317: #define LOWER_SQUELCH_TRESH BIT(6)
318: #define LINK_TEST_DISABLE BIT(5)
319: #define AUI_SELECT BIT(4)
320: #define DIS_AUTO_PORT_SEL BIT(3)
321:
322: /* Filter Self Receive Register (BMPR14) */
323: #define FILTER_SELF_RX_REG 14
324: #define SKIP_RX_PACKET BIT(2)
325: #define FILTER_SELF_RECEIVE BIT(0)
326:
327: /* EEPROM Control Register (BMPR 16) */
328: #define EEPROM_CTRL_REG 16
329:
330: /* EEPROM Data Register (BMPR 17) */
331: #define EEPROM_DATA_REG 17
332:
333: /* NMC93CSx6 EEPROM Control Bits */
334: #define CS_0 0x00
335: #define CS_1 0x20
336: #define SK_0 0x00
337: #define SK_1 0x40
338: #define DI_0 0x00
339: #define DI_1 0x80
340:
341: /* NMC93CSx6 EEPROM Instructions */
342: #define EEPROM_READ 0x80
343:
344: /* NMC93CSx6 EEPROM Addresses */
345: #define E_NODEID_0 0x02
346: #define E_NODEID_1 0x03
347: #define E_NODEID_2 0x04
348: #define E_PORT_SELECT 0x14
349: #define E_PORT_BNC 0x00
350: #define E_PORT_DIX 0x01
351: #define E_PORT_TP 0x02
352: #define E_PORT_AUTO 0x03
353: #define E_PORT_FROM_EPROM 0x04
354: #define E_PRODUCT_CFG 0x30
355:
356:
357: /* Macro to slow down io between EEPROM clock transitions */
358: #define eeprom_slow_io() do { int _i = 40; while(--_i > 0) { inb(0x80); }}while(0)
359:
360: /* Jumperless Configuration Register (BMPR19) */
361: #define JUMPERLESS_CONFIG 19
362:
363: /* ID ROM registers, writing to them also resets some parts of chip */
364: #define ID_ROM_0 24
365: #define ID_ROM_7 31
366: #define RESET ID_ROM_0
367:
368: /* This is the I/O address list to be probed when seeking the card */
369: static unsigned int eth16i_portlist[] =
370: { 0x260, 0x280, 0x2A0, 0x240, 0x340, 0x320, 0x380, 0x300, 0 };
371:
372: static unsigned int eth32i_portlist[] =
373: { 0x1000, 0x2000, 0x3000, 0x4000, 0x5000, 0x6000, 0x7000, 0x8000,
374: 0x9000, 0xA000, 0xB000, 0xC000, 0xD000, 0xE000, 0xF000, 0 };
375:
376: /* This is the Interrupt lookup table for Eth16i card */
377: static unsigned int eth16i_irqmap[] = { 9, 10, 5, 15, 0 };
378: #define NUM_OF_ISA_IRQS 4
379:
380: /* This is the Interrupt lookup table for Eth32i card */
381: static unsigned int eth32i_irqmap[] = { 3, 5, 7, 9, 10, 11, 12, 15, 0 };
382: #define EISA_IRQ_REG 0xc89
383: #define NUM_OF_EISA_IRQS 8
384:
385: static unsigned int eth16i_tx_buf_map[] = { 2048, 2048, 4096, 8192 };
386: static unsigned int boot = 1;
387:
388: /* Use 0 for production, 1 for verification, >2 for debug */
389: #ifndef ETH16I_DEBUG
390: #define ETH16I_DEBUG 0
391: #endif
392: static unsigned int eth16i_debug = ETH16I_DEBUG;
393:
394: /* Information for each board */
395:
396: struct eth16i_local {
397: eth16i_stats_type stats;
398: unsigned char tx_started;
399: unsigned char tx_buf_busy;
400: unsigned short tx_queue; /* Number of packets in transmit buffer */
401: unsigned short tx_queue_len;
402: unsigned int tx_buf_size;
403: unsigned long open_time;
404: unsigned long tx_buffered_packets;
405: unsigned long col_16;
406: };
407:
408: /* Function prototypes */
409:
410: extern int eth16i_probe(struct device *dev);
411:
412: static int eth16i_probe1(struct device *dev, int ioaddr);
413: static int eth16i_check_signature(int ioaddr);
414: static int eth16i_probe_port(int ioaddr);
415: static void eth16i_set_port(int ioaddr, int porttype);
416: static int eth16i_send_probe_packet(int ioaddr, unsigned char *b, int l);
417: static int eth16i_receive_probe_packet(int ioaddr);
418: static int eth16i_get_irq(int ioaddr);
419: static int eth16i_read_eeprom(int ioaddr, int offset);
420: static int eth16i_read_eeprom_word(int ioaddr);
421: static void eth16i_eeprom_cmd(int ioaddr, unsigned char command);
422: static int eth16i_open(struct device *dev);
423: static int eth16i_close(struct device *dev);
424: static int eth16i_tx(struct sk_buff *skb, struct device *dev);
425: static void eth16i_rx(struct device *dev);
426: static void eth16i_interrupt(int irq, void *dev_id, struct pt_regs *regs);
427: static void eth16i_reset(struct device *dev);
428: static void eth16i_skip_packet(struct device *dev);
429: static void eth16i_multicast(struct device *dev);
430: static void eth16i_select_regbank(unsigned char regbank, int ioaddr);
431: static void eth16i_initialize(struct device *dev);
432:
433: #if 0
434: static int eth16i_set_irq(struct device *dev);
435: #endif
436:
437: #ifdef MODULE
438: static ushort eth16i_parse_mediatype(const char* s);
439: #endif
440:
441: static struct enet_statistics *eth16i_get_stats(struct device *dev);
442:
443: static char *cardname = "ICL EtherTeam 16i/32";
444:
445: #ifdef HAVE_DEVLIST
446:
447: /* Support for alternate probe manager */
448: /struct netdev_entry eth16i_drv =
449: {"eth16i", eth16i_probe1, ETH16I_IO_EXTENT, eth16i_probe_list};
450:
451: #else /* Not HAVE_DEVLIST */
452:
453: __initfunc(int eth16i_probe(struct device *dev))
454: {
455: int i;
456: int ioaddr;
457: int base_addr = dev ? dev->base_addr : 0;
458:
459: if(eth16i_debug > 4)
460: printk(KERN_DEBUG "Probing started for %s\n", cardname);
461:
462: if(base_addr > 0x1ff) /* Check only single location */
463: return eth16i_probe1(dev, base_addr);
464: else if(base_addr != 0) /* Don't probe at all */
465: return ENXIO;
466:
467: /* Seek card from the ISA io address space */
468: for(i = 0; (ioaddr = eth16i_portlist[i]) ; i++) {
469: if(check_region(ioaddr, ETH16I_IO_EXTENT))
470: continue;
471: if(eth16i_probe1(dev, ioaddr) == 0)
472: return 0;
473: }
474:
475: /* Seek card from the EISA io address space */
476: for(i = 0; (ioaddr = eth32i_portlist[i]) ; i++) {
477: if(check_region(ioaddr, ETH16I_IO_EXTENT))
478: continue;
479: if(eth16i_probe1(dev, ioaddr) == 0)
480: return 0;
481: }
482:
483: return ENODEV;
484: }
485: #endif /* Not HAVE_DEVLIST */
486:
487: __initfunc(static int eth16i_probe1(struct device *dev, int ioaddr))
488: {
489: static unsigned version_printed = 0;
490: boot = 1; /* To inform initilization that we are in boot probe */
491:
492: /*
493: The MB86985 chip has on register which holds information in which
494: io address the chip lies. First read this register and compare
495: it to our current io address and if match then this could
496: be our chip.
497: */
498:
499: if(ioaddr < 0x1000) {
500:
501: if(eth16i_portlist[(inb(ioaddr + JUMPERLESS_CONFIG) & 0x07)]
502: != ioaddr)
503: return -ENODEV;
504: }
505:
506: /* Now we will go a bit deeper and try to find the chip's signature */
507:
508: if(eth16i_check_signature(ioaddr) != 0)
509: return -ENODEV;
510:
511: /*
512: Now it seems that we have found a ethernet chip in this particular
513: ioaddr. The MB86985 chip has this feature, that when you read a
514: certain register it will increase it's io base address to next
515: configurable slot. Now when we have found the chip, first thing is
516: to make sure that the chip's ioaddr will hold still here.
517: */
518:
519: eth16i_select_regbank(TRANSCEIVER_MODE_RB, ioaddr);
520: outb(0x00, ioaddr + TRANSCEIVER_MODE_REG);
521:
522: outb(0x00, ioaddr + RESET); /* Reset some parts of chip */
523: BITSET(ioaddr + CONFIG_REG_0, BIT(7)); /* Disable the data link */
524:
525: if(dev == NULL)
526: dev = init_etherdev(0, 0);
527:
528: if( (eth16i_debug & version_printed++) == 0)
529: printk(KERN_INFO "%s", version);
530:
531: dev->base_addr = ioaddr;
532:
533: #if 0
534: if(dev->irq) {
535: if(eth16i_set_irq(dev)) {
536: dev->irq = eth16i_get_irq(ioaddr);
537: }
538:
539: }
540: else {
541: #endif
542:
543: dev->irq = eth16i_get_irq(ioaddr);
544:
545: /* Try to obtain interrupt vector */
546:
547: if (request_irq(dev->irq, (void *)ð16i_interrupt, 0, "eth16i", dev)) {
548: printk(KERN_WARNING "%s: %s at %#3x, but is unusable due conflicting IRQ %d.\n",
549: dev->name, cardname, ioaddr, dev->irq);
550: return -EAGAIN;
551: }
552:
553: #if 0
554: irq2dev_map[dev->irq] = dev;
555: #endif
556:
557: printk(KERN_INFO "%s: %s at %#3x, IRQ %d, ",
558: dev->name, cardname, ioaddr, dev->irq);
559:
560: /* Let's grab the region */
561: request_region(ioaddr, ETH16I_IO_EXTENT, "eth16i");
562:
563: /* Now we will have to lock the chip's io address */
564: eth16i_select_regbank(TRANSCEIVER_MODE_RB, ioaddr);
565: outb(0x38, ioaddr + TRANSCEIVER_MODE_REG);
566:
567: eth16i_initialize(dev); /* Initialize rest of the chip's registers */
568:
569: /* Now let's same some energy by shutting down the chip ;) */
570: BITCLR(ioaddr + CONFIG_REG_1, POWERUP);
571:
572: /* Initialize the device structure */
573: if(dev->priv == NULL) {
574: dev->priv = kmalloc(sizeof(struct eth16i_local), GFP_KERNEL);
575: if(dev->priv == NULL)
576: return -ENOMEM;
577: }
578:
579: memset(dev->priv, 0, sizeof(struct eth16i_local));
580:
581: dev->open = eth16i_open;
582: dev->stop = eth16i_close;
583: dev->hard_start_xmit = eth16i_tx;
584: dev->get_stats = eth16i_get_stats;
585: dev->set_multicast_list = ð16i_multicast;
586:
587: /* Fill in the fields of the device structure with ethernet values. */
588: ether_setup(dev);
589:
590: boot = 0;
591:
592: return 0;
593: }
594:
595:
596: static void eth16i_initialize(struct device *dev)
597: {
598: int ioaddr = dev->base_addr;
599: int i, node_w = 0;
600: unsigned char node_byte = 0;
601:
602: /* Setup station address */
603: eth16i_select_regbank(NODE_ID_RB, ioaddr);
604: for(i = 0 ; i < 3 ; i++) {
605: unsigned short node_val = eth16i_read_eeprom(ioaddr, E_NODEID_0 + i);
606: ((unsigned short *)dev->dev_addr)[i] = ntohs(node_val);
607: }
608:
609: for(i = 0; i < 6; i++) {
610: outb( ((unsigned char *)dev->dev_addr)[i], ioaddr + NODE_ID_0 + i);
611: if(boot) {
612: printk("%02x", inb(ioaddr + NODE_ID_0 + i));
613: if(i != 5)
614: printk(":");
615: }
616: }
617:
618: /* Now we will set multicast addresses to accept none */
619: eth16i_select_regbank(HASH_TABLE_RB, ioaddr);
620: for(i = 0; i < 8; i++)
621: outb(0x00, ioaddr + HASH_TABLE_0 + i);
622:
623: /*
624: Now let's disable the transmitter and receiver, set the buffer ram
625: cycle time, bus width and buffer data path width. Also we shall
626: set transmit buffer size and total buffer size.
627: */
628:
629: eth16i_select_regbank(2, ioaddr);
630:
631: node_byte = 0;
632: node_w = eth16i_read_eeprom(ioaddr, E_PRODUCT_CFG);
633:
634: if( (node_w & 0xFF00) == 0x0800)
635: node_byte |= BUFFER_WIDTH_8;
636:
637: node_byte |= SRAM_BS1;
638:
639: if( (node_w & 0x00FF) == 64)
640: node_byte |= SRAM_BS0;
641:
642: node_byte |= DLC_EN | SRAM_CYCLE_TIME_100NS | (ETH16I_TX_BUF_SIZE << 2);
643:
644: outb(node_byte, ioaddr + CONFIG_REG_0);
645:
646: /* We shall halt the transmitting, if 16 collisions are detected */
647: outb(HALT_ON_16, ioaddr + COL_16_REG);
648:
649: #ifdef MODULE
650: /* if_port already set by init_module() */
651: #else
652: dev->if_port = (dev->mem_start < E_PORT_FROM_EPROM) ?
653: dev->mem_start : E_PORT_FROM_EPROM;
654: #endif
655:
656: /* Set interface port type */
657: if(boot) {
658: char *porttype[] = {"BNC", "DIX", "TP", "AUTO", "FROM_EPROM" };
659:
660: switch(dev->if_port)
661: {
662:
663: case E_PORT_FROM_EPROM:
664: dev->if_port = eth16i_read_eeprom(ioaddr, E_PORT_SELECT);
665: break;
666:
667: case E_PORT_AUTO:
668: dev->if_port = eth16i_probe_port(ioaddr);
669: break;
670:
671: case E_PORT_BNC:
672: case E_PORT_TP:
673: case E_PORT_DIX:
674: break;
675: }
676:
677: printk(" %s interface.\n", porttype[dev->if_port]);
678:
679: eth16i_set_port(ioaddr, dev->if_port);
680: }
681:
682: /* Set Receive Mode to normal operation */
683: outb(MODE_2, ioaddr + RECEIVE_MODE_REG);
684: }
685:
686: static int eth16i_probe_port(int ioaddr)
687: {
688: int i;
689: int retcode;
690: unsigned char dummy_packet[64] = { 0 };
691:
692: /* Powerup the chip */
693: outb(0xc0 | POWERUP, ioaddr + CONFIG_REG_1);
694:
695: BITSET(ioaddr + CONFIG_REG_0, DLC_EN);
696:
697: eth16i_select_regbank(NODE_ID_RB, ioaddr);
698:
699: for(i = 0; i < 6; i++) {
700: dummy_packet[i] = inb(ioaddr + NODE_ID_0 + i);
701: dummy_packet[i+6] = inb(ioaddr + NODE_ID_0 + i);
702: }
703:
704: dummy_packet[12] = 0x00;
705: dummy_packet[13] = 0x04;
706:
707: eth16i_select_regbank(2, ioaddr);
708:
709: for(i = 0; i < 3; i++) {
710: BITSET(ioaddr + CONFIG_REG_0, DLC_EN);
711: BITCLR(ioaddr + CONFIG_REG_0, DLC_EN);
712: eth16i_set_port(ioaddr, i);
713:
714: if(eth16i_debug > 1)
715: printk(KERN_DEBUG "Set port number %d\n", i);
716:
717: retcode = eth16i_send_probe_packet(ioaddr, dummy_packet, 64);
718: if(retcode == 0) {
719: retcode = eth16i_receive_probe_packet(ioaddr);
720: if(retcode != -1) {
721: if(eth16i_debug > 1)
722: printk(KERN_DEBUG "Eth16i interface port found at %d\n", i);
723: return i;
724: }
725: }
726: else {
727: if(eth16i_debug > 1)
728: printk(KERN_DEBUG "TRANSMIT_DONE timeout when probing interface port\n");
729: }
730: }
731:
732: if( eth16i_debug > 1)
733: printk(KERN_DEBUG "Using default port\n");
734:
735: return E_PORT_BNC;
736: }
737:
738: static void eth16i_set_port(int ioaddr, int porttype)
739: {
740: unsigned short temp = 0;
741:
742: eth16i_select_regbank(TRANSCEIVER_MODE_RB, ioaddr);
743: outb(LOOPBACK_CONTROL, ioaddr + TRANSMIT_MODE_REG);
744:
745: temp |= DIS_AUTO_PORT_SEL;
746:
747: switch(porttype) {
748:
749: case E_PORT_BNC :
750: temp |= AUI_SELECT;
751: break;
752:
753: case E_PORT_TP :
754: break;
755:
756: case E_PORT_DIX :
757: temp |= AUI_SELECT;
758: BITSET(ioaddr + TRANSMIT_MODE_REG, CONTROL_OUTPUT);
759: break;
760: }
761:
762: outb(temp, ioaddr + TRANSCEIVER_MODE_REG);
763:
764: if(eth16i_debug > 1) {
765: printk(KERN_DEBUG "TRANSMIT_MODE_REG = %x\n", inb(ioaddr + TRANSMIT_MODE_REG));
766: printk(KERN_DEBUG "TRANSCEIVER_MODE_REG = %x\n",
767: inb(ioaddr+TRANSCEIVER_MODE_REG));
768: }
769: }
770:
771: static int eth16i_send_probe_packet(int ioaddr, unsigned char *b, int l)
772: {
773: int starttime;
774:
775: outb(0xff, ioaddr + TX_STATUS_REG);
776:
777: outw(l, ioaddr + DATAPORT);
778: outsw(ioaddr + DATAPORT, (unsigned short *)b, (l + 1) >> 1);
779:
780: starttime = jiffies;
781: outb(TX_START | 1, ioaddr + TRANSMIT_START_REG);
782:
783: while( (inb(ioaddr + TX_STATUS_REG) & 0x80) == 0) {
784: if( (jiffies - starttime) > TX_TIMEOUT) {
785: return -1;
786: }
787: }
788:
789: return 0;
790: }
791:
792: static int eth16i_receive_probe_packet(int ioaddr)
793: {
794: int starttime;
795:
796: starttime = jiffies;
797:
798: while((inb(ioaddr + TX_STATUS_REG) & 0x20) == 0) {
799: if( (jiffies - starttime) > TX_TIMEOUT) {
800:
801: if(eth16i_debug > 1)
802: printk(KERN_DEBUG "Timeout occured waiting transmit packet received\n");
803: starttime = jiffies;
804: while((inb(ioaddr + RX_STATUS_REG) & 0x80) == 0) {
805: if( (jiffies - starttime) > TX_TIMEOUT) {
806: if(eth16i_debug > 1)
807: printk(KERN_DEBUG "Timeout occured waiting receive packet\n");
808: return -1;
809: }
810: }
811:
812: if(eth16i_debug > 1)
813: printk(KERN_DEBUG "RECEIVE_PACKET\n");
814: return(0); /* Found receive packet */
815: }
816: }
817:
818: if(eth16i_debug > 1) {
819: printk(KERN_DEBUG "TRANSMIT_PACKET_RECEIVED %x\n", inb(ioaddr + TX_STATUS_REG));
820: printk(KERN_DEBUG "RX_STATUS_REG = %x\n", inb(ioaddr + RX_STATUS_REG));
821: }
822:
823: return(0); /* Return success */
824: }
825:
826: #if 0
827: static int eth16i_set_irq(struct device* dev)
828: {
829: const int ioaddr = dev->base_addr;
830: const int irq = dev->irq;
831: int i = 0;
832:
833: if(ioaddr < 0x1000) {
834: while(eth16i_irqmap[i] && eth16i_irqmap[i] != irq)
835: i++;
836:
837: if(i < NUM_OF_ISA_IRQS) {
838: u8 cbyte = inb(ioaddr + JUMPERLESS_CONFIG);
839: cbyte = (cbyte & 0x3F) | (i << 6);
840: outb(cbyte, ioaddr + JUMPERLESS_CONFIG);
841: return 0;
842: }
843: }
844: else {
845: printk(KERN_NOTICE "%s: EISA Interrupt cannot be set. Use EISA Configuration utility.\n", dev->name);
846: }
847:
848: return -1;
849:
850: }
851: #endif
852:
853: static int eth16i_get_irq(int ioaddr)
854: {
855: unsigned char cbyte;
856:
857: if( ioaddr < 0x1000) {
858: cbyte = inb(ioaddr + JUMPERLESS_CONFIG);
859: return( eth16i_irqmap[ ((cbyte & 0xC0) >> 6) ] );
860: } else { /* Oh..the card is EISA so method getting IRQ different */
861: unsigned short index = 0;
862: cbyte = inb(ioaddr + EISA_IRQ_REG);
863: while( (cbyte & 0x01) == 0) {
864: cbyte = cbyte >> 1;
865: index++;
866: }
867: return( eth32i_irqmap[ index ] );
868: }
869: }
870:
871: static int eth16i_check_signature(int ioaddr)
872: {
873: int i;
874: unsigned char creg[4] = { 0 };
875:
876: for(i = 0; i < 4 ; i++) {
877:
878: creg[i] = inb(ioaddr + TRANSMIT_MODE_REG + i);
879:
880: if(eth16i_debug > 1)
881: printk("eth16i: read signature byte %x at %x\n",
882: creg[i],
883: ioaddr + TRANSMIT_MODE_REG + i);
884: }
885:
886: creg[0] &= 0x0F; /* Mask collision cnr */
887: creg[2] &= 0x7F; /* Mask DCLEN bit */
888:
889: #ifdef 0
890: /*
891: This was removed because the card was sometimes left to state
892: from which it couldn't be find anymore. If there is need
893: to more strict check still this have to be fixed.
894: */
895: if( ! ((creg[0] == 0x06) && (creg[1] == 0x41)) ) {
896: if(creg[1] != 0x42)
897: return -1;
898: }
899: #endif
900:
901: if( !((creg[2] == 0x36) && (creg[3] == 0xE0)) ) {
902: creg[2] &= 0x40;
903: creg[3] &= 0x03;
904:
905: if( !((creg[2] == 0x40) && (creg[3] == 0x00)) )
906: return -1;
907: }
908:
909: if(eth16i_read_eeprom(ioaddr, E_NODEID_0) != 0)
910: return -1;
911:
912: if((eth16i_read_eeprom(ioaddr, E_NODEID_1) & 0xFF00) != 0x4B00)
913: return -1;
914:
915: return 0;
916: }
917:
918: static int eth16i_read_eeprom(int ioaddr, int offset)
919: {
920: int data = 0;
921:
922: eth16i_eeprom_cmd(ioaddr, EEPROM_READ | offset);
923: outb(CS_1, ioaddr + EEPROM_CTRL_REG);
924: data = eth16i_read_eeprom_word(ioaddr);
925: outb(CS_0 | SK_0, ioaddr + EEPROM_CTRL_REG);
926:
927: return(data);
928: }
929:
930: static int eth16i_read_eeprom_word(int ioaddr)
931: {
932: int i;
933: int data = 0;
934:
935: for(i = 16; i > 0; i--) {
936: outb(CS_1 | SK_0, ioaddr + EEPROM_CTRL_REG);
937: eeprom_slow_io();
938: outb(CS_1 | SK_1, ioaddr + EEPROM_CTRL_REG);
939: eeprom_slow_io();
940: data = (data << 1) |
941: ((inb(ioaddr + EEPROM_DATA_REG) & DI_1) ? 1 : 0);
942:
943: eeprom_slow_io();
944: }
945:
946: return(data);
947: }
948:
949: static void eth16i_eeprom_cmd(int ioaddr, unsigned char command)
950: {
951: int i;
952:
953: outb(CS_0 | SK_0, ioaddr + EEPROM_CTRL_REG);
954: outb(DI_0, ioaddr + EEPROM_DATA_REG);
955: outb(CS_1 | SK_0, ioaddr + EEPROM_CTRL_REG);
956: outb(DI_1, ioaddr + EEPROM_DATA_REG);
957: outb(CS_1 | SK_1, ioaddr + EEPROM_CTRL_REG);
958:
959: for(i = 7; i >= 0; i--) {
960: short cmd = ( (command & (1 << i)) ? DI_1 : DI_0 );
961: outb(cmd, ioaddr + EEPROM_DATA_REG);
962: outb(CS_1 | SK_0, ioaddr + EEPROM_CTRL_REG);
963: eeprom_slow_io();
964: outb(CS_1 | SK_1, ioaddr + EEPROM_CTRL_REG);
965: eeprom_slow_io();
966: }
967: }
968:
969: static int eth16i_open(struct device *dev)
970: {
971: struct eth16i_local *lp = (struct eth16i_local *)dev->priv;
972: int ioaddr = dev->base_addr;
973:
974: /* Powerup the chip */
975: outb(0xc0 | POWERUP, ioaddr + CONFIG_REG_1);
976:
977: /* Initialize the chip */
978: eth16i_initialize(dev);
979:
980: /* Set the transmit buffer size */
981: lp->tx_buf_size = eth16i_tx_buf_map[ETH16I_TX_BUF_SIZE & 0x03];
982:
983: if(eth16i_debug > 0)
984: printk(KERN_DEBUG "%s: transmit buffer size %d\n",
985: dev->name, lp->tx_buf_size);
986:
987: /* Now enable Transmitter and Receiver sections */
988: BITCLR(ioaddr + CONFIG_REG_0, DLC_EN);
989:
990: /* Now switch to register bank 2, for run time operation */
991: eth16i_select_regbank(2, ioaddr);
992:
993: lp->open_time = jiffies;
994: lp->tx_started = 0;
995: lp->tx_queue = 0;
996: lp->tx_queue_len = 0;
997:
998: /* Turn on interrupts*/
999: outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG);
1000:
1001: dev->tbusy = 0;
1002: dev->interrupt = 0;
1003: dev->start = 1;
1004:
1005: MOD_INC_USE_COUNT;
1006:
1007: return 0;
1008: }
1009:
1010: static int eth16i_close(struct device *dev)
1011: {
1012: struct eth16i_local *lp = (struct eth16i_local *)dev->priv;
1013: int ioaddr = dev->base_addr;
1014:
1015: eth16i_reset(dev);
1016:
1017: /* Turn off interrupts*/
1018: outw(ETH16I_INTR_OFF, ioaddr + TX_INTR_REG);
1019:
1020: dev->start = 0;
1021: dev->tbusy = 1;
1022:
1023: lp->open_time = 0;
1024:
1025: /* Disable transmit and receive */
1026: BITSET(ioaddr + CONFIG_REG_0, DLC_EN);
1027:
1028: /* Reset the chip */
1029: /* outb(0xff, ioaddr + RESET); */
1030: /* outw(0xffff, ioaddr + TX_STATUS_REG); */
1031:
1032: outb(0x00, ioaddr + CONFIG_REG_1);
1033:
1034: MOD_DEC_USE_COUNT;
1035:
1036: return 0;
1037: }
1038:
1039: static int eth16i_tx(struct sk_buff *skb, struct device *dev)
1040: {
1041: struct eth16i_local *lp = (struct eth16i_local *)dev->priv;
1042: int ioaddr = dev->base_addr;
1043: int status = 0;
1044:
1045: if(dev->tbusy) {
1046:
1047: /*
1048: If we get here, some higher level has decided that
1049: we are broken. There should really be a "kick me"
1050: function call instead.
1051: */
1052:
1053: int tickssofar = jiffies - dev->trans_start;
1054: if(tickssofar < TX_TIMEOUT)
1055: return 1;
1056:
1057: outw(ETH16I_INTR_OFF, ioaddr + TX_INTR_REG);
1058:
1059: printk(KERN_WARNING "%s: transmit timed out with status %04x, %s ?\n",
1060: dev->name,
1061: inw(ioaddr + TX_STATUS_REG),
1062: (inb(ioaddr + TX_STATUS_REG) & TX_DONE) ?
1063: "IRQ conflict" : "network cable problem");
1064:
1065: dev->trans_start = jiffies;
1066:
1067: /* Let's dump all registers */
1068: if(eth16i_debug > 0) {
1069: printk(KERN_DEBUG "%s: timeout: %02x %02x %02x %02x %02x %02x %02x %02x.\n",
1070: dev->name, inb(ioaddr + 0),
1071: inb(ioaddr + 1), inb(ioaddr + 2),
1072: inb(ioaddr + 3), inb(ioaddr + 4),
1073: inb(ioaddr + 5),
1074: inb(ioaddr + 6), inb(ioaddr + 7));
1075:
1076: printk(KERN_DEBUG "%s: transmit start reg: %02x. collision reg %02x\n",
1077: dev->name, inb(ioaddr + TRANSMIT_START_REG),
1078: inb(ioaddr + COL_16_REG));
1079:
1080: printk(KERN_DEBUG "lp->tx_queue = %d\n", lp->tx_queue);
1081: printk(KERN_DEBUG "lp->tx_queue_len = %d\n", lp->tx_queue_len);
1082: printk(KERN_DEBUG "lp->tx_started = %d\n", lp->tx_started);
1083:
1084: }
1085:
1086: lp->stats.tx_errors++;
1087:
1088: eth16i_reset(dev);
1089:
1090: dev->trans_start = jiffies;
1091:
1092: outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG);
1093:
1094: }
1095:
1096: /*
1097: If some higher layer thinks we've missed an tx-done interrupt
1098: we are passed NULL. Caution: dev_tint() handles the cli()/sti()
1099: itself
1100: */
1101:
1102: if(skb == NULL) {
1103: #if LINUX_VERSION_CODE < 0x020100
1104: dev_tint(dev);
1105: #endif
1106: if(eth16i_debug > 0)
1107: printk(KERN_WARNING "%s: Missed tx-done interrupt.\n", dev->name);
1108: return 0;
1109: }
1110:
1111: /* Block a timer based transmitter from overlapping.
1112: This could better be done with atomic_swap(1, dev->tbusy),
1113: but set_bit() works as well. */
1114:
1115: set_bit(0, (void *)&lp->tx_buf_busy);
1116:
1117: /* Turn off TX interrupts */
1118: outw(ETH16I_INTR_OFF, ioaddr + TX_INTR_REG);
1119:
1120: if(test_and_set_bit(0, (void *)&dev->tbusy) != 0) {
1121: printk(KERN_WARNING "%s: Transmitter access conflict.\n", dev->name);
1122: status = -1;
1123: }
1124: else {
1125: ushort length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
1126: unsigned char *buf = skb->data;
1127:
1128: if( (length + 2) > (lp->tx_buf_size - lp->tx_queue_len)) {
1129: if(eth16i_debug > 0)
1130: printk(KERN_WARNING "%s: Transmit buffer full.\n", dev->name);
1131: }
1132: else {
1133: outw(length, ioaddr + DATAPORT);
1134:
1135: if( ioaddr < 0x1000 )
1136: outsw(ioaddr + DATAPORT, buf, (length + 1) >> 1);
1137: else {
1138: unsigned char frag = length % 4;
1139:
1140: outsl(ioaddr + DATAPORT, buf, length >> 2);
1141:
1142: if( frag != 0 ) {
1143: outsw(ioaddr + DATAPORT, (buf + (length & 0xFFFC)), 1);
1144: if( frag == 3 )
1145: outsw(ioaddr + DATAPORT,
1146: (buf + (length & 0xFFFC) + 2), 1);
1147: }
1148: }
1149:
1150: lp->tx_buffered_packets++;
1151: lp->tx_queue++;
1152: lp->tx_queue_len += length + 2;
1153:
1154: }
1155:
1156: lp->tx_buf_busy = 0;
1157:
1158: if(lp->tx_started == 0) {
1159: /* If the transmitter is idle..always trigger a transmit */
1160: outb(TX_START | lp->tx_queue, ioaddr + TRANSMIT_START_REG);
1161: lp->tx_queue = 0;
1162: lp->tx_queue_len = 0;
1163: dev->trans_start = jiffies;
1164: lp->tx_started = 1;
1165: dev->tbusy = 0;
1166: }
1167: else if(lp->tx_queue_len < lp->tx_buf_size - (ETH_FRAME_LEN + 2)) {
1168: /* There is still more room for one more packet in tx buffer */
1169: dev->tbusy = 0;
1170: }
1171:
1172: outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG);
1173:
1174: /* Turn TX interrupts back on */
1175: /* outb(TX_INTR_DONE | TX_INTR_16_COL, ioaddr + TX_INTR_REG); */
1176: status = 0;
1177: }
1178:
1179: #if LINUX_VERSION_CODE >= 0x020100
1180: dev_kfree_skb(skb);
1181: #else
1182: dev_kfree_skb(skb, FREE_WRITE);
1183: #endif
1184:
1185: return status;
1186: }
1187:
1188: static void eth16i_rx(struct device *dev)
1189: {
1190: struct eth16i_local *lp = (struct eth16i_local *)dev->priv;
1191: int ioaddr = dev->base_addr;
1192: int boguscount = MAX_RX_LOOP;
1193:
1194: /* Loop until all packets have been read */
1195: while( (inb(ioaddr + RECEIVE_MODE_REG) & RX_BUFFER_EMPTY) == 0) {
1196:
1197: /* Read status byte from receive buffer */
1198: ushort status = inw(ioaddr + DATAPORT);
1199:
1200: /* Get the size of the packet from receive buffer */
1201: ushort pkt_len = inw(ioaddr + DATAPORT);
1202:
1203: if(eth16i_debug > 4)
1204: printk(KERN_DEBUG "%s: Receiving packet mode %02x status %04x.\n",
1205: dev->name,
1206: inb(ioaddr + RECEIVE_MODE_REG), status);
1207:
1208: if( !(status & PKT_GOOD) ) {
1209: lp->stats.rx_errors++;
1210:
1211: if( (pkt_len < ETH_ZLEN) || (pkt_len > ETH_FRAME_LEN) ) {
1212: lp->stats.rx_length_errors++;
1213: eth16i_reset(dev);
1214: return;
1215: }
1216: else {
1217: eth16i_skip_packet(dev);
1218: lp->stats.rx_dropped++;
1219: }
1220: }
1221: else { /* Ok so now we should have a good packet */
1222: struct sk_buff *skb;
1223:
1224: skb = dev_alloc_skb(pkt_len + 3);
1225: if( skb == NULL ) {
1226: printk(KERN_WARNING "%s: Could'n allocate memory for packet (len %d)\n",
1227: dev->name, pkt_len);
1228: eth16i_skip_packet(dev);
1229: lp->stats.rx_dropped++;
1230: break;
1231: }
1232:
1233: skb->dev = dev;
1234: skb_reserve(skb,2);
1235:
1236: /*
1237: Now let's get the packet out of buffer.
1238: size is (pkt_len + 1) >> 1, cause we are now reading words
1239: and it have to be even aligned.
1240: */
1241:
1242: if(ioaddr < 0x1000)
1243: insw(ioaddr + DATAPORT, skb_put(skb, pkt_len),
1244: (pkt_len + 1) >> 1);
1245: else {
1246: unsigned char *buf = skb_put(skb, pkt_len);
1247: unsigned char frag = pkt_len % 4;
1248:
1249: insl(ioaddr + DATAPORT, buf, pkt_len >> 2);
1250:
1251: if(frag != 0) {
1252: unsigned short rest[2];
1253: rest[0] = inw( ioaddr + DATAPORT );
1254: if(frag == 3)
1255: rest[1] = inw( ioaddr + DATAPORT );
1256:
1257: memcpy(buf + (pkt_len & 0xfffc), (char *)rest, frag);
1258: }
1259: }
1260:
1261: skb->protocol=eth_type_trans(skb, dev);
1262: netif_rx(skb);
1263: lp->stats.rx_packets++;
1264:
1265: if( eth16i_debug > 5 ) {
1266: int i;
1267: printk(KERN_DEBUG "%s: Received packet of length %d.\n",
1268: dev->name, pkt_len);
1269: for(i = 0; i < 14; i++)
1270: printk(KERN_DEBUG " %02x", skb->data[i]);
1271: printk(KERN_DEBUG ".\n");
1272: }
1273:
1274: } /* else */
1275:
1276: if(--boguscount <= 0)
1277: break;
1278:
1279: } /* while */
1280:
1281: #if 0
1282: {
1283: int i;
1284:
1285: for(i = 0; i < 20; i++) {
1286: if( (inb(ioaddr+RECEIVE_MODE_REG) & RX_BUFFER_EMPTY) ==
1287: RX_BUFFER_EMPTY)
1288: break;
1289: inw(ioaddr + DATAPORT);
1290: outb(SKIP_RX_PACKET, ioaddr + FILTER_SELF_RX_REG);
1291: }
1292:
1293: if(eth16i_debug > 1)
1294: printk(KERN_DEBUG "%s: Flushed receive buffer.\n", dev->name);
1295: }
1296: #endif
1297:
1298: return;
1299: }
1300:
1301: static void eth16i_interrupt(int irq, void *dev_id, struct pt_regs *regs)
1302: {
1303: struct device *dev = dev_id;
1304: struct eth16i_local *lp;
1305: int ioaddr = 0,
1306: status;
1307:
1308: if(dev == NULL) {
1309: printk(KERN_WARNING "eth16i_interrupt(): irq %d for unknown device. \n", irq);
1310: return;
1311: }
1312:
1313: /* Turn off all interrupts from adapter */
1314: outw(ETH16I_INTR_OFF, ioaddr + TX_INTR_REG);
1315:
1316: set_bit(0, (void *)&dev->tbusy); /* Set the device busy so that */
1317: /* eth16i_tx wont be called */
1318:
1319: if(dev->interrupt)
1320: printk(KERN_WARNING "%s: Re-entering the interrupt handler.\n", dev->name);
1321: dev->interrupt = 1;
1322:
1323: ioaddr = dev->base_addr;
1324: lp = (struct eth16i_local *)dev->priv;
1325: status = inw(ioaddr + TX_STATUS_REG); /* Get the status */
1326: outw(status, ioaddr + TX_STATUS_REG); /* Clear status bits */
1327:
1328: if(eth16i_debug > 3)
1329: printk(KERN_DEBUG "%s: Interrupt with status %04x.\n", dev->name, status);
1330:
1331: if( status & 0x7f00 ) {
1332:
1333: lp->stats.rx_errors++;
1334:
1335: if(status & (BUS_RD_ERR << 8) )
1336: printk(KERN_WARNING "%s: Bus read error.\n",dev->name);
1337: if(status & (SHORT_PKT_ERR << 8) ) lp->stats.rx_length_errors++;
1338: if(status & (ALIGN_ERR << 8) ) lp->stats.rx_frame_errors++;
1339: if(status & (CRC_ERR << 8) ) lp->stats.rx_crc_errors++;
1340: if(status & (RX_BUF_OVERFLOW << 8) ) lp->stats.rx_over_errors++;
1341: }
1342: if( status & 0x001a) {
1343:
1344: lp->stats.tx_errors++;
1345:
1346: if(status & CR_LOST) lp->stats.tx_carrier_errors++;
1347: if(status & TX_JABBER_ERR) lp->stats.tx_window_errors++;
1348:
1349: #if 0
1350: if(status & COLLISION) {
1351: lp->stats.collisions +=
1352: ((inb(ioaddr+TRANSMIT_MODE_REG) & 0xF0) >> 4);
1353: }
1354: #endif
1355: if(status & COLLISIONS_16) {
1356: if(lp->col_16 < MAX_COL_16) {
1357: lp->col_16++;
1358: lp->stats.collisions++;
1359: /* Resume transmitting, skip failed packet */
1360: outb(0x02, ioaddr + COL_16_REG);
1361: }
1362: else {
1363: printk(KERN_WARNING "%s: bailing out due to many consecutive 16-in-a-row collisions. Network cable problem?\n", dev->name);
1364: }
1365: }
1366: }
1367:
1368: if( status & 0x00ff ) { /* Let's check the transmit status reg */
1369:
1370: if(status & TX_DONE) { /* The transmit has been done */
1371: lp->stats.tx_packets = lp->tx_buffered_packets;
1372: lp->col_16 = 0;
1373:
1374: if(lp->tx_queue) { /* Is there still packets ? */
1375: /* There was packet(s) so start transmitting and write also
1376: how many packets there is to be sended */
1377: outb(TX_START | lp->tx_queue, ioaddr + TRANSMIT_START_REG);
1378: lp->tx_queue = 0;
1379: lp->tx_queue_len = 0;
1380: lp->tx_started = 1;
1381: dev->trans_start = jiffies;
1382: mark_bh(NET_BH);
1383: }
1384: else {
1385: lp->tx_started = 0;
1386: mark_bh(NET_BH);
1387: }
1388: }
1389: }
1390:
1391: if( ( status & 0x8000 ) ||
1392: ( (inb(ioaddr + RECEIVE_MODE_REG) & RX_BUFFER_EMPTY) == 0) ) {
1393: eth16i_rx(dev); /* We have packet in receive buffer */
1394: }
1395:
1396: dev->interrupt = 0;
1397:
1398: /* Turn interrupts back on */
1399: outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG);
1400:
1401: if(lp->tx_queue_len < lp->tx_buf_size - (ETH_FRAME_LEN + 2)) {
1402: /* There is still more room for one more packet in tx buffer */
1403: dev->tbusy = 0;
1404: }
1405:
1406: return;
1407: }
1408:
1409: static void eth16i_skip_packet(struct device *dev)
1410: {
1411: int ioaddr = dev->base_addr;
1412:
1413: inw(ioaddr + DATAPORT);
1414: inw(ioaddr + DATAPORT);
1415: inw(ioaddr + DATAPORT);
1416:
1417: outb(SKIP_RX_PACKET, ioaddr + FILTER_SELF_RX_REG);
1418: while( inb( ioaddr + FILTER_SELF_RX_REG ) != 0);
1419: }
1420:
1421: static void eth16i_reset(struct device *dev)
1422: {
1423: struct eth16i_local *lp = (struct eth16i_local *)dev->priv;
1424: int ioaddr = dev->base_addr;
1425:
1426: if(eth16i_debug > 1)
1427: printk(KERN_DEBUG "%s: Resetting device.\n", dev->name);
1428:
1429: BITSET(ioaddr + CONFIG_REG_0, DLC_EN);
1430: outw(0xffff, ioaddr + TX_STATUS_REG);
1431: eth16i_select_regbank(2, ioaddr);
1432:
1433: lp->tx_started = 0;
1434: lp->tx_buf_busy = 0;
1435: lp->tx_queue = 0;
1436: lp->tx_queue_len = 0;
1437:
1438: dev->interrupt = 0;
1439: dev->start = 1;
1440: dev->tbusy = 0;
1441: BITCLR(ioaddr + CONFIG_REG_0, DLC_EN);
1442: }
1443:
1444: static void eth16i_multicast(struct device *dev)
1445: {
1446: int ioaddr = dev->base_addr;
1447:
1448: if(dev->mc_count || dev->flags&(IFF_ALLMULTI|IFF_PROMISC))
1449: {
1450: dev->flags|=IFF_PROMISC; /* Must do this */
1451: outb(3, ioaddr + RECEIVE_MODE_REG);
1452: } else {
1453: outb(2, ioaddr + RECEIVE_MODE_REG);
1454: }
1455: }
1456:
1457: static struct enet_statistics *eth16i_get_stats(struct device *dev)
1458: {
1459: struct eth16i_local *lp = (struct eth16i_local *)dev->priv;
1460:
1461: return &lp->stats;
1462: }
1463:
1464: static void eth16i_select_regbank(unsigned char banknbr, int ioaddr)
1465: {
1466: unsigned char data;
1467:
1468: data = inb(ioaddr + CONFIG_REG_1);
1469: outb( ((data & 0xF3) | ( (banknbr & 0x03) << 2)), ioaddr + CONFIG_REG_1);
1470: }
1471:
1472: #ifdef MODULE
1473:
1474: static ushort eth16i_parse_mediatype(const char* s)
1475: {
1476: if(!s)
1477: return E_PORT_FROM_EPROM;
1478:
1479: if (!strncmp(s, "bnc", 3))
1480: return E_PORT_BNC;
1481: else if (!strncmp(s, "tp", 2))
1482: return E_PORT_TP;
1483: else if (!strncmp(s, "dix", 3))
1484: return E_PORT_DIX;
1485: else if (!strncmp(s, "auto", 4))
1486: return E_PORT_AUTO;
1487: else
1488: return E_PORT_FROM_EPROM;
1489: }
1490:
1491: #define MAX_ETH16I_CARDS 4 /* Max number of Eth16i cards per module */
1492: #define NAMELEN 8 /* number of chars for storing dev->name */
1493:
1494: static char namelist[NAMELEN * MAX_ETH16I_CARDS] = { 0, };
1495: static struct device dev_eth16i[MAX_ETH16I_CARDS] = {
1496: {
1497: NULL,
1498: 0, 0, 0, 0,
1499: 0, 0,
1500: 0, 0, 0, NULL, NULL
1501: },
1502: };
1503:
1504: static int ioaddr[MAX_ETH16I_CARDS] = { 0, };
1505: #if 0
1506: static int irq[MAX_ETH16I_CARDS] = { 0, };
1507: #endif
1508: static char* mediatype[MAX_ETH16I_CARDS] = { 0, };
1509: static int debug = -1;
1510:
1511: #if (LINUX_VERSION_CODE >= 0x20115)
1512: MODULE_AUTHOR("Mika Kuoppala <[email protected]>");
1513: MODULE_DESCRIPTION("ICL EtherTeam 16i/32 driver");
1514:
1515: MODULE_PARM(ioaddr, "1-" __MODULE_STRING(MAX_ETH16I_CARDS) "i");
1516: MODULE_PARM_DESC(ioaddr, "eth16i io base address");
1517:
1518: #if 0
1519: MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_ETH16I_CARDS) "i");
1520: MODULE_PARM_DESC(irq, "eth16i interrupt request number");
1521: #endif
1522:
1523: MODULE_PARM(mediatype, "1-" __MODULE_STRING(MAX_ETH16I_CARDS) "s");
1524: MODULE_PARM_DESC(mediatype, "eth16i interfaceport mediatype");
1525:
1526: MODULE_PARM(debug, "i");
1527: MODULE_PARM_DESC(debug, "eth16i debug level (0-4)");
1528: #endif
1529:
1530: int init_module(void)
1531: {
1532: int this_dev, found = 0;
1533:
1534: for(this_dev = 0; this_dev < MAX_ETH16I_CARDS; this_dev++)
1535: {
1536: struct device *dev = &dev_eth16i[this_dev];
1537:
1538: dev->name = namelist + (NAMELEN*this_dev);
1539: dev->irq = 0; /* irq[this_dev]; */
1540: dev->base_addr = ioaddr[this_dev];
1541: dev->init = eth16i_probe;
1542:
1543: if(debug != -1)
1544: eth16i_debug = debug;
1545:
1546: if(eth16i_debug > 1)
1547: printk(KERN_NOTICE "eth16i(%d): interface type %s\n", this_dev, mediatype[this_dev] ? mediatype[this_dev] : "none" );
1548:
1549: dev->if_port = eth16i_parse_mediatype(mediatype[this_dev]);
1550:
1551: if(ioaddr[this_dev] == 0)
1552: {
1553: if(this_dev != 0) break; /* Only autoprobe 1st one */
1554:
1555: printk(KERN_NOTICE "eth16i.c: Presently autoprobing (not recommended) for a single card.\n");
1556: }
1557:
1558: if(register_netdev(dev) != 0)
1559: {
1560: printk(KERN_WARNING "eth16i.c No Eth16i card found (i/o = 0x%x).\n",
1561: ioaddr[this_dev]);
1562:
1563: if(found != 0) return 0;
1564: return -ENXIO;
1565: }
1566:
1567: found++;
1568: }
1569: return 0;
1570: }
1571:
1572: void cleanup_module(void)
1573: {
1574: int this_dev;
1575:
1576: for(this_dev = 0; this_dev < MAX_ETH16I_CARDS; this_dev++)
1577: {
1578: struct device* dev = &dev_eth16i[this_dev];
1579:
1580: if(dev->priv != NULL)
1581: {
1582: unregister_netdev(dev);
1583: kfree(dev->priv);
1584: dev->priv = NULL;
1585:
1586: free_irq(dev->irq, dev);
1587: release_region(dev->base_addr, ETH16I_IO_EXTENT);
1588:
1589: }
1590: }
1591: }
1592: #endif /* MODULE */
1593:
1594: /*
1595: * Local variables:
1596: * compile-command: "gcc -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c eth16i.c"
1597: * alt-compile-command: "gcc -DMODVERSIONS -DMODULE -D__KERNEL__ -Wall -Wstrict -prototypes -O6 -c eth16i.c"
1598: * tab-width: 8
1599: * c-basic-offset: 8
1600: * c-indent-level: 8
1601: * End:
1602: */
1603:
1604: /* End of file eth16i.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.