aboutsummaryrefslogtreecommitdiff
path: root/src/sg_write_buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sg_write_buffer.c')
-rw-r--r--src/sg_write_buffer.c70
1 files changed, 37 insertions, 33 deletions
diff --git a/src/sg_write_buffer.c b/src/sg_write_buffer.c
index 59d35ef4..ff864aa9 100644
--- a/src/sg_write_buffer.c
+++ b/src/sg_write_buffer.c
@@ -26,7 +26,7 @@
* This utility issues the SCSI WRITE BUFFER command to the given device.
*/
-static const char * version_str = "1.16 20140817"; /* spc4r37 */
+static const char * version_str = "1.17 20140928"; /* spc4r37 */
#define ME "sg_write_buffer: "
#define DEF_XFER_LEN (8 * 1024 * 1024)
@@ -101,7 +101,7 @@ usage()
"acronym\n"
" (def: 0 -> 'combined header and "
"data' (obs))\n"
- " --off=OFF|-o OFF buffer offset (unit: bytes, def: 0)\n"
+ " --offset=OFF|-o OFF buffer offset (unit: bytes, def: 0)\n"
" --raw|-r read from stdin (same as '-I -')\n"
" --skip=SKIP|-s SKIP bytes in file FILE to skip before "
"reading\n"
@@ -132,51 +132,54 @@ usage()
#define MODE_DNLD_ERR_HISTORY 0x1C
-static struct mode_s {
+struct mode_s {
const char *mode_string;
int mode;
const char *comment;
-} modes[] = {
- { "hd", MODE_HEADER_DATA, "combined header and data "
+};
+
+static struct mode_s mode_arr[] = {
+ {"hd", MODE_HEADER_DATA, "combined header and data "
"(obsolete)"},
- { "vendor", MODE_VENDOR, "vendor specific"},
- { "data", MODE_DATA, "data"},
- { "dmc", MODE_DNLD_MC, "download microcode and activate"},
- { "dmc_save", MODE_DNLD_MC_SAVE, "download microcode, save and "
+ {"vendor", MODE_VENDOR, "vendor specific"},
+ {"data", MODE_DATA, "data"},
+ {"dmc", MODE_DNLD_MC, "download microcode and activate"},
+ {"dmc_save", MODE_DNLD_MC_SAVE, "download microcode, save and "
"activate"},
- { "dmc_offs", MODE_DNLD_MC_OFFS, "download microcode with offsets "
+ {"dmc_offs", MODE_DNLD_MC_OFFS, "download microcode with offsets "
"and activate"},
- { "dmc_offs_save", MODE_DNLD_MC_OFFS_SAVE, "download microcode with "
+ {"dmc_offs_save", MODE_DNLD_MC_OFFS_SAVE, "download microcode with "
"offsets, save and\n\t\t\t\tactivate"},
- { "echo", MODE_ECHO_BUFFER, "write data to echo buffer"},
- { "dmc_offs_ev_defer", MODE_DNLD_MC_EV_OFFS_DEFER, "download "
+ {"echo", MODE_ECHO_BUFFER, "write data to echo buffer"},
+ {"dmc_offs_ev_defer", MODE_DNLD_MC_EV_OFFS_DEFER, "download "
"microcode with offsets, select\n\t\t\t\tactivation event, "
"save and defer activation"},
- { "dmc_offs_defer", MODE_DNLD_MC_OFFS_DEFER, "download microcode "
- "with offsets, save and defer\n\t\t\t\tactivation"},
- { "activate_mc", MODE_ACTIVATE_MC,
- "activate deferred microcode"},
- { "en_ex", MODE_EN_EX_ECHO, "enable expander communications "
- "protocol and echo\n\t\t\t\tbuffer (obsolete)"},
- { "dis_ex", MODE_DIS_EX, "disable expander communications "
+ {"dmc_offs_defer", MODE_DNLD_MC_OFFS_DEFER, "download microcode "
+ "with offsets, save and\n\t\t\t\tdefer activation"},
+ {"activate_mc", MODE_ACTIVATE_MC, "activate deferred microcode"},
+ {"en_ex", MODE_EN_EX_ECHO, "enable expander communications "
+ "protocol and\n\t\t\t\techo buffer (obsolete)"},
+ {"dis_ex", MODE_DIS_EX, "disable expander communications "
"protocol\n\t\t\t\t(obsolete)"},
- { "deh", MODE_DNLD_ERR_HISTORY, "download application client "
+ {"deh", MODE_DNLD_ERR_HISTORY, "download application client "
"error history "},
+ {NULL, 0, NULL},
};
-#define NUM_MODES ((int)(sizeof(modes)/sizeof(modes[0])))
-
static void
print_modes(void)
{
- int k;
+ const struct mode_s * mp;
pr2serr("The modes parameter argument can be numeric (hex or decimal)\n"
"or symbolic:\n");
- for (k = 0; k < NUM_MODES; k++) {
- pr2serr(" %2d (0x%02x) %-18s%s\n", modes[k].mode, modes[k].mode,
- modes[k].mode_string, modes[k].comment);
+ for (mp = mode_arr; mp->mode_string; ++mp) {
+ pr2serr(" %2d (0x%02x) %-18s%s\n", mp->mode, mp->mode,
+ mp->mode_string, mp->comment);
}
+ pr2serr("\nAdditionally '--bpw=<val>,act' does a activate deferred "
+ "microcode after\nsuccessful dmc_offs_defer and "
+ "dmc_offs_ev_defer mode downloads.\n");
}
/* <<<< This function will be moved to the library in the future >>> */
@@ -268,6 +271,7 @@ main(int argc, char * argv[])
const char * file_name = NULL;
unsigned char * dop = NULL;
char * cp;
+ const struct mode_s * mp;
char ebuff[EBUFF_SZ];
int ret = 0;
@@ -325,13 +329,13 @@ main(int argc, char * argv[])
}
} else {
len = strlen(optarg);
- for (k = 0; k < NUM_MODES; ++k) {
- if (0 == strncmp(modes[k].mode_string, optarg, len)) {
- wb_mode = modes[k].mode;
+ for (mp = mode_arr; mp->mode_string; ++mp) {
+ if (0 == strncmp(mp->mode_string, optarg, len)) {
+ wb_mode = mp->mode;
break;
}
}
- if (NUM_MODES == k) {
+ if (! mp->mode_string) {
print_modes();
return SG_LIB_SYNTAX_ERROR;
}
@@ -512,8 +516,8 @@ main(int argc, char * argv[])
if (bpw_then_activate) {
if (verbose)
pr2serr("sending Activate deferred microcode [0xf]\n");
- res = sg_ll_write_buffer_v2(sg_fd, 0xf, 0, 0, 0, NULL, 0, 1,
- verbose);
+ res = sg_ll_write_buffer_v2(sg_fd, MODE_ACTIVATE_MC, 0, 0, 0,
+ NULL, 0, 1, verbose);
}
} else {
if (verbose)