Changes in / [fa8f1f7:8373f53] in mainline


Ignore:
Files:
14 deleted
15 edited

Legend:

Unmodified
Added
Removed
  • .bzrignore

    rfa8f1f7 r8373f53  
    8484./uspace/drv/test1/test1
    8585./uspace/drv/test2/test2
    86 ./uspace/drv/ohci/ohci
    8786./uspace/drv/ehci-hcd/ehci-hcd
    8887./uspace/drv/uhci-hcd/uhci-hcd
  • boot/arch/amd64/Makefile.inc

    rfa8f1f7 r8373f53  
    4444        ns8250 \
    4545        ehci-hcd \
    46         ohci \
    4746        uhci-hcd \
    4847        uhci-rhd \
  • uspace/Makefile

    rfa8f1f7 r8373f53  
    118118                srv/hw/irc/i8259 \
    119119                drv/ehci-hcd \
    120                 drv/ohci \
    121120                drv/uhci-hcd \
    122121                drv/uhci-rhd \
     
    138137                srv/hw/irc/i8259 \
    139138                drv/ehci-hcd \
    140                 drv/ohci \
    141139                drv/uhci-hcd \
    142140                drv/uhci-rhd \
  • uspace/drv/usbhid/hiddev.c

    rfa8f1f7 r8373f53  
    440440        if (rc != EOK) {
    441441                /* TODO: end session?? */
    442                 usb_endpoint_pipe_end_session(&hid_dev->ctrl_pipe);
    443442                usb_log_error("Failed to process descriptors: %s.\n",
    444443                    str_error(rc));
  • uspace/drv/usbhid/hiddev.h

    rfa8f1f7 r8373f53  
    3232/** @file
    3333 * Generic USB HID device structure and API.
    34  *
    35  * @todo Add function for parsing report - this is generic HID function, not
    36  *       keyboard-specific, as the report parser is also generic.
    37  * @todo Add function for polling as that is also a generic HID process.
    38  * @todo Add interrupt in pipe to the structure.
    3934 */
    4035
  • uspace/drv/usbhid/kbddev.c

    rfa8f1f7 r8373f53  
    9494        .flags = 0
    9595};
    96 
    97 typedef enum usbhid_kbd_flags {
    98         USBHID_KBD_STATUS_UNINITIALIZED = 0,
    99         USBHID_KBD_STATUS_INITIALIZED = 1,
    100         USBHID_KBD_STATUS_TO_DESTROY = -1
    101 } usbhid_kbd_flags;
    10296
    10397/*----------------------------------------------------------------------------*/
     
    238232       
    239233        assert(kbd_dev->hid_dev != NULL);
    240         assert(kbd_dev->hid_dev->initialized == USBHID_KBD_STATUS_INITIALIZED);
     234        assert(kbd_dev->hid_dev->initialized);
    241235        usbhid_req_set_report(kbd_dev->hid_dev, USB_HID_REPORT_TYPE_OUTPUT,
    242236            buffer, BOOTP_BUFFER_OUT_SIZE);
     
    571565                                    uint8_t *buffer, size_t actual_size)
    572566{
    573         assert(kbd_dev->initialized == USBHID_KBD_STATUS_INITIALIZED);
     567        assert(kbd_dev->initialized);
    574568        assert(kbd_dev->hid_dev->parser != NULL);
    575569       
     
    625619       
    626620        kbd_dev->console_phone = -1;
    627         kbd_dev->initialized = USBHID_KBD_STATUS_UNINITIALIZED;
     621        kbd_dev->initialized = 0;
    628622       
    629623        return kbd_dev;
     
    631625
    632626/*----------------------------------------------------------------------------*/
    633 
    634 static void usbhid_kbd_mark_unusable(usbhid_kbd_t *kbd_dev)
    635 {
    636         kbd_dev->initialized = USBHID_KBD_STATUS_TO_DESTROY;
     627/**
     628 * Properly destroys the USB/HID keyboard structure.
     629 *
     630 * @param kbd_dev Pointer to the structure to be destroyed.
     631 */
     632static void usbhid_kbd_free(usbhid_kbd_t **kbd_dev)
     633{
     634        if (kbd_dev == NULL || *kbd_dev == NULL) {
     635                return;
     636        }
     637       
     638        // hangup phone to the console
     639        async_hangup((*kbd_dev)->console_phone);
     640       
     641        if ((*kbd_dev)->hid_dev != NULL) {
     642                usbhid_dev_free(&(*kbd_dev)->hid_dev);
     643                assert((*kbd_dev)->hid_dev == NULL);
     644        }
     645       
     646        if ((*kbd_dev)->repeat_mtx != NULL) {
     647                /* TODO: replace by some check and wait */
     648                assert(!fibril_mutex_is_locked((*kbd_dev)->repeat_mtx));
     649                free((*kbd_dev)->repeat_mtx);
     650        }
     651
     652        free(*kbd_dev);
     653        *kbd_dev = NULL;
    637654}
    638655
     
    676693        }
    677694       
    678         if (kbd_dev->initialized == USBHID_KBD_STATUS_INITIALIZED) {
     695        if (kbd_dev->initialized) {
    679696                usb_log_warning("Keyboard structure already initialized.\n");
    680697                return EINVAL;
     
    689706        }
    690707       
    691         assert(kbd_dev->hid_dev->initialized == USBHID_KBD_STATUS_INITIALIZED);
     708        assert(kbd_dev->hid_dev->initialized);
    692709       
    693710        // save the size of the report (boot protocol report by default)
     
    741758        usbhid_req_set_idle(kbd_dev->hid_dev, IDLE_RATE);
    742759       
    743         kbd_dev->initialized = USBHID_KBD_STATUS_INITIALIZED;
     760        kbd_dev->initialized = 1;
    744761        usb_log_info("HID/KBD device structure initialized.\n");
    745762       
     
    855872        usbhid_kbd_poll(kbd_dev);
    856873       
    857         // as there is another fibril using this device, so we must leave the
    858         // structure to it, but mark it for destroying.
    859         usbhid_kbd_mark_unusable(kbd_dev);
    860874        // at the end, properly destroy the KBD structure
    861 //      usbhid_kbd_free(&kbd_dev);
    862 //      assert(kbd_dev == NULL);
     875        usbhid_kbd_free(&kbd_dev);
     876        assert(kbd_dev == NULL);
    863877
    864878        return EOK;
     
    982996}
    983997
    984 /*----------------------------------------------------------------------------*/
    985 
    986 int usbhid_kbd_is_usable(const usbhid_kbd_t *kbd_dev)
    987 {
    988         return (kbd_dev->initialized == USBHID_KBD_STATUS_INITIALIZED);
    989 }
    990 
    991 /*----------------------------------------------------------------------------*/
    992 /**
    993  * Properly destroys the USB/HID keyboard structure.
    994  *
    995  * @param kbd_dev Pointer to the structure to be destroyed.
    996  */
    997 void usbhid_kbd_free(usbhid_kbd_t **kbd_dev)
    998 {
    999         if (kbd_dev == NULL || *kbd_dev == NULL) {
    1000                 return;
    1001         }
    1002        
    1003         // hangup phone to the console
    1004         async_hangup((*kbd_dev)->console_phone);
    1005        
    1006         if ((*kbd_dev)->hid_dev != NULL) {
    1007                 usbhid_dev_free(&(*kbd_dev)->hid_dev);
    1008                 assert((*kbd_dev)->hid_dev == NULL);
    1009         }
    1010        
    1011         if ((*kbd_dev)->repeat_mtx != NULL) {
    1012                 /* TODO: replace by some check and wait */
    1013                 assert(!fibril_mutex_is_locked((*kbd_dev)->repeat_mtx));
    1014                 free((*kbd_dev)->repeat_mtx);
    1015         }
    1016 
    1017         free(*kbd_dev);
    1018         *kbd_dev = NULL;
    1019 }
    1020 
    1021998/**
    1022999 * @}
  • uspace/drv/usbhid/kbddev.h

    rfa8f1f7 r8373f53  
    101101        fibril_mutex_t *repeat_mtx;
    102102       
    103         /** State of the structure (for checking before use).
    104          *
    105          * 0 - not initialized
    106          * 1 - initialized
    107          * -1 - ready for destroying
    108          */
     103        /** State of the structure (for checking before use). */
    109104        int initialized;
    110105} usbhid_kbd_t;
     
    113108
    114109int usbhid_kbd_try_add_device(ddf_dev_t *dev);
    115 
    116 int usbhid_kbd_is_usable(const usbhid_kbd_t *kbd_dev);
    117 
    118 void usbhid_kbd_free(usbhid_kbd_t **kbd_dev);
    119110
    120111void usbhid_kbd_push_ev(usbhid_kbd_t *kbd_dev, int type, unsigned int key);
  • uspace/drv/usbhid/kbdrepeat.c

    rfa8f1f7 r8373f53  
    7777
    7878        while (true) {
    79                 // check if the kbd structure is usable
    80                 if (!usbhid_kbd_is_usable(kbd)) {
    81                         usbhid_kbd_free(&kbd);
    82                         assert(kbd == NULL);
    83                         return;
    84                 }
    85                
    8679                fibril_mutex_lock(kbd->repeat_mtx);
    8780
  • uspace/drv/usbhub/main.c

    rfa8f1f7 r8373f53  
    3636#include <stdio.h>
    3737
    38 #include <usb/devdrv.h>
    39 #include <usb/classes/classes.h>
    40 
    4138#include "usbhub.h"
    4239#include "usbhub_private.h"
    4340
    4441
    45 usb_endpoint_description_t hub_status_change_endpoint_description = {
    46         .transfer_type = USB_TRANSFER_INTERRUPT,
    47         .direction = USB_DIRECTION_IN,
    48         .interface_class = USB_CLASS_HUB,
    49         .interface_subclass = 0,
    50         .interface_protocol = 0,
    51         .flags = 0
     42usb_general_list_t usb_hub_list;
     43fibril_mutex_t usb_hub_list_lock;
     44
     45static driver_ops_t hub_driver_ops = {
     46        .add_device = usb_add_hub_device,
    5247};
    5348
    54 
    55 static usb_driver_ops_t usb_hub_driver_ops = {
    56         .add_device = usb_hub_add_device
     49static driver_t hub_driver = {
     50        .name = "usbhub",
     51        .driver_ops = &hub_driver_ops
    5752};
    58 
    59 static usb_driver_t usb_hub_driver = {
    60         .name = "usbhub",
    61         .ops = &usb_hub_driver_ops
    62 };
    63 
    6453
    6554int main(int argc, char *argv[])
    6655{
    6756        usb_log_enable(USB_LOG_LEVEL_DEBUG, NAME);
    68         usb_log_info("starting hub driver\n");
     57        dprintf(USB_LOG_LEVEL_INFO, "starting hub driver");
    6958
     59        //this is probably not needed anymore
     60        fibril_mutex_initialize(&usb_hub_list_lock);
     61        fibril_mutex_lock(&usb_hub_list_lock);
     62        usb_lst_init(&usb_hub_list);
     63        fibril_mutex_unlock(&usb_hub_list_lock);
    7064       
    71         usb_hub_driver.endpoints = (usb_endpoint_description_t**)
    72                         malloc(2 * sizeof(usb_endpoint_description_t*));
    73         usb_hub_driver.endpoints[0] = &hub_status_change_endpoint_description;
    74         usb_hub_driver.endpoints[1] = NULL;
    75 
    76         return usb_driver_main(&usb_hub_driver);
     65        return ddf_driver_main(&hub_driver);
    7766}
    7867
  • uspace/drv/usbhub/usbhub.c

    rfa8f1f7 r8373f53  
    5353#include "usb/classes/classes.h"
    5454
     55static ddf_dev_ops_t hub_device_ops = {
     56        .interfaces[USB_DEV_IFACE] = &usb_iface_hub_impl
     57};
     58
     59/** Hub status-change endpoint description
     60 *
     61 * For more see usb hub specification in 11.15.1 of
     62 */
     63static usb_endpoint_description_t status_change_endpoint_description = {
     64        .transfer_type = USB_TRANSFER_INTERRUPT,
     65        .direction = USB_DIRECTION_IN,
     66        .interface_class = USB_CLASS_HUB,
     67        .interface_subclass = 0,
     68        .interface_protocol = 0,
     69        .flags = 0
     70};
     71
    5572int usb_hub_control_loop(void * hub_info_param){
    5673        usb_hub_info_t * hub_info = (usb_hub_info_t*)hub_info_param;
     
    6178                async_usleep(1000 * 1000 );/// \TODO proper number once
    6279        }
    63         usb_log_error("something in ctrl loop went wrong, errno %d\n",errorCode);
     80        usb_log_error("something in ctrl loop went wrong, errno %d",errorCode);
    6481
    6582        return 0;
     
    7491
    7592/**
    76  * create usb_hub_info_t structure
    77  *
    78  * Does only basic copying of known information into new structure.
    79  * @param usb_dev usb device structure
    80  * @return basic usb_hub_info_t structure
    81  */
    82 static usb_hub_info_t * usb_hub_info_create(usb_device_t * usb_dev) {
    83         usb_hub_info_t * result = usb_new(usb_hub_info_t);
    84         if(!result) return NULL;
    85         result->usb_device = usb_dev;
    86         result->status_change_pipe = usb_dev->pipes[0].pipe;
    87         result->control_pipe = &usb_dev->ctrl_pipe;
     93 * Initialize connnections to host controller, device, and device
     94 * control endpoint
     95 * @param hub
     96 * @param device
     97 * @return
     98 */
     99static int usb_hub_init_communication(usb_hub_info_t * hub){
     100        usb_log_debug("Initializing hub USB communication (hub->device->handle=%zu).\n", hub->device->handle);
     101        int opResult;
     102        opResult = usb_device_connection_initialize_from_device(
     103                        &hub->device_connection,
     104                        hub->device);
     105        if(opResult != EOK){
     106                usb_log_error("could not initialize connection to hc, errno %d",opResult);
     107                return opResult;
     108        }
     109        usb_log_debug("Initializing USB wire abstraction.\n");
     110        opResult = usb_hc_connection_initialize_from_device(&hub->connection,
     111                        hub->device);
     112        if(opResult != EOK){
     113                usb_log_error("could not initialize connection to device, errno %d",
     114                                opResult);
     115                return opResult;
     116        }
     117        usb_log_debug("Initializing default control pipe.\n");
     118        opResult = usb_endpoint_pipe_initialize_default_control(&hub->endpoints.control,
     119            &hub->device_connection);
     120        if(opResult != EOK){
     121                usb_log_error("could not initialize connection to device endpoint, errno %d",
     122                                opResult);
     123                return opResult;
     124        }
     125
     126        opResult = usb_endpoint_pipe_probe_default_control(&hub->endpoints.control);
     127        if (opResult != EOK) {
     128                usb_log_error("failed probing endpoint 0, %d", opResult);
     129                return opResult;
     130        }
     131
     132        return EOK;
     133}
     134
     135/**
     136 * When entering this function, hub->endpoints.control should be active.
     137 * @param hub
     138 * @return
     139 */
     140static int usb_hub_process_configuration_descriptors(
     141        usb_hub_info_t * hub){
     142        if(hub==NULL) {
     143                return EINVAL;
     144        }
     145        int opResult;
     146       
     147        //device descriptor
     148        usb_standard_device_descriptor_t std_descriptor;
     149        opResult = usb_request_get_device_descriptor(&hub->endpoints.control,
     150            &std_descriptor);
     151        if(opResult!=EOK){
     152                usb_log_error("could not get device descriptor, %d",opResult);
     153                return opResult;
     154        }
     155        usb_log_info("hub has %d configurations",
     156                        std_descriptor.configuration_count);
     157        if(std_descriptor.configuration_count<1){
     158                usb_log_error("THERE ARE NO CONFIGURATIONS AVAILABLE");
     159                //shouldn`t I return?
     160        }
     161
     162        /* Retrieve full configuration descriptor. */
     163        uint8_t *descriptors = NULL;
     164        size_t descriptors_size = 0;
     165        opResult = usb_request_get_full_configuration_descriptor_alloc(
     166            &hub->endpoints.control, 0,
     167            (void **) &descriptors, &descriptors_size);
     168        if (opResult != EOK) {
     169                usb_log_error("Could not get configuration descriptor: %s.\n",
     170                    str_error(opResult));
     171                return opResult;
     172        }
     173        usb_standard_configuration_descriptor_t *config_descriptor
     174            = (usb_standard_configuration_descriptor_t *) descriptors;
     175
     176        /* Set configuration. */
     177        opResult = usb_request_set_configuration(&hub->endpoints.control,
     178            config_descriptor->configuration_number);
     179
     180        if (opResult != EOK) {
     181                usb_log_error("Failed to set hub configuration: %s.\n",
     182                    str_error(opResult));
     183                return opResult;
     184        }
     185        usb_log_debug("\tused configuration %d",
     186                        config_descriptor->configuration_number);
     187
     188        usb_endpoint_mapping_t endpoint_mapping[1] = {
     189                {
     190                        .pipe = &hub->endpoints.status_change,
     191                        .description = &status_change_endpoint_description,
     192                        .interface_no =
     193                            usb_device_get_assigned_interface(hub->device)
     194                }
     195        };
     196        opResult = usb_endpoint_pipe_initialize_from_configuration(
     197            endpoint_mapping, 1,
     198            descriptors, descriptors_size,
     199            &hub->device_connection);
     200        if (opResult != EOK) {
     201                usb_log_error("Failed to initialize status change pipe: %s",
     202                    str_error(opResult));
     203                return opResult;
     204        }
     205        if (!endpoint_mapping[0].present) {
     206                usb_log_error("Not accepting device, " \
     207                    "cannot understand what is happenning");
     208                return EREFUSED;
     209        }
     210
     211        free(descriptors);
     212        return EOK;
     213       
     214}
     215
     216
     217/**
     218 * Create hub representation from device information.
     219 * @param device
     220 * @return pointer to created structure or NULL in case of error
     221 */
     222usb_hub_info_t * usb_create_hub_info(ddf_dev_t * device) {
     223        usb_hub_info_t* result = usb_new(usb_hub_info_t);
     224        result->device = device;
     225        int opResult;
     226        opResult = usb_hub_init_communication(result);
     227        if(opResult != EOK){
     228                free(result);
     229                return NULL;
     230        }
     231
     232        //result->device = device;
     233        result->port_count = -1;
     234        result->device = device;
    88235        result->is_default_address_used = false;
    89         return result;
    90 }
    91 
    92 /**
    93  * Load hub-specific information into hub_info structure.
    94  *
    95  * Particularly read port count and initialize structure holding port
    96  * information.
    97  * This function is hub-specific and should be run only after the hub is
    98  * configured using usb_hub_set_configuration function.
    99  * @param hub_info pointer to structure with usb hub data
    100  * @return error code
    101  */
    102 static int usb_hub_get_hub_specific_info(usb_hub_info_t * hub_info){
     236
     237        //result->usb_device = usb_new(usb_hcd_attached_device_info_t);
     238        size_t received_size;
     239
    103240        // get hub descriptor
    104         usb_log_debug("creating serialized descriptor\n");
     241        usb_log_debug("creating serialized descripton");
    105242        void * serialized_descriptor = malloc(USB_HUB_MAX_DESCRIPTOR_SIZE);
    106243        usb_hub_descriptor_t * descriptor;
    107 
    108         /* this was one fix of some bug, should not be needed anymore
    109         int opResult = usb_request_set_configuration(&result->endpoints.control, 1);
    110         if(opResult!=EOK){
    111                 usb_log_error("could not set default configuration, errno %d",opResult);
    112                 return opResult;
    113         }
    114          */
    115         size_t received_size;
    116         int opResult = usb_request_get_descriptor(&hub_info->usb_device->ctrl_pipe,
     244        usb_log_debug("starting control transaction");
     245        usb_endpoint_pipe_start_session(&result->endpoints.control);
     246        opResult = usb_request_set_configuration(&result->endpoints.control, 1);
     247        assert(opResult == EOK);
     248
     249        opResult = usb_request_get_descriptor(&result->endpoints.control,
    117250                        USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_DEVICE,
    118251                        USB_DESCTYPE_HUB,
    119252                        0, 0, serialized_descriptor,
    120253                        USB_HUB_MAX_DESCRIPTOR_SIZE, &received_size);
    121 
    122         if (opResult != EOK) {
    123                 usb_log_error("failed when receiving hub descriptor, badcode = %d\n",
     254        usb_endpoint_pipe_end_session(&result->endpoints.control);
     255
     256        if (opResult != EOK) {
     257                usb_log_error("failed when receiving hub descriptor, badcode = %d",
    124258                                opResult);
    125259                free(serialized_descriptor);
    126                 return opResult;
    127         }
    128         usb_log_debug2("deserializing descriptor\n");
     260                free(result);
     261                return NULL;
     262        }
     263        usb_log_debug2("deserializing descriptor");
    129264        descriptor = usb_deserialize_hub_desriptor(serialized_descriptor);
    130265        if(descriptor==NULL){
    131                 usb_log_warning("could not deserialize descriptor \n");
    132                 return opResult;
    133         }
    134         usb_log_info("setting port count to %d\n",descriptor->ports_count);
    135         hub_info->port_count = descriptor->ports_count;
    136         hub_info->attached_devs = (usb_hc_attached_device_t*)
    137             malloc((hub_info->port_count+1) * sizeof(usb_hc_attached_device_t));
     266                usb_log_warning("could not deserialize descriptor ");
     267                free(result);
     268                return NULL;
     269        }
     270
     271        usb_log_info("setting port count to %d",descriptor->ports_count);
     272        result->port_count = descriptor->ports_count;
     273        result->attached_devs = (usb_hc_attached_device_t*)
     274            malloc((result->port_count+1) * sizeof(usb_hc_attached_device_t));
    138275        int i;
    139         for(i=0;i<hub_info->port_count+1;++i){
    140                 hub_info->attached_devs[i].handle=0;
    141                 hub_info->attached_devs[i].address=0;
    142         }
    143         usb_log_debug2("freeing data\n");
     276        for(i=0;i<result->port_count+1;++i){
     277                result->attached_devs[i].handle=0;
     278                result->attached_devs[i].address=0;
     279        }
     280        usb_log_debug2("freeing data");
    144281        free(serialized_descriptor);
    145282        free(descriptor->devices_removable);
    146283        free(descriptor);
    147         return EOK;
    148 }
    149 /**
    150  * Set configuration of hub
    151  *
    152  * Check whether there is at least one configuration and sets the first one.
    153  * This function should be run prior to running any hub-specific action.
    154  * @param hub_info
     284
     285        //finish
     286
     287        usb_log_info("hub info created");
     288
     289        return result;
     290}
     291
     292/**
     293 * Create hub representation and add it into hub list
     294 * @param dev
    155295 * @return
    156296 */
    157 static int usb_hub_set_configuration(usb_hub_info_t * hub_info){
    158         //device descriptor
    159         usb_standard_device_descriptor_t std_descriptor;
    160         int opResult = usb_request_get_device_descriptor(
    161                 &hub_info->usb_device->ctrl_pipe,
    162             &std_descriptor);
    163         if(opResult!=EOK){
    164                 usb_log_error("could not get device descriptor, %d\n",opResult);
    165                 return opResult;
    166         }
    167         usb_log_info("hub has %d configurations\n",
    168                         std_descriptor.configuration_count);
    169         if(std_descriptor.configuration_count<1){
    170                 usb_log_error("THERE ARE NO CONFIGURATIONS AVAILABLE\n");
    171                 //shouldn`t I return?
    172         }
    173 
    174         /* Retrieve full configuration descriptor. */
    175         uint8_t *descriptors = NULL;
    176         size_t descriptors_size = 0;
    177         opResult = usb_request_get_full_configuration_descriptor_alloc(
    178             &hub_info->usb_device->ctrl_pipe, 0,
    179             (void **) &descriptors, &descriptors_size);
    180         if (opResult != EOK) {
    181                 usb_log_error("Could not get configuration descriptor: %s.\n",
    182                     str_error(opResult));
    183                 return opResult;
    184         }
    185         usb_standard_configuration_descriptor_t *config_descriptor
    186             = (usb_standard_configuration_descriptor_t *) descriptors;
    187 
    188         /* Set configuration. */
    189         opResult = usb_request_set_configuration(&hub_info->usb_device->ctrl_pipe,
    190             config_descriptor->configuration_number);
    191 
    192         if (opResult != EOK) {
    193                 usb_log_error("Failed to set hub configuration: %s.\n",
    194                     str_error(opResult));
    195                 return opResult;
    196         }
    197         usb_log_debug("\tused configuration %d\n",
    198                         config_descriptor->configuration_number);
    199         free(descriptors);
    200         return EOK;
    201 }
    202 
    203 /**
    204  * Initialize hub device driver fibril
    205  *
    206  * Creates hub representation and fibril that periodically checks hub`s status.
    207  * Hub representation is passed to the fibril.
    208  * @param usb_dev generic usb device information
    209  * @return error code
    210  */
    211 int usb_hub_add_device(usb_device_t * usb_dev){
    212         if(!usb_dev) return EINVAL;
    213         usb_hub_info_t * hub_info = usb_hub_info_create(usb_dev);
    214         //create hc connection
    215         usb_log_debug("Initializing USB wire abstraction.\n");
    216         int opResult = usb_hc_connection_initialize_from_device(
    217                         &hub_info->connection,
    218                         hub_info->usb_device->ddf_dev);
     297int usb_add_hub_device(ddf_dev_t *dev) {
     298        usb_log_info("add_hub_device(handle=%d)", (int) dev->handle);
     299
     300        //dev->ops = &hub_device_ops;
     301        (void) hub_device_ops;
     302
     303        usb_hub_info_t * hub_info = usb_create_hub_info(dev);
     304        if(!hub_info){
     305                return EINTR;
     306        }
     307
     308        int opResult;
     309
     310        //perform final configurations
     311        usb_endpoint_pipe_start_session(&hub_info->endpoints.control);
     312        // process descriptors
     313        opResult = usb_hub_process_configuration_descriptors(hub_info);
    219314        if(opResult != EOK){
    220                 usb_log_error("could not initialize connection to device, errno %d\n",
     315                usb_log_error("could not get configuration descriptors, %d",
    221316                                opResult);
    222                 free(hub_info);
    223                 return opResult;
    224         }
    225        
    226         usb_endpoint_pipe_start_session(hub_info->control_pipe);
    227         //set hub configuration
    228         opResult = usb_hub_set_configuration(hub_info);
    229         if(opResult!=EOK){
    230                 usb_log_error("could not set hub configuration, errno %d\n",opResult);
    231                 free(hub_info);
    232                 return opResult;
    233         }
    234         //get port count and create attached_devs
    235         opResult = usb_hub_get_hub_specific_info(hub_info);
    236         if(opResult!=EOK){
    237                 usb_log_error("could not set hub configuration, errno %d\n",opResult);
    238                 free(hub_info);
    239                 return opResult;
    240         }
    241         usb_endpoint_pipe_end_session(hub_info->control_pipe);
    242 
    243 
    244         /// \TODO what is this?
     317                return opResult;
     318        }
     319        //power ports
     320        usb_device_request_setup_packet_t request;
     321        int port;
     322        for (port = 1; port < hub_info->port_count+1; ++port) {
     323                usb_hub_set_power_port_request(&request, port);
     324                opResult = usb_endpoint_pipe_control_write(&hub_info->endpoints.control,
     325                                &request,sizeof(usb_device_request_setup_packet_t), NULL, 0);
     326                usb_log_info("powering port %d",port);
     327                if (opResult != EOK) {
     328                        usb_log_warning("something went wrong when setting hub`s %dth port", port);
     329                }
     330        }
     331        //ports powered, hub seems to be enabled
     332        usb_endpoint_pipe_end_session(&hub_info->endpoints.control);
     333
     334        //add the hub to list
     335        //is this needed now?
     336        fibril_mutex_lock(&usb_hub_list_lock);
     337        usb_lst_append(&usb_hub_list, hub_info);
     338        fibril_mutex_unlock(&usb_hub_list_lock);
     339        usb_log_debug("hub info added to list");
     340
    245341        usb_log_debug("adding to ddf");
    246         ddf_fun_t *hub_fun = ddf_fun_create(hub_info->usb_device->ddf_dev,
    247                         fun_exposed, "hub");
     342        ddf_fun_t *hub_fun = ddf_fun_create(dev, fun_exposed, "hub");
    248343        assert(hub_fun != NULL);
    249344        hub_fun->ops = NULL;
     
    254349        assert(rc == EOK);
    255350
    256         //create fibril for the hub control loop
    257351        fid_t fid = fibril_create(usb_hub_control_loop, hub_info);
    258352        if (fid == 0) {
     
    261355        }
    262356        fibril_add_ready(fid);
     357
    263358        usb_log_debug("hub fibril created");
    264         usb_log_debug("has %d ports ",hub_info->port_count);
     359        //(void)hub_info;
     360        //usb_hub_check_hub_changes();
     361       
     362        usb_log_info("hub dev added");
     363        //address is lost...
     364        usb_log_debug("\taddress %d, has %d ports ",
     365                        //hub_info->endpoints.control.,
     366                        hub_info->port_count);
     367
    265368        return EOK;
     369        //return ENOTSUP;
    266370}
    267371
     
    284388        int opResult = usb_hc_release_default_address(&hub->connection);
    285389        if(opResult!=EOK){
    286                 usb_log_error("could not release default address, errno %d\n",opResult);
     390                usb_log_error("could not release default address, errno %d",opResult);
    287391                return opResult;
    288392        }
     
    301405        //if this hub already uses default address, it cannot request it once more
    302406        if(hub->is_default_address_used) return;
    303         usb_log_info("some connection changed\n");
    304         assert(hub->control_pipe->hc_phone);
    305         int opResult = usb_hub_clear_port_feature(hub->control_pipe,
     407        int opResult = usb_hub_clear_port_feature(&hub->endpoints.control,
    306408                                port, USB_HUB_FEATURE_C_PORT_CONNECTION);
    307409        if(opResult != EOK){
    308                 usb_log_warning("could not clear port-change-connection flag\n");
    309         }
     410                usb_log_warning("could not clear port-change-connection flag");
     411        }
     412
    310413        usb_device_request_setup_packet_t request;
    311        
     414        usb_log_info("some connection changed");
     415        assert(hub->endpoints.control.hc_phone);
    312416        //get default address
    313417        opResult = usb_hc_reserve_default_address(&hub->connection, speed);
    314418       
    315419        if (opResult != EOK) {
    316                 usb_log_warning("cannot assign default address, it is probably used %d\n",
     420                usb_log_warning("cannot assign default address, it is probably used %d",
    317421                                opResult);
    318422                return;
     
    322426        usb_hub_set_reset_port_request(&request, port);
    323427        opResult = usb_endpoint_pipe_control_write(
    324                         hub->control_pipe,
     428                        &hub->endpoints.control,
    325429                        &request,sizeof(usb_device_request_setup_packet_t),
    326430                        NULL, 0
    327431                        );
    328432        if (opResult != EOK) {
    329                 usb_log_error("something went wrong when reseting a port %d\n",opResult);
     433                usb_log_error("something went wrong when reseting a port %d",opResult);
    330434                //usb_hub_release_default_address(hc);
    331435                usb_hub_release_default_address(hub);
     
    341445 */
    342446static void usb_hub_finalize_add_device( usb_hub_info_t * hub,
    343                 uint16_t port, usb_speed_t speed) {
     447                uint16_t port, bool isLowSpeed) {
    344448
    345449        int opResult;
    346         usb_log_info("finalizing add device\n");
    347         opResult = usb_hub_clear_port_feature(hub->control_pipe,
     450        usb_log_info("finalizing add device");
     451        opResult = usb_hub_clear_port_feature(&hub->endpoints.control,
    348452            port, USB_HUB_FEATURE_C_PORT_RESET);
    349453
    350454        if (opResult != EOK) {
    351                 usb_log_error("failed to clear port reset feature\n");
     455                usb_log_error("failed to clear port reset feature");
    352456                usb_hub_release_default_address(hub);
    353457                return;
     
    364468                        &new_device_connection);
    365469        usb_endpoint_pipe_probe_default_control(&new_device_pipe);
     470        /// \TODO get highspeed info
     471        usb_speed_t speed = isLowSpeed?USB_SPEED_LOW:USB_SPEED_FULL;
     472
    366473
    367474        /* Request address from host controller. */
     
    371478                        );
    372479        if (new_device_address < 0) {
    373                 usb_log_error("failed to get free USB address\n");
     480                usb_log_error("failed to get free USB address");
    374481                opResult = new_device_address;
    375482                usb_hub_release_default_address(hub);
    376483                return;
    377484        }
    378         usb_log_info("setting new address %d\n",new_device_address);
     485        usb_log_info("setting new address %d",new_device_address);
    379486        //opResult = usb_drv_req_set_address(hc, USB_ADDRESS_DEFAULT,
    380487        //    new_device_address);
     
    383490        usb_endpoint_pipe_end_session(&new_device_pipe);
    384491        if (opResult != EOK) {
    385                 usb_log_error("could not set address for new device %d\n",opResult);
     492                usb_log_error("could not set address for new device %d",opResult);
    386493                usb_hub_release_default_address(hub);
    387494                return;
     
    398505        //??
    399506    opResult = usb_device_register_child_in_devman(new_device_address,
    400             hub->connection.hc_handle, hub->usb_device->ddf_dev, &child_handle,
     507            hub->connection.hc_handle, hub->device, &child_handle,
    401508            NULL, NULL, NULL);
    402509
    403510        if (opResult != EOK) {
    404                 usb_log_error("could not start driver for new device %d\n",opResult);
     511                usb_log_error("could not start driver for new device %d",opResult);
    405512                return;
    406513        }
     
    413520                        &hub->attached_devs[port]);
    414521        if (opResult != EOK) {
    415                 usb_log_error("could not assign address of device in hcd %d\n",opResult);
    416                 return;
    417         }
    418         usb_log_info("new device address %d, handle %zu\n",
     522                usb_log_error("could not assign address of device in hcd %d",opResult);
     523                return;
     524        }
     525        usb_log_info("new device address %d, handle %zu",
    419526            new_device_address, child_handle);
    420527
     
    430537    usb_hub_info_t * hub,uint16_t port) {
    431538
    432         int opResult = usb_hub_clear_port_feature(hub->control_pipe,
     539        int opResult = usb_hub_clear_port_feature(&hub->endpoints.control,
    433540                                port, USB_HUB_FEATURE_C_PORT_CONNECTION);
    434541        if(opResult != EOK){
    435                 usb_log_warning("could not clear port-change-connection flag\n");
     542                usb_log_warning("could not clear port-change-connection flag");
    436543        }
    437544        /** \TODO remove device from device manager - not yet implemented in
     
    452559                 */
    453560        }else{
    454                 usb_log_warning("this is strange, disconnected device had no address\n");
     561                usb_log_warning("this is strange, disconnected device had no address");
    455562                //device was disconnected before it`s port was reset - return default address
    456563                usb_hub_release_default_address(hub);
     
    470577                uint16_t port){
    471578        int opResult;
    472         opResult = usb_hub_clear_port_feature(hub->control_pipe,
     579        opResult = usb_hub_clear_port_feature(&hub->endpoints.control,
    473580            port, USB_HUB_FEATURE_PORT_POWER);
    474581        if(opResult!=EOK){
    475                 usb_log_error("cannot power off port %d;  %d\n",
     582                usb_log_error("cannot power off port %d;  %d",
    476583                                port, opResult);
    477584        }
     
    486593static void usb_hub_process_interrupt(usb_hub_info_t * hub,
    487594        uint16_t port) {
    488         usb_log_debug("interrupt at port %d\n", port);
     595        usb_log_debug("interrupt at port %d", port);
    489596        //determine type of change
    490         usb_endpoint_pipe_t *pipe = hub->control_pipe;
     597        usb_endpoint_pipe_t *pipe = &hub->endpoints.control;
    491598       
    492599        int opResult;
     
    505612                        );
    506613        if (opResult != EOK) {
    507                 usb_log_error("could not get port status\n");
     614                usb_log_error("could not get port status");
    508615                return;
    509616        }
    510617        if (rcvd_size != sizeof (usb_port_status_t)) {
    511                 usb_log_error("received status has incorrect size\n");
     618                usb_log_error("received status has incorrect size");
    512619                return;
    513620        }
     
    515622        if (usb_port_connect_change(&status)) {
    516623                if (usb_port_dev_connected(&status)) {
    517                         usb_log_info("some connection changed\n");
     624                        usb_log_info("some connection changed");
    518625                        usb_hub_init_add_device(hub, port, usb_port_speed(&status));
    519626                } else {
     
    527634                        usb_hub_over_current(hub,port);
    528635                }else{
    529                         usb_log_info("over current condition was auto-resolved on port %d\n",
     636                        usb_log_info("over current condition was auto-resolved on port %d",
    530637                                        port);
    531638                }
     
    535642                usb_log_info("port reset complete");
    536643                if (usb_port_enabled(&status)) {
    537                         usb_hub_finalize_add_device(hub, port, usb_port_speed(&status));
     644                        usb_hub_finalize_add_device(hub, port, usb_port_low_speed(&status));
    538645                } else {
    539                         usb_log_warning("port reset, but port still not enabled\n");
     646                        usb_log_warning("port reset, but port still not enabled");
    540647                }
    541648        }
     
    546653        usb_port_set_dev_connected(&status, false);
    547654        if (status>>16) {
    548                 usb_log_info("there was some unsupported change on port %d: %X\n",
     655                usb_log_info("there was some unsupported change on port %d: %X",
    549656                                port,status);
    550657
    551658        }
     659        /// \TODO handle other changes - is there any?
    552660}
    553661
     
    560668int usb_hub_check_hub_changes(usb_hub_info_t * hub_info){
    561669        int opResult;
    562         opResult = usb_endpoint_pipe_start_session(
    563                         hub_info->status_change_pipe);
     670        opResult = usb_endpoint_pipe_start_session(&hub_info->endpoints.status_change);
    564671        if(opResult != EOK){
    565                 usb_log_error("could not initialize communication for hub; %d\n",
     672                usb_log_error("could not initialize communication for hub; %d",
    566673                                opResult);
    567674                return opResult;
     
    579686         */
    580687        opResult = usb_endpoint_pipe_read(
    581                         hub_info->status_change_pipe,
     688                        &hub_info->endpoints.status_change,
    582689                        change_bitmap, byte_length, &actual_size
    583690                        );
     
    585692        if (opResult != EOK) {
    586693                free(change_bitmap);
    587                 usb_log_warning("something went wrong while getting status of hub\n");
    588                 usb_endpoint_pipe_end_session(hub_info->status_change_pipe);
     694                usb_log_warning("something went wrong while getting status of hub");
     695                usb_endpoint_pipe_end_session(&hub_info->endpoints.status_change);
    589696                return opResult;
    590697        }
    591698        unsigned int port;
    592         opResult = usb_endpoint_pipe_start_session(hub_info->control_pipe);
     699        opResult = usb_endpoint_pipe_start_session(&hub_info->endpoints.control);
    593700        if(opResult!=EOK){
    594                 usb_log_error("could not start control pipe session %d\n", opResult);
    595                 usb_endpoint_pipe_end_session(hub_info->status_change_pipe);
     701                usb_log_error("could not start control pipe session %d", opResult);
     702                usb_endpoint_pipe_end_session(&hub_info->endpoints.status_change);
    596703                return opResult;
    597704        }
    598705        opResult = usb_hc_connection_open(&hub_info->connection);
    599706        if(opResult!=EOK){
    600                 usb_log_error("could not start host controller session %d\n",
     707                usb_log_error("could not start host controller session %d",
    601708                                opResult);
    602                 usb_endpoint_pipe_end_session(hub_info->control_pipe);
    603                 usb_endpoint_pipe_end_session(hub_info->status_change_pipe);
     709                usb_endpoint_pipe_end_session(&hub_info->endpoints.control);
     710                usb_endpoint_pipe_end_session(&hub_info->endpoints.status_change);
    604711                return opResult;
    605712        }
     
    615722        }
    616723        usb_hc_connection_close(&hub_info->connection);
    617         usb_endpoint_pipe_end_session(hub_info->control_pipe);
    618         usb_endpoint_pipe_end_session(hub_info->status_change_pipe);
     724        usb_endpoint_pipe_end_session(&hub_info->endpoints.control);
     725        usb_endpoint_pipe_end_session(&hub_info->endpoints.status_change);
    619726        free(change_bitmap);
    620727        return EOK;
  • uspace/drv/usbhub/usbhub.h

    rfa8f1f7 r8373f53  
    4545
    4646#include <usb/pipes.h>
    47 #include <usb/devdrv.h>
    48 
    49 
    50 /** Hub status-change endpoint description
    51  *
    52  * For more see usb hub specification in 11.15.1 of
    53  */
    54 extern usb_endpoint_description_t hub_status_change_endpoint_description;
    55 
    56 
    5747
    5848/* Hub endpoints. */
    59 /*typedef struct {
     49typedef struct {
    6050        usb_endpoint_pipe_t control;
    6151        usb_endpoint_pipe_t status_change;
    6252} usb_hub_endpoints_t;
    63 */
     53
    6454
    6555
     
    6858        /** Number of ports. */
    6959        int port_count;
    70 
    7160        /** attached device handles, for each port one */
    7261        usb_hc_attached_device_t * attached_devs;
    73        
     62        /** General usb device info. */
     63        //usb_hcd_attached_device_info_t * usb_device;
     64        /** General device info*/
     65        ddf_dev_t * device;
    7466        /** connection to hcd */
     67        //usb_device_connection_t connection;
    7568        usb_hc_connection_t connection;
     69        /** */
     70        usb_device_connection_t device_connection;
     71        /** hub endpoints */
     72        usb_hub_endpoints_t endpoints;
    7673
    77         /** default address is used indicator
    78          *
    79          * If default address is requested by this device, it cannot
    80          * be requested by the same hub again, otherwise a deadlock will occur.
    81          */
    8274        bool is_default_address_used;
    83 
    84         /** convenience pointer to status change pipe
    85          *
    86          * Status change pipe is initialized in usb_device structure. This is
    87          * pointer into this structure, so that it does not have to be
    88          * searched again and again for the 'right pipe'.
    89          */
    90         usb_endpoint_pipe_t * status_change_pipe;
    91 
    92         /** convenience pointer to control pipe
    93          *
    94          * Control pipe is initialized in usb_device structure. This is
    95          * pointer into this structure, so that it does not have to be
    96          * searched again and again for the 'right pipe'.
    97          */
    98         usb_endpoint_pipe_t * control_pipe;
    99 
    100         /** generic usb device data*/
    101         usb_device_t * usb_device;
    10275} usb_hub_info_t;
    10376
     
    10780 */
    10881int usb_hub_control_loop(void * hub_info_param);
     82
     83/** Callback when new hub device is detected.
     84 *
     85 * @param dev New device.
     86 * @return Error code.
     87 */
     88int usb_add_hub_device(ddf_dev_t *dev);
    10989
    11090/**
     
    11797
    11898
    119 int usb_hub_add_device(usb_device_t * usb_dev);
     99
     100
    120101
    121102#endif
  • uspace/drv/usbhub/usbhub_private.h

    rfa8f1f7 r8373f53  
    5858
    5959
     60//************
     61//
     62// convenience debug printf for usb hub
     63//
     64//************
     65#define dprintf(level, format, ...) \
     66        usb_log_printf((level), format "\n", ##__VA_ARGS__)
     67
     68
    6069/**
    6170 * Create hub structure instance
     
    6877 */
    6978usb_hub_info_t * usb_create_hub_info(ddf_dev_t * device);
     79
     80/** List of hubs maanged by this driver */
     81extern usb_general_list_t usb_hub_list;
     82
     83/** Lock for hub list*/
     84extern fibril_mutex_t usb_hub_list_lock;
     85
     86
     87/**
     88 * Perform complete control read transaction
     89 *
     90 * Manages all three steps of transaction: setup, read and finalize
     91 * @param phone
     92 * @param target
     93 * @param request Request packet
     94 * @param rcvd_buffer Received data
     95 * @param rcvd_size
     96 * @param actual_size Actual size of received data
     97 * @return error code
     98 */
     99/*
     100int usb_drv_sync_control_read(
     101    usb_endpoint_pipe_t *pipe,
     102    usb_device_request_setup_packet_t * request,
     103    void * rcvd_buffer, size_t rcvd_size, size_t * actual_size
     104);*/
     105
     106/**
     107 * Perform complete control write transaction
     108 *
     109 * Manages all three steps of transaction: setup, write and finalize
     110 * @param phone
     111 * @param target
     112 * @param request Request packet to send data
     113 * @param sent_buffer
     114 * @param sent_size
     115 * @return error code
     116 */
     117/*int usb_drv_sync_control_write(
     118    usb_endpoint_pipe_t *pipe,
     119    usb_device_request_setup_packet_t * request,
     120    void * sent_buffer, size_t sent_size
     121);*/
    70122
    71123/**
     
    111163
    112164/**
    113  * create uint8_t array with serialized descriptor
     165 * @brief create uint8_t array with serialized descriptor
    114166 *
    115167 * @param descriptor
     
    119171
    120172/**
    121  * create deserialized desriptor structure out of serialized descriptor
     173 * @brief create deserialized desriptor structure out of serialized descriptor
    122174 *
    123175 * The serialized descriptor must be proper usb hub descriptor,
  • uspace/drv/usbhub/utils.c

    rfa8f1f7 r8373f53  
    8888
    8989        if (sdescriptor[1] != USB_DESCTYPE_HUB) {
    90                 usb_log_warning("trying to deserialize wrong descriptor %x\n",sdescriptor[1]);
     90                dprintf(1,"[usb_hub] wrong descriptor %x\n",sdescriptor[1]);
    9191                return NULL;
    9292        }
     
    103103                        ? 1 : 0);
    104104        result->devices_removable = (uint8_t*) malloc(var_size);
    105 
     105        //printf("[usb_hub] getting removable devices data \n");
    106106        size_t i;
    107107        for (i = 0; i < var_size; ++i) {
     
    111111}
    112112
     113//control transactions
     114/*
     115int usb_drv_sync_control_read(
     116    int phone, usb_target_t target,
     117    usb_device_request_setup_packet_t * request,
     118    void * rcvd_buffer, size_t rcvd_size, size_t * actual_size
     119) {
     120        usb_handle_t handle;
     121        int opResult;
     122        //setup
     123        opResult = usb_drv_async_control_read_setup(phone, target,
     124            request, sizeof (usb_device_request_setup_packet_t),
     125            &handle);
     126        if (opResult != EOK) {
     127                return opResult;
     128        }
     129        opResult = usb_drv_async_wait_for(handle);
     130        if (opResult != EOK) {
     131                return opResult;
     132        }
     133        //read
     134        opResult = usb_drv_async_control_read_data(phone, target,
     135                        rcvd_buffer, rcvd_size, actual_size,
     136                        &handle);
     137        if (opResult != EOK) {
     138                return opResult;
     139        }
     140        opResult = usb_drv_async_wait_for(handle);
     141        if (opResult != EOK) {
     142                return opResult;
     143        }
     144        //finalize
     145        opResult = usb_drv_async_control_read_status(phone, target,
     146                        &handle);
     147        if (opResult != EOK) {
     148                return opResult;
     149        }
     150        opResult = usb_drv_async_wait_for(handle);
     151        if (opResult != EOK) {
     152                return opResult;
     153        }
     154        return EOK;
     155}
     156
     157int usb_drv_sync_control_write(
     158    int phone, usb_target_t target,
     159    usb_device_request_setup_packet_t * request,
     160    void * sent_buffer, size_t sent_size
     161) {
     162        usb_handle_t handle;
     163        int opResult;
     164        //setup
     165        opResult = usb_drv_async_control_write_setup(phone, target,
     166            request, sizeof (usb_device_request_setup_packet_t),
     167            &handle);
     168        if (opResult != EOK) {
     169                return opResult;
     170        }
     171        opResult = usb_drv_async_wait_for(handle);
     172        if (opResult != EOK) {
     173                return opResult;
     174        }
     175        //write
     176        opResult = usb_drv_async_control_write_data(phone, target,
     177                        sent_buffer, sent_size,
     178                        &handle);
     179        if (opResult != EOK) {
     180                return opResult;
     181        }
     182        opResult = usb_drv_async_wait_for(handle);
     183        if (opResult != EOK) {
     184                return opResult;
     185        }
     186        //finalize
     187        opResult = usb_drv_async_control_write_status(phone, target,
     188            &handle);
     189        if (opResult != EOK) {
     190                return opResult;
     191        }
     192        opResult = usb_drv_async_wait_for(handle);
     193        if (opResult != EOK) {
     194                return opResult;
     195        }
     196        return EOK;
     197}
     198
     199*/
     200
    113201
    114202
  • uspace/lib/usb/include/usb/devdrv.h

    rfa8f1f7 r8373f53  
    7979         */
    8080        const char *name;
    81         /** Expected endpoints description, excluding default control endpoint.
    82          *
    83          * It MUST be of size expected_enpoints_count(excluding default ctrl) + 1
    84          * where the last record MUST BE NULL, otherwise catastrophic things may
    85          * happen.
    86          */
     81        /** Expected endpoints description. */
    8782        usb_endpoint_description_t **endpoints;
    8883        /** Driver ops. */
  • uspace/lib/usb/src/devdrv.c

    rfa8f1f7 r8373f53  
    206206 * @return Error code.
    207207 */
    208 static int initialize_pipes(usb_device_t *dev)
     208static int initialize_pipes(usb_driver_t *drv, usb_device_t *dev)
    209209{
    210210        int rc;
     
    284284        dev->driver_data = NULL;
    285285
    286         rc = initialize_pipes(dev);
     286        rc = initialize_pipes(driver, dev);
    287287        if (rc != EOK) {
    288288                free(dev);
Note: See TracChangeset for help on using the changeset viewer.