diff options
author | Heikki Krogerus <heikki.krogerus@linux.intel.com> | 2014-04-28 08:59:56 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-05-28 16:07:27 -0400 |
commit | d4089a332883ad969700aac5dd4dd5f1c4fee825 (patch) | |
tree | 0dbbb4dec60fbbd491ae8ee31dcbce95e1f3ab50 /drivers/tty | |
parent | 06aa82e498c144c7784a6f3d3b55458b272d6146 (diff) |
serial: 8250_dma: check the result of TX buffer mapping
Using dma_mapping_error() to make sure the mapping did not
fail.
Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty')
-rw-r--r-- | drivers/tty/serial/8250/8250_dma.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/tty/serial/8250/8250_dma.c b/drivers/tty/serial/8250/8250_dma.c index ab9096dc3849..148ffe4c232f 100644 --- a/drivers/tty/serial/8250/8250_dma.c +++ b/drivers/tty/serial/8250/8250_dma.c | |||
@@ -192,21 +192,28 @@ int serial8250_request_dma(struct uart_8250_port *p) | |||
192 | 192 | ||
193 | dma->rx_buf = dma_alloc_coherent(dma->rxchan->device->dev, dma->rx_size, | 193 | dma->rx_buf = dma_alloc_coherent(dma->rxchan->device->dev, dma->rx_size, |
194 | &dma->rx_addr, GFP_KERNEL); | 194 | &dma->rx_addr, GFP_KERNEL); |
195 | if (!dma->rx_buf) { | 195 | if (!dma->rx_buf) |
196 | dma_release_channel(dma->rxchan); | 196 | goto err; |
197 | dma_release_channel(dma->txchan); | ||
198 | return -ENOMEM; | ||
199 | } | ||
200 | 197 | ||
201 | /* TX buffer */ | 198 | /* TX buffer */ |
202 | dma->tx_addr = dma_map_single(dma->txchan->device->dev, | 199 | dma->tx_addr = dma_map_single(dma->txchan->device->dev, |
203 | p->port.state->xmit.buf, | 200 | p->port.state->xmit.buf, |
204 | UART_XMIT_SIZE, | 201 | UART_XMIT_SIZE, |
205 | DMA_TO_DEVICE); | 202 | DMA_TO_DEVICE); |
203 | if (dma_mapping_error(dma->txchan->device->dev, dma->tx_addr)) { | ||
204 | dma_free_coherent(dma->rxchan->device->dev, dma->rx_size, | ||
205 | dma->rx_buf, dma->rx_addr); | ||
206 | goto err; | ||
207 | } | ||
206 | 208 | ||
207 | dev_dbg_ratelimited(p->port.dev, "got both dma channels\n"); | 209 | dev_dbg_ratelimited(p->port.dev, "got both dma channels\n"); |
208 | 210 | ||
209 | return 0; | 211 | return 0; |
212 | err: | ||
213 | dma_release_channel(dma->rxchan); | ||
214 | dma_release_channel(dma->txchan); | ||
215 | |||
216 | return -ENOMEM; | ||
210 | } | 217 | } |
211 | EXPORT_SYMBOL_GPL(serial8250_request_dma); | 218 | EXPORT_SYMBOL_GPL(serial8250_request_dma); |
212 | 219 | ||