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:
parent
4d3410b485
commit
367d380b54
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=125251
@ -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);
|
||||
}
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user