Просмотр исходного кода

Reduce delays for busfree and also after enterphaseImmediate

Per Mårtensson 1 месяц назад
Родитель
Сommit
92ce4ce2ce

+ 13 - 1
lib/BlueSCSI_platform_RP2MCU/BlueSCSI_platform_gpio_v2.h

@@ -169,7 +169,19 @@ extern uint32_t SCSI_ACCEL_PINMASK;
                        delay(1), \
     sio_hw->gpio_oe_clr = (1 << SCSI_OUT_CD) | \
                           (1 << SCSI_OUT_MSG)
-
+                          
+#define SCSI_RELEASE_OUTPUTS_XEBEC() \
+    SCSI_RELEASE_DATA_REQ(), \
+    sio_hw->gpio_set = (1 << SCSI_OUT_IO) | \
+                       (1 << SCSI_OUT_CD) | \
+                       (1 << SCSI_OUT_MSG) | \
+                       (1 << SCSI_OUT_RST) | \
+                       (1 << SCSI_OUT_BSY) | \
+                       (1 << SCSI_OUT_REQ) | \
+                       (1 << SCSI_OUT_SEL), \
+                       delay_ns(200), \
+    sio_hw->gpio_oe_clr = (1 << SCSI_OUT_CD) | \
+                          (1 << SCSI_OUT_MSG)
 // Read SCSI data bus
 #define SCSI_IN_DATA() \
     (~sio_hw->gpio_in & SCSI_IO_DATA_MASK) >> SCSI_IO_SHIFT

+ 18 - 2
lib/BlueSCSI_platform_RP2MCU/scsiPhy.cpp

@@ -275,7 +275,12 @@ extern "C" uint32_t scsiEnterPhaseImmediate(int phase)
             if (scsiDev.compatMode < COMPAT_SCSI2)
             {
                 // EMU EMAX needs 100uS ! 10uS is not enough.
-                delayNs += 100000;
+                // However, Xebec controllers don't need this delay and can cause blocks
+                if (scsiDev.target && scsiDev.target->cfg && 
+                    scsiDev.target->cfg->quirks != S2S_CFG_QUIRKS_XEBEC)
+                {
+                    delayNs += 100000;
+                }
             }
 
             return delayNs;
@@ -295,7 +300,18 @@ void scsiEnterBusFree(void)
     g_scsi_ctrl_bsy = 0;
     scsiDev.cdbLen = 0;
 
-    SCSI_RELEASE_OUTPUTS();
+    // Conditional GPIO release based on controller type
+    if (scsiDev.target && scsiDev.target->cfg && 
+        scsiDev.target->cfg->quirks == S2S_CFG_QUIRKS_XEBEC)
+    {
+        // Xebec controllers: Use optimized timing with 200ns delay
+        SCSI_RELEASE_OUTPUTS_XEBEC();   // ~300ns: Uses delay_ns(200) instead of delay(1ms)
+    }
+    else
+    {
+        // Standard/legacy controllers: Use conservative 1ms delay
+        SCSI_RELEASE_OUTPUTS();         // ~1,000,150ns: Contains 1ms delay for compatibility
+    }
 }
 
 /********************/