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

Reply via email to