[U-Boot] [PATCH 11/11] cfi_flash: return device into read array mode after reading status

Vasily Khoruzhick anarsoul at gmail.com
Mon Mar 21 20:22:19 CET 2016


On Mon, Mar 21, 2016 at 9:19 AM, Stefan Roese <sr at denx.de> wrote:
> Hi Vasily,

Hi Stefan,

> On 21.03.2016 02:54, Marek Vasut wrote:
>> On 03/21/2016 02:37 AM, Vasily Khoruzhick wrote:
>>> Otherwise flash remains in read status mode and it's not possible
>>> to access data on flash.
>>>
>>> Signed-off-by: Vasily Khoruzhick <anarsoul at gmail.com>
>>
>> CCing Stefan and Scott on this one.
>>
>>> ---
>>>   drivers/mtd/cfi_flash.c | 2 ++
>>>   1 file changed, 2 insertions(+)
>>>
>>> diff --git a/drivers/mtd/cfi_flash.c b/drivers/mtd/cfi_flash.c
>>> index 39932f4..18831c6 100644
>>> --- a/drivers/mtd/cfi_flash.c
>>> +++ b/drivers/mtd/cfi_flash.c
>>> @@ -2203,6 +2203,8 @@ ulong flash_get_size (phys_addr_t base, int banknum)
>>>                                              flash_isset (info, sect_cnt,
>>>                                                           FLASH_OFFSET_PROTECT,
>>>                                                           FLASH_STATUS_PROTECT);
>>> +                                    flash_write_cmd(info, sect_cnt, 0,
>>> +                                                    FLASH_CMD_RESET);
>>>                                      break;
>>>                              case CFI_CMDSET_AMD_EXTENDED:
>>>                              case CFI_CMDSET_AMD_STANDARD:
>>>
>
> I can't test this patch, since I don't have such a board here
> available right now any more. But I'm wondering if this is really
> necessary. The driver used to work just fine on Intel Strata
> flash chips without this patch.
>
> And looking at the code, a bit later (after the loop) the flash
> is actually reset:

It sends status cmd for each erase block to check if it's protected or
not, and apparently this chip (Manufacturer ID 0x000089 Chip ID
0x008865) wants reset for each erase block as well.
Otherwise it returns status data instead of actual data. Btw, that is
exactly what Linux driver does.

> ...
>                 /* round up when converting to ms */
>                 info->write_tout = (tmp + 999) / 1000;
>                 info->flash_id = FLASH_MAN_CFI;
>                 if ((info->interface == FLASH_CFI_X8X16) &&
>                     (info->chipwidth == FLASH_CFI_BY8)) {
>                         /* XXX - Need to test on x8/x16 in parallel. */
>                         info->portwidth >>= 1;
>                 }
>
>                 flash_write_cmd (info, 0, 0, info->cmd_reset);
>         }
> ...
>
> So what exactly does not work for you with the current version?

It returns status page on read for each erase block instead of actual data.

> Which flash chip are you using?

Manufacturer ID 0x000089 Chip ID 0x008865

>
> Thanks,
> Stefan
>


More information about the U-Boot mailing list