Changes in uspace/lib/drv/generic/remote_usbhc.c [50b581d:ef40434] in mainline
- File:
-
- 1 edited
-
uspace/lib/drv/generic/remote_usbhc.c (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/drv/generic/remote_usbhc.c
r50b581d ref40434 84 84 */ 85 85 typedef enum { 86 /** Asks for address assignment by host controller.87 * Answer:88 * - ELIMIT - host controller run out of address89 * - EOK - address assigned90 * Answer arguments:91 * - assigned address92 *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 address100 * - devman handle101 * Answer:102 * - EOK - address binded103 * - ENOENT - address is not in use104 */105 IPC_M_USBHC_BIND_ADDRESS,106 107 86 /** Get handle binded with given USB address. 108 87 * Parameters … … 113 92 */ 114 93 IPC_M_USBHC_GET_HANDLE_BY_ADDRESS, 115 116 /** Release address in use.117 * Arguments:118 * - address to be released119 * Answer:120 * - ENOENT - address not in use121 * - EPERM - trying to release default USB address122 */123 IPC_M_USBHC_RELEASE_ADDRESS,124 94 125 95 /** Register endpoint attributes at host controller. … … 161 131 } usbhc_iface_funcs_t; 162 132 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 /*----------------------------------------------------------------------------*/ 133 134 185 135 int usbhc_get_handle(async_exch_t *exch, usb_address_t address, 186 136 devman_handle_t *handle) 187 137 { 188 138 if (!exch) 189 return E INVAL;139 return EBADMEM; 190 140 sysarg_t h; 191 141 const int ret = async_req_2_1(exch, DEV_IFACE_ID(USBHC_DEV_IFACE), … … 195 145 return ret; 196 146 } 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 /*----------------------------------------------------------------------------*/ 147 206 148 int usbhc_register_endpoint(async_exch_t *exch, usb_address_t address, 207 149 usb_endpoint_t endpoint, usb_transfer_type_t type, … … 209 151 { 210 152 if (!exch) 211 return E INVAL;153 return EBADMEM; 212 154 const usb_target_t target = 213 155 {{ .address = address, .endpoint = endpoint }}; … … 220 162 #undef _PACK2 221 163 } 222 /*----------------------------------------------------------------------------*/ 164 223 165 int usbhc_unregister_endpoint(async_exch_t *exch, usb_address_t address, 224 166 usb_endpoint_t endpoint, usb_direction_t direction) 225 167 { 226 168 if (!exch) 227 return E INVAL;169 return EBADMEM; 228 170 return async_req_4_0(exch, DEV_IFACE_ID(USBHC_DEV_IFACE), 229 171 IPC_M_USBHC_UNREGISTER_ENDPOINT, address, endpoint, direction); 230 172 } 231 /*----------------------------------------------------------------------------*/ 173 232 174 int usbhc_read(async_exch_t *exch, usb_address_t address, 233 175 usb_endpoint_t endpoint, uint64_t setup, void *data, size_t size, 234 176 size_t *rec_size) 235 177 { 178 if (!exch) 179 return EBADMEM; 180 236 181 if (size == 0 && setup == 0) 237 182 return EOK; 238 183 239 if (!exch)240 return EINVAL;241 184 const usb_target_t target = 242 185 {{ .address = address, .endpoint = endpoint }}; … … 284 227 return EOK; 285 228 } 286 /*----------------------------------------------------------------------------*/ 229 287 230 int usbhc_write(async_exch_t *exch, usb_address_t address, 288 231 usb_endpoint_t endpoint, uint64_t setup, const void *data, size_t size) 289 232 { 233 if (!exch) 234 return EBADMEM; 235 290 236 if (size == 0 && setup == 0) 291 237 return EOK; 292 238 293 if (!exch)294 return EINVAL;295 239 const usb_target_t target = 296 240 {{ .address = address, .endpoint = endpoint }}; … … 319 263 return (int) opening_request_rc; 320 264 } 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 *); 265 266 325 267 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 *);327 268 static void remote_usbhc_register_endpoint(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 328 269 static void remote_usbhc_unregister_endpoint(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); … … 333 274 /** Remote USB host controller interface operations. */ 334 275 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,338 276 [IPC_M_USBHC_GET_HANDLE_BY_ADDRESS] = remote_usbhc_get_handle, 339 277 … … 384 322 return trans; 385 323 } 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 /*----------------------------------------------------------------------------*/ 324 325 426 326 void remote_usbhc_get_handle(ddf_fun_t *fun, void *iface, 427 327 ipc_callid_t callid, ipc_call_t *call) … … 444 344 } 445 345 } 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) 346 347 348 static void callback_out(int outcome, void *arg) 465 349 { 466 350 async_transaction_t *trans = arg; … … 470 354 async_transaction_destroy(trans); 471 355 } 472 /*----------------------------------------------------------------------------*/ 473 static void callback_in(ddf_fun_t *fun, 474 int outcome, size_t actual_size, void *arg) 356 357 static void callback_in(int outcome, size_t actual_size, void *arg) 475 358 { 476 359 async_transaction_t *trans = (async_transaction_t *)arg; … … 494 377 async_transaction_destroy(trans); 495 378 } 496 /*----------------------------------------------------------------------------*/ 379 497 380 void remote_usbhc_register_endpoint(ddf_fun_t *fun, void *iface, 498 381 ipc_callid_t callid, ipc_call_t *call) … … 594 477 } 595 478 } 596 /*----------------------------------------------------------------------------*/ 479 597 480 void remote_usbhc_write( 598 481 ddf_fun_t *fun, void *iface, ipc_callid_t callid, ipc_call_t *call)
Note:
See TracChangeset
for help on using the changeset viewer.
