Changes in uspace/lib/usb/src/usbdrv.c [0a6fa9f:fe4dd14] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usb/src/usbdrv.c
r0a6fa9f rfe4dd14 49 49 /** Storage for actual number of bytes transferred. */ 50 50 size_t *size_transferred; 51 /** Initial call repl y data. */51 /** Initial call replay data. */ 52 52 ipc_call_t reply; 53 53 /** Initial call identifier. */ 54 54 aid_t request; 55 /** Reply data for data read call. */56 ipc_call_t read_reply;57 /** Data read call identifier. */58 aid_t read_request;59 55 } transfer_info_t; 60 56 … … 84 80 IPC_M_USB_GET_HOST_CONTROLLER_HANDLE, &h); 85 81 86 async_hangup(parent_phone);82 ipc_hangup(parent_phone); 87 83 88 84 if (rc != EOK) { … … 144 140 145 141 if (rc != EOK) { 142 printf("usb_drv_get_my_address over %d failed: %s\n", phone, str_error(rc)); 146 143 return rc; 147 144 } … … 253 250 } 254 251 255 transfer->read_request = 0;256 252 transfer->size_transferred = NULL; 257 253 transfer->buffer = NULL; … … 319 315 } 320 316 321 transfer->read_request = 0;322 317 transfer->size_transferred = actual_size; 323 318 transfer->buffer = buffer; … … 332 327 &transfer->reply); 333 328 334 if (buffer != NULL) {335 transfer->read_request = async_data_read(phone, buffer, size,336 &transfer->read_reply);337 }338 339 329 *handle = (usb_handle_t) transfer; 340 330 … … 342 332 } 343 333 334 /** Read buffer from HCD. 335 * 336 * @param phone Opened phone to HCD. 337 * @param hash Buffer hash (obtained after completing IN transaction). 338 * @param buffer Buffer where to store data data. 339 * @param size Buffer size. 340 * @param actual_size Storage where actual number of bytes transferred will 341 * be stored. 342 * @return Error status. 343 */ 344 static int read_buffer_in(int phone, sysarg_t hash, 345 void *buffer, size_t size, size_t *actual_size) 346 { 347 ipc_call_t answer_data; 348 sysarg_t answer_rc; 349 aid_t req; 350 int rc; 351 352 req = async_send_2(phone, 353 DEV_IFACE_ID(USBHC_DEV_IFACE), 354 IPC_M_USBHC_GET_BUFFER, 355 hash, 356 &answer_data); 357 358 rc = async_data_read_start(phone, buffer, size); 359 if (rc != EOK) { 360 async_wait_for(req, NULL); 361 return EINVAL; 362 } 363 364 async_wait_for(req, &answer_rc); 365 rc = (int)answer_rc; 366 367 if (rc != EOK) { 368 return rc; 369 } 370 371 *actual_size = IPC_GET_ARG1(answer_data); 372 373 return EOK; 374 } 344 375 345 376 /** Blocks caller until given USB transaction is finished. … … 364 395 365 396 sysarg_t answer_rc; 397 async_wait_for(transfer->request, &answer_rc); 398 399 if (answer_rc != EOK) { 400 rc = (int) answer_rc; 401 goto leave; 402 } 366 403 367 404 /* … … 369 406 */ 370 407 if ((transfer->buffer != NULL) && (transfer->size > 0)) { 371 async_wait_for(transfer->read_request, &answer_rc); 372 373 if (answer_rc != EOK) { 374 rc = (int) answer_rc; 408 /* 409 * The buffer hash identifies the data on the server 410 * side. 411 * We will use it when actually reading-in the data. 412 */ 413 sysarg_t buffer_hash = IPC_GET_ARG1(transfer->reply); 414 if (buffer_hash == 0) { 415 rc = ENOENT; 375 416 goto leave; 376 417 } 377 418 378 if (transfer->size_transferred != NULL) { 379 *(transfer->size_transferred) 380 = IPC_GET_ARG2(transfer->read_reply); 419 size_t actual_size; 420 rc = read_buffer_in(transfer->phone, buffer_hash, 421 transfer->buffer, transfer->size, &actual_size); 422 423 if (rc != EOK) { 424 goto leave; 381 425 } 382 } 383 384 async_wait_for(transfer->request, &answer_rc); 385 386 if (answer_rc != EOK) { 387 rc = (int) answer_rc; 388 goto leave; 426 427 if (transfer->size_transferred) { 428 *(transfer->size_transferred) = actual_size; 429 } 389 430 } 390 431 … … 474 515 } 475 516 476 transfer->read_request = 0;477 517 transfer->size_transferred = NULL; 478 518 transfer->buffer = NULL; … … 580 620 } 581 621 582 transfer->read_request = async_data_read(phone, buffer, buffer_size,583 &transfer->read_reply);584 585 622 *handle = (usb_handle_t) transfer; 586 623
Note:
See TracChangeset
for help on using the changeset viewer.