mmc.h: Big endian bytes is not the same as big_endian bitfield
mmc.c: more pervasive use of cdio's mmc definitions.
This commit is contained in:
@@ -35,6 +35,11 @@
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/* On GNU/Linux see <linux/byteorder/big_endian.h> */
|
||||
#ifndef __BIG_ENDIAN_BITFIELD
|
||||
#define __MMC_BIG_ENDIAN_BITFIELD
|
||||
#endif
|
||||
|
||||
/**
|
||||
Structure of a SCSI/MMC sense reply.
|
||||
|
||||
@@ -44,7 +49,7 @@ extern "C" {
|
||||
SPC 4.5.3, Table 26.
|
||||
*/
|
||||
typedef struct mmc_request_sense {
|
||||
#if defined(WORDS_BIGENDIAN)
|
||||
#if defined(__MMC_BIG_ENDIAN_BITFIELD)
|
||||
uint8_t valid : 1; /**< valid bit is 1 if info is valid */
|
||||
uint8_t error_code : 7;
|
||||
#else
|
||||
@@ -52,7 +57,7 @@ extern "C" {
|
||||
uint8_t valid : 1; /**< valid bit is 1 if info is valid */
|
||||
#endif
|
||||
uint8_t segment_number;
|
||||
#if defined(WORDS_BIGENDIAN)
|
||||
#if defined(__MMC_BIG_ENDIAN_BITFIELD)
|
||||
uint8_t filemark : 1; /**< manditory in sequential
|
||||
* access devices */
|
||||
uint8_t eom : 1; /**< end of medium. manditory in
|
||||
|
||||
@@ -423,7 +423,7 @@ mmc_mode_sense_6( CdIo_t *p_cdio, void *p_buf, int i_size, int page)
|
||||
|
||||
CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_MODE_SENSE_6);
|
||||
|
||||
cdb.field[2] = 0x3F & page;
|
||||
cdb.field[2] = CDIO_MMC_ALL_PAGES & page;
|
||||
cdb.field[4] = i_size;
|
||||
|
||||
return p_cdio->op.run_mmc_cmd (p_cdio->env,
|
||||
@@ -455,7 +455,7 @@ mmc_mode_sense_10( CdIo_t *p_cdio, void *p_buf, int i_size, int page)
|
||||
CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_MODE_SENSE_10);
|
||||
CDIO_MMC_SET_READ_LENGTH16(cdb.field, i_size);
|
||||
|
||||
cdb.field[2] = 0x3F & page;
|
||||
cdb.field[2] = CDIO_MMC_ALL_PAGES & page;
|
||||
|
||||
return p_cdio->op.run_mmc_cmd (p_cdio->env,
|
||||
mmc_timeout_ms,
|
||||
@@ -1095,13 +1095,13 @@ mmc_last_cmd_sense( const CdIo_t *p_cdio, unsigned char **sense)
|
||||
*/
|
||||
driver_return_code_t
|
||||
mmc_run_cmd( const CdIo_t *p_cdio, unsigned int i_timeout_ms,
|
||||
const mmc_cdb_t *p_cdb,
|
||||
cdio_mmc_direction_t e_direction, unsigned int i_buf,
|
||||
/*in/out*/ void *p_buf )
|
||||
const mmc_cdb_t *p_cdb,
|
||||
cdio_mmc_direction_t e_direction, unsigned int i_buf,
|
||||
/*in/out*/ void *p_buf )
|
||||
{
|
||||
if (!p_cdio) return DRIVER_OP_UNINIT;
|
||||
if (!p_cdio->op.run_mmc_cmd) return DRIVER_OP_UNSUPPORTED;
|
||||
return p_cdio->op.run_mmc_cmd(p_cdio->env, i_timeout_ms,
|
||||
if (!p_cdio) return DRIVER_OP_UNINIT;
|
||||
if (!p_cdio->op.run_mmc_cmd) return DRIVER_OP_UNSUPPORTED;
|
||||
return p_cdio->op.run_mmc_cmd(p_cdio->env, i_timeout_ms,
|
||||
mmc_get_cmd_len(p_cdb->field[0]),
|
||||
p_cdb, e_direction, i_buf, p_buf);
|
||||
}
|
||||
|
||||
@@ -208,30 +208,25 @@ tmmc_load_eject(CdIo_t *p_cdio, int *sense_avail,
|
||||
@return return value of mmc_run_cmd(),
|
||||
or other driver_return_code_t
|
||||
*/
|
||||
static int
|
||||
static driver_return_code_t
|
||||
tmmc_mode_sense(CdIo_t *p_cdio, int *sense_avail,unsigned char sense_reply[18],
|
||||
int page_code, int subpage_code, int alloc_len,
|
||||
unsigned char *buf, int *buf_fill, int flag)
|
||||
{
|
||||
int i_status;
|
||||
driver_return_code_t i_status;
|
||||
mmc_cdb_t cdb = {{0, }};
|
||||
|
||||
if (alloc_len < 10)
|
||||
return DRIVER_OP_BAD_PARAMETER;
|
||||
|
||||
memset(cdb.field, 0, 10);
|
||||
cdb.field[0] = 0x5a; /* MODE SENSE(10), SPC-3 6.10 */
|
||||
cdb.field[2] = page_code & 0x3f; /* PC=0 : Current values */
|
||||
cdb.field[3] = subpage_code & 0xff;
|
||||
cdb.field[7] = (alloc_len >> 8) & 0xff;
|
||||
cdb.field[8] = alloc_len & 0xff;
|
||||
mmc_mode_sense_10(p_cdio, buf, alloc_len, page_code);
|
||||
if (flag & 1)
|
||||
fprintf(stderr, "tmmc_mode_sense(0x%X, %X, %d) ... ",
|
||||
(unsigned int) page_code, (unsigned int) subpage_code, alloc_len);
|
||||
i_status = mmc_run_cmd(p_cdio, 10000, &cdb, SCSI_MMC_DATA_READ,
|
||||
alloc_len, buf);
|
||||
tmmc_handle_outcome(p_cdio, i_status, sense_avail, sense_reply, flag & 1);
|
||||
if (i_status != 0)
|
||||
if (DRIVER_OP_SUCCESS != i_status)
|
||||
return i_status;
|
||||
if (flag & 2)
|
||||
*buf_fill = buf[9] + 10; /* MMC-5 7.2.3 */
|
||||
@@ -276,11 +271,9 @@ tmmc_mode_select(CdIo_t *p_cdio,
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
memset(cdb.field, 0, 10);
|
||||
cdb.field[0] = 0x55; /* MODE SELECT(10), SPC-3 6.8 */
|
||||
CDIO_MMC_SET_COMMAND(cdb.field, CDIO_MMC_GPCMD_MODE_SELECT_10); /* SPC-3 6.8 */
|
||||
cdb.field[1] = 0x10; /* PF = 1 : official SCSI mode page */
|
||||
cdb.field[7] = (buf_fill >> 8) & 0xff;
|
||||
cdb.field[8] = buf_fill & 0xff;
|
||||
CDIO_MMC_SET_READ_LENGTH16(cdb.field, buf_fill);
|
||||
if (flag & 1)
|
||||
fprintf(stderr, "tmmc_mode_select(0x%X, %d, %d) ... ",
|
||||
(unsigned int) buf[8], (unsigned int) buf[9], buf_fill);
|
||||
@@ -305,6 +298,7 @@ tmmc_wait_for_drive(CdIo_t *p_cdio, int max_tries, int flag)
|
||||
{
|
||||
int ret, i, sense_avail;
|
||||
unsigned char sense_reply[18];
|
||||
mmc_request_sense_t *p_sense_reply = (mmc_request_sense_t *) sense_reply;
|
||||
|
||||
for (i = 0; i < max_tries; i++) {
|
||||
ret = tmmc_test_unit_ready(p_cdio, &sense_avail, sense_reply, flag & 1);
|
||||
@@ -312,23 +306,22 @@ tmmc_wait_for_drive(CdIo_t *p_cdio, int max_tries, int flag)
|
||||
return 1;
|
||||
if (sense_avail < 18)
|
||||
return -1;
|
||||
sense_reply[2] &= 0xf;
|
||||
if (sense_reply[2] == 2 && sense_reply[12] == 0x04) {
|
||||
if (p_sense_reply->sense_key == 2 && sense_reply[12] == 0x04) {
|
||||
|
||||
/* Not ready */;
|
||||
|
||||
} else if (sense_reply[2] == 6 && sense_reply[12] == 0x28
|
||||
} else if (p_sense_reply->sense_key == 6 && sense_reply[12] == 0x28
|
||||
&& sense_reply[13] == 0x00) {
|
||||
|
||||
/* Media change notice = try again */;
|
||||
|
||||
} else if (sense_reply[2] == 2 && sense_reply[12] == 0x3a) {
|
||||
} else if (p_sense_reply->sense_key == 2 && sense_reply[12] == 0x3a) {
|
||||
|
||||
/* Medium not present */;
|
||||
|
||||
if (!(flag & 2))
|
||||
return 1;
|
||||
} else if (sense_reply[2] == 0 && sense_reply[12] == 0) {
|
||||
} else if (p_sense_reply->sense_key == 0 && sense_reply[12] == 0) {
|
||||
|
||||
/* Error with no sense */;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user