Hi Heiko,

> Maybe a way to go ... more comments?
>
> Below a patch, which introduces a function, which checks for
> "protection bugfixes", and if no bugfix is found the old code is
> executed. Just a fast RFC patch.
>
> bye,
> Heiko
>
> diff --git a/drivers/mtd/cfi_flash.c b/drivers/mtd/cfi_flash.c
> index dd394a8..9d3fdcc 100644
> --- a/drivers/mtd/cfi_flash.c
> +++ b/drivers/mtd/cfi_flash.c
> @@ -1376,6 +1376,38 @@ int write_buff (flash_info_t * info, uchar * src, 
> ulong addr, ulong cnt)
>   */
>  #ifdef CONFIG_SYS_FLASH_PROTECTION
>
> +static int cfi_protect_bugfix(flash_info_t * info, long sector, int prot)
> +{
> +     if ((info->manufacturer_id == 0x89) && (info->device_id == 0x8922)) {
> +             /*
> +              * see errata called
> +              * "Numonyx Axcell P33/P30 Specification Update" :)
> +              */
> +             flash_write_cmd (info, sector, 0, FLASH_CMD_READ_ID);
> +             if (!flash_isequal (info, sector, FLASH_OFFSET_PROTECT,
> +                                 prot)) {
> +                     /*
> +                      * cmd must come before FLASH_CMD_PROTECT + 20us
> +                      * Disable interrupts which might cause a timeout here.
> +                      */
> +                     int flag = disable_interrupts ();
> +                     unsigned short cmd;
> +                             if (prot)
> +                             cmd = FLASH_CMD_PROTECT_SET;
> +                     else
> +                             cmd = FLASH_CMD_PROTECT_CLEAR;
> +                             flash_write_cmd (info, sector, 0,
> +                                       FLASH_CMD_PROTECT);
> +                     flash_write_cmd (info, sector, 0, cmd);
> +                     /* re-enable interrupts if necessary */
> +                     if (flag)
> +                             enable_interrupts ();
> +             }
> +             return 1;
> +     }
> +     return 0;
> +}
> +
>  int flash_real_protect (flash_info_t * info, long sector, int prot)
>  {
>       int retcode = 0;
> @@ -1384,31 +1416,18 @@ int flash_real_protect (flash_info_t * info, long 
> sector, int prot)
>               case CFI_CMDSET_INTEL_PROG_REGIONS:
>               case CFI_CMDSET_INTEL_STANDARD:
>               case CFI_CMDSET_INTEL_EXTENDED:
> -                     /*
> -                      * see errata called
> -                      * "Numonyx Axcell P33/P30 Specification Update" :)
> -                      */
> -                     flash_write_cmd (info, sector, 0, FLASH_CMD_READ_ID);
> -                     if (!flash_isequal (info, sector, FLASH_OFFSET_PROTECT,
> -                                         prot)) {
> -                             /*
> -                              * cmd must come before FLASH_CMD_PROTECT + 20us
> -                              * Disable interrupts which might cause a 
> timeout here.
> -                              */
> -                             int flag = disable_interrupts ();
> -                             unsigned short cmd;
> -
> +                     if (!cfi_protect_bugfix(info, sector, prot)) {
> +                             flash_write_cmd (info, sector, 0,
> +                                      FLASH_CMD_CLEAR_STATUS);
> +                             flash_write_cmd (info, sector, 0,
> +                                     FLASH_CMD_PROTECT);
>                               if (prot)
> -                                     cmd = FLASH_CMD_PROTECT_SET;
> +                                     flash_write_cmd (info, sector, 0,
> +                                             FLASH_CMD_PROTECT_SET);
>                               else
> -                                     cmd = FLASH_CMD_PROTECT_CLEAR;
> +                                     flash_write_cmd (info, sector, 0,
> +                                             FLASH_CMD_PROTECT_CLEAR);
>
> -                             flash_write_cmd (info, sector, 0,
> -                                               FLASH_CMD_PROTECT);
> -                             flash_write_cmd (info, sector, 0, cmd);
> -                             /* re-enable interrupts if necessary */
> -                             if (flag)
> -                                     enable_interrupts ();
>                       }
>                       break;
>               case CFI_CMDSET_AMD_EXTENDED:

Can't we introduce a field "chip_quirk" in flash_info_t, and upon flash
enumeration check for the specific chip version and for example put a
CFI_QUIRK_PROTECT in it for this chip.  The core code can then check for
this flag and call functions appropriately.

In other words, why not introduce a generic infrastructure for handling
chip quirks that may need different handling for other functions also.

Cheers
  Detlev

-- 
Programming X-Windows is like trying to find the square root of pi
using roman numerals.
                                          -- The UNIX Haters Handbook
--
DENX Software Engineering GmbH,      MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich,  Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-40 Fax: (+49)-8142-66989-80 Email: [email protected]
_______________________________________________
U-Boot mailing list
[email protected]
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to