Index: dev/ata/atapi-cd.c =================================================================== RCS file: /home/ncvs/src/sys/dev/ata/atapi-cd.c,v retrieving revision 1.6 diff -u -r1.6 atapi-cd.c --- atapi-cd.c 1999/04/27 11:13:54 1.6 +++ atapi-cd.c 1999/04/30 07:00:57 @@ -718,8 +718,10 @@ } case CDIOCREADAUDIO: + ((struct ioc_read_cd *)addr)->data_type = CDDATA_CDDA; + case CDIOCREADCD: { - struct ioc_read_audio *args = (struct ioc_read_audio *)addr; + struct ioc_read_cd *args = (struct ioc_read_cd *)addr; int32_t lba, frames, error = 0; u_int8_t *buffer, *ubuf = args->buffer; int8_t ccb[16]; @@ -753,13 +755,13 @@ size = blocks * 2352; ccb[0] = ATAPI_READ_CD; - ccb[1] = 4; + ccb[1] = args->data_type<<2; ccb[2] = lba>>24; ccb[3] = lba>>16; ccb[4] = lba>>8; ccb[5] = lba; ccb[8] = blocks; - ccb[9] = 0xf0; + ccb[9] = 0xf8; if ((error = atapi_queue_cmd(cdp->atp, ccb, buffer, size, A_READ, NULL, NULL, NULL))) break; Index: sys/cdio.h =================================================================== RCS file: /home/ncvs/src/sys/sys/cdio.h,v retrieving revision 1.19 diff -u -r1.19 cdio.h --- cdio.h 1998/09/08 20:57:47 1.19 +++ cdio.h 1999/04/30 07:00:57 @@ -283,4 +283,24 @@ #define CDIOCREADAUDIO _IOWR('c',31,struct ioc_read_audio) +struct ioc_read_cd +{ + u_char address_format; + u_char data_type; + union msf_lba address; + int nframes; + u_char *buffer; +}; + +#define CDDATA_ANY 0 +#define CDDATA_CDDA 1 +#define CDDATA_MODE1 2 +#define CDDATA_MODE2 3 +#define CDDATA_XA1 4 +#define CDDATA_XA2 5 + +#define CDFRAMESIZE 2352 + +#define CDIOCREADCD _IOWR('c',32,struct ioc_read_cd) + #endif /* !_SYS_CDIO_H_ */ Index: i386/linux/linux_ioctl.c =================================================================== RCS file: /home/ncvs/src/sys/i386/linux/linux_ioctl.c,v retrieving revision 1.32 diff -u -r1.32 linux_ioctl.c --- linux_ioctl.c 1999/05/06 18:44:22 1.32 +++ linux_ioctl.c 1999/05/07 00:35:37 @@ -1130,6 +1130,20 @@ return error; } + case LINUX_CDROMREADRAW: { + struct linux_cdrom_msf *msf = (struct linux_cdrom_msf *)args->arg; + struct ioc_read_cd irc; + irc.data_type = CDDATA_ANY; + irc.address_format = CD_MSF_FORMAT; + irc.address.msf.minute = msf->cdmsf_min0; + irc.address.msf.second = msf->cdmsf_sec0; + irc.address.msf.frame = msf->cdmsf_frame0; + irc.nframes = 1; + irc.buffer = (u_char *)args->arg; + error = (*func)(fp, CDIOCREADCD, (caddr_t)&irc, p); + return error; + } + } uprintf("LINUX: 'ioctl' fd=%d, typ=0x%x(%c), num=0x%x not implemented\n",