[NET] drivers/net: statistics cleanup #1 -- save memory and shrink code
[deliverable/linux.git] / drivers / net / dgrs.c
1 /*
2 * Digi RightSwitch SE-X loadable device driver for Linux
3 *
4 * The RightSwitch is a 4 (EISA) or 6 (PCI) port etherswitch and
5 * a NIC on an internal board.
6 *
7 * Author: Rick Richardson, rick@remotepoint.com
8 * Derived from the SVR4.2 (UnixWare) driver for the same card.
9 *
10 * Copyright 1995-1996 Digi International Inc.
11 *
12 * This software may be used and distributed according to the terms
13 * of the GNU General Public License, incorporated herein by reference.
14 *
15 * For information on purchasing a RightSwitch SE-4 or SE-6
16 * board, please contact Digi's sales department at 1-612-912-3444
17 * or 1-800-DIGIBRD. Outside the U.S., please check our Web page
18 * at http://www.dgii.com for sales offices worldwide.
19 *
20 * OPERATION:
21 * When compiled as a loadable module, this driver can operate
22 * the board as either a 4/6 port switch with a 5th or 7th port
23 * that is a conventional NIC interface as far as the host is
24 * concerned, OR as 4/6 independent NICs. To select multi-NIC
25 * mode, add "nicmode=1" on the insmod load line for the driver.
26 *
27 * This driver uses the "dev" common ethernet device structure
28 * and a private "priv" (dev->priv) structure that contains
29 * mostly DGRS-specific information and statistics. To keep
30 * the code for both the switch mode and the multi-NIC mode
31 * as similar as possible, I have introduced the concept of
32 * "dev0"/"priv0" and "devN"/"privN" pointer pairs in subroutines
33 * where needed. The first pair of pointers points to the
34 * "dev" and "priv" structures of the zeroth (0th) device
35 * interface associated with a board. The second pair of
36 * pointers points to the current (Nth) device interface
37 * for the board: the one for which we are processing data.
38 *
39 * In switch mode, the pairs of pointers are always the same,
40 * that is, dev0 == devN and priv0 == privN. This is just
41 * like previous releases of this driver which did not support
42 * NIC mode.
43 *
44 * In multi-NIC mode, the pairs of pointers may be different.
45 * We use the devN and privN pointers to reference just the
46 * name, port number, and statistics for the current interface.
47 * We use the dev0 and priv0 pointers to access the variables
48 * that control access to the board, such as board address
49 * and simulated 82596 variables. This is because there is
50 * only one "fake" 82596 that serves as the interface to
51 * the board. We do not want to try to keep the variables
52 * associated with this 82596 in sync across all devices.
53 *
54 * This scheme works well. As you will see, except for
55 * initialization, there is very little difference between
56 * the two modes as far as this driver is concerned. On the
57 * receive side in NIC mode, the interrupt *always* comes in on
58 * the 0th interface (dev0/priv0). We then figure out which
59 * real 82596 port it came in on from looking at the "chan"
60 * member that the board firmware adds at the end of each
61 * RBD (a.k.a. TBD). We get the channel number like this:
62 * int chan = ((I596_RBD *) S2H(cbp->xmit.tbdp))->chan;
63 *
64 * On the transmit side in multi-NIC mode, we specify the
65 * output 82596 port by setting the new "dstchan" structure
66 * member that is at the end of the RFD, like this:
67 * priv0->rfdp->dstchan = privN->chan;
68 *
69 * TODO:
70 * - Multi-NIC mode is not yet supported when the driver is linked
71 * into the kernel.
72 * - Better handling of multicast addresses.
73 *
74 * Fixes:
75 * Arnaldo Carvalho de Melo <acme@conectiva.com.br> - 11/01/2001
76 * - fix dgrs_found_device wrt checking kmalloc return and
77 * rollbacking the partial steps of the whole process when
78 * one of the devices can't be allocated. Fix SET_MODULE_OWNER
79 * on the loop to use devN instead of repeated calls to dev.
80 *
81 * davej <davej@suse.de> - 9/2/2001
82 * - Enable PCI device before reading ioaddr/irq
83 *
84 */
85
86 #include <linux/module.h>
87 #include <linux/eisa.h>
88 #include <linux/kernel.h>
89 #include <linux/string.h>
90 #include <linux/delay.h>
91 #include <linux/errno.h>
92 #include <linux/ioport.h>
93 #include <linux/slab.h>
94 #include <linux/interrupt.h>
95 #include <linux/pci.h>
96 #include <linux/init.h>
97 #include <linux/netdevice.h>
98 #include <linux/etherdevice.h>
99 #include <linux/skbuff.h>
100 #include <linux/bitops.h>
101
102 #include <asm/io.h>
103 #include <asm/byteorder.h>
104 #include <asm/uaccess.h>
105
106 static char version[] __initdata =
107 "$Id: dgrs.c,v 1.13 2000/06/06 04:07:00 rick Exp $";
108
109 /*
110 * DGRS include files
111 */
112 typedef unsigned char uchar;
113 #define vol volatile
114
115 #include "dgrs.h"
116 #include "dgrs_es4h.h"
117 #include "dgrs_plx9060.h"
118 #include "dgrs_i82596.h"
119 #include "dgrs_ether.h"
120 #include "dgrs_asstruct.h"
121 #include "dgrs_bcomm.h"
122
123 #ifdef CONFIG_PCI
124 static struct pci_device_id dgrs_pci_tbl[] = {
125 { SE6_PCI_VENDOR_ID, SE6_PCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, },
126 { } /* Terminating entry */
127 };
128 MODULE_DEVICE_TABLE(pci, dgrs_pci_tbl);
129 #endif
130
131 #ifdef CONFIG_EISA
132 static struct eisa_device_id dgrs_eisa_tbl[] = {
133 { "DBI0A01" },
134 { }
135 };
136 MODULE_DEVICE_TABLE(eisa, dgrs_eisa_tbl);
137 #endif
138
139 MODULE_LICENSE("GPL");
140
141
142 /*
143 * Firmware. Compiled separately for local compilation,
144 * but #included for Linux distribution.
145 */
146 #ifndef NOFW
147 #include "dgrs_firmware.c"
148 #else
149 extern int dgrs_firmnum;
150 extern char dgrs_firmver[];
151 extern char dgrs_firmdate[];
152 extern uchar dgrs_code[];
153 extern int dgrs_ncode;
154 #endif
155
156 /*
157 * Linux out*() is backwards from all other operating systems
158 */
159 #define OUTB(ADDR, VAL) outb(VAL, ADDR)
160 #define OUTW(ADDR, VAL) outw(VAL, ADDR)
161 #define OUTL(ADDR, VAL) outl(VAL, ADDR)
162
163 /*
164 * Macros to convert switch to host and host to switch addresses
165 * (assumes a local variable priv points to board dependent struct)
166 */
167 #define S2H(A) ( ((unsigned long)(A)&0x00ffffff) + priv0->vmem )
168 #define S2HN(A) ( ((unsigned long)(A)&0x00ffffff) + privN->vmem )
169 #define H2S(A) ( ((char *) (A) - priv0->vmem) + 0xA3000000 )
170
171 /*
172 * Convert a switch address to a "safe" address for use with the
173 * PLX 9060 DMA registers and the associated HW kludge that allows
174 * for host access of the DMA registers.
175 */
176 #define S2DMA(A) ( (unsigned long)(A) & 0x00ffffff)
177
178 /*
179 * "Space.c" variables, now settable from module interface
180 * Use the name below, minus the "dgrs_" prefix. See init_module().
181 */
182 static int dgrs_debug = 1;
183 static int dgrs_dma = 1;
184 static int dgrs_spantree = -1;
185 static int dgrs_hashexpire = -1;
186 static uchar dgrs_ipaddr[4] = { 0xff, 0xff, 0xff, 0xff};
187 static uchar dgrs_iptrap[4] = { 0xff, 0xff, 0xff, 0xff};
188 static __u32 dgrs_ipxnet = -1;
189 static int dgrs_nicmode;
190
191 /*
192 * Private per-board data structure (dev->priv)
193 */
194 typedef struct
195 {
196 /*
197 * DGRS specific data
198 */
199 char *vmem;
200
201 struct bios_comm *bcomm; /* Firmware BIOS comm structure */
202 PORT *port; /* Ptr to PORT[0] struct in VM */
203 I596_SCB *scbp; /* Ptr to SCB struct in VM */
204 I596_RFD *rfdp; /* Current RFD list */
205 I596_RBD *rbdp; /* Current RBD list */
206
207 volatile int intrcnt; /* Count of interrupts */
208
209 /*
210 * SE-4 (EISA) board variables
211 */
212 uchar is_reg; /* EISA: Value for ES4H_IS reg */
213
214 /*
215 * SE-6 (PCI) board variables
216 *
217 * The PLX "expansion rom" space is used for DMA register
218 * access from the host on the SE-6. These are the physical
219 * and virtual addresses of that space.
220 */
221 ulong plxreg; /* Phys address of PLX chip */
222 char *vplxreg; /* Virtual address of PLX chip */
223 ulong plxdma; /* Phys addr of PLX "expansion rom" */
224 ulong volatile *vplxdma; /* Virtual addr of "expansion rom" */
225 int use_dma; /* Flag: use DMA */
226 DMACHAIN *dmadesc_s; /* area for DMA chains (SW addr.) */
227 DMACHAIN *dmadesc_h; /* area for DMA chains (Host Virtual) */
228
229 /*
230 * Multi-NIC mode variables
231 *
232 * All entries of the devtbl[] array are valid for the 0th
233 * device (i.e. eth0, but not eth1...eth5). devtbl[0] is
234 * valid for all devices (i.e. eth0, eth1, ..., eth5).
235 */
236 int nports; /* Number of physical ports (4 or 6) */
237 int chan; /* Channel # (1-6) for this device */
238 struct net_device *devtbl[6]; /* Ptrs to N device structs */
239
240 } DGRS_PRIV;
241
242
243 /*
244 * reset or un-reset the IDT processor
245 */
246 static void
247 proc_reset(struct net_device *dev0, int reset)
248 {
249 DGRS_PRIV *priv0 = (DGRS_PRIV *) dev0->priv;
250
251 if (priv0->plxreg)
252 {
253 ulong val;
254 val = inl(dev0->base_addr + PLX_MISC_CSR);
255 if (reset)
256 val |= SE6_RESET;
257 else
258 val &= ~SE6_RESET;
259 OUTL(dev0->base_addr + PLX_MISC_CSR, val);
260 }
261 else
262 {
263 OUTB(dev0->base_addr + ES4H_PC, reset ? ES4H_PC_RESET : 0);
264 }
265 }
266
267 /*
268 * See if the board supports bus master DMA
269 */
270 static int
271 check_board_dma(struct net_device *dev0)
272 {
273 DGRS_PRIV *priv0 = (DGRS_PRIV *) dev0->priv;
274 ulong x;
275
276 /*
277 * If Space.c says not to use DMA, or if it's not a PLX based
278 * PCI board, or if the expansion ROM space is not PCI
279 * configured, then return false.
280 */
281 if (!dgrs_dma || !priv0->plxreg || !priv0->plxdma)
282 return (0);
283
284 /*
285 * Set the local address remap register of the "expansion rom"
286 * area to 0x80000000 so that we can use it to access the DMA
287 * registers from the host side.
288 */
289 OUTL(dev0->base_addr + PLX_ROM_BASE_ADDR, 0x80000000);
290
291 /*
292 * Set the PCI region descriptor to:
293 * Space 0:
294 * disable read-prefetch
295 * enable READY
296 * enable BURST
297 * 0 internal wait states
298 * Expansion ROM: (used for host DMA register access)
299 * disable read-prefetch
300 * enable READY
301 * disable BURST
302 * 0 internal wait states
303 */
304 OUTL(dev0->base_addr + PLX_BUS_REGION, 0x49430343);
305
306 /*
307 * Now map the DMA registers into our virtual space
308 */
309 priv0->vplxdma = (ulong *) ioremap (priv0->plxdma, 256);
310 if (!priv0->vplxdma)
311 {
312 printk("%s: can't *remap() the DMA regs\n", dev0->name);
313 return (0);
314 }
315
316 /*
317 * Now test to see if we can access the DMA registers
318 * If we write -1 and get back 1FFF, then we accessed the
319 * DMA register. Otherwise, we probably have an old board
320 * and wrote into regular RAM.
321 */
322 priv0->vplxdma[PLX_DMA0_MODE/4] = 0xFFFFFFFF;
323 x = priv0->vplxdma[PLX_DMA0_MODE/4];
324 if (x != 0x00001FFF) {
325 iounmap((void *)priv0->vplxdma);
326 return (0);
327 }
328
329 return (1);
330 }
331
332 /*
333 * Initiate DMA using PLX part on PCI board. Spin the
334 * processor until completed. All addresses are physical!
335 *
336 * If pciaddr is NULL, then it's a chaining DMA, and lcladdr is
337 * the address of the first DMA descriptor in the chain.
338 *
339 * If pciaddr is not NULL, then it's a single DMA.
340 *
341 * In either case, "lcladdr" must have been fixed up to make
342 * sure the MSB isn't set using the S2DMA macro before passing
343 * the address to this routine.
344 */
345 static int
346 do_plx_dma(
347 struct net_device *dev,
348 ulong pciaddr,
349 ulong lcladdr,
350 int len,
351 int to_host
352 )
353 {
354 int i;
355 ulong csr = 0;
356 DGRS_PRIV *priv = (DGRS_PRIV *) dev->priv;
357
358 if (pciaddr)
359 {
360 /*
361 * Do a single, non-chain DMA
362 */
363 priv->vplxdma[PLX_DMA0_PCI_ADDR/4] = pciaddr;
364 priv->vplxdma[PLX_DMA0_LCL_ADDR/4] = lcladdr;
365 priv->vplxdma[PLX_DMA0_SIZE/4] = len;
366 priv->vplxdma[PLX_DMA0_DESCRIPTOR/4] = to_host
367 ? PLX_DMA_DESC_TO_HOST
368 : PLX_DMA_DESC_TO_BOARD;
369 priv->vplxdma[PLX_DMA0_MODE/4] =
370 PLX_DMA_MODE_WIDTH32
371 | PLX_DMA_MODE_WAITSTATES(0)
372 | PLX_DMA_MODE_READY
373 | PLX_DMA_MODE_NOBTERM
374 | PLX_DMA_MODE_BURST
375 | PLX_DMA_MODE_NOCHAIN;
376 }
377 else
378 {
379 /*
380 * Do a chaining DMA
381 */
382 priv->vplxdma[PLX_DMA0_MODE/4] =
383 PLX_DMA_MODE_WIDTH32
384 | PLX_DMA_MODE_WAITSTATES(0)
385 | PLX_DMA_MODE_READY
386 | PLX_DMA_MODE_NOBTERM
387 | PLX_DMA_MODE_BURST
388 | PLX_DMA_MODE_CHAIN;
389 priv->vplxdma[PLX_DMA0_DESCRIPTOR/4] = lcladdr;
390 }
391
392 priv->vplxdma[PLX_DMA_CSR/4] =
393 PLX_DMA_CSR_0_ENABLE | PLX_DMA_CSR_0_START;
394
395 /*
396 * Wait for DMA to complete
397 */
398 for (i = 0; i < 1000000; ++i)
399 {
400 /*
401 * Spin the host CPU for 1 usec, so we don't thrash
402 * the PCI bus while the PLX 9060 is doing DMA.
403 */
404 udelay(1);
405
406 csr = (volatile unsigned long) priv->vplxdma[PLX_DMA_CSR/4];
407
408 if (csr & PLX_DMA_CSR_0_DONE)
409 break;
410 }
411
412 if ( ! (csr & PLX_DMA_CSR_0_DONE) )
413 {
414 printk("%s: DMA done never occurred. DMA disabled.\n",
415 dev->name);
416 priv->use_dma = 0;
417 return 1;
418 }
419 return 0;
420 }
421
422 /*
423 * dgrs_rcv_frame()
424 *
425 * Process a received frame. This is called from the interrupt
426 * routine, and works for both switch mode and multi-NIC mode.
427 *
428 * Note that when in multi-NIC mode, we want to always access the
429 * hardware using the dev and priv structures of the first port,
430 * so that we are using only one set of variables to maintain
431 * the board interface status, but we want to use the Nth port
432 * dev and priv structures to maintain statistics and to pass
433 * the packet up.
434 *
435 * Only the first device structure is attached to the interrupt.
436 * We use the special "chan" variable at the end of the first RBD
437 * to select the Nth device in multi-NIC mode.
438 *
439 * We currently do chained DMA on a per-packet basis when the
440 * packet is "long", and we spin the CPU a short time polling
441 * for DMA completion. This avoids a second interrupt overhead,
442 * and gives the best performance for light traffic to the host.
443 *
444 * However, a better scheme that could be implemented would be
445 * to see how many packets are outstanding for the host, and if
446 * the number is "large", create a long chain to DMA several
447 * packets into the host in one go. In this case, we would set
448 * up some state variables to let the host CPU continue doing
449 * other things until a DMA completion interrupt comes along.
450 */
451 static void
452 dgrs_rcv_frame(
453 struct net_device *dev0,
454 DGRS_PRIV *priv0,
455 I596_CB *cbp
456 )
457 {
458 int len;
459 I596_TBD *tbdp;
460 struct sk_buff *skb;
461 uchar *putp;
462 uchar *p;
463 struct net_device *devN;
464 DGRS_PRIV *privN;
465
466 /*
467 * Determine Nth priv and dev structure pointers
468 */
469 if (dgrs_nicmode)
470 { /* Multi-NIC mode */
471 int chan = ((I596_RBD *) S2H(cbp->xmit.tbdp))->chan;
472
473 devN = priv0->devtbl[chan-1];
474 /*
475 * If devN is null, we got an interrupt before the I/F
476 * has been initialized. Pitch the packet.
477 */
478 if (devN == NULL)
479 goto out;
480 privN = (DGRS_PRIV *) devN->priv;
481 }
482 else
483 { /* Switch mode */
484 devN = dev0;
485 privN = priv0;
486 }
487
488 if (0) printk("%s: rcv len=%ld\n", devN->name, cbp->xmit.count);
489
490 /*
491 * Allocate a message block big enough to hold the whole frame
492 */
493 len = cbp->xmit.count;
494 if ((skb = dev_alloc_skb(len+5)) == NULL)
495 {
496 printk("%s: dev_alloc_skb failed for rcv buffer\n", devN->name);
497 ++dev0->stats.rx_dropped;
498 /* discarding the frame */
499 goto out;
500 }
501 skb_reserve(skb, 2); /* Align IP header */
502
503 again:
504 putp = p = skb_put(skb, len);
505
506 /*
507 * There are three modes here for doing the packet copy.
508 * If we have DMA, and the packet is "long", we use the
509 * chaining mode of DMA. If it's shorter, we use single
510 * DMA's. Otherwise, we use memcpy().
511 */
512 if (priv0->use_dma && priv0->dmadesc_h && len > 64)
513 {
514 /*
515 * If we can use DMA and it's a long frame, copy it using
516 * DMA chaining.
517 */
518 DMACHAIN *ddp_h; /* Host virtual DMA desc. pointer */
519 DMACHAIN *ddp_s; /* Switch physical DMA desc. pointer */
520 uchar *phys_p;
521
522 /*
523 * Get the physical address of the STREAMS buffer.
524 * NOTE: allocb() guarantees that the whole buffer
525 * is in a single page if the length < 4096.
526 */
527 phys_p = (uchar *) virt_to_phys(putp);
528
529 ddp_h = priv0->dmadesc_h;
530 ddp_s = priv0->dmadesc_s;
531 tbdp = (I596_TBD *) S2H(cbp->xmit.tbdp);
532 for (;;)
533 {
534 int count;
535 int amt;
536
537 count = tbdp->count;
538 amt = count & 0x3fff;
539 if (amt == 0)
540 break; /* For safety */
541 if ( (p-putp) >= len)
542 {
543 printk("%s: cbp = %lx\n", devN->name, (long) H2S(cbp));
544 proc_reset(dev0, 1); /* Freeze IDT */
545 break; /* For Safety */
546 }
547
548 ddp_h->pciaddr = (ulong) phys_p;
549 ddp_h->lcladdr = S2DMA(tbdp->buf);
550 ddp_h->len = amt;
551
552 phys_p += amt;
553 p += amt;
554
555 if (count & I596_TBD_EOF)
556 {
557 ddp_h->next = PLX_DMA_DESC_TO_HOST
558 | PLX_DMA_DESC_EOC;
559 ++ddp_h;
560 break;
561 }
562 else
563 {
564 ++ddp_s;
565 ddp_h->next = PLX_DMA_DESC_TO_HOST
566 | (ulong) ddp_s;
567 tbdp = (I596_TBD *) S2H(tbdp->next);
568 ++ddp_h;
569 }
570 }
571 if (ddp_h - priv0->dmadesc_h)
572 {
573 int rc;
574
575 rc = do_plx_dma(dev0,
576 0, (ulong) priv0->dmadesc_s, len, 0);
577 if (rc)
578 {
579 printk("%s: Chained DMA failure\n", devN->name);
580 goto again;
581 }
582 }
583 }
584 else if (priv0->use_dma)
585 {
586 /*
587 * If we can use DMA and it's a shorter frame, copy it
588 * using single DMA transfers.
589 */
590 uchar *phys_p;
591
592 /*
593 * Get the physical address of the STREAMS buffer.
594 * NOTE: allocb() guarantees that the whole buffer
595 * is in a single page if the length < 4096.
596 */
597 phys_p = (uchar *) virt_to_phys(putp);
598
599 tbdp = (I596_TBD *) S2H(cbp->xmit.tbdp);
600 for (;;)
601 {
602 int count;
603 int amt;
604 int rc;
605
606 count = tbdp->count;
607 amt = count & 0x3fff;
608 if (amt == 0)
609 break; /* For safety */
610 if ( (p-putp) >= len)
611 {
612 printk("%s: cbp = %lx\n", devN->name, (long) H2S(cbp));
613 proc_reset(dev0, 1); /* Freeze IDT */
614 break; /* For Safety */
615 }
616 rc = do_plx_dma(dev0, (ulong) phys_p,
617 S2DMA(tbdp->buf), amt, 1);
618 if (rc)
619 {
620 memcpy(p, S2H(tbdp->buf), amt);
621 printk("%s: Single DMA failed\n", devN->name);
622 }
623 phys_p += amt;
624 p += amt;
625 if (count & I596_TBD_EOF)
626 break;
627 tbdp = (I596_TBD *) S2H(tbdp->next);
628 }
629 }
630 else
631 {
632 /*
633 * Otherwise, copy it piece by piece using memcpy()
634 */
635 tbdp = (I596_TBD *) S2H(cbp->xmit.tbdp);
636 for (;;)
637 {
638 int count;
639 int amt;
640
641 count = tbdp->count;
642 amt = count & 0x3fff;
643 if (amt == 0)
644 break; /* For safety */
645 if ( (p-putp) >= len)
646 {
647 printk("%s: cbp = %lx\n", devN->name, (long) H2S(cbp));
648 proc_reset(dev0, 1); /* Freeze IDT */
649 break; /* For Safety */
650 }
651 memcpy(p, S2H(tbdp->buf), amt);
652 p += amt;
653 if (count & I596_TBD_EOF)
654 break;
655 tbdp = (I596_TBD *) S2H(tbdp->next);
656 }
657 }
658
659 /*
660 * Pass the frame to upper half
661 */
662 skb->protocol = eth_type_trans(skb, devN);
663 netif_rx(skb);
664 devN->last_rx = jiffies;
665 ++devN->stats.rx_packets;
666 devN->stats.rx_bytes += len;
667
668 out:
669 cbp->xmit.status = I596_CB_STATUS_C | I596_CB_STATUS_OK;
670 }
671
672 /*
673 * Start transmission of a frame
674 *
675 * The interface to the board is simple: we pretend that we are
676 * a fifth 82596 ethernet controller 'receiving' data, and copy the
677 * data into the same structures that a real 82596 would. This way,
678 * the board firmware handles the host 'port' the same as any other.
679 *
680 * NOTE: we do not use Bus master DMA for this routine. Turns out
681 * that it is not needed. Slave writes over the PCI bus are about
682 * as fast as DMA, due to the fact that the PLX part can do burst
683 * writes. The same is not true for data being read from the board.
684 *
685 * For multi-NIC mode, we tell the firmware the desired 82596
686 * output port by setting the special "dstchan" member at the
687 * end of the traditional 82596 RFD structure.
688 */
689
690 static int dgrs_start_xmit(struct sk_buff *skb, struct net_device *devN)
691 {
692 DGRS_PRIV *privN = (DGRS_PRIV *) devN->priv;
693 struct net_device *dev0;
694 DGRS_PRIV *priv0;
695 I596_RBD *rbdp;
696 int count;
697 int i, len, amt;
698
699 /*
700 * Determine 0th priv and dev structure pointers
701 */
702 if (dgrs_nicmode)
703 {
704 dev0 = privN->devtbl[0];
705 priv0 = (DGRS_PRIV *) dev0->priv;
706 }
707 else
708 {
709 dev0 = devN;
710 priv0 = privN;
711 }
712
713 if (dgrs_debug > 1)
714 printk("%s: xmit len=%d\n", devN->name, (int) skb->len);
715
716 devN->trans_start = jiffies;
717 netif_start_queue(devN);
718
719 if (priv0->rfdp->cmd & I596_RFD_EL)
720 { /* Out of RFD's */
721 if (0) printk("%s: NO RFD's\n", devN->name);
722 goto no_resources;
723 }
724
725 rbdp = priv0->rbdp;
726 count = 0;
727 priv0->rfdp->rbdp = (I596_RBD *) H2S(rbdp);
728
729 i = 0; len = skb->len;
730 for (;;)
731 {
732 if (rbdp->size & I596_RBD_EL)
733 { /* Out of RBD's */
734 if (0) printk("%s: NO RBD's\n", devN->name);
735 goto no_resources;
736 }
737
738 amt = min_t(unsigned int, len, rbdp->size - count);
739 skb_copy_from_linear_data_offset(skb, i, S2H(rbdp->buf) + count, amt);
740 i += amt;
741 count += amt;
742 len -= amt;
743 if (len == 0)
744 {
745 if (skb->len < 60)
746 rbdp->count = 60 | I596_RBD_EOF;
747 else
748 rbdp->count = count | I596_RBD_EOF;
749 rbdp = (I596_RBD *) S2H(rbdp->next);
750 goto frame_done;
751 }
752 else if (count < 32)
753 {
754 /* More data to come, but we used less than 32
755 * bytes of this RBD. Keep filling this RBD.
756 */
757 {} /* Yes, we do nothing here */
758 }
759 else
760 {
761 rbdp->count = count;
762 rbdp = (I596_RBD *) S2H(rbdp->next);
763 count = 0;
764 }
765 }
766
767 frame_done:
768 priv0->rbdp = rbdp;
769 if (dgrs_nicmode)
770 priv0->rfdp->dstchan = privN->chan;
771 priv0->rfdp->status = I596_RFD_C | I596_RFD_OK;
772 priv0->rfdp = (I596_RFD *) S2H(priv0->rfdp->next);
773
774 ++devN->stats.tx_packets;
775
776 dev_kfree_skb (skb);
777 return (0);
778
779 no_resources:
780 priv0->scbp->status |= I596_SCB_RNR; /* simulate I82596 */
781 return (-EAGAIN);
782 }
783
784 /*
785 * Open the interface
786 */
787 static int
788 dgrs_open( struct net_device *dev )
789 {
790 netif_start_queue(dev);
791 return (0);
792 }
793
794 /*
795 * Close the interface
796 */
797 static int dgrs_close( struct net_device *dev )
798 {
799 netif_stop_queue(dev);
800 return (0);
801 }
802
803 /*
804 * Set multicast list and/or promiscuous mode
805 */
806
807 static void dgrs_set_multicast_list( struct net_device *dev)
808 {
809 DGRS_PRIV *priv = (DGRS_PRIV *) dev->priv;
810
811 priv->port->is_promisc = (dev->flags & IFF_PROMISC) ? 1 : 0;
812 }
813
814 /*
815 * Unique ioctl's
816 */
817 static int dgrs_ioctl(struct net_device *devN, struct ifreq *ifr, int cmd)
818 {
819 DGRS_PRIV *privN = (DGRS_PRIV *) devN->priv;
820 DGRS_IOCTL ioc;
821 int i;
822
823 if (cmd != DGRSIOCTL)
824 return -EINVAL;
825
826 if(copy_from_user(&ioc, ifr->ifr_data, sizeof(DGRS_IOCTL)))
827 return -EFAULT;
828
829 switch (ioc.cmd)
830 {
831 case DGRS_GETMEM:
832 if (ioc.len != sizeof(ulong))
833 return -EINVAL;
834 if(copy_to_user(ioc.data, &devN->mem_start, ioc.len))
835 return -EFAULT;
836 return (0);
837 case DGRS_SETFILTER:
838 if (!capable(CAP_NET_ADMIN))
839 return -EPERM;
840 if (ioc.port > privN->bcomm->bc_nports)
841 return -EINVAL;
842 if (ioc.filter >= NFILTERS)
843 return -EINVAL;
844 if (ioc.len > privN->bcomm->bc_filter_area_len)
845 return -EINVAL;
846
847 /* Wait for old command to finish */
848 for (i = 0; i < 1000; ++i)
849 {
850 if ( (volatile long) privN->bcomm->bc_filter_cmd <= 0 )
851 break;
852 udelay(1);
853 }
854 if (i >= 1000)
855 return -EIO;
856
857 privN->bcomm->bc_filter_port = ioc.port;
858 privN->bcomm->bc_filter_num = ioc.filter;
859 privN->bcomm->bc_filter_len = ioc.len;
860
861 if (ioc.len)
862 {
863 if(copy_from_user(S2HN(privN->bcomm->bc_filter_area),
864 ioc.data, ioc.len))
865 return -EFAULT;
866 privN->bcomm->bc_filter_cmd = BC_FILTER_SET;
867 }
868 else
869 privN->bcomm->bc_filter_cmd = BC_FILTER_CLR;
870 return(0);
871 default:
872 return -EOPNOTSUPP;
873 }
874 }
875
876 /*
877 * Process interrupts
878 *
879 * dev, priv will always refer to the 0th device in Multi-NIC mode.
880 */
881
882 static irqreturn_t dgrs_intr(int irq, void *dev_id)
883 {
884 struct net_device *dev0 = dev_id;
885 DGRS_PRIV *priv0 = dev0->priv;
886 I596_CB *cbp;
887 int cmd;
888 int i;
889
890 ++priv0->intrcnt;
891 if (1) ++priv0->bcomm->bc_cnt[4];
892 if (0)
893 {
894 static int cnt = 100;
895 if (--cnt > 0)
896 printk("%s: interrupt: irq %d\n", dev0->name, irq);
897 }
898
899 /*
900 * Get 596 command
901 */
902 cmd = priv0->scbp->cmd;
903
904 /*
905 * See if RU has been restarted
906 */
907 if ( (cmd & I596_SCB_RUC) == I596_SCB_RUC_START)
908 {
909 if (0) printk("%s: RUC start\n", dev0->name);
910 priv0->rfdp = (I596_RFD *) S2H(priv0->scbp->rfdp);
911 priv0->rbdp = (I596_RBD *) S2H(priv0->rfdp->rbdp);
912 priv0->scbp->status &= ~(I596_SCB_RNR|I596_SCB_RUS);
913 /*
914 * Tell upper half (halves)
915 */
916 if (dgrs_nicmode)
917 {
918 for (i = 0; i < priv0->nports; ++i)
919 netif_wake_queue (priv0->devtbl[i]);
920 }
921 else
922 netif_wake_queue (dev0);
923 /* if (bd->flags & TX_QUEUED)
924 DL_sched(bd, bdd); */
925 }
926
927 /*
928 * See if any CU commands to process
929 */
930 if ( (cmd & I596_SCB_CUC) != I596_SCB_CUC_START)
931 {
932 priv0->scbp->cmd = 0; /* Ignore all other commands */
933 goto ack_intr;
934 }
935 priv0->scbp->status &= ~(I596_SCB_CNA|I596_SCB_CUS);
936
937 /*
938 * Process a command
939 */
940 cbp = (I596_CB *) S2H(priv0->scbp->cbp);
941 priv0->scbp->cmd = 0; /* Safe to clear the command */
942 for (;;)
943 {
944 switch (cbp->nop.cmd & I596_CB_CMD)
945 {
946 case I596_CB_CMD_XMIT:
947 dgrs_rcv_frame(dev0, priv0, cbp);
948 break;
949 default:
950 cbp->nop.status = I596_CB_STATUS_C | I596_CB_STATUS_OK;
951 break;
952 }
953 if (cbp->nop.cmd & I596_CB_CMD_EL)
954 break;
955 cbp = (I596_CB *) S2H(cbp->nop.next);
956 }
957 priv0->scbp->status |= I596_SCB_CNA;
958
959 /*
960 * Ack the interrupt
961 */
962 ack_intr:
963 if (priv0->plxreg)
964 OUTL(dev0->base_addr + PLX_LCL2PCI_DOORBELL, 1);
965
966 return IRQ_HANDLED;
967 }
968
969 /*
970 * Download the board firmware
971 */
972 static int __init
973 dgrs_download(struct net_device *dev0)
974 {
975 DGRS_PRIV *priv0 = (DGRS_PRIV *) dev0->priv;
976 int is;
977 unsigned long i;
978
979 static const int iv2is[16] = {
980 0, 0, 0, ES4H_IS_INT3,
981 0, ES4H_IS_INT5, 0, ES4H_IS_INT7,
982 0, 0, ES4H_IS_INT10, ES4H_IS_INT11,
983 ES4H_IS_INT12, 0, 0, ES4H_IS_INT15 };
984
985 /*
986 * Map in the dual port memory
987 */
988 priv0->vmem = ioremap(dev0->mem_start, 2048*1024);
989 if (!priv0->vmem)
990 {
991 printk("%s: cannot map in board memory\n", dev0->name);
992 return -ENXIO;
993 }
994
995 /*
996 * Hold the processor and configure the board addresses
997 */
998 if (priv0->plxreg)
999 { /* PCI bus */
1000 proc_reset(dev0, 1);
1001 }
1002 else
1003 { /* EISA bus */
1004 is = iv2is[dev0->irq & 0x0f];
1005 if (!is)
1006 {
1007 printk("%s: Illegal IRQ %d\n", dev0->name, dev0->irq);
1008 iounmap(priv0->vmem);
1009 priv0->vmem = NULL;
1010 return -ENXIO;
1011 }
1012 OUTB(dev0->base_addr + ES4H_AS_31_24,
1013 (uchar) (dev0->mem_start >> 24) );
1014 OUTB(dev0->base_addr + ES4H_AS_23_16,
1015 (uchar) (dev0->mem_start >> 16) );
1016 priv0->is_reg = ES4H_IS_LINEAR | is |
1017 ((uchar) (dev0->mem_start >> 8) & ES4H_IS_AS15);
1018 OUTB(dev0->base_addr + ES4H_IS, priv0->is_reg);
1019 OUTB(dev0->base_addr + ES4H_EC, ES4H_EC_ENABLE);
1020 OUTB(dev0->base_addr + ES4H_PC, ES4H_PC_RESET);
1021 OUTB(dev0->base_addr + ES4H_MW, ES4H_MW_ENABLE | 0x00);
1022 }
1023
1024 /*
1025 * See if we can do DMA on the SE-6
1026 */
1027 priv0->use_dma = check_board_dma(dev0);
1028 if (priv0->use_dma)
1029 printk("%s: Bus Master DMA is enabled.\n", dev0->name);
1030
1031 /*
1032 * Load and verify the code at the desired address
1033 */
1034 memcpy(priv0->vmem, dgrs_code, dgrs_ncode); /* Load code */
1035 if (memcmp(priv0->vmem, dgrs_code, dgrs_ncode))
1036 {
1037 iounmap(priv0->vmem);
1038 priv0->vmem = NULL;
1039 printk("%s: download compare failed\n", dev0->name);
1040 return -ENXIO;
1041 }
1042
1043 /*
1044 * Configurables
1045 */
1046 priv0->bcomm = (struct bios_comm *) (priv0->vmem + 0x0100);
1047 priv0->bcomm->bc_nowait = 1; /* Tell board to make printf not wait */
1048 priv0->bcomm->bc_squelch = 0; /* Flag from Space.c */
1049 priv0->bcomm->bc_150ohm = 0; /* Flag from Space.c */
1050
1051 priv0->bcomm->bc_spew = 0; /* Debug flag from Space.c */
1052 priv0->bcomm->bc_maxrfd = 0; /* Debug flag from Space.c */
1053 priv0->bcomm->bc_maxrbd = 0; /* Debug flag from Space.c */
1054
1055 /*
1056 * Tell board we are operating in switch mode (1) or in
1057 * multi-NIC mode (2).
1058 */
1059 priv0->bcomm->bc_host = dgrs_nicmode ? BC_MULTINIC : BC_SWITCH;
1060
1061 /*
1062 * Request memory space on board for DMA chains
1063 */
1064 if (priv0->use_dma)
1065 priv0->bcomm->bc_hostarea_len = (2048/64) * 16;
1066
1067 /*
1068 * NVRAM configurables from Space.c
1069 */
1070 priv0->bcomm->bc_spantree = dgrs_spantree;
1071 priv0->bcomm->bc_hashexpire = dgrs_hashexpire;
1072 memcpy(priv0->bcomm->bc_ipaddr, dgrs_ipaddr, 4);
1073 memcpy(priv0->bcomm->bc_iptrap, dgrs_iptrap, 4);
1074 memcpy(priv0->bcomm->bc_ipxnet, &dgrs_ipxnet, 4);
1075
1076 /*
1077 * Release processor, wait 8 seconds for board to initialize
1078 */
1079 proc_reset(dev0, 0);
1080
1081 for (i = jiffies + 8 * HZ; time_after(i, jiffies); )
1082 {
1083 barrier(); /* Gcc 2.95 needs this */
1084 if (priv0->bcomm->bc_status >= BC_RUN)
1085 break;
1086 }
1087
1088 if (priv0->bcomm->bc_status < BC_RUN)
1089 {
1090 printk("%s: board not operating\n", dev0->name);
1091 iounmap(priv0->vmem);
1092 priv0->vmem = NULL;
1093 return -ENXIO;
1094 }
1095
1096 priv0->port = (PORT *) S2H(priv0->bcomm->bc_port);
1097 priv0->scbp = (I596_SCB *) S2H(priv0->port->scbp);
1098 priv0->rfdp = (I596_RFD *) S2H(priv0->scbp->rfdp);
1099 priv0->rbdp = (I596_RBD *) S2H(priv0->rfdp->rbdp);
1100
1101 priv0->scbp->status = I596_SCB_CNA; /* CU is idle */
1102
1103 /*
1104 * Get switch physical and host virtual pointers to DMA
1105 * chaining area. NOTE: the MSB of the switch physical
1106 * address *must* be turned off. Otherwise, the HW kludge
1107 * that allows host access of the PLX DMA registers will
1108 * erroneously select the PLX registers.
1109 */
1110 priv0->dmadesc_s = (DMACHAIN *) S2DMA(priv0->bcomm->bc_hostarea);
1111 if (priv0->dmadesc_s)
1112 priv0->dmadesc_h = (DMACHAIN *) S2H(priv0->dmadesc_s);
1113 else
1114 priv0->dmadesc_h = NULL;
1115
1116 /*
1117 * Enable board interrupts
1118 */
1119 if (priv0->plxreg)
1120 { /* PCI bus */
1121 OUTL(dev0->base_addr + PLX_INT_CSR,
1122 inl(dev0->base_addr + PLX_INT_CSR)
1123 | PLX_PCI_DOORBELL_IE); /* Enable intr to host */
1124 OUTL(dev0->base_addr + PLX_LCL2PCI_DOORBELL, 1);
1125 }
1126 else
1127 { /* EISA bus */
1128 }
1129
1130 return (0);
1131 }
1132
1133 /*
1134 * Probe (init) a board
1135 */
1136 static int __init
1137 dgrs_probe1(struct net_device *dev)
1138 {
1139 DGRS_PRIV *priv = (DGRS_PRIV *) dev->priv;
1140 unsigned long i;
1141 int rc;
1142
1143 printk("%s: Digi RightSwitch io=%lx mem=%lx irq=%d plx=%lx dma=%lx\n",
1144 dev->name, dev->base_addr, dev->mem_start, dev->irq,
1145 priv->plxreg, priv->plxdma);
1146
1147 /*
1148 * Download the firmware and light the processor
1149 */
1150 rc = dgrs_download(dev);
1151 if (rc)
1152 goto err_out;
1153
1154 /*
1155 * Get ether address of board
1156 */
1157 printk("%s: Ethernet address", dev->name);
1158 memcpy(dev->dev_addr, priv->port->ethaddr, 6);
1159 for (i = 0; i < 6; ++i)
1160 printk("%c%2.2x", i ? ':' : ' ', dev->dev_addr[i]);
1161 printk("\n");
1162
1163 if (dev->dev_addr[0] & 1)
1164 {
1165 printk("%s: Illegal Ethernet Address\n", dev->name);
1166 rc = -ENXIO;
1167 goto err_out;
1168 }
1169
1170 /*
1171 * ACK outstanding interrupts, hook the interrupt,
1172 * and verify that we are getting interrupts from the board.
1173 */
1174 if (priv->plxreg)
1175 OUTL(dev->base_addr + PLX_LCL2PCI_DOORBELL, 1);
1176
1177 rc = request_irq(dev->irq, &dgrs_intr, IRQF_SHARED, "RightSwitch", dev);
1178 if (rc)
1179 goto err_out;
1180
1181 priv->intrcnt = 0;
1182 for (i = jiffies + 2*HZ + HZ/2; time_after(i, jiffies); )
1183 {
1184 cpu_relax();
1185 if (priv->intrcnt >= 2)
1186 break;
1187 }
1188 if (priv->intrcnt < 2)
1189 {
1190 printk(KERN_ERR "%s: Not interrupting on IRQ %d (%d)\n",
1191 dev->name, dev->irq, priv->intrcnt);
1192 rc = -ENXIO;
1193 goto err_free_irq;
1194 }
1195
1196 /*
1197 * Entry points...
1198 */
1199 dev->open = &dgrs_open;
1200 dev->stop = &dgrs_close;
1201 dev->hard_start_xmit = &dgrs_start_xmit;
1202 dev->set_multicast_list = &dgrs_set_multicast_list;
1203 dev->do_ioctl = &dgrs_ioctl;
1204
1205 return rc;
1206
1207 err_free_irq:
1208 free_irq(dev->irq, dev);
1209 err_out:
1210 return rc;
1211 }
1212
1213 static int __init
1214 dgrs_initclone(struct net_device *dev)
1215 {
1216 DGRS_PRIV *priv = (DGRS_PRIV *) dev->priv;
1217 int i;
1218
1219 printk("%s: Digi RightSwitch port %d ",
1220 dev->name, priv->chan);
1221 for (i = 0; i < 6; ++i)
1222 printk("%c%2.2x", i ? ':' : ' ', dev->dev_addr[i]);
1223 printk("\n");
1224
1225 return (0);
1226 }
1227
1228 static struct net_device * __init
1229 dgrs_found_device(
1230 int io,
1231 ulong mem,
1232 int irq,
1233 ulong plxreg,
1234 ulong plxdma,
1235 struct device *pdev
1236 )
1237 {
1238 DGRS_PRIV *priv;
1239 struct net_device *dev;
1240 int i, ret = -ENOMEM;
1241
1242 dev = alloc_etherdev(sizeof(DGRS_PRIV));
1243 if (!dev)
1244 goto err0;
1245
1246 priv = (DGRS_PRIV *)dev->priv;
1247
1248 dev->base_addr = io;
1249 dev->mem_start = mem;
1250 dev->mem_end = mem + 2048 * 1024 - 1;
1251 dev->irq = irq;
1252 priv->plxreg = plxreg;
1253 priv->plxdma = plxdma;
1254 priv->vplxdma = NULL;
1255
1256 priv->chan = 1;
1257 priv->devtbl[0] = dev;
1258
1259 SET_NETDEV_DEV(dev, pdev);
1260
1261 ret = dgrs_probe1(dev);
1262 if (ret)
1263 goto err1;
1264
1265 ret = register_netdev(dev);
1266 if (ret)
1267 goto err2;
1268
1269 if ( !dgrs_nicmode )
1270 return dev; /* Switch mode, we are done */
1271
1272 /*
1273 * Operating card as N separate NICs
1274 */
1275
1276 priv->nports = priv->bcomm->bc_nports;
1277
1278 for (i = 1; i < priv->nports; ++i)
1279 {
1280 struct net_device *devN;
1281 DGRS_PRIV *privN;
1282 /* Allocate new dev and priv structures */
1283 devN = alloc_etherdev(sizeof(DGRS_PRIV));
1284 ret = -ENOMEM;
1285 if (!devN)
1286 goto fail;
1287
1288 /* Don't copy the network device structure! */
1289
1290 /* copy the priv structure of dev[0] */
1291 privN = (DGRS_PRIV *)devN->priv;
1292 *privN = *priv;
1293
1294 /* ... and zero out VM areas */
1295 privN->vmem = NULL;
1296 privN->vplxdma = NULL;
1297 /* ... and zero out IRQ */
1298 devN->irq = 0;
1299 /* ... and base MAC address off address of 1st port */
1300 devN->dev_addr[5] += i;
1301
1302 ret = dgrs_initclone(devN);
1303 if (ret)
1304 goto fail;
1305
1306 SET_NETDEV_DEV(dev, pdev);
1307
1308 ret = register_netdev(devN);
1309 if (ret) {
1310 free_netdev(devN);
1311 goto fail;
1312 }
1313 privN->chan = i+1;
1314 priv->devtbl[i] = devN;
1315 }
1316 return dev;
1317
1318 fail:
1319 while (i >= 0) {
1320 struct net_device *d = priv->devtbl[i--];
1321 unregister_netdev(d);
1322 free_netdev(d);
1323 }
1324
1325 err2:
1326 free_irq(dev->irq, dev);
1327 err1:
1328 free_netdev(dev);
1329 err0:
1330 return ERR_PTR(ret);
1331 }
1332
1333 static void __devexit dgrs_remove(struct net_device *dev)
1334 {
1335 DGRS_PRIV *priv = dev->priv;
1336 int i;
1337
1338 unregister_netdev(dev);
1339
1340 for (i = 1; i < priv->nports; ++i) {
1341 struct net_device *d = priv->devtbl[i];
1342 if (d) {
1343 unregister_netdev(d);
1344 free_netdev(d);
1345 }
1346 }
1347
1348 proc_reset(priv->devtbl[0], 1);
1349
1350 if (priv->vmem)
1351 iounmap(priv->vmem);
1352 if (priv->vplxdma)
1353 iounmap((uchar *) priv->vplxdma);
1354
1355 if (dev->irq)
1356 free_irq(dev->irq, dev);
1357
1358 for (i = 1; i < priv->nports; ++i) {
1359 if (priv->devtbl[i])
1360 unregister_netdev(priv->devtbl[i]);
1361 }
1362 }
1363
1364 #ifdef CONFIG_PCI
1365 static int __init dgrs_pci_probe(struct pci_dev *pdev,
1366 const struct pci_device_id *ent)
1367 {
1368 struct net_device *dev;
1369 int err;
1370 uint io;
1371 uint mem;
1372 uint irq;
1373 uint plxreg;
1374 uint plxdma;
1375
1376 /*
1377 * Get and check the bus-master and latency values.
1378 * Some PCI BIOSes fail to set the master-enable bit,
1379 * and the latency timer must be set to the maximum
1380 * value to avoid data corruption that occurs when the
1381 * timer expires during a transfer. Yes, it's a bug.
1382 */
1383 err = pci_enable_device(pdev);
1384 if (err)
1385 return err;
1386 err = pci_request_regions(pdev, "RightSwitch");
1387 if (err)
1388 return err;
1389
1390 pci_set_master(pdev);
1391
1392 plxreg = pci_resource_start (pdev, 0);
1393 io = pci_resource_start (pdev, 1);
1394 mem = pci_resource_start (pdev, 2);
1395 pci_read_config_dword(pdev, 0x30, &plxdma);
1396 irq = pdev->irq;
1397 plxdma &= ~15;
1398
1399 /*
1400 * On some BIOSES, the PLX "expansion rom" (used for DMA)
1401 * address comes up as "0". This is probably because
1402 * the BIOS doesn't see a valid 55 AA ROM signature at
1403 * the "ROM" start and zeroes the address. To get
1404 * around this problem the SE-6 is configured to ask
1405 * for 4 MB of space for the dual port memory. We then
1406 * must set its range back to 2 MB, and use the upper
1407 * half for DMA register access
1408 */
1409 OUTL(io + PLX_SPACE0_RANGE, 0xFFE00000L);
1410 if (plxdma == 0)
1411 plxdma = mem + (2048L * 1024L);
1412 pci_write_config_dword(pdev, 0x30, plxdma + 1);
1413 pci_read_config_dword(pdev, 0x30, &plxdma);
1414 plxdma &= ~15;
1415
1416 dev = dgrs_found_device(io, mem, irq, plxreg, plxdma, &pdev->dev);
1417 if (IS_ERR(dev)) {
1418 pci_release_regions(pdev);
1419 return PTR_ERR(dev);
1420 }
1421
1422 pci_set_drvdata(pdev, dev);
1423 return 0;
1424 }
1425
1426 static void __devexit dgrs_pci_remove(struct pci_dev *pdev)
1427 {
1428 struct net_device *dev = pci_get_drvdata(pdev);
1429
1430 dgrs_remove(dev);
1431 pci_release_regions(pdev);
1432 free_netdev(dev);
1433 }
1434
1435 static struct pci_driver dgrs_pci_driver = {
1436 .name = "dgrs",
1437 .id_table = dgrs_pci_tbl,
1438 .probe = dgrs_pci_probe,
1439 .remove = __devexit_p(dgrs_pci_remove),
1440 };
1441 #else
1442 static struct pci_driver dgrs_pci_driver = {};
1443 #endif
1444
1445
1446 #ifdef CONFIG_EISA
1447 static int is2iv[8] __initdata = { 0, 3, 5, 7, 10, 11, 12, 15 };
1448
1449 static int __init dgrs_eisa_probe (struct device *gendev)
1450 {
1451 struct net_device *dev;
1452 struct eisa_device *edev = to_eisa_device(gendev);
1453 uint io = edev->base_addr;
1454 uint mem;
1455 uint irq;
1456 int rc = -ENODEV; /* Not EISA configured */
1457
1458 if (!request_region(io, 256, "RightSwitch")) {
1459 printk(KERN_ERR "dgrs: eisa io 0x%x, which is busy.\n", io);
1460 return -EBUSY;
1461 }
1462
1463 if ( ! (inb(io+ES4H_EC) & ES4H_EC_ENABLE) )
1464 goto err_out;
1465
1466 mem = (inb(io+ES4H_AS_31_24) << 24)
1467 + (inb(io+ES4H_AS_23_16) << 16);
1468
1469 irq = is2iv[ inb(io+ES4H_IS) & ES4H_IS_INTMASK ];
1470
1471 dev = dgrs_found_device(io, mem, irq, 0L, 0L, gendev);
1472 if (IS_ERR(dev)) {
1473 rc = PTR_ERR(dev);
1474 goto err_out;
1475 }
1476
1477 gendev->driver_data = dev;
1478 return 0;
1479 err_out:
1480 release_region(io, 256);
1481 return rc;
1482 }
1483
1484 static int __devexit dgrs_eisa_remove(struct device *gendev)
1485 {
1486 struct net_device *dev = gendev->driver_data;
1487
1488 dgrs_remove(dev);
1489
1490 release_region(dev->base_addr, 256);
1491
1492 free_netdev(dev);
1493 return 0;
1494 }
1495
1496
1497 static struct eisa_driver dgrs_eisa_driver = {
1498 .id_table = dgrs_eisa_tbl,
1499 .driver = {
1500 .name = "dgrs",
1501 .probe = dgrs_eisa_probe,
1502 .remove = __devexit_p(dgrs_eisa_remove),
1503 }
1504 };
1505 #endif
1506
1507 /*
1508 * Variables that can be overriden from module command line
1509 */
1510 static int debug = -1;
1511 static int dma = -1;
1512 static int hashexpire = -1;
1513 static int spantree = -1;
1514 static int ipaddr[4] = { -1 };
1515 static int iptrap[4] = { -1 };
1516 static __u32 ipxnet = -1;
1517 static int nicmode = -1;
1518
1519 module_param(debug, int, 0);
1520 module_param(dma, int, 0);
1521 module_param(hashexpire, int, 0);
1522 module_param(spantree, int, 0);
1523 module_param_array(ipaddr, int, NULL, 0);
1524 module_param_array(iptrap, int, NULL, 0);
1525 module_param(ipxnet, int, 0);
1526 module_param(nicmode, int, 0);
1527 MODULE_PARM_DESC(debug, "Digi RightSwitch enable debugging (0-1)");
1528 MODULE_PARM_DESC(dma, "Digi RightSwitch enable BM DMA (0-1)");
1529 MODULE_PARM_DESC(nicmode, "Digi RightSwitch operating mode (1: switch, 2: multi-NIC)");
1530
1531 static int __init dgrs_init_module (void)
1532 {
1533 int i;
1534 int err;
1535
1536 /*
1537 * Command line variable overrides
1538 * debug=NNN
1539 * dma=0/1
1540 * spantree=0/1
1541 * hashexpire=NNN
1542 * ipaddr=A,B,C,D
1543 * iptrap=A,B,C,D
1544 * ipxnet=NNN
1545 * nicmode=NNN
1546 */
1547 if (debug >= 0)
1548 dgrs_debug = debug;
1549 if (dma >= 0)
1550 dgrs_dma = dma;
1551 if (nicmode >= 0)
1552 dgrs_nicmode = nicmode;
1553 if (hashexpire >= 0)
1554 dgrs_hashexpire = hashexpire;
1555 if (spantree >= 0)
1556 dgrs_spantree = spantree;
1557 if (ipaddr[0] != -1)
1558 for (i = 0; i < 4; ++i)
1559 dgrs_ipaddr[i] = ipaddr[i];
1560 if (iptrap[0] != -1)
1561 for (i = 0; i < 4; ++i)
1562 dgrs_iptrap[i] = iptrap[i];
1563 if (ipxnet != -1)
1564 dgrs_ipxnet = htonl( ipxnet );
1565
1566 if (dgrs_debug)
1567 {
1568 printk(KERN_INFO "dgrs: SW=%s FW=Build %d %s\nFW Version=%s\n",
1569 version, dgrs_firmnum, dgrs_firmdate, dgrs_firmver);
1570 }
1571
1572 /*
1573 * Find and configure all the cards
1574 */
1575 #ifdef CONFIG_EISA
1576 err = eisa_driver_register(&dgrs_eisa_driver);
1577 if (err)
1578 return err;
1579 #endif
1580 err = pci_register_driver(&dgrs_pci_driver);
1581 if (err)
1582 return err;
1583 return 0;
1584 }
1585
1586 static void __exit dgrs_cleanup_module (void)
1587 {
1588 #ifdef CONFIG_EISA
1589 eisa_driver_unregister (&dgrs_eisa_driver);
1590 #endif
1591 #ifdef CONFIG_PCI
1592 pci_unregister_driver (&dgrs_pci_driver);
1593 #endif
1594 }
1595
1596 module_init(dgrs_init_module);
1597 module_exit(dgrs_cleanup_module);
This page took 0.063494 seconds and 5 git commands to generate.