VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / drivers / net / e2100.c
1 /* e2100.c: A Cabletron E2100 series ethernet driver for linux. */
2 /*
3         Written 1993-1994 by Donald Becker.
4
5         Copyright 1994 by Donald Becker.
6         Copyright 1993 United States Government as represented by the
7         Director, National Security Agency.  This software may be used and
8         distributed according to the terms of the GNU General Public License,
9         incorporated herein by reference.
10
11         This is a driver for the Cabletron E2100 series ethercards.
12
13         The Author may be reached as becker@scyld.com, or C/O
14         Scyld Computing Corporation
15         410 Severn Ave., Suite 210
16         Annapolis MD 21403
17
18         The E2100 series ethercard is a fairly generic shared memory 8390
19         implementation.  The only unusual aspect is the way the shared memory
20         registers are set: first you do an inb() in what is normally the
21         station address region, and the low three bits of next outb() *address*
22         is used as the write value for that register.  Either someone wasn't
23         too used to dem bit en bites, or they were trying to obfuscate the
24         programming interface.
25
26         There is an additional complication when setting the window on the packet
27         buffer.  You must first do a read into the packet buffer region with the
28         low 8 address bits the address setting the page for the start of the packet
29         buffer window, and then do the above operation.  See mem_on() for details.
30
31         One bug on the chip is that even a hard reset won't disable the memory
32         window, usually resulting in a hung machine if mem_off() isn't called.
33         If this happens, you must power down the machine for about 30 seconds.
34 */
35
36 static const char version[] =
37         "e2100.c:v1.01 7/21/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
38
39 #include <linux/module.h>
40 #include <linux/kernel.h>
41 #include <linux/errno.h>
42 #include <linux/string.h>
43 #include <linux/ioport.h>
44 #include <linux/netdevice.h>
45 #include <linux/etherdevice.h>
46 #include <linux/init.h>
47 #include <linux/delay.h>
48
49 #include <asm/io.h>
50 #include <asm/system.h>
51
52 #include "8390.h"
53
54 #define DRV_NAME "e2100"
55
56 static int e21_probe_list[] = {0x300, 0x280, 0x380, 0x220, 0};
57
58 /* Offsets from the base_addr.
59    Read from the ASIC register, and the low three bits of the next outb()
60    address is used to set the corresponding register. */
61 #define E21_NIC_OFFSET  0               /* Offset to the 8390 NIC. */
62 #define E21_ASIC                0x10
63 #define E21_MEM_ENABLE  0x10
64 #define  E21_MEM_ON             0x05    /* Enable memory in 16 bit mode. */
65 #define  E21_MEM_ON_8   0x07    /* Enable memory in  8 bit mode. */
66 #define E21_MEM_BASE    0x11
67 #define E21_IRQ_LOW             0x12    /* The low three bits of the IRQ number. */
68 #define E21_IRQ_HIGH    0x14    /* The high IRQ bit and media select ...  */
69 #define E21_MEDIA               0x14    /* (alias). */
70 #define  E21_ALT_IFPORT 0x02    /* Set to use the other (BNC,AUI) port. */
71 #define  E21_BIG_MEM    0x04    /* Use a bigger (64K) buffer (we don't) */
72 #define E21_SAPROM              0x10    /* Offset to station address data. */
73 #define E21_IO_EXTENT    0x20
74
75 static inline void mem_on(short port, volatile char *mem_base,
76                                                   unsigned char start_page )
77 {
78         /* This is a little weird: set the shared memory window by doing a
79            read.  The low address bits specify the starting page. */
80         readb(mem_base+start_page);
81         inb(port + E21_MEM_ENABLE);
82         outb(E21_MEM_ON, port + E21_MEM_ENABLE + E21_MEM_ON);
83 }
84
85 static inline void mem_off(short port)
86 {
87         inb(port + E21_MEM_ENABLE);
88         outb(0x00, port + E21_MEM_ENABLE);
89 }
90
91 /* In other drivers I put the TX pages first, but the E2100 window circuitry
92    is designed to have a 4K Tx region last. The windowing circuitry wraps the
93    window at 0x2fff->0x0000 so that the packets at e.g. 0x2f00 in the RX ring
94    appear contiguously in the window. */
95 #define E21_RX_START_PG         0x00    /* First page of RX buffer */
96 #define E21_RX_STOP_PG          0x30    /* Last page +1 of RX ring */
97 #define E21_BIG_RX_STOP_PG      0xF0    /* Last page +1 of RX ring */
98 #define E21_TX_START_PG         E21_RX_STOP_PG  /* First page of TX buffer */
99
100 static int e21_probe1(struct net_device *dev, int ioaddr);
101
102 static int e21_open(struct net_device *dev);
103 static void e21_reset_8390(struct net_device *dev);
104 static void e21_block_input(struct net_device *dev, int count,
105                                                    struct sk_buff *skb, int ring_offset);
106 static void e21_block_output(struct net_device *dev, int count,
107                                                          const unsigned char *buf, int start_page);
108 static void e21_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
109                                                         int ring_page);
110
111 static int e21_close(struct net_device *dev);
112
113 \f
114 /*  Probe for the E2100 series ethercards.  These cards have an 8390 at the
115         base address and the station address at both offset 0x10 and 0x18.  I read
116         the station address from offset 0x18 to avoid the dataport of NE2000
117         ethercards, and look for Ctron's unique ID (first three octets of the
118         station address).
119  */
120
121 static int  __init do_e2100_probe(struct net_device *dev)
122 {
123         int *port;
124         int base_addr = dev->base_addr;
125         int irq = dev->irq;
126
127         SET_MODULE_OWNER(dev);
128
129         if (base_addr > 0x1ff)          /* Check a single specified location. */
130                 return e21_probe1(dev, base_addr);
131         else if (base_addr != 0)        /* Don't probe at all. */
132                 return -ENXIO;
133
134         for (port = e21_probe_list; *port; port++) {
135                 dev->irq = irq;
136                 if (e21_probe1(dev, *port) == 0)
137                         return 0;
138         }
139
140         return -ENODEV;
141 }
142
143 static void cleanup_card(struct net_device *dev)
144 {
145         /* NB: e21_close() handles free_irq */
146         release_region(dev->base_addr, E21_IO_EXTENT);
147 }
148
149 #ifndef MODULE
150 struct net_device * __init e2100_probe(int unit)
151 {
152         struct net_device *dev = alloc_ei_netdev();
153         int err;
154
155         if (!dev)
156                 return ERR_PTR(-ENOMEM);
157
158         sprintf(dev->name, "eth%d", unit);
159         netdev_boot_setup_check(dev);
160
161         err = do_e2100_probe(dev);
162         if (err)
163                 goto out;
164         err = register_netdev(dev);
165         if (err)
166                 goto out1;
167         return dev;
168 out1:
169         cleanup_card(dev);
170 out:
171         free_netdev(dev);
172         return ERR_PTR(err);
173 }
174 #endif
175
176 static int __init e21_probe1(struct net_device *dev, int ioaddr)
177 {
178         int i, status, retval;
179         unsigned char *station_addr = dev->dev_addr;
180         static unsigned version_printed;
181
182         if (!request_region(ioaddr, E21_IO_EXTENT, DRV_NAME))
183                 return -EBUSY;
184
185         /* First check the station address for the Ctron prefix. */
186         if (inb(ioaddr + E21_SAPROM + 0) != 0x00
187                 || inb(ioaddr + E21_SAPROM + 1) != 0x00
188                 || inb(ioaddr + E21_SAPROM + 2) != 0x1d) {
189                 retval = -ENODEV;
190                 goto out;
191         }
192
193         /* Verify by making certain that there is a 8390 at there. */
194         outb(E8390_NODMA + E8390_STOP, ioaddr);
195         udelay(1);      /* we want to delay one I/O cycle - which is 2MHz */
196         status = inb(ioaddr);
197         if (status != 0x21 && status != 0x23) {
198                 retval = -ENODEV;
199                 goto out;
200         }
201
202         /* Read the station address PROM.  */
203         for (i = 0; i < 6; i++)
204                 station_addr[i] = inb(ioaddr + E21_SAPROM + i);
205
206         inb(ioaddr + E21_MEDIA);                /* Point to media selection. */
207         outb(0, ioaddr + E21_ASIC);     /* and disable the secondary interface. */
208
209         if (ei_debug  &&  version_printed++ == 0)
210                 printk(version);
211
212         for (i = 0; i < 6; i++)
213                 printk(" %02X", station_addr[i]);
214
215         if (dev->irq < 2) {
216                 int irqlist[] = {15,11,10,12,5,9,3,4}, i;
217                 for (i = 0; i < 8; i++)
218                         if (request_irq (irqlist[i], NULL, 0, "bogus", NULL) != -EBUSY) {
219                                 dev->irq = irqlist[i];
220                                 break;
221                         }
222                 if (i >= 8) {
223                         printk(" unable to get IRQ %d.\n", dev->irq);
224                         retval = -EAGAIN;
225                         goto out;
226                 }
227         } else if (dev->irq == 2)       /* Fixup luser bogosity: IRQ2 is really IRQ9 */
228                 dev->irq = 9;
229
230         /* The 8390 is at the base address. */
231         dev->base_addr = ioaddr;
232
233         ei_status.name = "E2100";
234         ei_status.word16 = 1;
235         ei_status.tx_start_page = E21_TX_START_PG;
236         ei_status.rx_start_page = E21_RX_START_PG;
237         ei_status.stop_page = E21_RX_STOP_PG;
238         ei_status.saved_irq = dev->irq;
239
240         /* Check the media port used.  The port can be passed in on the
241            low mem_end bits. */
242         if (dev->mem_end & 15)
243                 dev->if_port = dev->mem_end & 7;
244         else {
245                 dev->if_port = 0;
246                 inb(ioaddr + E21_MEDIA);        /* Turn automatic media detection on. */
247                 for(i = 0; i < 6; i++)
248                         if (station_addr[i] != inb(ioaddr + E21_SAPROM + 8 + i)) {
249                                 dev->if_port = 1;
250                                 break;
251                         }
252         }
253
254         /* Never map in the E21 shared memory unless you are actively using it.
255            Also, the shared memory has effective only one setting -- spread all
256            over the 128K region! */
257         if (dev->mem_start == 0)
258                 dev->mem_start = 0xd0000;
259
260 #ifdef notdef
261         /* These values are unused.  The E2100 has a 2K window into the packet
262            buffer.  The window can be set to start on any page boundary. */
263         ei_status.rmem_start = dev->mem_start + TX_PAGES*256;
264         dev->mem_end = ei_status.rmem_end = dev->mem_start + 2*1024;
265 #endif
266
267         printk(", IRQ %d, %s media, memory @ %#lx.\n", dev->irq,
268                    dev->if_port ? "secondary" : "primary", dev->mem_start);
269
270         ei_status.reset_8390 = &e21_reset_8390;
271         ei_status.block_input = &e21_block_input;
272         ei_status.block_output = &e21_block_output;
273         ei_status.get_8390_hdr = &e21_get_8390_hdr;
274         dev->open = &e21_open;
275         dev->stop = &e21_close;
276 #ifdef CONFIG_NET_POLL_CONTROLLER
277         dev->poll_controller = ei_poll;
278 #endif
279         NS8390_init(dev, 0);
280
281         return 0;
282 out:
283         release_region(ioaddr, E21_IO_EXTENT);
284         return retval;
285 }
286
287 static int
288 e21_open(struct net_device *dev)
289 {
290         short ioaddr = dev->base_addr;
291         int retval;
292
293         if ((retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev)))
294                 return retval;
295
296         /* Set the interrupt line and memory base on the hardware. */
297         inb(ioaddr + E21_IRQ_LOW);
298         outb(0, ioaddr + E21_ASIC + (dev->irq & 7));
299         inb(ioaddr + E21_IRQ_HIGH);                     /* High IRQ bit, and if_port. */
300         outb(0, ioaddr + E21_ASIC + (dev->irq > 7 ? 1:0)
301                    + (dev->if_port ? E21_ALT_IFPORT : 0));
302         inb(ioaddr + E21_MEM_BASE);
303         outb(0, ioaddr + E21_ASIC + ((dev->mem_start >> 17) & 7));
304
305         ei_open(dev);
306         return 0;
307 }
308
309 static void
310 e21_reset_8390(struct net_device *dev)
311 {
312         short ioaddr = dev->base_addr;
313
314         outb(0x01, ioaddr);
315         if (ei_debug > 1) printk("resetting the E2180x3 t=%ld...", jiffies);
316         ei_status.txing = 0;
317
318         /* Set up the ASIC registers, just in case something changed them. */
319
320         if (ei_debug > 1) printk("reset done\n");
321         return;
322 }
323
324 /* Grab the 8390 specific header. We put the 2k window so the header page
325    appears at the start of the shared memory. */
326
327 static void
328 e21_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
329 {
330
331         short ioaddr = dev->base_addr;
332         char *shared_mem = (char *)dev->mem_start;
333
334         mem_on(ioaddr, shared_mem, ring_page);
335
336 #ifdef notdef
337         /* Officially this is what we are doing, but the readl() is faster */
338         memcpy_fromio(hdr, shared_mem, sizeof(struct e8390_pkt_hdr));
339 #else
340         ((unsigned int*)hdr)[0] = readl(shared_mem);
341 #endif
342
343         /* Turn off memory access: we would need to reprogram the window anyway. */
344         mem_off(ioaddr);
345
346 }
347
348 /*  Block input and output are easy on shared memory ethercards.
349         The E21xx makes block_input() especially easy by wrapping the top
350         ring buffer to the bottom automatically. */
351 static void
352 e21_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)
353 {
354         short ioaddr = dev->base_addr;
355         char *shared_mem = (char *)dev->mem_start;
356
357         mem_on(ioaddr, shared_mem, (ring_offset>>8));
358
359         /* Packet is always in one chunk -- we can copy + cksum. */
360         eth_io_copy_and_sum(skb, dev->mem_start + (ring_offset & 0xff), count, 0);
361
362         mem_off(ioaddr);
363 }
364
365 static void
366 e21_block_output(struct net_device *dev, int count, const unsigned char *buf,
367                                  int start_page)
368 {
369         short ioaddr = dev->base_addr;
370         volatile char *shared_mem = (char *)dev->mem_start;
371
372         /* Set the shared memory window start by doing a read, with the low address
373            bits specifying the starting page. */
374         readb(shared_mem + start_page);
375         mem_on(ioaddr, shared_mem, start_page);
376
377         memcpy_toio(shared_mem, buf, count);
378         mem_off(ioaddr);
379 }
380
381 static int
382 e21_close(struct net_device *dev)
383 {
384         short ioaddr = dev->base_addr;
385
386         if (ei_debug > 1)
387                 printk("%s: Shutting down ethercard.\n", dev->name);
388
389         free_irq(dev->irq, dev);
390         dev->irq = ei_status.saved_irq;
391
392         /* Shut off the interrupt line and secondary interface. */
393         inb(ioaddr + E21_IRQ_LOW);
394         outb(0, ioaddr + E21_ASIC);
395         inb(ioaddr + E21_IRQ_HIGH);                     /* High IRQ bit, and if_port. */
396         outb(0, ioaddr + E21_ASIC);
397
398         ei_close(dev);
399
400         /* Double-check that the memory has been turned off, because really
401            really bad things happen if it isn't. */
402         mem_off(ioaddr);
403
404         return 0;
405 }
406
407 \f
408 #ifdef MODULE
409 #define MAX_E21_CARDS   4       /* Max number of E21 cards per module */
410 static struct net_device *dev_e21[MAX_E21_CARDS];
411 static int io[MAX_E21_CARDS];
412 static int irq[MAX_E21_CARDS];
413 static int mem[MAX_E21_CARDS];
414 static int xcvr[MAX_E21_CARDS];         /* choose int. or ext. xcvr */
415
416 MODULE_PARM(io, "1-" __MODULE_STRING(MAX_E21_CARDS) "i");
417 MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_E21_CARDS) "i");
418 MODULE_PARM(mem, "1-" __MODULE_STRING(MAX_E21_CARDS) "i");
419 MODULE_PARM(xcvr, "1-" __MODULE_STRING(MAX_E21_CARDS) "i");
420 MODULE_PARM_DESC(io, "I/O base address(es)");
421 MODULE_PARM_DESC(irq, "IRQ number(s)");
422 MODULE_PARM_DESC(mem, " memory base address(es)");
423 MODULE_PARM_DESC(xcvr, "transceiver(s) (0=internal, 1=external)");
424 MODULE_DESCRIPTION("Cabletron E2100 ISA ethernet driver");
425 MODULE_LICENSE("GPL");
426
427 /* This is set up so that only a single autoprobe takes place per call.
428 ISA device autoprobes on a running machine are not recommended. */
429 int
430 init_module(void)
431 {
432         struct net_device *dev;
433         int this_dev, found = 0;
434
435         for (this_dev = 0; this_dev < MAX_E21_CARDS; this_dev++) {
436                 if (io[this_dev] == 0)  {
437                         if (this_dev != 0) break; /* only autoprobe 1st one */
438                         printk(KERN_NOTICE "e2100.c: Presently autoprobing (not recommended) for a single card.\n");
439                 }
440                 dev = alloc_ei_netdev();
441                 if (!dev)
442                         break;
443                 dev->irq = irq[this_dev];
444                 dev->base_addr = io[this_dev];
445                 dev->mem_start = mem[this_dev];
446                 dev->mem_end = xcvr[this_dev];  /* low 4bits = xcvr sel. */
447                 if (do_e2100_probe(dev) == 0) {
448                         if (register_netdev(dev) == 0) {
449                                 dev_e21[found++] = dev;
450                                 continue;
451                         }
452                         cleanup_card(dev);
453                 }
454                 free_netdev(dev);
455                 printk(KERN_WARNING "e2100.c: No E2100 card found (i/o = 0x%x).\n", io[this_dev]);
456                 break;
457         }
458         if (found)
459                 return 0;
460         return -ENXIO;
461 }
462
463 void
464 cleanup_module(void)
465 {
466         int this_dev;
467
468         for (this_dev = 0; this_dev < MAX_E21_CARDS; this_dev++) {
469                 struct net_device *dev = dev_e21[this_dev];
470                 if (dev) {
471                         unregister_netdev(dev);
472                         cleanup_card(dev);
473                         free_netdev(dev);
474                 }
475         }
476 }
477 #endif /* MODULE */