dgrs.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:37k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  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. #include <linux/module.h>
  86. #include <linux/kernel.h>
  87. #include <linux/sched.h>
  88. #include <linux/string.h>
  89. #include <linux/delay.h>
  90. #include <linux/errno.h>
  91. #include <linux/ioport.h>
  92. #include <linux/slab.h>
  93. #include <linux/interrupt.h>
  94. #include <linux/pci.h>
  95. #include <linux/init.h>
  96. #include <linux/netdevice.h>
  97. #include <linux/etherdevice.h>
  98. #include <linux/skbuff.h>
  99. #include <asm/bitops.h>
  100. #include <asm/io.h>
  101. #include <asm/byteorder.h>
  102. #include <asm/uaccess.h>
  103. static char version[] __initdata =
  104. "$Id: dgrs.c,v 1.13 2000/06/06 04:07:00 rick Exp $";
  105. /*
  106.  * DGRS include files
  107.  */
  108. typedef unsigned char uchar;
  109. typedef unsigned int bool;
  110. #define vol volatile
  111. #include "dgrs.h"
  112. #include "dgrs_es4h.h"
  113. #include "dgrs_plx9060.h"
  114. #include "dgrs_i82596.h"
  115. #include "dgrs_ether.h"
  116. #include "dgrs_asstruct.h"
  117. #include "dgrs_bcomm.h"
  118. static struct pci_device_id dgrs_pci_tbl[] __initdata = {
  119. { SE6_PCI_VENDOR_ID, SE6_PCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, },
  120. { } /* Terminating entry */
  121. };
  122. MODULE_DEVICE_TABLE(pci, dgrs_pci_tbl);
  123. MODULE_LICENSE("GPL");
  124. /*
  125.  * Firmware.  Compiled separately for local compilation,
  126.  * but #included for Linux distribution.
  127.  */
  128. #ifndef NOFW
  129. #include "dgrs_firmware.c"
  130. #else
  131. extern int dgrs_firmnum;
  132. extern char dgrs_firmver[];
  133. extern char dgrs_firmdate[];
  134. extern uchar dgrs_code[];
  135. extern int dgrs_ncode;
  136. #endif
  137. /*
  138.  * Linux out*() is backwards from all other operating systems
  139.  */
  140. #define OUTB(ADDR, VAL) outb(VAL, ADDR)
  141. #define OUTW(ADDR, VAL) outw(VAL, ADDR)
  142. #define OUTL(ADDR, VAL) outl(VAL, ADDR)
  143. /*
  144.  * Macros to convert switch to host and host to switch addresses
  145.  * (assumes a local variable priv points to board dependent struct)
  146.  */
  147. #define S2H(A) ( ((unsigned long)(A)&0x00ffffff) + priv0->vmem )
  148. #define S2HN(A) ( ((unsigned long)(A)&0x00ffffff) + privN->vmem )
  149. #define H2S(A) ( ((char *) (A) - priv0->vmem) + 0xA3000000 )
  150. /*
  151.  * Convert a switch address to a "safe" address for use with the
  152.  * PLX 9060 DMA registers and the associated HW kludge that allows
  153.  * for host access of the DMA registers.
  154.  */
  155. #define S2DMA(A) ( (unsigned long)(A) & 0x00ffffff)
  156. /*
  157.  * "Space.c" variables, now settable from module interface
  158.  * Use the name below, minus the "dgrs_" prefix.  See init_module().
  159.  */
  160. static int dgrs_debug = 1;
  161. static int dgrs_dma = 1;
  162. static int dgrs_spantree = -1;
  163. static int dgrs_hashexpire = -1;
  164. static uchar dgrs_ipaddr[4] = { 0xff, 0xff, 0xff, 0xff};
  165. static uchar dgrs_iptrap[4] = { 0xff, 0xff, 0xff, 0xff};
  166. static __u32 dgrs_ipxnet = -1;
  167. static int dgrs_nicmode;
  168. /*
  169.  * Chain of device structures
  170.  */
  171. static struct net_device *dgrs_root_dev;
  172. /*
  173.  * Private per-board data structure (dev->priv)
  174.  */
  175. typedef struct
  176. {
  177. /*
  178.  * Stuff for generic ethercard I/F
  179.  */
  180. struct net_device *next_dev;
  181. struct net_device_stats stats;
  182. /*
  183.  * DGRS specific data
  184.  */
  185. char *vmem;
  186.         struct bios_comm *bcomm;        /* Firmware BIOS comm structure */
  187.         PORT            *port;          /* Ptr to PORT[0] struct in VM */
  188.         I596_SCB        *scbp;          /* Ptr to SCB struct in VM */
  189.         I596_RFD        *rfdp;          /* Current RFD list */
  190.         I596_RBD        *rbdp;          /* Current RBD list */
  191.         volatile int    intrcnt;        /* Count of interrupts */
  192.         /*
  193.          *      SE-4 (EISA) board variables
  194.          */
  195.         uchar is_reg; /* EISA: Value for ES4H_IS reg */
  196.         /*
  197.          *      SE-6 (PCI) board variables
  198.          *
  199.          *      The PLX "expansion rom" space is used for DMA register
  200.          *      access from the host on the SE-6.  These are the physical
  201.          *      and virtual addresses of that space.
  202.          */
  203.         ulong plxreg; /* Phys address of PLX chip */
  204.         char            *vplxreg; /* Virtual address of PLX chip */
  205.         ulong plxdma; /* Phys addr of PLX "expansion rom" */
  206.         ulong volatile  *vplxdma; /* Virtual addr of "expansion rom" */
  207.         int             use_dma;        /* Flag: use DMA */
  208. DMACHAIN *dmadesc_s; /* area for DMA chains (SW addr.) */
  209. DMACHAIN *dmadesc_h; /* area for DMA chains (Host Virtual) */
  210. /*
  211.  * Multi-NIC mode variables
  212.  *
  213.  * All entries of the devtbl[] array are valid for the 0th
  214.  * device (i.e. eth0, but not eth1...eth5).  devtbl[0] is
  215.  * valid for all devices (i.e. eth0, eth1, ..., eth5).
  216.  */
  217. int nports; /* Number of physical ports (4 or 6) */
  218. int chan; /* Channel # (1-6) for this device */
  219. struct net_device *devtbl[6]; /* Ptrs to N device structs */
  220. } DGRS_PRIV;
  221. /*
  222.  * reset or un-reset the IDT processor
  223.  */
  224. static void
  225. proc_reset(struct net_device *dev0, int reset)
  226. {
  227. DGRS_PRIV *priv0 = (DGRS_PRIV *) dev0->priv;
  228. if (priv0->plxreg)
  229. {
  230. ulong val;
  231. val = inl(dev0->base_addr + PLX_MISC_CSR);
  232. if (reset)
  233. val |= SE6_RESET;
  234. else
  235. val &= ~SE6_RESET;
  236. OUTL(dev0->base_addr + PLX_MISC_CSR, val);
  237. }
  238. else
  239. {
  240. OUTB(dev0->base_addr + ES4H_PC, reset ? ES4H_PC_RESET : 0);
  241. }
  242. }
  243. /*
  244.  * See if the board supports bus master DMA
  245.  */
  246. static int
  247. check_board_dma(struct net_device *dev0)
  248. {
  249. DGRS_PRIV *priv0 = (DGRS_PRIV *) dev0->priv;
  250. ulong x;
  251. /*
  252.  * If Space.c says not to use DMA, or if its not a PLX based
  253.  * PCI board, or if the expansion ROM space is not PCI
  254.  * configured, then return false.
  255.  */
  256. if (!dgrs_dma || !priv0->plxreg || !priv0->plxdma)
  257. return (0);
  258. /*
  259.  * Set the local address remap register of the "expansion rom"
  260.  * area to 0x80000000 so that we can use it to access the DMA
  261.  * registers from the host side.
  262.  */
  263. OUTL(dev0->base_addr + PLX_ROM_BASE_ADDR, 0x80000000);
  264. /*
  265.  * Set the PCI region descriptor to:
  266.  *      Space 0:
  267.  *              disable read-prefetch
  268.  *              enable READY
  269.  *              enable BURST
  270.  *              0 internal wait states
  271.  *      Expansion ROM: (used for host DMA register access)
  272.  *              disable read-prefetch
  273.  *              enable READY
  274.  *              disable BURST
  275.  *              0 internal wait states
  276.  */
  277. OUTL(dev0->base_addr + PLX_BUS_REGION, 0x49430343);
  278. /*
  279.  * Now map the DMA registers into our virtual space
  280.  */
  281. priv0->vplxdma = (ulong *) ioremap (priv0->plxdma, 256);
  282. if (!priv0->vplxdma)
  283. {
  284. printk("%s: can't *remap() the DMA regsn", dev0->name);
  285. return (0);
  286. }
  287. /*
  288.  * Now test to see if we can access the DMA registers
  289.  * If we write -1 and get back 1FFF, then we accessed the
  290.  * DMA register.  Otherwise, we probably have an old board
  291.  * and wrote into regular RAM.
  292.  */
  293. priv0->vplxdma[PLX_DMA0_MODE/4] = 0xFFFFFFFF;
  294. x = priv0->vplxdma[PLX_DMA0_MODE/4];
  295. if (x != 0x00001FFF)
  296. return (0);
  297. return (1);
  298. }
  299. /*
  300.  * Initiate DMA using PLX part on PCI board.  Spin the
  301.  * processor until completed.  All addresses are physical!
  302.  *
  303.  * If pciaddr is NULL, then its a chaining DMA, and lcladdr is
  304.  * the address of the first DMA descriptor in the chain.
  305.  *
  306.  * If pciaddr is not NULL, then its a single DMA.
  307.  *
  308.  * In either case, "lcladdr" must have been fixed up to make
  309.  * sure the MSB isn't set using the S2DMA macro before passing
  310.  * the address to this routine.
  311.  */
  312. static int
  313. do_plx_dma(
  314. struct net_device *dev,
  315. ulong pciaddr,
  316. ulong lcladdr,
  317. int len,
  318. int to_host
  319. )
  320. {
  321.         int      i;
  322.         ulong    csr = 0;
  323. DGRS_PRIV *priv = (DGRS_PRIV *) dev->priv;
  324. if (pciaddr)
  325. {
  326. /*
  327.  * Do a single, non-chain DMA
  328.  */
  329. priv->vplxdma[PLX_DMA0_PCI_ADDR/4] = pciaddr;
  330. priv->vplxdma[PLX_DMA0_LCL_ADDR/4] = lcladdr;
  331. priv->vplxdma[PLX_DMA0_SIZE/4] = len;
  332. priv->vplxdma[PLX_DMA0_DESCRIPTOR/4] = to_host
  333. ? PLX_DMA_DESC_TO_HOST
  334. : PLX_DMA_DESC_TO_BOARD;
  335. priv->vplxdma[PLX_DMA0_MODE/4] =
  336.   PLX_DMA_MODE_WIDTH32
  337. | PLX_DMA_MODE_WAITSTATES(0)
  338. | PLX_DMA_MODE_READY
  339. | PLX_DMA_MODE_NOBTERM
  340. | PLX_DMA_MODE_BURST
  341. | PLX_DMA_MODE_NOCHAIN;
  342. }
  343. else
  344. {
  345. /*
  346.  * Do a chaining DMA
  347.  */
  348. priv->vplxdma[PLX_DMA0_MODE/4] =
  349.   PLX_DMA_MODE_WIDTH32
  350. | PLX_DMA_MODE_WAITSTATES(0)
  351. | PLX_DMA_MODE_READY
  352. | PLX_DMA_MODE_NOBTERM
  353. | PLX_DMA_MODE_BURST
  354. | PLX_DMA_MODE_CHAIN;
  355. priv->vplxdma[PLX_DMA0_DESCRIPTOR/4] = lcladdr;
  356. }
  357. priv->vplxdma[PLX_DMA_CSR/4] =
  358. PLX_DMA_CSR_0_ENABLE | PLX_DMA_CSR_0_START;
  359.         /*
  360.  * Wait for DMA to complete
  361.  */
  362.         for (i = 0; i < 1000000; ++i)
  363.         {
  364. /*
  365.  * Spin the host CPU for 1 usec, so we don't thrash
  366.  * the PCI bus while the PLX 9060 is doing DMA.
  367.  */
  368. udelay(1);
  369. csr = (volatile unsigned long) priv->vplxdma[PLX_DMA_CSR/4];
  370.                 if (csr & PLX_DMA_CSR_0_DONE)
  371.                         break;
  372.         }
  373.         if ( ! (csr & PLX_DMA_CSR_0_DONE) )
  374.         {
  375. printk("%s: DMA done never occurred. DMA disabled.n",
  376. dev->name);
  377. priv->use_dma = 0;
  378.                 return 1;
  379.         }
  380.         return 0;
  381. }
  382. /*
  383.  * dgrs_rcv_frame()
  384.  *
  385.  * Process a received frame.  This is called from the interrupt
  386.  * routine, and works for both switch mode and multi-NIC mode.
  387.  *
  388.  * Note that when in multi-NIC mode, we want to always access the
  389.  * hardware using the dev and priv structures of the first port,
  390.  * so that we are using only one set of variables to maintain
  391.  * the board interface status, but we want to use the Nth port
  392.  * dev and priv structures to maintain statistics and to pass
  393.  * the packet up.
  394.  *
  395.  * Only the first device structure is attached to the interrupt.
  396.  * We use the special "chan" variable at the end of the first RBD
  397.  * to select the Nth device in multi-NIC mode.
  398.  *
  399.  * We currently do chained DMA on a per-packet basis when the
  400.  * packet is "long", and we spin the CPU a short time polling
  401.  * for DMA completion.  This avoids a second interrupt overhead,
  402.  * and gives the best performance for light traffic to the host.
  403.  *
  404.  * However, a better scheme that could be implemented would be
  405.  * to see how many packets are outstanding for the host, and if
  406.  * the number is "large", create a long chain to DMA several
  407.  * packets into the host in one go.  In this case, we would set
  408.  * up some state variables to let the host CPU continue doing
  409.  * other things until a DMA completion interrupt comes along.
  410.  */
  411. void
  412. dgrs_rcv_frame(
  413. struct net_device *dev0,
  414. DGRS_PRIV *priv0,
  415. I596_CB *cbp
  416. )
  417. {
  418. int len;
  419. I596_TBD *tbdp;
  420. struct sk_buff *skb;
  421. uchar *putp;
  422. uchar *p;
  423. struct net_device *devN;
  424. DGRS_PRIV *privN;
  425. /*
  426.  * Determine Nth priv and dev structure pointers
  427.  */
  428. if (dgrs_nicmode)
  429. { /* Multi-NIC mode */
  430. int chan = ((I596_RBD *) S2H(cbp->xmit.tbdp))->chan;
  431. devN = priv0->devtbl[chan-1];
  432. /*
  433.  * If devN is null, we got an interrupt before the I/F
  434.  * has been initialized.  Pitch the packet.
  435.  */
  436. if (devN == NULL)
  437. goto out;
  438. privN = (DGRS_PRIV *) devN->priv;
  439. }
  440. else
  441. { /* Switch mode */
  442. devN = dev0;
  443. privN = priv0;
  444. }
  445. if (0) printk("%s: rcv len=%ldn", devN->name, cbp->xmit.count);
  446. /*
  447.  * Allocate a message block big enough to hold the whole frame
  448.  */
  449. len = cbp->xmit.count;
  450. if ((skb = dev_alloc_skb(len+5)) == NULL)
  451. {
  452. printk("%s: dev_alloc_skb failed for rcv buffern", devN->name);
  453. ++privN->stats.rx_dropped;
  454. /* discarding the frame */
  455. goto out;
  456. }
  457. skb->dev = devN;
  458. skb_reserve(skb, 2); /* Align IP header */
  459. again:
  460. putp = p = skb_put(skb, len);
  461. /*
  462.  * There are three modes here for doing the packet copy.
  463.  * If we have DMA, and the packet is "long", we use the
  464.  * chaining mode of DMA.  If it's shorter, we use single
  465.  * DMA's.  Otherwise, we use memcpy().
  466.  */
  467. if (priv0->use_dma && priv0->dmadesc_h && len > 64)
  468. {
  469. /*
  470.  * If we can use DMA and its a long frame, copy it using
  471.  * DMA chaining.
  472.  */
  473. DMACHAIN *ddp_h; /* Host virtual DMA desc. pointer */
  474. DMACHAIN *ddp_s; /* Switch physical DMA desc. pointer */
  475. uchar *phys_p;
  476. /*
  477.  * Get the physical address of the STREAMS buffer.
  478.  * NOTE: allocb() guarantees that the whole buffer
  479.  * is in a single page if the length < 4096.
  480.  */
  481. phys_p = (uchar *) virt_to_phys(putp);
  482. ddp_h = priv0->dmadesc_h;
  483. ddp_s = priv0->dmadesc_s;
  484. tbdp = (I596_TBD *) S2H(cbp->xmit.tbdp);
  485. for (;;)
  486. {
  487. int count;
  488. int amt;
  489. count = tbdp->count;
  490. amt = count & 0x3fff;
  491. if (amt == 0)
  492. break; /* For safety */
  493. if ( (p-putp) >= len)
  494. {
  495. printk("%s: cbp = %lxn", devN->name, (long) H2S(cbp));
  496. proc_reset(dev0, 1); /* Freeze IDT */
  497. break; /* For Safety */
  498. }
  499. ddp_h->pciaddr = (ulong) phys_p;
  500. ddp_h->lcladdr = S2DMA(tbdp->buf);
  501. ddp_h->len = amt;
  502. phys_p += amt;
  503. p += amt;
  504. if (count & I596_TBD_EOF)
  505. {
  506. ddp_h->next = PLX_DMA_DESC_TO_HOST
  507. | PLX_DMA_DESC_EOC;
  508. ++ddp_h;
  509. break;
  510. }
  511. else
  512. {
  513. ++ddp_s;
  514. ddp_h->next = PLX_DMA_DESC_TO_HOST
  515. | (ulong) ddp_s;
  516. tbdp = (I596_TBD *) S2H(tbdp->next);
  517. ++ddp_h;
  518. }
  519. }
  520. if (ddp_h - priv0->dmadesc_h)
  521. {
  522. int rc;
  523. rc = do_plx_dma(dev0,
  524. 0, (ulong) priv0->dmadesc_s, len, 0);
  525. if (rc)
  526. {
  527. printk("%s: Chained DMA failuren", devN->name);
  528. goto again;
  529. }
  530. }
  531. }
  532. else if (priv0->use_dma)
  533. {
  534. /*
  535.  * If we can use DMA and its a shorter frame, copy it
  536.  * using single DMA transfers.
  537.  */
  538. uchar *phys_p;
  539. /*
  540.  * Get the physical address of the STREAMS buffer.
  541.  * NOTE: allocb() guarantees that the whole buffer
  542.  * is in a single page if the length < 4096.
  543.  */
  544. phys_p = (uchar *) virt_to_phys(putp);
  545. tbdp = (I596_TBD *) S2H(cbp->xmit.tbdp);
  546. for (;;)
  547. {
  548. int count;
  549. int amt;
  550. int rc;
  551. count = tbdp->count;
  552. amt = count & 0x3fff;
  553. if (amt == 0)
  554. break; /* For safety */
  555. if ( (p-putp) >= len)
  556. {
  557. printk("%s: cbp = %lxn", devN->name, (long) H2S(cbp));
  558. proc_reset(dev0, 1); /* Freeze IDT */
  559. break; /* For Safety */
  560. }
  561. rc = do_plx_dma(dev0, (ulong) phys_p,
  562. S2DMA(tbdp->buf), amt, 1);
  563. if (rc)
  564. {
  565. memcpy(p, S2H(tbdp->buf), amt);
  566. printk("%s: Single DMA failedn", devN->name);
  567. }
  568. phys_p += amt;
  569. p += amt;
  570. if (count & I596_TBD_EOF)
  571. break;
  572. tbdp = (I596_TBD *) S2H(tbdp->next);
  573. }
  574. }
  575. else
  576. {
  577. /*
  578.  * Otherwise, copy it piece by piece using memcpy()
  579.  */
  580. tbdp = (I596_TBD *) S2H(cbp->xmit.tbdp);
  581. for (;;)
  582. {
  583. int count;
  584. int amt;
  585. count = tbdp->count;
  586. amt = count & 0x3fff;
  587. if (amt == 0)
  588. break; /* For safety */
  589. if ( (p-putp) >= len)
  590. {
  591. printk("%s: cbp = %lxn", devN->name, (long) H2S(cbp));
  592. proc_reset(dev0, 1); /* Freeze IDT */
  593. break; /* For Safety */
  594. }
  595. memcpy(p, S2H(tbdp->buf), amt);
  596. p += amt;
  597. if (count & I596_TBD_EOF)
  598. break;
  599. tbdp = (I596_TBD *) S2H(tbdp->next);
  600. }
  601. }
  602. /*
  603.  * Pass the frame to upper half
  604.  */
  605. skb->protocol = eth_type_trans(skb, devN);
  606. netif_rx(skb);
  607. devN->last_rx = jiffies;
  608. ++privN->stats.rx_packets;
  609. privN->stats.rx_bytes += len;
  610. out:
  611. cbp->xmit.status = I596_CB_STATUS_C | I596_CB_STATUS_OK;
  612. }
  613. /*
  614.  * Start transmission of a frame
  615.  *
  616.  * The interface to the board is simple: we pretend that we are
  617.  * a fifth 82596 ethernet controller 'receiving' data, and copy the
  618.  * data into the same structures that a real 82596 would.  This way,
  619.  * the board firmware handles the host 'port' the same as any other.
  620.  *
  621.  * NOTE: we do not use Bus master DMA for this routine.  Turns out
  622.  * that it is not needed.  Slave writes over the PCI bus are about
  623.  * as fast as DMA, due to the fact that the PLX part can do burst
  624.  * writes.  The same is not true for data being read from the board.
  625.  *
  626.  * For multi-NIC mode, we tell the firmware the desired 82596
  627.  * output port by setting the special "dstchan" member at the
  628.  * end of the traditional 82596 RFD structure.
  629.  */
  630. static int dgrs_start_xmit(struct sk_buff *skb, struct net_device *devN)
  631. {
  632. DGRS_PRIV *privN = (DGRS_PRIV *) devN->priv;
  633. struct net_device *dev0;
  634. DGRS_PRIV *priv0;
  635. I596_RBD *rbdp;
  636. int count;
  637. int i, len, amt;
  638. /*
  639.  * Determine 0th priv and dev structure pointers
  640.  */
  641. if (dgrs_nicmode)
  642. {
  643. dev0 = privN->devtbl[0];
  644. priv0 = (DGRS_PRIV *) dev0->priv;
  645. }
  646. else
  647. {
  648. dev0 = devN;
  649. priv0 = privN;
  650. }
  651. if (dgrs_debug > 1)
  652. printk("%s: xmit len=%dn", devN->name, (int) skb->len);
  653. devN->trans_start = jiffies;
  654. netif_start_queue(devN);
  655. if (priv0->rfdp->cmd & I596_RFD_EL)
  656. { /* Out of RFD's */
  657. if (0) printk("%s: NO RFD'sn", devN->name);
  658. goto no_resources;
  659. }
  660. rbdp = priv0->rbdp;
  661. count = 0;
  662. priv0->rfdp->rbdp = (I596_RBD *) H2S(rbdp);
  663. i = 0; len = skb->len;
  664. for (;;)
  665. {
  666. if (rbdp->size & I596_RBD_EL)
  667. { /* Out of RBD's */
  668. if (0) printk("%s: NO RBD'sn", devN->name);
  669. goto no_resources;
  670. }
  671. amt = min_t(unsigned int, len, rbdp->size - count);
  672. memcpy( (char *) S2H(rbdp->buf) + count, skb->data + i, amt);
  673. i += amt;
  674. count += amt;
  675. len -= amt;
  676. if (len == 0)
  677. {
  678. if (skb->len < 60)
  679. rbdp->count = 60 | I596_RBD_EOF;
  680. else
  681. rbdp->count = count | I596_RBD_EOF;
  682. rbdp = (I596_RBD *) S2H(rbdp->next);
  683. goto frame_done;
  684. }
  685. else if (count < 32)
  686. {
  687. /* More data to come, but we used less than 32
  688.  * bytes of this RBD.  Keep filling this RBD.
  689.  */
  690. {} /* Yes, we do nothing here */
  691. }
  692. else
  693. {
  694. rbdp->count = count;
  695. rbdp = (I596_RBD *) S2H(rbdp->next);
  696. count = 0;
  697. }
  698. }
  699. frame_done:
  700. priv0->rbdp = rbdp;
  701. if (dgrs_nicmode)
  702. priv0->rfdp->dstchan = privN->chan;
  703. priv0->rfdp->status = I596_RFD_C | I596_RFD_OK;
  704. priv0->rfdp = (I596_RFD *) S2H(priv0->rfdp->next);
  705. ++privN->stats.tx_packets;
  706. dev_kfree_skb (skb);
  707. return (0);
  708. no_resources:
  709. priv0->scbp->status |= I596_SCB_RNR; /* simulate I82596 */
  710. return (-EAGAIN);
  711. }
  712. /*
  713.  * Open the interface
  714.  */
  715. static int
  716. dgrs_open( struct net_device *dev )
  717. {
  718. netif_start_queue(dev);
  719. return (0);
  720. }
  721. /*
  722.  * Close the interface
  723.  */
  724. static int dgrs_close( struct net_device *dev )
  725. {
  726. netif_stop_queue(dev);
  727. return (0);
  728. }
  729. /*
  730.  * Get statistics
  731.  */
  732. static struct net_device_stats *dgrs_get_stats( struct net_device *dev )
  733. {
  734. DGRS_PRIV *priv = (DGRS_PRIV *) dev->priv;
  735. return (&priv->stats);
  736. }
  737. /*
  738.  * Set multicast list and/or promiscuous mode
  739.  */
  740. static void dgrs_set_multicast_list( struct net_device *dev)
  741. {
  742. DGRS_PRIV *priv = (DGRS_PRIV *) dev->priv;
  743. priv->port->is_promisc = (dev->flags & IFF_PROMISC) ? 1 : 0;
  744. }
  745. /*
  746.  * Unique ioctl's
  747.  */
  748. static int dgrs_ioctl(struct net_device *devN, struct ifreq *ifr, int cmd)
  749. {
  750. DGRS_PRIV *privN = (DGRS_PRIV *) devN->priv;
  751. DGRS_IOCTL ioc;
  752. int i;
  753. if (cmd != DGRSIOCTL)
  754. return -EINVAL;
  755. if(copy_from_user(&ioc, ifr->ifr_data, sizeof(DGRS_IOCTL)))
  756. return -EFAULT;
  757. switch (ioc.cmd)
  758. {
  759. case DGRS_GETMEM:
  760. if (ioc.len != sizeof(ulong))
  761. return -EINVAL;
  762. if(copy_to_user(ioc.data, &devN->mem_start, ioc.len))
  763. return -EFAULT;
  764. return (0);
  765. case DGRS_SETFILTER:
  766. if (!capable(CAP_NET_ADMIN))
  767. return -EPERM;
  768. if (ioc.port > privN->bcomm->bc_nports)
  769. return -EINVAL;
  770. if (ioc.filter >= NFILTERS)
  771. return -EINVAL;
  772. if (ioc.len > privN->bcomm->bc_filter_area_len)
  773. return -EINVAL;
  774. /* Wait for old command to finish */
  775. for (i = 0; i < 1000; ++i)
  776. {
  777. if ( (volatile long) privN->bcomm->bc_filter_cmd <= 0 )
  778. break;
  779. udelay(1);
  780. }
  781. if (i >= 1000)
  782. return -EIO;
  783. privN->bcomm->bc_filter_port = ioc.port;
  784. privN->bcomm->bc_filter_num = ioc.filter;
  785. privN->bcomm->bc_filter_len = ioc.len;
  786. if (ioc.len)
  787. {
  788. if(copy_from_user(S2HN(privN->bcomm->bc_filter_area),
  789. ioc.data, ioc.len))
  790. return -EFAULT;
  791. privN->bcomm->bc_filter_cmd = BC_FILTER_SET;
  792. }
  793. else
  794. privN->bcomm->bc_filter_cmd = BC_FILTER_CLR;
  795. return(0);
  796. default:
  797. return -EOPNOTSUPP;
  798. }
  799. }
  800. /*
  801.  * Process interrupts
  802.  *
  803.  * dev, priv will always refer to the 0th device in Multi-NIC mode.
  804.  */
  805. static void dgrs_intr(int irq, void *dev_id, struct pt_regs *regs)
  806. {
  807. struct net_device *dev0 = (struct net_device *) dev_id;
  808. DGRS_PRIV *priv0 = (DGRS_PRIV *) dev0->priv;
  809. I596_CB *cbp;
  810. int cmd;
  811. int i;
  812. ++priv0->intrcnt;
  813. if (1) ++priv0->bcomm->bc_cnt[4];
  814. if (0)
  815. {
  816. static int cnt = 100;
  817. if (--cnt > 0)
  818. printk("%s: interrupt: irq %dn", dev0->name, irq);
  819. }
  820. /*
  821.  * Get 596 command
  822.  */
  823. cmd = priv0->scbp->cmd;
  824. /*
  825.  * See if RU has been restarted
  826.  */
  827. if ( (cmd & I596_SCB_RUC) == I596_SCB_RUC_START)
  828. {
  829. if (0) printk("%s: RUC startn", dev0->name);
  830. priv0->rfdp = (I596_RFD *) S2H(priv0->scbp->rfdp);
  831. priv0->rbdp = (I596_RBD *) S2H(priv0->rfdp->rbdp);
  832. priv0->scbp->status &= ~(I596_SCB_RNR|I596_SCB_RUS);
  833. /*
  834.  * Tell upper half (halves)
  835.  */
  836. if (dgrs_nicmode)
  837. {
  838. for (i = 0; i < priv0->nports; ++i)
  839. netif_wake_queue (priv0->devtbl[i]);
  840. }
  841. else
  842. netif_wake_queue (dev0);
  843. /* if (bd->flags & TX_QUEUED)
  844. DL_sched(bd, bdd); */
  845. }
  846. /*
  847.  * See if any CU commands to process
  848.  */
  849. if ( (cmd & I596_SCB_CUC) != I596_SCB_CUC_START)
  850. {
  851. priv0->scbp->cmd = 0; /* Ignore all other commands */
  852. goto ack_intr;
  853. }
  854. priv0->scbp->status &= ~(I596_SCB_CNA|I596_SCB_CUS);
  855. /*
  856.  * Process a command
  857.  */
  858. cbp = (I596_CB *) S2H(priv0->scbp->cbp);
  859. priv0->scbp->cmd = 0; /* Safe to clear the command */
  860. for (;;)
  861. {
  862. switch (cbp->nop.cmd & I596_CB_CMD)
  863. {
  864. case I596_CB_CMD_XMIT:
  865. dgrs_rcv_frame(dev0, priv0, cbp);
  866. break;
  867. default:
  868. cbp->nop.status = I596_CB_STATUS_C | I596_CB_STATUS_OK;
  869. break;
  870. }
  871. if (cbp->nop.cmd & I596_CB_CMD_EL)
  872. break;
  873. cbp = (I596_CB *) S2H(cbp->nop.next);
  874. }
  875. priv0->scbp->status |= I596_SCB_CNA;
  876. /*
  877.  * Ack the interrupt
  878.  */
  879. ack_intr:
  880. if (priv0->plxreg)
  881. OUTL(dev0->base_addr + PLX_LCL2PCI_DOORBELL, 1);
  882. }
  883. /*
  884.  * Download the board firmware
  885.  */
  886. static int __init 
  887. dgrs_download(struct net_device *dev0)
  888. {
  889. DGRS_PRIV *priv0 = (DGRS_PRIV *) dev0->priv;
  890. int is;
  891. int i;
  892. static int iv2is[16] = {
  893. 0, 0, 0, ES4H_IS_INT3,
  894. 0, ES4H_IS_INT5, 0, ES4H_IS_INT7,
  895. 0, 0, ES4H_IS_INT10, ES4H_IS_INT11,
  896. ES4H_IS_INT12, 0, 0, ES4H_IS_INT15 };
  897. /*
  898.  * Map in the dual port memory
  899.  */
  900. priv0->vmem = ioremap(dev0->mem_start, 2048*1024);
  901. if (!priv0->vmem)
  902. {
  903. printk("%s: cannot map in board memoryn", dev0->name);
  904. return -ENXIO;
  905. }
  906. /*
  907.  * Hold the processor and configure the board addresses
  908.  */
  909. if (priv0->plxreg)
  910. { /* PCI bus */
  911. proc_reset(dev0, 1);
  912. }
  913. else
  914. { /* EISA bus */
  915. is = iv2is[dev0->irq & 0x0f];
  916. if (!is)
  917. {
  918. printk("%s: Illegal IRQ %dn", dev0->name, dev0->irq);
  919. return -ENXIO;
  920. }
  921. OUTB(dev0->base_addr + ES4H_AS_31_24,
  922. (uchar) (dev0->mem_start >> 24) );
  923. OUTB(dev0->base_addr + ES4H_AS_23_16,
  924. (uchar) (dev0->mem_start >> 16) );
  925. priv0->is_reg = ES4H_IS_LINEAR | is |
  926. ((uchar) (dev0->mem_start >> 8) & ES4H_IS_AS15);
  927. OUTB(dev0->base_addr + ES4H_IS, priv0->is_reg);
  928. OUTB(dev0->base_addr + ES4H_EC, ES4H_EC_ENABLE);
  929. OUTB(dev0->base_addr + ES4H_PC, ES4H_PC_RESET);
  930. OUTB(dev0->base_addr + ES4H_MW, ES4H_MW_ENABLE | 0x00);
  931. }
  932. /*
  933.  * See if we can do DMA on the SE-6
  934.  */
  935. priv0->use_dma = check_board_dma(dev0);
  936. if (priv0->use_dma)
  937. printk("%s: Bus Master DMA is enabled.n", dev0->name);
  938. /*
  939.  * Load and verify the code at the desired address
  940.  */
  941. memcpy(priv0->vmem, dgrs_code, dgrs_ncode); /* Load code */
  942. if (memcmp(priv0->vmem, dgrs_code, dgrs_ncode))
  943. {
  944. iounmap(priv0->vmem);
  945. priv0->vmem = NULL;
  946. printk("%s: download compare failedn", dev0->name);
  947. return -ENXIO;
  948. }
  949. /*
  950.  * Configurables
  951.  */
  952. priv0->bcomm = (struct bios_comm *) (priv0->vmem + 0x0100);
  953. priv0->bcomm->bc_nowait = 1; /* Tell board to make printf not wait */
  954. priv0->bcomm->bc_squelch = 0; /* Flag from Space.c */
  955. priv0->bcomm->bc_150ohm = 0; /* Flag from Space.c */
  956. priv0->bcomm->bc_spew = 0; /* Debug flag from Space.c */
  957. priv0->bcomm->bc_maxrfd = 0; /* Debug flag from Space.c */
  958. priv0->bcomm->bc_maxrbd = 0; /* Debug flag from Space.c */
  959. /*
  960.  * Tell board we are operating in switch mode (1) or in
  961.  * multi-NIC mode (2).
  962.  */
  963. priv0->bcomm->bc_host = dgrs_nicmode ? BC_MULTINIC : BC_SWITCH;
  964. /*
  965.  * Request memory space on board for DMA chains
  966.  */
  967. if (priv0->use_dma)
  968. priv0->bcomm->bc_hostarea_len = (2048/64) * 16;
  969. /*
  970.  * NVRAM configurables from Space.c
  971.  */
  972. priv0->bcomm->bc_spantree = dgrs_spantree;
  973. priv0->bcomm->bc_hashexpire = dgrs_hashexpire;
  974. memcpy(priv0->bcomm->bc_ipaddr, dgrs_ipaddr, 4);
  975. memcpy(priv0->bcomm->bc_iptrap, dgrs_iptrap, 4);
  976. memcpy(priv0->bcomm->bc_ipxnet, &dgrs_ipxnet, 4);
  977. /*
  978.  * Release processor, wait 8 seconds for board to initialize
  979.  */
  980. proc_reset(dev0, 0);
  981. for (i = jiffies + 8 * HZ; time_after(i, jiffies); )
  982. {
  983. barrier(); /* Gcc 2.95 needs this */
  984. if (priv0->bcomm->bc_status >= BC_RUN)
  985. break;
  986. }
  987. if (priv0->bcomm->bc_status < BC_RUN)
  988. {
  989. printk("%s: board not operatingn", dev0->name);
  990. return -ENXIO;
  991. }
  992. priv0->port = (PORT *) S2H(priv0->bcomm->bc_port);
  993. priv0->scbp = (I596_SCB *) S2H(priv0->port->scbp);
  994. priv0->rfdp = (I596_RFD *) S2H(priv0->scbp->rfdp);
  995. priv0->rbdp = (I596_RBD *) S2H(priv0->rfdp->rbdp);
  996. priv0->scbp->status = I596_SCB_CNA; /* CU is idle */
  997. /*
  998.  * Get switch physical and host virtual pointers to DMA
  999.  * chaining area.  NOTE: the MSB of the switch physical
  1000.  * address *must* be turned off.  Otherwise, the HW kludge
  1001.  * that allows host access of the PLX DMA registers will
  1002.  * erroneously select the PLX registers.
  1003.  */
  1004. priv0->dmadesc_s = (DMACHAIN *) S2DMA(priv0->bcomm->bc_hostarea);
  1005. if (priv0->dmadesc_s)
  1006. priv0->dmadesc_h = (DMACHAIN *) S2H(priv0->dmadesc_s);
  1007. else
  1008. priv0->dmadesc_h = NULL;
  1009. /*
  1010.  * Enable board interrupts
  1011.  */
  1012. if (priv0->plxreg)
  1013. { /* PCI bus */
  1014. OUTL(dev0->base_addr + PLX_INT_CSR,
  1015. inl(dev0->base_addr + PLX_INT_CSR)
  1016. | PLX_PCI_DOORBELL_IE); /* Enable intr to host */
  1017. OUTL(dev0->base_addr + PLX_LCL2PCI_DOORBELL, 1);
  1018. }
  1019. else
  1020. { /* EISA bus */
  1021. }
  1022. return (0);
  1023. }
  1024. /*
  1025.  * Probe (init) a board
  1026.  */
  1027. int __init 
  1028. dgrs_probe1(struct net_device *dev)
  1029. {
  1030. DGRS_PRIV *priv = (DGRS_PRIV *) dev->priv;
  1031. int i;
  1032. int rc;
  1033. printk("%s: Digi RightSwitch io=%lx mem=%lx irq=%d plx=%lx dma=%lxn",
  1034. dev->name, dev->base_addr, dev->mem_start, dev->irq,
  1035. priv->plxreg, priv->plxdma);
  1036. /*
  1037.  * Download the firmware and light the processor
  1038.  */
  1039. rc = dgrs_download(dev);
  1040. if (rc)
  1041. {
  1042. return rc;
  1043. }
  1044. /*
  1045.  * Get ether address of board
  1046.  */
  1047. printk("%s: Ethernet address", dev->name);
  1048. memcpy(dev->dev_addr, priv->port->ethaddr, 6);
  1049. for (i = 0; i < 6; ++i)
  1050. printk("%c%2.2x", i ? ':' : ' ', dev->dev_addr[i]);
  1051. printk("n");
  1052. if (dev->dev_addr[0] & 1)
  1053. {
  1054. printk("%s: Illegal Ethernet Addressn", dev->name);
  1055. return (-ENXIO);
  1056. }
  1057. /*
  1058.  * ACK outstanding interrupts, hook the interrupt,
  1059.  * and verify that we are getting interrupts from the board.
  1060.  */
  1061. if (priv->plxreg)
  1062. OUTL(dev->base_addr + PLX_LCL2PCI_DOORBELL, 1);
  1063. rc = request_irq(dev->irq, &dgrs_intr, SA_SHIRQ, "RightSwitch", dev);
  1064. if (rc)
  1065. return (rc);
  1066. priv->intrcnt = 0;
  1067. for (i = jiffies + 2*HZ + HZ/2; time_after(i, jiffies); )
  1068. {
  1069. barrier(); /* gcc 2.95 needs this */
  1070. if (priv->intrcnt >= 2)
  1071. break;
  1072. }
  1073. if (priv->intrcnt < 2)
  1074. {
  1075. printk("%s: Not interrupting on IRQ %d (%d)n",
  1076. dev->name, dev->irq, priv->intrcnt);
  1077. return (-ENXIO);
  1078. }
  1079. /*
  1080.  * Register the /proc/ioports information...
  1081.  */
  1082. request_region(dev->base_addr, 256, "RightSwitch");
  1083. /*
  1084.  * Entry points...
  1085.  */
  1086. dev->open = &dgrs_open;
  1087. dev->stop = &dgrs_close;
  1088. dev->get_stats = &dgrs_get_stats;
  1089. dev->hard_start_xmit = &dgrs_start_xmit;
  1090. dev->set_multicast_list = &dgrs_set_multicast_list;
  1091. dev->do_ioctl = &dgrs_ioctl;
  1092. return (0);
  1093. }
  1094. int __init 
  1095. dgrs_initclone(struct net_device *dev)
  1096. {
  1097. DGRS_PRIV *priv = (DGRS_PRIV *) dev->priv;
  1098. int i;
  1099. printk("%s: Digi RightSwitch port %d ",
  1100. dev->name, priv->chan);
  1101. for (i = 0; i < 6; ++i)
  1102. printk("%c%2.2x", i ? ':' : ' ', dev->dev_addr[i]);
  1103. printk("n");
  1104. return (0);
  1105. }
  1106. static int __init 
  1107. dgrs_found_device(
  1108. int io,
  1109. ulong mem,
  1110. int irq,
  1111. ulong plxreg,
  1112. ulong plxdma
  1113. )
  1114. {
  1115. DGRS_PRIV *priv;
  1116. struct net_device *dev, *aux;
  1117. /* Allocate and fill new device structure. */
  1118. int dev_size = sizeof(struct net_device) + sizeof(DGRS_PRIV);
  1119. int i, ret;
  1120. dev = (struct net_device *) kmalloc(dev_size, GFP_KERNEL);
  1121. if (!dev)
  1122. return -ENOMEM;
  1123. memset(dev, 0, dev_size);
  1124. dev->priv = ((void *)dev) + sizeof(struct net_device);
  1125. priv = (DGRS_PRIV *)dev->priv;
  1126. dev->base_addr = io;
  1127. dev->mem_start = mem;
  1128. dev->mem_end = mem + 2048 * 1024 - 1;
  1129. dev->irq = irq;
  1130. priv->plxreg = plxreg;
  1131. priv->plxdma = plxdma;
  1132. priv->vplxdma = NULL;
  1133. priv->chan = 1;
  1134. priv->devtbl[0] = dev;
  1135. dev->init = dgrs_probe1;
  1136. SET_MODULE_OWNER(dev);
  1137. ether_setup(dev);
  1138. if (register_netdev(dev) != 0)
  1139. return -EIO;
  1140. priv->next_dev = dgrs_root_dev;
  1141. dgrs_root_dev = dev;
  1142. if ( !dgrs_nicmode )
  1143. return (0); /* Switch mode, we are done */
  1144. /*
  1145.  * Operating card as N separate NICs
  1146.  */
  1147. priv->nports = priv->bcomm->bc_nports;
  1148. for (i = 1; i < priv->nports; ++i)
  1149. {
  1150. struct net_device *devN;
  1151. DGRS_PRIV *privN;
  1152. /* Allocate new dev and priv structures */
  1153. devN = (struct net_device *) kmalloc(dev_size, GFP_KERNEL);
  1154. /* Make it an exact copy of dev[0]... */
  1155. ret = -ENOMEM;
  1156. if (!devN) 
  1157. goto fail;
  1158. memcpy(devN, dev, dev_size);
  1159. memset(devN->name, 0, sizeof(devN->name));
  1160. devN->priv = ((void *)devN) + sizeof(struct net_device);
  1161. privN = (DGRS_PRIV *)devN->priv;
  1162. /* ... and zero out VM areas */
  1163. privN->vmem = 0;
  1164. privN->vplxdma = 0;
  1165. /* ... and zero out IRQ */
  1166. devN->irq = 0;
  1167. /* ... and base MAC address off address of 1st port */
  1168. devN->dev_addr[5] += i;
  1169. devN->init = dgrs_initclone;
  1170. SET_MODULE_OWNER(devN);
  1171. ether_setup(devN);
  1172. ret = -EIO;
  1173. if (register_netdev(devN)) {
  1174. kfree(devN);
  1175. goto fail;
  1176. }
  1177. privN->chan = i+1;
  1178. priv->devtbl[i] = devN;
  1179. privN->next_dev = dgrs_root_dev;
  1180. dgrs_root_dev = devN;
  1181. }
  1182. return 0;
  1183. fail: aux = priv->next_dev;
  1184. while (dgrs_root_dev != aux) {
  1185. struct net_device *d = dgrs_root_dev;
  1186. dgrs_root_dev = ((DGRS_PRIV *)d->priv)->next_dev;
  1187. unregister_netdev(d);
  1188. kfree(d);
  1189. }
  1190. return ret;
  1191. }
  1192. /*
  1193.  * Scan for all boards
  1194.  */
  1195. static int is2iv[8] __initdata = { 0, 3, 5, 7, 10, 11, 12, 15 };
  1196. static int __init  dgrs_scan(void)
  1197. {
  1198. int cards_found = 0;
  1199. uint io;
  1200. uint mem;
  1201. uint irq;
  1202. uint plxreg;
  1203. uint plxdma;
  1204. /*
  1205.  * First, check for PCI boards
  1206.  */
  1207. if (pci_present())
  1208. {
  1209. struct pci_dev *pdev = NULL;
  1210. while ((pdev = pci_find_device(SE6_PCI_VENDOR_ID, SE6_PCI_DEVICE_ID, pdev)) != NULL)
  1211. {
  1212. /*
  1213.  * Get and check the bus-master and latency values.
  1214.  * Some PCI BIOSes fail to set the master-enable bit,
  1215.  * and the latency timer must be set to the maximum
  1216.  * value to avoid data corruption that occurs when the
  1217.  * timer expires during a transfer.  Yes, it's a bug.
  1218.  */
  1219. if (pci_enable_device(pdev))
  1220. continue;
  1221. pci_set_master(pdev);
  1222. plxreg = pci_resource_start (pdev, 0);
  1223. io = pci_resource_start (pdev, 1);
  1224. mem = pci_resource_start (pdev, 2);
  1225. pci_read_config_dword(pdev, 0x30, &plxdma);
  1226. irq = pdev->irq;
  1227. plxdma &= ~15;
  1228. /*
  1229.  * On some BIOSES, the PLX "expansion rom" (used for DMA)
  1230.  * address comes up as "0".  This is probably because
  1231.  * the BIOS doesn't see a valid 55 AA ROM signature at
  1232.  * the "ROM" start and zeroes the address.  To get
  1233.  * around this problem the SE-6 is configured to ask
  1234.  * for 4 MB of space for the dual port memory.  We then
  1235.  * must set its range back to 2 MB, and use the upper
  1236.  * half for DMA register access
  1237.  */
  1238. OUTL(io + PLX_SPACE0_RANGE, 0xFFE00000L);
  1239. if (plxdma == 0)
  1240. plxdma = mem + (2048L * 1024L);
  1241. pci_write_config_dword(pdev, 0x30, plxdma + 1);
  1242. pci_read_config_dword(pdev, 0x30, &plxdma);
  1243. plxdma &= ~15;
  1244. dgrs_found_device(io, mem, irq, plxreg, plxdma);
  1245. cards_found++;
  1246. }
  1247. }
  1248. /*
  1249.  * Second, check for EISA boards
  1250.  */
  1251. if (EISA_bus)
  1252. {
  1253. for (io = 0x1000; io < 0x9000; io += 0x1000)
  1254. {
  1255. if (inb(io+ES4H_MANUFmsb) != 0x10
  1256. || inb(io+ES4H_MANUFlsb) != 0x49
  1257. || inb(io+ES4H_PRODUCT) != ES4H_PRODUCT_CODE)
  1258. continue;
  1259. if ( ! (inb(io+ES4H_EC) & ES4H_EC_ENABLE) )
  1260. continue; /* Not EISA configured */
  1261. mem = (inb(io+ES4H_AS_31_24) << 24)
  1262. + (inb(io+ES4H_AS_23_16) << 16);
  1263. irq = is2iv[ inb(io+ES4H_IS) & ES4H_IS_INTMASK ];
  1264. dgrs_found_device(io, mem, irq, 0L, 0L);
  1265. ++cards_found;
  1266. }
  1267. }
  1268. return cards_found;
  1269. }
  1270. /*
  1271.  * Variables that can be overriden from module command line
  1272.  */
  1273. static int debug = -1;
  1274. static int dma = -1;
  1275. static int hashexpire = -1;
  1276. static int spantree = -1;
  1277. static int ipaddr[4] = { -1 };
  1278. static int iptrap[4] = { -1 };
  1279. static __u32 ipxnet = -1;
  1280. static int nicmode = -1;
  1281. MODULE_PARM(debug, "i");
  1282. MODULE_PARM(dma, "i");
  1283. MODULE_PARM(hashexpire, "i");
  1284. MODULE_PARM(spantree, "i");
  1285. MODULE_PARM(ipaddr, "1-4i");
  1286. MODULE_PARM(iptrap, "1-4i");
  1287. MODULE_PARM(ipxnet, "i");
  1288. MODULE_PARM(nicmode, "i");
  1289. MODULE_PARM_DESC(debug, "Digi RightSwitch enable debugging (0-1)");
  1290. MODULE_PARM_DESC(dma, "Digi RightSwitch enable BM DMA (0-1)");
  1291. MODULE_PARM_DESC(nicmode, "Digi RightSwitch operating mode (1: switch, 2: multi-NIC)");
  1292. static int __init dgrs_init_module (void)
  1293. {
  1294. int cards_found;
  1295. int i;
  1296. /*
  1297.  * Command line variable overrides
  1298.  * debug=NNN
  1299.  * dma=0/1
  1300.  * spantree=0/1
  1301.  * hashexpire=NNN
  1302.  * ipaddr=A,B,C,D
  1303.  * iptrap=A,B,C,D
  1304.  * ipxnet=NNN
  1305.  * nicmode=NNN
  1306.  */
  1307. if (debug >= 0)
  1308. dgrs_debug = debug;
  1309. if (dma >= 0)
  1310. dgrs_dma = dma;
  1311. if (nicmode >= 0)
  1312. dgrs_nicmode = nicmode;
  1313. if (hashexpire >= 0)
  1314. dgrs_hashexpire = hashexpire;
  1315. if (spantree >= 0)
  1316. dgrs_spantree = spantree;
  1317. if (ipaddr[0] != -1)
  1318. for (i = 0; i < 4; ++i)
  1319. dgrs_ipaddr[i] = ipaddr[i];
  1320. if (iptrap[0] != -1)
  1321. for (i = 0; i < 4; ++i)
  1322. dgrs_iptrap[i] = iptrap[i];
  1323. if (ipxnet != -1)
  1324. dgrs_ipxnet = htonl( ipxnet );
  1325. if (dgrs_debug)
  1326. {
  1327. printk(KERN_INFO "dgrs: SW=%s FW=Build %d %snFW Version=%sn",
  1328.        version, dgrs_firmnum, dgrs_firmdate, dgrs_firmver);
  1329. }
  1330. /*
  1331.  * Find and configure all the cards
  1332.  */
  1333. dgrs_root_dev = NULL;
  1334. cards_found = dgrs_scan();
  1335. return cards_found ? 0 : -ENODEV;
  1336. }
  1337. static void __exit dgrs_cleanup_module (void)
  1338. {
  1339.         while (dgrs_root_dev)
  1340. {
  1341. struct net_device *next_dev;
  1342. DGRS_PRIV *priv;
  1343. priv = (DGRS_PRIV *) dgrs_root_dev->priv;
  1344.                 next_dev = priv->next_dev;
  1345.                 unregister_netdev(dgrs_root_dev);
  1346. proc_reset(priv->devtbl[0], 1);
  1347. if (priv->vmem)
  1348. iounmap(priv->vmem);
  1349. if (priv->vplxdma)
  1350. iounmap((uchar *) priv->vplxdma);
  1351. release_region(dgrs_root_dev->base_addr, 256);
  1352. if (dgrs_root_dev->irq)
  1353. free_irq(dgrs_root_dev->irq, dgrs_root_dev);
  1354.                 kfree(dgrs_root_dev);
  1355.                 dgrs_root_dev = next_dev;
  1356.         }
  1357. }
  1358. module_init(dgrs_init_module);
  1359. module_exit(dgrs_cleanup_module);