Add new flag ATPR_F_QUIET to atapi_request.
Cleanup error handling.
This commit is contained in:
parent
e65e827e13
commit
ae2e8ffad0
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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 *);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user