mmc: Add .multi_io_quirk callback for multi I/O HW bug
Historically, we have been using MMC_CAP* to handle host HW issues and currently the block layer uses MMC_CAP2_NO_MULTI_READ flag for a multi I/O HW bug workaround. There are a few tweaks needed to make MMC_CAP2_NO_MULTI_READ suite all situations. Therefore let's add an optional host ops callback to enable host drivers to return the number of blocks it allows per request. In a future patch and when host drivers have converted to the new callback, MMC_CAP2_NO_MULTI_READ shall be removed. Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
parent
adc828556d
commit
2e47e84245
|
@ -1402,6 +1402,16 @@ static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq,
|
||||||
if (card->host->caps2 & MMC_CAP2_NO_MULTI_READ &&
|
if (card->host->caps2 & MMC_CAP2_NO_MULTI_READ &&
|
||||||
rq_data_dir(req) == READ)
|
rq_data_dir(req) == READ)
|
||||||
brq->data.blocks = 1;
|
brq->data.blocks = 1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Some controllers have HW issues while operating
|
||||||
|
* in multiple I/O mode
|
||||||
|
*/
|
||||||
|
if (card->host->ops->multi_io_quirk)
|
||||||
|
brq->data.blocks = card->host->ops->multi_io_quirk(card,
|
||||||
|
(rq_data_dir(req) == READ) ?
|
||||||
|
MMC_DATA_READ : MMC_DATA_WRITE,
|
||||||
|
brq->data.blocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (brq->data.blocks > 1 || do_rel_wr) {
|
if (brq->data.blocks > 1 || do_rel_wr) {
|
||||||
|
|
|
@ -139,6 +139,13 @@ struct mmc_host_ops {
|
||||||
int (*select_drive_strength)(unsigned int max_dtr, int host_drv, int card_drv);
|
int (*select_drive_strength)(unsigned int max_dtr, int host_drv, int card_drv);
|
||||||
void (*hw_reset)(struct mmc_host *host);
|
void (*hw_reset)(struct mmc_host *host);
|
||||||
void (*card_event)(struct mmc_host *host);
|
void (*card_event)(struct mmc_host *host);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Optional callback to support controllers with HW issues for multiple
|
||||||
|
* I/O. Returns the number of supported blocks for the request.
|
||||||
|
*/
|
||||||
|
int (*multi_io_quirk)(struct mmc_card *card,
|
||||||
|
unsigned int direction, int blk_size);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mmc_card;
|
struct mmc_card;
|
||||||
|
|
Loading…
Reference in a new issue