Author: rgampa Date: Thu Aug 3 09:38:34 2017 New Revision: 75471
URL: http://svn.reactos.org/svn/reactos?rev=75471&view=rev Log: [USBXHCI] - further changes to scratchpad buffer allocation. - some additional checks where required. - control trbs implementation modified. CORE-13344
Modified: 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/usbxhci.c URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2017/usbxhci/reactos/driver... ============================================================================== --- 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] Thu Aug 3 09:38:34 2017 @@ -183,6 +183,7 @@ resourcesStartPA);
HcResourcesVA = (PXHCI_HC_RESOURCES)resourcesStartVA; + ASSERT((ULONG_PTR)HcResourcesVA % PAGE_SIZE == 0); HcResourcesPA.QuadPart = (ULONG_PTR)resourcesStartPA; BaseIoAdress = XhciExtension->BaseIoAdress; OperationalRegs = XhciExtension->OperationalRegs; @@ -239,14 +240,7 @@ HcResourcesVA->EventRing.firstSeg.XhciTrb[i].EventTRB.Word2=0; HcResourcesVA->EventRing.firstSeg.XhciTrb[i].EventTRB.Word3=0; } - /*PHYSICAL_ADDRESS Zero, Max; - Zero.QuadPart = 0; - Max.QuadPart = -1; - PMDL Mdl = MmAllocatePagesForMdlEx(Zero, Max, Zero, NumScratchPages * PAGE_SIZE, MmNonCached, 0); - if (Mdl == NULL) { fail } - if (MmGetMdlByteCount(Mdl) < NumScratchPages * PAGE_SIZE) { MmFreePagesFromMdl(Mdl); fail } - Allocate scratchpad buffers. - */ + // check if the controller supports 4k page size or quit. PageSize = XhciExtension-> PageSize; MaxScratchPadBuffers = XhciExtension->MaxScratchPadBuffers; @@ -254,55 +248,52 @@ if (MaxScratchPadBuffers == 0){ // xHCI may declare 0 scratchpad arrays. if so there is no need for memory allocation. return MP_STATUS_SUCCESS; } - //if (PageSize & (1 << 0) == 0){ // this is how it is implemented in Haiko - if (1 << (PageSize + 12) == PAGE_SIZE) { + //if ((PageSize & (1 << 0)) == 0){ // this is how it is implemented in Haiko + if ((PageSize & (1 << 0)) == 0) { DPRINT1("XHCI_InitializeResources : fail. does not support 4k page size %p\n",PageSize); return MP_STATUS_FAILURE; } - DbgBreakPoint(); // allocate scratchpad buffer array PHYSICAL_ADDRESS Zero, Max; Zero.QuadPart = 0; Max.QuadPart = -1; PMDL ScratchPadArrayMDL; PXHCI_SCRATCHPAD_BUFFER_ARRAY BufferArrayPointer; - //ScratchPadArrayMDL = MmAllocatePagesForMdlEx(Zero, Max, Zero, MaxScratchPadBuffers* sizeof(XHCI_SCRATCHPAD_BUFFER_ARRAY), MmNonCached, 0); - BufferArrayPointer = (PXHCI_SCRATCHPAD_BUFFER_ARRAY)MmAllocateContiguousMemory (MaxScratchPadBuffers* sizeof(XHCI_SCRATCHPAD_BUFFER_ARRAY),Max); - ScratchPadArrayMDL = IoAllocateMdl((PVOID) BufferArrayPointer, MaxScratchPadBuffers* sizeof(XHCI_SCRATCHPAD_BUFFER_ARRAY), FALSE, FALSE, NULL); - MmBuildMdlForNonPagedPool(ScratchPadArrayMDL); - + BufferArrayPointer = MmAllocateContiguousMemory (MaxScratchPadBuffers* sizeof(XHCI_SCRATCHPAD_BUFFER_ARRAY),Max); + if (BufferArrayPointer == NULL){ + DPRINT1("XHCI_InitializeResources : Scratch pad array ContiguousMemory allcoation fail NULL\n"); + return MP_STATUS_FAILURE; + } + ScratchPadArrayMDL = IoAllocateMdl(BufferArrayPointer, MaxScratchPadBuffers* sizeof(XHCI_SCRATCHPAD_BUFFER_ARRAY), FALSE, FALSE, NULL); if (ScratchPadArrayMDL == NULL) { DPRINT1("XHCI_InitializeResources : Scratch pad array could not be allocated. it is NULL\n"); + MmFreeContiguousMemory(BufferArrayPointer); return MP_STATUS_FAILURE; } - - if (MmGetMdlByteCount(ScratchPadArrayMDL) < MaxScratchPadBuffers* sizeof(XHCI_SCRATCHPAD_BUFFER_ARRAY)) { - DPRINT1("XHCI_InitializeResources : Scratch pad array could not be allocated. it is smaller than required\n"); - MmFreePagesFromMdl(ScratchPadArrayMDL); - ExFreePool(ScratchPadArrayMDL); + MmBuildMdlForNonPagedPool(ScratchPadArrayMDL); + + HcResourcesVA-> DCBAA.ContextBaseAddr[0].QuadPart = MmGetMdlPfnArray(ScratchPadArrayMDL)[0] << PAGE_SHIFT; + //allocate scratchpad buffers + PMDL ScratchPadBufferMDL; + ScratchPadBufferMDL = MmAllocatePagesForMdlEx(Zero, Max, Zero, MaxScratchPadBuffers*PAGE_SIZE, MmNonCached, 0); + if (ScratchPadBufferMDL == NULL) { + IoFreeMdl(ScratchPadArrayMDL); + MmFreeContiguousMemory(BufferArrayPointer); return MP_STATUS_FAILURE; } - - //temp = MmGetSystemAddressForMdlSafe(ScratchPadArrayMDL, NormalPagePriority); // PRiority?? - //BufferArrayPointer = (PXHCI_SCRATCHPAD_BUFFER_ARRAY) MmGetSystemAddressForMdlSafe(ScratchPadArrayMDL, 0); - HcResourcesVA-> DCBAA.ContextBaseAddr[0] = MmGetPhysicalAddress((PVOID)BufferArrayPointer); - //allocate scratchpad buffers - PVOID BufferAddr; - PMDL ScrathcPadBuffer; + if (MmGetMdlByteCount(ScratchPadBufferMDL) < MaxScratchPadBuffers*PAGE_SIZE) { + MmFreePagesFromMdl(ScratchPadBufferMDL); + ExFreePool(ScratchPadBufferMDL); + + IoFreeMdl(ScratchPadArrayMDL); + MmFreeContiguousMemory(BufferArrayPointer); + return MP_STATUS_FAILURE; + } for (int i = 0; i < MaxScratchPadBuffers ; i++){ - ScrathcPadBuffer = MmAllocatePagesForMdlEx(Zero, Max, Zero, PAGE_SIZE, MmNonCached, 0); - BufferAddr = MmGetSystemAddressForMdlSafe(ScrathcPadBuffer, NormalPagePriority); - if (ScrathcPadBuffer == NULL) { - return MP_STATUS_FAILURE; - } - if (MmGetMdlByteCount(ScrathcPadBuffer) < PAGE_SIZE) { - MmFreePagesFromMdl(ScrathcPadBuffer); - ExFreePool(ScrathcPadBuffer); - return MP_STATUS_FAILURE; - } - BufferArrayPointer[i].AsULONGLONG = MmGetPhysicalAddress(BufferAddr).QuadPart; - } - XhciExtension-> ScratchPadArray = ScratchPadArrayMDL; + BufferArrayPointer[i].AsULONGLONG = MmGetMdlPfnArray(ScratchPadBufferMDL)[i] << PAGE_SHIFT; + } + XhciExtension-> ScratchPadArrayMDL = ScratchPadArrayMDL; + XhciExtension-> ScratchPadBufferMDL = ScratchPadBufferMDL; //DbgBreakPoint(); return MP_STATUS_SUCCESS; } @@ -483,18 +474,25 @@ XHCI_StopController(IN PVOID xhciExtension, IN BOOLEAN IsDoDisableInterrupts) { - DPRINT1("XHCI_StopController: UNIMPLEMENTED. FIXME\n"); + DPRINT1("XHCI_StopController: Function initiated. FIXME\n"); PXHCI_EXTENSION XhciExtension; USHORT MaxScratchPadBuffers; - PMDL ScratchPadArray; + PMDL ScratchPadArrayMDL; + PMDL ScratchPadBufferMDL; + PXHCI_SCRATCHPAD_BUFFER_ARRAY BufferArrayPointer; XhciExtension = (PXHCI_EXTENSION) xhciExtension; MaxScratchPadBuffers = XhciExtension->MaxScratchPadBuffers; // free memory allocated to scratchpad buffers. - ScratchPadArray = XhciExtension-> ScratchPadArray; + ScratchPadArrayMDL = XhciExtension-> ScratchPadArrayMDL; + ScratchPadBufferMDL = XhciExtension-> ScratchPadBufferMDL; if (MaxScratchPadBuffers != 0){ - //ExFreePool(Mdl) after MmFreePagesFromMdl to free the scratchpad buffer ARRAY - MmFreePagesFromMdl(ScratchPadArray); - ExFreePool(ScratchPadArray); + // free the scratchpad buffers + MmFreePagesFromMdl(ScratchPadBufferMDL); + ExFreePool(ScratchPadBufferMDL); + // free scratchpad array + BufferArrayPointer = MmGetMdlVirtualAddress(ScratchPadArrayMDL); + IoFreeMdl(ScratchPadArrayMDL); + MmFreeContiguousMemory(BufferArrayPointer); }
}
Modified: branches/GSoC_2017/usbxhci/reactos/drivers/usb/usbxhci/usbxhci.h URL: http://svn.reactos.org/svn/reactos/branches/GSoC_2017/usbxhci/reactos/driver... ============================================================================== --- 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] Thu Aug 3 09:38:34 2017 @@ -43,6 +43,7 @@ }; //ULONG AsULONG; } XHCI_LINK_TRB; +C_ASSERT(sizeof(XHCI_LINK_TRB) == 16); //----------------------------------------generic trb---------------------------------------------------------------- typedef struct _XHCI_GENERIC_TRB { ULONG Word0; @@ -50,6 +51,7 @@ ULONG Word2; ULONG Word3; }XHCI_GENERIC_TRB, *PXHCI_GENERIC_TRB; +C_ASSERT(sizeof(XHCI_GENERIC_TRB) == 16); //----------------------------------------Command TRBs---------------------------------------------------------------- typedef struct _XHCI_COMMAND_NO_OP_TRB { ULONG RsvdZ1; @@ -62,13 +64,13 @@ ULONG RsvdZ5 : 14; }; } XHCI_COMMAND_NO_OP_TRB; - +C_ASSERT(sizeof(XHCI_COMMAND_NO_OP_TRB) == 16); typedef union _XHCI_COMMAND_TRB { XHCI_COMMAND_NO_OP_TRB NoOperation; XHCI_LINK_TRB Link; XHCI_GENERIC_TRB GenericTRB; }XHCI_COMMAND_TRB, *PXHCI_COMMAND_TRB; - +C_ASSERT(sizeof(XHCI_COMMAND_TRB) == 16); /*typedef struct _XHCI_COMMAND_RING { XHCI_COMMAND_TRB Segment[4]; PXHCI_COMMAND_TRB CREnquePointer; @@ -76,7 +78,7 @@ } XHCI_COMMAND_RING;*/ //----------------------------------------CONTROL TRANSFER DATA STRUCTUERS--------------------------------------------
-typedef union _XHCI_CONTROL_SETUP_TRB { +typedef struct _XHCI_CONTROL_SETUP_TRB { struct { ULONG bmRequestType : 8; ULONG bRequest : 8; @@ -101,10 +103,10 @@ ULONG TransferType : 2; ULONG RsvdZ3 : 14; }; - ULONG AsULONG; + //ULONG AsULONG; } XHCI_CONTROL_SETUP_TRB; - -typedef union _XHCI_CONTROL_DATA_TRB { +C_ASSERT(sizeof(XHCI_CONTROL_SETUP_TRB) == 16); +typedef struct _XHCI_CONTROL_DATA_TRB { struct { ULONG DataBufferPointerLo : 32; }; @@ -129,10 +131,10 @@ ULONG Direction : 1; ULONG RsvdZ2 : 15; }; - ULONG AsULONG; + //ULONG AsULONG; } XHCI_CONTROL_DATA_TRB; - -typedef union _XHCI_CONTROL_STATUS_TRB { +C_ASSERT(sizeof(XHCI_CONTROL_DATA_TRB) == 16); +typedef struct _XHCI_CONTROL_STATUS_TRB { struct { ULONG RsvdZ1 : 32; }; @@ -153,15 +155,16 @@ ULONG Direction : 1; ULONG RsvdZ4 : 15; }; - ULONG AsULONG; + // ULONG AsULONG; } XHCI_CONTROL_STATUS_TRB; - +C_ASSERT(sizeof(XHCI_CONTROL_STATUS_TRB) == 16); typedef union _XHCI_CONTROL_TRB { - XHCI_CONTROL_SETUP_TRB SetupTRB[4]; - XHCI_CONTROL_DATA_TRB DataTRB[4]; - XHCI_CONTROL_STATUS_TRB StatusTRB[4]; + XHCI_CONTROL_SETUP_TRB SetupTRB; + XHCI_CONTROL_DATA_TRB DataTRB; + XHCI_CONTROL_STATUS_TRB StatusTRB; + XHCI_GENERIC_TRB GenericTRB; } XHCI_CONTROL_TRB, *PXHCI_CONTROL_TRB; - +C_ASSERT(sizeof(XHCI_CONTROL_TRB) == 16); //----------------event strucs------------------- typedef struct _XHCI_EVENT_TRB { ULONG Word0; @@ -169,15 +172,13 @@ ULONG Word2; ULONG Word3; }XHCI_EVENT_TRB, *PXHCI_EVENT_TRB; - +C_ASSERT(sizeof(XHCI_EVENT_TRB) == 16); typedef struct _XHCI_EVENT_RING_SEGMENT_TABLE{ ULONGLONG RingSegmentBaseAddr; struct { ULONGLONG RingSegmentSize : 16; ULONGLONG RsvdZ : 48; }; - - } XHCI_EVENT_RING_SEGMENT_TABLE; //------------------------------------main structs-----------------------
@@ -218,8 +219,8 @@ USHORT PortPowerControl; // HCSPARAMS => Port Power Control (PPC) USHORT PageSize; USHORT MaxScratchPadBuffers; - PMDL ScratchPadArray; - + PMDL ScratchPadArrayMDL; + PMDL ScratchPadBufferMDL; } XHCI_EXTENSION, *PXHCI_EXTENSION;
typedef struct _XHCI_HC_RESOURCES { @@ -228,7 +229,8 @@ 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)); +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;