Author: rgampa
Date: Tue Aug 22 09:57:48 2017
New Revision: 75639

URL: http://svn.reactos.org/svn/reactos?rev=75639&view=rev
Log:
[USBXHCI]
- SendCommand and ProcessEvent functions done.
- Command ring full is being notified. 
- event ring loop back happening.
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/drivers/usb/usbxhci/usbxhci.c?rev=75639&r1=75638&r2=75639&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 22 09:57:48 2017
@@ -112,31 +112,58 @@
     
     RunTimeRegisterBase = XhciExtension-> RunTimeRegisterBase;
     dequeue_pointer = HcResourcesVA-> EventRing.dequeue_pointer;
+    /*DPRINT("XHCI_ProcessEvent: eventtrb 0 word0    - %p\n", 
HcResourcesVA->EventRing.firstSeg.XhciTrb[0].GenericTRB.Word0);
+    DPRINT("XHCI_ProcessEvent: eventtrb 0 word1    - %p\n", 
HcResourcesVA->EventRing.firstSeg.XhciTrb[0].GenericTRB.Word1);
+    DPRINT("XHCI_ProcessEvent: eventtrb 0 word2    - %p\n", 
HcResourcesVA->EventRing.firstSeg.XhciTrb[0].GenericTRB.Word2);
+    DPRINT("XHCI_ProcessEvent: eventtrb 0 word3    - %p\n", 
HcResourcesVA->EventRing.firstSeg.XhciTrb[0].GenericTRB.Word3);
+    DPRINT("XHCI_ProcessEvent: deque_ptr    - %p\n", dequeue_pointer);
+    DPRINT("XHCI_ProcessEvent: base addr    - %p\n", 
&(HcResourcesVA->EventRing.firstSeg.XhciTrb[0]));*/
+    
     while (TRUE) {
         eventTRB = (*dequeue_pointer).EventTRB;
         if (eventTRB.EventGenericTRB.CycleBit != HcResourcesVA-> 
EventRing.ConsumerCycleState){
             DPRINT1("XHCI_ProcessEvent: cycle bit mismatch. end of 
processing\n");
-            DPRINT("XHCI_ProcessEvent: eventtrb word0    - %p\n", 
eventTRB.EventGenericTRB.Word0);
-            DPRINT("XHCI_ProcessEvent: eventtrb word1    - %p\n", 
eventTRB.EventGenericTRB.Word1);
-            DPRINT("XHCI_ProcessEvent: eventtrb word2    - %p\n", 
eventTRB.EventGenericTRB.Word2);
-            DPRINT("XHCI_ProcessEvent: eventtrb cycle bit    - %x\n", 
eventTRB.EventGenericTRB.CycleBit);
+            //DPRINT("XHCI_ProcessEvent: eventtrb word0    - %p\n", 
eventTRB.EventGenericTRB.Word0);
+            //DPRINT("XHCI_ProcessEvent: eventtrb word1    - %p\n", 
eventTRB.EventGenericTRB.Word1);
+            //DPRINT("XHCI_ProcessEvent: eventtrb word2    - %p\n", 
eventTRB.EventGenericTRB.Word2);
+            //DPRINT("XHCI_ProcessEvent: eventtrb cycle bit    - %x\n", 
eventTRB.EventGenericTRB.CycleBit);
             break;
         }
         TRBType = eventTRB.EventGenericTRB.TRBType;
         switch (TRBType){
             case TRANSFER_EVENT:
-            case COMMAND_COMPLETION_EVENT:      
+                DPRINT1("XHCI_ProcessEvent: TRANSFER_EVENT \n");
+                break;
+            case COMMAND_COMPLETION_EVENT: 
+                DPRINT1("XHCI_ProcessEvent: COMMAND_COMPLETION_EVENT\n");
+                if(eventTRB.CommandCompletionTRB.CompletionCode == SUCCESS){
+                    DPRINT1("XHCI_ProcessEvent: COMMAND_COMPLETION_EVENT,  
successful command completion\n");
+                }
+                else DPRINT1("XHCI_ProcessEvent: COMMAND_COMPLETION_EVENT,  
unsuccessful command completion %i 
\n",eventTRB.CommandCompletionTRB.CompletionCode);
+                break;
             case PORT_STATUS_CHANGE_EVENT: 
                 DPRINT1("XHCI_ProcessEvent: Port Status change event\n");
-            case BANDWIDTH_RESET_REQUEST_EVENT:   
-            case DOORBELL_EVENT:                  
-            case HOST_CONTROLLER_EVENT:           
-            case DEVICE_NOTIFICATION_EVENT:       
+                break;
+            case BANDWIDTH_RESET_REQUEST_EVENT:
+                DPRINT1("XHCI_ProcessEvent: BANDWIDTH_RESET_REQUEST_EVENT\n");
+                break;
+            case DOORBELL_EVENT:
+                DPRINT1("XHCI_ProcessEvent: DOORBELL_EVENT\n");
+                break;
+            case HOST_CONTROLLER_EVENT:
+                DPRINT1("XHCI_ProcessEvent: HOST_CONTROLLER_EVENT\n");
+                break;
+            case DEVICE_NOTIFICATION_EVENT:
+                DPRINT1("XHCI_ProcessEvent: DEVICE_NOTIFICATION_EVENT\n");
+                break;
             case MF_INDEX_WARP_EVENT:
+                DPRINT1("XHCI_ProcessEvent: MF_INDEX_WARP_EVENT\n");
+                break;
             default:
             DPRINT1("XHCI_ProcessEvent: Unknown TRBType - %x\n",
                     TRBType);
-            DbgBreakPoint();            
+            DbgBreakPoint(); 
+                break;
         }
         if (dequeue_pointer == 
&(HcResourcesVA->EventRing.firstSeg.XhciTrb[255])){
             HcResourcesVA-> EventRing.ConsumerCycleState = ~(HcResourcesVA-> 
EventRing.ConsumerCycleState);
@@ -145,6 +172,7 @@
         }
         dequeue_pointer = dequeue_pointer + 1;
     }
+    
     //erstdp.AsULONGLONG = READ_REGISTER_ULONG(RunTimeRegisterBase + 
XHCI_ERSTDP + 1);
     //erstdp.AsULONGLONG = erstdp.AsULONGLONG <<32;
     //erstdp.AsULONGLONG = erstdp.AsULONGLONG + 
