Changeset 5097bed4 in mainline


Ignore:
Timestamp:
2011-01-07T15:00:31Z (13 years ago)
Author:
Matus Dekanek <smekideki@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
44bb20b
Parents:
43c3937
Message:

usb hub driver codelifting. added futex to guard hub list

Location:
uspace/drv/usbhub
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/usbhub/main.c

    r43c3937 r5097bed4  
    3838
    3939usb_general_list_t usb_hub_list;
     40futex_t usb_hub_list_lock;
    4041
    4142static driver_ops_t hub_driver_ops = {
     
    6061{
    6162        usb_dprintf_enable(NAME,1);
     63        futex_initialize(&usb_hub_list_lock, 0);
    6264        usb_lst_init(&usb_hub_list);
     65        futex_up(&usb_hub_list_lock);
    6366        fid_t fid = fibril_create(usb_hub_control_loop, NULL);
    6467        if (fid == 0) {
  • uspace/drv/usbhub/usbhub.c

    r43c3937 r5097bed4  
    7575        //get some hub info
    7676        usb_address_t addr = usb_drv_get_my_address(hc, device);
    77         dprintf(1,"[usb_hub] addres of newly created hub = %d", addr);
     77        dprintf(1,"[usb_hub] address of newly created hub = %d", addr);
    7878        /*if(addr<0){
    7979                //return result;
     
    174174                dprintf(1,"[usb_hub] THERE ARE NO CONFIGURATIONS AVAILABLE");
    175175        }
     176        /// \TODO check other configurations
    176177        usb_standard_configuration_descriptor_t config_descriptor;
    177178        opResult = usb_drv_req_get_bare_configuration_descriptor(hc,
     
    194195        }
    195196
    196 
    197197        for (port = 1; port < hub_info->port_count+1; ++port) {
    198198                usb_hub_set_power_port_request(&request, port);
     
    205205        //ports powered, hub seems to be enabled
    206206
    207 
    208207        ipc_hangup(hc);
    209208
    210209        //add the hub to list
     210        futex_down(&usb_hub_list_lock);
    211211        usb_lst_append(&usb_hub_list, hub_info);
     212        futex_up(&usb_hub_list_lock);
     213
    212214        dprintf(1,"[usb_hub] hub info added to list");
    213215        //(void)hub_info;
     
    233235//
    234236//*********************************************
     237
     238/**
     239 * convenience function for releasing default address and writing debug info
     240 * (these few lines are used too often to be written again and again)
     241 * @param hc
     242 * @return
     243 */
     244inline static int usb_hub_release_default_address(int hc){
     245        int opResult;
     246        dprintf(1,"[usb_hub] releasing default address");
     247        opResult = usb_drv_release_default_address(hc);
     248        if (opResult != EOK) {
     249                dprintf(1,"[usb_hub] failed to release default address");
     250        }
     251        return opResult;
     252}
    235253
    236254/**
     
    259277        if (opResult != EOK) {
    260278                dprintf(1,"[usb_hub] something went wrong when reseting a port");
    261         }
    262 }
    263 
    264 /**
    265  * convenience function for releasing default address and writing debug info
    266  * (these few lines are used too often to be written again and again)
    267  * @param hc
    268  * @return
    269  */
    270 inline static int usb_hub_release_default_address(int hc){
    271         int opResult;
    272         dprintf(1,"[usb_hub] releasing default address");
    273         opResult = usb_drv_release_default_address(hc);
    274         if (opResult != EOK) {
    275                 dprintf(1,"[usb_hub] failed to release default address");
    276         }
    277         return opResult;
    278 }
    279 
     279                usb_hub_release_default_address(hc);
     280        }
     281}
    280282
    281283/**
     
    343345
    344346/**
    345  * unregister device address in hc, close the port
     347 * unregister device address in hc
    346348 * @param hc
    347349 * @param port
     
    352354        //usb_device_request_setup_packet_t request;
    353355        int opResult;
    354         //disable port
    355         /*usb_hub_set_disable_port_request(&request, port);
    356         opResult = usb_drv_sync_control_write(
    357                         hc, target,
    358                         &request,
    359                         NULL, 0
    360                         );
    361         if (opResult != EOK) {
    362                 //continue;
    363                 printf("[usb_hub] something went wrong when disabling a port\n");
    364         }*/
     356       
    365357        /// \TODO remove device
    366358
     
    457449         */
    458450        usb_general_list_t * lst_item;
     451        futex_down(&usb_hub_list_lock);
    459452        for (lst_item = usb_hub_list.next;
    460453                        lst_item != &usb_hub_list;
    461454                        lst_item = lst_item->next) {
     455                futex_up(&usb_hub_list_lock);
    462456                usb_hub_info_t * hub_info = ((usb_hub_info_t*)lst_item->data);
    463457                /*
     
    510504                        }
    511505                }
     506                free(change_bitmap);
    512507
    513508                ipc_hangup(hc);
    514         }
     509                futex_down(&usb_hub_list_lock);
     510        }
     511        futex_up(&usb_hub_list_lock);
    515512}
    516513
  • uspace/drv/usbhub/usbhub_private.h

    r43c3937 r5097bed4  
    4343#include <bool.h>
    4444#include <driver.h>
     45#include <futex.h>
     46
    4547#include <usb/usb.h>
    4648#include <usb/usbdrv.h>
     
    6668
    6769/**
    68  * @brief create hub structure instance
     70 * create hub structure instance
    6971 *
    7072 * Set the address and port count information most importantly.
     
    7981extern usb_general_list_t usb_hub_list;
    8082
     83/** lock for hub list*/
     84extern futex_t usb_hub_list_lock;
     85
    8186
    8287/**
    83  * @brief perform complete control read transaction
     88 * perform complete control read transaction
    8489 *
    8590 * manages all three steps of transaction: setup, read and finalize
     
    99104
    100105/**
    101  * @brief perform complete control write transaction
     106 * perform complete control write transaction
    102107 *
    103  * maanges all three steps of transaction: setup, write and finalize
     108 * manages all three steps of transaction: setup, write and finalize
    104109 * @param phone
    105110 * @param target
     
    114119    void * sent_buffer, size_t sent_size
    115120);
    116 
    117 
    118 /**
    119  * set the device request to be a set address request
    120  * @param request
    121  * @param addr
    122  * \TODO this will be obsolete see usb/dev_req.h
    123  */
    124 static inline void usb_hub_set_set_address_request(
    125 usb_device_request_setup_packet_t * request, uint16_t addr
    126 ){
    127         request->index = 0;
    128         request->request_type = 0;/// \TODO this is not very nice sollution, we ned constant
    129         request->request = USB_DEVREQ_SET_ADDRESS;
    130         request->value = addr;
    131         request->length = 0;
    132 }
    133121
    134122/**
  • uspace/drv/usbhub/utils.c

    r43c3937 r5097bed4  
    200200
    201201
    202 /*
    203  * method for testing port status bitmap
    204  
    205 static void usb_hub_test_port_status(void) {
    206         printf("[usb_hub] -------------port status test---------\n");
    207         usb_port_status_t status = 0;
    208 
    209         //printf("original status %d (should be 0)\n",(uint32_t)status);
    210         usb_port_set_bit(&status, 1, 1);
    211         //printf("%d =?= 2\n",(uint32_t)status);
    212         if (status != 2) {
    213                 printf("[usb_port_status] test failed: wrong set of bit 1\n");
    214                 return;
    215         }
    216         usb_port_set_bit(&status, 3, 1);
    217         if (status != 10) {
    218                 printf("[usb_port_status] test failed: wrong set of bit 3\n");
    219                 return;
    220         }
    221 
    222         usb_port_set_bit(&status, 15, 1);
    223         if (status != 10 + (1 << 15)) {
    224                 printf("[usb_port_status] test failed: wrong set of bit 15\n");
    225                 return;
    226         }
    227         usb_port_set_bit(&status, 1, 0);
    228         if (status != 8 + (1 << 15)) {
    229                 printf("[usb_port_status] test failed: wrong unset of bit 1\n");
    230                 return;
    231         }
    232         int i;
    233         for (i = 0; i < 32; ++i) {
    234                 if (i == 3 || i == 15) {
    235                         if (!usb_port_get_bit(&status, i)) {
    236                                 printf("[usb_port_status] test failed: wrong bit at %d\n", i);
    237                         }
    238                 } else {
    239                         if (usb_port_get_bit(&status, i)) {
    240                                 printf("[usb_port_status] test failed: wrong bit at %d\n", i);
    241                         }
    242                 }
    243         }
    244 
    245         printf("test ok\n");
    246 
    247 
    248         //printf("%d =?= 10\n",(uint32_t)status);
    249 
    250         //printf("this should be 0: %d \n",usb_port_get_bit(&status,0));
    251         //printf("this should be 1: %d \n",usb_port_get_bit(&status,1));
    252         //printf("this should be 0: %d \n",usb_port_get_bit(&status,2));
    253         //printf("this should be 1: %d \n",usb_port_get_bit(&status,3));
    254         //printf("this should be 0: %d \n",usb_port_get_bit(&status,4));
    255 
    256 }
    257 */
     202
    258203
    259204
Note: See TracChangeset for help on using the changeset viewer.