Changeset 984a9ba in mainline for uspace/lib/drv/generic/remote_usbhc.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/remote_usbhc.c
r76f566d r984a9ba 227 227 } 228 228 229 static void remote_usbhc_default_address_reservation(ddf_fun_t *, void *, cap_call_handle_t,ipc_call_t *);230 static void remote_usbhc_device_enumerate(ddf_fun_t *, void *, cap_call_handle_t,ipc_call_t *);231 static void remote_usbhc_device_remove(ddf_fun_t *, void *, cap_call_handle_t,ipc_call_t *);232 static void remote_usbhc_register_endpoint(ddf_fun_t *, void *, cap_call_handle_t,ipc_call_t *);233 static void remote_usbhc_unregister_endpoint(ddf_fun_t *, void *, cap_call_handle_t,ipc_call_t *);234 static void remote_usbhc_transfer(ddf_fun_t *fun, void *iface, cap_call_handle_t chandle,ipc_call_t *call);229 static void remote_usbhc_default_address_reservation(ddf_fun_t *, void *, ipc_call_t *); 230 static void remote_usbhc_device_enumerate(ddf_fun_t *, void *, ipc_call_t *); 231 static void remote_usbhc_device_remove(ddf_fun_t *, void *, ipc_call_t *); 232 static void remote_usbhc_register_endpoint(ddf_fun_t *, void *, ipc_call_t *); 233 static void remote_usbhc_unregister_endpoint(ddf_fun_t *, void *, ipc_call_t *); 234 static void remote_usbhc_transfer(ddf_fun_t *fun, void *iface, ipc_call_t *call); 235 235 236 236 /** Remote USB interface operations. */ … … 252 252 253 253 typedef struct { 254 cap_call_handle_t caller;254 ipc_call_t call; 255 255 usbhc_iface_transfer_request_t request; 256 256 } async_transaction_t; 257 257 258 258 void remote_usbhc_default_address_reservation(ddf_fun_t *fun, void *iface, 259 cap_call_handle_t chandle,ipc_call_t *call)259 ipc_call_t *call) 260 260 { 261 261 const usbhc_iface_t *usbhc_iface = (usbhc_iface_t *) iface; 262 262 263 263 if (usbhc_iface->default_address_reservation == NULL) { 264 async_answer_0(c handle, ENOTSUP);264 async_answer_0(call, ENOTSUP); 265 265 return; 266 266 } … … 268 268 const bool reserve = IPC_GET_ARG2(*call); 269 269 const errno_t ret = usbhc_iface->default_address_reservation(fun, reserve); 270 async_answer_0(c handle, ret);270 async_answer_0(call, ret); 271 271 } 272 272 273 273 274 274 static void remote_usbhc_device_enumerate(ddf_fun_t *fun, void *iface, 275 cap_call_handle_t chandle,ipc_call_t *call)275 ipc_call_t *call) 276 276 { 277 277 const usbhc_iface_t *usbhc_iface = (usbhc_iface_t *) iface; 278 278 279 279 if (usbhc_iface->device_enumerate == NULL) { 280 async_answer_0(c handle, ENOTSUP);280 async_answer_0(call, ENOTSUP); 281 281 return; 282 282 } … … 285 285 usb_speed_t speed = DEV_IPC_GET_ARG2(*call); 286 286 const errno_t ret = usbhc_iface->device_enumerate(fun, port, speed); 287 async_answer_0(c handle, ret);287 async_answer_0(call, ret); 288 288 } 289 289 290 290 static void remote_usbhc_device_remove(ddf_fun_t *fun, void *iface, 291 cap_call_handle_t chandle,ipc_call_t *call)291 ipc_call_t *call) 292 292 { 293 293 const usbhc_iface_t *usbhc_iface = (usbhc_iface_t *) iface; 294 294 295 295 if (usbhc_iface->device_remove == NULL) { 296 async_answer_0(c handle, ENOTSUP);296 async_answer_0(call, ENOTSUP); 297 297 return; 298 298 } … … 300 300 const unsigned port = DEV_IPC_GET_ARG1(*call); 301 301 const errno_t ret = usbhc_iface->device_remove(fun, port); 302 async_answer_0(c handle, ret);302 async_answer_0(call, ret); 303 303 } 304 304 305 305 static void remote_usbhc_register_endpoint(ddf_fun_t *fun, void *iface, 306 cap_call_handle_t chandle,ipc_call_t *call)306 ipc_call_t *call) 307 307 { 308 308 assert(fun); … … 313 313 314 314 if (!usbhc_iface->register_endpoint) { 315 async_answer_0(c handle, ENOTSUP);315 async_answer_0(call, ENOTSUP); 316 316 return; 317 317 } 318 318 319 319 usb_endpoint_descriptors_t ep_desc; 320 cap_call_handle_t data_chandle;320 ipc_call_t data; 321 321 size_t len; 322 322 323 if (!async_data_write_receive(&data _chandle, &len) ||323 if (!async_data_write_receive(&data, &len) || 324 324 len != sizeof(ep_desc)) { 325 async_answer_0(chandle, EINVAL); 326 return; 327 } 328 async_data_write_finalize(data_chandle, &ep_desc, sizeof(ep_desc)); 325 async_answer_0(call, EINVAL); 326 return; 327 } 328 329 async_data_write_finalize(&data, &ep_desc, sizeof(ep_desc)); 329 330 330 331 usb_pipe_desc_t pipe_desc; 331 332 332 333 const errno_t rc = usbhc_iface->register_endpoint(fun, &pipe_desc, &ep_desc); 333 async_answer_0(c handle, rc);334 335 if (!async_data_read_receive(&data _chandle, &len) ||334 async_answer_0(call, rc); 335 336 if (!async_data_read_receive(&data, &len) || 336 337 len != sizeof(pipe_desc)) { 337 338 return; 338 339 } 339 async_data_read_finalize( data_chandle, &pipe_desc, sizeof(pipe_desc));340 async_data_read_finalize(&data, &pipe_desc, sizeof(pipe_desc)); 340 341 } 341 342 342 343 static void remote_usbhc_unregister_endpoint(ddf_fun_t *fun, void *iface, 343 cap_call_handle_t chandle,ipc_call_t *call)344 ipc_call_t *call) 344 345 { 345 346 assert(fun); … … 350 351 351 352 if (!usbhc_iface->unregister_endpoint) { 352 async_answer_0(c handle, ENOTSUP);353 async_answer_0(call, ENOTSUP); 353 354 return; 354 355 } 355 356 356 357 usb_pipe_desc_t pipe_desc; 357 cap_call_handle_t data_chandle;358 ipc_call_t data; 358 359 size_t len; 359 360 360 if (!async_data_write_receive(&data _chandle, &len) ||361 if (!async_data_write_receive(&data, &len) || 361 362 len != sizeof(pipe_desc)) { 362 async_answer_0(c handle, EINVAL);363 return; 364 } 365 async_data_write_finalize( data_chandle, &pipe_desc, sizeof(pipe_desc));363 async_answer_0(call, EINVAL); 364 return; 365 } 366 async_data_write_finalize(&data, &pipe_desc, sizeof(pipe_desc)); 366 367 367 368 const errno_t rc = usbhc_iface->unregister_endpoint(fun, &pipe_desc); 368 async_answer_0(c handle, rc);369 async_answer_0(call, rc); 369 370 } 370 371 … … 381 382 } 382 383 383 static async_transaction_t *async_transaction_create( cap_call_handle_t caller)384 static async_transaction_t *async_transaction_create(ipc_call_t *call) 384 385 { 385 386 async_transaction_t *trans = calloc(1, sizeof(async_transaction_t)); 386 387 387 388 if (trans != NULL) 388 trans->call er = caller;389 trans->call = *call; 389 390 390 391 return trans; … … 394 395 { 395 396 async_transaction_t *trans = arg; 396 const errno_t err = async_answer_1( trans->caller, error, transferred_size);397 const errno_t err = async_answer_1(&trans->call, error, transferred_size); 397 398 async_transaction_destroy(trans); 398 399 return err; … … 410 411 411 412 errno_t err; 412 cap_call_handle_t data_chandle;413 ipc_call_t data; 413 414 size_t size; 414 415 unsigned flags; 415 416 416 if (!async_share_out_receive(&data _chandle, &size, &flags))417 if (!async_share_out_receive(&data, &size, &flags)) 417 418 return EPARTY; 418 419 419 420 if (size < required_size || (flags & required_flags) != required_flags) { 420 async_answer_0( data_chandle, EINVAL);421 async_answer_0(&data, EINVAL); 421 422 return EINVAL; 422 423 } 423 424 424 if ((err = async_share_out_finalize( data_chandle, &trans->request.buffer.virt)))425 if ((err = async_share_out_finalize(&data, &trans->request.buffer.virt))) 425 426 return err; 426 427 … … 445 446 } 446 447 447 void remote_usbhc_transfer(ddf_fun_t *fun, void *iface, cap_call_handle_t chandle,ipc_call_t *call)448 void remote_usbhc_transfer(ddf_fun_t *fun, void *iface, ipc_call_t *call) 448 449 { 449 450 assert(fun); … … 454 455 455 456 if (!usbhc_iface->transfer) { 456 async_answer_0(chandle, ENOTSUP); 457 return; 458 } 459 460 async_transaction_t *trans = async_transaction_create(chandle); 457 async_answer_0(call, ENOTSUP); 458 return; 459 } 460 461 async_transaction_t *trans = 462 async_transaction_create(call); 461 463 if (trans == NULL) { 462 async_answer_0(c handle, ENOMEM);464 async_answer_0(call, ENOMEM); 463 465 return; 464 466 } … … 466 468 errno_t err = EPARTY; 467 469 468 cap_call_handle_t data_chandle;470 ipc_call_t data; 469 471 size_t len; 470 if (!async_data_write_receive(&data _chandle, &len) ||472 if (!async_data_write_receive(&data, &len) || 471 473 len != sizeof(trans->request)) { 472 async_answer_0( data_chandle, EINVAL);474 async_answer_0(&data, EINVAL); 473 475 goto err; 474 476 } 475 477 476 if ((err = async_data_write_finalize( data_chandle,478 if ((err = async_data_write_finalize(&data, 477 479 &trans->request, sizeof(trans->request)))) 478 480 goto err; … … 494 496 495 497 err: 496 async_answer_0(c handle, err);498 async_answer_0(call, err); 497 499 async_transaction_destroy(trans); 498 500 }
Note:
See TracChangeset
for help on using the changeset viewer.