diff options
Diffstat (limited to 'sys/dev/atapi')
-rw-r--r-- | sys/dev/atapi/acd.c | 18 | ||||
-rw-r--r-- | sys/dev/atapi/atapilink.h | 19 |
2 files changed, 25 insertions, 12 deletions
diff --git a/sys/dev/atapi/acd.c b/sys/dev/atapi/acd.c index 8d7b862550c..702d39d11cd 100644 --- a/sys/dev/atapi/acd.c +++ b/sys/dev/atapi/acd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: acd.c,v 1.3 1996/06/09 18:42:46 downsj Exp $ */ +/* $OpenBSD: acd.c,v 1.4 1996/06/10 00:43:56 downsj Exp $ */ /* * Copyright (c) 1996 Manuel Bouyer. All rights reserved. @@ -37,6 +37,7 @@ #include <sys/file.h> #include <sys/stat.h> #include <sys/ioctl.h> +#include <sys/mtio.h> #include <sys/buf.h> #include <sys/uio.h> #include <sys/malloc.h> @@ -350,6 +351,12 @@ acdclose(dev, flag, fmt) atapi_prevent(acd->ad_link, PR_ALLOW); acd->ad_link->flags &= ~ADEV_OPEN; + + if (acd->ad_link->flags & ADEV_EJECTING) { + atapi_start_stop(acd->ad_link, SSS_STOP|SSS_LOEJ, 0); + + acd->ad_link->flags &= ~ADEV_EJECTING; + } } acdunlock(acd); @@ -873,9 +880,14 @@ acdioctl(dev, cmd, addr, flag, p) case CDIOCSTOP: return atapi_start_stop(acd->ad_link, SSS_STOP, 0); - case CDIOCEJECT: + case MTIOCTOP: + if (((struct mtop *)addr)->mt_op != MTOFFL) + return EIO; + /* FALLTHROUGH */ + case CDIOCEJECT: /* FALLTHROUGH */ case DIOCEJECT: - return atapi_start_stop(acd->ad_link, SSS_STOP|SSS_LOEJ, 0); + acd->ad_link->flags |= ADEV_EJECTING; + return 0; case CDIOCALLOW: return atapi_prevent(acd->ad_link, PR_ALLOW); diff --git a/sys/dev/atapi/atapilink.h b/sys/dev/atapi/atapilink.h index 22a5d880dee..d8791f97ce3 100644 --- a/sys/dev/atapi/atapilink.h +++ b/sys/dev/atapi/atapilink.h @@ -1,4 +1,4 @@ -/* $OpenBSD: atapilink.h,v 1.2 1996/06/09 08:59:50 downsj Exp $ */ +/* $OpenBSD: atapilink.h,v 1.3 1996/06/10 00:43:57 downsj Exp $ */ /* * Copyright (c) 1996 Manuel Bouyer. All rights reserved. @@ -140,14 +140,15 @@ struct at_dev_link { struct atapi_identify id; struct bus_link *bus; u_int16_t flags; -#define ADEV_REMOVABLE 0x001 /* media is removable */ -#define ADEV_MEDIA_LOADED 0x002 /* device figures are still valid */ -#define ADEV_WAITING 0x004 /* a process is waiting for this */ -#define ADEV_OPEN 0x008 /* at least 1 open session */ -#define ACAP_DRQ_MPROC 0x000 /* microprocessor DRQ */ -#define ACAP_DRQ_INTR 0x100 /* interrupt DRQ */ -#define ACAP_DRQ_ACCEL 0x200 /* accelerated DRQ */ -#define ACAP_LEN 0x400 /* 16 bit commands */ +#define ADEV_REMOVABLE 0x0001 /* media is removable */ +#define ADEV_MEDIA_LOADED 0x0002 /* device figures are still valid */ +#define ADEV_WAITING 0x0004 /* a process is waiting for this */ +#define ADEV_OPEN 0x0008 /* at least 1 open session */ +#define ADEV_EJECTING 0x0010 /* eject on close */ +#define ACAP_DRQ_MPROC 0x0000 /* microprocessor DRQ */ +#define ACAP_DRQ_INTR 0x0100 /* interrupt DRQ */ +#define ACAP_DRQ_ACCEL 0x0200 /* accelerated DRQ */ +#define ACAP_LEN 0x0400 /* 16 bit commands */ void (*start)(); /* device start routine */ int (*done)(); /* device done routine */ }; |