diff options
| author | hathach <[email protected]> | 2019-12-24 21:24:43 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2019-12-24 21:24:43 +0700 |
| commit | 605129eb6600ffb50ea2d239e0ad78a9636df8e1 (patch) | |
| tree | a72b5cab962e97a19ffbcd3011ba153afe45a00d /src/class | |
| parent | 2caa1ac07804bef581cd30e6fc5057a6515fb094 (diff) | |
invoke scsi complete callback before queue for csw status
there is racing issue with samd + qspi flash testing with arduino
otherwise.
Diffstat (limited to 'src/class')
| -rw-r--r-- | src/class/msc/msc_device.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/src/class/msc/msc_device.c b/src/class/msc/msc_device.c index 93167bc6d..bef5d599b 100644 --- a/src/class/msc/msc_device.c +++ b/src/class/msc/msc_device.c @@ -39,7 +39,8 @@ enum {
MSC_STAGE_CMD = 0,
MSC_STAGE_DATA,
- MSC_STAGE_STATUS
+ MSC_STAGE_STATUS,
+ MSC_STAGE_STATUS_SENT
};
typedef struct
@@ -569,7 +570,11 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t break;
case MSC_STAGE_STATUS:
- // Wait for the command status wrapper complete event
+ // processed immediately after this switch, supposedly to be empty
+ break;
+
+ case MSC_STAGE_STATUS_SENT:
+ // Wait for the Status phase to complete
if( (ep_addr == p_msc->ep_in) && (xferred_bytes == sizeof(msc_csw_t)) )
{
TU_LOG2(" SCSI Status: %u\n", p_csw->status);
@@ -598,9 +603,6 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t }
else
{
- // Send SCSI Status
- TU_ASSERT(usbd_edpt_xfer(rhport, p_msc->ep_in , (uint8_t*) &p_msc->csw, sizeof(msc_csw_t)));
-
// Invoke complete callback if defined
switch(p_cbw->command[0])
{
@@ -616,6 +618,12 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t if ( tud_msc_scsi_complete_cb ) tud_msc_scsi_complete_cb(p_cbw->lun, p_cbw->command);
break;
}
+
+ // Move to Status Sent stage
+ p_msc->stage = MSC_STAGE_STATUS_SENT;
+
+ // Send SCSI Status
+ TU_ASSERT(usbd_edpt_xfer(rhport, p_msc->ep_in , (uint8_t*) &p_msc->csw, sizeof(msc_csw_t)));
}
}
|
