Changeset 5e6e50b in mainline for uspace/drv


Ignore:
Timestamp:
2011-05-17T09:20:34Z (15 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

Location:
uspace/drv
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/uhci-rhd/port.c

    ra29529b r5e6e50b  
    3737#include <str_error.h>
    3838#include <time.h>
     39#include <async.h>
    3940
    4041#include <usb/usb.h>    /* usb_address_t */
  • uspace/drv/usbhid/main.c

    ra29529b r5e6e50b  
    202202        printf(NAME ": HelenOS USB HID driver.\n");
    203203
    204         usb_log_enable(USB_LOG_LEVEL_DEBUG, NAME);
     204        usb_log_enable(USB_LOG_LEVEL_DEFAULT, NAME);
    205205
    206206        return usb_driver_main(&usb_hid_driver);
  • uspace/drv/vhc/conndev.c

    ra29529b r5e6e50b  
    3737#include <errno.h>
    3838#include <ddf/driver.h>
     39#include <usbvirt/ipc.h>
    3940#include "conn.h"
    4041
    4142static fibril_local uintptr_t plugged_device_handle = 0;
     43#define PLUGGED_DEVICE_NAME_MAXLEN 256
     44static fibril_local char plugged_device_name[PLUGGED_DEVICE_NAME_MAXLEN + 1] = "<unknown>";
     45
     46/** Receive device name.
     47 *
     48 * @warning Errors are silently ignored.
     49 *
     50 * @param phone Phone to the virtual device.
     51 */
     52static void receive_device_name(int phone)
     53{
     54        aid_t opening_request = async_send_0(phone, IPC_M_USBVIRT_GET_NAME, NULL);
     55        if (opening_request == 0) {
     56                return;
     57        }
     58
     59
     60        ipc_call_t data_request_call;
     61        aid_t data_request = async_data_read(phone,
     62             plugged_device_name, PLUGGED_DEVICE_NAME_MAXLEN,
     63             &data_request_call);
     64
     65        if (data_request == 0) {
     66                async_wait_for(opening_request, NULL);
     67                return;
     68        }
     69
     70        sysarg_t data_request_rc;
     71        sysarg_t opening_request_rc;
     72        async_wait_for(data_request, &data_request_rc);
     73        async_wait_for(opening_request, &opening_request_rc);
     74
     75        if ((data_request_rc != EOK) || (opening_request_rc != EOK)) {
     76                return;
     77        }
     78
     79        size_t len = IPC_GET_ARG2(data_request_call);
     80        plugged_device_name[len] = 0;
     81}
    4282
    4383/** Default handler for IPC methods not handled by DDF.
     
    65105                async_answer_0(icallid, EOK);
    66106
    67                 usb_log_info("New virtual device `%s' (id = %" PRIxn ").\n",
    68                     rc == EOK ? "XXX" : "<unknown>", plugged_device_handle);
     107                receive_device_name(callback);
     108
     109                usb_log_info("New virtual device `%s' (id: %" PRIxn ").\n",
     110                    plugged_device_name, plugged_device_handle);
    69111
    70112                return;
     
    85127
    86128        if (plugged_device_handle != 0) {
    87                 usb_log_info("Virtual device disconnected (id = %" PRIxn ").\n",
    88                     plugged_device_handle);
     129                usb_log_info("Virtual device `%s' disconnected (id: %" PRIxn ").\n",
     130                    plugged_device_name, plugged_device_handle);
    89131                vhc_virtdev_unplug(vhc, plugged_device_handle);
    90132        }
  • 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.