@@ -1402,6 +1402,11 @@ static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq,
if (card->host->caps2 & MMC_CAP2_NO_MULTI_READ &&
rq_data_dir(req) == READ)
brq->data.blocks = 1;
+
+ /* Some controllers needs workaround */
+ if (card->host->ops->blk_size_workaround)
+ brq->data.blocks = card->host->ops->blk_size_workaround(
+ card, req, brq->data.blocks);
}
if (brq->data.blocks > 1 || do_rel_wr) {
@@ -139,6 +139,10 @@ struct mmc_host_ops {
int (*select_drive_strength)(unsigned int max_dtr, int host_drv, int card_drv);
void (*hw_reset)(struct mmc_host *host);
void (*card_event)(struct mmc_host *host);
+
+ /* optional callback for mmc block HW bug workaround */
+ int (*blk_size_workaround)(struct mmc_card *card,
+ struct request *req, int blk_size);
};
struct mmc_card;