READ_REGISTER_ULONG(RunTimeRegisterBase + XHCI_ERSTDP);
@@ -179,7 +207,7 @@
     dequeue_pointer = HcResourcesVA -> CommandRing.dequeue_pointer;
     // check if ring is full
     if ((enqueue_pointer + 1) == dequeue_pointer) {
-        DPRINT1 ("XHCI_SendCommand : Command ring is full");
+        DPRINT1 ("XHCI_SendCommand : Command ring is full \n");
         return MP_STATUS_FAILURE;
     }
     // check if the trb is link trb.
@@ -191,9 +219,9 @@
         ASSERT(LinkPointer.QuadPart >= HcResourcesPA.QuadPart && 
LinkPointer.QuadPart < HcResourcesPA.QuadPart + sizeof(XHCI_HC_RESOURCES)) ;
         enqueue_pointer_prev = enqueue_pointer;
         enqueue_pointer = (PXHCI_TRB)(HcResourcesVA + LinkPointer.QuadPart - 
HcResourcesPA.QuadPart);
-        
+        //enqueue_pointer = &(HcResourcesVA->CommandRing.firstSeg.XhciTrb[0]);
         if ((enqueue_pointer == dequeue_pointer) || (enqueue_pointer == 
dequeue_pointer + 1)){ // it can't move ahead break out of function
-                DPRINT1 ("XHCI_SendCommand : Command ring is full");
+                DPRINT1 ("XHCI_SendCommand : Command ring is full \n");
                 return MP_STATUS_FAILURE;
             }
             // now the link trb is valid. set its cycle state to Producer 
