Author: rgampa Date: Tue Aug 8 09:43:52 2017 New Revision: 75503 URL: http://svn.reactos.org/svn/reactos?rev=75503&view=rev Log: [USBXHCI] -implemented roothub functions. CORE-13344
Modified: branches/GSoC_2017/usbxhci/reactos/drivers/usb/usbxhci/hardware.h branches/GSoC_2017/usbxhci/reactos/drivers/usb/usbxhci/roothub.c branches/GSoC_2017/usbxhci/reactos/drivers/usb/usbxhci/usbxhci.c branches/GSoC_2017/usbxhci/reactos/drivers/usb/usbxhci/usbxhci.h Modified: branches/GSoC_2017/usbxhci/reactos/drivers/usb/usbxhci/hardware.h URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2017/usbxhci/reactos/drivers/usb/usbxhci/hardware.h?rev=75503&r1=75502&r2=75503&view=diff ============================================================================== --- branches/GSoC_2017/usbxhci/reactos/drivers/usb/usbxhci/hardware.h [iso-8859-1] (original) +++ branches/GSoC_2017/usbxhci/reactos/drivers/usb/usbxhci/hardware.h [iso-8859-1] Tue Aug 8 09:43:52 2017 @@ -15,7 +15,7 @@ #define XHCI_CRCR 6 #define XHCI_DCBAAP 12 #define XHCI_CONFIG 14 -#define XHCI_PORTSC 100 +#define XHCI_PORTSC 256 // runtime register offsets #define XHCI_IMAN 8 #define XHCI_IMOD 9 @@ -131,7 +131,7 @@ }; ULONG AsULONG; } XHCI_USB_COMMAND; - +C_ASSERT(sizeof(XHCI_USB_COMMAND)==sizeof(ULONG)); typedef volatile union _XHCI_USB_STATUS { struct { ULONG HCHalted : 1; @@ -149,7 +149,7 @@ }; ULONG AsULONG; } XHCI_USB_STATUS; - +C_ASSERT(sizeof(XHCI_USB_STATUS)==sizeof(ULONG)); typedef volatile union _XHCI_PAGE_SIZE { struct { ULONG PageSize : 16; @@ -197,7 +197,9 @@ }; ULONG AsULONG; } XHCI_CONFIGURE; - +C_ASSERT(sizeof(XHCI_CONFIGURE) == sizeof(ULONG)); + +#define PORT_STATUS_MASK 0x4F01FFE5 // 0100 1111 0000 0001 1111 1111 1110 0101 // RW 1, RW1C/RW1S 0, RO 1 typedef volatile union _XHCI_PORT_STATUS_CONTROL { struct { ULONG CurrentConnectStatus : 1; Modified: branches/GSoC_2017/usbxhci/reactos/drivers/usb/usbxhci/roothub.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2017/usbxhci/reactos/drivers/usb/usbxhci/roothub.c?rev=75503&r1=75502&r2=75503&view=diff ============================================================================== --- branches/GSoC_2017/usbxhci/reactos/drivers/usb/usbxhci/roothub.c [iso-8859-1] (original) +++ branches/GSoC_2017/usbxhci/reactos/drivers/usb/usbxhci/roothub.c [iso-8859-1] Tue Aug 8 09:43:52 2017 @@ -61,7 +61,8 @@ XhciExtension = (PXHCI_EXTENSION)xhciExtension; PortStatusRegPointer = (XhciExtension->OperationalRegs) + (XHCI_PORTSC + (Port - 1)*4); PortStatusRegister.AsULONG = READ_REGISTER_ULONG(PortStatusRegPointer) ; - + //DPRINT("XHCI_RH_GetPortStatus: Port - %i\n", Port); + DPRINT("XHCI_RH_GetPortStatus: PortStatus Register, port - %p , %i\n", PortStatusRegister.AsULONG, Port); /* ULONG ConnectStatus : 1; // Current Connect Status ULONG EnableStatus : 1; // Port Enabled/Disabled @@ -88,7 +89,7 @@ ULONG IndicatorControlChange : 1; ULONG Reserved4 : 3; */ - /* + /* register interface ULONG CurrentConnectStatus : 1; ULONG PortEnableDisable : 1; ULONG RsvdZ1 : 1; @@ -139,8 +140,9 @@ portstatus.UsbPortStatusChange.TestModeChange = 0;//PortStatusRegister.ConnectStatusChange; portstatus.UsbPortStatusChange.IndicatorControlChange =0;// PortStatusRegister.ConnectStatusChange; - DPRINT("XHCI_RH_GetPortStatus: PortStatus - %p\n", portstatus.AsULONG); - DPRINT("XHCI_RH_GetPortStatus: Port - %i\n", Port); + + //DPRINT("XHCI_RH_GetPortStatus: PortStatus - %p\n", portstatus.AsULONG); + *PortStatus = portstatus.AsULONG; return MP_STATUS_SUCCESS; @@ -179,7 +181,43 @@ IN USHORT Port) { DPRINT1("XHCI_RH_SetFeaturePortReset: function initiated\n"); - return 0; + PXHCI_EXTENSION XhciExtension; + PULONG PortStatusRegPointer; + XHCI_PORT_STATUS_CONTROL PortStatusRegister; + LARGE_INTEGER CurrentTime = {{0, 0}}; + LARGE_INTEGER LastTime = {{0, 0}}; + + XhciExtension = (PXHCI_EXTENSION)xhciExtension; + PortStatusRegPointer = (XhciExtension->OperationalRegs) + (XHCI_PORTSC + (Port - 1)*4); + PortStatusRegister.AsULONG = READ_REGISTER_ULONG(PortStatusRegPointer) ; + + PortStatusRegister.AsULONG = PortStatusRegister.AsULONG & PORT_STATUS_MASK; + PortStatusRegister.PortReset = 1; + + WRITE_REGISTER_ULONG(PortStatusRegPointer , PortStatusRegister.AsULONG ); + + KeQuerySystemTime(&CurrentTime); + CurrentTime.QuadPart += 100 * 10000; // 100 msec + while(TRUE) + { + KeQuerySystemTime(&LastTime); + + PortStatusRegister.AsULONG = READ_REGISTER_ULONG(PortStatusRegPointer) ; + + if (PortStatusRegister.PortReset!= 1) + { + break; + } + + if (LastTime.QuadPart >= CurrentTime.QuadPart) + { + DPRINT1("XHCI_RH_SetFeaturePortReset: Software Reset failed!\n"); + return MP_STATUS_FAILURE; + } + } + + + return MP_STATUS_SUCCESS; } MPSTATUS @@ -187,8 +225,21 @@ XHCI_RH_SetFeaturePortPower(IN PVOID xhciExtension, IN USHORT Port) { - DPRINT1("XHCI_RH_SetFeaturePortPower: function initiated\n"); - return 0; + DPRINT1("XHCI_RH_SetFeaturePortPower: function initiated\n"); + PXHCI_EXTENSION XhciExtension; + PULONG PortStatusRegPointer; + XHCI_PORT_STATUS_CONTROL PortStatusRegister; + + XhciExtension = (PXHCI_EXTENSION)xhciExtension; + PortStatusRegPointer = (XhciExtension->OperationalRegs) + (XHCI_PORTSC + (Port - 1)*4); + PortStatusRegister.AsULONG = READ_REGISTER_ULONG(PortStatusRegPointer) ; + + PortStatusRegister.AsULONG = PortStatusRegister.AsULONG & PORT_STATUS_MASK; + PortStatusRegister.PortPower = 1; + + WRITE_REGISTER_ULONG(PortStatusRegPointer , PortStatusRegister.AsULONG ); + + return MP_STATUS_SUCCESS; } MPSTATUS NTAPI @@ -213,7 +264,7 @@ XHCI_RH_ClearFeaturePortEnable(IN PVOID xhciExtension, IN USHORT Port) { - DPRINT1("XHCI_RH_ClearFeaturePortEnable: function initiated\n"); + DPRINT1("XHCI_RH_ClearFeaturePortEnable: function initiated\n"); return 0; } @@ -259,7 +310,24 @@ IN USHORT Port) { DPRINT1("XHCI_RH_ClearFeaturePortConnectChange: function initiated\n"); - return 0; + PXHCI_EXTENSION XhciExtension; + PULONG PortStatusRegPointer; + XHCI_PORT_STATUS_CONTROL PortStatusRegister; + + XhciExtension = (PXHCI_EXTENSION)xhciExtension; + PortStatusRegPointer = (XhciExtension->OperationalRegs) + (XHCI_PORTSC + (Port - 1)*4); + PortStatusRegister.AsULONG = READ_REGISTER_ULONG(PortStatusRegPointer) ; + + PortStatusRegister.AsULONG = PortStatusRegister.AsULONG & PORT_STATUS_MASK; + PortStatusRegister.ConnectStatusChange = 1; + + WRITE_REGISTER_ULONG(PortStatusRegPointer , PortStatusRegister.AsULONG ); + + PortStatusRegister.AsULONG = READ_REGISTER_ULONG(PortStatusRegPointer) ; + if (PortStatusRegister.ConnectStatusChange == 1){ + return MP_STATUS_FAILURE; + } + return MP_STATUS_SUCCESS; } MPSTATUS @@ -268,7 +336,25 @@ IN USHORT Port) { DPRINT1("XHCI_RH_ClearFeaturePortResetChange: function initiated\n"); - return 0; + PXHCI_EXTENSION XhciExtension; + PULONG PortStatusRegPointer; + XHCI_PORT_STATUS_CONTROL PortStatusRegister; + + XhciExtension = (PXHCI_EXTENSION)xhciExtension; + PortStatusRegPointer = (XhciExtension->OperationalRegs) + (XHCI_PORTSC + (Port - 1)*4); + + PortStatusRegister.AsULONG = READ_REGISTER_ULONG(PortStatusRegPointer) ; + + PortStatusRegister.AsULONG = PortStatusRegister.AsULONG & PORT_STATUS_MASK; + PortStatusRegister.PortResetChange = 1; + + WRITE_REGISTER_ULONG(PortStatusRegPointer , PortStatusRegister.AsULONG ); + + PortStatusRegister.AsULONG = READ_REGISTER_ULONG(PortStatusRegPointer) ; + if (PortStatusRegister.PortResetChange == 1){ + return MP_STATUS_FAILURE; + } + return MP_STATUS_SUCCESS; } MPSTATUS Modified: branches/GSoC_2017/usbxhci/reactos/drivers/usb/usbxhci/usbxhci.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2017/usbxhci/reactos/drivers/usb/usbxhci/usbxhci.c?rev=75503&r1=75502&r2=75503&view=diff ============================================================================== --- branches/GSoC_2017/usbxhci/reactos/drivers/usb/usbxhci/usbxhci.c [iso-8859-1] (original) +++ branches/GSoC_2017/usbxhci/reactos/drivers/usb/usbxhci/usbxhci.c [iso-8859-1] Tue Aug 8 09:43:52 2017 @@ -184,6 +184,7 @@ HcResourcesVA = (PXHCI_HC_RESOURCES)resourcesStartVA; ASSERT((ULONG_PTR)HcResourcesVA % PAGE_SIZE == 0); + XhciExtension->HcResourcesVA = HcResourcesVA; HcResourcesPA.QuadPart = (ULONG_PTR)resourcesStartPA; BaseIoAdress = XhciExtension->BaseIoAdress; OperationalRegs = XhciExtension->OperationalRegs; @@ -341,13 +342,8 @@ if (LastTime.QuadPart >= CurrentTime.QuadPart) { - if (Command.HCReset == 1) - { - DPRINT1("XHCI_InitializeHardware: Software Reset failed!\n"); - return 7; - } - - break; + DPRINT1("XHCI_InitializeHardware: Software Reset failed!\n"); + return 7; } } DPRINT("XHCI_InitializeHardware: Reset - OK\n"); @@ -360,6 +356,8 @@ Config.AsULONG = READ_REGISTER_ULONG(OperationalRegs + XHCI_CONFIG); ASSERT(Command.RunStop==0); //required before setting max device slots enabled. Config.MaxDeviceSlotsEnabled = 1; // max possible value is number of slots HCSPARAMS1 + Config.U3EntryEnable = 0; + Config.ConfigurationInfoEnable = 0; WRITE_REGISTER_ULONG(OperationalRegs + XHCI_CONFIG, Config.AsULONG); return MP_STATUS_SUCCESS; @@ -463,8 +461,8 @@ Command.RunStop =1; WRITE_REGISTER_ULONG (OperationalRegs + XHCI_USBCMD, Command.AsULONG ); - MPStatus = XHCI_ControllerWorkTest(XhciExtension,Resources->StartVA, Resources->StartPA ); - //DPRINT1("XHCI_StartController: UNIMPLEMENTED. FIXME\n"); + //MPStatus = XHCI_ControllerWorkTest(XhciExtension,Resources->StartVA, Resources->StartPA ); + return MP_STATUS_SUCCESS; } @@ -561,6 +559,14 @@ erstdp.DequeueERSTIndex =0; XHCI_Write64bitReg (RunTimeRegisterBase + XHCI_ERSTDP, erstdp.AsULONGLONG); + PXHCI_HC_RESOURCES HcResourcesVA; + XHCI_TRB eventtrb; + HcResourcesVA = XhciExtension->HcResourcesVA; + eventtrb = HcResourcesVA -> EventRing.firstSeg.XhciTrb[0]; + DPRINT("XHCI_ControllerWorkTest: eventtrb word0 - %p\n", eventtrb.EventTRB.Word0); + DPRINT("XHCI_ControllerWorkTest: eventtrb word1 - %p\n", eventtrb.EventTRB.Word1); + DPRINT("XHCI_ControllerWorkTest: eventtrb word2 - %p\n", eventtrb.EventTRB.Word2); + DPRINT("XHCI_ControllerWorkTest: eventtrb word3 - %p\n", eventtrb.EventTRB.Word3); return TRUE; } @@ -655,14 +661,14 @@ XHCI_CheckController(IN PVOID xhciExtension) { //RegPacket.UsbPortInvalidateController(xhciExtension, 2); - DPRINT1("XHCI_CheckController: function initiated\n"); + //DPRINT1("XHCI_CheckController: function initiated\n"); } ULONG NTAPI XHCI_Get32BitFrameNumber(IN PVOID xhciExtension) { - DPRINT1("XHCI_Get32BitFrameNumber: function initiated\n"); + //DPRINT1("XHCI_Get32BitFrameNumber: function initiated\n"); return 0; } Modified: branches/GSoC_2017/usbxhci/reactos/drivers/usb/usbxhci/usbxhci.h URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2017/usbxhci/reactos/drivers/usb/usbxhci/usbxhci.h?rev=75503&r1=75502&r2=75503&view=diff ============================================================================== --- branches/GSoC_2017/usbxhci/reactos/drivers/usb/usbxhci/usbxhci.h [iso-8859-1] (original) +++ branches/GSoC_2017/usbxhci/reactos/drivers/usb/usbxhci/usbxhci.h [iso-8859-1] Tue Aug 8 09:43:52 2017 @@ -203,6 +203,14 @@ PXHCI_SEGMENT dequeue_segment; ULONGLONG Padding; } XHCI_RING, *PXHCI_RING; +typedef struct _XHCI_HC_RESOURCES { + XHCI_DEVICE_CONTEXT_BASE_ADD_ARRAY DCBAA; + DECLSPEC_ALIGN(16) XHCI_RING EventRing ; + DECLSPEC_ALIGN(64) XHCI_RING CommandRing ; + XHCI_EVENT_RING_SEGMENT_TABLE EventRingSegTable; +} XHCI_HC_RESOURCES, *PXHCI_HC_RESOURCES; +C_ASSERT (FIELD_OFFSET(XHCI_HC_RESOURCES,EventRing)% 16 == 0); +C_ASSERT (FIELD_OFFSET(XHCI_HC_RESOURCES,CommandRing)% 64 == 0); typedef struct _XHCI_EXTENSION { ULONG Reserved; @@ -221,16 +229,10 @@ USHORT MaxScratchPadBuffers; PMDL ScratchPadArrayMDL; PMDL ScratchPadBufferMDL; + PXHCI_HC_RESOURCES HcResourcesVA; } XHCI_EXTENSION, *PXHCI_EXTENSION; -typedef struct _XHCI_HC_RESOURCES { - XHCI_DEVICE_CONTEXT_BASE_ADD_ARRAY DCBAA; - DECLSPEC_ALIGN(16) XHCI_RING EventRing ; - DECLSPEC_ALIGN(64) XHCI_RING CommandRing ; - XHCI_EVENT_RING_SEGMENT_TABLE EventRingSegTable; -} XHCI_HC_RESOURCES, *PXHCI_HC_RESOURCES; -C_ASSERT (FIELD_OFFSET(XHCI_HC_RESOURCES,EventRing)% 16 == 0); -C_ASSERT (FIELD_OFFSET(XHCI_HC_RESOURCES,CommandRing)% 64 == 0); + typedef struct _XHCI_ENDPOINT { ULONG Reserved; } XHCI_ENDPOINT, *PXHCI_ENDPOINT;