Lines Matching +full:tx +full:- +full:sched +full:- +full:sp

17    SiS 7014 Single Chip 100BASE-TX/10BASE-T Physical Layer Solution,
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
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…
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
55 #include <linux/sched.h>
72 #include <linux/dma-mapping.h>
90 static int sis900_debug = -1; /* Use SIS900_DEF_MSG as value */
136 { "AMD 79C901 10BASE-T PHY", 0x0000, 0x6B70, LAN },
175 u8 autong_complete; /* 1: auto-negotiate complete */
179 unsigned int cur_rx, dirty_rx; /* producer/consumer pointers for Tx/Rx ring */
182 /* The saved address of a sent/receive-in-place packet buffer */
191 unsigned int tx_full; /* The Tx queue is full. */
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()
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
608 const char *dev_name = pci_name(sis_priv->pci_dev); in sis900_mii_probe()
613 sis_priv->mii = NULL; 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()
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
868 static void mdio_idle(struct sis900_private *sp) in mdio_idle() argument
870 void __iomem *ioaddr = sp->ioaddr; in mdio_idle()
878 static void mdio_reset(struct sis900_private *sp) in mdio_reset() argument
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
905 struct sis900_private *sp = netdev_priv(net_dev); in mdio_read() local
906 void __iomem *ioaddr = sp->ioaddr; in mdio_read()
910 mdio_reset(sp); in mdio_read()
911 mdio_idle(sp); 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
951 struct sis900_private *sp = netdev_priv(net_dev); in mdio_write() local
952 void __iomem *ioaddr = sp->ioaddr; in mdio_write()
955 mdio_reset(sp); in mdio_write()
956 mdio_idle(sp); 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
1022 struct sis900_private *sp = netdev_priv(dev); in sis900_poll() local
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
1127 * 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()
1152 printk(KERN_DEBUG "%s: TX descriptor register loaded with: %8.8x\n", 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
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.
1400 * @sp: the device private data
1407 * Max DMA Burst Size for TX/RX DMA should be no larger than 16
1411 static void sis900_set_mode(struct sis900_private *sp, int speed, int duplex) in sis900_set_mode() argument
1413 void __iomem *ioaddr = sp->ioaddr; in sis900_set_mode()
1449 * sis900_auto_negotiate - Set the Auto-Negotiation Enable/Reset bit.
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
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()
1589 netif_trans_update(net_dev); /* prevent tx timeout */ 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()
1620 /* Calculate the next Tx descriptor entry. */ 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()
1662 printk(KERN_DEBUG "%s: Queued Tx packet at %p size %d " in sis900_start_xmit()
1664 net_dev->name, skb->data, (int)skb->len, entry); in sis900_start_xmit()
1670 * sis900_interrupt - sis900 interrupt handler
1675 * and cleans up after the Tx thread
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()
1703 /* Tx interrupt */ 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()
1925 "error, Tx status %8.8x.\n", 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
1966 * Disable interrupts, stop the Tx and Rx Status Machine
1967 * free Tx and RX socket buffer
1973 struct pci_dev *pdev = sis_priv->pci_dev; in sis900_close()
1974 void __iomem *ioaddr = sis_priv->ioaddr; in sis900_close()
1984 /* Stop the chip's Tx and Rx Status Machine */ in sis900_close()
1987 timer_delete(&sis_priv->timer); in sis900_close()
1989 free_irq(pdev->irq, net_dev); in sis900_close()
1991 /* Free Tx and RX skbuff */ 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()
2131 struct sis900_private *sp = netdev_priv(net_dev); in sis900_get_wol() local
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
2236 data->phy_id = sis_priv->mii->phy_addr; in mii_ioctl()
2240 data->val_out = mdio_read(net_dev, data->phy_id & 0x1f, data->reg_num & 0x1f); 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()
2437 /* We must disable Tx/Rx before setting loopback mode */ 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()
2522 /* Stop the chip's Tx and Rx Status Machine */ 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()