On 3 August 2015 at 17:04, Heiko Stübner <heiko@xxxxxxxxx> wrote: > The dw_mci_init_dma() may decide to not use dma, but pio instead, caused > by things like wrong dma settings in the system. > > Till now the code dw_mci_init_slot() always assumed that dma is available > when CONFIG_MMC_DW_IDMAC was defined, ignoring the host->use_dma var > set during dma init. > > So when now the dma init failed for whatever reason, the transfer sizes > would still be set for dma transfers, especially including the maximum > block-count calculated from host->ring_size and resulting in a > > [ 4.991109] ------------[ cut here ]------------ > [ 4.991111] kernel BUG at drivers/mmc/core/core.c:256! > [ 4.991113] Internal error: Oops - BUG: 0 [#1] SMP ARM > > because host->ring_size is 0 in this case and the slot init code uses > the wrong code to calculate the values. > > Fix this by selecting the correct calculations using the host->use_dma > variable instead of the CONFIG_MMC_DW_IDMAC config option. > > Signed-off-by: Heiko Stuebner <heiko@xxxxxxxxx> > --- > drivers/mmc/host/dw_mmc.c | 27 ++++++++++++++------------- > 1 file changed, 14 insertions(+), 13 deletions(-) > > diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c > index 40e9d8e..9ec3521 100644 > --- a/drivers/mmc/host/dw_mmc.c > +++ b/drivers/mmc/host/dw_mmc.c > @@ -2391,19 +2391,20 @@ static int dw_mci_init_slot(struct dw_mci *host, unsigned int id) > mmc->max_seg_size = host->pdata->blk_settings->max_seg_size; > } else { > /* Useful defaults if platform data is unset. */ > -#ifdef CONFIG_MMC_DW_IDMAC > - mmc->max_segs = host->ring_size; > - mmc->max_blk_size = 65536; > - mmc->max_seg_size = 0x1000; > - mmc->max_req_size = mmc->max_seg_size * host->ring_size; > - mmc->max_blk_count = mmc->max_req_size / 512; > -#else > - mmc->max_segs = 64; > - mmc->max_blk_size = 65536; /* BLKSIZ is 16 bits */ > - mmc->max_blk_count = 512; > - mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count; > - mmc->max_seg_size = mmc->max_req_size; > -#endif /* CONFIG_MMC_DW_IDMAC */ > + if (host->use_dma) { > + mmc->max_segs = host->ring_size; I expect this may cause a compiler error since host->ring_size is only available in the struct dw_mci *host when CONFIG_MMC_DW_IDMAC is set. I have already pulled in this patch from Jaehoon's pull request. Perhaps I should only amend the patch and change the host->ring_size to be always available no matter if CONFIG_MMC_DW_IDMAC is set or not? > + mmc->max_blk_size = 65536; > + mmc->max_seg_size = 0x1000; > + mmc->max_req_size = mmc->max_seg_size * host->ring_size; > + mmc->max_blk_count = mmc->max_req_size / 512; > + } else { > + mmc->max_segs = 64; > + mmc->max_blk_size = 65536; /* BLKSIZ is 16 bits */ > + mmc->max_blk_count = 512; > + mmc->max_req_size = mmc->max_blk_size * > + mmc->max_blk_count; > + mmc->max_seg_size = mmc->max_req_size; > + } > } > > if (dw_mci_get_cd(mmc)) > -- > 2.1.4 > > Kind regards Uffe -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html