Lines Matching +full:el3 +full:-
3 Written 1993-2000 by Donald Becker.
5 Copyright 1994-2000 by Donald Becker.
20 a priori which of several ISA-mode cards will be detected first.
36 other cleanups. -djb
39 v1.13 9/8/97 Made 'max_interrupt_work' an insmod-settable variable -djb
40 v1.14 10/15/97 Avoided waiting..discard message for fast machines -djb
41 v1.15 1/31/98 Faster recovery for Tx errors. -djb
42 v1.16 2/3/98 Different ID port handling to avoid sound cards. -djb
44 - Avoid bogus detect of 3c590's (Andrzej Krzysztofowicz)
45 - Reviewed against 1.18 from scyld.com
47 - ethtool support
49 - Power Management support
51 - Full duplex support
53 - Additional ethtool features
55 - Increase *read_eeprom udelay to workaround oops with 2 cards.
56 v1.19b 08Nov2002 Marc Zyngier <maz@wild-wind.fr.eu.org>
57 - Introduce driver model for EISA cards.
58 v1.20 04Feb2008 Ondrej Zary <linux@rainbow-software.org>
59 - convert to isa_driver and pnp_driver and some cleanups
149 #define WN0_IRQ 0x08 /* Window 0: Set IRQ line in bits 12-15. */
153 #define FD_ENABLE 0x8000 /* Enable full-duplex ("external loopback") */
165 /* skb send-queue */
175 static int debug = -1;
176 static int irq[] = {-1, -1, -1, -1, -1, -1, -1, -1};
235 else /* Otherwise kill off already-found boards. */ in el3_isa_id_sequence()
239 /* Read in EEPROM data, which does contention-select. in el3_isa_id_sequence()
240 Only the lowest address board will stay "on-line". in el3_isa_id_sequence()
250 if (lp->type == EL3_PNP && in el3_isa_id_sequence()
251 ether_addr_equal((u8 *)phys_addr, el3_devs[i]->dev_addr)) { in el3_isa_id_sequence()
274 dev->base_addr = ioaddr; in el3_dev_fill()
275 dev->irq = irq; in el3_dev_fill()
276 dev->if_port = if_port; in el3_dev_fill()
277 lp->type = type; in el3_dev_fill()
302 return -ENOMEM; in el3_isa_match()
306 if (!request_region(ioaddr, EL3_IO_EXTENT, "3c509-isa")) { in el3_isa_match()
355 int ioaddr = ndev->base_addr, err; in el3_isa_resume()
410 if (!request_region(ioaddr, EL3_IO_EXTENT, "3c509-pnp")) in el3_pnp_probe()
411 return -EBUSY; in el3_pnp_probe()
420 return -ENOMEM; in el3_pnp_probe()
422 SET_NETDEV_DEV(dev, &pdev->dev); in el3_pnp_probe()
447 return el3_suspend(&pdev->dev, state); in el3_pnp_suspend()
452 return el3_resume(&pdev->dev); in el3_pnp_resume()
519 spin_lock_init(&lp->lock); in el3_common_init()
521 if (dev->mem_start & 0x05) { /* xcvr codes 1/3/4/12 */ in el3_common_init()
522 dev->if_port = (dev->mem_start & 0x0f); in el3_common_init()
524 /* use eeprom value, but save user's full-duplex selection */ in el3_common_init()
525 dev->if_port |= (dev->mem_start & 0x08); in el3_common_init()
528 /* The EL3-specific entries in the device structure. */ in el3_common_init()
529 dev->netdev_ops = &netdev_ops; in el3_common_init()
530 dev->watchdog_timeo = TX_TIMEOUT; in el3_common_init()
531 dev->ethtool_ops = ðtool_ops; in el3_common_init()
536 dev->base_addr, dev->irq); in el3_common_init()
537 release_region(dev->base_addr, EL3_IO_EXTENT); in el3_common_init()
542 dev->name, dev->base_addr, if_names[(dev->if_port & 0x03)], in el3_common_init()
543 dev->dev_addr, dev->irq); in el3_common_init()
552 release_region(dev->base_addr, EL3_IO_EXTENT); in el3_common_remove()
568 ioaddr = edev->base_addr; in el3_eisa_probe()
570 if (!request_region(ioaddr, EL3_IO_EXTENT, "3c579-eisa")) in el3_eisa_probe()
571 return -EBUSY; in el3_eisa_probe()
587 return -ENOMEM; in el3_eisa_probe()
638 Assume extra-fast 16Mhz bus. */ in id_read_eeprom()
645 for (bit = 15; bit >= 0; bit--) in id_read_eeprom()
658 int ioaddr = dev->base_addr; in el3_open()
665 i = request_irq(dev->irq, el3_interrupt, 0, dev->name, dev); in el3_open()
671 pr_debug("%s: Opening, IRQ %d status@%x %4.4x.\n", dev->name, in el3_open()
672 dev->irq, ioaddr + EL3_STATUS, inw(ioaddr + EL3_STATUS)); in el3_open()
678 dev->name, dev->irq, inw(ioaddr + EL3_STATUS)); in el3_open()
686 int ioaddr = dev->base_addr; in el3_tx_timeout()
690 dev->name, inb(ioaddr + TX_STATUS), inw(ioaddr + EL3_STATUS), in el3_tx_timeout()
692 dev->stats.tx_errors++; in el3_tx_timeout()
705 int ioaddr = dev->base_addr; in el3_start_xmit()
710 dev->stats.tx_bytes += skb->len; in el3_start_xmit()
714 dev->name, skb->len, inw(ioaddr + EL3_STATUS)); in el3_start_xmit()
727 spin_lock_irqsave(&lp->lock, flags); in el3_start_xmit()
730 outw(skb->len, ioaddr + TX_FIFO); in el3_start_xmit()
733 outsl(ioaddr + TX_FIFO, skb->data, (skb->len + 3) >> 2); in el3_start_xmit()
738 /* Interrupt us when the FIFO has room for max-sized packet. */ in el3_start_xmit()
741 spin_unlock_irqrestore(&lp->lock, flags); in el3_start_xmit()
750 while (--i > 0 && (tx_status = inb(ioaddr + TX_STATUS)) > 0) { in el3_start_xmit()
751 if (tx_status & 0x38) dev->stats.tx_aborted_errors++; in el3_start_xmit()
760 /* The EL3 interrupt handler. */
770 spin_lock(&lp->lock); in el3_interrupt()
772 ioaddr = dev->base_addr; in el3_interrupt()
776 pr_debug("%s: interrupt, status %4.4x.\n", dev->name, status); in el3_interrupt()
788 /* There's room in the FIFO for a full-sized packet. */ in el3_interrupt()
804 while (--i>0 && (tx_status = inb(ioaddr + TX_STATUS)) > 0) { in el3_interrupt()
805 if (tx_status & 0x38) dev->stats.tx_aborted_errors++; in el3_interrupt()
816 | (dev->flags & IFF_ALLMULTI ? RxMulticast : 0) in el3_interrupt()
817 | (dev->flags & IFF_PROMISC ? RxProm : 0), in el3_interrupt()
819 outw(RxEnable, ioaddr + EL3_CMD); /* Re-enable the receiver. */ in el3_interrupt()
824 if (--i < 0) { in el3_interrupt()
826 dev->name, status); in el3_interrupt()
836 pr_debug("%s: exiting interrupt, status %4.4x.\n", dev->name, in el3_interrupt()
839 spin_unlock(&lp->lock); in el3_interrupt()
846 * Polling receive - used by netconsole and other diagnostic tools
851 disable_irq(dev->irq); in el3_poll_controller()
852 el3_interrupt(dev->irq, dev); in el3_poll_controller()
853 enable_irq(dev->irq); in el3_poll_controller()
868 spin_lock_irqsave(&lp->lock, flags); in el3_get_stats()
870 spin_unlock_irqrestore(&lp->lock, flags); in el3_get_stats()
871 return &dev->stats; in el3_get_stats()
875 single-threaded if the device is active. This is expected to be a rare
877 window 1 is always valid rather than use a special window-state variable.
881 int ioaddr = dev->base_addr; in update_stats()
889 dev->stats.tx_carrier_errors += inb(ioaddr + 0); in update_stats()
890 dev->stats.tx_heartbeat_errors += inb(ioaddr + 1); in update_stats()
892 dev->stats.collisions += inb(ioaddr + 3); in update_stats()
893 dev->stats.tx_window_errors += inb(ioaddr + 4); in update_stats()
894 dev->stats.rx_fifo_errors += inb(ioaddr + 5); in update_stats()
895 dev->stats.tx_packets += inb(ioaddr + 6); in update_stats()
909 int ioaddr = dev->base_addr; in el3_rx()
920 dev->stats.rx_errors++; in el3_rx()
922 case 0x0000: dev->stats.rx_over_errors++; break; in el3_rx()
923 case 0x0800: dev->stats.rx_length_errors++; break; in el3_rx()
924 case 0x1000: dev->stats.rx_frame_errors++; break; in el3_rx()
925 case 0x1800: dev->stats.rx_length_errors++; break; in el3_rx()
926 case 0x2000: dev->stats.rx_frame_errors++; break; in el3_rx()
927 case 0x2800: dev->stats.rx_crc_errors++; break; in el3_rx()
940 /* 'skb->data' points to the start of sk_buff data area. */ in el3_rx()
945 skb->protocol = eth_type_trans(skb,dev); in el3_rx()
947 dev->stats.rx_bytes += pkt_len; in el3_rx()
948 dev->stats.rx_packets++; in el3_rx()
952 dev->stats.rx_dropped++; in el3_rx()
955 dev->name, pkt_len); in el3_rx()
974 int ioaddr = dev->base_addr; in set_multicast_list()
982 dev->name, mc_count); in set_multicast_list()
985 spin_lock_irqsave(&lp->lock, flags); in set_multicast_list()
986 if (dev->flags&IFF_PROMISC) { in set_multicast_list()
990 else if (mc_count || (dev->flags&IFF_ALLMULTI)) { in set_multicast_list()
995 spin_unlock_irqrestore(&lp->lock, flags); in set_multicast_list()
1001 int ioaddr = dev->base_addr; in el3_close()
1005 pr_debug("%s: Shutting down ethercard.\n", dev->name); in el3_close()
1009 free_irq(dev->irq, dev); in el3_close()
1012 if (lp->type != EL3_EISA) { in el3_close()
1025 int ioaddr = dev->base_addr; in el3_link_ok()
1038 int ioaddr = dev->base_addr; in el3_netdev_get_ecmd()
1046 cmd->base.port = PORT_TP; in el3_netdev_get_ecmd()
1049 cmd->base.port = PORT_AUI; in el3_netdev_get_ecmd()
1052 cmd->base.port = PORT_BNC; in el3_netdev_get_ecmd()
1058 cmd->base.duplex = DUPLEX_HALF; in el3_netdev_get_ecmd()
1071 cmd->base.duplex = DUPLEX_FULL; in el3_netdev_get_ecmd()
1074 ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported, in el3_netdev_get_ecmd()
1076 cmd->base.speed = SPEED_10; in el3_netdev_get_ecmd()
1085 int ioaddr = dev->base_addr; in el3_netdev_set_ecmd()
1087 if (cmd->base.speed != SPEED_10) in el3_netdev_set_ecmd()
1088 return -EINVAL; in el3_netdev_set_ecmd()
1089 if ((cmd->base.duplex != DUPLEX_HALF) && in el3_netdev_set_ecmd()
1090 (cmd->base.duplex != DUPLEX_FULL)) in el3_netdev_set_ecmd()
1091 return -EINVAL; in el3_netdev_set_ecmd()
1096 switch (cmd->base.port) { in el3_netdev_set_ecmd()
1099 dev->if_port = 0; in el3_netdev_set_ecmd()
1103 dev->if_port = 1; in el3_netdev_set_ecmd()
1107 dev->if_port = 3; in el3_netdev_set_ecmd()
1110 return -EINVAL; in el3_netdev_set_ecmd()
1114 if (dev->if_port == 3) { in el3_netdev_set_ecmd()
1115 /* fire up the DC-DC convertor if BNC gets enabled */ in el3_netdev_set_ecmd()
1121 return -EIO; in el3_netdev_set_ecmd()
1126 if (cmd->base.duplex == DUPLEX_FULL) in el3_netdev_set_ecmd()
1138 strscpy(info->driver, DRV_NAME, sizeof(info->driver)); in el3_get_drvinfo()
1146 spin_lock_irq(&lp->lock); in el3_get_link_ksettings()
1148 spin_unlock_irq(&lp->lock); in el3_get_link_ksettings()
1158 spin_lock_irq(&lp->lock); in el3_set_link_ksettings()
1160 spin_unlock_irq(&lp->lock); in el3_set_link_ksettings()
1169 spin_lock_irq(&lp->lock); in el3_get_link()
1171 spin_unlock_irq(&lp->lock); in el3_get_link()
1197 int ioaddr = dev->base_addr; in el3_down()
1201 /* Turn off statistics ASAP. We update lp->stats below. */ in el3_down()
1208 if (dev->if_port == 3) in el3_down()
1211 else if (dev->if_port == 0) { in el3_down()
1226 int ioaddr = dev->base_addr; in el3_up()
1232 outw((dev->irq << 12) | 0x0f00, ioaddr + WN0_IRQ); in el3_up()
1238 outb(dev->dev_addr[i], ioaddr + i); in el3_up()
1240 if ((dev->if_port & 0x03) == 3) /* BNC interface */ in el3_up()
1243 else if ((dev->if_port & 0x03) == 0) { /* 10baseT interface */ in el3_up()
1252 net_diag = (net_diag | FD_ENABLE); /* temporarily assume full-duplex will be set */ in el3_up()
1253 pr_info("%s: ", dev->name); in el3_up()
1254 switch (dev->if_port & 0x0c) { in el3_up()
1256 /* force full-duplex mode if 3c5x9b */ in el3_up()
1258 pr_cont("Forcing 3c5x9b full-duplex mode"); in el3_up()
1263 /* set full-duplex mode based on eeprom config setting */ in el3_up()
1265 pr_cont("Setting 3c5x9b full-duplex mode (from EEPROM configuration bit)"); in el3_up()
1271 pr_cont("Setting 3c5x9/3c5x9B half-duplex mode"); in el3_up()
1276 pr_cont(" if_port: %d, sw_info: %4.4x\n", dev->if_port, sw_info); in el3_up()
1278 pr_debug("%s: 3c5x9 net diag word is now: %4.4x.\n", dev->name, net_diag); in el3_up()
1294 /* Accept b-case and phys addr only. */ in el3_up()
1324 ioaddr = dev->base_addr; in el3_suspend()
1326 spin_lock_irqsave(&lp->lock, flags); in el3_suspend()
1334 spin_unlock_irqrestore(&lp->lock, flags); in el3_suspend()
1348 ioaddr = dev->base_addr; in el3_resume()
1350 spin_lock_irqsave(&lp->lock, flags); in el3_resume()
1359 spin_unlock_irqrestore(&lp->lock, flags); in el3_resume()
1368 MODULE_PARM_DESC(debug, "debug level (0-6)");
1373 MODULE_PARM_DESC(nopnp, "disable ISA PnP support (0-1)");
1395 if (!request_region(id_port, 1, "3c509-control")) in el3_init_module()