| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | |
|---|
| 2 | 3 | /* |
|---|
| 3 | 4 | * Linux device driver for ADMtek ADM8211 (IEEE 802.11b MAC/BBP) |
|---|
| .. | .. |
|---|
| 8 | 9 | * and used with permission. |
|---|
| 9 | 10 | * |
|---|
| 10 | 11 | * Much thanks to Infineon-ADMtek for their support of this driver. |
|---|
| 11 | | - * |
|---|
| 12 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 13 | | - * it under the terms of the GNU General Public License version 2 as |
|---|
| 14 | | - * published by the Free Software Foundation. See README and COPYING for |
|---|
| 15 | | - * more details. |
|---|
| 16 | 12 | */ |
|---|
| 17 | 13 | |
|---|
| 18 | 14 | #include <linux/interrupt.h> |
|---|
| .. | .. |
|---|
| 328 | 324 | |
|---|
| 329 | 325 | /* TODO: check TDES0_STATUS_TUF and TDES0_STATUS_TRO */ |
|---|
| 330 | 326 | |
|---|
| 331 | | - pci_unmap_single(priv->pdev, info->mapping, |
|---|
| 332 | | - info->skb->len, PCI_DMA_TODEVICE); |
|---|
| 327 | + dma_unmap_single(&priv->pdev->dev, info->mapping, |
|---|
| 328 | + info->skb->len, DMA_TO_DEVICE); |
|---|
| 333 | 329 | |
|---|
| 334 | 330 | ieee80211_tx_info_clear_status(txi); |
|---|
| 335 | 331 | |
|---|
| .. | .. |
|---|
| 386 | 382 | } else if (pktlen < RX_COPY_BREAK) { |
|---|
| 387 | 383 | skb = dev_alloc_skb(pktlen); |
|---|
| 388 | 384 | if (skb) { |
|---|
| 389 | | - pci_dma_sync_single_for_cpu( |
|---|
| 390 | | - priv->pdev, |
|---|
| 391 | | - priv->rx_buffers[entry].mapping, |
|---|
| 392 | | - pktlen, PCI_DMA_FROMDEVICE); |
|---|
| 385 | + dma_sync_single_for_cpu(&priv->pdev->dev, |
|---|
| 386 | + priv->rx_buffers[entry].mapping, |
|---|
| 387 | + pktlen, |
|---|
| 388 | + DMA_FROM_DEVICE); |
|---|
| 393 | 389 | skb_put_data(skb, |
|---|
| 394 | 390 | skb_tail_pointer(priv->rx_buffers[entry].skb), |
|---|
| 395 | 391 | pktlen); |
|---|
| 396 | | - pci_dma_sync_single_for_device( |
|---|
| 397 | | - priv->pdev, |
|---|
| 398 | | - priv->rx_buffers[entry].mapping, |
|---|
| 399 | | - RX_PKT_SIZE, PCI_DMA_FROMDEVICE); |
|---|
| 392 | + dma_sync_single_for_device(&priv->pdev->dev, |
|---|
| 393 | + priv->rx_buffers[entry].mapping, |
|---|
| 394 | + RX_PKT_SIZE, |
|---|
| 395 | + DMA_FROM_DEVICE); |
|---|
| 400 | 396 | } |
|---|
| 401 | 397 | } else { |
|---|
| 402 | 398 | newskb = dev_alloc_skb(RX_PKT_SIZE); |
|---|
| 403 | 399 | if (newskb) { |
|---|
| 404 | 400 | skb = priv->rx_buffers[entry].skb; |
|---|
| 405 | 401 | skb_put(skb, pktlen); |
|---|
| 406 | | - pci_unmap_single( |
|---|
| 407 | | - priv->pdev, |
|---|
| 408 | | - priv->rx_buffers[entry].mapping, |
|---|
| 409 | | - RX_PKT_SIZE, PCI_DMA_FROMDEVICE); |
|---|
| 402 | + dma_unmap_single(&priv->pdev->dev, |
|---|
| 403 | + priv->rx_buffers[entry].mapping, |
|---|
| 404 | + RX_PKT_SIZE, DMA_FROM_DEVICE); |
|---|
| 410 | 405 | priv->rx_buffers[entry].skb = newskb; |
|---|
| 411 | 406 | priv->rx_buffers[entry].mapping = |
|---|
| 412 | | - pci_map_single(priv->pdev, |
|---|
| 407 | + dma_map_single(&priv->pdev->dev, |
|---|
| 413 | 408 | skb_tail_pointer(newskb), |
|---|
| 414 | 409 | RX_PKT_SIZE, |
|---|
| 415 | | - PCI_DMA_FROMDEVICE); |
|---|
| 416 | | - if (pci_dma_mapping_error(priv->pdev, |
|---|
| 417 | | - priv->rx_buffers[entry].mapping)) { |
|---|
| 410 | + DMA_FROM_DEVICE); |
|---|
| 411 | + if (dma_mapping_error(&priv->pdev->dev, |
|---|
| 412 | + priv->rx_buffers[entry].mapping)) { |
|---|
| 418 | 413 | priv->rx_buffers[entry].skb = NULL; |
|---|
| 419 | 414 | dev_kfree_skb(newskb); |
|---|
| 420 | 415 | skb = NULL; |
|---|
| .. | .. |
|---|
| 1453 | 1448 | rx_info->skb = dev_alloc_skb(RX_PKT_SIZE); |
|---|
| 1454 | 1449 | if (rx_info->skb == NULL) |
|---|
| 1455 | 1450 | break; |
|---|
| 1456 | | - rx_info->mapping = pci_map_single(priv->pdev, |
|---|
| 1451 | + rx_info->mapping = dma_map_single(&priv->pdev->dev, |
|---|
| 1457 | 1452 | skb_tail_pointer(rx_info->skb), |
|---|
| 1458 | 1453 | RX_PKT_SIZE, |
|---|
| 1459 | | - PCI_DMA_FROMDEVICE); |
|---|
| 1460 | | - if (pci_dma_mapping_error(priv->pdev, rx_info->mapping)) { |
|---|
| 1454 | + DMA_FROM_DEVICE); |
|---|
| 1455 | + if (dma_mapping_error(&priv->pdev->dev, rx_info->mapping)) { |
|---|
| 1461 | 1456 | dev_kfree_skb(rx_info->skb); |
|---|
| 1462 | 1457 | rx_info->skb = NULL; |
|---|
| 1463 | 1458 | break; |
|---|
| .. | .. |
|---|
| 1494 | 1489 | if (!priv->rx_buffers[i].skb) |
|---|
| 1495 | 1490 | continue; |
|---|
| 1496 | 1491 | |
|---|
| 1497 | | - pci_unmap_single( |
|---|
| 1498 | | - priv->pdev, |
|---|
| 1499 | | - priv->rx_buffers[i].mapping, |
|---|
| 1500 | | - RX_PKT_SIZE, PCI_DMA_FROMDEVICE); |
|---|
| 1492 | + dma_unmap_single(&priv->pdev->dev, |
|---|
| 1493 | + priv->rx_buffers[i].mapping, RX_PKT_SIZE, |
|---|
| 1494 | + DMA_FROM_DEVICE); |
|---|
| 1501 | 1495 | |
|---|
| 1502 | 1496 | dev_kfree_skb(priv->rx_buffers[i].skb); |
|---|
| 1503 | 1497 | } |
|---|
| .. | .. |
|---|
| 1506 | 1500 | if (!priv->tx_buffers[i].skb) |
|---|
| 1507 | 1501 | continue; |
|---|
| 1508 | 1502 | |
|---|
| 1509 | | - pci_unmap_single(priv->pdev, |
|---|
| 1503 | + dma_unmap_single(&priv->pdev->dev, |
|---|
| 1510 | 1504 | priv->tx_buffers[i].mapping, |
|---|
| 1511 | | - priv->tx_buffers[i].skb->len, |
|---|
| 1512 | | - PCI_DMA_TODEVICE); |
|---|
| 1505 | + priv->tx_buffers[i].skb->len, DMA_TO_DEVICE); |
|---|
| 1513 | 1506 | |
|---|
| 1514 | 1507 | dev_kfree_skb(priv->tx_buffers[i].skb); |
|---|
| 1515 | 1508 | } |
|---|
| .. | .. |
|---|
| 1636 | 1629 | unsigned int entry; |
|---|
| 1637 | 1630 | u32 flag; |
|---|
| 1638 | 1631 | |
|---|
| 1639 | | - mapping = pci_map_single(priv->pdev, skb->data, skb->len, |
|---|
| 1640 | | - PCI_DMA_TODEVICE); |
|---|
| 1641 | | - if (pci_dma_mapping_error(priv->pdev, mapping)) |
|---|
| 1632 | + mapping = dma_map_single(&priv->pdev->dev, skb->data, skb->len, |
|---|
| 1633 | + DMA_TO_DEVICE); |
|---|
| 1634 | + if (dma_mapping_error(&priv->pdev->dev, mapping)) |
|---|
| 1642 | 1635 | return -ENOMEM; |
|---|
| 1643 | 1636 | |
|---|
| 1644 | 1637 | spin_lock_irqsave(&priv->lock, flags); |
|---|
| .. | .. |
|---|
| 1749 | 1742 | /* Allocate TX/RX descriptors */ |
|---|
| 1750 | 1743 | ring_size = sizeof(struct adm8211_desc) * priv->rx_ring_size + |
|---|
| 1751 | 1744 | sizeof(struct adm8211_desc) * priv->tx_ring_size; |
|---|
| 1752 | | - priv->rx_ring = pci_alloc_consistent(priv->pdev, ring_size, |
|---|
| 1753 | | - &priv->rx_ring_dma); |
|---|
| 1745 | + priv->rx_ring = dma_alloc_coherent(&priv->pdev->dev, ring_size, |
|---|
| 1746 | + &priv->rx_ring_dma, GFP_KERNEL); |
|---|
| 1754 | 1747 | |
|---|
| 1755 | 1748 | if (!priv->rx_ring) { |
|---|
| 1756 | 1749 | kfree(priv->rx_buffers); |
|---|
| .. | .. |
|---|
| 1785 | 1778 | { |
|---|
| 1786 | 1779 | struct ieee80211_hw *dev; |
|---|
| 1787 | 1780 | struct adm8211_priv *priv; |
|---|
| 1788 | | - unsigned long mem_addr, mem_len; |
|---|
| 1789 | | - unsigned int io_addr, io_len; |
|---|
| 1781 | + unsigned long mem_len; |
|---|
| 1782 | + unsigned int io_len; |
|---|
| 1790 | 1783 | int err; |
|---|
| 1791 | 1784 | u32 reg; |
|---|
| 1792 | 1785 | u8 perm_addr[ETH_ALEN]; |
|---|
| .. | .. |
|---|
| 1798 | 1791 | return err; |
|---|
| 1799 | 1792 | } |
|---|
| 1800 | 1793 | |
|---|
| 1801 | | - io_addr = pci_resource_start(pdev, 0); |
|---|
| 1802 | 1794 | io_len = pci_resource_len(pdev, 0); |
|---|
| 1803 | | - mem_addr = pci_resource_start(pdev, 1); |
|---|
| 1804 | 1795 | mem_len = pci_resource_len(pdev, 1); |
|---|
| 1805 | 1796 | if (io_len < 256 || mem_len < 1024) { |
|---|
| 1806 | 1797 | printk(KERN_ERR "%s (adm8211): Too short PCI resources\n", |
|---|
| 1807 | 1798 | pci_name(pdev)); |
|---|
| 1799 | + err = -ENOMEM; |
|---|
| 1808 | 1800 | goto err_disable_pdev; |
|---|
| 1809 | 1801 | } |
|---|
| 1810 | 1802 | |
|---|
| .. | .. |
|---|
| 1814 | 1806 | if (reg != ADM8211_SIG1 && reg != ADM8211_SIG2) { |
|---|
| 1815 | 1807 | printk(KERN_ERR "%s (adm8211): Invalid signature (0x%x)\n", |
|---|
| 1816 | 1808 | pci_name(pdev), reg); |
|---|
| 1809 | + err = -EINVAL; |
|---|
| 1817 | 1810 | goto err_disable_pdev; |
|---|
| 1818 | 1811 | } |
|---|
| 1819 | 1812 | |
|---|
| .. | .. |
|---|
| 1824 | 1817 | return err; /* someone else grabbed it? don't disable it */ |
|---|
| 1825 | 1818 | } |
|---|
| 1826 | 1819 | |
|---|
| 1827 | | - if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) || |
|---|
| 1828 | | - pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32))) { |
|---|
| 1820 | + err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); |
|---|
| 1821 | + if (err) { |
|---|
| 1829 | 1822 | printk(KERN_ERR "%s (adm8211): No suitable DMA available\n", |
|---|
| 1830 | 1823 | pci_name(pdev)); |
|---|
| 1831 | 1824 | goto err_free_reg; |
|---|
| .. | .. |
|---|
| 1935 | 1928 | kfree(priv->eeprom); |
|---|
| 1936 | 1929 | |
|---|
| 1937 | 1930 | err_free_desc: |
|---|
| 1938 | | - pci_free_consistent(pdev, |
|---|
| 1939 | | - sizeof(struct adm8211_desc) * priv->rx_ring_size + |
|---|
| 1940 | | - sizeof(struct adm8211_desc) * priv->tx_ring_size, |
|---|
| 1941 | | - priv->rx_ring, priv->rx_ring_dma); |
|---|
| 1931 | + dma_free_coherent(&pdev->dev, |
|---|
| 1932 | + sizeof(struct adm8211_desc) * priv->rx_ring_size + |
|---|
| 1933 | + sizeof(struct adm8211_desc) * priv->tx_ring_size, |
|---|
| 1934 | + priv->rx_ring, priv->rx_ring_dma); |
|---|
| 1942 | 1935 | kfree(priv->rx_buffers); |
|---|
| 1943 | 1936 | |
|---|
| 1944 | 1937 | err_iounmap: |
|---|
| .. | .. |
|---|
| 1968 | 1961 | |
|---|
| 1969 | 1962 | priv = dev->priv; |
|---|
| 1970 | 1963 | |
|---|
| 1971 | | - pci_free_consistent(pdev, |
|---|
| 1972 | | - sizeof(struct adm8211_desc) * priv->rx_ring_size + |
|---|
| 1973 | | - sizeof(struct adm8211_desc) * priv->tx_ring_size, |
|---|
| 1974 | | - priv->rx_ring, priv->rx_ring_dma); |
|---|
| 1964 | + dma_free_coherent(&pdev->dev, |
|---|
| 1965 | + sizeof(struct adm8211_desc) * priv->rx_ring_size + |
|---|
| 1966 | + sizeof(struct adm8211_desc) * priv->tx_ring_size, |
|---|
| 1967 | + priv->rx_ring, priv->rx_ring_dma); |
|---|
| 1975 | 1968 | |
|---|
| 1976 | 1969 | kfree(priv->rx_buffers); |
|---|
| 1977 | 1970 | kfree(priv->eeprom); |
|---|
| .. | .. |
|---|
| 1982 | 1975 | } |
|---|
| 1983 | 1976 | |
|---|
| 1984 | 1977 | |
|---|
| 1985 | | -#ifdef CONFIG_PM |
|---|
| 1986 | | -static int adm8211_suspend(struct pci_dev *pdev, pm_message_t state) |
|---|
| 1987 | | -{ |
|---|
| 1988 | | - pci_save_state(pdev); |
|---|
| 1989 | | - pci_set_power_state(pdev, pci_choose_state(pdev, state)); |
|---|
| 1990 | | - return 0; |
|---|
| 1991 | | -} |
|---|
| 1992 | | - |
|---|
| 1993 | | -static int adm8211_resume(struct pci_dev *pdev) |
|---|
| 1994 | | -{ |
|---|
| 1995 | | - pci_set_power_state(pdev, PCI_D0); |
|---|
| 1996 | | - pci_restore_state(pdev); |
|---|
| 1997 | | - return 0; |
|---|
| 1998 | | -} |
|---|
| 1999 | | -#endif /* CONFIG_PM */ |
|---|
| 2000 | | - |
|---|
| 1978 | +#define adm8211_suspend NULL |
|---|
| 1979 | +#define adm8211_resume NULL |
|---|
| 2001 | 1980 | |
|---|
| 2002 | 1981 | MODULE_DEVICE_TABLE(pci, adm8211_pci_id_table); |
|---|
| 1982 | + |
|---|
| 1983 | +static SIMPLE_DEV_PM_OPS(adm8211_pm_ops, adm8211_suspend, adm8211_resume); |
|---|
| 2003 | 1984 | |
|---|
| 2004 | 1985 | /* TODO: implement enable_wake */ |
|---|
| 2005 | 1986 | static struct pci_driver adm8211_driver = { |
|---|
| .. | .. |
|---|
| 2007 | 1988 | .id_table = adm8211_pci_id_table, |
|---|
| 2008 | 1989 | .probe = adm8211_probe, |
|---|
| 2009 | 1990 | .remove = adm8211_remove, |
|---|
| 2010 | | -#ifdef CONFIG_PM |
|---|
| 2011 | | - .suspend = adm8211_suspend, |
|---|
| 2012 | | - .resume = adm8211_resume, |
|---|
| 2013 | | -#endif /* CONFIG_PM */ |
|---|
| 1991 | + .driver.pm = &adm8211_pm_ops, |
|---|
| 2014 | 1992 | }; |
|---|
| 2015 | 1993 | |
|---|
| 2016 | 1994 | module_pci_driver(adm8211_driver); |
|---|