Browse Source

Merge pull request #36 from tannewt/fix_write_protect

Fix write protected MSC. The bits were flipped.
hathach 7 years ago
parent
commit
6645be65f5
2 changed files with 14 additions and 1 deletions
  1. 1 1
      src/class/msc/msc.h
  2. 13 0
      src/class/msc/msc_device.c

+ 1 - 1
src/class/msc/msc.h

@@ -284,8 +284,8 @@ typedef struct ATTR_PACKED
 {
 {
   uint8_t data_len;
   uint8_t data_len;
   uint8_t medium_type;
   uint8_t medium_type;
-  bool write_protected : 1;
   uint8_t reserved : 7;
   uint8_t reserved : 7;
+  bool write_protected : 1;
   uint8_t block_descriptor_len;
   uint8_t block_descriptor_len;
 } scsi_mode_sense6_resp_t;
 } scsi_mode_sense6_resp_t;
 
 

+ 13 - 0
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)
 static void proc_write10_cmd(uint8_t rhport, mscd_interface_t* p_msc)
 {
 {
   msc_cbw_t const * p_cbw = &p_msc->cbw;
   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
   // remaining bytes capped at class buffer
   int32_t nbytes = (int32_t) tu_min32(sizeof(_mscd_buf), p_cbw->total_bytes-p_msc->xferred_len);
   int32_t nbytes = (int32_t) tu_min32(sizeof(_mscd_buf), p_cbw->total_bytes-p_msc->xferred_len);