Date: Wed, 11 Sep 2002 14:25:14 +0200 From: neologism <neologism@seznam.cz> To: FreeBSD-gnats-submit@FreeBSD.org Subject: kern/42659: atapi cd-rom mounting patch Message-ID: <20020911142514.A516@variola>
next in thread | raw e-mail | index | archive | help
>Number: 42659
>Category: kern
>Synopsis: atapi cd-rom mounting patch
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: update
>Submitter-Id: current-users
>Arrival-Date: Wed Sep 11 09:10:01 PDT 2002
>Closed-Date:
>Last-Modified:
>Originator: neologism
>Release: FreeBSD 4.6-RELEASE i386
>Organization:
none
>Environment:
System: FreeBSD variola 4.6-RELEASE FreeBSD 4.6-RELEASE #10: Sat Sep 7 12:15:31 GMT 2002 root@variola:/mnt/linux/bsd/compile/MYKERNEL i386
>Description:
Attempt to mount cd-rom in atapi cd-rom drive when cd is still loading leads to
an error message. open function of atapi cdrom-drives (acdopen) should wait
till medium is fully loaded. As linux and fbsd scsi does. This patch implements
this behaviour.
>How-To-Repeat:
this is a default behaviour for atapi cdrom drives
>Fix:
diff -urN /sys/dev/ata/atapi-cd.c ./atapi-cd.c
--- /sys/dev/ata/atapi-cd.c Wed Mar 27 19:48:37 2002
+++ ./atapi-cd.c Sat Sep 7 12:14:54 2002
@@ -86,6 +86,7 @@
static int acd_init_track(struct acd_softc *, struct cdr_track *);
static int acd_flush(struct acd_softc *);
static int acd_read_track_info(struct acd_softc *, int32_t, struct acd_track_info *);
+static int acd_get_status(struct acd_softc *);
static int acd_get_progress(struct acd_softc *, int *);
static int acd_send_cue(struct acd_softc *, struct cdr_cuesheet *);
static int acd_report_key(struct acd_softc *, struct dvd_authinfo *);
@@ -483,6 +484,9 @@
acdopen(dev_t dev, int flags, int fmt, struct proc *p)
{
struct acd_softc *cdp = dev->si_drv1;
+ int error;
+ int stat;
+ int timeout = 20*2;
if (!cdp)
return ENXIO;
@@ -491,6 +495,22 @@
if (count_dev(dev) > 1)
return EBUSY;
}
+
+ if (!cdp->changer_info) {
+ stat = acd_get_status(cdp);
+ if (stat == CD_OPEN && cdp->cap.eject) {
+ error = acd_eject(cdp, 1);
+ if (error)
+ return EIO;
+ }
+
+ while (timeout-- > 0) {
+ stat = acd_get_status(cdp);
+ if (stat == CD_LOADING)
+ tsleep (&stat, PRIBIO, "acdld", hz/2);
+ }
+ }
+
if (count_dev(dev) == 1) {
if (cdp->changer_info && cdp->slot != cdp->changer_info->current_slot) {
acd_select_slot(cdp);
@@ -1550,6 +1570,30 @@
info->fixed_packet_size = ntohl(info->fixed_packet_size);
info->track_length = ntohl(info->track_length);
return 0;
+}
+
+static int
+acd_get_status(struct acd_softc *cdp)
+{
+ struct atapi_reqsense *sense = cdp->device->result;
+ int stat;
+
+ stat=atapi_test_ready(cdp->device);
+
+ if (stat == 0 || sense->sense_key == 6)
+ return CD_OK;
+ if (sense->sense_key == 2 && sense->asc == 4 && sense->ascq == 1)
+ return CD_LOADING;
+
+ /* Mt Fuji*/
+ if (sense->sense_key == 2) {
+ if (sense->asc == 0x3a && sense->ascq == 1)
+ return CD_NODISC;
+ else
+ return CD_OPEN;
+ }
+
+ return CD_NOTREADY;
}
static int
diff -urN /sys/dev/ata/atapi-cd.h ./atapi-cd.h
--- /sys/dev/ata/atapi-cd.h Mon Mar 18 08:37:34 2002
+++ ./atapi-cd.h Thu Sep 5 14:21:42 2002
@@ -327,3 +327,9 @@
struct devstat *stats; /* devstat entry */
dev_t dev; /* device place holders */
};
+/* Defines for acd_get_status */
+#define CD_OK 0 /* CD is loaded */
+#define CD_LOADING 1 /* CD is being loaded */
+#define CD_NODISC 2 /* no disc present */
+#define CD_OPEN 3 /* tray is open */
+#define CD_NOTREADY 4 /* drive is not ready */
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020911142514.A516>
