Changeset 92d6868 in mainline
- Timestamp:
- 2011-04-07T07:56:03Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 506d330
- Parents:
- 0aae4a6a
- Location:
- uspace
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/ohci/iface.c
r0aae4a6a r92d6868 163 163 usb_str_speed(speed), direction, size, max_packet_size, interval); 164 164 // TODO use real endpoint here! 165 return usb_endpoint_manager_register_ep(&hc->ep_manager, 166 address, endpoint, direction, NULL, 0); 165 return usb_endpoint_manager_register_ep(&hc->ep_manager,NULL, 0); 167 166 } 168 167 /*----------------------------------------------------------------------------*/ -
uspace/drv/uhci-hcd/iface.c
r0aae4a6a r92d6868 179 179 usb_str_speed(speed), direction, size, max_packet_size, interval); 180 180 181 ret = usb_endpoint_manager_register_ep(&hc->ep_manager, 182 address, endpoint, direction, ep, size); 181 ret = usb_endpoint_manager_register_ep(&hc->ep_manager, ep, size); 183 182 if (ret != EOK) { 184 183 endpoint_destroy(ep); -
uspace/lib/usb/include/usb/host/usb_endpoint_manager.h
r0aae4a6a r92d6868 64 64 65 65 int usb_endpoint_manager_register_ep(usb_endpoint_manager_t *instance, 66 usb_address_t address, usb_endpoint_t endpoint, usb_direction_t direction,67 66 endpoint_t *ep, size_t data_size); 68 67 -
uspace/lib/usb/src/host/usb_endpoint_manager.c
r0aae4a6a r92d6868 35 35 #define BUCKET_COUNT 7 36 36 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) 43 38 typedef struct { 44 union {45 id_t id;46 unsigned long key[MAX_KEYS];47 };48 39 link_t link; 49 40 size_t bw; … … 66 57 assert(item); 67 58 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; 74 74 } 75 75 /*----------------------------------------------------------------------------*/ … … 142 142 /*----------------------------------------------------------------------------*/ 143 143 int usb_endpoint_manager_register_ep(usb_endpoint_manager_t *instance, 144 usb_address_t address, usb_endpoint_t endpoint, usb_direction_t direction,145 144 endpoint_t *ep, size_t data_size) 146 145 { … … 150 149 assert(instance); 151 150 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}; 157 153 fibril_mutex_lock(&instance->guard); 158 154 159 155 link_t *item = 160 hash_table_find(&instance->ep_table, (unsigned long*)&id);156 hash_table_find(&instance->ep_table, key); 161 157 if (item != NULL) { 162 158 fibril_mutex_unlock(&instance->guard); … … 175 171 } 176 172 177 node->id = id;178 173 node->bw = bw; 179 174 node->ep = ep; 180 175 link_initialize(&node->link); 181 176 182 hash_table_insert(&instance->ep_table, 183 (unsigned long*)&id, &node->link); 177 hash_table_insert(&instance->ep_table, key, &node->link); 184 178 instance->free_bw -= bw; 185 179 fibril_mutex_unlock(&instance->guard); … … 192 186 { 193 187 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 199 190 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); 202 192 if (item == NULL) { 203 193 fibril_mutex_unlock(&instance->guard); … … 207 197 node_t *node = hash_table_get_instance(item, node_t, link); 208 198 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); 210 200 211 201 fibril_mutex_unlock(&instance->guard); … … 219 209 { 220 210 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 226 213 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); 229 215 if (item == NULL) { 230 216 fibril_mutex_unlock(&instance->guard);
Note:
See TracChangeset
for help on using the changeset viewer.