On Thursday, January 31, 2013, Jaehoon Chung wrote: > On 01/31/2013 05:42 PM, Subhash Jadavani wrote: > > On 1/22/2013 5:48 PM, Jaehoon Chung wrote: > >> When card removed, then didn't complete the previously data. > >> (It didn't wakeup any interrupt.) > >> If card is removed, then we can assume to complete the previously data. > >> And wakeup the interrupt for wait_event of data. > >> > >> This problem is produced when sd-card is removed.(Sd-card is running some operation) > >> > >> Signed-off-by: Jaehoon Chung <jh80.chung@xxxxxxxxxxx> > >> Signed-off-by: Kyungmin Park <Kyungmin.park@xxxxxxxxxxx> > >> --- > >> drivers/mmc/core/core.c | 31 ++++++++++++++++++++----------- > >> 1 files changed, 20 insertions(+), 11 deletions(-) > >> > >> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c > >> index 8b3a122..bc1d627 100644 > >> --- a/drivers/mmc/core/core.c > >> +++ b/drivers/mmc/core/core.c > >> @@ -515,17 +515,26 @@ struct mmc_async_req *mmc_start_req(struct mmc_host *host, > >> mmc_pre_req(host, areq->mrq, !host->areq); > >> if (host->areq) { > >> - err = mmc_wait_for_data_req_done(host, host->areq->mrq, > >> - areq); > >> - if (err == MMC_BLK_NEW_REQUEST) { > >> - if (error) > >> - *error = err; > >> - /* > >> - * The previous request was not completed, > >> - * nothing to return > >> - */ > >> - return NULL; > >> - } > >> + err = mmc_wait_for_data_req_done(host, host->areq->mrq, > >> + areq); > >> + if (err == MMC_BLK_NEW_REQUEST) { > >> + if (error) > >> + *error = err; > >> + /* > >> + * The previous request was not completed, > >> + * nothing to return > >> + */ > >> + return NULL; > >> + } else if (err == MMC_BLK_NOMEDIUM && areq) { > >> + struct mmc_context_info *ctnx = &host->context_info; > >> + /* > >> + * If crad is removed, > >> + * then we didn't wait for data completed. > >> + * Assume that data-recieve done. > >> + */ > >> + ctnx->is_done_rcv = true; > >> + wake_up_interruptible(&ctnx->wait); > > > > Can you please explain more on what exactly we are trying to do here (may be you can list down the > call flow)? I am not sure if i understood this correctly. But why would you need to wakeup the thread > here? We are here because thread is already woken up. mmc_wait_for_data_req_done() would return only > if either the new request is received or the currently running request on controller is completed. > This problem is produced when card is removed and running some operation. > If card is removed, mmc_wait_for_data_req_done() is returned error, right? > But if there was async request and running async operation, then maybe run mmc_start_request() with > areq. > controller is waiting "_for_req_data_done_" for areq. > > If request is host->areq.process is running at this time. > But if request is areq(prepared request), then mmc_wait_for_data_req_done should be pending. > and system is dead-lock. I also found this problem with sdcard. I think it can be solved easily. Did you see the following patch? [PATCH 1/2] mmc: core: fix permanent sleep of mmcqd during card removal We may just get the hint from __mmc_start_req function. Thanks, Seungwon Jeon > > Best Regards, > Jaehoon Chung > > > > > Regards, > > Subhash > > > >> + } > >> /* > >> * Check BKOPS urgency for each R1 response > >> */ > > > > -- > > 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 > > > > -- > 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 -- 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