fmv18x.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:19k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* fmv18x.c: A network device driver for the Fujitsu FMV-181/182/183/184.
  2. Original: at1700.c (1993-94 by Donald Becker).
  3. Copyright 1993 United States Government as represented by the
  4. Director, National Security Agency.
  5. The author may be reached as becker@scyld.com, or C/O
  6. Scyld Computing Corporation
  7. 410 Severn Ave., Suite 210
  8. Annapolis MD 21403
  9. Modified by Yutaka TAMIYA (tamy@flab.fujitsu.co.jp)
  10. Copyright 1994 Fujitsu Laboratories Ltd.
  11. Special thanks to:
  12. Masayoshi UTAKA (utaka@ace.yk.fujitsu.co.jp)
  13. for testing this driver.
  14. H. NEGISHI (agy, negishi@sun45.psd.cs.fujitsu.co.jp)
  15. for suggestion of some program modification.
  16. Masahiro SEKIGUCHI <seki@sysrap.cs.fujitsu.co.jp>
  17. for suggestion of some program modification.
  18. Kazutoshi MORIOKA (morioka@aurora.oaks.cs.fujitsu.co.jp)
  19. for testing this driver.
  20. This software may be used and distributed according to the terms
  21. of the GNU General Public License, incorporated herein by reference.
  22. This is a device driver for the Fujitsu FMV-181/182/183/184, which
  23. is a straight-forward Fujitsu MB86965 implementation.
  24.   Sources:
  25.     at1700.c
  26.     The Fujitsu MB86965 datasheet.
  27.     The Fujitsu FMV-181/182 user's guide
  28. */
  29. static const char version[] =
  30. "fmv18x.c:v2.2.0 09/24/98  Yutaka TAMIYA (tamy@flab.fujitsu.co.jp)n";
  31. #include <linux/module.h>
  32. #include <linux/kernel.h>
  33. #include <linux/sched.h>
  34. #include <linux/types.h>
  35. #include <linux/fcntl.h>
  36. #include <linux/interrupt.h>
  37. #include <linux/ptrace.h>
  38. #include <linux/ioport.h>
  39. #include <linux/in.h>
  40. #include <linux/slab.h>
  41. #include <linux/string.h>
  42. #include <linux/init.h>
  43. #include <asm/system.h>
  44. #include <asm/bitops.h>
  45. #include <asm/io.h>
  46. #include <asm/dma.h>
  47. #include <linux/errno.h>
  48. #include <linux/spinlock.h>
  49. #include <linux/netdevice.h>
  50. #include <linux/etherdevice.h>
  51. #include <linux/skbuff.h>
  52. #include <linux/delay.h>
  53. static int fmv18x_probe_list[] __initdata = {
  54. 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x300, 0x340, 0
  55. };
  56. /* use 0 for production, 1 for verification, >2 for debug */
  57. #ifndef NET_DEBUG
  58. #define NET_DEBUG 1
  59. #endif
  60. static unsigned int net_debug = NET_DEBUG;
  61. typedef unsigned char uchar;
  62. /* Information that need to be kept for each board. */
  63. struct net_local {
  64. struct net_device_stats stats;
  65. long open_time; /* Useless example local info. */
  66. uint tx_started:1; /* Number of packet on the Tx queue. */
  67. uint tx_queue_ready:1; /* Tx queue is ready to be sent. */
  68. uint rx_started:1; /* Packets are Rxing. */
  69. uchar tx_queue; /* Number of packet on the Tx queue. */
  70. ushort tx_queue_len; /* Current length of the Tx queue. */
  71. spinlock_t lock;
  72. };
  73. /* Offsets from the base address. */
  74. #define STATUS 0
  75. #define TX_STATUS 0
  76. #define RX_STATUS 1
  77. #define TX_INTR 2 /* Bit-mapped interrupt enable registers. */
  78. #define RX_INTR 3
  79. #define TX_MODE 4
  80. #define RX_MODE 5
  81. #define CONFIG_0 6 /* Misc. configuration settings. */
  82. #define CONFIG_1 7
  83. /* Run-time register bank 2 definitions. */
  84. #define DATAPORT 8 /* Word-wide DMA or programmed-I/O dataport. */
  85. #define TX_START 10
  86. #define COL16CNTL 11 /* Controll Reg for 16 collisions */
  87. #define MODE13 13
  88. /* Fujitsu FMV-18x Card Configuration */
  89. #define FJ_STATUS0 0x10
  90. #define FJ_STATUS1 0x11
  91. #define FJ_CONFIG0 0x12
  92. #define FJ_CONFIG1 0x13
  93. #define FJ_MACADDR 0x14 /* 0x14 - 0x19 */
  94. #define FJ_BUFCNTL 0x1A
  95. #define FJ_BUFDATA 0x1C
  96. #define FMV18X_IO_EXTENT 32
  97. /* Index to functions, as function prototypes. */
  98. extern int fmv18x_probe(struct net_device *dev);
  99. static int fmv18x_probe1(struct net_device *dev, short ioaddr);
  100. static int net_open(struct net_device *dev);
  101. static int net_send_packet(struct sk_buff *skb, struct net_device *dev);
  102. static void net_interrupt(int irq, void *dev_id, struct pt_regs *regs);
  103. static void net_rx(struct net_device *dev);
  104. static void net_timeout(struct net_device *dev);
  105. static int net_close(struct net_device *dev);
  106. static struct net_device_stats *net_get_stats(struct net_device *dev);
  107. static void set_multicast_list(struct net_device *dev);
  108. /* Check for a network adaptor of this type, and return '0' iff one exists.
  109.    If dev->base_addr == 0, probe all likely locations.
  110.    If dev->base_addr == 1, always return failure.
  111.    If dev->base_addr == 2, allocate space for the device and return success
  112.    (detachable devices only).
  113.    */
  114. int __init fmv18x_probe(struct net_device *dev)
  115. {
  116. int i;
  117. int base_addr = dev->base_addr;
  118. SET_MODULE_OWNER(dev);
  119. if (base_addr > 0x1ff) /* Check a single specified location. */
  120. return fmv18x_probe1(dev, base_addr);
  121. else if (base_addr != 0) /* Don't probe at all. */
  122. return -ENXIO;
  123. for (i = 0; fmv18x_probe_list[i]; i++)
  124. if (fmv18x_probe1(dev, fmv18x_probe_list[i]) == 0)
  125. return 0;
  126. return -ENODEV;
  127. }
  128. /* The Fujitsu datasheet suggests that the NIC be probed for by checking its
  129.    "signature", the default bit pattern after a reset.  This *doesn't* work --
  130.    there is no way to reset the bus interface without a complete power-cycle!
  131.    It turns out that ATI came to the same conclusion I did: the only thing
  132.    that can be done is checking a few bits and then diving right into MAC
  133.    address check. */
  134. static int __init fmv18x_probe1(struct net_device *dev, short ioaddr)
  135. {
  136. char irqmap[4] = {3, 7, 10, 15};
  137. char irqmap_pnp[8] = {3, 4, 5, 7, 9, 10, 11, 15};
  138. unsigned int i, irq, retval;
  139. struct net_local *lp;
  140. /* Resetting the chip doesn't reset the ISA interface, so don't bother.
  141.    That means we have to be careful with the register values we probe for.
  142.    */
  143. if (!request_region(ioaddr, FMV18X_IO_EXTENT, dev->name))
  144. return -EBUSY;
  145. /* Check I/O address configuration and Fujitsu vendor code */
  146. if (inb(ioaddr+FJ_MACADDR  ) != 0x00
  147. ||  inb(ioaddr+FJ_MACADDR+1) != 0x00
  148. ||  inb(ioaddr+FJ_MACADDR+2) != 0x0e) {
  149. retval = -ENODEV;
  150. goto out;
  151. }
  152. /* Check PnP mode for FMV-183/184/183A/184A. */
  153. /* This PnP routine is very poor. IO and IRQ should be known. */
  154. if (inb(ioaddr + FJ_STATUS1) & 0x20) {
  155. irq = dev->irq;
  156. for (i = 0; i < 8; i++) {
  157. if (irq == irqmap_pnp[i])
  158. break;
  159. }
  160. if (i == 8) {
  161. retval = -ENODEV;
  162. goto out;
  163. }
  164. } else {
  165. if (fmv18x_probe_list[inb(ioaddr + FJ_CONFIG0) & 0x07] != ioaddr)
  166. return -ENODEV;
  167. irq = irqmap[(inb(ioaddr + FJ_CONFIG0)>>6) & 0x03];
  168. }
  169. /* Snarf the interrupt vector now. */
  170. retval = request_irq(irq, &net_interrupt, 0, dev->name, dev);
  171. if (retval) {
  172. printk ("FMV-18x found at %#3x, but it's unusable due to a conflict on"
  173. "IRQ %d.n", ioaddr, irq);
  174. goto out;
  175. }
  176. printk("%s: FMV-18x found at %#3x, IRQ %d, address ", dev->name,
  177.    ioaddr, irq);
  178. dev->base_addr = ioaddr;
  179. dev->irq = irq;
  180. for(i = 0; i < 6; i++) {
  181. unsigned char val = inb(ioaddr + FJ_MACADDR + i);
  182. printk("%02x", val);
  183. dev->dev_addr[i] = val;
  184. }
  185. /* "FJ_STATUS0" 12 bit 0x0400 means use regular 100 ohm 10baseT signals,
  186.    rather than 150 ohm shielded twisted pair compensation.
  187.    0x0000 == auto-sense the interface
  188.    0x0800 == use TP interface
  189.    0x1800 == use coax interface
  190.    */
  191. {
  192. const char *porttype[] = {"auto-sense", "10baseT", "auto-sense", "10base2/5"};
  193. ushort setup_value = inb(ioaddr + FJ_STATUS0);
  194. switch( setup_value & 0x07 ){
  195. case 0x01 /* 10base5 */:
  196. case 0x02 /* 10base2 */: dev->if_port = 0x18; break;
  197. case 0x04 /* 10baseT */: dev->if_port = 0x08; break;
  198. default /* auto-sense*/: dev->if_port = 0x00; break;
  199. }
  200. printk(" %s interface.n", porttype[(dev->if_port>>3) & 3]);
  201. }
  202. /* Initialize LAN Controller and LAN Card */
  203. outb(0xda, ioaddr + CONFIG_0);  /* Initialize LAN Controller */
  204. outb(0x00, ioaddr + CONFIG_1);  /* Stand by mode */
  205. outb(0x00, ioaddr + FJ_CONFIG1); /* Disable IRQ of LAN Card */
  206. outb(0x00, ioaddr + FJ_BUFCNTL); /* Reset ? I'm not sure (TAMIYA) */
  207. /* wait for a while */
  208. udelay(200);
  209. /* Set the station address in bank zero. */
  210. outb(0x00, ioaddr + CONFIG_1);
  211. for (i = 0; i < 6; i++)
  212. outb(dev->dev_addr[i], ioaddr + 8 + i);
  213. /* Switch to bank 1 and set the multicast table to accept none. */
  214. outb(0x04, ioaddr + CONFIG_1);
  215. for (i = 0; i < 8; i++)
  216. outb(0x00, ioaddr + 8 + i);
  217. /* Switch to bank 2 and lock our I/O address. */
  218. outb(0x08, ioaddr + CONFIG_1);
  219. outb(dev->if_port, ioaddr + MODE13);
  220. outb(0x00, ioaddr + COL16CNTL);
  221. if (net_debug)
  222. printk(version);
  223. /* Initialize the device structure. */
  224. dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
  225. if (!dev->priv) {
  226. retval = -ENOMEM;
  227. goto out_irq;
  228. }
  229. memset(dev->priv, 0, sizeof(struct net_local));
  230. lp = dev->priv;
  231. spin_lock_init(&lp->lock);
  232. dev->open = net_open;
  233. dev->stop = net_close;
  234. dev->hard_start_xmit = net_send_packet;
  235. dev->tx_timeout = net_timeout;
  236. dev->watchdog_timeo = HZ/10;
  237. dev->get_stats = net_get_stats;
  238. dev->set_multicast_list = set_multicast_list;
  239. /* Fill in the fields of 'dev' with ethernet-generic values. */
  240. ether_setup(dev);
  241. return 0;
  242. out_irq:
  243. free_irq(irq, dev);
  244. out:
  245. release_region(ioaddr, FMV18X_IO_EXTENT);
  246. return retval;
  247. }
  248. static int net_open(struct net_device *dev)
  249. {
  250. struct net_local *lp = dev->priv;
  251. int ioaddr = dev->base_addr;
  252. /* Set the configuration register 0 to 32K 100ns. byte-wide memory,
  253.    16 bit bus access, and two 4K Tx, enable the Rx and Tx. */
  254. outb(0x5a, ioaddr + CONFIG_0);
  255. /* Powerup and switch to register bank 2 for the run-time registers. */
  256. outb(0xe8, ioaddr + CONFIG_1);
  257. lp->tx_started = 0;
  258. lp->tx_queue_ready = 1;
  259. lp->rx_started = 0;
  260. lp->tx_queue = 0;
  261. lp->tx_queue_len = 0;
  262. /* Clear Tx and Rx Status */
  263. outb(0xff, ioaddr + TX_STATUS);
  264. outb(0xff, ioaddr + RX_STATUS);
  265. lp->open_time = jiffies;
  266. netif_start_queue(dev);
  267. /* Enable the IRQ of the LAN Card */
  268. outb(0x80, ioaddr + FJ_CONFIG1);
  269. /* Enable both Tx and Rx interrupts */
  270. outw(0x8182, ioaddr+TX_INTR);
  271. return 0;
  272. }
  273. static void net_timeout(struct net_device *dev)
  274. {
  275. struct net_local *lp = dev->priv;
  276. int ioaddr = dev->base_addr;
  277. unsigned long flags;
  278. printk(KERN_WARNING "%s: transmit timed out with status %04x, %s?n", dev->name,
  279.    htons(inw(ioaddr + TX_STATUS)),
  280.    inb(ioaddr + TX_STATUS) & 0x80
  281.    ? "IRQ conflict" : "network cable problem");
  282. printk(KERN_WARNING "%s: timeout registers: %04x %04x %04x %04x %04x %04x %04x %04x.n",
  283.    dev->name, htons(inw(ioaddr + 0)),
  284.    htons(inw(ioaddr + 2)), htons(inw(ioaddr + 4)),
  285.    htons(inw(ioaddr + 6)), htons(inw(ioaddr + 8)),
  286.    htons(inw(ioaddr +10)), htons(inw(ioaddr +12)),
  287.    htons(inw(ioaddr +14)));
  288. printk(KERN_WARNING "eth card: %04x %04xn",
  289. htons(inw(ioaddr+FJ_STATUS0)),
  290. htons(inw(ioaddr+FJ_CONFIG0)));
  291. lp->stats.tx_errors++;
  292. /* ToDo: We should try to restart the adaptor... */
  293. spin_lock_irqsave(&lp->lock, flags);
  294. /* Initialize LAN Controller and LAN Card */
  295. outb(0xda, ioaddr + CONFIG_0);   /* Initialize LAN Controller */
  296. outb(0x00, ioaddr + CONFIG_1);   /* Stand by mode */
  297. outb(0x00, ioaddr + FJ_CONFIG1); /* Disable IRQ of LAN Card */
  298. outb(0x00, ioaddr + FJ_BUFCNTL); /* Reset ? I'm not sure */
  299. net_open(dev);
  300. spin_unlock_irqrestore(&lp->lock, flags);
  301. netif_wake_queue(dev);
  302. }
  303. static int net_send_packet(struct sk_buff *skb, struct net_device *dev)
  304. {
  305. struct net_local *lp = dev->priv;
  306. int ioaddr = dev->base_addr;
  307. short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
  308. unsigned char *buf = skb->data;
  309. unsigned long flags;
  310. /* Block a transmit from overlapping.  */
  311. if (length > ETH_FRAME_LEN) {
  312. if (net_debug)
  313. printk("%s: Attempting to send a large packet (%d bytes).n",
  314. dev->name, length);
  315. return 1;
  316. }
  317. if (net_debug > 4)
  318. printk("%s: Transmitting a packet of length %lu.n", dev->name,
  319.    (unsigned long)skb->len);
  320. /* We may not start transmitting unless we finish transferring
  321.    a packet into the Tx queue. During executing the following
  322.    codes we possibly catch a Tx interrupt. Thus we flag off
  323.    tx_queue_ready, so that we prevent the interrupt routine
  324.    (net_interrupt) to start transmitting. */
  325. spin_lock_irqsave(&lp->lock, flags);
  326. lp->tx_queue_ready = 0;
  327. {
  328. outw(length, ioaddr + DATAPORT);
  329. outsw(ioaddr + DATAPORT, buf, (length + 1) >> 1);
  330. lp->tx_queue++;
  331. lp->tx_queue_len += length + 2;
  332. }
  333. lp->tx_queue_ready = 1;
  334. spin_unlock_irqrestore(&lp->lock, flags);
  335. if (lp->tx_started == 0) {
  336. /* If the Tx is idle, always trigger a transmit. */
  337. outb(0x80 | lp->tx_queue, ioaddr + TX_START);
  338. lp->tx_queue = 0;
  339. lp->tx_queue_len = 0;
  340. dev->trans_start = jiffies;
  341. lp->tx_started = 1;
  342. } else if (lp->tx_queue_len < 4096 - 1502)
  343. /* Yes, there is room for one more packet. */
  344. else
  345. netif_stop_queue(dev);
  346. dev_kfree_skb(skb);
  347. return 0;
  348. }
  349. /* The typical workload of the driver:
  350.    Handle the network interface interrupts. */
  351. static void
  352. net_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  353. {
  354. struct net_device *dev = dev_id;
  355. struct net_local *lp;
  356. int ioaddr, status;
  357. ioaddr = dev->base_addr;
  358. lp = dev->priv;
  359. status = inw(ioaddr + TX_STATUS);
  360. outw(status, ioaddr + TX_STATUS);
  361. if (net_debug > 4)
  362. printk("%s: Interrupt with status %04x.n", dev->name, status);
  363. if (lp->rx_started == 0 &&
  364. (status & 0xff00 || (inb(ioaddr + RX_MODE) & 0x40) == 0)) {
  365. /* Got a packet(s).
  366.    We cannot execute net_rx more than once at the same time for
  367.    the same device. During executing net_rx, we possibly catch a
  368.    Tx interrupt. Thus we flag on rx_started, so that we prevent
  369.    the interrupt routine (net_interrupt) to dive into net_rx
  370.    again. */
  371. lp->rx_started = 1;
  372. outb(0x00, ioaddr + RX_INTR); /* Disable RX intr. */
  373. net_rx(dev);
  374. outb(0x81, ioaddr + RX_INTR); /* Enable  RX intr. */
  375. lp->rx_started = 0;
  376. }
  377. if (status & 0x00ff) {
  378. if (status & 0x02) {
  379. /* More than 16 collisions occurred */
  380. if (net_debug > 4)
  381. printk("%s: 16 Collision occur during Txing.n", dev->name);
  382. /* Cancel sending a packet. */
  383. outb(0x03, ioaddr + COL16CNTL);
  384. lp->stats.collisions++;
  385. }
  386. if (status & 0x82) {
  387. spin_lock(&lp->lock);
  388. lp->stats.tx_packets++;
  389. if (lp->tx_queue && lp->tx_queue_ready) {
  390. outb(0x80 | lp->tx_queue, ioaddr + TX_START);
  391. lp->tx_queue = 0;
  392. lp->tx_queue_len = 0;
  393. dev->trans_start = jiffies;
  394. netif_wake_queue(dev); /* Inform upper layers. */
  395. } else {
  396. lp->tx_started = 0;
  397. netif_wake_queue(dev); /* Inform upper layers. */
  398. }
  399. spin_unlock(&lp->lock);
  400. }
  401. }
  402. return;
  403. }
  404. /* We have a good packet(s), get it/them out of the buffers. */
  405. static void net_rx(struct net_device *dev)
  406. {
  407. struct net_local *lp = dev->priv;
  408. int ioaddr = dev->base_addr;
  409. int boguscount = 5;
  410. while ((inb(ioaddr + RX_MODE) & 0x40) == 0) {
  411. /* Clear PKT_RDY bit: by agy 19940922 */
  412. /* outb(0x80, ioaddr + RX_STATUS); */
  413. ushort status = inw(ioaddr + DATAPORT);
  414. if (net_debug > 4)
  415. printk("%s: Rxing packet mode %02x status %04x.n",
  416.    dev->name, inb(ioaddr + RX_MODE), status);
  417. #ifndef final_version
  418. if (status == 0) {
  419. outb(0x05, ioaddr + 14);
  420. break;
  421. }
  422. #endif
  423. if ((status & 0xF0) != 0x20) { /* There was an error. */
  424. lp->stats.rx_errors++;
  425. if (status & 0x08) lp->stats.rx_length_errors++;
  426. if (status & 0x04) lp->stats.rx_frame_errors++;
  427. if (status & 0x02) lp->stats.rx_crc_errors++;
  428. if (status & 0x01) lp->stats.rx_over_errors++;
  429. } else {
  430. ushort pkt_len = inw(ioaddr + DATAPORT);
  431. /* Malloc up new buffer. */
  432. struct sk_buff *skb;
  433. if (pkt_len > 1550) {
  434. printk("%s: The FMV-18x claimed a very large packet, size %d.n",
  435.    dev->name, pkt_len);
  436. outb(0x05, ioaddr + 14);
  437. lp->stats.rx_errors++;
  438. break;
  439. }
  440. skb = dev_alloc_skb(pkt_len+3);
  441. if (skb == NULL) {
  442. printk("%s: Memory squeeze, dropping packet (len %d).n",
  443.    dev->name, pkt_len);
  444. outb(0x05, ioaddr + 14);
  445. lp->stats.rx_dropped++;
  446. break;
  447. }
  448. skb->dev = dev;
  449. skb_reserve(skb,2);
  450. insw(ioaddr + DATAPORT, skb_put(skb,pkt_len), (pkt_len + 1) >> 1);
  451. if (net_debug > 5) {
  452. int i;
  453. printk("%s: Rxed packet of length %d: ", dev->name, pkt_len);
  454. for (i = 0; i < 14; i++)
  455. printk(" %02x", skb->data[i]);
  456. printk(".n");
  457. }
  458. skb->protocol=eth_type_trans(skb, dev);
  459. netif_rx(skb);
  460. dev->last_rx = jiffies;
  461. lp->stats.rx_packets++;
  462. lp->stats.rx_bytes += pkt_len;
  463. }
  464. if (--boguscount <= 0)
  465. break;
  466. }
  467. /* If any worth-while packets have been received, dev_rint()
  468.    has done a mark_bh(NET_BH) for us and will work on them
  469.    when we get to the bottom-half routine. */
  470. {
  471. int i;
  472. for (i = 0; i < 20; i++) {
  473. if ((inb(ioaddr + RX_MODE) & 0x40) == 0x40)
  474. break;
  475. (void)inw(ioaddr + DATAPORT); /* dummy status read */
  476. outb(0x05, ioaddr + 14);
  477. }
  478. if (net_debug > 5 && i > 0)
  479. printk("%s: Exint Rx packet with mode %02x after %d ticks.n",
  480.    dev->name, inb(ioaddr + RX_MODE), i);
  481. }
  482. return;
  483. }
  484. /* The inverse routine to net_open(). */
  485. static int net_close(struct net_device *dev)
  486. {
  487. int ioaddr = dev->base_addr;
  488. ((struct net_local *)dev->priv)->open_time = 0;
  489. netif_stop_queue(dev);
  490. /* Set configuration register 0 to disable Tx and Rx. */
  491. outb(0xda, ioaddr + CONFIG_0);
  492. /* Update the statistics -- ToDo. */
  493. /* Power-down the chip.  Green, green, green! */
  494. outb(0x00, ioaddr + CONFIG_1);
  495. /* Set the ethernet adaptor disable IRQ */
  496. outb(0x00, ioaddr + FJ_CONFIG1);
  497. return 0;
  498. }
  499. /* Get the current statistics. This may be called with the card open or
  500.    closed. */
  501. static struct net_device_stats *net_get_stats(struct net_device *dev)
  502. {
  503. struct net_local *lp = dev->priv;
  504. return &lp->stats;
  505. }
  506. /* Set or clear the multicast filter for this adaptor.
  507.    num_addrs == -1 Promiscuous mode, receive all packets
  508.    num_addrs == 0 Normal mode, clear multicast list
  509.    num_addrs > 0 Multicast mode, receive normal and MC packets, and do
  510. best-effort filtering.
  511.  */
  512.  
  513. static void set_multicast_list(struct net_device *dev)
  514. {
  515. short ioaddr = dev->base_addr;
  516. if (dev->mc_count || dev->flags&(IFF_PROMISC|IFF_ALLMULTI))
  517. {
  518. /*
  519.  * We must make the kernel realise we had to move
  520.  * into promisc mode or we start all out war on
  521.  * the cable. - AC
  522.  */
  523. dev->flags|=IFF_PROMISC;
  524. outb(3, ioaddr + RX_MODE); /* Enable promiscuous mode */
  525. }
  526. else
  527. outb(2, ioaddr + RX_MODE); /* Disable promiscuous, use normal mode */
  528. }
  529. #ifdef MODULE
  530. static struct net_device dev_fmv18x;
  531. static int io = 0x220;
  532. static int irq;
  533. MODULE_PARM(io, "i");
  534. MODULE_PARM(irq, "i");
  535. MODULE_PARM(net_debug, "i");
  536. MODULE_PARM_DESC(io, "FMV-18X I/O address");
  537. MODULE_PARM_DESC(irq, "FMV-18X IRQ number");
  538. MODULE_PARM_DESC(net_debug, "FMV-18X debug level (0-1,5-6)");
  539. MODULE_LICENSE("GPL");
  540. int init_module(void)
  541. {
  542. if (io == 0)
  543. printk("fmv18x: You should not use auto-probing with insmod!n");
  544. dev_fmv18x.base_addr = io;
  545. dev_fmv18x.irq = irq;
  546. dev_fmv18x.init = fmv18x_probe;
  547. if (register_netdev(&dev_fmv18x) != 0) {
  548. printk("fmv18x: register_netdev() returned non-zero.n");
  549. return -EIO;
  550. }
  551. return 0;
  552. }
  553. void
  554. cleanup_module(void)
  555. {
  556. unregister_netdev(&dev_fmv18x);
  557. kfree(dev_fmv18x.priv);
  558. dev_fmv18x.priv = NULL;
  559. /* If we don't do this, we can't re-insmod it later. */
  560. free_irq(dev_fmv18x.irq, &dev_fmv18x);
  561. release_region(dev_fmv18x.base_addr, FMV18X_IO_EXTENT);
  562. }
  563. #endif /* MODULE */
  564. /*
  565.  * Local variables:
  566.  *  compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c fmv18x.c"
  567.  *  version-control: t
  568.  *  kept-new-versions: 5
  569.  *  tab-width: 4
  570.  *  c-indent-level: 4
  571.  * End:
  572.  */