Changeset 8cd1aa5e in mainline for uspace/drv/vhc/connhost.c


Ignore:
Timestamp:
2010-11-21T23:22:50Z (13 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
03171de, 0b749a3
Parents:
31860b7 (diff), f0da4eb2 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge ddf_proposal changes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/vhc/connhost.c

    r31860b7 r8cd1aa5e  
    4141#include "hc.h"
    4242
     43typedef struct {
     44        usb_direction_t direction;
     45        usb_hcd_transfer_callback_out_t out_callback;
     46        usb_hcd_transfer_callback_in_t in_callback;
     47        usb_hc_device_t *hc;
     48        void *arg;
     49} transfer_info_t;
     50
     51static void universal_callback(void *buffer, size_t size,
     52    usb_transaction_outcome_t outcome, void *arg)
     53{
     54        transfer_info_t *transfer = (transfer_info_t *) arg;
     55
     56        switch (transfer->direction) {
     57                case USB_DIRECTION_IN:
     58                        transfer->in_callback(transfer->hc,
     59                            size, outcome,
     60                            transfer->arg);
     61                        break;
     62                case USB_DIRECTION_OUT:
     63                        transfer->out_callback(transfer->hc,
     64                            outcome,
     65                            transfer->arg);
     66                        break;
     67                default:
     68                        assert(false && "unreachable");
     69                        break;
     70        }
     71
     72        free(transfer);
     73}
     74
     75static transfer_info_t *create_transfer_info(usb_hc_device_t *hc,
     76    usb_direction_t direction, void *arg)
     77{
     78        transfer_info_t *transfer = malloc(sizeof(transfer_info_t));
     79
     80        transfer->direction = direction;
     81        transfer->in_callback = NULL;
     82        transfer->out_callback = NULL;
     83        transfer->arg = arg;
     84        transfer->hc = hc;
     85
     86        return transfer;
     87}
     88
    4389static int enqueue_transfer_out(usb_hc_device_t *hc,
    4490    usb_hcd_attached_device_info_t *dev, usb_hc_endpoint_info_t *endpoint,
     
    5096            usb_str_transfer_type(endpoint->transfer_type),
    5197            size);
    52         return ENOTSUP;
     98
     99        transfer_info_t *transfer
     100            = create_transfer_info(hc, USB_DIRECTION_OUT, arg);
     101        transfer->out_callback = callback;
     102
     103        usb_target_t target = {
     104                .address = dev->address,
     105                .endpoint = endpoint->endpoint
     106        };
     107
     108        hc_add_transaction_to_device(false, target, buffer, size,
     109            universal_callback, transfer);
     110
     111        return EOK;
    53112}
    54113
     
    62121            usb_str_transfer_type(endpoint->transfer_type),
    63122            size);
    64         return ENOTSUP;
     123
     124        transfer_info_t *transfer
     125            = create_transfer_info(hc, USB_DIRECTION_OUT, arg);
     126        transfer->out_callback = callback;
     127
     128        usb_target_t target = {
     129                .address = dev->address,
     130                .endpoint = endpoint->endpoint
     131        };
     132
     133        hc_add_transaction_to_device(true, target, buffer, size,
     134            universal_callback, transfer);
     135
     136        return EOK;
    65137}
    66138
     
    74146            usb_str_transfer_type(endpoint->transfer_type),
    75147            size);
    76         return ENOTSUP;
     148
     149        transfer_info_t *transfer
     150            = create_transfer_info(hc, USB_DIRECTION_IN, arg);
     151        transfer->in_callback = callback;
     152
     153        usb_target_t target = {
     154                .address = dev->address,
     155                .endpoint = endpoint->endpoint
     156        };
     157
     158        hc_add_transaction_from_device(target, buffer, size,
     159            universal_callback, transfer);
     160
     161        return EOK;
    77162}
    78163
Note: See TracChangeset for help on using the changeset viewer.