svn commit: r272822 - head/sys/dev/usb

roseknr1 swamy36084 at gmail.com
Thu Oct 9 15:01:58 UTC 2014




*join free social network clickcare 
<https://www.globallshare.com/en/3076994.html>*





On Thursday, October 9, 2014 8:13:51 PM UTC+5:30, Hans Petter Selasky wrote:
>
> Author: hselasky 
> Date: Thu Oct  9 14:43:43 2014 
> New Revision: 272822 
> URL: https://svnweb.freebsd.org/changeset/base/272822 
>
> Log: 
>   Add sysctl knob to disable port power on a specific USB HUB. You need 
>   to reset the USB HUB using "usbconfig -d X.Y reset" or boot having the 
>   setting in /boot/loader.conf before it activates. 
>
> Modified: 
>   head/sys/dev/usb/usb_hub.c 
>
> Modified: head/sys/dev/usb/usb_hub.c 
> ============================================================================== 
>
> --- head/sys/dev/usb/usb_hub.c        Thu Oct  9 14:33:20 
> 2014        (r272821) 
> +++ head/sys/dev/usb/usb_hub.c        Thu Oct  9 14:43:43 
> 2014        (r272822) 
> @@ -101,6 +101,10 @@ SYSCTL_INT(_hw_usb, OID_AUTO, power_time 
>  static int usb_disable_enumeration = 0; 
>  SYSCTL_INT(_hw_usb, OID_AUTO, disable_enumeration, CTLFLAG_RWTUN, 
>      &usb_disable_enumeration, 0, "Set to disable all USB device 
> enumeration."); 
> + 
> +static int usb_disable_port_power = 0; 
> +SYSCTL_INT(_hw_usb, OID_AUTO, disable_port_power, CTLFLAG_RWTUN, 
> +    &usb_disable_port_power, 0, "Set to disable all USB port power."); 
>  #endif 
>   
>  struct uhub_current_state { 
> @@ -119,6 +123,7 @@ struct uhub_softc { 
>          struct usb_xfer *sc_xfer[UHUB_N_TRANSFER];        /* interrupt 
> xfer */ 
>  #if USB_HAVE_DISABLE_ENUM 
>          int sc_disable_enumeration; 
> +        int sc_disable_port_power; 
>  #endif 
>          uint8_t        sc_flags; 
>  #define        UHUB_FLAG_DID_EXPLORE 0x01 
> @@ -1406,6 +1411,24 @@ uhub_attach(device_t dev) 
>          /* wait with power off for a while */ 
>          usb_pause_mtx(NULL, USB_MS_TO_TICKS(USB_POWER_DOWN_TIME)); 
>   
> +#if USB_HAVE_DISABLE_ENUM 
> +        /* Add device sysctls */ 
> + 
> +        sysctl_ctx = device_get_sysctl_ctx(dev); 
> +        sysctl_tree = device_get_sysctl_tree(dev); 
> + 
> +        if (sysctl_ctx != NULL && sysctl_tree != NULL) { 
> +                (void) SYSCTL_ADD_INT(sysctl_ctx, 
> SYSCTL_CHILDREN(sysctl_tree), 
> +                    OID_AUTO, "disable_enumeration", CTLFLAG_RWTUN, 
> +                    &sc->sc_disable_enumeration, 0, 
> +                    "Set to disable enumeration on this USB HUB."); 
> + 
> +                (void) SYSCTL_ADD_INT(sysctl_ctx, 
> SYSCTL_CHILDREN(sysctl_tree), 
> +                    OID_AUTO, "disable_port_power", CTLFLAG_RWTUN, 
> +                    &sc->sc_disable_port_power, 0, 
> +                    "Set to disable USB port power on this USB HUB."); 
> +        } 
> +#endif 
>          /* 
>           * To have the best chance of success we do things in the exact 
> same 
>           * order as Windoze98.  This should not be necessary, but some 
> @@ -1460,13 +1483,27 @@ uhub_attach(device_t dev) 
>                          removable++; 
>                          break; 
>                  } 
> -                if (!err) { 
> -                        /* turn the power on */ 
> -                        err = usbd_req_set_port_feature(udev, NULL, 
> -                            portno, UHF_PORT_POWER); 
> +                if (err == 0) { 
> +#if USB_HAVE_DISABLE_ENUM 
> +                        /* check if we should disable USB port power or 
> not */ 
> +                        if (usb_disable_port_power != 0 || 
> +                            sc->sc_disable_port_power != 0) { 
> +                                /* turn the power off */ 
> +                                DPRINTFN(0, "Turning port %d power 
> off\n", portno); 
> +                                err = usbd_req_clear_port_feature(udev, 
> NULL, 
> +                                    portno, UHF_PORT_POWER); 
> +                        } else { 
> +#endif 
> +                                /* turn the power on */ 
> +                                DPRINTFN(0, "Turning port %d power on\n", 
> portno); 
> +                                err = usbd_req_set_port_feature(udev, 
> NULL, 
> +                                    portno, UHF_PORT_POWER); 
> +#if USB_HAVE_DISABLE_ENUM 
> +                        } 
> +#endif 
>                  } 
> -                if (err) { 
> -                        DPRINTFN(0, "port %d power on failed, %s\n", 
> +                if (err != 0) { 
> +                        DPRINTFN(0, "port %d power on or off failed, 
> %s\n", 
>                              portno, usbd_errstr(err)); 
>                  } 
>                  DPRINTF("turn on port %d power\n", 
> @@ -1490,19 +1527,6 @@ uhub_attach(device_t dev) 
>   
>          usbd_set_power_mode(udev, USB_POWER_MODE_SAVE); 
>   
> -#if USB_HAVE_DISABLE_ENUM 
> -        /* Add device sysctls */ 
> - 
> -        sysctl_ctx = device_get_sysctl_ctx(dev); 
> -        sysctl_tree = device_get_sysctl_tree(dev); 
> - 
> -        if (sysctl_ctx != NULL && sysctl_tree != NULL) { 
> -                (void) SYSCTL_ADD_INT(sysctl_ctx, 
> SYSCTL_CHILDREN(sysctl_tree), 
> -                    OID_AUTO, "disable_enumeration", CTLFLAG_RWTUN, 
> -                    &sc->sc_disable_enumeration, 0, 
> -                    "Set to disable enumeration on this USB HUB."); 
> -        } 
> -#endif 
>          return (0); 
>   
>  error: 
> _______________________________________________ 
> svn-s... at freebsd.org <javascript:> mailing list 
> http://lists.freebsd.org/mailman/listinfo/svn-src-all 
> To unsubscribe, send any mail to "svn-src-all... at freebsd.org <javascript:>" 
>
>


More information about the svn-src-head mailing list