Changeset 5542b83 in mainline for uspace/lib


Ignore:
Timestamp:
2011-04-02T15:47:45Z (15 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
322a8066, d8987b1
Parents:
969585f (diff), 0053fa38 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Add USB bandwidth control mechanism

Use per endpoint control transfer mutex
Bandwidth control issues warnings, drivers(libusb pipe init?) need to use it first.

Location:
uspace/lib
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/adt/hash_table.c

    r969585f r5542b83  
    5454 *
    5555 */
    56 int hash_table_create(hash_table_t *h, hash_count_t m, hash_count_t max_keys,
     56bool hash_table_create(hash_table_t *h, hash_count_t m, hash_count_t max_keys,
    5757    hash_table_operations_t *op)
    5858{
  • uspace/lib/c/include/adt/hash_table.h

    r969585f r5542b83  
    3838#include <adt/list.h>
    3939#include <unistd.h>
     40#include <bool.h>
    4041
    4142typedef unsigned long hash_count_t;
     
    8384    list_get_instance((item), type, member)
    8485
    85 extern int hash_table_create(hash_table_t *, hash_count_t, hash_count_t,
     86extern bool hash_table_create(hash_table_t *, hash_count_t, hash_count_t,
    8687    hash_table_operations_t *);
    8788extern void hash_table_insert(hash_table_t *, unsigned long [], link_t *);
  • uspace/lib/usb/Makefile

    r969585f r5542b83  
    5353        src/hidreport.c \
    5454        src/host/device_keeper.c \
    55         src/host/batch.c
     55        src/host/batch.c \
     56        src/host/bandwidth.c
    5657
    5758include $(USPACE_PREFIX)/Makefile.common
  • uspace/lib/usb/include/usb/host/device_keeper.h

    r969585f r5542b83  
    5151        usb_speed_t speed;
    5252        bool occupied;
    53         bool control_used;
     53        uint16_t control_used;
    5454        uint16_t toggle_status[2];
    5555        devman_handle_t handle;
     
    9999
    100100void usb_device_keeper_use_control(usb_device_keeper_t *instance,
    101     usb_address_t address);
     101    usb_target_t target);
    102102
    103103void usb_device_keeper_release_control(usb_device_keeper_t *instance,
    104     usb_address_t address);
     104    usb_target_t target);
    105105
    106106#endif
  • uspace/lib/usb/src/host/device_keeper.c

    r969585f r5542b83  
    5454        for (; i < USB_ADDRESS_COUNT; ++i) {
    5555                instance->devices[i].occupied = false;
    56                 instance->devices[i].control_used = false;
     56                instance->devices[i].control_used = 0;
    5757                instance->devices[i].handle = 0;
    5858                instance->devices[i].toggle_status[0] = 0;
     
    311311/*----------------------------------------------------------------------------*/
    312312void usb_device_keeper_use_control(usb_device_keeper_t *instance,
    313     usb_address_t address)
    314 {
    315         assert(instance);
    316         fibril_mutex_lock(&instance->guard);
    317         while (instance->devices[address].control_used) {
     313    usb_target_t target)
     314{
     315        assert(instance);
     316        const uint16_t ep = 1 << target.endpoint;
     317        fibril_mutex_lock(&instance->guard);
     318        while (instance->devices[target.address].control_used & ep) {
    318319                fibril_condvar_wait(&instance->change, &instance->guard);
    319320        }
    320         instance->devices[address].control_used = true;
     321        instance->devices[target.address].control_used |= ep;
    321322        fibril_mutex_unlock(&instance->guard);
    322323}
    323324/*----------------------------------------------------------------------------*/
    324325void usb_device_keeper_release_control(usb_device_keeper_t *instance,
    325     usb_address_t address)
    326 {
    327         assert(instance);
    328         fibril_mutex_lock(&instance->guard);
    329         instance->devices[address].control_used = false;
     326    usb_target_t target)
     327{
     328        assert(instance);
     329        const uint16_t ep = 1 << target.endpoint;
     330        fibril_mutex_lock(&instance->guard);
     331        assert((instance->devices[target.address].control_used & ep) != 0);
     332        instance->devices[target.address].control_used &= ~ep;
    330333        fibril_mutex_unlock(&instance->guard);
    331334        fibril_condvar_signal(&instance->change);
Note: See TracChangeset for help on using the changeset viewer.