OSDN Git Service

spi : spi-topcliff-pch: Fix to handle empty DMA buffers
authorAditya Pakki <pakki001@umn.edu>
Wed, 13 Mar 2019 16:55:41 +0000 (11:55 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 11 Jun 2019 10:24:05 +0000 (12:24 +0200)
[ 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

index 93dfcee..9f30a4a 100644 (file)
@@ -1326,18 +1326,27 @@ static void pch_free_dma_buf(struct pch_spi_board_data *board_dat,
        return;
 }
 
-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)
@@ -1414,7 +1423,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);