diff -ur --exclude-from /home/axboe/exclude /opt/kernel/linux-2.2.18-pre3/drivers/block/ide-cd.c linux/drivers/block/ide-cd.c --- /opt/kernel/linux-2.2.18-pre3/drivers/block/ide-cd.c Mon Sep 4 23:03:34 2000 +++ linux/drivers/block/ide-cd.c Tue Sep 5 00:19:01 2000 @@ -1827,6 +1827,20 @@ return cdrom_queue_packet_command(drive, &pc); } +static int cdrom_play_audio(ide_drive_t *drive, int lba_start, int lba_end) +{ + struct request_sense sense; + struct packet_command pc; + + memset(&pc, 0, sizeof (pc)); + pc.sense = &sense; + + pc.c[0] = GPCMD_PLAY_AUDIO_10; + put_unaligned(cpu_to_be32(lba_start), (unsigned int *) &pc.c[2]); + put_unaligned(cpu_to_be16(lba_end - lba_start), (unsigned int *) &pc.c[7]); + + return cdrom_queue_packet_command(drive, &pc); +} static int cdrom_get_toc_entry(ide_drive_t *drive, int track, struct atapi_toc_entry **ent) @@ -1932,6 +1946,34 @@ struct cdrom_info *info = drive->driver_data; switch (cmd) { + /* + * emulate PLAY_AUDIO_TI command with PLAY_AUDIO_10, since + * atapi doesn't support it + */ + case CDROMPLAYTRKIND: { + int stat, lba_start, lba_end; + struct cdrom_ti *ti = (struct cdrom_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: { int stat; struct cdrom_tochdr *tochdr = (struct cdrom_tochdr *) arg; diff -ur --exclude-from /home/axboe/exclude /opt/kernel/linux-2.2.18-pre3/drivers/cdrom/cdrom.c linux/drivers/cdrom/cdrom.c --- /opt/kernel/linux-2.2.18-pre3/drivers/cdrom/cdrom.c Mon Sep 4 23:03:34 2000 +++ linux/drivers/cdrom/cdrom.c Tue Sep 5 00:03:36 2000 @@ -1966,19 +1966,6 @@ /* cdinfo(CD_DO_IOCTL, "CDROMSUBCHNL successful\n"); */ return 0; } - case CDROMPLAYTRKIND: { - struct cdrom_ti ti; - - cdinfo(CD_DO_IOCTL, "entering CDROMPLAYTRKIND\n"); - IOCTL_IN(arg, struct cdrom_ti, ti); - - cgc.cmd[0] = GPCMD_PLAY_AUDIO_TI; - cgc.cmd[4] = ti.cdti_trk0; - cgc.cmd[5] = ti.cdti_ind0; - cgc.cmd[7] = ti.cdti_trk1; - cgc.cmd[8] = ti.cdti_ind1; - return cdo->generic_packet(cdi, &cgc); - } case CDROMPLAYMSF: { struct cdrom_msf msf; cdinfo(CD_DO_IOCTL, "entering CDROMPLAYMSF\n");