--- usbs_orig.c	2006-02-16 10:41:13.000000000 -0500
+++ usbs.c	2006-02-06 13:28:12.000000000 -0500
@@ -70,17 +70,17 @@
 typedef struct usbs_callback_data {
     bool                completed;
     int                 result;
-    cyg_drv_mutex_t     lock;
-    cyg_drv_cond_t      signal;
+    cyg_sem_t           sem;
 } usbs_callback_data;
 
+
 static void
 usbs_devtab_callback(void* arg, int result)
 {
     usbs_callback_data* callback_data = (usbs_callback_data*) arg;
     callback_data->result       = result;
     callback_data->completed    = true;
-    cyg_drv_cond_signal(&(callback_data->signal));
+    cyg_semaphore_post(&(callback_data->sem));
 }
     
 Cyg_ErrNo
@@ -94,8 +94,7 @@
     CYG_REPORT_FUNCTION();
     
     wait.completed      = 0;
-    cyg_drv_mutex_init(&wait.lock);
-    cyg_drv_cond_init(&wait.signal, &wait.lock);
+    cyg_semaphore_init(&wait.sem, 0);
 
     devtab_entry      = (cyg_devtab_entry_t*) handle;
     CYG_CHECK_DATA_PTR( devtab_entry, "A valid endpoint must be supplied");
@@ -110,19 +109,16 @@
     endpoint->complete_data     = (void*) &wait;
     (*endpoint->start_tx_fn)(endpoint);
     
-    cyg_drv_mutex_lock(&wait.lock);
     while (!wait.completed) {
-        cyg_drv_cond_wait(&wait.signal);
+       cyg_semaphore_wait(&wait.sem);
     }
-    cyg_drv_mutex_unlock(&wait.lock);
     if (wait.result < 0) {
         result = wait.result;
     } else {
         *size = wait.result;
     }
     
-    cyg_drv_cond_destroy(&wait.signal);
-    cyg_drv_mutex_destroy(&wait.lock);
+    cyg_semaphore_destroy(&wait.sem);
 
     CYG_REPORT_RETURN();
     return result;
@@ -139,8 +135,7 @@
     CYG_REPORT_FUNCTION();
     
     wait.completed      = 0;
-    cyg_drv_mutex_init(&wait.lock);
-    cyg_drv_cond_init(&wait.signal, &wait.lock);
+    cyg_semaphore_init(&wait.sem, 0);
 
     devtab_entry      = (cyg_devtab_entry_t*) handle;
     CYG_CHECK_DATA_PTR( devtab_entry, "A valid endpoint must be supplied");
@@ -153,20 +148,18 @@
     endpoint->buffer_size       = (int) *size;
     endpoint->complete_fn       = &usbs_devtab_callback;
     endpoint->complete_data     = (void*) &wait;
+
     (*endpoint->start_rx_fn)(endpoint);
-    cyg_drv_mutex_lock(&wait.lock);
     while (!wait.completed) {
-        cyg_drv_cond_wait(&wait.signal);
+       cyg_semaphore_wait(&wait.sem);
     }
-    cyg_drv_mutex_unlock(&wait.lock);
     if (wait.result < 0) {
         result = wait.result;
     } else {
         *size = wait.result;
     }
     
-    cyg_drv_cond_destroy(&wait.signal);
-    cyg_drv_mutex_destroy(&wait.lock);
+    cyg_semaphore_destroy(&wait.sem);
 
     CYG_REPORT_RETURN();
     return result;
@@ -409,6 +402,64 @@
     }
 }
 

