From 20e43d0532e9cedb5961f8d4ff848b20cdfeb418 Mon Sep 17 00:00:00 2001 From: Asutosh Das Date: Thu, 21 Apr 2016 14:15:15 +0530 Subject: [PATCH] mmc: core: fix reading the bkops status from card The bkops status is indicated by the bit 0 and 1 of the 246th byte of the ext_csd register. The current code doesn't ignore the rest of the byte. Fix this by extracting the bit 0 and 1 only for the current bkops urgency. The exception level is defined by the least significant nibble of 54th byte in the ext_csd register. The current code doesn't ignore the rest of the byte. Fix this by extracting the nibble(LSB) for exception status. Change-Id: Ic90fe26a676ae7dd2063e17bc3771db83605f4dc Signed-off-by: Asutosh Das [subhashj@codeaurora.org: fixed trivial merge conflicts] Signed-off-by: Subhash Jadavani --- drivers/mmc/core/core.c | 10 ++++++++-- include/linux/mmc/card.h | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 2197e2495b88..add448035213 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -1871,8 +1871,14 @@ int mmc_read_bkops_status(struct mmc_card *card) if (err) return err; - card->ext_csd.raw_bkops_status = ext_csd[EXT_CSD_BKOPS_STATUS]; - card->ext_csd.raw_exception_status = ext_csd[EXT_CSD_EXP_EVENTS_STATUS]; + card->ext_csd.raw_bkops_status = ext_csd[EXT_CSD_BKOPS_STATUS] & + MMC_BKOPS_URGENCY_MASK; + card->ext_csd.raw_exception_status = + ext_csd[EXT_CSD_EXP_EVENTS_STATUS] & (EXT_CSD_URGENT_BKOPS | + EXT_CSD_DYNCAP_NEEDED | + EXT_CSD_SYSPOOL_EXHAUSTED + | EXT_CSD_PACKED_FAILURE); + kfree(ext_csd); return 0; } diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index e7578be38ddf..1c87478b5fc0 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -128,6 +128,7 @@ struct mmc_ext_csd { u8 raw_pwr_cl_ddr_52_360; /* 239 */ u8 raw_pwr_cl_ddr_200_360; /* 253 */ u8 cache_flush_policy; /* 240 */ +#define MMC_BKOPS_URGENCY_MASK 0x3 u8 raw_bkops_status; /* 246 */ u8 raw_sectors[4]; /* 212 - 4 bytes */ u8 cmdq_depth; /* 307 */