--- 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 @@ } }