Changeset 79ae36dd in mainline for uspace/lib/usbvirt/src/ipc_hc.c
- Timestamp:
- 2011-06-08T19:01:55Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0eff68e
- Parents:
- 764d71e
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbvirt/src/ipc_hc.c
r764d71e r79ae36dd 45 45 /** Send control read transfer to virtual USB device. 46 46 * 47 * @param phone IPC phoneto the virtual device.47 * @param sess Session to the virtual device. 48 48 * @param ep Target endpoint number. 49 49 * @param setup_buffer Setup buffer. … … 52 52 * @param data_buffer_size Size of data buffer in bytes. 53 53 * @param data_transfered_size Number of actually transferred bytes. 54 * 54 55 * @return Error code. 55 */ 56 int usbvirt_ipc_send_control_read(int phone, 57 void *setup_buffer, size_t setup_buffer_size, 58 void *data_buffer, size_t data_buffer_size, size_t *data_transfered_size) 56 * 57 */ 58 int usbvirt_ipc_send_control_read(async_sess_t *sess, void *setup_buffer, 59 size_t setup_buffer_size, void *data_buffer, size_t data_buffer_size, 60 size_t *data_transfered_size) 59 61 { 60 if (phone < 0) { 61 return EINVAL; 62 } 63 if ((setup_buffer == NULL) || (setup_buffer_size == 0)) { 64 return EINVAL; 65 } 66 if ((data_buffer == NULL) || (data_buffer_size == 0)) { 67 return EINVAL; 68 } 69 70 aid_t opening_request = async_send_0(phone, 71 IPC_M_USBVIRT_CONTROL_READ, NULL); 62 if (!sess) 63 return EINVAL; 64 65 if ((setup_buffer == NULL) || (setup_buffer_size == 0)) 66 return EINVAL; 67 68 if ((data_buffer == NULL) || (data_buffer_size == 0)) 69 return EINVAL; 70 71 async_exch_t *exch = async_exchange_begin(sess); 72 73 aid_t opening_request = async_send_0(exch, IPC_M_USBVIRT_CONTROL_READ, 74 NULL); 72 75 if (opening_request == 0) { 73 return ENOMEM;74 }75 76 int rc = async_data_write_start(phone,77 76 async_exchange_end(exch); 77 return ENOMEM; 78 } 79 80 int rc = async_data_write_start(exch, setup_buffer, setup_buffer_size); 78 81 if (rc != EOK) { 82 async_exchange_end(exch); 79 83 async_wait_for(opening_request, NULL); 80 84 return rc; 81 85 } 82 86 83 87 ipc_call_t data_request_call; 84 aid_t data_request = async_data_read(phone, 85 data_buffer, data_buffer_size, 88 aid_t data_request = async_data_read(exch, data_buffer, data_buffer_size, 86 89 &data_request_call); 87 90 91 async_exchange_end(exch); 92 88 93 if (data_request == 0) { 89 94 async_wait_for(opening_request, NULL); 90 95 return ENOMEM; 91 96 } 92 97 93 98 sysarg_t data_request_rc; 94 99 sysarg_t opening_request_rc; 95 100 async_wait_for(data_request, &data_request_rc); 96 101 async_wait_for(opening_request, &opening_request_rc); 97 102 98 103 if (data_request_rc != EOK) { 99 104 /* Prefer the return code of the opening request. */ 100 if (opening_request_rc != EOK) {105 if (opening_request_rc != EOK) 101 106 return (int) opening_request_rc; 102 } else {107 else 103 108 return (int) data_request_rc; 104 105 }106 if (opening_request_rc != EOK) {109 } 110 111 if (opening_request_rc != EOK) 107 112 return (int) opening_request_rc; 108 } 109 110 if (data_transfered_size != NULL) { 113 114 if (data_transfered_size != NULL) 111 115 *data_transfered_size = IPC_GET_ARG2(data_request_call); 112 } 113 116 114 117 return EOK; 115 118 } … … 117 120 /** Send control write transfer to virtual USB device. 118 121 * 119 * @param phone IPC phoneto the virtual device.122 * @param sess Session to the virtual device. 120 123 * @param ep Target endpoint number. 121 124 * @param setup_buffer Setup buffer. … … 123 126 * @param data_buffer Data buffer (DATA stage of control transfer). 124 127 * @param data_buffer_size Size of data buffer in bytes. 128 * 125 129 * @return Error code. 126 * /127 int usbvirt_ipc_send_control_write(int phone, 128 void *setup_buffer, size_t setup_buffer_size,129 void *data_buffer, size_t data_buffer_size)130 * 131 */ 132 int usbvirt_ipc_send_control_write(async_sess_t *sess, void *setup_buffer, 133 size_t setup_buffer_size, void *data_buffer, size_t data_buffer_size) 130 134 { 131 if (phone < 0) { 132 return EINVAL; 133 } 134 if ((setup_buffer == NULL) || (setup_buffer_size == 0)) { 135 return EINVAL; 136 } 137 if ((data_buffer_size > 0) && (data_buffer == NULL)) { 138 return EINVAL; 139 } 140 141 aid_t opening_request = async_send_1(phone, 142 IPC_M_USBVIRT_CONTROL_WRITE, data_buffer_size, NULL); 135 if (!sess) 136 return EINVAL; 137 138 if ((setup_buffer == NULL) || (setup_buffer_size == 0)) 139 return EINVAL; 140 141 if ((data_buffer_size > 0) && (data_buffer == NULL)) 142 return EINVAL; 143 144 async_exch_t *exch = async_exchange_begin(sess); 145 146 aid_t opening_request = async_send_1(exch, IPC_M_USBVIRT_CONTROL_WRITE, 147 data_buffer_size, NULL); 143 148 if (opening_request == 0) { 144 return ENOMEM;145 }146 147 int rc = async_data_write_start(phone,148 149 async_exchange_end(exch); 150 return ENOMEM; 151 } 152 153 int rc = async_data_write_start(exch, setup_buffer, setup_buffer_size); 149 154 if (rc != EOK) { 155 async_exchange_end(exch); 150 156 async_wait_for(opening_request, NULL); 151 157 return rc; 152 158 } 153 159 154 160 if (data_buffer_size > 0) { 155 rc = async_data_write_start(phone, 156 data_buffer, data_buffer_size); 157 161 rc = async_data_write_start(exch, data_buffer, data_buffer_size); 158 162 if (rc != EOK) { 163 async_exchange_end(exch); 159 164 async_wait_for(opening_request, NULL); 160 165 return rc; 161 166 } 162 167 } 163 168 169 async_exchange_end(exch); 170 164 171 sysarg_t opening_request_rc; 165 172 async_wait_for(opening_request, &opening_request_rc); 166 173 167 174 return (int) opening_request_rc; 168 175 } … … 170 177 /** Request data transfer from virtual USB device. 171 178 * 172 * @param phone IPC phoneto the virtual device.179 * @param sess Session to the virtual device. 173 180 * @param ep Target endpoint number. 174 181 * @param tr_type Transfer type (interrupt or bulk). … … 176 183 * @param data_size Size of the data buffer in bytes. 177 184 * @param act_size Number of actually returned bytes. 185 * 178 186 * @return Error code. 179 */ 180 int usbvirt_ipc_send_data_in(int phone, usb_endpoint_t ep, 187 * 188 */ 189 int usbvirt_ipc_send_data_in(async_sess_t *sess, usb_endpoint_t ep, 181 190 usb_transfer_type_t tr_type, void *data, size_t data_size, size_t *act_size) 182 191 { 183 if ( phone < 0) {184 return EINVAL; 185 }192 if (!sess) 193 return EINVAL; 194 186 195 usbvirt_hc_to_device_method_t method; 196 187 197 switch (tr_type) { 188 198 case USB_TRANSFER_INTERRUPT: … … 195 205 return EINVAL; 196 206 } 197 if ((ep <= 0) || (ep >= USBVIRT_ENDPOINT_MAX)) { 198 return EINVAL; 199 } 200 if ((data == NULL) || (data_size == 0)) { 201 return EINVAL; 202 } 203 204 205 aid_t opening_request = async_send_2(phone, method, ep, tr_type, NULL); 207 208 if ((ep <= 0) || (ep >= USBVIRT_ENDPOINT_MAX)) 209 return EINVAL; 210 211 if ((data == NULL) || (data_size == 0)) 212 return EINVAL; 213 214 async_exch_t *exch = async_exchange_begin(sess); 215 216 aid_t opening_request = async_send_2(exch, method, ep, tr_type, NULL); 206 217 if (opening_request == 0) { 207 return ENOMEM;208 }209 210 218 async_exchange_end(exch); 219 return ENOMEM; 220 } 221 211 222 ipc_call_t data_request_call; 212 aid_t data_request = async_data_read(phone, 213 data, data_size, &data_request_call); 214 223 aid_t data_request = async_data_read(exch, data, data_size, 224 &data_request_call); 225 226 async_exchange_end(exch); 227 215 228 if (data_request == 0) { 216 229 async_wait_for(opening_request, NULL); 217 230 return ENOMEM; 218 231 } 219 232 220 233 sysarg_t data_request_rc; 221 234 sysarg_t opening_request_rc; 222 235 async_wait_for(data_request, &data_request_rc); 223 236 async_wait_for(opening_request, &opening_request_rc); 224 237 225 238 if (data_request_rc != EOK) { 226 239 /* Prefer the return code of the opening request. */ 227 if (opening_request_rc != EOK) {240 if (opening_request_rc != EOK) 228 241 return (int) opening_request_rc; 229 } else {242 else 230 243 return (int) data_request_rc; 231 232 }233 if (opening_request_rc != EOK) {244 } 245 246 if (opening_request_rc != EOK) 234 247 return (int) opening_request_rc; 235 } 236 237 if (act_size != NULL) { 248 249 if (act_size != NULL) 238 250 *act_size = IPC_GET_ARG2(data_request_call); 239 } 240 251 241 252 return EOK; 242 253 } … … 244 255 /** Send data to virtual USB device. 245 256 * 246 * @param phone IPC phoneto the virtual device.257 * @param sess Session to the virtual device. 247 258 * @param ep Target endpoint number. 248 259 * @param tr_type Transfer type (interrupt or bulk). 249 260 * @param data Data buffer. 250 261 * @param data_size Size of the data buffer in bytes. 262 * 251 263 * @return Error code. 252 */ 253 int usbvirt_ipc_send_data_out(int phone, usb_endpoint_t ep, 264 * 265 */ 266 int usbvirt_ipc_send_data_out(async_sess_t *sess, usb_endpoint_t ep, 254 267 usb_transfer_type_t tr_type, void *data, size_t data_size) 255 268 { 256 if ( phone < 0) {257 return EINVAL; 258 }269 if (!sess) 270 return EINVAL; 271 259 272 usbvirt_hc_to_device_method_t method; 273 260 274 switch (tr_type) { 261 275 case USB_TRANSFER_INTERRUPT: … … 268 282 return EINVAL; 269 283 } 270 if ((ep <= 0) || (ep >= USBVIRT_ENDPOINT_MAX)) { 271 return EINVAL; 272 } 273 if ((data == NULL) || (data_size == 0)) { 274 return EINVAL; 275 } 276 277 aid_t opening_request = async_send_1(phone, method, ep, NULL); 284 285 if ((ep <= 0) || (ep >= USBVIRT_ENDPOINT_MAX)) 286 return EINVAL; 287 288 if ((data == NULL) || (data_size == 0)) 289 return EINVAL; 290 291 async_exch_t *exch = async_exchange_begin(sess); 292 293 aid_t opening_request = async_send_1(exch, method, ep, NULL); 278 294 if (opening_request == 0) { 279 return ENOMEM; 280 } 281 282 int rc = async_data_write_start(phone, 283 data, data_size); 295 async_exchange_end(exch); 296 return ENOMEM; 297 } 298 299 int rc = async_data_write_start(exch, data, data_size); 300 301 async_exchange_end(exch); 302 284 303 if (rc != EOK) { 285 304 async_wait_for(opening_request, NULL); 286 305 return rc; 287 306 } 288 307 289 308 sysarg_t opening_request_rc; 290 309 async_wait_for(opening_request, &opening_request_rc); 291 310 292 311 return (int) opening_request_rc; 293 312 } 294 313 295 296 314 /** 297 315 * @}
Note:
See TracChangeset
for help on using the changeset viewer.