Ben Gardiner <ben.l.gardiner <at> gmail.com> writes:
>
> Extract a function which sets the OTP PARTITION_SETTING_COMPLETE
> bit; once this bit is set there are many other parameters in
> EXT_CSD which can no longer be set.
>
> Multiple OTP partition settings can be achieved by calling 'set'
> commands with '-n' on all except for the last.
>
> Signed-off-by: Ben Gardiner <ben.l.gardiner <at> gmail.com>
> ---
> mmc_cmds.c | 77 ++++++++++++++++++++++++++++++++++++++---------------
---------
> 1 file changed, 47 insertions(+), 30 deletions(-)
>
> diff --git a/mmc_cmds.c b/mmc_cmds.c
> index ba4f9cf..5ea19ac 100644
> --- a/mmc_cmds.c
> +++ b/mmc_cmds.c
> <at> <at> -449,6 +449,51 <at> <at> unsigned int
get_hc_erase_grp_size(__u8 *ext_csd)
> return ext_csd[224];
> }
>
> +int set_partitioning_setting_completed(int dry_run, const char *
const device,
> + int fd)
> +{
> + int ret;
> +
> + if (dry_run) {
> + fprintf(stderr, "NOT setting
PARTITION_SETTING_COMPLETED\n");
> + fprintf(stderr, "These changes will not take effect
neither "
> + "now nor after a power cycle\n");
> + return 1;
> + }
> +
> + fprintf(stderr, "setting OTP PARTITION_SETTING_COMPLETED!\n");
> + ret = write_extcsd_value(fd,
EXT_CSD_PARTITION_SETTING_COMPLETED, 0x1);
> + if (ret) {
> + fprintf(stderr, "Could not write 0x1 to "
> + "EXT_CSD[%d] in %s\n",
> + EXT_CSD_PARTITION_SETTING_COMPLETED, device);
> + return 1;
> + }
> +
> + __u32 response;
> + ret = send_status(fd, &response);
> + if (ret) {
> + fprintf(stderr, "Could not get response to SEND_STATUS "
> + "from %s\n", device);
> + return 1;
> + }
> +
> + if (response & R1_SWITCH_ERROR) {
> + fprintf(stderr, "Setting OTP PARTITION_SETTING_COMPLETED
"
> + "failed on %s\n", device);
> + return 1;
> + }
> +
> + fprintf(stderr, "Setting OTP PARTITION_SETTING_COMPLETED on "
> + "%s SUCCESS\n", device);
> + fprintf(stderr, "Device power cycle needed for settings to "
> + "take effect.\n"
> + "Confirm that PARTITION_SETTING_COMPLETED bit is set "
> + "using 'extcsd read' after power cycle\n");
> +
> + return 0;
> +}
> +
> int do_enh_area_set(int nargs, char **argv)
> {
> __u8 value;
> <at> <at> -579,38 +624,10 <at> <at> int do_enh_area_set(int
nargs, char **argv)
> exit(1);
> }
>
> - if (dry_run)
> - {
> - fprintf(stderr, "NOT setting
PARTITION_SETTING_COMPLETED\n");
> - exit(1);
> - }
> + printf("Done setting ENH_USR area on %s\n", device);
>
> - fprintf(stderr, "setting OTP PARTITION_SETTING_COMPLETED!\n");
> - ret = write_extcsd_value(fd,
EXT_CSD_PARTITION_SETTING_COMPLETED, 0x1);
> - if (ret) {
> - fprintf(stderr, "Could not write 0x1 to "
> - "EXT_CSD[%d] in %s\n",
> - EXT_CSD_PARTITION_SETTING_COMPLETED, device);
> + if (!set_partitioning_setting_completed(dry_run, device, fd))
> exit(1);
> - }
> -
> - __u32 response;
> - ret = send_status(fd, &response);
> - if (ret) {
> - fprintf(stderr, "Could not get response to SEND_STATUS
from %s\n", device);
> - exit(1);
> - }
> -
> - if (response & R1_SWITCH_ERROR)
> - {
> - fprintf(stderr, "Setting ENH_USR area failed on %s\n",
device);
> - exit(1);
> - }
> -
> - fprintf(stderr, "Setting ENH_USR area on %s SUCCESS\n", device);
> - fprintf(stderr, "Device power cycle needed for settings to take
effect.\n"
> - "Confirm that PARTITION_SETTING_COMPLETED bit is set
using 'extcsd read'"
> - "after power cycle\n");
>
> return 0;
> }
The program return code looks wrong with this patch. If I do
mmc write_reliability set -n 0 /dev/mmcblk0; echo $?
mmc write_reliability set -y 0 /dev/mmcblk0; echo $?
the first instance returns a 0, the second a 1.
The following change fixes this by changing set_partitioning_setting
completed() to only return one on an error and removing the inversions
in the if tests.
mmc_cmds.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/mmc_cmds.c b/mmc_cmds.c
index cea943f..c4efffe 100644
--- a/mmc_cmds.c
+++ b/mmc_cmds.c
@@ -462,7 +462,7 @@ int set_partitioning_setting_completed(int dry_run,
const char * const device,
fprintf(stderr, "NOT setting
PARTITION_SETTING_COMPLETED\n");
fprintf(stderr, "These changes will not take effect
neither "
"now nor after a power cycle\n");
- return 1;
+ return 0;
}
fprintf(stderr, "setting OTP PARTITION_SETTING_COMPLETED!\n");
@@ -630,7 +630,7 @@ int do_enh_area_set(int nargs, char **argv)
printf("Done setting ENH_USR area on %s\n", device);
- if (!set_partitioning_setting_completed(dry_run, device, fd))
+ if (set_partitioning_setting_completed(dry_run, device, fd))
exit(1);
return 0;
@@ -692,7 +692,7 @@ int do_write_reliability_set(int nargs, char **argv)
printf("Done setting EXT_CSD_WR_REL_SET to 0x%02x on %s\n",
value, device);
- if (!set_partitioning_setting_completed(dry_run, device, fd))
+ if (set_partitioning_setting_completed(dry_run, device, fd))
exit(1);
return 0;
--
1.7.9.5
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html