Changeset 5fd9c30 in mainline for uspace/lib/usbhost/src/hcd.c
- Timestamp:
- 2017-10-21T20:52:56Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 766043c
- Parents:
- 74b852b
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbhost/src/hcd.c
r74b852b r5fd9c30 69 69 } 70 70 71 typedef struct {72 void *original_data;73 usbhc_iface_transfer_out_callback_t original_callback;74 usb_target_t target;75 hcd_t *hcd;76 } toggle_t;77 78 static void toggle_reset_callback(int retval, void *arg)79 {80 assert(arg);81 toggle_t *toggle = arg;82 if (retval == EOK) {83 usb_log_debug2("Reseting toggle on %d:%d.\n",84 toggle->target.address, toggle->target.endpoint);85 bus_reset_toggle(toggle->hcd->bus,86 toggle->target, toggle->target.endpoint == 0);87 }88 89 toggle->original_callback(retval, toggle->original_data);90 }91 92 71 /** Prepare generic usb_transfer_batch and schedule it. 93 72 * @param hcd Host controller driver. 94 * @param fun DDF fun95 73 * @param target address and endpoint number. 96 74 * @param setup_data Data to use in setup stage (Control communication type) … … 101 79 * @return Error code. 102 80 */ 103 int hcd_send_batch( 104 hcd_t *hcd, usb_target_t target, usb_direction_t direction, 105 void *data, size_t size, uint64_t setup_data, 106 usbhc_iface_transfer_in_callback_t in, 107 usbhc_iface_transfer_out_callback_t out, void *arg, const char* name) 81 int hcd_send_batch(hcd_t *hcd, usb_target_t target, usb_direction_t direction, 82 void *data, size_t size, uint64_t setup_data, 83 usbhc_iface_transfer_in_callback_t in, usbhc_iface_transfer_out_callback_t out, 84 void *arg, const char *name) 108 85 { 109 86 assert(hcd); … … 132 109 } 133 110 134 /* Check for commands that reset toggle bit */ 135 if (ep->transfer_type == USB_TRANSFER_CONTROL) { 136 const int reset_toggle = usb_request_needs_toggle_reset( 137 (usb_device_request_setup_packet_t *) &setup_data); 138 if (reset_toggle >= 0) { 139 assert(out); 140 toggle_t *toggle = malloc(sizeof(toggle_t)); 141 if (!toggle) 142 return ENOMEM; 143 toggle->target.address = target.address; 144 toggle->target.endpoint = reset_toggle; 145 toggle->original_callback = out; 146 toggle->original_data = arg; 147 toggle->hcd = hcd; 148 149 arg = toggle; 150 out = toggle_reset_callback; 151 } 152 } 153 154 usb_transfer_batch_t *batch = usb_transfer_batch_create( 155 ep, data, size, setup_data, in, out, arg); 111 usb_transfer_batch_t *batch = usb_transfer_batch_create(ep); 156 112 if (!batch) { 157 113 usb_log_error("Failed to create transfer batch.\n"); 158 114 return ENOMEM; 159 115 } 116 117 batch->buffer = data; 118 batch->buffer_size = size; 119 batch->setup.packed = setup_data; 120 batch->dir = direction; 121 122 /* Check for commands that reset toggle bit */ 123 if (ep->transfer_type == USB_TRANSFER_CONTROL) 124 batch->toggle_reset_mode 125 = usb_request_get_toggle_reset_mode(&batch->setup.packet); 126 127 usb_transfer_batch_set_old_handlers(batch, in, out, arg); 160 128 161 129 const int ret = hcd->ops.schedule(hcd, batch);
Note:
See TracChangeset
for help on using the changeset viewer.