Import 2.3.10pre5
[davej-history.git] / drivers / net / cs89x0.c
blob3867c58d3d49caaf76aca27c69b90118cbab666d
1 /* cs89x0.c: A Crystal Semiconductor CS89[02]0 driver for linux. */
2 /*
3 Written 1996 by Russell Nelson, with reference to skeleton.c
4 written 1993-1994 by Donald Becker.
6 This software may be used and distributed according to the terms
7 of the GNU Public License, incorporated herein by reference.
9 The author may be reached at nelson@crynwr.com, Crynwr
10 Software, 11 Grant St., Potsdam, NY 13676
12 Changelog:
14 Mike Cruse : mcruse@cti-ltd.com
15 : Changes for Linux 2.0 compatibility.
16 : Added dev_id parameter in net_interrupt(),
17 : request_irq() and free_irq(). Just NULL for now.
19 Mike Cruse : Added MOD_INC_USE_COUNT and MOD_DEC_USE_COUNT macros
20 : in net_open() and net_close() so kerneld would know
21 : that the module is in use and wouldn't eject the
22 : driver prematurely.
24 Mike Cruse : Rewrote init_module() and cleanup_module using 8390.c
25 : as an example. Disabled autoprobing in init_module(),
26 : not a good thing to do to other devices while Linux
27 : is running from all accounts.
29 Alan Cox : Removed 1.2 support, added 2.1 extra counters.
32 static char *version =
33 "cs89x0.c:v1.02 11/26/96 Russell Nelson <nelson@crynwr.com>\n";
35 /* ======================= configure the driver here ======================= */
37 /* use 0 for production, 1 for verification, >2 for debug */
38 #ifndef NET_DEBUG
39 #define NET_DEBUG 2
40 #endif
42 /* ======================= end of configuration ======================= */
45 /* Always include 'config.h' first in case the user wants to turn on
46 or override something. */
47 #ifdef MODULE
48 #include <linux/module.h>
49 #include <linux/version.h>
50 #else
51 #define MOD_INC_USE_COUNT
52 #define MOD_DEC_USE_COUNT
53 #endif
55 #define PRINTK(x) printk x
58 Sources:
60 Crynwr packet driver epktisa.
62 Crystal Semiconductor data sheets.
66 #include <linux/kernel.h>
67 #include <linux/sched.h>
68 #include <linux/types.h>
69 #include <linux/fcntl.h>
70 #include <linux/interrupt.h>
71 #include <linux/ptrace.h>
72 #include <linux/ioport.h>
73 #include <linux/in.h>
74 #include <linux/malloc.h>
75 #include <linux/string.h>
76 #include <asm/system.h>
77 #include <asm/bitops.h>
78 #include <asm/io.h>
79 #include <linux/errno.h>
80 #include <linux/init.h>
82 #include <linux/netdevice.h>
83 #include <linux/etherdevice.h>
84 #include <linux/skbuff.h>
85 #include "cs89x0.h"
87 /* First, a few definitions that the brave might change. */
88 /* A zero-terminated list of I/O addresses to be probed. */
89 static unsigned int netcard_portlist[] __initdata =
90 { 0x300, 0x320, 0x340, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x2e0, 0};
92 static unsigned int net_debug = NET_DEBUG;
94 /* The number of low I/O ports used by the ethercard. */
95 #define NETCARD_IO_EXTENT 16
97 /* Information that need to be kept for each board. */
98 struct net_local {
99 struct net_device_stats stats;
100 int chip_type; /* one of: CS8900, CS8920, CS8920M */
101 char chip_revision; /* revision letter of the chip ('A'...) */
102 int send_cmd; /* the propercommand used to send a packet. */
103 int auto_neg_cnf;
104 int adapter_cnf;
105 int isa_config;
106 int irq_map;
107 int rx_mode;
108 int curr_rx_cfg;
109 int linectl;
110 int send_underrun; /* keep track of how many underruns in a row we get */
111 struct sk_buff *skb;
114 /* Index to functions, as function prototypes. */
116 extern int cs89x0_probe(struct device *dev);
118 static int cs89x0_probe1(struct device *dev, int ioaddr);
119 static int net_open(struct device *dev);
120 static int net_send_packet(struct sk_buff *skb, struct device *dev);
121 static void net_interrupt(int irq, void *dev_id, struct pt_regs *regs);
122 static void set_multicast_list(struct device *dev);
123 static void net_rx(struct device *dev);
124 static int net_close(struct device *dev);
125 static struct net_device_stats *net_get_stats(struct device *dev);
126 static void reset_chip(struct device *dev);
127 static int get_eeprom_data(struct device *dev, int off, int len, int *buffer);
128 static int get_eeprom_cksum(int off, int len, int *buffer);
129 static int set_mac_address(struct device *dev, void *addr);
132 /* Example routines you must write ;->. */
133 #define tx_done(dev) 1
136 /* Check for a network adaptor of this type, and return '0' iff one exists.
137 If dev->base_addr == 0, probe all likely locations.
138 If dev->base_addr == 1, always return failure.
139 If dev->base_addr == 2, allocate space for the device and return success
140 (detachable devices only).
142 #ifdef HAVE_DEVLIST
143 /* Support for a alternate probe manager, which will eliminate the
144 boilerplate below. */
145 struct netdev_entry netcard_drv =
146 {"netcard", cs89x0_probe1, NETCARD_IO_EXTENT, netcard_portlist};
147 #else
148 int __init
149 cs89x0_probe(struct device *dev)
151 int i;
152 int base_addr = dev ? dev->base_addr : 0;
154 if (base_addr > 0x1ff) /* Check a single specified location. */
155 return cs89x0_probe1(dev, base_addr);
156 else if (base_addr != 0) /* Don't probe at all. */
157 return ENXIO;
159 for (i = 0; netcard_portlist[i]; i++) {
160 int ioaddr = netcard_portlist[i];
161 if (check_region(ioaddr, NETCARD_IO_EXTENT))
162 continue;
163 if (cs89x0_probe1(dev, ioaddr) == 0)
164 return 0;
166 printk("cs89x0: no cs8900 or cs8920 detected. Be sure to disable PnP with SETUP\n");
167 return ENODEV;
169 #endif
171 static int inline
172 readreg(struct device *dev, int portno)
174 outw(portno, dev->base_addr + ADD_PORT);
175 return inw(dev->base_addr + DATA_PORT);
178 static void inline
179 writereg(struct device *dev, int portno, int value)
181 outw(portno, dev->base_addr + ADD_PORT);
182 outw(value, dev->base_addr + DATA_PORT);
186 static int inline
187 readword(struct device *dev, int portno)
189 return inw(dev->base_addr + portno);
192 static void inline
193 writeword(struct device *dev, int portno, int value)
195 outw(value, dev->base_addr + portno);
198 static int __init
199 wait_eeprom_ready(struct device *dev)
201 int timeout = jiffies;
202 /* check to see if the EEPROM is ready, a timeout is used -
203 just in case EEPROM is ready when SI_BUSY in the
204 PP_SelfST is clear */
205 while(readreg(dev, PP_SelfST) & SI_BUSY)
206 if (jiffies - timeout >= 40)
207 return -1;
208 return 0;
211 static int __init
212 get_eeprom_data(struct device *dev, int off, int len, int *buffer)
214 int i;
216 if (net_debug > 3) printk("EEPROM data from %x for %x:\n",off,len);
217 for (i = 0; i < len; i++) {
218 if (wait_eeprom_ready(dev) < 0) return -1;
219 /* Now send the EEPROM read command and EEPROM location to read */
220 writereg(dev, PP_EECMD, (off + i) | EEPROM_READ_CMD);
221 if (wait_eeprom_ready(dev) < 0) return -1;
222 buffer[i] = readreg(dev, PP_EEData);
223 if (net_debug > 3) printk("%04x ", buffer[i]);
225 if (net_debug > 3) printk("\n");
226 return 0;
229 static int __init
230 get_eeprom_cksum(int off, int len, int *buffer)
232 int i, cksum;
234 cksum = 0;
235 for (i = 0; i < len; i++)
236 cksum += buffer[i];
237 cksum &= 0xffff;
238 if (cksum == 0)
239 return 0;
240 return -1;
243 /* This is the real probe routine. Linux has a history of friendly device
244 probes on the ISA bus. A good device probes avoids doing writes, and
245 verifies that the correct device exists and functions. */
247 static int __init cs89x0_probe1(struct device *dev, int ioaddr)
249 struct net_local *lp;
250 static unsigned version_printed = 0;
251 int i;
252 unsigned rev_type = 0;
253 int eeprom_buff[CHKSUM_LEN];
255 /* Initialize the device structure. */
256 if (dev->priv == NULL) {
257 dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
258 memset(dev->priv, 0, sizeof(struct net_local));
260 lp = (struct net_local *)dev->priv;
262 /* if they give us an odd I/O address, then do ONE write to
263 the address port, to get it back to address zero, where we
264 expect to find the EISA signature word. */
265 if (ioaddr & 1) {
266 ioaddr &= ~1;
267 if ((inw(ioaddr + ADD_PORT) & ADD_MASK) != ADD_SIG)
268 return ENODEV;
269 outw(PP_ChipID, ioaddr + ADD_PORT);
272 if (inw(ioaddr + DATA_PORT) != CHIP_EISA_ID_SIG)
273 return ENODEV;
275 /* Fill in the 'dev' fields. */
276 dev->base_addr = ioaddr;
278 /* get the chip type */
279 rev_type = readreg(dev, PRODUCT_ID_ADD);
280 lp->chip_type = rev_type &~ REVISON_BITS;
281 lp->chip_revision = ((rev_type & REVISON_BITS) >> 8) + 'A';
283 /* Check the chip type and revision in order to set the correct send command
284 CS8920 revision C and CS8900 revision F can use the faster send. */
285 lp->send_cmd = TX_AFTER_381;
286 if (lp->chip_type == CS8900 && lp->chip_revision >= 'F')
287 lp->send_cmd = TX_NOW;
288 if (lp->chip_type != CS8900 && lp->chip_revision >= 'C')
289 lp->send_cmd = TX_NOW;
291 if (net_debug && version_printed++ == 0)
292 printk(version);
294 printk("%s: cs89%c0%s rev %c found at %#3lx",
295 dev->name,
296 lp->chip_type==CS8900?'0':'2',
297 lp->chip_type==CS8920M?"M":"",
298 lp->chip_revision,
299 dev->base_addr);
301 reset_chip(dev);
303 /* First check to see if an EEPROM is attached*/
304 if ((readreg(dev, PP_SelfST) & EEPROM_PRESENT) == 0)
305 printk("\ncs89x0: No EEPROM, relying on command line....\n");
306 else if (get_eeprom_data(dev, START_EEPROM_DATA,CHKSUM_LEN,eeprom_buff) < 0) {
307 printk("\ncs89x0: EEPROM read failed, relying on command line.\n");
308 } else if (get_eeprom_cksum(START_EEPROM_DATA,CHKSUM_LEN,eeprom_buff) < 0) {
309 printk("\ncs89x0: EEPROM checksum bad, relyong on command line\n");
310 } else {
311 /* get transmission control word but keep the autonegotiation bits */
312 if (!lp->auto_neg_cnf) lp->auto_neg_cnf = eeprom_buff[AUTO_NEG_CNF_OFFSET/2];
313 /* Store adapter configuration */
314 if (!lp->adapter_cnf) lp->adapter_cnf = eeprom_buff[ADAPTER_CNF_OFFSET/2];
315 /* Store ISA configuration */
316 lp->isa_config = eeprom_buff[ISA_CNF_OFFSET/2];
317 /* store the initial memory base address */
318 dev->mem_start = eeprom_buff[PACKET_PAGE_OFFSET/2] << 8;
319 for (i = 0; i < ETH_ALEN/2; i++) {
320 dev->dev_addr[i*2] = eeprom_buff[i];
321 dev->dev_addr[i*2+1] = eeprom_buff[i] >> 8;
326 printk(" media %s%s%s",
327 (lp->adapter_cnf & A_CNF_10B_T)?"RJ-45,":"",
328 (lp->adapter_cnf & A_CNF_AUI)?"AUI,":"",
329 (lp->adapter_cnf & A_CNF_10B_2)?"BNC,":"");
331 lp->irq_map = 0xffff;
333 /* If this is a CS8900 then no pnp soft */
334 if (lp->chip_type != CS8900 &&
335 /* Check if the ISA IRQ has been set */
336 (i = readreg(dev, PP_CS8920_ISAINT) & 0xff,
337 (i != 0 && i < CS8920_NO_INTS))) {
338 if (!dev->irq)
339 dev->irq = i;
340 } else {
341 i = lp->isa_config & INT_NO_MASK;
342 if (lp->chip_type == CS8900) {
343 /* the table that follows is dependent upon how you wired up your cs8900
344 * in your system. The table is the same as the cs8900 engineering demo
345 * board. irq_map also depends on the contents of the table. Also see
346 * write_irq, which is the reverse mapping of the table below. */
347 switch(i) {
348 case 0: i = 10; break;
349 case 1: i = 11; break;
350 case 2: i = 12; break;
351 case 3: i = 5; break;
352 default: printk("\ncs89x0: bug: isa_config is %d\n", i);
354 lp->irq_map = CS8900_IRQ_MAP; /* fixed IRQ map for CS8900 */
355 } else {
356 int irq_map_buff[IRQ_MAP_LEN/2];
358 if (get_eeprom_data(dev, IRQ_MAP_EEPROM_DATA,
359 IRQ_MAP_LEN/2,
360 irq_map_buff) >= 0) {
361 if ((irq_map_buff[0] & 0xff) == PNP_IRQ_FRMT)
362 lp->irq_map = (irq_map_buff[0]>>8) | (irq_map_buff[1] << 8);
365 if (!dev->irq)
366 dev->irq = i;
369 printk(" IRQ %d", dev->irq);
372 /* print the ethernet address. */
373 for (i = 0; i < ETH_ALEN; i++)
374 printk(" %2.2x", dev->dev_addr[i]);
376 /* Grab the region so we can find another board if autoIRQ fails. */
377 request_region(ioaddr, NETCARD_IO_EXTENT,"cs89x0");
379 dev->open = net_open;
380 dev->stop = net_close;
381 dev->hard_start_xmit = net_send_packet;
382 dev->get_stats = net_get_stats;
383 dev->set_multicast_list = &set_multicast_list;
384 dev->set_mac_address = &set_mac_address;
386 /* Fill in the fields of the device structure with ethernet values. */
387 ether_setup(dev);
389 printk("\n");
390 return 0;
393 void __init
394 reset_chip(struct device *dev)
396 struct net_local *lp = (struct net_local *)dev->priv;
397 int ioaddr = dev->base_addr;
398 int reset_start_time;
400 writereg(dev, PP_SelfCTL, readreg(dev, PP_SelfCTL) | POWER_ON_RESET);
402 /* wait 30 ms */
403 current->state = TASK_INTERRUPTIBLE;
404 schedule_timeout(30*HZ/1000);
406 if (lp->chip_type != CS8900) {
407 /* Hardware problem requires PNP registers to be reconfigured after a reset */
408 outw(PP_CS8920_ISAINT, ioaddr + ADD_PORT);
409 outb(dev->irq, ioaddr + DATA_PORT);
410 outb(0, ioaddr + DATA_PORT + 1);
412 outw(PP_CS8920_ISAMemB, ioaddr + ADD_PORT);
413 outb((dev->mem_start >> 8) & 0xff, ioaddr + DATA_PORT);
414 outb((dev->mem_start >> 24) & 0xff, ioaddr + DATA_PORT + 1);
416 /* Wait until the chip is reset */
417 reset_start_time = jiffies;
418 while( (readreg(dev, PP_SelfST) & INIT_DONE) == 0 && jiffies - reset_start_time < 2)
423 static void
424 control_dc_dc(struct device *dev, int on_not_off)
426 struct net_local *lp = (struct net_local *)dev->priv;
427 unsigned int selfcontrol;
428 int timenow = jiffies;
429 /* control the DC to DC convertor in the SelfControl register. */
431 selfcontrol = HCB1_ENBL; /* Enable the HCB1 bit as an output */
432 if (((lp->adapter_cnf & A_CNF_DC_DC_POLARITY) != 0) ^ on_not_off)
433 selfcontrol |= HCB1;
434 else
435 selfcontrol &= ~HCB1;
436 writereg(dev, PP_SelfCTL, selfcontrol);
438 /* Wait for the DC/DC converter to power up - 500ms */
439 while (jiffies - timenow < 100)
444 static int
445 detect_tp(struct device *dev)
447 struct net_local *lp = (struct net_local *)dev->priv;
448 int timenow = jiffies;
450 if (net_debug > 1) printk("%s: Attempting TP\n", dev->name);
452 /* If connected to another full duplex capable 10-Base-T card the link pulses
453 seem to be lost when the auto detect bit in the LineCTL is set.
454 To overcome this the auto detect bit will be cleared whilst testing the
455 10-Base-T interface. This would not be necessary for the sparrow chip but
456 is simpler to do it anyway. */
457 writereg(dev, PP_LineCTL, lp->linectl &~ AUI_ONLY);
458 control_dc_dc(dev, 0);
460 /* Delay for the hardware to work out if the TP cable is present - 150ms */
461 for (timenow = jiffies; jiffies - timenow < 15; )
463 if ((readreg(dev, PP_LineST) & LINK_OK) == 0)
464 return 0;
466 if (lp->chip_type != CS8900) {
468 writereg(dev, PP_AutoNegCTL, lp->auto_neg_cnf & AUTO_NEG_MASK);
470 if ((lp->auto_neg_cnf & AUTO_NEG_BITS) == AUTO_NEG_ENABLE) {
471 printk("%s: negotiating duplex...\n",dev->name);
472 while (readreg(dev, PP_AutoNegST) & AUTO_NEG_BUSY) {
473 if (jiffies - timenow > 4000) {
474 printk("**** Full / half duplex auto-negotiation timed out ****\n");
475 break;
479 if (readreg(dev, PP_AutoNegST) & FDX_ACTIVE)
480 printk("%s: using full duplex\n", dev->name);
481 else
482 printk("%s: using half duplex\n", dev->name);
485 return A_CNF_MEDIA_10B_T;
488 /* send a test packet - return true if carrier bits are ok */
489 static int
490 send_test_pkt(struct device *dev)
492 int ioaddr = dev->base_addr;
493 char test_packet[] = { 0,0,0,0,0,0, 0,0,0,0,0,0,
494 0, 46, /* A 46 in network order */
495 0, 0, /* DSAP=0 & SSAP=0 fields */
496 0xf3, 0 /* Control (Test Req + P bit set) */ };
497 long timenow = jiffies;
499 writereg(dev, PP_LineCTL, readreg(dev, PP_LineCTL) | SERIAL_TX_ON);
501 memcpy(test_packet, dev->dev_addr, ETH_ALEN);
502 memcpy(test_packet+ETH_ALEN, dev->dev_addr, ETH_ALEN);
504 outw(TX_AFTER_ALL, ioaddr + TX_CMD_PORT);
505 outw(ETH_ZLEN, ioaddr + TX_LEN_PORT);
507 /* Test to see if the chip has allocated memory for the packet */
508 while (jiffies - timenow < 5)
509 if (readreg(dev, PP_BusST) & READY_FOR_TX_NOW)
510 break;
511 if (jiffies - timenow >= 5)
512 return 0; /* this shouldn't happen */
514 /* Write the contents of the packet */
515 if (dev->mem_start) {
516 memcpy((void *)dev->mem_start + PP_TxFrame, test_packet, ETH_ZLEN);
517 } else {
518 outsw(ioaddr + TX_FRAME_PORT,test_packet,(ETH_ZLEN+1) >>1);
521 if (net_debug > 1) printk("Sending test packet ");
522 /* wait a couple of jiffies for packet to be received */
523 for (timenow = jiffies; jiffies - timenow < 3; )
525 if ((readreg(dev, PP_TxEvent) & TX_SEND_OK_BITS) == TX_OK) {
526 if (net_debug > 1) printk("succeeded\n");
527 return 1;
529 if (net_debug > 1) printk("failed\n");
530 return 0;
534 static int
535 detect_aui(struct device *dev)
537 struct net_local *lp = (struct net_local *)dev->priv;
539 if (net_debug > 1) printk("%s: Attempting AUI\n", dev->name);
540 control_dc_dc(dev, 0);
542 writereg(dev, PP_LineCTL, (lp->linectl &~ AUTO_AUI_10BASET) | AUI_ONLY);
544 if (send_test_pkt(dev))
545 return A_CNF_MEDIA_AUI;
546 else
547 return 0;
550 static int
551 detect_bnc(struct device *dev)
553 struct net_local *lp = (struct net_local *)dev->priv;
555 if (net_debug > 1) printk("%s: Attempting BNC\n", dev->name);
556 control_dc_dc(dev, 1);
558 writereg(dev, PP_LineCTL, (lp->linectl &~ AUTO_AUI_10BASET) | AUI_ONLY);
560 if (send_test_pkt(dev))
561 return A_CNF_MEDIA_10B_2;
562 else
563 return 0;
567 static void
568 write_irq(struct device *dev, int chip_type, int irq)
570 int i;
572 if (chip_type == CS8900) {
573 switch(irq) {
574 case 10: i = 0; break;
575 case 11: i = 1; break;
576 case 12: i = 2; break;
577 case 5: i = 3; break;
578 default: i = 3; break;
580 writereg(dev, PP_CS8900_ISAINT, i);
581 } else {
582 writereg(dev, PP_CS8920_ISAINT, irq);
586 /* Open/initialize the board. This is called (in the current kernel)
587 sometime after booting when the 'ifconfig' program is run.
589 This routine should set everything up anew at each open, even
590 registers that "should" only need to be set once at boot, so that
591 there is non-reboot way to recover if something goes wrong.
593 static int
594 net_open(struct device *dev)
596 struct net_local *lp = (struct net_local *)dev->priv;
597 int result = 0;
598 int i;
600 if (dev->irq < 2) {
601 /* Allow interrupts to be generated by the chip */
602 writereg(dev, PP_BusCTL, ENABLE_IRQ | MEMORY_ON);
603 for (i = 2; i < CS8920_NO_INTS; i++) if ((1 << dev->irq) & lp->irq_map) {
604 if (request_irq (i, NULL, 0, "cs8920", dev) != -EBUSY) {
605 write_irq(dev, lp->chip_type, i);
606 writereg(dev, PP_BufCFG, GENERATE_SW_INTERRUPT);
607 if (request_irq (dev->irq = i, &net_interrupt, 0, "cs89x0", dev) == 0)
608 break;
613 if (i >= CS8920_NO_INTS) {
614 writereg(dev, PP_BusCTL, 0); /* disable interrupts. */
615 return -EAGAIN;
617 } else {
618 if (((1 << dev->irq) & lp->irq_map) == 0) {
619 printk("%s: IRQ %d is not in our map of allowable IRQs, which is %x\n",
620 dev->name, dev->irq, lp->irq_map);
621 return -EAGAIN;
623 writereg(dev, PP_BusCTL, ENABLE_IRQ | MEMORY_ON);
624 write_irq(dev, lp->chip_type, dev->irq);
625 if (request_irq(dev->irq, &net_interrupt, 0, "cs89x0", dev)) {
626 return -EAGAIN;
630 /* set the Ethernet address */
631 for (i=0; i < ETH_ALEN/2; i++)
632 writereg(dev, PP_IA+i*2, dev->dev_addr[i*2] | (dev->dev_addr[i*2+1] << 8));
634 /* while we're testing the interface, leave interrupts disabled */
635 writereg(dev, PP_BusCTL, MEMORY_ON);
637 /* Set the LineCTL quintuplet based on adapter configuration read from EEPROM */
638 if ((lp->adapter_cnf & A_CNF_EXTND_10B_2) && (lp->adapter_cnf & A_CNF_LOW_RX_SQUELCH))
639 lp->linectl = LOW_RX_SQUELCH;
640 else
641 lp->linectl = 0;
643 /* check to make sure that they have the "right" hardware available */
644 switch(lp->adapter_cnf & A_CNF_MEDIA_TYPE) {
645 case A_CNF_MEDIA_10B_T: result = lp->adapter_cnf & A_CNF_10B_T; break;
646 case A_CNF_MEDIA_AUI: result = lp->adapter_cnf & A_CNF_AUI; break;
647 case A_CNF_MEDIA_10B_2: result = lp->adapter_cnf & A_CNF_10B_2; break;
648 default: result = lp->adapter_cnf & (A_CNF_10B_T | A_CNF_AUI | A_CNF_10B_2);
650 if (!result) {
651 printk("%s: EEPROM is configured for unavailable media\n", dev->name);
652 release_irq:
653 writereg(dev, PP_LineCTL, readreg(dev, PP_LineCTL) & ~(SERIAL_TX_ON | SERIAL_RX_ON));
654 free_irq(dev->irq, dev);
655 return -EAGAIN;
658 /* set the hardware to the configured choice */
659 switch(lp->adapter_cnf & A_CNF_MEDIA_TYPE) {
660 case A_CNF_MEDIA_10B_T:
661 result = detect_tp(dev);
662 if (!result) printk("%s: 10Base-T (RJ-45) has no cable\n", dev->name);
663 if (lp->auto_neg_cnf & IMM_BIT) /* check "ignore missing media" bit */
664 result = A_CNF_MEDIA_10B_T; /* Yes! I don't care if I see a link pulse */
665 break;
666 case A_CNF_MEDIA_AUI:
667 result = detect_aui(dev);
668 if (!result) printk("%s: 10Base-5 (AUI) has no cable\n", dev->name);
669 if (lp->auto_neg_cnf & IMM_BIT) /* check "ignore missing media" bit */
670 result = A_CNF_MEDIA_AUI; /* Yes! I don't care if I see a carrrier */
671 break;
672 case A_CNF_MEDIA_10B_2:
673 result = detect_bnc(dev);
674 if (!result) printk("%s: 10Base-2 (BNC) has no cable\n", dev->name);
675 if (lp->auto_neg_cnf & IMM_BIT) /* check "ignore missing media" bit */
676 result = A_CNF_MEDIA_10B_2; /* Yes! I don't care if I can xmit a packet */
677 break;
678 case A_CNF_MEDIA_AUTO:
679 writereg(dev, PP_LineCTL, lp->linectl | AUTO_AUI_10BASET);
680 if (lp->adapter_cnf & A_CNF_10B_T)
681 if ((result = detect_tp(dev)) != 0)
682 break;
683 if (lp->adapter_cnf & A_CNF_AUI)
684 if ((result = detect_aui(dev)) != 0)
685 break;
686 if (lp->adapter_cnf & A_CNF_10B_2)
687 if ((result = detect_bnc(dev)) != 0)
688 break;
689 printk("%s: no media detected\n", dev->name);
690 goto release_irq;
692 switch(result) {
693 case 0: printk("%s: no network cable attached to configured media\n", dev->name);
694 goto release_irq;
695 case A_CNF_MEDIA_10B_T: printk("%s: using 10Base-T (RJ-45)\n", dev->name);break;
696 case A_CNF_MEDIA_AUI: printk("%s: using 10Base-5 (AUI)\n", dev->name);break;
697 case A_CNF_MEDIA_10B_2: printk("%s: using 10Base-2 (BNC)\n", dev->name);break;
698 default: printk("%s: unexpected result was %x\n", dev->name, result); goto release_irq;
701 /* Turn on both receive and transmit operations */
702 writereg(dev, PP_LineCTL, readreg(dev, PP_LineCTL) | SERIAL_RX_ON | SERIAL_TX_ON);
704 /* Receive only error free packets addressed to this card */
705 lp->rx_mode = 0;
706 writereg(dev, PP_RxCTL, DEF_RX_ACCEPT);
708 lp->curr_rx_cfg = RX_OK_ENBL | RX_CRC_ERROR_ENBL;
709 if (lp->isa_config & STREAM_TRANSFER)
710 lp->curr_rx_cfg |= RX_STREAM_ENBL;
712 writereg(dev, PP_RxCFG, lp->curr_rx_cfg);
714 writereg(dev, PP_TxCFG, TX_LOST_CRS_ENBL | TX_SQE_ERROR_ENBL | TX_OK_ENBL |
715 TX_LATE_COL_ENBL | TX_JBR_ENBL | TX_ANY_COL_ENBL | TX_16_COL_ENBL);
717 writereg(dev, PP_BufCFG, READY_FOR_TX_ENBL | RX_MISS_COUNT_OVRFLOW_ENBL |
718 TX_COL_COUNT_OVRFLOW_ENBL | TX_UNDERRUN_ENBL);
720 /* now that we've got our act together, enable everything */
721 writereg(dev, PP_BusCTL, ENABLE_IRQ
723 dev->tbusy = 0;
724 dev->interrupt = 0;
725 dev->start = 1;
726 MOD_INC_USE_COUNT;
727 return 0;
730 static int
731 net_send_packet(struct sk_buff *skb, struct device *dev)
733 if (dev->tbusy) {
734 /* If we get here, some higher level has decided we are broken.
735 There should really be a "kick me" function call instead. */
736 int tickssofar = jiffies - dev->trans_start;
737 if (tickssofar < 5)
738 return 1;
739 if (net_debug > 0) printk("%s: transmit timed out, %s?\n", dev->name,
740 tx_done(dev) ? "IRQ conflict ?" : "network cable problem");
741 /* Try to restart the adaptor. */
742 dev->tbusy=0;
743 dev->trans_start = jiffies;
746 /* Block a timer-based transmit from overlapping. This could better be
747 done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */
748 if (test_and_set_bit(0, (void*)&dev->tbusy) != 0)
749 printk("%s: Transmitter access conflict.\n", dev->name);
750 else {
751 struct net_local *lp = (struct net_local *)dev->priv;
752 short ioaddr = dev->base_addr;
753 unsigned long flags;
755 if (net_debug > 3)printk("%s: sent %d byte packet of type %x\n", dev->name, skb->len, (skb->data[ETH_ALEN+ETH_ALEN] << 8) | skb->data[ETH_ALEN+ETH_ALEN+1]);
757 /* keep the upload from being interrupted, since we
758 ask the chip to start transmitting before the
759 whole packet has been completely uploaded. */
760 save_flags(flags);
761 cli();
763 /* initiate a transmit sequence */
764 outw(lp->send_cmd, ioaddr + TX_CMD_PORT);
765 outw(skb->len, ioaddr + TX_LEN_PORT);
767 /* Test to see if the chip has allocated memory for the packet */
768 if ((readreg(dev, PP_BusST) & READY_FOR_TX_NOW) == 0) {
769 /* Gasp! It hasn't. But that shouldn't happen since
770 we're waiting for TxOk, so return 1 and requeue this packet. */
771 restore_flags(flags);
772 return 1;
775 /* Write the contents of the packet */
776 outsw(ioaddr + TX_FRAME_PORT,skb->data,(skb->len+1) >>1);
778 restore_flags(flags);
779 dev->trans_start = jiffies;
781 dev_kfree_skb (skb);
783 return 0;
786 /* The typical workload of the driver:
787 Handle the network interface interrupts. */
788 static void net_interrupt(int irq, void *dev_id, struct pt_regs * regs)
790 struct device *dev = dev_id;
791 struct net_local *lp;
792 int ioaddr, status;
794 if (dev == NULL) {
795 printk ("net_interrupt(): irq %d for unknown device.\n", irq);
796 return;
798 if (dev->interrupt)
799 printk("%s: Re-entering the interrupt handler.\n", dev->name);
800 dev->interrupt = 1;
802 ioaddr = dev->base_addr;
803 lp = (struct net_local *)dev->priv;
805 /* we MUST read all the events out of the ISQ, otherwise we'll never
806 get interrupted again. As a consequence, we can't have any limit
807 on the number of times we loop in the interrupt handler. The
808 hardware guarantees that eventually we'll run out of events. Of
809 course, if you're on a slow machine, and packets are arriving
810 faster than you can read them off, you're screwed. Hasta la
811 vista, baby! */
812 while ((status = readword(dev, ISQ_PORT))) {
813 if (net_debug > 4)printk("%s: event=%04x\n", dev->name, status);
814 switch(status & ISQ_EVENT_MASK) {
815 case ISQ_RECEIVER_EVENT:
816 /* Got a packet(s). */
817 net_rx(dev);
818 break;
819 case ISQ_TRANSMITTER_EVENT:
820 lp->stats.tx_packets++;
821 dev->tbusy = 0;
822 mark_bh(NET_BH); /* Inform upper layers. */
823 if ((status & TX_OK) == 0) lp->stats.tx_errors++;
824 if (status & TX_LOST_CRS) lp->stats.tx_carrier_errors++;
825 if (status & TX_SQE_ERROR) lp->stats.tx_heartbeat_errors++;
826 if (status & TX_LATE_COL) lp->stats.tx_window_errors++;
827 if (status & TX_16_COL) lp->stats.tx_aborted_errors++;
828 break;
829 case ISQ_BUFFER_EVENT:
830 if (status & READY_FOR_TX) {
831 /* we tried to transmit a packet earlier,
832 but inexplicably ran out of buffers.
833 That shouldn't happen since we only ever
834 load one packet. Shrug. Do the right
835 thing anyway. */
836 dev->tbusy = 0;
837 mark_bh(NET_BH); /* Inform upper layers. */
839 if (status & TX_UNDERRUN) {
840 if (net_debug > 0) printk("%s: transmit underrun\n", dev->name);
841 lp->send_underrun++;
842 if (lp->send_underrun == 3) lp->send_cmd = TX_AFTER_381;
843 else if (lp->send_underrun == 6) lp->send_cmd = TX_AFTER_ALL;
845 break;
846 case ISQ_RX_MISS_EVENT:
847 lp->stats.rx_missed_errors += (status >>6);
848 break;
849 case ISQ_TX_COL_EVENT:
850 lp->stats.collisions += (status >>6);
851 break;
854 dev->interrupt = 0;
855 return;
858 /* We have a good packet(s), get it/them out of the buffers. */
859 static void
860 net_rx(struct device *dev)
862 struct net_local *lp = (struct net_local *)dev->priv;
863 int ioaddr = dev->base_addr;
864 struct sk_buff *skb;
865 int status, length;
867 status = inw(ioaddr + RX_FRAME_PORT);
868 length = inw(ioaddr + RX_FRAME_PORT);
869 if ((status & RX_OK) == 0) {
870 lp->stats.rx_errors++;
871 if (status & RX_RUNT) lp->stats.rx_length_errors++;
872 if (status & RX_EXTRA_DATA) lp->stats.rx_length_errors++;
873 if (status & RX_CRC_ERROR) if (!(status & (RX_EXTRA_DATA|RX_RUNT)))
874 /* per str 172 */
875 lp->stats.rx_crc_errors++;
876 if (status & RX_DRIBBLE) lp->stats.rx_frame_errors++;
877 return;
880 /* Malloc up new buffer. */
881 skb = alloc_skb(length, GFP_ATOMIC);
882 if (skb == NULL) {
883 printk("%s: Memory squeeze, dropping packet.\n", dev->name);
884 lp->stats.rx_dropped++;
885 return;
887 skb->len = length;
888 skb->dev = dev;
890 insw(ioaddr + RX_FRAME_PORT, skb->data, length >> 1);
891 if (length & 1)
892 skb->data[length-1] = inw(ioaddr + RX_FRAME_PORT);
894 if (net_debug > 3)printk("%s: received %d byte packet of type %x\n",
895 dev->name, length,
896 (skb->data[ETH_ALEN+ETH_ALEN] << 8) | skb->data[ETH_ALEN+ETH_ALEN+1]);
898 skb->protocol=eth_type_trans(skb,dev);
899 netif_rx(skb);
900 lp->stats.rx_packets++;
901 lp->stats.rx_bytes+=skb->len;
902 return;
905 /* The inverse routine to net_open(). */
906 static int
907 net_close(struct device *dev)
910 writereg(dev, PP_RxCFG, 0);
911 writereg(dev, PP_TxCFG, 0);
912 writereg(dev, PP_BufCFG, 0);
913 writereg(dev, PP_BusCTL, 0);
915 dev->start = 0;
917 free_irq(dev->irq, dev);
919 /* Update the statistics here. */
921 MOD_DEC_USE_COUNT;
922 return 0;
926 /* Get the current statistics. This may be called with the card open or
927 closed. */
928 static struct net_device_stats *
929 net_get_stats(struct device *dev)
931 struct net_local *lp = (struct net_local *)dev->priv;
933 cli();
934 /* Update the statistics from the device registers. */
935 lp->stats.rx_missed_errors += (readreg(dev, PP_RxMiss) >> 6);
936 lp->stats.collisions += (readreg(dev, PP_TxCol) >> 6);
937 sti();
939 return &lp->stats;
942 static void set_multicast_list(struct device *dev)
944 struct net_local *lp = (struct net_local *)dev->priv;
946 if(dev->flags&IFF_PROMISC)
948 lp->rx_mode = RX_ALL_ACCEPT;
950 else if((dev->flags&IFF_ALLMULTI)||dev->mc_list)
952 /* The multicast-accept list is initialized to accept-all, and we
953 rely on higher-level filtering for now. */
954 lp->rx_mode = RX_MULTCAST_ACCEPT;
956 else
957 lp->rx_mode = 0;
959 writereg(dev, PP_RxCTL, DEF_RX_ACCEPT | lp->rx_mode);
961 /* in promiscuous mode, we accept errored packets, so we have to enable interrupts on them also */
962 writereg(dev, PP_RxCFG, lp->curr_rx_cfg |
963 (lp->rx_mode == RX_ALL_ACCEPT? (RX_CRC_ERROR_ENBL|RX_RUNT_ENBL|RX_EXTRA_DATA_ENBL) : 0));
967 static int set_mac_address(struct device *dev, void *addr)
969 int i;
970 if (dev->start)
971 return -EBUSY;
972 printk("%s: Setting MAC address to ", dev->name);
973 for (i = 0; i < 6; i++)
974 printk(" %2.2x", dev->dev_addr[i] = ((unsigned char *)addr)[i]);
975 printk(".\n");
976 /* set the Ethernet address */
977 for (i=0; i < ETH_ALEN/2; i++)
978 writereg(dev, PP_IA+i*2, dev->dev_addr[i*2] | (dev->dev_addr[i*2+1] << 8));
980 return 0;
983 #ifdef MODULE
985 static char namespace[16] = "";
986 static struct device dev_cs89x0 = {
987 NULL,
988 0, 0, 0, 0,
989 0, 0,
990 0, 0, 0, NULL, NULL };
992 static int io=0;
993 static int irq=0;
994 static int debug=0;
995 static char media[8];
996 static int duplex=-1;
998 MODULE_PARM(io, "i");
999 MODULE_PARM(irq, "i");
1000 MODULE_PARM(debug, "i");
1001 MODULE_PARM(media, "s");
1002 MODULE_PARM(duplex, "i");
1004 EXPORT_NO_SYMBOLS;
1007 * media=t - specify media type
1008 or media=2
1009 or media=aui
1010 or medai=auto
1011 * duplex=0 - specify forced half/full/autonegotiate duplex
1012 * debug=# - debug level
1015 * Default Chip Configuration:
1016 * DMA Burst = enabled
1017 * IOCHRDY Enabled = enabled
1018 * UseSA = enabled
1019 * CS8900 defaults to half-duplex if not specified on command-line
1020 * CS8920 defaults to autoneg if not specified on command-line
1021 * Use reset defaults for other config parameters
1023 * Assumptions:
1024 * media type specified is supported (circuitry is present)
1025 * if memory address is > 1MB, then required mem decode hw is present
1026 * if 10B-2, then agent other than driver will enable DC/DC converter
1027 (hw or software util)
1033 init_module(void)
1035 struct net_local *lp;
1037 net_debug = debug;
1038 dev_cs89x0.name = namespace;
1039 dev_cs89x0.irq = irq;
1040 dev_cs89x0.base_addr = io;
1041 dev_cs89x0.init = cs89x0_probe;
1042 dev_cs89x0.priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
1043 memset(dev_cs89x0.priv, 0, sizeof(struct net_local));
1044 lp = (struct net_local *)dev_cs89x0.priv;
1046 /* boy, they'd better get these right */
1047 if (!strcmp(media, "rj45"))
1048 lp->adapter_cnf = A_CNF_MEDIA_10B_T | A_CNF_10B_T;
1049 else if (!strcmp(media, "aui"))
1050 lp->adapter_cnf = A_CNF_MEDIA_AUI | A_CNF_AUI;
1051 else if (!strcmp(media, "bnc"))
1052 lp->adapter_cnf = A_CNF_MEDIA_10B_2 | A_CNF_10B_2;
1053 else
1054 lp->adapter_cnf = A_CNF_MEDIA_10B_T | A_CNF_10B_T;
1056 if (duplex==-1)
1057 lp->auto_neg_cnf = AUTO_NEG_ENABLE;
1059 if (io == 0) {
1060 printk(KERN_NOTICE "cs89x0.c: Module autoprobing not allowed.\n");
1061 printk(KERN_NOTICE "cs89x0.c: Append io=0xNNN\n");
1062 return -EPERM;
1064 if (register_netdev(&dev_cs89x0) != 0) {
1065 printk(KERN_WARNING "cs89x0.c: No card found at 0x%x\n", io);
1066 return -ENXIO;
1068 return 0;
1071 void
1072 cleanup_module(void)
1075 #endif
1076 #ifdef MODULE
1077 outw(0, dev_cs89x0.base_addr + ADD_PORT);
1078 #endif
1079 #ifdef MODULE
1081 if (dev_cs89x0.priv != NULL) {
1082 /* Free up the private structure, or leak memory :-) */
1083 unregister_netdev(&dev_cs89x0);
1084 kfree(dev_cs89x0.priv);
1085 dev_cs89x0.priv = NULL; /* gets re-allocated by cs89x0_probe1 */
1086 /* If we don't do this, we can't re-insmod it later. */
1087 release_region(dev_cs89x0.base_addr, NETCARD_IO_EXTENT);
1090 #endif /* MODULE */
1093 * Local variables:
1094 * compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/include -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -DMODULE -DCONFIG_MODVERSIONS -c cs89x0.c"
1095 * version-control: t
1096 * kept-new-versions: 5
1097 * c-indent-level: 8
1098 * tab-width: 8
1099 * End: