diff options
Diffstat (limited to 'src/sg_write_buffer.c')
-rw-r--r-- | src/sg_write_buffer.c | 70 |
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) |