On 20/10/16 11:19, Ulf Hansson wrote: > When polling for busy after sending a MMC_SWITCH command, both the optional > ->card_busy() callback and CMD13 are being used in conjunction. > > This doesn't make sense. Instead it's more reasonable to rely solely on the > ->card_busy() callback when it exists. Let's change that and instead use > the CMD13 as a fall-back. In this way we avoid sending CMD13, unless it's > really needed. > > Within this context, let's also take the opportunity to make some > additional clean-ups and clarifications to the related code. > > Signed-off-by: Ulf Hansson <ulf.hansson@xxxxxxxxxx> > --- > drivers/mmc/core/mmc_ops.c | 30 ++++++++++++++---------------- > 1 file changed, 14 insertions(+), 16 deletions(-) > > diff --git a/drivers/mmc/core/mmc_ops.c b/drivers/mmc/core/mmc_ops.c > index a84a880..481bbdb 100644 > --- a/drivers/mmc/core/mmc_ops.c > +++ b/drivers/mmc/core/mmc_ops.c > @@ -495,34 +495,32 @@ static int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms, > timeout = jiffies + msecs_to_jiffies(timeout_ms) + 1; > do { > /* > - * Due to the possibility of being preempted after > - * sending the status command, check the expiration > - * time first. > + * Due to the possibility of being preempted while polling, > + * check the expiration time first. > */ > expired = time_after(jiffies, timeout); > - if (send_status) { > + > + if (host->ops->card_busy) { > + busy = host->ops->card_busy(host); I didn't really have time to look at these patches, sorry :-(. But this loop looks like it could use a cond_resched() > + } else { > err = __mmc_send_status(card, &status, ignore_crc); > if (err) > return err; > - } > - if (host->ops->card_busy) { > - if (!host->ops->card_busy(host)) > - break; > - busy = true; > + busy = R1_CURRENT_STATE(status) == R1_STATE_PRG; > } > > - /* Timeout if the device never leaves the program state. */ > - if (expired && > - (R1_CURRENT_STATE(status) == R1_STATE_PRG || busy)) { > - pr_err("%s: Card stuck in programming state! %s\n", > + /* Timeout if the device still remains busy. */ > + if (expired && busy) { > + pr_err("%s: Card stuck being busy! %s\n", > mmc_hostname(host), __func__); > return -ETIMEDOUT; > } > - } while (R1_CURRENT_STATE(status) == R1_STATE_PRG || busy); > + } while (busy); > > - err = mmc_switch_status_error(host, status); > + if (host->ops->card_busy && send_status) > + return mmc_switch_status(card); > > - return err; > + return mmc_switch_status_error(host, status); > } > > /** > -- 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