From: Roger <rogerable@realtek.com>
To: Dan Carpenter <dan.carpenter@oracle.com>
Cc: Ulf Hansson <ulf.hansson@linaro.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
driverdev-devel@linuxdriverproject.org,
linux-mmc@vger.kernel.org, Chris Ball <chris@printf.net>,
linux-kernel@vger.kernel.org, wei_wang@realsil.com.cn
Subject: Re: [PATCH] mmc: rtsx: fix incorrect last byte in R2 response
Date: Tue, 12 Aug 2014 15:19:12 +0800 [thread overview]
Message-ID: <53E9BFF0.5030506@realtek.com> (raw)
In-Reply-To: <20140811130254.GP4856@mwanda>
On 08/11/2014 09:02 PM, Dan Carpenter wrote:
> On Mon, Aug 11, 2014 at 04:32:16PM +0800, rogerable@realtek.com wrote:
>> From: Roger Tseng <rogerable@realtek.com>
>>
>> Current code erroneously fill the last byte of R2 response with an undefined
>> value. In addition, it is impossible to obtain the real values since the
>> controller actually 'offloads' the last byte(CRC7, end bit) while receiving R2
>> response. 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 a dummy value 0x01 to the last byte of R2 response.
>>
>> Signed-off-by: Roger Tseng <rogerable@realtek.com>
>> ---
>> drivers/mmc/host/rtsx_pci_sdmmc.c | 1 +
>> drivers/mmc/host/rtsx_usb_sdmmc.c | 1 +
>> 2 files changed, 2 insertions(+)
>>
>> diff --git a/drivers/mmc/host/rtsx_pci_sdmmc.c b/drivers/mmc/host/rtsx_pci_sdmmc.c
>> index dfde4a2..54849d8 100644
>> --- a/drivers/mmc/host/rtsx_pci_sdmmc.c
>> +++ b/drivers/mmc/host/rtsx_pci_sdmmc.c
>> @@ -412,6 +412,7 @@ static void sd_send_cmd_get_rsp(struct realtek_pci_sdmmc *host,
>> }
>>
>> if (rsp_type == SD_RSP_TYPE_R2) {
>> + ptr[16] = 1;
>
> Avoid magic numbers like 16 and 0x1.
>
> This is subtle enough that it deserves a comment.
>
> ptr[stat_idx] = 0x1 /* 0x1 chosen randomly */
>
The 0x1 consists of 7-bit dummy zero CRC and stop bit 1, described in SD
card. Anyway, I'll give a comment to this in the next version.
>> 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",
>
> There are a lot of magic numbers in this function. We could get rid
> of this i < 4 loop but doing:
>
> memcpy(cmd->resp, ptr + 1, resp_len);
>
> Currently we don't use resp_len and the resp_len = 5 assignment is off
> by one... It should be resp_len = 4. This function is quite ugly.
I can remove the unused rsp_len in this function. But I'm afraid the
loop is still required. The destination cmd->resp is cpu-endian, but the
raw response from SD card in the buffer (pointed by ptr) is big-endian.
> regards,
> dan carpenter
>
>
> ------Please consider the environment before printing this e-mail.
> .
>
Best regards,
Roger Tseng
WARNING: multiple messages have this Message-ID (diff)
From: Roger <rogerable@realtek.com>
To: Dan Carpenter <dan.carpenter@oracle.com>
Cc: Chris Ball <chris@printf.net>,
Ulf Hansson <ulf.hansson@linaro.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
<driverdev-devel@linuxdriverproject.org>,
<linux-mmc@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
<wei_wang@realsil.com.cn>
Subject: Re: [PATCH] mmc: rtsx: fix incorrect last byte in R2 response
Date: Tue, 12 Aug 2014 15:19:12 +0800 [thread overview]
Message-ID: <53E9BFF0.5030506@realtek.com> (raw)
In-Reply-To: <20140811130254.GP4856@mwanda>
On 08/11/2014 09:02 PM, Dan Carpenter wrote:
> On Mon, Aug 11, 2014 at 04:32:16PM +0800, rogerable@realtek.com wrote:
>> From: Roger Tseng <rogerable@realtek.com>
>>
>> Current code erroneously fill the last byte of R2 response with an undefined
>> value. In addition, it is impossible to obtain the real values since the
>> controller actually 'offloads' the last byte(CRC7, end bit) while receiving R2
>> response. 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 a dummy value 0x01 to the last byte of R2 response.
>>
>> Signed-off-by: Roger Tseng <rogerable@realtek.com>
>> ---
>> drivers/mmc/host/rtsx_pci_sdmmc.c | 1 +
>> drivers/mmc/host/rtsx_usb_sdmmc.c | 1 +
>> 2 files changed, 2 insertions(+)
>>
>> diff --git a/drivers/mmc/host/rtsx_pci_sdmmc.c b/drivers/mmc/host/rtsx_pci_sdmmc.c
>> index dfde4a2..54849d8 100644
>> --- a/drivers/mmc/host/rtsx_pci_sdmmc.c
>> +++ b/drivers/mmc/host/rtsx_pci_sdmmc.c
>> @@ -412,6 +412,7 @@ static void sd_send_cmd_get_rsp(struct realtek_pci_sdmmc *host,
>> }
>>
>> if (rsp_type == SD_RSP_TYPE_R2) {
>> + ptr[16] = 1;
>
> Avoid magic numbers like 16 and 0x1.
>
> This is subtle enough that it deserves a comment.
>
> ptr[stat_idx] = 0x1 /* 0x1 chosen randomly */
>
The 0x1 consists of 7-bit dummy zero CRC and stop bit 1, described in SD
card. Anyway, I'll give a comment to this in the next version.
>> 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",
>
> There are a lot of magic numbers in this function. We could get rid
> of this i < 4 loop but doing:
>
> memcpy(cmd->resp, ptr + 1, resp_len);
>
> Currently we don't use resp_len and the resp_len = 5 assignment is off
> by one... It should be resp_len = 4. This function is quite ugly.
I can remove the unused rsp_len in this function. But I'm afraid the
loop is still required. The destination cmd->resp is cpu-endian, but the
raw response from SD card in the buffer (pointed by ptr) is big-endian.
> regards,
> dan carpenter
>
>
> ------Please consider the environment before printing this e-mail.
> .
>
Best regards,
Roger Tseng
next prev parent reply other threads:[~2014-08-12 7:19 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-11 8:32 [PATCH] mmc: rtsx: fix incorrect last byte in R2 response rogerable
2014-08-11 8:32 ` rogerable
2014-08-11 13:02 ` Dan Carpenter
2014-08-11 13:02 ` Dan Carpenter
2014-08-12 7:19 ` Roger [this message]
2014-08-12 7:19 ` Roger
2014-08-13 8:50 ` Dan Carpenter
2014-08-13 8:50 ` Dan Carpenter
2014-08-13 15:09 ` Ulf Hansson
2014-08-13 15:09 ` Ulf Hansson
2014-08-14 6:06 ` Roger Tseng
2014-08-14 6:06 ` Roger Tseng
2014-08-14 9:32 ` Ulf Hansson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=53E9BFF0.5030506@realtek.com \
--to=rogerable@realtek.com \
--cc=chris@printf.net \
--cc=dan.carpenter@oracle.com \
--cc=driverdev-devel@linuxdriverproject.org \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mmc@vger.kernel.org \
--cc=ulf.hansson@linaro.org \
--cc=wei_wang@realsil.com.cn \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.