mirror of
https://github.com/reactos/reactos.git
synced 2025-03-10 10:14:44 +00:00
fixed portCount boundary problem :D
svn path=/branches/GSoC_2016/AHCI/; revision=71650
This commit is contained in:
parent
5b776020ae
commit
b27dbd3e4b
2 changed files with 35 additions and 35 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue