Changeset f6577d9 in mainline for uspace/drv/bus/usb/vhc/transfer.c
- Timestamp:
- 2012-12-22T15:48:33Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f5f0cfb
- Parents:
- 01eeaaf
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/vhc/transfer.c
r01eeaaf rf6577d9 29 29 #include <errno.h> 30 30 #include <str_error.h> 31 #include <usb/debug.h> 31 32 #include <usbvirt/device.h> 32 33 #include <usbvirt/ipc.h> 33 34 #include "vhcd.h" 34 35 vhc_transfer_t *vhc_transfer_create(usb_address_t address, usb_endpoint_t ep,36 usb_direction_t dir, usb_transfer_type_t tr_type,37 ddf_fun_t *fun, void *callback_arg)38 {39 vhc_transfer_t *result = malloc(sizeof(vhc_transfer_t));40 if (result == NULL) {41 return NULL;42 }43 link_initialize(&result->link);44 result->address = address;45 result->endpoint = ep;46 result->direction = dir;47 result->transfer_type = tr_type;48 result->setup_buffer = NULL;49 result->setup_buffer_size = 0;50 result->data_buffer = NULL;51 result->data_buffer_size = 0;52 result->ddf_fun = fun;53 result->callback_arg = callback_arg;54 result->callback_in = NULL;55 result->callback_out = NULL;56 57 usb_log_debug2("Created transfer %p (%d.%d %s %s)\n", result,58 address, ep, usb_str_transfer_type_short(tr_type),59 dir == USB_DIRECTION_IN ? "in" : "out");60 61 return result;62 }63 64 static bool is_set_address_transfer(vhc_transfer_t *transfer)65 {66 if (transfer->batch->ep->endpoint != 0) {67 return false;68 }69 if (transfer->batch->ep->transfer_type != USB_TRANSFER_CONTROL) {70 return false;71 }72 if (usb_transfer_batch_direction(transfer->batch) != USB_DIRECTION_OUT) {73 return false;74 }75 const usb_device_request_setup_packet_t *setup =76 (void*)transfer->batch->setup_buffer;77 if (setup->request_type != 0) {78 return false;79 }80 if (setup->request != USB_DEVREQ_SET_ADDRESS) {81 return false;82 }83 84 return true;85 }86 35 87 36 int vhc_schedule(hcd_t *hcd, usb_transfer_batch_t *batch) … … 122 71 } 123 72 124 int vhc_virtdev_add_transfer(vhc_data_t *vhc, vhc_transfer_t *transfer) 125 { 126 fibril_mutex_lock(&vhc->guard); 127 128 bool target_found = false; 129 list_foreach(vhc->devices, pos) { 130 vhc_virtdev_t *dev = list_get_instance(pos, vhc_virtdev_t, link); 131 fibril_mutex_lock(&dev->guard); 132 if (dev->address == transfer->address) { 133 if (target_found) { 134 usb_log_warning("Transfer would be accepted by more devices!\n"); 135 goto next; 136 } 137 target_found = true; 138 list_append(&transfer->link, &dev->transfer_queue); 139 } 140 next: 141 fibril_mutex_unlock(&dev->guard); 142 } 143 144 fibril_mutex_unlock(&vhc->guard); 145 146 if (target_found) { 147 return EOK; 148 } else { 149 return ENOENT; 150 } 73 static bool is_set_address_transfer(vhc_transfer_t *transfer) 74 { 75 if (transfer->batch->ep->endpoint != 0) { 76 return false; 77 } 78 if (transfer->batch->ep->transfer_type != USB_TRANSFER_CONTROL) { 79 return false; 80 } 81 if (usb_transfer_batch_direction(transfer->batch) != USB_DIRECTION_OUT) { 82 return false; 83 } 84 const usb_device_request_setup_packet_t *setup = 85 (void*)transfer->batch->setup_buffer; 86 if (setup->request_type != 0) { 87 return false; 88 } 89 if (setup->request != USB_DEVREQ_SET_ADDRESS) { 90 return false; 91 } 92 93 return true; 151 94 } 152 95 … … 234 177 return transfer; 235 178 } 236 237 179 238 180 static void execute_transfer_callback_and_free(vhc_transfer_t *transfer, … … 246 188 usb_transfer_batch_destroy(transfer->batch); 247 189 free(transfer); 248 #if 0249 assert(outcome != ENAK);250 251 usb_log_debug2("Transfer %p ended: %s.\n",252 transfer, str_error(outcome));253 254 if (transfer->direction == USB_DIRECTION_IN) {255 transfer->callback_in(outcome,256 data_transfer_size, transfer->callback_arg);257 } else {258 assert(transfer->direction == USB_DIRECTION_OUT);259 transfer->callback_out(outcome, transfer->callback_arg);260 }261 262 free(transfer);263 #endif264 190 } 265 191 … … 332 258 return EOK; 333 259 } 334
Note:
See TracChangeset
for help on using the changeset viewer.