Lines Matching +full:rev +full:- +full:mii
14 preliminary Rev. 1.0 Jan. 14, 1998
16 preliminary Rev. 1.0 Nov. 10, 1998
17 SiS 7014 Single Chip 100BASE-TX/10BASE-T Physical Layer Solution,
18 preliminary Rev. 1.0 Jan. 18, 1998
20 Rev 1.08.10 Apr. 2 2006 Daniele Venzano add vlan (jumbo packets) support
21 Rev 1.08.09 Sep. 19 2005 Daniele Venzano add Wake on LAN support
22 Rev 1.08.08 Jan. 22 2005 Daniele Venzano use netif_msg for debugging messages
23 Rev 1.08.07 Nov. 2 2003 Daniele Venzano <venza@brownhat.org> add suspend/resume support
24 Rev 1.08.06 Sep. 24 2002 Mufasa Yang bug fix for Tx timeout & add SiS963 support
25 Rev 1.08.05 Jun. 6 2002 Mufasa Yang bug fix for read_eeprom & Tx descriptor over-boundary
26 Rev 1.08.04 Apr. 25 2002 Mufasa Yang <mufasa@sis.com.tw> added SiS962 support
27 Rev 1.08.03 Feb. 1 2002 Matt Domsch <Matt_Domsch@dell.com> update to use library crc32 function
28 Rev 1.08.02 Nov. 30 2001 Hui-Fen Hsu workaround for EDB & bug fix for dhcp problem
29 Rev 1.08.01 Aug. 25 2001 Hui-Fen Hsu update for 630ET & workaround for ICS1893 PHY
30 Rev 1.08.00 Jun. 11 2001 Hui-Fen Hsu workaround for RTL8201 PHY and some bug fix
31 …Rev 1.07.11 Apr. 2 2001 Hui-Fen Hsu updates PCI drivers to use the new pci_set_dma_mask for kerne…
32 Rev 1.07.10 Mar. 1 2001 Hui-Fen Hsu <hfhsu@sis.com.tw> some bug fix & 635M/B support
33 Rev 1.07.09 Feb. 9 2001 Dave Jones <davej@suse.de> PCI enable cleanup
34 Rev 1.07.08 Jan. 8 2001 Lei-Chun Chang added RTL8201 PHY support
35 …Rev 1.07.07 Nov. 29 2000 Lei-Chun Chang added kernel-doc extractable documentation and 630 workaro…
36 Rev 1.07.06 Nov. 7 2000 Jeff Garzik <jgarzik@pobox.com> some bug fix and cleaning
37 Rev 1.07.05 Nov. 6 2000 metapirat<metapirat@gmx.de> contribute media type select by ifconfig
38 Rev 1.07.04 Sep. 6 2000 Lei-Chun Chang added ICS1893 PHY support
39 …Rev 1.07.03 Aug. 24 2000 Lei-Chun Chang (lcchang@sis.com.tw) modified 630E equalizer workaround ru…
40 Rev 1.07.01 Aug. 08 2000 Ollie Lho minor update for SiS 630E and SiS 630E A1
41 Rev 1.07 Mar. 07 2000 Ollie Lho bug fix in Rx buffer ring
42 Rev 1.06.04 Feb. 11 2000 Jeff Garzik <jgarzik@pobox.com> softnet and init for kernel 2.4
43 Rev 1.06.03 Dec. 23 1999 Ollie Lho Third release
44 Rev 1.06.02 Nov. 23 1999 Ollie Lho bug in mac probing fixed
45 …Rev 1.06.01 Nov. 16 1999 Ollie Lho CRC calculation provide by Joseph Zbiciak (im14u2c@primenet.com)
46 Rev 1.06 Nov. 4 1999 Ollie Lho (ollie@sis.com.tw) Second release
47 Rev 1.05.05 Oct. 29 1999 Ollie Lho (ollie@sis.com.tw) Single buffer Tx/Rx
48 Chin-Shan Li (lcs@sis.com.tw) Added AMD Am79c901 HomePNA PHY support
49 Rev 1.05 Aug. 7 1999 Jim Huang (cmhuang@sis.com.tw) Initial release
65 #include <linux/mii.h>
72 #include <linux/dma-mapping.h>
90 static int sis900_debug = -1; /* Use SIS900_DEF_MSG as value */
131 { "SiS 900 Internal MII PHY", 0x001d, 0x8000, LAN },
136 { "AMD 79C901 10BASE-T PHY", 0x0000, 0x6B70, LAN },
167 struct mii_phy * mii; member
168 struct mii_phy * first_mii; /* record the first mii structure */
175 u8 autong_complete; /* 1: auto-negotiate complete */
182 /* The saved address of a sent/receive-in-place packet buffer */
248 * sis900_get_mac_addr - Get MAC address for stand alone SiS900 model
253 * MAC address is read from read_eeprom() into @net_dev->dev_addr.
260 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_get_mac_addr()
282 * sis630e_get_mac_addr - Get MAC address for SiS630E model
288 * MAC address is read into @net_dev->dev_addr.
324 * sis635_get_mac_addr - Get MAC address for SIS635 model
330 * @net_dev->dev_addr.
337 void __iomem *ioaddr = sis_priv->ioaddr; in sis635_get_mac_addr()
364 * sis96x_get_mac_addr - Get MAC address for SiS962 or SiS963 model
376 * MAC address is read into @net_dev->dev_addr.
383 void __iomem *ioaddr = sis_priv->ioaddr; in sis96x_get_mac_addr()
422 * sis900_probe - Probe for sis900 device
428 * and assign SiS900-specific entries in the device structure.
442 const char *card_name = card_names[pci_id->driver_data]; in sis900_probe()
456 i = dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(32)); in sis900_probe()
467 return -ENOMEM; in sis900_probe()
468 SET_NETDEV_DEV(net_dev, &pci_dev->dev); in sis900_probe()
478 ret = -ENOMEM; in sis900_probe()
483 sis_priv->ioaddr = ioaddr; in sis900_probe()
484 sis_priv->pci_dev = pci_dev; in sis900_probe()
485 spin_lock_init(&sis_priv->lock); in sis900_probe()
487 sis_priv->eeprom_size = 24; in sis900_probe()
491 ring_space = dma_alloc_coherent(&pci_dev->dev, TX_TOTAL_SIZE, in sis900_probe()
494 ret = -ENOMEM; in sis900_probe()
497 sis_priv->tx_ring = ring_space; in sis900_probe()
498 sis_priv->tx_ring_dma = ring_dma; in sis900_probe()
500 ring_space = dma_alloc_coherent(&pci_dev->dev, RX_TOTAL_SIZE, in sis900_probe()
503 ret = -ENOMEM; in sis900_probe()
506 sis_priv->rx_ring = ring_space; in sis900_probe()
507 sis_priv->rx_ring_dma = ring_dma; in sis900_probe()
509 /* The SiS900-specific entries in the device structure. */ in sis900_probe()
510 net_dev->netdev_ops = &sis900_netdev_ops; in sis900_probe()
511 net_dev->watchdog_timeo = TX_TIMEOUT; in sis900_probe()
512 net_dev->ethtool_ops = &sis900_ethtool_ops; in sis900_probe()
515 sis_priv->msg_enable = sis900_debug; in sis900_probe()
517 sis_priv->msg_enable = SIS900_DEF_MSG; in sis900_probe()
519 sis_priv->mii_info.dev = net_dev; in sis900_probe()
520 sis_priv->mii_info.mdio_read = mdio_read; in sis900_probe()
521 sis_priv->mii_info.mdio_write = mdio_write; in sis900_probe()
522 sis_priv->mii_info.phy_id_mask = 0x1f; in sis900_probe()
523 sis_priv->mii_info.reg_num_mask = 0x1f; in sis900_probe()
526 sis_priv->chipset_rev = pci_dev->revision; in sis900_probe()
530 dev_name, sis_priv->chipset_rev); in sis900_probe()
533 if (sis_priv->chipset_rev == SIS630E_900_REV) in sis900_probe()
535 else if ((sis_priv->chipset_rev > 0x81) && (sis_priv->chipset_rev <= 0x90) ) in sis900_probe()
537 else if (sis_priv->chipset_rev == SIS96x_900_REV) in sis900_probe()
542 if (!ret || !is_valid_ether_addr(net_dev->dev_addr)) { in sis900_probe()
548 /* 630ET : set the mii access mode as software-mode */ in sis900_probe()
549 if (sis_priv->chipset_rev == SIS630ET_900_REV) in sis900_probe()
552 /* probe for mii transceiver */ in sis900_probe()
554 printk(KERN_WARNING "%s: Error probing MII device.\n", in sis900_probe()
556 ret = -ENODEV; in sis900_probe()
563 sis_priv->host_bridge_rev = dev->revision; in sis900_probe()
573 net_dev->name, card_name, ioaddr, pci_dev->irq, in sis900_probe()
574 net_dev->dev_addr); in sis900_probe()
579 printk(KERN_INFO "%s: Wake on LAN only available from suspend to RAM.", net_dev->name); in sis900_probe()
584 dma_free_coherent(&pci_dev->dev, RX_TOTAL_SIZE, sis_priv->rx_ring, in sis900_probe()
585 sis_priv->rx_ring_dma); in sis900_probe()
587 dma_free_coherent(&pci_dev->dev, TX_TOTAL_SIZE, sis_priv->tx_ring, in sis900_probe()
588 sis_priv->tx_ring_dma); in sis900_probe()
597 * sis900_mii_probe - Probe MII PHY for sis900
600 * Search for total of 32 possible mii phy addresses.
608 const char *dev_name = pci_name(sis_priv->pci_dev); in sis900_mii_probe()
613 sis_priv->mii = NULL; in sis900_mii_probe()
615 /* search for total of 32 possible mii phy addresses */ in sis900_mii_probe()
627 printk(KERN_DEBUG "%s: MII at address %d" in sis900_mii_probe()
634 mii_phy = sis_priv->first_mii; in sis900_mii_probe()
638 mii_phy = mii_phy->next; in sis900_mii_probe()
644 mii_phy->phy_id0 = mdio_read(net_dev, phy_addr, MII_PHY_ID0); in sis900_mii_probe()
645 mii_phy->phy_id1 = mdio_read(net_dev, phy_addr, MII_PHY_ID1); in sis900_mii_probe()
646 mii_phy->phy_addr = phy_addr; in sis900_mii_probe()
647 mii_phy->status = mii_status; in sis900_mii_probe()
648 mii_phy->next = sis_priv->mii; in sis900_mii_probe()
649 sis_priv->mii = mii_phy; in sis900_mii_probe()
650 sis_priv->first_mii = mii_phy; in sis900_mii_probe()
653 if ((mii_phy->phy_id0 == mii_chip_table[i].phy_id0 ) && in sis900_mii_probe()
654 ((mii_phy->phy_id1 & 0xFFF0) == mii_chip_table[i].phy_id1)){ in sis900_mii_probe()
655 mii_phy->phy_types = mii_chip_table[i].phy_types; in sis900_mii_probe()
657 mii_phy->phy_types = in sis900_mii_probe()
670 mii_phy->phy_types = UNKNOWN; in sis900_mii_probe()
674 if (sis_priv->mii == NULL) { in sis900_mii_probe()
675 printk(KERN_INFO "%s: No MII transceivers found!\n", dev_name); in sis900_mii_probe()
680 sis_priv->mii = NULL; in sis900_mii_probe()
684 if ((sis_priv->mii->phy_id0 == 0x001D) && in sis900_mii_probe()
685 ((sis_priv->mii->phy_id1&0xFFF0) == 0x8000)) in sis900_mii_probe()
686 status = sis900_reset_phy(net_dev, sis_priv->cur_phy); in sis900_mii_probe()
689 if ((sis_priv->mii->phy_id0 == 0x0015) && in sis900_mii_probe()
690 ((sis_priv->mii->phy_id1&0xFFF0) == 0xF440)) in sis900_mii_probe()
691 mdio_write(net_dev, sis_priv->cur_phy, 0x0018, 0xD200); in sis900_mii_probe()
697 poll_bit ^= (mdio_read(net_dev, sis_priv->cur_phy, MII_STATUS) & poll_bit); in sis900_mii_probe()
701 return -ETIME; in sis900_mii_probe()
706 if (sis_priv->chipset_rev == SIS630E_900_REV) { in sis900_mii_probe()
708 mdio_write(net_dev, sis_priv->cur_phy, MII_ANADV, 0x05e1); in sis900_mii_probe()
709 mdio_write(net_dev, sis_priv->cur_phy, MII_CONFIG1, 0x22); in sis900_mii_probe()
710 mdio_write(net_dev, sis_priv->cur_phy, MII_CONFIG2, 0xff00); in sis900_mii_probe()
711 mdio_write(net_dev, sis_priv->cur_phy, MII_MASK, 0xffc0); in sis900_mii_probe()
712 //mdio_write(net_dev, sis_priv->cur_phy, MII_CONTROL, 0x1000); in sis900_mii_probe()
715 if (sis_priv->mii->status & MII_STAT_LINK) in sis900_mii_probe()
724 * sis900_default_phy - Select default PHY for sis900 mac.
739 for (phy=sis_priv->first_mii; phy; phy=phy->next) { in sis900_default_phy()
740 status = mdio_read(net_dev, phy->phy_addr, MII_STATUS); in sis900_default_phy()
741 status = mdio_read(net_dev, phy->phy_addr, MII_STATUS); in sis900_default_phy()
745 (phy->phy_types != UNKNOWN)) { in sis900_default_phy()
748 status = mdio_read(net_dev, phy->phy_addr, MII_CONTROL); in sis900_default_phy()
749 mdio_write(net_dev, phy->phy_addr, MII_CONTROL, in sis900_default_phy()
751 if (phy->phy_types == HOME) in sis900_default_phy()
753 else if(phy->phy_types == LAN) in sis900_default_phy()
763 default_phy = sis_priv->first_mii; in sis900_default_phy()
765 if (sis_priv->mii != default_phy) { in sis900_default_phy()
766 sis_priv->mii = default_phy; in sis900_default_phy()
767 sis_priv->cur_phy = default_phy->phy_addr; in sis900_default_phy()
769 pci_name(sis_priv->pci_dev), sis_priv->cur_phy); in sis900_default_phy()
772 sis_priv->mii_info.phy_id = sis_priv->cur_phy; in sis900_default_phy()
774 status = mdio_read(net_dev, sis_priv->cur_phy, MII_CONTROL); in sis900_default_phy()
777 mdio_write(net_dev, sis_priv->cur_phy, MII_CONTROL, status); in sis900_default_phy()
778 status = mdio_read(net_dev, sis_priv->cur_phy, MII_STATUS); in sis900_default_phy()
779 status = mdio_read(net_dev, sis_priv->cur_phy, MII_STATUS); in sis900_default_phy()
786 * sis900_set_capability - set the media capability of network adapter.
791 * mii status register. It's necessary before auto-negotiate.
798 mdio_read(net_dev, phy->phy_addr, MII_STATUS); in sis900_set_capability()
799 mdio_read(net_dev, phy->phy_addr, MII_STATUS); in sis900_set_capability()
802 ((phy->status & MII_STAT_CAN_TX_FDX)? MII_NWAY_TX_FDX:0) | in sis900_set_capability()
803 ((phy->status & MII_STAT_CAN_TX) ? MII_NWAY_TX:0) | in sis900_set_capability()
804 ((phy->status & MII_STAT_CAN_T_FDX) ? MII_NWAY_T_FDX:0)| in sis900_set_capability()
805 ((phy->status & MII_STAT_CAN_T) ? MII_NWAY_T:0); in sis900_set_capability()
807 mdio_write(net_dev, phy->phy_addr, MII_ANADV, cap); in sis900_set_capability()
815 * read_eeprom - Read Serial EEPROM
835 for (i = 8; i >= 0; i--) { in read_eeprom()
846 /* read the 16-bits data in */ in read_eeprom()
847 for (i = 16; i > 0; i--) { in read_eeprom()
863 /* Read and write the MII management registers using software-generated
870 void __iomem *ioaddr = sp->ioaddr; in mdio_idle()
877 /* Synchronize the MII management interface by shifting 32 one bits out. */
880 void __iomem *ioaddr = sp->ioaddr; in mdio_reset()
883 for (i = 31; i >= 0; i--) { in mdio_reset()
892 * mdio_read - read MII PHY register
897 * Read MII registers through MDIO and MDC
906 void __iomem *ioaddr = sp->ioaddr; in mdio_read()
913 for (i = 15; i >= 0; i--) { in mdio_read()
923 for (i = 16; i > 0; i--) { in mdio_read()
936 * mdio_write - write MII PHY register
942 * Write MII registers with @value through MDIO and MDC
952 void __iomem *ioaddr = sp->ioaddr; in mdio_write()
959 for (i = 15; i >= 0; i--) { in mdio_write()
970 for (i = 15; i >= 0; i--) { in mdio_write()
981 for (i = 2; i > 0; i--) { in mdio_write()
992 * sis900_reset_phy - reset sis900 mii phy.
1016 * Polling 'interrupt' - used by things like netconsole to send skbs
1017 * without having to re-enable interrupts. It's not called while
1023 const int irq = sp->pci_dev->irq; in sis900_poll()
1032 * sis900_open - open sis900 device
1043 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_open()
1050 sis630_set_eq(net_dev, sis_priv->chipset_rev); in sis900_open()
1052 ret = request_irq(sis_priv->pci_dev->irq, sis900_interrupt, IRQF_SHARED, in sis900_open()
1053 net_dev->name, net_dev); in sis900_open()
1074 sis900_check_mode(net_dev, sis_priv->mii); in sis900_open()
1078 timer_setup(&sis_priv->timer, sis900_timer, 0); in sis900_open()
1079 sis_priv->timer.expires = jiffies + HZ; in sis900_open()
1080 add_timer(&sis_priv->timer); in sis900_open()
1086 * sis900_init_rxfilter - Initialize the Rx filter
1097 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_init_rxfilter()
1108 u32 w = (u32) *((const u16 *)(net_dev->dev_addr)+i); in sis900_init_rxfilter()
1115 net_dev->name, i, sr32(rfdr)); in sis900_init_rxfilter()
1124 * sis900_init_tx_ring - Initialize the Tx descriptor ring
1134 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_init_tx_ring()
1137 sis_priv->tx_full = 0; in sis900_init_tx_ring()
1138 sis_priv->dirty_tx = sis_priv->cur_tx = 0; in sis900_init_tx_ring()
1141 sis_priv->tx_skbuff[i] = NULL; in sis900_init_tx_ring()
1143 sis_priv->tx_ring[i].link = sis_priv->tx_ring_dma + in sis900_init_tx_ring()
1145 sis_priv->tx_ring[i].cmdsts = 0; in sis900_init_tx_ring()
1146 sis_priv->tx_ring[i].bufptr = 0; in sis900_init_tx_ring()
1150 sw32(txdp, sis_priv->tx_ring_dma); in sis900_init_tx_ring()
1153 net_dev->name, sr32(txdp)); in sis900_init_tx_ring()
1157 * sis900_init_rx_ring - Initialize the Rx descriptor ring
1161 * and pre-allocate receive buffers (socket buffer)
1168 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_init_rx_ring()
1171 sis_priv->cur_rx = 0; in sis900_init_rx_ring()
1172 sis_priv->dirty_rx = 0; in sis900_init_rx_ring()
1176 sis_priv->rx_skbuff[i] = NULL; in sis900_init_rx_ring()
1178 sis_priv->rx_ring[i].link = sis_priv->rx_ring_dma + in sis900_init_rx_ring()
1180 sis_priv->rx_ring[i].cmdsts = 0; in sis900_init_rx_ring()
1181 sis_priv->rx_ring[i].bufptr = 0; in sis900_init_rx_ring()
1195 sis_priv->rx_skbuff[i] = skb; in sis900_init_rx_ring()
1196 sis_priv->rx_ring[i].cmdsts = RX_BUF_SIZE; in sis900_init_rx_ring()
1197 sis_priv->rx_ring[i].bufptr = dma_map_single(&sis_priv->pci_dev->dev, in sis900_init_rx_ring()
1198 skb->data, in sis900_init_rx_ring()
1201 if (unlikely(dma_mapping_error(&sis_priv->pci_dev->dev, in sis900_init_rx_ring()
1202 sis_priv->rx_ring[i].bufptr))) { in sis900_init_rx_ring()
1204 sis_priv->rx_skbuff[i] = NULL; in sis900_init_rx_ring()
1208 sis_priv->dirty_rx = (unsigned int) (i - NUM_RX_DESC); in sis900_init_rx_ring()
1211 sw32(rxdp, sis_priv->rx_ring_dma); in sis900_init_rx_ring()
1214 net_dev->name, sr32(rxdp)); in sis900_init_rx_ring()
1218 * sis630_set_eq - set phy equalizer value for 630 LAN
1224 * Bit 14: 0 -- Automatically detect (default)
1225 * 1 -- Manually set Equalizer filter
1226 * Bit 13: 0 -- (Default)
1227 * 1 -- Speed up convergence of equalizer setting
1228 * Bit 9 : 0 -- (Default)
1229 * 1 -- Disable Baseline Wander
1230 * Bit 3~7 -- Equalizer filter setting
1236 * When Link is ON and Bit 14 is 0, SIS900PHY will auto-detect proper equalizer value.
1239 * 0 <= max <= 4 --> set equalizer to max
1240 * 5 <= max <= 14 --> set equalizer to max+1 or set equalizer to max+2 if max == min
1241 * max >= 15 --> set equalizer to max+5 or set equalizer to max+6 if max == min
1255 reg14h = mdio_read(net_dev, sis_priv->cur_phy, MII_RESV); in sis630_set_eq()
1256 mdio_write(net_dev, sis_priv->cur_phy, MII_RESV, in sis630_set_eq()
1260 sis_priv->cur_phy, MII_RESV)) >> 3; in sis630_set_eq()
1282 (sis_priv->host_bridge_rev == SIS630B0 || in sis630_set_eq()
1283 sis_priv->host_bridge_rev == SIS630B1)) { in sis630_set_eq()
1290 reg14h = mdio_read(net_dev, sis_priv->cur_phy, MII_RESV); in sis630_set_eq()
1293 mdio_write(net_dev, sis_priv->cur_phy, MII_RESV, reg14h); in sis630_set_eq()
1295 reg14h = mdio_read(net_dev, sis_priv->cur_phy, MII_RESV); in sis630_set_eq()
1297 (sis_priv->host_bridge_rev == SIS630B0 || in sis630_set_eq()
1298 sis_priv->host_bridge_rev == SIS630B1)) in sis630_set_eq()
1299 mdio_write(net_dev, sis_priv->cur_phy, MII_RESV, in sis630_set_eq()
1302 mdio_write(net_dev, sis_priv->cur_phy, MII_RESV, in sis630_set_eq()
1308 * sis900_timer - sis900 timer routine
1319 struct net_device *net_dev = sis_priv->mii_info.dev; in sis900_timer()
1320 struct mii_phy *mii_phy = sis_priv->mii; in sis900_timer()
1325 status = mdio_read(net_dev, sis_priv->cur_phy, MII_STATUS); in sis900_timer()
1326 status = mdio_read(net_dev, sis_priv->cur_phy, MII_STATUS); in sis900_timer()
1328 /* Link OFF -> ON */ in sis900_timer()
1333 mii_phy = sis_priv->mii; in sis900_timer()
1341 sis630_set_eq(net_dev, sis_priv->chipset_rev); in sis900_timer()
1346 /* Link ON -> OFF */ in sis900_timer()
1350 printk(KERN_INFO "%s: Media Link Off\n", net_dev->name); in sis900_timer()
1353 if ((mii_phy->phy_id0 == 0x001D) && in sis900_timer()
1354 ((mii_phy->phy_id1 & 0xFFF0) == 0x8000)) in sis900_timer()
1355 sis900_reset_phy(net_dev, sis_priv->cur_phy); in sis900_timer()
1357 sis630_set_eq(net_dev, sis_priv->chipset_rev); in sis900_timer()
1363 sis_priv->timer.expires = jiffies + next_tick; in sis900_timer()
1364 add_timer(&sis_priv->timer); in sis900_timer()
1368 * sis900_check_mode - check the media mode for sis900
1370 * @mii_phy: the mii phy
1372 * Older driver gets the media mode from mii status output
1373 * register. Now we set our media capability and auto-negotiate
1375 * If the types of mii phy is HOME, it doesn't need to auto-negotiate
1382 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_check_mode()
1385 if (mii_phy->phy_types == LAN) { in sis900_check_mode()
1388 sis900_auto_negotiate(net_dev, sis_priv->cur_phy); in sis900_check_mode()
1394 sis_priv->autong_complete = 1; in sis900_check_mode()
1399 * sis900_set_mode - Set the media mode of mac register.
1413 void __iomem *ioaddr = sp->ioaddr; in sis900_set_mode()
1449 * sis900_auto_negotiate - Set the Auto-Negotiation Enable/Reset bit.
1451 * @phy_addr: mii phy address
1453 * If the adapter is link-on, set the auto-negotiate enable/reset bit.
1454 * autong_complete should be set to 0 when starting auto-negotiation.
1455 * autong_complete should be set to 1 if we didn't start auto-negotiation.
1470 printk(KERN_INFO "%s: Media Link Off\n", net_dev->name); in sis900_auto_negotiate()
1471 sis_priv->autong_complete = 1; in sis900_auto_negotiate()
1479 sis_priv->autong_complete = 0; in sis900_auto_negotiate()
1484 * sis900_read_mode - read media mode for sis900 internal phy
1489 * The capability of remote end will be put in mii register autorec
1490 * after auto-negotiation. Use AND operation to get the upper bound
1497 struct mii_phy *phy = sis_priv->mii; in sis900_read_mode()
1498 int phy_addr = sis_priv->cur_phy; in sis900_read_mode()
1522 sis_priv->autong_complete = 1; in sis900_read_mode()
1525 if ((phy->phy_id0 == 0x0000) && ((phy->phy_id1 & 0xFFF0) == 0x8200)) { in sis900_read_mode()
1533 printk(KERN_INFO "%s: Media Link On %s %s-duplex\n", in sis900_read_mode()
1534 net_dev->name, in sis900_read_mode()
1542 * sis900_tx_timeout - sis900 transmit timeout routine
1553 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_tx_timeout()
1559 net_dev->name, sr32(cr), sr32(isr)); in sis900_tx_timeout()
1566 spin_lock_irqsave(&sis_priv->lock, flags); in sis900_tx_timeout()
1569 sis_priv->dirty_tx = sis_priv->cur_tx = 0; in sis900_tx_timeout()
1571 struct sk_buff *skb = sis_priv->tx_skbuff[i]; in sis900_tx_timeout()
1574 dma_unmap_single(&sis_priv->pci_dev->dev, in sis900_tx_timeout()
1575 sis_priv->tx_ring[i].bufptr, in sis900_tx_timeout()
1576 skb->len, DMA_TO_DEVICE); in sis900_tx_timeout()
1578 sis_priv->tx_skbuff[i] = NULL; in sis900_tx_timeout()
1579 sis_priv->tx_ring[i].cmdsts = 0; in sis900_tx_timeout()
1580 sis_priv->tx_ring[i].bufptr = 0; in sis900_tx_timeout()
1581 net_dev->stats.tx_dropped++; in sis900_tx_timeout()
1584 sis_priv->tx_full = 0; in sis900_tx_timeout()
1587 spin_unlock_irqrestore(&sis_priv->lock, flags); in sis900_tx_timeout()
1592 sw32(txdp, sis_priv->tx_ring_dma); in sis900_tx_timeout()
1599 * sis900_start_xmit - sis900 start transmit routine
1612 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_start_xmit()
1618 spin_lock_irqsave(&sis_priv->lock, flags); in sis900_start_xmit()
1621 entry = sis_priv->cur_tx % NUM_TX_DESC; in sis900_start_xmit()
1622 sis_priv->tx_skbuff[entry] = skb; in sis900_start_xmit()
1625 sis_priv->tx_ring[entry].bufptr = dma_map_single(&sis_priv->pci_dev->dev, in sis900_start_xmit()
1626 skb->data, skb->len, in sis900_start_xmit()
1628 if (unlikely(dma_mapping_error(&sis_priv->pci_dev->dev, in sis900_start_xmit()
1629 sis_priv->tx_ring[entry].bufptr))) { in sis900_start_xmit()
1631 sis_priv->tx_skbuff[entry] = NULL; in sis900_start_xmit()
1632 net_dev->stats.tx_dropped++; in sis900_start_xmit()
1633 spin_unlock_irqrestore(&sis_priv->lock, flags); in sis900_start_xmit()
1636 sis_priv->tx_ring[entry].cmdsts = (OWN | INTR | skb->len); in sis900_start_xmit()
1639 sis_priv->cur_tx ++; in sis900_start_xmit()
1640 index_cur_tx = sis_priv->cur_tx; in sis900_start_xmit()
1641 index_dirty_tx = sis_priv->dirty_tx; in sis900_start_xmit()
1648 sis_priv->tx_full = 1; in sis900_start_xmit()
1655 sis_priv->tx_full = 1; in sis900_start_xmit()
1659 spin_unlock_irqrestore(&sis_priv->lock, flags); in sis900_start_xmit()
1664 net_dev->name, skb->data, (int)skb->len, entry); in sis900_start_xmit()
1670 * sis900_interrupt - sis900 interrupt handler
1683 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_interrupt()
1687 spin_lock (&sis_priv->lock); in sis900_interrupt()
1697 /* why dow't we break after Tx/Rx case ?? keyword: full-duplex */ in sis900_interrupt()
1710 "status %#8.8x.\n", net_dev->name, status); in sis900_interrupt()
1713 if (--boguscnt < 0) { in sis900_interrupt()
1717 net_dev->name, status); in sis900_interrupt()
1725 net_dev->name, sr32(isr)); in sis900_interrupt()
1727 spin_unlock (&sis_priv->lock); in sis900_interrupt()
1732 * sis900_rx - sis900 receive routine
1744 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_rx()
1745 unsigned int entry = sis_priv->cur_rx % NUM_RX_DESC; in sis900_rx()
1746 u32 rx_status = sis_priv->rx_ring[entry].cmdsts; in sis900_rx()
1752 sis_priv->cur_rx, sis_priv->dirty_rx, rx_status); in sis900_rx()
1753 rx_work_limit = sis_priv->dirty_rx + NUM_RX_DESC - sis_priv->cur_rx; in sis900_rx()
1759 if (--rx_work_limit < 0) in sis900_rx()
1763 rx_size = data_size - CRC_SIZE; in sis900_rx()
1776 net_dev->name, rx_status, data_size); in sis900_rx()
1777 net_dev->stats.rx_errors++; in sis900_rx()
1779 net_dev->stats.rx_over_errors++; in sis900_rx()
1781 net_dev->stats.rx_length_errors++; in sis900_rx()
1783 net_dev->stats.rx_frame_errors++; in sis900_rx()
1785 net_dev->stats.rx_crc_errors++; in sis900_rx()
1787 sis_priv->rx_ring[entry].cmdsts = RX_BUF_SIZE; in sis900_rx()
1792 dma_unmap_single(&sis_priv->pci_dev->dev, in sis900_rx()
1793 sis_priv->rx_ring[entry].bufptr, in sis900_rx()
1805 skb = sis_priv->rx_skbuff[entry]; in sis900_rx()
1806 net_dev->stats.rx_dropped++; in sis900_rx()
1812 we are working on NULL sk_buff :-( */ in sis900_rx()
1813 if (sis_priv->rx_skbuff[entry] == NULL) { in sis900_rx()
1818 net_dev->name, sis_priv->cur_rx, in sis900_rx()
1819 sis_priv->dirty_rx); in sis900_rx()
1825 rx_skb = sis_priv->rx_skbuff[entry]; in sis900_rx()
1827 rx_skb->protocol = eth_type_trans(rx_skb, net_dev); in sis900_rx()
1832 net_dev->stats.multicast++; in sis900_rx()
1833 net_dev->stats.rx_bytes += rx_size; in sis900_rx()
1834 net_dev->stats.rx_packets++; in sis900_rx()
1835 sis_priv->dirty_rx++; in sis900_rx()
1837 sis_priv->rx_skbuff[entry] = skb; in sis900_rx()
1838 sis_priv->rx_ring[entry].cmdsts = RX_BUF_SIZE; in sis900_rx()
1839 sis_priv->rx_ring[entry].bufptr = in sis900_rx()
1840 dma_map_single(&sis_priv->pci_dev->dev, in sis900_rx()
1841 skb->data, RX_BUF_SIZE, in sis900_rx()
1843 if (unlikely(dma_mapping_error(&sis_priv->pci_dev->dev, in sis900_rx()
1844 sis_priv->rx_ring[entry].bufptr))) { in sis900_rx()
1846 sis_priv->rx_skbuff[entry] = NULL; in sis900_rx()
1850 sis_priv->cur_rx++; in sis900_rx()
1851 entry = sis_priv->cur_rx % NUM_RX_DESC; in sis900_rx()
1852 rx_status = sis_priv->rx_ring[entry].cmdsts; in sis900_rx()
1857 for (; sis_priv->cur_rx != sis_priv->dirty_rx; sis_priv->dirty_rx++) { in sis900_rx()
1860 entry = sis_priv->dirty_rx % NUM_RX_DESC; in sis900_rx()
1862 if (sis_priv->rx_skbuff[entry] == NULL) { in sis900_rx()
1869 net_dev->stats.rx_dropped++; in sis900_rx()
1872 sis_priv->rx_skbuff[entry] = skb; in sis900_rx()
1873 sis_priv->rx_ring[entry].cmdsts = RX_BUF_SIZE; in sis900_rx()
1874 sis_priv->rx_ring[entry].bufptr = in sis900_rx()
1875 dma_map_single(&sis_priv->pci_dev->dev, in sis900_rx()
1876 skb->data, RX_BUF_SIZE, in sis900_rx()
1878 if (unlikely(dma_mapping_error(&sis_priv->pci_dev->dev, in sis900_rx()
1879 sis_priv->rx_ring[entry].bufptr))) { in sis900_rx()
1881 sis_priv->rx_skbuff[entry] = NULL; in sis900_rx()
1886 /* re-enable the potentially idle receive state matchine */ in sis900_rx()
1893 * sis900_finish_xmit - finish up transmission of packets
1906 for (; sis_priv->dirty_tx != sis_priv->cur_tx; sis_priv->dirty_tx++) { in sis900_finish_xmit()
1911 entry = sis_priv->dirty_tx % NUM_TX_DESC; in sis900_finish_xmit()
1912 tx_status = sis_priv->tx_ring[entry].cmdsts; in sis900_finish_xmit()
1926 net_dev->name, tx_status); in sis900_finish_xmit()
1927 net_dev->stats.tx_errors++; in sis900_finish_xmit()
1929 net_dev->stats.tx_fifo_errors++; in sis900_finish_xmit()
1931 net_dev->stats.tx_aborted_errors++; in sis900_finish_xmit()
1933 net_dev->stats.tx_carrier_errors++; in sis900_finish_xmit()
1935 net_dev->stats.tx_window_errors++; in sis900_finish_xmit()
1938 net_dev->stats.collisions += (tx_status & COLCNT) >> 16; in sis900_finish_xmit()
1939 net_dev->stats.tx_bytes += tx_status & DSIZE; in sis900_finish_xmit()
1940 net_dev->stats.tx_packets++; in sis900_finish_xmit()
1943 skb = sis_priv->tx_skbuff[entry]; in sis900_finish_xmit()
1944 dma_unmap_single(&sis_priv->pci_dev->dev, in sis900_finish_xmit()
1945 sis_priv->tx_ring[entry].bufptr, skb->len, in sis900_finish_xmit()
1948 sis_priv->tx_skbuff[entry] = NULL; in sis900_finish_xmit()
1949 sis_priv->tx_ring[entry].bufptr = 0; in sis900_finish_xmit()
1950 sis_priv->tx_ring[entry].cmdsts = 0; in sis900_finish_xmit()
1953 if (sis_priv->tx_full && netif_queue_stopped(net_dev) && in sis900_finish_xmit()
1954 sis_priv->cur_tx - sis_priv->dirty_tx < NUM_TX_DESC - 4) { in sis900_finish_xmit()
1957 sis_priv->tx_full = 0; in sis900_finish_xmit()
1963 * sis900_close - close sis900 device
1973 struct pci_dev *pdev = sis_priv->pci_dev; in sis900_close()
1974 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_close()
1987 timer_delete(&sis_priv->timer); in sis900_close()
1989 free_irq(pdev->irq, net_dev); in sis900_close()
1993 skb = sis_priv->rx_skbuff[i]; in sis900_close()
1995 dma_unmap_single(&pdev->dev, in sis900_close()
1996 sis_priv->rx_ring[i].bufptr, in sis900_close()
1999 sis_priv->rx_skbuff[i] = NULL; in sis900_close()
2003 skb = sis_priv->tx_skbuff[i]; in sis900_close()
2005 dma_unmap_single(&pdev->dev, in sis900_close()
2006 sis_priv->tx_ring[i].bufptr, in sis900_close()
2007 skb->len, DMA_TO_DEVICE); in sis900_close()
2009 sis_priv->tx_skbuff[i] = NULL; in sis900_close()
2013 /* Green! Put the chip in low-power mode. */ in sis900_close()
2019 * sis900_get_drvinfo - Return information about driver
2023 * Process ethtool command such as "ehtool -i" to show information
2031 strscpy(info->driver, SIS900_MODULE_NAME, sizeof(info->driver)); in sis900_get_drvinfo()
2032 strscpy(info->version, SIS900_DRV_VERSION, sizeof(info->version)); in sis900_get_drvinfo()
2033 strscpy(info->bus_info, pci_name(sis_priv->pci_dev), in sis900_get_drvinfo()
2034 sizeof(info->bus_info)); in sis900_get_drvinfo()
2040 return sis_priv->msg_enable; in sis900_get_msglevel()
2046 sis_priv->msg_enable = value; in sis900_set_msglevel()
2052 return mii_link_ok(&sis_priv->mii_info); in sis900_get_link()
2059 spin_lock_irq(&sis_priv->lock); in sis900_get_link_ksettings()
2060 mii_ethtool_get_link_ksettings(&sis_priv->mii_info, cmd); in sis900_get_link_ksettings()
2061 spin_unlock_irq(&sis_priv->lock); in sis900_get_link_ksettings()
2070 spin_lock_irq(&sis_priv->lock); in sis900_set_link_ksettings()
2071 rt = mii_ethtool_set_link_ksettings(&sis_priv->mii_info, cmd); in sis900_set_link_ksettings()
2072 spin_unlock_irq(&sis_priv->lock); in sis900_set_link_ksettings()
2079 return mii_nway_restart(&sis_priv->mii_info); in sis900_nway_reset()
2083 * sis900_set_wol - Set up Wake on Lan registers
2096 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_set_wol()
2099 if (wol->wolopts == 0) { in sis900_set_wol()
2100 pci_read_config_dword(sis_priv->pci_dev, CFGPMCSR, &cfgpmcsr); in sis900_set_wol()
2102 pci_write_config_dword(sis_priv->pci_dev, CFGPMCSR, cfgpmcsr); in sis900_set_wol()
2105 printk(KERN_DEBUG "%s: Wake on LAN disabled\n", net_dev->name); in sis900_set_wol()
2109 if (wol->wolopts & (WAKE_MAGICSECURE | WAKE_UCAST | WAKE_MCAST in sis900_set_wol()
2111 return -EINVAL; in sis900_set_wol()
2113 if (wol->wolopts & WAKE_MAGIC) in sis900_set_wol()
2115 if (wol->wolopts & WAKE_PHY) in sis900_set_wol()
2120 pci_read_config_dword(sis_priv->pci_dev, CFGPMCSR, &cfgpmcsr); in sis900_set_wol()
2122 pci_write_config_dword(sis_priv->pci_dev, CFGPMCSR, cfgpmcsr); in sis900_set_wol()
2124 printk(KERN_DEBUG "%s: Wake on LAN enabled\n", net_dev->name); in sis900_set_wol()
2132 void __iomem *ioaddr = sp->ioaddr; in sis900_get_wol()
2137 wol->wolopts |= WAKE_MAGIC; in sis900_get_wol()
2139 wol->wolopts |= WAKE_PHY; in sis900_get_wol()
2141 wol->supported = (WAKE_PHY | WAKE_MAGIC); in sis900_get_wol()
2148 return sis_priv->eeprom_size; in sis900_get_eeprom_len()
2154 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_read_eeprom()
2155 int wait, ret = -EAGAIN; in sis900_read_eeprom()
2160 if (sis_priv->chipset_rev == SIS96x_900_REV) { in sis900_read_eeprom()
2165 for (i = 0; i < sis_priv->eeprom_size / 2; i++) in sis900_read_eeprom()
2177 for (i = 0; i < sis_priv->eeprom_size / 2; i++) in sis900_read_eeprom()
2192 eebuf = kmalloc(sis_priv->eeprom_size, GFP_KERNEL); in sis900_get_eeprom()
2194 return -ENOMEM; in sis900_get_eeprom()
2196 eeprom->magic = SIS900_EEPROM_MAGIC; in sis900_get_eeprom()
2197 spin_lock_irq(&sis_priv->lock); in sis900_get_eeprom()
2199 spin_unlock_irq(&sis_priv->lock); in sis900_get_eeprom()
2201 memcpy(data, eebuf + eeprom->offset, eeprom->len); in sis900_get_eeprom()
2221 * mii_ioctl - process MII i/o control command
2226 * Process MII command like read/write MII register
2235 case SIOCGMIIPHY: /* Get address of MII PHY in use. */ in mii_ioctl()
2236 data->phy_id = sis_priv->mii->phy_addr; in mii_ioctl()
2239 case SIOCGMIIREG: /* Read MII PHY register. */ in mii_ioctl()
2240 data->val_out = mdio_read(net_dev, data->phy_id & 0x1f, data->reg_num & 0x1f); in mii_ioctl()
2243 case SIOCSMIIREG: /* Write MII PHY register. */ in mii_ioctl()
2244 mdio_write(net_dev, data->phy_id & 0x1f, data->reg_num & 0x1f, data->val_in); in mii_ioctl()
2247 return -EOPNOTSUPP; in mii_ioctl()
2252 * sis900_set_config - Set media type by net_device.set_config
2264 struct mii_phy *mii_phy = sis_priv->mii; in sis900_set_config()
2268 if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) { in sis900_set_config()
2269 /* we switch on the ifmap->port field. I couldn't find anything in sis900_set_config()
2275 switch(map->port){ in sis900_set_config()
2277 WRITE_ONCE(dev->if_port, map->port); in sis900_set_config()
2286 status = mdio_read(dev, mii_phy->phy_addr, MII_CONTROL); in sis900_set_config()
2292 mdio_write(dev, mii_phy->phy_addr, in sis900_set_config()
2298 WRITE_ONCE(dev->if_port, map->port); in sis900_set_config()
2309 status = mdio_read(dev, mii_phy->phy_addr, MII_CONTROL); in sis900_set_config()
2312 mdio_write(dev, mii_phy->phy_addr, in sis900_set_config()
2319 WRITE_ONCE(dev->if_port, map->port); in sis900_set_config()
2330 status = mdio_read(dev, mii_phy->phy_addr, MII_CONTROL); in sis900_set_config()
2331 mdio_write(dev, mii_phy->phy_addr, in sis900_set_config()
2341 return -EOPNOTSUPP; in sis900_set_config()
2344 return -EINVAL; in sis900_set_config()
2351 * sis900_mcast_bitnr - compute hashtable index
2374 * set_rx_mode - Set SiS900 receive mode
2385 void __iomem *ioaddr = sis_priv->ioaddr; in set_rx_mode()
2391 if((sis_priv->chipset_rev >= SIS635A_900_REV) || in set_rx_mode()
2392 (sis_priv->chipset_rev == SIS900B_900_REV)) in set_rx_mode()
2397 if (net_dev->flags & IFF_PROMISC) { in set_rx_mode()
2403 (net_dev->flags & IFF_ALLMULTI)) { in set_rx_mode()
2418 bit_nr = sis900_mcast_bitnr(ha->addr, in set_rx_mode()
2419 sis_priv->chipset_rev); in set_rx_mode()
2435 if (net_dev->flags & IFF_LOOPBACK) { in set_rx_mode()
2449 * sis900_reset - Reset sis900 MAC
2460 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_reset()
2474 if (sis_priv->chipset_rev >= SIS635A_900_REV || in sis900_reset()
2475 sis_priv->chipset_rev == SIS900B_900_REV) in sis900_reset()
2482 * sis900_remove - Remove sis900 device
2495 while (sis_priv->first_mii) { in sis900_remove()
2496 struct mii_phy *phy = sis_priv->first_mii; in sis900_remove()
2498 sis_priv->first_mii = phy->next; in sis900_remove()
2502 dma_free_coherent(&pci_dev->dev, RX_TOTAL_SIZE, sis_priv->rx_ring, in sis900_remove()
2503 sis_priv->rx_ring_dma); in sis900_remove()
2504 dma_free_coherent(&pci_dev->dev, TX_TOTAL_SIZE, sis_priv->tx_ring, in sis900_remove()
2505 sis_priv->tx_ring_dma); in sis900_remove()
2506 pci_iounmap(pci_dev, sis_priv->ioaddr); in sis900_remove()
2514 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_suspend()
2532 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_resume()
2555 sis900_check_mode(net_dev, sis_priv->mii); in sis900_resume()