// scsiDev.dataLen bytes are in scsiDev.data\r
\r
int idx;\r
- if (scsiDev.cdb[0] == 0x15)\r
+ int blockDescLen;\r
+ if (scsiDev.cdb[0] == 0x55)\r
{\r
- int blockDescLen =\r
+ blockDescLen =\r
(((uint16_t)scsiDev.data[6]) << 8) |scsiDev.data[7];\r
- idx = 8 + blockDescLen;\r
+ idx = 8;\r
}\r
else\r
{\r
- int blockDescLen = scsiDev.data[3];\r
- idx = 4 + blockDescLen;\r
+ blockDescLen = scsiDev.data[3];\r
+ idx = 4;\r
}\r
- if (idx > scsiDev.dataLen) goto bad;\r
+ \r
+ // The unwritten rule. Blocksizes are normally set using the\r
+ // block descriptor value, not by changing page 0x03.\r
+ if (blockDescLen >= 8)\r
+ {\r
+ uint32_t bytesPerSector =\r
+ (((uint32_t)scsiDev.data[idx+5]) << 16) |\r
+ (((uint32_t)scsiDev.data[idx+6]) << 8) |\r
+ scsiDev.data[idx+7];\r
+ if ((bytesPerSector < MIN_SECTOR_SIZE) ||\r
+ (bytesPerSector > MAX_SECTOR_SIZE))\r
+ {\r
+ goto bad;\r
+ }\r
+ else if (bytesPerSector != config->bytesPerSector)\r
+ {\r
+ config->bytesPerSector = bytesPerSector;\r
+ configSave();\r
+ }\r
+ }\r
+ idx += blockDescLen;\r
\r
while (idx < scsiDev.dataLen)\r
{\r
}\r
}\r
break;\r
- default:\r
- goto bad;\r
+ //default:\r
+ \r
+ // Easiest to just ignore for now. We'll get here when changing\r
+ // the SCSI block size via the descriptor header.\r
}\r
+ idx += 2 + pageLen;\r
}\r
}\r
\r
if ((scsiDev.dataPtr >= scsiDev.dataLen) &&\r
(transfer.currentBlock == transfer.blocks))\r
{\r
- if (scsiDev.postDataOutHook != NULL)\r
- {\r
- scsiDev.postDataOutHook();\r
- }\r
- else\r
- {\r
- enter_Status(GOOD);\r
- }\r
+ enter_Status(GOOD);\r
}\r
}\r
\r
if ((scsiDev.dataPtr >= scsiDev.dataLen) &&\r
(transfer.currentBlock == transfer.blocks))\r
{\r
- enter_Status(GOOD);\r
+ if (scsiDev.postDataOutHook != NULL)\r
+ {\r
+ scsiDev.postDataOutHook();\r
+ }\r
+ else\r
+ {\r
+ enter_Status(GOOD);\r
+ }\r
}\r
}\r
\r