Changeset 1affef2f in mainline for uspace/lib/usbhost/src/hcd.c


Ignore:
Timestamp:
2012-12-22T23:20:45Z (13 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
3c4663e
Parents:
a6a9910
Message:

libusbhost: Use callback wrapper for toggle handling.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbhost/src/hcd.c

    ra6a9910 r1affef2f  
    3838#include <usb_iface.h>
    3939#include <usb/debug.h>
     40#include <usb/request.h>
    4041
    4142#include <usb/host/hcd.h>
     
    6061        hcd->ep_add_hook = NULL;
    6162        hcd->ep_remove_hook = NULL;
     63}
     64
     65typedef struct {
     66        void *original_data;
     67        usbhc_iface_transfer_out_callback_t original_callback;
     68        usb_target_t target;
     69        hcd_t *hcd;
     70} toggle_t;
     71
     72static void toggle_reset_callback(int retval, void *arg)
     73{
     74        assert(arg);
     75        toggle_t *toggle = arg;
     76        if (retval == EOK) {
     77                usb_log_debug2("Reseting toggle on %d:%d.\n",
     78                    toggle->target.address, toggle->target.endpoint);
     79                usb_endpoint_manager_reset_toggle(&toggle->hcd->ep_manager,
     80                    toggle->target, toggle->target.endpoint == 0);
     81        }
     82
     83        toggle->original_callback(retval, toggle->original_data);
    6284}
    6385
     
    106128        }
    107129
    108         /* No private data and no private data dtor */
    109         usb_transfer_batch_t *batch =
    110             usb_transfer_batch_create(ep, data, size, setup_data,
    111             in, out, arg, fun);
     130        /* Check for commands that reset toggle bit */
     131        if (ep->transfer_type == USB_TRANSFER_CONTROL) {
     132                const int reset_toggle = usb_request_needs_toggle_reset(
     133                    (usb_device_request_setup_packet_t *) &setup_data);
     134                if (reset_toggle >= 0) {
     135                        assert(out);
     136                        toggle_t *toggle = malloc(sizeof(toggle_t));
     137                        if (!toggle)
     138                                return ENOMEM;
     139                        toggle->target.address = target.address;
     140                        toggle->target.endpoint = reset_toggle;
     141                        toggle->original_callback = out;
     142                        toggle->original_data = arg;
     143                        toggle->hcd = hcd;
     144
     145                        arg = toggle;
     146                        out = toggle_reset_callback;
     147                }
     148        }
     149
     150        usb_transfer_batch_t *batch = usb_transfer_batch_create(
     151            ep, data, size, setup_data, in, out, arg, fun);
    112152        if (!batch) {
    113153                return ENOMEM;
Note: See TracChangeset for help on using the changeset viewer.