mirror of
https://github.com/holub/mame
synced 2025-10-05 08:41:31 +03:00
nscsi_hd: stubs some mode pages (nw)
The mips systems complain if hard disks don't support these pages and allow mode select on some of them. * add stubs for some mode pages * detect and report an error for unsupported pages * accept and ignore mode select command
This commit is contained in:
parent
6ec20a685c
commit
22923b0653
@ -228,8 +228,10 @@ void nscsi_harddisk_device::scsi_command()
|
||||
|
||||
int pmax = page == 0x3f ? 0x3e : page;
|
||||
int pmin = page == 0x3f ? 0x00 : page;
|
||||
for(int page=pmax; page >= pmin; page--) {
|
||||
switch(page) {
|
||||
|
||||
bool fail = false;
|
||||
for(int p=pmax; p >= pmin; p--) {
|
||||
switch(p) {
|
||||
case 0x00: // Unit attention parameters page (weird)
|
||||
scsi_cmdbuf[pos++] = 0x80; // PS, page id
|
||||
scsi_cmdbuf[pos++] = 0x02; // Page length
|
||||
@ -237,6 +239,40 @@ void nscsi_harddisk_device::scsi_command()
|
||||
scsi_cmdbuf[pos++] = 0x00; // Double meh
|
||||
break;
|
||||
|
||||
case 0x01: // read-write error recovery page
|
||||
scsi_cmdbuf[pos++] = 0x01; // !PS, page id
|
||||
scsi_cmdbuf[pos++] = 0x0a; // page length
|
||||
scsi_cmdbuf[pos++] = 0; // various bits
|
||||
scsi_cmdbuf[pos++] = 0; // read retry count
|
||||
scsi_cmdbuf[pos++] = 0; // correction span
|
||||
scsi_cmdbuf[pos++] = 0; // head offset count
|
||||
scsi_cmdbuf[pos++] = 0; // data strobe offset count
|
||||
scsi_cmdbuf[pos++] = 0; // reserved
|
||||
scsi_cmdbuf[pos++] = 0; // write retry count
|
||||
scsi_cmdbuf[pos++] = 0; // reserved
|
||||
scsi_cmdbuf[pos++] = 0; // recovery time limit (msb)
|
||||
scsi_cmdbuf[pos++] = 0; // recovery time limit (lsb)
|
||||
break;
|
||||
|
||||
case 0x02: // disconnect-reconnect page
|
||||
scsi_cmdbuf[pos++] = 0x02; // !PS, page id
|
||||
scsi_cmdbuf[pos++] = 0x0e; // page length
|
||||
scsi_cmdbuf[pos++] = 0; // buffer full ratio
|
||||
scsi_cmdbuf[pos++] = 0; // buffer empty ratio
|
||||
scsi_cmdbuf[pos++] = 0; // bus inactivity limit (msb)
|
||||
scsi_cmdbuf[pos++] = 0; // bus inactivity limit (lsb)
|
||||
scsi_cmdbuf[pos++] = 0; // disconnect time limit (msb)
|
||||
scsi_cmdbuf[pos++] = 0; // disconnect time limit (lsb)
|
||||
scsi_cmdbuf[pos++] = 0; // connect time limit (msb)
|
||||
scsi_cmdbuf[pos++] = 0; // connect time limit (lsb)
|
||||
scsi_cmdbuf[pos++] = 0; // maximum burst size (msb)
|
||||
scsi_cmdbuf[pos++] = 0; // maximum burst size (lsb)
|
||||
scsi_cmdbuf[pos++] = 0; // reserved
|
||||
scsi_cmdbuf[pos++] = 0; // reserved
|
||||
scsi_cmdbuf[pos++] = 0; // reserved
|
||||
scsi_cmdbuf[pos++] = 0; // reserved
|
||||
break;
|
||||
|
||||
case 0x03: { // Format parameters page
|
||||
scsi_cmdbuf[pos++] = 0x83; // PS, page id
|
||||
scsi_cmdbuf[pos++] = 0x16; // Page length
|
||||
@ -293,6 +329,21 @@ void nscsi_harddisk_device::scsi_command()
|
||||
break;
|
||||
}
|
||||
|
||||
case 0x08: // caching page
|
||||
scsi_cmdbuf[pos++] = 0x08; // !PS, page id
|
||||
scsi_cmdbuf[pos++] = 0x0a; // page length
|
||||
scsi_cmdbuf[pos++] = 0;
|
||||
scsi_cmdbuf[pos++] = 0;
|
||||
scsi_cmdbuf[pos++] = 0;
|
||||
scsi_cmdbuf[pos++] = 0;
|
||||
scsi_cmdbuf[pos++] = 0;
|
||||
scsi_cmdbuf[pos++] = 0;
|
||||
scsi_cmdbuf[pos++] = 0;
|
||||
scsi_cmdbuf[pos++] = 0;
|
||||
scsi_cmdbuf[pos++] = 0;
|
||||
scsi_cmdbuf[pos++] = 0;
|
||||
break;
|
||||
|
||||
case 0x30: { // Apple firmware ID page
|
||||
scsi_cmdbuf[pos++] = 0xb0; // cPS, page id
|
||||
scsi_cmdbuf[pos++] = 0x16; // Page length
|
||||
@ -322,16 +373,25 @@ void nscsi_harddisk_device::scsi_command()
|
||||
}
|
||||
|
||||
default:
|
||||
LOG("mode sense page %02x unhandled\n", page);
|
||||
if (page != 0x3f) {
|
||||
LOG("mode sense page %02x unhandled\n", page);
|
||||
fail = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
scsi_cmdbuf[0] = pos;
|
||||
if(pos > size)
|
||||
pos = size;
|
||||
|
||||
scsi_data_in(0, pos);
|
||||
scsi_status_complete(SS_GOOD);
|
||||
if (!fail) {
|
||||
scsi_cmdbuf[0] = pos;
|
||||
if (pos > size)
|
||||
pos = size;
|
||||
|
||||
scsi_data_in(0, pos);
|
||||
scsi_status_complete(SS_GOOD);
|
||||
} else {
|
||||
scsi_status_complete(SS_CHECK_CONDITION);
|
||||
sense(false, SK_ILLEGAL_REQUEST, SK_ASC_INVALID_FIELD_IN_CDB);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@ -401,6 +461,11 @@ void nscsi_harddisk_device::scsi_command()
|
||||
scsi_status_complete(SS_GOOD);
|
||||
break;
|
||||
|
||||
case SC_MODE_SELECT_6:
|
||||
LOG("command MODE SELECT\n");
|
||||
scsi_status_complete(SS_GOOD);
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG("command %02x ***UNKNOWN***\n", scsi_cmdbuf[0]);
|
||||
nscsi_full_device::scsi_command();
|
||||
|
Loading…
Reference in New Issue
Block a user