Changes in uspace/lib/drv/generic/remote_usbhc.c [ec59693:b36e5de2] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/drv/generic/remote_usbhc.c
rec59693 rb36e5de2 46 46 static void remote_usbhc_interrupt_out(device_t *, void *, ipc_callid_t, ipc_call_t *); 47 47 static void remote_usbhc_interrupt_in(device_t *, void *, ipc_callid_t, ipc_call_t *); 48 static void remote_usbhc_control_write_setup(device_t *, void *, ipc_callid_t, ipc_call_t *);49 static void remote_usbhc_control_write_data(device_t *, void *, ipc_callid_t, ipc_call_t *);50 static void remote_usbhc_control_write_status(device_t *, void *, ipc_callid_t, ipc_call_t *);51 static void remote_usbhc_control_read_setup(device_t *, void *, ipc_callid_t, ipc_call_t *);52 static void remote_usbhc_control_read_data(device_t *, void *, ipc_callid_t, ipc_call_t *);53 static void remote_usbhc_control_read_status(device_t *, void *, ipc_callid_t, ipc_call_t *);54 48 static void remote_usbhc_control_write(device_t *, void *, ipc_callid_t, ipc_call_t *); 55 49 static void remote_usbhc_control_read(device_t *, void *, ipc_callid_t, ipc_call_t *); … … 75 69 remote_usbhc_interrupt_in, 76 70 77 remote_usbhc_control_write_setup,78 remote_usbhc_control_write_data,79 remote_usbhc_control_write_status,80 81 remote_usbhc_control_read_setup,82 remote_usbhc_control_read_data,83 remote_usbhc_control_read_status,84 85 71 remote_usbhc_control_write, 86 72 remote_usbhc_control_read … … 165 151 return; 166 152 } 167 168 int rc = usb_iface->reserve_default_address(device); 153 154 usb_speed_t speed = DEV_IPC_GET_ARG1(*call); 155 156 int rc = usb_iface->reserve_default_address(device, speed); 169 157 170 158 async_answer_0(callid, rc); … … 195 183 return; 196 184 } 185 186 usb_speed_t speed = DEV_IPC_GET_ARG1(*call); 197 187 198 188 usb_address_t address; 199 int rc = usb_iface->request_address(device, &address);189 int rc = usb_iface->request_address(device, speed, &address); 200 190 if (rc != EOK) { 201 191 async_answer_0(callid, rc); … … 293 283 } 294 284 295 size_t expected_len= DEV_IPC_GET_ARG3(*call);285 size_t max_packet_size = DEV_IPC_GET_ARG3(*call); 296 286 usb_target_t target = { 297 287 .address = DEV_IPC_GET_ARG1(*call), … … 301 291 size_t len = 0; 302 292 void *buffer = NULL; 303 if (expected_len > 0) { 304 int rc = async_data_write_accept(&buffer, false, 305 1, USB_MAX_PAYLOAD_SIZE, 306 0, &len); 307 308 if (rc != EOK) { 309 async_answer_0(callid, rc); 310 return; 311 } 293 294 int rc = async_data_write_accept(&buffer, false, 295 1, USB_MAX_PAYLOAD_SIZE, 296 0, &len); 297 298 if (rc != EOK) { 299 async_answer_0(callid, rc); 300 return; 312 301 } 313 302 … … 324 313 trans->size = len; 325 314 326 int rc = transfer_func(device, target, HACK_MAX_PACKET_SIZE,315 rc = transfer_func(device, target, max_packet_size, 327 316 buffer, len, 328 317 callback_out, trans); … … 350 339 } 351 340 352 size_t len= DEV_IPC_GET_ARG3(*call);341 size_t max_packet_size = DEV_IPC_GET_ARG3(*call); 353 342 usb_target_t target = { 354 343 .address = DEV_IPC_GET_ARG1(*call), … … 356 345 }; 357 346 347 size_t len; 358 348 ipc_callid_t data_callid; 359 349 if (!async_data_read_receive(&data_callid, &len)) { … … 371 361 trans->size = len; 372 362 373 int rc = transfer_func(device, target, HACK_MAX_PACKET_SIZE_INTERRUPT_IN,363 int rc = transfer_func(device, target, max_packet_size, 374 364 trans->buffer, len, 375 365 callback_in, trans); … … 381 371 } 382 372 383 /** Process status part of control transfer.384 *385 * @param device Target device.386 * @param callid Initiating caller.387 * @param call Initiating call.388 * @param direction Transfer direction (read ~ in, write ~ out).389 * @param transfer_in_func Transfer function for control read (might be NULL).390 * @param transfer_out_func Transfer function for control write (might be NULL).391 */392 static void remote_usbhc_status_transfer(device_t *device,393 ipc_callid_t callid, ipc_call_t *call,394 usb_direction_t direction,395 int (*transfer_in_func)(device_t *, usb_target_t,396 usbhc_iface_transfer_in_callback_t, void *),397 int (*transfer_out_func)(device_t *, usb_target_t,398 usbhc_iface_transfer_out_callback_t, void *))399 {400 switch (direction) {401 case USB_DIRECTION_IN:402 if (!transfer_in_func) {403 async_answer_0(callid, ENOTSUP);404 return;405 }406 break;407 case USB_DIRECTION_OUT:408 if (!transfer_out_func) {409 async_answer_0(callid, ENOTSUP);410 return;411 }412 break;413 default:414 assert(false && "unreachable code");415 break;416 }417 418 usb_target_t target = {419 .address = DEV_IPC_GET_ARG1(*call),420 .endpoint = DEV_IPC_GET_ARG2(*call)421 };422 423 async_transaction_t *trans = async_transaction_create(callid);424 if (trans == NULL) {425 async_answer_0(callid, ENOMEM);426 return;427 }428 429 int rc;430 switch (direction) {431 case USB_DIRECTION_IN:432 rc = transfer_in_func(device, target,433 callback_in, trans);434 break;435 case USB_DIRECTION_OUT:436 rc = transfer_out_func(device, target,437 callback_out, trans);438 break;439 default:440 assert(false && "unreachable code");441 break;442 }443 444 if (rc != EOK) {445 async_answer_0(callid, rc);446 async_transaction_destroy(trans);447 }448 }449 450 451 373 void remote_usbhc_interrupt_out(device_t *device, void *iface, 452 374 ipc_callid_t callid, ipc_call_t *call) … … 467 389 return remote_usbhc_in_transfer(device, callid, call, 468 390 usb_iface->interrupt_in); 469 }470 471 void remote_usbhc_control_write_setup(device_t *device, void *iface,472 ipc_callid_t callid, ipc_call_t *call)473 {474 usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface;475 assert(usb_iface != NULL);476 477 return remote_usbhc_out_transfer(device, callid, call,478 usb_iface->control_write_setup);479 }480 481 void remote_usbhc_control_write_data(device_t *device, void *iface,482 ipc_callid_t callid, ipc_call_t *call)483 {484 usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface;485 assert(usb_iface != NULL);486 487 return remote_usbhc_out_transfer(device, callid, call,488 usb_iface->control_write_data);489 }490 491 void remote_usbhc_control_write_status(device_t *device, void *iface,492 ipc_callid_t callid, ipc_call_t *call)493 {494 usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface;495 assert(usb_iface != NULL);496 497 return remote_usbhc_status_transfer(device, callid, call,498 USB_DIRECTION_IN, usb_iface->control_write_status, NULL);499 }500 501 void remote_usbhc_control_read_setup(device_t *device, void *iface,502 ipc_callid_t callid, ipc_call_t *call)503 {504 usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface;505 assert(usb_iface != NULL);506 507 return remote_usbhc_out_transfer(device, callid, call,508 usb_iface->control_read_setup);509 }510 511 void remote_usbhc_control_read_data(device_t *device, void *iface,512 ipc_callid_t callid, ipc_call_t *call)513 {514 usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface;515 assert(usb_iface != NULL);516 517 return remote_usbhc_in_transfer(device, callid, call,518 usb_iface->control_read_data);519 }520 521 void remote_usbhc_control_read_status(device_t *device, void *iface,522 ipc_callid_t callid, ipc_call_t *call)523 {524 usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface;525 assert(usb_iface != NULL);526 527 return remote_usbhc_status_transfer(device, callid, call,528 USB_DIRECTION_OUT, NULL, usb_iface->control_read_status);529 391 } 530 392 … … 545 407 }; 546 408 size_t data_buffer_len = DEV_IPC_GET_ARG3(*call); 409 size_t max_packet_size = DEV_IPC_GET_ARG4(*call); 547 410 548 411 int rc; … … 580 443 trans->size = data_buffer_len; 581 444 582 rc = usb_iface->control_write(device, target, HACK_MAX_PACKET_SIZE,445 rc = usb_iface->control_write(device, target, max_packet_size, 583 446 setup_packet, setup_packet_len, 584 447 data_buffer, data_buffer_len, … … 607 470 .endpoint = DEV_IPC_GET_ARG2(*call) 608 471 }; 472 size_t max_packet_size = DEV_IPC_GET_ARG3(*call); 609 473 610 474 int rc; … … 644 508 } 645 509 646 rc = usb_iface->control_read(device, target, HACK_MAX_PACKET_SIZE,510 rc = usb_iface->control_read(device, target, max_packet_size, 647 511 setup_packet, setup_packet_len, 648 512 trans->buffer, trans->size,
Note:
See TracChangeset
for help on using the changeset viewer.