mirror of https://gitee.com/openkylin/linux.git
ide-cd: factor out ioctl handlers from ide_cdrom_audio_ioctl()
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
This commit is contained in:
parent
972560fb9d
commit
ba3fab24d2
|
@ -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,
|
||||||
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,
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue