2012/4/14 S, Venkatraman <svenkatr@xxxxxx>: > On Fri, Apr 13, 2012 at 8:09 PM, Namjae Jeon <linkinjeon@xxxxxxxxx> wrote: >> Hi. Venkatraman. >> >> You fixed 10 times. why is it 10 times ? > There's no right number - I haven't seen it fail much in my tests but > should allow a few retries. Is there the reason should send HPI a few retries ? > >> and checking err from mmc_send_status is not needed ? is it also >> infinite case ? > Check again - the loop will break if the send_status returns an error > (even once), or if the card comes out of PRG state. okay, but this patch print "abort HPI" although card_status is fail. if print abort HPI fail, Can we know which error occurred in either send hpi cmd error and send status error ? Thanks. > >> >> Thanks. >> >> 2012/4/13 Venkatraman S <svenkatr@xxxxxx>: >>> Try to send HPI only a fixed number of times till it is >>> successful. One successful transfer is enough - but wait >>> till the card comes out of transfer state. >>> Return an error if the card was not in programming state to >>> begin with - so that the caller knows that HPI was not sent. >>> >>> Reported-by: Alex Lemberg <Alex.Lemberg@xxxxxxxxxxx> >>> Signed-off-by: Venkatraman S <svenkatr@xxxxxx> >>> --- >>> drivers/mmc/core/core.c | 34 ++++++++++++++++++---------------- >>> 1 file changed, 18 insertions(+), 16 deletions(-) >>> >>> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c >>> index e541efb..ceabef5 100644 >>> --- a/drivers/mmc/core/core.c >>> +++ b/drivers/mmc/core/core.c >>> @@ -401,7 +401,7 @@ EXPORT_SYMBOL(mmc_wait_for_req); >>> */ >>> int mmc_interrupt_hpi(struct mmc_card *card) >>> { >>> - int err; >>> + int err, i; >>> u32 status; >>> >>> BUG_ON(!card); >>> @@ -421,27 +421,29 @@ int mmc_interrupt_hpi(struct mmc_card *card) >>> /* >>> * If the card status is in PRG-state, we can send the HPI command. >>> */ >>> + err = -EINVAL; >>> if (R1_CURRENT_STATE(status) == R1_STATE_PRG) { >>> - do { >>> - /* >>> - * We don't know when the HPI command will finish >>> - * processing, so we need to resend HPI until out >>> - * of prg-state, and keep checking the card status >>> - * with SEND_STATUS. If a timeout error occurs when >>> - * sending the HPI command, we are already out of >>> - * prg-state. >>> - */ >>> + /* To prevent an infinite lockout, try to send HPI >>> + * a fixed number of times and bailout if it can't >>> + * succeed. >>> + */ >>> + for (i = 0; i < 10 && err != 0 ; i++) >>> err = mmc_send_hpi_cmd(card, &status); >>> - if (err) >>> + /* Once HPI was sent successfully, the card is >>> + * supposed to be back to transfer state. >>> + */ >>> + do { >>> + if (err) { >>> pr_debug("%s: abort HPI (%d error)\n", >>> mmc_hostname(card->host), err); >>> - >>> - err = mmc_send_status(card, &status); >>> - if (err) >>> break; >>> + } >>> + err = mmc_send_status(card, &status); >>> } while (R1_CURRENT_STATE(status) == R1_STATE_PRG); >>> - } else >>> - pr_debug("%s: Left prg-state\n", mmc_hostname(card->host)); >>> + } else { >>> + pr_debug("%s: Can't send HPI. State=%d\n", >>> + mmc_hostname(card->host), R1_CURRENT_STATE(status)); >>> + } >>> >>> out: >>> mmc_release_host(card->host); >>> -- >>> 1.7.10.rc2 >>> >>> -- >>> 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