Be more robust in the probe. We dont want to get into a loop with

reinitting when we try to identify devices. If they dont interrupt
on identify we retry once. If this fails we simply ignore that device.
This commit is contained in:
Søren Schmidt 2004-01-30 19:16:08 +00:00
parent 4d3410b485
commit 367d380b54
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=125251
2 changed files with 38 additions and 24 deletions

View File

@ -563,20 +563,19 @@ ata_getparam(struct ata_device *atadev, u_int8_t command)
if (atadev->param) {
request = ata_alloc_request();
if (request) {
int retries = 2;
while (retries-- > 0) {
request->device = atadev;
request->timeout = 5;
request->retries = -1;
request->u.ata.command = command;
request->flags = (ATA_R_READ | ATA_R_IMMEDIATE | ATA_R_QUIET);
request->flags = (ATA_R_READ | ATA_R_IMMEDIATE);
request->data = (caddr_t)atadev->param;
request->timeout = 2;
request->retries = 3;
request->bytecount = sizeof(struct ata_params);
request->transfersize = DEV_BSIZE;
while (request->retries > 0 ) {
ata_queue_request(request);
if (!(error = request->result))
break;
request->retries--;
request->flags |= ATA_R_REQUEUE;
}
ata_free_request(request);
}

View File

@ -234,6 +234,20 @@ ata_completed(void *context, int dummy)
ATA_DEBUG_RQ(request, "completed called");
if (request->flags & ATA_R_TIMEOUT) {
/* if negative retry count just give up and unlock channel HW */
if (request->retries < 0) {
if (!(request->flags & ATA_R_QUIET))
ata_prtdev(request->device,
"FAILURE - %s no interrupt\n",
ata_cmd2str(request));
request->result = EIO;
ATA_UNLOCK_CH(channel);
channel->locking(channel, ATA_LF_UNLOCK);
}
else {
/* reset controller and devices */
ata_reinit(channel);
/* if retries still permit, reinject this request */
@ -253,6 +267,7 @@ ata_completed(void *context, int dummy)
request->result = EIO;
}
}
}
else {
/* untimeout request now we have control back */
untimeout((timeout_t *)ata_timeout, request, request->timeout_handle);
@ -402,7 +417,7 @@ ata_timeout(struct ata_request *request)
}
/* report that we timed out */
if (!(request->flags & ATA_R_QUIET)) {
if (!(request->flags & ATA_R_QUIET) && request->retries > 0) {
ata_prtdev(request->device,
"TIMEOUT - %s retrying (%d retr%s left)",
ata_cmd2str(request), request->retries,