Revise with info from dpANS SCSI Primary Commands-3 (SPC-3). Use sense

data structure in mmc_last_cmd_sense.
This commit is contained in:
R. Bernstein
2010-02-05 07:40:31 -05:00
parent 35b6969a45
commit 0ae0a2ca8b
3 changed files with 44 additions and 34 deletions

View File

@@ -35,9 +35,17 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
/* On GNU/Linux see <linux/byteorder/big_endian.h> */ /* On GNU/Linux see <linux/byteorder/big_endian.h> and
#ifndef __BIG_ENDIAN_BITFIELD <linux/byteorder/little_endian.h>
#define __MMC_BIG_ENDIAN_BITFIELD */
#ifdef WORDS_BIGENDIAN
# if !defined(__LITTLE_ENDIAN_BITFIELD) && !defined(__BIG_ENDIAN_BITFIELD)
# define __MMC_BIG_ENDIAN_BITFIELD
# endif
#else
# if !defined(__LITTLE_ENDIAN_BITFIELD) && !defined(__BIG_ENDIAN_BITFIELD)
# define __MMC_LITTLE_ENDIAN_BITFIELD
# endif
#endif #endif
/** /**
@@ -99,11 +107,11 @@ extern "C" {
MMC_SENSE_KEY_ILLEGAL_REQUEST = 5, MMC_SENSE_KEY_ILLEGAL_REQUEST = 5,
MMC_SENSE_KEY_UNIT_ATTENTION = 6, MMC_SENSE_KEY_UNIT_ATTENTION = 6,
MMC_SENSE_KEY_DATA_PROTECT = 7, MMC_SENSE_KEY_DATA_PROTECT = 7,
MMC_SENSE_KEY_FIRMWARE_ERROR = 9, MMC_SENSE_KEY_BLANK_CHECK = 8,
MMC_SENSE_KEY_VENDOR_SPECIFIC = 9,
MMC_SENSE_KEY_COPY_ABORTED = 10,
MMC_SENSE_KEY_ABORTED_COMMAND = 11, MMC_SENSE_KEY_ABORTED_COMMAND = 11,
MMC_SENSE_KEY_EQUAL = 12, MMC_SENSE_KEY_OBSOLTE = 12,
MMC_SENSE_KEY_VOLUME_OVERFLOW = 13,
MMC_SENSE_KEY_MISCOMPARE = 14,
} mmc_sense_key_t; } mmc_sense_key_t;
/** /**
@@ -1016,7 +1024,7 @@ mmc_audio_read_subchannel (CdIo_t *p_cdio,
0 in case of no sense bytes available, 0 in case of no sense bytes available,
<0 in case of internal error. <0 in case of internal error.
*/ */
int mmc_last_cmd_sense ( const CdIo_t *p_cdio, unsigned char **sense); int mmc_last_cmd_sense ( const CdIo_t *p_cdio, mmc_request_sense_t **pp_sense);
/** /**
Set the block size for subsequest read requests, via MMC. Set the block size for subsequest read requests, via MMC.

View File

@@ -54,14 +54,14 @@ const char mmc_sense_key2str[16][40] = {
"Illegal Request", /**< 5 */ "Illegal Request", /**< 5 */
"Unit Attention", /**< 6 */ "Unit Attention", /**< 6 */
"Data Protect", /**< 7 */ "Data Protect", /**< 7 */
"Blank/Nonblank", /**< 8 */ "Blank Check", /**< 8 */
"Firmware Error", /**< 9 - Vendor-specific */ "Vendor Specific", /**< 9 */
"Copy aborted", /**< A */ "Copy aborted", /**< A */
"Aborted Command", /**< B */ "Aborted Command", /**< B */
"Equal", /**< C */ "Obsolete", /**< C */
"Volume Overflow", /**< D */ "Unknown - 13", /**< D */
"Miscompare", /**< E */ "Unknown - 14", /**< E */
"(reserved error code)", /**< F */ "Unknown - 15", /**< F */
}; };
/** The below variables are trickery to force enum symbol values to be /** The below variables are trickery to force enum symbol values to be
@@ -1085,19 +1085,19 @@ int mmc_get_tray_status(const CdIo_t *p_cdio)
<0 in case of internal error. <0 in case of internal error.
*/ */
int int
mmc_last_cmd_sense( const CdIo_t *p_cdio, unsigned char **sense) mmc_last_cmd_sense( const CdIo_t *p_cdio, mmc_request_sense_t **pp_sense)
{ {
generic_img_private_t *gen; generic_img_private_t *gen;
if (!p_cdio) return DRIVER_OP_UNINIT; if (!p_cdio) return DRIVER_OP_UNINIT;
gen = p_cdio->env; gen = p_cdio->env;
*sense = NULL; *pp_sense = NULL;
if (gen->scsi_mmc_sense_valid <= 0) if (gen->scsi_mmc_sense_valid <= 0)
return 0; return 0;
*sense = calloc(1, gen->scsi_mmc_sense_valid); *pp_sense = calloc(1, gen->scsi_mmc_sense_valid);
if (*sense == NULL) if (*pp_sense == NULL)
return DRIVER_OP_ERROR; return DRIVER_OP_ERROR;
memcpy(*sense, gen->scsi_mmc_sense, gen->scsi_mmc_sense_valid); memcpy(*pp_sense, gen->scsi_mmc_sense, gen->scsi_mmc_sense_valid);
return gen->scsi_mmc_sense_valid; return gen->scsi_mmc_sense_valid;
} }

