response[15] = scsiDev.lastSense;\r
response[16] = scsiDev.phase;\r
response[17] = *SCSI_STS_SCSI;\r
- response[18] = scsiDev.target != NULL ? scsiDev.target->syncOffset : 0;\r
- response[19] = scsiDev.target != NULL ? scsiDev.target->syncPeriod : 0;\r
- response[20] = scsiDev.minSyncPeriod;\r
+ response[18] = scsiDev.targets[0].syncOffset;// != NULL ? scsiDev.target->syncOffset : 0;\r
+ response[19] = scsiDev.targets[1].syncOffset;//!= NULL ? scsiDev.target->syncPeriod : 0;\r
+ response[20] = 0xAA;\r
response[21] = scsiDev.rstCount;\r
response[22] = scsiDev.selCount;\r
response[23] = scsiDev.msgCount;\r
else if (command == 0x12)\r
{\r
s2s_scsiInquiry();\r
+ scsiDev.target->syncNegotiationAttempted = 0;\r
}\r
else if (command == 0x03)\r
{\r
{\r
scsiDev.targets[i].syncOffset = 0;\r
scsiDev.targets[i].syncPeriod = 0;\r
+ scsiDev.targets[i].syncNegotiationAttempted = 0;\r
}\r
scsiDev.minSyncPeriod = 0;\r
\r
scsiDev.selFlag = 0;\r
}\r
\r
+static void sendSyncMessage()\r
+{\r
+ scsiEnterPhase(MESSAGE_IN);\r
+ uint8_t SDTR[] = {0x01, 0x03, 0x01, scsiDev.target->syncPeriod, scsiDev.target->syncOffset};\r
+ scsiWrite(SDTR, sizeof(SDTR));\r
+ scsiDev.needSyncNegotiationAck = 1; // Check if this message is rejected.\r
+ scsiDev.sdUnderrunCount = 0; // reset counter, may work now.\r
+\r
+ // Set to the theoretical speed, then adjust if we measure lower\r
+ // actual speeds.\r
+ scsiDev.hostSpeedKBs = s2s_getScsiRateKBs();\r
+ scsiDev.hostSpeedMeasured = 0;\r
+}\r
+\r
static void process_MessageOut()\r
{\r
int wasNeedSyncNegotiationAck = scsiDev.needSyncNegotiationAck;\r
// Cancel any sync negotiation\r
scsiDev.target->syncOffset = 0;\r
scsiDev.target->syncPeriod = 0;\r
+ scsiDev.target->syncNegotiationAttempted = 0;\r
\r
enter_BusFree();\r
}\r
// SDTR becomes invalidated.\r
scsiDev.target->syncOffset = 0;\r
scsiDev.target->syncPeriod = 0;\r
+ scsiDev.targets[i].syncNegotiationAttempted = 0;\r
}\r
else if (extmsg[0] == 1 && msgLen == 3) // Synchronous data request\r
{\r
int transferPeriod = extmsg[1];\r
int offset = extmsg[2];\r
\r
+ if (offset > 0)\r
+ {\r
+ scsiDev.targets[i].syncNegotiationAttempted = 1;\r
+ }\r
+\r
if ((\r
(transferPeriod > 0) &&\r
(transferPeriod < scsiDev.minSyncPeriod)) ||\r
scsiDev.target->syncOffset != oldOffset ||\r
!wasNeedSyncNegotiationAck) // Don't get into infinite loops negotiating.\r
{\r
- scsiEnterPhase(MESSAGE_IN);\r
- uint8_t SDTR[] = {0x01, 0x03, 0x01, scsiDev.target->syncPeriod, scsiDev.target->syncOffset};\r
- scsiWrite(SDTR, sizeof(SDTR));\r
- scsiDev.needSyncNegotiationAck = 1; // Check if this message is rejected.\r
- scsiDev.sdUnderrunCount = 0; // reset counter, may work now.\r
-\r
- // Set to the theoretical speed, then adjust if we measure lower\r
- // actual speeds.\r
- scsiDev.hostSpeedKBs = s2s_getScsiRateKBs();\r
- scsiDev.hostSpeedMeasured = 0;\r
+ sendSyncMessage();\r
}\r
}\r
else\r
{\r
process_MessageOut();\r
}\r
+ else if (!scsiDev.target->syncNegotiationAttempted && scsiDev.target->syncOffset == 0 &&\r
+ scsiDev.compatMode >= COMPAT_SCSI2)// &&\r
+ //(scsiDev.boardCfg.scsiSpeed == S2S_CFG_SPEED_NoLimit ||\r
+ // scsiDev.boardCfg.scsiSpeed >= S2S_CFG_SPEED_SYNC_5))\r
+ {\r
+ scsiDev.target->syncPeriod = 25;\r
+ scsiDev.target->syncOffset= 15;\r
+ \r
+ scsiDev.target->syncNegotiationAttempted = 1;\r
+ sendSyncMessage();\r
+ s2s_delay_us(2);\r
+ scsiDev.atnFlag |= scsiStatusATN();\r
+ }\r
else\r
{\r
process_Command();\r
\r
scsiDev.targets[i].syncOffset = 0;\r
scsiDev.targets[i].syncPeriod = 0;\r
+ scsiDev.targets[i].syncNegotiationAttempted = 0;\r
\r
// Always "start" the device. Many systems (eg. Apple System 7)\r
// won't respond properly to\r