Changeset f6577d9 in mainline for uspace/drv/bus/usb/vhc/transfer.c


Ignore:
Timestamp:
2012-12-22T15:48:33Z (13 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f5f0cfb
Parents:
01eeaaf
Message:

vhc: DCE

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/vhc/transfer.c

    r01eeaaf rf6577d9  
    2929#include <errno.h>
    3030#include <str_error.h>
     31#include <usb/debug.h>
    3132#include <usbvirt/device.h>
    3233#include <usbvirt/ipc.h>
    3334#include "vhcd.h"
    34 
    35 vhc_transfer_t *vhc_transfer_create(usb_address_t address, usb_endpoint_t ep,
    36     usb_direction_t dir, usb_transfer_type_t tr_type,
    37     ddf_fun_t *fun, void *callback_arg)
    38 {
    39         vhc_transfer_t *result = malloc(sizeof(vhc_transfer_t));
    40         if (result == NULL) {
    41                 return NULL;
    42         }
    43         link_initialize(&result->link);
    44         result->address = address;
    45         result->endpoint = ep;
    46         result->direction = dir;
    47         result->transfer_type = tr_type;
    48         result->setup_buffer = NULL;
    49         result->setup_buffer_size = 0;
    50         result->data_buffer = NULL;
    51         result->data_buffer_size = 0;
    52         result->ddf_fun = fun;
    53         result->callback_arg = callback_arg;
    54         result->callback_in = NULL;
    55         result->callback_out = NULL;
    56 
    57         usb_log_debug2("Created transfer %p (%d.%d %s %s)\n", result,
    58             address, ep, usb_str_transfer_type_short(tr_type),
    59             dir == USB_DIRECTION_IN ? "in" : "out");
    60 
    61         return result;
    62 }
    63 
    64 static bool is_set_address_transfer(vhc_transfer_t *transfer)
    65 {
    66         if (transfer->batch->ep->endpoint != 0) {
    67                 return false;
    68         }
    69         if (transfer->batch->ep->transfer_type != USB_TRANSFER_CONTROL) {
    70                 return false;
    71         }
    72         if (usb_transfer_batch_direction(transfer->batch) != USB_DIRECTION_OUT) {
    73                 return false;
    74         }
    75         const usb_device_request_setup_packet_t *setup =
    76             (void*)transfer->batch->setup_buffer;
    77         if (setup->request_type != 0) {
    78                 return false;
    79         }
    80         if (setup->request != USB_DEVREQ_SET_ADDRESS) {
    81                 return false;
    82         }
    83 
    84         return true;
    85 }
    8635
    8736int vhc_schedule(hcd_t *hcd, usb_transfer_batch_t *batch)
     
    12271}
    12372
    124 int vhc_virtdev_add_transfer(vhc_data_t *vhc, vhc_transfer_t *transfer)
    125 {
    126         fibril_mutex_lock(&vhc->guard);
    127 
    128         bool target_found = false;
    129         list_foreach(vhc->devices, pos) {
    130                 vhc_virtdev_t *dev = list_get_instance(pos, vhc_virtdev_t, link);
    131                 fibril_mutex_lock(&dev->guard);
    132                 if (dev->address == transfer->address) {
    133                         if (target_found) {
    134                                 usb_log_warning("Transfer would be accepted by more devices!\n");
    135                                 goto next;
    136                         }
    137                         target_found = true;
    138                         list_append(&transfer->link, &dev->transfer_queue);
    139                 }
    140 next:
    141                 fibril_mutex_unlock(&dev->guard);
    142         }
    143 
    144         fibril_mutex_unlock(&vhc->guard);
    145 
    146         if (target_found) {
    147                 return EOK;
    148         } else {
    149                 return ENOENT;
    150         }
     73static bool is_set_address_transfer(vhc_transfer_t *transfer)
     74{
     75        if (transfer->batch->ep->endpoint != 0) {
     76                return false;
     77        }
     78        if (transfer->batch->ep->transfer_type != USB_TRANSFER_CONTROL) {
     79                return false;
     80        }
     81        if (usb_transfer_batch_direction(transfer->batch) != USB_DIRECTION_OUT) {
     82                return false;
     83        }
     84        const usb_device_request_setup_packet_t *setup =
     85            (void*)transfer->batch->setup_buffer;
     86        if (setup->request_type != 0) {
     87                return false;
     88        }
     89        if (setup->request != USB_DEVREQ_SET_ADDRESS) {
     90                return false;
     91        }
     92
     93        return true;
    15194}
    15295
     
    234177        return transfer;
    235178}
    236 
    237179
    238180static void execute_transfer_callback_and_free(vhc_transfer_t *transfer,
     
    246188        usb_transfer_batch_destroy(transfer->batch);
    247189        free(transfer);
    248 #if 0
    249         assert(outcome != ENAK);
    250 
    251         usb_log_debug2("Transfer %p ended: %s.\n",
    252             transfer, str_error(outcome));
    253 
    254         if (transfer->direction == USB_DIRECTION_IN) {
    255                 transfer->callback_in(outcome,
    256                     data_transfer_size, transfer->callback_arg);
    257         } else {
    258                 assert(transfer->direction == USB_DIRECTION_OUT);
    259                 transfer->callback_out(outcome, transfer->callback_arg);
    260         }
    261 
    262         free(transfer);
    263 #endif
    264190}
    265191
     
    332258        return EOK;
    333259}
    334 
Note: See TracChangeset for help on using the changeset viewer.