blob: 494c71e05c82ad29f7f47f9576948e6392ddf077 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/* cs89x0.c: A Crystal Semiconductor (Now Cirrus Logic) CS89[02]0
2 * driver for linux.
3 */
4
5/*
6 Written 1996 by Russell Nelson, with reference to skeleton.c
7 written 1993-1994 by Donald Becker.
8
9 This software may be used and distributed according to the terms
10 of the GNU General Public License, incorporated herein by reference.
11
12 The author may be reached at nelson@crynwr.com, Crynwr
13 Software, 521 Pleasant Valley Rd., Potsdam, NY 13676
14
15 Changelog:
16
17 Mike Cruse : mcruse@cti-ltd.com
18 : Changes for Linux 2.0 compatibility.
19 : Added dev_id parameter in net_interrupt(),
20 : request_irq() and free_irq(). Just NULL for now.
21
22 Mike Cruse : Added MOD_INC_USE_COUNT and MOD_DEC_USE_COUNT macros
23 : in net_open() and net_close() so kerneld would know
24 : that the module is in use and wouldn't eject the
25 : driver prematurely.
26
27 Mike Cruse : Rewrote init_module() and cleanup_module using 8390.c
28 : as an example. Disabled autoprobing in init_module(),
29 : not a good thing to do to other devices while Linux
30 : is running from all accounts.
31
32 Russ Nelson : Jul 13 1998. Added RxOnly DMA support.
33
34 Melody Lee : Aug 10 1999. Changes for Linux 2.2.5 compatibility.
35 : email: ethernet@crystal.cirrus.com
36
37 Alan Cox : Removed 1.2 support, added 2.1 extra counters.
38
39 Andrew Morton : andrewm@uow.edu.au
40 : Kernel 2.3.48
41 : Handle kmalloc() failures
42 : Other resource allocation fixes
43 : Add SMP locks
44 : Integrate Russ Nelson's ALLOW_DMA functionality back in.
45 : If ALLOW_DMA is true, make DMA runtime selectable
46 : Folded in changes from Cirrus (Melody Lee
47 : <klee@crystal.cirrus.com>)
48 : Don't call netif_wake_queue() in net_send_packet()
49 : Fixed an out-of-mem bug in dma_rx()
50 : Updated Documentation/networking/cs89x0.txt
51
52 Andrew Morton : andrewm@uow.edu.au / Kernel 2.3.99-pre1
53 : Use skb_reserve to longword align IP header (two places)
54 : Remove a delay loop from dma_rx()
55 : Replace '100' with HZ
56 : Clean up a couple of skb API abuses
57 : Added 'cs89x0_dma=N' kernel boot option
58 : Correctly initialise lp->lock in non-module compile
59
60 Andrew Morton : andrewm@uow.edu.au / Kernel 2.3.99-pre4-1
61 : MOD_INC/DEC race fix (see
62 : http://www.uwsg.indiana.edu/hypermail/linux/kernel/0003.3/1532.html)
63
64 Andrew Morton : andrewm@uow.edu.au / Kernel 2.4.0-test7-pre2
65 : Enhanced EEPROM support to cover more devices,
66 : abstracted IRQ mapping to support CONFIG_ARCH_CLPS7500 arch
67 : (Jason Gunthorpe <jgg@ualberta.ca>)
68
69 Andrew Morton : Kernel 2.4.0-test11-pre4
70 : Use dev->name in request_*() (Andrey Panin)
71 : Fix an error-path memleak in init_module()
72 : Preserve return value from request_irq()
73 : Fix type of `media' module parm (Keith Owens)
74 : Use SET_MODULE_OWNER()
75 : Tidied up strange request_irq() abuse in net_open().
76
77 Andrew Morton : Kernel 2.4.3-pre1
78 : Request correct number of pages for DMA (Hugh Dickens)
79 : Select PP_ChipID _after_ unregister_netdev in cleanup_module()
80 : because unregister_netdev() calls get_stats.
81 : Make `version[]' __initdata
82 : Uninlined the read/write reg/word functions.
83
84 Oskar Schirmer : oskar@scara.com
85 : HiCO.SH4 (superh) support added (irq#1, cs89x0_media=)
86
87 Deepak Saxena : dsaxena@plexity.net
88 : Intel IXDP2x01 (XScale ixp2x00 NPU) platform support
89
Lennert Buytenhek032874e2006-01-14 13:21:15 -080090 Dmitry Pervushin : dpervushin@ru.mvista.com
91 : PNX010X platform support
92
Linus Torvalds1da177e2005-04-16 15:20:36 -070093*/
94
95/* Always include 'config.h' first in case the user wants to turn on
96 or override something. */
97#include <linux/config.h>
98#include <linux/module.h>
99
100/*
101 * Set this to zero to disable DMA code
102 *
103 * Note that even if DMA is turned off we still support the 'dma' and 'use_dma'
104 * module options so we don't break any startup scripts.
105 */
Lennert Buytenhek91e1c462006-01-11 12:17:34 -0800106#ifndef CONFIG_ISA_DMA_API
Linus Torvalds1da177e2005-04-16 15:20:36 -0700107#define ALLOW_DMA 0
108#else
109#define ALLOW_DMA 1
110#endif
111
112/*
113 * Set this to zero to remove all the debug statements via
114 * dead code elimination
115 */
116#define DEBUGGING 1
117
118/*
119 Sources:
120
121 Crynwr packet driver epktisa.
122
123 Crystal Semiconductor data sheets.
124
125*/
126
127#include <linux/errno.h>
128#include <linux/netdevice.h>
129#include <linux/etherdevice.h>
130#include <linux/kernel.h>
131#include <linux/types.h>
132#include <linux/fcntl.h>
133#include <linux/interrupt.h>
134#include <linux/ioport.h>
135#include <linux/in.h>
136#include <linux/skbuff.h>
137#include <linux/slab.h>
138#include <linux/spinlock.h>
139#include <linux/string.h>
140#include <linux/init.h>
141#include <linux/bitops.h>
142#include <linux/delay.h>
143
144#include <asm/system.h>
145#include <asm/io.h>
Al Viro7625d482005-09-26 05:25:59 +0100146#include <asm/irq.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700147#if ALLOW_DMA
148#include <asm/dma.h>
149#endif
150
151#include "cs89x0.h"
152
153static char version[] __initdata =
154"cs89x0.c: v2.4.3-pre1 Russell Nelson <nelson@crynwr.com>, Andrew Morton <andrewm@uow.edu.au>\n";
155
156#define DRV_NAME "cs89x0"
157
158/* First, a few definitions that the brave might change.
159 A zero-terminated list of I/O addresses to be probed. Some special flags..
160 Addr & 1 = Read back the address port, look for signature and reset
161 the page window before probing
162 Addr & 3 = Reset the page window and probe
163 The CLPS eval board has the Cirrus chip at 0x80090300, in ARM IO space,
164 but it is possible that a Cirrus board could be plugged into the ISA
165 slots. */
166/* The cs8900 has 4 IRQ pins, software selectable. cs8900_irq_map maps
167 them to system IRQ numbers. This mapping is card specific and is set to
168 the configuration of the Cirrus Eval board for this chip. */
169#ifdef CONFIG_ARCH_CLPS7500
170static unsigned int netcard_portlist[] __initdata =
171 { 0x80090303, 0x300, 0x320, 0x340, 0x360, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x2e0, 0};
172static unsigned int cs8900_irq_map[] = {12,0,0,0};
173#elif defined(CONFIG_SH_HICOSH4)
174static unsigned int netcard_portlist[] __initdata =
175 { 0x0300, 0};
176static unsigned int cs8900_irq_map[] = {1,0,0,0};
177#elif defined(CONFIG_ARCH_IXDP2X01)
178#include <asm/irq.h>
179static unsigned int netcard_portlist[] __initdata = {IXDP2X01_CS8900_VIRT_BASE, 0};
180static unsigned int cs8900_irq_map[] = {IRQ_IXDP2X01_CS8900, 0, 0, 0};
Lennert Buytenhek277cb102006-01-08 01:01:14 -0800181#elif defined(CONFIG_ARCH_PNX010X)
dmitry pervushin0dd3c782005-06-20 15:32:54 -0700182#include <asm/irq.h>
183#include <asm/arch/gpio.h>
184#define CIRRUS_DEFAULT_BASE IO_ADDRESS(EXT_STATIC2_s0_BASE + 0x200000) /* = Physical address 0x48200000 */
185#define CIRRUS_DEFAULT_IRQ VH_INTC_INT_NUM_CASCADED_INTERRUPT_1 /* Event inputs bank 1 - ID 35/bit 3 */
186static unsigned int netcard_portlist[] __initdata = {CIRRUS_DEFAULT_BASE, 0};
187static unsigned int cs8900_irq_map[] = {CIRRUS_DEFAULT_IRQ, 0, 0, 0};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700188#else
189static unsigned int netcard_portlist[] __initdata =
190 { 0x300, 0x320, 0x340, 0x360, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x2e0, 0};
191static unsigned int cs8900_irq_map[] = {10,11,12,5};
192#endif
193
194#if DEBUGGING
195static unsigned int net_debug = DEBUGGING;
196#else
197#define net_debug 0 /* gcc will remove all the debug code for us */
198#endif
199
200/* The number of low I/O ports used by the ethercard. */
201#define NETCARD_IO_EXTENT 16
202
203/* we allow the user to override various values normally set in the EEPROM */
204#define FORCE_RJ45 0x0001 /* pick one of these three */
205#define FORCE_AUI 0x0002
206#define FORCE_BNC 0x0004
207
208#define FORCE_AUTO 0x0010 /* pick one of these three */
209#define FORCE_HALF 0x0020
210#define FORCE_FULL 0x0030
211
212/* Information that need to be kept for each board. */
213struct net_local {
214 struct net_device_stats stats;
215 int chip_type; /* one of: CS8900, CS8920, CS8920M */
216 char chip_revision; /* revision letter of the chip ('A'...) */
217 int send_cmd; /* the proper send command: TX_NOW, TX_AFTER_381, or TX_AFTER_ALL */
218 int auto_neg_cnf; /* auto-negotiation word from EEPROM */
219 int adapter_cnf; /* adapter configuration from EEPROM */
220 int isa_config; /* ISA configuration from EEPROM */
221 int irq_map; /* IRQ map from EEPROM */
222 int rx_mode; /* what mode are we in? 0, RX_MULTCAST_ACCEPT, or RX_ALL_ACCEPT */
223 int curr_rx_cfg; /* a copy of PP_RxCFG */
224 int linectl; /* either 0 or LOW_RX_SQUELCH, depending on configuration. */
225 int send_underrun; /* keep track of how many underruns in a row we get */
226 int force; /* force various values; see FORCE* above. */
227 spinlock_t lock;
228#if ALLOW_DMA
229 int use_dma; /* Flag: we're using dma */
230 int dma; /* DMA channel */
231 int dmasize; /* 16 or 64 */
232 unsigned char *dma_buff; /* points to the beginning of the buffer */
233 unsigned char *end_dma_buff; /* points to the end of the buffer */
234 unsigned char *rx_dma_ptr; /* points to the next packet */
235#endif
236};
237
238/* Index to functions, as function prototypes. */
239
240static int cs89x0_probe1(struct net_device *dev, int ioaddr, int modular);
241static int net_open(struct net_device *dev);
242static int net_send_packet(struct sk_buff *skb, struct net_device *dev);
243static irqreturn_t net_interrupt(int irq, void *dev_id, struct pt_regs *regs);
244static void set_multicast_list(struct net_device *dev);
245static void net_timeout(struct net_device *dev);
246static void net_rx(struct net_device *dev);
247static int net_close(struct net_device *dev);
248static struct net_device_stats *net_get_stats(struct net_device *dev);
249static void reset_chip(struct net_device *dev);
250static int get_eeprom_data(struct net_device *dev, int off, int len, int *buffer);
251static int get_eeprom_cksum(int off, int len, int *buffer);
252static int set_mac_address(struct net_device *dev, void *addr);
253static void count_rx_errors(int status, struct net_local *lp);
Deepak Saxena6f519162005-09-09 13:02:07 -0700254#ifdef CONFIG_NET_POLL_CONTROLLER
255static void net_poll_controller(struct net_device *dev);
256#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700257#if ALLOW_DMA
258static void get_dma_channel(struct net_device *dev);
259static void release_dma_buff(struct net_local *lp);
260#endif
261
262/* Example routines you must write ;->. */
263#define tx_done(dev) 1
264
265/*
266 * Permit 'cs89x0_dma=N' in the kernel boot environment
267 */
268#if !defined(MODULE) && (ALLOW_DMA != 0)
269static int g_cs89x0_dma;
270
271static int __init dma_fn(char *str)
272{
273 g_cs89x0_dma = simple_strtol(str,NULL,0);
274 return 1;
275}
276
277__setup("cs89x0_dma=", dma_fn);
278#endif /* !defined(MODULE) && (ALLOW_DMA != 0) */
279
280#ifndef MODULE
281static int g_cs89x0_media__force;
282
283static int __init media_fn(char *str)
284{
285 if (!strcmp(str, "rj45")) g_cs89x0_media__force = FORCE_RJ45;
286 else if (!strcmp(str, "aui")) g_cs89x0_media__force = FORCE_AUI;
287 else if (!strcmp(str, "bnc")) g_cs89x0_media__force = FORCE_BNC;
288 return 1;
289}
290
291__setup("cs89x0_media=", media_fn);
292
293
294/* Check for a network adaptor of this type, and return '0' iff one exists.
295 If dev->base_addr == 0, probe all likely locations.
296 If dev->base_addr == 1, always return failure.
297 If dev->base_addr == 2, allocate space for the device and return success
298 (detachable devices only).
299 Return 0 on success.
300 */
301
302struct net_device * __init cs89x0_probe(int unit)
303{
304 struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
305 unsigned *port;
306 int err = 0;
307 int irq;
308 int io;
309
310 if (!dev)
311 return ERR_PTR(-ENODEV);
312
313 sprintf(dev->name, "eth%d", unit);
314 netdev_boot_setup_check(dev);
315 io = dev->base_addr;
316 irq = dev->irq;
317
318 if (net_debug)
319 printk("cs89x0:cs89x0_probe(0x%x)\n", io);
320
321 if (io > 0x1ff) { /* Check a single specified location. */
322 err = cs89x0_probe1(dev, io, 0);
323 } else if (io != 0) { /* Don't probe at all. */
324 err = -ENXIO;
325 } else {
326 for (port = netcard_portlist; *port; port++) {
327 if (cs89x0_probe1(dev, *port, 0) == 0)
328 break;
329 dev->irq = irq;
330 }
331 if (!*port)
332 err = -ENODEV;
333 }
334 if (err)
335 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700336 return dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700337out:
338 free_netdev(dev);
339 printk(KERN_WARNING "cs89x0: no cs8900 or cs8920 detected. Be sure to disable PnP with SETUP\n");
340 return ERR_PTR(err);
341}
342#endif
343
Lennert Buytenhek3b68d702006-01-08 01:01:11 -0800344#if defined(CONFIG_ARCH_IXDP2X01)
345static int
346readword(unsigned long base_addr, int portno)
347{
348 return (u16)__raw_readl(base_addr + (portno << 1));
349}
350
351static void
352writeword(unsigned long base_addr, int portno, int value)
353{
354 __raw_writel((u16)value, base_addr + (portno << 1));
355}
356#else
Lennert Buytenhek277cb102006-01-08 01:01:14 -0800357#if defined(CONFIG_ARCH_PNX010X)
Lennert Buytenhek3b68d702006-01-08 01:01:11 -0800358static int
359readword(unsigned long base_addr, int portno)
360{
361 return inw(base_addr + (portno << 1));
362}
363
364static void
365writeword(unsigned long base_addr, int portno, int value)
366{
367 outw(value, base_addr + (portno << 1));
368}
369#else
Linus Torvalds1da177e2005-04-16 15:20:36 -0700370static int
Lennert Buytenhek0d5affc2006-01-08 01:01:09 -0800371readword(unsigned long base_addr, int portno)
372{
373 return inw(base_addr + portno);
374}
375
376static void
377writeword(unsigned long base_addr, int portno, int value)
378{
379 outw(value, base_addr + portno);
380}
Lennert Buytenhek3b68d702006-01-08 01:01:11 -0800381#endif
382#endif
Lennert Buytenhek0d5affc2006-01-08 01:01:09 -0800383
Lennert Buytenhek084f7462006-01-08 01:01:12 -0800384static void
385readwords(unsigned long base_addr, int portno, void *buf, int length)
386{
387 u8 *buf8 = (u8 *)buf;
388
389 do {
390 u32 tmp32;
391
392 tmp32 = readword(base_addr, portno);
393 *buf8++ = (u8)tmp32;
394 *buf8++ = (u8)(tmp32 >> 8);
395 } while (--length);
396}
397
398static void
399writewords(unsigned long base_addr, int portno, void *buf, int length)
400{
401 u8 *buf8 = (u8 *)buf;
402
403 do {
404 u32 tmp32;
405
406 tmp32 = *buf8++;
407 tmp32 |= (*buf8++) << 8;
408 writeword(base_addr, portno, tmp32);
409 } while (--length);
410}
411
Lennert Buytenhek0d5affc2006-01-08 01:01:09 -0800412static int
Lennert Buytenhek3eaa5e72006-01-08 01:01:10 -0800413readreg(struct net_device *dev, int regno)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700414{
Lennert Buytenhek3eaa5e72006-01-08 01:01:10 -0800415 writeword(dev->base_addr, ADD_PORT, regno);
416 return readword(dev->base_addr, DATA_PORT);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700417}
418
419static void
Lennert Buytenhek3eaa5e72006-01-08 01:01:10 -0800420writereg(struct net_device *dev, int regno, int value)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700421{
Lennert Buytenhek3eaa5e72006-01-08 01:01:10 -0800422 writeword(dev->base_addr, ADD_PORT, regno);
423 writeword(dev->base_addr, DATA_PORT, value);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700424}
425
Linus Torvalds1da177e2005-04-16 15:20:36 -0700426static int __init
427wait_eeprom_ready(struct net_device *dev)
428{
429 int timeout = jiffies;
430 /* check to see if the EEPROM is ready, a timeout is used -
431 just in case EEPROM is ready when SI_BUSY in the
432 PP_SelfST is clear */
433 while(readreg(dev, PP_SelfST) & SI_BUSY)
434 if (jiffies - timeout >= 40)
435 return -1;
436 return 0;
437}
438
439static int __init
440get_eeprom_data(struct net_device *dev, int off, int len, int *buffer)
441{
442 int i;
443
444 if (net_debug > 3) printk("EEPROM data from %x for %x:\n",off,len);
445 for (i = 0; i < len; i++) {
446 if (wait_eeprom_ready(dev) < 0) return -1;
447 /* Now send the EEPROM read command and EEPROM location to read */
448 writereg(dev, PP_EECMD, (off + i) | EEPROM_READ_CMD);
449 if (wait_eeprom_ready(dev) < 0) return -1;
450 buffer[i] = readreg(dev, PP_EEData);
451 if (net_debug > 3) printk("%04x ", buffer[i]);
452 }
453 if (net_debug > 3) printk("\n");
454 return 0;
455}
456
457static int __init
458get_eeprom_cksum(int off, int len, int *buffer)
459{
460 int i, cksum;
461
462 cksum = 0;
463 for (i = 0; i < len; i++)
464 cksum += buffer[i];
465 cksum &= 0xffff;
466 if (cksum == 0)
467 return 0;
468 return -1;
469}
470
Deepak Saxena6f519162005-09-09 13:02:07 -0700471#ifdef CONFIG_NET_POLL_CONTROLLER
472/*
473 * Polling receive - used by netconsole and other diagnostic tools
474 * to allow network i/o with interrupts disabled.
475 */
476static void net_poll_controller(struct net_device *dev)
477{
478 disable_irq(dev->irq);
479 net_interrupt(dev->irq, dev, NULL);
480 enable_irq(dev->irq);
481}
482#endif
483
Linus Torvalds1da177e2005-04-16 15:20:36 -0700484/* This is the real probe routine. Linux has a history of friendly device
485 probes on the ISA bus. A good device probes avoids doing writes, and
486 verifies that the correct device exists and functions.
487 Return 0 on success.
488 */
489
490static int __init
491cs89x0_probe1(struct net_device *dev, int ioaddr, int modular)
492{
493 struct net_local *lp = netdev_priv(dev);
494 static unsigned version_printed;
495 int i;
Denis Vlasenko01bdc032005-07-31 22:34:50 -0700496 int tmp;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700497 unsigned rev_type = 0;
498 int eeprom_buff[CHKSUM_LEN];
499 int retval;
500
501 SET_MODULE_OWNER(dev);
502 /* Initialize the device structure. */
503 if (!modular) {
504 memset(lp, 0, sizeof(*lp));
505 spin_lock_init(&lp->lock);
506#ifndef MODULE
507#if ALLOW_DMA
508 if (g_cs89x0_dma) {
509 lp->use_dma = 1;
510 lp->dma = g_cs89x0_dma;
511 lp->dmasize = 16; /* Could make this an option... */
512 }
513#endif
514 lp->force = g_cs89x0_media__force;
515#endif
516 }
517
Lennert Buytenhek277cb102006-01-08 01:01:14 -0800518#ifdef CONFIG_ARCH_PNX010X
dmitry pervushin0dd3c782005-06-20 15:32:54 -0700519 initialize_ebi();
520
521 /* Map GPIO registers for the pins connected to the CS8900a. */
522 if (map_cirrus_gpio() < 0)
523 return -ENODEV;
524
525 reset_cirrus();
526
527 /* Map event-router registers. */
528 if (map_event_router() < 0)
529 return -ENODEV;
530
531 enable_cirrus_irq();
532
533 unmap_cirrus_gpio();
534 unmap_event_router();
535
536 dev->base_addr = ioaddr;
537
538 for (i = 0 ; i < 3 ; i++)
539 readreg(dev, 0);
540#endif
541
Linus Torvalds1da177e2005-04-16 15:20:36 -0700542 /* Grab the region so we can find another board if autoIRQ fails. */
543 /* WTF is going on here? */
544 if (!request_region(ioaddr & ~3, NETCARD_IO_EXTENT, DRV_NAME)) {
545 printk(KERN_ERR "%s: request_region(0x%x, 0x%x) failed\n",
546 DRV_NAME, ioaddr, NETCARD_IO_EXTENT);
547 retval = -EBUSY;
548 goto out1;
549 }
550
551#ifdef CONFIG_SH_HICOSH4
552 /* truely reset the chip */
Lennert Buytenhekfc8c7d72006-01-08 01:01:08 -0800553 writeword(ioaddr, ADD_PORT, 0x0114);
554 writeword(ioaddr, DATA_PORT, 0x0040);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700555#endif
556
557 /* if they give us an odd I/O address, then do ONE write to
558 the address port, to get it back to address zero, where we
559 expect to find the EISA signature word. An IO with a base of 0x3
560 will skip the test for the ADD_PORT. */
561 if (ioaddr & 1) {
562 if (net_debug > 1)
563 printk(KERN_INFO "%s: odd ioaddr 0x%x\n", dev->name, ioaddr);
564 if ((ioaddr & 2) != 2)
Lennert Buytenhekfc8c7d72006-01-08 01:01:08 -0800565 if ((readword(ioaddr & ~3, ADD_PORT) & ADD_MASK) != ADD_SIG) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700566 printk(KERN_ERR "%s: bad signature 0x%x\n",
Lennert Buytenhekfc8c7d72006-01-08 01:01:08 -0800567 dev->name, readword(ioaddr & ~3, ADD_PORT));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700568 retval = -ENODEV;
569 goto out2;
570 }
571 }
Lennert Buytenhekfc8c7d72006-01-08 01:01:08 -0800572 printk(KERN_DEBUG "PP_addr at %x[%x]: 0x%x\n",
573 ioaddr, ADD_PORT, readword(ioaddr, ADD_PORT));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700574
575 ioaddr &= ~3;
Lennert Buytenhekfc8c7d72006-01-08 01:01:08 -0800576 writeword(ioaddr, ADD_PORT, PP_ChipID);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700577
Lennert Buytenhekfc8c7d72006-01-08 01:01:08 -0800578 tmp = readword(ioaddr, DATA_PORT);
Denis Vlasenko01bdc032005-07-31 22:34:50 -0700579 if (tmp != CHIP_EISA_ID_SIG) {
Lennert Buytenhekfc8c7d72006-01-08 01:01:08 -0800580 printk(KERN_DEBUG "%s: incorrect signature at %x[%x]: 0x%x!="
Denis Vlasenko01bdc032005-07-31 22:34:50 -0700581 CHIP_EISA_ID_SIG_STR "\n",
Lennert Buytenhekfc8c7d72006-01-08 01:01:08 -0800582 dev->name, ioaddr, DATA_PORT, tmp);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700583 retval = -ENODEV;
584 goto out2;
585 }
586
587 /* Fill in the 'dev' fields. */
588 dev->base_addr = ioaddr;
589
590 /* get the chip type */
591 rev_type = readreg(dev, PRODUCT_ID_ADD);
592 lp->chip_type = rev_type &~ REVISON_BITS;
593 lp->chip_revision = ((rev_type & REVISON_BITS) >> 8) + 'A';
594
595 /* Check the chip type and revision in order to set the correct send command
596 CS8920 revision C and CS8900 revision F can use the faster send. */
597 lp->send_cmd = TX_AFTER_381;
598 if (lp->chip_type == CS8900 && lp->chip_revision >= 'F')
599 lp->send_cmd = TX_NOW;
600 if (lp->chip_type != CS8900 && lp->chip_revision >= 'C')
601 lp->send_cmd = TX_NOW;
602
603 if (net_debug && version_printed++ == 0)
604 printk(version);
605
606 printk(KERN_INFO "%s: cs89%c0%s rev %c found at %#3lx ",
607 dev->name,
608 lp->chip_type==CS8900?'0':'2',
609 lp->chip_type==CS8920M?"M":"",
610 lp->chip_revision,
611 dev->base_addr);
612
613 reset_chip(dev);
614
615 /* Here we read the current configuration of the chip. If there
616 is no Extended EEPROM then the idea is to not disturb the chip
617 configuration, it should have been correctly setup by automatic
618 EEPROM read on reset. So, if the chip says it read the EEPROM
619 the driver will always do *something* instead of complain that
620 adapter_cnf is 0. */
621
622#ifdef CONFIG_SH_HICOSH4
623 if (1) {
624 /* For the HiCO.SH4 board, things are different: we don't
625 have EEPROM, but there is some data in flash, so we go
626 get it there directly (MAC). */
627 __u16 *confd;
628 short cnt;
629 if (((* (volatile __u32 *) 0xa0013ff0) & 0x00ffffff)
630 == 0x006c3000) {
631 confd = (__u16*) 0xa0013fc0;
632 } else {
633 confd = (__u16*) 0xa001ffc0;
634 }
635 cnt = (*confd++ & 0x00ff) >> 1;
636 while (--cnt > 0) {
637 __u16 j = *confd++;
638
639 switch (j & 0x0fff) {
640 case PP_IA:
641 for (i = 0; i < ETH_ALEN/2; i++) {
642 dev->dev_addr[i*2] = confd[i] & 0xFF;
643 dev->dev_addr[i*2+1] = confd[i] >> 8;
644 }
645 break;
646 }
647 j = (j >> 12) + 1;
648 confd += j;
649 cnt -= j;
650 }
651 } else
652#endif
653
654 if ((readreg(dev, PP_SelfST) & (EEPROM_OK | EEPROM_PRESENT)) ==
655 (EEPROM_OK|EEPROM_PRESENT)) {
656 /* Load the MAC. */
657 for (i=0; i < ETH_ALEN/2; i++) {
658 unsigned int Addr;
659 Addr = readreg(dev, PP_IA+i*2);
660 dev->dev_addr[i*2] = Addr & 0xFF;
661 dev->dev_addr[i*2+1] = Addr >> 8;
662 }
663
664 /* Load the Adapter Configuration.
665 Note: Barring any more specific information from some
666 other source (ie EEPROM+Schematics), we would not know
667 how to operate a 10Base2 interface on the AUI port.
668 However, since we do read the status of HCB1 and use
669 settings that always result in calls to control_dc_dc(dev,0)
670 a BNC interface should work if the enable pin
671 (dc/dc converter) is on HCB1. It will be called AUI
672 however. */
673
674 lp->adapter_cnf = 0;
675 i = readreg(dev, PP_LineCTL);
676 /* Preserve the setting of the HCB1 pin. */
677 if ((i & (HCB1 | HCB1_ENBL)) == (HCB1 | HCB1_ENBL))
678 lp->adapter_cnf |= A_CNF_DC_DC_POLARITY;
679 /* Save the sqelch bit */
680 if ((i & LOW_RX_SQUELCH) == LOW_RX_SQUELCH)
681 lp->adapter_cnf |= A_CNF_EXTND_10B_2 | A_CNF_LOW_RX_SQUELCH;
682 /* Check if the card is in 10Base-t only mode */
683 if ((i & (AUI_ONLY | AUTO_AUI_10BASET)) == 0)
684 lp->adapter_cnf |= A_CNF_10B_T | A_CNF_MEDIA_10B_T;
685 /* Check if the card is in AUI only mode */
686 if ((i & (AUI_ONLY | AUTO_AUI_10BASET)) == AUI_ONLY)
687 lp->adapter_cnf |= A_CNF_AUI | A_CNF_MEDIA_AUI;
688 /* Check if the card is in Auto mode. */
689 if ((i & (AUI_ONLY | AUTO_AUI_10BASET)) == AUTO_AUI_10BASET)
690 lp->adapter_cnf |= A_CNF_AUI | A_CNF_10B_T |
691 A_CNF_MEDIA_AUI | A_CNF_MEDIA_10B_T | A_CNF_MEDIA_AUTO;
692
693 if (net_debug > 1)
694 printk(KERN_INFO "%s: PP_LineCTL=0x%x, adapter_cnf=0x%x\n",
695 dev->name, i, lp->adapter_cnf);
696
697 /* IRQ. Other chips already probe, see below. */
698 if (lp->chip_type == CS8900)
699 lp->isa_config = readreg(dev, PP_CS8900_ISAINT) & INT_NO_MASK;
700
701 printk( "[Cirrus EEPROM] ");
702 }
703
704 printk("\n");
705
706 /* First check to see if an EEPROM is attached. */
707#ifdef CONFIG_SH_HICOSH4 /* no EEPROM on HiCO, don't hazzle with it here */
708 if (1) {
709 printk(KERN_NOTICE "cs89x0: No EEPROM on HiCO.SH4\n");
710 } else
711#endif
712 if ((readreg(dev, PP_SelfST) & EEPROM_PRESENT) == 0)
713 printk(KERN_WARNING "cs89x0: No EEPROM, relying on command line....\n");
714 else if (get_eeprom_data(dev, START_EEPROM_DATA,CHKSUM_LEN,eeprom_buff) < 0) {
715 printk(KERN_WARNING "\ncs89x0: EEPROM read failed, relying on command line.\n");
716 } else if (get_eeprom_cksum(START_EEPROM_DATA,CHKSUM_LEN,eeprom_buff) < 0) {
717 /* Check if the chip was able to read its own configuration starting
718 at 0 in the EEPROM*/
719 if ((readreg(dev, PP_SelfST) & (EEPROM_OK | EEPROM_PRESENT)) !=
720 (EEPROM_OK|EEPROM_PRESENT))
721 printk(KERN_WARNING "cs89x0: Extended EEPROM checksum bad and no Cirrus EEPROM, relying on command line\n");
722
723 } else {
724 /* This reads an extended EEPROM that is not documented
725 in the CS8900 datasheet. */
726
727 /* get transmission control word but keep the autonegotiation bits */
728 if (!lp->auto_neg_cnf) lp->auto_neg_cnf = eeprom_buff[AUTO_NEG_CNF_OFFSET/2];
729 /* Store adapter configuration */
730 if (!lp->adapter_cnf) lp->adapter_cnf = eeprom_buff[ADAPTER_CNF_OFFSET/2];
731 /* Store ISA configuration */
732 lp->isa_config = eeprom_buff[ISA_CNF_OFFSET/2];
733 dev->mem_start = eeprom_buff[PACKET_PAGE_OFFSET/2] << 8;
734
735 /* eeprom_buff has 32-bit ints, so we can't just memcpy it */
736 /* store the initial memory base address */
737 for (i = 0; i < ETH_ALEN/2; i++) {
738 dev->dev_addr[i*2] = eeprom_buff[i];
739 dev->dev_addr[i*2+1] = eeprom_buff[i] >> 8;
740 }
741 if (net_debug > 1)
742 printk(KERN_DEBUG "%s: new adapter_cnf: 0x%x\n",
743 dev->name, lp->adapter_cnf);
744 }
745
746 /* allow them to force multiple transceivers. If they force multiple, autosense */
747 {
748 int count = 0;
749 if (lp->force & FORCE_RJ45) {lp->adapter_cnf |= A_CNF_10B_T; count++; }
750 if (lp->force & FORCE_AUI) {lp->adapter_cnf |= A_CNF_AUI; count++; }
751 if (lp->force & FORCE_BNC) {lp->adapter_cnf |= A_CNF_10B_2; count++; }
752 if (count > 1) {lp->adapter_cnf |= A_CNF_MEDIA_AUTO; }
753 else if (lp->force & FORCE_RJ45){lp->adapter_cnf |= A_CNF_MEDIA_10B_T; }
754 else if (lp->force & FORCE_AUI) {lp->adapter_cnf |= A_CNF_MEDIA_AUI; }
755 else if (lp->force & FORCE_BNC) {lp->adapter_cnf |= A_CNF_MEDIA_10B_2; }
756 }
757
758 if (net_debug > 1)
759 printk(KERN_DEBUG "%s: after force 0x%x, adapter_cnf=0x%x\n",
760 dev->name, lp->force, lp->adapter_cnf);
761
762 /* FIXME: We don't let you set dc-dc polarity or low RX squelch from the command line: add it here */
763
764 /* FIXME: We don't let you set the IMM bit from the command line: add it to lp->auto_neg_cnf here */
765
766 /* FIXME: we don't set the Ethernet address on the command line. Use
767 ifconfig IFACE hw ether AABBCCDDEEFF */
768
769 printk(KERN_INFO "cs89x0 media %s%s%s",
770 (lp->adapter_cnf & A_CNF_10B_T)?"RJ-45,":"",
771 (lp->adapter_cnf & A_CNF_AUI)?"AUI,":"",
772 (lp->adapter_cnf & A_CNF_10B_2)?"BNC,":"");
773
774 lp->irq_map = 0xffff;
775
776 /* If this is a CS8900 then no pnp soft */
777 if (lp->chip_type != CS8900 &&
778 /* Check if the ISA IRQ has been set */
779 (i = readreg(dev, PP_CS8920_ISAINT) & 0xff,
780 (i != 0 && i < CS8920_NO_INTS))) {
781 if (!dev->irq)
782 dev->irq = i;
783 } else {
784 i = lp->isa_config & INT_NO_MASK;
785 if (lp->chip_type == CS8900) {
Lennert Buytenhek277cb102006-01-08 01:01:14 -0800786#if defined(CONFIG_ARCH_IXDP2X01) || defined(CONFIG_ARCH_PNX010X)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700787 i = cs8900_irq_map[0];
788#else
789 /* Translate the IRQ using the IRQ mapping table. */
790 if (i >= sizeof(cs8900_irq_map)/sizeof(cs8900_irq_map[0]))
791 printk("\ncs89x0: invalid ISA interrupt number %d\n", i);
792 else
793 i = cs8900_irq_map[i];
794
795 lp->irq_map = CS8900_IRQ_MAP; /* fixed IRQ map for CS8900 */
796 } else {
797 int irq_map_buff[IRQ_MAP_LEN/2];
798
799 if (get_eeprom_data(dev, IRQ_MAP_EEPROM_DATA,
800 IRQ_MAP_LEN/2,
801 irq_map_buff) >= 0) {
802 if ((irq_map_buff[0] & 0xff) == PNP_IRQ_FRMT)
803 lp->irq_map = (irq_map_buff[0]>>8) | (irq_map_buff[1] << 8);
804 }
805#endif
806 }
807 if (!dev->irq)
808 dev->irq = i;
809 }
810
811 printk(" IRQ %d", dev->irq);
812
813#if ALLOW_DMA
814 if (lp->use_dma) {
815 get_dma_channel(dev);
816 printk(", DMA %d", dev->dma);
817 }
818 else
819#endif
820 {
821 printk(", programmed I/O");
822 }
823
824 /* print the ethernet address. */
825 printk(", MAC");
826 for (i = 0; i < ETH_ALEN; i++)
827 {
828 printk("%c%02x", i ? ':' : ' ', dev->dev_addr[i]);
829 }
830
831 dev->open = net_open;
832 dev->stop = net_close;
833 dev->tx_timeout = net_timeout;
834 dev->watchdog_timeo = HZ;
835 dev->hard_start_xmit = net_send_packet;
836 dev->get_stats = net_get_stats;
837 dev->set_multicast_list = set_multicast_list;
838 dev->set_mac_address = set_mac_address;
Deepak Saxena6f519162005-09-09 13:02:07 -0700839#ifdef CONFIG_NET_POLL_CONTROLLER
840 dev->poll_controller = net_poll_controller;
841#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700842
843 printk("\n");
844 if (net_debug)
845 printk("cs89x0_probe1() successful\n");
b1fc5502005-05-12 20:11:55 -0400846
847 retval = register_netdev(dev);
848 if (retval)
849 goto out3;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700850 return 0;
b1fc5502005-05-12 20:11:55 -0400851out3:
Lennert Buytenhekfc8c7d72006-01-08 01:01:08 -0800852 writeword(dev->base_addr, ADD_PORT, PP_ChipID);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700853out2:
854 release_region(ioaddr & ~3, NETCARD_IO_EXTENT);
855out1:
856 return retval;
857}
858
859
860/*********************************
861 * This page contains DMA routines
862**********************************/
863
864#if ALLOW_DMA
865
866#define dma_page_eq(ptr1, ptr2) ((long)(ptr1)>>17 == (long)(ptr2)>>17)
867
868static void
869get_dma_channel(struct net_device *dev)
870{
871 struct net_local *lp = netdev_priv(dev);
872
873 if (lp->dma) {
874 dev->dma = lp->dma;
875 lp->isa_config |= ISA_RxDMA;
876 } else {
877 if ((lp->isa_config & ANY_ISA_DMA) == 0)
878 return;
879 dev->dma = lp->isa_config & DMA_NO_MASK;
880 if (lp->chip_type == CS8900)
881 dev->dma += 5;
882 if (dev->dma < 5 || dev->dma > 7) {
883 lp->isa_config &= ~ANY_ISA_DMA;
884 return;
885 }
886 }
887 return;
888}
889
890static void
891write_dma(struct net_device *dev, int chip_type, int dma)
892{
893 struct net_local *lp = netdev_priv(dev);
894 if ((lp->isa_config & ANY_ISA_DMA) == 0)
895 return;
896 if (chip_type == CS8900) {
897 writereg(dev, PP_CS8900_ISADMA, dma-5);
898 } else {
899 writereg(dev, PP_CS8920_ISADMA, dma);
900 }
901}
902
903static void
904set_dma_cfg(struct net_device *dev)
905{
906 struct net_local *lp = netdev_priv(dev);
907
908 if (lp->use_dma) {
909 if ((lp->isa_config & ANY_ISA_DMA) == 0) {
910 if (net_debug > 3)
911 printk("set_dma_cfg(): no DMA\n");
912 return;
913 }
914 if (lp->isa_config & ISA_RxDMA) {
915 lp->curr_rx_cfg |= RX_DMA_ONLY;
916 if (net_debug > 3)
917 printk("set_dma_cfg(): RX_DMA_ONLY\n");
918 } else {
919 lp->curr_rx_cfg |= AUTO_RX_DMA; /* not that we support it... */
920 if (net_debug > 3)
921 printk("set_dma_cfg(): AUTO_RX_DMA\n");
922 }
923 }
924}
925
926static int
927dma_bufcfg(struct net_device *dev)
928{
929 struct net_local *lp = netdev_priv(dev);
930 if (lp->use_dma)
931 return (lp->isa_config & ANY_ISA_DMA)? RX_DMA_ENBL : 0;
932 else
933 return 0;
934}
935
936static int
937dma_busctl(struct net_device *dev)
938{
939 int retval = 0;
940 struct net_local *lp = netdev_priv(dev);
941 if (lp->use_dma) {
942 if (lp->isa_config & ANY_ISA_DMA)
943 retval |= RESET_RX_DMA; /* Reset the DMA pointer */
944 if (lp->isa_config & DMA_BURST)
945 retval |= DMA_BURST_MODE; /* Does ISA config specify DMA burst ? */
946 if (lp->dmasize == 64)
947 retval |= RX_DMA_SIZE_64K; /* did they ask for 64K? */
948 retval |= MEMORY_ON; /* we need memory enabled to use DMA. */
949 }
950 return retval;
951}
952
953static void
954dma_rx(struct net_device *dev)
955{
956 struct net_local *lp = netdev_priv(dev);
957 struct sk_buff *skb;
958 int status, length;
959 unsigned char *bp = lp->rx_dma_ptr;
960
961 status = bp[0] + (bp[1]<<8);
962 length = bp[2] + (bp[3]<<8);
963 bp += 4;
964 if (net_debug > 5) {
965 printk( "%s: receiving DMA packet at %lx, status %x, length %x\n",
966 dev->name, (unsigned long)bp, status, length);
967 }
968 if ((status & RX_OK) == 0) {
969 count_rx_errors(status, lp);
970 goto skip_this_frame;
971 }
972
973 /* Malloc up new buffer. */
974 skb = dev_alloc_skb(length + 2);
975 if (skb == NULL) {
976 if (net_debug) /* I don't think we want to do this to a stressed system */
977 printk("%s: Memory squeeze, dropping packet.\n", dev->name);
978 lp->stats.rx_dropped++;
979
980 /* AKPM: advance bp to the next frame */
981skip_this_frame:
982 bp += (length + 3) & ~3;
983 if (bp >= lp->end_dma_buff) bp -= lp->dmasize*1024;
984 lp->rx_dma_ptr = bp;
985 return;
986 }
987 skb_reserve(skb, 2); /* longword align L3 header */
988 skb->dev = dev;
989
990 if (bp + length > lp->end_dma_buff) {
991 int semi_cnt = lp->end_dma_buff - bp;
992 memcpy(skb_put(skb,semi_cnt), bp, semi_cnt);
993 memcpy(skb_put(skb,length - semi_cnt), lp->dma_buff,
994 length - semi_cnt);
995 } else {
996 memcpy(skb_put(skb,length), bp, length);
997 }
998 bp += (length + 3) & ~3;
999 if (bp >= lp->end_dma_buff) bp -= lp->dmasize*1024;
1000 lp->rx_dma_ptr = bp;
1001
1002 if (net_debug > 3) {
1003 printk( "%s: received %d byte DMA packet of type %x\n",
1004 dev->name, length,
1005 (skb->data[ETH_ALEN+ETH_ALEN] << 8) | skb->data[ETH_ALEN+ETH_ALEN+1]);
1006 }
1007 skb->protocol=eth_type_trans(skb,dev);
1008 netif_rx(skb);
1009 dev->last_rx = jiffies;
1010 lp->stats.rx_packets++;
1011 lp->stats.rx_bytes += length;
1012}
1013
1014#endif /* ALLOW_DMA */
1015
1016void __init reset_chip(struct net_device *dev)
1017{
1018#ifndef CONFIG_ARCH_IXDP2X01
1019 struct net_local *lp = netdev_priv(dev);
1020 int ioaddr = dev->base_addr;
1021#endif
1022 int reset_start_time;
1023
1024 writereg(dev, PP_SelfCTL, readreg(dev, PP_SelfCTL) | POWER_ON_RESET);
1025
1026 /* wait 30 ms */
1027 msleep(30);
1028
1029#ifndef CONFIG_ARCH_IXDP2X01
1030 if (lp->chip_type != CS8900) {
1031 /* Hardware problem requires PNP registers to be reconfigured after a reset */
Lennert Buytenhekfc8c7d72006-01-08 01:01:08 -08001032 writeword(ioaddr, ADD_PORT, PP_CS8920_ISAINT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001033 outb(dev->irq, ioaddr + DATA_PORT);
1034 outb(0, ioaddr + DATA_PORT + 1);
1035
Lennert Buytenhekfc8c7d72006-01-08 01:01:08 -08001036 writeword(ioaddr, ADD_PORT, PP_CS8920_ISAMemB);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001037 outb((dev->mem_start >> 16) & 0xff, ioaddr + DATA_PORT);
1038 outb((dev->mem_start >> 8) & 0xff, ioaddr + DATA_PORT + 1);
1039 }
1040#endif /* IXDP2x01 */
1041
1042 /* Wait until the chip is reset */
1043 reset_start_time = jiffies;
1044 while( (readreg(dev, PP_SelfST) & INIT_DONE) == 0 && jiffies - reset_start_time < 2)
1045 ;
1046}
1047
1048
1049static void
1050control_dc_dc(struct net_device *dev, int on_not_off)
1051{
1052 struct net_local *lp = netdev_priv(dev);
1053 unsigned int selfcontrol;
1054 int timenow = jiffies;
1055 /* control the DC to DC convertor in the SelfControl register.
1056 Note: This is hooked up to a general purpose pin, might not
1057 always be a DC to DC convertor. */
1058
1059 selfcontrol = HCB1_ENBL; /* Enable the HCB1 bit as an output */
1060 if (((lp->adapter_cnf & A_CNF_DC_DC_POLARITY) != 0) ^ on_not_off)
1061 selfcontrol |= HCB1;
1062 else
1063 selfcontrol &= ~HCB1;
1064 writereg(dev, PP_SelfCTL, selfcontrol);
1065
1066 /* Wait for the DC/DC converter to power up - 500ms */
1067 while (jiffies - timenow < HZ)
1068 ;
1069}
1070
1071#define DETECTED_NONE 0
1072#define DETECTED_RJ45H 1
1073#define DETECTED_RJ45F 2
1074#define DETECTED_AUI 3
1075#define DETECTED_BNC 4
1076
1077static int
1078detect_tp(struct net_device *dev)
1079{
1080 struct net_local *lp = netdev_priv(dev);
1081 int timenow = jiffies;
1082 int fdx;
1083
1084 if (net_debug > 1) printk("%s: Attempting TP\n", dev->name);
1085
1086 /* If connected to another full duplex capable 10-Base-T card the link pulses
1087 seem to be lost when the auto detect bit in the LineCTL is set.
1088 To overcome this the auto detect bit will be cleared whilst testing the
1089 10-Base-T interface. This would not be necessary for the sparrow chip but
1090 is simpler to do it anyway. */
1091 writereg(dev, PP_LineCTL, lp->linectl &~ AUI_ONLY);
1092 control_dc_dc(dev, 0);
1093
1094 /* Delay for the hardware to work out if the TP cable is present - 150ms */
1095 for (timenow = jiffies; jiffies - timenow < 15; )
1096 ;
1097 if ((readreg(dev, PP_LineST) & LINK_OK) == 0)
1098 return DETECTED_NONE;
1099
1100 if (lp->chip_type == CS8900) {
1101 switch (lp->force & 0xf0) {
1102#if 0
1103 case FORCE_AUTO:
1104 printk("%s: cs8900 doesn't autonegotiate\n",dev->name);
1105 return DETECTED_NONE;
1106#endif
1107 /* CS8900 doesn't support AUTO, change to HALF*/
1108 case FORCE_AUTO:
1109 lp->force &= ~FORCE_AUTO;
1110 lp->force |= FORCE_HALF;
1111 break;
1112 case FORCE_HALF:
1113 break;
1114 case FORCE_FULL:
1115 writereg(dev, PP_TestCTL, readreg(dev, PP_TestCTL) | FDX_8900);
1116 break;
1117 }
1118 fdx = readreg(dev, PP_TestCTL) & FDX_8900;
1119 } else {
1120 switch (lp->force & 0xf0) {
1121 case FORCE_AUTO:
1122 lp->auto_neg_cnf = AUTO_NEG_ENABLE;
1123 break;
1124 case FORCE_HALF:
1125 lp->auto_neg_cnf = 0;
1126 break;
1127 case FORCE_FULL:
1128 lp->auto_neg_cnf = RE_NEG_NOW | ALLOW_FDX;
1129 break;
1130 }
1131
1132 writereg(dev, PP_AutoNegCTL, lp->auto_neg_cnf & AUTO_NEG_MASK);
1133
1134 if ((lp->auto_neg_cnf & AUTO_NEG_BITS) == AUTO_NEG_ENABLE) {
1135 printk(KERN_INFO "%s: negotiating duplex...\n",dev->name);
1136 while (readreg(dev, PP_AutoNegST) & AUTO_NEG_BUSY) {
1137 if (jiffies - timenow > 4000) {
1138 printk(KERN_ERR "**** Full / half duplex auto-negotiation timed out ****\n");
1139 break;
1140 }
1141 }
1142 }
1143 fdx = readreg(dev, PP_AutoNegST) & FDX_ACTIVE;
1144 }
1145 if (fdx)
1146 return DETECTED_RJ45F;
1147 else
1148 return DETECTED_RJ45H;
1149}
1150
1151/* send a test packet - return true if carrier bits are ok */
1152static int
1153send_test_pkt(struct net_device *dev)
1154{
1155 char test_packet[] = { 0,0,0,0,0,0, 0,0,0,0,0,0,
1156 0, 46, /* A 46 in network order */
1157 0, 0, /* DSAP=0 & SSAP=0 fields */
1158 0xf3, 0 /* Control (Test Req + P bit set) */ };
1159 long timenow = jiffies;
1160
1161 writereg(dev, PP_LineCTL, readreg(dev, PP_LineCTL) | SERIAL_TX_ON);
1162
1163 memcpy(test_packet, dev->dev_addr, ETH_ALEN);
1164 memcpy(test_packet+ETH_ALEN, dev->dev_addr, ETH_ALEN);
1165
Lennert Buytenhek974dffc2006-01-08 01:01:06 -08001166 writeword(dev->base_addr, TX_CMD_PORT, TX_AFTER_ALL);
1167 writeword(dev->base_addr, TX_LEN_PORT, ETH_ZLEN);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001168
1169 /* Test to see if the chip has allocated memory for the packet */
1170 while (jiffies - timenow < 5)
1171 if (readreg(dev, PP_BusST) & READY_FOR_TX_NOW)
1172 break;
1173 if (jiffies - timenow >= 5)
1174 return 0; /* this shouldn't happen */
1175
1176 /* Write the contents of the packet */
Lennert Buytenhek084f7462006-01-08 01:01:12 -08001177 writewords(dev->base_addr, TX_FRAME_PORT,test_packet,(ETH_ZLEN+1) >>1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001178
1179 if (net_debug > 1) printk("Sending test packet ");
1180 /* wait a couple of jiffies for packet to be received */
1181 for (timenow = jiffies; jiffies - timenow < 3; )
1182 ;
1183 if ((readreg(dev, PP_TxEvent) & TX_SEND_OK_BITS) == TX_OK) {
1184 if (net_debug > 1) printk("succeeded\n");
1185 return 1;
1186 }
1187 if (net_debug > 1) printk("failed\n");
1188 return 0;
1189}
1190
1191
1192static int
1193detect_aui(struct net_device *dev)
1194{
1195 struct net_local *lp = netdev_priv(dev);
1196
1197 if (net_debug > 1) printk("%s: Attempting AUI\n", dev->name);
1198 control_dc_dc(dev, 0);
1199
1200 writereg(dev, PP_LineCTL, (lp->linectl &~ AUTO_AUI_10BASET) | AUI_ONLY);
1201
1202 if (send_test_pkt(dev))
1203 return DETECTED_AUI;
1204 else
1205 return DETECTED_NONE;
1206}
1207
1208static int
1209detect_bnc(struct net_device *dev)
1210{
1211 struct net_local *lp = netdev_priv(dev);
1212
1213 if (net_debug > 1) printk("%s: Attempting BNC\n", dev->name);
1214 control_dc_dc(dev, 1);
1215
1216 writereg(dev, PP_LineCTL, (lp->linectl &~ AUTO_AUI_10BASET) | AUI_ONLY);
1217
1218 if (send_test_pkt(dev))
1219 return DETECTED_BNC;
1220 else
1221 return DETECTED_NONE;
1222}
1223
1224
1225static void
1226write_irq(struct net_device *dev, int chip_type, int irq)
1227{
1228 int i;
1229
1230 if (chip_type == CS8900) {
1231 /* Search the mapping table for the corresponding IRQ pin. */
1232 for (i = 0; i != sizeof(cs8900_irq_map)/sizeof(cs8900_irq_map[0]); i++)
1233 if (cs8900_irq_map[i] == irq)
1234 break;
1235 /* Not found */
1236 if (i == sizeof(cs8900_irq_map)/sizeof(cs8900_irq_map[0]))
1237 i = 3;
1238 writereg(dev, PP_CS8900_ISAINT, i);
1239 } else {
1240 writereg(dev, PP_CS8920_ISAINT, irq);
1241 }
1242}
1243
1244/* Open/initialize the board. This is called (in the current kernel)
1245 sometime after booting when the 'ifconfig' program is run.
1246
1247 This routine should set everything up anew at each open, even
1248 registers that "should" only need to be set once at boot, so that
1249 there is non-reboot way to recover if something goes wrong.
1250 */
1251
1252/* AKPM: do we need to do any locking here? */
1253
1254static int
1255net_open(struct net_device *dev)
1256{
1257 struct net_local *lp = netdev_priv(dev);
1258 int result = 0;
1259 int i;
1260 int ret;
1261
Lennert Buytenhek277cb102006-01-08 01:01:14 -08001262#if !defined(CONFIG_SH_HICOSH4) && !defined(CONFIG_ARCH_PNX010X) /* uses irq#1, so this won't work */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001263 if (dev->irq < 2) {
1264 /* Allow interrupts to be generated by the chip */
1265/* Cirrus' release had this: */
1266#if 0
1267 writereg(dev, PP_BusCTL, readreg(dev, PP_BusCTL)|ENABLE_IRQ );
1268#endif
1269/* And 2.3.47 had this: */
1270 writereg(dev, PP_BusCTL, ENABLE_IRQ | MEMORY_ON);
1271
1272 for (i = 2; i < CS8920_NO_INTS; i++) {
1273 if ((1 << i) & lp->irq_map) {
1274 if (request_irq(i, net_interrupt, 0, dev->name, dev) == 0) {
1275 dev->irq = i;
1276 write_irq(dev, lp->chip_type, i);
1277 /* writereg(dev, PP_BufCFG, GENERATE_SW_INTERRUPT); */
1278 break;
1279 }
1280 }
1281 }
1282
1283 if (i >= CS8920_NO_INTS) {
1284 writereg(dev, PP_BusCTL, 0); /* disable interrupts. */
1285 printk(KERN_ERR "cs89x0: can't get an interrupt\n");
1286 ret = -EAGAIN;
1287 goto bad_out;
1288 }
1289 }
1290 else
1291#endif
1292 {
Lennert Buytenhek277cb102006-01-08 01:01:14 -08001293#if !defined(CONFIG_ARCH_IXDP2X01) && !defined(CONFIG_ARCH_PNX010X)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001294 if (((1 << dev->irq) & lp->irq_map) == 0) {
1295 printk(KERN_ERR "%s: IRQ %d is not in our map of allowable IRQs, which is %x\n",
1296 dev->name, dev->irq, lp->irq_map);
1297 ret = -EAGAIN;
1298 goto bad_out;
1299 }
1300#endif
1301/* FIXME: Cirrus' release had this: */
1302 writereg(dev, PP_BusCTL, readreg(dev, PP_BusCTL)|ENABLE_IRQ );
1303/* And 2.3.47 had this: */
1304#if 0
1305 writereg(dev, PP_BusCTL, ENABLE_IRQ | MEMORY_ON);
1306#endif
1307 write_irq(dev, lp->chip_type, dev->irq);
1308 ret = request_irq(dev->irq, &net_interrupt, 0, dev->name, dev);
1309 if (ret) {
1310 if (net_debug)
1311 printk(KERN_DEBUG "cs89x0: request_irq(%d) failed\n", dev->irq);
1312 goto bad_out;
1313 }
1314 }
1315
1316#if ALLOW_DMA
1317 if (lp->use_dma) {
1318 if (lp->isa_config & ANY_ISA_DMA) {
1319 unsigned long flags;
1320 lp->dma_buff = (unsigned char *)__get_dma_pages(GFP_KERNEL,
1321 get_order(lp->dmasize * 1024));
1322
1323 if (!lp->dma_buff) {
1324 printk(KERN_ERR "%s: cannot get %dK memory for DMA\n", dev->name, lp->dmasize);
1325 goto release_irq;
1326 }
1327 if (net_debug > 1) {
1328 printk( "%s: dma %lx %lx\n",
1329 dev->name,
1330 (unsigned long)lp->dma_buff,
1331 (unsigned long)isa_virt_to_bus(lp->dma_buff));
1332 }
1333 if ((unsigned long) lp->dma_buff >= MAX_DMA_ADDRESS ||
1334 !dma_page_eq(lp->dma_buff, lp->dma_buff+lp->dmasize*1024-1)) {
1335 printk(KERN_ERR "%s: not usable as DMA buffer\n", dev->name);
1336 goto release_irq;
1337 }
1338 memset(lp->dma_buff, 0, lp->dmasize * 1024); /* Why? */
1339 if (request_dma(dev->dma, dev->name)) {
1340 printk(KERN_ERR "%s: cannot get dma channel %d\n", dev->name, dev->dma);
1341 goto release_irq;
1342 }
1343 write_dma(dev, lp->chip_type, dev->dma);
1344 lp->rx_dma_ptr = lp->dma_buff;
1345 lp->end_dma_buff = lp->dma_buff + lp->dmasize*1024;
1346 spin_lock_irqsave(&lp->lock, flags);
1347 disable_dma(dev->dma);
1348 clear_dma_ff(dev->dma);
1349 set_dma_mode(dev->dma, 0x14); /* auto_init as well */
1350 set_dma_addr(dev->dma, isa_virt_to_bus(lp->dma_buff));
1351 set_dma_count(dev->dma, lp->dmasize*1024);
1352 enable_dma(dev->dma);
1353 spin_unlock_irqrestore(&lp->lock, flags);
1354 }
1355 }
1356#endif /* ALLOW_DMA */
1357
1358 /* set the Ethernet address */
1359 for (i=0; i < ETH_ALEN/2; i++)
1360 writereg(dev, PP_IA+i*2, dev->dev_addr[i*2] | (dev->dev_addr[i*2+1] << 8));
1361
1362 /* while we're testing the interface, leave interrupts disabled */
1363 writereg(dev, PP_BusCTL, MEMORY_ON);
1364
1365 /* Set the LineCTL quintuplet based on adapter configuration read from EEPROM */
1366 if ((lp->adapter_cnf & A_CNF_EXTND_10B_2) && (lp->adapter_cnf & A_CNF_LOW_RX_SQUELCH))
1367 lp->linectl = LOW_RX_SQUELCH;
1368 else
1369 lp->linectl = 0;
1370
1371 /* check to make sure that they have the "right" hardware available */
1372 switch(lp->adapter_cnf & A_CNF_MEDIA_TYPE) {
1373 case A_CNF_MEDIA_10B_T: result = lp->adapter_cnf & A_CNF_10B_T; break;
1374 case A_CNF_MEDIA_AUI: result = lp->adapter_cnf & A_CNF_AUI; break;
1375 case A_CNF_MEDIA_10B_2: result = lp->adapter_cnf & A_CNF_10B_2; break;
1376 default: result = lp->adapter_cnf & (A_CNF_10B_T | A_CNF_AUI | A_CNF_10B_2);
1377 }
Lennert Buytenhek277cb102006-01-08 01:01:14 -08001378#ifdef CONFIG_ARCH_PNX010X
dmitry pervushin0dd3c782005-06-20 15:32:54 -07001379 result = A_CNF_10B_T;
1380#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07001381 if (!result) {
1382 printk(KERN_ERR "%s: EEPROM is configured for unavailable media\n", dev->name);
1383 release_irq:
1384#if ALLOW_DMA
1385 release_dma_buff(lp);
1386#endif
1387 writereg(dev, PP_LineCTL, readreg(dev, PP_LineCTL) & ~(SERIAL_TX_ON | SERIAL_RX_ON));
1388 free_irq(dev->irq, dev);
1389 ret = -EAGAIN;
1390 goto bad_out;
1391 }
1392
1393 /* set the hardware to the configured choice */
1394 switch(lp->adapter_cnf & A_CNF_MEDIA_TYPE) {
1395 case A_CNF_MEDIA_10B_T:
1396 result = detect_tp(dev);
1397 if (result==DETECTED_NONE) {
1398 printk(KERN_WARNING "%s: 10Base-T (RJ-45) has no cable\n", dev->name);
1399 if (lp->auto_neg_cnf & IMM_BIT) /* check "ignore missing media" bit */
1400 result = DETECTED_RJ45H; /* Yes! I don't care if I see a link pulse */
1401 }
1402 break;
1403 case A_CNF_MEDIA_AUI:
1404 result = detect_aui(dev);
1405 if (result==DETECTED_NONE) {
1406 printk(KERN_WARNING "%s: 10Base-5 (AUI) has no cable\n", dev->name);
1407 if (lp->auto_neg_cnf & IMM_BIT) /* check "ignore missing media" bit */
1408 result = DETECTED_AUI; /* Yes! I don't care if I see a carrrier */
1409 }
1410 break;
1411 case A_CNF_MEDIA_10B_2:
1412 result = detect_bnc(dev);
1413 if (result==DETECTED_NONE) {
1414 printk(KERN_WARNING "%s: 10Base-2 (BNC) has no cable\n", dev->name);
1415 if (lp->auto_neg_cnf & IMM_BIT) /* check "ignore missing media" bit */
1416 result = DETECTED_BNC; /* Yes! I don't care if I can xmit a packet */
1417 }
1418 break;
1419 case A_CNF_MEDIA_AUTO:
1420 writereg(dev, PP_LineCTL, lp->linectl | AUTO_AUI_10BASET);
1421 if (lp->adapter_cnf & A_CNF_10B_T)
1422 if ((result = detect_tp(dev)) != DETECTED_NONE)
1423 break;
1424 if (lp->adapter_cnf & A_CNF_AUI)
1425 if ((result = detect_aui(dev)) != DETECTED_NONE)
1426 break;
1427 if (lp->adapter_cnf & A_CNF_10B_2)
1428 if ((result = detect_bnc(dev)) != DETECTED_NONE)
1429 break;
1430 printk(KERN_ERR "%s: no media detected\n", dev->name);
1431 goto release_irq;
1432 }
1433 switch(result) {
1434 case DETECTED_NONE:
1435 printk(KERN_ERR "%s: no network cable attached to configured media\n", dev->name);
1436 goto release_irq;
1437 case DETECTED_RJ45H:
1438 printk(KERN_INFO "%s: using half-duplex 10Base-T (RJ-45)\n", dev->name);
1439 break;
1440 case DETECTED_RJ45F:
1441 printk(KERN_INFO "%s: using full-duplex 10Base-T (RJ-45)\n", dev->name);
1442 break;
1443 case DETECTED_AUI:
1444 printk(KERN_INFO "%s: using 10Base-5 (AUI)\n", dev->name);
1445 break;
1446 case DETECTED_BNC:
1447 printk(KERN_INFO "%s: using 10Base-2 (BNC)\n", dev->name);
1448 break;
1449 }
1450
1451 /* Turn on both receive and transmit operations */
1452 writereg(dev, PP_LineCTL, readreg(dev, PP_LineCTL) | SERIAL_RX_ON | SERIAL_TX_ON);
1453
1454 /* Receive only error free packets addressed to this card */
1455 lp->rx_mode = 0;
1456 writereg(dev, PP_RxCTL, DEF_RX_ACCEPT);
1457
1458 lp->curr_rx_cfg = RX_OK_ENBL | RX_CRC_ERROR_ENBL;
1459
1460 if (lp->isa_config & STREAM_TRANSFER)
1461 lp->curr_rx_cfg |= RX_STREAM_ENBL;
1462#if ALLOW_DMA
1463 set_dma_cfg(dev);
1464#endif
1465 writereg(dev, PP_RxCFG, lp->curr_rx_cfg);
1466
1467 writereg(dev, PP_TxCFG, TX_LOST_CRS_ENBL | TX_SQE_ERROR_ENBL | TX_OK_ENBL |
1468 TX_LATE_COL_ENBL | TX_JBR_ENBL | TX_ANY_COL_ENBL | TX_16_COL_ENBL);
1469
1470 writereg(dev, PP_BufCFG, READY_FOR_TX_ENBL | RX_MISS_COUNT_OVRFLOW_ENBL |
1471#if ALLOW_DMA
1472 dma_bufcfg(dev) |
1473#endif
1474 TX_COL_COUNT_OVRFLOW_ENBL | TX_UNDERRUN_ENBL);
1475
1476 /* now that we've got our act together, enable everything */
1477 writereg(dev, PP_BusCTL, ENABLE_IRQ
1478 | (dev->mem_start?MEMORY_ON : 0) /* turn memory on */
1479#if ALLOW_DMA
1480 | dma_busctl(dev)
1481#endif
1482 );
1483 netif_start_queue(dev);
1484 if (net_debug > 1)
1485 printk("cs89x0: net_open() succeeded\n");
1486 return 0;
1487bad_out:
1488 return ret;
1489}
1490
1491static void net_timeout(struct net_device *dev)
1492{
1493 /* If we get here, some higher level has decided we are broken.
1494 There should really be a "kick me" function call instead. */
1495 if (net_debug > 0) printk("%s: transmit timed out, %s?\n", dev->name,
1496 tx_done(dev) ? "IRQ conflict ?" : "network cable problem");
1497 /* Try to restart the adaptor. */
1498 netif_wake_queue(dev);
1499}
1500
1501static int net_send_packet(struct sk_buff *skb, struct net_device *dev)
1502{
1503 struct net_local *lp = netdev_priv(dev);
1504
1505 if (net_debug > 3) {
1506 printk("%s: sent %d byte packet of type %x\n",
1507 dev->name, skb->len,
1508 (skb->data[ETH_ALEN+ETH_ALEN] << 8) | skb->data[ETH_ALEN+ETH_ALEN+1]);
1509 }
1510
1511 /* keep the upload from being interrupted, since we
1512 ask the chip to start transmitting before the
1513 whole packet has been completely uploaded. */
1514
1515 spin_lock_irq(&lp->lock);
1516 netif_stop_queue(dev);
1517
1518 /* initiate a transmit sequence */
Lennert Buytenhek974dffc2006-01-08 01:01:06 -08001519 writeword(dev->base_addr, TX_CMD_PORT, lp->send_cmd);
1520 writeword(dev->base_addr, TX_LEN_PORT, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001521
1522 /* Test to see if the chip has allocated memory for the packet */
1523 if ((readreg(dev, PP_BusST) & READY_FOR_TX_NOW) == 0) {
1524 /*
1525 * Gasp! It hasn't. But that shouldn't happen since
1526 * we're waiting for TxOk, so return 1 and requeue this packet.
1527 */
1528
1529 spin_unlock_irq(&lp->lock);
1530 if (net_debug) printk("cs89x0: Tx buffer not free!\n");
1531 return 1;
1532 }
1533 /* Write the contents of the packet */
Lennert Buytenhek084f7462006-01-08 01:01:12 -08001534 writewords(dev->base_addr, TX_FRAME_PORT,skb->data,(skb->len+1) >>1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001535 spin_unlock_irq(&lp->lock);
Ian Campbelle1699f52005-07-28 01:07:34 -07001536 lp->stats.tx_bytes += skb->len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001537 dev->trans_start = jiffies;
1538 dev_kfree_skb (skb);
1539
1540 /*
1541 * We DO NOT call netif_wake_queue() here.
1542 * We also DO NOT call netif_start_queue().
1543 *
1544 * Either of these would cause another bottom half run through
1545 * net_send_packet() before this packet has fully gone out. That causes
1546 * us to hit the "Gasp!" above and the send is rescheduled. it runs like
1547 * a dog. We just return and wait for the Tx completion interrupt handler
1548 * to restart the netdevice layer
1549 */
1550
1551 return 0;
1552}
1553
1554/* The typical workload of the driver:
1555 Handle the network interface interrupts. */
1556
1557static irqreturn_t net_interrupt(int irq, void *dev_id, struct pt_regs * regs)
1558{
1559 struct net_device *dev = dev_id;
1560 struct net_local *lp;
1561 int ioaddr, status;
1562 int handled = 0;
1563
1564 ioaddr = dev->base_addr;
1565 lp = netdev_priv(dev);
1566
1567 /* we MUST read all the events out of the ISQ, otherwise we'll never
1568 get interrupted again. As a consequence, we can't have any limit
1569 on the number of times we loop in the interrupt handler. The
1570 hardware guarantees that eventually we'll run out of events. Of
1571 course, if you're on a slow machine, and packets are arriving
1572 faster than you can read them off, you're screwed. Hasta la
1573 vista, baby! */
Lennert Buytenhek974dffc2006-01-08 01:01:06 -08001574 while ((status = readword(dev->base_addr, ISQ_PORT))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001575 if (net_debug > 4)printk("%s: event=%04x\n", dev->name, status);
1576 handled = 1;
1577 switch(status & ISQ_EVENT_MASK) {
1578 case ISQ_RECEIVER_EVENT:
1579 /* Got a packet(s). */
1580 net_rx(dev);
1581 break;
1582 case ISQ_TRANSMITTER_EVENT:
1583 lp->stats.tx_packets++;
1584 netif_wake_queue(dev); /* Inform upper layers. */
1585 if ((status & ( TX_OK |
1586 TX_LOST_CRS |
1587 TX_SQE_ERROR |
1588 TX_LATE_COL |
1589 TX_16_COL)) != TX_OK) {
1590 if ((status & TX_OK) == 0) lp->stats.tx_errors++;
1591 if (status & TX_LOST_CRS) lp->stats.tx_carrier_errors++;
1592 if (status & TX_SQE_ERROR) lp->stats.tx_heartbeat_errors++;
1593 if (status & TX_LATE_COL) lp->stats.tx_window_errors++;
1594 if (status & TX_16_COL) lp->stats.tx_aborted_errors++;
1595 }
1596 break;
1597 case ISQ_BUFFER_EVENT:
1598 if (status & READY_FOR_TX) {
1599 /* we tried to transmit a packet earlier,
1600 but inexplicably ran out of buffers.
1601 That shouldn't happen since we only ever
1602 load one packet. Shrug. Do the right
1603 thing anyway. */
1604 netif_wake_queue(dev); /* Inform upper layers. */
1605 }
1606 if (status & TX_UNDERRUN) {
1607 if (net_debug > 0) printk("%s: transmit underrun\n", dev->name);
1608 lp->send_underrun++;
1609 if (lp->send_underrun == 3) lp->send_cmd = TX_AFTER_381;
1610 else if (lp->send_underrun == 6) lp->send_cmd = TX_AFTER_ALL;
1611 /* transmit cycle is done, although
1612 frame wasn't transmitted - this
1613 avoids having to wait for the upper
1614 layers to timeout on us, in the
1615 event of a tx underrun */
1616 netif_wake_queue(dev); /* Inform upper layers. */
1617 }
1618#if ALLOW_DMA
1619 if (lp->use_dma && (status & RX_DMA)) {
1620 int count = readreg(dev, PP_DmaFrameCnt);
1621 while(count) {
1622 if (net_debug > 5)
1623 printk("%s: receiving %d DMA frames\n", dev->name, count);
1624 if (net_debug > 2 && count >1)
1625 printk("%s: receiving %d DMA frames\n", dev->name, count);
1626 dma_rx(dev);
1627 if (--count == 0)
1628 count = readreg(dev, PP_DmaFrameCnt);
1629 if (net_debug > 2 && count > 0)
1630 printk("%s: continuing with %d DMA frames\n", dev->name, count);
1631 }
1632 }
1633#endif
1634 break;
1635 case ISQ_RX_MISS_EVENT:
1636 lp->stats.rx_missed_errors += (status >>6);
1637 break;
1638 case ISQ_TX_COL_EVENT:
1639 lp->stats.collisions += (status >>6);
1640 break;
1641 }
1642 }
1643 return IRQ_RETVAL(handled);
1644}
1645
1646static void
1647count_rx_errors(int status, struct net_local *lp)
1648{
1649 lp->stats.rx_errors++;
1650 if (status & RX_RUNT) lp->stats.rx_length_errors++;
1651 if (status & RX_EXTRA_DATA) lp->stats.rx_length_errors++;
1652 if (status & RX_CRC_ERROR) if (!(status & (RX_EXTRA_DATA|RX_RUNT)))
1653 /* per str 172 */
1654 lp->stats.rx_crc_errors++;
1655 if (status & RX_DRIBBLE) lp->stats.rx_frame_errors++;
1656 return;
1657}
1658
1659/* We have a good packet(s), get it/them out of the buffers. */
1660static void
1661net_rx(struct net_device *dev)
1662{
1663 struct net_local *lp = netdev_priv(dev);
1664 struct sk_buff *skb;
1665 int status, length;
1666
1667 int ioaddr = dev->base_addr;
Lennert Buytenhekfc8c7d72006-01-08 01:01:08 -08001668 status = readword(ioaddr, RX_FRAME_PORT);
1669 length = readword(ioaddr, RX_FRAME_PORT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001670
1671 if ((status & RX_OK) == 0) {
1672 count_rx_errors(status, lp);
1673 return;
1674 }
1675
1676 /* Malloc up new buffer. */
1677 skb = dev_alloc_skb(length + 2);
1678 if (skb == NULL) {
1679#if 0 /* Again, this seems a cruel thing to do */
1680 printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
1681#endif
1682 lp->stats.rx_dropped++;
1683 return;
1684 }
1685 skb_reserve(skb, 2); /* longword align L3 header */
1686 skb->dev = dev;
1687
Lennert Buytenhek084f7462006-01-08 01:01:12 -08001688 readwords(ioaddr, RX_FRAME_PORT, skb_put(skb, length), length >> 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001689 if (length & 1)
Lennert Buytenhekfc8c7d72006-01-08 01:01:08 -08001690 skb->data[length-1] = readword(ioaddr, RX_FRAME_PORT);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001691
1692 if (net_debug > 3) {
1693 printk( "%s: received %d byte packet of type %x\n",
1694 dev->name, length,
1695 (skb->data[ETH_ALEN+ETH_ALEN] << 8) | skb->data[ETH_ALEN+ETH_ALEN+1]);
1696 }
1697
1698 skb->protocol=eth_type_trans(skb,dev);
1699 netif_rx(skb);
1700 dev->last_rx = jiffies;
1701 lp->stats.rx_packets++;
1702 lp->stats.rx_bytes += length;
1703}
1704
1705#if ALLOW_DMA
1706static void release_dma_buff(struct net_local *lp)
1707{
1708 if (lp->dma_buff) {
1709 free_pages((unsigned long)(lp->dma_buff), get_order(lp->dmasize * 1024));
1710 lp->dma_buff = NULL;
1711 }
1712}
1713#endif
1714
1715/* The inverse routine to net_open(). */
1716static int
1717net_close(struct net_device *dev)
1718{
1719#if ALLOW_DMA
1720 struct net_local *lp = netdev_priv(dev);
1721#endif
1722
1723 netif_stop_queue(dev);
1724
1725 writereg(dev, PP_RxCFG, 0);
1726 writereg(dev, PP_TxCFG, 0);
1727 writereg(dev, PP_BufCFG, 0);
1728 writereg(dev, PP_BusCTL, 0);
1729
1730 free_irq(dev->irq, dev);
1731
1732#if ALLOW_DMA
1733 if (lp->use_dma && lp->dma) {
1734 free_dma(dev->dma);
1735 release_dma_buff(lp);
1736 }
1737#endif
1738
1739 /* Update the statistics here. */
1740 return 0;
1741}
1742
1743/* Get the current statistics. This may be called with the card open or
1744 closed. */
1745static struct net_device_stats *
1746net_get_stats(struct net_device *dev)
1747{
1748 struct net_local *lp = netdev_priv(dev);
1749 unsigned long flags;
1750
1751 spin_lock_irqsave(&lp->lock, flags);
1752 /* Update the statistics from the device registers. */
1753 lp->stats.rx_missed_errors += (readreg(dev, PP_RxMiss) >> 6);
1754 lp->stats.collisions += (readreg(dev, PP_TxCol) >> 6);
1755 spin_unlock_irqrestore(&lp->lock, flags);
1756
1757 return &lp->stats;
1758}
1759
1760static void set_multicast_list(struct net_device *dev)
1761{
1762 struct net_local *lp = netdev_priv(dev);
1763 unsigned long flags;
1764
1765 spin_lock_irqsave(&lp->lock, flags);
1766 if(dev->flags&IFF_PROMISC)
1767 {
1768 lp->rx_mode = RX_ALL_ACCEPT;
1769 }
1770 else if((dev->flags&IFF_ALLMULTI)||dev->mc_list)
1771 {
1772 /* The multicast-accept list is initialized to accept-all, and we
1773 rely on higher-level filtering for now. */
1774 lp->rx_mode = RX_MULTCAST_ACCEPT;
1775 }
1776 else
1777 lp->rx_mode = 0;
1778
1779 writereg(dev, PP_RxCTL, DEF_RX_ACCEPT | lp->rx_mode);
1780
1781 /* in promiscuous mode, we accept errored packets, so we have to enable interrupts on them also */
1782 writereg(dev, PP_RxCFG, lp->curr_rx_cfg |
1783 (lp->rx_mode == RX_ALL_ACCEPT? (RX_CRC_ERROR_ENBL|RX_RUNT_ENBL|RX_EXTRA_DATA_ENBL) : 0));
1784 spin_unlock_irqrestore(&lp->lock, flags);
1785}
1786
1787
1788static int set_mac_address(struct net_device *dev, void *p)
1789{
1790 int i;
1791 struct sockaddr *addr = p;
1792
1793
1794 if (netif_running(dev))
1795 return -EBUSY;
1796
1797 memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
1798
1799 if (net_debug) {
1800 printk("%s: Setting MAC address to ", dev->name);
1801 for (i = 0; i < dev->addr_len; i++)
1802 printk(" %2.2x", dev->dev_addr[i]);
1803 printk(".\n");
1804 }
1805 /* set the Ethernet address */
1806 for (i=0; i < ETH_ALEN/2; i++)
1807 writereg(dev, PP_IA+i*2, dev->dev_addr[i*2] | (dev->dev_addr[i*2+1] << 8));
1808
1809 return 0;
1810}
1811
1812#ifdef MODULE
1813
1814static struct net_device *dev_cs89x0;
1815
1816/*
1817 * Support the 'debug' module parm even if we're compiled for non-debug to
1818 * avoid breaking someone's startup scripts
1819 */
1820
1821static int io;
1822static int irq;
1823static int debug;
1824static char media[8];
1825static int duplex=-1;
1826
1827static int use_dma; /* These generate unused var warnings if ALLOW_DMA = 0 */
1828static int dma;
1829static int dmasize=16; /* or 64 */
1830
1831module_param(io, int, 0);
1832module_param(irq, int, 0);
1833module_param(debug, int, 0);
1834module_param_string(media, media, sizeof(media), 0);
1835module_param(duplex, int, 0);
1836module_param(dma , int, 0);
1837module_param(dmasize , int, 0);
1838module_param(use_dma , int, 0);
1839MODULE_PARM_DESC(io, "cs89x0 I/O base address");
1840MODULE_PARM_DESC(irq, "cs89x0 IRQ number");
1841#if DEBUGGING
1842MODULE_PARM_DESC(debug, "cs89x0 debug level (0-6)");
1843#else
1844MODULE_PARM_DESC(debug, "(ignored)");
1845#endif
1846MODULE_PARM_DESC(media, "Set cs89x0 adapter(s) media type(s) (rj45,bnc,aui)");
1847/* No other value than -1 for duplex seems to be currently interpreted */
1848MODULE_PARM_DESC(duplex, "(ignored)");
1849#if ALLOW_DMA
1850MODULE_PARM_DESC(dma , "cs89x0 ISA DMA channel; ignored if use_dma=0");
1851MODULE_PARM_DESC(dmasize , "cs89x0 DMA size in kB (16,64); ignored if use_dma=0");
1852MODULE_PARM_DESC(use_dma , "cs89x0 using DMA (0-1)");
1853#else
1854MODULE_PARM_DESC(dma , "(ignored)");
1855MODULE_PARM_DESC(dmasize , "(ignored)");
1856MODULE_PARM_DESC(use_dma , "(ignored)");
1857#endif
1858
1859MODULE_AUTHOR("Mike Cruse, Russwll Nelson <nelson@crynwr.com>, Andrew Morton <andrewm@uow.edu.au>");
1860MODULE_LICENSE("GPL");
1861
1862
1863/*
1864* media=t - specify media type
1865 or media=2
1866 or media=aui
1867 or medai=auto
1868* duplex=0 - specify forced half/full/autonegotiate duplex
1869* debug=# - debug level
1870
1871
1872* Default Chip Configuration:
1873 * DMA Burst = enabled
1874 * IOCHRDY Enabled = enabled
1875 * UseSA = enabled
1876 * CS8900 defaults to half-duplex if not specified on command-line
1877 * CS8920 defaults to autoneg if not specified on command-line
1878 * Use reset defaults for other config parameters
1879
1880* Assumptions:
1881 * media type specified is supported (circuitry is present)
1882 * if memory address is > 1MB, then required mem decode hw is present
1883 * if 10B-2, then agent other than driver will enable DC/DC converter
1884 (hw or software util)
1885
1886
1887*/
1888
1889int
1890init_module(void)
1891{
1892 struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
1893 struct net_local *lp;
1894 int ret = 0;
1895
1896#if DEBUGGING
1897 net_debug = debug;
1898#else
1899 debug = 0;
1900#endif
1901 if (!dev)
1902 return -ENOMEM;
1903
1904 dev->irq = irq;
1905 dev->base_addr = io;
1906 lp = netdev_priv(dev);
1907
1908#if ALLOW_DMA
1909 if (use_dma) {
1910 lp->use_dma = use_dma;
1911 lp->dma = dma;
1912 lp->dmasize = dmasize;
1913 }
1914#endif
1915
1916 spin_lock_init(&lp->lock);
1917
1918 /* boy, they'd better get these right */
1919 if (!strcmp(media, "rj45"))
1920 lp->adapter_cnf = A_CNF_MEDIA_10B_T | A_CNF_10B_T;
1921 else if (!strcmp(media, "aui"))
1922 lp->adapter_cnf = A_CNF_MEDIA_AUI | A_CNF_AUI;
1923 else if (!strcmp(media, "bnc"))
1924 lp->adapter_cnf = A_CNF_MEDIA_10B_2 | A_CNF_10B_2;
1925 else
1926 lp->adapter_cnf = A_CNF_MEDIA_10B_T | A_CNF_10B_T;
1927
1928 if (duplex==-1)
1929 lp->auto_neg_cnf = AUTO_NEG_ENABLE;
1930
1931 if (io == 0) {
1932 printk(KERN_ERR "cs89x0.c: Module autoprobing not allowed.\n");
1933 printk(KERN_ERR "cs89x0.c: Append io=0xNNN\n");
1934 ret = -EPERM;
1935 goto out;
1936 } else if (io <= 0x1ff) {
1937 ret = -ENXIO;
1938 goto out;
1939 }
1940
1941#if ALLOW_DMA
1942 if (use_dma && dmasize != 16 && dmasize != 64) {
1943 printk(KERN_ERR "cs89x0.c: dma size must be either 16K or 64K, not %dK\n", dmasize);
1944 ret = -EPERM;
1945 goto out;
1946 }
1947#endif
1948 ret = cs89x0_probe1(dev, io, 1);
1949 if (ret)
1950 goto out;
1951
Linus Torvalds1da177e2005-04-16 15:20:36 -07001952 dev_cs89x0 = dev;
1953 return 0;
1954out:
1955 free_netdev(dev);
1956 return ret;
1957}
1958
1959void
1960cleanup_module(void)
1961{
1962 unregister_netdev(dev_cs89x0);
Lennert Buytenhekfc8c7d72006-01-08 01:01:08 -08001963 writeword(dev_cs89x0->base_addr, ADD_PORT, PP_ChipID);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001964 release_region(dev_cs89x0->base_addr, NETCARD_IO_EXTENT);
1965 free_netdev(dev_cs89x0);
1966}
1967#endif /* MODULE */
1968
1969/*
1970 * Local variables:
1971 * version-control: t
1972 * kept-new-versions: 5
1973 * c-indent-level: 8
1974 * tab-width: 8
1975 * End:
1976 *
1977 */