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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* ni5010.c: A network driver for the MiCom-Interlan NI5010 ethercard.
  2.  *
  3.  * Copyright 1996,1997 Jan-Pascal van Best and Andreas Mohr.
  4.  *
  5.  * This software may be used and distributed according to the terms
  6.  * of the GNU General Public License, incorporated herein by reference.
  7.  *
  8.  *  The authors may be reached as:
  9.  * jvbest@wi.leidenuniv.nl a.mohr@mailto.de
  10.  *  or by snail mail as
  11.  *  Jan-Pascal van Best Andreas Mohr
  12.  * Klikspaanweg 58-4 Stauferstr. 6
  13.  * 2324 LZ  Leiden D-71272 Renningen
  14.  * The Netherlands Germany
  15.  *
  16.  * Sources:
  17.  *    Donald Becker's "skeleton.c"
  18.  *   Crynwr ni5010 packet driver
  19.  *
  20.  * Changes:
  21.  * v0.0: First test version
  22.  * v0.1: First working version
  23.  * v0.2:
  24.  * v0.3->v0.90: Now demand setting io and irq when loading as module
  25.  * 970430 v0.91: modified for Linux 2.1.14
  26.  * v0.92: Implemented Andreas' (better) NI5010 probe
  27.  * 970503 v0.93: Fixed auto-irq failure on warm reboot (JB)
  28.  * 970623 v1.00: First kernel version (AM)
  29.  * 970814 v1.01: Added detection of onboard receive buffer size (AM)
  30.  * Bugs:
  31.  * - None known...
  32.  * - Note that you have to patch ifconfig for the new /proc/net/dev
  33.  * format. It gives incorrect stats otherwise.
  34.  *
  35.  * To do:
  36.  * Fix all bugs :-)
  37.  * Move some stuff to chipset_init()
  38.  * Handle xmt errors other than collisions
  39.  * Complete merge with Andreas' driver
  40.  * Implement ring buffers (Is this useful? You can't squeeze
  41.  * too many packet in a 2k buffer!)
  42.  * Implement DMA (Again, is this useful? Some docs says DMA is
  43.  * slower than programmed I/O)
  44.  *
  45.  * Compile with:
  46.  * gcc -O2 -fomit-frame-pointer -m486 -D__KERNEL__ 
  47.  * -DMODULE -c ni5010.c 
  48.  *
  49.  * Insert with e.g.:
  50.  * insmod ni5010.o io=0x300 irq=5 
  51.  */
  52. #include <linux/module.h>
  53. #include <linux/kernel.h>
  54. #include <linux/string.h>
  55. #include <linux/errno.h>
  56. #include <linux/ioport.h>
  57. #include <linux/slab.h>
  58. #include <linux/interrupt.h>
  59. #include <linux/delay.h>
  60. #include <linux/init.h>
  61. #include <asm/bitops.h>
  62. #include <asm/io.h>
  63. #include <asm/dma.h>
  64. #include <linux/netdevice.h>
  65. #include <linux/etherdevice.h>
  66. #include <linux/skbuff.h>
  67. #include "ni5010.h"
  68. static const char *boardname = "NI5010";
  69. static char *version =
  70. "ni5010.c: v1.00 06/23/97 Jan-Pascal van Best and Andreas Mohrn";
  71. /* bufsize_rcv == 0 means autoprobing */
  72. static unsigned int bufsize_rcv;
  73. #define jumpered_interrupts /* IRQ line jumpered on board */
  74. #undef jumpered_dma /* No DMA used */
  75. #undef FULL_IODETECT /* Only detect in portlist */
  76. #ifndef FULL_IODETECT
  77. /* A zero-terminated list of I/O addresses to be probed. */
  78. static unsigned int ni5010_portlist[] __initdata =
  79. { 0x300, 0x320, 0x340, 0x360, 0x380, 0x3a0, 0 };
  80. #endif
  81. /* Use 0 for production, 1 for verification, >2 for debug */
  82. #ifndef NI5010_DEBUG
  83. #define NI5010_DEBUG 0
  84. #endif
  85. /* Information that needs to be kept for each board. */
  86. struct ni5010_local {
  87. struct net_device_stats stats;
  88. int o_pkt_size;
  89. int i_pkt_size;
  90. };
  91. /* Index to functions, as function prototypes. */
  92. extern int  ni5010_probe(struct net_device *dev);
  93. static int ni5010_probe1(struct net_device *dev, int ioaddr);
  94. static int ni5010_open(struct net_device *dev);
  95. static int ni5010_send_packet(struct sk_buff *skb, struct net_device *dev);
  96. static void ni5010_interrupt(int irq, void *dev_id, struct pt_regs *regs);
  97. static void ni5010_rx(struct net_device *dev);
  98. static void ni5010_timeout(struct net_device *dev);
  99. static int ni5010_close(struct net_device *dev);
  100. static struct net_device_stats *ni5010_get_stats(struct net_device *dev);
  101. static void  ni5010_set_multicast_list(struct net_device *dev);
  102. static void reset_receiver(struct net_device *dev);
  103. static int process_xmt_interrupt(struct net_device *dev);
  104. #define tx_done(dev) 1
  105. static void hardware_send_packet(struct net_device *dev, char *buf, int length);
  106. static void  chipset_init(struct net_device *dev, int startp);
  107. static void dump_packet(void *buf, int len);
  108. static void  ni5010_show_registers(struct net_device *dev);
  109. int __init ni5010_probe(struct net_device *dev)
  110. {
  111. int *port;
  112. int base_addr = dev->base_addr;
  113.         PRINTK2((KERN_DEBUG "%s: Entering ni5010_proben", dev->name));
  114. SET_MODULE_OWNER(dev);
  115. if (base_addr > 0x1ff) /* Check a single specified location. */
  116. return ni5010_probe1(dev, base_addr);
  117. else if (base_addr != 0) /* Don't probe at all. */
  118. return -ENXIO;
  119. #ifdef FULL_IODETECT
  120. for (int ioaddr=0x200; ioaddr<0x400; ioaddr+=0x20) {
  121. if (check_region(ioaddr, NI5010_IO_EXTENT))
  122. continue;
  123. if (ni5010_probe1(dev, ioaddr) == 0)
  124. return 0;
  125. }
  126. #else
  127. for (port = ni5010_portlist; *port; port++) {
  128. int ioaddr = *port;
  129. if (check_region(ioaddr, NI5010_IO_EXTENT))
  130. continue;
  131. if (ni5010_probe1(dev, ioaddr) == 0)
  132. return 0;
  133. }
  134. #endif /* FULL_IODETECT */
  135. return -ENODEV;
  136. }
  137. static inline int rd_port(int ioaddr)
  138. {
  139. inb(IE_RBUF);
  140. return inb(IE_SAPROM);
  141. }
  142. static void __init trigger_irq(int ioaddr)
  143. {
  144. outb(0x00, EDLC_RESET); /* Clear EDLC hold RESET state */
  145. outb(0x00, IE_RESET); /* Board reset */
  146. outb(0x00, EDLC_XMASK); /* Disable all Xmt interrupts */
  147. outb(0x00, EDLC_RMASK); /* Disable all Rcv interrupt */
  148. outb(0xff, EDLC_XCLR); /* Clear all pending Xmt interrupts */
  149. outb(0xff, EDLC_RCLR); /* Clear all pending Rcv interrupts */
  150. /*
  151.  * Transmit packet mode: Ignore parity, Power xcvr,
  152.  *  Enable loopback
  153.  */
  154. outb(XMD_IG_PAR | XMD_T_MODE | XMD_LBC, EDLC_XMODE);
  155. outb(RMD_BROADCAST, EDLC_RMODE); /* Receive normal&broadcast */
  156. outb(XM_ALL, EDLC_XMASK); /* Enable all Xmt interrupts */
  157. udelay(50); /* FIXME: Necessary? */
  158. outb(MM_EN_XMT|MM_MUX, IE_MMODE); /* Start transmission */
  159. }
  160. /*
  161.  *      This is the real probe routine.  Linux has a history of friendly device
  162.  *      probes on the ISA bus.  A good device probes avoids doing writes, and
  163.  *      verifies that the correct device exists and functions.
  164.  */
  165. static int __init ni5010_probe1(struct net_device *dev, int ioaddr)
  166. {
  167. static unsigned version_printed;
  168. int i;
  169. unsigned int data = 0;
  170. int boguscount = 40;
  171. /*
  172.  * This is no "official" probe method, I've rather tested which
  173.  * probe works best with my seven NI5010 cards
  174.  * (they have very different serial numbers)
  175.  * Suggestions or failure reports are very, very welcome !
  176.  * But I think it is a relatively good probe method
  177.  * since it doesn't use any "outb"
  178.  * It should be nearly 100% reliable !
  179.  * well-known WARNING: this probe method (like many others)
  180.  * will hang the system if a NE2000 card region is probed !
  181.  *
  182.  *   - Andreas
  183.  */
  184.   PRINTK2((KERN_DEBUG "%s: entering ni5010_probe1(%#3x)n", 
  185.   dev->name, ioaddr));
  186. if (inb(ioaddr+0) == 0xff) return -ENODEV;
  187. while ( (rd_port(ioaddr) & rd_port(ioaddr) & rd_port(ioaddr) &
  188.  rd_port(ioaddr) & rd_port(ioaddr) & rd_port(ioaddr)) != 0xff)
  189. {
  190. if (boguscount-- == 0) return -ENODEV;
  191. }
  192. PRINTK2((KERN_DEBUG "%s: I/O #1 passed!n", dev->name));
  193. for (i=0; i<32; i++)
  194. if ( (data = rd_port(ioaddr)) != 0xff) break;
  195. if (data==0xff) return -ENODEV;
  196. PRINTK2((KERN_DEBUG "%s: I/O #2 passed!n", dev->name));
  197. if ( (data == SA_ADDR0) &&
  198.      (rd_port(ioaddr) == SA_ADDR1) &&
  199.      (rd_port(ioaddr) == SA_ADDR2) ) {
  200. for (i=0; i<4; i++) rd_port(ioaddr);
  201. if ( (rd_port(ioaddr) != NI5010_MAGICVAL1) ||
  202.      (rd_port(ioaddr) != NI5010_MAGICVAL2) ) {
  203.       return -ENODEV;
  204. }
  205. } else return -ENODEV;
  206. PRINTK2((KERN_DEBUG "%s: I/O #3 passed!n", dev->name));
  207. if (NI5010_DEBUG && version_printed++ == 0)
  208. printk(KERN_INFO "%s", version);
  209. printk("NI5010 ethercard probe at 0x%x: ", ioaddr);
  210. dev->base_addr = ioaddr;
  211. for (i=0; i<6; i++) {
  212. outw(i, IE_GP);
  213. printk("%2.2x ", dev->dev_addr[i] = inb(IE_SAPROM));
  214. }
  215. PRINTK2((KERN_DEBUG "%s: I/O #4 passed!n", dev->name));
  216. #ifdef jumpered_interrupts
  217. if (dev->irq == 0xff)
  218. ;
  219. else if (dev->irq < 2) {
  220. PRINTK2((KERN_DEBUG "%s: I/O #5 passed!n", dev->name));
  221. autoirq_setup(0);
  222. trigger_irq(ioaddr);
  223. dev->irq = autoirq_report(2);
  224. PRINTK2((KERN_DEBUG "%s: I/O #6 passed!n", dev->name));
  225. if (dev->irq == 0) {
  226. printk(KERN_WARNING "%s: no IRQ found!n", dev->name);
  227. return -EAGAIN;
  228. }
  229. PRINTK2((KERN_DEBUG "%s: I/O #7 passed!n", dev->name));
  230. } else if (dev->irq == 2) {
  231. dev->irq = 9;
  232. }
  233. #endif /* jumpered_irq */
  234. PRINTK2((KERN_DEBUG "%s: I/O #9 passed!n", dev->name));
  235. /* DMA is not supported (yet?), so no use detecting it */
  236. if (dev->priv == NULL) {
  237. dev->priv = kmalloc(sizeof(struct ni5010_local), GFP_KERNEL|GFP_DMA);
  238. if (dev->priv == NULL) {
  239. printk(KERN_WARNING "%s: Failed to allocate private memoryn", dev->name);
  240. return -ENOMEM;
  241. }
  242. }
  243. PRINTK2((KERN_DEBUG "%s: I/O #10 passed!n", dev->name));
  244. /* get the size of the onboard receive buffer
  245.  * higher addresses than bufsize are wrapped into real buffer
  246.  * i.e. data for offs. 0x801 is written to 0x1 with a 2K onboard buffer
  247.  */
  248. if (!bufsize_rcv) {
  249.          outb(1, IE_MMODE);      /* Put Rcv buffer on system bus */
  250.          outw(0, IE_GP); /* Point GP at start of packet */
  251.          outb(0, IE_RBUF); /* set buffer byte 0 to 0 */
  252.          for (i = 1; i < 0xff; i++) {
  253.                  outw(i << 8, IE_GP); /* Point GP at packet size to be tested */
  254.                  outb(i, IE_RBUF);
  255.                  outw(0x0, IE_GP); /* Point GP at start of packet */
  256.                  data = inb(IE_RBUF);
  257.                  if (data == i) break;
  258.          }
  259. bufsize_rcv = i << 8;
  260.          outw(0, IE_GP); /* Point GP at start of packet */
  261.          outb(0, IE_RBUF); /* set buffer byte 0 to 0 again */
  262. }
  263.         printk("// bufsize rcv/xmt=%d/%dn", bufsize_rcv, NI5010_BUFSIZE);
  264. memset(dev->priv, 0, sizeof(struct ni5010_local));
  265. /* Grab the region so we can find another board if autoIRQ fails. */
  266. request_region(ioaddr, NI5010_IO_EXTENT, boardname);
  267. dev->open = ni5010_open;
  268. dev->stop = ni5010_close;
  269. dev->hard_start_xmit = ni5010_send_packet;
  270. dev->get_stats = ni5010_get_stats;
  271. dev->set_multicast_list = ni5010_set_multicast_list;
  272. dev->tx_timeout = ni5010_timeout;
  273. dev->watchdog_timeo = HZ/20;
  274. /* Fill in the fields of the device structure with ethernet values. */
  275. ether_setup(dev);
  276. dev->flags &= ~IFF_MULTICAST; /* Multicast doesn't work */
  277. /* Shut up the ni5010 */
  278. outb(0, EDLC_RMASK); /* Mask all receive interrupts */
  279. outb(0, EDLC_XMASK); /* Mask all xmit interrupts */
  280. outb(0xff, EDLC_RCLR); /* Kill all pending rcv interrupts */
  281. outb(0xff, EDLC_XCLR);  /* Kill all pending xmt interrupts */
  282. printk(KERN_INFO "%s: NI5010 found at 0x%x, using IRQ %d", dev->name, ioaddr, dev->irq);
  283. if (dev->dma) printk(" & DMA %d", dev->dma);
  284. printk(".n");
  285. printk(KERN_INFO "Join the NI5010 driver development team!n");
  286. printk(KERN_INFO "Mail to a.mohr@mailto.de or jvbest@wi.leidenuniv.nln");
  287. return 0;
  288. }
  289. /* 
  290.  * Open/initialize the board.  This is called (in the current kernel)
  291.  * sometime after booting when the 'ifconfig' program is run.
  292.  *
  293.  * This routine should set everything up anew at each open, even
  294.  * registers that "should" only need to be set once at boot, so that
  295.  * there is non-reboot way to recover if something goes wrong.
  296.  */
  297.    
  298. static int ni5010_open(struct net_device *dev)
  299. {
  300. int ioaddr = dev->base_addr;
  301. int i;
  302. PRINTK2((KERN_DEBUG "%s: entering ni5010_open()n", dev->name)); 
  303. if (request_irq(dev->irq, &ni5010_interrupt, 0, boardname, dev)) {
  304. printk(KERN_WARNING "%s: Cannot get irq %#2xn", dev->name, dev->irq);
  305. return -EAGAIN;
  306. }
  307. PRINTK3((KERN_DEBUG "%s: passed open() #1n", dev->name));
  308.         /*
  309.          * Always allocate the DMA channel after the IRQ,
  310.          * and clean up on failure.
  311.          */
  312. #ifdef jumpered_dma
  313.         if (request_dma(dev->dma, cardname)) {
  314. printk(KERN_WARNING "%s: Cannot get dma %#2xn", dev->name, dev->dma);
  315.                 free_irq(dev->irq, NULL);
  316.                 return -EAGAIN;
  317.         }
  318. #endif /* jumpered_dma */
  319. PRINTK3((KERN_DEBUG "%s: passed open() #2n", dev->name));
  320. /* Reset the hardware here.  Don't forget to set the station address. */
  321. outb(RS_RESET, EDLC_RESET); /* Hold up EDLC_RESET while configing board */
  322. outb(0, IE_RESET); /* Hardware reset of ni5010 board */
  323. outb(XMD_LBC, EDLC_XMODE); /* Only loopback xmits */
  324. PRINTK3((KERN_DEBUG "%s: passed open() #3n", dev->name));
  325. /* Set the station address */
  326. for(i = 0;i < 6; i++) {
  327. outb(dev->dev_addr[i], EDLC_ADDR + i);
  328. }
  329. PRINTK3((KERN_DEBUG "%s: Initialising ni5010n", dev->name)); 
  330. outb(0, EDLC_XMASK); /* No xmit interrupts for now */
  331. outb(XMD_IG_PAR | XMD_T_MODE | XMD_LBC, EDLC_XMODE); 
  332. /* Normal packet xmit mode */
  333. outb(0xff, EDLC_XCLR); /* Clear all pending xmit interrupts */
  334. outb(RMD_BROADCAST, EDLC_RMODE);
  335. /* Receive broadcast and normal packets */
  336. reset_receiver(dev); /* Ready ni5010 for receiving packets */
  337. outb(0, EDLC_RESET); /* Un-reset the ni5010 */
  338. netif_start_queue(dev);
  339. if (NI5010_DEBUG) ni5010_show_registers(dev); 
  340. PRINTK((KERN_DEBUG "%s: open successfuln", dev->name));
  341.       return 0;
  342. }
  343. static void reset_receiver(struct net_device *dev)
  344. {
  345. int ioaddr = dev->base_addr;
  346. PRINTK3((KERN_DEBUG "%s: resetting receivern", dev->name));
  347. outw(0, IE_GP); /* Receive packet at start of buffer */
  348. outb(0xff, EDLC_RCLR); /* Clear all pending rcv interrupts */
  349. outb(0, IE_MMODE); /* Put EDLC to rcv buffer */
  350. outb(MM_EN_RCV, IE_MMODE); /* Enable rcv */
  351. outb(0xff, EDLC_RMASK); /* Enable all rcv interrupts */
  352. }
  353. static void ni5010_timeout(struct net_device *dev)
  354. {
  355. printk(KERN_WARNING "%s: transmit timed out, %s?n", dev->name,
  356.    tx_done(dev) ? "IRQ conflict" : "network cable problem");
  357. /* Try to restart the adaptor. */
  358. /* FIXME: Give it a real kick here */
  359. chipset_init(dev, 1);
  360. dev->trans_start = jiffies;
  361. netif_wake_queue(dev);
  362. }
  363. static int ni5010_send_packet(struct sk_buff *skb, struct net_device *dev)
  364. {
  365. int length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
  366. PRINTK2((KERN_DEBUG "%s: entering ni5010_send_packetn", dev->name));
  367. /* 
  368.          * Block sending
  369.  */
  370. netif_stop_queue(dev);
  371. hardware_send_packet(dev, (unsigned char *)skb->data, length);
  372. dev->trans_start = jiffies;
  373. dev_kfree_skb (skb);
  374. return 0;
  375. }
  376. /* 
  377.  * The typical workload of the driver:
  378.  * Handle the network interface interrupts. 
  379.  */
  380. static void  ni5010_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  381. {
  382. struct net_device *dev = dev_id;
  383. struct ni5010_local *lp;
  384. int ioaddr, status;
  385. int xmit_was_error = 0;
  386. PRINTK2((KERN_DEBUG "%s: entering ni5010_interruptn", dev->name));
  387. ioaddr = dev->base_addr;
  388. lp = (struct ni5010_local *)dev->priv;
  389. status = inb(IE_ISTAT); 
  390. PRINTK3((KERN_DEBUG "%s: IE_ISTAT = %#02xn", dev->name, status));
  391.         if ((status & IS_R_INT) == 0) ni5010_rx(dev);
  392.         if ((status & IS_X_INT) == 0) {
  393.                 xmit_was_error = process_xmt_interrupt(dev);
  394.         }
  395.         if ((status & IS_DMA_INT) == 0) {
  396.                 PRINTK((KERN_DEBUG "%s: DMA complete (?)n", dev->name));
  397.                 outb(0, IE_DMA_RST); /* Reset DMA int */
  398.         }
  399. if (!xmit_was_error) 
  400. reset_receiver(dev); 
  401. return;
  402. }
  403. static void dump_packet(void *buf, int len)
  404. {
  405. int i;
  406. printk(KERN_DEBUG "Packet length = %#4xn", len);
  407. for (i = 0; i < len; i++){
  408. if (i % 16 == 0) printk(KERN_DEBUG "%#4.4x", i);
  409. if (i % 2 == 0) printk(" ");
  410. printk("%2.2x", ((unsigned char *)buf)[i]);
  411. if (i % 16 == 15) printk("n");
  412. }
  413. printk("n");
  414. return;
  415. }
  416. /* We have a good packet, get it out of the buffer. */
  417. static void ni5010_rx(struct net_device *dev)
  418. {
  419. struct ni5010_local *lp = (struct ni5010_local *)dev->priv;
  420. int ioaddr = dev->base_addr;
  421. unsigned char rcv_stat;
  422. struct sk_buff *skb;
  423. PRINTK2((KERN_DEBUG "%s: entering ni5010_rx()n", dev->name)); 
  424. rcv_stat = inb(EDLC_RSTAT);
  425. PRINTK3((KERN_DEBUG "%s: EDLC_RSTAT = %#2xn", dev->name, rcv_stat)); 
  426. if ( (rcv_stat & RS_VALID_BITS) != RS_PKT_OK) {
  427. PRINTK((KERN_INFO "%s: receive error.n", dev->name));
  428. lp->stats.rx_errors++;
  429. if (rcv_stat & RS_RUNT) lp->stats.rx_length_errors++;
  430. if (rcv_stat & RS_ALIGN) lp->stats.rx_frame_errors++;
  431. if (rcv_stat & RS_CRC_ERR) lp->stats.rx_crc_errors++;
  432. if (rcv_stat & RS_OFLW) lp->stats.rx_fifo_errors++;
  433.          outb(0xff, EDLC_RCLR); /* Clear the interrupt */
  434. return;
  435. }
  436.         outb(0xff, EDLC_RCLR);  /* Clear the interrupt */
  437. lp->i_pkt_size = inw(IE_RCNT);
  438. if (lp->i_pkt_size > ETH_FRAME_LEN || lp->i_pkt_size < 10 ) {
  439. PRINTK((KERN_DEBUG "%s: Packet size error, packet size = %#4.4xn", 
  440. dev->name, lp->i_pkt_size));
  441. lp->stats.rx_errors++;
  442. lp->stats.rx_length_errors++;
  443. return;
  444. }
  445. /* Malloc up new buffer. */
  446. skb = dev_alloc_skb(lp->i_pkt_size + 3);
  447. if (skb == NULL) {
  448. printk(KERN_WARNING "%s: Memory squeeze, dropping packet.n", dev->name);
  449. lp->stats.rx_dropped++;
  450. return;
  451. }
  452. skb->dev = dev;
  453. skb_reserve(skb, 2);
  454. /* Read packet into buffer */
  455.         outb(MM_MUX, IE_MMODE); /* Rcv buffer to system bus */
  456. outw(0, IE_GP); /* Seek to beginning of packet */
  457. insb(IE_RBUF, skb_put(skb, lp->i_pkt_size), lp->i_pkt_size); 
  458. if (NI5010_DEBUG >= 4) 
  459. dump_packet(skb->data, skb->len); 
  460. skb->protocol = eth_type_trans(skb,dev);
  461. netif_rx(skb);
  462. dev->last_rx = jiffies;
  463. lp->stats.rx_packets++;
  464. lp->stats.rx_bytes += lp->i_pkt_size;
  465. PRINTK2((KERN_DEBUG "%s: Received packet, size=%#4.4xn", 
  466. dev->name, lp->i_pkt_size));
  467. }
  468. static int process_xmt_interrupt(struct net_device *dev)
  469. {
  470. struct ni5010_local *lp = (struct ni5010_local *)dev->priv;
  471. int ioaddr = dev->base_addr;
  472. int xmit_stat;
  473. PRINTK2((KERN_DEBUG "%s: entering process_xmt_interruptn", dev->name));
  474. xmit_stat = inb(EDLC_XSTAT);
  475. PRINTK3((KERN_DEBUG "%s: EDLC_XSTAT = %2.2xn", dev->name, xmit_stat));
  476. outb(0, EDLC_XMASK); /* Disable xmit IRQ's */
  477. outb(0xff, EDLC_XCLR); /* Clear all pending xmit IRQ's */
  478. if (xmit_stat & XS_COLL){
  479. PRINTK((KERN_DEBUG "%s: collision detected, retransmittingn", 
  480. dev->name));
  481. outw(NI5010_BUFSIZE - lp->o_pkt_size, IE_GP);
  482. /* outb(0, IE_MMODE); */ /* xmt buf on sysbus FIXME: needed ? */
  483. outb(MM_EN_XMT | MM_MUX, IE_MMODE);
  484. outb(XM_ALL, EDLC_XMASK); /* Enable xmt IRQ's */
  485. lp->stats.collisions++;
  486. return 1;
  487. }
  488. /* FIXME: handle other xmt error conditions */
  489. lp->stats.tx_packets++;
  490. lp->stats.tx_bytes += lp->o_pkt_size;
  491. netif_wake_queue(dev);
  492. PRINTK2((KERN_DEBUG "%s: sent packet, size=%#4.4xn", 
  493. dev->name, lp->o_pkt_size));
  494. return 0;
  495. }
  496. /* The inverse routine to ni5010_open(). */
  497. static int ni5010_close(struct net_device *dev)
  498. {
  499. int ioaddr = dev->base_addr;
  500. PRINTK2((KERN_DEBUG "%s: entering ni5010_closen", dev->name));
  501. #ifdef jumpered_interrupts
  502. free_irq(dev->irq, NULL);
  503. #endif
  504. /* Put card in held-RESET state */
  505. outb(0, IE_MMODE);
  506. outb(RS_RESET, EDLC_RESET);
  507. netif_stop_queue(dev);
  508. PRINTK((KERN_DEBUG "%s: %s closed downn", dev->name, boardname));
  509. return 0;
  510. }
  511. /* Get the current statistics. This may be called with the card open or
  512.    closed. */
  513. static struct net_device_stats *ni5010_get_stats(struct net_device *dev)
  514. {
  515. struct ni5010_local *lp = (struct ni5010_local *)dev->priv;
  516. PRINTK2((KERN_DEBUG "%s: entering ni5010_get_statsn", dev->name));
  517. if (NI5010_DEBUG) ni5010_show_registers(dev);
  518. /* cli(); */
  519. /* Update the statistics from the device registers. */
  520. /* We do this in the interrupt handler */
  521. /* sti(); */
  522. return &lp->stats;
  523. }
  524. /* Set or clear the multicast filter for this adaptor.
  525.    num_addrs == -1      Promiscuous mode, receive all packets
  526.    num_addrs == 0       Normal mode, clear multicast list
  527.    num_addrs > 0        Multicast mode, receive normal and MC packets, and do
  528.                         best-effort filtering.
  529. */
  530. static void ni5010_set_multicast_list(struct net_device *dev)
  531. {
  532. short ioaddr = dev->base_addr;  
  533. PRINTK2((KERN_DEBUG "%s: entering set_multicast_listn", dev->name));
  534. if (dev->flags&IFF_PROMISC || dev->flags&IFF_ALLMULTI) {
  535. dev->flags |= IFF_PROMISC;
  536. outb(RMD_PROMISC, EDLC_RMODE); /* Enable promiscuous mode */
  537. PRINTK((KERN_DEBUG "%s: Entering promiscuous moden", dev->name));
  538. } else if (dev->mc_list) {
  539. /* Sorry, multicast not supported */
  540. PRINTK((KERN_DEBUG "%s: No multicast, entering broadcast moden", dev->name));
  541. outb(RMD_BROADCAST, EDLC_RMODE);
  542. } else {
  543. PRINTK((KERN_DEBUG "%s: Entering broadcast moden", dev->name));
  544. outb(RMD_BROADCAST, EDLC_RMODE);  /* Disable promiscuous mode, use normal mode */
  545. }
  546. }
  547. static void hardware_send_packet(struct net_device *dev, char *buf, int length)
  548. {
  549. struct ni5010_local *lp = (struct ni5010_local *)dev->priv;
  550. int ioaddr = dev->base_addr;
  551. unsigned long flags;
  552. unsigned int buf_offs;
  553. PRINTK2((KERN_DEBUG "%s: entering hardware_send_packetn", dev->name));
  554.         if (length > ETH_FRAME_LEN) {
  555.                 PRINTK((KERN_WARNING "%s: packet too large, not possiblen",
  556.                         dev->name));
  557.                 return;
  558.         }
  559. if (NI5010_DEBUG) ni5010_show_registers(dev);
  560. if (inb(IE_ISTAT) & IS_EN_XMT) {
  561. PRINTK((KERN_WARNING "%s: sending packet while already transmitting, not possiblen", 
  562. dev->name));
  563. return;
  564. }
  565. if (NI5010_DEBUG > 3) dump_packet(buf, length);
  566.         buf_offs = NI5010_BUFSIZE - length;
  567.         lp->o_pkt_size = length;
  568. save_flags(flags);
  569. cli();
  570. outb(0, EDLC_RMASK); /* Mask all receive interrupts */
  571. outb(0, IE_MMODE); /* Put Xmit buffer on system bus */
  572. outb(0xff, EDLC_RCLR); /* Clear out pending rcv interrupts */
  573. outw(buf_offs, IE_GP); /* Point GP at start of packet */
  574. outsb(IE_XBUF, buf, length); /* Put data in buffer */
  575. outw(buf_offs, IE_GP); /* Rewrite where packet starts */
  576. /* should work without that outb() (Crynwr used it) */
  577. /*outb(MM_MUX, IE_MMODE);*/ /* Xmt buffer to EDLC bus */
  578. outb(MM_EN_XMT | MM_MUX, IE_MMODE); /* Begin transmission */
  579. outb(XM_ALL, EDLC_XMASK); /* Cause interrupt after completion or fail */
  580. restore_flags(flags);
  581. netif_wake_queue(dev);
  582. if (NI5010_DEBUG) ni5010_show_registers(dev);
  583. }
  584. static void chipset_init(struct net_device *dev, int startp)
  585. {
  586. /* FIXME: Move some stuff here */
  587. PRINTK3((KERN_DEBUG "%s: doing NOTHING in chipset_initn", dev->name));
  588. }
  589. static void ni5010_show_registers(struct net_device *dev)
  590. {
  591. int ioaddr = dev->base_addr;
  592. PRINTK3((KERN_DEBUG "%s: XSTAT %#2.2xn", dev->name, inb(EDLC_XSTAT)));
  593. PRINTK3((KERN_DEBUG "%s: XMASK %#2.2xn", dev->name, inb(EDLC_XMASK)));
  594. PRINTK3((KERN_DEBUG "%s: RSTAT %#2.2xn", dev->name, inb(EDLC_RSTAT)));
  595. PRINTK3((KERN_DEBUG "%s: RMASK %#2.2xn", dev->name, inb(EDLC_RMASK)));
  596. PRINTK3((KERN_DEBUG "%s: RMODE %#2.2xn", dev->name, inb(EDLC_RMODE)));
  597. PRINTK3((KERN_DEBUG "%s: XMODE %#2.2xn", dev->name, inb(EDLC_XMODE)));
  598. PRINTK3((KERN_DEBUG "%s: ISTAT %#2.2xn", dev->name, inb(IE_ISTAT)));
  599. }
  600. #ifdef MODULE
  601. static struct net_device dev_ni5010;
  602. static int io;
  603. static int irq;
  604. MODULE_PARM(io, "i");
  605. MODULE_PARM(irq, "i");
  606. MODULE_PARM_DESC(io, "ni5010 I/O base address");
  607. MODULE_PARM_DESC(irq, "ni5010 IRQ number");
  608. int init_module(void)
  609. {
  610. int result;
  611. PRINTK2((KERN_DEBUG "%s: entering init_modulen", boardname));
  612. /*
  613. if(io <= 0 || irq == 0){
  614.     printk(KERN_WARNING "%s: Autoprobing not allowed for modules.n", boardname);
  615. printk(KERN_WARNING "%s: Set symbols 'io' and 'irq'n", boardname);
  616.     return -EINVAL;
  617. }
  618. */
  619. if (io <= 0){
  620. printk(KERN_WARNING "%s: Autoprobing for modules is hazardous, trying anyway..n", boardname);
  621. }
  622. PRINTK2((KERN_DEBUG "%s: init_module irq=%#2x, io=%#3xn", boardname, irq, io));
  623.         dev_ni5010.irq=irq;
  624.         dev_ni5010.base_addr=io;
  625. dev_ni5010.init=ni5010_probe;
  626.         if ((result = register_netdev(&dev_ni5010)) != 0) {
  627.          PRINTK((KERN_WARNING "%s: register_netdev returned %d.n", 
  628.          boardname, result));
  629.                 return -EIO;
  630.         }
  631.         return 0;
  632. }
  633. void
  634. cleanup_module(void)
  635. {
  636. PRINTK2((KERN_DEBUG "%s: entering cleanup_modulen", boardname));
  637.         unregister_netdev(&dev_ni5010);
  638. release_region(dev_ni5010.base_addr, NI5010_IO_EXTENT);
  639. if (dev_ni5010.priv != NULL){
  640.         kfree(dev_ni5010.priv);
  641.         dev_ni5010.priv = NULL;
  642. }
  643. }
  644. #endif /* MODULE */
  645. MODULE_LICENSE("GPL");
  646. /*
  647.  * Local variables:
  648.  *  compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c ni5010.c"
  649.  *  version-control: t
  650.  *  kept-new-versions: 5
  651.  *  tab-width: 4
  652.  * End:
  653.  */