From c870efffc04abad5dd8796054bc2dd4310669849 Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Wed, 20 Feb 2019 15:12:36 -0800 Subject: [PATCH] Fix write protected MSC. The bits were flipped. --- src/class/msc/msc.h | 2 +- src/class/msc/msc_device.c | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/class/msc/msc.h b/src/class/msc/msc.h index 10a73bb1c..baa0641d0 100644 --- a/src/class/msc/msc.h +++ b/src/class/msc/msc.h @@ -284,8 +284,8 @@ typedef struct ATTR_PACKED { uint8_t data_len; uint8_t medium_type; - bool write_protected : 1; uint8_t reserved : 7; + bool write_protected : 1; uint8_t block_descriptor_len; } scsi_mode_sense6_resp_t; diff --git a/src/class/msc/msc_device.c b/src/class/msc/msc_device.c index 76d647dcc..9fbe48bd7 100644 --- a/src/class/msc/msc_device.c +++ b/src/class/msc/msc_device.c @@ -594,6 +594,19 @@ static void proc_read10_cmd(uint8_t rhport, mscd_interface_t* p_msc) static void proc_write10_cmd(uint8_t rhport, mscd_interface_t* p_msc) { msc_cbw_t const * p_cbw = &p_msc->cbw; + bool writable = true; + if (tud_msc_is_writable_cb) { + writable = tud_msc_is_writable_cb(p_cbw->lun); + } + if (!writable) { + msc_csw_t* p_csw = &p_msc->csw; + p_csw->data_residue = p_cbw->total_bytes; + p_csw->status = MSC_CSW_STATUS_FAILED; + + tud_msc_set_sense(p_cbw->lun, SCSI_SENSE_DATA_PROTECT, 0x27, 0x00); // Sense = Write protected + dcd_edpt_stall(rhport, p_msc->ep_out); + return; + } // remaining bytes capped at class buffer int32_t nbytes = (int32_t) tu_min32(sizeof(_mscd_buf), p_cbw->total_bytes-p_msc->xferred_len);