Changeset 88be3a0b in mainline for uspace/drv/vhc/transfer.c
- Timestamp:
- 2011-05-17T18:44:43Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 6bfaab5
- Parents:
- d83bf51 (diff), 2586860 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/vhc/transfer.c
rd83bf51 r88be3a0b 4 4 #include <usbvirt/ipc.h> 5 5 #include "vhcd.h" 6 7 #define list_foreach(pos, head) \8 for (pos = (head)->next; pos != (head); \9 pos = pos->next)10 6 11 7 vhc_transfer_t *vhc_transfer_create(usb_address_t address, usb_endpoint_t ep, … … 67 63 fibril_mutex_lock(&vhc->guard); 68 64 69 link_t *pos;70 65 bool target_found = false; 71 list_foreach( pos, &vhc->devices) {66 list_foreach(vhc->devices, pos) { 72 67 vhc_virtdev_t *dev = list_get_instance(pos, vhc_virtdev_t, link); 73 68 fibril_mutex_lock(&dev->guard); … … 161 156 } 162 157 158 static vhc_transfer_t *dequeue_first_transfer(vhc_virtdev_t *dev) 159 { 160 assert(fibril_mutex_is_locked(&dev->guard)); 161 assert(!list_empty(&dev->transfer_queue)); 162 163 vhc_transfer_t *transfer = list_get_instance(dev->transfer_queue.next, 164 vhc_transfer_t, link); 165 list_remove(&transfer->link); 166 167 return transfer; 168 } 169 170 171 static void execute_transfer_callback_and_free(vhc_transfer_t *transfer, 172 size_t data_transfer_size, int outcome) 173 { 174 assert(outcome != ENAK); 175 176 usb_log_debug2("Transfer %p ended: %s.\n", 177 transfer, str_error(outcome)); 178 179 if (transfer->direction == USB_DIRECTION_IN) { 180 transfer->callback_in(transfer->ddf_fun, outcome, 181 data_transfer_size, transfer->callback_arg); 182 } else { 183 assert(transfer->direction == USB_DIRECTION_OUT); 184 transfer->callback_out(transfer->ddf_fun, outcome, 185 transfer->callback_arg); 186 } 187 188 free(transfer); 189 } 163 190 164 191 int vhc_transfer_queue_processor(void *arg) … … 174 201 } 175 202 176 vhc_transfer_t *transfer = list_get_instance(dev->transfer_queue.next, 177 vhc_transfer_t, link); 178 list_remove(&transfer->link); 203 vhc_transfer_t *transfer = dequeue_first_transfer(dev); 179 204 fibril_mutex_unlock(&dev->guard); 180 205 … … 214 239 215 240 if (rc != ENAK) { 216 usb_log_debug2("Transfer %p ended: %s.\n", 217 transfer, str_error(rc)); 218 if (transfer->direction == USB_DIRECTION_IN) { 219 transfer->callback_in(transfer->ddf_fun, rc, 220 data_transfer_size, transfer->callback_arg); 221 } else { 222 assert(transfer->direction == USB_DIRECTION_OUT); 223 transfer->callback_out(transfer->ddf_fun, rc, 224 transfer->callback_arg); 225 } 226 free(transfer); 241 execute_transfer_callback_and_free(transfer, 242 data_transfer_size, rc); 227 243 } 228 244 … … 231 247 } 232 248 249 /* Immediately fail all remaining transfers. */ 250 while (!list_empty(&dev->transfer_queue)) { 251 vhc_transfer_t *transfer = dequeue_first_transfer(dev); 252 execute_transfer_callback_and_free(transfer, 0, EBADCHECKSUM); 253 } 254 233 255 fibril_mutex_unlock(&dev->guard); 234 256 235 // TODO - destroy pending transfers236 237 257 return EOK; 238 258 }
Note:
See TracChangeset
for help on using the changeset viewer.