Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/drv/generic/remote_usbhc.c

    rb36e5de2 rec59693  
    4646static void remote_usbhc_interrupt_out(device_t *, void *, ipc_callid_t, ipc_call_t *);
    4747static void remote_usbhc_interrupt_in(device_t *, void *, ipc_callid_t, ipc_call_t *);
     48static void remote_usbhc_control_write_setup(device_t *, void *, ipc_callid_t, ipc_call_t *);
     49static void remote_usbhc_control_write_data(device_t *, void *, ipc_callid_t, ipc_call_t *);
     50static void remote_usbhc_control_write_status(device_t *, void *, ipc_callid_t, ipc_call_t *);
     51static void remote_usbhc_control_read_setup(device_t *, void *, ipc_callid_t, ipc_call_t *);
     52static void remote_usbhc_control_read_data(device_t *, void *, ipc_callid_t, ipc_call_t *);
     53static void remote_usbhc_control_read_status(device_t *, void *, ipc_callid_t, ipc_call_t *);
    4854static void remote_usbhc_control_write(device_t *, void *, ipc_callid_t, ipc_call_t *);
    4955static void remote_usbhc_control_read(device_t *, void *, ipc_callid_t, ipc_call_t *);
     
    6975        remote_usbhc_interrupt_in,
    7076
     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
    7185        remote_usbhc_control_write,
    7286        remote_usbhc_control_read
     
    151165                return;
    152166        }
    153        
    154         usb_speed_t speed = DEV_IPC_GET_ARG1(*call);
    155        
    156         int rc = usb_iface->reserve_default_address(device, speed);
     167
     168        int rc = usb_iface->reserve_default_address(device);
    157169
    158170        async_answer_0(callid, rc);
     
    183195                return;
    184196        }
    185        
    186         usb_speed_t speed = DEV_IPC_GET_ARG1(*call);
    187197
    188198        usb_address_t address;
    189         int rc = usb_iface->request_address(device, speed, &address);
     199        int rc = usb_iface->request_address(device, &address);
    190200        if (rc != EOK) {
    191201                async_answer_0(callid, rc);
     
    283293        }
    284294
    285         size_t max_packet_size = DEV_IPC_GET_ARG3(*call);
     295        size_t expected_len = DEV_IPC_GET_ARG3(*call);
    286296        usb_target_t target = {
    287297                .address = DEV_IPC_GET_ARG1(*call),
     
    291301        size_t len = 0;
    292302        void *buffer = NULL;
    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;
     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                }
    301312        }
    302313
     
    313324        trans->size = len;
    314325
    315         rc = transfer_func(device, target, max_packet_size,
     326        int rc = transfer_func(device, target, HACK_MAX_PACKET_SIZE,
    316327            buffer, len,
    317328            callback_out, trans);
     
    339350        }
    340351
    341         size_t max_packet_size = DEV_IPC_GET_ARG3(*call);
     352        size_t len = DEV_IPC_GET_ARG3(*call);
    342353        usb_target_t target = {
    343354                .address = DEV_IPC_GET_ARG1(*call),
     
    345356        };
    346357
    347         size_t len;
    348358        ipc_callid_t data_callid;
    349359        if (!async_data_read_receive(&data_callid, &len)) {
     
    361371        trans->size = len;
    362372
    363         int rc = transfer_func(device, target, max_packet_size,
     373        int rc = transfer_func(device, target, HACK_MAX_PACKET_SIZE_INTERRUPT_IN,
    364374            trans->buffer, len,
    365375            callback_in, trans);
     
    371381}
    372382
     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 */
     392static 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
    373451void remote_usbhc_interrupt_out(device_t *device, void *iface,
    374452    ipc_callid_t callid, ipc_call_t *call)
     
    389467        return remote_usbhc_in_transfer(device, callid, call,
    390468            usb_iface->interrupt_in);
     469}
     470
     471void 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
     481void 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
     491void 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
     501void 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
     511void 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
     521void 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);
    391529}
    392530
     
    407545        };
    408546        size_t data_buffer_len = DEV_IPC_GET_ARG3(*call);
    409         size_t max_packet_size = DEV_IPC_GET_ARG4(*call);
    410547
    411548        int rc;
     
    443580        trans->size = data_buffer_len;
    444581
    445         rc = usb_iface->control_write(device, target, max_packet_size,
     582        rc = usb_iface->control_write(device, target, HACK_MAX_PACKET_SIZE,
    446583            setup_packet, setup_packet_len,
    447584            data_buffer, data_buffer_len,
     
    470607                .endpoint = DEV_IPC_GET_ARG2(*call)
    471608        };
    472         size_t max_packet_size = DEV_IPC_GET_ARG3(*call);
    473609
    474610        int rc;
     
    508644        }
    509645
    510         rc = usb_iface->control_read(device, target, max_packet_size,
     646        rc = usb_iface->control_read(device, target, HACK_MAX_PACKET_SIZE,
    511647            setup_packet, setup_packet_len,
    512648            trans->buffer, trans->size,
Note: See TracChangeset for help on using the changeset viewer.