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:
Patrick Mackinlay 2019-01-10 17:28:06 +07:00
parent 6ec20a685c
commit 22923b0653

View File

@ -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();