Author: hselasky
Date: Fri Jan 13 07:28:34 2012
New Revision: 230050
URL: http://svn.freebsd.org/changeset/base/230050

Log:
  Correct use of USB 3.0 POWER bit in the port status register,
  hence it was overlapping the USB 3.0 root HUB's speed bits.
  
  Reported by:  Kohji Okuno
  MFC after:    1 week

Modified:
  head/sys/dev/usb/controller/xhci.c
  head/sys/dev/usb/usb_hub.c

Modified: head/sys/dev/usb/controller/xhci.c
==============================================================================
--- head/sys/dev/usb/controller/xhci.c  Fri Jan 13 07:19:02 2012        
(r230049)
+++ head/sys/dev/usb/controller/xhci.c  Fri Jan 13 07:28:34 2012        
(r230050)
@@ -3194,8 +3194,13 @@ xhci_roothub_exec(struct usb_device *ude
                        i |= UPS_OVERCURRENT_INDICATOR;
                if (v & XHCI_PS_PR)
                        i |= UPS_RESET;
-               if (v & XHCI_PS_PP)
-                       i |= UPS_PORT_POWER_SS;
+               if (v & XHCI_PS_PP) {
+                       /*
+                        * The USB 3.0 RH is using the
+                        * USB 2.0's power bit
+                        */
+                       i |= UPS_PORT_POWER;
+               }
                USETW(sc->sc_hub_desc.ps.wPortStatus, i);
 
                i = 0;

Modified: head/sys/dev/usb/usb_hub.c
==============================================================================
--- head/sys/dev/usb/usb_hub.c  Fri Jan 13 07:19:02 2012        (r230049)
+++ head/sys/dev/usb/usb_hub.c  Fri Jan 13 07:28:34 2012        (r230050)
@@ -327,6 +327,7 @@ uhub_reattach_port(struct uhub_softc *sc
        enum usb_dev_speed speed;
        enum usb_hc_mode mode;
        usb_error_t err;
+       uint16_t power_mask;
        uint8_t timeout;
 
        DPRINTF("reattaching port %d\n", portno);
@@ -373,20 +374,22 @@ repeat:
        case USB_SPEED_HIGH:
        case USB_SPEED_FULL:
        case USB_SPEED_LOW:
-               if (!(sc->sc_st.port_status & UPS_PORT_POWER)) {
-                       DPRINTF("WARNING: strange, connected port %d "
-                           "has no power\n", portno);
-               }
+               power_mask = UPS_PORT_POWER;
                break;
        case USB_SPEED_SUPER:
-               if (!(sc->sc_st.port_status & UPS_PORT_POWER_SS)) {
-                       DPRINTF("WARNING: strange, connected port %d "
-                           "has no power\n", portno);
-               }
+               if (udev->parent_hub == NULL)
+                       power_mask = UPS_PORT_POWER;
+               else
+                       power_mask = UPS_PORT_POWER_SS;
                break;
        default:
+               power_mask = 0;
                break;
        }
+       if (!(sc->sc_st.port_status & power_mask)) {
+               DPRINTF("WARNING: strange, connected port %d "
+                   "has no power\n", portno);
+       }
 
        /* check if the device is in Host Mode */
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to