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))); } } diff --git a/src/tusb_option.h b/src/tusb_option.h index 6766da074..266687ff7 100644 --- a/src/tusb_option.h +++ b/src/tusb_option.h @@ -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