summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gardiner <ben.l.gardiner@gmail.com>2013-09-19 11:14:27 -0400
committerChris Ball <cjb@laptop.org>2013-09-25 22:11:46 -0400
commite6e84e96ac031e261bda8d441aa9c4cade144437 (patch)
tree797cec6006ca0570840d5b9760b3703123b70a79
parentd91d3698c6464a83b7c301eb84da109f9f94b54c (diff)
downloadmmc-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.c77
1 files 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
@@ -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;
}