|
|
1.1 ! root 1: /* ! 2: * linux/drivers/block/ide-cd.c ! 3: * ! 4: * 1.00 Oct 31, 1994 -- Initial version. ! 5: * 1.01 Nov 2, 1994 -- Fixed problem with starting request in ! 6: * cdrom_check_status. ! 7: * 1.03 Nov 25, 1994 -- leaving unmask_intr[] as a user-setting (as for disks) ! 8: * (from mlord) -- minor changes to cdrom_setup() ! 9: * -- renamed ide_dev_s to ide_drive_t, enable irq on command ! 10: * 2.00 Nov 27, 1994 -- Generalize packet command interface; ! 11: * add audio ioctls. ! 12: * 2.01 Dec 3, 1994 -- Rework packet command interface to handle devices ! 13: * which send an interrupt when ready for a command. ! 14: * 2.02 Dec 11, 1994 -- Cache the TOC in the driver. ! 15: * Don't use SCMD_PLAYAUDIO_TI; it's not included ! 16: * in the current version of ATAPI. ! 17: * Try to use LBA instead of track or MSF addressing ! 18: * when possible. ! 19: * Don't wait for READY_STAT. ! 20: * 2.03 Jan 10, 1995 -- Rewrite block read routines to handle block sizes ! 21: * other than 2k and to move multiple sectors in a ! 22: * single transaction. ! 23: * 2.04 Apr 21, 1995 -- Add work-around for Creative Labs CD220E drives. ! 24: * Thanks to Nick Saw <[email protected]> for ! 25: * help in figuring this out. Ditto for Acer and ! 26: * Aztech drives, which seem to have the same problem. ! 27: * 2.04b May 30, 1995 -- Fix to match changes in ide.c version 3.16 -ml ! 28: * 2.05 Jun 8, 1995 -- Don't attempt to retry after an illegal request ! 29: * or data protect error. ! 30: * Use HWIF and DEV_HWIF macros as in ide.c. ! 31: * Always try to do a request_sense after ! 32: * a failed command. ! 33: * Include an option to give textual descriptions ! 34: * of ATAPI errors. ! 35: * Fix a bug in handling the sector cache which ! 36: * showed up if the drive returned data in 512 byte ! 37: * blocks (like Pioneer drives). Thanks to ! 38: * Richard Hirst <[email protected]> for diagnosing this. ! 39: * Properly supply the page number field in the ! 40: * MODE_SELECT command. ! 41: * PLAYAUDIO12 is broken on the Aztech; work around it. ! 42: * 2.05x Aug 11, 1995 -- lots of data structure renaming/restructuring in ide.c ! 43: * (my apologies to Scott, but now ide-cd.c is independent) ! 44: * 3.00 Aug 22, 1995 -- Implement CDROMMULTISESSION ioctl. ! 45: * Implement CDROMREADAUDIO ioctl (UNTESTED). ! 46: * Use input_ide_data() and output_ide_data(). ! 47: * Add door locking. ! 48: * Fix usage count leak in cdrom_open, which happened ! 49: * when a read-write mount was attempted. ! 50: * Try to load the disk on open. ! 51: * Implement CDROMEJECT_SW ioctl (off by default). ! 52: * Read total cdrom capacity during open. ! 53: * Rearrange logic in cdrom_decode_status. Issue ! 54: * request sense commands for failed packet commands ! 55: * from here instead of from cdrom_queue_packet_command. ! 56: * Fix a race condition in retrieving error information. ! 57: * Suppress printing normal unit attention errors and ! 58: * some drive not ready errors. ! 59: * Implement CDROMVOLREAD ioctl. ! 60: * Implement CDROMREADMODE1/2 ioctls. ! 61: * Fix race condition in setting up interrupt handlers ! 62: * when the `serialize' option is used. ! 63: * 3.01 Sep 2, 1995 -- Fix ordering of reenabling interrupts in ! 64: * cdrom_queue_request. ! 65: * Another try at using ide_[input,output]_data. ! 66: * 3.02 Sep 16, 1995 -- Stick total disk capacity in partition table as well. ! 67: * Make VERBOSE_IDE_CD_ERRORS dump failed command again. ! 68: * Dump out more information for ILLEGAL REQUEST errs. ! 69: * Fix handling of errors occuring before the ! 70: * packet command is transferred. ! 71: * Fix transfers with odd bytelengths. ! 72: * 3.03 Oct 27, 1995 -- Some Creative drives have an id of just `CD'. ! 73: * `DCI-2S10' drives are broken too. ! 74: * 3.04 Nov 20, 1995 -- So are Vertos drives. ! 75: * 3.05 Dec 1, 1995 -- Changes to go with overhaul of ide.c and ide-tape.c ! 76: * 3.06 Dec 16, 1995 -- Add support needed for partitions. ! 77: * More workarounds for Vertos bugs (based on patches ! 78: * from Holger Dietze <[email protected]>). ! 79: * Try to eliminate byteorder assumptions. ! 80: * Use atapi_cdrom_subchnl struct definition. ! 81: * Add STANDARD_ATAPI compilation option. ! 82: * 3.07 Jan 29, 1996 -- More twiddling for broken drives: Sony 55D, ! 83: * Vertos 300. ! 84: * Add NO_DOOR_LOCKING configuration option. ! 85: * Handle drive_cmd requests w/NULL args (for hdparm -t). ! 86: * Work around sporadic Sony55e audio play problem. ! 87: * 3.07a Feb 11, 1996 -- check drive->id for NULL before dereferencing, to fix ! 88: * problem with "hde=cdrom" with no drive present. -ml ! 89: * ! 90: * NOTE: Direct audio reads will only work on some types of drive. ! 91: * So far, i've received reports of success for Sony and Toshiba drives. ! 92: * ! 93: * ATAPI cd-rom driver. To be used with ide.c. ! 94: * ! 95: * Copyright (C) 1994, 1995, 1996 scott snyder <[email protected]> ! 96: * May be copied or modified under the terms of the GNU General Public License ! 97: * (../../COPYING). ! 98: */ ! 99: ! 100: ! 101: /***************************************************************************/ ! 102: ! 103: #include <linux/types.h> ! 104: #include <linux/kernel.h> ! 105: #include <linux/delay.h> ! 106: #include <linux/timer.h> ! 107: #include <linux/malloc.h> ! 108: #include <linux/ioport.h> ! 109: #include <linux/interrupt.h> ! 110: #include <linux/blkdev.h> ! 111: #include <linux/errno.h> ! 112: #include <linux/hdreg.h> ! 113: #include <linux/cdrom.h> ! 114: #include <asm/irq.h> ! 115: #include <asm/io.h> ! 116: #include <asm/byteorder.h> ! 117: #include <asm/segment.h> ! 118: #ifdef __alpha__ ! 119: # include <asm/unaligned.h> ! 120: #endif ! 121: ! 122: #include "ide.h" ! 123: ! 124: ! 125: ! 126: /* Turn this on to have the driver print out the meanings of the ! 127: ATAPI error codes. This will use up additional kernel-space ! 128: memory, though. */ ! 129: ! 130: #ifndef VERBOSE_IDE_CD_ERRORS ! 131: #define VERBOSE_IDE_CD_ERRORS 0 ! 132: #endif ! 133: ! 134: ! 135: /* Turning this on will remove code to work around various nonstandard ! 136: ATAPI implementations. If you know your drive follows the standard, ! 137: this will give you a slightly smaller kernel. */ ! 138: ! 139: #ifndef STANDARD_ATAPI ! 140: #define STANDARD_ATAPI 0 ! 141: #endif ! 142: ! 143: ! 144: /* Turning this on will disable the door-locking functionality. ! 145: This is apparently needed for supermount. */ ! 146: ! 147: #ifndef NO_DOOR_LOCKING ! 148: #define NO_DOOR_LOCKING 0 ! 149: #endif ! 150: ! 151: ! 152: /************************************************************************/ ! 153: ! 154: #define SECTOR_SIZE 512 ! 155: #define SECTOR_BITS 9 ! 156: #define SECTORS_PER_FRAME (CD_FRAMESIZE / SECTOR_SIZE) ! 157: ! 158: #define MIN(a,b) ((a) < (b) ? (a) : (b)) ! 159: ! 160: /* special command codes for strategy routine. */ ! 161: #define PACKET_COMMAND 4315 ! 162: #define REQUEST_SENSE_COMMAND 4316 ! 163: #define RESET_DRIVE_COMMAND 4317 ! 164: ! 165: /* Some ATAPI command opcodes (just like SCSI). ! 166: (Some other cdrom-specific codes are in cdrom.h.) */ ! 167: #define TEST_UNIT_READY 0x00 ! 168: #define REQUEST_SENSE 0x03 ! 169: #define START_STOP 0x1b ! 170: #define ALLOW_MEDIUM_REMOVAL 0x1e ! 171: #define READ_CAPACITY 0x25 ! 172: #define READ_10 0x28 ! 173: #define MODE_SENSE_10 0x5a ! 174: #define MODE_SELECT_10 0x55 ! 175: #define READ_CD 0xbe ! 176: ! 177: ! 178: /* ATAPI sense keys (mostly copied from scsi.h). */ ! 179: ! 180: #define NO_SENSE 0x00 ! 181: #define RECOVERED_ERROR 0x01 ! 182: #define NOT_READY 0x02 ! 183: #define MEDIUM_ERROR 0x03 ! 184: #define HARDWARE_ERROR 0x04 ! 185: #define ILLEGAL_REQUEST 0x05 ! 186: #define UNIT_ATTENTION 0x06 ! 187: #define DATA_PROTECT 0x07 ! 188: #define ABORTED_COMMAND 0x0b ! 189: #define MISCOMPARE 0x0e ! 190: ! 191: /* We want some additional flags for cd-rom drives. ! 192: To save space in the ide_drive_t struct, use some fields which ! 193: doesn't make sense for cd-roms -- `bios_sect' and `bios_head'. */ ! 194: ! 195: /* Configuration flags. These describe the capabilities of the drive. ! 196: They generally do not change after initialization, unless we learn ! 197: more about the drive from stuff failing. */ ! 198: struct ide_cd_config_flags { ! 199: __u8 drq_interrupt : 1; /* Device sends an interrupt when ready ! 200: for a packet command. */ ! 201: __u8 no_doorlock : 1; /* Drive cannot lock the door. */ ! 202: #if ! STANDARD_ATAPI ! 203: __u8 no_playaudio12: 1; /* The PLAYAUDIO12 command is not supported. */ ! 204: ! 205: __u8 no_lba_toc : 1; /* Drive cannot return TOC info in LBA format. */ ! 206: __u8 playmsf_uses_bcd : 1; /* Drive uses BCD in PLAYAUDIO_MSF. */ ! 207: __u8 old_readcd : 1; /* Drive uses old READ CD opcode. */ ! 208: __u8 vertos_lossage: 1; /* Drive is a Vertos 300, ! 209: and likes to speak BCD. */ ! 210: #endif /* not STANDARD_ATAPI */ ! 211: __u8 reserved : 1; ! 212: }; ! 213: #define CDROM_CONFIG_FLAGS(drive) ((struct ide_cd_config_flags *)&((drive)->bios_sect)) ! 214: ! 215: ! 216: /* State flags. These give information about the current state of the ! 217: drive, and will change during normal operation. */ ! 218: struct ide_cd_state_flags { ! 219: __u8 media_changed : 1; /* Driver has noticed a media change. */ ! 220: __u8 toc_valid : 1; /* Saved TOC information is current. */ ! 221: __u8 door_locked : 1; /* We think that the drive door is locked. */ ! 222: __u8 eject_on_close: 1; /* Drive should eject when device is closed. */ ! 223: __u8 reserved : 4; ! 224: }; ! 225: #define CDROM_STATE_FLAGS(drive) ((struct ide_cd_state_flags *)&((drive)->bios_head)) ! 226: ! 227: ! 228: #define SECTOR_BUFFER_SIZE CD_FRAMESIZE ! 229: ! 230: ! 231: ! 232: /**************************************************************************** ! 233: * Routines to read and write data from/to the drive, using ! 234: * the routines input_ide_data() and output_ide_data() from ide.c. ! 235: * ! 236: * These routines will round up any request for an odd number of bytes, ! 237: * so if an odd bytecount is specified, be sure that there's at least one ! 238: * extra byte allocated for the buffer. ! 239: */ ! 240: ! 241: ! 242: static inline ! 243: void cdrom_in_bytes (ide_drive_t *drive, void *buffer, uint bytecount) ! 244: { ! 245: ++bytecount; ! 246: ide_input_data (drive, buffer, bytecount / 4); ! 247: if ((bytecount & 0x03) >= 2) ! 248: { ! 249: insw (IDE_DATA_REG, ((byte *)buffer) + (bytecount & ~0x03), 1); ! 250: } ! 251: } ! 252: ! 253: ! 254: static inline ! 255: void cdrom_out_bytes (ide_drive_t *drive, void *buffer, uint bytecount) ! 256: { ! 257: ++bytecount; ! 258: ide_output_data (drive, buffer, bytecount / 4); ! 259: if ((bytecount & 0x03) >= 2) ! 260: { ! 261: outsw (IDE_DATA_REG, ((byte *)buffer) + (bytecount & ~0x03), 1); ! 262: } ! 263: } ! 264: ! 265: ! 266: ! 267: /**************************************************************************** ! 268: * Descriptions of ATAPI error codes. ! 269: */ ! 270: ! 271: #define ARY_LEN(a) ((sizeof(a) / sizeof(a[0]))) ! 272: ! 273: #if VERBOSE_IDE_CD_ERRORS ! 274: ! 275: /* From Table 124 of the ATAPI 1.2 spec. */ ! 276: ! 277: char *sense_key_texts[16] = { ! 278: "No sense data", ! 279: "Recovered error", ! 280: "Not ready", ! 281: "Medium error", ! 282: "Hardware error", ! 283: "Illegal request", ! 284: "Unit attention", ! 285: "Data protect", ! 286: "(reserved)", ! 287: "(reserved)", ! 288: "(reserved)", ! 289: "Aborted command", ! 290: "(reserved)", ! 291: "(reserved)", ! 292: "Miscompare", ! 293: "(reserved)", ! 294: }; ! 295: ! 296: ! 297: /* From Table 125 of the ATAPI 1.2 spec. */ ! 298: ! 299: struct { ! 300: short asc_ascq; ! 301: char *text; ! 302: } sense_data_texts[] = { ! 303: { 0x0000, "No additional sense information" }, ! 304: { 0x0011, "Audio play operation in progress" }, ! 305: { 0x0012, "Audio play operation paused" }, ! 306: { 0x0013, "Audio play operation successfully completed" }, ! 307: { 0x0014, "Audio play operation stopped due to error" }, ! 308: { 0x0015, "No current audio status to return" }, ! 309: ! 310: { 0x0200, "No seek complete" }, ! 311: ! 312: { 0x0400, "Logical unit not ready - cause not reportable" }, ! 313: { 0x0401, "Logical unit not ready - in progress (sic) of becoming ready" }, ! 314: { 0x0402, "Logical unit not ready - initializing command required" }, ! 315: { 0x0403, "Logical unit not ready - manual intervention required" }, ! 316: ! 317: { 0x0600, "No reference position found" }, ! 318: ! 319: { 0x0900, "Track following error" }, ! 320: { 0x0901, "Tracking servo failure" }, ! 321: { 0x0902, "Focus servo failure" }, ! 322: { 0x0903, "Spindle servo failure" }, ! 323: ! 324: { 0x1100, "Unrecovered read error" }, ! 325: { 0x1106, "CIRC unrecovered error" }, ! 326: ! 327: { 0x1500, "Random positioning error" }, ! 328: { 0x1501, "Mechanical positioning error" }, ! 329: { 0x1502, "Positioning error detected by read of medium" }, ! 330: ! 331: { 0x1700, "Recovered data with no error correction applied" }, ! 332: { 0x1701, "Recovered data with retries" }, ! 333: { 0x1702, "Recovered data with positive head offset" }, ! 334: { 0x1703, "Recovered data with negative head offset" }, ! 335: { 0x1704, "Recovered data with retries and/or CIRC applied" }, ! 336: { 0x1705, "Recovered data using previous sector ID" }, ! 337: ! 338: { 0x1800, "Recovered data with error correction applied" }, ! 339: { 0x1801, "Recovered data with error correction and retries applied" }, ! 340: { 0x1802, "Recovered data - the data was auto-reallocated" }, ! 341: { 0x1803, "Recovered data with CIRC" }, ! 342: { 0x1804, "Recovered data with L-EC" }, ! 343: { 0x1805, "Recovered data - recommend reassignment" }, ! 344: { 0x1806, "Recovered data - recommend rewrite" }, ! 345: ! 346: { 0x1a00, "Parameter list length error" }, ! 347: ! 348: { 0x2000, "Invalid command operation code" }, ! 349: ! 350: { 0x2100, "Logical block address out of range" }, ! 351: ! 352: { 0x2400, "Invalid field in command packet" }, ! 353: ! 354: { 0x2600, "Invalid field in parameter list" }, ! 355: { 0x2601, "Parameter not supported" }, ! 356: { 0x2602, "Parameter value invalid" }, ! 357: { 0x2603, "Threshold parameters not supported" }, ! 358: ! 359: { 0x2800, "Not ready to ready transition, medium may have changed" }, ! 360: ! 361: { 0x2900, "Power on, reset or bus device reset occurred" }, ! 362: ! 363: { 0x2a00, "Parameters changed" }, ! 364: { 0x2a01, "Mode parameters changed" }, ! 365: ! 366: { 0x3000, "Incompatible medium installed" }, ! 367: { 0x3001, "Cannot read medium - unknown format" }, ! 368: { 0x3002, "Cannot read medium - incompatible format" }, ! 369: ! 370: { 0x3700, "Rounded parameter" }, ! 371: ! 372: { 0x3900, "Saving parameters not supported" }, ! 373: ! 374: { 0x3a00, "Medium not present" }, ! 375: ! 376: { 0x3f00, "ATAPI CD-ROM drive operating conditions have changed" }, ! 377: { 0x3f01, "Microcode has been changed" }, ! 378: { 0x3f02, "Changed operating definition" }, ! 379: { 0x3f03, "Inquiry data has changed" }, ! 380: ! 381: { 0x4000, "Diagnostic failure on component (ASCQ)" }, ! 382: ! 383: { 0x4400, "Internal ATAPI CD-ROM drive failure" }, ! 384: ! 385: { 0x4e00, "Overlapped commands attempted" }, ! 386: ! 387: { 0x5300, "Media load or eject failed" }, ! 388: { 0x5302, "Medium removal prevented" }, ! 389: ! 390: { 0x5700, "Unable to recover table of contents" }, ! 391: ! 392: { 0x5a00, "Operator request or state change input (unspecified)" }, ! 393: { 0x5a01, "Operator medium removal request" }, ! 394: ! 395: { 0x5b00, "Threshold condition met" }, ! 396: ! 397: { 0x5c00, "Status change" }, ! 398: ! 399: { 0x6300, "End of user area encountered on this track" }, ! 400: ! 401: { 0x6400, "Illegal mode for this track" }, ! 402: ! 403: { 0xbf00, "Loss of streaming" }, ! 404: }; ! 405: #endif ! 406: ! 407: ! 408: ! 409: /**************************************************************************** ! 410: * Generic packet command support and error handling routines. ! 411: */ ! 412: ! 413: ! 414: static ! 415: void cdrom_analyze_sense_data (ide_drive_t *drive, ! 416: struct atapi_request_sense *reqbuf, ! 417: struct packet_command *failed_command) ! 418: { ! 419: /* Don't print not ready or unit attention errors for READ_SUBCHANNEL. ! 420: Workman (and probably other programs) uses this command to poll ! 421: the drive, and we don't want to fill the syslog with useless errors. */ ! 422: if (failed_command && ! 423: failed_command->c[0] == SCMD_READ_SUBCHANNEL && ! 424: (reqbuf->sense_key == NOT_READY || reqbuf->sense_key == UNIT_ATTENTION)) ! 425: return; ! 426: ! 427: #if VERBOSE_IDE_CD_ERRORS ! 428: { ! 429: int i; ! 430: char *s; ! 431: char buf[80]; ! 432: ! 433: printk ("ATAPI device %s:\n", drive->name); ! 434: ! 435: printk (" Error code: 0x%02x\n", reqbuf->error_code); ! 436: ! 437: if (reqbuf->sense_key >= 0 && ! 438: reqbuf->sense_key < ARY_LEN (sense_key_texts)) ! 439: s = sense_key_texts[reqbuf->sense_key]; ! 440: else ! 441: s = "(bad sense key)"; ! 442: ! 443: printk (" Sense key: 0x%02x - %s\n", reqbuf->sense_key, s); ! 444: ! 445: if (reqbuf->asc == 0x40) { ! 446: sprintf (buf, "Diagnostic failure on component 0x%02x", reqbuf->ascq); ! 447: s = buf; ! 448: } ! 449: ! 450: else { ! 451: int lo, hi; ! 452: int key = (reqbuf->asc << 8); ! 453: if ( ! (reqbuf->ascq >= 0x80 && reqbuf->ascq <= 0xdd) ) ! 454: key |= reqbuf->ascq; ! 455: ! 456: lo = 0; ! 457: hi = ARY_LEN (sense_data_texts); ! 458: s = NULL; ! 459: ! 460: while (hi > lo) { ! 461: int mid = (lo + hi) / 2; ! 462: if (sense_data_texts[mid].asc_ascq == key) { ! 463: s = sense_data_texts[mid].text; ! 464: break; ! 465: } ! 466: else if (sense_data_texts[mid].asc_ascq > key) ! 467: hi = mid; ! 468: else ! 469: lo = mid+1; ! 470: } ! 471: } ! 472: ! 473: if (s == NULL) { ! 474: if (reqbuf->asc > 0x80) ! 475: s = "(vendor-specific error)"; ! 476: else ! 477: s = "(reserved error code)"; ! 478: } ! 479: ! 480: printk (" Additional sense data: 0x%02x, 0x%02x - %s\n", ! 481: reqbuf->asc, reqbuf->ascq, s); ! 482: ! 483: if (failed_command != NULL) { ! 484: printk (" Failed packet command: "); ! 485: for (i=0; i<sizeof (failed_command->c); i++) ! 486: printk ("%02x ", failed_command->c[i]); ! 487: printk ("\n"); ! 488: } ! 489: ! 490: if (reqbuf->sense_key == ILLEGAL_REQUEST && ! 491: (reqbuf->sense_key_specific[0] & 0x80) != 0) ! 492: { ! 493: printk (" Error in %s byte %d", ! 494: (reqbuf->sense_key_specific[0] & 0x40) != 0 ! 495: ? "command packet" ! 496: : "command data", ! 497: (reqbuf->sense_key_specific[1] << 8) + ! 498: reqbuf->sense_key_specific[2]); ! 499: ! 500: if ((reqbuf->sense_key_specific[0] & 0x40) != 0) ! 501: { ! 502: printk (" bit %d", reqbuf->sense_key_specific[0] & 0x07); ! 503: } ! 504: ! 505: printk ("\n"); ! 506: } ! 507: } ! 508: ! 509: #else ! 510: ! 511: /* Suppress printing unit attention and `in progress of becoming ready' ! 512: errors when we're not being verbose. */ ! 513: ! 514: if (reqbuf->sense_key == UNIT_ATTENTION || ! 515: (reqbuf->sense_key == NOT_READY && (reqbuf->asc == 4 || ! 516: reqbuf->asc == 0x3a))) ! 517: return; ! 518: ! 519: printk ("%s: code: 0x%02x key: 0x%02x asc: 0x%02x ascq: 0x%02x\n", ! 520: drive->name, ! 521: reqbuf->error_code, reqbuf->sense_key, reqbuf->asc, reqbuf->ascq); ! 522: #endif ! 523: } ! 524: ! 525: ! 526: /* Fix up a possibly partially-processed request so that we can ! 527: start it over entirely, or even put it back on the request queue. */ ! 528: static void restore_request (struct request *rq) ! 529: { ! 530: if (rq->buffer != rq->bh->b_data) ! 531: { ! 532: int n = (rq->buffer - rq->bh->b_data) / SECTOR_SIZE; ! 533: rq->buffer = rq->bh->b_data; ! 534: rq->nr_sectors += n; ! 535: rq->sector -= n; ! 536: } ! 537: rq->current_nr_sectors = rq->bh->b_size >> SECTOR_BITS; ! 538: } ! 539: ! 540: ! 541: static void cdrom_queue_request_sense (ide_drive_t *drive, ! 542: struct semaphore *sem, ! 543: struct atapi_request_sense *reqbuf, ! 544: struct packet_command *failed_command) ! 545: { ! 546: struct request *rq; ! 547: struct packet_command *pc; ! 548: int len; ! 549: ! 550: /* If the request didn't explicitly specify where to put the sense data, ! 551: use the statically allocated structure. */ ! 552: if (reqbuf == NULL) ! 553: reqbuf = &drive->cdrom_info.sense_data; ! 554: ! 555: /* Make up a new request to retrieve sense information. */ ! 556: ! 557: pc = &HWIF(drive)->request_sense_pc; ! 558: memset (pc, 0, sizeof (*pc)); ! 559: ! 560: /* The request_sense structure has an odd number of (16-bit) words, ! 561: which won't work well with 32-bit transfers. However, we don't care ! 562: about the last two bytes, so just truncate the structure down ! 563: to an even length. */ ! 564: len = sizeof (*reqbuf) / 4; ! 565: len *= 4; ! 566: ! 567: pc->c[0] = REQUEST_SENSE; ! 568: pc->c[4] = len; ! 569: pc->buffer = (char *)reqbuf; ! 570: pc->buflen = len; ! 571: pc->sense_data = (struct atapi_request_sense *)failed_command; ! 572: ! 573: /* stuff the sense request in front of our current request */ ! 574: ! 575: rq = &HWIF(drive)->request_sense_request; ! 576: ide_init_drive_cmd (rq); ! 577: rq->cmd = REQUEST_SENSE_COMMAND; ! 578: rq->buffer = (char *)pc; ! 579: rq->sem = sem; ! 580: (void) ide_do_drive_cmd (drive, rq, ide_preempt); ! 581: } ! 582: ! 583: ! 584: static void cdrom_end_request (int uptodate, ide_drive_t *drive) ! 585: { ! 586: struct request *rq = HWGROUP(drive)->rq; ! 587: ! 588: /* The code in blk.h can screw us up on error recovery if the block ! 589: size is larger than 1k. Fix that up here. */ ! 590: if (!uptodate && rq->bh != 0) ! 591: { ! 592: int adj = rq->current_nr_sectors - 1; ! 593: rq->current_nr_sectors -= adj; ! 594: rq->sector += adj; ! 595: } ! 596: ! 597: if (rq->cmd == REQUEST_SENSE_COMMAND && uptodate) ! 598: { ! 599: struct packet_command *pc = (struct packet_command *)rq->buffer; ! 600: cdrom_analyze_sense_data (drive, ! 601: (struct atapi_request_sense *)(pc->buffer - pc->c[4]), ! 602: (struct packet_command *)pc->sense_data); ! 603: } ! 604: ! 605: ide_end_request (uptodate, HWGROUP(drive)); ! 606: } ! 607: ! 608: ! 609: /* Mark that we've seen a media change, and invalidate our internal ! 610: buffers. */ ! 611: static void cdrom_saw_media_change (ide_drive_t *drive) ! 612: { ! 613: CDROM_STATE_FLAGS (drive)->media_changed = 1; ! 614: CDROM_STATE_FLAGS (drive)->toc_valid = 0; ! 615: drive->cdrom_info.nsectors_buffered = 0; ! 616: } ! 617: ! 618: ! 619: /* Returns 0 if the request should be continued. ! 620: Returns 1 if the request was ended. */ ! 621: static int cdrom_decode_status (ide_drive_t *drive, int good_stat, int *stat_ret) ! 622: { ! 623: struct request *rq = HWGROUP(drive)->rq; ! 624: int stat, err, sense_key, cmd; ! 625: ! 626: /* Check for errors. */ ! 627: stat = GET_STAT(); ! 628: *stat_ret = stat; ! 629: ! 630: if (OK_STAT (stat, good_stat, BAD_R_STAT)) ! 631: return 0; ! 632: ! 633: /* Got an error. */ ! 634: err = IN_BYTE (IDE_ERROR_REG); ! 635: sense_key = err >> 4; ! 636: ! 637: if (rq == NULL) ! 638: printk ("%s : missing request in cdrom_decode_status\n", drive->name); ! 639: else ! 640: { ! 641: cmd = rq->cmd; ! 642: ! 643: if (cmd == REQUEST_SENSE_COMMAND) ! 644: { ! 645: /* We got an error trying to get sense info from the drive ! 646: (probably while trying to recover from a former error). ! 647: Just give up. */ ! 648: ! 649: struct packet_command *pc = (struct packet_command *)rq->buffer; ! 650: pc->stat = 1; ! 651: cdrom_end_request (1, drive); ! 652: ide_error (drive, "request sense failure", stat); ! 653: return 1; ! 654: } ! 655: ! 656: else if (cmd == PACKET_COMMAND) ! 657: { ! 658: /* All other functions, except for READ. */ ! 659: ! 660: struct packet_command *pc = (struct packet_command *)rq->buffer; ! 661: struct semaphore *sem = NULL; ! 662: ! 663: /* Check for tray open. */ ! 664: if (sense_key == NOT_READY) ! 665: { ! 666: cdrom_saw_media_change (drive); ! 667: ! 668: /* Print an error message to the syslog. ! 669: Exception: don't print anything if this is a read subchannel ! 670: command. This is because workman constantly polls the drive ! 671: with this command, and we don't want to uselessly fill up ! 672: the syslog. */ ! 673: if (pc->c[0] != SCMD_READ_SUBCHANNEL) ! 674: printk ("%s : tray open or drive not ready\n", drive->name); ! 675: } ! 676: ! 677: /* Check for media change. */ ! 678: else if (sense_key == UNIT_ATTENTION) ! 679: { ! 680: cdrom_saw_media_change (drive); ! 681: printk ("%s: media changed\n", drive->name); ! 682: } ! 683: ! 684: /* Otherwise, print an error. */ ! 685: else ! 686: { ! 687: ide_dump_status (drive, "packet command error", stat); ! 688: } ! 689: ! 690: /* Set the error flag and complete the request. ! 691: Then, if we have a CHECK CONDITION status, queue a request ! 692: sense command. We must be careful, though: we don't want ! 693: the thread in cdrom_queue_packet_command to wake up until ! 694: the request sense has completed. We do this by transferring ! 695: the semaphore from the packet command request to the ! 696: request sense request. */ ! 697: ! 698: if ((stat & ERR_STAT) != 0) ! 699: { ! 700: sem = rq->sem; ! 701: rq->sem = NULL; ! 702: } ! 703: ! 704: pc->stat = 1; ! 705: cdrom_end_request (1, drive); ! 706: ! 707: if ((stat & ERR_STAT) != 0) ! 708: cdrom_queue_request_sense (drive, sem, pc->sense_data, pc); ! 709: } ! 710: ! 711: else ! 712: { ! 713: /* Handle errors from READ requests. */ ! 714: ! 715: /* Check for tray open. */ ! 716: if (sense_key == NOT_READY) ! 717: { ! 718: cdrom_saw_media_change (drive); ! 719: ! 720: /* Fail the request. */ ! 721: printk ("%s : tray open\n", drive->name); ! 722: cdrom_end_request (0, drive); ! 723: } ! 724: ! 725: /* Check for media change. */ ! 726: else if (sense_key == UNIT_ATTENTION) ! 727: { ! 728: cdrom_saw_media_change (drive); ! 729: ! 730: /* Arrange to retry the request. ! 731: But be sure to give up if we've retried too many times. */ ! 732: if (++rq->errors > ERROR_MAX) ! 733: { ! 734: cdrom_end_request (0, drive); ! 735: } ! 736: } ! 737: /* No point in retrying after an illegal request or ! 738: data protect error.*/ ! 739: else if (sense_key == ILLEGAL_REQUEST || sense_key == DATA_PROTECT) ! 740: { ! 741: ide_dump_status (drive, "command error", stat); ! 742: cdrom_end_request (0, drive); ! 743: } ! 744: ! 745: /* If there were other errors, go to the default handler. */ ! 746: else if ((err & ~ABRT_ERR) != 0) ! 747: { ! 748: ide_error (drive, "cdrom_decode_status", stat); ! 749: return 1; ! 750: } ! 751: ! 752: /* Else, abort if we've racked up too many retries. */ ! 753: else if ((++rq->errors > ERROR_MAX)) ! 754: { ! 755: cdrom_end_request (0, drive); ! 756: } ! 757: ! 758: /* If we got a CHECK_CONDITION status, queue a request sense ! 759: command. */ ! 760: if ((stat & ERR_STAT) != 0) ! 761: cdrom_queue_request_sense (drive, NULL, NULL, NULL); ! 762: } ! 763: } ! 764: ! 765: /* Retry, or handle the next request. */ ! 766: return 1; ! 767: } ! 768: ! 769: ! 770: /* Set up the device registers for transferring a packet command on DEV, ! 771: expecting to later transfer XFERLEN bytes. HANDLER is the routine ! 772: which actually transfers the command to the drive. If this is a ! 773: drq_interrupt device, this routine will arrange for HANDLER to be ! 774: called when the interrupt from the drive arrives. Otherwise, HANDLER ! 775: will be called immediately after the drive is prepared for the transfer. */ ! 776: ! 777: static int cdrom_start_packet_command (ide_drive_t *drive, int xferlen, ! 778: ide_handler_t *handler) ! 779: { ! 780: /* Wait for the controller to be idle. */ ! 781: if (ide_wait_stat (drive, 0, BUSY_STAT, WAIT_READY)) return 1; ! 782: ! 783: /* Set up the controller registers. */ ! 784: OUT_BYTE (0, IDE_FEATURE_REG); ! 785: OUT_BYTE (0, IDE_NSECTOR_REG); ! 786: OUT_BYTE (0, IDE_SECTOR_REG); ! 787: ! 788: OUT_BYTE (xferlen & 0xff, IDE_LCYL_REG); ! 789: OUT_BYTE (xferlen >> 8 , IDE_HCYL_REG); ! 790: OUT_BYTE (drive->ctl, IDE_CONTROL_REG); ! 791: ! 792: if (CDROM_CONFIG_FLAGS (drive)->drq_interrupt) ! 793: { ! 794: ide_set_handler (drive, handler, WAIT_CMD); ! 795: OUT_BYTE (WIN_PACKETCMD, IDE_COMMAND_REG); /* packet command */ ! 796: } ! 797: else ! 798: { ! 799: OUT_BYTE (WIN_PACKETCMD, IDE_COMMAND_REG); /* packet command */ ! 800: (*handler) (drive); ! 801: } ! 802: ! 803: return 0; ! 804: } ! 805: ! 806: ! 807: /* Send a packet command to DRIVE described by CMD_BUF and CMD_LEN. ! 808: The device registers must have already been prepared ! 809: by cdrom_start_packet_command. ! 810: HANDLER is the interrupt handler to call when the command completes ! 811: or there's data ready. */ ! 812: static int cdrom_transfer_packet_command (ide_drive_t *drive, ! 813: char *cmd_buf, int cmd_len, ! 814: ide_handler_t *handler) ! 815: { ! 816: if (CDROM_CONFIG_FLAGS (drive)->drq_interrupt) ! 817: { ! 818: /* Here we should have been called after receiving an interrupt ! 819: from the device. DRQ should how be set. */ ! 820: int stat_dum; ! 821: ! 822: /* Check for errors. */ ! 823: if (cdrom_decode_status (drive, DRQ_STAT, &stat_dum)) return 1; ! 824: } ! 825: else ! 826: { ! 827: /* Otherwise, we must wait for DRQ to get set. */ ! 828: if (ide_wait_stat (drive, DRQ_STAT, BUSY_STAT, WAIT_READY)) return 1; ! 829: } ! 830: ! 831: /* Arm the interrupt handler. */ ! 832: ide_set_handler (drive, handler, WAIT_CMD); ! 833: ! 834: /* Send the command to the device. */ ! 835: cdrom_out_bytes (drive, cmd_buf, cmd_len); ! 836: ! 837: return 0; ! 838: } ! 839: ! 840: ! 841: ! 842: /**************************************************************************** ! 843: * Block read functions. ! 844: */ ! 845: ! 846: /* ! 847: * Buffer up to SECTORS_TO_TRANSFER sectors from the drive in our sector ! 848: * buffer. Once the first sector is added, any subsequent sectors are ! 849: * assumed to be continuous (until the buffer is cleared). For the first ! 850: * sector added, SECTOR is its sector number. (SECTOR is then ignored until ! 851: * the buffer is cleared.) ! 852: */ ! 853: static void cdrom_buffer_sectors (ide_drive_t *drive, unsigned long sector, ! 854: int sectors_to_transfer) ! 855: { ! 856: struct cdrom_info *info = &drive->cdrom_info; ! 857: ! 858: /* Number of sectors to read into the buffer. */ ! 859: int sectors_to_buffer = MIN (sectors_to_transfer, ! 860: (SECTOR_BUFFER_SIZE >> SECTOR_BITS) - ! 861: info->nsectors_buffered); ! 862: ! 863: char *dest; ! 864: ! 865: /* If we don't yet have a sector buffer, try to allocate one. ! 866: If we can't get one atomically, it's not fatal -- we'll just throw ! 867: the data away rather than caching it. */ ! 868: if (info->sector_buffer == NULL) ! 869: { ! 870: info->sector_buffer = (char *) kmalloc (SECTOR_BUFFER_SIZE, GFP_ATOMIC); ! 871: ! 872: /* If we couldn't get a buffer, don't try to buffer anything... */ ! 873: if (info->sector_buffer == NULL) ! 874: sectors_to_buffer = 0; ! 875: } ! 876: ! 877: /* If this is the first sector in the buffer, remember its number. */ ! 878: if (info->nsectors_buffered == 0) ! 879: info->sector_buffered = sector; ! 880: ! 881: /* Read the data into the buffer. */ ! 882: dest = info->sector_buffer + info->nsectors_buffered * SECTOR_SIZE; ! 883: while (sectors_to_buffer > 0) ! 884: { ! 885: cdrom_in_bytes (drive, dest, SECTOR_SIZE); ! 886: --sectors_to_buffer; ! 887: --sectors_to_transfer; ! 888: ++info->nsectors_buffered; ! 889: dest += SECTOR_SIZE; ! 890: } ! 891: ! 892: /* Throw away any remaining data. */ ! 893: while (sectors_to_transfer > 0) ! 894: { ! 895: char dum[SECTOR_SIZE]; ! 896: cdrom_in_bytes (drive, dum, sizeof (dum)); ! 897: --sectors_to_transfer; ! 898: } ! 899: } ! 900: ! 901: ! 902: /* ! 903: * Check the contents of the interrupt reason register from the cdrom ! 904: * and attempt to recover if there are problems. Returns 0 if everything's ! 905: * ok; nonzero if the request has been terminated. ! 906: */ ! 907: static inline ! 908: int cdrom_read_check_ireason (ide_drive_t *drive, int len, int ireason) ! 909: { ! 910: ireason &= 3; ! 911: if (ireason == 2) return 0; ! 912: ! 913: if (ireason == 0) ! 914: { ! 915: /* Whoops... The drive is expecting to receive data from us! */ ! 916: printk ("%s: cdrom_read_intr: " ! 917: "Drive wants to transfer data the wrong way!\n", ! 918: drive->name); ! 919: ! 920: /* Throw some data at the drive so it doesn't hang ! 921: and quit this request. */ ! 922: while (len > 0) ! 923: { ! 924: int dum = 0; ! 925: cdrom_out_bytes (drive, &dum, sizeof (dum)); ! 926: len -= sizeof (dum); ! 927: } ! 928: } ! 929: ! 930: else ! 931: { ! 932: /* Drive wants a command packet, or invalid ireason... */ ! 933: printk ("%s: cdrom_read_intr: bad interrupt reason %d\n", ! 934: drive->name, ireason); ! 935: } ! 936: ! 937: cdrom_end_request (0, drive); ! 938: return -1; ! 939: } ! 940: ! 941: ! 942: /* ! 943: * Interrupt routine. Called when a read request has completed. ! 944: */ ! 945: static void cdrom_read_intr (ide_drive_t *drive) ! 946: { ! 947: int stat; ! 948: int ireason, len, sectors_to_transfer, nskip; ! 949: ! 950: struct request *rq = HWGROUP(drive)->rq; ! 951: ! 952: /* Check for errors. */ ! 953: if (cdrom_decode_status (drive, 0, &stat)) return; ! 954: ! 955: /* Read the interrupt reason and the transfer length. */ ! 956: ireason = IN_BYTE (IDE_NSECTOR_REG); ! 957: len = IN_BYTE (IDE_LCYL_REG) + 256 * IN_BYTE (IDE_HCYL_REG); ! 958: ! 959: /* If DRQ is clear, the command has completed. */ ! 960: if ((stat & DRQ_STAT) == 0) ! 961: { ! 962: /* If we're not done filling the current buffer, complain. ! 963: Otherwise, complete the command normally. */ ! 964: if (rq->current_nr_sectors > 0) ! 965: { ! 966: printk ("%s: cdrom_read_intr: data underrun (%ld blocks)\n", ! 967: drive->name, rq->current_nr_sectors); ! 968: cdrom_end_request (0, drive); ! 969: } ! 970: else ! 971: cdrom_end_request (1, drive); ! 972: ! 973: return; ! 974: } ! 975: ! 976: /* Check that the drive is expecting to do the same thing that we are. */ ! 977: if (cdrom_read_check_ireason (drive, len, ireason)) return; ! 978: ! 979: /* Assume that the drive will always provide data in multiples of at least ! 980: SECTOR_SIZE, as it gets hairy to keep track of the transfers otherwise. */ ! 981: if ((len % SECTOR_SIZE) != 0) ! 982: { ! 983: printk ("%s: cdrom_read_intr: Bad transfer size %d\n", ! 984: drive->name, len); ! 985: printk (" This drive is not supported by this version of the driver\n"); ! 986: cdrom_end_request (0, drive); ! 987: return; ! 988: } ! 989: ! 990: /* The number of sectors we need to read from the drive. */ ! 991: sectors_to_transfer = len / SECTOR_SIZE; ! 992: ! 993: /* First, figure out if we need to bit-bucket any of the leading sectors. */ ! 994: nskip = MIN ((int)(rq->current_nr_sectors - (rq->bh->b_size >> SECTOR_BITS)), ! 995: sectors_to_transfer); ! 996: ! 997: while (nskip > 0) ! 998: { ! 999: /* We need to throw away a sector. */ ! 1000: char dum[SECTOR_SIZE]; ! 1001: cdrom_in_bytes (drive, dum, sizeof (dum)); ! 1002: ! 1003: --rq->current_nr_sectors; ! 1004: --nskip; ! 1005: --sectors_to_transfer; ! 1006: } ! 1007: ! 1008: /* Now loop while we still have data to read from the drive. */ ! 1009: while (sectors_to_transfer > 0) ! 1010: { ! 1011: int this_transfer; ! 1012: ! 1013: /* If we've filled the present buffer but there's another chained ! 1014: buffer after it, move on. */ ! 1015: if (rq->current_nr_sectors == 0 && ! 1016: rq->nr_sectors > 0) ! 1017: cdrom_end_request (1, drive); ! 1018: ! 1019: /* If the buffers are full, cache the rest of the data in our ! 1020: internal buffer. */ ! 1021: if (rq->current_nr_sectors == 0) ! 1022: { ! 1023: cdrom_buffer_sectors (drive, rq->sector, sectors_to_transfer); ! 1024: sectors_to_transfer = 0; ! 1025: } ! 1026: else ! 1027: { ! 1028: /* Transfer data to the buffers. ! 1029: Figure out how many sectors we can transfer ! 1030: to the current buffer. */ ! 1031: this_transfer = MIN (sectors_to_transfer, ! 1032: rq->current_nr_sectors); ! 1033: ! 1034: /* Read this_transfer sectors into the current buffer. */ ! 1035: while (this_transfer > 0) ! 1036: { ! 1037: cdrom_in_bytes (drive, rq->buffer, SECTOR_SIZE); ! 1038: rq->buffer += SECTOR_SIZE; ! 1039: --rq->nr_sectors; ! 1040: --rq->current_nr_sectors; ! 1041: ++rq->sector; ! 1042: --this_transfer; ! 1043: --sectors_to_transfer; ! 1044: } ! 1045: } ! 1046: } ! 1047: ! 1048: /* Done moving data! ! 1049: Wait for another interrupt. */ ! 1050: ide_set_handler (drive, &cdrom_read_intr, WAIT_CMD); ! 1051: } ! 1052: ! 1053: ! 1054: /* ! 1055: * Try to satisfy some of the current read request from our cached data. ! 1056: * Returns nonzero if the request has been completed, zero otherwise. ! 1057: */ ! 1058: static int cdrom_read_from_buffer (ide_drive_t *drive) ! 1059: { ! 1060: struct cdrom_info *info = &drive->cdrom_info; ! 1061: struct request *rq = HWGROUP(drive)->rq; ! 1062: ! 1063: /* Can't do anything if there's no buffer. */ ! 1064: if (info->sector_buffer == NULL) return 0; ! 1065: ! 1066: /* Loop while this request needs data and the next block is present ! 1067: in our cache. */ ! 1068: while (rq->nr_sectors > 0 && ! 1069: rq->sector >= info->sector_buffered && ! 1070: rq->sector < info->sector_buffered + info->nsectors_buffered) ! 1071: { ! 1072: if (rq->current_nr_sectors == 0) ! 1073: cdrom_end_request (1, drive); ! 1074: ! 1075: memcpy (rq->buffer, ! 1076: info->sector_buffer + ! 1077: (rq->sector - info->sector_buffered) * SECTOR_SIZE, ! 1078: SECTOR_SIZE); ! 1079: rq->buffer += SECTOR_SIZE; ! 1080: --rq->current_nr_sectors; ! 1081: --rq->nr_sectors; ! 1082: ++rq->sector; ! 1083: } ! 1084: ! 1085: /* If we've satisfied the current request, terminate it successfully. */ ! 1086: if (rq->nr_sectors == 0) ! 1087: { ! 1088: cdrom_end_request (1, drive); ! 1089: return -1; ! 1090: } ! 1091: ! 1092: /* Move on to the next buffer if needed. */ ! 1093: if (rq->current_nr_sectors == 0) ! 1094: cdrom_end_request (1, drive); ! 1095: ! 1096: /* If this condition does not hold, then the kluge i use to ! 1097: represent the number of sectors to skip at the start of a transfer ! 1098: will fail. I think that this will never happen, but let's be ! 1099: paranoid and check. */ ! 1100: if (rq->current_nr_sectors < (rq->bh->b_size >> SECTOR_BITS) && ! 1101: (rq->sector % SECTORS_PER_FRAME) != 0) ! 1102: { ! 1103: printk ("%s: cdrom_read_from_buffer: buffer botch (%ld)\n", ! 1104: drive->name, rq->sector); ! 1105: cdrom_end_request (0, drive); ! 1106: return -1; ! 1107: } ! 1108: ! 1109: return 0; ! 1110: } ! 1111: ! 1112: ! 1113: ! 1114: /* ! 1115: * Routine to send a read packet command to the drive. ! 1116: * This is usually called directly from cdrom_start_read. ! 1117: * However, for drq_interrupt devices, it is called from an interrupt ! 1118: * when the drive is ready to accept the command. ! 1119: */ ! 1120: static void cdrom_start_read_continuation (ide_drive_t *drive) ! 1121: { ! 1122: struct packet_command pc; ! 1123: struct request *rq = HWGROUP(drive)->rq; ! 1124: ! 1125: int nsect, sector, nframes, frame, nskip; ! 1126: ! 1127: /* Number of sectors to transfer. */ ! 1128: nsect = rq->nr_sectors; ! 1129: ! 1130: /* Starting sector. */ ! 1131: sector = rq->sector; ! 1132: ! 1133: /* If the requested sector doesn't start on a cdrom block boundary, ! 1134: we must adjust the start of the transfer so that it does, ! 1135: and remember to skip the first few sectors. If the CURRENT_NR_SECTORS ! 1136: field is larger than the size of the buffer, it will mean that ! 1137: we're to skip a number of sectors equal to the amount by which ! 1138: CURRENT_NR_SECTORS is larger than the buffer size. */ ! 1139: nskip = (sector % SECTORS_PER_FRAME); ! 1140: if (nskip > 0) ! 1141: { ! 1142: /* Sanity check... */ ! 1143: if (rq->current_nr_sectors != (rq->bh->b_size >> SECTOR_BITS)) ! 1144: { ! 1145: printk ("%s: cdrom_start_read_continuation: buffer botch (%ld)\n", ! 1146: drive->name, rq->current_nr_sectors); ! 1147: cdrom_end_request (0, drive); ! 1148: return; ! 1149: } ! 1150: ! 1151: sector -= nskip; ! 1152: nsect += nskip; ! 1153: rq->current_nr_sectors += nskip; ! 1154: } ! 1155: ! 1156: /* Convert from sectors to cdrom blocks, rounding up the transfer ! 1157: length if needed. */ ! 1158: nframes = (nsect + SECTORS_PER_FRAME-1) / SECTORS_PER_FRAME; ! 1159: frame = sector / SECTORS_PER_FRAME; ! 1160: ! 1161: /* Largest number of frames was can transfer at once is 64k-1. */ ! 1162: nframes = MIN (nframes, 65535); ! 1163: ! 1164: /* Set up the command */ ! 1165: memset (&pc.c, 0, sizeof (pc.c)); ! 1166: pc.c[0] = READ_10; ! 1167: pc.c[7] = (nframes >> 8); ! 1168: pc.c[8] = (nframes & 0xff); ! 1169: #ifdef __alpha__ ! 1170: stl_u (htonl (frame), (unsigned int *) &pc.c[2]); ! 1171: #else ! 1172: *(int *)(&pc.c[2]) = htonl (frame); ! 1173: #endif ! 1174: ! 1175: /* Send the command to the drive and return. */ ! 1176: (void) cdrom_transfer_packet_command (drive, pc.c, sizeof (pc.c), ! 1177: &cdrom_read_intr); ! 1178: } ! 1179: ! 1180: ! 1181: /* ! 1182: * Start a read request from the CD-ROM. ! 1183: */ ! 1184: static void cdrom_start_read (ide_drive_t *drive, unsigned int block) ! 1185: { ! 1186: struct request *rq = HWGROUP(drive)->rq; ! 1187: int minor = MINOR (rq->rq_dev); ! 1188: ! 1189: /* If the request is relative to a partition, fix it up to refer to the ! 1190: absolute address. */ ! 1191: if ((minor & PARTN_MASK) != 0) { ! 1192: rq->sector = block; ! 1193: minor &= ~PARTN_MASK; ! 1194: rq->rq_dev = MKDEV (MAJOR(rq->rq_dev), minor); ! 1195: } ! 1196: ! 1197: /* We may be retrying this request after an error. ! 1198: Fix up any weirdness which might be present in the request packet. */ ! 1199: restore_request (rq); ! 1200: ! 1201: /* Satisfy whatever we can of this request from our cached sector. */ ! 1202: if (cdrom_read_from_buffer (drive)) ! 1203: return; ! 1204: ! 1205: /* Clear the local sector buffer. */ ! 1206: drive->cdrom_info.nsectors_buffered = 0; ! 1207: ! 1208: /* Start sending the read request to the drive. */ ! 1209: cdrom_start_packet_command (drive, 32768, cdrom_start_read_continuation); ! 1210: } ! 1211: ! 1212: ! 1213: ! 1214: ! 1215: /**************************************************************************** ! 1216: * Execute all other packet commands. ! 1217: */ ! 1218: ! 1219: /* Forward declarations. */ ! 1220: static int ! 1221: cdrom_lockdoor (ide_drive_t *drive, int lockflag, ! 1222: struct atapi_request_sense *reqbuf); ! 1223: ! 1224: ! 1225: ! 1226: /* Interrupt routine for packet command completion. */ ! 1227: static void cdrom_pc_intr (ide_drive_t *drive) ! 1228: { ! 1229: int ireason, len, stat, thislen; ! 1230: struct request *rq = HWGROUP(drive)->rq; ! 1231: struct packet_command *pc = (struct packet_command *)rq->buffer; ! 1232: ! 1233: /* Check for errors. */ ! 1234: if (cdrom_decode_status (drive, 0, &stat)) return; ! 1235: ! 1236: /* Read the interrupt reason and the transfer length. */ ! 1237: ireason = IN_BYTE (IDE_NSECTOR_REG); ! 1238: len = IN_BYTE (IDE_LCYL_REG) + 256 * IN_BYTE (IDE_HCYL_REG); ! 1239: ! 1240: /* If DRQ is clear, the command has completed. ! 1241: Complain if we still have data left to transfer. */ ! 1242: if ((stat & DRQ_STAT) == 0) ! 1243: { ! 1244: /* Some of the trailing request sense fields are optional, and ! 1245: some drives don't send them. Sigh. */ ! 1246: if (pc->c[0] == REQUEST_SENSE && pc->buflen > 0 && pc->buflen <= 5) { ! 1247: while (pc->buflen > 0) { ! 1248: *pc->buffer++ = 0; ! 1249: --pc->buflen; ! 1250: } ! 1251: } ! 1252: ! 1253: if (pc->buflen == 0) ! 1254: cdrom_end_request (1, drive); ! 1255: else ! 1256: { ! 1257: printk ("%s: cdrom_pc_intr: data underrun %d\n", ! 1258: drive->name, pc->buflen); ! 1259: pc->stat = 1; ! 1260: cdrom_end_request (1, drive); ! 1261: } ! 1262: return; ! 1263: } ! 1264: ! 1265: /* Figure out how much data to transfer. */ ! 1266: thislen = pc->buflen; ! 1267: if (thislen < 0) thislen = -thislen; ! 1268: if (thislen > len) thislen = len; ! 1269: ! 1270: /* The drive wants to be written to. */ ! 1271: if ((ireason & 3) == 0) ! 1272: { ! 1273: /* Check that we want to write. */ ! 1274: if (pc->buflen > 0) ! 1275: { ! 1276: printk ("%s: cdrom_pc_intr: Drive wants to transfer data the wrong way!\n", ! 1277: drive->name); ! 1278: pc->stat = 1; ! 1279: thislen = 0; ! 1280: } ! 1281: ! 1282: /* Transfer the data. */ ! 1283: cdrom_out_bytes (drive, pc->buffer, thislen); ! 1284: ! 1285: /* If we haven't moved enough data to satisfy the drive, ! 1286: add some padding. */ ! 1287: while (len > thislen) ! 1288: { ! 1289: int dum = 0; ! 1290: cdrom_out_bytes (drive, &dum, sizeof (dum)); ! 1291: len -= sizeof (dum); ! 1292: } ! 1293: ! 1294: /* Keep count of how much data we've moved. */ ! 1295: pc->buffer += thislen; ! 1296: pc->buflen += thislen; ! 1297: } ! 1298: ! 1299: /* Same drill for reading. */ ! 1300: else if ((ireason & 3) == 2) ! 1301: { ! 1302: /* Check that we want to read. */ ! 1303: if (pc->buflen < 0) ! 1304: { ! 1305: printk ("%s: cdrom_pc_intr: Drive wants to transfer data the wrong way!\n", ! 1306: drive->name); ! 1307: pc->stat = 1; ! 1308: thislen = 0; ! 1309: } ! 1310: ! 1311: /* Transfer the data. */ ! 1312: cdrom_in_bytes (drive, pc->buffer, thislen); ! 1313: ! 1314: /* If we haven't moved enough data to satisfy the drive, ! 1315: add some padding. */ ! 1316: while (len > thislen) ! 1317: { ! 1318: int dum = 0; ! 1319: cdrom_in_bytes (drive, &dum, sizeof (dum)); ! 1320: len -= sizeof (dum); ! 1321: } ! 1322: ! 1323: /* Keep count of how much data we've moved. */ ! 1324: pc->buffer += thislen; ! 1325: pc->buflen -= thislen; ! 1326: } ! 1327: ! 1328: else ! 1329: { ! 1330: printk ("%s: cdrom_pc_intr: The drive appears confused (ireason = 0x%2x)\n", ! 1331: drive->name, ireason); ! 1332: pc->stat = 1; ! 1333: } ! 1334: ! 1335: /* Now we wait for another interrupt. */ ! 1336: ide_set_handler (drive, &cdrom_pc_intr, WAIT_CMD); ! 1337: } ! 1338: ! 1339: ! 1340: static void cdrom_do_pc_continuation (ide_drive_t *drive) ! 1341: { ! 1342: struct request *rq = HWGROUP(drive)->rq; ! 1343: struct packet_command *pc = (struct packet_command *)rq->buffer; ! 1344: ! 1345: /* Send the command to the drive and return. */ ! 1346: cdrom_transfer_packet_command (drive, pc->c, sizeof (pc->c), &cdrom_pc_intr); ! 1347: } ! 1348: ! 1349: ! 1350: static void cdrom_do_packet_command (ide_drive_t *drive) ! 1351: { ! 1352: int len; ! 1353: struct request *rq = HWGROUP(drive)->rq; ! 1354: struct packet_command *pc = (struct packet_command *)rq->buffer; ! 1355: ! 1356: len = pc->buflen; ! 1357: if (len < 0) len = -len; ! 1358: ! 1359: pc->stat = 0; ! 1360: ! 1361: /* Start sending the command to the drive. */ ! 1362: cdrom_start_packet_command (drive, len, cdrom_do_pc_continuation); ! 1363: } ! 1364: ! 1365: #ifndef MACH ! 1366: /* Sleep for TIME jiffies. ! 1367: Not to be called from an interrupt handler. */ ! 1368: static ! 1369: void cdrom_sleep (int time) ! 1370: { ! 1371: current->state = TASK_INTERRUPTIBLE; ! 1372: current->timeout = jiffies + time; ! 1373: schedule (); ! 1374: } ! 1375: #endif ! 1376: ! 1377: static ! 1378: int cdrom_queue_packet_command (ide_drive_t *drive, struct packet_command *pc) ! 1379: { ! 1380: struct atapi_request_sense my_reqbuf; ! 1381: int retries = 10; ! 1382: struct request req; ! 1383: ! 1384: /* If our caller has not provided a place to stick any sense data, ! 1385: use our own area. */ ! 1386: if (pc->sense_data == NULL) ! 1387: pc->sense_data = &my_reqbuf; ! 1388: pc->sense_data->sense_key = 0; ! 1389: ! 1390: /* Start of retry loop. */ ! 1391: do { ! 1392: ide_init_drive_cmd (&req); ! 1393: req.cmd = PACKET_COMMAND; ! 1394: req.buffer = (char *)pc; ! 1395: (void) ide_do_drive_cmd (drive, &req, ide_wait); ! 1396: ! 1397: if (pc->stat != 0) ! 1398: { ! 1399: /* The request failed. Retry if it was due to a unit attention status ! 1400: (usually means media was changed). */ ! 1401: struct atapi_request_sense *reqbuf = pc->sense_data; ! 1402: ! 1403: if (reqbuf->sense_key == UNIT_ATTENTION) ! 1404: ; ! 1405: ! 1406: /* Also retry if the drive is in the process of loading a disk. ! 1407: This time, however, wait a little between retries to give ! 1408: the drive time. */ ! 1409: else if (reqbuf->sense_key == NOT_READY && reqbuf->asc == 4) ! 1410: { ! 1411: cdrom_sleep (HZ); ! 1412: } ! 1413: ! 1414: /* Otherwise, don't retry. */ ! 1415: else ! 1416: retries = 0; ! 1417: ! 1418: --retries; ! 1419: } ! 1420: ! 1421: /* End of retry loop. */ ! 1422: } while (pc->stat != 0 && retries >= 0); ! 1423: ! 1424: ! 1425: /* Return an error if the command failed. */ ! 1426: if (pc->stat != 0) ! 1427: return -EIO; ! 1428: ! 1429: else ! 1430: { ! 1431: /* The command succeeded. If it was anything other than a request sense, ! 1432: eject, or door lock command, and we think that the door is presently ! 1433: unlocked, lock it again. (The door was probably unlocked via ! 1434: an explicit CDROMEJECT ioctl.) */ ! 1435: if (CDROM_STATE_FLAGS (drive)->door_locked == 0 && ! 1436: (pc->c[0] != REQUEST_SENSE && ! 1437: pc->c[0] != ALLOW_MEDIUM_REMOVAL && ! 1438: pc->c[0] != START_STOP)) ! 1439: { ! 1440: (void) cdrom_lockdoor (drive, 1, NULL); ! 1441: } ! 1442: return 0; ! 1443: } ! 1444: } ! 1445: ! 1446: ! 1447: ! 1448: /**************************************************************************** ! 1449: * drive_cmd handling. ! 1450: * ! 1451: * Most of the functions accessed via drive_cmd are not valid for ATAPI ! 1452: * devices. Only attempt to execute those which actually should be valid. ! 1453: */ ! 1454: ! 1455: static ! 1456: void cdrom_do_drive_cmd (ide_drive_t *drive) ! 1457: { ! 1458: struct request *rq = HWGROUP(drive)->rq; ! 1459: byte *args = rq->buffer; ! 1460: ! 1461: if (args) ! 1462: { ! 1463: #if 0 /* This bit isn't done yet... */ ! 1464: if (args[0] == WIN_SETFEATURES && ! 1465: (args[2] == 0x66 || args[2] == 0xcc || args[2] == 0x02 || ! 1466: args[2] == 0xdd || args[2] == 0x5d)) ! 1467: { ! 1468: OUT_BYTE (args[2], io_base + IDE_FEATURE_OFFSET); ! 1469: <send cmd> ! 1470: } ! 1471: else ! 1472: #endif ! 1473: { ! 1474: printk ("%s: Unsupported drive command %02x %02x %02x\n", ! 1475: drive->name, args[0], args[1], args[2]); ! 1476: rq->errors = 1; ! 1477: } ! 1478: } ! 1479: ! 1480: cdrom_end_request (1, drive); ! 1481: } ! 1482: ! 1483: ! 1484: ! 1485: /**************************************************************************** ! 1486: * cdrom driver request routine. ! 1487: */ ! 1488: ! 1489: void ide_do_rw_cdrom (ide_drive_t *drive, unsigned long block) ! 1490: { ! 1491: struct request *rq = HWGROUP(drive)->rq; ! 1492: ! 1493: if (rq -> cmd == PACKET_COMMAND || rq -> cmd == REQUEST_SENSE_COMMAND) ! 1494: cdrom_do_packet_command (drive); ! 1495: ! 1496: else if (rq -> cmd == RESET_DRIVE_COMMAND) ! 1497: { ! 1498: cdrom_end_request (1, drive); ! 1499: ide_do_reset (drive); ! 1500: return; ! 1501: } ! 1502: ! 1503: else if (rq -> cmd == IDE_DRIVE_CMD) ! 1504: cdrom_do_drive_cmd (drive); ! 1505: ! 1506: else if (rq -> cmd != READ) ! 1507: { ! 1508: printk ("ide-cd: bad cmd %d\n", rq -> cmd); ! 1509: cdrom_end_request (0, drive); ! 1510: } ! 1511: else ! 1512: cdrom_start_read (drive, block); ! 1513: } ! 1514: ! 1515: ! 1516: ! 1517: /**************************************************************************** ! 1518: * Ioctl handling. ! 1519: * ! 1520: * Routines which queue packet commands take as a final argument a pointer ! 1521: * to an atapi_request_sense struct. If execution of the command results ! 1522: * in an error with a CHECK CONDITION status, this structure will be filled ! 1523: * with the results of the subsequent request sense command. The pointer ! 1524: * can also be NULL, in which case no sense information is returned. ! 1525: */ ! 1526: ! 1527: #if ! STANDARD_ATAPI ! 1528: static ! 1529: int bin2bcd (int x) ! 1530: { ! 1531: return (x%10) | ((x/10) << 4); ! 1532: } ! 1533: ! 1534: ! 1535: static ! 1536: int bcd2bin (int x) ! 1537: { ! 1538: return (x >> 4) * 10 + (x & 0x0f); ! 1539: } ! 1540: #endif /* not STANDARD_ATAPI */ ! 1541: ! 1542: ! 1543: static inline ! 1544: void lba_to_msf (int lba, byte *m, byte *s, byte *f) ! 1545: { ! 1546: lba += CD_BLOCK_OFFSET; ! 1547: lba &= 0xffffff; /* negative lbas use only 24 bits */ ! 1548: *m = lba / (CD_SECS * CD_FRAMES); ! 1549: lba %= (CD_SECS * CD_FRAMES); ! 1550: *s = lba / CD_FRAMES; ! 1551: *f = lba % CD_FRAMES; ! 1552: } ! 1553: ! 1554: ! 1555: static inline ! 1556: int msf_to_lba (byte m, byte s, byte f) ! 1557: { ! 1558: return (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_BLOCK_OFFSET; ! 1559: } ! 1560: ! 1561: ! 1562: static int ! 1563: cdrom_check_status (ide_drive_t *drive, ! 1564: struct atapi_request_sense *reqbuf) ! 1565: { ! 1566: struct packet_command pc; ! 1567: ! 1568: memset (&pc, 0, sizeof (pc)); ! 1569: ! 1570: pc.sense_data = reqbuf; ! 1571: pc.c[0] = TEST_UNIT_READY; ! 1572: ! 1573: return cdrom_queue_packet_command (drive, &pc); ! 1574: } ! 1575: ! 1576: ! 1577: /* Lock the door if LOCKFLAG is nonzero; unlock it otherwise. */ ! 1578: static int ! 1579: cdrom_lockdoor (ide_drive_t *drive, int lockflag, ! 1580: struct atapi_request_sense *reqbuf) ! 1581: { ! 1582: struct atapi_request_sense my_reqbuf; ! 1583: int stat; ! 1584: struct packet_command pc; ! 1585: ! 1586: if (reqbuf == NULL) ! 1587: reqbuf = &my_reqbuf; ! 1588: ! 1589: /* If the drive cannot lock the door, just pretend. */ ! 1590: if (CDROM_CONFIG_FLAGS (drive)->no_doorlock) ! 1591: stat = 0; ! 1592: else ! 1593: { ! 1594: memset (&pc, 0, sizeof (pc)); ! 1595: pc.sense_data = reqbuf; ! 1596: ! 1597: pc.c[0] = ALLOW_MEDIUM_REMOVAL; ! 1598: pc.c[4] = (lockflag != 0); ! 1599: stat = cdrom_queue_packet_command (drive, &pc); ! 1600: } ! 1601: ! 1602: if (stat == 0) ! 1603: CDROM_STATE_FLAGS (drive)->door_locked = lockflag; ! 1604: else ! 1605: { ! 1606: /* If we got an illegal field error, the drive ! 1607: probably cannot lock the door. */ ! 1608: if (reqbuf->sense_key == ILLEGAL_REQUEST && reqbuf->asc == 0x24) ! 1609: { ! 1610: printk ("%s: door locking not supported\n", drive->name); ! 1611: CDROM_CONFIG_FLAGS (drive)->no_doorlock = 1; ! 1612: stat = 0; ! 1613: CDROM_STATE_FLAGS (drive)->door_locked = lockflag; ! 1614: } ! 1615: } ! 1616: return stat; ! 1617: } ! 1618: ! 1619: ! 1620: /* Eject the disk if EJECTFLAG is 0. ! 1621: If EJECTFLAG is 1, try to reload the disk. */ ! 1622: static int ! 1623: cdrom_eject (ide_drive_t *drive, int ejectflag, ! 1624: struct atapi_request_sense *reqbuf) ! 1625: { ! 1626: struct packet_command pc; ! 1627: ! 1628: memset (&pc, 0, sizeof (pc)); ! 1629: pc.sense_data = reqbuf; ! 1630: ! 1631: pc.c[0] = START_STOP; ! 1632: pc.c[4] = 2 + (ejectflag != 0); ! 1633: return cdrom_queue_packet_command (drive, &pc); ! 1634: } ! 1635: ! 1636: ! 1637: static int ! 1638: cdrom_pause (ide_drive_t *drive, int pauseflag, ! 1639: struct atapi_request_sense *reqbuf) ! 1640: { ! 1641: struct packet_command pc; ! 1642: ! 1643: memset (&pc, 0, sizeof (pc)); ! 1644: pc.sense_data = reqbuf; ! 1645: ! 1646: pc.c[0] = SCMD_PAUSE_RESUME; ! 1647: pc.c[8] = !pauseflag; ! 1648: return cdrom_queue_packet_command (drive, &pc); ! 1649: } ! 1650: ! 1651: ! 1652: static int ! 1653: cdrom_startstop (ide_drive_t *drive, int startflag, ! 1654: struct atapi_request_sense *reqbuf) ! 1655: { ! 1656: struct packet_command pc; ! 1657: ! 1658: memset (&pc, 0, sizeof (pc)); ! 1659: pc.sense_data = reqbuf; ! 1660: ! 1661: pc.c[0] = START_STOP; ! 1662: pc.c[1] = 1; ! 1663: pc.c[4] = startflag; ! 1664: return cdrom_queue_packet_command (drive, &pc); ! 1665: } ! 1666: ! 1667: ! 1668: static int ! 1669: cdrom_read_capacity (ide_drive_t *drive, unsigned *capacity, ! 1670: struct atapi_request_sense *reqbuf) ! 1671: { ! 1672: struct { ! 1673: unsigned lba; ! 1674: unsigned blocklen; ! 1675: } capbuf; ! 1676: ! 1677: int stat; ! 1678: struct packet_command pc; ! 1679: ! 1680: memset (&pc, 0, sizeof (pc)); ! 1681: pc.sense_data = reqbuf; ! 1682: ! 1683: pc.c[0] = READ_CAPACITY; ! 1684: pc.buffer = (char *)&capbuf; ! 1685: pc.buflen = sizeof (capbuf); ! 1686: ! 1687: stat = cdrom_queue_packet_command (drive, &pc); ! 1688: if (stat == 0) ! 1689: { ! 1690: *capacity = ntohl (capbuf.lba); ! 1691: } ! 1692: ! 1693: return stat; ! 1694: } ! 1695: ! 1696: ! 1697: static int ! 1698: cdrom_read_tocentry (ide_drive_t *drive, int trackno, int msf_flag, ! 1699: int format, char *buf, int buflen, ! 1700: struct atapi_request_sense *reqbuf) ! 1701: { ! 1702: struct packet_command pc; ! 1703: ! 1704: memset (&pc, 0, sizeof (pc)); ! 1705: pc.sense_data = reqbuf; ! 1706: ! 1707: pc.buffer = buf; ! 1708: pc.buflen = buflen; ! 1709: pc.c[0] = SCMD_READ_TOC; ! 1710: pc.c[6] = trackno; ! 1711: pc.c[7] = (buflen >> 8); ! 1712: pc.c[8] = (buflen & 0xff); ! 1713: pc.c[9] = (format << 6); ! 1714: if (msf_flag) pc.c[1] = 2; ! 1715: return cdrom_queue_packet_command (drive, &pc); ! 1716: } ! 1717: ! 1718: ! 1719: /* Try to read the entire TOC for the disk into our internal buffer. */ ! 1720: static int ! 1721: cdrom_read_toc (ide_drive_t *drive, ! 1722: struct atapi_request_sense *reqbuf) ! 1723: { ! 1724: int msf_flag; ! 1725: int stat, ntracks, i; ! 1726: struct atapi_toc *toc = drive->cdrom_info.toc; ! 1727: struct { ! 1728: struct atapi_toc_header hdr; ! 1729: struct atapi_toc_entry ent; ! 1730: } ms_tmp; ! 1731: ! 1732: if (toc == NULL) ! 1733: { ! 1734: /* Try to allocate space. */ ! 1735: toc = (struct atapi_toc *) kmalloc (sizeof (struct atapi_toc), ! 1736: GFP_KERNEL); ! 1737: drive->cdrom_info.toc = toc; ! 1738: } ! 1739: ! 1740: if (toc == NULL) ! 1741: { ! 1742: printk ("%s: No cdrom TOC buffer!\n", drive->name); ! 1743: return -EIO; ! 1744: } ! 1745: ! 1746: /* Check to see if the existing data is still valid. ! 1747: If it is, just return. */ ! 1748: if (CDROM_STATE_FLAGS (drive)->toc_valid) ! 1749: (void) cdrom_check_status (drive, NULL); ! 1750: ! 1751: if (CDROM_STATE_FLAGS (drive)->toc_valid) return 0; ! 1752: ! 1753: #if STANDARD_ATAPI ! 1754: msf_flag = 0; ! 1755: #else /* not STANDARD_ATAPI */ ! 1756: /* Some drives can't return TOC data in LBA format. */ ! 1757: msf_flag = (CDROM_CONFIG_FLAGS (drive)->no_lba_toc); ! 1758: #endif /* not STANDARD_ATAPI */ ! 1759: ! 1760: /* First read just the header, so we know how long the TOC is. */ ! 1761: stat = cdrom_read_tocentry (drive, 0, msf_flag, 0, (char *)&toc->hdr, ! 1762: sizeof (struct atapi_toc_header) + ! 1763: sizeof (struct atapi_toc_entry), ! 1764: reqbuf); ! 1765: if (stat) return stat; ! 1766: ! 1767: #if ! STANDARD_ATAPI ! 1768: if (CDROM_CONFIG_FLAGS (drive)->vertos_lossage) ! 1769: { ! 1770: toc->hdr.first_track = bcd2bin (toc->hdr.first_track); ! 1771: toc->hdr.last_track = bcd2bin (toc->hdr.last_track); ! 1772: /* hopefully the length is not BCD, too ;-| */ ! 1773: } ! 1774: #endif /* not STANDARD_ATAPI */ ! 1775: ! 1776: ntracks = toc->hdr.last_track - toc->hdr.first_track + 1; ! 1777: if (ntracks <= 0) return -EIO; ! 1778: if (ntracks > MAX_TRACKS) ntracks = MAX_TRACKS; ! 1779: ! 1780: /* Now read the whole schmeer. */ ! 1781: stat = cdrom_read_tocentry (drive, 0, msf_flag, 0, (char *)&toc->hdr, ! 1782: sizeof (struct atapi_toc_header) + ! 1783: (ntracks+1) * sizeof (struct atapi_toc_entry), ! 1784: reqbuf); ! 1785: if (stat) return stat; ! 1786: toc->hdr.toc_length = ntohs (toc->hdr.toc_length); ! 1787: ! 1788: #if ! STANDARD_ATAPI ! 1789: if (CDROM_CONFIG_FLAGS (drive)->vertos_lossage) ! 1790: { ! 1791: toc->hdr.first_track = bcd2bin (toc->hdr.first_track); ! 1792: toc->hdr.last_track = bcd2bin (toc->hdr.last_track); ! 1793: /* hopefully the length is not BCD, too ;-| */ ! 1794: } ! 1795: #endif /* not STANDARD_ATAPI */ ! 1796: ! 1797: for (i=0; i<=ntracks; i++) ! 1798: { ! 1799: #if ! STANDARD_ATAPI ! 1800: if (msf_flag) ! 1801: { ! 1802: if (CDROM_CONFIG_FLAGS (drive)->vertos_lossage) ! 1803: { ! 1804: toc->ent[i].track = bcd2bin (toc->ent[i].track); ! 1805: toc->ent[i].addr.msf.m = bcd2bin (toc->ent[i].addr.msf.m); ! 1806: toc->ent[i].addr.msf.s = bcd2bin (toc->ent[i].addr.msf.s); ! 1807: toc->ent[i].addr.msf.f = bcd2bin (toc->ent[i].addr.msf.f); ! 1808: } ! 1809: toc->ent[i].addr.lba = msf_to_lba (toc->ent[i].addr.msf.m, ! 1810: toc->ent[i].addr.msf.s, ! 1811: toc->ent[i].addr.msf.f); ! 1812: } ! 1813: else ! 1814: #endif /* not STANDARD_ATAPI */ ! 1815: toc->ent[i].addr.lba = ntohl (toc->ent[i].addr.lba); ! 1816: } ! 1817: ! 1818: /* Read the multisession information. */ ! 1819: stat = cdrom_read_tocentry (drive, 0, msf_flag, 1, ! 1820: (char *)&ms_tmp, sizeof (ms_tmp), ! 1821: reqbuf); ! 1822: if (stat) return stat; ! 1823: #if ! STANDARD_ATAPI ! 1824: if (msf_flag) ! 1825: toc->last_session_lba = msf_to_lba (ms_tmp.ent.addr.msf.m, ! 1826: ms_tmp.ent.addr.msf.s, ! 1827: ms_tmp.ent.addr.msf.f); ! 1828: else ! 1829: #endif /* not STANDARD_ATAPI */ ! 1830: toc->last_session_lba = ntohl (ms_tmp.ent.addr.lba); ! 1831: ! 1832: toc->xa_flag = (ms_tmp.hdr.first_track != ms_tmp.hdr.last_track); ! 1833: ! 1834: /* Now try to get the total cdrom capacity. */ ! 1835: stat = cdrom_read_capacity (drive, &toc->capacity, reqbuf); ! 1836: if (stat) toc->capacity = 0x1fffff; ! 1837: ! 1838: HWIF(drive)->gd->sizes[drive->select.b.unit << PARTN_BITS] ! 1839: = toc->capacity * SECTORS_PER_FRAME; ! 1840: drive->part[0].nr_sects = toc->capacity * SECTORS_PER_FRAME; ! 1841: ! 1842: /* Remember that we've read this stuff. */ ! 1843: CDROM_STATE_FLAGS (drive)->toc_valid = 1; ! 1844: ! 1845: return 0; ! 1846: } ! 1847: ! 1848: ! 1849: static int ! 1850: cdrom_read_subchannel (ide_drive_t *drive, ! 1851: char *buf, int buflen, ! 1852: struct atapi_request_sense *reqbuf) ! 1853: { ! 1854: struct packet_command pc; ! 1855: ! 1856: memset (&pc, 0, sizeof (pc)); ! 1857: pc.sense_data = reqbuf; ! 1858: ! 1859: pc.buffer = buf; ! 1860: pc.buflen = buflen; ! 1861: pc.c[0] = SCMD_READ_SUBCHANNEL; ! 1862: pc.c[2] = 0x40; /* request subQ data */ ! 1863: pc.c[3] = 0x01; /* Format 1: current position */ ! 1864: pc.c[7] = (buflen >> 8); ! 1865: pc.c[8] = (buflen & 0xff); ! 1866: return cdrom_queue_packet_command (drive, &pc); ! 1867: } ! 1868: ! 1869: ! 1870: /* modeflag: 0 = current, 1 = changeable mask, 2 = default, 3 = saved */ ! 1871: static int ! 1872: cdrom_mode_sense (ide_drive_t *drive, int pageno, int modeflag, ! 1873: char *buf, int buflen, ! 1874: struct atapi_request_sense *reqbuf) ! 1875: { ! 1876: struct packet_command pc; ! 1877: ! 1878: memset (&pc, 0, sizeof (pc)); ! 1879: pc.sense_data = reqbuf; ! 1880: ! 1881: pc.buffer = buf; ! 1882: pc.buflen = buflen; ! 1883: pc.c[0] = MODE_SENSE_10; ! 1884: pc.c[2] = pageno | (modeflag << 6); ! 1885: pc.c[7] = (buflen >> 8); ! 1886: pc.c[8] = (buflen & 0xff); ! 1887: return cdrom_queue_packet_command (drive, &pc); ! 1888: } ! 1889: ! 1890: ! 1891: static int ! 1892: cdrom_mode_select (ide_drive_t *drive, int pageno, char *buf, int buflen, ! 1893: struct atapi_request_sense *reqbuf) ! 1894: { ! 1895: struct packet_command pc; ! 1896: ! 1897: memset (&pc, 0, sizeof (pc)); ! 1898: pc.sense_data = reqbuf; ! 1899: ! 1900: pc.buffer = buf; ! 1901: pc.buflen = - buflen; ! 1902: pc.c[0] = MODE_SELECT_10; ! 1903: pc.c[1] = 0x10; ! 1904: pc.c[2] = pageno; ! 1905: pc.c[7] = (buflen >> 8); ! 1906: pc.c[8] = (buflen & 0xff); ! 1907: return cdrom_queue_packet_command (drive, &pc); ! 1908: } ! 1909: ! 1910: ! 1911: static int ! 1912: cdrom_play_lba_range_play12 (ide_drive_t *drive, int lba_start, int lba_end, ! 1913: struct atapi_request_sense *reqbuf) ! 1914: { ! 1915: struct packet_command pc; ! 1916: ! 1917: memset (&pc, 0, sizeof (pc)); ! 1918: pc.sense_data = reqbuf; ! 1919: ! 1920: pc.c[0] = SCMD_PLAYAUDIO12; ! 1921: #ifdef __alpha__ ! 1922: stq_u(((long) htonl (lba_end - lba_start) << 32) | htonl(lba_start), ! 1923: (unsigned long *) &pc.c[2]); ! 1924: #else ! 1925: *(int *)(&pc.c[2]) = htonl (lba_start); ! 1926: *(int *)(&pc.c[6]) = htonl (lba_end - lba_start); ! 1927: #endif ! 1928: ! 1929: return cdrom_queue_packet_command (drive, &pc); ! 1930: } ! 1931: ! 1932: ! 1933: #if ! STANDARD_ATAPI ! 1934: static int ! 1935: cdrom_play_lba_range_msf (ide_drive_t *drive, int lba_start, int lba_end, ! 1936: struct atapi_request_sense *reqbuf) ! 1937: { ! 1938: struct packet_command pc; ! 1939: ! 1940: memset (&pc, 0, sizeof (pc)); ! 1941: pc.sense_data = reqbuf; ! 1942: ! 1943: pc.c[0] = SCMD_PLAYAUDIO_MSF; ! 1944: lba_to_msf (lba_start, &pc.c[3], &pc.c[4], &pc.c[5]); ! 1945: lba_to_msf (lba_end-1, &pc.c[6], &pc.c[7], &pc.c[8]); ! 1946: ! 1947: if (CDROM_CONFIG_FLAGS (drive)->playmsf_uses_bcd) ! 1948: { ! 1949: pc.c[3] = bin2bcd (pc.c[3]); ! 1950: pc.c[4] = bin2bcd (pc.c[4]); ! 1951: pc.c[5] = bin2bcd (pc.c[5]); ! 1952: pc.c[6] = bin2bcd (pc.c[6]); ! 1953: pc.c[7] = bin2bcd (pc.c[7]); ! 1954: pc.c[8] = bin2bcd (pc.c[8]); ! 1955: } ! 1956: ! 1957: return cdrom_queue_packet_command (drive, &pc); ! 1958: } ! 1959: #endif /* not STANDARD_ATAPI */ ! 1960: ! 1961: ! 1962: static int ! 1963: cdrom_play_lba_range_1 (ide_drive_t *drive, int lba_start, int lba_end, ! 1964: struct atapi_request_sense *reqbuf) ! 1965: { ! 1966: /* This is rather annoying. ! 1967: My NEC-260 won't recognize group 5 commands such as PLAYAUDIO12; ! 1968: the only way to get it to play more than 64k of blocks at once ! 1969: seems to be the PLAYAUDIO_MSF command. However, the parameters ! 1970: the NEC 260 wants for the PLAYMSF command are incompatible with ! 1971: the new version of the spec. ! 1972: ! 1973: So what i'll try is this. First try for PLAYAUDIO12. If it works, ! 1974: great. Otherwise, if the drive reports an illegal command code, ! 1975: try PLAYAUDIO_MSF using the NEC 260-style bcd parameters. */ ! 1976: ! 1977: #if ! STANDARD_ATAPI ! 1978: if (CDROM_CONFIG_FLAGS (drive)->no_playaudio12) ! 1979: return cdrom_play_lba_range_msf (drive, lba_start, lba_end, reqbuf); ! 1980: else ! 1981: #endif /* not STANDARD_ATAPI */ ! 1982: { ! 1983: int stat; ! 1984: struct atapi_request_sense my_reqbuf; ! 1985: ! 1986: if (reqbuf == NULL) ! 1987: reqbuf = &my_reqbuf; ! 1988: ! 1989: stat = cdrom_play_lba_range_play12 (drive, lba_start, lba_end, reqbuf); ! 1990: if (stat == 0) return 0; ! 1991: ! 1992: #if ! STANDARD_ATAPI ! 1993: /* It failed. Try to find out why. */ ! 1994: if (reqbuf->sense_key == ILLEGAL_REQUEST && reqbuf->asc == 0x20) ! 1995: { ! 1996: /* The drive didn't recognize the command. ! 1997: Retry with the MSF variant. */ ! 1998: printk ("%s: Drive does not support PLAYAUDIO12; " ! 1999: "trying PLAYAUDIO_MSF\n", drive->name); ! 2000: CDROM_CONFIG_FLAGS (drive)->no_playaudio12 = 1; ! 2001: CDROM_CONFIG_FLAGS (drive)->playmsf_uses_bcd = 1; ! 2002: return cdrom_play_lba_range_msf (drive, lba_start, lba_end, reqbuf); ! 2003: } ! 2004: #endif /* not STANDARD_ATAPI */ ! 2005: ! 2006: /* Failed for some other reason. Give up. */ ! 2007: return stat; ! 2008: } ! 2009: } ! 2010: ! 2011: ! 2012: /* Play audio starting at LBA LBA_START and finishing with the ! 2013: LBA before LBA_END. */ ! 2014: static int ! 2015: cdrom_play_lba_range (ide_drive_t *drive, int lba_start, int lba_end, ! 2016: struct atapi_request_sense *reqbuf) ! 2017: { ! 2018: int i, stat; ! 2019: struct atapi_request_sense my_reqbuf; ! 2020: ! 2021: if (reqbuf == NULL) ! 2022: reqbuf = &my_reqbuf; ! 2023: ! 2024: /* Some drives, will, for certain audio cds, ! 2025: give an error if you ask them to play the entire cd using the ! 2026: values which are returned in the TOC. The play will succeed, however, ! 2027: if the ending address is adjusted downwards by a few frames. */ ! 2028: for (i=0; i<75; i++) ! 2029: { ! 2030: stat = cdrom_play_lba_range_1 (drive, lba_start, lba_end, reqbuf); ! 2031: ! 2032: if (stat == 0 || ! 2033: !(reqbuf->sense_key == ILLEGAL_REQUEST && reqbuf->asc == 0x24)) ! 2034: return stat; ! 2035: ! 2036: --lba_end; ! 2037: if (lba_end <= lba_start) break; ! 2038: } ! 2039: ! 2040: return stat; ! 2041: } ! 2042: ! 2043: ! 2044: static ! 2045: int cdrom_get_toc_entry (ide_drive_t *drive, int track, ! 2046: struct atapi_toc_entry **ent, ! 2047: struct atapi_request_sense *reqbuf) ! 2048: { ! 2049: int stat, ntracks; ! 2050: struct atapi_toc *toc; ! 2051: ! 2052: /* Make sure our saved TOC is valid. */ ! 2053: stat = cdrom_read_toc (drive, reqbuf); ! 2054: if (stat) return stat; ! 2055: ! 2056: toc = drive->cdrom_info.toc; ! 2057: ! 2058: /* Check validity of requested track number. */ ! 2059: ntracks = toc->hdr.last_track - toc->hdr.first_track + 1; ! 2060: if (track == CDROM_LEADOUT) ! 2061: *ent = &toc->ent[ntracks]; ! 2062: else if (track < toc->hdr.first_track || ! 2063: track > toc->hdr.last_track) ! 2064: return -EINVAL; ! 2065: else ! 2066: *ent = &toc->ent[track - toc->hdr.first_track]; ! 2067: ! 2068: return 0; ! 2069: } ! 2070: ! 2071: ! 2072: static int ! 2073: cdrom_read_block (ide_drive_t *drive, int format, int lba, ! 2074: char *buf, int buflen, ! 2075: struct atapi_request_sense *reqbuf) ! 2076: { ! 2077: struct packet_command pc; ! 2078: struct atapi_request_sense my_reqbuf; ! 2079: int stat; ! 2080: ! 2081: if (reqbuf == NULL) ! 2082: reqbuf = &my_reqbuf; ! 2083: ! 2084: memset (&pc, 0, sizeof (pc)); ! 2085: pc.sense_data = reqbuf; ! 2086: ! 2087: pc.buffer = buf; ! 2088: pc.buflen = buflen; ! 2089: ! 2090: #if ! STANDARD_ATAPI ! 2091: if (CDROM_CONFIG_FLAGS (drive)->old_readcd) ! 2092: pc.c[0] = 0xd4; ! 2093: else ! 2094: #endif /* not STANDARD_ATAPI */ ! 2095: pc.c[0] = READ_CD; ! 2096: ! 2097: pc.c[1] = (format << 2); ! 2098: #ifdef __alpha__ ! 2099: stl_u(htonl (lba), (unsigned int *) &pc.c[2]); ! 2100: #else ! 2101: *(int *)(&pc.c[2]) = htonl (lba); ! 2102: #endif ! 2103: pc.c[8] = 1; /* one block */ ! 2104: pc.c[9] = 0x10; ! 2105: ! 2106: stat = cdrom_queue_packet_command (drive, &pc); ! 2107: ! 2108: #if ! STANDARD_ATAPI ! 2109: /* If the drive doesn't recognize the READ CD opcode, retry the command ! 2110: with an older opcode for that command. */ ! 2111: if (stat && reqbuf->sense_key == ILLEGAL_REQUEST && reqbuf->asc == 0x20 && ! 2112: CDROM_CONFIG_FLAGS (drive)->old_readcd == 0) ! 2113: { ! 2114: printk ("%s: Drive does not recognize READ_CD; trying opcode 0xd4\n", ! 2115: drive->name); ! 2116: CDROM_CONFIG_FLAGS (drive)->old_readcd = 1; ! 2117: return cdrom_read_block (drive, format, lba, buf, buflen, reqbuf); ! 2118: } ! 2119: #endif /* not STANDARD_ATAPI */ ! 2120: ! 2121: return stat; ! 2122: } ! 2123: ! 2124: ! 2125: int ide_cdrom_ioctl (ide_drive_t *drive, struct inode *inode, ! 2126: struct file *file, unsigned int cmd, unsigned long arg) ! 2127: { ! 2128: switch (cmd) ! 2129: { ! 2130: case CDROMEJECT: ! 2131: { ! 2132: int stat; ! 2133: ! 2134: if (drive->usage > 1) ! 2135: return -EBUSY; ! 2136: ! 2137: stat = cdrom_lockdoor (drive, 0, NULL); ! 2138: if (stat) return stat; ! 2139: ! 2140: return cdrom_eject (drive, 0, NULL); ! 2141: } ! 2142: ! 2143: case CDROMEJECT_SW: ! 2144: { ! 2145: CDROM_STATE_FLAGS (drive)->eject_on_close = arg; ! 2146: return 0; ! 2147: } ! 2148: ! 2149: case CDROMPAUSE: ! 2150: return cdrom_pause (drive, 1, NULL); ! 2151: ! 2152: case CDROMRESUME: ! 2153: return cdrom_pause (drive, 0, NULL); ! 2154: ! 2155: case CDROMSTART: ! 2156: return cdrom_startstop (drive, 1, NULL); ! 2157: ! 2158: case CDROMSTOP: ! 2159: { ! 2160: int stat; ! 2161: ! 2162: stat = cdrom_startstop (drive, 0, NULL); ! 2163: if (stat) return stat; ! 2164: /* pit says the Dolphin needs this. */ ! 2165: return cdrom_eject (drive, 1, NULL); ! 2166: } ! 2167: ! 2168: case CDROMPLAYMSF: ! 2169: { ! 2170: struct cdrom_msf msf; ! 2171: int stat, lba_start, lba_end; ! 2172: ! 2173: stat = verify_area (VERIFY_READ, (void *)arg, sizeof (msf)); ! 2174: if (stat) return stat; ! 2175: ! 2176: memcpy_fromfs (&msf, (void *) arg, sizeof(msf)); ! 2177: ! 2178: lba_start = msf_to_lba (msf.cdmsf_min0, msf.cdmsf_sec0, ! 2179: msf.cdmsf_frame0); ! 2180: lba_end = msf_to_lba (msf.cdmsf_min1, msf.cdmsf_sec1, ! 2181: msf.cdmsf_frame1) + 1; ! 2182: ! 2183: if (lba_end <= lba_start) return -EINVAL; ! 2184: ! 2185: return cdrom_play_lba_range (drive, lba_start, lba_end, NULL); ! 2186: } ! 2187: ! 2188: /* Like just about every other Linux cdrom driver, we ignore the ! 2189: index part of the request here. */ ! 2190: case CDROMPLAYTRKIND: ! 2191: { ! 2192: int stat, lba_start, lba_end; ! 2193: struct cdrom_ti ti; ! 2194: struct atapi_toc_entry *first_toc, *last_toc; ! 2195: ! 2196: stat = verify_area (VERIFY_READ, (void *)arg, sizeof (ti)); ! 2197: if (stat) return stat; ! 2198: ! 2199: memcpy_fromfs (&ti, (void *) arg, sizeof(ti)); ! 2200: ! 2201: stat = cdrom_get_toc_entry (drive, ti.cdti_trk0, &first_toc, NULL); ! 2202: if (stat) return stat; ! 2203: stat = cdrom_get_toc_entry (drive, ti.cdti_trk1, &last_toc, NULL); ! 2204: if (stat) return stat; ! 2205: ! 2206: if (ti.cdti_trk1 != CDROM_LEADOUT) ++last_toc; ! 2207: lba_start = first_toc->addr.lba; ! 2208: lba_end = last_toc->addr.lba; ! 2209: ! 2210: if (lba_end <= lba_start) return -EINVAL; ! 2211: ! 2212: return cdrom_play_lba_range (drive, lba_start, lba_end, NULL); ! 2213: } ! 2214: ! 2215: case CDROMREADTOCHDR: ! 2216: { ! 2217: int stat; ! 2218: struct cdrom_tochdr tochdr; ! 2219: struct atapi_toc *toc; ! 2220: ! 2221: stat = verify_area (VERIFY_WRITE, (void *) arg, sizeof (tochdr)); ! 2222: if (stat) return stat; ! 2223: ! 2224: /* Make sure our saved TOC is valid. */ ! 2225: stat = cdrom_read_toc (drive, NULL); ! 2226: if (stat) return stat; ! 2227: ! 2228: toc = drive->cdrom_info.toc; ! 2229: tochdr.cdth_trk0 = toc->hdr.first_track; ! 2230: tochdr.cdth_trk1 = toc->hdr.last_track; ! 2231: ! 2232: memcpy_tofs ((void *) arg, &tochdr, sizeof (tochdr)); ! 2233: ! 2234: return stat; ! 2235: } ! 2236: ! 2237: case CDROMREADTOCENTRY: ! 2238: { ! 2239: int stat; ! 2240: struct cdrom_tocentry tocentry; ! 2241: struct atapi_toc_entry *toce; ! 2242: ! 2243: stat = verify_area (VERIFY_READ, (void *) arg, sizeof (tocentry)); ! 2244: if (stat) return stat; ! 2245: stat = verify_area (VERIFY_WRITE, (void *) arg, sizeof (tocentry)); ! 2246: if (stat) return stat; ! 2247: ! 2248: memcpy_fromfs (&tocentry, (void *) arg, sizeof (tocentry)); ! 2249: ! 2250: stat = cdrom_get_toc_entry (drive, tocentry.cdte_track, &toce, NULL); ! 2251: if (stat) return stat; ! 2252: ! 2253: tocentry.cdte_ctrl = toce->control; ! 2254: tocentry.cdte_adr = toce->adr; ! 2255: ! 2256: if (tocentry.cdte_format == CDROM_MSF) ! 2257: { ! 2258: /* convert to MSF */ ! 2259: lba_to_msf (toce->addr.lba, ! 2260: &tocentry.cdte_addr.msf.minute, ! 2261: &tocentry.cdte_addr.msf.second, ! 2262: &tocentry.cdte_addr.msf.frame); ! 2263: } ! 2264: else ! 2265: tocentry.cdte_addr.lba = toce->addr.lba; ! 2266: ! 2267: memcpy_tofs ((void *) arg, &tocentry, sizeof (tocentry)); ! 2268: ! 2269: return stat; ! 2270: } ! 2271: ! 2272: case CDROMSUBCHNL: ! 2273: { ! 2274: struct atapi_cdrom_subchnl scbuf; ! 2275: int stat, abs_lba, rel_lba; ! 2276: struct cdrom_subchnl subchnl; ! 2277: ! 2278: stat = verify_area (VERIFY_WRITE, (void *) arg, sizeof (subchnl)); ! 2279: if (stat) return stat; ! 2280: stat = verify_area (VERIFY_READ, (void *) arg, sizeof (subchnl)); ! 2281: if (stat) return stat; ! 2282: ! 2283: memcpy_fromfs (&subchnl, (void *) arg, sizeof (subchnl)); ! 2284: ! 2285: stat = cdrom_read_subchannel (drive, (char *)&scbuf, sizeof (scbuf), ! 2286: NULL); ! 2287: if (stat) return stat; ! 2288: ! 2289: #if ! STANDARD_ATAPI ! 2290: if (CDROM_CONFIG_FLAGS (drive)->vertos_lossage) ! 2291: { ! 2292: abs_lba = msf_to_lba (bcd2bin (scbuf.acdsc_absaddr.msf.minute), ! 2293: bcd2bin (scbuf.acdsc_absaddr.msf.second), ! 2294: bcd2bin (scbuf.acdsc_absaddr.msf.frame)); ! 2295: rel_lba = msf_to_lba (bcd2bin (scbuf.acdsc_reladdr.msf.minute), ! 2296: bcd2bin (scbuf.acdsc_reladdr.msf.second), ! 2297: bcd2bin (scbuf.acdsc_reladdr.msf.frame)); ! 2298: scbuf.acdsc_trk = bcd2bin (scbuf.acdsc_trk); ! 2299: } ! 2300: else ! 2301: #endif /* not STANDARD_ATAPI */ ! 2302: { ! 2303: abs_lba = ntohl (scbuf.acdsc_absaddr.lba); ! 2304: rel_lba = ntohl (scbuf.acdsc_reladdr.lba); ! 2305: } ! 2306: ! 2307: if (subchnl.cdsc_format == CDROM_MSF) ! 2308: { ! 2309: lba_to_msf (abs_lba, ! 2310: &subchnl.cdsc_absaddr.msf.minute, ! 2311: &subchnl.cdsc_absaddr.msf.second, ! 2312: &subchnl.cdsc_absaddr.msf.frame); ! 2313: lba_to_msf (rel_lba, ! 2314: &subchnl.cdsc_reladdr.msf.minute, ! 2315: &subchnl.cdsc_reladdr.msf.second, ! 2316: &subchnl.cdsc_reladdr.msf.frame); ! 2317: } ! 2318: else ! 2319: { ! 2320: subchnl.cdsc_absaddr.lba = abs_lba; ! 2321: subchnl.cdsc_reladdr.lba = rel_lba; ! 2322: } ! 2323: ! 2324: subchnl.cdsc_audiostatus = scbuf.acdsc_audiostatus; ! 2325: subchnl.cdsc_ctrl = scbuf.acdsc_ctrl; ! 2326: subchnl.cdsc_trk = scbuf.acdsc_trk; ! 2327: subchnl.cdsc_ind = scbuf.acdsc_ind; ! 2328: ! 2329: memcpy_tofs ((void *) arg, &subchnl, sizeof (subchnl)); ! 2330: ! 2331: return stat; ! 2332: } ! 2333: ! 2334: case CDROMVOLCTRL: ! 2335: { ! 2336: struct cdrom_volctrl volctrl; ! 2337: char buffer[24], mask[24]; ! 2338: int stat; ! 2339: ! 2340: stat = verify_area (VERIFY_READ, (void *) arg, sizeof (volctrl)); ! 2341: if (stat) return stat; ! 2342: memcpy_fromfs (&volctrl, (void *) arg, sizeof (volctrl)); ! 2343: ! 2344: stat = cdrom_mode_sense (drive, 0x0e, 0, buffer, sizeof (buffer),NULL); ! 2345: if (stat) return stat; ! 2346: stat = cdrom_mode_sense (drive, 0x0e, 1, mask , sizeof (buffer),NULL); ! 2347: if (stat) return stat; ! 2348: ! 2349: buffer[1] = buffer[2] = 0; ! 2350: ! 2351: buffer[17] = volctrl.channel0 & mask[17]; ! 2352: buffer[19] = volctrl.channel1 & mask[19]; ! 2353: buffer[21] = volctrl.channel2 & mask[21]; ! 2354: buffer[23] = volctrl.channel3 & mask[23]; ! 2355: ! 2356: return cdrom_mode_select (drive, 0x0e, buffer, sizeof (buffer), NULL); ! 2357: } ! 2358: ! 2359: case CDROMVOLREAD: ! 2360: { ! 2361: struct cdrom_volctrl volctrl; ! 2362: char buffer[24]; ! 2363: int stat; ! 2364: ! 2365: stat = verify_area (VERIFY_WRITE, (void *) arg, sizeof (volctrl)); ! 2366: if (stat) return stat; ! 2367: ! 2368: stat = cdrom_mode_sense (drive, 0x0e, 0, buffer, sizeof (buffer), NULL); ! 2369: if (stat) return stat; ! 2370: ! 2371: volctrl.channel0 = buffer[17]; ! 2372: volctrl.channel1 = buffer[19]; ! 2373: volctrl.channel2 = buffer[21]; ! 2374: volctrl.channel3 = buffer[23]; ! 2375: ! 2376: memcpy_tofs ((void *) arg, &volctrl, sizeof (volctrl)); ! 2377: ! 2378: return 0; ! 2379: } ! 2380: ! 2381: case CDROMMULTISESSION: ! 2382: { ! 2383: struct cdrom_multisession ms_info; ! 2384: struct atapi_toc *toc; ! 2385: int stat; ! 2386: ! 2387: stat = verify_area (VERIFY_READ, (void *)arg, sizeof (ms_info)); ! 2388: if (stat) return stat; ! 2389: stat = verify_area (VERIFY_WRITE, (void *)arg, sizeof (ms_info)); ! 2390: if (stat) return stat; ! 2391: ! 2392: memcpy_fromfs (&ms_info, (void *)arg, sizeof (ms_info)); ! 2393: ! 2394: /* Make sure the TOC information is valid. */ ! 2395: stat = cdrom_read_toc (drive, NULL); ! 2396: if (stat) return stat; ! 2397: ! 2398: toc = drive->cdrom_info.toc; ! 2399: ! 2400: if (ms_info.addr_format == CDROM_MSF) ! 2401: lba_to_msf (toc->last_session_lba, ! 2402: &ms_info.addr.msf.minute, ! 2403: &ms_info.addr.msf.second, ! 2404: &ms_info.addr.msf.frame); ! 2405: ! 2406: else if (ms_info.addr_format == CDROM_LBA) ! 2407: ms_info.addr.lba = toc->last_session_lba; ! 2408: ! 2409: else ! 2410: return -EINVAL; ! 2411: ! 2412: ms_info.xa_flag = toc->xa_flag; ! 2413: ! 2414: memcpy_tofs ((void *)arg, &ms_info, sizeof (ms_info)); ! 2415: ! 2416: return 0; ! 2417: } ! 2418: ! 2419: /* Read 2352 byte blocks from audio tracks. */ ! 2420: case CDROMREADAUDIO: ! 2421: { ! 2422: int stat, lba; ! 2423: struct atapi_toc *toc; ! 2424: struct cdrom_read_audio ra; ! 2425: char buf[CD_FRAMESIZE_RAW]; ! 2426: ! 2427: /* Make sure the TOC is up to date. */ ! 2428: stat = cdrom_read_toc (drive, NULL); ! 2429: if (stat) return stat; ! 2430: ! 2431: toc = drive->cdrom_info.toc; ! 2432: ! 2433: stat = verify_area (VERIFY_READ, (char *)arg, sizeof (ra)); ! 2434: if (stat) return stat; ! 2435: ! 2436: memcpy_fromfs (&ra, (void *)arg, sizeof (ra)); ! 2437: ! 2438: if (ra.nframes < 0 || ra.nframes > toc->capacity) ! 2439: return -EINVAL; ! 2440: else if (ra.nframes == 0) ! 2441: return 0; ! 2442: ! 2443: stat = verify_area (VERIFY_WRITE, (char *)ra.buf, ! 2444: ra.nframes * CD_FRAMESIZE_RAW); ! 2445: if (stat) return stat; ! 2446: ! 2447: if (ra.addr_format == CDROM_MSF) ! 2448: lba = msf_to_lba (ra.addr.msf.minute, ra.addr.msf.second, ! 2449: ra.addr.msf.frame); ! 2450: ! 2451: else if (ra.addr_format == CDROM_LBA) ! 2452: lba = ra.addr.lba; ! 2453: ! 2454: else ! 2455: return -EINVAL; ! 2456: ! 2457: if (lba < 0 || lba >= toc->capacity) ! 2458: return -EINVAL; ! 2459: ! 2460: while (ra.nframes > 0) ! 2461: { ! 2462: stat = cdrom_read_block (drive, 1, lba, buf, ! 2463: CD_FRAMESIZE_RAW, NULL); ! 2464: if (stat) return stat; ! 2465: memcpy_tofs (ra.buf, buf, CD_FRAMESIZE_RAW); ! 2466: ra.buf += CD_FRAMESIZE_RAW; ! 2467: --ra.nframes; ! 2468: ++lba; ! 2469: } ! 2470: ! 2471: return 0; ! 2472: } ! 2473: ! 2474: case CDROMREADMODE1: ! 2475: case CDROMREADMODE2: ! 2476: { ! 2477: struct cdrom_msf msf; ! 2478: int blocksize, format, stat, lba; ! 2479: struct atapi_toc *toc; ! 2480: char buf[CD_FRAMESIZE_RAW0]; ! 2481: ! 2482: if (cmd == CDROMREADMODE1) ! 2483: { ! 2484: blocksize = CD_FRAMESIZE; ! 2485: format = 2; ! 2486: } ! 2487: else ! 2488: { ! 2489: blocksize = CD_FRAMESIZE_RAW0; ! 2490: format = 3; ! 2491: } ! 2492: ! 2493: stat = verify_area (VERIFY_READ, (char *)arg, sizeof (msf)); ! 2494: if (stat) return stat; ! 2495: stat = verify_area (VERIFY_WRITE, (char *)arg, blocksize); ! 2496: if (stat) return stat; ! 2497: ! 2498: memcpy_fromfs (&msf, (void *)arg, sizeof (msf)); ! 2499: ! 2500: lba = msf_to_lba (msf.cdmsf_min0, msf.cdmsf_sec0, msf.cdmsf_frame0); ! 2501: ! 2502: /* Make sure the TOC is up to date. */ ! 2503: stat = cdrom_read_toc (drive, NULL); ! 2504: if (stat) return stat; ! 2505: ! 2506: toc = drive->cdrom_info.toc; ! 2507: ! 2508: if (lba < 0 || lba >= toc->capacity) ! 2509: return -EINVAL; ! 2510: ! 2511: stat = cdrom_read_block (drive, format, lba, buf, blocksize, NULL); ! 2512: if (stat) return stat; ! 2513: ! 2514: memcpy_tofs ((char *)arg, buf, blocksize); ! 2515: return 0; ! 2516: } ! 2517: ! 2518: #if 0 /* Doesn't work reliably yet. */ ! 2519: case CDROMRESET: ! 2520: { ! 2521: struct request req; ! 2522: ide_init_drive_cmd (&req); ! 2523: req.cmd = RESET_DRIVE_COMMAND; ! 2524: return ide_do_drive_cmd (drive, &req, ide_wait); ! 2525: } ! 2526: #endif ! 2527: ! 2528: ! 2529: #ifdef TEST ! 2530: case 0x1234: ! 2531: { ! 2532: int stat; ! 2533: struct packet_command pc; ! 2534: int len, lena; ! 2535: ! 2536: memset (&pc, 0, sizeof (pc)); ! 2537: ! 2538: stat = verify_area (VERIFY_READ, (void *) arg, sizeof (pc.c)); ! 2539: if (stat) return stat; ! 2540: memcpy_fromfs (&pc.c, (void *) arg, sizeof (pc.c)); ! 2541: arg += sizeof (pc.c); ! 2542: ! 2543: stat = verify_area (VERIFY_READ, (void *) arg, sizeof (len)); ! 2544: if (stat) return stat; ! 2545: memcpy_fromfs (&len, (void *) arg , sizeof (len)); ! 2546: arg += sizeof (len); ! 2547: ! 2548: if (len > 0) { ! 2549: stat = verify_area (VERIFY_WRITE, (void *) arg, len); ! 2550: if (stat) return stat; ! 2551: } ! 2552: ! 2553: lena = len; ! 2554: if (lena < 0) lena = 0; ! 2555: ! 2556: { ! 2557: char buf[lena]; ! 2558: if (len > 0) { ! 2559: pc.buflen = len; ! 2560: pc.buffer = buf; ! 2561: } ! 2562: ! 2563: stat = cdrom_queue_packet_command (drive, &pc); ! 2564: ! 2565: if (len > 0) ! 2566: memcpy_tofs ((void *)arg, buf, len); ! 2567: } ! 2568: ! 2569: return stat; ! 2570: } ! 2571: #endif ! 2572: ! 2573: default: ! 2574: return -EPERM; ! 2575: } ! 2576: ! 2577: } ! 2578: ! 2579: ! 2580: ! 2581: /**************************************************************************** ! 2582: * Other driver requests (open, close, check media change). ! 2583: */ ! 2584: ! 2585: int ide_cdrom_check_media_change (ide_drive_t *drive) ! 2586: { ! 2587: int retval; ! 2588: ! 2589: (void) cdrom_check_status (drive, NULL); ! 2590: ! 2591: retval = CDROM_STATE_FLAGS (drive)->media_changed; ! 2592: CDROM_STATE_FLAGS (drive)->media_changed = 0; ! 2593: ! 2594: return retval; ! 2595: } ! 2596: ! 2597: ! 2598: int ide_cdrom_open (struct inode *ip, struct file *fp, ide_drive_t *drive) ! 2599: { ! 2600: /* no write access */ ! 2601: if (fp->f_mode & 2) ! 2602: { ! 2603: --drive->usage; ! 2604: return -EROFS; ! 2605: } ! 2606: ! 2607: /* If this is the first open, check the drive status. */ ! 2608: if (drive->usage == 1) ! 2609: { ! 2610: int stat; ! 2611: struct atapi_request_sense my_reqbuf; ! 2612: my_reqbuf.sense_key = 0; ! 2613: ! 2614: /* Get the drive status. */ ! 2615: stat = cdrom_check_status (drive, &my_reqbuf); ! 2616: ! 2617: /* If the tray is open, try to close it. */ ! 2618: if (stat && my_reqbuf.sense_key == NOT_READY) ! 2619: { ! 2620: cdrom_eject (drive, 1, &my_reqbuf); ! 2621: stat = cdrom_check_status (drive, &my_reqbuf); ! 2622: } ! 2623: ! 2624: /* Return an error if there are still problems. */ ! 2625: if (stat && my_reqbuf.sense_key != UNIT_ATTENTION) ! 2626: { ! 2627: --drive->usage; ! 2628: return -ENXIO; ! 2629: } ! 2630: ! 2631: /* Now lock the door. */ ! 2632: (void) cdrom_lockdoor (drive, 1, &my_reqbuf); ! 2633: ! 2634: /* And try to read the TOC information now. */ ! 2635: (void) cdrom_read_toc (drive, &my_reqbuf); ! 2636: } ! 2637: ! 2638: return 0; ! 2639: } ! 2640: ! 2641: ! 2642: /* ! 2643: * Close down the device. Invalidate all cached blocks. ! 2644: */ ! 2645: ! 2646: void ide_cdrom_release (struct inode *inode, struct file *file, ide_drive_t *drive) ! 2647: { ! 2648: if (drive->usage == 0) ! 2649: { ! 2650: invalidate_buffers (inode->i_rdev); ! 2651: ! 2652: /* Unlock the door. */ ! 2653: (void) cdrom_lockdoor (drive, 0, NULL); ! 2654: ! 2655: /* Do an eject if we were requested to do so. */ ! 2656: if (CDROM_STATE_FLAGS (drive)->eject_on_close) ! 2657: (void) cdrom_eject (drive, 0, NULL); ! 2658: } ! 2659: } ! 2660: ! 2661: ! 2662: ! 2663: /**************************************************************************** ! 2664: * Device initialization. ! 2665: */ ! 2666: ! 2667: void ide_cdrom_setup (ide_drive_t *drive) ! 2668: { ! 2669: blksize_size[HWIF(drive)->major][drive->select.b.unit << PARTN_BITS] = CD_FRAMESIZE; ! 2670: ! 2671: drive->special.all = 0; ! 2672: drive->ready_stat = 0; ! 2673: ! 2674: CDROM_STATE_FLAGS (drive)->media_changed = 0; ! 2675: CDROM_STATE_FLAGS (drive)->toc_valid = 0; ! 2676: CDROM_STATE_FLAGS (drive)->door_locked = 0; ! 2677: ! 2678: /* Turn this off by default, since many people don't like it. */ ! 2679: CDROM_STATE_FLAGS (drive)->eject_on_close= 0; ! 2680: ! 2681: #if NO_DOOR_LOCKING ! 2682: CDROM_CONFIG_FLAGS (drive)->no_doorlock = 1; ! 2683: #else ! 2684: CDROM_CONFIG_FLAGS (drive)->no_doorlock = 0; ! 2685: #endif ! 2686: ! 2687: if (drive->id != NULL) { ! 2688: CDROM_CONFIG_FLAGS (drive)->drq_interrupt = ! 2689: ((drive->id->config & 0x0060) == 0x20); ! 2690: } else { ! 2691: CDROM_CONFIG_FLAGS (drive)->drq_interrupt = 0; ! 2692: } ! 2693: ! 2694: #if ! STANDARD_ATAPI ! 2695: CDROM_CONFIG_FLAGS (drive)->no_playaudio12 = 0; ! 2696: CDROM_CONFIG_FLAGS (drive)->old_readcd = 0; ! 2697: CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 0; ! 2698: CDROM_CONFIG_FLAGS (drive)->playmsf_uses_bcd = 0; ! 2699: CDROM_CONFIG_FLAGS (drive)->vertos_lossage = 0; ! 2700: ! 2701: if (drive->id != NULL) { ! 2702: /* Accommodate some broken drives... */ ! 2703: if (strcmp (drive->id->model, "CD220E") == 0 || ! 2704: strcmp (drive->id->model, "CD") == 0) /* Creative Labs */ ! 2705: CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1; ! 2706: ! 2707: else if (strcmp (drive->id->model, "TO-ICSLYAL") == 0 || /* Acer CD525E */ ! 2708: strcmp (drive->id->model, "OTI-SCYLLA") == 0) ! 2709: CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1; ! 2710: ! 2711: /* I don't know who makes this. ! 2712: Francesco Messineo <[email protected]> says this one's broken too. */ ! 2713: else if (strcmp (drive->id->model, "DCI-2S10") == 0) ! 2714: CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1; ! 2715: ! 2716: else if (strcmp (drive->id->model, "CDA26803I SE") == 0) /* Aztech */ ! 2717: { ! 2718: CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1; ! 2719: ! 2720: /* This drive _also_ does not implement PLAYAUDIO12 correctly. */ ! 2721: CDROM_CONFIG_FLAGS (drive)->no_playaudio12 = 1; ! 2722: } ! 2723: ! 2724: /* Vertos 300. ! 2725: There seem to be at least two different, incompatible versions ! 2726: of this drive floating around. Luckily, they appear to return their ! 2727: id strings with different byte orderings. */ ! 2728: else if (strcmp (drive->id->model, "V003S0DS") == 0) ! 2729: { ! 2730: CDROM_CONFIG_FLAGS (drive)->vertos_lossage = 1; ! 2731: CDROM_CONFIG_FLAGS (drive)->playmsf_uses_bcd = 1; ! 2732: CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1; ! 2733: } ! 2734: else if (strcmp (drive->id->model, "0V300SSD") == 0 || ! 2735: strcmp (drive->id->model, "V003M0DP") == 0) ! 2736: CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1; ! 2737: ! 2738: /* Vertos 400. */ ! 2739: else if (strcmp (drive->id->model, "V004E0DT") == 0 || ! 2740: strcmp (drive->id->model, "0V400ETD") == 0) ! 2741: CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1; ! 2742: ! 2743: else if ( strcmp (drive->id->model, "CD-ROM CDU55D") == 0) /*sony cdu55d */ ! 2744: CDROM_CONFIG_FLAGS (drive)->no_playaudio12 = 1; ! 2745: ! 2746: else if (strcmp (drive->id->model, "CD-ROM CDU55E") == 0) ! 2747: CDROM_CONFIG_FLAGS (drive)->no_playaudio12 = 1; ! 2748: } /* drive-id != NULL */ ! 2749: #endif /* not STANDARD_ATAPI */ ! 2750: ! 2751: drive->cdrom_info.toc = NULL; ! 2752: drive->cdrom_info.sector_buffer = NULL; ! 2753: drive->cdrom_info.sector_buffered = 0; ! 2754: drive->cdrom_info.nsectors_buffered = 0; ! 2755: } ! 2756: ! 2757: ! 2758: ! 2759: /* ! 2760: * TODO: ! 2761: * CDROM_GET_UPC ! 2762: * CDROMRESET ! 2763: * Lock the door when a read request completes successfully and the ! 2764: * door is not already locked. Also try to reorganize to reduce ! 2765: * duplicated functionality between read and ioctl paths? ! 2766: * Establish interfaces for an IDE port driver, and break out the cdrom ! 2767: * code into a loadable module. ! 2768: * Support changers. ! 2769: * Write some real documentation. ! 2770: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.