]> localhost Git - SCSI2SD-V6.git/commitdiff
Experiment to initiate sync negotiate initiateNegotiate
authorMichael McMaster <michael@codesrc.com>
Fri, 4 Feb 2022 10:53:38 +0000 (20:53 +1000)
committerMichael McMaster <michael@codesrc.com>
Fri, 4 Feb 2022 10:53:38 +0000 (20:53 +1000)
src/firmware/config.c
src/firmware/scsi.c
src/firmware/scsi.h

index 451ad623a4037bcaa542292c8803706be4d26db1..d39a8c26a142de6edc3bb2c29e0b4a7bc955b206 100755 (executable)
@@ -229,9 +229,9 @@ debugCommand()
     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
index 930e87d93217d63f6a4c80b260c83fa03c547f46..997e89c9edf7f3d20015e185a16e2d7a7ef1938b 100755 (executable)
@@ -366,6 +366,7 @@ static void process_Command()
        else if (command == 0x12)\r
        {\r
                s2s_scsiInquiry();\r
+               scsiDev.target->syncNegotiationAttempted = 0;\r
        }\r
        else if (command == 0x03)\r
        {\r
@@ -586,6 +587,7 @@ static void scsiReset()
        {\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
@@ -746,6 +748,20 @@ static void process_SelectionPhase()
        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
@@ -797,6 +813,7 @@ static void process_MessageOut()
                // 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
@@ -892,6 +909,7 @@ static void process_MessageOut()
                        // 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
@@ -901,6 +919,11 @@ static void process_MessageOut()
                        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
@@ -960,16 +983,7 @@ static void process_MessageOut()
                                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
@@ -1059,6 +1073,19 @@ void scsiPoll(void)
                {\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
@@ -1164,6 +1191,7 @@ void scsiInit()
 \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
index 77d67fc0a50f08d487eee94400aefbf6b284e0e6..4f0e03ea866cf2cf4e89efaefb65c04c37b9960a 100755 (executable)
@@ -101,8 +101,10 @@ typedef struct
 
        uint8_t syncOffset;
        uint8_t syncPeriod;
+       uint8_t syncNegotiationAttempted;
 
        uint8_t started; // Controlled by START STOP UNIT
+
 } TargetState;
 
 typedef struct