Example #1
0
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();
}
Example #2
0
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();
}