Changeset 1585c7e in mainline


Ignore:
Timestamp:
2011-03-25T17:03:49Z (13 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
da88eb82
Parents:
d93b3e3
Message:

Use control transfer lock for control transfers.

Use global done list for all transfer lists.

Location:
uspace/drv/uhci-hcd
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/uhci-hcd/hc.c

    rd93b3e3 r1585c7e  
    336336            instance->transfers[batch->speed][batch->transfer_type];
    337337        assert(list);
     338        if (batch->transfer_type == USB_TRANSFER_CONTROL) {
     339                usb_device_keeper_use_control(
     340                    &instance->manager, batch->target.address);
     341        }
    338342        transfer_list_add_batch(list, batch);
    339343
     
    357361        /* Lower 2 bits are transaction error and transaction complete */
    358362        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                }
    363384        }
    364385        /* bits 4 and 5 indicate hc error */
  • uspace/drv/uhci-hcd/transfer_list.c

    rd93b3e3 r1585c7e  
    142142 * this transfer list leading to the deadlock if its done inline.
    143143 */
    144 void transfer_list_remove_finished(transfer_list_t *instance)
    145 {
    146         assert(instance);
    147 
    148         LIST_INITIALIZE(done);
     144void transfer_list_remove_finished(transfer_list_t *instance, link_t *done)
     145{
     146        assert(instance);
     147        assert(done);
    149148
    150149        fibril_mutex_lock(&instance->guard);
     
    158157                        /* Save for post-processing */
    159158                        transfer_list_remove_batch(instance, batch);
    160                         list_append(current, &done);
     159                        list_append(current, done);
    161160                }
    162161                current = next;
     
    164163        fibril_mutex_unlock(&instance->guard);
    165164
    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         }
    174165}
    175166/*----------------------------------------------------------------------------*/
  • uspace/drv/uhci-hcd/transfer_list.h

    rd93b3e3 r1585c7e  
    6767void transfer_list_add_batch(transfer_list_t *instance, usb_transfer_batch_t *batch);
    6868
    69 void transfer_list_remove_finished(transfer_list_t *instance);
     69void transfer_list_remove_finished(transfer_list_t *instance, link_t *done);
    7070
    7171void transfer_list_abort_all(transfer_list_t *instance);
Note: See TracChangeset for help on using the changeset viewer.