Changes in uspace/lib/drv/generic/remote_usbhc.c [ef40434:50b581d] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/drv/generic/remote_usbhc.c
ref40434 r50b581d 84 84 */ 85 85 typedef enum { 86 /** Asks for address assignment by host controller. 87 * Answer: 88 * - ELIMIT - host controller run out of address 89 * - EOK - address assigned 90 * Answer arguments: 91 * - assigned address 92 * 93 * The address must be released by via IPC_M_USBHC_RELEASE_ADDRESS. 94 */ 95 IPC_M_USBHC_REQUEST_ADDRESS, 96 97 /** Bind USB address with devman handle. 98 * Parameters: 99 * - USB address 100 * - devman handle 101 * Answer: 102 * - EOK - address binded 103 * - ENOENT - address is not in use 104 */ 105 IPC_M_USBHC_BIND_ADDRESS, 106 86 107 /** Get handle binded with given USB address. 87 108 * Parameters … … 92 113 */ 93 114 IPC_M_USBHC_GET_HANDLE_BY_ADDRESS, 115 116 /** Release address in use. 117 * Arguments: 118 * - address to be released 119 * Answer: 120 * - ENOENT - address not in use 121 * - EPERM - trying to release default USB address 122 */ 123 IPC_M_USBHC_RELEASE_ADDRESS, 94 124 95 125 /** Register endpoint attributes at host controller. … … 131 161 } usbhc_iface_funcs_t; 132 162 133 134 163 int usbhc_request_address(async_exch_t *exch, usb_address_t *address, 164 bool strict, usb_speed_t speed) 165 { 166 if (!exch || !address) 167 return EINVAL; 168 sysarg_t new_address; 169 const int ret = async_req_4_1(exch, DEV_IFACE_ID(USBHC_DEV_IFACE), 170 IPC_M_USBHC_REQUEST_ADDRESS, *address, strict, speed, &new_address); 171 if (ret == EOK) 172 *address = (usb_address_t)new_address; 173 return ret; 174 } 175 /*----------------------------------------------------------------------------*/ 176 int usbhc_bind_address(async_exch_t *exch, usb_address_t address, 177 devman_handle_t handle) 178 { 179 if (!exch) 180 return EINVAL; 181 return async_req_3_0(exch, DEV_IFACE_ID(USBHC_DEV_IFACE), 182 IPC_M_USBHC_BIND_ADDRESS, address, handle); 183 } 184 /*----------------------------------------------------------------------------*/ 135 185 int usbhc_get_handle(async_exch_t *exch, usb_address_t address, 136 186 devman_handle_t *handle) 137 187 { 138 188 if (!exch) 139 return E BADMEM;189 return EINVAL; 140 190 sysarg_t h; 141 191 const int ret = async_req_2_1(exch, DEV_IFACE_ID(USBHC_DEV_IFACE), … … 145 195 return ret; 146 196 } 147 197 /*----------------------------------------------------------------------------*/ 198 int usbhc_release_address(async_exch_t *exch, usb_address_t address) 199 { 200 if (!exch) 201 return EINVAL; 202 return async_req_2_0(exch, DEV_IFACE_ID(USBHC_DEV_IFACE), 203 IPC_M_USBHC_RELEASE_ADDRESS, address); 204 } 205 /*----------------------------------------------------------------------------*/ 148 206 int usbhc_register_endpoint(async_exch_t *exch, usb_address_t address, 149 207 usb_endpoint_t endpoint, usb_transfer_type_t type, … … 151 209 { 152 210 if (!exch) 153 return E BADMEM;211 return EINVAL; 154 212 const usb_target_t target = 155 213 {{ .address = address, .endpoint = endpoint }}; … … 162 220 #undef _PACK2 163 221 } 164 222 /*----------------------------------------------------------------------------*/ 165 223 int usbhc_unregister_endpoint(async_exch_t *exch, usb_address_t address, 166 224 usb_endpoint_t endpoint, usb_direction_t direction) 167 225 { 168 226 if (!exch) 169 return E BADMEM;227 return EINVAL; 170 228 return async_req_4_0(exch, DEV_IFACE_ID(USBHC_DEV_IFACE), 171 229 IPC_M_USBHC_UNREGISTER_ENDPOINT, address, endpoint, direction); 172 230 } 173 231 /*----------------------------------------------------------------------------*/ 174 232 int usbhc_read(async_exch_t *exch, usb_address_t address, 175 233 usb_endpoint_t endpoint, uint64_t setup, void *data, size_t size, 176 234 size_t *rec_size) 177 235 { 178 if (!exch)179 return EBADMEM;180 181 236 if (size == 0 && setup == 0) 182 237 return EOK; 183 238 239 if (!exch) 240 return EINVAL; 184 241 const usb_target_t target = 185 242 {{ .address = address, .endpoint = endpoint }}; … … 227 284 return EOK; 228 285 } 229 286 /*----------------------------------------------------------------------------*/ 230 287 int usbhc_write(async_exch_t *exch, usb_address_t address, 231 288 usb_endpoint_t endpoint, uint64_t setup, const void *data, size_t size) 232 289 { 233 if (!exch)234 return EBADMEM;235 236 290 if (size == 0 && setup == 0) 237 291 return EOK; 238 292 293 if (!exch) 294 return EINVAL; 239 295 const usb_target_t target = 240 296 {{ .address = address, .endpoint = endpoint }}; … … 263 319 return (int) opening_request_rc; 264 320 } 265 266 321 /*----------------------------------------------------------------------------*/ 322 323 static void remote_usbhc_request_address(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 324 static void remote_usbhc_bind_address(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 267 325 static void remote_usbhc_get_handle(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 326 static void remote_usbhc_release_address(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 268 327 static void remote_usbhc_register_endpoint(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 269 328 static void remote_usbhc_unregister_endpoint(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); … … 274 333 /** Remote USB host controller interface operations. */ 275 334 static remote_iface_func_ptr_t remote_usbhc_iface_ops[] = { 335 [IPC_M_USBHC_REQUEST_ADDRESS] = remote_usbhc_request_address, 336 [IPC_M_USBHC_RELEASE_ADDRESS] = remote_usbhc_release_address, 337 [IPC_M_USBHC_BIND_ADDRESS] = remote_usbhc_bind_address, 276 338 [IPC_M_USBHC_GET_HANDLE_BY_ADDRESS] = remote_usbhc_get_handle, 277 339 … … 322 384 return trans; 323 385 } 324 325 386 /*----------------------------------------------------------------------------*/ 387 void remote_usbhc_request_address(ddf_fun_t *fun, void *iface, 388 ipc_callid_t callid, ipc_call_t *call) 389 { 390 const usbhc_iface_t *usb_iface = iface; 391 392 if (!usb_iface->request_address) { 393 async_answer_0(callid, ENOTSUP); 394 return; 395 } 396 397 usb_address_t address = DEV_IPC_GET_ARG1(*call); 398 const bool strict = DEV_IPC_GET_ARG2(*call); 399 const usb_speed_t speed = DEV_IPC_GET_ARG3(*call); 400 401 const int rc = usb_iface->request_address(fun, &address, strict, speed); 402 if (rc != EOK) { 403 async_answer_0(callid, rc); 404 } else { 405 async_answer_1(callid, EOK, (sysarg_t) address); 406 } 407 } 408 /*----------------------------------------------------------------------------*/ 409 void remote_usbhc_bind_address(ddf_fun_t *fun, void *iface, 410 ipc_callid_t callid, ipc_call_t *call) 411 { 412 const usbhc_iface_t *usb_iface = iface; 413 414 if (!usb_iface->bind_address) { 415 async_answer_0(callid, ENOTSUP); 416 return; 417 } 418 419 const usb_address_t address = (usb_address_t) DEV_IPC_GET_ARG1(*call); 420 const devman_handle_t handle = (devman_handle_t) DEV_IPC_GET_ARG2(*call); 421 422 const int ret = usb_iface->bind_address(fun, address, handle); 423 async_answer_0(callid, ret); 424 } 425 /*----------------------------------------------------------------------------*/ 326 426 void remote_usbhc_get_handle(ddf_fun_t *fun, void *iface, 327 427 ipc_callid_t callid, ipc_call_t *call) … … 344 444 } 345 445 } 346 347 348 static void callback_out(int outcome, void *arg) 446 /*----------------------------------------------------------------------------*/ 447 void remote_usbhc_release_address(ddf_fun_t *fun, void *iface, 448 ipc_callid_t callid, ipc_call_t *call) 449 { 450 const usbhc_iface_t *usb_iface = iface; 451 452 if (!usb_iface->release_address) { 453 async_answer_0(callid, ENOTSUP); 454 return; 455 } 456 457 const usb_address_t address = (usb_address_t) DEV_IPC_GET_ARG1(*call); 458 459 const int ret = usb_iface->release_address(fun, address); 460 async_answer_0(callid, ret); 461 } 462 /*----------------------------------------------------------------------------*/ 463 static void callback_out(ddf_fun_t *fun, 464 int outcome, void *arg) 349 465 { 350 466 async_transaction_t *trans = arg; … … 354 470 async_transaction_destroy(trans); 355 471 } 356 357 static void callback_in(int outcome, size_t actual_size, void *arg) 472 /*----------------------------------------------------------------------------*/ 473 static void callback_in(ddf_fun_t *fun, 474 int outcome, size_t actual_size, void *arg) 358 475 { 359 476 async_transaction_t *trans = (async_transaction_t *)arg; … … 377 494 async_transaction_destroy(trans); 378 495 } 379 496 /*----------------------------------------------------------------------------*/ 380 497 void remote_usbhc_register_endpoint(ddf_fun_t *fun, void *iface, 381 498 ipc_callid_t callid, ipc_call_t *call) … … 477 594 } 478 595 } 479 596 /*----------------------------------------------------------------------------*/ 480 597 void remote_usbhc_write( 481 598 ddf_fun_t *fun, void *iface, ipc_callid_t callid, ipc_call_t *call)
Note:
See TracChangeset
for help on using the changeset viewer.