View File

@@ -54,7 +54,7 @@ static int tmmc_handle_outcome(CdIo_t *p_cdio, int i_status,
unsigned char sense_reply[18], int flag); unsigned char sense_reply[18], int flag);
static void tmmc_print_status_sense(int i_status, int sense_valid, static void tmmc_print_status_sense(int i_status, int sense_valid,
unsigned char sense_reply[18], int flag); mmc_request_sense_t *, int flag);
static int tmmc_load_eject(CdIo_t *p_cdio, int *sense_avail, static int tmmc_load_eject(CdIo_t *p_cdio, int *sense_avail,
unsigned char sense_reply[18], int flag); unsigned char sense_reply[18], int flag);
@@ -97,15 +97,17 @@ tmmc_get_disc_erasable(const CdIo_t *p_cdio, const char *psz_source,
*/ */
static void static void
tmmc_print_status_sense(int i_status, int sense_valid, tmmc_print_status_sense(int i_status, int sense_valid,
unsigned char sense[18], int flag) mmc_request_sense_t *p_sense, int flag)
{ {
if (!(flag & 1)) if (!(flag & 1))
return; return;
fprintf(stderr, "return= %d , sense(%d)", i_status, sense_valid); fprintf(stderr, "return= %d , sense(%d)", i_status, sense_valid);
if (sense_valid >= 14) if (sense_valid >= 14)
fprintf(stderr, ": KEY= %1.1X , ASC= %2.2X , ASCQ= %2.2X", fprintf(stderr, ": KEY=%s (%1.1X), ASC= %2.2X , ASCQ= %2.2X",
sense[2] & 0x0f, sense[12], sense[13]); mmc_sense_key2str[p_sense->sense_key],
if (flag & 1) p_sense->sense_key,
p_sense->asc,
p_sense->ascq);
fprintf(stderr, "\n"); fprintf(stderr, "\n");
} }
@@ -116,16 +118,16 @@ static int
tmmc_handle_outcome(CdIo_t *p_cdio, int i_status, tmmc_handle_outcome(CdIo_t *p_cdio, int i_status,
int *sense_avail, unsigned char sense_reply[18], int flag) int *sense_avail, unsigned char sense_reply[18], int flag)
{ {
unsigned char *sense = NULL; mmc_request_sense_t *p_sense = NULL;
*sense_avail = mmc_last_cmd_sense(p_cdio, &sense); *sense_avail = mmc_last_cmd_sense(p_cdio, &p_sense);
tmmc_print_status_sense(i_status, *sense_avail, sense, flag & 1); tmmc_print_status_sense(i_status, *sense_avail, p_sense, flag & 1);
if (*sense_avail >= 18) if (*sense_avail >= 18)
memcpy(sense_reply, sense, 18); memcpy(sense_reply, p_sense, 18);
else else
memset(sense_reply, 0, 18); memset(sense_reply, 0, 18);
if (sense != NULL) if (p_sense != NULL)
free(sense); free(p_sense);
return i_status; return i_status;
} }