# HG changeset patch # User bartv # Date 1142023794 0 # Node ID 1674688917d0558a37124afa5028abc857794393 # Parent 1cde7dd73fff310854e9a579c50cca3d806c2991 Fix locking between read/write operations and DSRs diff --git a/packages/io/usb/slave/current/ChangeLog b/packages/io/usb/slave/current/ChangeLog --- a/packages/io/usb/slave/current/ChangeLog +++ b/packages/io/usb/slave/current/ChangeLog @@ -1,3 +1,8 @@ +2006-03-10 Bart Veer + + * src/usbs.c (usbs_devtab_cwrite, usbs_devtab_cwrite): add + DSR locking + 2005-06-26 Bart Veer * host/usbhost.c, host/configure.in: cope with incompatible diff --git a/packages/io/usb/slave/current/src/usbs.c b/packages/io/usb/slave/current/src/usbs.c --- a/packages/io/usb/slave/current/src/usbs.c +++ b/packages/io/usb/slave/current/src/usbs.c @@ -111,9 +111,11 @@ usbs_devtab_cwrite(cyg_io_handle_t handl (*endpoint->start_tx_fn)(endpoint); cyg_drv_mutex_lock(&wait.lock); + cyg_drv_dsr_lock(); while (!wait.completed) { cyg_drv_cond_wait(&wait.signal); } + cyg_drv_dsr_unlock(); cyg_drv_mutex_unlock(&wait.lock); if (wait.result < 0) { result = wait.result; @@ -155,9 +157,11 @@ usbs_devtab_cread(cyg_io_handle_t handle endpoint->complete_data = (void*) &wait; (*endpoint->start_rx_fn)(endpoint); cyg_drv_mutex_lock(&wait.lock); + cyg_drv_dsr_lock(); while (!wait.completed) { cyg_drv_cond_wait(&wait.signal); } + cyg_drv_dsr_unlock(); cyg_drv_mutex_unlock(&wait.lock); if (wait.result < 0) { result = wait.result;