Changeset 1585c7e in mainline
- Timestamp:
- 2011-03-25T17:03:49Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- da88eb82
- Parents:
- d93b3e3
- Location:
- uspace/drv/uhci-hcd
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/uhci-hcd/hc.c
rd93b3e3 r1585c7e 336 336 instance->transfers[batch->speed][batch->transfer_type]; 337 337 assert(list); 338 if (batch->transfer_type == USB_TRANSFER_CONTROL) { 339 usb_device_keeper_use_control( 340 &instance->manager, batch->target.address); 341 } 338 342 transfer_list_add_batch(list, batch); 339 343 … … 357 361 /* Lower 2 bits are transaction error and transaction complete */ 358 362 if (status & 0x3) { 359 transfer_list_remove_finished(&instance->transfers_interrupt); 360 transfer_list_remove_finished(&instance->transfers_control_slow); 361 transfer_list_remove_finished(&instance->transfers_control_full); 362 transfer_list_remove_finished(&instance->transfers_bulk_full); 363 LIST_INITIALIZE(done); 364 transfer_list_remove_finished( 365 &instance->transfers_interrupt, &done); 366 transfer_list_remove_finished( 367 &instance->transfers_control_slow, &done); 368 transfer_list_remove_finished( 369 &instance->transfers_control_full, &done); 370 transfer_list_remove_finished( 371 &instance->transfers_bulk_full, &done); 372 373 while (!list_empty(&done)) { 374 link_t *item = done.next; 375 list_remove(item); 376 usb_transfer_batch_t *batch = 377 list_get_instance(item, usb_transfer_batch_t, link); 378 if (batch->transfer_type == USB_TRANSFER_CONTROL) { 379 usb_device_keeper_release_control( 380 &instance->manager, batch->target.address); 381 } 382 batch->next_step(batch); 383 } 363 384 } 364 385 /* bits 4 and 5 indicate hc error */ -
uspace/drv/uhci-hcd/transfer_list.c
rd93b3e3 r1585c7e 142 142 * this transfer list leading to the deadlock if its done inline. 143 143 */ 144 void transfer_list_remove_finished(transfer_list_t *instance) 145 { 146 assert(instance); 147 148 LIST_INITIALIZE(done); 144 void transfer_list_remove_finished(transfer_list_t *instance, link_t *done) 145 { 146 assert(instance); 147 assert(done); 149 148 150 149 fibril_mutex_lock(&instance->guard); … … 158 157 /* Save for post-processing */ 159 158 transfer_list_remove_batch(instance, batch); 160 list_append(current, &done);159 list_append(current, done); 161 160 } 162 161 current = next; … … 164 163 fibril_mutex_unlock(&instance->guard); 165 164 166 async_usleep(1000);167 while (!list_empty(&done)) {168 link_t *item = done.next;169 list_remove(item);170 usb_transfer_batch_t *batch =171 list_get_instance(item, usb_transfer_batch_t, link);172 batch->next_step(batch);173 }174 165 } 175 166 /*----------------------------------------------------------------------------*/ -
uspace/drv/uhci-hcd/transfer_list.h
rd93b3e3 r1585c7e 67 67 void transfer_list_add_batch(transfer_list_t *instance, usb_transfer_batch_t *batch); 68 68 69 void transfer_list_remove_finished(transfer_list_t *instance );69 void transfer_list_remove_finished(transfer_list_t *instance, link_t *done); 70 70 71 71 void transfer_list_abort_all(transfer_list_t *instance);
Note:
See TracChangeset
for help on using the changeset viewer.