1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#include <linux/kernel.h>
28#include <linux/module.h>
29#include <linux/init.h>
30#include <linux/ptrace.h>
31#include <linux/slab.h>
32#include <linux/string.h>
33#include <linux/timer.h>
34#include <linux/delay.h>
35#include <linux/spinlock.h>
36#include <linux/ethtool.h>
37#include <linux/netdevice.h>
38#include <linux/crc32.h>
39#include "../8390.h"
40
41#include <pcmcia/cs_types.h>
42#include <pcmcia/cs.h>
43#include <pcmcia/cistpl.h>
44#include <pcmcia/ciscode.h>
45#include <pcmcia/ds.h>
46#include <pcmcia/cisreg.h>
47
48#include <asm/io.h>
49#include <asm/system.h>
50#include <asm/byteorder.h>
51#include <asm/uaccess.h>
52
53#define AXNET_CMD 0x00
54#define AXNET_DATAPORT 0x10
55#define AXNET_RESET 0x1f
56#define AXNET_MII_EEP 0x14
57#define AXNET_TEST 0x15
58#define AXNET_GPIO 0x17
59
60#define AXNET_START_PG 0x40
61#define AXNET_STOP_PG 0x80
62
63#define AXNET_RDC_TIMEOUT 0x02
64
65#define IS_AX88190 0x0001
66#define IS_AX88790 0x0002
67
68
69
70
71
72MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
73MODULE_DESCRIPTION("Asix AX88190 PCMCIA ethernet driver");
74MODULE_LICENSE("GPL");
75
76#ifdef PCMCIA_DEBUG
77#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
78
79INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
80#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
81static char *version =
82"axnet_cs.c 1.28 2002/06/29 06:27:37 (David Hinds)";
83#else
84#define DEBUG(n, args...)
85#endif
86
87
88
89static int axnet_config(struct pcmcia_device *link);
90static void axnet_release(struct pcmcia_device *link);
91static int axnet_open(struct net_device *dev);
92static int axnet_close(struct net_device *dev);
93static int axnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
94static const struct ethtool_ops netdev_ethtool_ops;
95static irqreturn_t ei_irq_wrapper(int irq, void *dev_id);
96static void ei_watchdog(u_long arg);
97static void axnet_reset_8390(struct net_device *dev);
98
99static int mdio_read(kio_addr_t addr, int phy_id, int loc);
100static void mdio_write(kio_addr_t addr, int phy_id, int loc, int value);
101
102static void get_8390_hdr(struct net_device *,
103 struct e8390_pkt_hdr *, int);
104static void block_input(struct net_device *dev, int count,
105 struct sk_buff *skb, int ring_offset);
106static void block_output(struct net_device *dev, int count,
107 const u_char *buf, const int start_page);
108
109static void axnet_detach(struct pcmcia_device *p_dev);
110
111static void axdev_setup(struct net_device *dev);
112static void AX88190_init(struct net_device *dev, int startp);
113static int ax_open(struct net_device *dev);
114static int ax_close(struct net_device *dev);
115static irqreturn_t ax_interrupt(int irq, void *dev_id);
116
117
118
119typedef struct axnet_dev_t {
120 struct pcmcia_device *p_dev;
121 dev_node_t node;
122 caddr_t base;
123 struct timer_list watchdog;
124 int stale, fast_poll;
125 u_short link_status;
126 u_char duplex_flag;
127 int phy_id;
128 int flags;
129} axnet_dev_t;
130
131static inline axnet_dev_t *PRIV(struct net_device *dev)
132{
133 void *p = (char *)netdev_priv(dev) + sizeof(struct ei_device);
134 return p;
135}
136
137
138
139
140
141
142
143
144
145static int axnet_probe(struct pcmcia_device *link)
146{
147 axnet_dev_t *info;
148 struct net_device *dev;
149
150 DEBUG(0, "axnet_attach()\n");
151
152 dev = alloc_netdev(sizeof(struct ei_device) + sizeof(axnet_dev_t),
153 "eth%d", axdev_setup);
154
155 if (!dev)
156 return -ENOMEM;
157
158 info = PRIV(dev);
159 info->p_dev = link;
160 link->priv = dev;
161 link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
162 link->irq.IRQInfo1 = IRQ_LEVEL_ID;
163 link->conf.Attributes = CONF_ENABLE_IRQ;
164 link->conf.IntType = INT_MEMORY_AND_IO;
165
166 dev->open = &axnet_open;
167 dev->stop = &axnet_close;
168 dev->do_ioctl = &axnet_ioctl;
169 SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
170
171 return axnet_config(link);
172}
173
174
175
176
177
178
179
180
181
182
183static void axnet_detach(struct pcmcia_device *link)
184{
185 struct net_device *dev = link->priv;
186
187 DEBUG(0, "axnet_detach(0x%p)\n", link);
188
189 if (link->dev_node)
190 unregister_netdev(dev);
191
192 axnet_release(link);
193
194 free_netdev(dev);
195}
196
197
198
199
200
201
202
203static int get_prom(struct pcmcia_device *link)
204{
205 struct net_device *dev = link->priv;
206 kio_addr_t ioaddr = dev->base_addr;
207 int i, j;
208
209
210 struct {
211 u_char value, offset;
212 } program_seq[] = {
213 {E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD},
214 {0x01, EN0_DCFG},
215 {0x00, EN0_RCNTLO},
216 {0x00, EN0_RCNTHI},
217 {0x00, EN0_IMR},
218 {0xFF, EN0_ISR},
219 {E8390_RXOFF|0x40, EN0_RXCR},
220 {E8390_TXOFF, EN0_TXCR},
221 {0x10, EN0_RCNTLO},
222 {0x00, EN0_RCNTHI},
223 {0x00, EN0_RSARLO},
224 {0x04, EN0_RSARHI},
225 {E8390_RREAD+E8390_START, E8390_CMD},
226 };
227
228
229 if (link->conf.ConfigBase != 0x03c0)
230 return 0;
231
232 axnet_reset_8390(dev);
233 mdelay(10);
234
235 for (i = 0; i < ARRAY_SIZE(program_seq); i++)
236 outb_p(program_seq[i].value, ioaddr + program_seq[i].offset);
237
238 for (i = 0; i < 6; i += 2) {
239 j = inw(ioaddr + AXNET_DATAPORT);
240 dev->dev_addr[i] = j & 0xff;
241 dev->dev_addr[i+1] = j >> 8;
242 }
243 return 1;
244}
245
246
247
248
249
250
251
252
253
254#define CS_CHECK(fn, ret) \
255do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
256
257static int try_io_port(struct pcmcia_device *link)
258{
259 int j, ret;
260 if (link->io.NumPorts1 == 32) {
261 link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
262 if (link->io.NumPorts2 > 0) {
263
264 link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
265 link->irq.Attributes =
266 IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED;
267 }
268 } else {
269
270 link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
271 link->io.Attributes2 = IO_DATA_PATH_WIDTH_16;
272 }
273 if (link->io.BasePort1 == 0) {
274 link->io.IOAddrLines = 16;
275 for (j = 0; j < 0x400; j += 0x20) {
276 link->io.BasePort1 = j ^ 0x300;
277 link->io.BasePort2 = (j ^ 0x300) + 0x10;
278 ret = pcmcia_request_io(link, &link->io);
279 if (ret == CS_SUCCESS) return ret;
280 }
281 return ret;
282 } else {
283 return pcmcia_request_io(link, &link->io);
284 }
285}
286
287static int axnet_config(struct pcmcia_device *link)
288{
289 struct net_device *dev = link->priv;
290 axnet_dev_t *info = PRIV(dev);
291 tuple_t tuple;
292 cisparse_t parse;
293 int i, j, last_ret, last_fn;
294 u_short buf[64];
295 DECLARE_MAC_BUF(mac);
296
297 DEBUG(0, "axnet_config(0x%p)\n", link);
298
299 tuple.Attributes = 0;
300 tuple.TupleData = (cisdata_t *)buf;
301 tuple.TupleDataMax = sizeof(buf);
302 tuple.TupleOffset = 0;
303
304
305 link->conf.Present = 0x63;
306
307 tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
308 tuple.Attributes = 0;
309 CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
310 while (last_ret == CS_SUCCESS) {
311 cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
312 cistpl_io_t *io = &(parse.cftable_entry.io);
313
314 if (pcmcia_get_tuple_data(link, &tuple) != 0 ||
315 pcmcia_parse_tuple(link, &tuple, &parse) != 0 ||
316 cfg->index == 0 || cfg->io.nwin == 0)
317 goto next_entry;
318
319 link->conf.ConfigIndex = 0x05;
320
321
322 if (io->nwin > 1) {
323 i = (io->win[1].len > io->win[0].len);
324 link->io.BasePort2 = io->win[1-i].base;
325 link->io.NumPorts2 = io->win[1-i].len;
326 } else {
327 i = link->io.NumPorts2 = 0;
328 }
329 link->io.BasePort1 = io->win[i].base;
330 link->io.NumPorts1 = io->win[i].len;
331 link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
332 if (link->io.NumPorts1 + link->io.NumPorts2 >= 32) {
333 last_ret = try_io_port(link);
334 if (last_ret == CS_SUCCESS) break;
335 }
336 next_entry:
337 last_ret = pcmcia_get_next_tuple(link, &tuple);
338 }
339 if (last_ret != CS_SUCCESS) {
340 cs_error(link, RequestIO, last_ret);
341 goto failed;
342 }
343
344 CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
345
346 if (link->io.NumPorts2 == 8) {
347 link->conf.Attributes |= CONF_ENABLE_SPKR;
348 link->conf.Status = CCSR_AUDIO_ENA;
349 }
350
351 CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
352 dev->irq = link->irq.AssignedIRQ;
353 dev->base_addr = link->io.BasePort1;
354
355 if (!get_prom(link)) {
356 printk(KERN_NOTICE "axnet_cs: this is not an AX88190 card!\n");
357 printk(KERN_NOTICE "axnet_cs: use pcnet_cs instead.\n");
358 goto failed;
359 }
360
361 ei_status.name = "AX88190";
362 ei_status.word16 = 1;
363 ei_status.tx_start_page = AXNET_START_PG;
364 ei_status.rx_start_page = AXNET_START_PG + TX_PAGES;
365 ei_status.stop_page = AXNET_STOP_PG;
366 ei_status.reset_8390 = &axnet_reset_8390;
367 ei_status.get_8390_hdr = &get_8390_hdr;
368 ei_status.block_input = &block_input;
369 ei_status.block_output = &block_output;
370
371 if (inb(dev->base_addr + AXNET_TEST) != 0)
372 info->flags |= IS_AX88790;
373 else
374 info->flags |= IS_AX88190;
375
376 if (info->flags & IS_AX88790)
377 outb(0x10, dev->base_addr + AXNET_GPIO);
378
379 for (i = 0; i < 32; i++) {
380 j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1);
381 if ((j != 0) && (j != 0xffff)) break;
382 }
383
384
385
386 if (i == 32) {
387 conf_reg_t reg = { 0, CS_WRITE, CISREG_CCSR, 0x04 };
388 pcmcia_access_configuration_register(link, ®);
389 for (i = 0; i < 32; i++) {
390 j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1);
391 if ((j != 0) && (j != 0xffff)) break;
392 }
393 }
394
395 info->phy_id = (i < 32) ? i : -1;
396 link->dev_node = &info->node;
397 SET_NETDEV_DEV(dev, &handle_to_dev(link));
398
399 if (register_netdev(dev) != 0) {
400 printk(KERN_NOTICE "axnet_cs: register_netdev() failed\n");
401 link->dev_node = NULL;
402 goto failed;
403 }
404
405 strcpy(info->node.dev_name, dev->name);
406
407 printk(KERN_INFO "%s: Asix AX88%d90: io %#3lx, irq %d, "
408 "hw_addr %s\n",
409 dev->name, ((info->flags & IS_AX88790) ? 7 : 1),
410 dev->base_addr, dev->irq,
411 print_mac(mac, dev->dev_addr));
412 if (info->phy_id != -1) {
413 DEBUG(0, " MII transceiver at index %d, status %x.\n", info->phy_id, j);
414 } else {
415 printk(KERN_NOTICE " No MII transceivers found!\n");
416 }
417 return 0;
418
419cs_failed:
420 cs_error(link, last_fn, last_ret);
421failed:
422 axnet_release(link);
423 return -ENODEV;
424}
425
426
427
428
429
430
431
432
433
434static void axnet_release(struct pcmcia_device *link)
435{
436 pcmcia_disable_device(link);
437}
438
439static int axnet_suspend(struct pcmcia_device *link)
440{
441 struct net_device *dev = link->priv;
442
443 if (link->open)
444 netif_device_detach(dev);
445
446 return 0;
447}
448
449static int axnet_resume(struct pcmcia_device *link)
450{
451 struct net_device *dev = link->priv;
452
453 if (link->open) {
454 axnet_reset_8390(dev);
455 AX88190_init(dev, 1);
456 netif_device_attach(dev);
457 }
458
459 return 0;
460}
461
462
463
464
465
466
467
468
469#define MDIO_SHIFT_CLK 0x01
470#define MDIO_DATA_WRITE0 0x00
471#define MDIO_DATA_WRITE1 0x08
472#define MDIO_DATA_READ 0x04
473#define MDIO_MASK 0x0f
474#define MDIO_ENB_IN 0x02
475
476static void mdio_sync(kio_addr_t addr)
477{
478 int bits;
479 for (bits = 0; bits < 32; bits++) {
480 outb_p(MDIO_DATA_WRITE1, addr);
481 outb_p(MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, addr);
482 }
483}
484
485static int mdio_read(kio_addr_t addr, int phy_id, int loc)
486{
487 u_int cmd = (0xf6<<10)|(phy_id<<5)|loc;
488 int i, retval = 0;
489
490 mdio_sync(addr);
491 for (i = 14; i >= 0; i--) {
492 int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
493 outb_p(dat, addr);
494 outb_p(dat | MDIO_SHIFT_CLK, addr);
495 }
496 for (i = 19; i > 0; i--) {
497 outb_p(MDIO_ENB_IN, addr);
498 retval = (retval << 1) | ((inb_p(addr) & MDIO_DATA_READ) != 0);
499 outb_p(MDIO_ENB_IN | MDIO_SHIFT_CLK, addr);
500 }
501 return (retval>>1) & 0xffff;
502}
503
504static void mdio_write(kio_addr_t addr, int phy_id, int loc, int value)
505{
506 u_int cmd = (0x05<<28)|(phy_id<<23)|(loc<<18)|(1<<17)|value;
507 int i;
508
509 mdio_sync(addr);
510 for (i = 31; i >= 0; i--) {
511 int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
512 outb_p(dat, addr);
513 outb_p(dat | MDIO_SHIFT_CLK, addr);
514 }
515 for (i = 1; i >= 0; i--) {
516 outb_p(MDIO_ENB_IN, addr);
517 outb_p(MDIO_ENB_IN | MDIO_SHIFT_CLK, addr);
518 }
519}
520
521
522
523static int axnet_open(struct net_device *dev)
524{
525 int ret;
526 axnet_dev_t *info = PRIV(dev);
527 struct pcmcia_device *link = info->p_dev;
528
529 DEBUG(2, "axnet_open('%s')\n", dev->name);
530
531 if (!pcmcia_dev_present(link))
532 return -ENODEV;
533
534 ret = request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, "axnet_cs", dev);
535 if (ret)
536 return ret;
537
538 link->open++;
539
540 info->link_status = 0x00;
541 init_timer(&info->watchdog);
542 info->watchdog.function = &ei_watchdog;
543 info->watchdog.data = (u_long)dev;
544 info->watchdog.expires = jiffies + HZ;
545 add_timer(&info->watchdog);
546
547 return ax_open(dev);
548}
549
550
551
552static int axnet_close(struct net_device *dev)
553{
554 axnet_dev_t *info = PRIV(dev);
555 struct pcmcia_device *link = info->p_dev;
556
557 DEBUG(2, "axnet_close('%s')\n", dev->name);
558
559 ax_close(dev);
560 free_irq(dev->irq, dev);
561
562 link->open--;
563 netif_stop_queue(dev);
564 del_timer_sync(&info->watchdog);
565
566 return 0;
567}
568
569
570
571
572
573
574
575
576static void axnet_reset_8390(struct net_device *dev)
577{
578 kio_addr_t nic_base = dev->base_addr;
579 int i;
580
581 ei_status.txing = ei_status.dmaing = 0;
582
583 outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, nic_base + E8390_CMD);
584
585 outb(inb(nic_base + AXNET_RESET), nic_base + AXNET_RESET);
586
587 for (i = 0; i < 100; i++) {
588 if ((inb_p(nic_base+EN0_ISR) & ENISR_RESET) != 0)
589 break;
590 udelay(100);
591 }
592 outb_p(ENISR_RESET, nic_base + EN0_ISR);
593
594 if (i == 100)
595 printk(KERN_ERR "%s: axnet_reset_8390() did not complete.\n",
596 dev->name);
597
598}
599
600
601
602static irqreturn_t ei_irq_wrapper(int irq, void *dev_id)
603{
604 struct net_device *dev = dev_id;
605 PRIV(dev)->stale = 0;
606 return ax_interrupt(irq, dev_id);
607}
608
609static void ei_watchdog(u_long arg)
610{
611 struct net_device *dev = (struct net_device *)(arg);
612 axnet_dev_t *info = PRIV(dev);
613 kio_addr_t nic_base = dev->base_addr;
614 kio_addr_t mii_addr = nic_base + AXNET_MII_EEP;
615 u_short link;
616
617 if (!netif_device_present(dev)) goto reschedule;
618
619
620
621 if (info->stale++ && (inb_p(nic_base + EN0_ISR) & ENISR_ALL)) {
622 if (!info->fast_poll)
623 printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name);
624 ei_irq_wrapper(dev->irq, dev);
625 info->fast_poll = HZ;
626 }
627 if (info->fast_poll) {
628 info->fast_poll--;
629 info->watchdog.expires = jiffies + 1;
630 add_timer(&info->watchdog);
631 return;
632 }
633
634 if (info->phy_id < 0)
635 goto reschedule;
636 link = mdio_read(mii_addr, info->phy_id, 1);
637 if (!link || (link == 0xffff)) {
638 printk(KERN_INFO "%s: MII is missing!\n", dev->name);
639 info->phy_id = -1;
640 goto reschedule;
641 }
642
643 link &= 0x0004;
644 if (link != info->link_status) {
645 u_short p = mdio_read(mii_addr, info->phy_id, 5);
646 printk(KERN_INFO "%s: %s link beat\n", dev->name,
647 (link) ? "found" : "lost");
648 if (link) {
649 info->duplex_flag = (p & 0x0140) ? 0x80 : 0x00;
650 if (p)
651 printk(KERN_INFO "%s: autonegotiation complete: "
652 "%sbaseT-%cD selected\n", dev->name,
653 ((p & 0x0180) ? "100" : "10"),
654 ((p & 0x0140) ? 'F' : 'H'));
655 else
656 printk(KERN_INFO "%s: link partner did not autonegotiate\n",
657 dev->name);
658 AX88190_init(dev, 1);
659 }
660 info->link_status = link;
661 }
662
663reschedule:
664 info->watchdog.expires = jiffies + HZ;
665 add_timer(&info->watchdog);
666}
667
668static void netdev_get_drvinfo(struct net_device *dev,
669 struct ethtool_drvinfo *info)
670{
671 strcpy(info->driver, "axnet_cs");
672}
673
674static const struct ethtool_ops netdev_ethtool_ops = {
675 .get_drvinfo = netdev_get_drvinfo,
676};
677
678
679
680static int axnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
681{
682 axnet_dev_t *info = PRIV(dev);
683 u16 *data = (u16 *)&rq->ifr_ifru;
684 kio_addr_t mii_addr = dev->base_addr + AXNET_MII_EEP;
685 switch (cmd) {
686 case SIOCGMIIPHY:
687 data[0] = info->phy_id;
688 case SIOCGMIIREG:
689 data[3] = mdio_read(mii_addr, data[0], data[1] & 0x1f);
690 return 0;
691 case SIOCSMIIREG:
692 if (!capable(CAP_NET_ADMIN))
693 return -EPERM;
694 mdio_write(mii_addr, data[0], data[1] & 0x1f, data[2]);
695 return 0;
696 }
697 return -EOPNOTSUPP;
698}
699
700
701
702static void get_8390_hdr(struct net_device *dev,
703 struct e8390_pkt_hdr *hdr,
704 int ring_page)
705{
706 kio_addr_t nic_base = dev->base_addr;
707
708 outb_p(0, nic_base + EN0_RSARLO);
709 outb_p(ring_page, nic_base + EN0_RSARHI);
710 outb_p(E8390_RREAD+E8390_START, nic_base + AXNET_CMD);
711
712 insw(nic_base + AXNET_DATAPORT, hdr,
713 sizeof(struct e8390_pkt_hdr)>>1);
714
715 hdr->count = le16_to_cpu(hdr->count);
716
717}
718
719
720
721static void block_input(struct net_device *dev, int count,
722 struct sk_buff *skb, int ring_offset)
723{
724 kio_addr_t nic_base = dev->base_addr;
725 int xfer_count = count;
726 char *buf = skb->data;
727
728#ifdef PCMCIA_DEBUG
729 if ((ei_debug > 4) && (count != 4))
730 printk(KERN_DEBUG "%s: [bi=%d]\n", dev->name, count+4);
731#endif
732 outb_p(ring_offset & 0xff, nic_base + EN0_RSARLO);
733 outb_p(ring_offset >> 8, nic_base + EN0_RSARHI);
734 outb_p(E8390_RREAD+E8390_START, nic_base + AXNET_CMD);
735
736 insw(nic_base + AXNET_DATAPORT,buf,count>>1);
737 if (count & 0x01)
738 buf[count-1] = inb(nic_base + AXNET_DATAPORT), xfer_count++;
739
740}
741
742
743
744static void block_output(struct net_device *dev, int count,
745 const u_char *buf, const int start_page)
746{
747 kio_addr_t nic_base = dev->base_addr;
748
749#ifdef PCMCIA_DEBUG
750 if (ei_debug > 4)
751 printk(KERN_DEBUG "%s: [bo=%d]\n", dev->name, count);
752#endif
753
754
755
756
757 if (count & 0x01)
758 count++;
759
760 outb_p(0x00, nic_base + EN0_RSARLO);
761 outb_p(start_page, nic_base + EN0_RSARHI);
762 outb_p(E8390_RWRITE+E8390_START, nic_base + AXNET_CMD);
763 outsw(nic_base + AXNET_DATAPORT, buf, count>>1);
764}
765
766static struct pcmcia_device_id axnet_ids[] = {
767 PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x016c, 0x0081),
768 PCMCIA_DEVICE_MANF_CARD(0x018a, 0x0301),
769 PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0301),
770 PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0303),
771 PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0309),
772 PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1106),
773 PCMCIA_DEVICE_MANF_CARD(0x8a01, 0xc1ab),
774 PCMCIA_DEVICE_MANF_CARD(0x021b, 0x0202),
775 PCMCIA_DEVICE_MANF_CARD(0xffff, 0x1090),
776 PCMCIA_DEVICE_PROD_ID12("AmbiCom,Inc.", "Fast Ethernet PC Card(AMB8110)", 0x49b020a7, 0x119cc9fc),
777 PCMCIA_DEVICE_PROD_ID124("Fast Ethernet", "16-bit PC Card", "AX88190", 0xb4be14e3, 0x9a12eb6a, 0xab9be5ef),
778 PCMCIA_DEVICE_PROD_ID12("ASIX", "AX88190", 0x0959823b, 0xab9be5ef),
779 PCMCIA_DEVICE_PROD_ID12("Billionton", "LNA-100B", 0x552ab682, 0xbc3b87e1),
780 PCMCIA_DEVICE_PROD_ID12("CHEETAH ETHERCARD", "EN2228", 0x00fa7bc8, 0x00e990cc),
781 PCMCIA_DEVICE_PROD_ID12("CNet", "CNF301", 0xbc477dde, 0x78c5f40b),
782 PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega FEther PCC-TXD", 0x5261440f, 0x436768c5),
783 PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega FEtherII PCC-TXD", 0x5261440f, 0x730df72e),
784 PCMCIA_DEVICE_PROD_ID12("Dynalink", "L100C16", 0x55632fd5, 0x66bc2a90),
785 PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 PC Card (PCMPC100 V3)", 0x0733cc81, 0x232019a8),
786 PCMCIA_DEVICE_PROD_ID12("MELCO", "LPC3-TX", 0x481e0094, 0xf91af609),
787 PCMCIA_DEVICE_PROD_ID12("PCMCIA", "100BASE", 0x281f1c5d, 0x7c2add04),
788 PCMCIA_DEVICE_PROD_ID12("PCMCIA", "FastEtherCard", 0x281f1c5d, 0x7ef26116),
789 PCMCIA_DEVICE_PROD_ID12("PCMCIA", "FEP501", 0x281f1c5d, 0x2e272058),
790 PCMCIA_DEVICE_PROD_ID14("Network Everywhere", "AX88190", 0x820a67b6, 0xab9be5ef),
791 PCMCIA_DEVICE_NULL,
792};
793MODULE_DEVICE_TABLE(pcmcia, axnet_ids);
794
795static struct pcmcia_driver axnet_cs_driver = {
796 .owner = THIS_MODULE,
797 .drv = {
798 .name = "axnet_cs",
799 },
800 .probe = axnet_probe,
801 .remove = axnet_detach,
802 .id_table = axnet_ids,
803 .suspend = axnet_suspend,
804 .resume = axnet_resume,
805};
806
807static int __init init_axnet_cs(void)
808{
809 return pcmcia_register_driver(&axnet_cs_driver);
810}
811
812static void __exit exit_axnet_cs(void)
813{
814 pcmcia_unregister_driver(&axnet_cs_driver);
815}
816
817module_init(init_axnet_cs);
818module_exit(exit_axnet_cs);
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869static const char *version_8390 =
870 "8390.c:v1.10cvs 9/23/94 Donald Becker (becker@scyld.com)\n";
871
872#include <linux/bitops.h>
873#include <asm/irq.h>
874#include <linux/fcntl.h>
875#include <linux/in.h>
876#include <linux/interrupt.h>
877
878#include <linux/etherdevice.h>
879
880#define BUG_83C690
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900#define ei_reset_8390 (ei_local->reset_8390)
901#define ei_block_output (ei_local->block_output)
902#define ei_block_input (ei_local->block_input)
903#define ei_get_8390_hdr (ei_local->get_8390_hdr)
904
905
906#ifndef ei_debug
907int ei_debug = 1;
908#endif
909
910
911static void ei_tx_intr(struct net_device *dev);
912static void ei_tx_err(struct net_device *dev);
913static void ei_tx_timeout(struct net_device *dev);
914static void ei_receive(struct net_device *dev);
915static void ei_rx_overrun(struct net_device *dev);
916
917
918static void NS8390_trigger_send(struct net_device *dev, unsigned int length,
919 int start_page);
920static void set_multicast_list(struct net_device *dev);
921static void do_set_multicast_list(struct net_device *dev);
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957static int ax_open(struct net_device *dev)
958{
959 unsigned long flags;
960 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
961
962#ifdef HAVE_TX_TIMEOUT
963
964
965 if (dev->tx_timeout == NULL)
966 dev->tx_timeout = ei_tx_timeout;
967 if (dev->watchdog_timeo <= 0)
968 dev->watchdog_timeo = TX_TIMEOUT;
969#endif
970
971
972
973
974
975
976 spin_lock_irqsave(&ei_local->page_lock, flags);
977 AX88190_init(dev, 1);
978
979
980 netif_start_queue(dev);
981 spin_unlock_irqrestore(&ei_local->page_lock, flags);
982 ei_local->irqlock = 0;
983 return 0;
984}
985
986#define dev_lock(dev) (((struct ei_device *)netdev_priv(dev))->page_lock)
987
988
989
990
991
992
993
994int ax_close(struct net_device *dev)
995{
996 unsigned long flags;
997
998
999
1000
1001
1002 spin_lock_irqsave(&dev_lock(dev), flags);
1003 AX88190_init(dev, 0);
1004 spin_unlock_irqrestore(&dev_lock(dev), flags);
1005 netif_stop_queue(dev);
1006 return 0;
1007}
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017void ei_tx_timeout(struct net_device *dev)
1018{
1019 long e8390_base = dev->base_addr;
1020 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1021 int txsr, isr, tickssofar = jiffies - dev->trans_start;
1022 unsigned long flags;
1023
1024 ei_local->stat.tx_errors++;
1025
1026 spin_lock_irqsave(&ei_local->page_lock, flags);
1027 txsr = inb(e8390_base+EN0_TSR);
1028 isr = inb(e8390_base+EN0_ISR);
1029 spin_unlock_irqrestore(&ei_local->page_lock, flags);
1030
1031 printk(KERN_DEBUG "%s: Tx timed out, %s TSR=%#2x, ISR=%#2x, t=%d.\n",
1032 dev->name, (txsr & ENTSR_ABT) ? "excess collisions." :
1033 (isr) ? "lost interrupt?" : "cable problem?", txsr, isr, tickssofar);
1034
1035 if (!isr && !ei_local->stat.tx_packets)
1036 {
1037
1038 ei_local->interface_num ^= 1;
1039 }
1040
1041
1042
1043 disable_irq_nosync(dev->irq);
1044 spin_lock(&ei_local->page_lock);
1045
1046
1047 ei_reset_8390(dev);
1048 AX88190_init(dev, 1);
1049
1050 spin_unlock(&ei_local->page_lock);
1051 enable_irq(dev->irq);
1052 netif_wake_queue(dev);
1053}
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063static int ei_start_xmit(struct sk_buff *skb, struct net_device *dev)
1064{
1065 long e8390_base = dev->base_addr;
1066 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1067 int length, send_length, output_page;
1068 unsigned long flags;
1069 u8 packet[ETH_ZLEN];
1070
1071 netif_stop_queue(dev);
1072
1073 length = skb->len;
1074
1075
1076
1077
1078
1079
1080 spin_lock_irqsave(&ei_local->page_lock, flags);
1081 outb_p(0x00, e8390_base + EN0_IMR);
1082 spin_unlock_irqrestore(&ei_local->page_lock, flags);
1083
1084
1085
1086
1087
1088 disable_irq_nosync(dev->irq);
1089
1090 spin_lock(&ei_local->page_lock);
1091
1092 ei_local->irqlock = 1;
1093
1094 send_length = ETH_ZLEN < length ? length : ETH_ZLEN;
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104 if (ei_local->tx1 == 0)
1105 {
1106 output_page = ei_local->tx_start_page;
1107 ei_local->tx1 = send_length;
1108 if (ei_debug && ei_local->tx2 > 0)
1109 printk(KERN_DEBUG "%s: idle transmitter tx2=%d, lasttx=%d, txing=%d.\n",
1110 dev->name, ei_local->tx2, ei_local->lasttx, ei_local->txing);
1111 }
1112 else if (ei_local->tx2 == 0)
1113 {
1114 output_page = ei_local->tx_start_page + TX_PAGES/2;
1115 ei_local->tx2 = send_length;
1116 if (ei_debug && ei_local->tx1 > 0)
1117 printk(KERN_DEBUG "%s: idle transmitter, tx1=%d, lasttx=%d, txing=%d.\n",
1118 dev->name, ei_local->tx1, ei_local->lasttx, ei_local->txing);
1119 }
1120 else
1121 {
1122 if (ei_debug)
1123 printk(KERN_DEBUG "%s: No Tx buffers free! tx1=%d tx2=%d last=%d\n",
1124 dev->name, ei_local->tx1, ei_local->tx2, ei_local->lasttx);
1125 ei_local->irqlock = 0;
1126 netif_stop_queue(dev);
1127 outb_p(ENISR_ALL, e8390_base + EN0_IMR);
1128 spin_unlock(&ei_local->page_lock);
1129 enable_irq(dev->irq);
1130 ei_local->stat.tx_errors++;
1131 return 1;
1132 }
1133
1134
1135
1136
1137
1138
1139
1140 if (length == skb->len)
1141 ei_block_output(dev, length, skb->data, output_page);
1142 else {
1143 memset(packet, 0, ETH_ZLEN);
1144 skb_copy_from_linear_data(skb, packet, skb->len);
1145 ei_block_output(dev, length, packet, output_page);
1146 }
1147
1148 if (! ei_local->txing)
1149 {
1150 ei_local->txing = 1;
1151 NS8390_trigger_send(dev, send_length, output_page);
1152 dev->trans_start = jiffies;
1153 if (output_page == ei_local->tx_start_page)
1154 {
1155 ei_local->tx1 = -1;
1156 ei_local->lasttx = -1;
1157 }
1158 else
1159 {
1160 ei_local->tx2 = -1;
1161 ei_local->lasttx = -2;
1162 }
1163 }
1164 else ei_local->txqueue++;
1165
1166 if (ei_local->tx1 && ei_local->tx2)
1167 netif_stop_queue(dev);
1168 else
1169 netif_start_queue(dev);
1170
1171
1172 ei_local->irqlock = 0;
1173 outb_p(ENISR_ALL, e8390_base + EN0_IMR);
1174
1175 spin_unlock(&ei_local->page_lock);
1176 enable_irq(dev->irq);
1177
1178 dev_kfree_skb (skb);
1179 ei_local->stat.tx_bytes += send_length;
1180
1181 return 0;
1182}
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197static irqreturn_t ax_interrupt(int irq, void *dev_id)
1198{
1199 struct net_device *dev = dev_id;
1200 long e8390_base;
1201 int interrupts, nr_serviced = 0, i;
1202 struct ei_device *ei_local;
1203 int handled = 0;
1204
1205 e8390_base = dev->base_addr;
1206 ei_local = netdev_priv(dev);
1207
1208
1209
1210
1211
1212 spin_lock(&ei_local->page_lock);
1213
1214 if (ei_local->irqlock)
1215 {
1216#if 1
1217
1218 printk(ei_local->irqlock
1219 ? "%s: Interrupted while interrupts are masked! isr=%#2x imr=%#2x.\n"
1220 : "%s: Reentering the interrupt handler! isr=%#2x imr=%#2x.\n",
1221 dev->name, inb_p(e8390_base + EN0_ISR),
1222 inb_p(e8390_base + EN0_IMR));
1223#endif
1224 spin_unlock(&ei_local->page_lock);
1225 return IRQ_NONE;
1226 }
1227
1228 if (ei_debug > 3)
1229 printk(KERN_DEBUG "%s: interrupt(isr=%#2.2x).\n", dev->name,
1230 inb_p(e8390_base + EN0_ISR));
1231
1232 outb_p(0x00, e8390_base + EN0_ISR);
1233 ei_local->irqlock = 1;
1234
1235
1236 while ((interrupts = inb_p(e8390_base + EN0_ISR)) != 0
1237 && ++nr_serviced < MAX_SERVICE)
1238 {
1239 if (!netif_running(dev) || (interrupts == 0xff)) {
1240 if (ei_debug > 1)
1241 printk(KERN_WARNING "%s: interrupt from stopped card\n", dev->name);
1242 outb_p(interrupts, e8390_base + EN0_ISR);
1243 interrupts = 0;
1244 break;
1245 }
1246 handled = 1;
1247
1248
1249 outb_p(interrupts, e8390_base + EN0_ISR);
1250 for (i = 0; i < 10; i++) {
1251 if (!(inb(e8390_base + EN0_ISR) & interrupts))
1252 break;
1253 outb_p(0, e8390_base + EN0_ISR);
1254 outb_p(interrupts, e8390_base + EN0_ISR);
1255 }
1256 if (interrupts & ENISR_OVER)
1257 ei_rx_overrun(dev);
1258 else if (interrupts & (ENISR_RX+ENISR_RX_ERR))
1259 {
1260
1261 ei_receive(dev);
1262 }
1263
1264 if (interrupts & ENISR_TX)
1265 ei_tx_intr(dev);
1266 else if (interrupts & ENISR_TX_ERR)
1267 ei_tx_err(dev);
1268
1269 if (interrupts & ENISR_COUNTERS)
1270 {
1271 ei_local->stat.rx_frame_errors += inb_p(e8390_base + EN0_COUNTER0);
1272 ei_local->stat.rx_crc_errors += inb_p(e8390_base + EN0_COUNTER1);
1273 ei_local->stat.rx_missed_errors+= inb_p(e8390_base + EN0_COUNTER2);
1274 }
1275 }
1276
1277 if (interrupts && ei_debug)
1278 {
1279 handled = 1;
1280 if (nr_serviced >= MAX_SERVICE)
1281 {
1282
1283 if(interrupts!=0xFF)
1284 printk(KERN_WARNING "%s: Too much work at interrupt, status %#2.2x\n",
1285 dev->name, interrupts);
1286 outb_p(ENISR_ALL, e8390_base + EN0_ISR);
1287 } else {
1288 printk(KERN_WARNING "%s: unknown interrupt %#2x\n", dev->name, interrupts);
1289 outb_p(0xff, e8390_base + EN0_ISR);
1290 }
1291 }
1292
1293
1294 ei_local->irqlock = 0;
1295 outb_p(ENISR_ALL, e8390_base + EN0_IMR);
1296
1297 spin_unlock(&ei_local->page_lock);
1298 return IRQ_RETVAL(handled);
1299}
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315static void ei_tx_err(struct net_device *dev)
1316{
1317 long e8390_base = dev->base_addr;
1318 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1319 unsigned char txsr = inb_p(e8390_base+EN0_TSR);
1320 unsigned char tx_was_aborted = txsr & (ENTSR_ABT+ENTSR_FU);
1321
1322#ifdef VERBOSE_ERROR_DUMP
1323 printk(KERN_DEBUG "%s: transmitter error (%#2x): ", dev->name, txsr);
1324 if (txsr & ENTSR_ABT)
1325 printk("excess-collisions ");
1326 if (txsr & ENTSR_ND)
1327 printk("non-deferral ");
1328 if (txsr & ENTSR_CRS)
1329 printk("lost-carrier ");
1330 if (txsr & ENTSR_FU)
1331 printk("FIFO-underrun ");
1332 if (txsr & ENTSR_CDH)
1333 printk("lost-heartbeat ");
1334 printk("\n");
1335#endif
1336
1337 if (tx_was_aborted)
1338 ei_tx_intr(dev);
1339 else
1340 {
1341 ei_local->stat.tx_errors++;
1342 if (txsr & ENTSR_CRS) ei_local->stat.tx_carrier_errors++;
1343 if (txsr & ENTSR_CDH) ei_local->stat.tx_heartbeat_errors++;
1344 if (txsr & ENTSR_OWC) ei_local->stat.tx_window_errors++;
1345 }
1346}
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356static void ei_tx_intr(struct net_device *dev)
1357{
1358 long e8390_base = dev->base_addr;
1359 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1360 int status = inb(e8390_base + EN0_TSR);
1361
1362
1363
1364
1365
1366 ei_local->txqueue--;
1367
1368 if (ei_local->tx1 < 0)
1369 {
1370 if (ei_local->lasttx != 1 && ei_local->lasttx != -1)
1371 printk(KERN_ERR "%s: bogus last_tx_buffer %d, tx1=%d.\n",
1372 ei_local->name, ei_local->lasttx, ei_local->tx1);
1373 ei_local->tx1 = 0;
1374 if (ei_local->tx2 > 0)
1375 {
1376 ei_local->txing = 1;
1377 NS8390_trigger_send(dev, ei_local->tx2, ei_local->tx_start_page + 6);
1378 dev->trans_start = jiffies;
1379 ei_local->tx2 = -1,
1380 ei_local->lasttx = 2;
1381 }
1382 else ei_local->lasttx = 20, ei_local->txing = 0;
1383 }
1384 else if (ei_local->tx2 < 0)
1385 {
1386 if (ei_local->lasttx != 2 && ei_local->lasttx != -2)
1387 printk("%s: bogus last_tx_buffer %d, tx2=%d.\n",
1388 ei_local->name, ei_local->lasttx, ei_local->tx2);
1389 ei_local->tx2 = 0;
1390 if (ei_local->tx1 > 0)
1391 {
1392 ei_local->txing = 1;
1393 NS8390_trigger_send(dev, ei_local->tx1, ei_local->tx_start_page);
1394 dev->trans_start = jiffies;
1395 ei_local->tx1 = -1;
1396 ei_local->lasttx = 1;
1397 }
1398 else
1399 ei_local->lasttx = 10, ei_local->txing = 0;
1400 }
1401
1402
1403
1404
1405 if (status & ENTSR_COL)
1406 ei_local->stat.collisions++;
1407 if (status & ENTSR_PTX)
1408 ei_local->stat.tx_packets++;
1409 else
1410 {
1411 ei_local->stat.tx_errors++;
1412 if (status & ENTSR_ABT)
1413 {
1414 ei_local->stat.tx_aborted_errors++;
1415 ei_local->stat.collisions += 16;
1416 }
1417 if (status & ENTSR_CRS)
1418 ei_local->stat.tx_carrier_errors++;
1419 if (status & ENTSR_FU)
1420 ei_local->stat.tx_fifo_errors++;
1421 if (status & ENTSR_CDH)
1422 ei_local->stat.tx_heartbeat_errors++;
1423 if (status & ENTSR_OWC)
1424 ei_local->stat.tx_window_errors++;
1425 }
1426 netif_wake_queue(dev);
1427}
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437static void ei_receive(struct net_device *dev)
1438{
1439 long e8390_base = dev->base_addr;
1440 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1441 unsigned char rxing_page, this_frame, next_frame;
1442 unsigned short current_offset;
1443 int rx_pkt_count = 0;
1444 struct e8390_pkt_hdr rx_frame;
1445
1446 while (++rx_pkt_count < 10)
1447 {
1448 int pkt_len, pkt_stat;
1449
1450
1451 rxing_page = inb_p(e8390_base + EN1_CURPAG -1);
1452
1453
1454 this_frame = inb_p(e8390_base + EN0_BOUNDARY) + 1;
1455 if (this_frame >= ei_local->stop_page)
1456 this_frame = ei_local->rx_start_page;
1457
1458
1459
1460
1461
1462
1463
1464 if (ei_debug > 0 && this_frame != ei_local->current_page && (this_frame!=0x0 || rxing_page!=0xFF))
1465 printk(KERN_ERR "%s: mismatched read page pointers %2x vs %2x.\n",
1466 dev->name, this_frame, ei_local->current_page);
1467
1468 if (this_frame == rxing_page)
1469 break;
1470
1471 current_offset = this_frame << 8;
1472 ei_get_8390_hdr(dev, &rx_frame, this_frame);
1473
1474 pkt_len = rx_frame.count - sizeof(struct e8390_pkt_hdr);
1475 pkt_stat = rx_frame.status;
1476
1477 next_frame = this_frame + 1 + ((pkt_len+4)>>8);
1478
1479 if (pkt_len < 60 || pkt_len > 1518)
1480 {
1481 if (ei_debug)
1482 printk(KERN_DEBUG "%s: bogus packet size: %d, status=%#2x nxpg=%#2x.\n",
1483 dev->name, rx_frame.count, rx_frame.status,
1484 rx_frame.next);
1485 ei_local->stat.rx_errors++;
1486 ei_local->stat.rx_length_errors++;
1487 }
1488 else if ((pkt_stat & 0x0F) == ENRSR_RXOK)
1489 {
1490 struct sk_buff *skb;
1491
1492 skb = dev_alloc_skb(pkt_len+2);
1493 if (skb == NULL)
1494 {
1495 if (ei_debug > 1)
1496 printk(KERN_DEBUG "%s: Couldn't allocate a sk_buff of size %d.\n",
1497 dev->name, pkt_len);
1498 ei_local->stat.rx_dropped++;
1499 break;
1500 }
1501 else
1502 {
1503 skb_reserve(skb,2);
1504 skb_put(skb, pkt_len);
1505 ei_block_input(dev, pkt_len, skb, current_offset + sizeof(rx_frame));
1506 skb->protocol=eth_type_trans(skb,dev);
1507 netif_rx(skb);
1508 dev->last_rx = jiffies;
1509 ei_local->stat.rx_packets++;
1510 ei_local->stat.rx_bytes += pkt_len;
1511 if (pkt_stat & ENRSR_PHY)
1512 ei_local->stat.multicast++;
1513 }
1514 }
1515 else
1516 {
1517 if (ei_debug)
1518 printk(KERN_DEBUG "%s: bogus packet: status=%#2x nxpg=%#2x size=%d\n",
1519 dev->name, rx_frame.status, rx_frame.next,
1520 rx_frame.count);
1521 ei_local->stat.rx_errors++;
1522
1523 if (pkt_stat & ENRSR_FO)
1524 ei_local->stat.rx_fifo_errors++;
1525 }
1526 next_frame = rx_frame.next;
1527
1528
1529 if (next_frame >= ei_local->stop_page) {
1530 printk("%s: next frame inconsistency, %#2x\n", dev->name,
1531 next_frame);
1532 next_frame = ei_local->rx_start_page;
1533 }
1534 ei_local->current_page = next_frame;
1535 outb_p(next_frame-1, e8390_base+EN0_BOUNDARY);
1536 }
1537
1538 return;
1539}
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554static void ei_rx_overrun(struct net_device *dev)
1555{
1556 axnet_dev_t *info = PRIV(dev);
1557 long e8390_base = dev->base_addr;
1558 unsigned char was_txing, must_resend = 0;
1559 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1560
1561
1562
1563
1564
1565 was_txing = inb_p(e8390_base+E8390_CMD) & E8390_TRANS;
1566 outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base+E8390_CMD);
1567
1568 if (ei_debug > 1)
1569 printk(KERN_DEBUG "%s: Receiver overrun.\n", dev->name);
1570 ei_local->stat.rx_over_errors++;
1571
1572
1573
1574
1575
1576
1577
1578
1579 mdelay(10);
1580
1581
1582
1583
1584 outb_p(0x00, e8390_base+EN0_RCNTLO);
1585 outb_p(0x00, e8390_base+EN0_RCNTHI);
1586
1587
1588
1589
1590
1591
1592 if (was_txing)
1593 {
1594 unsigned char tx_completed = inb_p(e8390_base+EN0_ISR) & (ENISR_TX+ENISR_TX_ERR);
1595 if (!tx_completed)
1596 must_resend = 1;
1597 }
1598
1599
1600
1601
1602
1603 outb_p(E8390_TXOFF, e8390_base + EN0_TXCR);
1604 outb_p(E8390_NODMA + E8390_PAGE0 + E8390_START, e8390_base + E8390_CMD);
1605
1606
1607
1608
1609 ei_receive(dev);
1610
1611
1612
1613
1614 outb_p(E8390_TXCONFIG | info->duplex_flag, e8390_base + EN0_TXCR);
1615 if (must_resend)
1616 outb_p(E8390_NODMA + E8390_PAGE0 + E8390_START + E8390_TRANS, e8390_base + E8390_CMD);
1617}
1618
1619
1620
1621
1622
1623static struct net_device_stats *get_stats(struct net_device *dev)
1624{
1625 long ioaddr = dev->base_addr;
1626 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1627 unsigned long flags;
1628
1629
1630 if (!netif_running(dev))
1631 return &ei_local->stat;
1632
1633 spin_lock_irqsave(&ei_local->page_lock,flags);
1634
1635 ei_local->stat.rx_frame_errors += inb_p(ioaddr + EN0_COUNTER0);
1636 ei_local->stat.rx_crc_errors += inb_p(ioaddr + EN0_COUNTER1);
1637 ei_local->stat.rx_missed_errors+= inb_p(ioaddr + EN0_COUNTER2);
1638 spin_unlock_irqrestore(&ei_local->page_lock, flags);
1639
1640 return &ei_local->stat;
1641}
1642
1643
1644
1645
1646
1647
1648static inline void make_mc_bits(u8 *bits, struct net_device *dev)
1649{
1650 struct dev_mc_list *dmi;
1651 u32 crc;
1652
1653 for (dmi=dev->mc_list; dmi; dmi=dmi->next) {
1654
1655 crc = ether_crc(ETH_ALEN, dmi->dmi_addr);
1656
1657
1658
1659
1660 bits[crc>>29] |= (1<<((crc>>26)&7));
1661 }
1662}
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672static void do_set_multicast_list(struct net_device *dev)
1673{
1674 long e8390_base = dev->base_addr;
1675 int i;
1676 struct ei_device *ei_local = (struct ei_device*)netdev_priv(dev);
1677
1678 if (!(dev->flags&(IFF_PROMISC|IFF_ALLMULTI))) {
1679 memset(ei_local->mcfilter, 0, 8);
1680 if (dev->mc_list)
1681 make_mc_bits(ei_local->mcfilter, dev);
1682 } else {
1683
1684 memset(ei_local->mcfilter, 0xFF, 8);
1685 }
1686
1687 outb_p(E8390_NODMA + E8390_PAGE1, e8390_base + E8390_CMD);
1688 for(i = 0; i < 8; i++)
1689 {
1690 outb_p(ei_local->mcfilter[i], e8390_base + EN1_MULT_SHIFT(i));
1691 }
1692 outb_p(E8390_NODMA + E8390_PAGE0, e8390_base + E8390_CMD);
1693
1694 if(dev->flags&IFF_PROMISC)
1695 outb_p(E8390_RXCONFIG | 0x58, e8390_base + EN0_RXCR);
1696 else if(dev->flags&IFF_ALLMULTI || dev->mc_list)
1697 outb_p(E8390_RXCONFIG | 0x48, e8390_base + EN0_RXCR);
1698 else
1699 outb_p(E8390_RXCONFIG | 0x40, e8390_base + EN0_RXCR);
1700
1701 outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base+E8390_CMD);
1702}
1703
1704
1705
1706
1707
1708
1709
1710static void set_multicast_list(struct net_device *dev)
1711{
1712 unsigned long flags;
1713
1714 spin_lock_irqsave(&dev_lock(dev), flags);
1715 do_set_multicast_list(dev);
1716 spin_unlock_irqrestore(&dev_lock(dev), flags);
1717}
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727static void axdev_setup(struct net_device *dev)
1728{
1729 struct ei_device *ei_local;
1730 if (ei_debug > 1)
1731 printk(version_8390);
1732
1733 ei_local = (struct ei_device *)netdev_priv(dev);
1734 spin_lock_init(&ei_local->page_lock);
1735
1736 dev->hard_start_xmit = &ei_start_xmit;
1737 dev->get_stats = get_stats;
1738 dev->set_multicast_list = &set_multicast_list;
1739
1740 ether_setup(dev);
1741}
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754static void AX88190_init(struct net_device *dev, int startp)
1755{
1756 axnet_dev_t *info = PRIV(dev);
1757 long e8390_base = dev->base_addr;
1758 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
1759 int i;
1760 int endcfg = ei_local->word16 ? (0x48 | ENDCFG_WTS) : 0x48;
1761
1762 if(sizeof(struct e8390_pkt_hdr)!=4)
1763 panic("8390.c: header struct mispacked\n");
1764
1765 outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base+E8390_CMD);
1766 outb_p(endcfg, e8390_base + EN0_DCFG);
1767
1768 outb_p(0x00, e8390_base + EN0_RCNTLO);
1769 outb_p(0x00, e8390_base + EN0_RCNTHI);
1770
1771 outb_p(E8390_RXOFF|0x40, e8390_base + EN0_RXCR);
1772 outb_p(E8390_TXOFF, e8390_base + EN0_TXCR);
1773
1774 outb_p(ei_local->tx_start_page, e8390_base + EN0_TPSR);
1775 ei_local->tx1 = ei_local->tx2 = 0;
1776 outb_p(ei_local->rx_start_page, e8390_base + EN0_STARTPG);
1777 outb_p(ei_local->stop_page-1, e8390_base + EN0_BOUNDARY);
1778 ei_local->current_page = ei_local->rx_start_page;
1779 outb_p(ei_local->stop_page, e8390_base + EN0_STOPPG);
1780
1781 outb_p(0xFF, e8390_base + EN0_ISR);
1782 outb_p(0x00, e8390_base + EN0_IMR);
1783
1784
1785
1786 outb_p(E8390_NODMA + E8390_PAGE1 + E8390_STOP, e8390_base+E8390_CMD);
1787 for(i = 0; i < 6; i++)
1788 {
1789 outb_p(dev->dev_addr[i], e8390_base + EN1_PHYS_SHIFT(i));
1790 if(inb_p(e8390_base + EN1_PHYS_SHIFT(i))!=dev->dev_addr[i])
1791 printk(KERN_ERR "Hw. address read/write mismap %d\n",i);
1792 }
1793
1794 outb_p(ei_local->rx_start_page, e8390_base + EN1_CURPAG);
1795 outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base+E8390_CMD);
1796
1797 netif_start_queue(dev);
1798 ei_local->tx1 = ei_local->tx2 = 0;
1799 ei_local->txing = 0;
1800
1801 if (startp)
1802 {
1803 outb_p(0xff, e8390_base + EN0_ISR);
1804 outb_p(ENISR_ALL, e8390_base + EN0_IMR);
1805 outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base+E8390_CMD);
1806 outb_p(E8390_TXCONFIG | info->duplex_flag,
1807 e8390_base + EN0_TXCR);
1808
1809 outb_p(E8390_RXCONFIG | 0x40, e8390_base + EN0_RXCR);
1810 do_set_multicast_list(dev);
1811 }
1812}
1813
1814
1815
1816
1817static void NS8390_trigger_send(struct net_device *dev, unsigned int length,
1818 int start_page)
1819{
1820 long e8390_base = dev->base_addr;
1821 struct ei_device *ei_local __attribute((unused)) = (struct ei_device *) netdev_priv(dev);
1822
1823 if (inb_p(e8390_base) & E8390_TRANS)
1824 {
1825 printk(KERN_WARNING "%s: trigger_send() called with the transmitter busy.\n",
1826 dev->name);
1827 return;
1828 }
1829 outb_p(length & 0xff, e8390_base + EN0_TCNTLO);
1830 outb_p(length >> 8, e8390_base + EN0_TCNTHI);
1831 outb_p(start_page, e8390_base + EN0_TPSR);
1832 outb_p(E8390_NODMA+E8390_TRANS+E8390_START, e8390_base+E8390_CMD);
1833}
1834