• Home
  • Raw
  • Download

Lines Matching +full:mii +full:- +full:rt

17    SiS 7014 Single Chip 100BASE-TX/10BASE-T Physical Layer Solution,
25 Rev 1.08.05 Jun. 6 2002 Mufasa Yang bug fix for read_eeprom & Tx descriptor over-boundary
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
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…
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…
48 Chin-Shan Li (lcs@sis.com.tw) Added AMD Am79c901 HomePNA PHY support
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 */
246 * sis900_get_mac_addr - Get MAC address for stand alone SiS900 model
251 * MAC address is read from read_eeprom() into @net_dev->dev_addr.
258 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_get_mac_addr()
272 ((u16 *)(net_dev->dev_addr))[i] = read_eeprom(ioaddr, i+EEPROMMACAddr); in sis900_get_mac_addr()
278 * sis630e_get_mac_addr - Get MAC address for SiS630E model
284 * MAC address is read into @net_dev->dev_addr.
307 ((u8 *)(net_dev->dev_addr))[i] = inb(0x71); in sis630e_get_mac_addr()
318 * sis635_get_mac_addr - Get MAC address for SIS635 model
324 * @net_dev->dev_addr.
331 void __iomem *ioaddr = sis_priv->ioaddr; in sis635_get_mac_addr()
346 *( ((u16 *)net_dev->dev_addr) + i) = sr16(rfdr); in sis635_get_mac_addr()
356 * sis96x_get_mac_addr - Get MAC address for SiS962 or SiS963 model
368 * MAC address is read into @net_dev->dev_addr.
375 void __iomem *ioaddr = sis_priv->ioaddr; in sis96x_get_mac_addr()
381 u16 *mac = (u16 *)net_dev->dev_addr; in sis96x_get_mac_addr()
413 * sis900_probe - Probe for sis900 device
419 * and assign SiS900-specific entries in the device structure.
433 const char *card_name = card_names[pci_id->driver_data]; in sis900_probe()
458 return -ENOMEM; in sis900_probe()
459 SET_NETDEV_DEV(net_dev, &pci_dev->dev); in sis900_probe()
469 ret = -ENOMEM; in sis900_probe()
474 sis_priv->ioaddr = ioaddr; in sis900_probe()
475 sis_priv->pci_dev = pci_dev; in sis900_probe()
476 spin_lock_init(&sis_priv->lock); in sis900_probe()
482 ret = -ENOMEM; in sis900_probe()
485 sis_priv->tx_ring = ring_space; in sis900_probe()
486 sis_priv->tx_ring_dma = ring_dma; in sis900_probe()
490 ret = -ENOMEM; in sis900_probe()
493 sis_priv->rx_ring = ring_space; in sis900_probe()
494 sis_priv->rx_ring_dma = ring_dma; in sis900_probe()
496 /* The SiS900-specific entries in the device structure. */ in sis900_probe()
497 net_dev->netdev_ops = &sis900_netdev_ops; in sis900_probe()
498 net_dev->watchdog_timeo = TX_TIMEOUT; in sis900_probe()
499 net_dev->ethtool_ops = &sis900_ethtool_ops; in sis900_probe()
502 sis_priv->msg_enable = sis900_debug; in sis900_probe()
504 sis_priv->msg_enable = SIS900_DEF_MSG; in sis900_probe()
506 sis_priv->mii_info.dev = net_dev; in sis900_probe()
507 sis_priv->mii_info.mdio_read = mdio_read; in sis900_probe()
508 sis_priv->mii_info.mdio_write = mdio_write; in sis900_probe()
509 sis_priv->mii_info.phy_id_mask = 0x1f; in sis900_probe()
510 sis_priv->mii_info.reg_num_mask = 0x1f; in sis900_probe()
513 sis_priv->chipset_rev = pci_dev->revision; in sis900_probe()
517 dev_name, sis_priv->chipset_rev); in sis900_probe()
520 if (sis_priv->chipset_rev == SIS630E_900_REV) in sis900_probe()
522 else if ((sis_priv->chipset_rev > 0x81) && (sis_priv->chipset_rev <= 0x90) ) in sis900_probe()
524 else if (sis_priv->chipset_rev == SIS96x_900_REV) in sis900_probe()
529 if (!ret || !is_valid_ether_addr(net_dev->dev_addr)) { in sis900_probe()
535 /* 630ET : set the mii access mode as software-mode */ in sis900_probe()
536 if (sis_priv->chipset_rev == SIS630ET_900_REV) in sis900_probe()
539 /* probe for mii transceiver */ in sis900_probe()
541 printk(KERN_WARNING "%s: Error probing MII device.\n", in sis900_probe()
543 ret = -ENODEV; in sis900_probe()
550 sis_priv->host_bridge_rev = dev->revision; in sis900_probe()
560 net_dev->name, card_name, ioaddr, pci_dev->irq, in sis900_probe()
561 net_dev->dev_addr); in sis900_probe()
566 printk(KERN_INFO "%s: Wake on LAN only available from suspend to RAM.", net_dev->name); in sis900_probe()
571 pci_free_consistent(pci_dev, RX_TOTAL_SIZE, sis_priv->rx_ring, in sis900_probe()
572 sis_priv->rx_ring_dma); in sis900_probe()
574 pci_free_consistent(pci_dev, TX_TOTAL_SIZE, sis_priv->tx_ring, in sis900_probe()
575 sis_priv->tx_ring_dma); in sis900_probe()
586 * sis900_mii_probe - Probe MII PHY for sis900
589 * Search for total of 32 possible mii phy addresses.
597 const char *dev_name = pci_name(sis_priv->pci_dev); in sis900_mii_probe()
602 sis_priv->mii = NULL; in sis900_mii_probe()
604 /* search for total of 32 possible mii phy addresses */ in sis900_mii_probe()
616 printk(KERN_DEBUG "%s: MII at address %d" in sis900_mii_probe()
623 mii_phy = sis_priv->first_mii; in sis900_mii_probe()
627 mii_phy = mii_phy->next; in sis900_mii_probe()
633 mii_phy->phy_id0 = mdio_read(net_dev, phy_addr, MII_PHY_ID0); in sis900_mii_probe()
634 mii_phy->phy_id1 = mdio_read(net_dev, phy_addr, MII_PHY_ID1); in sis900_mii_probe()
635 mii_phy->phy_addr = phy_addr; in sis900_mii_probe()
636 mii_phy->status = mii_status; in sis900_mii_probe()
637 mii_phy->next = sis_priv->mii; in sis900_mii_probe()
638 sis_priv->mii = mii_phy; in sis900_mii_probe()
639 sis_priv->first_mii = mii_phy; in sis900_mii_probe()
642 if ((mii_phy->phy_id0 == mii_chip_table[i].phy_id0 ) && in sis900_mii_probe()
643 ((mii_phy->phy_id1 & 0xFFF0) == mii_chip_table[i].phy_id1)){ in sis900_mii_probe()
644 mii_phy->phy_types = mii_chip_table[i].phy_types; in sis900_mii_probe()
646 mii_phy->phy_types = in sis900_mii_probe()
659 mii_phy->phy_types = UNKNOWN; in sis900_mii_probe()
663 if (sis_priv->mii == NULL) { in sis900_mii_probe()
664 printk(KERN_INFO "%s: No MII transceivers found!\n", dev_name); in sis900_mii_probe()
669 sis_priv->mii = NULL; in sis900_mii_probe()
673 if ((sis_priv->mii->phy_id0 == 0x001D) && in sis900_mii_probe()
674 ((sis_priv->mii->phy_id1&0xFFF0) == 0x8000)) in sis900_mii_probe()
675 status = sis900_reset_phy(net_dev, sis_priv->cur_phy); in sis900_mii_probe()
678 if ((sis_priv->mii->phy_id0 == 0x0015) && in sis900_mii_probe()
679 ((sis_priv->mii->phy_id1&0xFFF0) == 0xF440)) in sis900_mii_probe()
680 mdio_write(net_dev, sis_priv->cur_phy, 0x0018, 0xD200); in sis900_mii_probe()
686 poll_bit ^= (mdio_read(net_dev, sis_priv->cur_phy, MII_STATUS) & poll_bit); in sis900_mii_probe()
690 return -ETIME; in sis900_mii_probe()
695 if (sis_priv->chipset_rev == SIS630E_900_REV) { in sis900_mii_probe()
697 mdio_write(net_dev, sis_priv->cur_phy, MII_ANADV, 0x05e1); in sis900_mii_probe()
698 mdio_write(net_dev, sis_priv->cur_phy, MII_CONFIG1, 0x22); in sis900_mii_probe()
699 mdio_write(net_dev, sis_priv->cur_phy, MII_CONFIG2, 0xff00); in sis900_mii_probe()
700 mdio_write(net_dev, sis_priv->cur_phy, MII_MASK, 0xffc0); in sis900_mii_probe()
701 //mdio_write(net_dev, sis_priv->cur_phy, MII_CONTROL, 0x1000); in sis900_mii_probe()
704 if (sis_priv->mii->status & MII_STAT_LINK) in sis900_mii_probe()
713 * sis900_default_phy - Select default PHY for sis900 mac.
728 for (phy=sis_priv->first_mii; phy; phy=phy->next) { in sis900_default_phy()
729 status = mdio_read(net_dev, phy->phy_addr, MII_STATUS); in sis900_default_phy()
730 status = mdio_read(net_dev, phy->phy_addr, MII_STATUS); in sis900_default_phy()
734 (phy->phy_types != UNKNOWN)) in sis900_default_phy()
737 status = mdio_read(net_dev, phy->phy_addr, MII_CONTROL); in sis900_default_phy()
738 mdio_write(net_dev, phy->phy_addr, MII_CONTROL, in sis900_default_phy()
740 if (phy->phy_types == HOME) in sis900_default_phy()
742 else if(phy->phy_types == LAN) in sis900_default_phy()
752 default_phy = sis_priv->first_mii; in sis900_default_phy()
754 if (sis_priv->mii != default_phy) { in sis900_default_phy()
755 sis_priv->mii = default_phy; in sis900_default_phy()
756 sis_priv->cur_phy = default_phy->phy_addr; in sis900_default_phy()
758 pci_name(sis_priv->pci_dev), sis_priv->cur_phy); in sis900_default_phy()
761 sis_priv->mii_info.phy_id = sis_priv->cur_phy; in sis900_default_phy()
763 status = mdio_read(net_dev, sis_priv->cur_phy, MII_CONTROL); in sis900_default_phy()
766 mdio_write(net_dev, sis_priv->cur_phy, MII_CONTROL, status); in sis900_default_phy()
767 status = mdio_read(net_dev, sis_priv->cur_phy, MII_STATUS); in sis900_default_phy()
768 status = mdio_read(net_dev, sis_priv->cur_phy, MII_STATUS); in sis900_default_phy()
775 * sis900_set_capability - set the media capability of network adapter.
780 * mii status register. It's necessary before auto-negotiate.
788 status = mdio_read(net_dev, phy->phy_addr, MII_STATUS); in sis900_set_capability()
789 status = mdio_read(net_dev, phy->phy_addr, MII_STATUS); in sis900_set_capability()
792 ((phy->status & MII_STAT_CAN_TX_FDX)? MII_NWAY_TX_FDX:0) | in sis900_set_capability()
793 ((phy->status & MII_STAT_CAN_TX) ? MII_NWAY_TX:0) | in sis900_set_capability()
794 ((phy->status & MII_STAT_CAN_T_FDX) ? MII_NWAY_T_FDX:0)| in sis900_set_capability()
795 ((phy->status & MII_STAT_CAN_T) ? MII_NWAY_T:0); in sis900_set_capability()
797 mdio_write(net_dev, phy->phy_addr, MII_ANADV, cap); in sis900_set_capability()
805 * read_eeprom - Read Serial EEPROM
825 for (i = 8; i >= 0; i--) { in read_eeprom()
836 /* read the 16-bits data in */ in read_eeprom()
837 for (i = 16; i > 0; i--) { in read_eeprom()
853 /* Read and write the MII management registers using software-generated
860 void __iomem *ioaddr = sp->ioaddr; in mdio_idle()
867 /* Synchronize the MII management interface by shifting 32 one bits out. */
870 void __iomem *ioaddr = sp->ioaddr; in mdio_reset()
873 for (i = 31; i >= 0; i--) { in mdio_reset()
882 * mdio_read - read MII PHY register
887 * Read MII registers through MDIO and MDC
896 void __iomem *ioaddr = sp->ioaddr; in mdio_read()
903 for (i = 15; i >= 0; i--) { in mdio_read()
913 for (i = 16; i > 0; i--) { in mdio_read()
926 * mdio_write - write MII PHY register
932 * Write MII registers with @value through MDIO and MDC
942 void __iomem *ioaddr = sp->ioaddr; in mdio_write()
949 for (i = 15; i >= 0; i--) { in mdio_write()
960 for (i = 15; i >= 0; i--) { in mdio_write()
971 for (i = 2; i > 0; i--) { in mdio_write()
982 * sis900_reset_phy - reset sis900 mii phy.
1006 * Polling 'interrupt' - used by things like netconsole to send skbs
1007 * without having to re-enable interrupts. It's not called while
1013 const int irq = sp->pci_dev->irq; in sis900_poll()
1022 * sis900_open - open sis900 device
1033 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_open()
1040 sis630_set_eq(net_dev, sis_priv->chipset_rev); in sis900_open()
1042 ret = request_irq(sis_priv->pci_dev->irq, sis900_interrupt, IRQF_SHARED, in sis900_open()
1043 net_dev->name, net_dev); in sis900_open()
1064 sis900_check_mode(net_dev, sis_priv->mii); in sis900_open()
1068 timer_setup(&sis_priv->timer, sis900_timer, 0); in sis900_open()
1069 sis_priv->timer.expires = jiffies + HZ; in sis900_open()
1070 add_timer(&sis_priv->timer); in sis900_open()
1076 * sis900_init_rxfilter - Initialize the Rx filter
1087 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_init_rxfilter()
1098 u32 w = (u32) *((u16 *)(net_dev->dev_addr)+i); in sis900_init_rxfilter()
1105 net_dev->name, i, sr32(rfdr)); in sis900_init_rxfilter()
1114 * sis900_init_tx_ring - Initialize the Tx descriptor ring
1124 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_init_tx_ring()
1127 sis_priv->tx_full = 0; in sis900_init_tx_ring()
1128 sis_priv->dirty_tx = sis_priv->cur_tx = 0; in sis900_init_tx_ring()
1131 sis_priv->tx_skbuff[i] = NULL; in sis900_init_tx_ring()
1133 sis_priv->tx_ring[i].link = sis_priv->tx_ring_dma + in sis900_init_tx_ring()
1135 sis_priv->tx_ring[i].cmdsts = 0; in sis900_init_tx_ring()
1136 sis_priv->tx_ring[i].bufptr = 0; in sis900_init_tx_ring()
1140 sw32(txdp, sis_priv->tx_ring_dma); in sis900_init_tx_ring()
1143 net_dev->name, sr32(txdp)); in sis900_init_tx_ring()
1147 * sis900_init_rx_ring - Initialize the Rx descriptor ring
1151 * and pre-allocate recevie buffers (socket buffer)
1158 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_init_rx_ring()
1161 sis_priv->cur_rx = 0; in sis900_init_rx_ring()
1162 sis_priv->dirty_rx = 0; in sis900_init_rx_ring()
1166 sis_priv->rx_skbuff[i] = NULL; in sis900_init_rx_ring()
1168 sis_priv->rx_ring[i].link = sis_priv->rx_ring_dma + in sis900_init_rx_ring()
1170 sis_priv->rx_ring[i].cmdsts = 0; in sis900_init_rx_ring()
1171 sis_priv->rx_ring[i].bufptr = 0; in sis900_init_rx_ring()
1185 sis_priv->rx_skbuff[i] = skb; in sis900_init_rx_ring()
1186 sis_priv->rx_ring[i].cmdsts = RX_BUF_SIZE; in sis900_init_rx_ring()
1187 sis_priv->rx_ring[i].bufptr = pci_map_single(sis_priv->pci_dev, in sis900_init_rx_ring()
1188 skb->data, RX_BUF_SIZE, PCI_DMA_FROMDEVICE); in sis900_init_rx_ring()
1189 if (unlikely(pci_dma_mapping_error(sis_priv->pci_dev, in sis900_init_rx_ring()
1190 sis_priv->rx_ring[i].bufptr))) { in sis900_init_rx_ring()
1192 sis_priv->rx_skbuff[i] = NULL; in sis900_init_rx_ring()
1196 sis_priv->dirty_rx = (unsigned int) (i - NUM_RX_DESC); in sis900_init_rx_ring()
1199 sw32(rxdp, sis_priv->rx_ring_dma); in sis900_init_rx_ring()
1202 net_dev->name, sr32(rxdp)); in sis900_init_rx_ring()
1206 * sis630_set_eq - set phy equalizer value for 630 LAN
1212 * Bit 14: 0 -- Automatically detect (default)
1213 * 1 -- Manually set Equalizer filter
1214 * Bit 13: 0 -- (Default)
1215 * 1 -- Speed up convergence of equalizer setting
1216 * Bit 9 : 0 -- (Default)
1217 * 1 -- Disable Baseline Wander
1218 * Bit 3~7 -- Equalizer filter setting
1224 * When Link is ON and Bit 14 is 0, SIS900PHY will auto-detect proper equalizer value.
1227 * 0 <= max <= 4 --> set equalizer to max
1228 * 5 <= max <= 14 --> set equalizer to max+1 or set equalizer to max+2 if max == min
1229 * max >= 15 --> set equalizer to max+5 or set equalizer to max+6 if max == min
1243 reg14h = mdio_read(net_dev, sis_priv->cur_phy, MII_RESV); in sis630_set_eq()
1244 mdio_write(net_dev, sis_priv->cur_phy, MII_RESV, in sis630_set_eq()
1248 sis_priv->cur_phy, MII_RESV)) >> 3; in sis630_set_eq()
1270 (sis_priv->host_bridge_rev == SIS630B0 || in sis630_set_eq()
1271 sis_priv->host_bridge_rev == SIS630B1)) { in sis630_set_eq()
1278 reg14h = mdio_read(net_dev, sis_priv->cur_phy, MII_RESV); in sis630_set_eq()
1281 mdio_write(net_dev, sis_priv->cur_phy, MII_RESV, reg14h); in sis630_set_eq()
1283 reg14h = mdio_read(net_dev, sis_priv->cur_phy, MII_RESV); in sis630_set_eq()
1285 (sis_priv->host_bridge_rev == SIS630B0 || in sis630_set_eq()
1286 sis_priv->host_bridge_rev == SIS630B1)) in sis630_set_eq()
1287 mdio_write(net_dev, sis_priv->cur_phy, MII_RESV, in sis630_set_eq()
1290 mdio_write(net_dev, sis_priv->cur_phy, MII_RESV, in sis630_set_eq()
1296 * sis900_timer - sis900 timer routine
1306 struct net_device *net_dev = sis_priv->mii_info.dev; in sis900_timer()
1307 struct mii_phy *mii_phy = sis_priv->mii; in sis900_timer()
1312 status = mdio_read(net_dev, sis_priv->cur_phy, MII_STATUS); in sis900_timer()
1313 status = mdio_read(net_dev, sis_priv->cur_phy, MII_STATUS); in sis900_timer()
1315 /* Link OFF -> ON */ in sis900_timer()
1320 mii_phy = sis_priv->mii; in sis900_timer()
1328 sis630_set_eq(net_dev, sis_priv->chipset_rev); in sis900_timer()
1333 /* Link ON -> OFF */ in sis900_timer()
1337 printk(KERN_INFO "%s: Media Link Off\n", net_dev->name); in sis900_timer()
1340 if ((mii_phy->phy_id0 == 0x001D) && in sis900_timer()
1341 ((mii_phy->phy_id1 & 0xFFF0) == 0x8000)) in sis900_timer()
1342 sis900_reset_phy(net_dev, sis_priv->cur_phy); in sis900_timer()
1344 sis630_set_eq(net_dev, sis_priv->chipset_rev); in sis900_timer()
1350 sis_priv->timer.expires = jiffies + next_tick; in sis900_timer()
1351 add_timer(&sis_priv->timer); in sis900_timer()
1355 * sis900_check_mode - check the media mode for sis900
1357 * @mii_phy: the mii phy
1359 * Older driver gets the media mode from mii status output
1360 * register. Now we set our media capability and auto-negotiate
1362 * If the types of mii phy is HOME, it doesn't need to auto-negotiate
1369 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_check_mode()
1372 if (mii_phy->phy_types == LAN) { in sis900_check_mode()
1375 sis900_auto_negotiate(net_dev, sis_priv->cur_phy); in sis900_check_mode()
1381 sis_priv->autong_complete = 1; in sis900_check_mode()
1386 * sis900_set_mode - Set the media mode of mac register.
1400 void __iomem *ioaddr = sp->ioaddr; in sis900_set_mode()
1436 * sis900_auto_negotiate - Set the Auto-Negotiation Enable/Reset bit.
1438 * @phy_addr: mii phy address
1440 * If the adapter is link-on, set the auto-negotiate enable/reset bit.
1441 * autong_complete should be set to 0 when starting auto-negotiation.
1442 * autong_complete should be set to 1 if we didn't start auto-negotiation.
1457 printk(KERN_INFO "%s: Media Link Off\n", net_dev->name); in sis900_auto_negotiate()
1458 sis_priv->autong_complete = 1; in sis900_auto_negotiate()
1466 sis_priv->autong_complete = 0; in sis900_auto_negotiate()
1471 * sis900_read_mode - read media mode for sis900 internal phy
1476 * The capability of remote end will be put in mii register autorec
1477 * after auto-negotiation. Use AND operation to get the upper bound
1484 struct mii_phy *phy = sis_priv->mii; in sis900_read_mode()
1485 int phy_addr = sis_priv->cur_phy; in sis900_read_mode()
1509 sis_priv->autong_complete = 1; in sis900_read_mode()
1512 if ((phy->phy_id0 == 0x0000) && ((phy->phy_id1 & 0xFFF0) == 0x8200)) { in sis900_read_mode()
1520 printk(KERN_INFO "%s: Media Link On %s %s-duplex\n", in sis900_read_mode()
1521 net_dev->name, in sis900_read_mode()
1529 * sis900_tx_timeout - sis900 transmit timeout routine
1539 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_tx_timeout()
1545 net_dev->name, sr32(cr), sr32(isr)); in sis900_tx_timeout()
1552 spin_lock_irqsave(&sis_priv->lock, flags); in sis900_tx_timeout()
1555 sis_priv->dirty_tx = sis_priv->cur_tx = 0; in sis900_tx_timeout()
1557 struct sk_buff *skb = sis_priv->tx_skbuff[i]; in sis900_tx_timeout()
1560 pci_unmap_single(sis_priv->pci_dev, in sis900_tx_timeout()
1561 sis_priv->tx_ring[i].bufptr, skb->len, in sis900_tx_timeout()
1564 sis_priv->tx_skbuff[i] = NULL; in sis900_tx_timeout()
1565 sis_priv->tx_ring[i].cmdsts = 0; in sis900_tx_timeout()
1566 sis_priv->tx_ring[i].bufptr = 0; in sis900_tx_timeout()
1567 net_dev->stats.tx_dropped++; in sis900_tx_timeout()
1570 sis_priv->tx_full = 0; in sis900_tx_timeout()
1573 spin_unlock_irqrestore(&sis_priv->lock, flags); in sis900_tx_timeout()
1578 sw32(txdp, sis_priv->tx_ring_dma); in sis900_tx_timeout()
1585 * sis900_start_xmit - sis900 start transmit routine
1598 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_start_xmit()
1604 spin_lock_irqsave(&sis_priv->lock, flags); in sis900_start_xmit()
1607 entry = sis_priv->cur_tx % NUM_TX_DESC; in sis900_start_xmit()
1608 sis_priv->tx_skbuff[entry] = skb; in sis900_start_xmit()
1611 sis_priv->tx_ring[entry].bufptr = pci_map_single(sis_priv->pci_dev, in sis900_start_xmit()
1612 skb->data, skb->len, PCI_DMA_TODEVICE); in sis900_start_xmit()
1613 if (unlikely(pci_dma_mapping_error(sis_priv->pci_dev, in sis900_start_xmit()
1614 sis_priv->tx_ring[entry].bufptr))) { in sis900_start_xmit()
1616 sis_priv->tx_skbuff[entry] = NULL; in sis900_start_xmit()
1617 net_dev->stats.tx_dropped++; in sis900_start_xmit()
1618 spin_unlock_irqrestore(&sis_priv->lock, flags); in sis900_start_xmit()
1621 sis_priv->tx_ring[entry].cmdsts = (OWN | INTR | skb->len); in sis900_start_xmit()
1624 sis_priv->cur_tx ++; in sis900_start_xmit()
1625 index_cur_tx = sis_priv->cur_tx; in sis900_start_xmit()
1626 index_dirty_tx = sis_priv->dirty_tx; in sis900_start_xmit()
1633 sis_priv->tx_full = 1; in sis900_start_xmit()
1640 sis_priv->tx_full = 1; in sis900_start_xmit()
1644 spin_unlock_irqrestore(&sis_priv->lock, flags); in sis900_start_xmit()
1649 net_dev->name, skb->data, (int)skb->len, entry); in sis900_start_xmit()
1655 * sis900_interrupt - sis900 interrupt handler
1668 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_interrupt()
1672 spin_lock (&sis_priv->lock); in sis900_interrupt()
1682 /* why dow't we break after Tx/Rx case ?? keyword: full-duplex */ in sis900_interrupt()
1695 "status %#8.8x.\n", net_dev->name, status); in sis900_interrupt()
1698 if (--boguscnt < 0) { in sis900_interrupt()
1702 net_dev->name, status); in sis900_interrupt()
1710 net_dev->name, sr32(isr)); in sis900_interrupt()
1712 spin_unlock (&sis_priv->lock); in sis900_interrupt()
1717 * sis900_rx - sis900 receive routine
1729 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_rx()
1730 unsigned int entry = sis_priv->cur_rx % NUM_RX_DESC; in sis900_rx()
1731 u32 rx_status = sis_priv->rx_ring[entry].cmdsts; in sis900_rx()
1737 sis_priv->cur_rx, sis_priv->dirty_rx, rx_status); in sis900_rx()
1738 rx_work_limit = sis_priv->dirty_rx + NUM_RX_DESC - sis_priv->cur_rx; in sis900_rx()
1744 if (--rx_work_limit < 0) in sis900_rx()
1748 rx_size = data_size - CRC_SIZE; in sis900_rx()
1761 net_dev->name, rx_status, data_size); in sis900_rx()
1762 net_dev->stats.rx_errors++; in sis900_rx()
1764 net_dev->stats.rx_over_errors++; in sis900_rx()
1766 net_dev->stats.rx_length_errors++; in sis900_rx()
1768 net_dev->stats.rx_frame_errors++; in sis900_rx()
1770 net_dev->stats.rx_crc_errors++; in sis900_rx()
1772 sis_priv->rx_ring[entry].cmdsts = RX_BUF_SIZE; in sis900_rx()
1777 pci_unmap_single(sis_priv->pci_dev, in sis900_rx()
1778 sis_priv->rx_ring[entry].bufptr, RX_BUF_SIZE, in sis900_rx()
1790 skb = sis_priv->rx_skbuff[entry]; in sis900_rx()
1791 net_dev->stats.rx_dropped++; in sis900_rx()
1797 we are working on NULL sk_buff :-( */ in sis900_rx()
1798 if (sis_priv->rx_skbuff[entry] == NULL) { in sis900_rx()
1803 net_dev->name, sis_priv->cur_rx, in sis900_rx()
1804 sis_priv->dirty_rx); in sis900_rx()
1810 rx_skb = sis_priv->rx_skbuff[entry]; in sis900_rx()
1812 rx_skb->protocol = eth_type_trans(rx_skb, net_dev); in sis900_rx()
1817 net_dev->stats.multicast++; in sis900_rx()
1818 net_dev->stats.rx_bytes += rx_size; in sis900_rx()
1819 net_dev->stats.rx_packets++; in sis900_rx()
1820 sis_priv->dirty_rx++; in sis900_rx()
1822 sis_priv->rx_skbuff[entry] = skb; in sis900_rx()
1823 sis_priv->rx_ring[entry].cmdsts = RX_BUF_SIZE; in sis900_rx()
1824 sis_priv->rx_ring[entry].bufptr = in sis900_rx()
1825 pci_map_single(sis_priv->pci_dev, skb->data, in sis900_rx()
1827 if (unlikely(pci_dma_mapping_error(sis_priv->pci_dev, in sis900_rx()
1828 sis_priv->rx_ring[entry].bufptr))) { in sis900_rx()
1830 sis_priv->rx_skbuff[entry] = NULL; in sis900_rx()
1834 sis_priv->cur_rx++; in sis900_rx()
1835 entry = sis_priv->cur_rx % NUM_RX_DESC; in sis900_rx()
1836 rx_status = sis_priv->rx_ring[entry].cmdsts; in sis900_rx()
1841 for (; sis_priv->cur_rx != sis_priv->dirty_rx; sis_priv->dirty_rx++) { in sis900_rx()
1844 entry = sis_priv->dirty_rx % NUM_RX_DESC; in sis900_rx()
1846 if (sis_priv->rx_skbuff[entry] == NULL) { in sis900_rx()
1853 net_dev->stats.rx_dropped++; in sis900_rx()
1856 sis_priv->rx_skbuff[entry] = skb; in sis900_rx()
1857 sis_priv->rx_ring[entry].cmdsts = RX_BUF_SIZE; in sis900_rx()
1858 sis_priv->rx_ring[entry].bufptr = in sis900_rx()
1859 pci_map_single(sis_priv->pci_dev, skb->data, in sis900_rx()
1861 if (unlikely(pci_dma_mapping_error(sis_priv->pci_dev, in sis900_rx()
1862 sis_priv->rx_ring[entry].bufptr))) { in sis900_rx()
1864 sis_priv->rx_skbuff[entry] = NULL; in sis900_rx()
1869 /* re-enable the potentially idle receive state matchine */ in sis900_rx()
1876 * sis900_finish_xmit - finish up transmission of packets
1889 for (; sis_priv->dirty_tx != sis_priv->cur_tx; sis_priv->dirty_tx++) { in sis900_finish_xmit()
1894 entry = sis_priv->dirty_tx % NUM_TX_DESC; in sis900_finish_xmit()
1895 tx_status = sis_priv->tx_ring[entry].cmdsts; in sis900_finish_xmit()
1909 net_dev->name, tx_status); in sis900_finish_xmit()
1910 net_dev->stats.tx_errors++; in sis900_finish_xmit()
1912 net_dev->stats.tx_fifo_errors++; in sis900_finish_xmit()
1914 net_dev->stats.tx_aborted_errors++; in sis900_finish_xmit()
1916 net_dev->stats.tx_carrier_errors++; in sis900_finish_xmit()
1918 net_dev->stats.tx_window_errors++; in sis900_finish_xmit()
1921 net_dev->stats.collisions += (tx_status & COLCNT) >> 16; in sis900_finish_xmit()
1922 net_dev->stats.tx_bytes += tx_status & DSIZE; in sis900_finish_xmit()
1923 net_dev->stats.tx_packets++; in sis900_finish_xmit()
1926 skb = sis_priv->tx_skbuff[entry]; in sis900_finish_xmit()
1927 pci_unmap_single(sis_priv->pci_dev, in sis900_finish_xmit()
1928 sis_priv->tx_ring[entry].bufptr, skb->len, in sis900_finish_xmit()
1931 sis_priv->tx_skbuff[entry] = NULL; in sis900_finish_xmit()
1932 sis_priv->tx_ring[entry].bufptr = 0; in sis900_finish_xmit()
1933 sis_priv->tx_ring[entry].cmdsts = 0; in sis900_finish_xmit()
1936 if (sis_priv->tx_full && netif_queue_stopped(net_dev) && in sis900_finish_xmit()
1937 sis_priv->cur_tx - sis_priv->dirty_tx < NUM_TX_DESC - 4) { in sis900_finish_xmit()
1940 sis_priv->tx_full = 0; in sis900_finish_xmit()
1946 * sis900_close - close sis900 device
1956 struct pci_dev *pdev = sis_priv->pci_dev; in sis900_close()
1957 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_close()
1970 del_timer(&sis_priv->timer); in sis900_close()
1972 free_irq(pdev->irq, net_dev); in sis900_close()
1976 skb = sis_priv->rx_skbuff[i]; in sis900_close()
1978 pci_unmap_single(pdev, sis_priv->rx_ring[i].bufptr, in sis900_close()
1981 sis_priv->rx_skbuff[i] = NULL; in sis900_close()
1985 skb = sis_priv->tx_skbuff[i]; in sis900_close()
1987 pci_unmap_single(pdev, sis_priv->tx_ring[i].bufptr, in sis900_close()
1988 skb->len, PCI_DMA_TODEVICE); in sis900_close()
1990 sis_priv->tx_skbuff[i] = NULL; in sis900_close()
1994 /* Green! Put the chip in low-power mode. */ in sis900_close()
2000 * sis900_get_drvinfo - Return information about driver
2004 * Process ethtool command such as "ehtool -i" to show information
2012 strlcpy(info->driver, SIS900_MODULE_NAME, sizeof(info->driver)); in sis900_get_drvinfo()
2013 strlcpy(info->version, SIS900_DRV_VERSION, sizeof(info->version)); in sis900_get_drvinfo()
2014 strlcpy(info->bus_info, pci_name(sis_priv->pci_dev), in sis900_get_drvinfo()
2015 sizeof(info->bus_info)); in sis900_get_drvinfo()
2021 return sis_priv->msg_enable; in sis900_get_msglevel()
2027 sis_priv->msg_enable = value; in sis900_set_msglevel()
2033 return mii_link_ok(&sis_priv->mii_info); in sis900_get_link()
2040 spin_lock_irq(&sis_priv->lock); in sis900_get_link_ksettings()
2041 mii_ethtool_get_link_ksettings(&sis_priv->mii_info, cmd); in sis900_get_link_ksettings()
2042 spin_unlock_irq(&sis_priv->lock); in sis900_get_link_ksettings()
2050 int rt; in sis900_set_link_ksettings() local
2051 spin_lock_irq(&sis_priv->lock); in sis900_set_link_ksettings()
2052 rt = mii_ethtool_set_link_ksettings(&sis_priv->mii_info, cmd); in sis900_set_link_ksettings()
2053 spin_unlock_irq(&sis_priv->lock); in sis900_set_link_ksettings()
2054 return rt; in sis900_set_link_ksettings()
2060 return mii_nway_restart(&sis_priv->mii_info); in sis900_nway_reset()
2064 * sis900_set_wol - Set up Wake on Lan registers
2077 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_set_wol()
2080 if (wol->wolopts == 0) { in sis900_set_wol()
2081 pci_read_config_dword(sis_priv->pci_dev, CFGPMCSR, &cfgpmcsr); in sis900_set_wol()
2083 pci_write_config_dword(sis_priv->pci_dev, CFGPMCSR, cfgpmcsr); in sis900_set_wol()
2086 printk(KERN_DEBUG "%s: Wake on LAN disabled\n", net_dev->name); in sis900_set_wol()
2090 if (wol->wolopts & (WAKE_MAGICSECURE | WAKE_UCAST | WAKE_MCAST in sis900_set_wol()
2092 return -EINVAL; in sis900_set_wol()
2094 if (wol->wolopts & WAKE_MAGIC) in sis900_set_wol()
2096 if (wol->wolopts & WAKE_PHY) in sis900_set_wol()
2101 pci_read_config_dword(sis_priv->pci_dev, CFGPMCSR, &cfgpmcsr); in sis900_set_wol()
2103 pci_write_config_dword(sis_priv->pci_dev, CFGPMCSR, cfgpmcsr); in sis900_set_wol()
2105 printk(KERN_DEBUG "%s: Wake on LAN enabled\n", net_dev->name); in sis900_set_wol()
2113 void __iomem *ioaddr = sp->ioaddr; in sis900_get_wol()
2118 wol->wolopts |= WAKE_MAGIC; in sis900_get_wol()
2120 wol->wolopts |= WAKE_PHY; in sis900_get_wol()
2122 wol->supported = (WAKE_PHY | WAKE_MAGIC); in sis900_get_wol()
2138 * mii_ioctl - process MII i/o control command
2143 * Process MII command like read/write MII register
2152 case SIOCGMIIPHY: /* Get address of MII PHY in use. */ in mii_ioctl()
2153 data->phy_id = sis_priv->mii->phy_addr; in mii_ioctl()
2156 case SIOCGMIIREG: /* Read MII PHY register. */ in mii_ioctl()
2157 data->val_out = mdio_read(net_dev, data->phy_id & 0x1f, data->reg_num & 0x1f); in mii_ioctl()
2160 case SIOCSMIIREG: /* Write MII PHY register. */ in mii_ioctl()
2161 mdio_write(net_dev, data->phy_id & 0x1f, data->reg_num & 0x1f, data->val_in); in mii_ioctl()
2164 return -EOPNOTSUPP; in mii_ioctl()
2169 * sis900_set_config - Set media type by net_device.set_config
2181 struct mii_phy *mii_phy = sis_priv->mii; in sis900_set_config()
2185 if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) { in sis900_set_config()
2186 /* we switch on the ifmap->port field. I couldn't find anything in sis900_set_config()
2192 switch(map->port){ in sis900_set_config()
2194 dev->if_port = map->port; in sis900_set_config()
2203 status = mdio_read(dev, mii_phy->phy_addr, MII_CONTROL); in sis900_set_config()
2209 mdio_write(dev, mii_phy->phy_addr, in sis900_set_config()
2215 dev->if_port = map->port; in sis900_set_config()
2226 status = mdio_read(dev, mii_phy->phy_addr, MII_CONTROL); in sis900_set_config()
2229 mdio_write(dev, mii_phy->phy_addr, in sis900_set_config()
2236 dev->if_port = map->port; in sis900_set_config()
2247 status = mdio_read(dev, mii_phy->phy_addr, MII_CONTROL); in sis900_set_config()
2248 mdio_write(dev, mii_phy->phy_addr, in sis900_set_config()
2258 return -EOPNOTSUPP; in sis900_set_config()
2261 return -EINVAL; in sis900_set_config()
2268 * sis900_mcast_bitnr - compute hashtable index
2291 * set_rx_mode - Set SiS900 receive mode
2302 void __iomem *ioaddr = sis_priv->ioaddr; in set_rx_mode()
2308 if((sis_priv->chipset_rev >= SIS635A_900_REV) || in set_rx_mode()
2309 (sis_priv->chipset_rev == SIS900B_900_REV)) in set_rx_mode()
2314 if (net_dev->flags & IFF_PROMISC) { in set_rx_mode()
2320 (net_dev->flags & IFF_ALLMULTI)) { in set_rx_mode()
2335 bit_nr = sis900_mcast_bitnr(ha->addr, in set_rx_mode()
2336 sis_priv->chipset_rev); in set_rx_mode()
2352 if (net_dev->flags & IFF_LOOPBACK) { in set_rx_mode()
2366 * sis900_reset - Reset sis900 MAC
2377 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_reset()
2391 if (sis_priv->chipset_rev >= SIS635A_900_REV || in sis900_reset()
2392 sis_priv->chipset_rev == SIS900B_900_REV) in sis900_reset()
2399 * sis900_remove - Remove sis900 device
2412 while (sis_priv->first_mii) { in sis900_remove()
2413 struct mii_phy *phy = sis_priv->first_mii; in sis900_remove()
2415 sis_priv->first_mii = phy->next; in sis900_remove()
2419 pci_free_consistent(pci_dev, RX_TOTAL_SIZE, sis_priv->rx_ring, in sis900_remove()
2420 sis_priv->rx_ring_dma); in sis900_remove()
2421 pci_free_consistent(pci_dev, TX_TOTAL_SIZE, sis_priv->tx_ring, in sis900_remove()
2422 sis_priv->tx_ring_dma); in sis900_remove()
2423 pci_iounmap(pci_dev, sis_priv->ioaddr); in sis900_remove()
2434 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_suspend()
2455 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_resume()
2480 sis900_check_mode(net_dev, sis_priv->mii); in sis900_resume()