[U-Boot] [Patch V5 2/4] spi: fsl_qspi: Fix qspi_op_rdid memcpy issue
Scott Wood
scott.wood at nxp.com
Fri Jan 22 16:43:03 CET 2016
On 01/21/2016 09:35 PM, Qianyu Gong wrote:
>
>> -----Original Message-----
>> From: Scott Wood
>> Sent: Friday, January 22, 2016 3:30 AM
>> To: Qianyu Gong <qianyu.gong at nxp.com>; u-boot at lists.denx.de;
>> R58495 at freescale.com
>> Cc: Mingkai.Hu at freescale.com; jteki at openedev.com; B48286 at freescale.com;
>> Shaohui.Xie at freescale.com; Wenbin.Song at freescale.com; Scott Wood
>> <oss at buserror.net>; Gong Qianyu <Qianyu.Gong at freescale.com>
>> Subject: Re: [Patch V5 2/4] spi: fsl_qspi: Fix qspi_op_rdid memcpy issue
>>
>> On 01/20/2016 09:43 PM, Gong Qianyu wrote:
>>> From: Gong Qianyu <Qianyu.Gong at freescale.com>
>>>
>>> In current driver everytime we memcpy 4 bytes to the dest memory
>>> regardless of the remaining length.
>>> This patch adds checking the remaining length before memcpy.
>>> If the length is shorter than 4 bytes, memcpy the actual length of
>>> data to the dest memory.
>>>
>>> Signed-off-by: Gong Qianyu <Qianyu.Gong at freescale.com>
>>> ---
>>> V2-V5:
>>> - No change.
>>>
>>> drivers/spi/fsl_qspi.c | 5 ++++-
>>> 1 file changed, 4 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/spi/fsl_qspi.c b/drivers/spi/fsl_qspi.c index
>>> 38e5900..f178857 100644
>>> --- a/drivers/spi/fsl_qspi.c
>>> +++ b/drivers/spi/fsl_qspi.c
>>> @@ -500,7 +500,10 @@ static void qspi_op_rdid(struct fsl_qspi_priv *priv, u32
>> *rxbuf, u32 len)
>>> if (rbsr_reg & QSPI_RBSR_RDBFL_MASK) {
>>> data = qspi_read32(priv->flags, ®s->rbdr[i]);
>>> data = qspi_endian_xchg(data);
>>> - memcpy(rxbuf, &data, 4);
>>> + if (size < 4)
>>> + memcpy(rxbuf, &data, size);
>>> + else
>>> + memcpy(rxbuf, &data, 4);
>>
>> memcpy(rxbuf, &data, min(size, 4));
>>
>>> rxbuf++;
>>> size -= 4;
>>> i++;
>>
>> size -= 4 even if size was < 4?
>>
>> -Scott
>
> Yes.. The following is complete code:
>
> i = 0;
> size = len;
> while ((RX_BUFFER_SIZE >= size) && (size > 0)) {
> rbsr_reg = qspi_read32(priv->flags, ®s->rbsr);
> if (rbsr_reg & QSPI_RBSR_RDBFL_MASK) {
> data = qspi_read32(priv->flags, ®s->rbdr[i]);
> data = qspi_endian_xchg(data);
> memcpy(rxbuf, &data, min(size, 4));
> rxbuf++;
> size -= 4;
> i++;
> }
> }
I'm not saying it doesn't work (assuming i is signed, which the
"complete code" above doesn't show). I'm saying it looks weird, and it
would be better to have a variable that holds min(size, 4) and pass that
to both memcpy and the subtraction.
-Scott
More information about the U-Boot
mailing list