.. | .. |
---|
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 | |
---|