diff options
author | Ben Gardiner <ben.l.gardiner@gmail.com> | 2013-09-19 11:14:27 -0400 |
---|---|---|
committer | Chris Ball <cjb@laptop.org> | 2013-09-25 22:11:46 -0400 |
commit | e6e84e96ac031e261bda8d441aa9c4cade144437 (patch) | |
tree | 797cec6006ca0570840d5b9760b3703123b70a79 | |
parent | d91d3698c6464a83b7c301eb84da109f9f94b54c (diff) | |
download | mmc-utils-e6e84e96ac031e261bda8d441aa9c4cade144437.tar.gz |
extract PARTITION_SETTING_COMPLETE function
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@gmail.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
-rw-r--r-- | mmc_cmds.c | 77 |
1 files changed, 47 insertions, 30 deletions
@@ -449,6 +449,51 @@ 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; @@ -579,38 +624,10 @@ 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; } |