diff options
Diffstat (limited to 'src/class')
| -rw-r--r-- | src/class/msc/msc.h | 2 | ||||
| -rw-r--r-- | src/class/msc/msc_device.c | 13 |
2 files changed, 14 insertions, 1 deletions
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);
|
