diff options
author | Douglas Gilbert <dgilbert@interlog.com> | 2014-01-23 23:25:22 +0000 |
---|---|---|
committer | Douglas Gilbert <dgilbert@interlog.com> | 2014-01-23 23:25:22 +0000 |
commit | 4ac0d027631c7d48114d36257fde211c32d20137 (patch) | |
tree | 49ce5cb4704aaa95405ee21316b0c58d0f7b43bc /lib/sg_cmds_extra.c | |
parent | 2bb9e742c191f73cf50ad5e113fef7bf88f46f61 (diff) | |
download | sg3_utils-4ac0d027631c7d48114d36257fde211c32d20137.tar.gz |
scripts/rescan-scsi-bus.sh: check for issue_lip; add suse build infrastructure
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@547 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'lib/sg_cmds_extra.c')
-rw-r--r-- | lib/sg_cmds_extra.c | 52 |
1 files changed, 30 insertions, 22 deletions
diff --git a/lib/sg_cmds_extra.c b/lib/sg_cmds_extra.c index 4831123f..3facaa68 100644 --- a/lib/sg_cmds_extra.c +++ b/lib/sg_cmds_extra.c @@ -57,10 +57,10 @@ #define REASSIGN_BLKS_CMDLEN 6 #define RECEIVE_DIAGNOSTICS_CMD 0x1c #define RECEIVE_DIAGNOSTICS_CMDLEN 6 -#define EXTENDED_COPY_CMD 0x83 -#define EXTENDED_COPY_CMDLEN 16 -#define RECEIVE_COPY_RESULTS_CMD 0x84 -#define RECEIVE_COPY_RESULTS_CMDLEN 16 +#define THIRD_PARTY_COPY_OUT_CMD 0x83 /* was EXTENDED_COPY_CMD */ +#define THIRD_PARTY_COPY_OUT_CMDLEN 16 +#define THIRD_PARTY_COPY_IN_CMD 0x84 /* was RECEIVE_COPY_RESULTS_CMD */ +#define THIRD_PARTY_COPY_IN_CMDLEN 16 #define SEND_DIAGNOSTIC_CMD 0x1d #define SEND_DIAGNOSTIC_CMDLEN 6 #define SERVICE_ACTION_IN_12_CMD 0xab @@ -87,6 +87,7 @@ #define SET_TGT_PRT_GRP_SA 0xa #define WRITE_LONG_16_SA 0x11 #define REPORT_REFERRALS_SA 0x13 +#define EXTENDED_COPY_LID1_SA 0x0 /* Invokes a SCSI GET LBA STATUS command (SBC). Returns 0 -> success, @@ -402,7 +403,9 @@ sg_ll_report_referrals(int sg_fd, uint64_t start_llba, int one_seg, } /* Invokes a SCSI SEND DIAGNOSTIC command. Foreground, extended self tests can - * take a long time, if so set long_duration flag. Return of 0 -> success, + * take a long time, if so set long_duration flag in which case the timout + * is set to 7200 seconds; if the value of long_duration is > 7200 then that + * value is taken as the timeout value in seconds. Return of 0 -> success, * SG_LIB_CAT_INVALID_OP -> Send diagnostic not supported, * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_UNIT_ATTENTION, * SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND, @@ -412,7 +415,7 @@ sg_ll_send_diag(int sg_fd, int sf_code, int pf_bit, int sf_bit, int devofl_bit, int unitofl_bit, int long_duration, void * paramp, int param_len, int noisy, int verbose) { - int k, res, ret, sense_cat; + int k, res, ret, sense_cat, tmout; unsigned char senddiagCmdBlk[SEND_DIAGNOSTIC_CMDLEN] = {SEND_DIAGNOSTIC_CMD, 0, 0, 0, 0, 0}; unsigned char sense_b[SENSE_BUFF_LEN]; @@ -436,6 +439,10 @@ sg_ll_send_diag(int sg_fd, int sf_code, int pf_bit, int sf_bit, int devofl_bit, dStrHexErr((const char *)paramp, param_len, -1); } } + if (long_duration > LONG_PT_TIMEOUT) + tmout = long_duration; + else + tmout = long_duration ? LONG_PT_TIMEOUT : DEF_PT_TIMEOUT; ptvp = construct_scsi_pt_obj(); if (NULL == ptvp) { @@ -445,9 +452,7 @@ sg_ll_send_diag(int sg_fd, int sf_code, int pf_bit, int sf_bit, int devofl_bit, set_scsi_pt_cdb(ptvp, senddiagCmdBlk, sizeof(senddiagCmdBlk)); set_scsi_pt_sense(ptvp, sense_b, sizeof(sense_b)); set_scsi_pt_data_out(ptvp, (unsigned char *)paramp, param_len); - res = do_scsi_pt(ptvp, sg_fd, - (long_duration ? LONG_PT_TIMEOUT : DEF_PT_TIMEOUT), - verbose); + res = do_scsi_pt(ptvp, sg_fd, tmout, verbose); ret = sg_cmds_process_resp(ptvp, "send diagnostic", res, 0, sense_b, noisy, verbose, &sense_cat); if (-1 == ret) @@ -2221,13 +2226,13 @@ sg_ll_receive_copy_results(int sg_fd, int sa, int list_id, void * resp, int mx_resp_len, int noisy, int verbose) { int k, res, ret, sense_cat; - unsigned char rcvcopyresCmdBlk[RECEIVE_COPY_RESULTS_CMDLEN] = - {RECEIVE_COPY_RESULTS_CMD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + unsigned char rcvcopyresCmdBlk[THIRD_PARTY_COPY_IN_CMDLEN] = + {THIRD_PARTY_COPY_IN_CMD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; unsigned char sense_b[SENSE_BUFF_LEN]; struct sg_pt_base * ptvp; char b[64]; - sg_get_opcode_sa_name(RECEIVE_COPY_RESULTS_CMD, sa, 0, (int)sizeof(b), b); + sg_get_opcode_sa_name(THIRD_PARTY_COPY_IN_CMD, sa, 0, (int)sizeof(b), b); rcvcopyresCmdBlk[1] = (unsigned char)(sa & 0x1f); if (sa <= 4) /* LID1 variants */ rcvcopyresCmdBlk[2] = (unsigned char)(list_id); @@ -2246,7 +2251,7 @@ sg_ll_receive_copy_results(int sg_fd, int sa, int list_id, void * resp, sg_warnings_strm = stderr; if (verbose) { fprintf(sg_warnings_strm, " %s cmd: ", b); - for (k = 0; k < RECEIVE_COPY_RESULTS_CMDLEN; ++k) + for (k = 0; k < THIRD_PARTY_COPY_IN_CMDLEN; ++k) fprintf(sg_warnings_strm, "%02x ", rcvcopyresCmdBlk[k]); fprintf(sg_warnings_strm, "\n"); } @@ -2303,12 +2308,13 @@ sg_ll_extended_copy(int sg_fd, void * paramp, int param_len, int noisy, int verbose) { int k, res, ret, sense_cat; - unsigned char xcopyCmdBlk[EXTENDED_COPY_CMDLEN] = - {EXTENDED_COPY_CMD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + unsigned char xcopyCmdBlk[THIRD_PARTY_COPY_OUT_CMDLEN] = + {THIRD_PARTY_COPY_OUT_CMD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; unsigned char sense_b[SENSE_BUFF_LEN]; struct sg_pt_base * ptvp; const char * opcode_name = "Extended copy (LID1)"; + xcopyCmdBlk[1] = (unsigned char)(EXTENDED_COPY_LID1_SA & 0x1f); xcopyCmdBlk[10] = (unsigned char)((param_len >> 24) & 0xff); xcopyCmdBlk[11] = (unsigned char)((param_len >> 16) & 0xff); xcopyCmdBlk[12] = (unsigned char)((param_len >> 8) & 0xff); @@ -2318,7 +2324,7 @@ sg_ll_extended_copy(int sg_fd, void * paramp, int param_len, int noisy, sg_warnings_strm = stderr; if (verbose) { fprintf(sg_warnings_strm, " %s cmd: ", opcode_name); - for (k = 0; k < EXTENDED_COPY_CMDLEN; ++k) + for (k = 0; k < THIRD_PARTY_COPY_OUT_CMDLEN; ++k) fprintf(sg_warnings_strm, "%02x ", xcopyCmdBlk[k]); fprintf(sg_warnings_strm, "\n"); if ((verbose > 1) && paramp && param_len) { @@ -2365,8 +2371,9 @@ sg_ll_extended_copy(int sg_fd, void * paramp, int param_len, int noisy, } /* Handles various service actions associated with opcode 0x83 which is - * called THIRD PARTY COPY OUT. These include the EXTENDED COPY(LID4) and - * WRITE USING TOKEN commands. Return of 0 -> success, + * called THIRD PARTY COPY OUT. These include the EXTENDED COPY(LID1 and + * LID4), POPULATE TOKEN and WRITE USING TOKEN commands. + * Return of 0 -> success, * SG_LIB_CAT_INVALID_OP -> opcode 0x83 not supported, * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_UNIT_ATTENTION, * SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND, @@ -2377,15 +2384,16 @@ sg_ll_3party_copy_out(int sg_fd, int sa, unsigned int list_id, int group_num, int noisy, int verbose) { int k, res, ret, sense_cat, tmout; - unsigned char xcopyCmdBlk[EXTENDED_COPY_CMDLEN] = - {EXTENDED_COPY_CMD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + unsigned char xcopyCmdBlk[THIRD_PARTY_COPY_OUT_CMDLEN] = + {THIRD_PARTY_COPY_OUT_CMD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; unsigned char sense_b[SENSE_BUFF_LEN]; struct sg_pt_base * ptvp; char cname[80]; if (NULL == sg_warnings_strm) sg_warnings_strm = stderr; - sg_get_opcode_sa_name(EXTENDED_COPY_CMD, sa, 0, sizeof(cname), cname); + sg_get_opcode_sa_name(THIRD_PARTY_COPY_OUT_CMD, sa, 0, sizeof(cname), + cname); xcopyCmdBlk[1] = (unsigned char)(sa & 0x1f); switch (sa) { case 0x0: /* XCOPY(LID1) */ @@ -2422,7 +2430,7 @@ sg_ll_3party_copy_out(int sg_fd, int sa, unsigned int list_id, int group_num, if (verbose) { fprintf(sg_warnings_strm, " %s cmd: ", cname); - for (k = 0; k < EXTENDED_COPY_CMDLEN; ++k) + for (k = 0; k < THIRD_PARTY_COPY_OUT_CMDLEN; ++k) fprintf(sg_warnings_strm, "%02x ", xcopyCmdBlk[k]); fprintf(sg_warnings_strm, "\n"); if ((verbose > 1) && paramp && param_len) { |