Ignore:
File:
1 edited

Legend:

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

    r3eeb270f rd41f301  
    3131#include <errno.h>
    3232
    33 #include <usb/debug.h>
    3433#include <usb/host/usb_endpoint_manager.h>
    3534
     
    8180        endpoint_destroy(node->ep);
    8281        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);
    9182}
    9283/*----------------------------------------------------------------------------*/
     
    211202
    212203        node_t *node = hash_table_get_instance(item, node_t, link);
    213         if (node->ep->active)
    214                 return EBUSY;
    215 
    216204        instance->free_bw += node->bw;
    217205        hash_table_remove(&instance->ep_table, key, MAX_KEYS);
     
    242230        return node->ep;
    243231}
    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 < 0
    258             || 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.