cycle state for the command ring to read
@@ -226,8 +254,8 @@
                         IN PVOID resourcesStartPA)
 {
     DPRINT1("XHCI_ControllerWorkTest: Initiated.\n");
-    PULONG DoorBellRegisterBase;
-    XHCI_DOORBELL Doorbell_0;
+    /*PULONG DoorBellRegisterBase;
+    //XHCI_DOORBELL Doorbell_0;
     LARGE_INTEGER CurrentTime = {{0, 0}};
     LARGE_INTEGER LastTime = {{0, 0}};
     XHCI_USB_STATUS Status;
@@ -241,19 +269,26 @@
     XHCI_EVENT_RING_TABLE_SIZE erstz;
     XHCI_EVENT_RING_TABLE_BASE_ADDR erstba;
     XHCI_EVENT_RING_DEQUEUE_POINTER erstdp;
-    XHCI_EVENT_RING_SEGMENT_TABLE EventRingSegTable;
+    XHCI_EVENT_RING_SEGMENT_TABLE EventRingSegTable; */
     // place a no op command trb on the command ring
     XHCI_TRB trb;
-    XHCI_TRB eventtrb;
+    //XHCI_TRB eventtrb;
     trb.CommandTRB.NoOperation.RsvdZ1 = 0;
     trb.CommandTRB.NoOperation.RsvdZ2 = 0;
     trb.CommandTRB.NoOperation.RsvdZ3 = 0;
-    trb.CommandTRB.NoOperation.CycleBit = 0;
+    trb.CommandTRB.NoOperation.CycleBit = 1;
     trb.CommandTRB.NoOperation.RsvdZ4 = 0;
-    trb.CommandTRB.NoOperation.TRBType = 8;
+    trb.CommandTRB.NoOperation.TRBType = NO_OP_COMMAND;
     trb.CommandTRB.NoOperation.RsvdZ5 = 0;
-    
-    HcResourcesVA -> CommandRing.firstSeg.XhciTrb[0] = trb;
+    for(int i=0; i<256; i++){
+        XHCI_SendCommand(trb,XhciExtension);
+    
+        //XHCI_ProcessEvent(XhciExtension);
+    }
+    //XHCI_SendCommand(trb,XhciExtension);
+    
+    XHCI_ProcessEvent(XhciExtension);
+    /*HcResourcesVA -> CommandRing.firstSeg.XhciTrb[0] = trb;
     // ring the commmand ring door bell register
     DoorBellRegisterBase = XhciExtension->DoorBellRegisterBase;
     Doorbell_0.DoorBellTarget = 0;
@@ -271,6 +306,7 @@
             break;
         }
     }
+    
     // check for event completion trb
     eventtrb =  HcResourcesVA -> EventRing.firstSeg.XhciTrb[0];
     DPRINT("XHCI_ControllerWorkTest: eventtrb word0    - %p\n", 
eventtrb.GenericTRB.Word0);
@@ -312,7 +348,7 @@
     DPRINT("XHCI_ControllerWorkTest: pointer erstz     - %p\n", 
XhciExtension->RunTimeRegisterBase + XHCI_ERSTSZ);
     DPRINT("XHCI_ControllerWorkTest: pointer erstba     - %p %p\n", 
XhciExtension->RunTimeRegisterBase + XHCI_ERSTBA+1 , 
XhciExtension->RunTimeRegisterBase + XHCI_ERSTBA);
     
-    
+    */
     //DbgBreakPoint();
     return MP_STATUS_SUCCESS;
 }
@@ -386,11 +422,12 @@
     CommandLinkTRB.GenericTRB.Word1 = 0;
     CommandLinkTRB.GenericTRB.Word2 = 0;
     CommandLinkTRB.GenericTRB.Word3 = 0;
-    ULONGLONG RingStartAddr;
-    
-    RingStartAddr = HcResourcesPA.QuadPart + FIELD_OFFSET(XHCI_HC_RESOURCES, 
CommandRing.firstSeg);
-    CommandLinkTRB.GenericTRB.Word0 = RingStartAddr & 0x00000000FFFFFFF0; // 
physical addr is needed. but recheck assignment
-    CommandLinkTRB.LinkTRB.RingSegmentPointerHi = (RingStartAddr & 
0xFFFFFFFF00000000) >>32;
+    XHCI_LINK_ADDR RingStartAddr;
+    
+    RingStartAddr.AsULONGLONG = HcResourcesPA.QuadPart + 
FIELD_OFFSET(XHCI_HC_RESOURCES, CommandRing.firstSeg);
+    CommandLinkTRB.GenericTRB.RsvdZ1 = 0; //RingStartAddr & 
0x00000000FFFFFFF0; // physical addr is needed. but recheck assignment
+    CommandLinkTRB.LinkTRB.RingSegmentPointerLo = 
RingStartAddr.RingSegmentPointerLo;
+    CommandLinkTRB.LinkTRB.RingSegmentPointerHi = 
RingStartAddr.RingSegmentPointerHi; //(RingStartAddr & 0xFFFFFFFF00000000) >>32;
     CommandLinkTRB.LinkTRB.InterrupterTarget = 0;
     CommandLinkTRB.LinkTRB.CycleBit = 
