.. | .. |
---|
| 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); |
---|