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