Lines Matching full:smc
16 (erik@vt.edu). Donald wrote the SMC 91c92 code using parts of
17 Erik's SMC 91c94 driver. Rowan wrote a similar driver, and I've
66 MODULE_DESCRIPTION("SMC 91c92 series PCMCIA ethernet driver");
304 struct smc_private *smc; in smc91c92_probe() local
313 smc = netdev_priv(dev); in smc91c92_probe()
314 smc->p_dev = link; in smc91c92_probe()
317 spin_lock_init(&smc->lock); in smc91c92_probe()
324 smc->mii_if.dev = dev; in smc91c92_probe()
325 smc->mii_if.mdio_read = mdio_read; in smc91c92_probe()
326 smc->mii_if.mdio_write = mdio_write; in smc91c92_probe()
327 smc->mii_if.phy_id_mask = 0x1f; in smc91c92_probe()
328 smc->mii_if.reg_num_mask = 0x1f; in smc91c92_probe()
381 struct smc_private *smc = netdev_priv(dev); in mhz_3288_power() local
385 readb(smc->base+MEGAHERTZ_ISR); in mhz_3288_power()
387 readb(smc->base+MEGAHERTZ_ISR); in mhz_3288_power()
393 tmp = readb(smc->base + link->config_base + CISREG_COR); in mhz_3288_power()
395 writeb(tmp, smc->base + link->config_base + CISREG_COR); in mhz_3288_power()
424 struct smc_private *smc = netdev_priv(dev); in mhz_mfc_config() local
445 smc->base = ioremap(link->resource[2]->start, in mhz_mfc_config()
447 offset = (smc->manfid == MANFID_MOTOROLA) ? link->config_base : 0; in mhz_mfc_config()
450 (smc->manfid == MANFID_MEGAHERTZ) && in mhz_mfc_config()
451 (smc->cardid == PRODID_MEGAHERTZ_EM3288)) in mhz_mfc_config()
519 struct smc_private *smc = netdev_priv(dev); in mot_config() local
524 writeb(iouart & 0xff, smc->base + MOT_UART + CISREG_IOBASE_0); in mot_config()
525 writeb((iouart >> 8) & 0xff, smc->base + MOT_UART + CISREG_IOBASE_1); in mot_config()
526 writeb(MOT_NORMAL, smc->base + MOT_UART + CISREG_COR); in mot_config()
528 /* Set SMC base address and force map with COR bit 1 */ in mot_config()
529 writeb(ioaddr & 0xff, smc->base + MOT_LAN + CISREG_IOBASE_0); in mot_config()
530 writeb((ioaddr >> 8) & 0xff, smc->base + MOT_LAN + CISREG_IOBASE_1); in mot_config()
531 writeb(MOT_NORMAL, smc->base + MOT_LAN + CISREG_COR); in mot_config()
722 struct smc_private *smc = netdev_priv(dev); in smc91c92_resume() local
725 if ((smc->manfid == MANFID_MEGAHERTZ) && in smc91c92_resume()
726 (smc->cardid == PRODID_MEGAHERTZ_EM3288)) in smc91c92_resume()
728 if (smc->manfid == MANFID_MOTOROLA) in smc91c92_resume()
730 if ((smc->manfid == MANFID_OSITECH) && in smc91c92_resume()
731 (smc->cardid != PRODID_OSITECH_SEVEN)) { in smc91c92_resume()
736 if (((smc->manfid == MANFID_OSITECH) && in smc91c92_resume()
737 (smc->cardid == PRODID_OSITECH_SEVEN)) || in smc91c92_resume()
738 ((smc->manfid == MANFID_PSION) && in smc91c92_resume()
739 (smc->cardid == PRODID_PSION_NET100))) { in smc91c92_resume()
808 struct smc_private *smc = netdev_priv(dev); in smc91c92_config() local
816 smc->manfid = link->manf_id; in smc91c92_config()
817 smc->cardid = link->card_id; in smc91c92_config()
819 if ((smc->manfid == MANFID_OSITECH) && in smc91c92_config()
820 (smc->cardid != PRODID_OSITECH_SEVEN)) { in smc91c92_config()
822 } else if ((smc->manfid == MANFID_MOTOROLA) || in smc91c92_config()
823 ((smc->manfid == MANFID_MEGAHERTZ) && in smc91c92_config()
824 ((smc->cardid == PRODID_MEGAHERTZ_VARIOUS) || in smc91c92_config()
825 (smc->cardid == PRODID_MEGAHERTZ_EM3288)))) { in smc91c92_config()
840 if (smc->manfid == MANFID_MOTOROLA) in smc91c92_config()
850 switch (smc->manfid) { in smc91c92_config()
853 i = osi_setup(link, smc->manfid, smc->cardid); break; in smc91c92_config()
870 smc->duplex = 0; in smc91c92_config()
871 smc->rx_ovrn = 0; in smc91c92_config()
895 smc->cfg = inw(ioaddr + CONFIG) & ~CFG_AUI_SELECT; in smc91c92_config()
896 smc->cfg |= CFG_NO_WAIT | CFG_16BIT | CFG_STATIC; in smc91c92_config()
897 if (smc->manfid == MANFID_OSITECH) in smc91c92_config()
898 smc->cfg |= CFG_IRQ_SEL_1 | CFG_IRQ_SEL_0; in smc91c92_config()
900 smc->cfg |= CFG_MII_SELECT; in smc91c92_config()
904 if (smc->cfg & CFG_MII_SELECT) { in smc91c92_config()
911 smc->mii_if.phy_id = (i < 32) ? i : -1; in smc91c92_config()
932 (smc->cfg & CFG_MII_SELECT) ? "MII" : if_names[dev->if_port]); in smc91c92_config()
935 if (smc->cfg & CFG_MII_SELECT) { in smc91c92_config()
936 if (smc->mii_if.phy_id != -1) { in smc91c92_config()
938 smc->mii_if.phy_id, j); in smc91c92_config()
958 struct smc_private *smc = netdev_priv(dev); in smc91c92_release() local
959 iounmap(smc->base); in smc91c92_release()
1049 struct smc_private *smc = netdev_priv(dev); in smc_open() local
1050 struct pcmcia_device *link = smc->p_dev; in smc_open()
1069 smc->saved_skb = NULL; in smc_open()
1070 smc->packets_waiting = 0; in smc_open()
1073 timer_setup(&smc->media, media_check, 0); in smc_open()
1074 mod_timer(&smc->media, jiffies + HZ); in smc_open()
1083 struct smc_private *smc = netdev_priv(dev); in smc_close() local
1084 struct pcmcia_device *link = smc->p_dev; in smc_close()
1105 del_timer_sync(&smc->media); in smc_close()
1120 struct smc_private *smc = netdev_priv(dev); in smc_hardware_send_packet() local
1121 struct sk_buff *skb = smc->saved_skb; in smc_hardware_send_packet()
1137 smc->saved_skb = NULL; in smc_hardware_send_packet()
1173 smc->saved_skb = NULL; in smc_hardware_send_packet()
1183 struct smc_private *smc = netdev_priv(dev); in smc_tx_timeout() local
1191 smc->saved_skb = NULL; in smc_tx_timeout()
1198 struct smc_private *smc = netdev_priv(dev); in smc_start_xmit() local
1209 if (smc->saved_skb) { in smc_start_xmit()
1215 smc->saved_skb = skb; in smc_start_xmit()
1222 smc->saved_skb = NULL; in smc_start_xmit()
1227 smc->packets_waiting++; in smc_start_xmit()
1229 spin_lock_irqsave(&smc->lock, flags); in smc_start_xmit()
1233 if (smc->rx_ovrn) { in smc_start_xmit()
1235 smc->rx_ovrn = 0; in smc_start_xmit()
1246 spin_unlock_irqrestore(&smc->lock, flags); in smc_start_xmit()
1254 spin_unlock_irqrestore(&smc->lock, flags); in smc_start_xmit()
1267 struct smc_private *smc = netdev_priv(dev); in smc_tx_err() local
1286 smc->tx_err++; in smc_tx_err()
1294 outw(inw(ioaddr + TCR) | TCR_ENABLE | smc->duplex, ioaddr + TCR); in smc_tx_err()
1300 smc->packets_waiting--; in smc_tx_err()
1309 struct smc_private *smc = netdev_priv(dev); in smc_eph_irq() local
1329 outw(inw(ioaddr + TCR) | TCR_ENABLE | smc->duplex, ioaddr + TCR); in smc_eph_irq()
1344 struct smc_private *smc = netdev_priv(dev); in smc_interrupt() local
1358 spin_lock(&smc->lock); in smc_interrupt()
1359 smc->watchdog = 0; in smc_interrupt()
1397 dev->stats.tx_packets += smc->packets_waiting; in smc_interrupt()
1398 smc->packets_waiting = 0; in smc_interrupt()
1415 if (smc->duplex) in smc_interrupt()
1416 smc->rx_ovrn = 1; /* need MC_RESET outside smc_interrupt */ in smc_interrupt()
1435 if ((smc->manfid == MANFID_OSITECH) && in smc_interrupt()
1436 (smc->cardid != PRODID_OSITECH_SEVEN)) { in smc_interrupt()
1441 if (smc->manfid == MANFID_MOTOROLA) { in smc_interrupt()
1443 cor = readb(smc->base + MOT_UART + CISREG_COR); in smc_interrupt()
1444 writeb(cor & ~COR_IREQ_ENA, smc->base + MOT_UART + CISREG_COR); in smc_interrupt()
1445 writeb(cor, smc->base + MOT_UART + CISREG_COR); in smc_interrupt()
1446 cor = readb(smc->base + MOT_LAN + CISREG_COR); in smc_interrupt()
1447 writeb(cor & ~COR_IREQ_ENA, smc->base + MOT_LAN + CISREG_COR); in smc_interrupt()
1448 writeb(cor, smc->base + MOT_LAN + CISREG_COR); in smc_interrupt()
1451 if ((smc->base != NULL) && /* Megahertz MFC's */ in smc_interrupt()
1452 (smc->manfid == MANFID_MEGAHERTZ) && in smc_interrupt()
1453 (smc->cardid == PRODID_MEGAHERTZ_EM3288)) { in smc_interrupt()
1456 tmp = readb(smc->base+MEGAHERTZ_ISR); in smc_interrupt()
1457 tmp = readb(smc->base+MEGAHERTZ_ISR); in smc_interrupt()
1460 writeb(tmp, smc->base + MEGAHERTZ_ISR); in smc_interrupt()
1461 writeb(tmp, smc->base + MEGAHERTZ_ISR); in smc_interrupt()
1464 spin_unlock(&smc->lock); in smc_interrupt()
1495 struct smc_private *smc = netdev_priv(dev); in smc_rx() local
1514 smc->last_rx = jiffies; in smc_rx()
1546 struct smc_private *smc = netdev_priv(dev); in set_rx_mode() local
1571 spin_lock_irqsave(&smc->lock, flags); in set_rx_mode()
1578 spin_unlock_irqrestore(&smc->lock, flags); in set_rx_mode()
1589 struct smc_private *smc = netdev_priv(dev); in s9k_config() local
1591 if (smc->cfg & CFG_MII_SELECT) in s9k_config()
1614 struct smc_private *smc = netdev_priv(dev); in smc_set_xcvr() local
1621 outw(smc->cfg | CFG_AUI_SELECT, ioaddr + CONFIG); in smc_set_xcvr()
1622 if ((smc->manfid == MANFID_OSITECH) && in smc_set_xcvr()
1623 (smc->cardid != PRODID_OSITECH_SEVEN)) in smc_set_xcvr()
1625 smc->media_status = ((dev->if_port == 0) ? 0x0001 : 0x0002); in smc_set_xcvr()
1627 outw(smc->cfg, ioaddr + CONFIG); in smc_set_xcvr()
1628 if ((smc->manfid == MANFID_OSITECH) && in smc_set_xcvr()
1629 (smc->cardid != PRODID_OSITECH_SEVEN)) in smc_set_xcvr()
1631 smc->media_status = ((dev->if_port == 0) ? 0x0012 : 0x4001); in smc_set_xcvr()
1639 struct smc_private *smc = netdev_priv(dev); in smc_reset() local
1663 if ((smc->manfid == MANFID_OSITECH) && in smc_reset()
1664 (smc->cardid != PRODID_OSITECH_SEVEN)) in smc_reset()
1681 outw(((smc->cfg & CFG_MII_SELECT) ? 0 : TCR_MONCSN) | in smc_reset()
1682 TCR_ENABLE | TCR_PAD_EN | smc->duplex, ioaddr + TCR); in smc_reset()
1685 if (smc->cfg & CFG_MII_SELECT) { in smc_reset()
1689 mdio_write(dev, smc->mii_if.phy_id, 0, 0x8000); in smc_reset()
1692 mdio_write(dev, smc->mii_if.phy_id, 4, 0x01e1); in smc_reset()
1695 mdio_write(dev, smc->mii_if.phy_id, 0, 0x0000); in smc_reset()
1696 mdio_write(dev, smc->mii_if.phy_id, 0, 0x1200); in smc_reset()
1713 struct smc_private *smc = from_timer(smc, t, media); in media_check() local
1714 struct net_device *dev = smc->mii_if.dev; in media_check()
1720 spin_lock_irqsave(&smc->lock, flags); in media_check()
1730 if (smc->rx_ovrn) { in media_check()
1732 smc->rx_ovrn = 0; in media_check()
1741 spin_unlock_irqrestore(&smc->lock, flags); in media_check()
1745 if (smc->watchdog++ && ((i>>8) & i)) { in media_check()
1746 if (!smc->fast_poll) in media_check()
1751 smc->fast_poll = HZ; in media_check()
1753 if (smc->fast_poll) { in media_check()
1754 smc->fast_poll--; in media_check()
1755 smc->media.expires = jiffies + HZ/100; in media_check()
1756 add_timer(&smc->media); in media_check()
1760 spin_lock_irqsave(&smc->lock, flags); in media_check()
1764 if (smc->cfg & CFG_MII_SELECT) { in media_check()
1765 if (smc->mii_if.phy_id < 0) in media_check()
1769 link = mdio_read(dev, smc->mii_if.phy_id, 1); in media_check()
1772 smc->mii_if.phy_id = -1; in media_check()
1777 if (link != smc->link_status) { in media_check()
1778 u_short p = mdio_read(dev, smc->mii_if.phy_id, 5); in media_check()
1780 smc->duplex = (((p & 0x0100) || ((p & 0x1c0) == 0x40)) in media_check()
1785 (p & 0x0180) ? 100 : 10, smc->duplex ? 'F' : 'H'); in media_check()
1788 outw(inw(ioaddr + TCR) | smc->duplex, ioaddr + TCR); in media_check()
1789 smc->link_status = link; in media_check()
1795 if (time_after(jiffies, smc->last_rx + HZ)) { in media_check()
1796 if (smc->tx_err || (smc->media_status & EPH_16COL)) in media_check()
1799 smc->tx_err = 0; in media_check()
1801 if (media != smc->media_status) { in media_check()
1802 if ((media & smc->media_status & 1) && in media_check()
1803 ((smc->media_status ^ media) & EPH_LINK_OK)) in media_check()
1805 smc->media_status & EPH_LINK_OK ? "lost" : "found"); in media_check()
1806 else if ((media & smc->media_status & 2) && in media_check()
1807 ((smc->media_status ^ media) & EPH_16COL)) in media_check()
1823 smc->media_status = media; in media_check()
1827 smc->media.expires = jiffies + HZ; in media_check()
1828 add_timer(&smc->media); in media_check()
1830 spin_unlock_irqrestore(&smc->lock, flags); in media_check()
1836 struct smc_private *smc = netdev_priv(dev); in smc_link_ok() local
1838 if (smc->cfg & CFG_MII_SELECT) { in smc_link_ok()
1839 return mii_link_ok(&smc->mii_if); in smc_link_ok()
1916 struct smc_private *smc = netdev_priv(dev); in smc_get_link_ksettings() local
1921 spin_lock_irqsave(&smc->lock, flags); in smc_get_link_ksettings()
1923 if (smc->cfg & CFG_MII_SELECT) in smc_get_link_ksettings()
1924 mii_ethtool_get_link_ksettings(&smc->mii_if, ecmd); in smc_get_link_ksettings()
1928 spin_unlock_irqrestore(&smc->lock, flags); in smc_get_link_ksettings()
1935 struct smc_private *smc = netdev_priv(dev); in smc_set_link_ksettings() local
1941 spin_lock_irqsave(&smc->lock, flags); in smc_set_link_ksettings()
1943 if (smc->cfg & CFG_MII_SELECT) in smc_set_link_ksettings()
1944 ret = mii_ethtool_set_link_ksettings(&smc->mii_if, ecmd); in smc_set_link_ksettings()
1948 spin_unlock_irqrestore(&smc->lock, flags); in smc_set_link_ksettings()
1954 struct smc_private *smc = netdev_priv(dev); in smc_get_link() local
1960 spin_lock_irqsave(&smc->lock, flags); in smc_get_link()
1964 spin_unlock_irqrestore(&smc->lock, flags); in smc_get_link()
1970 struct smc_private *smc = netdev_priv(dev); in smc_nway_reset() local
1971 if (smc->cfg & CFG_MII_SELECT) { in smc_nway_reset()
1977 res = mii_nway_restart(&smc->mii_if); in smc_nway_reset()
1996 struct smc_private *smc = netdev_priv(dev); in smc_ioctl() local
2006 spin_lock_irqsave(&smc->lock, flags); in smc_ioctl()
2009 rc = generic_mii_ioctl(&smc->mii_if, mii, cmd, NULL); in smc_ioctl()
2011 spin_unlock_irqrestore(&smc->lock, flags); in smc_ioctl()
2034 PCMCIA_DEVICE_PROD_ID12("MELCO/SMC", "LPC-TX", 0xa2cd8e6d, 0x42da662a),
2039 PCMCIA_DEVICE_PROD_ID12("SMC", "EtherEZ Ethernet 8020", 0xc4f8b18b, 0x4a0eeb2d),