mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 06:31:52 +00:00
tty: serial: pch_uart: correct usage of dma_unmap_sg
Per Documentation/DMA-API-HOWTO.txt,
To unmap a scatterlist, just call:
dma_unmap_sg(dev, sglist, nents, direction);
.. note::
The 'nents' argument to the dma_unmap_sg call must be
the _same_ one you passed into the dma_map_sg call,
it should _NOT_ be the 'count' value _returned_ from the
dma_map_sg call.
However in the driver, priv->nent is directly assigned with value
returned from dma_map_sg, and dma_unmap_sg use priv->nent for unmap,
this breaks the API usage.
So introduce a new entry orig_nent to remember 'nents'.
Fixes: da3564ee02
("pch_uart: add multi-scatter processing")
Signed-off-by: Peng Fan <peng.fan@nxp.com>
Link: https://lore.kernel.org/r/1573623259-6339-1-git-send-email-peng.fan@nxp.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
596fd8dffb
commit
74887542fd
@ -233,6 +233,7 @@ struct eg20t_port {
|
||||
struct dma_chan *chan_rx;
|
||||
struct scatterlist *sg_tx_p;
|
||||
int nent;
|
||||
int orig_nent;
|
||||
struct scatterlist sg_rx;
|
||||
int tx_dma_use;
|
||||
void *rx_buf_virt;
|
||||
@ -787,9 +788,10 @@ static void pch_dma_tx_complete(void *arg)
|
||||
}
|
||||
xmit->tail &= UART_XMIT_SIZE - 1;
|
||||
async_tx_ack(priv->desc_tx);
|
||||
dma_unmap_sg(port->dev, sg, priv->nent, DMA_TO_DEVICE);
|
||||
dma_unmap_sg(port->dev, sg, priv->orig_nent, DMA_TO_DEVICE);
|
||||
priv->tx_dma_use = 0;
|
||||
priv->nent = 0;
|
||||
priv->orig_nent = 0;
|
||||
kfree(priv->sg_tx_p);
|
||||
pch_uart_hal_enable_interrupt(priv, PCH_UART_HAL_TX_INT);
|
||||
}
|
||||
@ -1010,6 +1012,7 @@ static unsigned int dma_handle_tx(struct eg20t_port *priv)
|
||||
dev_err(priv->port.dev, "%s:dma_map_sg Failed\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
priv->orig_nent = num;
|
||||
priv->nent = nent;
|
||||
|
||||
for (i = 0; i < nent; i++, sg++) {
|
||||
|
Loading…
Reference in New Issue
Block a user