Lines Matching +full:el3 +full:-
5 * Copyright (C) 1999 David A. Hinds -- dahinds@users.sourceforge.net
124 #define WN0_IRQ 0x08 /* Window 0: Set IRQ line in bits 12-15. */
200 dev_dbg(&link->dev, "3c589_attach()\n"); in tc589_probe()
205 return -ENOMEM; in tc589_probe()
207 link->priv = dev; in tc589_probe()
208 lp->p_dev = link; in tc589_probe()
210 spin_lock_init(&lp->lock); in tc589_probe()
211 link->resource[0]->end = 16; in tc589_probe()
212 link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16; in tc589_probe()
214 link->config_flags |= CONF_ENABLE_IRQ; in tc589_probe()
215 link->config_index = 1; in tc589_probe()
217 dev->netdev_ops = &el3_netdev_ops; in tc589_probe()
218 dev->watchdog_timeo = TX_TIMEOUT; in tc589_probe()
220 dev->ethtool_ops = &netdev_ethtool_ops; in tc589_probe()
235 struct net_device *dev = link->priv; in tc589_detach()
237 dev_dbg(&link->dev, "3c589_detach\n"); in tc589_detach()
248 struct net_device *dev = link->priv; in tc589_config()
256 dev_dbg(&link->dev, "3c589_config\n"); in tc589_config()
259 if (link->manf_id != MANFID_3COM) in tc589_config()
260 dev_info(&link->dev, "hmmm, is this really a 3Com card??\n"); in tc589_config()
261 multi = (link->card_id == PRODID_3COM_3C562); in tc589_config()
263 link->io_lines = 16; in tc589_config()
265 /* For the 3c562, the base address must be xx00-xx7f */ in tc589_config()
269 link->resource[0]->start = j ^ 0x300; in tc589_config()
285 dev->irq = link->irq; in tc589_config()
286 dev->base_addr = link->resource[0]->start; in tc589_config()
287 ioaddr = dev->base_addr; in tc589_config()
303 dev_err(&link->dev, "IO port conflict at 0x%03lx-0x%03lx\n", in tc589_config()
304 dev->base_addr, dev->base_addr+15); in tc589_config()
319 dev->if_port = if_port; in tc589_config()
321 dev_err(&link->dev, "invalid if_port requested\n"); in tc589_config()
323 SET_NETDEV_DEV(dev, &link->dev); in tc589_config()
326 dev_err(&link->dev, "register_netdev() failed\n"); in tc589_config()
331 (multi ? "562" : "589"), dev->base_addr, dev->irq, in tc589_config()
332 dev->dev_addr); in tc589_config()
335 if_names[dev->if_port]); in tc589_config()
340 return -ENODEV; in tc589_config()
350 struct net_device *dev = link->priv; in tc589_suspend()
352 if (link->open) in tc589_suspend()
360 struct net_device *dev = link->priv; in tc589_resume()
362 if (link->open) { in tc589_resume()
377 outw(cmd, dev->base_addr + EL3_CMD); in tc589_wait_for_completion()
378 while (--i > 0) in tc589_wait_for_completion()
379 if (!(inw(dev->base_addr + EL3_STATUS) & 0x1000)) in tc589_wait_for_completion()
394 for (i = 1620; i >= 0; i--) in read_eeprom()
401 * specified in dev->if_port.
407 unsigned int ioaddr = dev->base_addr; in tc589_set_xcvr()
429 lp->media_status = ((dev->if_port == 0) ? 0x8000 : 0x4000); in tc589_set_xcvr()
431 lp->media_status = ((dev->if_port == 0) ? 0x4010 : 0x8800); in tc589_set_xcvr()
436 unsigned int ioaddr = dev->base_addr; in dump_status()
451 unsigned int ioaddr = dev->base_addr; in tc589_reset()
461 outb(dev->dev_addr[i], ioaddr + i); in tc589_reset()
463 tc589_set_xcvr(dev, dev->if_port); in tc589_reset()
492 strscpy(info->driver, DRV_NAME, sizeof(info->driver)); in netdev_get_drvinfo()
493 snprintf(info->bus_info, sizeof(info->bus_info), in netdev_get_drvinfo()
494 "PCMCIA 0x%lx", dev->base_addr); in netdev_get_drvinfo()
503 if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) { in el3_config()
504 if (map->port <= 3) { in el3_config()
505 WRITE_ONCE(dev->if_port, map->port); in el3_config()
506 netdev_info(dev, "switched to %s port\n", if_names[dev->if_port]); in el3_config()
507 tc589_set_xcvr(dev, dev->if_port); in el3_config()
509 return -EINVAL; in el3_config()
518 struct pcmcia_device *link = lp->p_dev; in el3_open()
521 return -ENODEV; in el3_open()
523 link->open++; in el3_open()
527 timer_setup(&lp->media, media_check, 0); in el3_open()
528 mod_timer(&lp->media, jiffies + HZ); in el3_open()
530 dev_dbg(&link->dev, "%s: opened, status %4.4x.\n", in el3_open()
531 dev->name, inw(dev->base_addr + EL3_STATUS)); in el3_open()
538 unsigned int ioaddr = dev->base_addr; in el3_tx_timeout()
542 dev->stats.tx_errors++; in el3_tx_timeout()
552 unsigned int ioaddr = dev->base_addr; in pop_tx_status()
556 for (i = 32; i > 0; i--) { in pop_tx_status()
566 dev->stats.tx_aborted_errors++; in pop_tx_status()
575 unsigned int ioaddr = dev->base_addr; in el3_start_xmit()
580 (long)skb->len, inw(ioaddr + EL3_STATUS)); in el3_start_xmit()
582 spin_lock_irqsave(&priv->lock, flags); in el3_start_xmit()
584 dev->stats.tx_bytes += skb->len; in el3_start_xmit()
587 outw(skb->len, ioaddr + TX_FIFO); in el3_start_xmit()
590 outsl(ioaddr + TX_FIFO, skb->data, (skb->len + 3) >> 2); in el3_start_xmit()
594 /* Interrupt us when the FIFO has room for max-sized packet. */ in el3_start_xmit()
599 spin_unlock_irqrestore(&priv->lock, flags); in el3_start_xmit()
605 /* The EL3 interrupt handler. */
617 ioaddr = dev->base_addr; in el3_interrupt()
621 spin_lock(&lp->lock); in el3_interrupt()
633 /* There's room in the FIFO for a full-sized packet. */ in el3_interrupt()
679 lp->last_irq = jiffies; in el3_interrupt()
680 spin_unlock(&lp->lock); in el3_interrupt()
689 struct net_device *dev = lp->p_dev->priv; in media_check()
690 unsigned int ioaddr = dev->base_addr; in media_check()
702 if (!lp->fast_poll) in media_check()
706 el3_interrupt(dev->irq, dev); in media_check()
709 lp->fast_poll = HZ; in media_check()
711 if (lp->fast_poll) { in media_check()
712 lp->fast_poll--; in media_check()
713 lp->media.expires = jiffies + HZ/100; in media_check()
714 add_timer(&lp->media); in media_check()
718 /* lp->lock guards the EL3 window. Window should always be 1 except in media_check()
722 spin_lock_irqsave(&lp->lock, flags); in media_check()
727 if (time_before(jiffies, lp->last_irq + HZ)) { in media_check()
735 dev->stats.tx_carrier_errors += errs; in media_check()
736 if (errs || (lp->media_status & 0x0010)) in media_check()
740 if (media != lp->media_status) { in media_check()
741 if ((media & lp->media_status & 0x8000) && in media_check()
742 ((lp->media_status ^ media) & 0x0800)) in media_check()
744 (lp->media_status & 0x0800 ? "lost" : "found")); in media_check()
745 else if ((media & lp->media_status & 0x4000) && in media_check()
746 ((lp->media_status ^ media) & 0x0010)) in media_check()
748 (lp->media_status & 0x0010 ? "ok" : "problem")); in media_check()
749 if (dev->if_port == 0) { in media_check()
762 lp->media_status = media; in media_check()
766 spin_unlock_irqrestore(&lp->lock, flags); in media_check()
769 lp->media.expires = jiffies + HZ; in media_check()
770 add_timer(&lp->media); in media_check()
777 struct pcmcia_device *link = lp->p_dev; in el3_get_stats()
780 spin_lock_irqsave(&lp->lock, flags); in el3_get_stats()
782 spin_unlock_irqrestore(&lp->lock, flags); in el3_get_stats()
784 return &dev->stats; in el3_get_stats()
788 * single-threaded if the device is active. This is expected to be a rare
790 * window 1 is always valid rather than use a special window-state variable.
797 unsigned int ioaddr = dev->base_addr; in update_stats()
804 dev->stats.tx_carrier_errors += inb(ioaddr + 0); in update_stats()
805 dev->stats.tx_heartbeat_errors += inb(ioaddr + 1); in update_stats()
808 dev->stats.collisions += inb(ioaddr + 3); in update_stats()
809 dev->stats.tx_window_errors += inb(ioaddr + 4); in update_stats()
810 dev->stats.rx_fifo_errors += inb(ioaddr + 5); in update_stats()
811 dev->stats.tx_packets += inb(ioaddr + 6); in update_stats()
828 unsigned int ioaddr = dev->base_addr; in el3_rx()
836 worklimit--; in el3_rx()
839 dev->stats.rx_errors++; in el3_rx()
842 dev->stats.rx_over_errors++; in el3_rx()
845 dev->stats.rx_length_errors++; in el3_rx()
848 dev->stats.rx_frame_errors++; in el3_rx()
851 dev->stats.rx_length_errors++; in el3_rx()
854 dev->stats.rx_frame_errors++; in el3_rx()
857 dev->stats.rx_crc_errors++; in el3_rx()
872 skb->protocol = eth_type_trans(skb, dev); in el3_rx()
874 dev->stats.rx_packets++; in el3_rx()
875 dev->stats.rx_bytes += pkt_len; in el3_rx()
879 dev->stats.rx_dropped++; in el3_rx()
892 unsigned int ioaddr = dev->base_addr; in set_rx_mode()
895 if (dev->flags & IFF_PROMISC) in set_rx_mode()
897 else if (!netdev_mc_empty(dev) || (dev->flags & IFF_ALLMULTI)) in set_rx_mode()
907 spin_lock_irqsave(&priv->lock, flags); in set_multicast_list()
909 spin_unlock_irqrestore(&priv->lock, flags); in set_multicast_list()
915 struct pcmcia_device *link = lp->p_dev; in el3_close()
916 unsigned int ioaddr = dev->base_addr; in el3_close()
918 dev_dbg(&link->dev, "%s: shutting down ethercard.\n", dev->name); in el3_close()
921 /* Turn off statistics ASAP. We update dev->stats below. */ in el3_close()
928 if (dev->if_port == 2) in el3_close()
931 else if (dev->if_port == 1) { in el3_close()
947 link->open--; in el3_close()
949 timer_delete_sync(&lp->media); in el3_close()