void AHCIPort::ResetDevice() { if (fRegs->cmd & PORT_CMD_ST) TRACE("AHCIPort::ResetDevice PORT_CMD_ST set, behaviour undefined\n"); // perform a hard reset fRegs->sctl = (fRegs->sctl & ~0xf) | 1; FlushPostedWrites(); spin(1100); fRegs->sctl &= ~0xf; FlushPostedWrites(); if (wait_until_set(&fRegs->ssts, 0x1, 100000) < B_OK) { TRACE("AHCIPort::ResetDevice port %d no device detected\n", fIndex); } // clear error bits fRegs->serr = fRegs->serr; FlushPostedWrites(); if (fRegs->ssts & 1) { if (wait_until_set(&fRegs->ssts, 0x3, 500000) < B_OK) { TRACE("AHCIPort::ResetDevice port %d device present but no phy " "communication\n", fIndex); } } // clear error bits fRegs->serr = fRegs->serr; FlushPostedWrites(); }
void AHCIPort::ResetDevice() { // perform a hard reset _HardReset(); if (wait_until_set(&fRegs->ssts, 0x1, 100000) < B_OK) TRACE("AHCIPort::ResetDevice port %d no device detected\n", fIndex); _ClearErrorRegister(); if (fRegs->ssts & 1) { if (wait_until_set(&fRegs->ssts, 0x3, 500000) < B_OK) { TRACE("AHCIPort::ResetDevice port %d device present but no phy " "communication\n", fIndex); } } _ClearErrorRegister(); }