Lines Matching +full:rev +full:- +full:mii

3 	8139too.c: A RealTek RTL-8139 Fast Ethernet driver for Linux.
6 Copyright 2000-2002 Jeff Garzik
12 -----<snip>-----
14 Written 1997-2001 by Donald Becker.
33 Twister-tuning table provided by Kinston
36 -----<snip>-----
43 Donald Becker - he wrote the original driver, kudos to him!
44 (but please don't e-mail him for support, this isn't his driver)
46 Tigran Aivazian - bug fixes, skbuff free cleanup
48 Martin Mares - suggestions for PCI cleanup
50 David S. Miller - PCI DMA and softnet updates
52 Ernst Gill - fixes ported from BSD driver
54 Daniel Kobras - identified specific locations of
57 Gerard Sharp - bug fix, testing and feedback
59 David Ford - Rx ring wrap fix
61 Dan DeMaggio - swapped RTL8139 cards with me, and allowed me
64 Donald Becker/Chris Butterworth/Marcus Westergren -
65 Noticed various Rx packet size-related buglets.
67 Santiago Garcia Mantinan - testing and feedback
69 Jens David - 2.2.x kernel backports
71 Martin Dennett - incredibly helpful insight on undocumented
74 Jean-Jacques Michel - bug fix
76 Tobias Ringström - Rx interrupt status checking suggestion
78 Andrew Morton - Clear blocked signals, avoid
79 buffer overrun setting current->comm.
81 Kalle Olavi Niemitalo - Wake-on-LAN ioctls
83 Robert Kuebel - Save kernel thread from dying on any signal.
87 "rtl8139-diag -mmmaaavvveefN" output
109 #include <linux/mii.h>
144 /* A few user-configurable values. */
147 static int media[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
148 static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
157 /* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
162 static int debug = -1;
186 /* max supported ethernet frame size -- must be at least (dev->mtu+18+4).*/
190 #define MAX_ETH_DATA_SIZE (MAX_ETH_FRAME_SIZE - VLAN_ETH_HLEN - ETH_FCS_LEN)
192 /* Size of the Tx bounce buffers -- must be at least (dev->mtu+18+4). */
200 /* The following settings are log_2(bytes)-4: 0 == 16 bytes .. 6==1024, 7==end of packet. */
204 #define TX_RETRY 8 /* 0-15. retries = 16 + (TX_RETRY * 16) */
264 /* Bogus 8139 silicon reports 8129 without external PROM :-( */
308 Timer = 0x48, /* A general-purpose counter. */
316 Config4 = 0x5A, /* absent on RTL-8139A */
331 Config5 = 0xD8, /* absent on RTL-8139A */
404 TxDMAShift = 8, /* DMA burst value (0-7) is shifted X many bits */
405 TxRetryShift = 4, /* TXRR value (0-15) is shifted X many bits */
407 TxVersionMask = 0x7C800000, /* mask out version bits 30-26, 23 */
514 { "RTL-8139",
519 { "RTL-8139 rev K",
524 { "RTL-8139A",
529 { "RTL-8139A rev G",
534 { "RTL-8139B",
539 { "RTL-8130",
544 { "RTL-8139C",
549 { "RTL-8100",
554 { "RTL-8100B/8139D",
560 { "RTL-8101",
600 signed char phys[4]; /* MII device addresses. */
606 unsigned int default_port : 4; /* Last dev->if_port value. */
618 struct mii_if_info mii; member
624 MODULE_DESCRIPTION ("RealTek RTL-8139 Fast Ethernet driver");
724 assert (tp->pci_dev != NULL); in __rtl8139_cleanup_dev()
725 pdev = tp->pci_dev; in __rtl8139_cleanup_dev()
727 if (tp->mmio_addr) in __rtl8139_cleanup_dev()
728 pci_iounmap (pdev, tp->mmio_addr); in __rtl8139_cleanup_dev()
745 for (i = 1000; i > 0; i--) { in rtl8139_chip_reset()
756 struct device *d = &pdev->dev; in rtl8139_init_board()
778 return ERR_PTR(-ENOMEM); in rtl8139_init_board()
780 SET_NETDEV_DEV(dev, &pdev->dev); in rtl8139_init_board()
783 tp->pci_dev = pdev; in rtl8139_init_board()
797 u64_stats_init(&tp->rx_stats.syncp); in rtl8139_init_board()
798 u64_stats_init(&tp->tx_stats.syncp); in rtl8139_init_board()
811 rc = -ENODEV; in rtl8139_init_board()
817 rc = -ENODEV; in rtl8139_init_board()
828 rc = -ENODEV; in rtl8139_init_board()
831 tp->regs_len = io_len; in rtl8139_init_board()
832 tp->mmio_addr = ioaddr; in rtl8139_init_board()
834 /* Bring old chips out of low-power mode. */ in rtl8139_init_board()
839 dev_err(&pdev->dev, "Chip not responding, ignoring board\n"); in rtl8139_init_board()
840 rc = -EIO; in rtl8139_init_board()
848 tp->chipset = i; in rtl8139_init_board()
852 /* if unknown chip, assume array element #0, original RTL-8139 in this case */ in rtl8139_init_board()
854 dev_dbg(&pdev->dev, "unknown chip version, assuming RTL-8139\n"); in rtl8139_init_board()
855 dev_dbg(&pdev->dev, "TxConfig = 0x%x\n", RTL_R32 (TxConfig)); in rtl8139_init_board()
856 tp->chipset = 0; in rtl8139_init_board()
862 if (tp->chipset >= CH_8139B) { in rtl8139_init_board()
865 if ((rtl_chip_info[tp->chipset].flags & HasLWake) && in rtl8139_init_board()
874 if (rtl_chip_info[tp->chipset].flags & HasLWake) { in rtl8139_init_board()
904 netdev_features_t changed = features ^ dev->features; in rtl8139_set_features()
905 void __iomem *ioaddr = tp->mmio_addr; in rtl8139_set_features()
910 spin_lock_irqsave(&tp->lock, flags); in rtl8139_set_features()
913 int rx_mode = tp->rx_config; in rtl8139_set_features()
918 tp->rx_config = rtl8139_rx_config | rx_mode; in rtl8139_set_features()
919 RTL_W32_F(RxConfig, tp->rx_config); in rtl8139_set_features()
922 spin_unlock_irqrestore(&tp->lock, flags); in rtl8139_set_features()
951 static int board_idx = -1; in rtl8139_init_one()
969 if (pdev->vendor == PCI_VENDOR_ID_REALTEK && in rtl8139_init_one()
970 pdev->device == PCI_DEVICE_ID_REALTEK_8139 && pdev->revision >= 0x20) { in rtl8139_init_one()
971 dev_info(&pdev->dev, in rtl8139_init_one()
972 "This (id %04x:%04x rev %02x) is an enhanced 8139C+ chip, use 8139cp\n", in rtl8139_init_one()
973 pdev->vendor, pdev->device, pdev->revision); in rtl8139_init_one()
974 return -ENODEV; in rtl8139_init_one()
977 if (pdev->vendor == PCI_VENDOR_ID_REALTEK && in rtl8139_init_one()
978 pdev->device == PCI_DEVICE_ID_REALTEK_8139 && in rtl8139_init_one()
979 pdev->subsystem_vendor == PCI_VENDOR_ID_ATHEROS && in rtl8139_init_one()
980 pdev->subsystem_device == PCI_DEVICE_ID_REALTEK_8139) { in rtl8139_init_one()
991 tp->dev = dev; in rtl8139_init_one()
993 ioaddr = tp->mmio_addr; in rtl8139_init_one()
1001 /* The Rtl8139-specific entries in the device structure. */ in rtl8139_init_one()
1002 dev->netdev_ops = &rtl8139_netdev_ops; in rtl8139_init_one()
1003 dev->ethtool_ops = &rtl8139_ethtool_ops; in rtl8139_init_one()
1004 dev->watchdog_timeo = TX_TIMEOUT; in rtl8139_init_one()
1005 netif_napi_add(dev, &tp->napi, rtl8139_poll); in rtl8139_init_one()
1011 dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_HIGHDMA; in rtl8139_init_one()
1012 dev->vlan_features = dev->features; in rtl8139_init_one()
1014 dev->hw_features |= NETIF_F_RXALL; in rtl8139_init_one()
1015 dev->hw_features |= NETIF_F_RXFCS; in rtl8139_init_one()
1017 /* MTU range: 68 - 1770 */ in rtl8139_init_one()
1018 dev->min_mtu = ETH_MIN_MTU; in rtl8139_init_one()
1019 dev->max_mtu = MAX_ETH_DATA_SIZE; in rtl8139_init_one()
1024 /* note: tp->chipset set in rtl8139_init_board */ in rtl8139_init_one()
1025 tp->drv_flags = board_info[ent->driver_data].hw_flags; in rtl8139_init_one()
1026 tp->mmio_addr = ioaddr; in rtl8139_init_one()
1027 tp->msg_enable = in rtl8139_init_one()
1028 (debug < 0 ? RTL8139_DEF_MSG_ENABLE : ((1 << debug) - 1)); in rtl8139_init_one()
1029 spin_lock_init (&tp->lock); in rtl8139_init_one()
1030 spin_lock_init (&tp->rx_lock); in rtl8139_init_one()
1031 INIT_DELAYED_WORK(&tp->thread, rtl8139_thread); in rtl8139_init_one()
1032 tp->mii.dev = dev; in rtl8139_init_one()
1033 tp->mii.mdio_read = mdio_read; in rtl8139_init_one()
1034 tp->mii.mdio_write = mdio_write; in rtl8139_init_one()
1035 tp->mii.phy_id_mask = 0x3f; in rtl8139_init_one()
1036 tp->mii.reg_num_mask = 0x1f; in rtl8139_init_one()
1040 dev->name, dev); in rtl8139_init_one()
1047 board_info[ent->driver_data].name, in rtl8139_init_one()
1048 ioaddr, dev->dev_addr, pdev->irq); in rtl8139_init_one()
1051 rtl_chip_info[tp->chipset].name); in rtl8139_init_one()
1053 /* Find the connected MII xcvrs. in rtl8139_init_one()
1057 if (tp->drv_flags & HAS_MII_XCVR) { in rtl8139_init_one()
1059 for (phy = 0; phy < 32 && phy_idx < sizeof(tp->phys); phy++) { in rtl8139_init_one()
1063 tp->phys[phy_idx++] = phy; in rtl8139_init_one()
1064 netdev_info(dev, "MII transceiver %d status 0x%04x advertising %04x\n", in rtl8139_init_one()
1069 netdev_info(dev, "No MII transceivers found! Assuming SYM transceiver\n"); in rtl8139_init_one()
1070 tp->phys[0] = 32; in rtl8139_init_one()
1074 tp->phys[0] = 32; in rtl8139_init_one()
1075 tp->mii.phy_id = tp->phys[0]; in rtl8139_init_one()
1080 tp->mii.full_duplex = (option & 0x210) ? 1 : 0; in rtl8139_init_one()
1081 tp->default_port = option & 0xFF; in rtl8139_init_one()
1082 if (tp->default_port) in rtl8139_init_one()
1083 tp->mii.force_media = 1; in rtl8139_init_one()
1086 tp->mii.full_duplex = full_duplex[board_idx]; in rtl8139_init_one()
1087 if (tp->mii.full_duplex) { in rtl8139_init_one()
1089 /* Changing the MII-advertised media because might prevent in rtl8139_init_one()
1090 re-connection. */ in rtl8139_init_one()
1091 tp->mii.force_media = 1; in rtl8139_init_one()
1093 if (tp->default_port) { in rtl8139_init_one()
1094 netdev_info(dev, " Forcing %dMbps %s-duplex operation\n", in rtl8139_init_one()
1097 mdio_write(dev, tp->phys[0], 0, in rtl8139_init_one()
1102 /* Put the chip into low-power mode. */ in rtl8139_init_one()
1103 if (rtl_chip_info[tp->chipset].flags & HasHltClk) in rtl8139_init_one()
1122 cancel_delayed_work_sync(&tp->thread); in rtl8139_remove_one()
1148 /* The EEPROM commands include the alway-set leading bit. */
1164 for (i = 4 + addr_len; i >= 0; i--) { in read_eeprom()
1174 for (i = 16; i > 0; i--) { in read_eeprom()
1191 /* MII serial management: mostly bogus for now. */
1192 /* Read and write the MII management registers using software-generated
1195 met by back-to-back PCI I/O cycles, but we insert a delay to avoid
1220 /* Syncronize the MII management interface by shifting 32 one bits out. */
1225 for (i = 32; i >= 0; i--) { in mdio_sync()
1239 void __iomem *ioaddr = tp->mmio_addr; in mdio_read()
1245 void __iomem *ioaddr = tp->mmio_addr; in mdio_read()
1253 for (i = 15; i >= 0; i--) { in mdio_read()
1262 /* Read the two transition, 16 data, and wire-idle bits. */ in mdio_read()
1263 for (i = 19; i > 0; i--) { in mdio_read()
1281 void __iomem *ioaddr = tp->mmio_addr; in mdio_write()
1287 void __iomem *ioaddr = tp->mmio_addr; in mdio_write()
1301 for (i = 31; i >= 0; i--) { in mdio_write()
1310 for (i = 2; i > 0; i--) { in mdio_write()
1323 void __iomem *ioaddr = tp->mmio_addr; in rtl8139_open()
1324 const int irq = tp->pci_dev->irq; in rtl8139_open()
1327 retval = request_irq(irq, rtl8139_interrupt, IRQF_SHARED, dev->name, dev); in rtl8139_open()
1331 tp->tx_bufs = dma_alloc_coherent(&tp->pci_dev->dev, TX_BUF_TOT_LEN, in rtl8139_open()
1332 &tp->tx_bufs_dma, GFP_KERNEL); in rtl8139_open()
1333 tp->rx_ring = dma_alloc_coherent(&tp->pci_dev->dev, RX_BUF_TOT_LEN, in rtl8139_open()
1334 &tp->rx_ring_dma, GFP_KERNEL); in rtl8139_open()
1335 if (tp->tx_bufs == NULL || tp->rx_ring == NULL) { in rtl8139_open()
1338 if (tp->tx_bufs) in rtl8139_open()
1339 dma_free_coherent(&tp->pci_dev->dev, TX_BUF_TOT_LEN, in rtl8139_open()
1340 tp->tx_bufs, tp->tx_bufs_dma); in rtl8139_open()
1341 if (tp->rx_ring) in rtl8139_open()
1342 dma_free_coherent(&tp->pci_dev->dev, RX_BUF_TOT_LEN, in rtl8139_open()
1343 tp->rx_ring, tp->rx_ring_dma); in rtl8139_open()
1345 return -ENOMEM; in rtl8139_open()
1349 napi_enable(&tp->napi); in rtl8139_open()
1351 tp->mii.full_duplex = tp->mii.force_media; in rtl8139_open()
1352 tp->tx_flag = (TX_FIFO_THRESH << 11) & 0x003f0000; in rtl8139_open()
1359 "%s() ioaddr %#llx IRQ %d GP Pins %02x %s-duplex\n", in rtl8139_open()
1361 (unsigned long long)pci_resource_start (tp->pci_dev, 1), in rtl8139_open()
1363 tp->mii.full_duplex ? "full" : "half"); in rtl8139_open()
1375 if (tp->phys[0] >= 0) { in rtl_check_media()
1376 mii_check_media(&tp->mii, netif_msg_link(tp), init_media); in rtl_check_media()
1384 void __iomem *ioaddr = tp->mmio_addr; in rtl8139_hw_start()
1388 /* Bring old chips out of low-power mode. */ in rtl8139_hw_start()
1389 if (rtl_chip_info[tp->chipset].flags & HasHltClk) in rtl8139_hw_start()
1397 RTL_W32_F (MAC0 + 0, le32_to_cpu (*(__le32 *) (dev->dev_addr + 0))); in rtl8139_hw_start()
1398 RTL_W32_F (MAC0 + 4, le16_to_cpu (*(__le16 *) (dev->dev_addr + 4))); in rtl8139_hw_start()
1400 tp->cur_rx = 0; in rtl8139_hw_start()
1403 RTL_W32_F (RxBuf, tp->rx_ring_dma); in rtl8139_hw_start()
1408 tp->rx_config = rtl8139_rx_config | AcceptBroadcast | AcceptMyPhys; in rtl8139_hw_start()
1409 RTL_W32 (RxConfig, tp->rx_config); in rtl8139_hw_start()
1414 if (tp->chipset >= CH_8139B) { in rtl8139_hw_start()
1428 RTL_W32_F (TxAddr0 + (i * 4), tp->tx_bufs_dma + (tp->tx_buf[i] - tp->tx_bufs)); in rtl8139_hw_start()
1434 /* no early-rx interrupts */ in rtl8139_hw_start()
1453 tp->cur_rx = 0; in rtl8139_init_ring()
1454 tp->cur_tx = 0; in rtl8139_init_ring()
1455 tp->dirty_tx = 0; in rtl8139_init_ring()
1458 tp->tx_buf[i] = &tp->tx_bufs[i * TX_BUF_SIZE]; in rtl8139_init_ring()
1486 void __iomem *ioaddr = tp->mmio_addr; in rtl8139_tune_twister()
1492 switch (tp->twistie) { in rtl8139_tune_twister()
1497 tp->twistie = 2; /* Change to state 2. */ in rtl8139_tune_twister()
1505 tp->twistie = 0; /* Bail from future actions. */ in rtl8139_tune_twister()
1512 tp->twist_row = 3; in rtl8139_tune_twister()
1514 tp->twist_row = 2; in rtl8139_tune_twister()
1516 tp->twist_row = 1; in rtl8139_tune_twister()
1518 tp->twist_row = 0; in rtl8139_tune_twister()
1519 tp->twist_col = 0; in rtl8139_tune_twister()
1520 tp->twistie = 3; /* Change to state 2. */ in rtl8139_tune_twister()
1525 if (tp->twist_col == 0) in rtl8139_tune_twister()
1527 RTL_W32 (PARA7c, param[(int) tp->twist_row] in rtl8139_tune_twister()
1528 [(int) tp->twist_col]); in rtl8139_tune_twister()
1530 if (++tp->twist_col >= 4) { in rtl8139_tune_twister()
1533 tp->twistie = in rtl8139_tune_twister()
1534 (tp->twist_row == 3) ? 4 : 0; in rtl8139_tune_twister()
1541 tp->twistie = 0; in rtl8139_tune_twister()
1545 tp->twistie = 5; in rtl8139_tune_twister()
1555 tp->twist_row = 2; in rtl8139_tune_twister()
1556 tp->twist_col = 0; in rtl8139_tune_twister()
1557 tp->twistie = 3; in rtl8139_tune_twister()
1574 mii_lpa = mdio_read (dev, tp->phys[0], MII_LPA); in rtl8139_thread_iter()
1576 if (!tp->mii.force_media && mii_lpa != 0xffff) { in rtl8139_thread_iter()
1579 if (tp->mii.full_duplex != duplex) { in rtl8139_thread_iter()
1580 tp->mii.full_duplex = duplex; in rtl8139_thread_iter()
1583 netdev_info(dev, "Setting %s-duplex based on MII #%d link partner ability of %04x\n", in rtl8139_thread_iter()
1584 tp->mii.full_duplex ? "full" : "half", in rtl8139_thread_iter()
1585 tp->phys[0], mii_lpa); in rtl8139_thread_iter()
1591 RTL_W8 (Config1, tp->mii.full_duplex ? 0x60 : 0x20); in rtl8139_thread_iter()
1613 struct net_device *dev = tp->mii.dev; in rtl8139_thread()
1621 if (tp->watchdog_fired) { in rtl8139_thread()
1622 tp->watchdog_fired = 0; in rtl8139_thread()
1625 rtl8139_thread_iter(dev, tp, tp->mmio_addr); in rtl8139_thread()
1627 if (tp->have_thread) in rtl8139_thread()
1628 schedule_delayed_work(&tp->thread, thr_delay); in rtl8139_thread()
1635 tp->twistie = 0; in rtl8139_start_thread()
1636 if (tp->chipset == CH_8139_K) in rtl8139_start_thread()
1637 tp->twistie = 1; in rtl8139_start_thread()
1638 else if (tp->drv_flags & HAS_LNK_CHNG) in rtl8139_start_thread()
1641 tp->have_thread = 1; in rtl8139_start_thread()
1642 tp->watchdog_fired = 0; in rtl8139_start_thread()
1644 schedule_delayed_work(&tp->thread, next_tick); in rtl8139_start_thread()
1649 tp->cur_tx = 0; in rtl8139_tx_clear()
1650 tp->dirty_tx = 0; in rtl8139_tx_clear()
1652 /* XXX account for unsent Tx packets in tp->stats.tx_dropped */ in rtl8139_tx_clear()
1659 struct net_device *dev = tp->mii.dev; in rtl8139_tx_timeout_task()
1660 void __iomem *ioaddr = tp->mmio_addr; in rtl8139_tx_timeout_task()
1664 napi_disable(&tp->napi); in rtl8139_tx_timeout_task()
1673 tp->cur_tx, tp->dirty_tx); in rtl8139_tx_timeout_task()
1677 i == tp->dirty_tx % NUM_TX_DESC ? in rtl8139_tx_timeout_task()
1680 tp->xstats.tx_timeouts++; in rtl8139_tx_timeout_task()
1688 spin_lock_bh(&tp->rx_lock); in rtl8139_tx_timeout_task()
1693 spin_lock_irq(&tp->lock); in rtl8139_tx_timeout_task()
1695 spin_unlock_irq(&tp->lock); in rtl8139_tx_timeout_task()
1698 napi_enable_locked(&tp->napi); in rtl8139_tx_timeout_task()
1702 spin_unlock_bh(&tp->rx_lock); in rtl8139_tx_timeout_task()
1710 tp->watchdog_fired = 1; in rtl8139_tx_timeout()
1711 if (!tp->have_thread) { in rtl8139_tx_timeout()
1712 INIT_DELAYED_WORK(&tp->thread, rtl8139_thread); in rtl8139_tx_timeout()
1713 schedule_delayed_work(&tp->thread, next_tick); in rtl8139_tx_timeout()
1721 void __iomem *ioaddr = tp->mmio_addr; in rtl8139_start_xmit()
1723 unsigned int len = skb->len; in rtl8139_start_xmit()
1727 entry = tp->cur_tx % NUM_TX_DESC; in rtl8139_start_xmit()
1729 /* Note: the chip doesn't have auto-pad! */ in rtl8139_start_xmit()
1732 memset(tp->tx_buf[entry], 0, ETH_ZLEN); in rtl8139_start_xmit()
1733 skb_copy_and_csum_dev(skb, tp->tx_buf[entry]); in rtl8139_start_xmit()
1737 dev->stats.tx_dropped++; in rtl8139_start_xmit()
1741 spin_lock_irqsave(&tp->lock, flags); in rtl8139_start_xmit()
1744 * copied to tp->tx_buf[entry] above. Use a memory barrier in rtl8139_start_xmit()
1749 tp->tx_flag | max(len, (unsigned int)ETH_ZLEN)); in rtl8139_start_xmit()
1751 tp->cur_tx++; in rtl8139_start_xmit()
1753 if ((tp->cur_tx - NUM_TX_DESC) == tp->dirty_tx) in rtl8139_start_xmit()
1755 spin_unlock_irqrestore(&tp->lock, flags); in rtl8139_start_xmit()
1773 dirty_tx = tp->dirty_tx; in rtl8139_tx_interrupt()
1774 tx_left = tp->cur_tx - dirty_tx; in rtl8139_tx_interrupt()
1789 dev->stats.tx_errors++; in rtl8139_tx_interrupt()
1791 dev->stats.tx_aborted_errors++; in rtl8139_tx_interrupt()
1797 dev->stats.tx_carrier_errors++; in rtl8139_tx_interrupt()
1799 dev->stats.tx_window_errors++; in rtl8139_tx_interrupt()
1803 if (tp->tx_flag < 0x00300000) in rtl8139_tx_interrupt()
1804 tp->tx_flag += 0x00020000; in rtl8139_tx_interrupt()
1805 dev->stats.tx_fifo_errors++; in rtl8139_tx_interrupt()
1807 dev->stats.collisions += (txstatus >> 24) & 15; in rtl8139_tx_interrupt()
1808 u64_stats_update_begin(&tp->tx_stats.syncp); in rtl8139_tx_interrupt()
1809 tp->tx_stats.packets++; in rtl8139_tx_interrupt()
1810 tp->tx_stats.bytes += txstatus & 0x7ff; in rtl8139_tx_interrupt()
1811 u64_stats_update_end(&tp->tx_stats.syncp); in rtl8139_tx_interrupt()
1815 tx_left--; in rtl8139_tx_interrupt()
1819 if (tp->cur_tx - dirty_tx > NUM_TX_DESC) { in rtl8139_tx_interrupt()
1820 netdev_err(dev, "Out-of-sync dirty pointer, %ld vs. %ld\n", in rtl8139_tx_interrupt()
1821 dirty_tx, tp->cur_tx); in rtl8139_tx_interrupt()
1827 if (tp->dirty_tx != dirty_tx) { in rtl8139_tx_interrupt()
1828 tp->dirty_tx = dirty_tx; in rtl8139_tx_interrupt()
1846 dev->stats.rx_errors++; in rtl8139_rx_err()
1854 dev->stats.rx_frame_errors++; in rtl8139_rx_err()
1856 dev->stats.rx_length_errors++; in rtl8139_rx_err()
1858 dev->stats.rx_crc_errors++; in rtl8139_rx_err()
1860 tp->xstats.rx_lost_in_ring++; in rtl8139_rx_err()
1867 RTL_W32 (RxConfig, tp->rx_config); in rtl8139_rx_err()
1868 tp->cur_rx = 0; in rtl8139_rx_err()
1875 while (--tmp_work > 0) { in rtl8139_rx_err()
1885 while (--tmp_work > 0) { in rtl8139_rx_err()
1900 tp->rx_config = rtl8139_rx_config | AcceptBroadcast | AcceptMyPhys; in rtl8139_rx_err()
1901 RTL_W32 (RxConfig, tp->rx_config); in rtl8139_rx_err()
1902 tp->cur_rx = 0; in rtl8139_rx_err()
1910 RTL_W32_F (RxBuf, tp->rx_ring_dma); in rtl8139_rx_err()
1921 u32 left = RX_BUF_LEN - offset; in wrap_copy()
1925 skb_copy_to_linear_data_offset(skb, left, ring, size - left); in wrap_copy()
1933 void __iomem *ioaddr = tp->mmio_addr; in rtl8139_isr_ack()
1941 tp->dev->stats.rx_errors++; in rtl8139_isr_ack()
1943 tp->dev->stats.rx_fifo_errors++; in rtl8139_isr_ack()
1952 void __iomem *ioaddr = tp->mmio_addr; in rtl8139_rx()
1954 unsigned char *rx_ring = tp->rx_ring; in rtl8139_rx()
1955 unsigned int cur_rx = tp->cur_rx; in rtl8139_rx()
1974 if (likely(!(dev->features & NETIF_F_RXFCS))) in rtl8139_rx()
1975 pkt_size = rx_size - 4; in rtl8139_rx()
1992 if (!tp->fifo_copy_timeout) in rtl8139_rx()
1993 tp->fifo_copy_timeout = jiffies + 2; in rtl8139_rx()
1994 else if (time_after(jiffies, tp->fifo_copy_timeout)) { in rtl8139_rx()
2000 tp->xstats.early_rx++; in rtl8139_rx()
2005 tp->fifo_copy_timeout = 0; in rtl8139_rx()
2015 if ((dev->features & NETIF_F_RXALL) && in rtl8139_rx()
2021 * errors without resetting the chip. --Ben in rtl8139_rx()
2023 dev->stats.rx_errors++; in rtl8139_rx()
2025 dev->stats.rx_crc_errors++; in rtl8139_rx()
2029 dev->stats.rx_length_errors++; in rtl8139_rx()
2034 received = -1; in rtl8139_rx()
2039 /* Malloc up new buffer, compatible with net-2e. */ in rtl8139_rx()
2042 skb = napi_alloc_skb(&tp->napi, pkt_size); in rtl8139_rx()
2051 skb->protocol = eth_type_trans (skb, dev); in rtl8139_rx()
2053 u64_stats_update_begin(&tp->rx_stats.syncp); in rtl8139_rx()
2054 tp->rx_stats.packets++; in rtl8139_rx()
2055 tp->rx_stats.bytes += pkt_size; in rtl8139_rx()
2056 u64_stats_update_end(&tp->rx_stats.syncp); in rtl8139_rx()
2060 dev->stats.rx_dropped++; in rtl8139_rx()
2065 RTL_W16 (RxBufPtr, (u16) (cur_rx - 16)); in rtl8139_rx()
2077 tp->cur_rx = cur_rx; in rtl8139_rx()
2083 if (tp->fifo_copy_timeout) in rtl8139_rx()
2103 dev->stats.rx_missed_errors += RTL_R32 (RxMissed); in rtl8139_weird_interrupt()
2107 (tp->drv_flags & HAS_LNK_CHNG)) { in rtl8139_weird_interrupt()
2113 dev->stats.rx_errors++; in rtl8139_weird_interrupt()
2116 dev->stats.rx_length_errors++; in rtl8139_weird_interrupt()
2118 dev->stats.rx_fifo_errors++; in rtl8139_weird_interrupt()
2121 pci_read_config_word (tp->pci_dev, PCI_STATUS, &pci_cmd_status); in rtl8139_weird_interrupt()
2122 pci_write_config_word (tp->pci_dev, PCI_STATUS, pci_cmd_status); in rtl8139_weird_interrupt()
2131 struct net_device *dev = tp->dev; in rtl8139_poll()
2132 void __iomem *ioaddr = tp->mmio_addr; in rtl8139_poll()
2135 spin_lock(&tp->rx_lock); in rtl8139_poll()
2143 spin_lock_irqsave(&tp->lock, flags); in rtl8139_poll()
2146 spin_unlock_irqrestore(&tp->lock, flags); in rtl8139_poll()
2148 spin_unlock(&tp->rx_lock); in rtl8139_poll()
2159 void __iomem *ioaddr = tp->mmio_addr; in rtl8139_interrupt()
2164 spin_lock (&tp->lock); in rtl8139_interrupt()
2195 if (napi_schedule_prep(&tp->napi)) { in rtl8139_interrupt()
2197 __napi_schedule(&tp->napi); in rtl8139_interrupt()
2212 spin_unlock (&tp->lock); in rtl8139_interrupt()
2221 * Polling receive - used by netconsole and other diagnostic tools
2227 const int irq = tp->pci_dev->irq; in rtl8139_poll_controller()
2238 void __iomem *ioaddr = tp->mmio_addr; in rtl8139_set_mac_address()
2241 if (!is_valid_ether_addr(addr->sa_data)) in rtl8139_set_mac_address()
2242 return -EADDRNOTAVAIL; in rtl8139_set_mac_address()
2244 eth_hw_addr_set(dev, addr->sa_data); in rtl8139_set_mac_address()
2246 spin_lock_irq(&tp->lock); in rtl8139_set_mac_address()
2249 RTL_W32_F(MAC0 + 0, cpu_to_le32 (*(u32 *) (dev->dev_addr + 0))); in rtl8139_set_mac_address()
2250 RTL_W32_F(MAC0 + 4, cpu_to_le32 (*(u32 *) (dev->dev_addr + 4))); in rtl8139_set_mac_address()
2253 spin_unlock_irq(&tp->lock); in rtl8139_set_mac_address()
2261 void __iomem *ioaddr = tp->mmio_addr; in rtl8139_close()
2265 napi_disable(&tp->napi); in rtl8139_close()
2270 spin_lock_irqsave (&tp->lock, flags); in rtl8139_close()
2279 dev->stats.rx_missed_errors += RTL_R32 (RxMissed); in rtl8139_close()
2282 spin_unlock_irqrestore (&tp->lock, flags); in rtl8139_close()
2284 free_irq(tp->pci_dev->irq, dev); in rtl8139_close()
2288 dma_free_coherent(&tp->pci_dev->dev, RX_BUF_TOT_LEN, in rtl8139_close()
2289 tp->rx_ring, tp->rx_ring_dma); in rtl8139_close()
2290 dma_free_coherent(&tp->pci_dev->dev, TX_BUF_TOT_LEN, in rtl8139_close()
2291 tp->tx_bufs, tp->tx_bufs_dma); in rtl8139_close()
2292 tp->rx_ring = NULL; in rtl8139_close()
2293 tp->tx_bufs = NULL; in rtl8139_close()
2295 /* Green! Put the chip in low-power mode. */ in rtl8139_close()
2298 if (rtl_chip_info[tp->chipset].flags & HasHltClk) in rtl8139_close()
2305 /* Get the ethtool Wake-on-LAN settings. Assumes that wol points to
2311 void __iomem *ioaddr = tp->mmio_addr; in rtl8139_get_wol()
2313 spin_lock_irq(&tp->lock); in rtl8139_get_wol()
2314 if (rtl_chip_info[tp->chipset].flags & HasLWake) { in rtl8139_get_wol()
2318 wol->supported = WAKE_PHY | WAKE_MAGIC in rtl8139_get_wol()
2321 wol->wolopts = 0; in rtl8139_get_wol()
2323 wol->wolopts |= WAKE_PHY; in rtl8139_get_wol()
2325 wol->wolopts |= WAKE_MAGIC; in rtl8139_get_wol()
2329 wol->wolopts |= WAKE_UCAST; in rtl8139_get_wol()
2331 wol->wolopts |= WAKE_MCAST; in rtl8139_get_wol()
2333 wol->wolopts |= WAKE_BCAST; in rtl8139_get_wol()
2335 spin_unlock_irq(&tp->lock); in rtl8139_get_wol()
2339 /* Set the ethtool Wake-on-LAN settings. Return 0 or -errno. Assumes
2345 void __iomem *ioaddr = tp->mmio_addr; in rtl8139_set_wol()
2349 support = ((rtl_chip_info[tp->chipset].flags & HasLWake) in rtl8139_set_wol()
2353 if (wol->wolopts & ~support) in rtl8139_set_wol()
2354 return -EINVAL; in rtl8139_set_wol()
2356 spin_lock_irq(&tp->lock); in rtl8139_set_wol()
2358 if (wol->wolopts & WAKE_PHY) in rtl8139_set_wol()
2360 if (wol->wolopts & WAKE_MAGIC) in rtl8139_set_wol()
2370 if (wol->wolopts & WAKE_UCAST) in rtl8139_set_wol()
2372 if (wol->wolopts & WAKE_MCAST) in rtl8139_set_wol()
2374 if (wol->wolopts & WAKE_BCAST) in rtl8139_set_wol()
2377 spin_unlock_irq(&tp->lock); in rtl8139_set_wol()
2385 strscpy(info->driver, DRV_NAME, sizeof(info->driver)); in rtl8139_get_drvinfo()
2386 strscpy(info->version, DRV_VERSION, sizeof(info->version)); in rtl8139_get_drvinfo()
2387 strscpy(info->bus_info, pci_name(tp->pci_dev), sizeof(info->bus_info)); in rtl8139_get_drvinfo()
2394 spin_lock_irq(&tp->lock); in rtl8139_get_link_ksettings()
2395 mii_ethtool_get_link_ksettings(&tp->mii, cmd); in rtl8139_get_link_ksettings()
2396 spin_unlock_irq(&tp->lock); in rtl8139_get_link_ksettings()
2405 spin_lock_irq(&tp->lock); in rtl8139_set_link_ksettings()
2406 rc = mii_ethtool_set_link_ksettings(&tp->mii, cmd); in rtl8139_set_link_ksettings()
2407 spin_unlock_irq(&tp->lock); in rtl8139_set_link_ksettings()
2414 return mii_nway_restart(&tp->mii); in rtl8139_nway_reset()
2420 return mii_link_ok(&tp->mii); in rtl8139_get_link()
2426 return tp->msg_enable; in rtl8139_get_msglevel()
2432 tp->msg_enable = datum; in rtl8139_set_msglevel()
2442 return tp->regs_len; in rtl8139_get_regs_len()
2454 regs->version = RTL_REGS_VER; in rtl8139_get_regs()
2456 spin_lock_irq(&tp->lock); in rtl8139_get_regs()
2457 memcpy_fromio(regbuf, tp->mmio_addr, regs->len); in rtl8139_get_regs()
2458 spin_unlock_irq(&tp->lock); in rtl8139_get_regs()
2467 return -EOPNOTSUPP; in rtl8139_get_sset_count()
2475 data[0] = tp->xstats.early_rx; in rtl8139_get_ethtool_stats()
2476 data[1] = tp->xstats.tx_buf_mapped; in rtl8139_get_ethtool_stats()
2477 data[2] = tp->xstats.tx_timeouts; in rtl8139_get_ethtool_stats()
2478 data[3] = tp->xstats.rx_lost_in_ring; in rtl8139_get_ethtool_stats()
2509 return -EINVAL; in netdev_ioctl()
2511 spin_lock_irq(&tp->lock); in netdev_ioctl()
2512 rc = generic_mii_ioctl(&tp->mii, if_mii(rq), cmd, NULL); in netdev_ioctl()
2513 spin_unlock_irq(&tp->lock); in netdev_ioctl()
2523 void __iomem *ioaddr = tp->mmio_addr; in rtl8139_get_stats64()
2528 spin_lock_irqsave (&tp->lock, flags); in rtl8139_get_stats64()
2529 dev->stats.rx_missed_errors += RTL_R32 (RxMissed); in rtl8139_get_stats64()
2531 spin_unlock_irqrestore (&tp->lock, flags); in rtl8139_get_stats64()
2534 netdev_stats_to_stats64(stats, &dev->stats); in rtl8139_get_stats64()
2537 start = u64_stats_fetch_begin(&tp->rx_stats.syncp); in rtl8139_get_stats64()
2538 stats->rx_packets = tp->rx_stats.packets; in rtl8139_get_stats64()
2539 stats->rx_bytes = tp->rx_stats.bytes; in rtl8139_get_stats64()
2540 } while (u64_stats_fetch_retry(&tp->rx_stats.syncp, start)); in rtl8139_get_stats64()
2543 start = u64_stats_fetch_begin(&tp->tx_stats.syncp); in rtl8139_get_stats64()
2544 stats->tx_packets = tp->tx_stats.packets; in rtl8139_get_stats64()
2545 stats->tx_bytes = tp->tx_stats.bytes; in rtl8139_get_stats64()
2546 } while (u64_stats_fetch_retry(&tp->tx_stats.syncp, start)); in rtl8139_get_stats64()
2555 void __iomem *ioaddr = tp->mmio_addr; in __set_rx_mode()
2560 netdev_dbg(dev, "rtl8139_set_rx_mode(%04x) done -- Rx config %08x\n", in __set_rx_mode()
2561 dev->flags, RTL_R32(RxConfig)); in __set_rx_mode()
2564 if (dev->flags & IFF_PROMISC) { in __set_rx_mode()
2570 (dev->flags & IFF_ALLMULTI)) { in __set_rx_mode()
2571 /* Too many to filter perfectly -- accept all multicasts. */ in __set_rx_mode()
2579 int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26; in __set_rx_mode()
2586 if (dev->features & NETIF_F_RXALL) in __set_rx_mode()
2591 if (tp->rx_config != tmp) { in __set_rx_mode()
2593 tp->rx_config = tmp; in __set_rx_mode()
2604 spin_lock_irqsave (&tp->lock, flags); in rtl8139_set_rx_mode()
2606 spin_unlock_irqrestore (&tp->lock, flags); in rtl8139_set_rx_mode()
2613 void __iomem *ioaddr = tp->mmio_addr; in rtl8139_suspend()
2621 spin_lock_irqsave (&tp->lock, flags); in rtl8139_suspend()
2628 dev->stats.rx_missed_errors += RTL_R32 (RxMissed); in rtl8139_suspend()
2631 spin_unlock_irqrestore (&tp->lock, flags); in rtl8139_suspend()