+/**
+ * @name AhciStartPort
+ * @implemented
+ *
+ * Try to start the port device
+ *
+ * @param AdapterExtension
+ * @param PortExtension
+ *
+ */
+BOOLEAN
+AhciStartPort (
+ __in PAHCI_PORT_EXTENSION PortExtension
+ )
+{
+ ULONG index;
+ AHCI_PORT_CMD cmd;
+ AHCI_SERIAL_ATA_STATUS ssts;
+ AHCI_SERIAL_ATA_CONTROL sctl;
+ PAHCI_ADAPTER_EXTENSION AdapterExtension;
+
+ DebugPrint("AhciStartPort()\n");
+
+ AdapterExtension = PortExtension->AdapterExtension;
+ cmd.Status = StorPortReadRegisterUlong(AdapterExtension, &PortExtension->Port->CMD);
+
+ if ((cmd.FR == 1) && (cmd.CR == 1) && (cmd.FRE == 1) && (cmd.ST == 1))
+ {
+ // Already Running
+ return TRUE;
+ }
+
+ cmd.SUD = 1;
+ StorPortWriteRegisterUlong(AdapterExtension, &PortExtension->Port->CMD, cmd.Status);
+
+ if (((cmd.FR == 1) && (cmd.FRE == 0)) ||
+ ((cmd.CR == 1) && (cmd.ST == 0)))
+ {
+ DebugPrint("\tCOMRESET\n");
+ // perform COMRESET
+ // section 10.4.2
+
+ // Software causes a port reset (COMRESET) by writing 1h to the PxSCTL.DET field to invoke a
+ // COMRESET on the interface and start a re-establishment of Phy layer communications. Software shall
+ // wait at least 1 millisecond before clearing PxSCTL.DET to 0h; this ensures that at least one COMRESET
+ // signal is sent over the interface. After clearing PxSCTL.DET to 0h, software should wait for
+ // communication to be re-established as indicated by PxSSTS.DET being set to 3h. Then software should
+ // write all 1s to the PxSERR register to clear any bits that were set as part of the port reset.
+
+ sctl.Status = StorPortReadRegisterUlong(AdapterExtension, &PortExtension->Port->SCTL);
+ sctl.DET = 1;
+ StorPortWriteRegisterUlong(AdapterExtension, &PortExtension->Port->SCTL, sctl.Status);
+
+ StorPortStallExecution(1000);
+
+ sctl.Status = StorPortReadRegisterUlong(AdapterExtension, &PortExtension->Port->SCTL);
+ sctl.DET = 0;
+ StorPortWriteRegisterUlong(AdapterExtension, &PortExtension->Port->SCTL, sctl.Status);
+
+ // Poll DET to verify if a device is attached to the port
+ index = 0;
+ do
+ {
+ StorPortStallExecution(1000);
+ ssts.Status = StorPortReadRegisterUlong(AdapterExtension, &PortExtension->Port->SSTS);
+
+ index++;
+ if (ssts.DET != 0)
+ {
+ break;
+ }
+ }
+ while(index < 30);
+ }
+
+ ssts.Status = StorPortReadRegisterUlong(AdapterExtension, &PortExtension->Port->SSTS);
+ if (ssts.DET == 0x4)
+ {
+ // no device found
+ return FALSE;
+ }
+
+ DebugPrint("\tDET: %d %x %x\n", ssts.DET, PortExtension->Port->CMD, PortExtension->Port->SSTS);
+ return FALSE;
+}// -- AhciStartPort();
+