Make debugging easier by tracing only status changes.
Always first disable interrupts on a device that can be selected, then check for invalid status. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30426 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
926160e8ac
commit
5bfd73fb71
@ -323,12 +323,6 @@ ATAChannel::Reset(bool *presence, uint16 *signatures)
|
|||||||
for (uint8 i = 0; i < deviceCount; i++) {
|
for (uint8 i = 0; i < deviceCount; i++) {
|
||||||
SelectDevice(i);
|
SelectDevice(i);
|
||||||
|
|
||||||
if (AltStatus() == 0xff) {
|
|
||||||
TRACE_ALWAYS("illegal status value for device %d,"
|
|
||||||
" assuming not present\n", i);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SelectedDevice() != i) {
|
if (SelectedDevice() != i) {
|
||||||
TRACE_ALWAYS("cannot select device %d, assuming not present\n", i);
|
TRACE_ALWAYS("cannot select device %d, assuming not present\n", i);
|
||||||
continue;
|
continue;
|
||||||
@ -337,6 +331,12 @@ ATAChannel::Reset(bool *presence, uint16 *signatures)
|
|||||||
// ensure interrupts are disabled for this device
|
// ensure interrupts are disabled for this device
|
||||||
_WriteControl(ATA_DEVICE_CONTROL_DISABLE_INTS);
|
_WriteControl(ATA_DEVICE_CONTROL_DISABLE_INTS);
|
||||||
|
|
||||||
|
if (AltStatus() == 0xff) {
|
||||||
|
TRACE_ALWAYS("illegal status value for device %d,"
|
||||||
|
" assuming not present\n", i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// wait up to 31 seconds for busy to clear
|
// wait up to 31 seconds for busy to clear
|
||||||
if (Wait(0, ATA_STATUS_BUSY, 0, 31 * 1000 * 1000) != B_OK) {
|
if (Wait(0, ATA_STATUS_BUSY, 0, 31 * 1000 * 1000) != B_OK) {
|
||||||
TRACE_ERROR("device %d reset timeout\n", i);
|
TRACE_ERROR("device %d reset timeout\n", i);
|
||||||
@ -388,6 +388,9 @@ ATAChannel::Wait(uint8 setBits, uint8 clearedBits, uint32 flags,
|
|||||||
TRACE("waiting for set bits 0x%02x and cleared bits 0x%02x\n",
|
TRACE("waiting for set bits 0x%02x and cleared bits 0x%02x\n",
|
||||||
setBits, clearedBits);
|
setBits, clearedBits);
|
||||||
|
|
||||||
|
#if ATA_TRACING
|
||||||
|
unsigned lastStatus = 0x100;
|
||||||
|
#endif
|
||||||
while (true) {
|
while (true) {
|
||||||
uint8 status = AltStatus();
|
uint8 status = AltStatus();
|
||||||
if ((flags & ATA_CHECK_ERROR_BIT) != 0
|
if ((flags & ATA_CHECK_ERROR_BIT) != 0
|
||||||
@ -410,9 +413,18 @@ ATAChannel::Wait(uint8 setBits, uint8 clearedBits, uint32 flags,
|
|||||||
}
|
}
|
||||||
|
|
||||||
bigtime_t elapsedTime = system_time() - startTime;
|
bigtime_t elapsedTime = system_time() - startTime;
|
||||||
TRACE("wait status after %lld: 0x%02x\n", elapsedTime, status);
|
#if ATA_TRACING
|
||||||
if (elapsedTime > timeout)
|
if (lastStatus != status) {
|
||||||
|
TRACE("wait status after %lld: 0x%02x\n", elapsedTime, status);
|
||||||
|
lastStatus = status;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (elapsedTime > timeout) {
|
||||||
|
TRACE("timeout, wait status after %lld: 0x%02x\n",
|
||||||
|
elapsedTime, status);
|
||||||
return B_TIMED_OUT;
|
return B_TIMED_OUT;
|
||||||
|
}
|
||||||
|
|
||||||
// The device may be ready almost immediatelly. If it isn't,
|
// The device may be ready almost immediatelly. If it isn't,
|
||||||
// poll often during the first 20ms, otherwise poll lazyly.
|
// poll often during the first 20ms, otherwise poll lazyly.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user