Ignore:
File:
1 edited

Legend:

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

    r192ba25 r5c1a65e  
    4747#include "port_status.h"
    4848
    49 
    5049/** Information for fibril for device discovery. */
    5150struct add_device_phase1 {
     
    6564 * any function here and must be cleared by hand
    6665 */
    67 static const int non_handled_changes[] =  {
     66static const int non_handled_changes[] = {
    6867        USB_HUB_FEATURE_C_PORT_ENABLE,
    6968        USB_HUB_FEATURE_C_PORT_SUSPEND
     
    7170
    7271static void usb_hub_removed_device(
    73         usb_hub_info_t * hub, uint16_t port);
    74 
    75 static void usb_hub_port_reset_completed(usb_hub_info_t * hub,
    76         uint16_t port, uint32_t status);
    77 
    78 static void usb_hub_port_over_current(usb_hub_info_t * hub,
    79         uint16_t port, uint32_t status);
     72    usb_hub_info_t *hub, uint16_t port);
     73
     74static void usb_hub_port_reset_completed(usb_hub_info_t *hub,
     75    uint16_t port, uint32_t status);
     76
     77static void usb_hub_port_over_current(usb_hub_info_t *hub,
     78    uint16_t port, uint32_t status);
    8079
    8180static int get_port_status(usb_pipe_t *ctrl_pipe, size_t port,
     
    9695 * @param port port number, starting from 1
    9796 */
    98 void 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);
     97void 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);
    101100        //determine type of change
    102101        //usb_pipe_t *pipe = hub->control_pipe;
     
    134133        if (usb_port_is_status(status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT)) {
    135134                //check if it was not auto-resolved
    136                 usb_log_debug("overcurrent change on port\n");
     135                usb_log_debug("Overcurrent change on port\n");
    137136                usb_hub_port_over_current(hub, port, status);
    138137        }
     
    141140                usb_hub_port_reset_completed(hub, port, status);
    142141        }
    143         usb_log_debug("status x%x : %d\n ", status, status);
     142        usb_log_debug("Status x%x : %d\n ", status, status);
    144143
    145144        usb_port_status_set_bit(
    146             &status, USB_HUB_FEATURE_C_PORT_CONNECTION,false);
     145            &status, USB_HUB_FEATURE_C_PORT_CONNECTION, false);
    147146        usb_port_status_set_bit(
    148             &status, USB_HUB_FEATURE_C_PORT_RESET,false);
     147            &status, USB_HUB_FEATURE_C_PORT_RESET, false);
    149148        usb_port_status_set_bit(
    150             &status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT,false);
    151        
     149            &status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT, false);
     150
    152151        //clearing not yet handled changes     
    153152        unsigned int feature_idx;
    154         for(feature_idx = 0;feature_idx<non_handled_changes_count;
    155             ++feature_idx){
     153        for (feature_idx = 0;
     154            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: %d\n",
    168                                     bit_idx, opResult
     167                                    "Could not clear port flag %d: %s\n",
     168                                    bit_idx, str_error(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 
    181180
    182181/**
     
    190189 */
    191190static void usb_hub_removed_device(
    192         usb_hub_info_t * hub, uint16_t port) {
     191    usb_hub_info_t *hub, uint16_t port) {
    193192
    194193        int opResult = usb_hub_clear_port_feature(hub->control_pipe,
    195                 port, USB_HUB_FEATURE_C_PORT_CONNECTION);
     194            port, USB_HUB_FEATURE_C_PORT_CONNECTION);
    196195        if (opResult != EOK) {
    197                 usb_log_warning("could not clear port-change-connection flag\n");
     196                usb_log_warning("Could not clear port-change-connection flag\n");
    198197        }
    199198        /** \TODO remove device from device manager - not yet implemented in
     
    202201
    203202        //close address
    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                  */
     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;
    217214        } else {
    218215                usb_log_warning("Device removed before being registered.\n");
     
    223220                 * port reset callback from new device wrapper.
    224221                 */
    225                 usb_hub_port_t *the_port = hub->ports + port;
    226222                fibril_mutex_lock(&the_port->reset_mutex);
    227223                the_port->reset_completed = true;
     
    230226                fibril_mutex_unlock(&the_port->reset_mutex);
    231227        }
    232 }
    233 
     228
     229        fibril_mutex_unlock(&hub->port_mutex);
     230}
    234231
    235232/**
     
    242239 * @param status
    243240 */
    244 static void usb_hub_port_reset_completed(usb_hub_info_t * hub,
    245         uint16_t port, uint32_t status){
     241static void usb_hub_port_reset_completed(usb_hub_info_t *hub,
     242    uint16_t port, uint32_t status) {
    246243        usb_log_debug("Port %zu reset complete.\n", (size_t) port);
    247244        if (usb_port_is_status(status, USB_HUB_FEATURE_PORT_ENABLE)) {
     
    275272 * @param port port number, starting from 1
    276273 */
    277 static void usb_hub_port_over_current(usb_hub_info_t * hub,
    278         uint16_t port, uint32_t status) {
     274static void usb_hub_port_over_current(usb_hub_info_t *hub,
     275    uint16_t port, uint32_t status) {
    279276        int opResult;
    280         if(usb_port_is_status(status, USB_HUB_FEATURE_PORT_OVER_CURRENT)){
     277        if (usb_port_is_status(status, USB_HUB_FEATURE_PORT_OVER_CURRENT)) {
    281278                opResult = usb_hub_clear_port_feature(hub->control_pipe,
    282                         port, USB_HUB_FEATURE_PORT_POWER);
     279                    port, USB_HUB_FEATURE_PORT_POWER);
    283280                if (opResult != EOK) {
    284                         usb_log_error("cannot power off port %d;  %d\n",
    285                                 port, opResult);
     281                        usb_log_error("Cannot power off port %d; %s\n",
     282                            port, str_error(opResult));
    286283                }
    287         }else{
     284        } else {
    288285                opResult = usb_hub_set_port_feature(hub->control_pipe,
    289                         port, USB_HUB_FEATURE_PORT_POWER);
     286                    port, USB_HUB_FEATURE_PORT_POWER);
    290287                if (opResult != EOK) {
    291                         usb_log_error("cannot power on port %d;  %d\n",
    292                                 port, opResult);
     288                        usb_log_error("Cannot power on port %d; %s\n",
     289                            port, str_error(opResult));
    293290                }
    294291        }
     
    303300 */
    304301static int get_port_status(usb_pipe_t *ctrl_pipe, size_t port,
    305     usb_port_status_t *status)
    306 {
     302    usb_port_status_t *status) {
    307303        size_t recv_size;
    308304        usb_device_request_setup_packet_t request;
     
    311307        usb_hub_set_port_status_request(&request, port);
    312308        int rc = usb_pipe_control_read(ctrl_pipe,
    313             &request, sizeof(usb_device_request_setup_packet_t),
    314             &status_tmp, sizeof(status_tmp), &recv_size);
     309            &request, sizeof (usb_device_request_setup_packet_t),
     310            &status_tmp, sizeof (status_tmp), &recv_size);
    315311        if (rc != EOK) {
    316312                return rc;
     
    337333 * @return Error code.
    338334 */
    339 static int enable_port_callback(int port_no, void *arg)
    340 {
     335static int enable_port_callback(int port_no, void *arg) {
    341336        usb_hub_info_t *hub = arg;
    342337        int rc;
     
    346341        usb_hub_set_reset_port_request(&request, port_no);
    347342        rc = usb_pipe_control_write(hub->control_pipe,
    348             &request, sizeof(request), NULL, 0);
     343            &request, sizeof (request), NULL, 0);
    349344        if (rc != EOK) {
    350345                usb_log_warning("Port reset failed: %s.\n", str_error(rc));
     
    376371 * @return 0 Always.
    377372 */
    378 static int add_device_phase1_worker_fibril(void *arg)
    379 {
     373static int add_device_phase1_worker_fibril(void *arg) {
    380374        struct add_device_phase1 *data
    381375            = (struct add_device_phase1 *) arg;
     
    396390        }
    397391
     392        fibril_mutex_lock(&data->hub->port_mutex);
    398393        data->hub->ports[data->port].attached_device.handle = child_handle;
    399394        data->hub->ports[data->port].attached_device.address = new_address;
     395        fibril_mutex_unlock(&data->hub->port_mutex);
    400396
    401397        usb_log_info("Detected new device on `%s' (port %zu), "
     
    407403        free(arg);
    408404
     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
    409412        return EOK;
    410413}
    411 
    412414
    413415/** Start device adding when connection change is detected.
     
    421423 */
    422424static int create_add_device_fibril(usb_hub_info_t *hub, size_t port,
    423     usb_speed_t speed)
    424 {
     425    usb_speed_t speed) {
    425426        struct add_device_phase1 *data
    426             = malloc(sizeof(struct add_device_phase1));
     427            = malloc(sizeof (struct add_device_phase1));
    427428        if (data == NULL) {
    428429                return ENOMEM;
     
    452453                return ENOMEM;
    453454        }
     455        fibril_mutex_lock(&hub->pending_ops_mutex);
     456        hub->pending_ops_count++;
     457        fibril_mutex_unlock(&hub->pending_ops_mutex);
    454458        fibril_add_ready(fibril);
    455459
Note: See TracChangeset for help on using the changeset viewer.