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
This commit is contained in:
John-Mark Gurney 1997-04-02 09:05:43 +00:00
parent 1595890a1f
commit 21a69f7c65
3 changed files with 40 additions and 5 deletions

View File

@ -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;

View File

@ -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

View File

@ -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
/*