> Hello Jaehoon,
>
> ...
>> +/**
>> + *  mmc_start_bkops - start BKOPS for supported cards
>> + *  @card: MMC card to start BKOPS
>> + *
>> + *  Start background operations whenever requested.
>> + *  when the urgent BKOPS bit is set in a R1 command response
>> + *  then background operations should be started immediately.
>> +*/
>> +void mmc_start_bkops(struct mmc_card *card)
>> +{
>> +    int err;
>> +    unsigned long flags;
>> +
>> +    BUG_ON(!card);
>> +    if ((!card->ext_csd.bkops_en) ||
>> +                    !(card->host->caps2 & MMC_CAP2_BKOPS))
>> +            return;
>> +
>> +    /*
>> +     * If card is already doing bkops or need for
>> +     * bkops flag is not set, then do nothing just
>> +     * return
>> +     */
>> +    if (mmc_card_doing_bkops(card)
>> +                    || !mmc_card_need_bkops(card))
>> +            return;
>> +
>> +    mmc_claim_host(card->host);
>> +    err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
>> +                    EXT_CSD_BKOPS_START, 1, 0);
>> +    if (err) {
>> +            pr_warning("error %d starting bkops\n", err);
>> +            mmc_card_clr_need_bkops(card);
>> +            goto out;
>> +    }
>> +    spin_lock_irqsave(&card->host->lock, flags);
>> +    mmc_card_clr_need_bkops(card);
>> +    mmc_card_set_doing_bkops(card);
> Sending CMD6 (by mmc_switch()) will start BKOPS on card,
> according to eMMC spec:
> -----
> 7.4.56 BKOPS_START [164]
> Writing any value to this field shall manually start background
> operations.
> Device shall stay busy till no more background operations are needed.
> -----
> Where/when mmc_card_clear_doing_bkops() should called? The only place I
> see this happens is
> in mmc_interrupt_bkops(). This means, that once BKOPS started, next
> read/write request
> will _always_(and not when card really busy) send HPI and only then will
> clear "doing" flag.
>
> May be it is possible to poll for ack from card about when BKOPS finished?
> Another possibility that
> mmc_switch() synchronous and after flow returns from it, we can clear
> "doing" flag immediately.
> Does it make sense?
> ...

Now I understand that mmc_switch() command was modified for BKOPS_START to
be non-blocking, so the flow never waits for BKOPS to be finished. Because
of this HPI is always sent before next request.
Since start bkops flow is not frequent, it is ok.
Thanks,
Kostya

>> +    spin_unlock_irqrestore(&card->host->lock, flags);
>> +out:
>> +    mmc_release_host(card->host);
>> +}
>> +EXPORT_SYMBOL(mmc_start_bkops);
>> +
>
> Thanks,
> Kostya
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
> the body of a message to majord...@vger.kernel.org
> 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to