From b476df268a388b794f4697671a0ec130aff12a87 Mon Sep 17 00:00:00 2001 From: Robert Fisk Date: Wed, 15 Mar 2017 00:43:27 +1300 Subject: [PATCH] Fixed devices-shrinking-by-one-block problem. So it turns out the SCSI ReadCapacity10 command does not return the device capacity. It returns the address of the last block, which is (capacity - 1). Also fixed Upstream's end-of-device sanity check. --- .../ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_scsi.c | 4 ++-- .../ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Downstream/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_scsi.c b/Downstream/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_scsi.c index 7c07308..6b9a6e4 100644 --- a/Downstream/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_scsi.c +++ b/Downstream/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_scsi.c @@ -179,8 +179,8 @@ USBH_StatusTypeDef USBH_MSC_SCSI_ReadCapacity (USBH_HandleTypeDef *phost, if(error == USBH_OK) { /*assign the capacity*/ - capacity->block_nbr = MSC_Handle->hbot.pbuf[3] | (MSC_Handle->hbot.pbuf[2] << 8) |\ - (MSC_Handle->hbot.pbuf[1] << 16) | (MSC_Handle->hbot.pbuf[0] << 24); + capacity->block_nbr = (MSC_Handle->hbot.pbuf[3] | (MSC_Handle->hbot.pbuf[2] << 8) |\ + (MSC_Handle->hbot.pbuf[1] << 16) | (MSC_Handle->hbot.pbuf[0] << 24)) + 1; //block_nbr = logical address of last block + 1 /*assign the page length*/ capacity->block_size = MSC_Handle->hbot.pbuf[7] | (MSC_Handle->hbot.pbuf[6] << 8); diff --git a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c index a989cc2..c809832 100755 --- a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c +++ b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c @@ -846,8 +846,8 @@ static void SCSI_Verify10(void) */ static int8_t SCSI_CheckAddressRange (uint32_t blk_offset , uint16_t blk_nbr) { - if ((blk_offset > SCSI_ProcessCmd_hmsc->scsi_blk_nbr) || - ((blk_offset + blk_nbr) > SCSI_ProcessCmd_hmsc->scsi_blk_nbr)) + if ((blk_offset >= SCSI_ProcessCmd_hmsc->scsi_blk_nbr) || + ((blk_offset + blk_nbr - 1) >= SCSI_ProcessCmd_hmsc->scsi_blk_nbr)) { SCSI_SenseCode(SCSI_ProcessCmd_pdev, SCSI_ProcessCmd_lun,