diff options
| -rw-r--r-- | drivers/ntb/ntb_transport.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c index 6e8902d03a69..d4f39ba1d976 100644 --- a/drivers/ntb/ntb_transport.c +++ b/drivers/ntb/ntb_transport.c | |||
| @@ -144,7 +144,9 @@ struct ntb_transport_qp { | |||
| 144 | struct list_head tx_free_q; | 144 | struct list_head tx_free_q; |
| 145 | spinlock_t ntb_tx_free_q_lock; | 145 | spinlock_t ntb_tx_free_q_lock; |
| 146 | void __iomem *tx_mw; | 146 | void __iomem *tx_mw; |
| 147 | dma_addr_t tx_mw_phys; | 147 | phys_addr_t tx_mw_phys; |
| 148 | size_t tx_mw_size; | ||
| 149 | dma_addr_t tx_mw_dma_addr; | ||
| 148 | unsigned int tx_index; | 150 | unsigned int tx_index; |
| 149 | unsigned int tx_max_entry; | 151 | unsigned int tx_max_entry; |
| 150 | unsigned int tx_max_frame; | 152 | unsigned int tx_max_frame; |
| @@ -1052,6 +1054,7 @@ static int ntb_transport_init_queue(struct ntb_transport_ctx *nt, | |||
| 1052 | tx_size = (unsigned int)mw_size / num_qps_mw; | 1054 | tx_size = (unsigned int)mw_size / num_qps_mw; |
| 1053 | qp_offset = tx_size * (qp_num / mw_count); | 1055 | qp_offset = tx_size * (qp_num / mw_count); |
| 1054 | 1056 | ||
| 1057 | qp->tx_mw_size = tx_size; | ||
| 1055 | qp->tx_mw = nt->mw_vec[mw_num].vbase + qp_offset; | 1058 | qp->tx_mw = nt->mw_vec[mw_num].vbase + qp_offset; |
| 1056 | if (!qp->tx_mw) | 1059 | if (!qp->tx_mw) |
| 1057 | return -EINVAL; | 1060 | return -EINVAL; |
| @@ -1647,7 +1650,7 @@ static int ntb_async_tx_submit(struct ntb_transport_qp *qp, | |||
| 1647 | dma_cookie_t cookie; | 1650 | dma_cookie_t cookie; |
| 1648 | 1651 | ||
| 1649 | device = chan->device; | 1652 | device = chan->device; |
| 1650 | dest = qp->tx_mw_phys + qp->tx_max_frame * entry->tx_index; | 1653 | dest = qp->tx_mw_dma_addr + qp->tx_max_frame * entry->tx_index; |
| 1651 | buff_off = (size_t)buf & ~PAGE_MASK; | 1654 | buff_off = (size_t)buf & ~PAGE_MASK; |
| 1652 | dest_off = (size_t)dest & ~PAGE_MASK; | 1655 | dest_off = (size_t)dest & ~PAGE_MASK; |
| 1653 | 1656 | ||
| @@ -1866,6 +1869,18 @@ ntb_transport_create_queue(void *data, struct device *client_dev, | |||
| 1866 | qp->rx_dma_chan = NULL; | 1869 | qp->rx_dma_chan = NULL; |
| 1867 | } | 1870 | } |
| 1868 | 1871 | ||
| 1872 | if (qp->tx_dma_chan) { | ||
| 1873 | qp->tx_mw_dma_addr = | ||
| 1874 | dma_map_resource(qp->tx_dma_chan->device->dev, | ||
| 1875 | qp->tx_mw_phys, qp->tx_mw_size, | ||
| 1876 | DMA_FROM_DEVICE, 0); | ||
| 1877 | if (dma_mapping_error(qp->tx_dma_chan->device->dev, | ||
| 1878 | qp->tx_mw_dma_addr)) { | ||
| 1879 | qp->tx_mw_dma_addr = 0; | ||
| 1880 | goto err1; | ||
| 1881 | } | ||
| 1882 | } | ||
| 1883 | |||
| 1869 | dev_dbg(&pdev->dev, "Using %s memcpy for TX\n", | 1884 | dev_dbg(&pdev->dev, "Using %s memcpy for TX\n", |
| 1870 | qp->tx_dma_chan ? "DMA" : "CPU"); | 1885 | qp->tx_dma_chan ? "DMA" : "CPU"); |
| 1871 | 1886 | ||
| @@ -1907,6 +1922,10 @@ err1: | |||
| 1907 | qp->rx_alloc_entry = 0; | 1922 | qp->rx_alloc_entry = 0; |
| 1908 | while ((entry = ntb_list_rm(&qp->ntb_rx_q_lock, &qp->rx_free_q))) | 1923 | while ((entry = ntb_list_rm(&qp->ntb_rx_q_lock, &qp->rx_free_q))) |
| 1909 | kfree(entry); | 1924 | kfree(entry); |
| 1925 | if (qp->tx_mw_dma_addr) | ||
| 1926 | dma_unmap_resource(qp->tx_dma_chan->device->dev, | ||
| 1927 | qp->tx_mw_dma_addr, qp->tx_mw_size, | ||
| 1928 | DMA_FROM_DEVICE, 0); | ||
| 1910 | if (qp->tx_dma_chan) | 1929 | if (qp->tx_dma_chan) |
| 1911 | dma_release_channel(qp->tx_dma_chan); | 1930 | dma_release_channel(qp->tx_dma_chan); |
| 1912 | if (qp->rx_dma_chan) | 1931 | if (qp->rx_dma_chan) |
| @@ -1948,6 +1967,11 @@ void ntb_transport_free_queue(struct ntb_transport_qp *qp) | |||
| 1948 | */ | 1967 | */ |
| 1949 | dma_sync_wait(chan, qp->last_cookie); | 1968 | dma_sync_wait(chan, qp->last_cookie); |
| 1950 | dmaengine_terminate_all(chan); | 1969 | dmaengine_terminate_all(chan); |
| 1970 | |||
| 1971 | dma_unmap_resource(chan->device->dev, | ||
| 1972 | qp->tx_mw_dma_addr, qp->tx_mw_size, | ||
| 1973 | DMA_FROM_DEVICE, 0); | ||
| 1974 | |||
| 1951 | dma_release_channel(chan); | 1975 | dma_release_channel(chan); |
| 1952 | } | 1976 | } |
| 1953 | 1977 | ||
