summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorsos <sos@FreeBSD.org>1999-11-10 07:13:51 +0000
committersos <sos@FreeBSD.org>1999-11-10 07:13:51 +0000
commit85f0f1d9984ba3f1b1e0dd3c7038bc3a17d06c7b (patch)
tree98d539ef36ffa85a867684ce2ec61720b1e3404c /sys
parent926d27157159bc7e96a1179a94bbcd40e3f98463 (diff)
downloadFreeBSD-src-85f0f1d9984ba3f1b1e0dd3c7038bc3a17d06c7b.zip
FreeBSD-src-85f0f1d9984ba3f1b1e0dd3c7038bc3a17d06c7b.tar.gz
Make the atapi device return sensible errno's back to userland.
Dont panic if a nonexistant device is opened.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/ata/atapi-all.c90
-rw-r--r--sys/dev/ata/atapi-all.h1
-rw-r--r--sys/dev/ata/atapi-cd.c8
-rw-r--r--sys/dev/ata/atapi-fd.c8
-rw-r--r--sys/dev/ata/atapi-tape.c8
5 files changed, 60 insertions, 55 deletions
diff --git a/sys/dev/ata/atapi-all.c b/sys/dev/ata/atapi-all.c
index fc4bec8..99425bf 100644
--- a/sys/dev/ata/atapi-all.c
+++ b/sys/dev/ata/atapi-all.c
@@ -263,36 +263,7 @@ atapi_queue_cmd(struct atapi_softc *atp, int8_t *ccb, void *data,
#ifdef ATAPI_DEBUG
printf("atapi: phew, got back from tsleep\n");
#endif
-
- error = request->result;
- switch ((error & ATAPI_SK_MASK)) {
- case ATAPI_SK_RESERVED:
- printf("atapi_error: %s - timeout error = %02x\n",
- atapi_cmd2str(atp->cmd), error & ATAPI_E_MASK);
- error = EIO;
- break;
-
- case ATAPI_SK_NO_SENSE:
- error = 0;
- break;
-
- case ATAPI_SK_RECOVERED_ERROR:
- printf("atapi_error: %s - recovered error\n", atapi_cmd2str(atp->cmd));
- error = 0;
- break;
-
- case ATAPI_SK_NOT_READY:
- atp->flags |= ATAPI_F_MEDIA_CHANGED;
- error = EBUSY;
- break;
-
- case ATAPI_SK_UNIT_ATTENTION:
- atp->flags |= ATAPI_F_MEDIA_CHANGED;
- error = EIO;
- break;
-
- default: error = EIO;
- }
+ error = request->error;
free(request, M_ATAPI);
return error;
}
@@ -497,23 +468,52 @@ op_finished:
request->flags = A_READ;
TAILQ_INSERT_HEAD(&atp->controller->atapi_queue, request, chain);
}
- else if (request->callback) {
- if (request->result)
- printf("atapi: %s - %s skey=%01x asc=%02x ascq=%02x error=%02x\n",
- atapi_cmd2str(atp->cmd), atapi_skey2str(request->sense.sense_key),
- request->sense.sense_key, request->sense.asc, request->sense.ascq,
- request->result & ATAPI_E_MASK);
-
- if (!((request->callback)(request)))
- free(request, M_ATAPI);
- }
else {
- if (request->result)
+ request->error = 0;
+ if (request->result) {
printf("atapi: %s - %s skey=%01x asc=%02x ascq=%02x error=%02x\n",
- atapi_cmd2str(atp->cmd), atapi_skey2str(request->sense.sense_key),
- request->sense.sense_key, request->sense.asc, request->sense.ascq,
- request->result & ATAPI_E_MASK);
- wakeup((caddr_t)request);
+ atapi_cmd2str(atp->cmd),
+ atapi_skey2str(request->sense.sense_key),
+ request->sense.sense_key, request->sense.asc,
+ request->sense.ascq, request->result & ATAPI_E_MASK);
+
+ switch ((request->result & ATAPI_SK_MASK)) {
+ case ATAPI_SK_RESERVED:
+ printf("atapi_error: %s - timeout error = %02x\n",
+ atapi_cmd2str(atp->cmd), request->result & ATAPI_E_MASK);
+ request->error = EIO;
+ break;
+
+ case ATAPI_SK_NO_SENSE:
+ request->error = 0;
+ break;
+
+ case ATAPI_SK_RECOVERED_ERROR:
+ printf("atapi_error: %s - recovered error\n",
+ atapi_cmd2str(atp->cmd));
+ request->error = 0;
+ break;
+
+ case ATAPI_SK_NOT_READY:
+ atp->flags |= ATAPI_F_MEDIA_CHANGED;
+ request->error = EBUSY;
+ break;
+
+ case ATAPI_SK_UNIT_ATTENTION:
+ atp->flags |= ATAPI_F_MEDIA_CHANGED;
+ request->error = EIO;
+ break;
+
+ default:
+ request->error = EIO;
+ }
+ }
+ if (request->callback) {
+ if (!((request->callback)(request)))
+ free(request, M_ATAPI);
+ }
+ else
+ wakeup((caddr_t)request);
}
#ifdef ATAPI_DEBUG
printf("atapi_interrupt: error=0x%02x\n", request->result);
diff --git a/sys/dev/ata/atapi-all.h b/sys/dev/ata/atapi-all.h
index 6ef75c3..7fa123a 100644
--- a/sys/dev/ata/atapi-all.h
+++ b/sys/dev/ata/atapi-all.h
@@ -253,6 +253,7 @@ struct atapi_request {
struct callout_handle timeout_handle; /* handle for untimeout */
int32_t retries; /* retry count */
int32_t result; /* result of this cmd */
+ int32_t error; /* result translated to errno */
struct atapi_reqsense sense; /* sense data if error */
int32_t flags;
#define A_READ 0x0001
diff --git a/sys/dev/ata/atapi-cd.c b/sys/dev/ata/atapi-cd.c
index edaa58a..5e01911 100644
--- a/sys/dev/ata/atapi-cd.c
+++ b/sys/dev/ata/atapi-cd.c
@@ -416,6 +416,9 @@ acdopen(dev_t dev, int32_t flags, int32_t fmt, struct proc *p)
{
struct acd_softc *cdp = dev->si_drv1;
+ if (!cdp)
+ return ENXIO;
+
if (cdp->flags & F_WRITING)
return EBUSY;
@@ -1091,10 +1094,9 @@ acd_done(struct atapi_request *request)
{
struct buf *bp = request->bp;
struct acd_softc *cdp = request->driver;
- int32_t error = request->result;
- if (error) {
- bp->b_error = error;
+ if (request->error) {
+ bp->b_error = request->error;
bp->b_flags |= B_ERROR;
}
else {
diff --git a/sys/dev/ata/atapi-fd.c b/sys/dev/ata/atapi-fd.c
index f514443..a58e6bd 100644
--- a/sys/dev/ata/atapi-fd.c
+++ b/sys/dev/ata/atapi-fd.c
@@ -331,8 +331,8 @@ afd_partial_done(struct atapi_request *request)
{
struct buf *bp = request->bp;
- if (request->result) {
- bp->b_error = request->result;
+ if (request->error) {
+ bp->b_error = request->error;
bp->b_flags |= B_ERROR;
}
bp->b_resid += request->bytecount;
@@ -345,8 +345,8 @@ afd_done(struct atapi_request *request)
struct buf *bp = request->bp;
struct afd_softc *fdp = request->driver;
- if (request->result || (bp->b_flags & B_ERROR)) {
- bp->b_error = request->result;
+ if (request->error || (bp->b_flags & B_ERROR)) {
+ bp->b_error = request->error;
bp->b_flags |= B_ERROR;
}
else
diff --git a/sys/dev/ata/atapi-tape.c b/sys/dev/ata/atapi-tape.c
index 99c02e4..70fcbc9 100644
--- a/sys/dev/ata/atapi-tape.c
+++ b/sys/dev/ata/atapi-tape.c
@@ -227,6 +227,9 @@ astopen(dev_t dev, int32_t flags, int32_t fmt, struct proc *p)
{
struct ast_softc *stp = dev->si_drv1;
+ if (!stp)
+ return ENXIO;
+
if (stp->flags == F_OPEN)
return EBUSY;
@@ -469,10 +472,9 @@ ast_done(struct atapi_request *request)
{
struct buf *bp = request->bp;
struct ast_softc *stp = request->driver;
- int32_t error = request->result;
- if (error) {
- bp->b_error = error;
+ if (request->error) {
+ bp->b_error = request->error;
bp->b_flags |= B_ERROR;
}
else {
OpenPOWER on IntegriCloud