Lines Matching +full:rev +full:- +full:mii
3 Written 1993-1998 by
27 II. Board-specific settings
29 None -- PC cards are autoconfigured.
33 The 3c574 uses a Boomerang-style interface, without the bus-master capability.
39 RunnerWrCtrl. These are 11 bit down-counters that are preloaded with the
41 or Tx FIFO. The chip is then able to hide the internal-PCI-bus to PC-card
46 0x0800-0x0fff can translated to the PIO FIFO. Thus memory operations (faster
56 register set, 1-5 are various PC card control registers, and 16-31 are
88 #include <linux/mii.h>
167 On the "Odie" this window is always mapped at offsets 0x10-0x1f.
200 unsigned char phys; /* MII device address */
210 /* Set iff a MII transceiver on any interface requires mdio preamble.
212 code size of a per-interface flag is not worthwhile. */
266 dev_dbg(&link->dev, "3c574_attach()\n"); in tc574_probe()
271 return -ENOMEM; in tc574_probe()
273 link->priv = dev; in tc574_probe()
274 lp->p_dev = link; in tc574_probe()
276 spin_lock_init(&lp->window_lock); in tc574_probe()
277 link->resource[0]->end = 32; in tc574_probe()
278 link->resource[0]->flags |= IO_DATA_PATH_WIDTH_16; in tc574_probe()
279 link->config_flags |= CONF_ENABLE_IRQ; in tc574_probe()
280 link->config_index = 1; in tc574_probe()
282 dev->netdev_ops = &el3_netdev_ops; in tc574_probe()
283 dev->watchdog_timeo = TX_TIMEOUT; in tc574_probe()
290 struct net_device *dev = link->priv; in tc574_detach()
292 dev_dbg(&link->dev, "3c574_detach()\n"); in tc574_detach()
305 struct net_device *dev = link->priv; in tc574_config()
315 dev_dbg(&link->dev, "3c574_config()\n"); in tc574_config()
317 link->io_lines = 16; in tc574_config()
320 link->resource[0]->start = j ^ 0x300; in tc574_config()
336 dev->irq = link->irq; in tc574_config()
337 dev->base_addr = link->resource[0]->start; in tc574_config()
339 ioaddr = dev->base_addr; in tc574_config()
356 pr_notice("IO port conflict at 0x%03lx-0x%03lx\n", in tc574_config()
357 dev->base_addr, dev->base_addr+15); in tc574_config()
362 if (link->prod_id[1]) in tc574_config()
363 cardname = link->prod_id[1]; in tc574_config()
372 pr_info(" ASIC rev %d,", mcr>>3); in tc574_config()
375 lp->default_media = (config & Xcvr) >> Xcvr_shift; in tc574_config()
376 lp->autoselect = config & Autoselect ? 1 : 0; in tc574_config()
379 timer_setup(&lp->media, media_check, 0); in tc574_config()
384 /* Roadrunner only: Turn on the MII transceiver */ in tc574_config()
399 lp->phys = phy & 0x1f; in tc574_config()
400 dev_dbg(&link->dev, " MII transceiver at " in tc574_config()
409 pr_notice(" No MII transceivers found!\n"); in tc574_config()
412 i = mdio_read(ioaddr, lp->phys, 16) | 0x40; in tc574_config()
413 mdio_write(ioaddr, lp->phys, 16, i); in tc574_config()
414 lp->advertising = mdio_read(ioaddr, lp->phys, 4); in tc574_config()
417 lp->advertising &= ~0x02a0; in tc574_config()
418 mdio_write(ioaddr, lp->phys, 4, lp->advertising); in tc574_config()
422 SET_NETDEV_DEV(dev, &link->dev); in tc574_config()
430 cardname, dev->base_addr, dev->irq, dev->dev_addr); in tc574_config()
440 return -ENODEV; in tc574_config()
451 struct net_device *dev = link->priv; in tc574_suspend()
453 if (link->open) in tc574_suspend()
461 struct net_device *dev = link->priv; in tc574_resume()
463 if (link->open) { in tc574_resume()
473 unsigned int ioaddr = dev->base_addr; in dump_status()
492 outw(cmd, dev->base_addr + EL3_CMD); in tc574_wait_for_completion()
493 while (--i > 0) in tc574_wait_for_completion()
494 if (!(inw(dev->base_addr + EL3_STATUS) & 0x1000)) break; in tc574_wait_for_completion()
507 for (timer = 1620; timer >= 0; timer--) { in read_eeprom()
514 /* MII transceiver control section.
515 Read and write the MII registers using software-generated serial
516 MDIO protocol. See the MII specifications or DP83840A data sheet
535 while (-- bits >= 0) { in mdio_sync()
552 for (i = 14; i >= 0; i--) { in mdio_read()
557 /* Read the two transition, 16 data, and wire-idle bits. */ in mdio_read()
558 for (i = 19; i > 0; i--) { in mdio_read()
576 for (i = 31; i >= 0; i--) { in mdio_write()
582 for (i = 1; i >= 0; i--) { in mdio_write()
593 unsigned int ioaddr = dev->base_addr; in tc574_reset()
598 spin_lock_irqsave(&lp->window_lock, flags); in tc574_reset()
606 outb(dev->dev_addr[i], ioaddr + i); in tc574_reset()
612 outb((dev->mtu > 1500 ? 0x40 : 0), ioaddr + Wn3_MAC_Ctrl); in tc574_reset()
613 outl((lp->autoselect ? 0x01000000 : 0) | 0x0062001b, in tc574_reset()
615 /* Roadrunner only: Turn on the MII transceiver. */ in tc574_reset()
620 spin_unlock_irqrestore(&lp->window_lock, flags); in tc574_reset()
625 spin_lock_irqsave(&lp->window_lock, flags); in tc574_reset()
644 spin_unlock_irqrestore(&lp->window_lock, flags); in tc574_reset()
646 /* .. re-sync MII and re-fill what NWay is advertising. */ in tc574_reset()
648 mdio_write(ioaddr, lp->phys, 4, lp->advertising); in tc574_reset()
650 /* works for TDK 78Q2120 series MII's */ in tc574_reset()
651 i = mdio_read(ioaddr, lp->phys, 16) | 0x20; in tc574_reset()
652 mdio_write(ioaddr, lp->phys, 16, i); in tc574_reset()
655 spin_lock_irqsave(&lp->window_lock, flags); in tc574_reset()
658 spin_unlock_irqrestore(&lp->window_lock, flags); in tc574_reset()
674 struct pcmcia_device *link = lp->p_dev; in el3_open()
677 return -ENODEV; in el3_open()
679 link->open++; in el3_open()
683 lp->media.expires = jiffies + HZ; in el3_open()
684 add_timer(&lp->media); in el3_open()
686 dev_dbg(&link->dev, "%s: opened, status %4.4x.\n", in el3_open()
687 dev->name, inw(dev->base_addr + EL3_STATUS)); in el3_open()
694 unsigned int ioaddr = dev->base_addr; in el3_tx_timeout()
698 dev->stats.tx_errors++; in el3_tx_timeout()
708 unsigned int ioaddr = dev->base_addr; in pop_tx_status()
712 for (i = 32; i > 0; i--) { in pop_tx_status()
721 dev->name, tx_status); in pop_tx_status()
723 dev->stats.tx_aborted_errors++; in pop_tx_status()
732 unsigned int ioaddr = dev->base_addr; in el3_start_xmit()
737 "status %4.4x.\n", dev->name, (long)skb->len, in el3_start_xmit()
740 spin_lock_irqsave(&lp->window_lock, flags); in el3_start_xmit()
742 dev->stats.tx_bytes += skb->len; in el3_start_xmit()
745 outw(skb->len, ioaddr + TX_FIFO); in el3_start_xmit()
748 outsl(ioaddr + TX_FIFO, skb->data, (skb->len+3)>>2); in el3_start_xmit()
753 /* Interrupt us when the FIFO has room for max-sized packet. in el3_start_xmit()
759 spin_unlock_irqrestore(&lp->window_lock, flags); in el3_start_xmit()
776 ioaddr = dev->base_addr; in el3_interrupt()
779 dev->name, inw(ioaddr + EL3_STATUS)); in el3_interrupt()
781 spin_lock(&lp->window_lock); in el3_interrupt()
787 pr_debug("%s: Interrupt from dead card\n", dev->name); in el3_interrupt()
798 /* There's room in the FIFO for a full-sized packet. */ in el3_interrupt()
836 if (--work_budget < 0) { in el3_interrupt()
838 "status %4.4x.\n", dev->name, status); in el3_interrupt()
848 dev->name, inw(ioaddr + EL3_STATUS)); in el3_interrupt()
850 spin_unlock(&lp->window_lock); in el3_interrupt()
857 the MII, reporting changes in cable status.
862 struct net_device *dev = lp->p_dev->priv; in media_check()
863 unsigned int ioaddr = dev->base_addr; in media_check()
873 if (!lp->fast_poll) in media_check()
877 el3_interrupt(dev->irq, dev); in media_check()
880 lp->fast_poll = HZ; in media_check()
882 if (lp->fast_poll) { in media_check()
883 lp->fast_poll--; in media_check()
884 lp->media.expires = jiffies + 2*HZ/100; in media_check()
885 add_timer(&lp->media); in media_check()
889 spin_lock_irqsave(&lp->window_lock, flags); in media_check()
891 media = mdio_read(ioaddr, lp->phys, 1); in media_check()
892 partner = mdio_read(ioaddr, lp->phys, 5); in media_check()
895 if (media != lp->media_status) { in media_check()
896 if ((media ^ lp->media_status) & 0x0004) in media_check()
898 (lp->media_status & 0x0004) ? "lost" : "found"); in media_check()
899 if ((media ^ lp->media_status) & 0x0020) { in media_check()
900 lp->partner = 0; in media_check()
901 if (lp->media_status & 0x0020) { in media_check()
904 partner &= lp->advertising; in media_check()
905 lp->partner = partner; in media_check()
907 "%dbaseT-%cD selected\n", in media_check()
916 (dev->mtu > 1500 ? 0x40 : 0), ioaddr + Wn3_MAC_Ctrl); in media_check()
924 lp->media_status = media; in media_check()
926 spin_unlock_irqrestore(&lp->window_lock, flags); in media_check()
929 lp->media.expires = jiffies + HZ; in media_check()
930 add_timer(&lp->media); in media_check()
939 spin_lock_irqsave(&lp->window_lock, flags); in el3_get_stats()
941 spin_unlock_irqrestore(&lp->window_lock, flags); in el3_get_stats()
943 return &dev->stats; in el3_get_stats()
947 Surprisingly this need not be run single-threaded, but it effectively is.
952 unsigned int ioaddr = dev->base_addr; in update_stats()
955 pr_debug("%s: updating the statistics.\n", dev->name); in update_stats()
963 dev->stats.tx_carrier_errors += inb(ioaddr + 0); in update_stats()
964 dev->stats.tx_heartbeat_errors += inb(ioaddr + 1); in update_stats()
966 dev->stats.collisions += inb(ioaddr + 3); in update_stats()
967 dev->stats.tx_window_errors += inb(ioaddr + 4); in update_stats()
968 dev->stats.rx_fifo_errors += inb(ioaddr + 5); in update_stats()
969 dev->stats.tx_packets += inb(ioaddr + 6); in update_stats()
971 dev->stats.tx_packets += (up&0x30) << 4; in update_stats()
986 unsigned int ioaddr = dev->base_addr; in el3_rx()
990 dev->name, inw(ioaddr+EL3_STATUS), inw(ioaddr+RxStatus)); in el3_rx()
993 worklimit--; in el3_rx()
996 dev->stats.rx_errors++; in el3_rx()
998 case 0x0000: dev->stats.rx_over_errors++; break; in el3_rx()
999 case 0x0800: dev->stats.rx_length_errors++; break; in el3_rx()
1000 case 0x1000: dev->stats.rx_frame_errors++; break; in el3_rx()
1001 case 0x1800: dev->stats.rx_length_errors++; break; in el3_rx()
1002 case 0x2000: dev->stats.rx_frame_errors++; break; in el3_rx()
1003 case 0x2800: dev->stats.rx_crc_errors++; break; in el3_rx()
1017 skb->protocol = eth_type_trans(skb, dev); in el3_rx()
1019 dev->stats.rx_packets++; in el3_rx()
1020 dev->stats.rx_bytes += pkt_len; in el3_rx()
1023 " size %d.\n", dev->name, pkt_len); in el3_rx()
1024 dev->stats.rx_dropped++; in el3_rx()
1033 /* Provide ioctl() calls to examine the MII xcvr state. */
1037 unsigned int ioaddr = dev->base_addr; in el3_ioctl()
1039 int phy = lp->phys & 0x1f; in el3_ioctl()
1041 pr_debug("%s: In ioct(%-.6s, %#4.4x) %4.4x %4.4x %4.4x %4.4x.\n", in el3_ioctl()
1042 dev->name, rq->ifr_ifrn.ifrn_name, cmd, in el3_ioctl()
1043 data->phy_id, data->reg_num, data->val_in, data->val_out); in el3_ioctl()
1047 data->phy_id = phy; in el3_ioctl()
1049 case SIOCGMIIREG: /* Read the specified MII register. */ in el3_ioctl()
1054 spin_lock_irqsave(&lp->window_lock, flags); in el3_ioctl()
1057 data->val_out = mdio_read(ioaddr, data->phy_id & 0x1f, in el3_ioctl()
1058 data->reg_num & 0x1f); in el3_ioctl()
1060 spin_unlock_irqrestore(&lp->window_lock, flags); in el3_ioctl()
1063 case SIOCSMIIREG: /* Write the specified MII register */ in el3_ioctl()
1068 spin_lock_irqsave(&lp->window_lock, flags); in el3_ioctl()
1071 mdio_write(ioaddr, data->phy_id & 0x1f, in el3_ioctl()
1072 data->reg_num & 0x1f, data->val_in); in el3_ioctl()
1074 spin_unlock_irqrestore(&lp->window_lock, flags); in el3_ioctl()
1078 return -EOPNOTSUPP; in el3_ioctl()
1092 unsigned int ioaddr = dev->base_addr; in set_rx_mode()
1094 if (dev->flags & IFF_PROMISC) in set_rx_mode()
1097 else if (!netdev_mc_empty(dev) || (dev->flags & IFF_ALLMULTI)) in set_rx_mode()
1108 spin_lock_irqsave(&lp->window_lock, flags); in set_multicast_list()
1110 spin_unlock_irqrestore(&lp->window_lock, flags); in set_multicast_list()
1115 unsigned int ioaddr = dev->base_addr; in el3_close()
1117 struct pcmcia_device *link = lp->p_dev; in el3_close()
1119 dev_dbg(&link->dev, "%s: shutting down ethercard.\n", dev->name); in el3_close()
1124 /* Turn off statistics ASAP. We update lp->stats below. */ in el3_close()
1133 spin_lock_irqsave(&lp->window_lock, flags); in el3_close()
1135 spin_unlock_irqrestore(&lp->window_lock, flags); in el3_close()
1141 link->open--; in el3_close()
1143 del_timer_sync(&lp->media); in el3_close()