Many bug fixes, including selection fixes.
[SCSI2SD.git] / software / SCSI2SD / SCSI2SD.cydsn / inquiry.c
index f71128b..9cc8f8b 100755 (executable)
 \r
 #include "device.h"\r
 #include "scsi.h"\r
+#include "config.h"\r
 #include "inquiry.h"\r
 \r
 #include <string.h>\r
 \r
-static const uint8 StandardResponse[] =\r
+static uint8 StandardResponse[] =\r
 {\r
 0x00, // "Direct-access device". AKA standard hard disk\r
 0x00, // device type qualifier\r
 0x02, // Complies with ANSI SCSI-2.\r
-0x02, // SCSI-2 Inquiry response\r
-31, // standard length\r
+0x01, // Response format is compatible with the old CCS format.\r
+0x1f, // standard length.\r
 0, 0, //Reserved\r
-0, // We don't support anything at all\r
-/* TODO testing Apple Drive Setup. Make configurable!\r
-'c','o','d','e','s','r','c',' ',\r
-'S','C','S','I','2','S','D',' ',' ',' ',' ',' ',' ',' ',' ',' ',\r
-'2','.','0','a'\r
-*/\r
-' ','S','E','A','G','A','T','E',\r
-' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','S','T','2','2','5','N',\r
-'1','.','0',' '\r
+0 // We don't support anything at all\r
 };\r
+// Vendor set by config 'c','o','d','e','s','r','c',' ',\r
+// prodId set by config'S','C','S','I','2','S','D',' ',' ',' ',' ',' ',' ',' ',' ',' ',\r
+// Revision set by config'2','.','0','a'\r
+\r
+/* For reference, here's a dump from an Apple branded 500Mb drive from 1994.\r
+$ sudo sg_inq -H /dev/sdd --len 255\r
+standard INQUIRY:\r
+ 00     00 00 02 01 31 00 00 18  51 55 41 4e 54 55 4d 20    ....1...QUANTUM \r
+ 10     4c 50 53 32 37 30 20 20  20 20 20 20 20 20 20 20    LPS270          \r
+ 20     30 39 30 30 00 00 00 d9  b0 27 34 01 04 b3 01 1b    0900.....'4.....\r
+ 30     07 00 a0 00 00 ff                                   ......\r
+ Vendor identification: QUANTUM \r
+ Product identification: LPS270          \r
+ Product revision level: 0900\r
+*/\r
+\r
 \r
 static const uint8 SupportedVitalPages[] =\r
 {\r
@@ -89,7 +98,7 @@ void scsiInquiry()
        uint8 lun = scsiDev.cdb[1] >> 5;\r
        uint32 allocationLength = scsiDev.cdb[4];\r
        if (allocationLength == 0) allocationLength = 256;\r
-\r
+       \r
        if (!evpd)\r
        {\r
                if (pageCode)\r
@@ -103,7 +112,13 @@ void scsiInquiry()
                else\r
                {\r
                        memcpy(scsiDev.data, StandardResponse, sizeof(StandardResponse));\r
-                       scsiDev.dataLen = sizeof(StandardResponse);\r
+                       memcpy(&scsiDev.data[8], config->vendor, sizeof(config->vendor));\r
+                       memcpy(&scsiDev.data[16], config->prodId, sizeof(config->prodId));\r
+                       memcpy(&scsiDev.data[32], config->revision, sizeof(config->revision));\r
+                       scsiDev.dataLen = sizeof(StandardResponse) +\r
+                               sizeof(config->vendor) +\r
+                               sizeof(config->prodId) +\r
+                               sizeof(config->revision);\r
                        scsiDev.phase = DATA_IN;\r
                        \r
                        if (!lun) scsiDev.unitAttention = 0;\r
@@ -149,13 +164,23 @@ void scsiInquiry()
        }\r
 \r
 \r
-       if (scsiDev.phase == DATA_IN && scsiDev.dataLen > allocationLength)\r
+       if (scsiDev.phase == DATA_IN)\r
        {\r
-               // Spec 8.2.5 requires us to simply truncate the response.\r
+               // "real" hard drives send back exactly allocationLenth bytes, padded\r
+               // with zeroes. This only seems to happen for Inquiry responses, and not\r
+               // other commands that also supply an allocation length such as Mode Sense or\r
+               // Request Sense.\r
+               if (scsiDev.dataLen < allocationLength)\r
+               {\r
+                       memset(\r
+                               &scsiDev.data[scsiDev.dataLen],\r
+                               0,\r
+                               allocationLength - scsiDev.dataLen);\r
+               }\r
+               // Spec 8.2.5 requires us to simply truncate the response if it's too big.\r
                scsiDev.dataLen = allocationLength;\r
        }\r
 \r
-\r
        // Set the first byte to indicate LUN presence.\r
        if (lun) // We only support lun 0\r
        {\r