| From db2dad54474fd0c0af02255236c9606be8c47e6a Mon Sep 17 00:00:00 2001 |
| From: Aditya Pakki <pakki001@umn.edu> |
| Date: Wed, 13 Mar 2019 11:55:41 -0500 |
| Subject: spi : spi-topcliff-pch: Fix to handle empty DMA buffers |
| |
| [ Upstream commit f37d8e67f39e6d3eaf4cc5471e8a3d21209843c6 ] |
| |
| pch_alloc_dma_buf allocated tx, rx DMA buffers which can fail. Further, |
| these buffers are used without a check. The patch checks for these |
| failures and sends the error upstream. |
| |
| Signed-off-by: Aditya Pakki <pakki001@umn.edu> |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/spi/spi-topcliff-pch.c | 15 +++++++++++++-- |
| 1 file changed, 13 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/spi/spi-topcliff-pch.c b/drivers/spi/spi-topcliff-pch.c |
| index fba3f180f233b..8a5966963834c 100644 |
| --- a/drivers/spi/spi-topcliff-pch.c |
| +++ b/drivers/spi/spi-topcliff-pch.c |
| @@ -1299,18 +1299,27 @@ static void pch_free_dma_buf(struct pch_spi_board_data *board_dat, |
| dma->rx_buf_virt, dma->rx_buf_dma); |
| } |
| |
| -static void pch_alloc_dma_buf(struct pch_spi_board_data *board_dat, |
| +static int pch_alloc_dma_buf(struct pch_spi_board_data *board_dat, |
| struct pch_spi_data *data) |
| { |
| struct pch_spi_dma_ctrl *dma; |
| + int ret; |
| |
| dma = &data->dma; |
| + ret = 0; |
| /* Get Consistent memory for Tx DMA */ |
| dma->tx_buf_virt = dma_alloc_coherent(&board_dat->pdev->dev, |
| PCH_BUF_SIZE, &dma->tx_buf_dma, GFP_KERNEL); |
| + if (!dma->tx_buf_virt) |
| + ret = -ENOMEM; |
| + |
| /* Get Consistent memory for Rx DMA */ |
| dma->rx_buf_virt = dma_alloc_coherent(&board_dat->pdev->dev, |
| PCH_BUF_SIZE, &dma->rx_buf_dma, GFP_KERNEL); |
| + if (!dma->rx_buf_virt) |
| + ret = -ENOMEM; |
| + |
| + return ret; |
| } |
| |
| static int pch_spi_pd_probe(struct platform_device *plat_dev) |
| @@ -1387,7 +1396,9 @@ static int pch_spi_pd_probe(struct platform_device *plat_dev) |
| |
| if (use_dma) { |
| dev_info(&plat_dev->dev, "Use DMA for data transfers\n"); |
| - pch_alloc_dma_buf(board_dat, data); |
| + ret = pch_alloc_dma_buf(board_dat, data); |
| + if (ret) |
| + goto err_spi_register_master; |
| } |
| |
| ret = spi_register_master(master); |
| -- |
| 2.20.1 |
| |