Changeset beee81a in mainline for uspace/lib/usbvirt/src/ipc_hc.c


Ignore:
Timestamp:
2011-05-07T09:35:15Z (13 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
bc02b83, d38d830
Parents:
42e2172
Message:

Virtual USB refactoring

Changes include

  • add missing comments
  • add function for virtual device disconnect
  • fix memory leak
  • support for bulks
  • checking of input parameters
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usbvirt/src/ipc_hc.c

    r42e2172 rbeee81a  
    5454 * @return Error code.
    5555 */
    56 int usbvirt_ipc_send_control_read(int phone, usb_endpoint_t ep,
     56int usbvirt_ipc_send_control_read(int phone,
    5757    void *setup_buffer, size_t setup_buffer_size,
    5858    void *data_buffer, size_t data_buffer_size, size_t *data_transfered_size)
    5959{
    60         aid_t opening_request = async_send_1(phone,
    61             IPC_M_USBVIRT_CONTROL_READ, ep, NULL);
     60        if (phone < 0) {
     61                return EINVAL;
     62        }
     63        if ((setup_buffer == NULL) || (setup_buffer_size == 0)) {
     64                return EINVAL;
     65        }
     66        if ((data_buffer == NULL) || (data_buffer_size == 0)) {
     67                return EINVAL;
     68        }
     69
     70        aid_t opening_request = async_send_0(phone,
     71            IPC_M_USBVIRT_CONTROL_READ, NULL);
    6272        if (opening_request == 0) {
    6373                return ENOMEM;
     
    98108        }
    99109
    100         *data_transfered_size = IPC_GET_ARG2(data_request_call);
     110        if (data_transfered_size != NULL) {
     111                *data_transfered_size = IPC_GET_ARG2(data_request_call);
     112        }
    101113
    102114        return EOK;
     
    113125 * @return Error code.
    114126 */
    115 int usbvirt_ipc_send_control_write(int phone, usb_endpoint_t ep,
     127int usbvirt_ipc_send_control_write(int phone,
    116128    void *setup_buffer, size_t setup_buffer_size,
    117129    void *data_buffer, size_t data_buffer_size)
    118130{
    119         aid_t opening_request = async_send_2(phone,
    120             IPC_M_USBVIRT_CONTROL_WRITE, ep, data_buffer_size,  NULL);
     131        if (phone < 0) {
     132                return EINVAL;
     133        }
     134        if ((setup_buffer == NULL) || (setup_buffer_size == 0)) {
     135                return EINVAL;
     136        }
     137        if ((data_buffer_size > 0) && (data_buffer == NULL)) {
     138                return EINVAL;
     139        }
     140
     141        aid_t opening_request = async_send_1(phone,
     142            IPC_M_USBVIRT_CONTROL_WRITE, data_buffer_size,  NULL);
    121143        if (opening_request == 0) {
    122144                return ENOMEM;
     
    159181    usb_transfer_type_t tr_type, void *data, size_t data_size, size_t *act_size)
    160182{
    161         aid_t opening_request = async_send_2(phone,
    162             IPC_M_USBVIRT_INTERRUPT_IN, ep, tr_type, NULL);
    163         if (opening_request == 0) {
    164                 return ENOMEM;
    165         }
     183        if (phone < 0) {
     184                return EINVAL;
     185        }
     186        usbvirt_hc_to_device_method_t method;
     187        switch (tr_type) {
     188        case USB_TRANSFER_INTERRUPT:
     189                method = IPC_M_USBVIRT_INTERRUPT_IN;
     190                break;
     191        case USB_TRANSFER_BULK:
     192                method = IPC_M_USBVIRT_BULK_IN;
     193                break;
     194        default:
     195                return EINVAL;
     196        }
     197        if ((ep <= 0) || (ep >= USBVIRT_ENDPOINT_MAX)) {
     198                return EINVAL;
     199        }
     200        if ((data == NULL) || (data_size == 0)) {
     201                return EINVAL;
     202        }
     203
     204
     205        aid_t opening_request = async_send_2(phone, method, ep, tr_type, NULL);
     206        if (opening_request == 0) {
     207                return ENOMEM;
     208        }
     209
    166210
    167211        ipc_call_t data_request_call;
     
    210254    usb_transfer_type_t tr_type, void *data, size_t data_size)
    211255{
    212         aid_t opening_request = async_send_2(phone,
    213             IPC_M_USBVIRT_INTERRUPT_OUT, ep, tr_type, NULL);
     256        if (phone < 0) {
     257                return EINVAL;
     258        }
     259        usbvirt_hc_to_device_method_t method;
     260        switch (tr_type) {
     261        case USB_TRANSFER_INTERRUPT:
     262                method = IPC_M_USBVIRT_INTERRUPT_OUT;
     263                break;
     264        case USB_TRANSFER_BULK:
     265                method = IPC_M_USBVIRT_BULK_OUT;
     266                break;
     267        default:
     268                return EINVAL;
     269        }
     270        if ((ep <= 0) || (ep >= USBVIRT_ENDPOINT_MAX)) {
     271                return EINVAL;
     272        }
     273        if ((data == NULL) || (data_size == 0)) {
     274                return EINVAL;
     275        }
     276
     277        aid_t opening_request = async_send_1(phone, method, ep, NULL);
    214278        if (opening_request == 0) {
    215279                return ENOMEM;
Note: See TracChangeset for help on using the changeset viewer.