Ignore:
File:
1 edited

Legend:

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

    r9753220 rf841608  
    11/*
    2  * Copyright (c) 2010-2011 Vojtech Horky
     2 * Copyright (c) 2010 Vojtech Horky
    33 * All rights reserved.
    44 *
     
    5252static void remote_usbhc_control_read_data(device_t *, void *, ipc_callid_t, ipc_call_t *);
    5353static void remote_usbhc_control_read_status(device_t *, void *, ipc_callid_t, ipc_call_t *);
    54 static void remote_usbhc_control_write(device_t *, void *, ipc_callid_t, ipc_call_t *);
    55 static void remote_usbhc_control_read(device_t *, void *, ipc_callid_t, ipc_call_t *);
    5654static void remote_usbhc_reserve_default_address(device_t *, void *, ipc_callid_t, ipc_call_t *);
    5755static void remote_usbhc_release_default_address(device_t *, void *, ipc_callid_t, ipc_call_t *);
     
    8381        remote_usbhc_control_read_setup,
    8482        remote_usbhc_control_read_data,
    85         remote_usbhc_control_read_status,
    86 
    87         remote_usbhc_control_write,
    88         remote_usbhc_control_read
     83        remote_usbhc_control_read_status
    8984};
    9085
     
    10095        ipc_callid_t caller;
    10196        void *buffer;
    102         void *setup_packet;
    10397        size_t size;
    10498} async_transaction_t;
     
    303297        trans->caller = callid;
    304298        trans->buffer = buffer;
    305         trans->setup_packet = NULL;
    306299        trans->size = len;
    307300
     
    343336        trans->caller = callid;
    344337        trans->buffer = malloc(len);
    345         trans->setup_packet = NULL;
    346338        trans->size = len;
    347339
     
    399391        trans->caller = callid;
    400392        trans->buffer = NULL;
    401         trans->setup_packet = NULL;
    402393        trans->size = 0;
    403394
     
    505496}
    506497
    507 void remote_usbhc_control_write(device_t *device, void *iface,
    508 ipc_callid_t callid, ipc_call_t *call)
    509 {
    510         usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface;
    511         assert(usb_iface != NULL);
    512 
    513         if (!usb_iface->control_write) {
    514                 ipc_answer_0(callid, ENOTSUP);
    515                 return;
    516         }
    517 
    518         usb_target_t target = {
    519                 .address = DEV_IPC_GET_ARG1(*call),
    520                 .endpoint = DEV_IPC_GET_ARG2(*call)
    521         };
    522 
    523         int rc;
    524 
    525         void *setup_packet = NULL;
    526         void *data_buffer = NULL;
    527         size_t setup_packet_len = 0;
    528         size_t data_buffer_len = 0;
    529 
    530         rc = async_data_write_accept(&setup_packet, false,
    531             1, USB_MAX_PAYLOAD_SIZE, 0, &setup_packet_len);
    532         if (rc != EOK) {
    533                 ipc_answer_0(callid, rc);
    534                 return;
    535         }
    536         rc = async_data_write_accept(&data_buffer, false,
    537             1, USB_MAX_PAYLOAD_SIZE, 0, &data_buffer_len);
    538         if (rc != EOK) {
    539                 free(setup_packet);
    540                 ipc_answer_0(callid, rc);
    541                 return;
    542         }
    543 
    544         async_transaction_t *trans = malloc(sizeof(async_transaction_t));
    545         trans->caller = callid;
    546         trans->setup_packet = setup_packet;
    547         trans->buffer = data_buffer;
    548         trans->size = data_buffer_len;
    549 
    550         rc = usb_iface->control_write(device, target,
    551             setup_packet, setup_packet_len,
    552             data_buffer, data_buffer_len,
    553             callback_out, trans);
    554 
    555         if (rc != EOK) {
    556                 ipc_answer_0(callid, rc);
    557                 free(setup_packet);
    558                 free(data_buffer);
    559                 free(trans);
    560         }
    561 }
    562 
    563 
    564 void remote_usbhc_control_read(device_t *device, void *iface,
    565 ipc_callid_t callid, ipc_call_t *call)
    566 {
    567         usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface;
    568         assert(usb_iface != NULL);
    569 
    570         if (!usb_iface->control_read) {
    571                 ipc_answer_0(callid, ENOTSUP);
    572                 return;
    573         }
    574 
    575         size_t data_len = DEV_IPC_GET_ARG3(*call);
    576         usb_target_t target = {
    577                 .address = DEV_IPC_GET_ARG1(*call),
    578                 .endpoint = DEV_IPC_GET_ARG2(*call)
    579         };
    580 
    581         int rc;
    582 
    583         void *setup_packet = NULL;
    584         size_t setup_packet_len = 0;
    585 
    586         rc = async_data_write_accept(&setup_packet, false,
    587             1, USB_MAX_PAYLOAD_SIZE, 0, &setup_packet_len);
    588         if (rc != EOK) {
    589                 ipc_answer_0(callid, rc);
    590                 return;
    591         }
    592 
    593         async_transaction_t *trans = malloc(sizeof(async_transaction_t));
    594         trans->caller = callid;
    595         trans->setup_packet = setup_packet;
    596         trans->buffer = malloc(data_len);
    597         trans->size = data_len;
    598 
    599         rc = usb_iface->control_read(device, target,
    600             setup_packet, setup_packet_len,
    601             trans->buffer, trans->size,
    602             callback_in, trans);
    603 
    604         if (rc != EOK) {
    605                 ipc_answer_0(callid, rc);
    606                 free(setup_packet);
    607                 free(trans->buffer);
    608                 free(trans);
    609         }
    610 }
    611 
    612498
    613499
Note: See TracChangeset for help on using the changeset viewer.