ide-cd: factor out ioctl handlers from ide_cdrom_audio_ioctl()

Signed-off-by: NBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
上级 972560fb
...@@ -1998,6 +1998,24 @@ static int cdrom_read_toc(ide_drive_t *drive, struct request_sense *sense) ...@@ -1998,6 +1998,24 @@ static int cdrom_read_toc(ide_drive_t *drive, struct request_sense *sense)
return 0; return 0;
} }
static int ide_cd_read_tochdr(ide_drive_t *drive, void *arg)
{
struct cdrom_info *cd = drive->driver_data;
struct cdrom_tochdr *tochdr = arg;
struct atapi_toc *toc;
int stat;
/* Make sure our saved TOC is valid. */
stat = cdrom_read_toc(drive, NULL);
if (stat)
return stat;
toc = cd->toc;
tochdr->cdth_trk0 = toc->hdr.first_track;
tochdr->cdth_trk1 = toc->hdr.last_track;
return 0;
}
static int cdrom_read_subchannel(ide_drive_t *drive, int format, char *buf, static int cdrom_read_subchannel(ide_drive_t *drive, int format, char *buf,
int buflen, struct request_sense *sense) int buflen, struct request_sense *sense)
...@@ -2092,6 +2110,55 @@ static int cdrom_get_toc_entry(ide_drive_t *drive, int track, ...@@ -2092,6 +2110,55 @@ static int cdrom_get_toc_entry(ide_drive_t *drive, int track,
return 0; return 0;
} }
static int ide_cd_read_tocentry(ide_drive_t *drive, void *arg)
{
struct cdrom_tocentry *tocentry = arg;
struct atapi_toc_entry *toce;
int stat;
stat = cdrom_get_toc_entry(drive, tocentry->cdte_track, &toce);
if (stat)
return stat;
tocentry->cdte_ctrl = toce->control;
tocentry->cdte_adr = toce->adr;
if (tocentry->cdte_format == CDROM_MSF) {
lba_to_msf(toce->addr.lba,
&tocentry->cdte_addr.msf.minute,
&tocentry->cdte_addr.msf.second,
&tocentry->cdte_addr.msf.frame);
} else
tocentry->cdte_addr.lba = toce->addr.lba;
return 0;
}
static int ide_cd_fake_play_trkind(ide_drive_t *drive, void *arg)
{
struct cdrom_ti *ti = arg;
struct atapi_toc_entry *first_toc, *last_toc;
unsigned long lba_start, lba_end;
int stat;
stat = cdrom_get_toc_entry(drive, ti->cdti_trk0, &first_toc);
if (stat)
return stat;
stat = cdrom_get_toc_entry(drive, ti->cdti_trk1, &last_toc);
if (stat)
return stat;
if (ti->cdti_trk1 != CDROM_LEADOUT)
++last_toc;
lba_start = first_toc->addr.lba;
lba_end = last_toc->addr.lba;
if (lba_end <= lba_start)
return -EINVAL;
return cdrom_play_audio(drive, lba_start, lba_end);
}
/* the generic packet interface to cdrom.c */ /* the generic packet interface to cdrom.c */
static int ide_cdrom_packet(struct cdrom_device_info *cdi, static int ide_cdrom_packet(struct cdrom_device_info *cdi,
struct packet_command *cgc) struct packet_command *cgc)
...@@ -2123,81 +2190,22 @@ static int ide_cdrom_packet(struct cdrom_device_info *cdi, ...@@ -2123,81 +2190,22 @@ static int ide_cdrom_packet(struct cdrom_device_info *cdi,
return cgc->stat; return cgc->stat;
} }
static static int ide_cdrom_audio_ioctl(struct cdrom_device_info *cdi,
int ide_cdrom_audio_ioctl (struct cdrom_device_info *cdi, unsigned int cmd, void *arg)
unsigned int cmd, void *arg)
{ {
ide_drive_t *drive = cdi->handle; ide_drive_t *drive = cdi->handle;
struct cdrom_info *info = drive->driver_data;
int stat;
switch (cmd) { switch (cmd) {
/* /*
* emulate PLAY_AUDIO_TI command with PLAY_AUDIO_10, since * emulate PLAY_AUDIO_TI command with PLAY_AUDIO_10, since
* atapi doesn't support it * atapi doesn't support it
*/ */
case CDROMPLAYTRKIND: { case CDROMPLAYTRKIND:
unsigned long lba_start, lba_end; return ide_cd_fake_play_trkind(drive, arg);
struct cdrom_ti *ti = arg; case CDROMREADTOCHDR:
struct atapi_toc_entry *first_toc, *last_toc; return ide_cd_read_tochdr(drive, arg);
case CDROMREADTOCENTRY:
stat = cdrom_get_toc_entry(drive, ti->cdti_trk0, &first_toc); return ide_cd_read_tocentry(drive, arg);
if (stat)
return stat;
stat = cdrom_get_toc_entry(drive, ti->cdti_trk1, &last_toc);
if (stat)
return stat;
if (ti->cdti_trk1 != CDROM_LEADOUT)
++last_toc;
lba_start = first_toc->addr.lba;
lba_end = last_toc->addr.lba;
if (lba_end <= lba_start)
return -EINVAL;
return cdrom_play_audio(drive, lba_start, lba_end);
}
case CDROMREADTOCHDR: {
struct cdrom_tochdr *tochdr = arg;
struct atapi_toc *toc;
/* Make sure our saved TOC is valid. */
stat = cdrom_read_toc(drive, NULL);
if (stat)
return stat;
toc = info->toc;
tochdr->cdth_trk0 = toc->hdr.first_track;
tochdr->cdth_trk1 = toc->hdr.last_track;
return 0;
}
case CDROMREADTOCENTRY: {
struct cdrom_tocentry *tocentry = arg;
struct atapi_toc_entry *toce;
stat = cdrom_get_toc_entry(drive, tocentry->cdte_track, &toce);
if (stat)
return stat;
tocentry->cdte_ctrl = toce->control;
tocentry->cdte_adr = toce->adr;
if (tocentry->cdte_format == CDROM_MSF) {
lba_to_msf (toce->addr.lba,
&tocentry->cdte_addr.msf.minute,
&tocentry->cdte_addr.msf.second,
&tocentry->cdte_addr.msf.frame);
} else
tocentry->cdte_addr.lba = toce->addr.lba;
return 0;
}
default: default:
return -EINVAL; return -EINVAL;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册