]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg XhciPei/UsbBusPei: Enhance code for better device compatibility.
authorStar Zeng <star.zeng@intel.com>
Mon, 15 Sep 2014 09:33:16 +0000 (09:33 +0000)
committerlzeng14 <lzeng14@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 15 Sep 2014 09:33:16 +0000 (09:33 +0000)
1. Add delay after set device address and get configuration descriptor.
2. Sync the change at R15876 in XhciDxe to do not access transfer ring when endpoint is isochronous type or control type.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Feng Tian <feng.tian@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16105 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Bus/Pci/XhciPei/XhciSched.c
MdeModulePkg/Bus/Usb/UsbBusPei/UsbPeim.c
MdeModulePkg/Bus/Usb/UsbBusPei/UsbPeim.h

index dde31e0f1a580f294a14835f1f96894677b70885..8e768bc470d597214d436d5e8e2d95c16904bcdf 100644 (file)
@@ -1706,7 +1706,12 @@ XhcPeiSetConfigCmd (
             InputContext->EP[Dci-1].CErr   = 0;\r
             InputContext->EP[Dci-1].EPType = ED_ISOCH_OUT;\r
           }\r
-          break;\r
+          //\r
+          // Do not support isochronous transfer now.\r
+          //\r
+          DEBUG ((EFI_D_INFO, "XhcPeiSetConfigCmd: Unsupport ISO EP found, Transfer ring is not allocated.\n"));\r
+          EpDesc = (USB_ENDPOINT_DESCRIPTOR *)((UINTN)EpDesc + EpDesc->Length);\r
+          continue;\r
         case USB_ENDPOINT_INTERRUPT:\r
           if (Direction == EfiUsbDataIn) {\r
             InputContext->EP[Dci-1].CErr   = 3;\r
@@ -1744,9 +1749,14 @@ XhcPeiSetConfigCmd (
           break;\r
 \r
         case USB_ENDPOINT_CONTROL:\r
+          //\r
+          // Do not support control transfer now.\r
+          //\r
+          DEBUG ((EFI_D_INFO, "XhcPeiSetConfigCmd: Unsupport Control EP found, Transfer ring is not allocated.\n"));\r
         default:\r
-          ASSERT (FALSE);\r
-          break;\r
+          DEBUG ((EFI_D_INFO, "XhcPeiSetConfigCmd: Unknown EP found, Transfer ring is not allocated.\n"));\r
+          EpDesc = (USB_ENDPOINT_DESCRIPTOR *)((UINTN)EpDesc + EpDesc->Length);\r
+          continue;\r
       }\r
 \r
       PhyAddr = UsbHcGetPciAddrForHostAddr (\r
@@ -1899,7 +1909,12 @@ XhcPeiSetConfigCmd64 (
             InputContext->EP[Dci-1].CErr   = 0;\r
             InputContext->EP[Dci-1].EPType = ED_ISOCH_OUT;\r
           }\r
-          break;\r
+          //\r
+          // Do not support isochronous transfer now.\r
+          //\r
+          DEBUG ((EFI_D_INFO, "XhcPeiSetConfigCmd64: Unsupport ISO EP found, Transfer ring is not allocated.\n"));\r
+          EpDesc = (USB_ENDPOINT_DESCRIPTOR *)((UINTN)EpDesc + EpDesc->Length);\r
+          continue;\r
         case USB_ENDPOINT_INTERRUPT:\r
           if (Direction == EfiUsbDataIn) {\r
             InputContext->EP[Dci-1].CErr   = 3;\r
@@ -1937,9 +1952,14 @@ XhcPeiSetConfigCmd64 (
           break;\r
 \r
         case USB_ENDPOINT_CONTROL:\r
+          //\r
+          // Do not support control transfer now.\r
+          //\r
+          DEBUG ((EFI_D_INFO, "XhcPeiSetConfigCmd64: Unsupport Control EP found, Transfer ring is not allocated.\n"));\r
         default:\r
-          ASSERT (0);\r
-          break;\r
+          DEBUG ((EFI_D_INFO, "XhcPeiSetConfigCmd64: Unknown EP found, Transfer ring is not allocated.\n"));\r
+          EpDesc = (USB_ENDPOINT_DESCRIPTOR *)((UINTN)EpDesc + EpDesc->Length);\r
+          continue;\r
       }\r
 \r
       PhyAddr = UsbHcGetPciAddrForHostAddr (\r
index 947864bd27cc5be53a9b322c7018af97861c7692..f3500218626c5e3a5b4d825c398c3bf3027e46a1 100644 (file)
@@ -720,6 +720,7 @@ PeiConfigureUsbDevice (
     DEBUG ((EFI_D_ERROR, "PeiUsbSetDeviceAddress Failed: %r\n", Status));\r
     return Status;\r
   }\r
+  MicroSecondDelay (USB_SET_DEVICE_ADDRESS_STALL);\r
 \r
   PeiUsbDevice->DeviceAddress = *DeviceAddress;\r
 \r
@@ -750,6 +751,7 @@ PeiConfigureUsbDevice (
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
+  MicroSecondDelay (USB_GET_CONFIG_DESCRIPTOR_STALL);\r
 \r
   Status = PeiUsbSetConfiguration (\r
             PeiServices,\r
@@ -809,6 +811,7 @@ PeiUsbGetAllConfiguration (
     DEBUG ((EFI_D_ERROR, "PeiUsbGet Config Descriptor First Failed\n"));\r
     return Status;\r
   }\r
+  MicroSecondDelay (USB_GET_CONFIG_DESCRIPTOR_STALL);\r
 \r
   ConfigDesc        = (EFI_USB_CONFIG_DESCRIPTOR *) PeiUsbDevice->ConfigurationData;\r
   ConfigDescLength  = ConfigDesc->TotalLength;\r
index df459e7a6ec72481b320de53f7d351b44f40988b..dff8eeb2026d2b1ec7e4bc81ee61197a4b7a120c 100644 (file)
@@ -99,6 +99,17 @@ typedef struct {
 //\r
 #define USB_SET_PORT_POWER_STALL        (2 * USB_BUS_1_MILLISECOND)\r
 \r
+//\r
+// Wait for set device address, refers to specification\r
+// [USB20-9.2.6.3, it says 2ms]\r
+//\r
+#define USB_SET_DEVICE_ADDRESS_STALL    (2 * USB_BUS_1_MILLISECOND)\r
+\r
+//\r
+// Wait for get configuration descriptor, set by experience\r
+//\r
+#define USB_GET_CONFIG_DESCRIPTOR_STALL (1 * USB_BUS_1_MILLISECOND)\r
+\r
 /**\r
   Submits control transfer to a target USB device.\r
   \r