Changes in uspace/lib/usb/src/host/usb_endpoint_manager.c [3eeb270f:d41f301] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usb/src/host/usb_endpoint_manager.c
r3eeb270f rd41f301 31 31 #include <errno.h> 32 32 33 #include <usb/debug.h>34 33 #include <usb/host/usb_endpoint_manager.h> 35 34 … … 81 80 endpoint_destroy(node->ep); 82 81 free(node); 83 }84 /*----------------------------------------------------------------------------*/85 static void node_toggle_reset_filtered(link_t *item, void *arg)86 {87 assert(item);88 node_t *node = hash_table_get_instance(item, node_t, link);89 usb_target_t *target = arg;90 endpoint_toggle_reset_filtered(node->ep, *target);91 82 } 92 83 /*----------------------------------------------------------------------------*/ … … 211 202 212 203 node_t *node = hash_table_get_instance(item, node_t, link); 213 if (node->ep->active)214 return EBUSY;215 216 204 instance->free_bw += node->bw; 217 205 hash_table_remove(&instance->ep_table, key, MAX_KEYS); … … 242 230 return node->ep; 243 231 } 244 /*----------------------------------------------------------------------------*/245 /** Check setup packet data for signs of toggle reset.246 *247 * @param[in] instance Device keeper structure to use.248 * @param[in] target Device to receive setup packet.249 * @param[in] data Setup packet data.250 *251 * Really ugly one.252 */253 void usb_endpoint_manager_reset_if_need(254 usb_endpoint_manager_t *instance, usb_target_t target, const uint8_t *data)255 {256 assert(instance);257 if (target.endpoint > 15 || target.endpoint < 0258 || target.address >= USB11_ADDRESS_MAX || target.address < 0) {259 usb_log_error("Invalid data when checking for toggle reset.\n");260 return;261 }262 263 switch (data[1])264 {265 case 0x01: /*clear feature*/266 /* recipient is endpoint, value is zero (ENDPOINT_STALL) */267 if (((data[0] & 0xf) == 1) && ((data[2] | data[3]) == 0)) {268 /* endpoint number is < 16, thus first byte is enough */269 usb_target_t reset_target =270 { .address = target.address, data[4] };271 fibril_mutex_lock(&instance->guard);272 hash_table_apply(&instance->ep_table,273 node_toggle_reset_filtered, &reset_target);274 fibril_mutex_unlock(&instance->guard);275 }276 break;277 278 case 0x9: /* set configuration */279 case 0x11: /* set interface */280 /* target must be device */281 if ((data[0] & 0xf) == 0) {282 usb_target_t reset_target =283 { .address = target.address, 0 };284 fibril_mutex_lock(&instance->guard);285 hash_table_apply(&instance->ep_table,286 node_toggle_reset_filtered, &reset_target);287 fibril_mutex_unlock(&instance->guard);288 }289 break;290 }291 }
Note:
See TracChangeset
for help on using the changeset viewer.