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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57static const char version[] =
58 "smc-ultra.c:v2.02 2/3/98 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
59
60#include <linux/module.h>
61#include <linux/kernel.h>
62#include <linux/errno.h>
63#include <linux/string.h>
64#include <linux/init.h>
65#include <linux/interrupt.h>
66#include <linux/isapnp.h>
67#include <linux/netdevice.h>
68#include <linux/etherdevice.h>
69
70#include <asm/io.h>
71#include <asm/irq.h>
72
73#include "8390.h"
74
75#define DRV_NAME "smc-ultra"
76
77
78static unsigned int ultra_portlist[] __initdata =
79{0x200, 0x220, 0x240, 0x280, 0x300, 0x340, 0x380, 0};
80
81static int ultra_probe1(struct net_device *dev, int ioaddr);
82
83#ifdef __ISAPNP__
84static int ultra_probe_isapnp(struct net_device *dev);
85#endif
86
87static int ultra_open(struct net_device *dev);
88static void ultra_reset_8390(struct net_device *dev);
89static void ultra_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
90 int ring_page);
91static void ultra_block_input(struct net_device *dev, int count,
92 struct sk_buff *skb, int ring_offset);
93static void ultra_block_output(struct net_device *dev, int count,
94 const unsigned char *buf, const int start_page);
95static void ultra_pio_get_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
96 int ring_page);
97static void ultra_pio_input(struct net_device *dev, int count,
98 struct sk_buff *skb, int ring_offset);
99static void ultra_pio_output(struct net_device *dev, int count,
100 const unsigned char *buf, const int start_page);
101static int ultra_close_card(struct net_device *dev);
102
103#ifdef __ISAPNP__
104static struct isapnp_device_id ultra_device_ids[] __initdata = {
105 { ISAPNP_VENDOR('S','M','C'), ISAPNP_FUNCTION(0x8416),
106 ISAPNP_VENDOR('S','M','C'), ISAPNP_FUNCTION(0x8416),
107 (long) "SMC EtherEZ (8416)" },
108 { }
109};
110
111MODULE_DEVICE_TABLE(isapnp, ultra_device_ids);
112#endif
113
114static u32 ultra_msg_enable;
115
116#define START_PG 0x00
117
118#define ULTRA_CMDREG 0
119#define ULTRA_RESET 0x80
120#define ULTRA_MEMENB 0x40
121#define IOPD 0x02
122#define IOPA 0x07
123#define ULTRA_NIC_OFFSET 16
124#define ULTRA_IO_EXTENT 32
125#define EN0_ERWCNT 0x08
126
127#ifdef CONFIG_NET_POLL_CONTROLLER
128static void ultra_poll(struct net_device *dev)
129{
130 disable_irq(dev->irq);
131 ei_interrupt(dev->irq, dev);
132 enable_irq(dev->irq);
133}
134#endif
135
136
137
138
139
140static int __init do_ultra_probe(struct net_device *dev)
141{
142 int i;
143 int base_addr = dev->base_addr;
144 int irq = dev->irq;
145
146 if (base_addr > 0x1ff)
147 return ultra_probe1(dev, base_addr);
148 else if (base_addr != 0)
149 return -ENXIO;
150
151#ifdef __ISAPNP__
152
153 if (isapnp_present() && (ultra_probe_isapnp(dev) == 0))
154 return 0;
155#endif
156
157 for (i = 0; ultra_portlist[i]; i++) {
158 dev->irq = irq;
159 if (ultra_probe1(dev, ultra_portlist[i]) == 0)
160 return 0;
161 }
162
163 return -ENODEV;
164}
165
166#ifndef MODULE
167struct net_device * __init ultra_probe(int unit)
168{
169 struct net_device *dev = alloc_ei_netdev();
170 int err;
171
172 if (!dev)
173 return ERR_PTR(-ENOMEM);
174
175 sprintf(dev->name, "eth%d", unit);
176 netdev_boot_setup_check(dev);
177
178 err = do_ultra_probe(dev);
179 if (err)
180 goto out;
181 return dev;
182out:
183 free_netdev(dev);
184 return ERR_PTR(err);
185}
186#endif
187
188static const struct net_device_ops ultra_netdev_ops = {
189 .ndo_open = ultra_open,
190 .ndo_stop = ultra_close_card,
191
192 .ndo_start_xmit = ei_start_xmit,
193 .ndo_tx_timeout = ei_tx_timeout,
194 .ndo_get_stats = ei_get_stats,
195 .ndo_set_rx_mode = ei_set_multicast_list,
196 .ndo_validate_addr = eth_validate_addr,
197 .ndo_set_mac_address = eth_mac_addr,
198#ifdef CONFIG_NET_POLL_CONTROLLER
199 .ndo_poll_controller = ultra_poll,
200#endif
201};
202
203static int __init ultra_probe1(struct net_device *dev, int ioaddr)
204{
205 int i, retval;
206 int checksum = 0;
207 const char *model_name;
208 unsigned char eeprom_irq = 0;
209 static unsigned version_printed;
210
211 unsigned char num_pages, irqreg, addr, piomode;
212 unsigned char idreg = inb(ioaddr + 7);
213 unsigned char reg4 = inb(ioaddr + 4) & 0x7f;
214 struct ei_device *ei_local = netdev_priv(dev);
215
216 if (!request_region(ioaddr, ULTRA_IO_EXTENT, DRV_NAME))
217 return -EBUSY;
218
219
220 if ((idreg & 0xF0) != 0x20
221 && (idreg & 0xF0) != 0x40) {
222 retval = -ENODEV;
223 goto out;
224 }
225
226
227 outb(reg4, ioaddr + 4);
228
229 for (i = 0; i < 8; i++)
230 checksum += inb(ioaddr + 8 + i);
231 if ((checksum & 0xff) != 0xFF) {
232 retval = -ENODEV;
233 goto out;
234 }
235
236 if ((ultra_msg_enable & NETIF_MSG_DRV) && (version_printed++ == 0))
237 netdev_info(dev, version);
238
239 model_name = (idreg & 0xF0) == 0x20 ? "SMC Ultra" : "SMC EtherEZ";
240
241 for (i = 0; i < 6; i++)
242 dev->dev_addr[i] = inb(ioaddr + 8 + i);
243
244 netdev_info(dev, "%s at %#3x, %pM", model_name,
245 ioaddr, dev->dev_addr);
246
247
248
249 outb(0x80 | reg4, ioaddr + 4);
250
251
252 outb(0x80 | inb(ioaddr + 0x0c), ioaddr + 0x0c);
253 piomode = inb(ioaddr + 0x8);
254 addr = inb(ioaddr + 0xb);
255 irqreg = inb(ioaddr + 0xd);
256
257
258
259 outb(reg4, ioaddr + 4);
260
261 if (dev->irq < 2) {
262 unsigned char irqmap[] = {0, 9, 3, 5, 7, 10, 11, 15};
263 int irq;
264
265
266 irq = irqmap[((irqreg & 0x40) >> 4) + ((irqreg & 0x0c) >> 2)];
267
268 if (irq == 0) {
269 pr_cont(", failed to detect IRQ line.\n");
270 retval = -EAGAIN;
271 goto out;
272 }
273 dev->irq = irq;
274 eeprom_irq = 1;
275 }
276
277
278 dev->base_addr = ioaddr+ULTRA_NIC_OFFSET;
279
280 {
281 static const int addr_tbl[4] = {
282 0x0C0000, 0x0E0000, 0xFC0000, 0xFE0000
283 };
284 static const short num_pages_tbl[4] = {
285 0x20, 0x40, 0x80, 0xff
286 };
287
288 dev->mem_start = ((addr & 0x0f) << 13) + addr_tbl[(addr >> 6) & 3] ;
289 num_pages = num_pages_tbl[(addr >> 4) & 3];
290 }
291
292 ei_status.name = model_name;
293 ei_status.word16 = 1;
294 ei_status.tx_start_page = START_PG;
295 ei_status.rx_start_page = START_PG + TX_PAGES;
296 ei_status.stop_page = num_pages;
297
298 ei_status.mem = ioremap(dev->mem_start, (ei_status.stop_page - START_PG)*256);
299 if (!ei_status.mem) {
300 pr_cont(", failed to ioremap.\n");
301 retval = -ENOMEM;
302 goto out;
303 }
304
305 dev->mem_end = dev->mem_start + (ei_status.stop_page - START_PG)*256;
306
307 if (piomode) {
308 pr_cont(", %s IRQ %d programmed-I/O mode.\n",
309 eeprom_irq ? "EEPROM" : "assigned ", dev->irq);
310 ei_status.block_input = &ultra_pio_input;
311 ei_status.block_output = &ultra_pio_output;
312 ei_status.get_8390_hdr = &ultra_pio_get_hdr;
313 } else {
314 pr_cont(", %s IRQ %d memory %#lx-%#lx.\n",
315 eeprom_irq ? "" : "assigned ", dev->irq, dev->mem_start,
316 dev->mem_end-1);
317 ei_status.block_input = &ultra_block_input;
318 ei_status.block_output = &ultra_block_output;
319 ei_status.get_8390_hdr = &ultra_get_8390_hdr;
320 }
321 ei_status.reset_8390 = &ultra_reset_8390;
322
323 dev->netdev_ops = &ultra_netdev_ops;
324 NS8390_init(dev, 0);
325 ei_local->msg_enable = ultra_msg_enable;
326
327 retval = register_netdev(dev);
328 if (retval)
329 goto out;
330 return 0;
331out:
332 release_region(ioaddr, ULTRA_IO_EXTENT);
333 return retval;
334}
335
336#ifdef __ISAPNP__
337static int __init ultra_probe_isapnp(struct net_device *dev)
338{
339 int i;
340
341 for (i = 0; ultra_device_ids[i].vendor != 0; i++) {
342 struct pnp_dev *idev = NULL;
343
344 while ((idev = pnp_find_dev(NULL,
345 ultra_device_ids[i].vendor,
346 ultra_device_ids[i].function,
347 idev))) {
348
349 if (pnp_device_attach(idev) < 0)
350 continue;
351 if (pnp_activate_dev(idev) < 0) {
352 __again:
353 pnp_device_detach(idev);
354 continue;
355 }
356
357 if (!pnp_port_valid(idev, 0) || !pnp_irq_valid(idev, 0))
358 goto __again;
359
360 dev->base_addr = pnp_port_start(idev, 0);
361 dev->irq = pnp_irq(idev, 0);
362 netdev_info(dev,
363 "smc-ultra.c: ISAPnP reports %s at i/o %#lx, irq %d.\n",
364 (char *) ultra_device_ids[i].driver_data,
365 dev->base_addr, dev->irq);
366 if (ultra_probe1(dev, dev->base_addr) != 0) {
367 netdev_err(dev,
368 "smc-ultra.c: Probe of ISAPnP card at %#lx failed.\n",
369 dev->base_addr);
370 pnp_device_detach(idev);
371 return -ENXIO;
372 }
373 ei_status.priv = (unsigned long)idev;
374 break;
375 }
376 if (!idev)
377 continue;
378 return 0;
379 }
380
381 return -ENODEV;
382}
383#endif
384
385static int
386ultra_open(struct net_device *dev)
387{
388 int retval;
389 int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET;
390 unsigned char irq2reg[] = {0, 0, 0x04, 0x08, 0, 0x0C, 0, 0x40,
391 0, 0x04, 0x44, 0x48, 0, 0, 0, 0x4C, };
392
393 retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev);
394 if (retval)
395 return retval;
396
397 outb(0x00, ioaddr);
398 outb(0x80, ioaddr + 5);
399
400 outb(inb(ioaddr + 4) | 0x80, ioaddr + 4);
401 outb((inb(ioaddr + 13) & ~0x4C) | irq2reg[dev->irq], ioaddr + 13);
402 outb(inb(ioaddr + 4) & 0x7f, ioaddr + 4);
403
404 if (ei_status.block_input == &ultra_pio_input) {
405 outb(0x11, ioaddr + 6);
406 outb(0x01, ioaddr + 0x19);
407 } else
408 outb(0x01, ioaddr + 6);
409
410
411 outb_p(E8390_NODMA+E8390_PAGE0, dev->base_addr);
412 outb(0xff, dev->base_addr + EN0_ERWCNT);
413 ei_open(dev);
414 return 0;
415}
416
417static void
418ultra_reset_8390(struct net_device *dev)
419{
420 int cmd_port = dev->base_addr - ULTRA_NIC_OFFSET;
421 struct ei_device *ei_local = netdev_priv(dev);
422
423 outb(ULTRA_RESET, cmd_port);
424 netif_dbg(ei_local, hw, dev, "resetting Ultra, t=%ld...\n", jiffies);
425 ei_status.txing = 0;
426
427 outb(0x00, cmd_port);
428 outb(0x80, cmd_port + 5);
429 if (ei_status.block_input == &ultra_pio_input)
430 outb(0x11, cmd_port + 6);
431 else
432 outb(0x01, cmd_port + 6);
433
434 netif_dbg(ei_local, hw, dev, "reset done\n");
435}
436
437
438
439
440
441static void
442ultra_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
443{
444 void __iomem *hdr_start = ei_status.mem + ((ring_page - START_PG)<<8);
445
446 outb(ULTRA_MEMENB, dev->base_addr - ULTRA_NIC_OFFSET);
447#ifdef __BIG_ENDIAN
448
449
450 memcpy_fromio(hdr, hdr_start, sizeof(struct e8390_pkt_hdr));
451 hdr->count = le16_to_cpu(hdr->count);
452#else
453 ((unsigned int*)hdr)[0] = readl(hdr_start);
454#endif
455 outb(0x00, dev->base_addr - ULTRA_NIC_OFFSET);
456}
457
458
459
460
461static void
462ultra_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)
463{
464 void __iomem *xfer_start = ei_status.mem + ring_offset - (START_PG<<8);
465
466
467 outb(ULTRA_MEMENB, dev->base_addr - ULTRA_NIC_OFFSET);
468
469 if (ring_offset + count > ei_status.stop_page*256) {
470
471 int semi_count = ei_status.stop_page*256 - ring_offset;
472 memcpy_fromio(skb->data, xfer_start, semi_count);
473 count -= semi_count;
474 memcpy_fromio(skb->data + semi_count, ei_status.mem + TX_PAGES * 256, count);
475 } else {
476 memcpy_fromio(skb->data, xfer_start, count);
477 }
478
479 outb(0x00, dev->base_addr - ULTRA_NIC_OFFSET);
480}
481
482static void
483ultra_block_output(struct net_device *dev, int count, const unsigned char *buf,
484 int start_page)
485{
486 void __iomem *shmem = ei_status.mem + ((start_page - START_PG)<<8);
487
488
489 outb(ULTRA_MEMENB, dev->base_addr - ULTRA_NIC_OFFSET);
490
491 memcpy_toio(shmem, buf, count);
492
493 outb(0x00, dev->base_addr - ULTRA_NIC_OFFSET);
494}
495
496
497
498
499
500
501
502
503
504static void ultra_pio_get_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
505 int ring_page)
506{
507 int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET;
508 outb(0x00, ioaddr + IOPA);
509 outb(ring_page, ioaddr + IOPA);
510 insw(ioaddr + IOPD, hdr, sizeof(struct e8390_pkt_hdr)>>1);
511}
512
513static void ultra_pio_input(struct net_device *dev, int count,
514 struct sk_buff *skb, int ring_offset)
515{
516 int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET;
517 char *buf = skb->data;
518
519
520 outb(ring_offset, ioaddr + IOPA);
521 outb(ring_offset >> 8, ioaddr + IOPA);
522
523 insw(ioaddr + IOPD, buf, (count+1)>>1);
524}
525
526static void ultra_pio_output(struct net_device *dev, int count,
527 const unsigned char *buf, const int start_page)
528{
529 int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET;
530 outb(0x00, ioaddr + IOPA);
531 outb(start_page, ioaddr + IOPA);
532
533 outsw(ioaddr + IOPD, buf, (count+1)>>1);
534}
535
536static int
537ultra_close_card(struct net_device *dev)
538{
539 int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET;
540 struct ei_device *ei_local = netdev_priv(dev);
541
542 netif_stop_queue(dev);
543
544 netif_dbg(ei_local, ifdown, dev, "Shutting down ethercard.\n");
545
546 outb(0x00, ioaddr + 6);
547 free_irq(dev->irq, dev);
548
549 NS8390_init(dev, 0);
550
551
552
553
554 return 0;
555}
556
557
558#ifdef MODULE
559#define MAX_ULTRA_CARDS 4
560static struct net_device *dev_ultra[MAX_ULTRA_CARDS];
561static int io[MAX_ULTRA_CARDS];
562static int irq[MAX_ULTRA_CARDS];
563
564module_param_hw_array(io, int, ioport, NULL, 0);
565module_param_hw_array(irq, int, irq, NULL, 0);
566module_param_named(msg_enable, ultra_msg_enable, uint, 0444);
567MODULE_PARM_DESC(io, "I/O base address(es)");
568MODULE_PARM_DESC(irq, "IRQ number(s) (assigned)");
569MODULE_PARM_DESC(msg_enable, "Debug message level (see linux/netdevice.h for bitmap)");
570MODULE_DESCRIPTION("SMC Ultra/EtherEZ ISA/PnP Ethernet driver");
571MODULE_LICENSE("GPL");
572
573
574
575int __init
576init_module(void)
577{
578 struct net_device *dev;
579 int this_dev, found = 0;
580
581 for (this_dev = 0; this_dev < MAX_ULTRA_CARDS; this_dev++) {
582 if (io[this_dev] == 0) {
583 if (this_dev != 0) break;
584 printk(KERN_NOTICE "smc-ultra.c: Presently autoprobing (not recommended) for a single card.\n");
585 }
586 dev = alloc_ei_netdev();
587 if (!dev)
588 break;
589 dev->irq = irq[this_dev];
590 dev->base_addr = io[this_dev];
591 if (do_ultra_probe(dev) == 0) {
592 dev_ultra[found++] = dev;
593 continue;
594 }
595 free_netdev(dev);
596 printk(KERN_WARNING "smc-ultra.c: No SMC Ultra card found (i/o = 0x%x).\n", io[this_dev]);
597 break;
598 }
599 if (found)
600 return 0;
601 return -ENXIO;
602}
603
604static void cleanup_card(struct net_device *dev)
605{
606
607#ifdef __ISAPNP__
608 struct pnp_dev *idev = (struct pnp_dev *)ei_status.priv;
609 if (idev)
610 pnp_device_detach(idev);
611#endif
612 release_region(dev->base_addr - ULTRA_NIC_OFFSET, ULTRA_IO_EXTENT);
613 iounmap(ei_status.mem);
614}
615
616void __exit
617cleanup_module(void)
618{
619 int this_dev;
620
621 for (this_dev = 0; this_dev < MAX_ULTRA_CARDS; this_dev++) {
622 struct net_device *dev = dev_ultra[this_dev];
623 if (dev) {
624 unregister_netdev(dev);
625 cleanup_card(dev);
626 free_netdev(dev);
627 }
628 }
629}
630#endif
631