On Sat, Jul 09, 2011 at 06:44:26AM +0200, Eric Faurot wrote:
> So, there is actually another bug in that chunk of code.  This diff
> fixes them:
> 
> - Read the register from the correct location: HCSPARAMS is a
>   capability register.
> 
> - Construct the resulting mask correctly by adding
>   parenthesis where needed: '|' takes precedence over '?'
>   so currently the expression evaluates as
> 
>       EHCI_HCS_PPC(v) ? UHD_PWR_INDIVIDUAL : UHD_PORT_IND
> 
>   where v is not even the correct value.
> 
> This should let the ehci driver correctly report the characteristics
> of the controller's root hub.

ok krw@

.... Ken

> 
> 
> Index: ehci.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/ehci.c,v
> retrieving revision 1.117
> diff -u -r1.117 ehci.c
> --- ehci.c    3 Jul 2011 15:47:17 -0000       1.117
> +++ ehci.c    9 Jul 2011 00:52:49 -0000
> @@ -2148,11 +2148,10 @@
>               }
>               hubd = ehci_hubd;
>               hubd.bNbrPorts = sc->sc_noport;
> -             v = EOREAD4(sc, EHCI_HCSPARAMS);
> +             v = EREAD4(sc, EHCI_HCSPARAMS);
>               USETW(hubd.wHubCharacteristics,
> -                 EHCI_HCS_PPC(v) ? UHD_PWR_INDIVIDUAL : UHD_PWR_NO_SWITCH |
> -                 EHCI_HCS_P_INDICATOR(EREAD4(sc, EHCI_HCSPARAMS))
> -                     ? UHD_PORT_IND : 0);
> +                 (EHCI_HCS_PPC(v) ? UHD_PWR_INDIVIDUAL : UHD_PWR_NO_SWITCH) |
> +                 (EHCI_HCS_P_INDICATOR(v) ? UHD_PORT_IND : 0));
>               hubd.bPwrOn2PwrGood = 200; /* XXX can't find out? */
>               for (i = 0, l = sc->sc_noport; l > 0; i++, l -= 8, v >>= 8)
>                       hubd.DeviceRemovable[i++] = 0; /* XXX can't find out? */

Reply via email to