> > > > (do_data_tag ? (1 << 29) : 0); > > > > brq->sbc.flags = MMC_RSP_R1 | MMC_CMD_AC; > > > > brq->mrq.sbc = &brq->sbc; > > > > + } else if (mmc_card_ult_capacity(card)) { > > > > + mmc_blk_wait_for_idle(mq, card->host); > > > > + mmc_send_ext_addr(card->host, blk_rq_pos(req)); > > > > > > Did you consider having mmc_start_request() send CMD22? > > > e.g. > > > > > > diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index > > > d6c819dd68ed..22677a01c0e3 100644 > > > --- a/drivers/mmc/core/core.c > > > +++ b/drivers/mmc/core/core.c > > > @@ -336,6 +336,9 @@ int mmc_start_request(struct mmc_host *host, > > > struct mmc_request *mrq) { > > > int err; > > > > > > + if (mrq->cmd && mrq->cmd->ext_addr) > > > + mmc_send_ext_addr(card->host, mrq->cmd->ext_addr); Oh , and yes - To state the obvious: async reqs are working fine now. Not sure why it wasn't when I was calling it from mmc_blk_rw_rq_prep. Thanks, Avri > > > + > > Will give it a try. > In the proposed form, this doesn't work. > Mainly because mmc_send_ext_addr eventually calls mmc_start_request by > itself: > mmc_wait_for_cmd() -> mmc_wait_for_req() -> __mmc_start_req() -> > mmc_start_request(). > > Also, since need to call CMD22 for any address, it is ok mrq->cmd->ext_addr to be > 0x0, Then need it to be a little bit bulkier, e.g.: > by adding a "check_sduc" argument to mmc_start_request, if (mrq->cmd && > check_sduc)) And make it true in mmc_blk_mq_issue_rw_rq and > mmc_blk_read_single, false otherwise, But this seems to be an invalid option to > me. > > And there is that thing of adding dword to mmc_command. > > What do you think? > > Thanks, > Avri > > > > Thanks, > > Avri > > > > > init_completion(&mrq->cmd_completion); > > > > > > mmc_retune_hold(host); > > > > > > > } > > > > } > > > >