00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 #include <linux/module.h>
00054 #include <linux/kernel.h>
00055 #include <linux/string.h>
00056 #include <linux/errno.h>
00057 #include <linux/ioport.h>
00058 #include <linux/malloc.h>
00059 #include <linux/interrupt.h>
00060 #include <linux/delay.h>
00061 #include <linux/init.h>
00062 #include <asm/bitops.h>
00063 #include <asm/io.h>
00064 #include <asm/dma.h>
00065
00066 #include <linux/netdevice.h>
00067 #include <linux/etherdevice.h>
00068 #include <linux/skbuff.h>
00069
00070 #include "ni5010.h"
00071
00072 static const char *boardname = "NI5010";
00073 static char *version =
00074 "ni5010.c: v1.00 06/23/97 Jan-Pascal van Best and Andreas Mohr\n";
00075
00076
00077 unsigned int bufsize_rcv = 0;
00078
00079 #define jumpered_interrupts
00080 #undef jumpered_dma
00081 #undef FULL_IODETECT
00082
00083 #ifndef FULL_IODETECT
00084
00085 static unsigned int ni5010_portlist[] __initdata =
00086 { 0x300, 0x320, 0x340, 0x360, 0x380, 0x3a0, 0 };
00087 #endif
00088
00089
00090 #ifndef NI5010_DEBUG
00091 #define NI5010_DEBUG 0
00092 #endif
00093
00094
00095 struct ni5010_local {
00096 struct net_device_stats stats;
00097 int o_pkt_size;
00098 int i_pkt_size;
00099 };
00100
00101
00102
00103 extern int ni5010_probe(struct device *dev);
00104 static int ni5010_probe1(struct device *dev, int ioaddr);
00105 static int ni5010_open(struct device *dev);
00106 static int ni5010_send_packet(struct sk_buff *skb, struct device *dev);
00107 static void ni5010_interrupt(int irq, void *dev_id, struct pt_regs *regs);
00108 static void ni5010_rx(struct device *dev);
00109 static int ni5010_close(struct device *dev);
00110 static struct net_device_stats *ni5010_get_stats(struct device *dev);
00111 static void ni5010_set_multicast_list(struct device *dev);
00112 static void reset_receiver(struct device *dev);
00113
00114 static int process_xmt_interrupt(struct device *dev);
00115 #define tx_done(dev) 1
00116 extern void hardware_send_packet(struct device *dev, char *buf, int length, int pad);
00117 extern void chipset_init(struct device *dev, int startp);
00118 static void dump_packet(void *buf, int len);
00119 static void show_registers(struct device *dev);
00120
00121
00122 __initfunc(int ni5010_probe(struct device *dev))
00123 {
00124 int *port;
00125
00126 int base_addr = dev ? dev->base_addr : 0;
00127
00128 PRINTK2((KERN_DEBUG "%s: Entering ni5010_probe\n", dev->name));
00129
00130 if (base_addr > 0x1ff)
00131 return ni5010_probe1(dev, base_addr);
00132 else if (base_addr != 0)
00133 return -ENXIO;
00134
00135 #ifdef FULL_IODETECT
00136 for (int ioaddr=0x200; ioaddr<0x400; ioaddr+=0x20) {
00137 if (check_region(ioaddr, NI5010_IO_EXTENT))
00138 continue;
00139 if (ni5010_probe1(dev, ioaddr) == 0)
00140 return 0;
00141 }
00142 #else
00143 for (port = ni5010_portlist; *port; port++) {
00144 int ioaddr = *port;
00145 if (check_region(ioaddr, NI5010_IO_EXTENT))
00146 continue;
00147 if (ni5010_probe1(dev, ioaddr) == 0)
00148 return 0;
00149 }
00150 #endif
00151 return -ENODEV;
00152 }
00153
00154 static inline int rd_port(int ioaddr)
00155 {
00156 inb(IE_RBUF);
00157 return inb(IE_SAPROM);
00158 }
00159
00160 __initfunc(void trigger_irq(int ioaddr))
00161 {
00162 outb(0x00, EDLC_RESET);
00163 outb(0x00, IE_RESET);
00164 outb(0x00, EDLC_XMASK);
00165 outb(0x00, EDLC_RMASK);
00166 outb(0xff, EDLC_XCLR);
00167 outb(0xff, EDLC_RCLR);
00168
00169
00170
00171
00172 outb(XMD_IG_PAR | XMD_T_MODE | XMD_LBC, EDLC_XMODE);
00173 outb(RMD_BROADCAST, EDLC_RMODE);
00174 outb(XM_ALL, EDLC_XMASK);
00175 udelay(50);
00176 outb(MM_EN_XMT|MM_MUX, IE_MMODE);
00177 }
00178
00179
00180
00181
00182
00183
00184
00185 __initfunc(static int ni5010_probe1(struct device *dev, int ioaddr))
00186 {
00187 static unsigned version_printed = 0;
00188 int i;
00189 unsigned int data;
00190 int boguscount = 40;
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206 PRINTK2((KERN_DEBUG "%s: entering ni5010_probe1(%#3x)\n",
00207 dev->name, ioaddr));
00208
00209 if (inb(ioaddr+0) == 0xff) return -ENODEV;
00210
00211 while ( (rd_port(ioaddr) & rd_port(ioaddr) & rd_port(ioaddr) &
00212 rd_port(ioaddr) & rd_port(ioaddr) & rd_port(ioaddr)) != 0xff)
00213 {
00214 if (boguscount-- == 0) return -ENODEV;
00215 }
00216
00217 PRINTK2((KERN_DEBUG "%s: I/O #1 passed!\n", dev->name));
00218
00219 for (i=0; i<32; i++)
00220 if ( (data = rd_port(ioaddr)) != 0xff) break;
00221 if (data==0xff) return -ENODEV;
00222
00223 PRINTK2((KERN_DEBUG "%s: I/O #2 passed!\n", dev->name));
00224
00225 if ( (data == SA_ADDR0) &&
00226 (rd_port(ioaddr) == SA_ADDR1) &&
00227 (rd_port(ioaddr) == SA_ADDR2) ) {
00228 for (i=0; i<4; i++) rd_port(ioaddr);
00229 if ( (rd_port(ioaddr) != NI5010_MAGICVAL1) ||
00230 (rd_port(ioaddr) != NI5010_MAGICVAL2) ) {
00231 return -ENODEV;
00232 }
00233 } else return -ENODEV;
00234
00235 PRINTK2((KERN_DEBUG "%s: I/O #3 passed!\n", dev->name));
00236
00237 if (dev == NULL) {
00238 dev = init_etherdev(0,0);
00239 if (dev == NULL) {
00240 printk(KERN_WARNING "%s: Failed to allocate device memory\n", boardname);
00241 return -ENOMEM;
00242 }
00243 }
00244
00245 if (NI5010_DEBUG && version_printed++ == 0)
00246 printk(KERN_INFO "%s", version);
00247
00248 printk("NI5010 ethercard probe at 0x%x: ", ioaddr);
00249
00250 dev->base_addr = ioaddr;
00251
00252 for (i=0; i<6; i++) {
00253 outw(i, IE_GP);
00254 printk("%2.2x ", dev->dev_addr[i] = inb(IE_SAPROM));
00255 }
00256
00257 PRINTK2((KERN_DEBUG "%s: I/O #4 passed!\n", dev->name));
00258
00259 #ifdef jumpered_interrupts
00260 if (dev->irq == 0xff)
00261 ;
00262 else if (dev->irq < 2) {
00263 PRINTK2((KERN_DEBUG "%s: I/O #5 passed!\n", dev->name));
00264
00265 autoirq_setup(0);
00266 trigger_irq(ioaddr);
00267 dev->irq = autoirq_report(2);
00268
00269 PRINTK2((KERN_DEBUG "%s: I/O #6 passed!\n", dev->name));
00270
00271 if (dev->irq == 0) {
00272 printk(KERN_WARNING "%s: no IRQ found!\n", dev->name);
00273 return -EAGAIN;
00274 }
00275 PRINTK2((KERN_DEBUG "%s: I/O #7 passed!\n", dev->name));
00276 } else if (dev->irq == 2) {
00277 dev->irq = 9;
00278 }
00279 #endif
00280 PRINTK2((KERN_DEBUG "%s: I/O #9 passed!\n", dev->name));
00281
00282
00283
00284 if (dev->priv == NULL) {
00285 dev->priv = kmalloc(sizeof(struct ni5010_local), GFP_KERNEL|GFP_DMA);
00286 if (dev->priv == NULL) {
00287 printk(KERN_WARNING "%s: Failed to allocate private memory\n", dev->name);
00288 return -ENOMEM;
00289 }
00290 }
00291
00292 PRINTK2((KERN_DEBUG "%s: I/O #10 passed!\n", dev->name));
00293
00294
00295
00296
00297
00298 if (!bufsize_rcv) {
00299 outb(1, IE_MMODE);
00300 outw(0, IE_GP);
00301 outb(0, IE_RBUF);
00302 for (i = 1; i < 0xff; i++) {
00303 outw(i << 8, IE_GP);
00304 outb(i, IE_RBUF);
00305 outw(0x0, IE_GP);
00306 data = inb(IE_RBUF);
00307 if (data == i) break;
00308 }
00309 bufsize_rcv = i << 8;
00310 outw(0, IE_GP);
00311 outb(0, IE_RBUF);
00312 }
00313 printk("// bufsize rcv/xmt=%d/%d\n", bufsize_rcv, NI5010_BUFSIZE);
00314 memset(dev->priv, 0, sizeof(struct ni5010_local));
00315
00316
00317 request_region(ioaddr, NI5010_IO_EXTENT, boardname);
00318
00319 dev->open = ni5010_open;
00320 dev->stop = ni5010_close;
00321 dev->hard_start_xmit = ni5010_send_packet;
00322 dev->get_stats = ni5010_get_stats;
00323 dev->set_multicast_list = &ni5010_set_multicast_list;
00324
00325
00326 ether_setup(dev);
00327
00328 dev->tbusy = 0;
00329 dev->interrupt = 0;
00330 dev->start = 0;
00331
00332 dev->flags &= ~IFF_MULTICAST;
00333
00334
00335 outb(0, EDLC_RMASK);
00336 outb(0, EDLC_XMASK);
00337 outb(0xff, EDLC_RCLR);
00338 outb(0xff, EDLC_XCLR);
00339
00340 printk(KERN_INFO "%s: NI5010 found at 0x%x, using IRQ %d", dev->name, ioaddr, dev->irq);
00341 if (dev->dma) printk(" & DMA %d", dev->dma);
00342 printk(".\n");
00343
00344 printk(KERN_INFO "Join the NI5010 driver development team!\n");
00345 printk(KERN_INFO "Mail to a.mohr@mailto.de or jvbest@wi.leidenuniv.nl\n");
00346 return 0;
00347 }
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358 static int ni5010_open(struct device *dev)
00359 {
00360 int ioaddr = dev->base_addr;
00361 int i;
00362
00363 PRINTK2((KERN_DEBUG "%s: entering ni5010_open()\n", dev->name));
00364
00365 if (request_irq(dev->irq, &ni5010_interrupt, 0, boardname, dev)) {
00366 printk(KERN_WARNING "%s: Cannot get irq %#2x\n", dev->name, dev->irq);
00367 return -EAGAIN;
00368 }
00369 PRINTK3((KERN_DEBUG "%s: passed open() #1\n", dev->name));
00370
00371
00372
00373
00374 #ifdef jumpered_dma
00375 if (request_dma(dev->dma, cardname)) {
00376 printk(KERN_WARNING "%s: Cannot get dma %#2x\n", dev->name, dev->dma);
00377 free_irq(dev->irq, NULL);
00378 return -EAGAIN;
00379 }
00380 #endif
00381
00382 PRINTK3((KERN_DEBUG "%s: passed open() #2\n", dev->name));
00383
00384
00385 outb(RS_RESET, EDLC_RESET);
00386 outb(0, IE_RESET);
00387 outb(XMD_LBC, EDLC_XMODE);
00388
00389 PRINTK3((KERN_DEBUG "%s: passed open() #3\n", dev->name));
00390
00391 for(i = 0;i < 6; i++) {
00392 outb(dev->dev_addr[i], EDLC_ADDR + i);
00393 }
00394
00395 PRINTK3((KERN_DEBUG "%s: Initialising ni5010\n", dev->name));
00396 outb(0, EDLC_XMASK);
00397 outb(XMD_IG_PAR | XMD_T_MODE | XMD_LBC, EDLC_XMODE);
00398
00399 outb(0xff, EDLC_XCLR);
00400 outb(RMD_BROADCAST, EDLC_RMODE);
00401
00402 reset_receiver(dev);
00403
00404 outb(0, EDLC_RESET);
00405
00406 dev->tbusy = 0;
00407 dev->interrupt = 0;
00408 dev->start = 1;
00409
00410 if (NI5010_DEBUG) show_registers(dev);
00411
00412 MOD_INC_USE_COUNT;
00413 PRINTK((KERN_DEBUG "%s: open successful\n", dev->name));
00414 return 0;
00415 }
00416
00417 static void reset_receiver(struct device *dev)
00418 {
00419 int ioaddr = dev->base_addr;
00420
00421 PRINTK3((KERN_DEBUG "%s: resetting receiver\n", dev->name));
00422 outw(0, IE_GP);
00423 outb(0xff, EDLC_RCLR);
00424 outb(0, IE_MMODE);
00425 outb(MM_EN_RCV, IE_MMODE);
00426 outb(0xff, EDLC_RMASK);
00427 }
00428
00429 static int ni5010_send_packet(struct sk_buff *skb, struct device *dev)
00430 {
00431 PRINTK2((KERN_DEBUG "%s: entering ni5010_send_packet\n", dev->name));
00432 if (dev->tbusy) {
00433
00434
00435
00436
00437 int tickssofar = jiffies - dev->trans_start;
00438 if (tickssofar < 5)
00439 return 1;
00440 printk("tbusy\n");
00441 printk(KERN_WARNING "%s: transmit timed out, %s?\n", dev->name,
00442 tx_done(dev) ? "IRQ conflict" : "network cable problem");
00443
00444
00445 chipset_init(dev, 1);
00446 dev->tbusy=0;
00447 dev->trans_start = jiffies;
00448 }
00449
00450
00451
00452
00453
00454 if (test_and_set_bit(0, (void*)&dev->tbusy) != 0) {
00455 printk(KERN_WARNING "%s: Transmitter access conflict.\n", dev->name);
00456 return 1;
00457 } else {
00458 int length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
00459
00460 hardware_send_packet(dev, (unsigned char *)skb->data, length, length-skb->len);
00461 dev->trans_start = jiffies;
00462 }
00463 dev_kfree_skb (skb);
00464
00465 return 0;
00466 }
00467
00468
00469
00470
00471
00472 static void
00473 ni5010_interrupt(int irq, void *dev_id, struct pt_regs *regs)
00474 {
00475 struct device *dev = dev_id;
00476 struct ni5010_local *lp;
00477 int ioaddr, status;
00478 int xmit_was_error = 0;
00479
00480 if (dev == NULL || dev->irq != irq) {
00481 printk(KERN_WARNING "%s: irq %d for unknown device.\n",
00482 boardname, irq);
00483 return;
00484 }
00485
00486 if (dev->interrupt) printk(KERN_WARNING "%s: Reentering IRQ-handler!\n", dev->name);
00487 dev->interrupt = 1;
00488
00489 PRINTK2((KERN_DEBUG "%s: entering ni5010_interrupt\n", dev->name));
00490
00491 ioaddr = dev->base_addr;
00492 lp = (struct ni5010_local *)dev->priv;
00493
00494 status = inb(IE_ISTAT);
00495 PRINTK3((KERN_DEBUG "%s: IE_ISTAT = %#02x\n", dev->name, status));
00496
00497 if ((status & IS_R_INT) == 0) ni5010_rx(dev);
00498
00499 if ((status & IS_X_INT) == 0) {
00500 xmit_was_error = process_xmt_interrupt(dev);
00501 }
00502
00503 if ((status & IS_DMA_INT) == 0) {
00504 PRINTK((KERN_DEBUG "%s: DMA complete (???)\n", dev->name));
00505 outb(0, IE_DMA_RST);
00506 }
00507
00508 if (!xmit_was_error)
00509 reset_receiver(dev);
00510
00511 dev->interrupt = 0;
00512 return;
00513 }
00514
00515
00516 static void dump_packet(void *buf, int len)
00517 {
00518 int i;
00519
00520 printk(KERN_DEBUG "Packet length = %#4x\n", len);
00521 for (i = 0; i < len; i++){
00522 if (i % 16 == 0) printk(KERN_DEBUG "%#4.4x", i);
00523 if (i % 2 == 0) printk(" ");
00524 printk("%2.2x", ((unsigned char *)buf)[i]);
00525 if (i % 16 == 15) printk("\n");
00526 }
00527 printk("\n");
00528
00529 return;
00530 }
00531
00532
00533 static void
00534 ni5010_rx(struct device *dev)
00535 {
00536 struct ni5010_local *lp = (struct ni5010_local *)dev->priv;
00537 int ioaddr = dev->base_addr;
00538 unsigned char rcv_stat;
00539 struct sk_buff *skb;
00540
00541 PRINTK2((KERN_DEBUG "%s: entering ni5010_rx()\n", dev->name));
00542
00543 rcv_stat = inb(EDLC_RSTAT);
00544 PRINTK3((KERN_DEBUG "%s: EDLC_RSTAT = %#2x\n", dev->name, rcv_stat));
00545
00546 if ( (rcv_stat & RS_VALID_BITS) != RS_PKT_OK) {
00547 PRINTK((KERN_INFO "%s: receive error.\n", dev->name));
00548 lp->stats.rx_errors++;
00549 if (rcv_stat & RS_RUNT) lp->stats.rx_length_errors++;
00550 if (rcv_stat & RS_ALIGN) lp->stats.rx_frame_errors++;
00551 if (rcv_stat & RS_CRC_ERR) lp->stats.rx_crc_errors++;
00552 if (rcv_stat & RS_OFLW) lp->stats.rx_fifo_errors++;
00553 outb(0xff, EDLC_RCLR);
00554 return;
00555 }
00556
00557 outb(0xff, EDLC_RCLR);
00558
00559 lp->i_pkt_size = inw(IE_RCNT);
00560 if (lp->i_pkt_size > ETH_FRAME_LEN || lp->i_pkt_size < 10 ) {
00561 PRINTK((KERN_DEBUG "%s: Packet size error, packet size = %#4.4x\n",
00562 dev->name, lp->i_pkt_size));
00563 lp->stats.rx_errors++;
00564 lp->stats.rx_length_errors++;
00565 return;
00566 }
00567
00568
00569 skb = dev_alloc_skb(lp->i_pkt_size + 3);
00570 if (skb == NULL) {
00571 printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
00572 lp->stats.rx_dropped++;
00573 return;
00574 }
00575
00576 skb->dev = dev;
00577 skb_reserve(skb, 2);
00578
00579
00580 outb(MM_MUX, IE_MMODE);
00581 outw(0, IE_GP);
00582 insb(IE_RBUF, skb_put(skb, lp->i_pkt_size), lp->i_pkt_size);
00583
00584 if (NI5010_DEBUG >= 4)
00585 dump_packet(skb->data, skb->len);
00586
00587 skb->protocol = eth_type_trans(skb,dev);
00588 netif_rx(skb);
00589 lp->stats.rx_packets++;
00590 lp->stats.rx_bytes += lp->i_pkt_size;
00591
00592 PRINTK2((KERN_DEBUG "%s: Received packet, size=%#4.4x\n",
00593 dev->name, lp->i_pkt_size));
00594
00595 }
00596
00597 static int process_xmt_interrupt(struct device *dev)
00598 {
00599 struct ni5010_local *lp = (struct ni5010_local *)dev->priv;
00600 int ioaddr = dev->base_addr;
00601 int xmit_stat;
00602
00603 PRINTK2((KERN_DEBUG "%s: entering process_xmt_interrupt\n", dev->name));
00604
00605 xmit_stat = inb(EDLC_XSTAT);
00606 PRINTK3((KERN_DEBUG "%s: EDLC_XSTAT = %2.2x\n", dev->name, xmit_stat));
00607
00608 outb(0, EDLC_XMASK);
00609 outb(0xff, EDLC_XCLR);
00610
00611 if (xmit_stat & XS_COLL){
00612 printk("ether collision\n");
00613 PRINTK((KERN_DEBUG "%s: collision detected, retransmitting\n",
00614 dev->name));
00615 outw(NI5010_BUFSIZE - lp->o_pkt_size, IE_GP);
00616
00617 outb(MM_EN_XMT | MM_MUX, IE_MMODE);
00618 outb(XM_ALL, EDLC_XMASK);
00619 lp->stats.collisions++;
00620 return 1;
00621 }
00622
00623
00624
00625 lp->stats.tx_packets++;
00626 lp->stats.tx_bytes += lp->o_pkt_size;
00627 dev->tbusy = 0;
00628 mark_bh(NET_BH);
00629
00630 PRINTK2((KERN_DEBUG "%s: sent packet, size=%#4.4x\n",
00631 dev->name, lp->o_pkt_size));
00632
00633 return 0;
00634 }
00635
00636
00637 static int
00638 ni5010_close(struct device *dev)
00639 {
00640 int ioaddr = dev->base_addr;
00641
00642 PRINTK2((KERN_DEBUG "%s: entering ni5010_close\n", dev->name));
00643 #ifdef jumpered_interrupts
00644 free_irq(dev->irq, NULL);
00645 #endif
00646
00647 outb(0, IE_MMODE);
00648 outb(RS_RESET, EDLC_RESET);
00649
00650 dev->tbusy = 1;
00651 dev->start = 0;
00652
00653 MOD_DEC_USE_COUNT;
00654 PRINTK((KERN_DEBUG "%s: %s closed down\n", dev->name, boardname));
00655 return 0;
00656
00657 }
00658
00659
00660
00661 static struct net_device_stats *
00662 ni5010_get_stats(struct device *dev)
00663 {
00664 struct ni5010_local *lp = (struct ni5010_local *)dev->priv;
00665
00666 PRINTK2((KERN_DEBUG "%s: entering ni5010_get_stats\n", dev->name));
00667
00668 if (NI5010_DEBUG) show_registers(dev);
00669
00670
00671
00672
00673
00674
00675 return &lp->stats;
00676 }
00677
00678
00679
00680
00681
00682
00683
00684 static void
00685 ni5010_set_multicast_list(struct device *dev)
00686 {
00687 short ioaddr = dev->base_addr;
00688
00689 PRINTK2((KERN_DEBUG "%s: entering set_multicast_list\n", dev->name));
00690
00691 if (dev->flags&IFF_PROMISC || dev->flags&IFF_ALLMULTI) {
00692 dev->flags |= IFF_PROMISC;
00693 outb(RMD_PROMISC, EDLC_RMODE);
00694 PRINTK((KERN_DEBUG "%s: Entering promiscuous mode\n", dev->name));
00695 } else if (dev->mc_list) {
00696
00697 PRINTK((KERN_DEBUG "%s: No multicast, entering broadcast mode\n", dev->name));
00698 outb(RMD_BROADCAST, EDLC_RMODE);
00699 } else {
00700 PRINTK((KERN_DEBUG "%s: Entering broadcast mode\n", dev->name));
00701 outb(RMD_BROADCAST, EDLC_RMODE);
00702 }
00703 }
00704
00705 extern void hardware_send_packet(struct device *dev, char *buf, int length, int pad)
00706 {
00707 struct ni5010_local *lp = (struct ni5010_local *)dev->priv;
00708 int ioaddr = dev->base_addr;
00709 unsigned long flags;
00710 unsigned int buf_offs;
00711
00712 PRINTK2((KERN_DEBUG "%s: entering hardware_send_packet\n", dev->name));
00713
00714 if (length > ETH_FRAME_LEN) {
00715 PRINTK((KERN_WARNING "%s: packet too large, not possible\n",
00716 dev->name));
00717 return;
00718 }
00719
00720 if (NI5010_DEBUG) show_registers(dev);
00721
00722 if (inb(IE_ISTAT) & IS_EN_XMT) {
00723 PRINTK((KERN_WARNING "%s: sending packet while already transmitting, not possible\n",
00724 dev->name));
00725 return;
00726 }
00727
00728 if (NI5010_DEBUG > 3) dump_packet(buf, length);
00729
00730 buf_offs = NI5010_BUFSIZE - length - pad ;
00731 lp->o_pkt_size = length + pad ;
00732
00733 save_flags(flags);
00734 cli();
00735
00736 outb(0, EDLC_RMASK);
00737 outb(0, IE_MMODE);
00738 outb(0xff, EDLC_RCLR);
00739
00740 outw(buf_offs, IE_GP);
00741 outsb(IE_XBUF, buf, length);
00742 while(pad--)
00743 outb(0, IE_XBUF);
00744
00745 outw(buf_offs, IE_GP);
00746
00747
00748
00749 outb(MM_EN_XMT | MM_MUX, IE_MMODE);
00750 outb(XM_ALL, EDLC_XMASK);
00751
00752 restore_flags(flags);
00753
00754 if (NI5010_DEBUG) show_registers(dev);
00755 }
00756
00757 extern void chipset_init(struct device *dev, int startp)
00758 {
00759
00760 PRINTK3((KERN_DEBUG "%s: doing NOTHING in chipset_init\n", dev->name));
00761 }
00762
00763 static void show_registers(struct device *dev)
00764 {
00765 int ioaddr = dev->base_addr;
00766
00767 PRINTK3((KERN_DEBUG "%s: XSTAT %#2.2x\n", dev->name, inb(EDLC_XSTAT)));
00768 PRINTK3((KERN_DEBUG "%s: XMASK %#2.2x\n", dev->name, inb(EDLC_XMASK)));
00769 PRINTK3((KERN_DEBUG "%s: RSTAT %#2.2x\n", dev->name, inb(EDLC_RSTAT)));
00770 PRINTK3((KERN_DEBUG "%s: RMASK %#2.2x\n", dev->name, inb(EDLC_RMASK)));
00771 PRINTK3((KERN_DEBUG "%s: RMODE %#2.2x\n", dev->name, inb(EDLC_RMODE)));
00772 PRINTK3((KERN_DEBUG "%s: XMODE %#2.2x\n", dev->name, inb(EDLC_XMODE)));
00773 PRINTK3((KERN_DEBUG "%s: ISTAT %#2.2x\n", dev->name, inb(IE_ISTAT)));
00774 }
00775
00776 #ifdef MODULE
00777 static char devicename[9] = { 0, };
00778 static struct device dev_ni5010 = {
00779 devicename,
00780 0, 0, 0, 0,
00781 0, 0,
00782 0, 0, 0, NULL, ni5010_probe };
00783
00784 int io = 0;
00785 int irq = 0;
00786
00787 MODULE_PARM(io, "i");
00788 MODULE_PARM(irq, "i");
00789
00790 int init_module(void)
00791 {
00792 int result;
00793
00794 PRINTK2((KERN_DEBUG "%s: entering init_module\n", boardname));
00795
00796
00797
00798
00799
00800
00801
00802 if (io <= 0){
00803 printk(KERN_WARNING "%s: Autoprobing for modules is hazardous, trying anyway..\n", boardname);
00804 }
00805
00806 PRINTK2((KERN_DEBUG "%s: init_module irq=%#2x, io=%#3x\n", boardname, irq, io));
00807 dev_ni5010.irq=irq;
00808 dev_ni5010.base_addr=io;
00809 if ((result = register_netdev(&dev_ni5010)) != 0) {
00810 PRINTK((KERN_WARNING "%s: register_netdev returned %d.\n",
00811 boardname, result));
00812 return -EIO;
00813 }
00814 return 0;
00815 }
00816
00817 void
00818 cleanup_module(void)
00819 {
00820 PRINTK2((KERN_DEBUG "%s: entering cleanup_module\n", boardname));
00821
00822 unregister_netdev(&dev_ni5010);
00823
00824 release_region(dev_ni5010.base_addr, NI5010_IO_EXTENT);
00825 if (dev_ni5010.priv != NULL){
00826 kfree(dev_ni5010.priv);
00827 dev_ni5010.priv = NULL;
00828 }
00829 }
00830 #endif
00831
00832
00833
00834
00835
00836
00837
00838
00839