|
|
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.