Is UPS_PORT_POWER wrong?

Kohji Okuno okuno.kohji at jp.panasonic.com
Tue Jan 24 00:53:47 UTC 2012


Hi HPS,

> On Monday 23 January 2012 09:12:46 Kohji Okuno wrote:
>> Hi HPS,
>> 
>> I think that UPS_PORT_POWER and UPS_PORT_LINK_STATE overlap.
>> And, in xhci.c you set UPS_PORT_POWER as folows.
>> 
>> When UPS_PORT_POWER is set, UPS_PORT_LINK_STATE_GET() macro will
>> return incorrect value.
>> 
>>                 if (v & XHCI_PS_PP) {
>>                         /*
>>                          * The USB 3.0 RH is using the
>>                          * USB 2.0's power bit
>>                          */
>>                         i |= UPS_PORT_POWER;
>>                 }
>> 
> 
> Hi,
> 
> The USB 3.0 root HUB is special because it defines FULL/HIGH and LOW speed, so 
> I had to merge that into the port status register of the XHCI root HUB like 
> this:
> 
> 0: CONNECT_STATUS
> 1: PORT_ENABLED
> 2: SUSPEND
> 3: OVERCURRENT_INDICATOR
> 4: LINK STATE (USB 3.0)
> 5: -
> 6: -
> 7: -
> 8: PORT_POWER (USB 2.0)
> # Bit 9+10 have 4 combinations which are defined: FS, LW, HS, SS
> 9: LOW_SPEED (USB 2.0)
> 10: HIGH_SPEED (USB 2.0)
> 11: not implemented
> 12: PORT_INDICATOR
> 13:
> 14:
> 15: MODE_DEVICE (FreeBSD specific)
> 
> If you have a better idea, it is possible to change this.

I have a idea.

-#define UPS_PORT_LINK_STATE_GET(x)      (((x) >> 5) & 0xF)
-#define UPS_PORT_LINK_STATE_SET(x)      (((x) & 0xF) << 5)
+#define UPS_PORT_LINK_STATE_GET(x)      ((((x) >> 5) & 0x7)|(((x) >> 11) & 0x8))
+#define UPS_PORT_LINK_STATE_SET(x)      ((((x) & 0x7) << 5)|(((x) & 0x8) << 11))
+#define UPS_PORT_LS_SS                  0x4000  /* currently FreeBSD specific */

But, this is not cool.

Regards,
 Kohji Okuno


More information about the freebsd-current mailing list