Changeset ca07cd3 in mainline for uspace/lib/usbvirt/transaction.c
- Timestamp:
- 2010-10-25T13:23:33Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 23cb44b
- Parents:
- 355f7c2
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbvirt/transaction.c
r355f7c2 rca07cd3 38 38 #include <mem.h> 39 39 40 #include " ids.h"40 #include "hub.h" 41 41 #include "private.h" 42 42 43 static usb_direction_t setup_transaction_direction(usb_endpoint_t, void *, size_t); 44 static void process_control_transfer(usb_endpoint_t, usbvirt_control_transfer_t *); 43 static usb_direction_t setup_transaction_direction(usbvirt_device_t *, 44 usb_endpoint_t, void *, size_t); 45 static void process_control_transfer(usbvirt_device_t *, 46 usb_endpoint_t, usbvirt_control_transfer_t *); 45 47 46 48 /** Convert virtual USB transaction type to string. … … 60 62 } 61 63 64 /** SETUP transaction handling. 65 * The setup transaction only prepares control transfer on given endpoint. 66 */ 62 67 int transaction_setup(usbvirt_device_t *device, usb_endpoint_t endpoint, 63 68 void *buffer, size_t size) … … 72 77 } 73 78 74 transfer->direction = setup_transaction_direction( endpoint,79 transfer->direction = setup_transaction_direction(device, endpoint, 75 80 buffer, size); 76 81 transfer->request = buffer; … … 79 84 transfer->data_size = 0; 80 85 86 if (transfer->direction == USB_DIRECTION_IN) { 87 process_control_transfer(device, endpoint, transfer); 88 } 89 81 90 return EOK; 82 91 } 83 92 93 /** OUT transaction handling. 94 * The OUT transaction can trigger processing of a control transfer. 95 */ 84 96 int transaction_out(usbvirt_device_t *device, usb_endpoint_t endpoint, 85 97 void *buffer, size_t size) … … 133 145 } 134 146 147 /** IN transaction handling. 148 * The IN transaction can trigger processing of a control transfer. 149 */ 135 150 int transaction_in(usbvirt_device_t *device, usb_endpoint_t endpoint, 136 151 void *buffer, size_t size, size_t *data_size) … … 145 160 * This means end of input data. 146 161 */ 147 process_control_transfer( endpoint, transfer);162 process_control_transfer(device, endpoint, transfer); 148 163 } else { 149 164 /* … … 151 166 * of the buffer. 152 167 */ 153 // TODO: implement 168 // FIXME: handle when the HC wants the data back 169 // in more chunks 170 size_t actual_size = 0; 171 if (transfer->data) { 172 actual_size = transfer->data_size; 173 } 174 if (actual_size > size) { 175 actual_size = size; 176 } 177 if (actual_size > 0) { 178 memcpy(buffer, transfer->data, actual_size); 179 if (data_size) { 180 *data_size = actual_size; 181 } 182 } 154 183 } 155 184 … … 170 199 } 171 200 172 173 static usb_direction_t setup_transaction_direction(usb_endpoint_t endpoint, 201 /** Determine direction of control transfer. 202 * First, try the user provided callback, otherwise guess, believing that 203 * it uses the same format as control pipe 0. 204 */ 205 static usb_direction_t setup_transaction_direction(usbvirt_device_t *device, 206 usb_endpoint_t endpoint, 174 207 void *data, size_t size) 175 208 { … … 202 235 } 203 236 204 static void process_control_transfer(usb_endpoint_t endpoint, 237 /** Process control transfer. 238 */ 239 static void process_control_transfer(usbvirt_device_t *device, 240 usb_endpoint_t endpoint, 205 241 usbvirt_control_transfer_t *transfer) 206 242 { … … 213 249 if (rc == EFORWARD) { 214 250 if (endpoint == 0) { 215 rc = control_pipe( transfer);251 rc = control_pipe(device, transfer); 216 252 } 217 253 }
Note:
See TracChangeset
for help on using the changeset viewer.