Changeset a35b458 in mainline for uspace/lib/c/generic/devman.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/c/generic/devman.c
r3061bc1 ra35b458 62 62 { 63 63 fibril_mutex_lock(mtx); 64 64 65 65 if ((*dst == NULL) && (src != NULL)) 66 66 *dst = src; 67 67 68 68 fibril_mutex_unlock(mtx); 69 69 } … … 81 81 case INTERFACE_DDF_DRIVER: 82 82 fibril_mutex_lock(&devman_driver_block_mutex); 83 83 84 84 while (devman_driver_block_sess == NULL) { 85 85 clone_session(&devman_driver_mutex, devman_driver_sess, 86 86 &devman_driver_block_sess); 87 87 88 88 if (devman_driver_block_sess == NULL) 89 89 devman_driver_block_sess = … … 91 91 INTERFACE_DDF_DRIVER, 0); 92 92 } 93 93 94 94 fibril_mutex_unlock(&devman_driver_block_mutex); 95 95 96 96 clone_session(&devman_driver_mutex, devman_driver_block_sess, 97 97 &devman_driver_sess); 98 98 99 99 return async_exchange_begin(devman_driver_block_sess); 100 100 case INTERFACE_DDF_CLIENT: 101 101 fibril_mutex_lock(&devman_client_block_mutex); 102 102 103 103 while (devman_client_block_sess == NULL) { 104 104 clone_session(&devman_client_mutex, devman_client_sess, 105 105 &devman_client_block_sess); 106 106 107 107 if (devman_client_block_sess == NULL) 108 108 devman_client_block_sess = … … 110 110 INTERFACE_DDF_CLIENT, 0); 111 111 } 112 112 113 113 fibril_mutex_unlock(&devman_client_block_mutex); 114 114 115 115 clone_session(&devman_client_mutex, devman_client_block_sess, 116 116 &devman_client_sess); 117 117 118 118 return async_exchange_begin(devman_client_block_sess); 119 119 default: … … 134 134 case INTERFACE_DDF_DRIVER: 135 135 fibril_mutex_lock(&devman_driver_mutex); 136 136 137 137 if (devman_driver_sess == NULL) 138 138 devman_driver_sess = 139 139 service_connect(SERVICE_DEVMAN, 140 140 INTERFACE_DDF_DRIVER, 0); 141 141 142 142 fibril_mutex_unlock(&devman_driver_mutex); 143 143 144 144 if (devman_driver_sess == NULL) 145 145 return NULL; 146 146 147 147 return async_exchange_begin(devman_driver_sess); 148 148 case INTERFACE_DDF_CLIENT: 149 149 fibril_mutex_lock(&devman_client_mutex); 150 150 151 151 if (devman_client_sess == NULL) 152 152 devman_client_sess = 153 153 service_connect(SERVICE_DEVMAN, 154 154 INTERFACE_DDF_CLIENT, 0); 155 155 156 156 fibril_mutex_unlock(&devman_client_mutex); 157 157 158 158 if (devman_client_sess == NULL) 159 159 return NULL; 160 160 161 161 return async_exchange_begin(devman_client_sess); 162 162 default: … … 179 179 { 180 180 async_exch_t *exch = devman_exchange_begin_blocking(INTERFACE_DDF_DRIVER); 181 181 182 182 ipc_call_t answer; 183 183 aid_t req = async_send_2(exch, DEVMAN_DRIVER_REGISTER, 0, 0, &answer); 184 184 errno_t retval = async_data_write_start(exch, name, str_size(name)); 185 186 devman_exchange_end(exch); 187 185 186 devman_exchange_end(exch); 187 188 188 if (retval != EOK) { 189 189 async_forget(req); 190 190 return retval; 191 191 } 192 192 193 193 exch = devman_exchange_begin(INTERFACE_DDF_DRIVER); 194 194 async_connect_to_me(exch, 0, 0, 0); 195 195 devman_exchange_end(exch); 196 196 197 197 async_wait_for(req, &retval); 198 198 return retval; … … 218 218 unsigned long match_count = list_count(&match_ids->ids); 219 219 async_exch_t *exch = devman_exchange_begin_blocking(INTERFACE_DDF_DRIVER); 220 220 221 221 ipc_call_t answer; 222 222 aid_t req = async_send_3(exch, DEVMAN_ADD_FUNCTION, (sysarg_t) ftype, … … 228 228 return retval; 229 229 } 230 230 231 231 list_foreach(match_ids->ids, link, match_id_t, match_id) { 232 232 ipc_call_t answer2; … … 241 241 return retval; 242 242 } 243 243 244 244 async_wait_for(req2, &retval); 245 245 if (retval != EOK) { … … 249 249 } 250 250 } 251 252 devman_exchange_end(exch); 253 251 252 devman_exchange_end(exch); 253 254 254 async_wait_for(req, &retval); 255 255 if (retval == EOK) { … … 260 260 *funh = -1; 261 261 } 262 262 263 263 return retval; 264 264 } … … 268 268 { 269 269 async_exch_t *exch = devman_exchange_begin_blocking(INTERFACE_DDF_DRIVER); 270 270 271 271 ipc_call_t answer; 272 272 aid_t req = async_send_1(exch, DEVMAN_ADD_DEVICE_TO_CATEGORY, … … 274 274 errno_t retval = async_data_write_start(exch, cat_name, 275 275 str_size(cat_name)); 276 277 devman_exchange_end(exch); 278 276 277 devman_exchange_end(exch); 278 279 279 if (retval != EOK) { 280 280 async_forget(req); 281 281 return retval; 282 282 } 283 283 284 284 async_wait_for(req, &retval); 285 285 return retval; … … 289 289 { 290 290 async_sess_t *sess; 291 291 292 292 if (flags & IPC_FLAG_BLOCKING) 293 293 sess = service_connect_blocking(SERVICE_DEVMAN, … … 296 296 sess = service_connect(SERVICE_DEVMAN, 297 297 INTERFACE_DEVMAN_DEVICE, handle); 298 298 299 299 return sess; 300 300 } … … 311 311 async_exch_t *exch; 312 312 errno_t retval; 313 313 314 314 exch = devman_exchange_begin_blocking(INTERFACE_DDF_DRIVER); 315 315 retval = async_req_1_0(exch, DEVMAN_REMOVE_FUNCTION, (sysarg_t) funh); 316 316 devman_exchange_end(exch); 317 317 318 318 return retval; 319 319 } … … 324 324 if (exch == NULL) 325 325 return ENOMEM; 326 326 327 327 errno_t retval = async_req_1_0(exch, DEVMAN_DRV_FUN_ONLINE, funh); 328 328 329 329 devman_exchange_end(exch); 330 330 return retval; … … 336 336 if (exch == NULL) 337 337 return ENOMEM; 338 338 339 339 errno_t retval = async_req_1_0(exch, DEVMAN_DRV_FUN_OFFLINE, funh); 340 340 341 341 devman_exchange_end(exch); 342 342 return retval; … … 347 347 { 348 348 async_sess_t *sess; 349 349 350 350 if (flags & IPC_FLAG_BLOCKING) 351 351 sess = service_connect_blocking(SERVICE_DEVMAN, … … 354 354 sess = service_connect_blocking(SERVICE_DEVMAN, 355 355 INTERFACE_DEVMAN_PARENT, handle); 356 356 357 357 return sess; 358 358 } … … 362 362 { 363 363 async_exch_t *exch; 364 364 365 365 if (flags & IPC_FLAG_BLOCKING) 366 366 exch = devman_exchange_begin_blocking(INTERFACE_DDF_CLIENT); … … 370 370 return ENOMEM; 371 371 } 372 372 373 373 ipc_call_t answer; 374 374 aid_t req = async_send_2(exch, DEVMAN_DEVICE_GET_HANDLE, flags, 0, … … 376 376 errno_t retval = async_data_write_start(exch, pathname, 377 377 str_size(pathname)); 378 379 devman_exchange_end(exch); 380 378 379 devman_exchange_end(exch); 380 381 381 if (retval != EOK) { 382 382 async_forget(req); 383 383 return retval; 384 384 } 385 385 386 386 async_wait_for(req, &retval); 387 387 388 388 if (retval != EOK) { 389 389 if (handle != NULL) 390 390 *handle = (devman_handle_t) -1; 391 392 return retval; 393 } 394 391 392 return retval; 393 } 394 395 395 if (handle != NULL) 396 396 *handle = (devman_handle_t) IPC_GET_ARG1(answer); 397 397 398 398 return retval; 399 399 } … … 406 406 size_t act_size; 407 407 errno_t dretval; 408 408 409 409 exch = devman_exchange_begin_blocking(INTERFACE_DDF_CLIENT); 410 410 411 411 ipc_call_t answer; 412 412 aid_t req = async_send_2(exch, method, arg1, arg2, &answer); 413 413 aid_t dreq = async_data_read(exch, buf, buf_size - 1, &dreply); 414 414 async_wait_for(dreq, &dretval); 415 416 devman_exchange_end(exch); 417 415 416 devman_exchange_end(exch); 417 418 418 if (dretval != EOK) { 419 419 async_forget(req); 420 420 return dretval; 421 421 } 422 422 423 423 errno_t retval; 424 424 async_wait_for(req, &retval); 425 426 if (retval != EOK) { 427 return retval; 428 } 429 425 426 if (retval != EOK) { 427 return retval; 428 } 429 430 430 if (r1 != NULL) 431 431 *r1 = IPC_GET_ARG1(answer); … … 433 433 assert(act_size <= buf_size - 1); 434 434 buf[act_size] = '\0'; 435 435 436 436 return EOK; 437 437 } … … 475 475 if (exch == NULL) 476 476 return ENOMEM; 477 477 478 478 errno_t retval = async_req_1_0(exch, DEVMAN_FUN_ONLINE, funh); 479 479 480 480 devman_exchange_end(exch); 481 481 return retval; … … 487 487 if (exch == NULL) 488 488 return ENOMEM; 489 489 490 490 errno_t retval = async_req_1_0(exch, DEVMAN_FUN_OFFLINE, funh); 491 491 492 492 devman_exchange_end(exch); 493 493 return retval; … … 502 502 aid_t req = async_send_1(exch, method, arg1, &answer); 503 503 errno_t rc = async_data_read_start(exch, handle_buf, buf_size); 504 505 devman_exchange_end(exch); 506 504 505 devman_exchange_end(exch); 506 507 507 if (rc != EOK) { 508 508 async_forget(req); 509 509 return rc; 510 510 } 511 511 512 512 errno_t retval; 513 513 async_wait_for(req, &retval); 514 515 if (retval != EOK) { 516 return retval; 517 } 518 514 515 if (retval != EOK) { 516 return retval; 517 } 518 519 519 *act_size = IPC_GET_ARG1(answer); 520 520 return EOK; … … 579 579 if (exch == NULL) 580 580 return ENOMEM; 581 581 582 582 errno_t retval = async_req_1_1(exch, DEVMAN_FUN_GET_CHILD, 583 583 funh, devh); 584 584 585 585 devman_exchange_end(exch); 586 586 return retval; … … 599 599 if (exch == NULL) 600 600 return ENOMEM; 601 601 602 602 errno_t retval = async_req_1_1(exch, DEVMAN_DEV_GET_PARENT, 603 603 devh, funh); 604 604 605 605 devman_exchange_end(exch); 606 606 return retval; … … 612 612 if (exch == NULL) 613 613 return ENOMEM; 614 614 615 615 errno_t retval = async_req_1_1(exch, DEVMAN_FUN_SID_TO_HANDLE, 616 616 sid, handle); 617 617 618 618 devman_exchange_end(exch); 619 619 return retval; … … 640 640 if (exch == NULL) 641 641 return ENOMEM; 642 642 643 643 ipc_call_t answer; 644 644 aid_t req = async_send_0(exch, DEVMAN_DRIVER_GET_HANDLE, &answer); 645 645 errno_t retval = async_data_write_start(exch, drvname, 646 646 str_size(drvname)); 647 648 devman_exchange_end(exch); 649 647 648 devman_exchange_end(exch); 649 650 650 if (retval != EOK) { 651 651 async_forget(req); 652 652 return retval; 653 653 } 654 654 655 655 async_wait_for(req, &retval); 656 656 657 657 if (retval != EOK) { 658 658 if (handle != NULL) 659 659 *handle = (devman_handle_t) -1; 660 661 return retval; 662 } 663 660 661 return retval; 662 } 663 664 664 if (handle != NULL) 665 665 *handle = (devman_handle_t) IPC_GET_ARG1(answer); 666 666 667 667 return retval; 668 668 } … … 695 695 if (exch == NULL) 696 696 return ENOMEM; 697 697 698 698 errno_t rc = async_req_1_1(exch, DEVMAN_DRIVER_GET_STATE, drvh, 699 699 &state); 700 700 701 701 devman_exchange_end(exch); 702 702 if (rc != EOK) … … 712 712 if (exch == NULL) 713 713 return ENOMEM; 714 714 715 715 errno_t rc = async_req_1_0(exch, DEVMAN_DRIVER_LOAD, drvh); 716 716 717 717 devman_exchange_end(exch); 718 718 return rc; … … 724 724 if (exch == NULL) 725 725 return ENOMEM; 726 726 727 727 errno_t rc = async_req_1_0(exch, DEVMAN_DRIVER_UNLOAD, drvh); 728 728 729 729 devman_exchange_end(exch); 730 730 return rc;
Note:
See TracChangeset
for help on using the changeset viewer.