[BLUE] Perform size/rectangle boundary checks on read/write operations. CORE-15108
[reactos.git] / drivers / network / dd / pcnet / pcnet.c
index f7e69df..0a78530 100644 (file)
@@ -22,7 +22,7 @@
  *     09-Sep-2003 vizzini - Created
  *     10-Oct-2004 navaraf - Fix receive to work on VMware adapters (
  *                           need to set busmaster bit on PCI).
- *                         - Indicate receive completition.
+ *                         - Indicate receive completion.
  *                         - Implement packet transmitting.
  *                         - Don't read slot number from registry and
  *                           report itself as NDIS 5.0 miniport.
@@ -139,8 +139,8 @@ MiniportHandleInterrupt(
               IndicatedData = TRUE;
 
               RtlZeroMemory(Descriptor, sizeof(RECEIVE_DESCRIPTOR));
-              Descriptor->RBADR =
-                  (ULONG)(Adapter->ReceiveBufferPtrPhys + Adapter->CurrentReceiveDescriptorIndex * BUFFER_SIZE);
+              Descriptor->RBADR = Adapter->ReceiveBufferPtrPhys.QuadPart +
+                                  (Adapter->CurrentReceiveDescriptorIndex * BUFFER_SIZE);
               Descriptor->BCNT = (-BUFFER_SIZE) | 0xf000;
               Descriptor->FLAGS |= RD_OWN;
 
@@ -192,7 +192,7 @@ MiniportHandleInterrupt(
                   if (Descriptor->FLAGS2 & TD2_LCOL)
                     Adapter->Statistics.XmtLateCollisions++;
                   if (Descriptor->FLAGS2 & TD2_EXDEF)
-                    Adapter->Statistics.XmtExcessiveDefferals++;
+                    Adapter->Statistics.XmtExcessiveDeferrals++;
                   if (Descriptor->FLAGS2 & TD2_UFLO)
                     Adapter->Statistics.XmtBufferUnderflows++;
                   if (Descriptor->FLAGS2 & TD2_BUFF)
@@ -308,11 +308,9 @@ MiFreeSharedMemory(
 {
   NDIS_PHYSICAL_ADDRESS PhysicalAddress;
 
-  PhysicalAddress.u.HighPart = 0;
-
   if(Adapter->InitializationBlockVirt)
     {
-      PhysicalAddress.u.LowPart = (ULONG)Adapter->InitializationBlockPhys;
+      PhysicalAddress = Adapter->InitializationBlockPhys;
       NdisMFreeSharedMemory(Adapter->MiniportAdapterHandle, Adapter->InitializationBlockLength,
           FALSE, Adapter->InitializationBlockVirt, PhysicalAddress);
       Adapter->InitializationBlockVirt = NULL;
@@ -320,7 +318,7 @@ MiFreeSharedMemory(
 
   if(Adapter->TransmitDescriptorRingVirt)
     {
-      PhysicalAddress.u.LowPart = (ULONG)Adapter->TransmitDescriptorRingPhys;
+      PhysicalAddress = Adapter->TransmitDescriptorRingPhys;
       NdisMFreeSharedMemory(Adapter->MiniportAdapterHandle, Adapter->TransmitDescriptorRingLength,
         FALSE, Adapter->TransmitDescriptorRingVirt, PhysicalAddress);
       Adapter->TransmitDescriptorRingVirt = NULL;
@@ -328,7 +326,7 @@ MiFreeSharedMemory(
 
   if(Adapter->ReceiveDescriptorRingVirt)
     {
-      PhysicalAddress.u.LowPart = (ULONG)Adapter->ReceiveDescriptorRingPhys;
+      PhysicalAddress = Adapter->ReceiveDescriptorRingPhys;
       NdisMFreeSharedMemory(Adapter->MiniportAdapterHandle, Adapter->ReceiveDescriptorRingLength,
           FALSE, Adapter->ReceiveDescriptorRingVirt, PhysicalAddress);
       Adapter->ReceiveDescriptorRingVirt = NULL;
@@ -336,7 +334,7 @@ MiFreeSharedMemory(
 
   if(Adapter->TransmitBufferPtrVirt)
     {
-      PhysicalAddress.u.LowPart = (ULONG)Adapter->TransmitBufferPtrPhys;
+      PhysicalAddress = Adapter->TransmitBufferPtrPhys;
       NdisMFreeSharedMemory(Adapter->MiniportAdapterHandle, Adapter->TransmitBufferLength,
           TRUE, Adapter->TransmitBufferPtrVirt, PhysicalAddress);
       Adapter->TransmitBufferPtrVirt = NULL;
@@ -344,7 +342,7 @@ MiFreeSharedMemory(
 
   if(Adapter->ReceiveBufferPtrVirt)
     {
-      PhysicalAddress.u.LowPart = (ULONG)Adapter->ReceiveBufferPtrPhys;
+      PhysicalAddress = Adapter->ReceiveBufferPtrPhys;
       NdisMFreeSharedMemory(Adapter->MiniportAdapterHandle, Adapter->ReceiveBufferLength,
           TRUE, Adapter->ReceiveBufferPtrVirt, PhysicalAddress);
       Adapter->ReceiveBufferPtrVirt = NULL;
@@ -383,13 +381,13 @@ MiAllocateSharedMemory(
          return NDIS_STATUS_RESOURCES;
       }
 
-      if(((ULONG)Adapter->InitializationBlockVirt & 0x00000003) != 0)
+      if (((ULONG_PTR)Adapter->InitializationBlockVirt & 0x00000003) != 0)
       {
          DPRINT1("address 0x%x not dword-aligned\n", Adapter->InitializationBlockVirt);
          return NDIS_STATUS_RESOURCES;
       }
 
-      Adapter->InitializationBlockPhys = (PINITIALIZATION_BLOCK)NdisGetPhysicalAddressLow(PhysicalAddress);
+      Adapter->InitializationBlockPhys = PhysicalAddress;
 
       /* allocate the transport descriptor ring */
       Adapter->TransmitDescriptorRingLength = sizeof(TRANSMIT_DESCRIPTOR) * BufferCount;
@@ -404,13 +402,13 @@ MiAllocateSharedMemory(
           continue;
       }
 
-      if (((ULONG)Adapter->TransmitDescriptorRingVirt & 0x00000003) != 0)
+      if (((ULONG_PTR)Adapter->TransmitDescriptorRingVirt & 0x00000003) != 0)
       {
          DPRINT1("address 0x%x not dword-aligned\n", Adapter->TransmitDescriptorRingVirt);
          return NDIS_STATUS_RESOURCES;
       }
 
-      Adapter->TransmitDescriptorRingPhys = (PTRANSMIT_DESCRIPTOR)NdisGetPhysicalAddressLow(PhysicalAddress);
+      Adapter->TransmitDescriptorRingPhys = PhysicalAddress;
       RtlZeroMemory(Adapter->TransmitDescriptorRingVirt, sizeof(TRANSMIT_DESCRIPTOR) * BufferCount);
 
       /* allocate the receive descriptor ring */
@@ -426,13 +424,13 @@ MiAllocateSharedMemory(
           continue;
       }
 
-      if (((ULONG)Adapter->ReceiveDescriptorRingVirt & 0x00000003) != 0)
+      if (((ULONG_PTR)Adapter->ReceiveDescriptorRingVirt & 0x00000003) != 0)
       {
           DPRINT1("address 0x%x not dword-aligned\n", Adapter->ReceiveDescriptorRingVirt);
           return NDIS_STATUS_RESOURCES;
       }
 
-      Adapter->ReceiveDescriptorRingPhys = (PRECEIVE_DESCRIPTOR)NdisGetPhysicalAddressLow(PhysicalAddress);
+      Adapter->ReceiveDescriptorRingPhys = PhysicalAddress;
       RtlZeroMemory(Adapter->ReceiveDescriptorRingVirt, sizeof(RECEIVE_DESCRIPTOR) * BufferCount);
 
       /* allocate transmit buffers */
@@ -448,13 +446,13 @@ MiAllocateSharedMemory(
           continue;
       }
 
-      if (((ULONG)Adapter->TransmitBufferPtrVirt & 0x00000003) != 0)
+      if(((ULONG_PTR)Adapter->TransmitBufferPtrVirt & 0x00000003) != 0)
       {
           DPRINT1("address 0x%x not dword-aligned\n", Adapter->TransmitBufferPtrVirt);
           return NDIS_STATUS_RESOURCES;
       }
 
-      Adapter->TransmitBufferPtrPhys = (PCHAR)NdisGetPhysicalAddressLow(PhysicalAddress);
+      Adapter->TransmitBufferPtrPhys = PhysicalAddress;
       RtlZeroMemory(Adapter->TransmitBufferPtrVirt, BUFFER_SIZE * BufferCount);
 
       /* allocate receive buffers */
@@ -470,13 +468,13 @@ MiAllocateSharedMemory(
           continue;
       }
 
-      if (((ULONG)Adapter->ReceiveBufferPtrVirt & 0x00000003) != 0)
+      if (((ULONG_PTR)Adapter->ReceiveBufferPtrVirt & 0x00000003) != 0)
       {
           DPRINT1("address 0x%x not dword-aligned\n", Adapter->ReceiveBufferPtrVirt);
           return NDIS_STATUS_RESOURCES;
       }
 
-      Adapter->ReceiveBufferPtrPhys = (PCHAR)NdisGetPhysicalAddressLow(PhysicalAddress);
+      Adapter->ReceiveBufferPtrPhys = PhysicalAddress;
       RtlZeroMemory(Adapter->ReceiveBufferPtrVirt, BUFFER_SIZE * BufferCount);
 
       break;
@@ -495,7 +493,7 @@ MiAllocateSharedMemory(
   TransmitDescriptor = Adapter->TransmitDescriptorRingVirt;
   for(i = 0; i < BufferCount; i++)
     {
-      (TransmitDescriptor+i)->TBADR = (ULONG)Adapter->TransmitBufferPtrPhys + i * BUFFER_SIZE;
+      (TransmitDescriptor+i)->TBADR = Adapter->TransmitBufferPtrPhys.QuadPart + i * BUFFER_SIZE;
       (TransmitDescriptor+i)->BCNT = 0xf000 | -BUFFER_SIZE; /* 2's compliment  + set top 4 bits */
       (TransmitDescriptor+i)->FLAGS = TD1_STP | TD1_ENP;
     }
@@ -506,7 +504,7 @@ MiAllocateSharedMemory(
   ReceiveDescriptor = Adapter->ReceiveDescriptorRingVirt;
   for(i = 0; i < BufferCount; i++)
     {
-      (ReceiveDescriptor+i)->RBADR = (ULONG)Adapter->ReceiveBufferPtrPhys + i * BUFFER_SIZE;
+      (ReceiveDescriptor+i)->RBADR = Adapter->ReceiveBufferPtrPhys.QuadPart + i * BUFFER_SIZE;
       (ReceiveDescriptor+i)->BCNT = 0xf000 | -BUFFER_SIZE; /* 2's compliment  + set top 4 bits */
       (ReceiveDescriptor+i)->FLAGS = RD_OWN;
     }
@@ -542,12 +540,12 @@ MiPrepareInitializationBlock(
 
   /* set up receive ring */
   DPRINT("Receive ring physical address: 0x%x\n", Adapter->ReceiveDescriptorRingPhys);
-  Adapter->InitializationBlockVirt->RDRA = (ULONG)Adapter->ReceiveDescriptorRingPhys;
+  Adapter->InitializationBlockVirt->RDRA = Adapter->ReceiveDescriptorRingPhys.QuadPart;
   Adapter->InitializationBlockVirt->RLEN = (Adapter->LogBufferCount << 4) & 0xf0;
 
   /* set up transmit ring */
   DPRINT("Transmit ring physical address: 0x%x\n", Adapter->TransmitDescriptorRingPhys);
-  Adapter->InitializationBlockVirt->TDRA = (ULONG)Adapter->TransmitDescriptorRingPhys;
+  Adapter->InitializationBlockVirt->TDRA = Adapter->TransmitDescriptorRingPhys.QuadPart;
   Adapter->InitializationBlockVirt->TLEN = (Adapter->LogBufferCount << 4) & 0xf0;
 }
 
@@ -650,7 +648,7 @@ MiniportMediaDetectionTimer(
     IN PVOID SystemSpecific2,
     IN PVOID SystemSpecific3)
 /*
- * FUNCTION: Periodially query media state
+ * FUNCTION: Periodically query media state
  * ARGUMENTS:
  *     FunctionContext: Adapter context
  * NOTES:
@@ -730,9 +728,9 @@ MiInitChip(
 
   /* set up csr1 and csr2 with init block */
   NdisRawWritePortUshort(Adapter->PortOffset + RAP, CSR1);
-  NdisRawWritePortUshort(Adapter->PortOffset + RDP, (USHORT)((ULONG)Adapter->InitializationBlockPhys & 0xffff));
+  NdisRawWritePortUshort(Adapter->PortOffset + RDP, (USHORT)(Adapter->InitializationBlockPhys.LowPart & 0xffff));
   NdisRawWritePortUshort(Adapter->PortOffset + RAP, CSR2);
-  NdisRawWritePortUshort(Adapter->PortOffset + RDP, (USHORT)((ULONG)Adapter->InitializationBlockPhys >> 16) & 0xffff);
+  NdisRawWritePortUshort(Adapter->PortOffset + RDP, (USHORT)(Adapter->InitializationBlockPhys.LowPart >> 16) & 0xffff);
 
   DPRINT("programmed with init block\n");
 
@@ -797,13 +795,13 @@ MiTestCard(
   /* see if we can read/write now */
   NdisRawWritePortUshort(Adapter->PortOffset + RAP, CSR0);
   NdisRawReadPortUshort(Adapter->PortOffset + RDP, &Data);
-  DPRINT("Port 0x%x RAP 0x%x CSR0 0x%x RDP 0x%x, Interupt status register is 0x%x\n", Adapter->PortOffset, RAP, CSR0, RDP, Data);
+  DPRINT("Port 0x%x RAP 0x%x CSR0 0x%x RDP 0x%x, Interrupt status register is 0x%x\n", Adapter->PortOffset, RAP, CSR0, RDP, Data);
 
   /* read the BIA */
   for(i = 0; i < 6; i++)
       NdisRawReadPortUchar(Adapter->PortOffset + i, &address[i]);
 
-  DPRINT("burned-in address: %x:%x:%x:%x:%x:%x\n", address[0], address[1], address[2], address[3], address[4], address[5]);
+  DPRINT("burned-in address: %02x:%02x:%02x:%02x:%02x:%02x\n", address[0], address[1], address[2], address[3], address[4], address[5]);
   /* Read status flags from CSR0 */
   NdisRawWritePortUshort(Adapter->PortOffset + RAP, CSR0);
   NdisRawReadPortUshort(Adapter->PortOffset + RDP, &Data);
@@ -812,8 +810,8 @@ MiTestCard(
   /* Read status flags from CSR3 */
   NdisRawWritePortUshort(Adapter->PortOffset + RAP, CSR3);
   NdisRawReadPortUshort(Adapter->PortOffset + RDP, &Data);
-
   DPRINT("CSR3: 0x%x\n", Data);
+  
   /* Read status flags from CSR4 */
   NdisRawWritePortUshort(Adapter->PortOffset + RAP, CSR4);
   NdisRawReadPortUshort(Adapter->PortOffset + RDP, &Data);
@@ -828,6 +826,11 @@ MiTestCard(
   NdisRawWritePortUshort(Adapter->PortOffset + RAP, CSR6);
   NdisRawReadPortUshort(Adapter->PortOffset + RDP, &Data);
   DPRINT("CSR6: 0x%x\n", Data);
+  
+  /* Read status flags from BCR4 */
+  NdisRawWritePortUshort(Adapter->PortOffset + RAP, BCR4);
+  NdisRawReadPortUshort(Adapter->PortOffset + BDP, &Data);
+  DPRINT("BCR4: 0x%x\n", Data);  
 
   return TRUE;
 }
@@ -1218,7 +1221,7 @@ MiniportSend(
   Adapter->CurrentTransmitEndIndex %= Adapter->BufferCount;
 
   Desc->FLAGS = TD1_OWN | TD1_STP | TD1_ENP;
-  Desc->BCNT = 0xf000 | -TotalPacketLength;
+  Desc->BCNT = 0xf000 | -(INT)TotalPacketLength;
 
   NdisMSynchronizeWithInterrupt(&Adapter->InterruptObject, MiSyncStartTransmit, Adapter);
 
@@ -1365,4 +1368,3 @@ DriverEntry(
 
   return NDIS_STATUS_SUCCESS;
 }
-