Author: rgampa
Date: Wed Aug 2 16:17:54 2017
New Revision: 75470
URL:
http://svn.reactos.org/svn/reactos?rev=75470&view=rev
Log:
[USBXHCI]
- various changes to scratchpad buffer allocation.
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/drive…
==============================================================================
--- 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] Wed Aug
2 16:17:54 2017
@@ -249,41 +249,60 @@
*/
// check if the controller supports 4k page size or quit.
PageSize = XhciExtension-> PageSize;
- if (PageSize & (1 << 0) == 0){
+ MaxScratchPadBuffers = XhciExtension->MaxScratchPadBuffers;
+
+ 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) {
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;
- MaxScratchPadBuffers = XhciExtension->MaxScratchPadBuffers;
Zero.QuadPart = 0;
Max.QuadPart = -1;
-
- PMDL ScratchPadArray;
- //PXHCI_SCRATCHPAD_BUFFER_ARRAY BufferArrayPointer;
- PHYSICAL_ADDRESS *temp;
- ScratchPadArray = MmAllocatePagesForMdlEx(Zero, Max, Zero, MaxScratchPadBuffers*8 ,
MmNonCached, 0);
-
- temp = MmGetSystemAddressForMdlSafe(ScratchPadArray, 0); // PRiority??
- //BufferArrayPointer = (PXHCI_SCRATCHPAD_BUFFER_ARRAY)
MmGetSystemAddressForMdlSafe(ScratchPadArray, 0);
- HcResourcesVA-> DCBAA.ContextBaseAddr[0] = *temp;
+ 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);
+
+ if (ScratchPadArrayMDL == NULL) {
+ DPRINT1("XHCI_InitializeResources : Scratch pad array could not be
allocated. it is NULL\n");
+ 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);
+ 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;
- PHYSICAL_ADDRESS *ScratchArray;
- ScratchArray = MmGetSystemAddressForMdlSafe(ScratchPadArray, 0);
for (int i = 0; i < MaxScratchPadBuffers ; i++){
ScrathcPadBuffer = MmAllocatePagesForMdlEx(Zero, Max, Zero, PAGE_SIZE,
MmNonCached, 0);
- temp = MmGetSystemAddressForMdlSafe(ScrathcPadBuffer, 0);
- ScratchArray[i] = *temp;
+ BufferAddr = MmGetSystemAddressForMdlSafe(ScrathcPadBuffer, NormalPagePriority);
if (ScrathcPadBuffer == NULL) {
return MP_STATUS_FAILURE;
}
if (MmGetMdlByteCount(ScrathcPadBuffer) < PAGE_SIZE) {
MmFreePagesFromMdl(ScrathcPadBuffer);
+ ExFreePool(ScrathcPadBuffer);
return MP_STATUS_FAILURE;
}
- }
- XhciExtension-> ScratchPadArray = ScratchPadArray;
+ BufferArrayPointer[i].AsULONGLONG = MmGetPhysicalAddress(BufferAddr).QuadPart;
+ }
+ XhciExtension-> ScratchPadArray = ScratchPadArrayMDL;
//DbgBreakPoint();
return MP_STATUS_SUCCESS;
}
@@ -420,6 +439,7 @@
DPRINT("XHCI_StartController: DoorBellRegisterBase - %p\n",
DoorBellRegisterBase);
DPRINT("XHCI_StartController: RunTimeRegisterBase - %p\n",
RunTimeRegisterBase);
DPRINT("XHCI_StartController: PageSize - %p\n",
XhciExtension->PageSize);
+ DPRINT("XHCI_StartController: MaxScratchPadBuffers - %p\n",
MaxScratchPadBuffers);
RegPacket.UsbPortReadWriteConfigSpace(XhciExtension,
1,
@@ -465,12 +485,18 @@
{
DPRINT1("XHCI_StopController: UNIMPLEMENTED. FIXME\n");
PXHCI_EXTENSION XhciExtension;
+ USHORT MaxScratchPadBuffers;
+ PMDL ScratchPadArray;
XhciExtension = (PXHCI_EXTENSION) xhciExtension;
- PMDL ScratchPadArray;
+ MaxScratchPadBuffers = XhciExtension->MaxScratchPadBuffers;
// free memory allocated to scratchpad buffers.
ScratchPadArray = XhciExtension-> ScratchPadArray;
- //ExFreePool(Mdl) after MmFreePagesFromMdl to free the scratchpad buffer ARRAY
- MmFreePagesFromMdl(ScratchPadArray);
+ if (MaxScratchPadBuffers != 0){
+ //ExFreePool(Mdl) after MmFreePagesFromMdl to free the scratchpad buffer ARRAY
+ MmFreePagesFromMdl(ScratchPadArray);
+ ExFreePool(ScratchPadArray);
+ }
+
}
VOID
Modified: branches/GSoC_2017/usbxhci/reactos/drivers/usb/usbxhci/usbxhci.h
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2017/usbxhci/reactos/drive…
==============================================================================
--- 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] Wed Aug
2 16:17:54 2017
@@ -7,7 +7,6 @@
#include <hubbusif.h>
#include <usbbusif.h>
#include <usbdlib.h>
-//#include <xdk/mmfuncs.h>
#include "..\usbmport.h"
#include "hardware.h"
@@ -225,12 +224,11 @@
typedef struct _XHCI_HC_RESOURCES {
XHCI_DEVICE_CONTEXT_BASE_ADD_ARRAY DCBAA;
- //XHCI_COMMAND_RING CommandRing;
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));
typedef struct _XHCI_ENDPOINT {
ULONG Reserved;
} XHCI_ENDPOINT, *PXHCI_ENDPOINT;
@@ -246,6 +244,7 @@
};
ULONGLONG AsULONGLONG;
} XHCI_SCRATCHPAD_BUFFER_ARRAY, *PXHCI_SCRATCHPAD_BUFFER_ARRAY;
+C_ASSERT(sizeof(XHCI_SCRATCHPAD_BUFFER_ARRAY) == 8);
//roothub functions
VOID
NTAPI