On 08/02/2016 04:03 PM, Yangbo Lu wrote: > Hi Jaehoon, > > >> -----Original Message----- >> From: Jaehoon Chung [mailto:jh80.ch...@samsung.com] >> Sent: Thursday, July 28, 2016 4:40 PM >> To: Yangbo Lu; Ziyuan Xu; u-boot@lists.denx.de; Tom Rini >> Cc: Pantelis Antoniou >> Subject: Re: [U-Boot] [PATCH] mmc: send CMD0 before CMD1 for some MMC >> cards >> >> Hi Yangbo, >> >> On 07/28/2016 11:45 AM, Yangbo Lu wrote: >>> Hi Ziyuan and Jaehoon, >>> >>> >>>> -----Original Message----- >>>> From: Ziyuan Xu [mailto:xzy...@rock-chips.com] >>>> Sent: Wednesday, July 27, 2016 9:37 PM >>>> To: Jaehoon Chung; Yangbo Lu; u-boot@lists.denx.de; Tom Rini >>>> Cc: Pantelis Antoniou >>>> Subject: Re: [U-Boot] [PATCH] mmc: send CMD0 before CMD1 for some MMC >>>> cards >>>> >>>> >>>> >>>> On 2016年07月27日 19:15, Jaehoon Chung wrote: >>>>> On 07/27/2016 04:28 PM, Yangbo Lu wrote: >>>>>> Hi Tom, >>>>>> >>>>>> Could you help to assign this mmc patch reviewing to right person? >>>>>> It seems no one had reviewed it for almost half year. >>>>>> >>>>>> And another my mmc patch also needs to be reviewed. >>>>>> I submitted in May. Please help. >>>>>> http://patchwork.ozlabs.org/patch/624448/ >>>>>> >>>>>> >>>>>> Thank you very much. >>>>>> >>>>>> >>>>>> Best regards, >>>>>> Yangbo Lu >>>>>> >>>>>>> -----Original Message----- >>>>>>> From: Yangbo Lu [mailto:yangbo...@nxp.com] >>>>>>> Sent: Wednesday, March 09, 2016 11:00 AM >>>>>>> To: u-boot@lists.denx.de >>>>>>> Cc: Pantelis Antoniou; Yangbo Lu >>>>>>> Subject: [PATCH] mmc: send CMD0 before CMD1 for some MMC cards >>>>>>> >>>>>>> When the MMC framework was added in u-boot, the mmc_go_idle was >>>>>>> added before mmc_send_op_cond_iter in function mmc_send_op_cond >>>>>>> annotating that some cards seemed to need this. Actually, we still >>>>>>> need to do this in function mmc_complete_op_cond for those cards. >>>>>>> This has been verified on Micron MTFC4GACAECN eMMC chip. >>>>> If there is no go_idle(), then what happen? >>>>> If you share the information more, i can check the more.. >>>> Sounds interesting, I also want want to know what happen? >>>> It seems like you failed in CMD1? The eMMC device was always in busy >>>> device within 1 second? >>> >>> [Lu Yangbo-B47093] This was an issue which our customer reported and >> required us to fix in March. >>> They used NXP LS1020A platform and Micron MTFC4GACAECN eMMC, and >> reported they had to add CMD0 as below. >>> Otherwise it couldn’t read OCR. >>> >>> static int mmc_complete_op_cond(struct mmc *mmc) { >>> struct mmc_cmd cmd; >>> int timeout = 1000; >>> uint start; >>> int err; >>> >>> #if defined (XXX_CHANGED) >>> // our eMMC chip (Micron MTFC4GACAECN) requires that it be put in >> idle mode before >>> // negociating the operating voltage levels. >>> mmc_go_idle(mmc); >>> #endif >> >> Well, it seems to fix workaround. mmc_go_idle() means Device Reset. >> >> mmc_complete_op_cond() function has added for reducing the booting time. >> If mmc_go_idle() is added at here, there is no benefit, and it should be >> back to old concept. >> >> I don't agree this patch..now. >> > > [Lu Yangbo-B47093] Did you notice mmc_send_op_cond function? Before > mmc_send_op_cond_iter sending CMD1, there always was mmc_go_idle. > I don’t know why said 'Some cards seem to need this', but it must fix some > issue. > > static int mmc_send_op_cond(struct mmc *mmc) > { > int err, i; > > /* Some cards seem to need this */ > mmc_go_idle(mmc); > > /* Asking to the card its capabilities */ > for (i = 0; i < 2; i++) { > err = mmc_send_op_cond_iter(mmc, i != 0); > if (err) > return err; > > /* exit if not busy (flag seems to be inverted) */ > if (mmc->ocr & OCR_BUSY) > break; > } > mmc->op_cond_pending = 1; > return 0; > } > > Now in mmc_complete_op_cond function, there may be the same issue. Without > the mmc_go_idle, mmc_send_op_cond_iter failed to get ocr. > Maybe I should move mmc_go_idle just before mmc_send_op_cond_iter, like this. > > static int mmc_complete_op_cond(struct mmc *mmc) > { > struct mmc_cmd cmd; > int timeout = 1000; > uint start; > int err; > > mmc->op_cond_pending = 0; > if (!(mmc->ocr & OCR_BUSY)) { > start = get_timer(0); > while (1) { > /* Some cards seem to need this */ > mmc_go_idle(mmc); > err = mmc_send_op_cond_iter(mmc, 1);
If you need to add the mmc_go_idle(), then I think this point is right. :) Best Regards, Jaehoon Chung > > If you think it's not proper, do you have any suggestion? > :) > > Thanks a lot. > >> Best Regards, >> Jaehoon Chung >> >>> >>> >>> I hadn’t reproduce this to get more details about this issue since I >> didn’t have one this kind eMMC card that time. >>> Thanks. >>> >>>>> >>>>> Best Regards, >>>>> Jaehoon Chung >>>>> >>>>>>> Signed-off-by: Yangbo Lu <yangbo...@nxp.com> >>>>>>> --- >>>>>>> drivers/mmc/mmc.c | 3 +++ >>>>>>> 1 file changed, 3 insertions(+) >>>>>>> >>>>>>> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index >>>>>>> ede5d6e..82e3268 >>>>>>> 100644 >>>>>>> --- a/drivers/mmc/mmc.c >>>>>>> +++ b/drivers/mmc/mmc.c >>>>>>> @@ -418,6 +418,9 @@ static int mmc_complete_op_cond(struct mmc *mmc) >>>>>>> uint start; >>>>>>> int err; >>>>>>> >>>>>>> + /* Some cards seem to need this */ >>>>>>> + mmc_go_idle(mmc); >>>>>>> + >>>>>>> mmc->op_cond_pending = 0; >>>>>>> if (!(mmc->ocr & OCR_BUSY)) { >>>>>>> start = get_timer(0); >>>>>>> -- >>>>>>> 2.1.0.27.g96db324 >>>>>> _______________________________________________ >>>>>> U-Boot mailing list >>>>>> U-Boot@lists.denx.de >>>>>> http://lists.denx.de/mailman/listinfo/u-boot >>>>>> >>>>>> >>>>>> >>>>> _______________________________________________ >>>>> U-Boot mailing list >>>>> U-Boot@lists.denx.de >>>>> http://lists.denx.de/mailman/listinfo/u-boot >>>> >>> > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot