Hi, Ulf. On 08/17/2015 07:16 PM, Ulf Hansson wrote: > 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? Sorry for this. if you can, i think good that CONFIG_MMC_DW_IDMAC is removed at struct dw_mci. Could you amend it? If you want to get patch, i will send patch at now. Best Regards, Jaehoon Chung > >> + 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