invoke scsi complete callback before queue for csw status

there is racing issue with samd + qspi flash testing with arduino
otherwise.
This commit is contained in:
hathach 2019-12-24 21:24:43 +07:00
parent 2caa1ac078
commit 605129eb66
2 changed files with 14 additions and 6 deletions

View File

@ -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)));
}
}

View File

@ -36,7 +36,7 @@
* \ref CFG_TUSB_MCU must be defined to one of these
* @{ */
#define OPT_MCU_NONE 0
#define OPT_MCU_NONE 0
// LPC
#define OPT_MCU_LPC11UXX 1 ///< NXP LPC11Uxx