Changeset 5e6e50b in mainline for uspace/drv/vhc/transfer.c


Ignore:
Timestamp:
2011-05-17T09:20:34Z (13 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
2aaf804
Parents:
a29529b (diff), 3375bd4 (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:

Development branch changes

File:
1 edited

Legend:

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

    ra29529b r5e6e50b  
    44#include <usbvirt/ipc.h>
    55#include "vhcd.h"
    6 
    7 #define list_foreach(pos, head) \
    8         for (pos = (head)->next; pos != (head); \
    9                 pos = pos->next)
    106
    117vhc_transfer_t *vhc_transfer_create(usb_address_t address, usb_endpoint_t ep,
     
    6763        fibril_mutex_lock(&vhc->guard);
    6864
    69         link_t *pos;
    7065        bool target_found = false;
    71         list_foreach(pos, &vhc->devices) {
     66        list_foreach(vhc->devices, pos) {
    7267                vhc_virtdev_t *dev = list_get_instance(pos, vhc_virtdev_t, link);
    7368                fibril_mutex_lock(&dev->guard);
     
    161156}
    162157
     158static vhc_transfer_t *dequeue_first_transfer(vhc_virtdev_t *dev)
     159{
     160        assert(fibril_mutex_is_locked(&dev->guard));
     161        assert(!list_empty(&dev->transfer_queue));
     162
     163        vhc_transfer_t *transfer = list_get_instance(dev->transfer_queue.next,
     164            vhc_transfer_t, link);
     165        list_remove(&transfer->link);
     166
     167        return transfer;
     168}
     169
     170
     171static void execute_transfer_callback_and_free(vhc_transfer_t *transfer,
     172    size_t data_transfer_size, int outcome)
     173{
     174        assert(outcome != ENAK);
     175
     176        usb_log_debug2("Transfer %p ended: %s.\n",
     177            transfer, str_error(outcome));
     178
     179        if (transfer->direction == USB_DIRECTION_IN) {
     180                transfer->callback_in(transfer->ddf_fun, outcome,
     181                    data_transfer_size, transfer->callback_arg);
     182        } else {
     183                assert(transfer->direction == USB_DIRECTION_OUT);
     184                transfer->callback_out(transfer->ddf_fun, outcome,
     185                    transfer->callback_arg);
     186        }
     187
     188        free(transfer);
     189}
    163190
    164191int vhc_transfer_queue_processor(void *arg)
     
    174201                }
    175202
    176                 vhc_transfer_t *transfer = list_get_instance(dev->transfer_queue.next,
    177                     vhc_transfer_t, link);
    178                 list_remove(&transfer->link);
     203                vhc_transfer_t *transfer = dequeue_first_transfer(dev);
    179204                fibril_mutex_unlock(&dev->guard);
    180205
     
    214239
    215240                if (rc != ENAK) {
    216                         usb_log_debug2("Transfer %p ended: %s.\n",
    217                             transfer, str_error(rc));
    218                         if (transfer->direction == USB_DIRECTION_IN) {
    219                                 transfer->callback_in(transfer->ddf_fun, rc,
    220                                     data_transfer_size, transfer->callback_arg);
    221                         } else {
    222                                 assert(transfer->direction == USB_DIRECTION_OUT);
    223                                 transfer->callback_out(transfer->ddf_fun, rc,
    224                                     transfer->callback_arg);
    225                         }
    226                         free(transfer);
     241                        execute_transfer_callback_and_free(transfer,
     242                            data_transfer_size, rc);
    227243                }
    228244
     
    231247        }
    232248
     249        /* Immediately fail all remaining transfers. */
     250        while (!list_empty(&dev->transfer_queue)) {
     251                vhc_transfer_t *transfer = dequeue_first_transfer(dev);
     252                execute_transfer_callback_and_free(transfer, 0, EBADCHECKSUM);
     253        }
     254
    233255        fibril_mutex_unlock(&dev->guard);
    234256
    235         // TODO - destroy pending transfers
    236 
    237257        return EOK;
    238258}
Note: See TracChangeset for help on using the changeset viewer.