+/**
+ * @name AhciProcessIO
+ * @not_implemented
+ *
+ * Acquire Exclusive lock to port, populate pending commands to command List
+ * program controller's port to process new commands in command list.
+ *
+ * @param AdapterExtension
+ * @param pathId
+ * @param Srb
+ *
+ */
+VOID
+AhciProcessIO (
+ __in PAHCI_ADAPTER_EXTENSION AdapterExtension,
+ __in UCHAR pathId
+ )
+{
+ STOR_LOCK_HANDLE lockhandle;
+ PAHCI_PORT_EXTENSION PortExtension;
+ ULONG commandSlotMask, occupiedSlots, slotIndex;
+
+ DebugPrint("AhciProcessIO()\n");
+ DebugPrint("\tPathId: %d\n", pathId);
+
+ PortExtension = &AdapterExtension->PortExtension[pathId];
+
+ NT_ASSERT(pathId < MAXIMUM_AHCI_PORT_COUNT);
+
+ if (PortExtension->IsActive == FALSE)
+ return; // we should wait for device to get active
+
+ AhciZeroMemory(&lockhandle, sizeof(lockhandle));
+
+ // Acquire Lock
+ StorPortAcquireSpinLock(AdapterExtension, InterruptLock, NULL, &lockhandle);
+
+ occupiedSlots = PortExtension->OccupiedSlots; // Busy command slots for given port
+ commandSlotMask = (1 << AHCI_Global_Port_CAP_NCS(AdapterExtension->CAP)) - 1; // available slots mask
+
+ commandSlotMask = (commandSlotMask & ~occupiedSlots);
+ if(commandSlotMask != 0)
+ {
+ for (slotIndex = 0; slotIndex <= AHCI_Global_Port_CAP_NCS(AdapterExtension->CAP); slotIndex++)
+ {
+ // find first free slot
+ if ((commandSlotMask & (1 << slotIndex)) != 0)
+ {
+ // TODO: remove from queue and process it
+ }
+ }
+ }
+
+ // Release Lock
+ StorPortReleaseSpinLock(AdapterExtension, &lockhandle);
+}// -- AhciProcessIO();
+