Add new flag ATPR_F_QUIET to atapi_request.

Cleanup error handling.
This commit is contained in:
Søren Schmidt 2001-04-05 11:15:24 +00:00
parent e65e827e13
commit ae2e8ffad0
3 changed files with 39 additions and 39 deletions

View File

@ -631,8 +631,8 @@ ata_start(struct ata_softc *scp)
TAILQ_REMOVE(&scp->atapi_queue, atapi_request, chain); TAILQ_REMOVE(&scp->atapi_queue, atapi_request, chain);
scp->active = ATA_ACTIVE_ATAPI; scp->active = ATA_ACTIVE_ATAPI;
scp->running = atapi_request; scp->running = atapi_request;
atapi_transfer(atapi_request); if (atapi_transfer(atapi_request) == ATA_OP_CONTINUES)
return; return;
} }
#endif #endif
scp->active = ATA_IDLE; scp->active = ATA_IDLE;

View File

@ -46,7 +46,8 @@
/* prototypes */ /* prototypes */
static void atapi_read(struct atapi_request *, int); static void atapi_read(struct atapi_request *, int);
static void atapi_write(struct atapi_request *, int); static void atapi_write(struct atapi_request *, int);
static void atapi_timeout(struct atapi_request *request); static void atapi_finish(struct atapi_request *);
static void atapi_timeout(struct atapi_request *);
static char *atapi_type(int); static char *atapi_type(int);
static char *atapi_cmd2str(u_int8_t); static char *atapi_cmd2str(u_int8_t);
static char *atapi_skey2str(u_int8_t); static char *atapi_skey2str(u_int8_t);
@ -262,7 +263,7 @@ atapi_start(struct atapi_softc *atp)
} }
} }
void int
atapi_transfer(struct atapi_request *request) atapi_transfer(struct atapi_request *request)
{ {
struct atapi_softc *atp = request->device; struct atapi_softc *atp = request->device;
@ -282,17 +283,8 @@ atapi_transfer(struct atapi_request *request)
request->error = 0; request->error = 0;
else else
request->error = EBUSY; request->error = EBUSY;
if (request->callback) { atapi_finish(request);
if (!((request->callback)(request))) { return ATA_OP_FINISHED;
if (request->dmatab)
free(request->dmatab, M_DEVBUF);
free(request, M_ATAPI);
}
}
else
wakeup((caddr_t)request);
atp->controller->active = ATA_IDLE; /* should go in ata-all.c */
return;
} }
/* start timeout for this command */ /* start timeout for this command */
@ -329,7 +321,7 @@ atapi_transfer(struct atapi_request *request)
/* command interrupt device ? just return */ /* command interrupt device ? just return */
if (ATP_PARAM->drqtype == ATAPI_DRQT_INTR) if (ATP_PARAM->drqtype == ATAPI_DRQT_INTR)
return; return ATA_OP_CONTINUES;
/* ready to write ATAPI command */ /* ready to write ATAPI command */
timout = 5000; /* might be less for fast devices */ timout = 5000; /* might be less for fast devices */
@ -345,7 +337,9 @@ atapi_transfer(struct atapi_request *request)
request->result = ATA_INB(atp->controller->r_io, ATA_ERROR); request->result = ATA_INB(atp->controller->r_io, ATA_ERROR);
ata_printf(atp->controller, atp->unit, ata_printf(atp->controller, atp->unit,
"failure to execute ATAPI packet command\n"); "failure to execute ATAPI packet command\n");
return; request->error = EIO;
atapi_finish(request);
return ATA_OP_FINISHED;
} }
/* this seems to be needed for some (slow) devices */ /* this seems to be needed for some (slow) devices */
@ -354,6 +348,7 @@ atapi_transfer(struct atapi_request *request)
/* send actual command */ /* send actual command */
ATA_OUTSW(atp->controller->r_io, ATA_DATA, (int16_t *)request->ccb, ATA_OUTSW(atp->controller->r_io, ATA_DATA, (int16_t *)request->ccb,
request->ccbsize / sizeof(int16_t)); request->ccbsize / sizeof(int16_t));
return ATA_OP_CONTINUES;
} }
int int
@ -362,7 +357,7 @@ atapi_interrupt(struct atapi_request *request)
struct atapi_softc *atp = request->device; struct atapi_softc *atp = request->device;
int reason, dma_stat = 0; int reason, dma_stat = 0;
reason = (ATA_INB(atp->controller->r_io, ATA_IREASON) & (ATA_I_CMD|ATA_I_IN)) | reason = (ATA_INB(atp->controller->r_io, ATA_IREASON)&(ATA_I_CMD|ATA_I_IN))|
(atp->controller->status & ATA_S_DRQ); (atp->controller->status & ATA_S_DRQ);
if (reason == ATAPI_P_CMDOUT) { if (reason == ATAPI_P_CMDOUT) {
@ -450,20 +445,13 @@ op_finished:
request->ccb[0] = ATAPI_REQUEST_SENSE; request->ccb[0] = ATAPI_REQUEST_SENSE;
request->ccb[4] = sizeof(struct atapi_reqsense); request->ccb[4] = sizeof(struct atapi_reqsense);
request->bytecount = sizeof(struct atapi_reqsense); request->bytecount = sizeof(struct atapi_reqsense);
request->flags = ATPR_F_READ | ATPR_F_INTERNAL; request->flags &= ATPR_F_QUIET;
request->flags |= ATPR_F_READ | ATPR_F_INTERNAL;
TAILQ_INSERT_HEAD(&atp->controller->atapi_queue, request, chain); TAILQ_INSERT_HEAD(&atp->controller->atapi_queue, request, chain);
} }
else { else {
if (request->result) { if (request->result) {
switch ((request->result & ATAPI_SK_MASK)) { switch ((request->result & ATAPI_SK_MASK)) {
case ATAPI_SK_RESERVED:
ata_printf(atp->controller, atp->unit,
"%s - timeout error=0x%02x\n",
atapi_cmd2str(atp->cmd),
request->result & ATAPI_E_MASK);
request->error = EIO;
break;
case ATAPI_SK_NO_SENSE: case ATAPI_SK_NO_SENSE:
request->error = 0; request->error = 0;
break; break;
@ -485,6 +473,11 @@ op_finished:
break; break;
default: default:
request->error = EIO;
if (request->flags & ATPR_F_QUIET)
break;
ata_printf(atp->controller, atp->unit, ata_printf(atp->controller, atp->unit,
"%s - %s asc=0x%02x ascq=0x%02x ", "%s - %s asc=0x%02x ascq=0x%02x ",
atapi_cmd2str(atp->cmd), atapi_cmd2str(atp->cmd),
@ -496,24 +489,16 @@ op_finished:
request->sense.sk_specific1, request->sense.sk_specific1,
request->sense.sk_specific2); request->sense.sk_specific2);
printf("error=0x%02x\n", request->result & ATAPI_E_MASK); printf("error=0x%02x\n", request->result & ATAPI_E_MASK);
request->error = EIO;
} }
} }
else else
request->error = 0; request->error = 0;
if (request->callback) {
#ifdef ATAPI_DEBUG #ifdef ATAPI_DEBUG
if (request->callback)
ata_printf(atp->controller, atp->unit, "finished %s (callback)\n", ata_printf(atp->controller, atp->unit, "finished %s (callback)\n",
atapi_cmd2str(request->ccb[0])); atapi_cmd2str(request->ccb[0]));
#endif #endif
if (!((request->callback)(request))) { atapi_finish(request);
if (request->dmatab)
free(request->dmatab, M_DEVBUF);
free(request, M_ATAPI);
}
}
else
wakeup((caddr_t)request);
} }
return ATA_OP_FINISHED; return ATA_OP_FINISHED;
} }
@ -630,6 +615,20 @@ atapi_write(struct atapi_request *request, int length)
request->donecount += size; request->donecount += size;
} }
static void
atapi_finish(struct atapi_request *request)
{
if (request->callback) {
if (!((request->callback)(request))) {
if (request->dmatab)
free(request->dmatab, M_DEVBUF);
free(request, M_ATAPI);
}
}
else
wakeup((caddr_t)request);
}
static void static void
atapi_timeout(struct atapi_request *request) atapi_timeout(struct atapi_request *request)
{ {
@ -656,7 +655,7 @@ atapi_timeout(struct atapi_request *request)
TAILQ_INSERT_HEAD(&atp->controller->atapi_queue, request, chain); TAILQ_INSERT_HEAD(&atp->controller->atapi_queue, request, chain);
else { else {
/* retries all used up, return error */ /* retries all used up, return error */
request->result = ATAPI_SK_RESERVED | ATAPI_E_ABRT; request->error = EIO;
wakeup((caddr_t)request); wakeup((caddr_t)request);
} }
ata_reinit(atp->controller); ata_reinit(atp->controller);

View File

@ -173,6 +173,7 @@ struct atapi_request {
#define ATPR_F_DMA_USED 0x0002 #define ATPR_F_DMA_USED 0x0002
#define ATPR_F_AT_HEAD 0x0004 #define ATPR_F_AT_HEAD 0x0004
#define ATPR_F_INTERNAL 0x0008 #define ATPR_F_INTERNAL 0x0008
#define ATPR_F_QUIET 0x0010
caddr_t data; /* pointer to data buf */ caddr_t data; /* pointer to data buf */
atapi_callback_t *callback; /* ptr to callback func */ atapi_callback_t *callback; /* ptr to callback func */
@ -184,7 +185,7 @@ struct atapi_request {
void atapi_attach(struct ata_softc *, int); void atapi_attach(struct ata_softc *, int);
void atapi_detach(struct atapi_softc *); void atapi_detach(struct atapi_softc *);
void atapi_start(struct atapi_softc *); void atapi_start(struct atapi_softc *);
void atapi_transfer(struct atapi_request *); int atapi_transfer(struct atapi_request *);
int atapi_interrupt(struct atapi_request *); int atapi_interrupt(struct atapi_request *);
int atapi_queue_cmd(struct atapi_softc *, int8_t [], caddr_t, int, int, int, atapi_callback_t, void *); int atapi_queue_cmd(struct atapi_softc *, int8_t [], caddr_t, int, int, int, atapi_callback_t, void *);
void atapi_reinit(struct atapi_softc *); void atapi_reinit(struct atapi_softc *);