0001
0002 #include <linux/kernel.h>
0003 #include <linux/mm.h>
0004 #include <linux/fs.h>
0005 #include <linux/errno.h>
0006 #include <linux/string.h>
0007 #include <linux/blkdev.h>
0008 #include <linux/module.h>
0009 #include <linux/blkpg.h>
0010 #include <linux/cdrom.h>
0011 #include <linux/delay.h>
0012 #include <linux/slab.h>
0013 #include <asm/io.h>
0014 #include <linux/uaccess.h>
0015
0016 #include <scsi/scsi.h>
0017 #include <scsi/scsi_dbg.h>
0018 #include <scsi/scsi_device.h>
0019 #include <scsi/scsi_eh.h>
0020 #include <scsi/scsi_host.h>
0021 #include <scsi/scsi_ioctl.h>
0022 #include <scsi/scsi_cmnd.h>
0023
0024 #include "sr.h"
0025
0026 #if 0
0027 #define DEBUG
0028 #endif
0029
0030
0031
0032 static int xa_test = 0;
0033
0034 module_param(xa_test, int, S_IRUGO | S_IWUSR);
0035
0036 static int sr_read_tochdr(struct cdrom_device_info *cdi,
0037 struct cdrom_tochdr *tochdr)
0038 {
0039 struct scsi_cd *cd = cdi->handle;
0040 struct packet_command cgc;
0041 int result;
0042 unsigned char *buffer;
0043
0044 buffer = kzalloc(32, GFP_KERNEL);
0045 if (!buffer)
0046 return -ENOMEM;
0047
0048 memset(&cgc, 0, sizeof(struct packet_command));
0049 cgc.timeout = IOCTL_TIMEOUT;
0050 cgc.cmd[0] = GPCMD_READ_TOC_PMA_ATIP;
0051 cgc.cmd[8] = 12;
0052 cgc.buffer = buffer;
0053 cgc.buflen = 12;
0054 cgc.quiet = 1;
0055 cgc.data_direction = DMA_FROM_DEVICE;
0056
0057 result = sr_do_ioctl(cd, &cgc);
0058 if (result)
0059 goto err;
0060
0061 tochdr->cdth_trk0 = buffer[2];
0062 tochdr->cdth_trk1 = buffer[3];
0063
0064 err:
0065 kfree(buffer);
0066 return result;
0067 }
0068
0069 static int sr_read_tocentry(struct cdrom_device_info *cdi,
0070 struct cdrom_tocentry *tocentry)
0071 {
0072 struct scsi_cd *cd = cdi->handle;
0073 struct packet_command cgc;
0074 int result;
0075 unsigned char *buffer;
0076
0077 buffer = kzalloc(32, GFP_KERNEL);
0078 if (!buffer)
0079 return -ENOMEM;
0080
0081 memset(&cgc, 0, sizeof(struct packet_command));
0082 cgc.timeout = IOCTL_TIMEOUT;
0083 cgc.cmd[0] = GPCMD_READ_TOC_PMA_ATIP;
0084 cgc.cmd[1] |= (tocentry->cdte_format == CDROM_MSF) ? 0x02 : 0;
0085 cgc.cmd[6] = tocentry->cdte_track;
0086 cgc.cmd[8] = 12;
0087 cgc.buffer = buffer;
0088 cgc.buflen = 12;
0089 cgc.data_direction = DMA_FROM_DEVICE;
0090
0091 result = sr_do_ioctl(cd, &cgc);
0092 if (result)
0093 goto err;
0094
0095 tocentry->cdte_ctrl = buffer[5] & 0xf;
0096 tocentry->cdte_adr = buffer[5] >> 4;
0097 tocentry->cdte_datamode = (tocentry->cdte_ctrl & 0x04) ? 1 : 0;
0098 if (tocentry->cdte_format == CDROM_MSF) {
0099 tocentry->cdte_addr.msf.minute = buffer[9];
0100 tocentry->cdte_addr.msf.second = buffer[10];
0101 tocentry->cdte_addr.msf.frame = buffer[11];
0102 } else
0103 tocentry->cdte_addr.lba = (((((buffer[8] << 8) + buffer[9]) << 8)
0104 + buffer[10]) << 8) + buffer[11];
0105
0106 err:
0107 kfree(buffer);
0108 return result;
0109 }
0110
0111 #define IOCTL_RETRIES 3
0112
0113
0114
0115
0116
0117 static int sr_fake_playtrkind(struct cdrom_device_info *cdi, struct cdrom_ti *ti)
0118 {
0119 struct cdrom_tocentry trk0_te, trk1_te;
0120 struct cdrom_tochdr tochdr;
0121 struct packet_command cgc;
0122 int ntracks, ret;
0123
0124 ret = sr_read_tochdr(cdi, &tochdr);
0125 if (ret)
0126 return ret;
0127
0128 ntracks = tochdr.cdth_trk1 - tochdr.cdth_trk0 + 1;
0129
0130 if (ti->cdti_trk1 == ntracks)
0131 ti->cdti_trk1 = CDROM_LEADOUT;
0132 else if (ti->cdti_trk1 != CDROM_LEADOUT)
0133 ti->cdti_trk1 ++;
0134
0135 trk0_te.cdte_track = ti->cdti_trk0;
0136 trk0_te.cdte_format = CDROM_MSF;
0137 trk1_te.cdte_track = ti->cdti_trk1;
0138 trk1_te.cdte_format = CDROM_MSF;
0139
0140 ret = sr_read_tocentry(cdi, &trk0_te);
0141 if (ret)
0142 return ret;
0143 ret = sr_read_tocentry(cdi, &trk1_te);
0144 if (ret)
0145 return ret;
0146
0147 memset(&cgc, 0, sizeof(struct packet_command));
0148 cgc.cmd[0] = GPCMD_PLAY_AUDIO_MSF;
0149 cgc.cmd[3] = trk0_te.cdte_addr.msf.minute;
0150 cgc.cmd[4] = trk0_te.cdte_addr.msf.second;
0151 cgc.cmd[5] = trk0_te.cdte_addr.msf.frame;
0152 cgc.cmd[6] = trk1_te.cdte_addr.msf.minute;
0153 cgc.cmd[7] = trk1_te.cdte_addr.msf.second;
0154 cgc.cmd[8] = trk1_te.cdte_addr.msf.frame;
0155 cgc.data_direction = DMA_NONE;
0156 cgc.timeout = IOCTL_TIMEOUT;
0157 return sr_do_ioctl(cdi->handle, &cgc);
0158 }
0159
0160 static int sr_play_trkind(struct cdrom_device_info *cdi,
0161 struct cdrom_ti *ti)
0162
0163 {
0164 struct scsi_cd *cd = cdi->handle;
0165 struct packet_command cgc;
0166 int result;
0167
0168 memset(&cgc, 0, sizeof(struct packet_command));
0169 cgc.timeout = IOCTL_TIMEOUT;
0170 cgc.cmd[0] = GPCMD_PLAYAUDIO_TI;
0171 cgc.cmd[4] = ti->cdti_trk0;
0172 cgc.cmd[5] = ti->cdti_ind0;
0173 cgc.cmd[7] = ti->cdti_trk1;
0174 cgc.cmd[8] = ti->cdti_ind1;
0175 cgc.data_direction = DMA_NONE;
0176
0177 result = sr_do_ioctl(cd, &cgc);
0178 if (result == -EDRIVE_CANT_DO_THIS)
0179 result = sr_fake_playtrkind(cdi, ti);
0180
0181 return result;
0182 }
0183
0184
0185
0186
0187
0188 int sr_do_ioctl(Scsi_CD *cd, struct packet_command *cgc)
0189 {
0190 struct scsi_device *SDev;
0191 struct scsi_sense_hdr local_sshdr, *sshdr = &local_sshdr;
0192 int result, err = 0, retries = 0;
0193
0194 SDev = cd->device;
0195
0196 if (cgc->sshdr)
0197 sshdr = cgc->sshdr;
0198
0199 retry:
0200 if (!scsi_block_when_processing_errors(SDev)) {
0201 err = -ENODEV;
0202 goto out;
0203 }
0204
0205 result = scsi_execute(SDev, cgc->cmd, cgc->data_direction,
0206 cgc->buffer, cgc->buflen, NULL, sshdr,
0207 cgc->timeout, IOCTL_RETRIES, 0, 0, NULL);
0208
0209
0210 if (result < 0) {
0211 err = result;
0212 goto out;
0213 }
0214 if (scsi_status_is_check_condition(result)) {
0215 switch (sshdr->sense_key) {
0216 case UNIT_ATTENTION:
0217 SDev->changed = 1;
0218 if (!cgc->quiet)
0219 sr_printk(KERN_INFO, cd,
0220 "disc change detected.\n");
0221 if (retries++ < 10)
0222 goto retry;
0223 err = -ENOMEDIUM;
0224 break;
0225 case NOT_READY:
0226 if (sshdr->asc == 0x04 &&
0227 sshdr->ascq == 0x01) {
0228
0229 if (!cgc->quiet)
0230 sr_printk(KERN_INFO, cd,
0231 "CDROM not ready yet.\n");
0232 if (retries++ < 10) {
0233
0234 ssleep(2);
0235 goto retry;
0236 } else {
0237
0238 err = -ENOMEDIUM;
0239 break;
0240 }
0241 }
0242 if (!cgc->quiet)
0243 sr_printk(KERN_INFO, cd,
0244 "CDROM not ready. Make sure there "
0245 "is a disc in the drive.\n");
0246 err = -ENOMEDIUM;
0247 break;
0248 case ILLEGAL_REQUEST:
0249 err = -EIO;
0250 if (sshdr->asc == 0x20 &&
0251 sshdr->ascq == 0x00)
0252
0253 err = -EDRIVE_CANT_DO_THIS;
0254 break;
0255 default:
0256 err = -EIO;
0257 }
0258 }
0259
0260
0261 out:
0262 cgc->stat = err;
0263 return err;
0264 }
0265
0266
0267
0268
0269 int sr_tray_move(struct cdrom_device_info *cdi, int pos)
0270 {
0271 Scsi_CD *cd = cdi->handle;
0272 struct packet_command cgc;
0273
0274 memset(&cgc, 0, sizeof(struct packet_command));
0275 cgc.cmd[0] = GPCMD_START_STOP_UNIT;
0276 cgc.cmd[4] = (pos == 0) ? 0x03 : 0x02 ;
0277 cgc.data_direction = DMA_NONE;
0278 cgc.timeout = IOCTL_TIMEOUT;
0279 return sr_do_ioctl(cd, &cgc);
0280 }
0281
0282 int sr_lock_door(struct cdrom_device_info *cdi, int lock)
0283 {
0284 Scsi_CD *cd = cdi->handle;
0285
0286 return scsi_set_medium_removal(cd->device, lock ?
0287 SCSI_REMOVAL_PREVENT : SCSI_REMOVAL_ALLOW);
0288 }
0289
0290 int sr_drive_status(struct cdrom_device_info *cdi, int slot)
0291 {
0292 struct scsi_cd *cd = cdi->handle;
0293 struct scsi_sense_hdr sshdr;
0294 struct media_event_desc med;
0295
0296 if (CDSL_CURRENT != slot) {
0297
0298 return -EINVAL;
0299 }
0300 if (!scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr))
0301 return CDS_DISC_OK;
0302
0303
0304 if (scsi_sense_valid(&sshdr) && sshdr.sense_key == NOT_READY
0305 && sshdr.asc == 0x04 && sshdr.ascq == 0x01)
0306 return CDS_DRIVE_NOT_READY;
0307
0308 if (!cdrom_get_media_event(cdi, &med)) {
0309 if (med.media_present)
0310 return CDS_DISC_OK;
0311 else if (med.door_open)
0312 return CDS_TRAY_OPEN;
0313 else
0314 return CDS_NO_DISC;
0315 }
0316
0317
0318
0319
0320
0321
0322 if (scsi_sense_valid(&sshdr) && sshdr.sense_key == NOT_READY
0323 && sshdr.asc == 0x04 && sshdr.ascq == 0x02)
0324 return CDS_TRAY_OPEN;
0325
0326
0327
0328
0329 if (sshdr.sense_key == NOT_READY && sshdr.asc == 0x04)
0330 return CDS_DISC_OK;
0331
0332
0333
0334
0335
0336
0337 if (scsi_sense_valid(&sshdr) &&
0338
0339 sshdr.asc == 0x3a)
0340 return CDS_NO_DISC;
0341 else
0342 return CDS_TRAY_OPEN;
0343
0344 return CDS_DRIVE_NOT_READY;
0345 }
0346
0347 int sr_disk_status(struct cdrom_device_info *cdi)
0348 {
0349 Scsi_CD *cd = cdi->handle;
0350 struct cdrom_tochdr toc_h;
0351 struct cdrom_tocentry toc_e;
0352 int i, rc, have_datatracks = 0;
0353
0354
0355 rc = sr_read_tochdr(cdi, &toc_h);
0356 if (rc)
0357 return (rc == -ENOMEDIUM) ? CDS_NO_DISC : CDS_NO_INFO;
0358
0359 for (i = toc_h.cdth_trk0; i <= toc_h.cdth_trk1; i++) {
0360 toc_e.cdte_track = i;
0361 toc_e.cdte_format = CDROM_LBA;
0362 if (sr_read_tocentry(cdi, &toc_e))
0363 return CDS_NO_INFO;
0364 if (toc_e.cdte_ctrl & CDROM_DATA_TRACK) {
0365 have_datatracks = 1;
0366 break;
0367 }
0368 }
0369 if (!have_datatracks)
0370 return CDS_AUDIO;
0371
0372 if (cd->xa_flag)
0373 return CDS_XA_2_1;
0374 else
0375 return CDS_DATA_1;
0376 }
0377
0378 int sr_get_last_session(struct cdrom_device_info *cdi,
0379 struct cdrom_multisession *ms_info)
0380 {
0381 Scsi_CD *cd = cdi->handle;
0382
0383 ms_info->addr.lba = cd->ms_offset;
0384 ms_info->xa_flag = cd->xa_flag || cd->ms_offset > 0;
0385
0386 return 0;
0387 }
0388
0389 int sr_get_mcn(struct cdrom_device_info *cdi, struct cdrom_mcn *mcn)
0390 {
0391 Scsi_CD *cd = cdi->handle;
0392 struct packet_command cgc;
0393 char *buffer = kzalloc(32, GFP_KERNEL);
0394 int result;
0395
0396 if (!buffer)
0397 return -ENOMEM;
0398
0399 memset(&cgc, 0, sizeof(struct packet_command));
0400 cgc.cmd[0] = GPCMD_READ_SUBCHANNEL;
0401 cgc.cmd[2] = 0x40;
0402 cgc.cmd[3] = 0x02;
0403 cgc.cmd[8] = 24;
0404 cgc.buffer = buffer;
0405 cgc.buflen = 24;
0406 cgc.data_direction = DMA_FROM_DEVICE;
0407 cgc.timeout = IOCTL_TIMEOUT;
0408 result = sr_do_ioctl(cd, &cgc);
0409 if (result)
0410 goto err;
0411
0412 memcpy(mcn->medium_catalog_number, buffer + 9, 13);
0413 mcn->medium_catalog_number[13] = 0;
0414
0415 err:
0416 kfree(buffer);
0417 return result;
0418 }
0419
0420 int sr_reset(struct cdrom_device_info *cdi)
0421 {
0422 return 0;
0423 }
0424
0425 int sr_select_speed(struct cdrom_device_info *cdi, int speed)
0426 {
0427 Scsi_CD *cd = cdi->handle;
0428 struct packet_command cgc;
0429
0430 if (speed == 0)
0431 speed = 0xffff;
0432 else
0433 speed *= 177;
0434
0435 memset(&cgc, 0, sizeof(struct packet_command));
0436 cgc.cmd[0] = GPCMD_SET_SPEED;
0437 cgc.cmd[2] = (speed >> 8) & 0xff;
0438 cgc.cmd[3] = speed & 0xff;
0439 cgc.data_direction = DMA_NONE;
0440 cgc.timeout = IOCTL_TIMEOUT;
0441
0442 if (sr_do_ioctl(cd, &cgc))
0443 return -EIO;
0444 return 0;
0445 }
0446
0447
0448
0449
0450
0451
0452
0453 int sr_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, void *arg)
0454 {
0455 switch (cmd) {
0456 case CDROMREADTOCHDR:
0457 return sr_read_tochdr(cdi, arg);
0458 case CDROMREADTOCENTRY:
0459 return sr_read_tocentry(cdi, arg);
0460 case CDROMPLAYTRKIND:
0461 return sr_play_trkind(cdi, arg);
0462 default:
0463 return -EINVAL;
0464 }
0465 }
0466
0467
0468
0469
0470
0471
0472
0473
0474
0475
0476
0477
0478
0479
0480
0481 static int sr_read_cd(Scsi_CD *cd, unsigned char *dest, int lba, int format, int blksize)
0482 {
0483 struct packet_command cgc;
0484
0485 #ifdef DEBUG
0486 sr_printk(KERN_INFO, cd, "sr_read_cd lba=%d format=%d blksize=%d\n",
0487 lba, format, blksize);
0488 #endif
0489
0490 memset(&cgc, 0, sizeof(struct packet_command));
0491 cgc.cmd[0] = GPCMD_READ_CD;
0492 cgc.cmd[1] = ((format & 7) << 2);
0493 cgc.cmd[2] = (unsigned char) (lba >> 24) & 0xff;
0494 cgc.cmd[3] = (unsigned char) (lba >> 16) & 0xff;
0495 cgc.cmd[4] = (unsigned char) (lba >> 8) & 0xff;
0496 cgc.cmd[5] = (unsigned char) lba & 0xff;
0497 cgc.cmd[8] = 1;
0498 switch (blksize) {
0499 case 2336:
0500 cgc.cmd[9] = 0x58;
0501 break;
0502 case 2340:
0503 cgc.cmd[9] = 0x78;
0504 break;
0505 case 2352:
0506 cgc.cmd[9] = 0xf8;
0507 break;
0508 default:
0509 cgc.cmd[9] = 0x10;
0510 break;
0511 }
0512 cgc.buffer = dest;
0513 cgc.buflen = blksize;
0514 cgc.data_direction = DMA_FROM_DEVICE;
0515 cgc.timeout = IOCTL_TIMEOUT;
0516 return sr_do_ioctl(cd, &cgc);
0517 }
0518
0519
0520
0521
0522
0523 static int sr_read_sector(Scsi_CD *cd, int lba, int blksize, unsigned char *dest)
0524 {
0525 struct packet_command cgc;
0526 int rc;
0527
0528
0529 if (cd->readcd_known) {
0530 rc = sr_read_cd(cd, dest, lba, 0, blksize);
0531 if (-EDRIVE_CANT_DO_THIS != rc)
0532 return rc;
0533 cd->readcd_known = 0;
0534 sr_printk(KERN_INFO, cd,
0535 "CDROM doesn't support READ CD (0xbe) command\n");
0536
0537 }
0538
0539 if (blksize != cd->device->sector_size) {
0540 if (0 != (rc = sr_set_blocklength(cd, blksize)))
0541 return rc;
0542 }
0543 #ifdef DEBUG
0544 sr_printk(KERN_INFO, cd, "sr_read_sector lba=%d blksize=%d\n",
0545 lba, blksize);
0546 #endif
0547
0548 memset(&cgc, 0, sizeof(struct packet_command));
0549 cgc.cmd[0] = GPCMD_READ_10;
0550 cgc.cmd[2] = (unsigned char) (lba >> 24) & 0xff;
0551 cgc.cmd[3] = (unsigned char) (lba >> 16) & 0xff;
0552 cgc.cmd[4] = (unsigned char) (lba >> 8) & 0xff;
0553 cgc.cmd[5] = (unsigned char) lba & 0xff;
0554 cgc.cmd[8] = 1;
0555 cgc.buffer = dest;
0556 cgc.buflen = blksize;
0557 cgc.data_direction = DMA_FROM_DEVICE;
0558 cgc.timeout = IOCTL_TIMEOUT;
0559 rc = sr_do_ioctl(cd, &cgc);
0560
0561 if (blksize != CD_FRAMESIZE)
0562 rc |= sr_set_blocklength(cd, CD_FRAMESIZE);
0563 return rc;
0564 }
0565
0566
0567
0568
0569
0570
0571 int sr_is_xa(Scsi_CD *cd)
0572 {
0573 unsigned char *raw_sector;
0574 int is_xa;
0575
0576 if (!xa_test)
0577 return 0;
0578
0579 raw_sector = kmalloc(2048, GFP_KERNEL);
0580 if (!raw_sector)
0581 return -ENOMEM;
0582 if (0 == sr_read_sector(cd, cd->ms_offset + 16,
0583 CD_FRAMESIZE_RAW1, raw_sector)) {
0584 is_xa = (raw_sector[3] == 0x02) ? 1 : 0;
0585 } else {
0586
0587 is_xa = -1;
0588 }
0589 kfree(raw_sector);
0590 #ifdef DEBUG
0591 sr_printk(KERN_INFO, cd, "sr_is_xa: %d\n", is_xa);
0592 #endif
0593 return is_xa;
0594 }