diff options
author | jmg <jmg@FreeBSD.org> | 1997-04-02 09:05:43 +0000 |
---|---|---|
committer | jmg <jmg@FreeBSD.org> | 1997-04-02 09:05:43 +0000 |
commit | 993ec9ffad3c82379aaa23cfe0f537a048762e57 (patch) | |
tree | ef2d5841c0be3817e25e2c6afdb749a98cb177a4 /sys/scsi | |
parent | c04526324b8ca45a7cb2892d49e508066568a072 (diff) | |
download | FreeBSD-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.c | 38 | ||||
-rw-r--r-- | sys/scsi/scsiconf.c | 4 | ||||
-rw-r--r-- | sys/scsi/scsiconf.h | 3 |
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 /* |