This bit should be only set when the port enable goes down, for
example, on errors. Not when it gets set after a port reset. Some
USB stacks seem to be sensitive to this and fails enumeration.

Signed-off-by: Benjamin Herrenschmidt <b...@kernel.crashing.org>
---
 drivers/usb/gadget/udc/aspeed-vhub/hub.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/gadget/udc/aspeed-vhub/hub.c 
b/drivers/usb/gadget/udc/aspeed-vhub/hub.c
index 7c040f56100e..0755115fd90d 100644
--- a/drivers/usb/gadget/udc/aspeed-vhub/hub.c
+++ b/drivers/usb/gadget/udc/aspeed-vhub/hub.c
@@ -449,8 +449,15 @@ static void ast_vhub_change_port_stat(struct ast_vhub 
*vhub,
                       USB_PORT_STAT_C_OVERCURRENT |
                       USB_PORT_STAT_C_RESET |
                       USB_PORT_STAT_C_L1;
-               p->change |= chg;
 
+               /*
+                * We only set USB_PORT_STAT_C_ENABLE if we are disabling
+                * the port as per USB spec, otherwise MacOS gets upset
+                */
+               if (p->status & USB_PORT_STAT_ENABLE)
+                       chg &= ~USB_PORT_STAT_C_ENABLE;
+
+               p->change = chg;
                ast_vhub_update_hub_ep1(vhub, port);
        }
 }
-- 
2.17.1

Reply via email to