| .. | .. |
|---|
| 280 | 280 | signed char phys[4]; /* MII device addresses. */ |
|---|
| 281 | 281 | u16 advertising; /* NWay media advertisement */ |
|---|
| 282 | 282 | int mii_phy_cnt; |
|---|
| 283 | + u32 ethtool_ops_nesting; |
|---|
| 283 | 284 | struct mii_if_info mii; |
|---|
| 284 | 285 | unsigned int tx_full:1; /* The Tx queue is full. */ |
|---|
| 285 | 286 | unsigned int default_port:4; /* Last dev->if_port value. */ |
|---|
| .. | .. |
|---|
| 291 | 292 | static void mdio_write(struct net_device *dev, int phy_id, int loc, int val); |
|---|
| 292 | 293 | static void epic_restart(struct net_device *dev); |
|---|
| 293 | 294 | static void epic_timer(struct timer_list *t); |
|---|
| 294 | | -static void epic_tx_timeout(struct net_device *dev); |
|---|
| 295 | +static void epic_tx_timeout(struct net_device *dev, unsigned int txqueue); |
|---|
| 295 | 296 | static void epic_init_ring(struct net_device *dev); |
|---|
| 296 | 297 | static netdev_tx_t epic_start_xmit(struct sk_buff *skb, |
|---|
| 297 | 298 | struct net_device *dev); |
|---|
| .. | .. |
|---|
| 373 | 374 | ep->mii.phy_id_mask = 0x1f; |
|---|
| 374 | 375 | ep->mii.reg_num_mask = 0x1f; |
|---|
| 375 | 376 | |
|---|
| 376 | | - ring_space = pci_alloc_consistent(pdev, TX_TOTAL_SIZE, &ring_dma); |
|---|
| 377 | + ring_space = dma_alloc_coherent(&pdev->dev, TX_TOTAL_SIZE, &ring_dma, |
|---|
| 378 | + GFP_KERNEL); |
|---|
| 377 | 379 | if (!ring_space) |
|---|
| 378 | 380 | goto err_out_iounmap; |
|---|
| 379 | 381 | ep->tx_ring = ring_space; |
|---|
| 380 | 382 | ep->tx_ring_dma = ring_dma; |
|---|
| 381 | 383 | |
|---|
| 382 | | - ring_space = pci_alloc_consistent(pdev, RX_TOTAL_SIZE, &ring_dma); |
|---|
| 384 | + ring_space = dma_alloc_coherent(&pdev->dev, RX_TOTAL_SIZE, &ring_dma, |
|---|
| 385 | + GFP_KERNEL); |
|---|
| 383 | 386 | if (!ring_space) |
|---|
| 384 | 387 | goto err_out_unmap_tx; |
|---|
| 385 | 388 | ep->rx_ring = ring_space; |
|---|
| .. | .. |
|---|
| 492 | 495 | return ret; |
|---|
| 493 | 496 | |
|---|
| 494 | 497 | err_out_unmap_rx: |
|---|
| 495 | | - pci_free_consistent(pdev, RX_TOTAL_SIZE, ep->rx_ring, ep->rx_ring_dma); |
|---|
| 498 | + dma_free_coherent(&pdev->dev, RX_TOTAL_SIZE, ep->rx_ring, |
|---|
| 499 | + ep->rx_ring_dma); |
|---|
| 496 | 500 | err_out_unmap_tx: |
|---|
| 497 | | - pci_free_consistent(pdev, TX_TOTAL_SIZE, ep->tx_ring, ep->tx_ring_dma); |
|---|
| 501 | + dma_free_coherent(&pdev->dev, TX_TOTAL_SIZE, ep->tx_ring, |
|---|
| 502 | + ep->tx_ring_dma); |
|---|
| 498 | 503 | err_out_iounmap: |
|---|
| 499 | 504 | pci_iounmap(pdev, ioaddr); |
|---|
| 500 | 505 | err_out_free_netdev: |
|---|
| .. | .. |
|---|
| 861 | 866 | add_timer(&ep->timer); |
|---|
| 862 | 867 | } |
|---|
| 863 | 868 | |
|---|
| 864 | | -static void epic_tx_timeout(struct net_device *dev) |
|---|
| 869 | +static void epic_tx_timeout(struct net_device *dev, unsigned int txqueue) |
|---|
| 865 | 870 | { |
|---|
| 866 | 871 | struct epic_private *ep = netdev_priv(dev); |
|---|
| 867 | 872 | void __iomem *ioaddr = ep->ioaddr; |
|---|
| .. | .. |
|---|
| 917 | 922 | if (skb == NULL) |
|---|
| 918 | 923 | break; |
|---|
| 919 | 924 | skb_reserve(skb, 2); /* 16 byte align the IP header. */ |
|---|
| 920 | | - ep->rx_ring[i].bufaddr = pci_map_single(ep->pci_dev, |
|---|
| 921 | | - skb->data, ep->rx_buf_sz, PCI_DMA_FROMDEVICE); |
|---|
| 925 | + ep->rx_ring[i].bufaddr = dma_map_single(&ep->pci_dev->dev, |
|---|
| 926 | + skb->data, |
|---|
| 927 | + ep->rx_buf_sz, |
|---|
| 928 | + DMA_FROM_DEVICE); |
|---|
| 922 | 929 | ep->rx_ring[i].rxstatus = DescOwn; |
|---|
| 923 | 930 | } |
|---|
| 924 | 931 | ep->dirty_rx = (unsigned int)(i - RX_RING_SIZE); |
|---|
| .. | .. |
|---|
| 954 | 961 | entry = ep->cur_tx % TX_RING_SIZE; |
|---|
| 955 | 962 | |
|---|
| 956 | 963 | ep->tx_skbuff[entry] = skb; |
|---|
| 957 | | - ep->tx_ring[entry].bufaddr = pci_map_single(ep->pci_dev, skb->data, |
|---|
| 958 | | - skb->len, PCI_DMA_TODEVICE); |
|---|
| 964 | + ep->tx_ring[entry].bufaddr = dma_map_single(&ep->pci_dev->dev, |
|---|
| 965 | + skb->data, skb->len, |
|---|
| 966 | + DMA_TO_DEVICE); |
|---|
| 959 | 967 | if (free_count < TX_QUEUE_LEN/2) {/* Typical path */ |
|---|
| 960 | 968 | ctrl_word = 0x100000; /* No interrupt */ |
|---|
| 961 | 969 | } else if (free_count == TX_QUEUE_LEN/2) { |
|---|
| .. | .. |
|---|
| 1035 | 1043 | |
|---|
| 1036 | 1044 | /* Free the original skb. */ |
|---|
| 1037 | 1045 | skb = ep->tx_skbuff[entry]; |
|---|
| 1038 | | - pci_unmap_single(ep->pci_dev, ep->tx_ring[entry].bufaddr, |
|---|
| 1039 | | - skb->len, PCI_DMA_TODEVICE); |
|---|
| 1040 | | - dev_kfree_skb_irq(skb); |
|---|
| 1046 | + dma_unmap_single(&ep->pci_dev->dev, |
|---|
| 1047 | + ep->tx_ring[entry].bufaddr, skb->len, |
|---|
| 1048 | + DMA_TO_DEVICE); |
|---|
| 1049 | + dev_consume_skb_irq(skb); |
|---|
| 1041 | 1050 | ep->tx_skbuff[entry] = NULL; |
|---|
| 1042 | 1051 | } |
|---|
| 1043 | 1052 | |
|---|
| .. | .. |
|---|
| 1177 | 1186 | if (pkt_len < rx_copybreak && |
|---|
| 1178 | 1187 | (skb = netdev_alloc_skb(dev, pkt_len + 2)) != NULL) { |
|---|
| 1179 | 1188 | skb_reserve(skb, 2); /* 16 byte align the IP header */ |
|---|
| 1180 | | - pci_dma_sync_single_for_cpu(ep->pci_dev, |
|---|
| 1181 | | - ep->rx_ring[entry].bufaddr, |
|---|
| 1182 | | - ep->rx_buf_sz, |
|---|
| 1183 | | - PCI_DMA_FROMDEVICE); |
|---|
| 1189 | + dma_sync_single_for_cpu(&ep->pci_dev->dev, |
|---|
| 1190 | + ep->rx_ring[entry].bufaddr, |
|---|
| 1191 | + ep->rx_buf_sz, |
|---|
| 1192 | + DMA_FROM_DEVICE); |
|---|
| 1184 | 1193 | skb_copy_to_linear_data(skb, ep->rx_skbuff[entry]->data, pkt_len); |
|---|
| 1185 | 1194 | skb_put(skb, pkt_len); |
|---|
| 1186 | | - pci_dma_sync_single_for_device(ep->pci_dev, |
|---|
| 1187 | | - ep->rx_ring[entry].bufaddr, |
|---|
| 1188 | | - ep->rx_buf_sz, |
|---|
| 1189 | | - PCI_DMA_FROMDEVICE); |
|---|
| 1195 | + dma_sync_single_for_device(&ep->pci_dev->dev, |
|---|
| 1196 | + ep->rx_ring[entry].bufaddr, |
|---|
| 1197 | + ep->rx_buf_sz, |
|---|
| 1198 | + DMA_FROM_DEVICE); |
|---|
| 1190 | 1199 | } else { |
|---|
| 1191 | | - pci_unmap_single(ep->pci_dev, |
|---|
| 1192 | | - ep->rx_ring[entry].bufaddr, |
|---|
| 1193 | | - ep->rx_buf_sz, PCI_DMA_FROMDEVICE); |
|---|
| 1200 | + dma_unmap_single(&ep->pci_dev->dev, |
|---|
| 1201 | + ep->rx_ring[entry].bufaddr, |
|---|
| 1202 | + ep->rx_buf_sz, |
|---|
| 1203 | + DMA_FROM_DEVICE); |
|---|
| 1194 | 1204 | skb_put(skb = ep->rx_skbuff[entry], pkt_len); |
|---|
| 1195 | 1205 | ep->rx_skbuff[entry] = NULL; |
|---|
| 1196 | 1206 | } |
|---|
| .. | .. |
|---|
| 1212 | 1222 | if (skb == NULL) |
|---|
| 1213 | 1223 | break; |
|---|
| 1214 | 1224 | skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */ |
|---|
| 1215 | | - ep->rx_ring[entry].bufaddr = pci_map_single(ep->pci_dev, |
|---|
| 1216 | | - skb->data, ep->rx_buf_sz, PCI_DMA_FROMDEVICE); |
|---|
| 1225 | + ep->rx_ring[entry].bufaddr = dma_map_single(&ep->pci_dev->dev, |
|---|
| 1226 | + skb->data, |
|---|
| 1227 | + ep->rx_buf_sz, |
|---|
| 1228 | + DMA_FROM_DEVICE); |
|---|
| 1217 | 1229 | work_done++; |
|---|
| 1218 | 1230 | } |
|---|
| 1219 | 1231 | /* AV: shouldn't we add a barrier here? */ |
|---|
| .. | .. |
|---|
| 1293 | 1305 | ep->rx_ring[i].rxstatus = 0; /* Not owned by Epic chip. */ |
|---|
| 1294 | 1306 | ep->rx_ring[i].buflength = 0; |
|---|
| 1295 | 1307 | if (skb) { |
|---|
| 1296 | | - pci_unmap_single(pdev, ep->rx_ring[i].bufaddr, |
|---|
| 1297 | | - ep->rx_buf_sz, PCI_DMA_FROMDEVICE); |
|---|
| 1308 | + dma_unmap_single(&pdev->dev, ep->rx_ring[i].bufaddr, |
|---|
| 1309 | + ep->rx_buf_sz, DMA_FROM_DEVICE); |
|---|
| 1298 | 1310 | dev_kfree_skb(skb); |
|---|
| 1299 | 1311 | } |
|---|
| 1300 | 1312 | ep->rx_ring[i].bufaddr = 0xBADF00D0; /* An invalid address. */ |
|---|
| .. | .. |
|---|
| 1304 | 1316 | ep->tx_skbuff[i] = NULL; |
|---|
| 1305 | 1317 | if (!skb) |
|---|
| 1306 | 1318 | continue; |
|---|
| 1307 | | - pci_unmap_single(pdev, ep->tx_ring[i].bufaddr, skb->len, |
|---|
| 1308 | | - PCI_DMA_TODEVICE); |
|---|
| 1319 | + dma_unmap_single(&pdev->dev, ep->tx_ring[i].bufaddr, skb->len, |
|---|
| 1320 | + DMA_TO_DEVICE); |
|---|
| 1309 | 1321 | dev_kfree_skb(skb); |
|---|
| 1310 | 1322 | } |
|---|
| 1311 | 1323 | |
|---|
| .. | .. |
|---|
| 1435 | 1447 | struct epic_private *ep = netdev_priv(dev); |
|---|
| 1436 | 1448 | void __iomem *ioaddr = ep->ioaddr; |
|---|
| 1437 | 1449 | |
|---|
| 1450 | + if (ep->ethtool_ops_nesting == U32_MAX) |
|---|
| 1451 | + return -EBUSY; |
|---|
| 1438 | 1452 | /* power-up, if interface is down */ |
|---|
| 1439 | | - if (!netif_running(dev)) { |
|---|
| 1453 | + if (!ep->ethtool_ops_nesting++ && !netif_running(dev)) { |
|---|
| 1440 | 1454 | ew32(GENCTL, 0x0200); |
|---|
| 1441 | 1455 | ew32(NVCTL, (er32(NVCTL) & ~0x003c) | 0x4800); |
|---|
| 1442 | 1456 | } |
|---|
| .. | .. |
|---|
| 1449 | 1463 | void __iomem *ioaddr = ep->ioaddr; |
|---|
| 1450 | 1464 | |
|---|
| 1451 | 1465 | /* power-down, if interface is down */ |
|---|
| 1452 | | - if (!netif_running(dev)) { |
|---|
| 1466 | + if (!--ep->ethtool_ops_nesting && !netif_running(dev)) { |
|---|
| 1453 | 1467 | ew32(GENCTL, 0x0008); |
|---|
| 1454 | 1468 | ew32(NVCTL, (er32(NVCTL) & ~0x483c) | 0x0000); |
|---|
| 1455 | 1469 | } |
|---|
| .. | .. |
|---|
| 1499 | 1513 | struct net_device *dev = pci_get_drvdata(pdev); |
|---|
| 1500 | 1514 | struct epic_private *ep = netdev_priv(dev); |
|---|
| 1501 | 1515 | |
|---|
| 1502 | | - pci_free_consistent(pdev, TX_TOTAL_SIZE, ep->tx_ring, ep->tx_ring_dma); |
|---|
| 1503 | | - pci_free_consistent(pdev, RX_TOTAL_SIZE, ep->rx_ring, ep->rx_ring_dma); |
|---|
| 1504 | 1516 | unregister_netdev(dev); |
|---|
| 1517 | + dma_free_coherent(&pdev->dev, TX_TOTAL_SIZE, ep->tx_ring, |
|---|
| 1518 | + ep->tx_ring_dma); |
|---|
| 1519 | + dma_free_coherent(&pdev->dev, RX_TOTAL_SIZE, ep->rx_ring, |
|---|
| 1520 | + ep->rx_ring_dma); |
|---|
| 1505 | 1521 | pci_iounmap(pdev, ep->ioaddr); |
|---|
| 1506 | | - pci_release_regions(pdev); |
|---|
| 1507 | 1522 | free_netdev(dev); |
|---|
| 1523 | + pci_release_regions(pdev); |
|---|
| 1508 | 1524 | pci_disable_device(pdev); |
|---|
| 1509 | 1525 | /* pci_power_off(pdev, -1); */ |
|---|
| 1510 | 1526 | } |
|---|
| 1511 | 1527 | |
|---|
| 1512 | | - |
|---|
| 1513 | | -#ifdef CONFIG_PM |
|---|
| 1514 | | - |
|---|
| 1515 | | -static int epic_suspend (struct pci_dev *pdev, pm_message_t state) |
|---|
| 1528 | +static int __maybe_unused epic_suspend(struct device *dev_d) |
|---|
| 1516 | 1529 | { |
|---|
| 1517 | | - struct net_device *dev = pci_get_drvdata(pdev); |
|---|
| 1530 | + struct net_device *dev = dev_get_drvdata(dev_d); |
|---|
| 1518 | 1531 | struct epic_private *ep = netdev_priv(dev); |
|---|
| 1519 | 1532 | void __iomem *ioaddr = ep->ioaddr; |
|---|
| 1520 | 1533 | |
|---|
| .. | .. |
|---|
| 1528 | 1541 | } |
|---|
| 1529 | 1542 | |
|---|
| 1530 | 1543 | |
|---|
| 1531 | | -static int epic_resume (struct pci_dev *pdev) |
|---|
| 1544 | +static int __maybe_unused epic_resume(struct device *dev_d) |
|---|
| 1532 | 1545 | { |
|---|
| 1533 | | - struct net_device *dev = pci_get_drvdata(pdev); |
|---|
| 1546 | + struct net_device *dev = dev_get_drvdata(dev_d); |
|---|
| 1534 | 1547 | |
|---|
| 1535 | 1548 | if (!netif_running(dev)) |
|---|
| 1536 | 1549 | return 0; |
|---|
| .. | .. |
|---|
| 1539 | 1552 | return 0; |
|---|
| 1540 | 1553 | } |
|---|
| 1541 | 1554 | |
|---|
| 1542 | | -#endif /* CONFIG_PM */ |
|---|
| 1543 | | - |
|---|
| 1555 | +static SIMPLE_DEV_PM_OPS(epic_pm_ops, epic_suspend, epic_resume); |
|---|
| 1544 | 1556 | |
|---|
| 1545 | 1557 | static struct pci_driver epic_driver = { |
|---|
| 1546 | 1558 | .name = DRV_NAME, |
|---|
| 1547 | 1559 | .id_table = epic_pci_tbl, |
|---|
| 1548 | 1560 | .probe = epic_init_one, |
|---|
| 1549 | 1561 | .remove = epic_remove_one, |
|---|
| 1550 | | -#ifdef CONFIG_PM |
|---|
| 1551 | | - .suspend = epic_suspend, |
|---|
| 1552 | | - .resume = epic_resume, |
|---|
| 1553 | | -#endif /* CONFIG_PM */ |
|---|
| 1562 | + .driver.pm = &epic_pm_ops, |
|---|
| 1554 | 1563 | }; |
|---|
| 1555 | 1564 | |
|---|
| 1556 | 1565 | |
|---|