Feng, Below change solves the problem with a device behind the hub. Do we still need the 10ms delay in UsbHubResetPort function for manual port reset in case of XHCI?
Thanks, Baranee -----Original Message----- From: Tian, Feng [mailto:feng.t...@intel.com] Sent: Monday, November 14, 2016 10:28 PM To: Anbazhagan, Baraneedharan <anbazha...@hp.com>; edk2-devel@lists.01.org Cc: Tian, Feng <feng.t...@intel.com> Subject: RE: USB hub port reset Baranee Supposing are using latest usb code in EdkII trunk. We send ADDRESS DEVICE CMD in XhcInitializeDeviceSlot(), which will cause XHC issue a USB SET_ADDRESS request to the USB Device. There are two possible paths: 1. Reset_Change bit gets set after connection without manually port reset. UsbHubGetPortStatus()->XhcPollPortStatusChange()->(if RESET_C bit is set)->XhcInitializeDeviceSlot() 2. Reset_Change bit gets set after manually Reset Port operation. UsbHubResetPort()->UsbHubSetPortFeature()->Stall(20)-> UsbHubGetPortStatus()->(invoke above code in XHCI)->(if RESET_C bit is set)->Stall(10) According to your info, it looks like we need add 10ms delay to XhcInitializeDeviceSlot() like below: diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c index e37f674..bb68f34 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c +++ b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c @@ -2115,6 +2115,7 @@ XhcInitializeDeviceSlot ( // 8) Issue an Address Device Command for the Device Slot, where the command points to the Input // Context data structure described above. // + gBS->Stall (10 * 1000); ZeroMem (&CmdTrbAddr, sizeof (CmdTrbAddr)); PhyAddr = UsbHcGetPciAddrForHostAddr (Xhc->MemPool, Xhc->UsbDevContext[SlotId].InputContext, sizeof (INPUT_CONTEXT)); CmdTrbAddr.PtrLo = XHC_LOW_32BIT (PhyAddr); @@ -2321,6 +2322,7 @@ XhcInitializeDeviceSlot64 ( // 8) Issue an Address Device Command for the Device Slot, where the command points to the Input // Context data structure described above. // + gBS->Stall (10 * 1000); ZeroMem (&CmdTrbAddr, sizeof (CmdTrbAddr)); PhyAddr = UsbHcGetPciAddrForHostAddr (Xhc->MemPool, Xhc->UsbDevContext[SlotId].InputContext, sizeof (INPUT_CONTEXT_64)); CmdTrbAddr.PtrLo = XHC_LOW_32BIT (PhyAddr); Could you please have a try to see if it solves your problem? Thanks Feng -----Original Message----- From: Anbazhagan, Baraneedharan [mailto:anbazha...@hp.com] Sent: Monday, November 14, 2016 9:46 PM To: Tian, Feng <feng.t...@intel.com>; edk2-devel@lists.01.org Subject: RE: USB hub port reset In case of XHCI, TRB_TYPE_ADDRESS_DEV/SetAddress occurs within XhcPollPortStatusChange. Seem we don't have 10ms/TRSTRCY for the devices behind hub connected to XHCI or am missing something here? In EDK2, 10ms(TRSTRCY) delay occurs before clear port status and in case of Linux TRSTRCY delay is after clearing port status. Thanks Baranee > -----Original Message----- > From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of > Tian, Feng > Sent: Sunday, November 13, 2016 10:38 PM > To: Anbazhagan, Baraneedharan <anbazha...@hp.com>; edk2- > de...@lists.01.org > Cc: Tian, Feng <feng.t...@intel.com> > Subject: Re: [edk2] USB hub port reset > > I don't catch what you mean. We have had 10ms delay for port reset. > Which line of UsbHub.c do you think there is problem? > > Quote from USB2.0 spec: > "Hubs must be able to accept all hub requests and devices must be able > to accept a > SetAddress() request (refer to Section 11.24.2 and Section 9.4 > respectively) after the reset recovery time 10 ms (TRSTRCY) after the reset > is removed." > > Thanks > Feng > > -----Original Message----- > From: Anbazhagan, Baraneedharan [mailto:anbazha...@hp.com] > Sent: Monday, November 14, 2016 11:33 AM > To: Tian, Feng <feng.t...@intel.com>; edk2-devel@lists.01.org > Subject: RE: USB hub port reset > > I didn't mean to have extra delays. Am asking whether EDKII have to be > updated for 10ms reset recovery time regardless of port status to align with > spec? > > > >From: Tian, Feng [mailto:feng.t...@intel.com] > >Sent: Sunday, November 13, 2016 7:46 PM > >To: Anbazhagan, Baraneedharan <anbazha...@hp.com>; > >edk2-devel@lists.01.org > >Cc: Tian, Feng <feng.t...@intel.com> > >Subject: RE: USB hub port reset > > > >Hi, Baranee > > > >Linux wait 10 + 40 ms (TRSTRCY = 10 ms, plus extra 40 ms). Do you > >mean EDKII > should be same with linux to wait more time? > > > >Thanks > >Feng > > > >From: Anbazhagan, Baraneedharan [mailto:anbazha...@hp.com] > >Sent: Sunday, November 13, 2016 11:53 AM > >To: mailto:edk2-devel@lists.01.org; Tian, Feng > ><mailto:feng.t...@intel.com> > >Subject: USB hub port reset > > > >EDK2 have reset recovery time of 10ms for hub port based on port > >status reset bit > but USB spec doesn't mention that port status can be used for t6/reset > recovery time. Could you please clarify? > > > >USB vendor mentions EDK2 doesn't have reset recovery time on hub port > >reset and also highlighting EDK2 hub port reset differs from > >https://github.com/torvalds/linux/blob/master/drivers/usb/core/hub.c# > >L2 > >789 > > > >-Baranee > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel