Merge branch 'master' of rocky@git.sv.gnu.org:/srv/git/libcdio

This commit is contained in:
R. Bernstein
2009-12-25 19:47:22 -05:00
2 changed files with 159 additions and 151 deletions

View File

@@ -1,7 +1,5 @@
/* /*
$Id: aspi32.c,v 1.11 2008/04/21 18:30:21 karl Exp $ Copyright (C) 2004, 2005, 2008, 2009 Rocky Bernstein <rocky@gnu.org>
Copyright (C) 2004, 2005, 2008 Rocky Bernstein <rocky@gnu.org>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@@ -150,8 +148,8 @@ mciSendCommand_aspi(int id, UINT msg, DWORD flags, void *arg)
*/ */
static bool static bool
have_aspi( HMODULE *hASPI, have_aspi( HMODULE *hASPI,
long (**lpGetSupport)( void ), long (**lpGetSupport)( void ),
long (**lpSendCommand)( void* ) ) long (**lpSendCommand)( void* ) )
{ {
/* check if aspi is available */ /* check if aspi is available */
*hASPI = LoadLibrary( "wnaspi32.dll" ); *hASPI = LoadLibrary( "wnaspi32.dll" );
@@ -162,9 +160,9 @@ have_aspi( HMODULE *hASPI,
} }
*lpGetSupport = (void *) GetProcAddress( *hASPI, *lpGetSupport = (void *) GetProcAddress( *hASPI,
"GetASPI32SupportInfo" ); "GetASPI32SupportInfo" );
*lpSendCommand = (void *) GetProcAddress( *hASPI, *lpSendCommand = (void *) GetProcAddress( *hASPI,
"SendASPI32Command" ); "SendASPI32Command" );
/* make sure that we've got both function addresses */ /* make sure that we've got both function addresses */
if( *lpGetSupport == NULL || *lpSendCommand == NULL ) { if( *lpGetSupport == NULL || *lpSendCommand == NULL ) {
@@ -191,7 +189,7 @@ get_discmode_aspi (_img_private_t *p_env)
dvd.physical.type = CDIO_DVD_STRUCT_PHYSICAL; dvd.physical.type = CDIO_DVD_STRUCT_PHYSICAL;
dvd.physical.layer_num = 0; dvd.physical.layer_num = 0;
if (0 == mmc_get_dvd_struct_physical_private (p_env, &run_mmc_cmd_aspi, if (0 == mmc_get_dvd_struct_physical_private (p_env, &run_mmc_cmd_aspi,
&dvd)) { &dvd)) {
switch(dvd.physical.layer[0].book_type) { switch(dvd.physical.layer[0].book_type) {
case CDIO_DVD_BOOK_DVD_ROM: return CDIO_DISC_MODE_DVD_ROM; case CDIO_DVD_BOOK_DVD_ROM: return CDIO_DISC_MODE_DVD_ROM;
case CDIO_DVD_BOOK_DVD_RAM: return CDIO_DISC_MODE_DVD_RAM; case CDIO_DVD_BOOK_DVD_RAM: return CDIO_DISC_MODE_DVD_RAM;
@@ -217,44 +215,44 @@ get_discmode_aspi (_img_private_t *p_env)
switch(track_fmt) { switch(track_fmt) {
case TRACK_FORMAT_AUDIO: case TRACK_FORMAT_AUDIO:
switch(discmode) { switch(discmode) {
case CDIO_DISC_MODE_NO_INFO: case CDIO_DISC_MODE_NO_INFO:
discmode = CDIO_DISC_MODE_CD_DA; discmode = CDIO_DISC_MODE_CD_DA;
break; break;
case CDIO_DISC_MODE_CD_DA: case CDIO_DISC_MODE_CD_DA:
case CDIO_DISC_MODE_CD_MIXED: case CDIO_DISC_MODE_CD_MIXED:
case CDIO_DISC_MODE_ERROR: case CDIO_DISC_MODE_ERROR:
/* No change*/ /* No change*/
break; break;
default: default:
discmode = CDIO_DISC_MODE_CD_MIXED; discmode = CDIO_DISC_MODE_CD_MIXED;
} }
break; break;
case TRACK_FORMAT_XA: case TRACK_FORMAT_XA:
switch(discmode) { switch(discmode) {
case CDIO_DISC_MODE_NO_INFO: case CDIO_DISC_MODE_NO_INFO:
discmode = CDIO_DISC_MODE_CD_XA; discmode = CDIO_DISC_MODE_CD_XA;
break; break;
case CDIO_DISC_MODE_CD_XA: case CDIO_DISC_MODE_CD_XA:
case CDIO_DISC_MODE_CD_MIXED: case CDIO_DISC_MODE_CD_MIXED:
case CDIO_DISC_MODE_ERROR: case CDIO_DISC_MODE_ERROR:
/* No change*/ /* No change*/
break; break;
default: default:
discmode = CDIO_DISC_MODE_CD_MIXED; discmode = CDIO_DISC_MODE_CD_MIXED;
} }
break; break;
case TRACK_FORMAT_DATA: case TRACK_FORMAT_DATA:
switch(discmode) { switch(discmode) {
case CDIO_DISC_MODE_NO_INFO: case CDIO_DISC_MODE_NO_INFO:
discmode = CDIO_DISC_MODE_CD_DATA; discmode = CDIO_DISC_MODE_CD_DATA;
break; break;
case CDIO_DISC_MODE_CD_DATA: case CDIO_DISC_MODE_CD_DATA:
case CDIO_DISC_MODE_CD_MIXED: case CDIO_DISC_MODE_CD_MIXED:
case CDIO_DISC_MODE_ERROR: case CDIO_DISC_MODE_ERROR:
/* No change*/ /* No change*/
break; break;
default: default:
discmode = CDIO_DISC_MODE_CD_MIXED; discmode = CDIO_DISC_MODE_CD_MIXED;
} }
break; break;
case TRACK_FORMAT_ERROR: case TRACK_FORMAT_ERROR:
@@ -315,39 +313,39 @@ is_cdrom_aspi(const char drive_letter)
for(i_target=0; i_target < srbInquiry.HA_Unique[3]; i_target++) for(i_target=0; i_target < srbInquiry.HA_Unique[3]; i_target++)
{ {
int i_lun; int i_lun;
for( i_lun=0; i_lun<8; i_lun++) for( i_lun=0; i_lun<8; i_lun++)
{ {
srbDiskInfo.SRB_Cmd = SC_GET_DISK_INFO; srbDiskInfo.SRB_Cmd = SC_GET_DISK_INFO;
srbDiskInfo.SRB_Flags = 0; srbDiskInfo.SRB_Flags = 0;
srbDiskInfo.SRB_Hdr_Rsvd = 0; srbDiskInfo.SRB_Hdr_Rsvd = 0;
srbDiskInfo.SRB_HaId = i_adapter; srbDiskInfo.SRB_HaId = i_adapter;
srbDiskInfo.SRB_Target = i_target; srbDiskInfo.SRB_Target = i_target;
srbDiskInfo.SRB_Lun = i_lun; srbDiskInfo.SRB_Lun = i_lun;
lpSendCommand( (void*) &srbDiskInfo ); lpSendCommand( (void*) &srbDiskInfo );
if( (srbDiskInfo.SRB_Status == SS_COMP) && if( (srbDiskInfo.SRB_Status == SS_COMP) &&
(srbDiskInfo.SRB_Int13HDriveInfo == c_drive) ) { (srbDiskInfo.SRB_Int13HDriveInfo == c_drive) ) {
/* Make sure this is a CD-ROM device. */ /* Make sure this is a CD-ROM device. */
struct SRB_GDEVBlock srbGDEVBlock; struct SRB_GDEVBlock srbGDEVBlock;
memset( &srbGDEVBlock, 0, sizeof(struct SRB_GDEVBlock) ); memset( &srbGDEVBlock, 0, sizeof(struct SRB_GDEVBlock) );
srbGDEVBlock.SRB_Cmd = SC_GET_DEV_TYPE; srbGDEVBlock.SRB_Cmd = SC_GET_DEV_TYPE;
srbDiskInfo.SRB_HaId = i_adapter; srbDiskInfo.SRB_HaId = i_adapter;
srbGDEVBlock.SRB_Target = i_target; srbGDEVBlock.SRB_Target = i_target;
srbGDEVBlock.SRB_Lun = i_lun; srbGDEVBlock.SRB_Lun = i_lun;
lpSendCommand( (void*) &srbGDEVBlock ); lpSendCommand( (void*) &srbGDEVBlock );
if( ( srbGDEVBlock.SRB_Status == SS_COMP ) && if( ( srbGDEVBlock.SRB_Status == SS_COMP ) &&
( srbGDEVBlock.SRB_DeviceType == DTYPE_CDROM ) ) { ( srbGDEVBlock.SRB_DeviceType == DTYPE_CDROM ) ) {
sprintf( psz_win32_drive, "%c:", drive_letter ); sprintf( psz_win32_drive, "%c:", drive_letter );
FreeLibrary( hASPI ); FreeLibrary( hASPI );
return(psz_win32_drive); return(psz_win32_drive);
} }
} }
} }
} }
} }
FreeLibrary( hASPI ); FreeLibrary( hASPI );
@@ -372,7 +370,7 @@ init_aspi (_img_private_t *env)
{ {
c_drive = env->gen.source_name[0]; c_drive = env->gen.source_name[0];
} else if ( 6 == strlen(env->gen.source_name) } else if ( 6 == strlen(env->gen.source_name)
&& isalpha(env->gen.source_name[4] )) { && isalpha(env->gen.source_name[4] )) {
c_drive = env->gen.source_name[4]; c_drive = env->gen.source_name[4];
} else { } else {
c_drive = 'C'; c_drive = 'C';
@@ -416,52 +414,52 @@ init_aspi (_img_private_t *env)
for(i_target=0; i_target < srbInquiry.HA_Unique[3]; i_target++) for(i_target=0; i_target < srbInquiry.HA_Unique[3]; i_target++)
{ {
int i_lun; int i_lun;
for (i_lun = 0; i_lun < 8; i_lun++ ) { for (i_lun = 0; i_lun < 8; i_lun++ ) {
srbDiskInfo.SRB_Cmd = SC_GET_DISK_INFO; srbDiskInfo.SRB_Cmd = SC_GET_DISK_INFO;
srbDiskInfo.SRB_Flags = 0; srbDiskInfo.SRB_Flags = 0;
srbDiskInfo.SRB_Hdr_Rsvd = 0; srbDiskInfo.SRB_Hdr_Rsvd = 0;
srbDiskInfo.SRB_HaId = i_adapter; srbDiskInfo.SRB_HaId = i_adapter;
srbDiskInfo.SRB_Target = i_target; srbDiskInfo.SRB_Target = i_target;
srbDiskInfo.SRB_Lun = i_lun; srbDiskInfo.SRB_Lun = i_lun;
lpSendCommand( (void*) &srbDiskInfo ); lpSendCommand( (void*) &srbDiskInfo );
if( (srbDiskInfo.SRB_Status == SS_COMP) ) { if( (srbDiskInfo.SRB_Status == SS_COMP) ) {
if (srbDiskInfo.SRB_Int13HDriveInfo != c_drive) if (srbDiskInfo.SRB_Int13HDriveInfo != c_drive)
{ {
continue; continue;
} else { } else {
/* Make sure this is a CD-ROM device. */ /* Make sure this is a CD-ROM device. */
struct SRB_GDEVBlock srbGDEVBlock; struct SRB_GDEVBlock srbGDEVBlock;
memset( &srbGDEVBlock, 0, sizeof(struct SRB_GDEVBlock) ); memset( &srbGDEVBlock, 0, sizeof(struct SRB_GDEVBlock) );
srbGDEVBlock.SRB_Cmd = SC_GET_DEV_TYPE; srbGDEVBlock.SRB_Cmd = SC_GET_DEV_TYPE;
srbGDEVBlock.SRB_HaId = i_adapter; srbGDEVBlock.SRB_HaId = i_adapter;
srbGDEVBlock.SRB_Target = i_target; srbGDEVBlock.SRB_Target = i_target;
lpSendCommand( (void*) &srbGDEVBlock ); lpSendCommand( (void*) &srbGDEVBlock );
if( ( srbGDEVBlock.SRB_Status == SS_COMP ) && if( ( srbGDEVBlock.SRB_Status == SS_COMP ) &&
( srbGDEVBlock.SRB_DeviceType == DTYPE_CDROM ) ) { ( srbGDEVBlock.SRB_DeviceType == DTYPE_CDROM ) ) {
env->i_sid = MAKEWORD( i_adapter, i_target ); env->i_sid = MAKEWORD( i_adapter, i_target );
env->hASPI = (long)hASPI; env->hASPI = (long)hASPI;
env->lpSendCommand = lpSendCommand; env->lpSendCommand = lpSendCommand;
env->b_aspi_init = true; env->b_aspi_init = true;
env->i_lun = i_lun; env->i_lun = i_lun;
cdio_debug("Using ASPI layer"); cdio_debug("Using ASPI layer");
return true; return true;
} else { } else {
FreeLibrary( hASPI ); FreeLibrary( hASPI );
cdio_debug( "%c: is not a CD-ROM drive", cdio_debug( "%c: is not a CD-ROM drive",
env->gen.source_name[0] ); env->gen.source_name[0] );
return false; return false;
} }
} }
} }
} }
} }
} }
@@ -473,27 +471,28 @@ init_aspi (_img_private_t *env)
/*! /*!
Run a SCSI MMC command. Run a SCSI MMC command.
env private CD structure env private CD structure
i_timeout_ms time in milliseconds we will wait for the command i_timeout_ms time in milliseconds we will wait for the command
to complete. If this value is -1, use the default to complete. If this value is -1, use the default
time-out value. time-out value.
p_buf Buffer for data, both sending and receiving p_buf Buffer for data, both sending and receiving
i_buf Size of buffer i_buf Size of buffer
e_direction direction the transfer is to go. e_direction direction the transfer is to go.
cdb CDB bytes. All values that are needed should be set on cdb CDB bytes. All values that are needed should be set on
input. We'll figure out what the right CDB length should be. input. We'll figure out what the right CDB length should be.
We return 0 if command completed successfully. We return 0 if command completed successfully.
*/ */
int int
run_mmc_cmd_aspi( void *p_user_data, unsigned int i_timeout_ms, run_mmc_cmd_aspi( void *p_user_data, unsigned int i_timeout_ms,
unsigned int i_cdb, const mmc_cdb_t * p_cdb, unsigned int i_cdb, const mmc_cdb_t * p_cdb,
cdio_mmc_direction_t e_direction, cdio_mmc_direction_t e_direction,
unsigned int i_buf, /*in/out*/ void *p_buf ) unsigned int i_buf, /*in/out*/ void *p_buf )
{ {
const _img_private_t *p_env = p_user_data; _img_private_t *p_env = p_user_data;
HANDLE hEvent; HANDLE hEvent;
struct SRB_ExecSCSICmd ssc; struct SRB_ExecSCSICmd ssc;
int sense_size;
/* Create the transfer completion event */ /* Create the transfer completion event */
hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
@@ -502,6 +501,7 @@ run_mmc_cmd_aspi( void *p_user_data, unsigned int i_timeout_ms,
return 1; return 1;
} }
p_env->gen.scsi_mmc_sense_valid = 0;
memset( &ssc, 0, sizeof( ssc ) ); memset( &ssc, 0, sizeof( ssc ) );
ssc.SRB_Cmd = SC_EXEC_SCSI_CMD; ssc.SRB_Cmd = SC_EXEC_SCSI_CMD;
@@ -536,10 +536,18 @@ run_mmc_cmd_aspi( void *p_user_data, unsigned int i_timeout_ms,
/* check that the transfer went as planned */ /* check that the transfer went as planned */
if( ssc.SRB_Status != SS_COMP ) { if( ssc.SRB_Status != SS_COMP ) {
cdio_info("ASPI: %s", aspierror(ssc.SRB_Status)); cdio_info("ASPI: %s", aspierror(ssc.SRB_Status));
return 2; return DRIVER_OP_ERROR;
} else {
sense_size = ssc.SenseArea[7] + 8; /* SPC 4.5.3, Table 26:
252 bytes legal,
263 bytes possible */
if (sense_size > SENSE_LEN)
sense_size = SENSE_LEN;
memcpy((void *) p_env->gen.scsi_mmc_sense, ssc.SenseArea, sense_size);
p_env->gen.scsi_mmc_sense_valid = sense_size;
} }
return 0; return DRIVER_OP_SUCCESS;
} }
@@ -549,7 +557,7 @@ run_mmc_cmd_aspi( void *p_user_data, unsigned int i_timeout_ms,
*/ */
static int static int
read_sectors_aspi (_img_private_t *p_env, void *data, lsn_t lsn, read_sectors_aspi (_img_private_t *p_env, void *data, lsn_t lsn,
int sector_type, unsigned int nblocks) int sector_type, unsigned int nblocks)
{ {
mmc_cdb_t cdb = {{0, }}; mmc_cdb_t cdb = {{0, }};
unsigned int i_buf; unsigned int i_buf;
@@ -579,7 +587,7 @@ read_sectors_aspi (_img_private_t *p_env, void *data, lsn_t lsn,
/* ssc.CDBByte[ 9 ] = READ_CD_USERDATA_MODE2; */ /* ssc.CDBByte[ 9 ] = READ_CD_USERDATA_MODE2; */
#else #else
CDIO_MMC_SET_MAIN_CHANNEL_SELECTION_BITS(cmd, CDIO_MMC_SET_MAIN_CHANNEL_SELECTION_BITS(cmd,
CDIO_MMC_MCSB_ALL_HEADERS); CDIO_MMC_MCSB_ALL_HEADERS);
#endif #endif
switch (sector_type) { switch (sector_type) {
@@ -601,8 +609,8 @@ read_sectors_aspi (_img_private_t *p_env, void *data, lsn_t lsn,
} }
return run_mmc_cmd_aspi(p_env, OP_TIMEOUT_MS, return run_mmc_cmd_aspi(p_env, OP_TIMEOUT_MS,
mmc_get_cmd_len(cdb.field[0]), mmc_get_cmd_len(cdb.field[0]),
&cdb, SCSI_MMC_DATA_READ, i_buf*nblocks, data); &cdb, SCSI_MMC_DATA_READ, i_buf*nblocks, data);
} }
/*! /*!
@@ -611,11 +619,11 @@ read_sectors_aspi (_img_private_t *p_env, void *data, lsn_t lsn,
*/ */
int int
read_audio_sectors_aspi (_img_private_t *p_env, void *data, lsn_t lsn, read_audio_sectors_aspi (_img_private_t *p_env, void *data, lsn_t lsn,
unsigned int i_blocks) unsigned int i_blocks)
{ {
if (read_sectors_aspi(p_env, data, lsn, CDIO_MMC_READ_TYPE_CDDA, i_blocks)) { if (read_sectors_aspi(p_env, data, lsn, CDIO_MMC_READ_TYPE_CDDA, i_blocks)) {
return read_sectors_aspi(p_env, data, lsn, return read_sectors_aspi(p_env, data, lsn,
CDIO_MMC_READ_TYPE_ANY, i_blocks); CDIO_MMC_READ_TYPE_ANY, i_blocks);
} }
return 0; return 0;
} }
@@ -626,12 +634,12 @@ read_audio_sectors_aspi (_img_private_t *p_env, void *data, lsn_t lsn,
*/ */
int int
read_mode2_sector_aspi (_img_private_t *p_env, void *data, lsn_t lsn, read_mode2_sector_aspi (_img_private_t *p_env, void *data, lsn_t lsn,
bool b_form2) bool b_form2)
{ {
return read_sectors_aspi(p_env, data, lsn, b_form2 return read_sectors_aspi(p_env, data, lsn, b_form2
? CDIO_MMC_READ_TYPE_M2F2 ? CDIO_MMC_READ_TYPE_M2F2
: CDIO_MMC_READ_TYPE_M2F1, : CDIO_MMC_READ_TYPE_M2F1,
1); 1);
} }
/*! /*!
@@ -640,7 +648,7 @@ read_mode2_sector_aspi (_img_private_t *p_env, void *data, lsn_t lsn,
*/ */
int int
read_mode1_sector_aspi (_img_private_t *p_env, void *data, lsn_t lsn, read_mode1_sector_aspi (_img_private_t *p_env, void *data, lsn_t lsn,
bool b_form2) bool b_form2)
{ {
return read_sectors_aspi(p_env, data, lsn, CDIO_MMC_READ_TYPE_MODE1, 1); return read_sectors_aspi(p_env, data, lsn, CDIO_MMC_READ_TYPE_MODE1, 1);
} }
@@ -668,9 +676,9 @@ read_toc_aspi (_img_private_t *p_env)
CDIO_MMC_SET_READ_LENGTH16(cdb.field, sizeof(tocheader)); CDIO_MMC_SET_READ_LENGTH16(cdb.field, sizeof(tocheader));
i_status = run_mmc_cmd_aspi (p_env, OP_TIMEOUT_MS, i_status = run_mmc_cmd_aspi (p_env, OP_TIMEOUT_MS,
mmc_get_cmd_len(cdb.field[0]), mmc_get_cmd_len(cdb.field[0]),
&cdb, SCSI_MMC_DATA_READ, &cdb, SCSI_MMC_DATA_READ,
sizeof(tocheader), &tocheader); sizeof(tocheader), &tocheader);
if (0 != i_status) return false; if (0 != i_status) return false;
@@ -694,9 +702,9 @@ read_toc_aspi (_img_private_t *p_env)
CDIO_MMC_SET_READ_LENGTH16(cdb.field, i_toclength); CDIO_MMC_SET_READ_LENGTH16(cdb.field, i_toclength);
i_status = run_mmc_cmd_aspi (p_env, OP_TIMEOUT_MS, i_status = run_mmc_cmd_aspi (p_env, OP_TIMEOUT_MS,
mmc_get_cmd_len(cdb.field[0]), mmc_get_cmd_len(cdb.field[0]),
&cdb, SCSI_MMC_DATA_READ, &cdb, SCSI_MMC_DATA_READ,
i_toclength, p_fulltoc); i_toclength, p_fulltoc);
if( 0 != i_status ) { if( 0 != i_status ) {
p_env->gen.i_tracks = 0; p_env->gen.i_tracks = 0;
} }
@@ -706,15 +714,15 @@ read_toc_aspi (_img_private_t *p_env)
for( i = 0 ; i <= p_env->gen.i_tracks ; i++, j++ ) { for( i = 0 ; i <= p_env->gen.i_tracks ; i++, j++ ) {
int i_index = 8 + 8 * i; int i_index = 8 + 8 * i;
p_env->tocent[ i ].start_lsn = ((int)p_fulltoc[ i_index ] << 24) + p_env->tocent[ i ].start_lsn = ((int)p_fulltoc[ i_index ] << 24) +
((int)p_fulltoc[ i_index+1 ] << 16) + ((int)p_fulltoc[ i_index+1 ] << 16) +
((int)p_fulltoc[ i_index+2 ] << 8) + ((int)p_fulltoc[ i_index+2 ] << 8) +
(int)p_fulltoc[ i_index+3 ]; (int)p_fulltoc[ i_index+3 ];
p_env->tocent[i].Control = (UCHAR)p_fulltoc[ 1 + 8 * i ]; p_env->tocent[i].Control = (UCHAR)p_fulltoc[ 1 + 8 * i ];
set_track_flags(&(p_env->gen.track_flags[j]), p_env->tocent[i].Control); set_track_flags(&(p_env->gen.track_flags[j]), p_env->tocent[i].Control);
cdio_debug( "p_sectors: %i %lu", cdio_debug( "p_sectors: %i %lu",
i, (unsigned long int) p_env->tocent[i].start_lsn ); i, (unsigned long int) p_env->tocent[i].start_lsn );
} }
free( p_fulltoc ); free( p_fulltoc );
@@ -755,7 +763,7 @@ wnaspi32_eject_media (void *user_data) {
st.dwItem = MCI_STATUS_READY; st.dwItem = MCI_STATUS_READY;
/* Eject disc */ /* Eject disc */
ret = mciSendCommand_aspi( op.wDeviceID, MCI_SET, ret = mciSendCommand_aspi( op.wDeviceID, MCI_SET,
MCI_SET_DOOR_OPEN, 0 ) != 0; MCI_SET_DOOR_OPEN, 0 ) != 0;
/* Release access to the device */ /* Release access to the device */
mciSendCommand_aspi( op.wDeviceID, MCI_CLOSE, MCI_WAIT, 0 ); mciSendCommand_aspi( op.wDeviceID, MCI_CLOSE, MCI_WAIT, 0 );
} else } else

View File

@@ -1262,8 +1262,8 @@ run_mmc_cmd_linux(void *p_user_data,
/* Record SCSI sense reply for API call mmc_last_cmd_sense(). /* Record SCSI sense reply for API call mmc_last_cmd_sense().
*/ */
if (u_sense[7]) { if (u_sense[7]) {
sense_size = u_sense[7] + 8; /* SPC 4.5.3, Table 26 : sense_size = u_sense[7] + 8; /* SPC 4.5.3, Table 26:
252 bytes legal , 263 bytes possible */ 252 bytes legal, 263 bytes possible */
if (sense_size > sizeof(sense)) if (sense_size > sizeof(sense))
sense_size = sizeof(sense); sense_size = sizeof(sense);
memcpy((void *) p_env->gen.scsi_mmc_sense, &sense, sense_size); memcpy((void *) p_env->gen.scsi_mmc_sense, &sense, sense_size);