summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/nscsi_hd.cpp
diff options
context:
space:
mode:
author Patrick Mackinlay <pmackinlay@hotmail.com>2019-01-10 17:28:06 +0700
committer Patrick Mackinlay <pmackinlay@hotmail.com>2019-01-10 17:28:06 +0700
commit22923b065312e27ebd48a8715c92761d765c4936 (patch)
tree0db4c7ea7031914c326fca0765ace2808ecd7a5a /src/devices/machine/nscsi_hd.cpp
parent6ec20a685c140625d763ab4bccdd0b0f7a2340dd (diff)
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
Diffstat (limited to 'src/devices/machine/nscsi_hd.cpp')
-rw-r--r--src/devices/machine/nscsi_hd.cpp81
1 files changed, 73 insertions, 8 deletions
diff --git a/src/devices/machine/nscsi_hd.cpp b/src/devices/machine/nscsi_hd.cpp
index b623d105da3..fd8cebdc77c 100644
--- a/src/devices/machine/nscsi_hd.cpp
+++ b/src/devices/machine/nscsi_hd.cpp
@@ -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();