|
|
1.1 root 1: /* eth16i.c An ICL EtherTeam 16i and 32 EISA ethernet driver for Linux
2:
3: Written 1994-95 by Mika Kuoppala
4:
5: Copyright (C) 1994, 1995 by Mika Kuoppala
6: Based on skeleton.c and 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:
17: Sources:
18: - skeleton.c a sample network driver core for linux,
19: written by Donald Becker <[email protected]>
20: - at1700.c a driver for Allied Telesis AT1700, written
21: by Donald Becker.
22: - e16iSRV.asm a Netware 3.X Server Driver for ICL EtherTeam16i
23: written by Markku Viima
24: - The Fujitsu MB86965 databook.
25:
26: Valuable assistance from:
27: Markku Viima (ICL)
28: Ari Valve (ICL)
29:
30: Revision history:
31:
32: Version Date Description
33:
34: 0.01 15.12-94 Initial version (card detection)
35: 0.02 23.01-95 Interrupt is now hooked correctly
36: 0.03 01.02-95 Rewrote initialization part
37: 0.04 07.02-95 Base skeleton done...
38: Made a few changes to signature checking
39: to make it a bit reliable.
40: - fixed bug in tx_buf mapping
41: - fixed bug in initialization (DLC_EN
42: wasn't enabled when initialization
43: was done.)
44: 0.05 08.02-95 If there were more than one packet to send,
45: transmit was jammed due to invalid
46: register write...now fixed
47: 0.06 19.02-95 Rewrote interrupt handling
48: 0.07 13.04-95 Wrote EEPROM read routines
49: Card configuration now set according to
50: data read from EEPROM
51: 0.08 23.06-95 Wrote part that tries to probe used interface
52: port if AUTO is selected
53:
54: 0.09 01.09-95 Added module support
55:
56: 0.10 04.09-95 Fixed receive packet allocation to work
57: with kernels > 1.3.x
58:
59: 0.20 20.09-95 Added support for EtherTeam32 EISA
60:
61: 0.21 17.10-95 Removed the unnecessary extern
62: init_etherdev() declaration. Some
63: other cleanups.
64: Bugs:
65: In some cases the interface autoprobing code doesn't find
66: the correct interface type. In this case you can
67: manually choose the interface type in DOS with E16IC.EXE which is
68: configuration software for EtherTeam16i and EtherTeam32 cards.
69:
70: To do:
71: - Real multicast support
72: */
73:
74: static char *version =
75: "eth16i.c: v0.21 17-10-95 Mika Kuoppala ([email protected])\n";
76:
77: #include <linux/module.h>
78:
79: #include <linux/kernel.h>
80: #include <linux/sched.h>
81: #include <linux/types.h>
82: #include <linux/fcntl.h>
83: #include <linux/interrupt.h>
84: #include <linux/ptrace.h>
85: #include <linux/ioport.h>
86: #include <linux/in.h>
87: #include <linux/malloc.h>
88: #include <linux/string.h>
89: #include <linux/errno.h>
90:
91: #include <linux/netdevice.h>
92: #include <linux/etherdevice.h>
93: #include <linux/skbuff.h>
94:
95: #include <asm/system.h>
96: #include <asm/bitops.h>
97: #include <asm/io.h>
98: #include <asm/dma.h>
99:
100: /* Few macros */
101: #define BIT(a) ( (1 << (a)) )
102: #define BITSET(ioaddr, bnum) ((outb(((inb(ioaddr)) | (bnum)), ioaddr)))
103: #define BITCLR(ioaddr, bnum) ((outb(((inb(ioaddr)) & (~(bnum))), ioaddr)))
104:
105: /* This is the I/O address space for Etherteam 16i adapter. */
106: #define ETH16I_IO_EXTENT 32
107:
108: /* Ticks before deciding that transmit has timed out */
109: #define TIMEOUT_TICKS 30
110:
111: /* Maximum loop count when receiving packets */
112: #define MAX_RX_LOOP 40
113:
114: /* Some interrupt masks */
115: #define ETH16I_INTR_ON 0x8f82
116: #define ETH16I_INTR_OFF 0x0000
117:
118: /* Buffers header status byte meanings */
119: #define PKT_GOOD BIT(5)
120: #define PKT_GOOD_RMT BIT(4)
121: #define PKT_SHORT BIT(3)
122: #define PKT_ALIGN_ERR BIT(2)
123: #define PKT_CRC_ERR BIT(1)
124: #define PKT_RX_BUF_OVERFLOW BIT(0)
125:
126: /* Transmit status register (DLCR0) */
127: #define TX_STATUS_REG 0
128: #define TX_DONE BIT(7)
129: #define NET_BUSY BIT(6)
130: #define TX_PKT_RCD BIT(5)
131: #define CR_LOST BIT(4)
132: #define COLLISION BIT(2)
133: #define COLLISIONS_16 BIT(1)
134:
135: /* Receive status register (DLCR1) */
136: #define RX_STATUS_REG 1
137: #define RX_PKT BIT(7) /* Packet received */
138: #define BUS_RD_ERR BIT(6)
139: #define SHORT_PKT_ERR BIT(3)
140: #define ALIGN_ERR BIT(2)
141: #define CRC_ERR BIT(1)
142: #define RX_BUF_OVERFLOW BIT(0)
143:
144: /* Transmit Interrupt Enable Register (DLCR2) */
145: #define TX_INTR_REG 2
146: #define TX_INTR_DONE BIT(7)
147: #define TX_INTR_COL BIT(2)
148: #define TX_INTR_16_COL BIT(1)
149:
150: /* Receive Interrupt Enable Register (DLCR3) */
151: #define RX_INTR_REG 3
152: #define RX_INTR_RECEIVE BIT(7)
153: #define RX_INTR_SHORT_PKT BIT(3)
154: #define RX_INTR_CRC_ERR BIT(1)
155: #define RX_INTR_BUF_OVERFLOW BIT(0)
156:
157: /* Transmit Mode Register (DLCR4) */
158: #define TRANSMIT_MODE_REG 4
159: #define LOOPBACK_CONTROL BIT(1)
160: #define CONTROL_OUTPUT BIT(2)
161:
162: /* Receive Mode Register (DLCR5) */
163: #define RECEIVE_MODE_REG 5
164: #define RX_BUFFER_EMPTY BIT(6)
165: #define ACCEPT_BAD_PACKETS BIT(5)
166: #define RECEIVE_SHORT_ADDR BIT(4)
167: #define ACCEPT_SHORT_PACKETS BIT(3)
168: #define REMOTE_RESET BIT(2)
169:
170: #define ADDRESS_FILTER_MODE BIT(1) | BIT(0)
171: #define REJECT_ALL 0
172: #define ACCEPT_ALL 3
173: #define MODE_1 1 /* NODE ID, BC, MC, 2-24th bit */
174: #define MODE_2 2 /* NODE ID, BC, MC, Hash Table */
175:
176: /* Configuration Register 0 (DLCR6) */
177: #define CONFIG_REG_0 6
178: #define DLC_EN BIT(7)
179: #define SRAM_CYCLE_TIME_100NS BIT(6)
180: #define SYSTEM_BUS_WIDTH_8 BIT(5) /* 1 = 8bit, 0 = 16bit */
181: #define BUFFER_WIDTH_8 BIT(4) /* 1 = 8bit, 0 = 16bit */
182: #define TBS1 BIT(3)
183: #define TBS0 BIT(2)
184: #define BS1 BIT(1) /* 00=8kb, 01=16kb */
185: #define BS0 BIT(0) /* 10=32kb, 11=64kb */
186:
187: #ifndef ETH16I_TX_BUF_SIZE /* 0 = 2kb, 1 = 4kb */
188: #define ETH16I_TX_BUF_SIZE 2 /* 2 = 8kb, 3 = 16kb */
189: #endif
190: #define TX_BUF_1x2048 0
191: #define TX_BUF_2x2048 1
192: #define TX_BUF_2x4098 2
193: #define TX_BUF_2x8192 3
194:
195: /* Configuration Register 1 (DLCR7) */
196: #define CONFIG_REG_1 7
197: #define POWERUP BIT(5)
198:
199: /* Transmit start register */
200: #define TRANSMIT_START_REG 10
201: #define TRANSMIT_START_RB 2
202: #define TX_START BIT(7) /* Rest of register bit indicate*/
203: /* number of packets in tx buffer*/
204: /* Node ID registers (DLCR8-13) */
205: #define NODE_ID_0 8
206: #define NODE_ID_RB 0
207:
208: /* Hash Table registers (HT8-15) */
209: #define HASH_TABLE_0 8
210: #define HASH_TABLE_RB 1
211:
212: /* Buffer memory ports */
213: #define BUFFER_MEM_PORT_LB 8
214: #define DATAPORT BUFFER_MEM_PORT_LB
215: #define BUFFER_MEM_PORT_HB 9
216:
217: /* 16 Collision control register (BMPR11) */
218: #define COL_16_REG 11
219: #define HALT_ON_16 0x00
220: #define RETRANS_AND_HALT_ON_16 0x02
221:
222: /* DMA Burst and Transceiver Mode Register (BMPR13) */
223: #define TRANSCEIVER_MODE_REG 13
224: #define TRANSCEIVER_MODE_RB 2
225: #define IO_BASE_UNLOCK BIT(7)
226: #define LOWER_SQUELCH_TRESH BIT(6)
227: #define LINK_TEST_DISABLE BIT(5)
228: #define AUI_SELECT BIT(4)
229: #define DIS_AUTO_PORT_SEL BIT(3)
230:
231: /* Filter Self Receive Register (BMPR14) */
232: #define FILTER_SELF_RX_REG 14
233: #define SKIP_RECEIVE_PACKET BIT(2)
234: #define FILTER_SELF_RECEIVE BIT(0)
235: #define RX_BUF_SKIP_PACKET SKIP_RECEIVE_PACKET | FILTER_SELF_RECEIVE
236:
237: /* EEPROM Control Register (BMPR 16) */
238: #define EEPROM_CTRL_REG 16
239:
240: /* EEPROM Data Register (BMPR 17) */
241: #define EEPROM_DATA_REG 17
242:
243: /* NMC93CSx6 EEPROM Control Bits */
244: #define CS_0 0x00
245: #define CS_1 0x20
246: #define SK_0 0x00
247: #define SK_1 0x40
248: #define DI_0 0x00
249: #define DI_1 0x80
250:
251: /* NMC93CSx6 EEPROM Instructions */
252: #define EEPROM_READ 0x80
253:
254: /* NMC93CSx6 EEPROM Addresses */
255: #define E_NODEID_0 0x02
256: #define E_NODEID_1 0x03
257: #define E_NODEID_2 0x04
258: #define E_PORT_SELECT 0x14
259: #define E_PORT_BNC 0
260: #define E_PORT_DIX 1
261: #define E_PORT_TP 2
262: #define E_PORT_AUTO 3
263: #define E_PRODUCT_CFG 0x30
264:
265:
266: /* Macro to slow down io between EEPROM clock transitions */
267: #define eeprom_slow_io() do { int _i = 40; while(--_i > 0) { __SLOW_DOWN_IO; }}while(0)
268:
269: /* Jumperless Configuration Register (BMPR19) */
270: #define JUMPERLESS_CONFIG 19
271:
272: /* ID ROM registers, writing to them also resets some parts of chip */
273: #define ID_ROM_0 24
274: #define ID_ROM_7 31
275: #define RESET ID_ROM_0
276:
277: /* This is the I/O address list to be probed when seeking the card */
278: static unsigned int eth16i_portlist[] =
279: { 0x260, 0x280, 0x2A0, 0x240, 0x340, 0x320, 0x380, 0x300, 0 };
280:
281: static unsigned int eth32i_portlist[] =
282: { 0x1000, 0x2000, 0x3000, 0x4000, 0x5000, 0x6000, 0x7000, 0x8000,
283: 0x9000, 0xA000, 0xB000, 0xC000, 0xD000, 0xE000, 0xF000, 0 };
284:
285: /* This is the Interrupt lookup table for Eth16i card */
286: static unsigned int eth16i_irqmap[] = { 9, 10, 5, 15 };
287:
288: /* This is the Interrupt lookup table for Eth32i card */
289: static unsigned int eth32i_irqmap[] = { 3, 5, 7, 9, 10, 11, 12, 15 };
290: #define EISA_IRQ_REG 0xc89
291:
292: static unsigned int eth16i_tx_buf_map[] = { 2048, 2048, 4096, 8192 };
293: unsigned int boot = 1;
294:
295: /* Use 0 for production, 1 for verification, >2 for debug */
296: #ifndef ETH16I_DEBUG
297: #define ETH16I_DEBUG 0
298: #endif
299: static unsigned int eth16i_debug = ETH16I_DEBUG;
300:
301: /* Information for each board */
302: struct eth16i_local {
303: struct enet_statistics stats;
304: unsigned int tx_started:1;
305: unsigned char tx_queue; /* Number of packets in transmit buffer */
306: unsigned short tx_queue_len;
307: unsigned int tx_buf_size;
308: unsigned long open_time;
309: };
310:
311: /* Function prototypes */
312:
313: extern int eth16i_probe(struct device *dev);
314:
315: static int eth16i_probe1(struct device *dev, short ioaddr);
316: static int eth16i_check_signature(short ioaddr);
317: static int eth16i_probe_port(short ioaddr);
318: static void eth16i_set_port(short ioaddr, int porttype);
319: static int eth16i_send_probe_packet(short ioaddr, unsigned char *b, int l);
320: static int eth16i_receive_probe_packet(short ioaddr);
321: static int eth16i_get_irq(short ioaddr);
322: static int eth16i_read_eeprom(int ioaddr, int offset);
323: static int eth16i_read_eeprom_word(int ioaddr);
324: static void eth16i_eeprom_cmd(int ioaddr, unsigned char command);
325: static int eth16i_open(struct device *dev);
326: static int eth16i_close(struct device *dev);
327: static int eth16i_tx(struct sk_buff *skb, struct device *dev);
328: static void eth16i_rx(struct device *dev);
329: static void eth16i_interrupt(int irq, struct pt_regs *regs);
330: static void eth16i_multicast(struct device *dev, int num_addrs, void *addrs);
331: static void eth16i_select_regbank(unsigned char regbank, short ioaddr);
332: static void eth16i_initialize(struct device *dev);
333: static struct enet_statistics *eth16i_get_stats(struct device *dev);
334:
335: static char *cardname = "ICL EtherTeam 16i/32";
336:
337: #ifdef HAVE_DEVLIST
338: /* Support for alternate probe manager */
339: /struct netdev_entry eth16i_drv =
340: {"eth16i", eth16i_probe1, ETH16I_IO_EXTENT, eth16i_probe_list};
341:
342: #else /* Not HAVE_DEVLIST */
343: int eth16i_probe(struct device *dev)
344: {
345: int i;
346: int ioaddr;
347: int base_addr = dev ? dev->base_addr : 0;
348:
349: if(eth16i_debug > 4)
350: printk("Probing started for %s\n", cardname);
351:
352: if(base_addr > 0x1ff) /* Check only single location */
353: return eth16i_probe1(dev, base_addr);
354: else if(base_addr != 0) /* Don't probe at all */
355: return ENXIO;
356:
357: /* Seek card from the ISA io address space */
358: for(i = 0; (ioaddr = eth16i_portlist[i]) ; i++) {
359: if(check_region(ioaddr, ETH16I_IO_EXTENT))
360: continue;
361: if(eth16i_probe1(dev, ioaddr) == 0)
362: return 0;
363: }
364:
365: /* Seek card from the EISA io address space */
366: for(i = 0; (ioaddr = eth32i_portlist[i]) ; i++) {
367: if(check_region(ioaddr, ETH16I_IO_EXTENT))
368: continue;
369: if(eth16i_probe1(dev, ioaddr) == 0)
370: return 0;
371: }
372:
373: return ENODEV;
374: }
375: #endif /* Not HAVE_DEVLIST */
376:
377: static int eth16i_probe1(struct device *dev, short ioaddr)
378: {
379: static unsigned version_printed = 0;
380: unsigned int irq = 0;
381: boot = 1; /* To inform initilization that we are in boot probe */
382:
383: /*
384: The MB86985 chip has on register which holds information in which
385: io address the chip lies. First read this register and compare
386: it to our current io address and if match then this could
387: be our chip.
388: */
389:
390: if(ioaddr < 0x1000) {
391: if(eth16i_portlist[(inb(ioaddr + JUMPERLESS_CONFIG) & 0x07)] != ioaddr)
392: return -ENODEV;
393: }
394:
395: /* Now we will go a bit deeper and try to find the chip's signature */
396:
397: if(eth16i_check_signature(ioaddr) != 0) /* Can we find the signature here */
398: return -ENODEV;
399:
400: /*
401: Now it seems that we have found a ethernet chip in this particular
402: ioaddr. The MB86985 chip has this feature, that when you read a
403: certain register it will increase it's io base address to next
404: configurable slot. Now when we have found the chip, first thing is
405: to make sure that the chip's ioaddr will hold still here.
406: */
407:
408: eth16i_select_regbank(TRANSCEIVER_MODE_RB, ioaddr);
409: outb(0x00, ioaddr + TRANSCEIVER_MODE_REG);
410:
411: outb(0x00, ioaddr + RESET); /* Will reset some parts of chip */
412: BITSET(ioaddr + CONFIG_REG_0, BIT(7)); /* This will disable the data link */
413:
414: if(dev == NULL)
415: dev = init_etherdev(0, sizeof(struct eth16i_local));
416:
417: if( (eth16i_debug & version_printed++) == 0)
418: printk(version);
419:
420: dev->base_addr = ioaddr;
421:
422: irq = eth16i_get_irq(ioaddr);
423: dev->irq = irq;
424:
425: /* Try to obtain interrupt vector */
426: if(request_irq(dev->irq, ð16i_interrupt, 0, "eth16i")) {
427: printk("%s: %s at %#3x, but is unusable due
428: conflict on IRQ %d.\n", dev->name, cardname, ioaddr, irq);
429: return EAGAIN;
430: }
431:
432: printk("%s: %s at %#3x, IRQ %d, ",
433: dev->name, cardname, ioaddr, dev->irq);
434:
435: /* Let's grab the region */
436: request_region(ioaddr, ETH16I_IO_EXTENT, "eth16i");
437:
438: /* Now we will have to lock the chip's io address */
439: eth16i_select_regbank(TRANSCEIVER_MODE_RB, ioaddr);
440: outb(0x38, ioaddr + TRANSCEIVER_MODE_REG);
441:
442: eth16i_initialize(dev); /* Initialize rest of the chip's registers */
443:
444: /* Now let's same some energy by shutting down the chip ;) */
445: BITCLR(ioaddr + CONFIG_REG_1, POWERUP);
446:
447: /* Initialize the device structure */
448: if(dev->priv == NULL)
449: dev->priv = kmalloc(sizeof(struct eth16i_local), GFP_KERNEL);
450: memset(dev->priv, 0, sizeof(struct eth16i_local));
451:
452: dev->open = eth16i_open;
453: dev->stop = eth16i_close;
454: dev->hard_start_xmit = eth16i_tx;
455: dev->get_stats = eth16i_get_stats;
456: dev->set_multicast_list = ð16i_multicast;
457:
458: /* Fill in the fields of the device structure with ethernet values. */
459: ether_setup(dev);
460:
461: boot = 0;
462:
463: return 0;
464: }
465:
466:
467: static void eth16i_initialize(struct device *dev)
468: {
469: short ioaddr = dev->base_addr;
470: int i, node_w = 0;
471: unsigned char node_byte = 0;
472:
473: /* Setup station address */
474: eth16i_select_regbank(NODE_ID_RB, ioaddr);
475: for(i = 0 ; i < 3 ; i++) {
476: unsigned short node_val = eth16i_read_eeprom(ioaddr, E_NODEID_0 + i);
477: ((unsigned short *)dev->dev_addr)[i] = ntohs(node_val);
478: }
479:
480: for(i = 0; i < 6; i++) {
481: outb( ((unsigned char *)dev->dev_addr)[i], ioaddr + NODE_ID_0 + i);
482: if(boot) {
483: printk("%02x", inb(ioaddr + NODE_ID_0 + i));
484: if(i != 5)
485: printk(":");
486: }
487: }
488:
489: /* Now we will set multicast addresses to accept none */
490: eth16i_select_regbank(HASH_TABLE_RB, ioaddr);
491: for(i = 0; i < 8; i++)
492: outb(0x00, ioaddr + HASH_TABLE_0 + i);
493:
494: /*
495: Now let's disable the transmitter and receiver, set the buffer ram
496: cycle time, bus width and buffer data path width. Also we shall
497: set transmit buffer size and total buffer size.
498: */
499:
500: eth16i_select_regbank(2, ioaddr);
501:
502: node_byte = 0;
503: node_w = eth16i_read_eeprom(ioaddr, E_PRODUCT_CFG);
504:
505: if( (node_w & 0xFF00) == 0x0800)
506: node_byte |= BUFFER_WIDTH_8;
507:
508: node_byte |= BS1;
509:
510: if( (node_w & 0x00FF) == 64)
511: node_byte |= BS0;
512:
513: node_byte |= DLC_EN | SRAM_CYCLE_TIME_100NS | (ETH16I_TX_BUF_SIZE << 2);
514:
515: outb(node_byte, ioaddr + CONFIG_REG_0);
516:
517: /* We shall halt the transmitting, if 16 collisions are detected */
518: outb(RETRANS_AND_HALT_ON_16, ioaddr + COL_16_REG);
519:
520: if(boot) /* Now set port type */
521: {
522: char *porttype[] = {"BNC", "DIX", "TP", "AUTO"};
523:
524: ushort ptype = eth16i_read_eeprom(ioaddr, E_PORT_SELECT);
525: dev->if_port = (ptype & 0x00FF);
526:
527: printk(" %s interface.\n", porttype[dev->if_port]);
528:
529: if(ptype == E_PORT_AUTO)
530: ptype = eth16i_probe_port(ioaddr);
531:
532: eth16i_set_port(ioaddr, ptype);
533: }
534:
535: /* Set Receive Mode to normal operation */
536: outb(MODE_2, ioaddr + RECEIVE_MODE_REG);
537: }
538:
539: static int eth16i_probe_port(short ioaddr)
540: {
541: int i;
542: int retcode;
543: unsigned char dummy_packet[64] = { 0 };
544:
545: /* Powerup the chip */
546: outb(0xc0 | POWERUP, ioaddr + CONFIG_REG_1);
547:
548: BITSET(ioaddr + CONFIG_REG_0, DLC_EN);
549:
550: eth16i_select_regbank(NODE_ID_RB, ioaddr);
551:
552: for(i = 0; i < 6; i++) {
553: dummy_packet[i] = inb(ioaddr + NODE_ID_0 + i);
554: dummy_packet[i+6] = inb(ioaddr + NODE_ID_0 + i);
555: }
556:
557: dummy_packet[12] = 0x00;
558: dummy_packet[13] = 0x04;
559:
560: eth16i_select_regbank(2, ioaddr);
561:
562: for(i = 0; i < 3; i++) {
563: BITSET(ioaddr + CONFIG_REG_0, DLC_EN);
564: BITCLR(ioaddr + CONFIG_REG_0, DLC_EN);
565: eth16i_set_port(ioaddr, i);
566:
567: if(eth16i_debug > 1)
568: printk("Set port number %d\n", i);
569:
570: retcode = eth16i_send_probe_packet(ioaddr, dummy_packet, 64);
571: if(retcode == 0) {
572: retcode = eth16i_receive_probe_packet(ioaddr);
573: if(retcode != -1) {
574: if(eth16i_debug > 1)
575: printk("Eth16i interface port found at %d\n", i);
576: return i;
577: }
578: }
579: else {
580: if(eth16i_debug > 1)
581: printk("TRANSMIT_DONE timeout\n");
582: }
583: }
584:
585: if( eth16i_debug > 1)
586: printk("Using default port\n");
587:
588: return E_PORT_BNC;
589: }
590:
591: static void eth16i_set_port(short ioaddr, int porttype)
592: {
593: unsigned short temp = 0;
594:
595: eth16i_select_regbank(TRANSCEIVER_MODE_RB, ioaddr);
596: outb(LOOPBACK_CONTROL, ioaddr + TRANSMIT_MODE_REG);
597:
598: temp |= DIS_AUTO_PORT_SEL;
599:
600: switch(porttype) {
601:
602: case E_PORT_BNC :
603: temp |= AUI_SELECT;
604: break;
605:
606: case E_PORT_TP :
607: break;
608:
609: case E_PORT_DIX :
610: temp |= AUI_SELECT;
611: BITSET(ioaddr + TRANSMIT_MODE_REG, CONTROL_OUTPUT);
612: break;
613: }
614: outb(temp, ioaddr + TRANSCEIVER_MODE_REG);
615:
616: if(eth16i_debug > 1) {
617: printk("TRANSMIT_MODE_REG = %x\n", inb(ioaddr + TRANSMIT_MODE_REG));
618: printk("TRANSCEIVER_MODE_REG = %x\n", inb(ioaddr+TRANSCEIVER_MODE_REG));
619: }
620: }
621:
622: static int eth16i_send_probe_packet(short ioaddr, unsigned char *b, int l)
623: {
624: int starttime;
625:
626: outb(0xff, ioaddr + TX_STATUS_REG);
627:
628: outw(l, ioaddr + DATAPORT);
629: outsw(ioaddr + DATAPORT, (unsigned short *)b, (l + 1) >> 1);
630:
631: starttime = jiffies;
632: outb(TX_START | 1, ioaddr + TRANSMIT_START_REG);
633:
634: while( (inb(ioaddr + TX_STATUS_REG) & 0x80) == 0) {
635: if( (jiffies - starttime) > TIMEOUT_TICKS) {
636: break;
637: }
638: }
639:
640: return(0);
641: }
642:
643: static int eth16i_receive_probe_packet(short ioaddr)
644: {
645: int starttime;
646:
647: starttime = jiffies;
648:
649: while((inb(ioaddr + TX_STATUS_REG) & 0x20) == 0) {
650: if( (jiffies - starttime) > TIMEOUT_TICKS) {
651:
652: if(eth16i_debug > 1)
653: printk("Timeout occured waiting transmit packet received\n");
654: starttime = jiffies;
655: while((inb(ioaddr + RX_STATUS_REG) & 0x80) == 0) {
656: if( (jiffies - starttime) > TIMEOUT_TICKS) {
657: if(eth16i_debug > 1)
658: printk("Timeout occured waiting receive packet\n");
659: return -1;
660: }
661: }
662:
663: if(eth16i_debug > 1)
664: printk("RECEIVE_PACKET\n");
665: return(0); /* Found receive packet */
666: }
667: }
668:
669: if(eth16i_debug > 1) {
670: printk("TRANSMIT_PACKET_RECEIVED %x\n", inb(ioaddr + TX_STATUS_REG));
671: printk("RX_STATUS_REG = %x\n", inb(ioaddr + RX_STATUS_REG));
672: }
673:
674: return(0); /* Return success */
675: }
676:
677: static int eth16i_get_irq(short ioaddr)
678: {
679: unsigned char cbyte;
680:
681: if( ioaddr < 0x1000) {
682: cbyte = inb(ioaddr + JUMPERLESS_CONFIG);
683: return( eth16i_irqmap[ ((cbyte & 0xC0) >> 6) ] );
684: } else { /* Oh..the card is EISA so method getting IRQ different */
685: unsigned short index = 0;
686: cbyte = inb(ioaddr + EISA_IRQ_REG);
687: while( (cbyte & 0x01) == 0) {
688: cbyte = cbyte >> 1;
689: index++;
690: }
691: return( eth32i_irqmap[ index ] );
692: }
693: }
694:
695: static int eth16i_check_signature(short ioaddr)
696: {
697: int i;
698: unsigned char creg[4] = { 0 };
699:
700: for(i = 0; i < 4 ; i++) {
701:
702: creg[i] = inb(ioaddr + TRANSMIT_MODE_REG + i);
703:
704: if(eth16i_debug > 1)
705: printk("eth16i: read signature byte %x at %x\n", creg[i],
706: ioaddr + TRANSMIT_MODE_REG + i);
707: }
708:
709: creg[0] &= 0x0F; /* Mask collision cnr */
710: creg[2] &= 0x7F; /* Mask DCLEN bit */
711:
712: #ifdef 0
713: /*
714: This was removed because the card was sometimes left to state
715: from which it couldn't be find anymore. If there is need
716: to more strict chech still this have to be fixed.
717: */
718: if( !( (creg[0] == 0x06) && (creg[1] == 0x41)) ) {
719: if(creg[1] != 0x42)
720: return -1;
721: }
722: #endif
723:
724: if( !( (creg[2] == 0x36) && (creg[3] == 0xE0)) ) {
725: creg[2] &= 0x42;
726: creg[3] &= 0x03;
727:
728: if( !( (creg[2] == 0x42) && (creg[3] == 0x00)) )
729: return -1;
730: }
731:
732: if(eth16i_read_eeprom(ioaddr, E_NODEID_0) != 0)
733: return -1;
734: if((eth16i_read_eeprom(ioaddr, E_NODEID_1) & 0xFF00) != 0x4B00)
735: return -1;
736:
737: return 0;
738: }
739:
740: static int eth16i_read_eeprom(int ioaddr, int offset)
741: {
742: int data = 0;
743:
744: eth16i_eeprom_cmd(ioaddr, EEPROM_READ | offset);
745: outb(CS_1, ioaddr + EEPROM_CTRL_REG);
746: data = eth16i_read_eeprom_word(ioaddr);
747: outb(CS_0 | SK_0, ioaddr + EEPROM_CTRL_REG);
748:
749: return(data);
750: }
751:
752: static int eth16i_read_eeprom_word(int ioaddr)
753: {
754: int i;
755: int data = 0;
756:
757: for(i = 16; i > 0; i--) {
758: outb(CS_1 | SK_0, ioaddr + EEPROM_CTRL_REG);
759: eeprom_slow_io();
760: outb(CS_1 | SK_1, ioaddr + EEPROM_CTRL_REG);
761: eeprom_slow_io();
762: data = (data << 1) | ((inb(ioaddr + EEPROM_DATA_REG) & DI_1) ? 1 : 0);
763: eeprom_slow_io();
764: }
765:
766: return(data);
767: }
768:
769: static void eth16i_eeprom_cmd(int ioaddr, unsigned char command)
770: {
771: int i;
772:
773: outb(CS_0 | SK_0, ioaddr + EEPROM_CTRL_REG);
774: outb(DI_0, ioaddr + EEPROM_DATA_REG);
775: outb(CS_1 | SK_0, ioaddr + EEPROM_CTRL_REG);
776: outb(DI_1, ioaddr + EEPROM_DATA_REG);
777: outb(CS_1 | SK_1, ioaddr + EEPROM_CTRL_REG);
778:
779: for(i = 7; i >= 0; i--) {
780: short cmd = ( (command & (1 << i)) ? DI_1 : DI_0 );
781: outb(cmd, ioaddr + EEPROM_DATA_REG);
782: outb(CS_1 | SK_0, ioaddr + EEPROM_CTRL_REG);
783: eeprom_slow_io();
784: outb(CS_1 | SK_1, ioaddr + EEPROM_CTRL_REG);
785: eeprom_slow_io();
786: }
787: }
788:
789: static int eth16i_open(struct device *dev)
790: {
791: struct eth16i_local *lp = (struct eth16i_local *)dev->priv;
792: int ioaddr = dev->base_addr;
793:
794: irq2dev_map[dev->irq] = dev;
795:
796: /* Powerup the chip */
797: outb(0xc0 | POWERUP, ioaddr + CONFIG_REG_1);
798:
799: /* Initialize the chip */
800: eth16i_initialize(dev);
801:
802: /* Set the transmit buffer size */
803: lp->tx_buf_size = eth16i_tx_buf_map[ETH16I_TX_BUF_SIZE & 0x03];
804:
805: if(eth16i_debug > 3)
806: printk("%s: transmit buffer size %d\n", dev->name, lp->tx_buf_size);
807:
808: /* Now enable Transmitter and Receiver sections */
809: BITCLR(ioaddr + CONFIG_REG_0, DLC_EN);
810:
811: /* Now switch to register bank 2, for run time operation */
812: eth16i_select_regbank(2, ioaddr);
813:
814: lp->open_time = jiffies;
815: lp->tx_started = 0;
816: lp->tx_queue = 0;
817: lp->tx_queue_len = 0;
818:
819: /* Turn on interrupts*/
820: outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG);
821:
822: dev->tbusy = 0;
823: dev->interrupt = 0;
824: dev->start = 1;
825:
826: #ifdef MODULE
827: MOD_INC_USE_COUNT;
828: #endif
829:
830: return 0;
831: }
832:
833: static int eth16i_close(struct device *dev)
834: {
835: struct eth16i_local *lp = (struct eth16i_local *)dev->priv;
836: int ioaddr = dev->base_addr;
837:
838: lp->open_time = 0;
839:
840: dev->tbusy = 1;
841: dev->start = 0;
842:
843: /* Disable transmit and receive */
844: BITSET(ioaddr + CONFIG_REG_0, DLC_EN);
845:
846: /* Reset the chip */
847: outb(0xff, ioaddr + RESET);
848:
849: /* Save some energy by switching off power */
850: BITCLR(ioaddr + CONFIG_REG_1, POWERUP);
851:
852: #ifdef MODULE
853: MOD_DEC_USE_COUNT;
854: #endif
855:
856: return 0;
857: }
858:
859: static int eth16i_tx(struct sk_buff *skb, struct device *dev)
860: {
861: struct eth16i_local *lp = (struct eth16i_local *)dev->priv;
862: int ioaddr = dev->base_addr;
863:
864: if(dev->tbusy) {
865: /*
866: If we get here, some higher level has decided that we are broken.
867: There should really be a "kick me" function call instead.
868: */
869:
870: int tickssofar = jiffies - dev->trans_start;
871: if(tickssofar < TIMEOUT_TICKS) /* Let's not rush with our timeout, */
872: return 1; /* wait a couple of ticks first */
873:
874: printk("%s: transmit timed out with status %04x, %s ?\n", dev->name,
875: inw(ioaddr + TX_STATUS_REG),
876: (inb(ioaddr + TX_STATUS_REG) & TX_DONE) ?
877: "IRQ conflict" : "network cable problem");
878:
879: /* Let's dump all registers */
880: if(eth16i_debug > 0) {
881: printk("%s: timeout regs: %02x %02x %02x %02x %02x %02x %02x %02x.\n",
882: dev->name, inb(ioaddr + 0), inb(ioaddr + 1), inb(ioaddr + 2),
883: inb(ioaddr + 3), inb(ioaddr + 4), inb(ioaddr + 5),
884: inb(ioaddr + 6), inb(ioaddr + 7));
885:
886:
887: printk("lp->tx_queue = %d\n", lp->tx_queue);
888: printk("lp->tx_queue_len = %d\n", lp->tx_queue_len);
889: printk("lp->tx_started = %d\n", lp->tx_started);
890:
891: }
892:
893: lp->stats.tx_errors++;
894:
895: /* Now let's try to restart the adaptor */
896:
897: BITSET(ioaddr + CONFIG_REG_0, DLC_EN);
898: outw(0xffff, ioaddr + RESET);
899: eth16i_initialize(dev);
900: outw(0xffff, ioaddr + TX_STATUS_REG);
901: BITCLR(ioaddr + CONFIG_REG_0, DLC_EN);
902:
903: lp->tx_started = 0;
904: lp->tx_queue = 0;
905: lp->tx_queue_len = 0;
906:
907: outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG);
908:
909: dev->tbusy = 0;
910: dev->trans_start = jiffies;
911: }
912:
913: /*
914: If some higher layer thinks we've missed an tx-done interrupt
915: we are passed NULL. Caution: dev_tint() handles the cli()/sti()
916: itself
917: */
918: if(skb == NULL) {
919: dev_tint(dev);
920: return 0;
921: }
922:
923: /* Block a timer based transmitter from overlapping. This could better be
924: done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */
925:
926: /* Turn off TX interrupts */
927: outw(ETH16I_INTR_OFF, ioaddr + TX_INTR_REG);
928:
929: if(set_bit(0, (void *)&dev->tbusy) != 0)
930: printk("%s: Transmitter access conflict.\n", dev->name);
931: else {
932: short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
933: unsigned char *buf = skb->data;
934:
935: outw(length, ioaddr + DATAPORT);
936:
937: if( ioaddr < 0x1000 )
938: outsw(ioaddr + DATAPORT, buf, (length + 1) >> 1);
939: else {
940: unsigned char frag = length % 4;
941:
942: outsl(ioaddr + DATAPORT, buf, length >> 2);
943:
944: if( frag != 0 ) {
945: outsw(ioaddr + DATAPORT, (buf + (length & 0xFFFC)), 1);
946: if( frag == 3 )
947: outsw(ioaddr + DATAPORT, (buf + (length & 0xFFFC) + 2), 1);
948: }
949: }
950:
951: lp->tx_queue++;
952: lp->tx_queue_len += length + 2;
953:
954: if(lp->tx_started == 0) {
955: /* If the transmitter is idle..always trigger a transmit */
956: outb(TX_START | lp->tx_queue, ioaddr + TRANSMIT_START_REG);
957: lp->tx_queue = 0;
958: lp->tx_queue_len = 0;
959: dev->trans_start = jiffies;
960: lp->tx_started = 1;
961: dev->tbusy = 0;
962: }
963: else if(lp->tx_queue_len < lp->tx_buf_size - (ETH_FRAME_LEN + 2)) {
964: /* There is still more room for one more packet in tx buffer */
965: dev->tbusy = 0;
966: }
967:
968: outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG);
969:
970: /* Turn TX interrupts back on */
971: /* outb(TX_INTR_DONE | TX_INTR_16_COL, ioaddr + TX_INTR_REG); */
972: }
973: dev_kfree_skb(skb, FREE_WRITE);
974:
975: return 0;
976: }
977:
978: static void eth16i_rx(struct device *dev)
979: {
980: struct eth16i_local *lp = (struct eth16i_local *)dev->priv;
981: int ioaddr = dev->base_addr;
982: int boguscount = MAX_RX_LOOP;
983:
984: /* Loop until all packets have been read */
985: while( (inb(ioaddr + RECEIVE_MODE_REG) & RX_BUFFER_EMPTY) == 0) {
986:
987: /* Read status byte from receive buffer */
988: ushort status = inw(ioaddr + DATAPORT);
989:
990: if(eth16i_debug > 4)
991: printk("%s: Receiving packet mode %02x status %04x.\n",
992: dev->name, inb(ioaddr + RECEIVE_MODE_REG), status);
993:
994: if( !(status & PKT_GOOD) ) {
995: /* Hmm..something went wrong. Let's check what error occured */
996: lp->stats.rx_errors++;
997: if( status & PKT_SHORT ) lp->stats.rx_length_errors++;
998: if( status & PKT_ALIGN_ERR ) lp->stats.rx_frame_errors++;
999: if( status & PKT_CRC_ERR ) lp->stats.rx_crc_errors++;
1000: if( status & PKT_RX_BUF_OVERFLOW) lp->stats.rx_over_errors++;
1001: }
1002: else { /* Ok so now we should have a good packet */
1003: struct sk_buff *skb;
1004:
1005: /* Get the size of the packet from receive buffer */
1006: ushort pkt_len = inw(ioaddr + DATAPORT);
1007:
1008: if(pkt_len > ETH_FRAME_LEN) {
1009: printk("%s: %s claimed a very large packet, size of %d bytes.\n",
1010: dev->name, cardname, pkt_len);
1011: outb(RX_BUF_SKIP_PACKET, ioaddr + FILTER_SELF_RX_REG);
1012: lp->stats.rx_dropped++;
1013: break;
1014: }
1015:
1016: skb = dev_alloc_skb(pkt_len + 3);
1017: if( skb == NULL ) {
1018: printk("%s: Could'n allocate memory for packet (len %d)\n",
1019: dev->name, pkt_len);
1020: outb(RX_BUF_SKIP_PACKET, ioaddr + FILTER_SELF_RX_REG);
1021: lp->stats.rx_dropped++;
1022: break;
1023: }
1024:
1025: skb->dev = dev;
1026: skb_reserve(skb,2);
1027: /*
1028: Now let's get the packet out of buffer.
1029: size is (pkt_len + 1) >> 1, cause we are now reading words
1030: and it have to be even aligned.
1031: */
1032:
1033: if( ioaddr < 0x1000)
1034: insw(ioaddr + DATAPORT, skb_put(skb, pkt_len), (pkt_len + 1) >> 1);
1035: else {
1036: unsigned char *buf = skb_put(skb, pkt_len);
1037: unsigned char frag = pkt_len % 4;
1038:
1039: insl(ioaddr + DATAPORT, buf, pkt_len >> 2);
1040:
1041: if(frag != 0) {
1042: unsigned short rest[2];
1043: rest[0] = inw( ioaddr + DATAPORT );
1044: if(frag == 3)
1045: rest[1] = inw( ioaddr + DATAPORT );
1046:
1047: memcpy(buf + (pkt_len & 0xfffc), (char *)rest, frag);
1048: }
1049: }
1050:
1051: skb->protocol=eth_type_trans(skb, dev);
1052: netif_rx(skb);
1053: lp->stats.rx_packets++;
1054:
1055: if( eth16i_debug > 5 ) {
1056: int i;
1057: printk("%s: Received packet of length %d.\n", dev->name, pkt_len);
1058: for(i = 0; i < 14; i++)
1059: printk(" %02x", skb->data[i]);
1060: printk(".\n");
1061: }
1062:
1063: } /* else */
1064:
1065: if(--boguscount <= 0)
1066: break;
1067:
1068: } /* while */
1069:
1070: #if 0
1071: {
1072: int i;
1073:
1074: for(i = 0; i < 20; i++) {
1075: if( (inb(ioaddr+RECEIVE_MODE_REG) & RX_BUFFER_EMPTY) == RX_BUFFER_EMPTY)
1076: break;
1077: inw(ioaddr + DATAPORT);
1078: outb(RX_BUF_SKIP_PACKET, ioaddr + FILTER_SELF_RX_REG);
1079: }
1080:
1081: if(eth16i_debug > 1)
1082: printk("%s: Flushed receive buffer.\n", dev->name);
1083: }
1084: #endif
1085:
1086: return;
1087: }
1088:
1089: static void eth16i_interrupt(int irq, struct pt_regs *regs)
1090: {
1091: struct device *dev = (struct device *)(irq2dev_map[irq]);
1092: struct eth16i_local *lp;
1093: int ioaddr = 0,
1094: status;
1095:
1096: if(dev == NULL) {
1097: printk("eth16i_interrupt(): irq %d for unknown device. \n", irq);
1098: return;
1099: }
1100:
1101: /* Turn off all interrupts from adapter */
1102: outw(ETH16I_INTR_OFF, ioaddr + TX_INTR_REG);
1103:
1104: dev->interrupt = 1;
1105:
1106: ioaddr = dev->base_addr;
1107: lp = (struct eth16i_local *)dev->priv;
1108: status = inw(ioaddr + TX_STATUS_REG); /* Get the status */
1109: outw(status, ioaddr + TX_STATUS_REG); /* Clear status bits */
1110:
1111: if(eth16i_debug > 3)
1112: printk("%s: Interrupt with status %04x.\n", dev->name, status);
1113:
1114: if( status & 0x00ff ) { /* Let's check the transmit status reg */
1115:
1116: if(status & TX_DONE) { /* The transmit has been done */
1117: lp->stats.tx_packets++;
1118:
1119: if(lp->tx_queue) { /* Is there still packets ? */
1120: /* There was packet(s) so start transmitting and write also
1121: how many packets there is to be sended */
1122: outb(TX_START | lp->tx_queue, ioaddr + TRANSMIT_START_REG);
1123: lp->tx_queue = 0;
1124: lp->tx_queue_len = 0;
1125: dev->trans_start = jiffies;
1126: dev->tbusy = 0;
1127: mark_bh(NET_BH);
1128: }
1129: else {
1130: lp->tx_started = 0;
1131: dev->tbusy = 0;
1132: mark_bh(NET_BH);
1133: }
1134: }
1135: }
1136:
1137: if( ( status & 0xff00 ) ||
1138: ( (inb(ioaddr + RECEIVE_MODE_REG) & RX_BUFFER_EMPTY) == 0) ) {
1139: eth16i_rx(dev); /* We have packet in receive buffer */
1140: }
1141:
1142: dev->interrupt = 0;
1143:
1144: /* Turn interrupts back on */
1145: outw(ETH16I_INTR_ON, ioaddr + TX_INTR_REG);
1146:
1147: return;
1148: }
1149:
1150: static void eth16i_multicast(struct device *dev, int num_addrs, void *addrs)
1151: {
1152: short ioaddr = dev->base_addr;
1153:
1154: if(dev->mc_count || dev->flags&(IFF_ALLMULTI|IFF_PROMISC))
1155: {
1156: dev->flags|=IFF_PROMISC; /* Must do this */
1157: outb(3, ioaddr + RECEIVE_MODE_REG);
1158: } else {
1159: outb(2, ioaddr + RECEIVE_MODE_REG);
1160: }
1161: }
1162:
1163: static struct enet_statistics *eth16i_get_stats(struct device *dev)
1164: {
1165: struct eth16i_local *lp = (struct eth16i_local *)dev->priv;
1166:
1167: return &lp->stats;
1168: }
1169:
1170: static void eth16i_select_regbank(unsigned char banknbr, short ioaddr)
1171: {
1172: unsigned char data;
1173:
1174: data = inb(ioaddr + CONFIG_REG_1);
1175: outb( ((data & 0xF3) | ( (banknbr & 0x03) << 2)), ioaddr + CONFIG_REG_1);
1176: }
1177:
1178: #ifdef MODULE
1179: static char devicename[9] = { 0, };
1180: static struct device dev_eth16i = {
1181: devicename,
1182: 0, 0, 0, 0,
1183: 0, 0,
1184: 0, 0, 0, NULL, eth16i_probe };
1185:
1186: int io = 0x2a0;
1187: int irq = 0;
1188:
1189: int init_module(void)
1190: {
1191: if(io == 0)
1192: printk("eth16i: You should not use auto-probing with insmod!\n");
1193:
1194: dev_eth16i.base_addr = io;
1195: dev_eth16i.irq = irq;
1196: if( register_netdev( &dev_eth16i ) != 0 ) {
1197: printk("eth16i: register_netdev() returned non-zero.\n");
1198: return -EIO;
1199: }
1200:
1201: return 0;
1202: }
1203:
1204: void cleanup_module(void)
1205: {
1206: unregister_netdev( &dev_eth16i );
1207: free_irq( dev_eth16i.irq );
1208: irq2dev_map[ dev_eth16i.irq ] = NULL;
1209: release_region( dev_eth16i.base_addr, ETH16I_IO_EXTENT );
1210: }
1211:
1212: #endif /* MODULE */
1213:
1214:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.