| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * RDC R6040 Fast Ethernet MAC support |
|---|
| 3 | 4 | * |
|---|
| .. | .. |
|---|
| 5 | 6 | * Copyright (C) 2007 |
|---|
| 6 | 7 | * Daniel Gimpelevich <daniel@gimpelevich.san-francisco.ca.us> |
|---|
| 7 | 8 | * Copyright (C) 2007-2012 Florian Fainelli <f.fainelli@gmail.com> |
|---|
| 8 | | - * |
|---|
| 9 | | - * This program is free software; you can redistribute it and/or |
|---|
| 10 | | - * modify it under the terms of the GNU General Public License |
|---|
| 11 | | - * as published by the Free Software Foundation; either version 2 |
|---|
| 12 | | - * of the License, or (at your option) any later version. |
|---|
| 13 | | - * |
|---|
| 14 | | - * This program is distributed in the hope that it will be useful, |
|---|
| 15 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 16 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 17 | | - * GNU General Public License for more details. |
|---|
| 18 | | - * |
|---|
| 19 | | - * You should have received a copy of the GNU General Public License |
|---|
| 20 | | - * along with this program; if not, write to the |
|---|
| 21 | | - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
|---|
| 22 | | - * Boston, MA 02110-1301, USA. |
|---|
| 23 | 9 | */ |
|---|
| 24 | 10 | |
|---|
| 25 | 11 | #include <linux/kernel.h> |
|---|
| .. | .. |
|---|
| 278 | 264 | |
|---|
| 279 | 265 | for (i = 0; i < TX_DCNT; i++) { |
|---|
| 280 | 266 | if (lp->tx_insert_ptr->skb_ptr) { |
|---|
| 281 | | - pci_unmap_single(lp->pdev, |
|---|
| 282 | | - le32_to_cpu(lp->tx_insert_ptr->buf), |
|---|
| 283 | | - MAX_BUF_SIZE, PCI_DMA_TODEVICE); |
|---|
| 267 | + dma_unmap_single(&lp->pdev->dev, |
|---|
| 268 | + le32_to_cpu(lp->tx_insert_ptr->buf), |
|---|
| 269 | + MAX_BUF_SIZE, DMA_TO_DEVICE); |
|---|
| 284 | 270 | dev_kfree_skb(lp->tx_insert_ptr->skb_ptr); |
|---|
| 285 | 271 | lp->tx_insert_ptr->skb_ptr = NULL; |
|---|
| 286 | 272 | } |
|---|
| .. | .. |
|---|
| 295 | 281 | |
|---|
| 296 | 282 | for (i = 0; i < RX_DCNT; i++) { |
|---|
| 297 | 283 | if (lp->rx_insert_ptr->skb_ptr) { |
|---|
| 298 | | - pci_unmap_single(lp->pdev, |
|---|
| 299 | | - le32_to_cpu(lp->rx_insert_ptr->buf), |
|---|
| 300 | | - MAX_BUF_SIZE, PCI_DMA_FROMDEVICE); |
|---|
| 284 | + dma_unmap_single(&lp->pdev->dev, |
|---|
| 285 | + le32_to_cpu(lp->rx_insert_ptr->buf), |
|---|
| 286 | + MAX_BUF_SIZE, DMA_FROM_DEVICE); |
|---|
| 301 | 287 | dev_kfree_skb(lp->rx_insert_ptr->skb_ptr); |
|---|
| 302 | 288 | lp->rx_insert_ptr->skb_ptr = NULL; |
|---|
| 303 | 289 | } |
|---|
| .. | .. |
|---|
| 351 | 337 | goto err_exit; |
|---|
| 352 | 338 | } |
|---|
| 353 | 339 | desc->skb_ptr = skb; |
|---|
| 354 | | - desc->buf = cpu_to_le32(pci_map_single(lp->pdev, |
|---|
| 355 | | - desc->skb_ptr->data, |
|---|
| 356 | | - MAX_BUF_SIZE, PCI_DMA_FROMDEVICE)); |
|---|
| 340 | + desc->buf = cpu_to_le32(dma_map_single(&lp->pdev->dev, |
|---|
| 341 | + desc->skb_ptr->data, |
|---|
| 342 | + MAX_BUF_SIZE, |
|---|
| 343 | + DMA_FROM_DEVICE)); |
|---|
| 357 | 344 | desc->status = DSC_OWNER_MAC; |
|---|
| 358 | 345 | desc = desc->vndescp; |
|---|
| 359 | 346 | } while (desc != lp->rx_ring); |
|---|
| .. | .. |
|---|
| 431 | 418 | iowrite16(TM2TX, ioaddr + MTPR); |
|---|
| 432 | 419 | } |
|---|
| 433 | 420 | |
|---|
| 434 | | -static void r6040_tx_timeout(struct net_device *dev) |
|---|
| 421 | +static void r6040_tx_timeout(struct net_device *dev, unsigned int txqueue) |
|---|
| 435 | 422 | { |
|---|
| 436 | 423 | struct r6040_private *priv = netdev_priv(dev); |
|---|
| 437 | 424 | void __iomem *ioaddr = priv->base; |
|---|
| .. | .. |
|---|
| 505 | 492 | |
|---|
| 506 | 493 | /* Free Descriptor memory */ |
|---|
| 507 | 494 | if (lp->rx_ring) { |
|---|
| 508 | | - pci_free_consistent(pdev, |
|---|
| 509 | | - RX_DESC_SIZE, lp->rx_ring, lp->rx_ring_dma); |
|---|
| 495 | + dma_free_coherent(&pdev->dev, RX_DESC_SIZE, lp->rx_ring, |
|---|
| 496 | + lp->rx_ring_dma); |
|---|
| 510 | 497 | lp->rx_ring = NULL; |
|---|
| 511 | 498 | } |
|---|
| 512 | 499 | |
|---|
| 513 | 500 | if (lp->tx_ring) { |
|---|
| 514 | | - pci_free_consistent(pdev, |
|---|
| 515 | | - TX_DESC_SIZE, lp->tx_ring, lp->tx_ring_dma); |
|---|
| 501 | + dma_free_coherent(&pdev->dev, TX_DESC_SIZE, lp->tx_ring, |
|---|
| 502 | + lp->tx_ring_dma); |
|---|
| 516 | 503 | lp->tx_ring = NULL; |
|---|
| 517 | 504 | } |
|---|
| 518 | 505 | |
|---|
| 519 | 506 | return 0; |
|---|
| 520 | | -} |
|---|
| 521 | | - |
|---|
| 522 | | -static int r6040_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) |
|---|
| 523 | | -{ |
|---|
| 524 | | - if (!dev->phydev) |
|---|
| 525 | | - return -EINVAL; |
|---|
| 526 | | - |
|---|
| 527 | | - return phy_mii_ioctl(dev->phydev, rq, cmd); |
|---|
| 528 | 507 | } |
|---|
| 529 | 508 | |
|---|
| 530 | 509 | static int r6040_rx(struct net_device *dev, int limit) |
|---|
| .. | .. |
|---|
| 573 | 552 | |
|---|
| 574 | 553 | /* Do not count the CRC */ |
|---|
| 575 | 554 | skb_put(skb_ptr, descptr->len - 4); |
|---|
| 576 | | - pci_unmap_single(priv->pdev, le32_to_cpu(descptr->buf), |
|---|
| 577 | | - MAX_BUF_SIZE, PCI_DMA_FROMDEVICE); |
|---|
| 555 | + dma_unmap_single(&priv->pdev->dev, le32_to_cpu(descptr->buf), |
|---|
| 556 | + MAX_BUF_SIZE, DMA_FROM_DEVICE); |
|---|
| 578 | 557 | skb_ptr->protocol = eth_type_trans(skb_ptr, priv->dev); |
|---|
| 579 | 558 | |
|---|
| 580 | 559 | /* Send to upper layer */ |
|---|
| .. | .. |
|---|
| 584 | 563 | |
|---|
| 585 | 564 | /* put new skb into descriptor */ |
|---|
| 586 | 565 | descptr->skb_ptr = new_skb; |
|---|
| 587 | | - descptr->buf = cpu_to_le32(pci_map_single(priv->pdev, |
|---|
| 588 | | - descptr->skb_ptr->data, |
|---|
| 589 | | - MAX_BUF_SIZE, PCI_DMA_FROMDEVICE)); |
|---|
| 566 | + descptr->buf = cpu_to_le32(dma_map_single(&priv->pdev->dev, |
|---|
| 567 | + descptr->skb_ptr->data, |
|---|
| 568 | + MAX_BUF_SIZE, |
|---|
| 569 | + DMA_FROM_DEVICE)); |
|---|
| 590 | 570 | |
|---|
| 591 | 571 | next_descr: |
|---|
| 592 | 572 | /* put the descriptor back to the MAC */ |
|---|
| .. | .. |
|---|
| 626 | 606 | dev->stats.tx_packets++; |
|---|
| 627 | 607 | dev->stats.tx_bytes += skb_ptr->len; |
|---|
| 628 | 608 | |
|---|
| 629 | | - pci_unmap_single(priv->pdev, le32_to_cpu(descptr->buf), |
|---|
| 630 | | - skb_ptr->len, PCI_DMA_TODEVICE); |
|---|
| 609 | + dma_unmap_single(&priv->pdev->dev, le32_to_cpu(descptr->buf), |
|---|
| 610 | + skb_ptr->len, DMA_TO_DEVICE); |
|---|
| 631 | 611 | /* Free buffer */ |
|---|
| 632 | 612 | dev_kfree_skb(skb_ptr); |
|---|
| 633 | 613 | descptr->skb_ptr = NULL; |
|---|
| .. | .. |
|---|
| 779 | 759 | |
|---|
| 780 | 760 | /* Allocate Descriptor memory */ |
|---|
| 781 | 761 | lp->rx_ring = |
|---|
| 782 | | - pci_alloc_consistent(lp->pdev, RX_DESC_SIZE, &lp->rx_ring_dma); |
|---|
| 762 | + dma_alloc_coherent(&lp->pdev->dev, RX_DESC_SIZE, |
|---|
| 763 | + &lp->rx_ring_dma, GFP_KERNEL); |
|---|
| 783 | 764 | if (!lp->rx_ring) { |
|---|
| 784 | 765 | ret = -ENOMEM; |
|---|
| 785 | 766 | goto err_free_irq; |
|---|
| 786 | 767 | } |
|---|
| 787 | 768 | |
|---|
| 788 | 769 | lp->tx_ring = |
|---|
| 789 | | - pci_alloc_consistent(lp->pdev, TX_DESC_SIZE, &lp->tx_ring_dma); |
|---|
| 770 | + dma_alloc_coherent(&lp->pdev->dev, TX_DESC_SIZE, |
|---|
| 771 | + &lp->tx_ring_dma, GFP_KERNEL); |
|---|
| 790 | 772 | if (!lp->tx_ring) { |
|---|
| 791 | 773 | ret = -ENOMEM; |
|---|
| 792 | 774 | goto err_free_rx_ring; |
|---|
| .. | .. |
|---|
| 802 | 784 | return 0; |
|---|
| 803 | 785 | |
|---|
| 804 | 786 | err_free_tx_ring: |
|---|
| 805 | | - pci_free_consistent(lp->pdev, TX_DESC_SIZE, lp->tx_ring, |
|---|
| 806 | | - lp->tx_ring_dma); |
|---|
| 787 | + dma_free_coherent(&lp->pdev->dev, TX_DESC_SIZE, lp->tx_ring, |
|---|
| 788 | + lp->tx_ring_dma); |
|---|
| 807 | 789 | err_free_rx_ring: |
|---|
| 808 | | - pci_free_consistent(lp->pdev, RX_DESC_SIZE, lp->rx_ring, |
|---|
| 809 | | - lp->rx_ring_dma); |
|---|
| 790 | + dma_free_coherent(&lp->pdev->dev, RX_DESC_SIZE, lp->rx_ring, |
|---|
| 791 | + lp->rx_ring_dma); |
|---|
| 810 | 792 | err_free_irq: |
|---|
| 811 | 793 | free_irq(dev->irq, dev); |
|---|
| 812 | 794 | out: |
|---|
| .. | .. |
|---|
| 840 | 822 | descptr = lp->tx_insert_ptr; |
|---|
| 841 | 823 | descptr->len = skb->len; |
|---|
| 842 | 824 | descptr->skb_ptr = skb; |
|---|
| 843 | | - descptr->buf = cpu_to_le32(pci_map_single(lp->pdev, |
|---|
| 844 | | - skb->data, skb->len, PCI_DMA_TODEVICE)); |
|---|
| 825 | + descptr->buf = cpu_to_le32(dma_map_single(&lp->pdev->dev, skb->data, |
|---|
| 826 | + skb->len, DMA_TO_DEVICE)); |
|---|
| 845 | 827 | descptr->status = DSC_OWNER_MAC; |
|---|
| 846 | 828 | |
|---|
| 847 | 829 | skb_tx_timestamp(skb); |
|---|
| 848 | 830 | |
|---|
| 849 | 831 | /* Trigger the MAC to check the TX descriptor */ |
|---|
| 850 | | - if (!skb->xmit_more || netif_queue_stopped(dev)) |
|---|
| 832 | + if (!netdev_xmit_more() || netif_queue_stopped(dev)) |
|---|
| 851 | 833 | iowrite16(TM2TX, ioaddr + MTPR); |
|---|
| 852 | 834 | lp->tx_insert_ptr = descptr->vndescp; |
|---|
| 853 | 835 | |
|---|
| .. | .. |
|---|
| 978 | 960 | .ndo_set_rx_mode = r6040_multicast_list, |
|---|
| 979 | 961 | .ndo_validate_addr = eth_validate_addr, |
|---|
| 980 | 962 | .ndo_set_mac_address = eth_mac_addr, |
|---|
| 981 | | - .ndo_do_ioctl = r6040_ioctl, |
|---|
| 963 | + .ndo_do_ioctl = phy_do_ioctl, |
|---|
| 982 | 964 | .ndo_tx_timeout = r6040_tx_timeout, |
|---|
| 983 | 965 | #ifdef CONFIG_NET_POLL_CONTROLLER |
|---|
| 984 | 966 | .ndo_poll_controller = r6040_poll_controller, |
|---|
| .. | .. |
|---|
| 1031 | 1013 | return PTR_ERR(phydev); |
|---|
| 1032 | 1014 | } |
|---|
| 1033 | 1015 | |
|---|
| 1034 | | - /* mask with MAC supported features */ |
|---|
| 1035 | | - phydev->supported &= (SUPPORTED_10baseT_Half |
|---|
| 1036 | | - | SUPPORTED_10baseT_Full |
|---|
| 1037 | | - | SUPPORTED_100baseT_Half |
|---|
| 1038 | | - | SUPPORTED_100baseT_Full |
|---|
| 1039 | | - | SUPPORTED_Autoneg |
|---|
| 1040 | | - | SUPPORTED_MII |
|---|
| 1041 | | - | SUPPORTED_TP); |
|---|
| 1016 | + phy_set_max_speed(phydev, SPEED_100); |
|---|
| 1042 | 1017 | |
|---|
| 1043 | | - phydev->advertising = phydev->supported; |
|---|
| 1044 | 1018 | lp->old_link = 0; |
|---|
| 1045 | 1019 | lp->old_duplex = -1; |
|---|
| 1046 | 1020 | |
|---|
| .. | .. |
|---|
| 1066 | 1040 | goto err_out; |
|---|
| 1067 | 1041 | |
|---|
| 1068 | 1042 | /* this should always be supported */ |
|---|
| 1069 | | - err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); |
|---|
| 1043 | + err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); |
|---|
| 1070 | 1044 | if (err) { |
|---|
| 1071 | 1045 | dev_err(&pdev->dev, "32-bit PCI DMA addresses not supported by the card\n"); |
|---|
| 1072 | 1046 | goto err_out_disable_dev; |
|---|
| 1073 | 1047 | } |
|---|
| 1074 | | - err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)); |
|---|
| 1048 | + err = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); |
|---|
| 1075 | 1049 | if (err) { |
|---|
| 1076 | 1050 | dev_err(&pdev->dev, "32-bit PCI DMA addresses not supported by the card\n"); |
|---|
| 1077 | 1051 | goto err_out_disable_dev; |
|---|
| .. | .. |
|---|
| 1184 | 1158 | err = register_netdev(dev); |
|---|
| 1185 | 1159 | if (err) { |
|---|
| 1186 | 1160 | dev_err(&pdev->dev, "Failed to register net device\n"); |
|---|
| 1187 | | - goto err_out_mdio_unregister; |
|---|
| 1161 | + goto err_out_phy_disconnect; |
|---|
| 1188 | 1162 | } |
|---|
| 1189 | 1163 | return 0; |
|---|
| 1190 | 1164 | |
|---|
| 1165 | +err_out_phy_disconnect: |
|---|
| 1166 | + phy_disconnect(dev->phydev); |
|---|
| 1191 | 1167 | err_out_mdio_unregister: |
|---|
| 1192 | 1168 | mdiobus_unregister(lp->mii_bus); |
|---|
| 1193 | 1169 | err_out_mdio: |
|---|
| .. | .. |
|---|
| 1211 | 1187 | struct r6040_private *lp = netdev_priv(dev); |
|---|
| 1212 | 1188 | |
|---|
| 1213 | 1189 | unregister_netdev(dev); |
|---|
| 1190 | + phy_disconnect(dev->phydev); |
|---|
| 1214 | 1191 | mdiobus_unregister(lp->mii_bus); |
|---|
| 1215 | 1192 | mdiobus_free(lp->mii_bus); |
|---|
| 1216 | 1193 | netif_napi_del(&lp->napi); |
|---|