| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | #define VERSION "0.23" |
|---|
| 2 | 3 | /* ns83820.c by Benjamin LaHaise with contributions. |
|---|
| 3 | 4 | * |
|---|
| .. | .. |
|---|
| 9 | 10 | * Copyright 2001, 2002 Red Hat. |
|---|
| 10 | 11 | * |
|---|
| 11 | 12 | * Mmmm, chocolate vanilla mocha... |
|---|
| 12 | | - * |
|---|
| 13 | | - * |
|---|
| 14 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 15 | | - * it under the terms of the GNU General Public License as published by |
|---|
| 16 | | - * the Free Software Foundation; either version 2 of the License, or |
|---|
| 17 | | - * (at your option) any later version. |
|---|
| 18 | | - * |
|---|
| 19 | | - * This program is distributed in the hope that it will be useful, |
|---|
| 20 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 21 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 22 | | - * GNU General Public License for more details. |
|---|
| 23 | | - * |
|---|
| 24 | | - * You should have received a copy of the GNU General Public License |
|---|
| 25 | | - * along with this program; if not, see <http://www.gnu.org/licenses/>. |
|---|
| 26 | | - * |
|---|
| 27 | 13 | * |
|---|
| 28 | 14 | * ChangeLog |
|---|
| 29 | 15 | * ========= |
|---|
| .. | .. |
|---|
| 540 | 526 | |
|---|
| 541 | 527 | dev->rx_info.next_empty = (next_empty + 1) % NR_RX_DESC; |
|---|
| 542 | 528 | cmdsts = REAL_RX_BUF_SIZE | CMDSTS_INTR; |
|---|
| 543 | | - buf = pci_map_single(dev->pci_dev, skb->data, |
|---|
| 544 | | - REAL_RX_BUF_SIZE, PCI_DMA_FROMDEVICE); |
|---|
| 529 | + buf = dma_map_single(&dev->pci_dev->dev, skb->data, REAL_RX_BUF_SIZE, |
|---|
| 530 | + DMA_FROM_DEVICE); |
|---|
| 545 | 531 | build_rx_desc(dev, sg, 0, buf, cmdsts, 0); |
|---|
| 546 | 532 | /* update link of previous rx */ |
|---|
| 547 | 533 | if (likely(next_empty != dev->rx_info.next_rx)) |
|---|
| .. | .. |
|---|
| 614 | 600 | struct ns83820 *dev = PRIV(ndev); |
|---|
| 615 | 601 | static const char *speeds[] = { "10", "100", "1000", "1000(?)", "1000F" }; |
|---|
| 616 | 602 | u32 cfg, new_cfg; |
|---|
| 617 | | - u32 tbisr, tanar, tanlpar; |
|---|
| 603 | + u32 tanar, tanlpar; |
|---|
| 618 | 604 | int speed, fullduplex, newlinkstate; |
|---|
| 619 | 605 | |
|---|
| 620 | 606 | cfg = readl(dev->base + CFG) ^ SPDSTS_POLARITY; |
|---|
| 621 | 607 | |
|---|
| 622 | 608 | if (dev->CFG_cache & CFG_TBI_EN) { |
|---|
| 609 | + u32 __maybe_unused tbisr; |
|---|
| 610 | + |
|---|
| 623 | 611 | /* we have an optical transceiver */ |
|---|
| 624 | 612 | tbisr = readl(dev->base + TBISR); |
|---|
| 625 | 613 | tanar = readl(dev->base + TANAR); |
|---|
| .. | .. |
|---|
| 872 | 860 | mb(); |
|---|
| 873 | 861 | clear_rx_desc(dev, next_rx); |
|---|
| 874 | 862 | |
|---|
| 875 | | - pci_unmap_single(dev->pci_dev, bufptr, |
|---|
| 876 | | - RX_BUF_SIZE, PCI_DMA_FROMDEVICE); |
|---|
| 863 | + dma_unmap_single(&dev->pci_dev->dev, bufptr, RX_BUF_SIZE, |
|---|
| 864 | + DMA_FROM_DEVICE); |
|---|
| 877 | 865 | len = cmdsts & CMDSTS_LEN_MASK; |
|---|
| 878 | 866 | #ifdef NS83820_VLAN_ACCEL_SUPPORT |
|---|
| 879 | 867 | /* NH: As was mentioned below, this chip is kinda |
|---|
| .. | .. |
|---|
| 937 | 925 | spin_unlock_irqrestore(&info->lock, flags); |
|---|
| 938 | 926 | } |
|---|
| 939 | 927 | |
|---|
| 940 | | -static void rx_action(unsigned long _dev) |
|---|
| 928 | +static void rx_action(struct tasklet_struct *t) |
|---|
| 941 | 929 | { |
|---|
| 942 | | - struct net_device *ndev = (void *)_dev; |
|---|
| 943 | | - struct ns83820 *dev = PRIV(ndev); |
|---|
| 930 | + struct ns83820 *dev = from_tasklet(dev, t, rx_tasklet); |
|---|
| 931 | + struct net_device *ndev = dev->ndev; |
|---|
| 944 | 932 | rx_irq(ndev); |
|---|
| 945 | 933 | writel(ihr, dev->base + IHR); |
|---|
| 946 | 934 | |
|---|
| .. | .. |
|---|
| 999 | 987 | len = cmdsts & CMDSTS_LEN_MASK; |
|---|
| 1000 | 988 | addr = desc_addr_get(desc + DESC_BUFPTR); |
|---|
| 1001 | 989 | if (skb) { |
|---|
| 1002 | | - pci_unmap_single(dev->pci_dev, |
|---|
| 1003 | | - addr, |
|---|
| 1004 | | - len, |
|---|
| 1005 | | - PCI_DMA_TODEVICE); |
|---|
| 1006 | | - dev_kfree_skb_irq(skb); |
|---|
| 990 | + dma_unmap_single(&dev->pci_dev->dev, addr, len, |
|---|
| 991 | + DMA_TO_DEVICE); |
|---|
| 992 | + dev_consume_skb_irq(skb); |
|---|
| 1007 | 993 | atomic_dec(&dev->nr_tx_skbs); |
|---|
| 1008 | 994 | } else |
|---|
| 1009 | | - pci_unmap_page(dev->pci_dev, |
|---|
| 1010 | | - addr, |
|---|
| 1011 | | - len, |
|---|
| 1012 | | - PCI_DMA_TODEVICE); |
|---|
| 995 | + dma_unmap_page(&dev->pci_dev->dev, addr, len, |
|---|
| 996 | + DMA_TO_DEVICE); |
|---|
| 1013 | 997 | |
|---|
| 1014 | 998 | tx_done_idx = (tx_done_idx + 1) % NR_TX_DESC; |
|---|
| 1015 | 999 | dev->tx_done_idx = tx_done_idx; |
|---|
| .. | .. |
|---|
| 1037 | 1021 | dev->tx_skbs[i] = NULL; |
|---|
| 1038 | 1022 | if (skb) { |
|---|
| 1039 | 1023 | __le32 *desc = dev->tx_descs + (i * DESC_SIZE); |
|---|
| 1040 | | - pci_unmap_single(dev->pci_dev, |
|---|
| 1041 | | - desc_addr_get(desc + DESC_BUFPTR), |
|---|
| 1042 | | - le32_to_cpu(desc[DESC_CMDSTS]) & CMDSTS_LEN_MASK, |
|---|
| 1043 | | - PCI_DMA_TODEVICE); |
|---|
| 1024 | + dma_unmap_single(&dev->pci_dev->dev, |
|---|
| 1025 | + desc_addr_get(desc + DESC_BUFPTR), |
|---|
| 1026 | + le32_to_cpu(desc[DESC_CMDSTS]) & CMDSTS_LEN_MASK, |
|---|
| 1027 | + DMA_TO_DEVICE); |
|---|
| 1044 | 1028 | dev_kfree_skb_irq(skb); |
|---|
| 1045 | 1029 | atomic_dec(&dev->nr_tx_skbs); |
|---|
| 1046 | 1030 | } |
|---|
| .. | .. |
|---|
| 1135 | 1119 | len = skb->len; |
|---|
| 1136 | 1120 | if (nr_frags) |
|---|
| 1137 | 1121 | len -= skb->data_len; |
|---|
| 1138 | | - buf = pci_map_single(dev->pci_dev, skb->data, len, PCI_DMA_TODEVICE); |
|---|
| 1122 | + buf = dma_map_single(&dev->pci_dev->dev, skb->data, len, |
|---|
| 1123 | + DMA_TO_DEVICE); |
|---|
| 1139 | 1124 | |
|---|
| 1140 | 1125 | first_desc = dev->tx_descs + (free_idx * DESC_SIZE); |
|---|
| 1141 | 1126 | |
|---|
| .. | .. |
|---|
| 1221 | 1206 | struct ethtool_link_ksettings *cmd) |
|---|
| 1222 | 1207 | { |
|---|
| 1223 | 1208 | struct ns83820 *dev = PRIV(ndev); |
|---|
| 1224 | | - u32 cfg, tanar, tbicr; |
|---|
| 1209 | + u32 cfg, tbicr; |
|---|
| 1225 | 1210 | int fullduplex = 0; |
|---|
| 1226 | 1211 | u32 supported; |
|---|
| 1227 | 1212 | |
|---|
| .. | .. |
|---|
| 1240 | 1225 | |
|---|
| 1241 | 1226 | /* read current configuration */ |
|---|
| 1242 | 1227 | cfg = readl(dev->base + CFG) ^ SPDSTS_POLARITY; |
|---|
| 1243 | | - tanar = readl(dev->base + TANAR); |
|---|
| 1228 | + readl(dev->base + TANAR); |
|---|
| 1244 | 1229 | tbicr = readl(dev->base + TBICR); |
|---|
| 1245 | 1230 | |
|---|
| 1246 | 1231 | fullduplex = (cfg & CFG_DUPSTS) ? 1 : 0; |
|---|
| .. | .. |
|---|
| 1563 | 1548 | return 0; |
|---|
| 1564 | 1549 | } |
|---|
| 1565 | 1550 | |
|---|
| 1566 | | -static void ns83820_tx_timeout(struct net_device *ndev) |
|---|
| 1551 | +static void ns83820_tx_timeout(struct net_device *ndev, unsigned int txqueue) |
|---|
| 1567 | 1552 | { |
|---|
| 1568 | 1553 | struct ns83820 *dev = PRIV(ndev); |
|---|
| 1569 | 1554 | u32 tx_done_idx; |
|---|
| .. | .. |
|---|
| 1617 | 1602 | ndev->name, |
|---|
| 1618 | 1603 | dev->tx_done_idx, dev->tx_free_idx, |
|---|
| 1619 | 1604 | atomic_read(&dev->nr_tx_skbs)); |
|---|
| 1620 | | - ns83820_tx_timeout(ndev); |
|---|
| 1605 | + ns83820_tx_timeout(ndev, UINT_MAX); |
|---|
| 1621 | 1606 | } |
|---|
| 1622 | 1607 | |
|---|
| 1623 | 1608 | mod_timer(&dev->tx_watchdog, jiffies + 2*HZ); |
|---|
| .. | .. |
|---|
| 1869 | 1854 | static void ns83820_probe_phy(struct net_device *ndev) |
|---|
| 1870 | 1855 | { |
|---|
| 1871 | 1856 | struct ns83820 *dev = PRIV(ndev); |
|---|
| 1872 | | - static int first; |
|---|
| 1873 | | - int i; |
|---|
| 1874 | | -#define MII_PHYIDR1 0x02 |
|---|
| 1875 | | -#define MII_PHYIDR2 0x03 |
|---|
| 1857 | + int j; |
|---|
| 1858 | + unsigned a, b; |
|---|
| 1876 | 1859 | |
|---|
| 1877 | | -#if 0 |
|---|
| 1878 | | - if (!first) { |
|---|
| 1879 | | - unsigned tmp; |
|---|
| 1880 | | - ns83820_mii_read_reg(dev, 1, 0x09); |
|---|
| 1881 | | - ns83820_mii_write_reg(dev, 1, 0x10, 0x0d3e); |
|---|
| 1882 | | - |
|---|
| 1883 | | - tmp = ns83820_mii_read_reg(dev, 1, 0x00); |
|---|
| 1884 | | - ns83820_mii_write_reg(dev, 1, 0x00, tmp | 0x8000); |
|---|
| 1885 | | - udelay(1300); |
|---|
| 1886 | | - ns83820_mii_read_reg(dev, 1, 0x09); |
|---|
| 1860 | + for (j = 0; j < 0x16; j += 4) { |
|---|
| 1861 | + dprintk("%s: [0x%02x] %04x %04x %04x %04x\n", |
|---|
| 1862 | + ndev->name, j, |
|---|
| 1863 | + ns83820_mii_read_reg(dev, 1, 0 + j), |
|---|
| 1864 | + ns83820_mii_read_reg(dev, 1, 1 + j), |
|---|
| 1865 | + ns83820_mii_read_reg(dev, 1, 2 + j), |
|---|
| 1866 | + ns83820_mii_read_reg(dev, 1, 3 + j) |
|---|
| 1867 | + ); |
|---|
| 1887 | 1868 | } |
|---|
| 1888 | | -#endif |
|---|
| 1889 | | - first = 1; |
|---|
| 1890 | 1869 | |
|---|
| 1891 | | - for (i=1; i<2; i++) { |
|---|
| 1892 | | - int j; |
|---|
| 1893 | | - unsigned a, b; |
|---|
| 1894 | | - a = ns83820_mii_read_reg(dev, i, MII_PHYIDR1); |
|---|
| 1895 | | - b = ns83820_mii_read_reg(dev, i, MII_PHYIDR2); |
|---|
| 1870 | + /* read firmware version: memory addr is 0x8402 and 0x8403 */ |
|---|
| 1871 | + ns83820_mii_write_reg(dev, 1, 0x16, 0x000d); |
|---|
| 1872 | + ns83820_mii_write_reg(dev, 1, 0x1e, 0x810e); |
|---|
| 1873 | + a = ns83820_mii_read_reg(dev, 1, 0x1d); |
|---|
| 1896 | 1874 | |
|---|
| 1897 | | - //printk("%s: phy %d: 0x%04x 0x%04x\n", |
|---|
| 1898 | | - // ndev->name, i, a, b); |
|---|
| 1899 | | - |
|---|
| 1900 | | - for (j=0; j<0x16; j+=4) { |
|---|
| 1901 | | - dprintk("%s: [0x%02x] %04x %04x %04x %04x\n", |
|---|
| 1902 | | - ndev->name, j, |
|---|
| 1903 | | - ns83820_mii_read_reg(dev, i, 0 + j), |
|---|
| 1904 | | - ns83820_mii_read_reg(dev, i, 1 + j), |
|---|
| 1905 | | - ns83820_mii_read_reg(dev, i, 2 + j), |
|---|
| 1906 | | - ns83820_mii_read_reg(dev, i, 3 + j) |
|---|
| 1907 | | - ); |
|---|
| 1908 | | - } |
|---|
| 1909 | | - } |
|---|
| 1910 | | - { |
|---|
| 1911 | | - unsigned a, b; |
|---|
| 1912 | | - /* read firmware version: memory addr is 0x8402 and 0x8403 */ |
|---|
| 1913 | | - ns83820_mii_write_reg(dev, 1, 0x16, 0x000d); |
|---|
| 1914 | | - ns83820_mii_write_reg(dev, 1, 0x1e, 0x810e); |
|---|
| 1915 | | - a = ns83820_mii_read_reg(dev, 1, 0x1d); |
|---|
| 1916 | | - |
|---|
| 1917 | | - ns83820_mii_write_reg(dev, 1, 0x16, 0x000d); |
|---|
| 1918 | | - ns83820_mii_write_reg(dev, 1, 0x1e, 0x810e); |
|---|
| 1919 | | - b = ns83820_mii_read_reg(dev, 1, 0x1d); |
|---|
| 1920 | | - dprintk("version: 0x%04x 0x%04x\n", a, b); |
|---|
| 1921 | | - } |
|---|
| 1875 | + ns83820_mii_write_reg(dev, 1, 0x16, 0x000d); |
|---|
| 1876 | + ns83820_mii_write_reg(dev, 1, 0x1e, 0x810e); |
|---|
| 1877 | + b = ns83820_mii_read_reg(dev, 1, 0x1d); |
|---|
| 1878 | + dprintk("version: 0x%04x 0x%04x\n", a, b); |
|---|
| 1922 | 1879 | } |
|---|
| 1923 | 1880 | #endif |
|---|
| 1924 | 1881 | |
|---|
| .. | .. |
|---|
| 1944 | 1901 | |
|---|
| 1945 | 1902 | /* See if we can set the dma mask early on; failure is fatal. */ |
|---|
| 1946 | 1903 | if (sizeof(dma_addr_t) == 8 && |
|---|
| 1947 | | - !pci_set_dma_mask(pci_dev, DMA_BIT_MASK(64))) { |
|---|
| 1904 | + !dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(64))) { |
|---|
| 1948 | 1905 | using_dac = 1; |
|---|
| 1949 | | - } else if (!pci_set_dma_mask(pci_dev, DMA_BIT_MASK(32))) { |
|---|
| 1906 | + } else if (!dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(32))) { |
|---|
| 1950 | 1907 | using_dac = 0; |
|---|
| 1951 | 1908 | } else { |
|---|
| 1952 | | - dev_warn(&pci_dev->dev, "pci_set_dma_mask failed!\n"); |
|---|
| 1909 | + dev_warn(&pci_dev->dev, "dma_set_mask failed!\n"); |
|---|
| 1953 | 1910 | return -ENODEV; |
|---|
| 1954 | 1911 | } |
|---|
| 1955 | 1912 | |
|---|
| .. | .. |
|---|
| 1969 | 1926 | SET_NETDEV_DEV(ndev, &pci_dev->dev); |
|---|
| 1970 | 1927 | |
|---|
| 1971 | 1928 | INIT_WORK(&dev->tq_refill, queue_refill); |
|---|
| 1972 | | - tasklet_init(&dev->rx_tasklet, rx_action, (unsigned long)ndev); |
|---|
| 1929 | + tasklet_setup(&dev->rx_tasklet, rx_action); |
|---|
| 1973 | 1930 | |
|---|
| 1974 | 1931 | err = pci_enable_device(pci_dev); |
|---|
| 1975 | 1932 | if (err) { |
|---|
| .. | .. |
|---|
| 1979 | 1936 | |
|---|
| 1980 | 1937 | pci_set_master(pci_dev); |
|---|
| 1981 | 1938 | addr = pci_resource_start(pci_dev, 1); |
|---|
| 1982 | | - dev->base = ioremap_nocache(addr, PAGE_SIZE); |
|---|
| 1983 | | - dev->tx_descs = pci_alloc_consistent(pci_dev, |
|---|
| 1984 | | - 4 * DESC_SIZE * NR_TX_DESC, &dev->tx_phy_descs); |
|---|
| 1985 | | - dev->rx_info.descs = pci_alloc_consistent(pci_dev, |
|---|
| 1986 | | - 4 * DESC_SIZE * NR_RX_DESC, &dev->rx_info.phy_descs); |
|---|
| 1939 | + dev->base = ioremap(addr, PAGE_SIZE); |
|---|
| 1940 | + dev->tx_descs = dma_alloc_coherent(&pci_dev->dev, |
|---|
| 1941 | + 4 * DESC_SIZE * NR_TX_DESC, |
|---|
| 1942 | + &dev->tx_phy_descs, GFP_KERNEL); |
|---|
| 1943 | + dev->rx_info.descs = dma_alloc_coherent(&pci_dev->dev, |
|---|
| 1944 | + 4 * DESC_SIZE * NR_RX_DESC, |
|---|
| 1945 | + &dev->rx_info.phy_descs, GFP_KERNEL); |
|---|
| 1987 | 1946 | err = -ENOMEM; |
|---|
| 1988 | 1947 | if (!dev->base || !dev->tx_descs || !dev->rx_info.descs) |
|---|
| 1989 | 1948 | goto out_disable; |
|---|
| .. | .. |
|---|
| 2225 | 2184 | out_disable: |
|---|
| 2226 | 2185 | if (dev->base) |
|---|
| 2227 | 2186 | iounmap(dev->base); |
|---|
| 2228 | | - pci_free_consistent(pci_dev, 4 * DESC_SIZE * NR_TX_DESC, dev->tx_descs, dev->tx_phy_descs); |
|---|
| 2229 | | - pci_free_consistent(pci_dev, 4 * DESC_SIZE * NR_RX_DESC, dev->rx_info.descs, dev->rx_info.phy_descs); |
|---|
| 2187 | + dma_free_coherent(&pci_dev->dev, 4 * DESC_SIZE * NR_TX_DESC, |
|---|
| 2188 | + dev->tx_descs, dev->tx_phy_descs); |
|---|
| 2189 | + dma_free_coherent(&pci_dev->dev, 4 * DESC_SIZE * NR_RX_DESC, |
|---|
| 2190 | + dev->rx_info.descs, dev->rx_info.phy_descs); |
|---|
| 2230 | 2191 | pci_disable_device(pci_dev); |
|---|
| 2231 | 2192 | out_free: |
|---|
| 2232 | 2193 | free_netdev(ndev); |
|---|
| .. | .. |
|---|
| 2247 | 2208 | unregister_netdev(ndev); |
|---|
| 2248 | 2209 | free_irq(dev->pci_dev->irq, ndev); |
|---|
| 2249 | 2210 | iounmap(dev->base); |
|---|
| 2250 | | - pci_free_consistent(dev->pci_dev, 4 * DESC_SIZE * NR_TX_DESC, |
|---|
| 2251 | | - dev->tx_descs, dev->tx_phy_descs); |
|---|
| 2252 | | - pci_free_consistent(dev->pci_dev, 4 * DESC_SIZE * NR_RX_DESC, |
|---|
| 2253 | | - dev->rx_info.descs, dev->rx_info.phy_descs); |
|---|
| 2211 | + dma_free_coherent(&dev->pci_dev->dev, 4 * DESC_SIZE * NR_TX_DESC, |
|---|
| 2212 | + dev->tx_descs, dev->tx_phy_descs); |
|---|
| 2213 | + dma_free_coherent(&dev->pci_dev->dev, 4 * DESC_SIZE * NR_RX_DESC, |
|---|
| 2214 | + dev->rx_info.descs, dev->rx_info.phy_descs); |
|---|
| 2254 | 2215 | pci_disable_device(dev->pci_dev); |
|---|
| 2255 | 2216 | free_netdev(ndev); |
|---|
| 2256 | 2217 | } |
|---|