lkml.org 
[lkml]   [2019]   [May]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.0 317/346] spi : spi-topcliff-pch: Fix to handle empty DMA buffers
    Date
    [ 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 97d137591b18d..4389ab80c23e6 100644
    --- a/drivers/spi/spi-topcliff-pch.c
    +++ b/drivers/spi/spi-topcliff-pch.c
    @@ -1294,18 +1294,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)
    @@ -1382,7 +1391,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


    \
     
     \ /
      Last update: 2019-05-30 05:20    [W:4.079 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site