Lines Matching +full:smc +full:- +full:reboot
1 // SPDX-License-Identifier: GPL-1.0+
2 /* smc-ultra.c: A SMC Ultra ethernet driver for linux. */
4 This is a driver for the SMC Ultra and SMC EtherEZ ISA ethercards.
6 Written 1993-1998 by Donald Becker.
16 This driver uses the cards in the 8390-compatible mode.
17 Most of the run-time complexity is handled by the generic code in
24 ultra_open() The card-specific details of starting, stopping
37 This driver now supports the programmed-I/O (PIO) data transfer mode of
38 the EtherEZ. It does not use the non-8390-compatible "Altego" mode.
39 That support (if available) is in smc-ez.c.
45 Donald Becker : 6/6/96 correctly set auto-wrap bit.
50 This driver can not autoprobe for more than one SMC EtherEZ PnP card.
56 "smc-ultra.c:v2.02 2/3/98 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n";
74 #define DRV_NAME "smc-ultra"
76 /* A zero-terminated list of I/O addresses to be probed. */
106 (long) "SMC EtherEZ (8416)" },
129 disable_irq(dev->irq); in ultra_poll()
130 ei_interrupt(dev->irq, dev); in ultra_poll()
131 enable_irq(dev->irq); in ultra_poll()
142 int base_addr = dev->base_addr; in do_ultra_probe()
143 int irq = dev->irq; in do_ultra_probe()
148 return -ENXIO; in do_ultra_probe()
157 dev->irq = irq; in do_ultra_probe()
162 return -ENODEV; in do_ultra_probe()
172 return ERR_PTR(-ENOMEM); in ultra_probe()
174 sprintf(dev->name, "eth%d", unit); in ultra_probe()
217 return -EBUSY; in ultra_probe1()
220 if ((idreg & 0xF0) != 0x20 /* SMC Ultra */ in ultra_probe1()
221 && (idreg & 0xF0) != 0x40) { /* SMC EtherEZ */ in ultra_probe1()
222 retval = -ENODEV; in ultra_probe1()
232 retval = -ENODEV; in ultra_probe1()
239 model_name = (idreg & 0xF0) == 0x20 ? "SMC Ultra" : "SMC EtherEZ"; in ultra_probe1()
246 ioaddr, dev->dev_addr); in ultra_probe1()
252 /* Enabled FINE16 mode to avoid BIOS ROM width mismatches @ reboot. */ in ultra_probe1()
258 /* Switch back to the station address register set so that the MS-DOS driver in ultra_probe1()
262 if (dev->irq < 2) { in ultra_probe1()
271 retval = -EAGAIN; in ultra_probe1()
274 dev->irq = irq; in ultra_probe1()
279 dev->base_addr = ioaddr+ULTRA_NIC_OFFSET; in ultra_probe1()
289 dev->mem_start = ((addr & 0x0f) << 13) + addr_tbl[(addr >> 6) & 3] ; in ultra_probe1()
299 ei_status.mem = ioremap(dev->mem_start, (ei_status.stop_page - START_PG)*256); in ultra_probe1()
302 retval = -ENOMEM; in ultra_probe1()
306 dev->mem_end = dev->mem_start + (ei_status.stop_page - START_PG)*256; in ultra_probe1()
309 pr_cont(", %s IRQ %d programmed-I/O mode.\n", in ultra_probe1()
310 eeprom_irq ? "EEPROM" : "assigned ", dev->irq); in ultra_probe1()
315 pr_cont(", %s IRQ %d memory %#lx-%#lx.\n", in ultra_probe1()
316 eeprom_irq ? "" : "assigned ", dev->irq, dev->mem_start, in ultra_probe1()
317 dev->mem_end-1); in ultra_probe1()
324 dev->netdev_ops = &ultra_netdev_ops; in ultra_probe1()
326 ei_local->msg_enable = ultra_msg_enable; in ultra_probe1()
361 dev->base_addr = pnp_port_start(idev, 0); in ultra_probe_isapnp()
362 dev->irq = pnp_irq(idev, 0); in ultra_probe_isapnp()
364 "smc-ultra.c: ISAPnP reports %s at i/o %#lx, irq %d.\n", in ultra_probe_isapnp()
366 dev->base_addr, dev->irq); in ultra_probe_isapnp()
367 if (ultra_probe1(dev, dev->base_addr) != 0) { /* Shouldn't happen. */ in ultra_probe_isapnp()
369 "smc-ultra.c: Probe of ISAPnP card at %#lx failed.\n", in ultra_probe_isapnp()
370 dev->base_addr); in ultra_probe_isapnp()
372 return -ENXIO; in ultra_probe_isapnp()
382 return -ENODEV; in ultra_probe_isapnp()
390 int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET; /* ASIC addr */ in ultra_open()
394 retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev); in ultra_open()
402 outb((inb(ioaddr + 13) & ~0x4C) | irq2reg[dev->irq], ioaddr + 13); in ultra_open()
407 outb(0x01, ioaddr + 0x19); /* Enable ring read auto-wrap. */ in ultra_open()
412 outb_p(E8390_NODMA+E8390_PAGE0, dev->base_addr); in ultra_open()
413 outb(0xff, dev->base_addr + EN0_ERWCNT); in ultra_open()
421 int cmd_port = dev->base_addr - ULTRA_NIC_OFFSET; /* ASIC base addr */ in ultra_reset_8390()
445 void __iomem *hdr_start = ei_status.mem + ((ring_page - START_PG)<<8); in ultra_get_8390_hdr()
447 outb(ULTRA_MEMENB, dev->base_addr - ULTRA_NIC_OFFSET); /* shmem on */ in ultra_get_8390_hdr()
452 hdr->count = le16_to_cpu(hdr->count); in ultra_get_8390_hdr()
456 outb(0x00, dev->base_addr - ULTRA_NIC_OFFSET); /* shmem off */ in ultra_get_8390_hdr()
465 void __iomem *xfer_start = ei_status.mem + ring_offset - (START_PG<<8); in ultra_block_input()
468 outb(ULTRA_MEMENB, dev->base_addr - ULTRA_NIC_OFFSET); in ultra_block_input()
472 int semi_count = ei_status.stop_page*256 - ring_offset; in ultra_block_input()
473 memcpy_fromio(skb->data, xfer_start, semi_count); in ultra_block_input()
474 count -= semi_count; in ultra_block_input()
475 memcpy_fromio(skb->data + semi_count, ei_status.mem + TX_PAGES * 256, count); in ultra_block_input()
477 memcpy_fromio(skb->data, xfer_start, count); in ultra_block_input()
480 outb(0x00, dev->base_addr - ULTRA_NIC_OFFSET); /* Disable memory. */ in ultra_block_input()
487 void __iomem *shmem = ei_status.mem + ((start_page - START_PG)<<8); in ultra_block_output()
490 outb(ULTRA_MEMENB, dev->base_addr - ULTRA_NIC_OFFSET); in ultra_block_output()
494 outb(0x00, dev->base_addr - ULTRA_NIC_OFFSET); /* Disable memory. */ in ultra_block_output()
499 byte-sequentially to IOPA, with no intervening I/O operations, and the
508 int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET; /* ASIC addr */ in ultra_pio_get_hdr()
517 int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET; /* ASIC addr */ in ultra_pio_input()
518 char *buf = skb->data; in ultra_pio_input()
529 int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET; /* ASIC addr */ in ultra_pio_output()
539 int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET; /* CMDREG */ in ultra_close_card()
547 free_irq(dev->irq, dev); in ultra_close_card()
551 /* We should someday disable shared memory and change to 8-bit mode in ultra_close_card()
570 MODULE_DESCRIPTION("SMC Ultra/EtherEZ ISA/PnP Ethernet driver");
583 printk(KERN_NOTICE "smc-ultra.c: Presently autoprobing (not recommended) for a single card.\n"); in ultra_init_module()
588 dev->irq = irq[this_dev]; in ultra_init_module()
589 dev->base_addr = io[this_dev]; in ultra_init_module()
595 printk(KERN_WARNING "smc-ultra.c: No SMC Ultra card found (i/o = 0x%x).\n", io[this_dev]); in ultra_init_module()
600 return -ENXIO; in ultra_init_module()
612 release_region(dev->base_addr - ULTRA_NIC_OFFSET, ULTRA_IO_EXTENT); in cleanup_card()