Loading drivers/ide/ide-cd.c +75 −67 Original line number Diff line number Diff line Loading @@ -1998,6 +1998,24 @@ static int cdrom_read_toc(ide_drive_t *drive, struct request_sense *sense) 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, int buflen, struct request_sense *sense) Loading Loading @@ -2092,6 +2110,55 @@ static int cdrom_get_toc_entry(ide_drive_t *drive, int track, 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 */ static int ide_cdrom_packet(struct cdrom_device_info *cdi, struct packet_command *cgc) Loading Loading @@ -2123,81 +2190,22 @@ static int ide_cdrom_packet(struct cdrom_device_info *cdi, return cgc->stat; } static int ide_cdrom_audio_ioctl (struct cdrom_device_info *cdi, static int ide_cdrom_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, void *arg) { ide_drive_t *drive = cdi->handle; struct cdrom_info *info = drive->driver_data; int stat; switch (cmd) { /* * emulate PLAY_AUDIO_TI command with PLAY_AUDIO_10, since * atapi doesn't support it */ case CDROMPLAYTRKIND: { unsigned long lba_start, lba_end; struct cdrom_ti *ti = arg; struct atapi_toc_entry *first_toc, *last_toc; 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); } 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; } case CDROMPLAYTRKIND: return ide_cd_fake_play_trkind(drive, arg); case CDROMREADTOCHDR: return ide_cd_read_tochdr(drive, arg); case CDROMREADTOCENTRY: return ide_cd_read_tocentry(drive, arg); default: return -EINVAL; } Loading Loading
drivers/ide/ide-cd.c +75 −67 Original line number Diff line number Diff line Loading @@ -1998,6 +1998,24 @@ static int cdrom_read_toc(ide_drive_t *drive, struct request_sense *sense) 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, int buflen, struct request_sense *sense) Loading Loading @@ -2092,6 +2110,55 @@ static int cdrom_get_toc_entry(ide_drive_t *drive, int track, 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 */ static int ide_cdrom_packet(struct cdrom_device_info *cdi, struct packet_command *cgc) Loading Loading @@ -2123,81 +2190,22 @@ static int ide_cdrom_packet(struct cdrom_device_info *cdi, return cgc->stat; } static int ide_cdrom_audio_ioctl (struct cdrom_device_info *cdi, static int ide_cdrom_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, void *arg) { ide_drive_t *drive = cdi->handle; struct cdrom_info *info = drive->driver_data; int stat; switch (cmd) { /* * emulate PLAY_AUDIO_TI command with PLAY_AUDIO_10, since * atapi doesn't support it */ case CDROMPLAYTRKIND: { unsigned long lba_start, lba_end; struct cdrom_ti *ti = arg; struct atapi_toc_entry *first_toc, *last_toc; 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); } 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; } case CDROMPLAYTRKIND: return ide_cd_fake_play_trkind(drive, arg); case CDROMREADTOCHDR: return ide_cd_read_tochdr(drive, arg); case CDROMREADTOCENTRY: return ide_cd_read_tocentry(drive, arg); default: return -EINVAL; } Loading