aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal/src/usbh/hal_usbh_msd.c
diff options
context:
space:
mode:
authorDiego Ismirlian <dismirlian (at) google's mail.com>2017-07-16 18:32:23 -0300
committerDiego Ismirlian <dismirlian (at) google's mail.com>2017-07-16 18:32:23 -0300
commit54c53d4e22ebce803a111e3c80ddd1796bb37c07 (patch)
tree13a44eccf3d98ec77d2a49d2165dfce19ec44e35 /os/hal/src/usbh/hal_usbh_msd.c
parentb294a6cff6a58a4788c80cc955aa5e3132052e8b (diff)
downloadChibiOS-Contrib-54c53d4e22ebce803a111e3c80ddd1796bb37c07.tar.gz
ChibiOS-Contrib-54c53d4e22ebce803a111e3c80ddd1796bb37c07.tar.bz2
ChibiOS-Contrib-54c53d4e22ebce803a111e3c80ddd1796bb37c07.zip
USBH: MSD: improved syncrhonization
Diffstat (limited to 'os/hal/src/usbh/hal_usbh_msd.c')
-rw-r--r--os/hal/src/usbh/hal_usbh_msd.c19
1 files changed, 7 insertions, 12 deletions
diff --git a/os/hal/src/usbh/hal_usbh_msd.c b/os/hal/src/usbh/hal_usbh_msd.c
index d1a5d73..069c47b 100644
--- a/os/hal/src/usbh/hal_usbh_msd.c
+++ b/os/hal/src/usbh/hal_usbh_msd.c
@@ -721,15 +721,13 @@ bool usbhmsdLUNConnect(USBHMassStorageLUNDriver *lunp) {
osalDbgCheck(lunp->msdp != NULL);
msd_result_t res;
- osalSysLock();
+ chSemWait(&lunp->sem);
+ osalDbgAssert((lunp->state == BLK_READY) || (lunp->state == BLK_ACTIVE), "invalid state");
if (lunp->state == BLK_READY) {
- osalSysUnlock();
+ chSemSignal(&lunp->sem);
return HAL_SUCCESS;
}
- chSemWaitS(&lunp->sem);
- osalDbgAssert((lunp->state == BLK_ACTIVE), "invalid state");
lunp->state = BLK_CONNECTING;
- osalSysUnlock();
{
USBH_DEFINE_BUFFER(scsi_inquiry_response_t inq);
@@ -795,31 +793,28 @@ bool usbhmsdLUNConnect(USBHMassStorageLUNDriver *lunp) {
(uint32_t)(((uint64_t)lunp->info.blk_size * lunp->info.blk_num) / (1024UL * 1024UL)));
uinfo("MSD Connected.");
-
lunp->state = BLK_READY;
chSemSignal(&lunp->sem);
return HAL_SUCCESS;
/* Connection failed, state reset to BLK_ACTIVE.*/
failed:
+ uinfo("MSD Connect failed.");
lunp->state = BLK_ACTIVE;
chSemSignal(&lunp->sem);
return HAL_FAILED;
}
-
bool usbhmsdLUNDisconnect(USBHMassStorageLUNDriver *lunp) {
osalDbgCheck(lunp != NULL);
- osalSysLock();
+ chSemWait(&lunp->sem);
+ osalDbgAssert((lunp->state == BLK_READY) || (lunp->state == BLK_ACTIVE), "invalid state");
if (lunp->state == BLK_ACTIVE) {
- osalSysUnlock();
+ chSemSignal(&lunp->sem);
return HAL_SUCCESS;
}
- chSemWaitS(&lunp->sem);
- osalDbgAssert((lunp->state == BLK_READY), "invalid state");
lunp->state = BLK_DISCONNECTING;
- osalSysUnlock();
//TODO: complete: sync, etc.