SCSI CD-ROM fixes (NEC):
1. Added Mode Page Codes 0x00 and 0x03 (Unit Attention and Format Device) to the SCSI CD-ROM code. 2. Corrected the Read Disc Information TOC (actually Read TOC vendor unique) for NEC SCSI CD-ROMs, this, together with the fix above, fixes reading data cd-rom's using NEC vendor commands. 3. Actually identify NEC drives per manual (SCSI unknown version per the -75 and -77 manuals). 4. Re-added the 75 and 77 drives now that the NEC vendor commands are fine + an extra 25a drive with revision 1.0a (from a screenshot from vogons).
This commit is contained in:
@@ -184,7 +184,7 @@ uint8_t scsi_cdrom_command_flags[0x100] = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* 0xF0-0xFF */
|
||||
};
|
||||
|
||||
static uint64_t scsi_cdrom_mode_sense_page_flags = (GPMODEP_R_W_ERROR_PAGE | GPMODEP_DISCONNECT_PAGE | GPMODEP_CDROM_PAGE | GPMODEP_CDROM_AUDIO_PAGE | (1ULL << 0x0fULL) | GPMODEP_CAPABILITIES_PAGE | GPMODEP_ALL_PAGES);
|
||||
static uint64_t scsi_cdrom_mode_sense_page_flags = (GPMODEP_UNIT_ATN_PAGE | GPMODEP_R_W_ERROR_PAGE | GPMODEP_DISCONNECT_PAGE | GPMODEP_FORMAT_DEVICE_PAGE | GPMODEP_CDROM_PAGE | GPMODEP_CDROM_AUDIO_PAGE | (1ULL << 0x0fULL) | GPMODEP_CAPABILITIES_PAGE | GPMODEP_ALL_PAGES);
|
||||
static uint64_t scsi_cdrom_mode_sense_page_flags_sony = (GPMODEP_R_W_ERROR_PAGE | GPMODEP_DISCONNECT_PAGE | GPMODEP_CDROM_PAGE_SONY | GPMODEP_CDROM_AUDIO_PAGE_SONY | (1ULL << 0x0fULL) | GPMODEP_CAPABILITIES_PAGE | GPMODEP_ALL_PAGES);
|
||||
static uint64_t scsi_cdrom_drive_status_page_flags = ((1ULL << 0x01ULL) | (1ULL << 0x02ULL) | (1ULL << 0x0fULL) | GPMODEP_ALL_PAGES);
|
||||
|
||||
@@ -281,10 +281,10 @@ static const mode_sense_pages_t scsi_cdrom_mode_sense_pages_default = {
|
||||
};
|
||||
|
||||
static const mode_sense_pages_t scsi_cdrom_mode_sense_pages_default_scsi = {
|
||||
{{ 0, 0 },
|
||||
{{ GPMODE_UNIT_ATN_PAGE, 6, 0, 0, 0, 0, 0, 0 }, /*Guess-work*/
|
||||
{ GPMODE_R_W_ERROR_PAGE, 6, 0, 5, 0, 0, 0, 0 },
|
||||
{ GPMODE_DISCONNECT_PAGE, 0x0e, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ GPMODE_FORMAT_DEVICE_PAGE, 0x16, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
@@ -373,10 +373,10 @@ static const mode_sense_pages_t scsi_cdrom_mode_sense_pages_default_sony_scsi =
|
||||
};
|
||||
|
||||
static const mode_sense_pages_t scsi_cdrom_mode_sense_pages_changeable = {
|
||||
{{ 0, 0 },
|
||||
{{ GPMODE_UNIT_ATN_PAGE, 6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, /*Guess-work*/
|
||||
{ GPMODE_R_W_ERROR_PAGE, 6, 0xFF, 0xFF, 0, 0, 0, 0 },
|
||||
{ GPMODE_DISCONNECT_PAGE, 0x0E, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0, 0, 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ GPMODE_FORMAT_DEVICE_PAGE, 0x16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
{ 0, 0 },
|
||||
@@ -1068,7 +1068,10 @@ scsi_cdrom_command_common(scsi_cdrom_t *dev)
|
||||
case 0xdd:
|
||||
case 0xde:
|
||||
switch (dev->drv->type) {
|
||||
case CDROM_TYPE_NEC_25_10a:
|
||||
case CDROM_TYPE_NEC_38_103:
|
||||
case CDROM_TYPE_NEC_75_103:
|
||||
case CDROM_TYPE_NEC_77_106:
|
||||
case CDROM_TYPE_NEC_211_100:
|
||||
case CDROM_TYPE_NEC_464_105:
|
||||
bytes_per_second = 176.0 * 1024.0;
|
||||
@@ -1868,7 +1871,10 @@ begin:
|
||||
|
||||
case 0xDA: /*GPCMD_SPEED_ALT*/
|
||||
switch (dev->drv->type) {
|
||||
case CDROM_TYPE_NEC_25_10a:
|
||||
case CDROM_TYPE_NEC_38_103:
|
||||
case CDROM_TYPE_NEC_75_103:
|
||||
case CDROM_TYPE_NEC_77_106:
|
||||
case CDROM_TYPE_NEC_211_100:
|
||||
case CDROM_TYPE_NEC_464_105: /*GPCMD_STILL_NEC*/
|
||||
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
|
||||
@@ -2006,11 +2012,14 @@ begin:
|
||||
|
||||
case 0xDE:
|
||||
switch (dev->drv->type) {
|
||||
case CDROM_TYPE_NEC_25_10a:
|
||||
case CDROM_TYPE_NEC_38_103:
|
||||
case CDROM_TYPE_NEC_75_103:
|
||||
case CDROM_TYPE_NEC_77_106:
|
||||
case CDROM_TYPE_NEC_211_100:
|
||||
case CDROM_TYPE_NEC_464_105: /*GPCMD_READ_DISC_INFORMATION_NEC*/
|
||||
scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN);
|
||||
scsi_cdrom_buf_alloc(dev, 4);
|
||||
scsi_cdrom_buf_alloc(dev, 22); /*NEC manual claims 4 bytes, but the Android source code (namely sr_vendor.c) actually states otherwise.*/
|
||||
|
||||
if (!dev->drv->ops) {
|
||||
scsi_cdrom_not_ready(dev);
|
||||
@@ -2018,7 +2027,7 @@ begin:
|
||||
}
|
||||
|
||||
ret = cdrom_read_disc_info_toc(dev->drv, dev->buffer, cdb[2], cdb[1] & 3);
|
||||
len = 4;
|
||||
len = 22;
|
||||
if (!ret) {
|
||||
scsi_cdrom_invalid_field(dev);
|
||||
scsi_cdrom_buf_free(dev);
|
||||
@@ -2141,7 +2150,10 @@ begin:
|
||||
|
||||
if ((cdb[0] == GPCMD_READ_10) || (cdb[0] == GPCMD_READ_12)) {
|
||||
switch (dev->drv->type) {
|
||||
case CDROM_TYPE_NEC_25_10a:
|
||||
case CDROM_TYPE_NEC_38_103:
|
||||
case CDROM_TYPE_NEC_75_103:
|
||||
case CDROM_TYPE_NEC_77_106:
|
||||
case CDROM_TYPE_NEC_211_100:
|
||||
case CDROM_TYPE_NEC_464_105:
|
||||
case CDROM_TYPE_TOSHIBA_XM_3433:
|
||||
@@ -2583,7 +2595,10 @@ begin:
|
||||
|
||||
case 0xD8:
|
||||
switch (dev->drv->type) {
|
||||
case CDROM_TYPE_NEC_25_10a:
|
||||
case CDROM_TYPE_NEC_38_103:
|
||||
case CDROM_TYPE_NEC_75_103:
|
||||
case CDROM_TYPE_NEC_77_106:
|
||||
case CDROM_TYPE_NEC_211_100:
|
||||
case CDROM_TYPE_NEC_464_105: /*GPCMD_AUDIO_TRACK_SEARCH_NEC*/
|
||||
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
|
||||
@@ -2686,7 +2701,10 @@ begin:
|
||||
|
||||
case 0xD9:
|
||||
switch (dev->drv->type) {
|
||||
case CDROM_TYPE_NEC_25_10a:
|
||||
case CDROM_TYPE_NEC_38_103:
|
||||
case CDROM_TYPE_NEC_75_103:
|
||||
case CDROM_TYPE_NEC_77_106:
|
||||
case CDROM_TYPE_NEC_211_100:
|
||||
case CDROM_TYPE_NEC_464_105: /*GPCMD_PLAY_AUDIO_NEC*/
|
||||
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
|
||||
@@ -2926,7 +2944,10 @@ begin:
|
||||
|
||||
case 0xDD:
|
||||
switch (dev->drv->type) {
|
||||
case CDROM_TYPE_NEC_25_10a:
|
||||
case CDROM_TYPE_NEC_38_103:
|
||||
case CDROM_TYPE_NEC_75_103:
|
||||
case CDROM_TYPE_NEC_77_106:
|
||||
case CDROM_TYPE_NEC_211_100:
|
||||
case CDROM_TYPE_NEC_464_105: /*GPCMD_READ_SUBCODEQ_PLAYING_STATUS_NEC*/
|
||||
scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN);
|
||||
@@ -3093,7 +3114,10 @@ begin:
|
||||
|
||||
case 0xDC:
|
||||
switch (dev->drv->type) {
|
||||
case CDROM_TYPE_NEC_25_10a:
|
||||
case CDROM_TYPE_NEC_38_103:
|
||||
case CDROM_TYPE_NEC_75_103:
|
||||
case CDROM_TYPE_NEC_77_106:
|
||||
case CDROM_TYPE_NEC_211_100:
|
||||
case CDROM_TYPE_NEC_464_105: /*GPCMD_CADDY_EJECT_NEC*/
|
||||
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
|
||||
@@ -3192,17 +3216,23 @@ begin:
|
||||
case CDROM_TYPE_CHINON_CDS431_H42:
|
||||
case CDROM_TYPE_DEC_RRD45_0436:
|
||||
case CDROM_TYPE_MATSHITA_501_10b:
|
||||
case CDROM_TYPE_NEC_38_103:
|
||||
case CDROM_TYPE_NEC_211_100:
|
||||
case CDROM_TYPE_SONY_CDU541_10i:
|
||||
case CDROM_TYPE_SONY_CDU76S_100:
|
||||
case CDROM_TYPE_TEAC_CD50_100:
|
||||
case CDROM_TYPE_TEAC_R55S_10R:
|
||||
case CDROM_TYPE_TEXEL_DMXX24_100:
|
||||
case CDROM_TYPE_TOSHIBA_XM3201B_3232:
|
||||
dev->buffer[2] = 0x01;
|
||||
dev->buffer[2] = 0x00;
|
||||
dev->buffer[3] = 0x01; /*SCSI-1 compliant*/
|
||||
break;
|
||||
case CDROM_TYPE_NEC_25_10a:
|
||||
case CDROM_TYPE_NEC_38_103:
|
||||
case CDROM_TYPE_NEC_75_103:
|
||||
case CDROM_TYPE_NEC_77_106:
|
||||
case CDROM_TYPE_NEC_211_100:
|
||||
case CDROM_TYPE_NEC_464_105:
|
||||
dev->buffer[3] = 0x00; /*SCSI unknown version per NEC manuals*/
|
||||
break;
|
||||
default:
|
||||
dev->buffer[2] = 0x02; /*SCSI-2 compliant*/
|
||||
break;
|
||||
@@ -3225,6 +3255,13 @@ begin:
|
||||
case CDROM_TYPE_PIONEER_DRM604X_2403:
|
||||
dev->buffer[4] = 42;
|
||||
break;
|
||||
case CDROM_TYPE_NEC_25_10a:
|
||||
case CDROM_TYPE_NEC_38_103:
|
||||
case CDROM_TYPE_NEC_75_103:
|
||||
case CDROM_TYPE_NEC_77_106:
|
||||
case CDROM_TYPE_NEC_211_100:
|
||||
case CDROM_TYPE_NEC_464_105:
|
||||
break;
|
||||
default:
|
||||
dev->buffer[6] = 0x01; /* 16-bit transfers supported */
|
||||
dev->buffer[7] = 0x20; /* Wide bus supported */
|
||||
@@ -3345,7 +3382,10 @@ atapi_out:
|
||||
|
||||
case 0xDB:
|
||||
switch (dev->drv->type) {
|
||||
case CDROM_TYPE_NEC_25_10a:
|
||||
case CDROM_TYPE_NEC_38_103:
|
||||
case CDROM_TYPE_NEC_75_103:
|
||||
case CDROM_TYPE_NEC_77_106:
|
||||
case CDROM_TYPE_NEC_211_100:
|
||||
case CDROM_TYPE_NEC_464_105: /*GPCMD_SET_STOP_TIME_NEC*/
|
||||
scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS);
|
||||
@@ -3459,7 +3499,10 @@ atapi_out:
|
||||
dev->drv->seek_diff = ABS((int) (pos - dev->drv->seek_pos));
|
||||
if (cdb[0] == GPCMD_SEEK_10) {
|
||||
switch (dev->drv->type) {
|
||||
case CDROM_TYPE_NEC_25_10a:
|
||||
case CDROM_TYPE_NEC_38_103:
|
||||
case CDROM_TYPE_NEC_75_103:
|
||||
case CDROM_TYPE_NEC_77_106:
|
||||
case CDROM_TYPE_NEC_211_100:
|
||||
case CDROM_TYPE_NEC_464_105:
|
||||
case CDROM_TYPE_TOSHIBA_XM_3433:
|
||||
|
||||
Reference in New Issue
Block a user