diff mbox

mmc: omap_hsmmc: Initialize dma_slave_config to avoid random data

Message ID 20160914101048.1061-1-peter.ujfalusi@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

Peter Ujfalusi Sept. 14, 2016, 10:10 a.m. UTC
It is wrong to not initialize the dma_slave_config struct as the DMAengine
driver might look at non initialized (random data) fields and tries to
interpret it.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
---
Hi,

would it be possible to send this patch for 4.8? I have omap-dma DMAengine
driver changes pending, but they break the MMC/SD because of the uninitialized
fields in dma_slave_config.

Thanks,
Peter

 drivers/mmc/host/omap_hsmmc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--
2.10.0

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Arnd Bergmann Sept. 14, 2016, 10:23 a.m. UTC | #1
On Wednesday, September 14, 2016 1:10:48 PM CEST Peter Ujfalusi wrote:
> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
> index 24ebc9a8de89..0a5640156159 100644
> --- a/drivers/mmc/host/omap_hsmmc.c
> +++ b/drivers/mmc/host/omap_hsmmc.c
> @@ -1409,7 +1409,7 @@ static int omap_hsmmc_pre_dma_transfer(struct omap_hsmmc_host *host,
>  static int omap_hsmmc_setup_dma_transfer(struct omap_hsmmc_host *host,
>                                         struct mmc_request *req)
>  {
> -       struct dma_slave_config cfg;
> +       struct dma_slave_config cfg = {};
>         struct dma_async_tx_descriptor *tx;
>         int ret = 0, i;
>         struct mmc_data *data = req->data;
> 

This change looks correct and is certainly the simplest solution if you want to
get it into v4.8, but generally speaking, I think it would be nicer to combine
it with the initialization of the fields:

	struct dma_slave_config cfg = {
		  .src_addr = host->mapbase + OMAP_HSMMC_DATA;
        .dst_addr = host->mapbase + OMAP_HSMMC_DATA;
        .src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
        .dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
        .src_maxburst = data->blksz / 4;
        .dst_maxburst = data->blksz / 4;
	};

	Arnd
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Ulf Hansson Sept. 14, 2016, 10:52 a.m. UTC | #2
On 14 September 2016 at 12:23, Arnd Bergmann <arnd@arndb.de> wrote:
> On Wednesday, September 14, 2016 1:10:48 PM CEST Peter Ujfalusi wrote:
>> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
>> index 24ebc9a8de89..0a5640156159 100644
>> --- a/drivers/mmc/host/omap_hsmmc.c
>> +++ b/drivers/mmc/host/omap_hsmmc.c
>> @@ -1409,7 +1409,7 @@ static int omap_hsmmc_pre_dma_transfer(struct omap_hsmmc_host *host,
>>  static int omap_hsmmc_setup_dma_transfer(struct omap_hsmmc_host *host,
>>                                         struct mmc_request *req)
>>  {
>> -       struct dma_slave_config cfg;
>> +       struct dma_slave_config cfg = {};
>>         struct dma_async_tx_descriptor *tx;
>>         int ret = 0, i;
>>         struct mmc_data *data = req->data;
>>
>
> This change looks correct and is certainly the simplest solution if you want to
> get it into v4.8, but generally speaking, I think it would be nicer to combine
> it with the initialization of the fields:
>
>         struct dma_slave_config cfg = {
>                   .src_addr = host->mapbase + OMAP_HSMMC_DATA;
>         .dst_addr = host->mapbase + OMAP_HSMMC_DATA;
>         .src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
>         .dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
>         .src_maxburst = data->blksz / 4;
>         .dst_maxburst = data->blksz / 4;
>         };

This seems like a small an easy change as well, so I wouldn't mind
picking up a v2 adopting this pattern instead.

Kind regards
Uffe
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Peter Ujfalusi Sept. 14, 2016, 10:59 a.m. UTC | #3
On 09/14/16 13:23, Arnd Bergmann wrote:
> On Wednesday, September 14, 2016 1:10:48 PM CEST Peter Ujfalusi wrote:
>> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
>> index 24ebc9a8de89..0a5640156159 100644
>> --- a/drivers/mmc/host/omap_hsmmc.c
>> +++ b/drivers/mmc/host/omap_hsmmc.c
>> @@ -1409,7 +1409,7 @@ static int omap_hsmmc_pre_dma_transfer(struct omap_hsmmc_host *host,
>>  static int omap_hsmmc_setup_dma_transfer(struct omap_hsmmc_host *host,
>>                                         struct mmc_request *req)
>>  {
>> -       struct dma_slave_config cfg;
>> +       struct dma_slave_config cfg = {};
>>         struct dma_async_tx_descriptor *tx;
>>         int ret = 0, i;
>>         struct mmc_data *data = req->data;
>>
> 
> This change looks correct and is certainly the simplest solution if you want to
> get it into v4.8, but generally speaking, I think it would be nicer to combine
> it with the initialization of the fields:
> 
> 	struct dma_slave_config cfg = {
> 		  .src_addr = host->mapbase + OMAP_HSMMC_DATA;
>         .dst_addr = host->mapbase + OMAP_HSMMC_DATA;
>         .src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
>         .dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
>         .src_maxburst = data->blksz / 4;
>         .dst_maxburst = data->blksz / 4;

I opted to not do this because the data->blksz is validated later in the
function (twice).

It is not a big issue, but looks a bit odd.
diff mbox

Patch

diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 24ebc9a8de89..0a5640156159 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -1409,7 +1409,7 @@  static int omap_hsmmc_pre_dma_transfer(struct omap_hsmmc_host *host,
 static int omap_hsmmc_setup_dma_transfer(struct omap_hsmmc_host *host,
 					struct mmc_request *req)
 {
-	struct dma_slave_config cfg;
+	struct dma_slave_config cfg = {};
 	struct dma_async_tx_descriptor *tx;
 	int ret = 0, i;
 	struct mmc_data *data = req->data;