Ignore:
File:
1 edited

Legend:

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

    rffca03c r7d521e24  
    6767    usb_hub_status_t status);
    6868
    69 static int usb_process_hub_local_power_change(usb_hub_info_t * hub_info,
     69static int usb_process_hub_power_change(usb_hub_info_t * hub_info,
    7070    usb_hub_status_t status);
    7171
     
    386386        int opResult;
    387387        if (usb_hub_is_status(status,USB_HUB_FEATURE_HUB_OVER_CURRENT)){
    388                 //poweroff all ports
    389                 unsigned int port;
    390                 for(port = 1;port <= hub_info->port_count;++port){
    391                         opResult = usb_hub_clear_port_feature(
    392                             hub_info->control_pipe,port,
    393                             USB_HUB_FEATURE_PORT_POWER);
    394                         if (opResult != EOK) {
    395                                 usb_log_warning(
    396                                     "cannot power off port %d;  %d\n",
    397                                     port, opResult);
    398                         }
     388                opResult = usb_hub_clear_feature(hub_info->control_pipe,
     389                    USB_HUB_FEATURE_HUB_LOCAL_POWER);
     390                if (opResult != EOK) {
     391                        usb_log_error("cannot power off hub: %d\n",
     392                            opResult);
    399393                }
    400394        } else {
    401                 //power all ports
    402                 unsigned int port;
    403                 for(port = 1;port <= hub_info->port_count;++port){
    404                         opResult = usb_hub_set_port_feature(
    405                             hub_info->control_pipe,port,
    406                             USB_HUB_FEATURE_PORT_POWER);
    407                         if (opResult != EOK) {
    408                                 usb_log_warning(
    409                                     "cannot power off port %d;  %d\n",
    410                                     port, opResult);
    411                         }
     395                opResult = usb_hub_set_feature(hub_info->control_pipe,
     396                    USB_HUB_FEATURE_HUB_LOCAL_POWER);
     397                if (opResult != EOK) {
     398                        usb_log_error("cannot power on hub: %d\n",
     399                            opResult);
    412400                }
    413401        }
     
    416404
    417405/**
    418  * process hub local power change
    419  *
    420  * This change is ignored.
     406 * process hub power change
     407 *
     408 * If the power has been lost, reestablish it.
     409 * If it was reestablished, re-power all ports.
    421410 * @param hub_info hub instance
    422411 * @param status hub status bitmask
    423412 * @return error code
    424413 */
    425 static int usb_process_hub_local_power_change(usb_hub_info_t * hub_info,
     414static int usb_process_hub_power_change(usb_hub_info_t * hub_info,
    426415    usb_hub_status_t status) {
    427416        int opResult = EOK;
     417        if (!usb_hub_is_status(status,USB_HUB_FEATURE_HUB_LOCAL_POWER)) {
     418                //restart power on hub
     419                opResult = usb_hub_set_feature(hub_info->control_pipe,
     420                    USB_HUB_FEATURE_HUB_LOCAL_POWER);
     421                if (opResult != EOK) {
     422                        usb_log_error("cannot power on hub: %d\n",
     423                            opResult);
     424                }
     425        } else {//power reestablished on hub- restart ports
     426                size_t port;
     427                for (port = 1; port <= hub_info->port_count; ++port) {
     428                        opResult = usb_hub_set_port_feature(
     429                            hub_info->control_pipe,
     430                            port, USB_HUB_FEATURE_PORT_POWER);
     431                        if (opResult != EOK) {
     432                                usb_log_error("Cannot power on port %zu: %s.\n",
     433                                    port, str_error(opResult));
     434                        }
     435                }
     436        }
     437        if(opResult!=EOK){
     438                return opResult;//no feature clearing
     439        }
    428440        opResult = usb_hub_clear_feature(hub_info->control_pipe,
    429441            USB_HUB_FEATURE_C_HUB_LOCAL_POWER);
     
    475487        if (
    476488            usb_hub_is_status(status,16+USB_HUB_FEATURE_C_HUB_LOCAL_POWER)) {
    477                 usb_process_hub_local_power_change(hub_info, status);
     489                usb_process_hub_power_change(hub_info, status);
    478490        }
    479491}
Note: See TracChangeset for help on using the changeset viewer.