.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
---|
1 | 2 | /*************************************************************************** |
---|
2 | 3 | * |
---|
3 | 4 | * Copyright (C) 2007,2008 SMSC |
---|
4 | | - * |
---|
5 | | - * This program is free software; you can redistribute it and/or |
---|
6 | | - * modify it under the terms of the GNU General Public License |
---|
7 | | - * as published by the Free Software Foundation; either version 2 |
---|
8 | | - * of the License, or (at your option) any later version. |
---|
9 | | - * |
---|
10 | | - * This program is distributed in the hope that it will be useful, |
---|
11 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
12 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
13 | | - * GNU General Public License for more details. |
---|
14 | | - * |
---|
15 | | - * You should have received a copy of the GNU General Public License |
---|
16 | | - * along with this program; if not, see <http://www.gnu.org/licenses/>. |
---|
17 | 5 | * |
---|
18 | 6 | *************************************************************************** |
---|
19 | 7 | */ |
---|
.. | .. |
---|
220 | 208 | |
---|
221 | 209 | netif_warn(pd, drv, pd->dev, "%s: Eeprom timed out\n", __func__); |
---|
222 | 210 | return -EIO; |
---|
223 | | -} |
---|
224 | | - |
---|
225 | | -/* Standard ioctls for mii-tool */ |
---|
226 | | -static int smsc9420_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) |
---|
227 | | -{ |
---|
228 | | - if (!netif_running(dev) || !dev->phydev) |
---|
229 | | - return -EINVAL; |
---|
230 | | - |
---|
231 | | - return phy_mii_ioctl(dev->phydev, ifr, cmd); |
---|
232 | 211 | } |
---|
233 | 212 | |
---|
234 | 213 | static void smsc9420_ethtool_get_drvinfo(struct net_device *netdev, |
---|
.. | .. |
---|
518 | 497 | |
---|
519 | 498 | if (skb) { |
---|
520 | 499 | BUG_ON(!pd->tx_buffers[i].mapping); |
---|
521 | | - pci_unmap_single(pd->pdev, pd->tx_buffers[i].mapping, |
---|
522 | | - skb->len, PCI_DMA_TODEVICE); |
---|
| 500 | + dma_unmap_single(&pd->pdev->dev, |
---|
| 501 | + pd->tx_buffers[i].mapping, skb->len, |
---|
| 502 | + DMA_TO_DEVICE); |
---|
523 | 503 | dev_kfree_skb_any(skb); |
---|
524 | 504 | } |
---|
525 | 505 | |
---|
.. | .. |
---|
551 | 531 | dev_kfree_skb_any(pd->rx_buffers[i].skb); |
---|
552 | 532 | |
---|
553 | 533 | if (pd->rx_buffers[i].mapping) |
---|
554 | | - pci_unmap_single(pd->pdev, pd->rx_buffers[i].mapping, |
---|
555 | | - PKT_BUF_SZ, PCI_DMA_FROMDEVICE); |
---|
| 534 | + dma_unmap_single(&pd->pdev->dev, |
---|
| 535 | + pd->rx_buffers[i].mapping, |
---|
| 536 | + PKT_BUF_SZ, DMA_FROM_DEVICE); |
---|
556 | 537 | |
---|
557 | 538 | pd->rx_ring[i].status = 0; |
---|
558 | 539 | pd->rx_ring[i].length = 0; |
---|
.. | .. |
---|
770 | 751 | dev->stats.rx_packets++; |
---|
771 | 752 | dev->stats.rx_bytes += packet_length; |
---|
772 | 753 | |
---|
773 | | - pci_unmap_single(pd->pdev, pd->rx_buffers[index].mapping, |
---|
774 | | - PKT_BUF_SZ, PCI_DMA_FROMDEVICE); |
---|
| 754 | + dma_unmap_single(&pd->pdev->dev, pd->rx_buffers[index].mapping, |
---|
| 755 | + PKT_BUF_SZ, DMA_FROM_DEVICE); |
---|
775 | 756 | pd->rx_buffers[index].mapping = 0; |
---|
776 | 757 | |
---|
777 | 758 | skb = pd->rx_buffers[index].skb; |
---|
.. | .. |
---|
803 | 784 | if (unlikely(!skb)) |
---|
804 | 785 | return -ENOMEM; |
---|
805 | 786 | |
---|
806 | | - mapping = pci_map_single(pd->pdev, skb_tail_pointer(skb), |
---|
807 | | - PKT_BUF_SZ, PCI_DMA_FROMDEVICE); |
---|
808 | | - if (pci_dma_mapping_error(pd->pdev, mapping)) { |
---|
| 787 | + mapping = dma_map_single(&pd->pdev->dev, skb_tail_pointer(skb), |
---|
| 788 | + PKT_BUF_SZ, DMA_FROM_DEVICE); |
---|
| 789 | + if (dma_mapping_error(&pd->pdev->dev, mapping)) { |
---|
809 | 790 | dev_kfree_skb_any(skb); |
---|
810 | 791 | netif_warn(pd, rx_err, pd->dev, "pci_map_single failed!\n"); |
---|
811 | 792 | return -ENOMEM; |
---|
.. | .. |
---|
922 | 903 | BUG_ON(!pd->tx_buffers[index].skb); |
---|
923 | 904 | BUG_ON(!pd->tx_buffers[index].mapping); |
---|
924 | 905 | |
---|
925 | | - pci_unmap_single(pd->pdev, pd->tx_buffers[index].mapping, |
---|
926 | | - pd->tx_buffers[index].skb->len, PCI_DMA_TODEVICE); |
---|
| 906 | + dma_unmap_single(&pd->pdev->dev, |
---|
| 907 | + pd->tx_buffers[index].mapping, |
---|
| 908 | + pd->tx_buffers[index].skb->len, |
---|
| 909 | + DMA_TO_DEVICE); |
---|
927 | 910 | pd->tx_buffers[index].mapping = 0; |
---|
928 | 911 | |
---|
929 | 912 | dev_kfree_skb_any(pd->tx_buffers[index].skb); |
---|
.. | .. |
---|
953 | 936 | BUG_ON(pd->tx_buffers[index].skb); |
---|
954 | 937 | BUG_ON(pd->tx_buffers[index].mapping); |
---|
955 | 938 | |
---|
956 | | - mapping = pci_map_single(pd->pdev, skb->data, |
---|
957 | | - skb->len, PCI_DMA_TODEVICE); |
---|
958 | | - if (pci_dma_mapping_error(pd->pdev, mapping)) { |
---|
| 939 | + mapping = dma_map_single(&pd->pdev->dev, skb->data, skb->len, |
---|
| 940 | + DMA_TO_DEVICE); |
---|
| 941 | + if (dma_mapping_error(&pd->pdev->dev, mapping)) { |
---|
959 | 942 | netif_warn(pd, tx_err, pd->dev, |
---|
960 | 943 | "pci_map_single failed, dropping packet\n"); |
---|
961 | 944 | return NETDEV_TX_BUSY; |
---|
.. | .. |
---|
1135 | 1118 | return PTR_ERR(phydev); |
---|
1136 | 1119 | } |
---|
1137 | 1120 | |
---|
| 1121 | + phy_set_max_speed(phydev, SPEED_100); |
---|
| 1122 | + |
---|
1138 | 1123 | /* mask with MAC supported features */ |
---|
1139 | | - phydev->supported &= (PHY_BASIC_FEATURES | SUPPORTED_Pause | |
---|
1140 | | - SUPPORTED_Asym_Pause); |
---|
1141 | | - phydev->advertising = phydev->supported; |
---|
| 1124 | + phy_support_asym_pause(phydev); |
---|
1142 | 1125 | |
---|
1143 | 1126 | phy_attached_info(phydev); |
---|
1144 | 1127 | |
---|
.. | .. |
---|
1443 | 1426 | return result; |
---|
1444 | 1427 | } |
---|
1445 | 1428 | |
---|
1446 | | -#ifdef CONFIG_PM |
---|
1447 | | - |
---|
1448 | | -static int smsc9420_suspend(struct pci_dev *pdev, pm_message_t state) |
---|
| 1429 | +static int __maybe_unused smsc9420_suspend(struct device *dev_d) |
---|
1449 | 1430 | { |
---|
1450 | | - struct net_device *dev = pci_get_drvdata(pdev); |
---|
| 1431 | + struct net_device *dev = dev_get_drvdata(dev_d); |
---|
1451 | 1432 | struct smsc9420_pdata *pd = netdev_priv(dev); |
---|
1452 | 1433 | u32 int_cfg; |
---|
1453 | 1434 | ulong flags; |
---|
.. | .. |
---|
1472 | 1453 | netif_device_detach(dev); |
---|
1473 | 1454 | } |
---|
1474 | 1455 | |
---|
1475 | | - pci_save_state(pdev); |
---|
1476 | | - pci_enable_wake(pdev, pci_choose_state(pdev, state), 0); |
---|
1477 | | - pci_disable_device(pdev); |
---|
1478 | | - pci_set_power_state(pdev, pci_choose_state(pdev, state)); |
---|
| 1456 | + device_wakeup_disable(dev_d); |
---|
1479 | 1457 | |
---|
1480 | 1458 | return 0; |
---|
1481 | 1459 | } |
---|
1482 | 1460 | |
---|
1483 | | -static int smsc9420_resume(struct pci_dev *pdev) |
---|
| 1461 | +static int __maybe_unused smsc9420_resume(struct device *dev_d) |
---|
1484 | 1462 | { |
---|
1485 | | - struct net_device *dev = pci_get_drvdata(pdev); |
---|
1486 | | - struct smsc9420_pdata *pd = netdev_priv(dev); |
---|
| 1463 | + struct net_device *dev = dev_get_drvdata(dev_d); |
---|
1487 | 1464 | int err; |
---|
1488 | 1465 | |
---|
1489 | | - pci_set_power_state(pdev, PCI_D0); |
---|
1490 | | - pci_restore_state(pdev); |
---|
| 1466 | + pci_set_master(to_pci_dev(dev_d)); |
---|
1491 | 1467 | |
---|
1492 | | - err = pci_enable_device(pdev); |
---|
1493 | | - if (err) |
---|
1494 | | - return err; |
---|
| 1468 | + device_wakeup_disable(dev_d); |
---|
1495 | 1469 | |
---|
1496 | | - pci_set_master(pdev); |
---|
1497 | | - |
---|
1498 | | - err = pci_enable_wake(pdev, PCI_D0, 0); |
---|
1499 | | - if (err) |
---|
1500 | | - netif_warn(pd, ifup, pd->dev, "pci_enable_wake failed: %d\n", |
---|
1501 | | - err); |
---|
1502 | | - |
---|
| 1470 | + err = 0; |
---|
1503 | 1471 | if (netif_running(dev)) { |
---|
1504 | 1472 | /* FIXME: gross. It looks like ancient PM relic.*/ |
---|
1505 | 1473 | err = smsc9420_open(dev); |
---|
.. | .. |
---|
1508 | 1476 | return err; |
---|
1509 | 1477 | } |
---|
1510 | 1478 | |
---|
1511 | | -#endif /* CONFIG_PM */ |
---|
1512 | | - |
---|
1513 | 1479 | static const struct net_device_ops smsc9420_netdev_ops = { |
---|
1514 | 1480 | .ndo_open = smsc9420_open, |
---|
1515 | 1481 | .ndo_stop = smsc9420_stop, |
---|
1516 | 1482 | .ndo_start_xmit = smsc9420_hard_start_xmit, |
---|
1517 | 1483 | .ndo_get_stats = smsc9420_get_stats, |
---|
1518 | 1484 | .ndo_set_rx_mode = smsc9420_set_multicast_list, |
---|
1519 | | - .ndo_do_ioctl = smsc9420_do_ioctl, |
---|
| 1485 | + .ndo_do_ioctl = phy_do_ioctl_running, |
---|
1520 | 1486 | .ndo_validate_addr = eth_validate_addr, |
---|
1521 | 1487 | .ndo_set_mac_address = eth_mac_addr, |
---|
1522 | 1488 | #ifdef CONFIG_NET_POLL_CONTROLLER |
---|
.. | .. |
---|
1560 | 1526 | goto out_free_netdev_2; |
---|
1561 | 1527 | } |
---|
1562 | 1528 | |
---|
1563 | | - if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) { |
---|
| 1529 | + if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(32))) { |
---|
1564 | 1530 | netdev_err(dev, "No usable DMA configuration, aborting\n"); |
---|
1565 | 1531 | goto out_free_regions_3; |
---|
1566 | 1532 | } |
---|
.. | .. |
---|
1578 | 1544 | pd = netdev_priv(dev); |
---|
1579 | 1545 | |
---|
1580 | 1546 | /* pci descriptors are created in the PCI consistent area */ |
---|
1581 | | - pd->rx_ring = pci_alloc_consistent(pdev, |
---|
1582 | | - sizeof(struct smsc9420_dma_desc) * RX_RING_SIZE + |
---|
1583 | | - sizeof(struct smsc9420_dma_desc) * TX_RING_SIZE, |
---|
1584 | | - &pd->rx_dma_addr); |
---|
| 1547 | + pd->rx_ring = dma_alloc_coherent(&pdev->dev, |
---|
| 1548 | + sizeof(struct smsc9420_dma_desc) * (RX_RING_SIZE + TX_RING_SIZE), |
---|
| 1549 | + &pd->rx_dma_addr, GFP_KERNEL); |
---|
1585 | 1550 | |
---|
1586 | 1551 | if (!pd->rx_ring) |
---|
1587 | 1552 | goto out_free_io_4; |
---|
.. | .. |
---|
1637 | 1602 | return 0; |
---|
1638 | 1603 | |
---|
1639 | 1604 | out_free_dmadesc_5: |
---|
1640 | | - pci_free_consistent(pdev, sizeof(struct smsc9420_dma_desc) * |
---|
1641 | | - (RX_RING_SIZE + TX_RING_SIZE), pd->rx_ring, pd->rx_dma_addr); |
---|
| 1605 | + dma_free_coherent(&pdev->dev, |
---|
| 1606 | + sizeof(struct smsc9420_dma_desc) * (RX_RING_SIZE + TX_RING_SIZE), |
---|
| 1607 | + pd->rx_ring, pd->rx_dma_addr); |
---|
1642 | 1608 | out_free_io_4: |
---|
1643 | 1609 | iounmap(virt_addr - LAN9420_CPSR_ENDIAN_OFFSET); |
---|
1644 | 1610 | out_free_regions_3: |
---|
.. | .. |
---|
1670 | 1636 | BUG_ON(!pd->tx_ring); |
---|
1671 | 1637 | BUG_ON(!pd->rx_ring); |
---|
1672 | 1638 | |
---|
1673 | | - pci_free_consistent(pdev, sizeof(struct smsc9420_dma_desc) * |
---|
1674 | | - (RX_RING_SIZE + TX_RING_SIZE), pd->rx_ring, pd->rx_dma_addr); |
---|
| 1639 | + dma_free_coherent(&pdev->dev, |
---|
| 1640 | + sizeof(struct smsc9420_dma_desc) * (RX_RING_SIZE + TX_RING_SIZE), |
---|
| 1641 | + pd->rx_ring, pd->rx_dma_addr); |
---|
1675 | 1642 | |
---|
1676 | 1643 | iounmap(pd->ioaddr - LAN9420_CPSR_ENDIAN_OFFSET); |
---|
1677 | 1644 | pci_release_regions(pdev); |
---|
.. | .. |
---|
1679 | 1646 | pci_disable_device(pdev); |
---|
1680 | 1647 | } |
---|
1681 | 1648 | |
---|
| 1649 | +static SIMPLE_DEV_PM_OPS(smsc9420_pm_ops, smsc9420_suspend, smsc9420_resume); |
---|
| 1650 | + |
---|
1682 | 1651 | static struct pci_driver smsc9420_driver = { |
---|
1683 | 1652 | .name = DRV_NAME, |
---|
1684 | 1653 | .id_table = smsc9420_id_table, |
---|
1685 | 1654 | .probe = smsc9420_probe, |
---|
1686 | 1655 | .remove = smsc9420_remove, |
---|
1687 | | -#ifdef CONFIG_PM |
---|
1688 | | - .suspend = smsc9420_suspend, |
---|
1689 | | - .resume = smsc9420_resume, |
---|
1690 | | -#endif /* CONFIG_PM */ |
---|
| 1656 | + .driver.pm = &smsc9420_pm_ops, |
---|
1691 | 1657 | }; |
---|
1692 | 1658 | |
---|
1693 | 1659 | static int __init smsc9420_init_module(void) |
---|