Changeset 984a9ba in mainline for uspace/lib/drv/generic/driver.c
- Timestamp:
- 2018-07-05T09:34:09Z (6 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 63d46341
- Parents:
- 76f566d
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/drv/generic/driver.c
r76f566d r984a9ba 118 118 } 119 119 120 static void driver_dev_add( cap_call_handle_t icall_handle,ipc_call_t *icall)120 static void driver_dev_add(ipc_call_t *icall) 121 121 { 122 122 devman_handle_t dev_handle = IPC_GET_ARG1(*icall); … … 126 126 errno_t rc = async_data_write_accept((void **) &dev_name, true, 0, 0, 0, 0); 127 127 if (rc != EOK) { 128 async_answer_0(icall _handle, rc);128 async_answer_0(icall, rc); 129 129 return; 130 130 } … … 134 134 if (stopping) { 135 135 fibril_rwlock_read_unlock(&stopping_lock); 136 async_answer_0(icall _handle, EIO);136 async_answer_0(icall, EIO); 137 137 return; 138 138 } … … 142 142 fibril_rwlock_read_unlock(&stopping_lock); 143 143 free(dev_name); 144 async_answer_0(icall _handle, ENOMEM);144 async_answer_0(icall, ENOMEM); 145 145 return; 146 146 } … … 162 162 fibril_rwlock_read_unlock(&stopping_lock); 163 163 dev_del_ref(dev); 164 async_answer_0(icall _handle, res);164 async_answer_0(icall, res); 165 165 return; 166 166 } … … 171 171 fibril_rwlock_read_unlock(&stopping_lock); 172 172 173 async_answer_0(icall _handle, res);174 } 175 176 static void driver_dev_remove( cap_call_handle_t icall_handle,ipc_call_t *icall)173 async_answer_0(icall, res); 174 } 175 176 static void driver_dev_remove(ipc_call_t *icall) 177 177 { 178 178 devman_handle_t devh = IPC_GET_ARG1(*icall); … … 185 185 186 186 if (dev == NULL) { 187 async_answer_0(icall _handle, ENOENT);187 async_answer_0(icall, ENOENT); 188 188 return; 189 189 } … … 204 204 205 205 dev_del_ref(dev); 206 async_answer_0(icall _handle, rc);207 } 208 209 static void driver_dev_gone( cap_call_handle_t icall_handle,ipc_call_t *icall)206 async_answer_0(icall, rc); 207 } 208 209 static void driver_dev_gone(ipc_call_t *icall) 210 210 { 211 211 devman_handle_t devh = IPC_GET_ARG1(*icall); … … 218 218 219 219 if (dev == NULL) { 220 async_answer_0(icall _handle, ENOENT);220 async_answer_0(icall, ENOENT); 221 221 return; 222 222 } … … 237 237 238 238 dev_del_ref(dev); 239 async_answer_0(icall _handle, rc);240 } 241 242 static void driver_fun_online( cap_call_handle_t icall_handle,ipc_call_t *icall)239 async_answer_0(icall, rc); 240 } 241 242 static void driver_fun_online(ipc_call_t *icall) 243 243 { 244 244 devman_handle_t funh = IPC_GET_ARG1(*icall); … … 258 258 259 259 if (fun == NULL) { 260 async_answer_0(icall _handle, ENOENT);260 async_answer_0(icall, ENOENT); 261 261 return; 262 262 } … … 272 272 fun_del_ref(fun); 273 273 274 async_answer_0(icall _handle, rc);275 } 276 277 static void driver_fun_offline( cap_call_handle_t icall_handle,ipc_call_t *icall)274 async_answer_0(icall, rc); 275 } 276 277 static void driver_fun_offline(ipc_call_t *icall) 278 278 { 279 279 devman_handle_t funh = IPC_GET_ARG1(*icall); … … 293 293 294 294 if (fun == NULL) { 295 async_answer_0(icall _handle, ENOENT);295 async_answer_0(icall, ENOENT); 296 296 return; 297 297 } … … 305 305 rc = ENOTSUP; 306 306 307 async_answer_0(icall _handle, rc);308 } 309 310 static void driver_stop( cap_call_handle_t icall_handle,ipc_call_t *icall)307 async_answer_0(icall, rc); 308 } 309 310 static void driver_stop(ipc_call_t *icall) 311 311 { 312 312 /* Prevent new devices from being added */ … … 321 321 stopping = false; 322 322 fibril_rwlock_write_unlock(&stopping_lock); 323 async_answer_0(icall _handle, EBUSY);323 async_answer_0(icall, EBUSY); 324 324 return; 325 325 } … … 333 333 334 334 /* Reply with success and terminate */ 335 async_answer_0(icall _handle, EOK);335 async_answer_0(icall, EOK); 336 336 exit(0); 337 337 } 338 338 339 static void driver_connection_devman(cap_call_handle_t icall_handle, ipc_call_t *icall, 340 void *arg) 339 static void driver_connection_devman(ipc_call_t *icall, void *arg) 341 340 { 342 341 /* Accept connection */ 343 async_answer_0(icall _handle, EOK);342 async_answer_0(icall, EOK); 344 343 345 344 while (true) { 346 345 ipc_call_t call; 347 cap_call_handle_t chandle =async_get_call(&call);346 async_get_call(&call); 348 347 349 348 if (!IPC_GET_IMETHOD(call)) … … 352 351 switch (IPC_GET_IMETHOD(call)) { 353 352 case DRIVER_DEV_ADD: 354 driver_dev_add( chandle,&call);353 driver_dev_add(&call); 355 354 break; 356 355 case DRIVER_DEV_REMOVE: 357 driver_dev_remove( chandle,&call);356 driver_dev_remove(&call); 358 357 break; 359 358 case DRIVER_DEV_GONE: 360 driver_dev_gone( chandle,&call);359 driver_dev_gone(&call); 361 360 break; 362 361 case DRIVER_FUN_ONLINE: 363 driver_fun_online( chandle,&call);362 driver_fun_online(&call); 364 363 break; 365 364 case DRIVER_FUN_OFFLINE: 366 driver_fun_offline( chandle,&call);365 driver_fun_offline(&call); 367 366 break; 368 367 case DRIVER_STOP: 369 driver_stop( chandle,&call);368 driver_stop(&call); 370 369 break; 371 370 default: 372 async_answer_0( chandle, ENOTSUP);371 async_answer_0(&call, ENOTSUP); 373 372 } 374 373 } … … 381 380 * 382 381 */ 383 static void driver_connection_gen( cap_call_handle_t icall_handle,ipc_call_t *icall, bool drv)382 static void driver_connection_gen(ipc_call_t *icall, bool drv) 384 383 { 385 384 /* … … 398 397 printf("%s: driver_connection_gen error - no function with handle" 399 398 " %" PRIun " was found.\n", driver->name, handle); 400 async_answer_0(icall _handle, ENOENT);399 async_answer_0(icall, ENOENT); 401 400 return; 402 401 } … … 404 403 if (fun->conn_handler != NULL) { 405 404 /* Driver has a custom connection handler. */ 406 (*fun->conn_handler)(icall _handle, icall, (void *)fun);405 (*fun->conn_handler)(icall, (void *)fun); 407 406 fun_del_ref(fun); 408 407 return; … … 419 418 ret = (*fun->ops->open)(fun); 420 419 421 async_answer_0(icall _handle, ret);420 async_answer_0(icall, ret); 422 421 if (ret != EOK) { 423 422 fun_del_ref(fun); … … 426 425 427 426 while (true) { 428 cap_call_handle_t chandle;429 427 ipc_call_t call; 430 chandle = async_get_call(&call); 428 async_get_call(&call); 429 431 430 sysarg_t method = IPC_GET_IMETHOD(call); 432 431 … … 435 434 if (fun->ops != NULL && fun->ops->close != NULL) 436 435 (*fun->ops->close)(fun); 437 async_answer_0( chandle, EOK);436 async_answer_0(&call, EOK); 438 437 fun_del_ref(fun); 439 438 return; … … 448 447 function_get_default_handler(fun); 449 448 if (default_handler != NULL) { 450 (*default_handler)(fun, chandle,&call);449 (*default_handler)(fun, &call); 451 450 continue; 452 451 } … … 459 458 "invalid interface id %d.", 460 459 driver->name, iface_idx); 461 async_answer_0( chandle, ENOTSUP);460 async_answer_0(&call, ENOTSUP); 462 461 continue; 463 462 } … … 471 470 printf("Function with handle %" PRIun " has no interface " 472 471 "with id %d.\n", handle, iface_idx); 473 async_answer_0( chandle, ENOTSUP);472 async_answer_0(&call, ENOTSUP); 474 473 continue; 475 474 } … … 490 489 printf("%s: driver_connection_gen error - " 491 490 "invalid interface method.", driver->name); 492 async_answer_0( chandle, ENOTSUP);491 async_answer_0(&call, ENOTSUP); 493 492 continue; 494 493 } … … 500 499 * associated with the function by its driver. 501 500 */ 502 (*iface_method_ptr)(fun, ops, chandle, &call); 503 } 504 } 505 506 static void driver_connection_driver(cap_call_handle_t icall_handle, ipc_call_t *icall, 507 void *arg) 508 { 509 driver_connection_gen(icall_handle, icall, true); 510 } 511 512 static void driver_connection_client(cap_call_handle_t icall_handle, ipc_call_t *icall, 513 void *arg) 514 { 515 driver_connection_gen(icall_handle, icall, false); 501 (*iface_method_ptr)(fun, ops, &call); 502 } 503 } 504 505 static void driver_connection_driver(ipc_call_t *icall, void *arg) 506 { 507 driver_connection_gen(icall, true); 508 } 509 510 static void driver_connection_client(ipc_call_t *icall, void *arg) 511 { 512 driver_connection_gen(icall, false); 516 513 } 517 514
Note:
See TracChangeset
for help on using the changeset viewer.