* [PATCH 1/2] serial: samsung: Use right device for DMA-mapping calls
[not found] <CGME20170323074548eucas1p142511884e12d6211bebd9cbabde2f9c9@eucas1p1.samsung.com>
@ 2017-03-23 7:45 ` Marek Szyprowski
2017-03-23 7:45 ` [PATCH 2/2] serial: samsung: Add missing checks for dma_map_single failure Marek Szyprowski
2017-03-23 11:02 ` [PATCH 1/2] serial: samsung: Use right device for DMA-mapping calls Bartlomiej Zolnierkiewicz
0 siblings, 2 replies; 5+ messages in thread
From: Marek Szyprowski @ 2017-03-23 7:45 UTC (permalink / raw)
To: linux-samsung-soc, linux-serial
Cc: Marek Szyprowski, Sylwester Nawrocki, Krzysztof Kozlowski,
Bartlomiej Zolnierkiewicz, Greg Kroah-Hartman, Seung-Woo Kim,
Joonyoung Shim, Inki Dae, stable
Driver should provide its own struct device for all DMA-mapping calls instead
of extracting device pointer from DMA engine channel.
Reported-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Fixes: 2c37eedb74c8 ("serial: samsung: add dma reqest/release functions")
CC: stable@vger.kernel.org # v4.0+
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
drivers/tty/serial/samsung.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c
index 7a17aedbf902..9f3759bdb44f 100644
--- a/drivers/tty/serial/samsung.c
+++ b/drivers/tty/serial/samsung.c
@@ -901,14 +901,13 @@ static int s3c24xx_serial_request_dma(struct s3c24xx_uart_port *p)
return -ENOMEM;
}
- dma->rx_addr = dma_map_single(dma->rx_chan->device->dev, dma->rx_buf,
+ dma->rx_addr = dma_map_single(p->port.dev, dma->rx_buf,
dma->rx_size, DMA_FROM_DEVICE);
spin_lock_irqsave(&p->port.lock, flags);
/* TX buffer */
- dma->tx_addr = dma_map_single(dma->tx_chan->device->dev,
- p->port.state->xmit.buf,
+ dma->tx_addr = dma_map_single(p->port.dev, p->port.state->xmit.buf,
UART_XMIT_SIZE, DMA_TO_DEVICE);
spin_unlock_irqrestore(&p->port.lock, flags);
@@ -922,7 +921,7 @@ static void s3c24xx_serial_release_dma(struct s3c24xx_uart_port *p)
if (dma->rx_chan) {
dmaengine_terminate_all(dma->rx_chan);
- dma_unmap_single(dma->rx_chan->device->dev, dma->rx_addr,
+ dma_unmap_single(p->port.dev, dma->rx_addr,
dma->rx_size, DMA_FROM_DEVICE);
kfree(dma->rx_buf);
dma_release_channel(dma->rx_chan);
@@ -931,7 +930,7 @@ static void s3c24xx_serial_release_dma(struct s3c24xx_uart_port *p)
if (dma->tx_chan) {
dmaengine_terminate_all(dma->tx_chan);
- dma_unmap_single(dma->tx_chan->device->dev, dma->tx_addr,
+ dma_unmap_single(p->port.dev, dma->tx_addr,
UART_XMIT_SIZE, DMA_TO_DEVICE);
dma_release_channel(dma->tx_chan);
dma->tx_chan = NULL;
--
1.9.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/2] serial: samsung: Add missing checks for dma_map_single failure
2017-03-23 7:45 ` [PATCH 1/2] serial: samsung: Use right device for DMA-mapping calls Marek Szyprowski
@ 2017-03-23 7:45 ` Marek Szyprowski
2017-03-23 11:04 ` Bartlomiej Zolnierkiewicz
2017-03-23 11:02 ` [PATCH 1/2] serial: samsung: Use right device for DMA-mapping calls Bartlomiej Zolnierkiewicz
1 sibling, 1 reply; 5+ messages in thread
From: Marek Szyprowski @ 2017-03-23 7:45 UTC (permalink / raw)
To: linux-samsung-soc, linux-serial
Cc: Marek Szyprowski, Sylwester Nawrocki, Krzysztof Kozlowski,
Bartlomiej Zolnierkiewicz, Greg Kroah-Hartman, Seung-Woo Kim,
Joonyoung Shim, Inki Dae, stable
This patch adds missing checks for dma_map_single() failure and proper error
reporting. While touching this part of the code, it also removes unnecessary
spinlock calls around dma_map_single() for TX buffer. This finally solves all
the issues reported by DMA API debug framework.
Reported-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Fixes: 2c37eedb74c8 ("serial: samsung: add dma reqest/release functions")
CC: stable@vger.kernel.org # v4.10+
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
This issue was there since adding DMA support, but this patch applies cleanly
only to v4.10+ kernels due to other changes in the surrounding code.
---
drivers/tty/serial/samsung.c | 35 ++++++++++++++++++++++++-----------
1 file changed, 24 insertions(+), 11 deletions(-)
diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c
index 9f3759bdb44f..8aca18c4cdea 100644
--- a/drivers/tty/serial/samsung.c
+++ b/drivers/tty/serial/samsung.c
@@ -859,7 +859,7 @@ static void s3c24xx_serial_break_ctl(struct uart_port *port, int break_state)
static int s3c24xx_serial_request_dma(struct s3c24xx_uart_port *p)
{
struct s3c24xx_uart_dma *dma = p->dma;
- unsigned long flags;
+ int ret;
/* Default slave configuration parameters */
dma->rx_conf.direction = DMA_DEV_TO_MEM;
@@ -884,8 +884,8 @@ static int s3c24xx_serial_request_dma(struct s3c24xx_uart_port *p)
dma->tx_chan = dma_request_chan(p->port.dev, "tx");
if (IS_ERR(dma->tx_chan)) {
- dma_release_channel(dma->rx_chan);
- return PTR_ERR(dma->tx_chan);
+ ret = PTR_ERR(dma->tx_chan);
+ goto err_release_rx;
}
dmaengine_slave_config(dma->tx_chan, &dma->tx_conf);
@@ -894,25 +894,38 @@ static int s3c24xx_serial_request_dma(struct s3c24xx_uart_port *p)
dma->rx_size = PAGE_SIZE;
dma->rx_buf = kmalloc(dma->rx_size, GFP_KERNEL);
-
if (!dma->rx_buf) {
- dma_release_channel(dma->rx_chan);
- dma_release_channel(dma->tx_chan);
- return -ENOMEM;
+ ret = -ENOMEM;
+ goto err_release_tx;
}
dma->rx_addr = dma_map_single(p->port.dev, dma->rx_buf,
dma->rx_size, DMA_FROM_DEVICE);
-
- spin_lock_irqsave(&p->port.lock, flags);
+ if (dma_mapping_error(p->port.dev, dma->rx_addr)) {
+ ret = -EIO;
+ goto err_free_rx;
+ }
/* TX buffer */
dma->tx_addr = dma_map_single(p->port.dev, p->port.state->xmit.buf,
UART_XMIT_SIZE, DMA_TO_DEVICE);
-
- spin_unlock_irqrestore(&p->port.lock, flags);
+ if (dma_mapping_error(p->port.dev, dma->tx_addr)) {
+ ret = -EIO;
+ goto err_unmap_rx;
+ }
return 0;
+
+err_unmap_rx:
+ dma_unmap_single(p->port.dev, dma->rx_addr, dma->rx_size,
+ DMA_FROM_DEVICE);
+err_free_rx:
+ kfree(dma->rx_buf);
+err_release_tx:
+ dma_release_channel(dma->tx_chan);
+err_release_rx:
+ dma_release_channel(dma->rx_chan);
+ return ret;
}
static void s3c24xx_serial_release_dma(struct s3c24xx_uart_port *p)
--
1.9.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] serial: samsung: Use right device for DMA-mapping calls
2017-03-23 7:45 ` [PATCH 1/2] serial: samsung: Use right device for DMA-mapping calls Marek Szyprowski
2017-03-23 7:45 ` [PATCH 2/2] serial: samsung: Add missing checks for dma_map_single failure Marek Szyprowski
@ 2017-03-23 11:02 ` Bartlomiej Zolnierkiewicz
1 sibling, 0 replies; 5+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2017-03-23 11:02 UTC (permalink / raw)
To: Marek Szyprowski
Cc: linux-samsung-soc, linux-serial, Sylwester Nawrocki,
Krzysztof Kozlowski, Greg Kroah-Hartman, Seung-Woo Kim,
Joonyoung Shim, Inki Dae, stable
Hi,
On Thursday, March 23, 2017 08:45:21 AM Marek Szyprowski wrote:
> Driver should provide its own struct device for all DMA-mapping calls instead
> of extracting device pointer from DMA engine channel.
>
> Reported-by: Seung-Woo Kim <sw0312.kim@samsung.com>
> Fixes: 2c37eedb74c8 ("serial: samsung: add dma reqest/release functions")
The right commit id is 62c37eedb74c8.
> CC: stable@vger.kernel.org # v4.0+
> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Best regards,
--
Bartlomiej Zolnierkiewicz
Samsung R&D Institute Poland
Samsung Electronics
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] serial: samsung: Add missing checks for dma_map_single failure
2017-03-23 7:45 ` [PATCH 2/2] serial: samsung: Add missing checks for dma_map_single failure Marek Szyprowski
@ 2017-03-23 11:04 ` Bartlomiej Zolnierkiewicz
2017-03-23 11:59 ` Bartlomiej Zolnierkiewicz
0 siblings, 1 reply; 5+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2017-03-23 11:04 UTC (permalink / raw)
To: Marek Szyprowski
Cc: linux-samsung-soc, linux-serial, Sylwester Nawrocki,
Krzysztof Kozlowski, Greg Kroah-Hartman, Seung-Woo Kim,
Joonyoung Shim, Inki Dae, stable
On Thursday, March 23, 2017 08:45:22 AM Marek Szyprowski wrote:
> This patch adds missing checks for dma_map_single() failure and proper error
> reporting. While touching this part of the code, it also removes unnecessary
> spinlock calls around dma_map_single() for TX buffer. This finally solves all
> the issues reported by DMA API debug framework.
>
> Reported-by: Seung-Woo Kim <sw0312.kim@samsung.com>
> Fixes: 2c37eedb74c8 ("serial: samsung: add dma reqest/release functions")
The right commit id is 62c37eedb74c8.
> CC: stable@vger.kernel.org # v4.10+
> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Best regards,
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] serial: samsung: Add missing checks for dma_map_single failure
2017-03-23 11:04 ` Bartlomiej Zolnierkiewicz
@ 2017-03-23 11:59 ` Bartlomiej Zolnierkiewicz
0 siblings, 0 replies; 5+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2017-03-23 11:59 UTC (permalink / raw)
To: Marek Szyprowski
Cc: linux-samsung-soc, linux-serial, Sylwester Nawrocki,
Krzysztof Kozlowski, Greg Kroah-Hartman, Seung-Woo Kim,
Joonyoung Shim, Inki Dae, stable
On Thursday, March 23, 2017 12:04:02 PM Bartlomiej Zolnierkiewicz wrote:
> On Thursday, March 23, 2017 08:45:22 AM Marek Szyprowski wrote:
> > This patch adds missing checks for dma_map_single() failure and proper error
> > reporting. While touching this part of the code, it also removes unnecessary
> > spinlock calls around dma_map_single() for TX buffer. This finally solves all
> > the issues reported by DMA API debug framework.
> >
> > Reported-by: Seung-Woo Kim <sw0312.kim@samsung.com>
> > Fixes: 2c37eedb74c8 ("serial: samsung: add dma reqest/release functions")
>
> The right commit id is 62c37eedb74c8.
BTW With this fixed you may add:
Reviewed-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
to both patches.
> > CC: stable@vger.kernel.org # v4.10+
> > Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Best regards,
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2017-03-23 11:59 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <CGME20170323074548eucas1p142511884e12d6211bebd9cbabde2f9c9@eucas1p1.samsung.com>
2017-03-23 7:45 ` [PATCH 1/2] serial: samsung: Use right device for DMA-mapping calls Marek Szyprowski
2017-03-23 7:45 ` [PATCH 2/2] serial: samsung: Add missing checks for dma_map_single failure Marek Szyprowski
2017-03-23 11:04 ` Bartlomiej Zolnierkiewicz
2017-03-23 11:59 ` Bartlomiej Zolnierkiewicz
2017-03-23 11:02 ` [PATCH 1/2] serial: samsung: Use right device for DMA-mapping calls Bartlomiej Zolnierkiewicz
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox