static int doTestUnitReady()\r
{\r
int ready = 1;\r
- if (likely(blockDev.state == (DISK_STARTED | DISK_PRESENT | DISK_INITIALISED)))\r
+ if (likely(blockDev.state == (DISK_PRESENT | DISK_INITIALISED) &&\r
+ scsiDev.target->started))\r
{\r
// nothing to do.\r
}\r
- else if (unlikely(!(blockDev.state & DISK_STARTED)))\r
+ else if (unlikely(!scsiDev.target->started))\r
{\r
ready = 0;\r
scsiDev.status = CHECK_CONDITION;\r
}\r
else if (start)\r
{\r
- blockDev.state = blockDev.state | DISK_STARTED;\r
+ scsiDev.target->started = 1;\r
if (!(blockDev.state & DISK_INITIALISED))\r
{\r
doSdInit();\r
}\r
else\r
{\r
- blockDev.state &= ~DISK_STARTED;\r
+ scsiDev.target->started = 0;\r
}\r
}\r
else if (unlikely(command == 0x00))\r
void scsiDiskInit()\r
{\r
scsiDiskReset();\r
-\r
- // Don't require the host to send us a START STOP UNIT command\r
- blockDev.state = DISK_STARTED;\r
}\r
\r
typedef enum
{
- DISK_STARTED = 1, // Controlled via START STOP UNIT
+ // DISK_STARTED is stored per-target now as it's controlled by the
+ // START STOP UNIT command
+ OBSOLETE_DISK_STARTED = 1,
DISK_PRESENT = 2, // SD card is physically present
DISK_INITIALISED = 4, // SD card responded to init sequence
DISK_WP = 8 // Write-protect.
\r
scsiDev.targets[i].syncOffset = 0;\r
scsiDev.targets[i].syncPeriod = 0;\r
+\r
+ // Always "start" the device. Many systems (eg. Apple System 7)\r
+ // won't respond properly to\r
+ // LOGICAL_UNIT_NOT_READY_INITIALIZING_COMMAND_REQUIRED sense\r
+ // code\r
+ scsiDev.targets[i].started = 1;\r
}\r
firstInit = 0;\r
}\r
uint8_t syncOffset;
uint8_t syncPeriod;
+
+ uint8_t started; // Controlled by START STOP UNIT
} TargetState;
typedef struct
blockDev.state &= ~DISK_WP;\r
}\r
\r
- // Always "start" the device. Many systems (eg. Apple System 7)\r
- // won't respond properly to\r
- // LOGICAL_UNIT_NOT_READY_INITIALIZING_COMMAND_REQUIRED sense\r
- // code, even if they stopped it first with\r
- // START STOP UNIT command.\r
- blockDev.state |= DISK_STARTED;\r
-\r
result = 1;\r
\r
s2s_ledOff();\r