[PATCH] MTD: Unlocking all Intel flash that is locked on power up. Try 3

Nicolas Pitre nico at cam.org
Mon Nov 19 21:59:03 EST 2007


On Mon, 19 Nov 2007, Justin Treon wrote:

> This is the third submission of the patch for unlocking all Intel flash that is
> locked on power up.  The patch has been tested on Intel M18, P30 and J3D Strata
> Flash.
>   1.    The automatic unlocking can be disabled for a particular partition 
>           in the map or the command line.
>      a. For the bit mask in the map it should look like:
>          .mask_flags	= MTD_POWERUP_LOCK,
>      b. For the command line parsing it should look like:
>          mtdparts=0x80000(bootloader)lk
>   2.    This will only unlock parts with instant individual block locking.  
>          Intel parts with legacy unlocking will not be unlocked.
> 
> Signed-off-by: Justin Treon <justin_treon at yahoo.com>

Acked-by: Nicolas Pitre <nico at cam.org>


> ---
> diff -r c105f44cf785 drivers/mtd/chips/cfi_cmdset_0001.c
> --- a/drivers/mtd/chips/cfi_cmdset_0001.c	Thu Nov 08 15:36:57 2007 -0800
> +++ b/drivers/mtd/chips/cfi_cmdset_0001.c	Tue Nov 13 22:47:40 2007 -0800
> @@ -226,10 +226,16 @@ static void fixup_use_write_buffers(stru
>  /*
>   * Some chips power-up with all sectors locked by default.
>   */
> -static void fixup_use_powerup_lock(struct mtd_info *mtd, void *param)
> -{
> -	printk(KERN_INFO "Using auto-unlock on power-up/resume\n" );
> -	mtd->flags |= MTD_STUPID_LOCK;
> +static void fixup_unlock_powerup_lock(struct mtd_info *mtd, void *param)
> +{
> +	struct map_info *map = mtd->priv;
> +	struct cfi_private *cfi = map->fldrv_priv;
> +	struct cfi_pri_intelext *cfip = cfi->cmdset_priv;
> +
> +	if (cfip->FeatureSupport&32) {
> + 		printk(KERN_INFO "Using auto-unlock on power-up/resume\n" );
> +		mtd->flags |= MTD_POWERUP_LOCK;
> +	}
>  }
>  
>  static struct cfi_fixup cfi_fixup_table[] = {
> @@ -244,7 +250,7 @@ static struct cfi_fixup cfi_fixup_table[
>  #endif
>  	{ CFI_MFR_ST, 0x00ba, /* M28W320CT */ fixup_st_m28w320ct, NULL },
>  	{ CFI_MFR_ST, 0x00bb, /* M28W320CB */ fixup_st_m28w320cb, NULL },
> -	{ MANUFACTURER_INTEL, 0x891c,	      fixup_use_powerup_lock, NULL, },
> +	{ MANUFACTURER_INTEL, CFI_ID_ANY, fixup_unlock_powerup_lock, NULL, },
>  	{ 0, 0, NULL, NULL }
>  };
>  
> @@ -2273,7 +2279,7 @@ static int cfi_intelext_suspend(struct m
>  	struct flchip *chip;
>  	int ret = 0;
>  
> -	if ((mtd->flags & MTD_STUPID_LOCK)
> +	if ((mtd->flags & MTD_POWERUP_LOCK)
>  	    && extp && (extp->FeatureSupport & (1 << 5)))
>  		cfi_intelext_save_locks(mtd);
>  
> @@ -2384,7 +2390,7 @@ static void cfi_intelext_resume(struct m
>  		spin_unlock(chip->mutex);
>  	}
>  
> -	if ((mtd->flags & MTD_STUPID_LOCK)
> +	if ((mtd->flags & MTD_POWERUP_LOCK)
>  	    && extp && (extp->FeatureSupport & (1 << 5)))
>  		cfi_intelext_restore_locks(mtd);
>  }
> diff -r c105f44cf785 drivers/mtd/cmdlinepart.c
> --- a/drivers/mtd/cmdlinepart.c	Thu Nov 08 15:36:57 2007 -0800
> +++ b/drivers/mtd/cmdlinepart.c	Thu Nov 15 17:18:11 2007 -0800
> @@ -9,7 +9,7 @@
>   *
>   * mtdparts=<mtddef>[;<mtddef]
>   * <mtddef>  := <mtd-id>:<partdef>[,<partdef>]
> - * <partdef> := <size>[@offset][<name>][ro]
> + * <partdef> := <size>[@offset][<name>][ro][lk]
>   * <mtd-id>  := unique name used in mapping driver/device (mtd->name)
>   * <size>    := standard linux memsize OR "-" to denote all remaining space
>   * <name>    := '(' NAME ')'
> @@ -140,6 +140,13 @@ static struct mtd_partition * newpart(ch
>          if (strncmp(s, "ro", 2) == 0)
>  	{
>  		mask_flags |= MTD_WRITEABLE;
> +		s += 2;
> +        }
> +
> +        /* if lk is found do NOT unlock the MTD partition*/
> +        if (strncmp(s, "lk", 2) == 0)
> +	{
> +		mask_flags |= MTD_POWERUP_LOCK;
>  		s += 2;
>          }
>  
> diff -r c105f44cf785 drivers/mtd/mtdcore.c
> --- a/drivers/mtd/mtdcore.c	Thu Nov 08 15:36:57 2007 -0800
> +++ b/drivers/mtd/mtdcore.c	Tue Nov 13 15:41:00 2007 -0800
> @@ -59,7 +59,7 @@ int add_mtd_device(struct mtd_info *mtd)
>  
>  			/* Some chips always power up locked. Unlock them now */
>  			if ((mtd->flags & MTD_WRITEABLE)
> -			    && (mtd->flags & MTD_STUPID_LOCK) && mtd->unlock) {
> +			    && (mtd->flags & MTD_POWERUP_LOCK) && mtd->unlock) {
>  				if (mtd->unlock(mtd, 0, mtd->size))
>  					printk(KERN_WARNING
>  					       "%s: unlock failed, "
> diff -r c105f44cf785 include/mtd/mtd-abi.h
> --- a/include/mtd/mtd-abi.h	Thu Nov 08 15:36:57 2007 -0800
> +++ b/include/mtd/mtd-abi.h	Fri Nov 09 10:43:28 2007 -0800
> @@ -29,7 +29,7 @@ struct mtd_oob_buf {
>  #define MTD_WRITEABLE		0x400	/* Device is writeable */
>  #define MTD_BIT_WRITEABLE	0x800	/* Single bits can be flipped */
>  #define MTD_NO_ERASE		0x1000	/* No erase necessary */
> -#define MTD_STUPID_LOCK		0x2000	/* Always locked after reset */
> +#define MTD_POWERUP_LOCK	0x2000	/* Always locked after reset */
>  
>  // Some common devices / combinations of capabilities
>  #define MTD_CAP_ROM		0
> 
> 
>       ____________________________________________________________________________________
> Be a better pen pal. 
> Text or chat with friends inside Yahoo! Mail. See how.  http://overview.mail.yahoo.com/
> 


Nicolas



More information about the linux-mtd mailing list