From 086158525b1ac340bcebb750761684dd27e6009e Mon Sep 17 00:00:00 2001 From: Robert Fisk Date: Tue, 17 Apr 2018 01:22:08 +1200 Subject: [PATCH] Ignore mass storage commands after receiving SCSI stop/eject --- Upstream/Inc/upstream_msc.h | 2 +- Upstream/Inc/upstream_statemachine.h | 2 ++ .../Class/MSC/Src/usbd_msc.c | 9 +++---- .../Class/MSC/Src/usbd_msc_scsi.c | 1 + Upstream/Src/upstream_msc.c | 10 ++++++- Upstream/Src/upstream_statemachine.c | 27 ++++++++++++++----- 6 files changed, 38 insertions(+), 13 deletions(-) diff --git a/Upstream/Inc/upstream_msc.h b/Upstream/Inc/upstream_msc.h index e8fd33a..4ef8ba0 100644 --- a/Upstream/Inc/upstream_msc.h +++ b/Upstream/Inc/upstream_msc.h @@ -36,7 +36,7 @@ HAL_StatusTypeDef Upstream_MSC_BeginWrite(UpstreamMSCCallbackTypeDef callback, uint32_t writeBlockCount); HAL_StatusTypeDef Upstream_MSC_PutStreamDataPacket(UpstreamPacketTypeDef* packetToSend, uint32_t dataLength8); - +void Upstream_MSC_RegisterDisconnect(void); #endif /* INC_UPSTREAM_MSC_H_ */ diff --git a/Upstream/Inc/upstream_statemachine.h b/Upstream/Inc/upstream_statemachine.h index e6b982b..c021111 100644 --- a/Upstream/Inc/upstream_statemachine.h +++ b/Upstream/Inc/upstream_statemachine.h @@ -24,6 +24,7 @@ typedef enum STATE_WAIT_DEVICE, STATE_DEVICE_ACTIVE, STATE_SUSPENDED, + STATE_DISCONNECTING, STATE_ERROR } UpstreamStateTypeDef; @@ -46,6 +47,7 @@ void Upstream_StateMachine_DeviceDisconnected(void); void Upstream_StateMachine_Suspend(void); void Upstream_StateMachine_CheckResume(void); void Upstream_StateMachine_Wakeup(void); +void Upstream_StateMachine_RegisterDisconnect(void); diff --git a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c index b1c1b3a..45ebf0e 100755 --- a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c +++ b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c @@ -379,13 +379,12 @@ uint8_t USBD_MSC_DeInit (USBD_HandleTypeDef *pdev, USBD_LL_CloseEP(pdev, MSC_EPIN_ADDR); - - /* De-Init the BOT layer */ - MSC_BOT_DeInit(pdev); - - /* Free MSC Class Resources */ if(pdev->pClassData != NULL) { + /* De-Init the BOT layer */ + MSC_BOT_DeInit(pdev); + + /* Free MSC Class Resources */ USBD_free(pdev->pClassData); pdev->pClassData = NULL; } 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 e2d8013..9c21762 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 @@ -550,6 +550,7 @@ static void SCSI_StartStopUnit(void) if ((SCSI_ProcessCmd_params[4] & START_STOP_DATA_MASK) == START_STOP_DATA_EJECT_STOP_MOTOR) { USBD_RequestStop(SCSI_ProcessCmd_pdev); //Host is signalling us to disconnect + Upstream_MSC_RegisterDisconnect(); } SCSI_ProcessCmd_hmsc->bot_data_length = 0; diff --git a/Upstream/Src/upstream_msc.c b/Upstream/Src/upstream_msc.c index a76997b..8e05a5e 100644 --- a/Upstream/Src/upstream_msc.c +++ b/Upstream/Src/upstream_msc.c @@ -369,7 +369,15 @@ HAL_StatusTypeDef Upstream_MSC_PutStreamDataPacket(UpstreamPacketTypeDef* packet packetToSend->Command = COMMAND_MSC_WRITE; return Upstream_TransmitPacket(packetToSend); } -#endif +#endif //#ifdef CONFIG_MASS_STORAGE_WRITES_PERMITTED + + + +void Upstream_MSC_RegisterDisconnect(void) +{ + Upstream_StateMachine_RegisterDisconnect(); +} + #endif //#ifdef CONFIG_MASS_STORAGE_ENABLED diff --git a/Upstream/Src/upstream_statemachine.c b/Upstream/Src/upstream_statemachine.c index 37debfe..39794e7 100644 --- a/Upstream/Src/upstream_statemachine.c +++ b/Upstream/Src/upstream_statemachine.c @@ -79,19 +79,21 @@ void Upstream_StateMachine_SetErrorState(void) InterfaceCommandClassTypeDef Upstream_StateMachine_CheckActiveClass(void) { - if (UpstreamState == STATE_ERROR) + if ((UpstreamState == STATE_ERROR) || + (UpstreamState == STATE_DISCONNECTING)) { return COMMAND_CLASS_ERROR; } - if ((UpstreamState != STATE_DEVICE_ACTIVE) && - (UpstreamState != STATE_SUSPENDED)) + if ((UpstreamState == STATE_DEVICE_ACTIVE) || + (UpstreamState == STATE_SUSPENDED)) { - UPSTREAM_STATEMACHINE_FREAKOUT; - return COMMAND_CLASS_INTERFACE; + return ConfiguredDeviceClass; } - return ConfiguredDeviceClass; + //else: + UPSTREAM_STATEMACHINE_FREAKOUT; + return COMMAND_CLASS_INTERFACE; } @@ -293,3 +295,16 @@ void Upstream_StateMachine_Wakeup(void) USBD_Start(&hUsbDeviceFS); } + +//Host sends a SCSI motor stop command, so we shouldn't process any more commands. +void Upstream_StateMachine_RegisterDisconnect(void) +{ + if ((UpstreamState != STATE_DEVICE_ACTIVE) && + (UpstreamState != STATE_SUSPENDED)) + { + UPSTREAM_STATEMACHINE_FREAKOUT; + return; + } + + UpstreamState = STATE_DISCONNECTING; +}