[U-Boot] sf: Fix to compute proper sector_size

Jagan Teki jagannadh.teki at gmail.com
Wed Apr 22 15:04:38 CEST 2015


Some catches on this!

On 22 April 2015 at 15:29, Jagannadha Sutradharudu Teki
<jagannadh.teki at gmail.com> wrote:
> Upto now flash sector_size is assigned from params which isn't
> necessarily a sector size from vendor, so based on the SECT_*
> flags from flash_params the erase_size will compute and it will
> become the sector_size finally.
>
> Signed-off-by: Jagannadha Sutradharudu Teki <jagannadh.teki at gmail.com>
> Reported-by: Bin Meng <bmeng.cn at gmail.com>
> ---
>  drivers/mtd/spi/sf_internal.h |  3 ++-
>  drivers/mtd/spi/sf_probe.c    | 10 +++++++---
>  2 files changed, 9 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/mtd/spi/sf_internal.h b/drivers/mtd/spi/sf_internal.h
> index d273d30..6c73992 100644
> --- a/drivers/mtd/spi/sf_internal.h
> +++ b/drivers/mtd/spi/sf_internal.h
> @@ -123,7 +123,8 @@ int sst_write_bp(struct spi_flash *flash, u32 offset, size_t len,
>   * @name:              Device name ([MANUFLETTER][DEVTYPE][DENSITY][EXTRAINFO])
>   * @jedec:             Device jedec ID (0x[1byte_manuf_id][2byte_dev_id])
>   * @ext_jedec:         Device ext_jedec ID
> - * @sector_size:       Sector size of this device
> + * @sector_size:       Isn't necessarily a sector size from vendor, the size here
> + *                     is what works with Sector erase (64KB)
>   * @nr_sectors:                No.of sectors on this device
>   * @e_rd_cmd:          Enum list for read commands
>   * @flags:             Important param, for flash specific behaviour
> diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c
> index d19138d..68ec583 100644
> --- a/drivers/mtd/spi/sf_probe.c
> +++ b/drivers/mtd/spi/sf_probe.c
> @@ -165,8 +165,9 @@ static int spi_flash_validate_params(struct spi_slave *spi, u8 *idcode,
>                 flash->page_size = 256;
>         }
>         flash->page_size <<= flash->shift;
> -       flash->sector_size = params->sector_size << flash->shift;
> -       flash->size = flash->sector_size * params->nr_sectors << flash->shift;
> +       params->nr_sectors <<= flash->shift;
> +       params->sector_size <<= flash->shift;

These are read-only object.

> +       flash->size = params->sector_size * params->nr_sectors;
>  #ifdef CONFIG_SF_DUAL_FLASH
>         if (flash->dual_flash & SF_DUAL_STACKED_FLASH)
>                 flash->size <<= 1;
> @@ -181,9 +182,12 @@ static int spi_flash_validate_params(struct spi_slave *spi, u8 *idcode,
>                 flash->erase_size = 32768 << flash->shift;
>         } else {
>                 flash->erase_cmd = CMD_ERASE_64K;
> -               flash->erase_size = flash->sector_size;
> +               flash->erase_size = info->sector_size;

Typo it should params->

>         }
>
> +       /* Now erase size becomes valid sector size */
> +       flash->sector_size = flash->erase_size;
> +
>         /* Look for the fastest read cmd */
>         cmd = fls(params->e_rd_cmd & flash->spi->op_mode_rx);
>         if (cmd) {
> --
> 1.9.1
>

Will update on next version.

thanks!
-- 
Jagan.


More information about the U-Boot mailing list