summaryrefslogtreecommitdiffstats
path: root/sys/scsi
diff options
context:
space:
mode:
authorjmg <jmg@FreeBSD.org>1997-04-02 09:05:43 +0000
committerjmg <jmg@FreeBSD.org>1997-04-02 09:05:43 +0000
commit993ec9ffad3c82379aaa23cfe0f537a048762e57 (patch)
treeef2d5841c0be3817e25e2c6afdb749a98cb177a4 /sys/scsi
parentc04526324b8ca45a7cb2892d49e508066568a072 (diff)
downloadFreeBSD-src-993ec9ffad3c82379aaa23cfe0f537a048762e57.zip
FreeBSD-src-993ec9ffad3c82379aaa23cfe0f537a048762e57.tar.gz
add a cd quirk flag CD_Q_BCD_TRACKS, that will convert bcd2bin the track
id's from broken scsi cdrom drives like my Chinon... plus update the quirk entry for it :) Closes my own PR#2423
Diffstat (limited to 'sys/scsi')
-rw-r--r--sys/scsi/cd.c38
-rw-r--r--sys/scsi/scsiconf.c4
-rw-r--r--sys/scsi/scsiconf.h3
3 files changed, 40 insertions, 5 deletions
diff --git a/sys/scsi/cd.c b/sys/scsi/cd.c
index 976c37a..f643c37 100644
--- a/sys/scsi/cd.c
+++ b/sys/scsi/cd.c
@@ -14,7 +14,7 @@
*
* Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
*
- * $Id: cd.c,v 1.80 1997/03/23 06:33:44 bde Exp $
+ * $Id: cd.c,v 1.81 1997/03/24 11:24:54 bde Exp $
*/
#include "opt_bounce.h"
@@ -636,6 +636,10 @@ cd_ioctl(dev_t dev, int cmd, caddr_t addr, int flag, struct proc *p,
error = cd_set_mode(unit, &data);
if (error)
break;
+ if (sc_link->quirks & CD_Q_BCD_TRACKS) {
+ args->start_track = bin2bcd(args->start_track);
+ args->end_track = bin2bcd(args->end_track);
+ }
return (cd_play_tracks(unit
,args->start_track
,args->start_index
@@ -695,10 +699,15 @@ cd_ioctl(dev_t dev, int cmd, caddr_t addr, int flag, struct proc *p,
error = EINVAL;
break;
}
+ if (sc_link->quirks & CD_Q_BCD_TRACKS)
+ args->track = bin2bcd(args->track);
error = cd_read_subchannel(unit, args->address_format,
args->data_format, args->track, &data, len);
if (error)
- break;
+ break;
+ if (sc_link->quirks & CD_Q_BCD_TRACKS)
+ data.what.track_info.track_number =
+ bcd2bin(data.what.track_info.track_number);
len = min(len, ((data.header.data_len[0] << 8) +
data.header.data_len[1] +
sizeof(struct cd_sub_channel_header)));
@@ -714,6 +723,13 @@ cd_ioctl(dev_t dev, int cmd, caddr_t addr, int flag, struct proc *p,
(struct cd_toc_entry *)&th, sizeof th);
if (error)
break;
+ if (sc_link->quirks & CD_Q_BCD_TRACKS) {
+ /* we are going to have to convert the BCD
+ * encoding on the cd to what is expected
+ */
+ th.starting_track = bcd2bin(th.starting_track);
+ th.ending_track = bcd2bin(th.ending_track);
+ }
NTOHS(th.len);
bcopy(&th, addr, sizeof th);
}
@@ -749,6 +765,15 @@ cd_ioctl(dev_t dev, int cmd, caddr_t addr, int flag, struct proc *p,
if (error)
break;
+ if (sc_link->quirks & CD_Q_BCD_TRACKS) {
+ /* we are going to have to convert the BCD
+ * encoding on the cd to what is expected
+ */
+ th->starting_track =
+ bcd2bin(th->starting_track);
+ th->ending_track = bcd2bin(th->ending_track);
+ }
+
if (starting_track == 0)
starting_track = th->starting_track;
else if (starting_track == LEADOUT)
@@ -787,6 +812,8 @@ cd_ioctl(dev_t dev, int cmd, caddr_t addr, int flag, struct proc *p,
/* make leadout entry if needed */
idx = starting_track + num - 1;
+ if (sc_link->quirks & CD_Q_BCD_TRACKS)
+ th->ending_track = bcd2bin(th->ending_track);
if (idx == th->ending_track + 1) {
error = cd_read_toc(unit, te->address_format,
LEADOUT,
@@ -797,6 +824,13 @@ cd_ioctl(dev_t dev, int cmd, caddr_t addr, int flag, struct proc *p,
data.entries[idx - starting_track] = lead.entry;
}
+ if (sc_link->quirks & CD_Q_BCD_TRACKS) {
+ for (idx = 0; idx < num - 1; idx++) {
+ data.entries[idx].track =
+ bcd2bin(data.entries[idx].track);
+ }
+ }
+
error = copyout(data.entries, te->data, len);
}
break;
diff --git a/sys/scsi/scsiconf.c b/sys/scsi/scsiconf.c
index 97464ac..f48673d 100644
--- a/sys/scsi/scsiconf.c
+++ b/sys/scsi/scsiconf.c
@@ -16,7 +16,7 @@
*
* New configuration setup: dufault@hda.com
*
- * $Id: scsiconf.c,v 1.82 1997/03/23 06:33:49 bde Exp $
+ * $Id: scsiconf.c,v 1.83 1997/04/01 19:28:03 joerg Exp $
*/
#include "opt_scsi.h"
@@ -351,7 +351,7 @@ static struct scsidevs knowndevs[] =
},
{
T_READONLY, T_READONLY, T_REMOV, "CHINON", "CD-ROM CDS-535","*",
- "cd", SC_ONE_LU
+ "cd", SC_ONE_LU, CD_Q_BCD_TRACKS
},
/*
* Note: My drive with v1.0 firmware "forgets" to generate scsi parity
diff --git a/sys/scsi/scsiconf.h b/sys/scsi/scsiconf.h
index 34474ff..ef45d67 100644
--- a/sys/scsi/scsiconf.h
+++ b/sys/scsi/scsiconf.h
@@ -14,7 +14,7 @@
*
* Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
*
- * $Id: scsiconf.h,v 1.50 1997/02/22 09:44:35 peter Exp $
+ * $Id: scsiconf.h,v 1.51 1997/03/23 06:33:50 bde Exp $
*/
#ifndef SCSI_SCSICONF_H
#define SCSI_SCSICONF_H 1
@@ -273,6 +273,7 @@ typedef struct st_mode st_modes[4];
/* cd specific CD_Q_* */
#define CD_Q_NO_TOUCH 0x0001
+#define CD_Q_BCD_TRACKS 0x0002
/*
OpenPOWER on IntegriCloud