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:
parent
1595890a1f
commit
21a69f7c65
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user