This is an automated email from the ASF dual-hosted git repository.

xiaoxiang781216 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit e03c23c4aebaa6c9ca29a965287d68d06a74c7ec
Author: Justin Hammond <[email protected]>
AuthorDate: Sun Aug 16 17:09:58 2026 +0800

    drivers/usbhost: Do not disable an xHCI port while probing it.
    
    xhci_probe_ports() wrote PORTSC back to clear the change bits, including
    PED, which is write-one-to-clear.  A port that came up enabled, which is
    what a device attached at power up produces, was switched off by the act
    of reading it.
    
    Mask PED out of the value written back.  The port status worker already
    does this.
    
    Assisted-by: Claude:claude-opus-5
    Signed-off-by: Justin Hammond <[email protected]>
---
 drivers/usbhost/usbhost_xhci.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/usbhost/usbhost_xhci.c b/drivers/usbhost/usbhost_xhci.c
index efea0fb89dd..50ee8f0f760 100644
--- a/drivers/usbhost/usbhost_xhci.c
+++ b/drivers/usbhost/usbhost_xhci.c
@@ -1291,8 +1291,13 @@ static void xhci_probe_ports(FAR struct usbhost_xhci_s 
*priv)
       portsc = xhci_oper_getreg(priv, XHCI_PORTSC(i));
       priv->rhport[i].connected = ((portsc & XHCI_PORTSC_CCS) != 0);
 
-      /* Clear status change */
+      /* Clear status change, but not PED.  Port Enabled/Disabled is
+       * write-one-to-clear, so writing back what was read disables any
+       * port that came up enabled, which is what a device attached at
+       * power up does.
+       */
 
+      portsc &= ~XHCI_PORTSC_PED;
       xhci_oper_putreg(priv, XHCI_PORTSC(i), portsc);
     }
 }

Reply via email to