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:
@@ -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.
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user