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) {
request->device = atadev;
request->u.ata.command = command;
request->flags = (ATA_R_READ | ATA_R_IMMEDIATE | ATA_R_QUIET);
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 ) {
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);
request->data = (caddr_t)atadev->param;
request->bytecount = sizeof(struct ata_params);
request->transfersize = DEV_BSIZE;
ata_queue_request(request);
if (!(error = request->result))
break;
request->retries--;
request->flags |= ATA_R_REQUEUE;
}
ata_free_request(request);
}

View File

@ -234,23 +234,38 @@ ata_completed(void *context, int dummy)
ATA_DEBUG_RQ(request, "completed called");
if (request->flags & ATA_R_TIMEOUT) {
ata_reinit(channel);
/* if retries still permit, reinject this request */
if (request->retries-- > 0) {
request->flags &= ~ATA_R_TIMEOUT;
request->flags |= (ATA_R_IMMEDIATE | ATA_R_REQUEUE);
ata_queue_request(request);
return;
}
/* otherwise just finish with error */
else {
/* 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 timed out\n",
"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 */
if (request->retries-- > 0) {
request->flags &= ~ATA_R_TIMEOUT;
request->flags |= (ATA_R_IMMEDIATE | ATA_R_REQUEUE);
ata_queue_request(request);
return;
}
/* otherwise just finish with error */
else {
if (!(request->flags & ATA_R_QUIET))
ata_prtdev(request->device,
"FAILURE - %s timed out\n",
ata_cmd2str(request));
request->result = EIO;
}
}
}
else {
@ -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,