Ignore:
Timestamp:
2011-04-07T08:19:03Z (13 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
41c1f7b
Parents:
dcaf819 (diff), 506d330 (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:

More OHCI structures and refactoring. Add per endpoint toggle reset

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usb/src/host/usb_endpoint_manager.c

    rdcaf819 r9a7e5b4  
    3535#define BUCKET_COUNT 7
    3636
    37 typedef struct {
    38         usb_address_t address;
    39         usb_endpoint_t endpoint;
    40         usb_direction_t direction;
    41 } __attribute__((aligned (sizeof(unsigned long)))) id_t;
    42 #define MAX_KEYS (sizeof(id_t) / sizeof(unsigned long))
     37#define MAX_KEYS (3)
    4338typedef struct {
    44         union {
    45                 id_t id;
    46                 unsigned long key[MAX_KEYS];
    47         };
    4839        link_t link;
    4940        size_t bw;
     
    6657        assert(item);
    6758        node_t *node = hash_table_get_instance(item, node_t, link);
    68         hash_count_t i = 0;
    69         for (; i < keys; ++i) {
    70                 if (key[i] != node->key[i])
    71                         return false;
    72         }
    73         return true;
     59        assert(node);
     60        assert(node->ep);
     61        bool match = true;
     62        switch (keys) {
     63        case 3:
     64                match = match && (key[2] == node->ep->direction);
     65        case 2:
     66                match = match && (key[1] == (unsigned long)node->ep->endpoint);
     67        case 1:
     68                match = match && (key[0] == (unsigned long)node->ep->address);
     69                break;
     70        default:
     71                match = false;
     72        }
     73        return match;
    7474}
    7575/*----------------------------------------------------------------------------*/
     
    142142/*----------------------------------------------------------------------------*/
    143143int usb_endpoint_manager_register_ep(usb_endpoint_manager_t *instance,
    144     usb_address_t address, usb_endpoint_t endpoint, usb_direction_t direction,
    145144    endpoint_t *ep, size_t data_size)
    146145{
     
    150149        assert(instance);
    151150
    152         id_t id = {
    153                 .address = address,
    154                 .endpoint = endpoint,
    155                 .direction = direction,
    156         };
     151        unsigned long key[MAX_KEYS] =
     152            {ep->address, ep->endpoint, ep->direction};
    157153        fibril_mutex_lock(&instance->guard);
    158154
    159155        link_t *item =
    160             hash_table_find(&instance->ep_table, (unsigned long*)&id);
     156            hash_table_find(&instance->ep_table, key);
    161157        if (item != NULL) {
    162158                fibril_mutex_unlock(&instance->guard);
     
    175171        }
    176172
    177         node->id = id;
    178173        node->bw = bw;
    179174        node->ep = ep;
    180175        link_initialize(&node->link);
    181176
    182         hash_table_insert(&instance->ep_table,
    183             (unsigned long*)&id, &node->link);
     177        hash_table_insert(&instance->ep_table, key, &node->link);
    184178        instance->free_bw -= bw;
    185179        fibril_mutex_unlock(&instance->guard);
     
    192186{
    193187        assert(instance);
    194         id_t id = {
    195                 .address = address,
    196                 .endpoint = endpoint,
    197                 .direction = direction,
    198         };
     188        unsigned long key[MAX_KEYS] = {address, endpoint, direction};
     189
    199190        fibril_mutex_lock(&instance->guard);
    200         link_t *item =
    201             hash_table_find(&instance->ep_table, (unsigned long*)&id);
     191        link_t *item = hash_table_find(&instance->ep_table, key);
    202192        if (item == NULL) {
    203193                fibril_mutex_unlock(&instance->guard);
     
    207197        node_t *node = hash_table_get_instance(item, node_t, link);
    208198        instance->free_bw += node->bw;
    209         hash_table_remove(&instance->ep_table, (unsigned long*)&id, MAX_KEYS);
     199        hash_table_remove(&instance->ep_table, key, MAX_KEYS);
    210200
    211201        fibril_mutex_unlock(&instance->guard);
     
    219209{
    220210        assert(instance);
    221         id_t id = {
    222                 .address = address,
    223                 .endpoint = endpoint,
    224                 .direction = direction,
    225         };
     211        unsigned long key[MAX_KEYS] = {address, endpoint, direction};
     212
    226213        fibril_mutex_lock(&instance->guard);
    227         link_t *item =
    228             hash_table_find(&instance->ep_table, (unsigned long*)&id);
     214        link_t *item = hash_table_find(&instance->ep_table, key);
    229215        if (item == NULL) {
    230216                fibril_mutex_unlock(&instance->guard);
Note: See TracChangeset for help on using the changeset viewer.