~(HcResourcesVA->CommandRing.ProducerCycleState);
     CommandLinkTRB.LinkTRB.ToggleCycle = 1; //impt
@@ -410,7 +447,7 @@
     DPRINT1("XHCI_InitializeResources  : erstz.AsULONG   %p\n",erstz.AsULONG );
     WRITE_REGISTER_ULONG (RunTimeRegisterBase + XHCI_ERSTSZ , erstz.AsULONG);
     // event ring dequeue pointer.
-    erstdp.AsULONGLONG = HcResourcesPA.QuadPart + 
FIELD_OFFSET(XHCI_HC_RESOURCES, EventRing.firstSeg);
+    erstdp.AsULONGLONG = HcResourcesPA.QuadPart + 
FIELD_OFFSET(XHCI_HC_RESOURCES, EventRing.firstSeg.XhciTrb[0]);
     
     HcResourcesVA->EventRing.enqueue_pointer = 
&(HcResourcesVA->EventRing.firstSeg.XhciTrb[0]);
     HcResourcesVA->EventRing.dequeue_pointer = 
&(HcResourcesVA->EventRing.firstSeg.XhciTrb[0]);
@@ -659,7 +696,7 @@
     Command.RunStop =1;
     WRITE_REGISTER_ULONG (OperationalRegs + XHCI_USBCMD, Command.AsULONG );
     
-    //MPStatus = XHCI_ControllerWorkTest(XhciExtension,Resources->StartVA, 
Resources->StartPA );
+    MPStatus = XHCI_ControllerWorkTest(XhciExtension,Resources->StartVA, 
Resources->StartPA );
 
     return MP_STATUS_SUCCESS;
 }
@@ -748,7 +785,7 @@
     DPRINT1("XHCI_InterruptService: Succesful Interupt\n");
     // changing the enque pointer
     
-    XHCI_ProcessEvent(XhciExtension);
+     XHCI_ProcessEvent(xhciExtension);
     
     
    
@@ -761,6 +798,7 @@
                   IN BOOLEAN IsDoEnableInterrupts)
 {
     DPRINT1("XHCI_InterruptDpc: function initiated\n");
+   
 }
 
 MPSTATUS

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=75639&r1=75638&r2=75639&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 22 09:57:48 2017
@@ -43,7 +43,7 @@
 #define NO_OP_COMMAND                  23
 
 // EVENT TRB IDs
-#define TRANSFER_EVENT                 32
+#define TRANSFER_EVENT                  32
 #define COMMAND_COMPLETION_EVENT        33
 #define PORT_STATUS_CHANGE_EVENT        34
 #define BANDWIDTH_RESET_REQUEST_EVENT   35
@@ -96,6 +96,15 @@
    PHYSICAL_ADDRESS ContextBaseAddr [256];
 } XHCI_DEVICE_CONTEXT_BASE_ADD_ARRAY, *PXHCI_DEVICE_CONTEXT_BASE_ADD_ARRAY;
 //----------------------------------------LINK 
TRB--------------------------------------------------------------------
+typedef union _XHCI_LINK_ADDR{
+    struct {
+        ULONGLONG RsvdZ1                     : 4;
+        ULONGLONG RingSegmentPointerLo       : 28;
+        ULONGLONG RingSegmentPointerHi       : 32;
+    };
+    ULONGLONG AsULONGLONG;
+} XHCI_LINK_ADDR;
+
 typedef struct _XHCI_LINK_TRB{
     struct {
         ULONG RsvdZ1                     : 4;
@@ -136,9 +145,9 @@
         ULONG RsvdZ3;
         struct{
             ULONG CycleBit                  : 1;
-            ULONG RsvdZ4                    : 4;
+            ULONG RsvdZ4                    : 9;
             ULONG TRBType                   : 6;
-            ULONG RsvdZ5                    : 14;
+            ULONG RsvdZ5                    : 16;
         };
 } XHCI_COMMAND_NO_OP_TRB;
 C_ASSERT(sizeof(XHCI_COMMAND_NO_OP_TRB) == 16);
@@ -341,10 +350,11 @@
   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;
+  DECLSPEC_ALIGN(64) 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); 
+C_ASSERT (FIELD_OFFSET(XHCI_HC_RESOURCES,EventRingSegTable)% 64 == 0);
 
 typedef struct _XHCI_EXTENSION {
   ULONG Reserved;


Reply via email to