Ignore:
File:
1 edited

Legend:

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

    r5c1a65e r192ba25  
    4747#include "port_status.h"
    4848
     49
    4950/** Information for fibril for device discovery. */
    5051struct add_device_phase1 {
     
    6465 * any function here and must be cleared by hand
    6566 */
    66 static const int non_handled_changes[] = {
     67static const int non_handled_changes[] =  {
    6768        USB_HUB_FEATURE_C_PORT_ENABLE,
    6869        USB_HUB_FEATURE_C_PORT_SUSPEND
     
    7071
    7172static void usb_hub_removed_device(
    72     usb_hub_info_t *hub, uint16_t port);
    73 
    74 static void usb_hub_port_reset_completed(usb_hub_info_t *hub,
    75     uint16_t port, uint32_t status);
    76 
    77 static void usb_hub_port_over_current(usb_hub_info_t *hub,
    78     uint16_t port, uint32_t status);
     73        usb_hub_info_t * hub, uint16_t port);
     74
     75static void usb_hub_port_reset_completed(usb_hub_info_t * hub,
     76        uint16_t port, uint32_t status);
     77
     78static void usb_hub_port_over_current(usb_hub_info_t * hub,
     79        uint16_t port, uint32_t status);
    7980
    8081static int get_port_status(usb_pipe_t *ctrl_pipe, size_t port,
     
    9596 * @param port port number, starting from 1
    9697 */
    97 void usb_hub_process_interrupt(usb_hub_info_t *hub,
    98     uint16_t port) {
    99         usb_log_debug("Interrupt at port %zu\n", (size_t) port);
     98void usb_hub_process_interrupt(usb_hub_info_t * hub,
     99        uint16_t port) {
     100        usb_log_debug("interrupt at port %zu\n", (size_t) port);
    100101        //determine type of change
    101102        //usb_pipe_t *pipe = hub->control_pipe;
     
    133134        if (usb_port_is_status(status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT)) {
    134135                //check if it was not auto-resolved
    135                 usb_log_debug("Overcurrent change on port\n");
     136                usb_log_debug("overcurrent change on port\n");
    136137                usb_hub_port_over_current(hub, port, status);
    137138        }
     
    140141                usb_hub_port_reset_completed(hub, port, status);
    141142        }
    142         usb_log_debug("Status x%x : %d\n ", status, status);
     143        usb_log_debug("status x%x : %d\n ", status, status);
    143144
    144145        usb_port_status_set_bit(
    145             &status, USB_HUB_FEATURE_C_PORT_CONNECTION, false);
     146            &status, USB_HUB_FEATURE_C_PORT_CONNECTION,false);
    146147        usb_port_status_set_bit(
    147             &status, USB_HUB_FEATURE_C_PORT_RESET, false);
     148            &status, USB_HUB_FEATURE_C_PORT_RESET,false);
    148149        usb_port_status_set_bit(
    149             &status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT, false);
    150 
     150            &status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT,false);
     151       
    151152        //clearing not yet handled changes     
    152153        unsigned int feature_idx;
    153         for (feature_idx = 0;
    154             feature_idx < non_handled_changes_count;
    155             ++feature_idx) {
     154        for(feature_idx = 0;feature_idx<non_handled_changes_count;
     155            ++feature_idx){
    156156                unsigned int bit_idx = non_handled_changes[feature_idx];
    157                 if (status & (1 << bit_idx)) {
     157                if(status & (1<<bit_idx)){
    158158                        usb_log_info(
    159                             "There was not yet handled change on port %d: %d"
     159                            "there was not yet handled change on port %d: %d"
    160160                            ";clearing it\n",
    161                             port, bit_idx);
     161                        port, bit_idx);
    162162                        int opResult = usb_hub_clear_port_feature(
    163163                            hub->control_pipe,
     
    165165                        if (opResult != EOK) {
    166166                                usb_log_warning(
    167                                     "Could not clear port flag %d: %s\n",
    168                                     bit_idx, str_error(opResult)
     167                                    "could not clear port flag %d: %d\n",
     168                                    bit_idx, opResult
    169169                                    );
    170170                        }
    171171                        usb_port_status_set_bit(
    172                             &status, bit_idx, false);
     172                            &status, bit_idx,false);
    173173                }
    174174        }
    175         if (status >> 16) {
    176                 usb_log_info("There is still some unhandled change %X\n",
     175        if(status>>16){
     176                usb_log_info("there is still some unhandled change %X\n",
    177177                    status);
    178178        }
    179179}
     180
    180181
    181182/**
     
    189190 */
    190191static void usb_hub_removed_device(
    191     usb_hub_info_t *hub, uint16_t port) {
     192        usb_hub_info_t * hub, uint16_t port) {
    192193
    193194        int opResult = usb_hub_clear_port_feature(hub->control_pipe,
    194             port, USB_HUB_FEATURE_C_PORT_CONNECTION);
     195                port, USB_HUB_FEATURE_C_PORT_CONNECTION);
    195196        if (opResult != EOK) {
    196                 usb_log_warning("Could not clear port-change-connection flag\n");
     197                usb_log_warning("could not clear port-change-connection flag\n");
    197198        }
    198199        /** \TODO remove device from device manager - not yet implemented in
     
    201202
    202203        //close address
    203 
    204         usb_hub_port_t *the_port = hub->ports + port;
    205 
    206         fibril_mutex_lock(&hub->port_mutex);
    207 
    208         if (the_port->attached_device.address >= 0) {
    209                 usb_log_warning("Device unplug on `%s' (port %zu): " \
    210                     "not implemented.\n", hub->usb_device->ddf_dev->name,
    211                     (size_t) port);
    212                 the_port->attached_device.address = -1;
    213                 the_port->attached_device.handle = 0;
     204        if(hub->ports[port].attached_device.address >= 0){
     205                /*uncomment this code to use it when DDF allows device removal
     206                opResult = usb_hc_unregister_device(
     207                        &hub->connection,
     208                        hub->attached_devs[port].address);
     209                if(opResult != EOK) {
     210                        dprintf(USB_LOG_LEVEL_WARNING, "could not release "
     211                                "address of "
     212                            "removed device: %d", opResult);
     213                }
     214                hub->attached_devs[port].address = 0;
     215                hub->attached_devs[port].handle = 0;
     216                 */
    214217        } else {
    215218                usb_log_warning("Device removed before being registered.\n");
     
    220223                 * port reset callback from new device wrapper.
    221224                 */
     225                usb_hub_port_t *the_port = hub->ports + port;
    222226                fibril_mutex_lock(&the_port->reset_mutex);
    223227                the_port->reset_completed = true;
     
    226230                fibril_mutex_unlock(&the_port->reset_mutex);
    227231        }
    228 
    229         fibril_mutex_unlock(&hub->port_mutex);
    230 }
     232}
     233
    231234
    232235/**
     
    239242 * @param status
    240243 */
    241 static void usb_hub_port_reset_completed(usb_hub_info_t *hub,
    242     uint16_t port, uint32_t status) {
     244static void usb_hub_port_reset_completed(usb_hub_info_t * hub,
     245        uint16_t port, uint32_t status){
    243246        usb_log_debug("Port %zu reset complete.\n", (size_t) port);
    244247        if (usb_port_is_status(status, USB_HUB_FEATURE_PORT_ENABLE)) {
     
    272275 * @param port port number, starting from 1
    273276 */
    274 static void usb_hub_port_over_current(usb_hub_info_t *hub,
    275     uint16_t port, uint32_t status) {
     277static void usb_hub_port_over_current(usb_hub_info_t * hub,
     278        uint16_t port, uint32_t status) {
    276279        int opResult;
    277         if (usb_port_is_status(status, USB_HUB_FEATURE_PORT_OVER_CURRENT)) {
     280        if(usb_port_is_status(status, USB_HUB_FEATURE_PORT_OVER_CURRENT)){
    278281                opResult = usb_hub_clear_port_feature(hub->control_pipe,
    279                     port, USB_HUB_FEATURE_PORT_POWER);
     282                        port, USB_HUB_FEATURE_PORT_POWER);
    280283                if (opResult != EOK) {
    281                         usb_log_error("Cannot power off port %d; %s\n",
    282                             port, str_error(opResult));
     284                        usb_log_error("cannot power off port %d;  %d\n",
     285                                port, opResult);
    283286                }
    284         } else {
     287        }else{
    285288                opResult = usb_hub_set_port_feature(hub->control_pipe,
    286                     port, USB_HUB_FEATURE_PORT_POWER);
     289                        port, USB_HUB_FEATURE_PORT_POWER);
    287290                if (opResult != EOK) {
    288                         usb_log_error("Cannot power on port %d; %s\n",
    289                             port, str_error(opResult));
     291                        usb_log_error("cannot power on port %d;  %d\n",
     292                                port, opResult);
    290293                }
    291294        }
     
    300303 */
    301304static int get_port_status(usb_pipe_t *ctrl_pipe, size_t port,
    302     usb_port_status_t *status) {
     305    usb_port_status_t *status)
     306{
    303307        size_t recv_size;
    304308        usb_device_request_setup_packet_t request;
     
    307311        usb_hub_set_port_status_request(&request, port);
    308312        int rc = usb_pipe_control_read(ctrl_pipe,
    309             &request, sizeof (usb_device_request_setup_packet_t),
    310             &status_tmp, sizeof (status_tmp), &recv_size);
     313            &request, sizeof(usb_device_request_setup_packet_t),
     314            &status_tmp, sizeof(status_tmp), &recv_size);
    311315        if (rc != EOK) {
    312316                return rc;
     
    333337 * @return Error code.
    334338 */
    335 static int enable_port_callback(int port_no, void *arg) {
     339static int enable_port_callback(int port_no, void *arg)
     340{
    336341        usb_hub_info_t *hub = arg;
    337342        int rc;
     
    341346        usb_hub_set_reset_port_request(&request, port_no);
    342347        rc = usb_pipe_control_write(hub->control_pipe,
    343             &request, sizeof (request), NULL, 0);
     348            &request, sizeof(request), NULL, 0);
    344349        if (rc != EOK) {
    345350                usb_log_warning("Port reset failed: %s.\n", str_error(rc));
     
    371376 * @return 0 Always.
    372377 */
    373 static int add_device_phase1_worker_fibril(void *arg) {
     378static int add_device_phase1_worker_fibril(void *arg)
     379{
    374380        struct add_device_phase1 *data
    375381            = (struct add_device_phase1 *) arg;
     
    390396        }
    391397
    392         fibril_mutex_lock(&data->hub->port_mutex);
    393398        data->hub->ports[data->port].attached_device.handle = child_handle;
    394399        data->hub->ports[data->port].attached_device.address = new_address;
    395         fibril_mutex_unlock(&data->hub->port_mutex);
    396400
    397401        usb_log_info("Detected new device on `%s' (port %zu), "
     
    403407        free(arg);
    404408
    405         fibril_mutex_lock(&data->hub->pending_ops_mutex);
    406         assert(data->hub->pending_ops_count > 0);
    407         data->hub->pending_ops_count--;
    408         fibril_condvar_signal(&data->hub->pending_ops_cv);
    409         fibril_mutex_unlock(&data->hub->pending_ops_mutex);
    410 
    411 
    412409        return EOK;
    413410}
     411
    414412
    415413/** Start device adding when connection change is detected.
     
    423421 */
    424422static int create_add_device_fibril(usb_hub_info_t *hub, size_t port,
    425     usb_speed_t speed) {
     423    usb_speed_t speed)
     424{
    426425        struct add_device_phase1 *data
    427             = malloc(sizeof (struct add_device_phase1));
     426            = malloc(sizeof(struct add_device_phase1));
    428427        if (data == NULL) {
    429428                return ENOMEM;
     
    453452                return ENOMEM;
    454453        }
    455         fibril_mutex_lock(&hub->pending_ops_mutex);
    456         hub->pending_ops_count++;
    457         fibril_mutex_unlock(&hub->pending_ops_mutex);
    458454        fibril_add_ready(fibril);
    459455
Note: See TracChangeset for help on using the changeset viewer.