| From 6f67cc6fd1cf339a0f19b9d4a998ec3c0123b1b6 Mon Sep 17 00:00:00 2001 |
| From: Roger Tseng <rogerable@realtek.com> |
| Date: Fri, 15 Aug 2014 14:06:01 +0800 |
| Subject: mmc: rtsx_usb_sdmmc: fix incorrect last byte in R2 response |
| |
| From: Roger Tseng <rogerable@realtek.com> |
| |
| commit 6f67cc6fd1cf339a0f19b9d4a998ec3c0123b1b6 upstream. |
| |
| Current code erroneously fill the last byte of R2 response with an undefined |
| value. In addition, the controller actually 'offloads' the last byte |
| (CRC7, end bit) while receiving R2 response and thus it's impossible to get the |
| actual value. This could cause mmc stack to obtain inconsistent CID from the |
| same card after resume and misidentify it as a different card. |
| |
| Fix by assigning dummy CRC and end bit: {7'b0, 1} = 0x1 to the last byte of R2. |
| |
| Fixes: c7f6558d84af ("mmc: Add realtek USB sdmmc host driver") |
| Signed-off-by: Roger Tseng <rogerable@realtek.com> |
| Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/mmc/host/rtsx_usb_sdmmc.c | 7 +++++++ |
| 1 file changed, 7 insertions(+) |
| |
| --- a/drivers/mmc/host/rtsx_usb_sdmmc.c |
| +++ b/drivers/mmc/host/rtsx_usb_sdmmc.c |
| @@ -435,6 +435,13 @@ static void sd_send_cmd_get_rsp(struct r |
| } |
| |
| if (rsp_type == SD_RSP_TYPE_R2) { |
| + /* |
| + * The controller offloads the last byte {CRC-7, end bit 1'b1} |
| + * of response type R2. Assign dummy CRC, 0, and end bit to the |
| + * byte(ptr[16], goes into the LSB of resp[3] later). |
| + */ |
| + ptr[16] = 1; |
| + |
| for (i = 0; i < 4; i++) { |
| cmd->resp[i] = get_unaligned_be32(ptr + 1 + i * 4); |
| dev_dbg(sdmmc_dev(host), "cmd->resp[%d] = 0x%08x\n", |