| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Copyright(c) 2005 - 2006 Attansic Corporation. All rights reserved. |
|---|
| 3 | 4 | * Copyright(c) 2006 - 2007 Chris Snook <csnook@redhat.com> |
|---|
| .. | .. |
|---|
| 5 | 6 | * |
|---|
| 6 | 7 | * Derived from Intel e1000 driver |
|---|
| 7 | 8 | * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. |
|---|
| 8 | | - * |
|---|
| 9 | | - * This program is free software; you can redistribute it and/or modify it |
|---|
| 10 | | - * under the terms of the GNU General Public License as published by the Free |
|---|
| 11 | | - * Software Foundation; either version 2 of the License, or (at your option) |
|---|
| 12 | | - * any later version. |
|---|
| 13 | | - * |
|---|
| 14 | | - * This program is distributed in the hope that it will be useful, but WITHOUT |
|---|
| 15 | | - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|---|
| 16 | | - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
|---|
| 17 | | - * more details. |
|---|
| 18 | | - * |
|---|
| 19 | | - * You should have received a copy of the GNU General Public License along with |
|---|
| 20 | | - * this program; if not, write to the Free Software Foundation, Inc., 59 |
|---|
| 21 | | - * Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
|---|
| 22 | | - * |
|---|
| 23 | | - * The full GNU General Public License is included in this distribution in the |
|---|
| 24 | | - * file called COPYING. |
|---|
| 25 | 9 | * |
|---|
| 26 | 10 | * Contact Information: |
|---|
| 27 | 11 | * Xiong Huang <xiong.huang@atheros.com> |
|---|
| .. | .. |
|---|
| 63 | 47 | #include <linux/jiffies.h> |
|---|
| 64 | 48 | #include <linux/mii.h> |
|---|
| 65 | 49 | #include <linux/module.h> |
|---|
| 66 | | -#include <linux/moduleparam.h> |
|---|
| 67 | 50 | #include <linux/net.h> |
|---|
| 68 | 51 | #include <linux/netdevice.h> |
|---|
| 69 | 52 | #include <linux/pci.h> |
|---|
| .. | .. |
|---|
| 82 | 65 | |
|---|
| 83 | 66 | #include "atl1.h" |
|---|
| 84 | 67 | |
|---|
| 85 | | -#define ATLX_DRIVER_VERSION "2.1.3" |
|---|
| 86 | 68 | MODULE_AUTHOR("Xiong Huang <xiong.huang@atheros.com>, " |
|---|
| 87 | 69 | "Chris Snook <csnook@redhat.com>, " |
|---|
| 88 | 70 | "Jay Cliburn <jcliburn@gmail.com>"); |
|---|
| 89 | 71 | MODULE_LICENSE("GPL"); |
|---|
| 90 | | -MODULE_VERSION(ATLX_DRIVER_VERSION); |
|---|
| 91 | 72 | |
|---|
| 92 | 73 | /* Temporary hack for merging atl1 and atl2 */ |
|---|
| 93 | 74 | #include "atlx.c" |
|---|
| .. | .. |
|---|
| 1061 | 1042 | * each ring/block may need up to 8 bytes for alignment, hence the |
|---|
| 1062 | 1043 | * additional 40 bytes tacked onto the end. |
|---|
| 1063 | 1044 | */ |
|---|
| 1064 | | - ring_header->size = size = |
|---|
| 1045 | + ring_header->size = |
|---|
| 1065 | 1046 | sizeof(struct tx_packet_desc) * tpd_ring->count |
|---|
| 1066 | 1047 | + sizeof(struct rx_free_desc) * rfd_ring->count |
|---|
| 1067 | 1048 | + sizeof(struct rx_return_desc) * rrd_ring->count |
|---|
| .. | .. |
|---|
| 1069 | 1050 | + sizeof(struct stats_msg_block) |
|---|
| 1070 | 1051 | + 40; |
|---|
| 1071 | 1052 | |
|---|
| 1072 | | - ring_header->desc = pci_alloc_consistent(pdev, ring_header->size, |
|---|
| 1073 | | - &ring_header->dma); |
|---|
| 1053 | + ring_header->desc = dma_alloc_coherent(&pdev->dev, ring_header->size, |
|---|
| 1054 | + &ring_header->dma, GFP_KERNEL); |
|---|
| 1074 | 1055 | if (unlikely(!ring_header->desc)) { |
|---|
| 1075 | 1056 | if (netif_msg_drv(adapter)) |
|---|
| 1076 | | - dev_err(&pdev->dev, "pci_alloc_consistent failed\n"); |
|---|
| 1057 | + dev_err(&pdev->dev, "dma_alloc_coherent failed\n"); |
|---|
| 1077 | 1058 | goto err_nomem; |
|---|
| 1078 | 1059 | } |
|---|
| 1079 | | - |
|---|
| 1080 | | - memset(ring_header->desc, 0, ring_header->size); |
|---|
| 1081 | 1060 | |
|---|
| 1082 | 1061 | /* init TPD ring */ |
|---|
| 1083 | 1062 | tpd_ring->dma = ring_header->dma; |
|---|
| .. | .. |
|---|
| 1157 | 1136 | for (i = 0; i < rfd_ring->count; i++) { |
|---|
| 1158 | 1137 | buffer_info = &rfd_ring->buffer_info[i]; |
|---|
| 1159 | 1138 | if (buffer_info->dma) { |
|---|
| 1160 | | - pci_unmap_page(pdev, buffer_info->dma, |
|---|
| 1161 | | - buffer_info->length, PCI_DMA_FROMDEVICE); |
|---|
| 1139 | + dma_unmap_page(&pdev->dev, buffer_info->dma, |
|---|
| 1140 | + buffer_info->length, DMA_FROM_DEVICE); |
|---|
| 1162 | 1141 | buffer_info->dma = 0; |
|---|
| 1163 | 1142 | } |
|---|
| 1164 | 1143 | if (buffer_info->skb) { |
|---|
| .. | .. |
|---|
| 1196 | 1175 | for (i = 0; i < tpd_ring->count; i++) { |
|---|
| 1197 | 1176 | buffer_info = &tpd_ring->buffer_info[i]; |
|---|
| 1198 | 1177 | if (buffer_info->dma) { |
|---|
| 1199 | | - pci_unmap_page(pdev, buffer_info->dma, |
|---|
| 1200 | | - buffer_info->length, PCI_DMA_TODEVICE); |
|---|
| 1178 | + dma_unmap_page(&pdev->dev, buffer_info->dma, |
|---|
| 1179 | + buffer_info->length, DMA_TO_DEVICE); |
|---|
| 1201 | 1180 | buffer_info->dma = 0; |
|---|
| 1202 | 1181 | } |
|---|
| 1203 | 1182 | } |
|---|
| .. | .. |
|---|
| 1238 | 1217 | atl1_clean_rx_ring(adapter); |
|---|
| 1239 | 1218 | |
|---|
| 1240 | 1219 | kfree(tpd_ring->buffer_info); |
|---|
| 1241 | | - pci_free_consistent(pdev, ring_header->size, ring_header->desc, |
|---|
| 1242 | | - ring_header->dma); |
|---|
| 1220 | + dma_free_coherent(&pdev->dev, ring_header->size, ring_header->desc, |
|---|
| 1221 | + ring_header->dma); |
|---|
| 1243 | 1222 | |
|---|
| 1244 | 1223 | tpd_ring->buffer_info = NULL; |
|---|
| 1245 | 1224 | tpd_ring->desc = NULL; |
|---|
| .. | .. |
|---|
| 1722 | 1701 | adapter->soft_stats.scc += smb->tx_1_col; |
|---|
| 1723 | 1702 | adapter->soft_stats.mcc += smb->tx_2_col; |
|---|
| 1724 | 1703 | adapter->soft_stats.latecol += smb->tx_late_col; |
|---|
| 1725 | | - adapter->soft_stats.tx_underun += smb->tx_underrun; |
|---|
| 1704 | + adapter->soft_stats.tx_underrun += smb->tx_underrun; |
|---|
| 1726 | 1705 | adapter->soft_stats.tx_trunc += smb->tx_trunc; |
|---|
| 1727 | 1706 | adapter->soft_stats.tx_pause += smb->tx_pause; |
|---|
| 1728 | 1707 | |
|---|
| .. | .. |
|---|
| 1887 | 1866 | buffer_info->length = (u16) adapter->rx_buffer_len; |
|---|
| 1888 | 1867 | page = virt_to_page(skb->data); |
|---|
| 1889 | 1868 | offset = offset_in_page(skb->data); |
|---|
| 1890 | | - buffer_info->dma = pci_map_page(pdev, page, offset, |
|---|
| 1869 | + buffer_info->dma = dma_map_page(&pdev->dev, page, offset, |
|---|
| 1891 | 1870 | adapter->rx_buffer_len, |
|---|
| 1892 | | - PCI_DMA_FROMDEVICE); |
|---|
| 1871 | + DMA_FROM_DEVICE); |
|---|
| 1893 | 1872 | rfd_desc->buffer_addr = cpu_to_le64(buffer_info->dma); |
|---|
| 1894 | 1873 | rfd_desc->buf_len = cpu_to_le16(adapter->rx_buffer_len); |
|---|
| 1895 | 1874 | rfd_desc->coalese = 0; |
|---|
| .. | .. |
|---|
| 2013 | 1992 | } |
|---|
| 2014 | 1993 | |
|---|
| 2015 | 1994 | /* Good Receive */ |
|---|
| 2016 | | - pci_unmap_page(adapter->pdev, buffer_info->dma, |
|---|
| 2017 | | - buffer_info->length, PCI_DMA_FROMDEVICE); |
|---|
| 1995 | + dma_unmap_page(&adapter->pdev->dev, buffer_info->dma, |
|---|
| 1996 | + buffer_info->length, DMA_FROM_DEVICE); |
|---|
| 2018 | 1997 | buffer_info->dma = 0; |
|---|
| 2019 | 1998 | skb = buffer_info->skb; |
|---|
| 2020 | 1999 | length = le16_to_cpu(rrd->xsz.xsum_sz.pkt_size); |
|---|
| .. | .. |
|---|
| 2083 | 2062 | while (cmb_tpd_next_to_clean != sw_tpd_next_to_clean) { |
|---|
| 2084 | 2063 | buffer_info = &tpd_ring->buffer_info[sw_tpd_next_to_clean]; |
|---|
| 2085 | 2064 | if (buffer_info->dma) { |
|---|
| 2086 | | - pci_unmap_page(adapter->pdev, buffer_info->dma, |
|---|
| 2087 | | - buffer_info->length, PCI_DMA_TODEVICE); |
|---|
| 2065 | + dma_unmap_page(&adapter->pdev->dev, buffer_info->dma, |
|---|
| 2066 | + buffer_info->length, DMA_TO_DEVICE); |
|---|
| 2088 | 2067 | buffer_info->dma = 0; |
|---|
| 2089 | 2068 | } |
|---|
| 2090 | 2069 | |
|---|
| 2091 | 2070 | if (buffer_info->skb) { |
|---|
| 2092 | | - dev_kfree_skb_irq(buffer_info->skb); |
|---|
| 2071 | + dev_consume_skb_irq(buffer_info->skb); |
|---|
| 2093 | 2072 | buffer_info->skb = NULL; |
|---|
| 2094 | 2073 | } |
|---|
| 2095 | 2074 | |
|---|
| .. | .. |
|---|
| 2231 | 2210 | buffer_info->length = hdr_len; |
|---|
| 2232 | 2211 | page = virt_to_page(skb->data); |
|---|
| 2233 | 2212 | offset = offset_in_page(skb->data); |
|---|
| 2234 | | - buffer_info->dma = pci_map_page(adapter->pdev, page, |
|---|
| 2213 | + buffer_info->dma = dma_map_page(&adapter->pdev->dev, page, |
|---|
| 2235 | 2214 | offset, hdr_len, |
|---|
| 2236 | | - PCI_DMA_TODEVICE); |
|---|
| 2215 | + DMA_TO_DEVICE); |
|---|
| 2237 | 2216 | |
|---|
| 2238 | 2217 | if (++next_to_use == tpd_ring->count) |
|---|
| 2239 | 2218 | next_to_use = 0; |
|---|
| .. | .. |
|---|
| 2256 | 2235 | (hdr_len + i * ATL1_MAX_TX_BUF_LEN)); |
|---|
| 2257 | 2236 | offset = offset_in_page(skb->data + |
|---|
| 2258 | 2237 | (hdr_len + i * ATL1_MAX_TX_BUF_LEN)); |
|---|
| 2259 | | - buffer_info->dma = pci_map_page(adapter->pdev, |
|---|
| 2260 | | - page, offset, buffer_info->length, |
|---|
| 2261 | | - PCI_DMA_TODEVICE); |
|---|
| 2238 | + buffer_info->dma = dma_map_page(&adapter->pdev->dev, |
|---|
| 2239 | + page, offset, |
|---|
| 2240 | + buffer_info->length, |
|---|
| 2241 | + DMA_TO_DEVICE); |
|---|
| 2262 | 2242 | if (++next_to_use == tpd_ring->count) |
|---|
| 2263 | 2243 | next_to_use = 0; |
|---|
| 2264 | 2244 | } |
|---|
| .. | .. |
|---|
| 2268 | 2248 | buffer_info->length = buf_len; |
|---|
| 2269 | 2249 | page = virt_to_page(skb->data); |
|---|
| 2270 | 2250 | offset = offset_in_page(skb->data); |
|---|
| 2271 | | - buffer_info->dma = pci_map_page(adapter->pdev, page, |
|---|
| 2272 | | - offset, buf_len, PCI_DMA_TODEVICE); |
|---|
| 2251 | + buffer_info->dma = dma_map_page(&adapter->pdev->dev, page, |
|---|
| 2252 | + offset, buf_len, |
|---|
| 2253 | + DMA_TO_DEVICE); |
|---|
| 2273 | 2254 | if (++next_to_use == tpd_ring->count) |
|---|
| 2274 | 2255 | next_to_use = 0; |
|---|
| 2275 | 2256 | } |
|---|
| 2276 | 2257 | |
|---|
| 2277 | 2258 | for (f = 0; f < nr_frags; f++) { |
|---|
| 2278 | | - const struct skb_frag_struct *frag; |
|---|
| 2259 | + const skb_frag_t *frag = &skb_shinfo(skb)->frags[f]; |
|---|
| 2279 | 2260 | u16 i, nseg; |
|---|
| 2280 | 2261 | |
|---|
| 2281 | | - frag = &skb_shinfo(skb)->frags[f]; |
|---|
| 2282 | 2262 | buf_len = skb_frag_size(frag); |
|---|
| 2283 | 2263 | |
|---|
| 2284 | 2264 | nseg = (buf_len + ATL1_MAX_TX_BUF_LEN - 1) / |
|---|
| .. | .. |
|---|
| 2440 | 2420 | atl1_tx_map(adapter, skb, ptpd); |
|---|
| 2441 | 2421 | atl1_tx_queue(adapter, count, ptpd); |
|---|
| 2442 | 2422 | atl1_update_mailbox(adapter); |
|---|
| 2443 | | - mmiowb(); |
|---|
| 2444 | 2423 | return NETDEV_TX_OK; |
|---|
| 2445 | 2424 | } |
|---|
| 2446 | 2425 | |
|---|
| .. | .. |
|---|
| 2573 | 2552 | |
|---|
| 2574 | 2553 | /** |
|---|
| 2575 | 2554 | * atl1_phy_config - Timer Call-back |
|---|
| 2576 | | - * @data: pointer to netdev cast into an unsigned long |
|---|
| 2555 | + * @t: timer_list containing pointer to netdev cast into an unsigned long |
|---|
| 2577 | 2556 | */ |
|---|
| 2578 | 2557 | static void atl1_phy_config(struct timer_list *t) |
|---|
| 2579 | 2558 | { |
|---|
| .. | .. |
|---|
| 2774 | 2753 | #ifdef CONFIG_PM_SLEEP |
|---|
| 2775 | 2754 | static int atl1_suspend(struct device *dev) |
|---|
| 2776 | 2755 | { |
|---|
| 2777 | | - struct pci_dev *pdev = to_pci_dev(dev); |
|---|
| 2778 | | - struct net_device *netdev = pci_get_drvdata(pdev); |
|---|
| 2756 | + struct net_device *netdev = dev_get_drvdata(dev); |
|---|
| 2779 | 2757 | struct atl1_adapter *adapter = netdev_priv(netdev); |
|---|
| 2780 | 2758 | struct atl1_hw *hw = &adapter->hw; |
|---|
| 2781 | 2759 | u32 ctrl = 0; |
|---|
| .. | .. |
|---|
| 2800 | 2778 | val = atl1_get_speed_and_duplex(hw, &speed, &duplex); |
|---|
| 2801 | 2779 | if (val) { |
|---|
| 2802 | 2780 | if (netif_msg_ifdown(adapter)) |
|---|
| 2803 | | - dev_printk(KERN_DEBUG, &pdev->dev, |
|---|
| 2781 | + dev_printk(KERN_DEBUG, dev, |
|---|
| 2804 | 2782 | "error getting speed/duplex\n"); |
|---|
| 2805 | 2783 | goto disable_wol; |
|---|
| 2806 | 2784 | } |
|---|
| .. | .. |
|---|
| 2857 | 2835 | |
|---|
| 2858 | 2836 | static int atl1_resume(struct device *dev) |
|---|
| 2859 | 2837 | { |
|---|
| 2860 | | - struct pci_dev *pdev = to_pci_dev(dev); |
|---|
| 2861 | | - struct net_device *netdev = pci_get_drvdata(pdev); |
|---|
| 2838 | + struct net_device *netdev = dev_get_drvdata(dev); |
|---|
| 2862 | 2839 | struct atl1_adapter *adapter = netdev_priv(netdev); |
|---|
| 2863 | 2840 | |
|---|
| 2864 | 2841 | iowrite32(0, adapter->hw.hw_addr + REG_WOL_CTRL); |
|---|
| .. | .. |
|---|
| 2947 | 2924 | * various kernel subsystems to support the mechanics required by a |
|---|
| 2948 | 2925 | * fixed-high-32-bit system. |
|---|
| 2949 | 2926 | */ |
|---|
| 2950 | | - err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); |
|---|
| 2927 | + err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); |
|---|
| 2951 | 2928 | if (err) { |
|---|
| 2952 | 2929 | dev_err(&pdev->dev, "no usable DMA configuration\n"); |
|---|
| 2953 | 2930 | goto err_dma; |
|---|
| .. | .. |
|---|
| 2988 | 2965 | /* get device revision number */ |
|---|
| 2989 | 2966 | adapter->hw.dev_rev = ioread16(adapter->hw.hw_addr + |
|---|
| 2990 | 2967 | (REG_MASTER_CTRL + 2)); |
|---|
| 2991 | | - if (netif_msg_probe(adapter)) |
|---|
| 2992 | | - dev_info(&pdev->dev, "version %s\n", ATLX_DRIVER_VERSION); |
|---|
| 2993 | 2968 | |
|---|
| 2994 | 2969 | /* set default ring resource counts */ |
|---|
| 2995 | 2970 | adapter->rfd_ring.count = adapter->rrd_ring.count = ATL1_DEFAULT_RFD; |
|---|
| .. | .. |
|---|
| 3180 | 3155 | {"tx_deferred_ok", ATL1_STAT(soft_stats.deffer)}, |
|---|
| 3181 | 3156 | {"tx_single_coll_ok", ATL1_STAT(soft_stats.scc)}, |
|---|
| 3182 | 3157 | {"tx_multi_coll_ok", ATL1_STAT(soft_stats.mcc)}, |
|---|
| 3183 | | - {"tx_underun", ATL1_STAT(soft_stats.tx_underun)}, |
|---|
| 3158 | + {"tx_underrun", ATL1_STAT(soft_stats.tx_underrun)}, |
|---|
| 3184 | 3159 | {"tx_trunc", ATL1_STAT(soft_stats.tx_trunc)}, |
|---|
| 3185 | 3160 | {"tx_pause", ATL1_STAT(soft_stats.tx_pause)}, |
|---|
| 3186 | 3161 | {"rx_pause", ATL1_STAT(soft_stats.rx_pause)}, |
|---|
| .. | .. |
|---|
| 3278 | 3253 | u16 phy_data; |
|---|
| 3279 | 3254 | int ret_val = 0; |
|---|
| 3280 | 3255 | u16 old_media_type = hw->media_type; |
|---|
| 3281 | | - u32 advertising; |
|---|
| 3282 | 3256 | |
|---|
| 3283 | 3257 | if (netif_running(adapter->netdev)) { |
|---|
| 3284 | 3258 | if (netif_msg_link(adapter)) |
|---|
| .. | .. |
|---|
| 3312 | 3286 | hw->media_type = MEDIA_TYPE_10M_HALF; |
|---|
| 3313 | 3287 | } |
|---|
| 3314 | 3288 | } |
|---|
| 3315 | | - switch (hw->media_type) { |
|---|
| 3316 | | - case MEDIA_TYPE_AUTO_SENSOR: |
|---|
| 3317 | | - advertising = |
|---|
| 3318 | | - ADVERTISED_10baseT_Half | |
|---|
| 3319 | | - ADVERTISED_10baseT_Full | |
|---|
| 3320 | | - ADVERTISED_100baseT_Half | |
|---|
| 3321 | | - ADVERTISED_100baseT_Full | |
|---|
| 3322 | | - ADVERTISED_1000baseT_Full | |
|---|
| 3323 | | - ADVERTISED_Autoneg | ADVERTISED_TP; |
|---|
| 3324 | | - break; |
|---|
| 3325 | | - case MEDIA_TYPE_1000M_FULL: |
|---|
| 3326 | | - advertising = |
|---|
| 3327 | | - ADVERTISED_1000baseT_Full | |
|---|
| 3328 | | - ADVERTISED_Autoneg | ADVERTISED_TP; |
|---|
| 3329 | | - break; |
|---|
| 3330 | | - default: |
|---|
| 3331 | | - advertising = 0; |
|---|
| 3332 | | - break; |
|---|
| 3333 | | - } |
|---|
| 3289 | + |
|---|
| 3334 | 3290 | if (atl1_phy_setup_autoneg_adv(hw)) { |
|---|
| 3335 | 3291 | ret_val = -EINVAL; |
|---|
| 3336 | 3292 | if (netif_msg_link(adapter)) |
|---|
| .. | .. |
|---|
| 3386 | 3342 | struct atl1_adapter *adapter = netdev_priv(netdev); |
|---|
| 3387 | 3343 | |
|---|
| 3388 | 3344 | strlcpy(drvinfo->driver, ATLX_DRIVER_NAME, sizeof(drvinfo->driver)); |
|---|
| 3389 | | - strlcpy(drvinfo->version, ATLX_DRIVER_VERSION, |
|---|
| 3390 | | - sizeof(drvinfo->version)); |
|---|
| 3391 | 3345 | strlcpy(drvinfo->bus_info, pci_name(adapter->pdev), |
|---|
| 3392 | 3346 | sizeof(drvinfo->bus_info)); |
|---|
| 3393 | 3347 | } |
|---|