fixed portCount boundary problem :D

svn path=/branches/GSoC_2016/AHCI/; revision=71650
This commit is contained in:
Aman Priyadarshi 2016-06-16 21:14:03 +00:00
parent 5b776020ae
commit b27dbd3e4b
2 changed files with 35 additions and 35 deletions

View file

@ -35,7 +35,7 @@ AhciPortInitialize (
portNumber = PortExtension->PortNumber; portNumber = PortExtension->PortNumber;
NT_ASSERT(abar != NULL); NT_ASSERT(abar != NULL);
NT_ASSERT(portNumber < MAXIMUM_AHCI_PORT_COUNT); NT_ASSERT(portNumber < adapterExtension->PortCount);
PortExtension->Port = &abar->PortList[portNumber]; PortExtension->Port = &abar->PortList[portNumber];
@ -120,18 +120,15 @@ AhciAllocateResourceForAdapter (
portCount = 0; portCount = 0;
portImplemented = AdapterExtension->PortImplemented; portImplemented = AdapterExtension->PortImplemented;
// make sure we don't allocate too much memory for the ports we have not implemented NT_ASSERT(portImplemented != 0);
// LOGIC: AND with all MAXIMUM_AHCI_PORT_COUNT (low significant) bits set for (index = MAXIMUM_AHCI_PORT_COUNT - 1; index > 0; index--)
portImplemented = portImplemented & ((1 << MAXIMUM_AHCI_PORT_COUNT) - 1); if ((portImplemented & (1 << index)) != 0)
while (portImplemented > 0) break;
{
portCount++;
portImplemented &= (portImplemented - 1);
}
NT_ASSERT(portCount <= MAXIMUM_AHCI_PORT_COUNT); portCount = index + 1;
DebugPrint("\tPort Count: %d\n", portCount); DebugPrint("\tPort Count: %d\n", portCount);
AdapterExtension->PortCount = portCount;
nonCachedExtensionSize = sizeof(AHCI_COMMAND_HEADER) * AlignedNCS + //should be 1K aligned nonCachedExtensionSize = sizeof(AHCI_COMMAND_HEADER) * AlignedNCS + //should be 1K aligned
sizeof(AHCI_RECEIVED_FIS); sizeof(AHCI_RECEIVED_FIS);
@ -151,7 +148,7 @@ AhciAllocateResourceForAdapter (
nonCachedExtension = AdapterExtension->NonCachedExtension; nonCachedExtension = AdapterExtension->NonCachedExtension;
AhciZeroMemory(nonCachedExtension, nonCachedExtensionSize * portCount); AhciZeroMemory(nonCachedExtension, nonCachedExtensionSize * portCount);
for (index = 0; index < MAXIMUM_AHCI_PORT_COUNT; index++) for (index = 0; index < portCount; index++)
{ {
AdapterExtension->PortExtension[index].IsActive = FALSE; AdapterExtension->PortExtension[index].IsActive = FALSE;
if ((AdapterExtension->PortImplemented & (1 << index)) != 0) if ((AdapterExtension->PortImplemented & (1 << index)) != 0)
@ -298,7 +295,7 @@ AhciInterruptHandler (
* *
* The Storport driver calls the HwStorInterrupt routine after the HBA generates an interrupt request. * The Storport driver calls the HwStorInterrupt routine after the HBA generates an interrupt request.
* *
* @param adapterExtension * @param AdapterExtension
* *
* @return * @return
* return TRUE Indicates that an interrupt was pending on adapter. * return TRUE Indicates that an interrupt was pending on adapter.
@ -306,48 +303,46 @@ AhciInterruptHandler (
*/ */
BOOLEAN BOOLEAN
AhciHwInterrupt( AhciHwInterrupt(
__in PVOID AdapterExtension __in PAHCI_ADAPTER_EXTENSION AdapterExtension
) )
{ {
ULONG portPending, nextPort, i; ULONG portPending, nextPort, i, portCount;
PAHCI_ADAPTER_EXTENSION adapterExtension;
DebugPrint("AhciHwInterrupt()\n"); DebugPrint("AhciHwInterrupt()\n");
adapterExtension = AdapterExtension; if (AdapterExtension->StateFlags.Removed)
if (adapterExtension->StateFlags.Removed)
{ {
return FALSE; return FALSE;
} }
portPending = StorPortReadRegisterUlong(adapterExtension, adapterExtension->IS); portPending = StorPortReadRegisterUlong(AdapterExtension, AdapterExtension->IS);
// we process interrupt for implemented ports only // we process interrupt for implemented ports only
portPending = portPending & adapterExtension->PortImplemented; portCount = AdapterExtension->PortCount;
portPending = portPending & AdapterExtension->PortImplemented;
if (portPending == 0) if (portPending == 0)
{ {
return FALSE; return FALSE;
} }
for (i = 1; i <= MAXIMUM_AHCI_PORT_COUNT; i++) for (i = 1; i <= portCount; i++)
{ {
nextPort = (adapterExtension->LastInterruptPort + i) % MAXIMUM_AHCI_PORT_COUNT; nextPort = (AdapterExtension->LastInterruptPort + i) % portCount;
if ((portPending & (0x1 << nextPort)) == 0) if ((portPending & (0x1 << nextPort)) == 0)
continue; continue;
NT_ASSERT(IsPortValid(AdapterExtension, nextPort)); NT_ASSERT(IsPortValid(AdapterExtension, nextPort));
if ((nextPort == adapterExtension->LastInterruptPort) || if ((nextPort == AdapterExtension->LastInterruptPort) ||
(adapterExtension->PortExtension[nextPort].IsActive == FALSE)) (AdapterExtension->PortExtension[nextPort].IsActive == FALSE))
{ {
return FALSE; return FALSE;
} }
// we can assign this interrupt to this port // we can assign this interrupt to this port
adapterExtension->LastInterruptPort = nextPort; AdapterExtension->LastInterruptPort = nextPort;
AhciInterruptHandler(&adapterExtension->PortExtension[nextPort]); AhciInterruptHandler(&AdapterExtension->PortExtension[nextPort]);
// interrupt belongs to this device // interrupt belongs to this device
// should always return TRUE // should always return TRUE
@ -448,19 +443,22 @@ AhciHwStartIo (
if (cdb->CDB10.OperationCode == SCSIOP_INQUIRY) if (cdb->CDB10.OperationCode == SCSIOP_INQUIRY)
{ {
Srb->SrbStatus = DeviceInquiryRequest(adapterExtension, Srb, cdb); Srb->SrbStatus = DeviceInquiryRequest(adapterExtension, Srb, cdb);
StorPortNotification(RequestComplete, adapterExtension, Srb); }
return TRUE; else
{
Srb->SrbStatus = SRB_STATUS_NO_DEVICE;
} }
} }
else else
{ {
Srb->SrbStatus = SRB_STATUS_BAD_FUNCTION; Srb->SrbStatus = SRB_STATUS_BAD_FUNCTION;
StorPortNotification(RequestComplete, adapterExtension, Srb);
return TRUE;
} }
StorPortNotification(RequestComplete, adapterExtension, Srb);
return TRUE;
} }
DebugPrint("\tUnknow function code recieved: %x\n", function); DebugPrint("\tUnknown function code recieved: %x\n", function);
Srb->SrbStatus = SRB_STATUS_BAD_FUNCTION; Srb->SrbStatus = SRB_STATUS_BAD_FUNCTION;
StorPortNotification(RequestComplete, adapterExtension, Srb); StorPortNotification(RequestComplete, adapterExtension, Srb);
return TRUE; return TRUE;
@ -672,7 +670,7 @@ AhciHwFindAdapter (
return SP_RETURN_ERROR; return SP_RETURN_ERROR;
} }
for (index = 0; index < MAXIMUM_AHCI_PORT_COUNT; index++) for (index = 0; index < adapterExtension->PortCount; index++)
{ {
if ((adapterExtension->PortImplemented & (0x1<<index)) != 0) if ((adapterExtension->PortImplemented & (0x1<<index)) != 0)
AhciPortInitialize(&adapterExtension->PortExtension[index]); AhciPortInitialize(&adapterExtension->PortExtension[index]);
@ -812,7 +810,7 @@ AhciProcessIO (
PortExtension = &AdapterExtension->PortExtension[PathId]; PortExtension = &AdapterExtension->PortExtension[PathId];
NT_ASSERT(PathId < MAXIMUM_AHCI_PORT_COUNT); NT_ASSERT(PathId < AdapterExtension->PortCount);
// add Srb to queue // add Srb to queue
AddQueue(&PortExtension->SrbQueue, Srb); AddQueue(&PortExtension->SrbQueue, Srb);
@ -1021,7 +1019,7 @@ IsPortValid (
{ {
NT_ASSERT(pathId >= 0); NT_ASSERT(pathId >= 0);
if (pathId >= MAXIMUM_AHCI_PORT_COUNT) if (pathId >= AdapterExtension->PortCount)
{ {
return FALSE; return FALSE;
} }

View file

@ -10,7 +10,7 @@
#define DEBUG 1 #define DEBUG 1
#define MAXIMUM_AHCI_PORT_COUNT 12 #define MAXIMUM_AHCI_PORT_COUNT 25
#define MAXIMUM_QUEUE_BUFFER_SIZE 255 #define MAXIMUM_QUEUE_BUFFER_SIZE 255
#define MAXIMUM_TRANSFER_LENGTH (128*1024) // 128 KB #define MAXIMUM_TRANSFER_LENGTH (128*1024) // 128 KB
@ -20,6 +20,7 @@
#define AHCI_Global_HBA_CONTROL_MRSM (1 << 2) #define AHCI_Global_HBA_CONTROL_MRSM (1 << 2)
#define AHCI_Global_HBA_CONTROL_AE (1 << 31) #define AHCI_Global_HBA_CONTROL_AE (1 << 31)
#define AHCI_Global_HBA_CAP_S64A (1 << 31) #define AHCI_Global_HBA_CAP_S64A (1 << 31)
#define AHCI_Global_Port_CMD_IDLE ((1 << 0) | (1 << 4) | (1 << 14) | (1 << 15)) // PxCMD.ST, PxCMD.CR, PxCMD.FRE and PxCMD.FR
// 3.1.1 NCS = CAP[12:08] -> Align // 3.1.1 NCS = CAP[12:08] -> Align
#define AHCI_Global_Port_CAP_NCS(x) (((x) & 0xF00) >> 8) #define AHCI_Global_Port_CAP_NCS(x) (((x) & 0xF00) >> 8)
@ -254,6 +255,7 @@ typedef struct _AHCI_ADAPTER_EXTENSION
ULONG AhciBaseAddress; ULONG AhciBaseAddress;
PULONG IS;// Interrupt Status, In case of MSIM == `1` PULONG IS;// Interrupt Status, In case of MSIM == `1`
ULONG PortImplemented;// bit-mapping of ports which are implemented ULONG PortImplemented;// bit-mapping of ports which are implemented
ULONG PortCount;
USHORT VendorID; USHORT VendorID;
USHORT DeviceID; USHORT DeviceID;