summaryrefslogtreecommitdiffstats
path: root/drivers/mmc/core/sdio_ops.h
diff options
context:
space:
mode:
authorjiajie.hao@mediatek.com <jiajie.hao@mediatek.com>2017-04-23 17:38:27 +0800
committerUlf Hansson <ulf.hansson@linaro.org>2017-04-24 21:45:09 +0200
commitf328c76e568d13c9fee21b5cf7411c96285f0f89 (patch)
tree1e2733aeea34d890052e527b2defa74f3c344b78 /drivers/mmc/core/sdio_ops.h
parentd9370424c9482d0ca2722627309c6f6bae131d97 (diff)
downloadlinux-stable-f328c76e568d13c9fee21b5cf7411c96285f0f89.tar.gz
linux-stable-f328c76e568d13c9fee21b5cf7411c96285f0f89.tar.bz2
linux-stable-f328c76e568d13c9fee21b5cf7411c96285f0f89.zip
mmc: sdio: Fix sdio wait busy implement limitation
The host may issue an I/O abort by writing to the CCCR at any time during I/O read operation via CMD52. And host may need suspend transcation during write busy stage in SDIO suspend/resume scenario. >From other side, a card may accept CMD52 during data transfer phase. Previous implement would block issuing above command in busy stage. It cause function driver can't implement as proper way and has no opportunity to do some coverage in error case via I/O abort etc. We need bypass some necessary operation during busy check stage. Signed-off-by: Jiajie Hao <jiajie.hao@mediatek.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Diffstat (limited to 'drivers/mmc/core/sdio_ops.h')
-rw-r--r--drivers/mmc/core/sdio_ops.h10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/mmc/core/sdio_ops.h b/drivers/mmc/core/sdio_ops.h
index bed8a8377fec..ee35cb4d170e 100644
--- a/drivers/mmc/core/sdio_ops.h
+++ b/drivers/mmc/core/sdio_ops.h
@@ -26,9 +26,15 @@ int mmc_io_rw_extended(struct mmc_card *card, int write, unsigned fn,
int sdio_reset(struct mmc_host *host);
unsigned int mmc_align_data_size(struct mmc_card *card, unsigned int sz);
-static inline bool mmc_is_io_op(u32 opcode)
+static inline bool sdio_is_io_busy(u32 opcode, u32 arg)
{
- return opcode == SD_IO_RW_DIRECT || opcode == SD_IO_RW_EXTENDED;
+ u32 addr;
+
+ addr = (arg >> 9) & 0x1FFFF;
+
+ return (opcode == SD_IO_RW_EXTENDED ||
+ (opcode == SD_IO_RW_DIRECT &&
+ !(addr == SDIO_CCCR_ABORT || addr == SDIO_CCCR_SUSPEND)));
}
#endif