summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsos <sos@FreeBSD.org>2001-04-05 11:15:24 +0000
committersos <sos@FreeBSD.org>2001-04-05 11:15:24 +0000
commita49e25eb97a6e1fa0e29186c7b99bb3f77816851 (patch)
treef43c57b4698f20c8e38852d694b7ef6ff8bca0f1
parente7caecea7404d17cf087d8a3970662628ef134ca (diff)
downloadFreeBSD-src-a49e25eb97a6e1fa0e29186c7b99bb3f77816851.zip
FreeBSD-src-a49e25eb97a6e1fa0e29186c7b99bb3f77816851.tar.gz
Add new flag ATPR_F_QUIET to atapi_request.
Cleanup error handling.
-rw-r--r--sys/dev/ata/ata-all.c4
-rw-r--r--sys/dev/ata/atapi-all.c71
-rw-r--r--sys/dev/ata/atapi-all.h3
3 files changed, 39 insertions, 39 deletions
diff --git a/sys/dev/ata/ata-all.c b/sys/dev/ata/ata-all.c
index 4b04a31..cbf083b 100644
--- a/sys/dev/ata/ata-all.c
+++ b/sys/dev/ata/ata-all.c
@@ -631,8 +631,8 @@ ata_start(struct ata_softc *scp)
TAILQ_REMOVE(&scp->atapi_queue, atapi_request, chain);
scp->active = ATA_ACTIVE_ATAPI;
scp->running = atapi_request;
- atapi_transfer(atapi_request);
- return;
+ if (atapi_transfer(atapi_request) == ATA_OP_CONTINUES)
+ return;
}
#endif
scp->active = ATA_IDLE;
diff --git a/sys/dev/ata/atapi-all.c b/sys/dev/ata/atapi-all.c
index 105e802..1b9bba9 100644
--- a/sys/dev/ata/atapi-all.c
+++ b/sys/dev/ata/atapi-all.c
@@ -46,7 +46,8 @@
/* prototypes */
static void atapi_read(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_cmd2str(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)
{
struct atapi_softc *atp = request->device;
@@ -282,17 +283,8 @@ atapi_transfer(struct atapi_request *request)
request->error = 0;
else
request->error = EBUSY;
- if (request->callback) {
- if (!((request->callback)(request))) {
- 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;
+ atapi_finish(request);
+ return ATA_OP_FINISHED;
}
/* start timeout for this command */
@@ -329,7 +321,7 @@ atapi_transfer(struct atapi_request *request)
/* command interrupt device ? just return */
if (ATP_PARAM->drqtype == ATAPI_DRQT_INTR)
- return;
+ return ATA_OP_CONTINUES;
/* ready to write ATAPI command */
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);
ata_printf(atp->controller, atp->unit,
"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 */
@@ -354,6 +348,7 @@ atapi_transfer(struct atapi_request *request)
/* send actual command */
ATA_OUTSW(atp->controller->r_io, ATA_DATA, (int16_t *)request->ccb,
request->ccbsize / sizeof(int16_t));
+ return ATA_OP_CONTINUES;
}
int
@@ -362,7 +357,7 @@ atapi_interrupt(struct atapi_request *request)
struct atapi_softc *atp = request->device;
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);
if (reason == ATAPI_P_CMDOUT) {
@@ -450,20 +445,13 @@ op_finished:
request->ccb[0] = ATAPI_REQUEST_SENSE;
request->ccb[4] = 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);
}
else {
if (request->result) {
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:
request->error = 0;
break;
@@ -485,6 +473,11 @@ op_finished:
break;
default:
+ request->error = EIO;
+
+ if (request->flags & ATPR_F_QUIET)
+ break;
+
ata_printf(atp->controller, atp->unit,
"%s - %s asc=0x%02x ascq=0x%02x ",
atapi_cmd2str(atp->cmd),
@@ -496,24 +489,16 @@ op_finished:
request->sense.sk_specific1,
request->sense.sk_specific2);
printf("error=0x%02x\n", request->result & ATAPI_E_MASK);
- request->error = EIO;
}
}
else
request->error = 0;
- if (request->callback) {
#ifdef ATAPI_DEBUG
+ if (request->callback)
ata_printf(atp->controller, atp->unit, "finished %s (callback)\n",
atapi_cmd2str(request->ccb[0]));
#endif
- if (!((request->callback)(request))) {
- if (request->dmatab)
- free(request->dmatab, M_DEVBUF);
- free(request, M_ATAPI);
- }
- }
- else
- wakeup((caddr_t)request);
+ atapi_finish(request);
}
return ATA_OP_FINISHED;
}
@@ -630,6 +615,20 @@ atapi_write(struct atapi_request *request, int length)
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
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);
else {
/* retries all used up, return error */
- request->result = ATAPI_SK_RESERVED | ATAPI_E_ABRT;
+ request->error = EIO;
wakeup((caddr_t)request);
}
ata_reinit(atp->controller);
diff --git a/sys/dev/ata/atapi-all.h b/sys/dev/ata/atapi-all.h
index bbd4a7c..186009c 100644
--- a/sys/dev/ata/atapi-all.h
+++ b/sys/dev/ata/atapi-all.h
@@ -173,6 +173,7 @@ struct atapi_request {
#define ATPR_F_DMA_USED 0x0002
#define ATPR_F_AT_HEAD 0x0004
#define ATPR_F_INTERNAL 0x0008
+#define ATPR_F_QUIET 0x0010
caddr_t data; /* pointer to data buf */
atapi_callback_t *callback; /* ptr to callback func */
@@ -184,7 +185,7 @@ struct atapi_request {
void atapi_attach(struct ata_softc *, int);
void atapi_detach(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_queue_cmd(struct atapi_softc *, int8_t [], caddr_t, int, int, int, atapi_callback_t, void *);
void atapi_reinit(struct atapi_softc *);
OpenPOWER on IntegriCloud