Changeset a35b458 in mainline for uspace/lib/usbvirt/src/ipc_hc.c
- Timestamp:
- 2018-03-02T20:10:49Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbvirt/src/ipc_hc.c
r3061bc1 ra35b458 61 61 if (!sess) 62 62 return EINVAL; 63 63 64 64 if ((setup_buffer == NULL) || (setup_buffer_size == 0)) 65 65 return EINVAL; 66 66 67 67 if ((data_buffer == NULL) || (data_buffer_size == 0)) 68 68 return EINVAL; 69 69 70 70 async_exch_t *exch = async_exchange_begin(sess); 71 71 72 72 aid_t opening_request = async_send_0(exch, IPC_M_USBVIRT_CONTROL_READ, 73 73 NULL); … … 76 76 return ENOMEM; 77 77 } 78 78 79 79 errno_t rc = async_data_write_start(exch, setup_buffer, 80 80 setup_buffer_size); … … 84 84 return rc; 85 85 } 86 86 87 87 ipc_call_t data_request_call; 88 88 aid_t data_request = async_data_read(exch, data_buffer, 89 89 data_buffer_size, &data_request_call); 90 90 91 91 async_exchange_end(exch); 92 92 93 93 if (data_request == 0) { 94 94 async_forget(opening_request); 95 95 return ENOMEM; 96 96 } 97 97 98 98 errno_t data_request_rc; 99 99 errno_t opening_request_rc; 100 100 async_wait_for(data_request, &data_request_rc); 101 101 async_wait_for(opening_request, &opening_request_rc); 102 102 103 103 if (data_request_rc != EOK) { 104 104 /* Prefer the return code of the opening request. */ … … 108 108 return (errno_t) data_request_rc; 109 109 } 110 110 111 111 if (opening_request_rc != EOK) 112 112 return (errno_t) opening_request_rc; 113 113 114 114 if (data_transferred_size != NULL) 115 115 *data_transferred_size = IPC_GET_ARG2(data_request_call); 116 116 117 117 return EOK; 118 118 } … … 135 135 if (!sess) 136 136 return EINVAL; 137 137 138 138 if ((setup_buffer == NULL) || (setup_buffer_size == 0)) 139 139 return EINVAL; 140 140 141 141 if ((data_buffer_size > 0) && (data_buffer == NULL)) 142 142 return EINVAL; 143 143 144 144 async_exch_t *exch = async_exchange_begin(sess); 145 145 146 146 aid_t opening_request = async_send_1(exch, IPC_M_USBVIRT_CONTROL_WRITE, 147 147 data_buffer_size, NULL); … … 150 150 return ENOMEM; 151 151 } 152 152 153 153 errno_t rc = async_data_write_start(exch, setup_buffer, 154 154 setup_buffer_size); … … 158 158 return rc; 159 159 } 160 160 161 161 if (data_buffer_size > 0) { 162 162 rc = async_data_write_start(exch, data_buffer, … … 168 168 } 169 169 } 170 170 171 171 async_exchange_end(exch); 172 172 173 173 errno_t opening_request_rc; 174 174 async_wait_for(opening_request, &opening_request_rc); 175 175 176 176 return (errno_t) opening_request_rc; 177 177 } … … 194 194 if (!sess) 195 195 return EINVAL; 196 196 197 197 usbvirt_hc_to_device_method_t method; 198 198 199 199 switch (tr_type) { 200 200 case USB_TRANSFER_INTERRUPT: … … 207 207 return EINVAL; 208 208 } 209 209 210 210 if ((ep <= 0) || (ep >= USBVIRT_ENDPOINT_MAX)) 211 211 return EINVAL; 212 212 213 213 if ((data == NULL) || (data_size == 0)) 214 214 return EINVAL; 215 215 216 216 async_exch_t *exch = async_exchange_begin(sess); 217 217 218 218 aid_t opening_request = async_send_2(exch, method, ep, tr_type, NULL); 219 219 if (opening_request == 0) { … … 221 221 return ENOMEM; 222 222 } 223 223 224 224 ipc_call_t data_request_call; 225 225 aid_t data_request = async_data_read(exch, data, data_size, 226 226 &data_request_call); 227 227 228 228 async_exchange_end(exch); 229 229 230 230 if (data_request == 0) { 231 231 async_forget(opening_request); 232 232 return ENOMEM; 233 233 } 234 234 235 235 errno_t data_request_rc; 236 236 errno_t opening_request_rc; 237 237 async_wait_for(data_request, &data_request_rc); 238 238 async_wait_for(opening_request, &opening_request_rc); 239 239 240 240 if (data_request_rc != EOK) { 241 241 /* Prefer the return code of the opening request. */ … … 245 245 return (errno_t) data_request_rc; 246 246 } 247 247 248 248 if (opening_request_rc != EOK) 249 249 return (errno_t) opening_request_rc; 250 250 251 251 if (act_size != NULL) 252 252 *act_size = IPC_GET_ARG2(data_request_call); 253 253 254 254 return EOK; 255 255 } … … 271 271 if (!sess) 272 272 return EINVAL; 273 273 274 274 usbvirt_hc_to_device_method_t method; 275 275 276 276 switch (tr_type) { 277 277 case USB_TRANSFER_INTERRUPT: … … 284 284 return EINVAL; 285 285 } 286 286 287 287 if ((ep <= 0) || (ep >= USBVIRT_ENDPOINT_MAX)) 288 288 return EINVAL; 289 289 290 290 if ((data == NULL) || (data_size == 0)) 291 291 return EINVAL; 292 292 293 293 async_exch_t *exch = async_exchange_begin(sess); 294 294 295 295 aid_t opening_request = async_send_1(exch, method, ep, NULL); 296 296 if (opening_request == 0) { … … 298 298 return ENOMEM; 299 299 } 300 300 301 301 errno_t rc = async_data_write_start(exch, data, data_size); 302 302 303 303 async_exchange_end(exch); 304 304 305 305 if (rc != EOK) { 306 306 async_forget(opening_request); 307 307 return rc; 308 308 } 309 309 310 310 errno_t opening_request_rc; 311 311 async_wait_for(opening_request, &opening_request_rc); 312 312 313 313 return (errno_t) opening_request_rc; 314 314 }
Note:
See TracChangeset
for help on using the changeset viewer.