| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | /* D-Link DL2000-based Gigabit Ethernet Adapter Linux driver */ |
|---|
| 2 | 3 | /* |
|---|
| 3 | 4 | Copyright (c) 2001, 2002 by D-Link Corporation |
|---|
| 4 | 5 | Written by Edward Peng.<edward_peng@dlink.com.tw> |
|---|
| 5 | 6 | Created 03-May-2001, base on Linux' sundance.c. |
|---|
| 6 | 7 | |
|---|
| 7 | | - This program is free software; you can redistribute it and/or modify |
|---|
| 8 | | - it under the terms of the GNU General Public License as published by |
|---|
| 9 | | - the Free Software Foundation; either version 2 of the License, or |
|---|
| 10 | | - (at your option) any later version. |
|---|
| 11 | 8 | */ |
|---|
| 12 | 9 | |
|---|
| 13 | | -#define DRV_NAME "DL2000/TC902x-based linux driver" |
|---|
| 14 | | -#define DRV_VERSION "v1.19" |
|---|
| 15 | | -#define DRV_RELDATE "2007/08/12" |
|---|
| 16 | 10 | #include "dl2k.h" |
|---|
| 17 | 11 | #include <linux/dma-mapping.h> |
|---|
| 18 | 12 | |
|---|
| .. | .. |
|---|
| 23 | 17 | #define dr16(reg) ioread16(ioaddr + (reg)) |
|---|
| 24 | 18 | #define dr8(reg) ioread8(ioaddr + (reg)) |
|---|
| 25 | 19 | |
|---|
| 26 | | -static char version[] = |
|---|
| 27 | | - KERN_INFO DRV_NAME " " DRV_VERSION " " DRV_RELDATE "\n"; |
|---|
| 28 | 20 | #define MAX_UNITS 8 |
|---|
| 29 | 21 | static int mtu[MAX_UNITS]; |
|---|
| 30 | 22 | static int vlan[MAX_UNITS]; |
|---|
| .. | .. |
|---|
| 69 | 61 | |
|---|
| 70 | 62 | static int rio_open (struct net_device *dev); |
|---|
| 71 | 63 | static void rio_timer (struct timer_list *t); |
|---|
| 72 | | -static void rio_tx_timeout (struct net_device *dev); |
|---|
| 64 | +static void rio_tx_timeout (struct net_device *dev, unsigned int txqueue); |
|---|
| 73 | 65 | static netdev_tx_t start_xmit (struct sk_buff *skb, struct net_device *dev); |
|---|
| 74 | 66 | static irqreturn_t rio_interrupt (int irq, void *dev_instance); |
|---|
| 75 | 67 | static void rio_free_tx (struct net_device *dev, int irq); |
|---|
| .. | .. |
|---|
| 116 | 108 | int chip_idx = ent->driver_data; |
|---|
| 117 | 109 | int err, irq; |
|---|
| 118 | 110 | void __iomem *ioaddr; |
|---|
| 119 | | - static int version_printed; |
|---|
| 120 | 111 | void *ring_space; |
|---|
| 121 | 112 | dma_addr_t ring_dma; |
|---|
| 122 | | - |
|---|
| 123 | | - if (!version_printed++) |
|---|
| 124 | | - printk ("%s", version); |
|---|
| 125 | 113 | |
|---|
| 126 | 114 | err = pci_enable_device (pdev); |
|---|
| 127 | 115 | if (err) |
|---|
| .. | .. |
|---|
| 234 | 222 | |
|---|
| 235 | 223 | pci_set_drvdata (pdev, dev); |
|---|
| 236 | 224 | |
|---|
| 237 | | - ring_space = pci_alloc_consistent (pdev, TX_TOTAL_SIZE, &ring_dma); |
|---|
| 225 | + ring_space = dma_alloc_coherent(&pdev->dev, TX_TOTAL_SIZE, &ring_dma, |
|---|
| 226 | + GFP_KERNEL); |
|---|
| 238 | 227 | if (!ring_space) |
|---|
| 239 | 228 | goto err_out_iounmap; |
|---|
| 240 | 229 | np->tx_ring = ring_space; |
|---|
| 241 | 230 | np->tx_ring_dma = ring_dma; |
|---|
| 242 | 231 | |
|---|
| 243 | | - ring_space = pci_alloc_consistent (pdev, RX_TOTAL_SIZE, &ring_dma); |
|---|
| 232 | + ring_space = dma_alloc_coherent(&pdev->dev, RX_TOTAL_SIZE, &ring_dma, |
|---|
| 233 | + GFP_KERNEL); |
|---|
| 244 | 234 | if (!ring_space) |
|---|
| 245 | 235 | goto err_out_unmap_tx; |
|---|
| 246 | 236 | np->rx_ring = ring_space; |
|---|
| .. | .. |
|---|
| 291 | 281 | return 0; |
|---|
| 292 | 282 | |
|---|
| 293 | 283 | err_out_unmap_rx: |
|---|
| 294 | | - pci_free_consistent (pdev, RX_TOTAL_SIZE, np->rx_ring, np->rx_ring_dma); |
|---|
| 284 | + dma_free_coherent(&pdev->dev, RX_TOTAL_SIZE, np->rx_ring, |
|---|
| 285 | + np->rx_ring_dma); |
|---|
| 295 | 286 | err_out_unmap_tx: |
|---|
| 296 | | - pci_free_consistent (pdev, TX_TOTAL_SIZE, np->tx_ring, np->tx_ring_dma); |
|---|
| 287 | + dma_free_coherent(&pdev->dev, TX_TOTAL_SIZE, np->tx_ring, |
|---|
| 288 | + np->tx_ring_dma); |
|---|
| 297 | 289 | err_out_iounmap: |
|---|
| 298 | 290 | #ifdef MEM_MAPPING |
|---|
| 299 | 291 | pci_iounmap(pdev, np->ioaddr); |
|---|
| .. | .. |
|---|
| 447 | 439 | for (i = 0; i < RX_RING_SIZE; i++) { |
|---|
| 448 | 440 | skb = np->rx_skbuff[i]; |
|---|
| 449 | 441 | if (skb) { |
|---|
| 450 | | - pci_unmap_single(np->pdev, desc_to_dma(&np->rx_ring[i]), |
|---|
| 451 | | - skb->len, PCI_DMA_FROMDEVICE); |
|---|
| 442 | + dma_unmap_single(&np->pdev->dev, |
|---|
| 443 | + desc_to_dma(&np->rx_ring[i]), |
|---|
| 444 | + skb->len, DMA_FROM_DEVICE); |
|---|
| 452 | 445 | dev_kfree_skb(skb); |
|---|
| 453 | 446 | np->rx_skbuff[i] = NULL; |
|---|
| 454 | 447 | } |
|---|
| .. | .. |
|---|
| 458 | 451 | for (i = 0; i < TX_RING_SIZE; i++) { |
|---|
| 459 | 452 | skb = np->tx_skbuff[i]; |
|---|
| 460 | 453 | if (skb) { |
|---|
| 461 | | - pci_unmap_single(np->pdev, desc_to_dma(&np->tx_ring[i]), |
|---|
| 462 | | - skb->len, PCI_DMA_TODEVICE); |
|---|
| 454 | + dma_unmap_single(&np->pdev->dev, |
|---|
| 455 | + desc_to_dma(&np->tx_ring[i]), |
|---|
| 456 | + skb->len, DMA_TO_DEVICE); |
|---|
| 463 | 457 | dev_kfree_skb(skb); |
|---|
| 464 | 458 | np->tx_skbuff[i] = NULL; |
|---|
| 465 | 459 | } |
|---|
| .. | .. |
|---|
| 516 | 510 | sizeof(struct netdev_desc)); |
|---|
| 517 | 511 | /* Rubicon now supports 40 bits of addressing space. */ |
|---|
| 518 | 512 | np->rx_ring[i].fraginfo = |
|---|
| 519 | | - cpu_to_le64(pci_map_single( |
|---|
| 520 | | - np->pdev, skb->data, np->rx_buf_sz, |
|---|
| 521 | | - PCI_DMA_FROMDEVICE)); |
|---|
| 513 | + cpu_to_le64(dma_map_single(&np->pdev->dev, skb->data, |
|---|
| 514 | + np->rx_buf_sz, DMA_FROM_DEVICE)); |
|---|
| 522 | 515 | np->rx_ring[i].fraginfo |= cpu_to_le64((u64)np->rx_buf_sz << 48); |
|---|
| 523 | 516 | } |
|---|
| 524 | 517 | |
|---|
| .. | .. |
|---|
| 684 | 677 | } |
|---|
| 685 | 678 | np->rx_skbuff[entry] = skb; |
|---|
| 686 | 679 | np->rx_ring[entry].fraginfo = |
|---|
| 687 | | - cpu_to_le64 (pci_map_single |
|---|
| 688 | | - (np->pdev, skb->data, np->rx_buf_sz, |
|---|
| 689 | | - PCI_DMA_FROMDEVICE)); |
|---|
| 680 | + cpu_to_le64 (dma_map_single(&np->pdev->dev, skb->data, |
|---|
| 681 | + np->rx_buf_sz, DMA_FROM_DEVICE)); |
|---|
| 690 | 682 | } |
|---|
| 691 | 683 | np->rx_ring[entry].fraginfo |= |
|---|
| 692 | 684 | cpu_to_le64((u64)np->rx_buf_sz << 48); |
|---|
| .. | .. |
|---|
| 699 | 691 | } |
|---|
| 700 | 692 | |
|---|
| 701 | 693 | static void |
|---|
| 702 | | -rio_tx_timeout (struct net_device *dev) |
|---|
| 694 | +rio_tx_timeout (struct net_device *dev, unsigned int txqueue) |
|---|
| 703 | 695 | { |
|---|
| 704 | 696 | struct netdev_private *np = netdev_priv(dev); |
|---|
| 705 | 697 | void __iomem *ioaddr = np->ioaddr; |
|---|
| .. | .. |
|---|
| 740 | 732 | ((u64)np->vlan << 32) | |
|---|
| 741 | 733 | ((u64)skb->priority << 45); |
|---|
| 742 | 734 | } |
|---|
| 743 | | - txdesc->fraginfo = cpu_to_le64 (pci_map_single (np->pdev, skb->data, |
|---|
| 744 | | - skb->len, |
|---|
| 745 | | - PCI_DMA_TODEVICE)); |
|---|
| 735 | + txdesc->fraginfo = cpu_to_le64 (dma_map_single(&np->pdev->dev, skb->data, |
|---|
| 736 | + skb->len, DMA_TO_DEVICE)); |
|---|
| 746 | 737 | txdesc->fraginfo |= cpu_to_le64((u64)skb->len << 48); |
|---|
| 747 | 738 | |
|---|
| 748 | 739 | /* DL2K bug: DMA fails to get next descriptor ptr in 10Mbps mode |
|---|
| .. | .. |
|---|
| 839 | 830 | if (!(np->tx_ring[entry].status & cpu_to_le64(TFDDone))) |
|---|
| 840 | 831 | break; |
|---|
| 841 | 832 | skb = np->tx_skbuff[entry]; |
|---|
| 842 | | - pci_unmap_single (np->pdev, |
|---|
| 843 | | - desc_to_dma(&np->tx_ring[entry]), |
|---|
| 844 | | - skb->len, PCI_DMA_TODEVICE); |
|---|
| 833 | + dma_unmap_single(&np->pdev->dev, |
|---|
| 834 | + desc_to_dma(&np->tx_ring[entry]), skb->len, |
|---|
| 835 | + DMA_TO_DEVICE); |
|---|
| 845 | 836 | if (irq) |
|---|
| 846 | | - dev_kfree_skb_irq (skb); |
|---|
| 837 | + dev_consume_skb_irq(skb); |
|---|
| 847 | 838 | else |
|---|
| 848 | | - dev_kfree_skb (skb); |
|---|
| 839 | + dev_kfree_skb(skb); |
|---|
| 849 | 840 | |
|---|
| 850 | 841 | np->tx_skbuff[entry] = NULL; |
|---|
| 851 | 842 | entry = (entry + 1) % TX_RING_SIZE; |
|---|
| .. | .. |
|---|
| 961 | 952 | |
|---|
| 962 | 953 | /* Small skbuffs for short packets */ |
|---|
| 963 | 954 | if (pkt_len > copy_thresh) { |
|---|
| 964 | | - pci_unmap_single (np->pdev, |
|---|
| 965 | | - desc_to_dma(desc), |
|---|
| 966 | | - np->rx_buf_sz, |
|---|
| 967 | | - PCI_DMA_FROMDEVICE); |
|---|
| 955 | + dma_unmap_single(&np->pdev->dev, |
|---|
| 956 | + desc_to_dma(desc), |
|---|
| 957 | + np->rx_buf_sz, |
|---|
| 958 | + DMA_FROM_DEVICE); |
|---|
| 968 | 959 | skb_put (skb = np->rx_skbuff[entry], pkt_len); |
|---|
| 969 | 960 | np->rx_skbuff[entry] = NULL; |
|---|
| 970 | 961 | } else if ((skb = netdev_alloc_skb_ip_align(dev, pkt_len))) { |
|---|
| 971 | | - pci_dma_sync_single_for_cpu(np->pdev, |
|---|
| 972 | | - desc_to_dma(desc), |
|---|
| 973 | | - np->rx_buf_sz, |
|---|
| 974 | | - PCI_DMA_FROMDEVICE); |
|---|
| 962 | + dma_sync_single_for_cpu(&np->pdev->dev, |
|---|
| 963 | + desc_to_dma(desc), |
|---|
| 964 | + np->rx_buf_sz, |
|---|
| 965 | + DMA_FROM_DEVICE); |
|---|
| 975 | 966 | skb_copy_to_linear_data (skb, |
|---|
| 976 | 967 | np->rx_skbuff[entry]->data, |
|---|
| 977 | 968 | pkt_len); |
|---|
| 978 | 969 | skb_put (skb, pkt_len); |
|---|
| 979 | | - pci_dma_sync_single_for_device(np->pdev, |
|---|
| 980 | | - desc_to_dma(desc), |
|---|
| 981 | | - np->rx_buf_sz, |
|---|
| 982 | | - PCI_DMA_FROMDEVICE); |
|---|
| 970 | + dma_sync_single_for_device(&np->pdev->dev, |
|---|
| 971 | + desc_to_dma(desc), |
|---|
| 972 | + np->rx_buf_sz, |
|---|
| 973 | + DMA_FROM_DEVICE); |
|---|
| 983 | 974 | } |
|---|
| 984 | 975 | skb->protocol = eth_type_trans (skb, dev); |
|---|
| 985 | 976 | #if 0 |
|---|
| .. | .. |
|---|
| 1012 | 1003 | } |
|---|
| 1013 | 1004 | np->rx_skbuff[entry] = skb; |
|---|
| 1014 | 1005 | np->rx_ring[entry].fraginfo = |
|---|
| 1015 | | - cpu_to_le64 (pci_map_single |
|---|
| 1016 | | - (np->pdev, skb->data, np->rx_buf_sz, |
|---|
| 1017 | | - PCI_DMA_FROMDEVICE)); |
|---|
| 1006 | + cpu_to_le64(dma_map_single(&np->pdev->dev, skb->data, |
|---|
| 1007 | + np->rx_buf_sz, DMA_FROM_DEVICE)); |
|---|
| 1018 | 1008 | } |
|---|
| 1019 | 1009 | np->rx_ring[entry].fraginfo |= |
|---|
| 1020 | 1010 | cpu_to_le64((u64)np->rx_buf_sz << 48); |
|---|
| .. | .. |
|---|
| 1247 | 1237 | struct netdev_private *np = netdev_priv(dev); |
|---|
| 1248 | 1238 | |
|---|
| 1249 | 1239 | strlcpy(info->driver, "dl2k", sizeof(info->driver)); |
|---|
| 1250 | | - strlcpy(info->version, DRV_VERSION, sizeof(info->version)); |
|---|
| 1251 | 1240 | strlcpy(info->bus_info, pci_name(np->pdev), sizeof(info->bus_info)); |
|---|
| 1252 | 1241 | } |
|---|
| 1253 | 1242 | |
|---|
| .. | .. |
|---|
| 1809 | 1798 | struct netdev_private *np = netdev_priv(dev); |
|---|
| 1810 | 1799 | |
|---|
| 1811 | 1800 | unregister_netdev (dev); |
|---|
| 1812 | | - pci_free_consistent (pdev, RX_TOTAL_SIZE, np->rx_ring, |
|---|
| 1813 | | - np->rx_ring_dma); |
|---|
| 1814 | | - pci_free_consistent (pdev, TX_TOTAL_SIZE, np->tx_ring, |
|---|
| 1815 | | - np->tx_ring_dma); |
|---|
| 1801 | + dma_free_coherent(&pdev->dev, RX_TOTAL_SIZE, np->rx_ring, |
|---|
| 1802 | + np->rx_ring_dma); |
|---|
| 1803 | + dma_free_coherent(&pdev->dev, TX_TOTAL_SIZE, np->tx_ring, |
|---|
| 1804 | + np->tx_ring_dma); |
|---|
| 1816 | 1805 | #ifdef MEM_MAPPING |
|---|
| 1817 | 1806 | pci_iounmap(pdev, np->ioaddr); |
|---|
| 1818 | 1807 | #endif |
|---|
| .. | .. |
|---|
| 1875 | 1864 | }; |
|---|
| 1876 | 1865 | |
|---|
| 1877 | 1866 | module_pci_driver(rio_driver); |
|---|
| 1878 | | -/* |
|---|
| 1879 | 1867 | |
|---|
| 1880 | | -Compile command: |
|---|
| 1881 | | - |
|---|
| 1882 | | -gcc -D__KERNEL__ -DMODULE -I/usr/src/linux/include -Wall -Wstrict-prototypes -O2 -c dl2k.c |
|---|
| 1883 | | - |
|---|
| 1884 | | -Read Documentation/networking/dl2k.txt for details. |
|---|
| 1885 | | - |
|---|
| 1886 | | -*/ |
|---|
| 1887 | | - |
|---|
| 1868 | +/* Read Documentation/networking/device_drivers/ethernet/dlink/dl2k.rst. */ |
|---|