Lines Matching +full:broken +full:- +full:udma
9 Uniform CD-ROM driver for Linux.
10 See Documentation/cdrom/cdrom-standard.rst for usage information.
13 software that uses CD-ROMs and the various low-level drivers that
15 Patches that work are more welcome though. ;-)
18 ----------------------------------
19 1.00 Date Unknown -- David van Leeuwen <david@tm.tno.nl>
20 -- Initial version by David A. van Leeuwen. I don't have a detailed
23 2.00 Dec 2, 1997 -- Erik Andersen <andersee@debian.org>
24 -- New maintainer! As David A. van Leeuwen has been too busy to actively
28 -- Added (rudimentary) sysctl interface. I realize this is really weak
31 -- Modified CDROM_DISC_STATUS so that it is now incorporated into
32 the Uniform CD-ROM driver via the cdrom_count_tracks function.
37 -- Remove the calls to verify_area and only use the copy_from_user and
41 -- Major update to return codes so that errors from low-level drivers
45 -- Made it so if a function isn't implemented in a low-level driver,
48 -- Simplified some complex logic so that the source code is easier to read.
50 -- Other stuff I probably forgot to mention (lots of changes).
52 2.01 to 2.11 Dec 1997-Jan 1998
53 -- TO-DO! Write changelogs for 2.01 to 2.12.
55 2.12 Jan 24, 1998 -- Erik Andersen <andersee@debian.org>
56 -- Fixed a bug in the IOCTL_IN and IOCTL_OUT macros. It turns out that
58 of bytes not copied. I was returning whatever non-zero stuff came back from
61 2.13 July 17, 1998 -- Erik Andersen <andersee@debian.org>
62 -- Fixed a bug in CDROM_SELECT_SPEED where you couldn't lower the speed
65 -- Fixed the procfs-unload-module bug with the fill_inode procfs callback.
67 -- Fixed it so that the /proc entry now also shows up when cdrom is
70 2.14 August 17, 1998 -- Erik Andersen <andersee@debian.org>
71 -- Fixed a bug in cdrom_media_changed and handling of reporting that
74 -- Made a few things more pedanticly correct.
76 2.50 Oct 19, 1998 - Jens Axboe <axboe@image.dk>
77 -- New maintainers! Erik was too busy to continue the work on the driver,
81 2.51 Dec 20, 1998 - Jens Axboe <axboe@image.dk>
82 -- Check if drive is capable of doing what we ask before blindly changing
83 cdi->options in various ioctl.
84 -- Added version to proc entry.
86 2.52 Jan 16, 1999 - Jens Axboe <axboe@image.dk>
87 -- Fixed an error in open_for_data where we would sometimes not return
89 -- Fixed module usage count - usage was based on /proc/sys/dev
91 modules had entries in dev. Feb 02 - real bug was in sysctl.c where
95 2.53 Feb 22, 1999 - Jens Axboe <axboe@image.dk>
96 -- Fixup of several ioctl calls, in particular CDROM_SET_OPTIONS has
99 -- Added CDROM_LOCKDOOR ioctl. Locks the door and keeps it that way.
100 -- Added CDROM_RESET ioctl.
101 -- Added CDROM_DEBUG ioctl. Enable debug messages on-the-fly.
102 -- Added CDROM_GET_CAPABILITY ioctl. This relieves userspace programs
105 2.54 Mar 15, 1999 - Jens Axboe <axboe@image.dk>
106 -- Check capability mask from low level driver when counting tracks as
109 2.55 Apr 25, 1999 - Jens Axboe <axboe@image.dk>
110 -- autoclose was mistakenly checked against CDC_OPEN_TRAY instead of
112 -- proc info didn't mask against capabilities mask.
114 3.00 Aug 5, 1999 - Jens Axboe <axboe@image.dk>
115 -- Unified audio ioctl handling across CD-ROM drivers. A lot of the
118 -- First attempt at adding support for MMC2 commands - for DVD and
119 CD-R(W) drives. Only the DVD parts are in now - the interface used is
121 -- ioctl cleanups. if a drive couldn't play audio, it didn't get
123 -- Defined CDROM_CAN(CDC_XXX) for checking the capabilities.
124 -- Put in sysctl files for autoclose, autoeject, check_media, debug,
126 -- /proc/sys/dev/cdrom/info has been updated to also contain info about
127 CD-Rx and DVD capabilities.
128 -- Now default to checking media type.
129 -- CDROM_SEND_PACKET ioctl added. The infrastructure was in place for
132 3.01 Aug 6, 1999 - Jens Axboe <axboe@image.dk>
133 -- Fix up the sysctl handling so that the option flags get set
135 -- Fix up ioctl handling so the device specific ones actually get
138 3.02 Aug 8, 1999 - Jens Axboe <axboe@image.dk>
139 -- Fixed volume control on SCSI drives (or others with longer audio
141 -- Fixed a couple of DVD minors. Thanks to Andrew T. Veliath
144 DVD patches for ide-cd and while I rearranged and unified them, the
147 3.03 Sep 1, 1999 - Jens Axboe <axboe@image.dk>
148 -- Moved the rest of the audio ioctls from the CD-ROM drivers here. Only
150 -- Moved the CDROMREADxxx ioctls in here.
151 -- Defined the cdrom_get_last_written and cdrom_get_next_block as ioctls
153 -- Erik Andersen <andersen@xmission.com> modified all SCMD_ commands
156 -- Various other cleanups.
158 3.04 Sep 12, 1999 - Jens Axboe <axboe@image.dk>
159 -- Fixed a couple of possible memory leaks (if an operation failed and
161 -- Integrated Uniform CD Changer handling from Richard Sharman
163 -- Defined CD_DVD and CD_CHANGER log levels.
164 -- Fixed the CDROMREADxxx ioctls.
165 -- CDROMPLAYTRKIND uses the GPCMD_PLAY_AUDIO_MSF command - too few
167 -- Small modifications to accommodate opens of /dev/hdc1, required
168 for ide-cd to handle multisession discs.
169 -- Export cdrom_mode_sense and cdrom_mode_select.
170 -- init_cdrom_command() for setting up a cgc command.
172 3.05 Oct 24, 1999 - Jens Axboe <axboe@image.dk>
173 -- Changed the interface for CDROM_SEND_PACKET. Before it was virtually
175 -- Lowered stack usage in mmc_ioctl(), dvd_read_disckey(), and
177 -- Added setup of write mode for packet writing.
178 -- Fixed CDDA ripping with cdda2wav - accept much larger requests of
181 3.06 Dec 13, 1999 - Jens Axboe <axboe@image.dk>
182 -- Added support for changing the region of DVD drives.
183 -- Added sense data to generic command.
185 3.07 Feb 2, 2000 - Jens Axboe <axboe@suse.de>
186 -- Do same "read header length" trick in cdrom_get_disc_info() as
187 we do in cdrom_get_track_info() -- some drive don't obey specs and
189 -- Deleted stuff related to setting up write modes. It has a different
191 -- Clear header length in mode_select unconditionally.
192 -- Removed the register_disk() that was added, not needed here.
194 3.08 May 1, 2000 - Jens Axboe <axboe@suse.de>
195 -- Fix direction flag in setup_send_key and setup_report_key. This
197 -- Always return -EROFS for write opens
198 -- Convert to module_init/module_exit style init and remove some
200 -- Fix several dvd errors - DVD_LU_SEND_ASF should pass agid,
205 3.09 May 12, 2000 - Jens Axboe <axboe@suse.de>
206 -- Fix Video-CD on SCSI drives that don't support READ_CD command. In
210 3.10 Jun 10, 2000 - Jens Axboe <axboe@suse.de>
211 -- Fix volume control on CD's - old SCSI-II drives now use their own
213 -- Use READ_DISC_INFO for more reliable end-of-disc.
215 3.11 Jun 12, 2000 - Jens Axboe <axboe@suse.de>
216 -- Fix bug in getting rpc phase 2 region info.
217 -- Reinstate "correct" CDROMPLAYTRKIND
219 3.12 Oct 18, 2000 - Jens Axboe <axboe@suse.de>
220 -- Use quiet bit on packet commands not known to work
222 3.20 Dec 17, 2003 - Jens Axboe <axboe@suse.de>
223 -- Various fixes and lots of cleanups not listed :-)
224 -- Locking fixes
225 -- Mt Rainier support
226 -- DVD-RAM write open fixes
229 <appro@fy.chalmers.se> to support MMC-3 compliant DVD+RW units.
231 Modified by Nigel Kukard <nkukard@lbsd.net> - support DVD+RW
234 -------------------------------------------------------------------------*/
241 /* I use an error-log mask to give fine grain control over the type of
322 /* The (cdo->capability & ~cdi->mask & CDC_XXX) construct was used in
324 #define CDROM_CAN(type) (cdi->ops->capability & ~cdi->mask & (type))
332 /* Not-exported routines. */
340 cdi->mc_flags = 0x3; /* set media changed bits, on both queues */
341 cdi->last_media_change_ms = ktime_to_ms(ktime_get());
347 if (cgc->sshdr) {
348 cgc->sshdr->sense_key = 0x05;
349 cgc->sshdr->asc = 0x20;
350 cgc->sshdr->ascq = 0x00;
353 cgc->stat = -EIO;
354 return -EIO;
367 return cdi->ops->generic_packet(cdi, &cgc);
374 const struct cdrom_device_ops *cdo = cdi->ops;
384 ret = cdo->generic_packet(cdi, &cgc);
391 buflen = be16_to_cpu(di->disc_information_length) +
392 sizeof(di->disc_information_length);
398 ret = cdo->generic_packet(cdi, &cgc);
407 * existence in the run-time routines below. Change_capability is a
413 if (cdo->call == NULL) \
414 WARN_ON_ONCE((cdo)->capability & (bits)); \
432 cdi->mrw_mode_page = MRW_MODE_PC;
435 cdi->mrw_mode_page = MRW_MODE_PC_PRE1;
458 if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
462 if (be16_to_cpu(mfd->feature_code) != CDF_MRW)
464 *write = mfd->write;
508 ret = cdi->ops->generic_packet(cdi, &cgc);
530 return cdi->ops->generic_packet(cdi, &cgc);
548 if (!ret && cdi->media_written)
566 ret = cdrom_mode_sense(cdi, &cgc, cdi->mrw_mode_page, 0);
571 offset = be16_to_cpu(mph->desc_length);
572 size = be16_to_cpu(mph->mode_data_length) + 2;
582 cdi->name, mrw_address_space[space]);
589 const struct cdrom_device_ops *cdo = cdi->ops;
593 if (cdo->open == NULL || cdo->release == NULL)
594 return -EINVAL;
596 pr_info("Uniform CD-ROM driver " REVISION "\n");
601 cdi->disk = disk;
602 disk->cdi = cdi;
605 if (cdo->check_events == NULL)
606 WARN_ON_ONCE(cdo->capability & (CDC_MEDIA_CHANGED | CDC_SELECT_DISC));
614 cdi->mc_flags = 0;
615 cdi->options = CDO_USE_FFLAGS;
616 cdi->last_media_change_ms = ktime_to_ms(ktime_get());
619 cdi->options |= (int) CDO_AUTO_CLOSE;
621 cdi->options |= (int) CDO_AUTO_EJECT;
623 cdi->options |= (int) CDO_LOCK;
625 cdi->options |= (int) CDO_CHECK_TYPE;
627 if (cdi->ops->read_cdda_bpc)
628 cdi->cdda_method = CDDA_BPC_FULL;
630 cdi->cdda_method = CDDA_OLD;
632 WARN_ON(!cdo->generic_packet);
634 cd_dbg(CD_REG_UNREG, "drive \"/dev/%s\" registered\n", cdi->name);
636 list_add(&cdi->list, &cdrom_list);
648 list_del(&cdi->list);
651 cd_dbg(CD_REG_UNREG, "drive \"/dev/%s\" unregistered\n", cdi->name);
669 if (cdi->ops->generic_packet(cdi, &cgc))
672 if (be16_to_cpu(eh->data_len) < sizeof(*med))
675 if (eh->nea || eh->notification_class != 0x4)
697 if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
718 if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
752 return -1;
796 * 0 - not MRW formatted
797 * 1 - MRW bgformat started, but not running or complete
798 * 2 - MRW bgformat in progress
799 * 3 - MRW formatting complete
872 if (cdi->ops->generic_packet(cdi, &cgc))
877 cdi->mmc3_profile = mmc3_profile;
882 switch (cdi->mmc3_profile) {
883 case 0x12: /* DVD-RAM */
885 case 0x43: /* BD-RE */
893 * returns 0 for ok to open write, non-0 to disallow
910 cdi->mask &= ~CDC_MRW;
912 cdi->mask |= CDC_MRW;
915 cdi->mask &= ~CDC_MRW_W;
917 cdi->mask |= CDC_MRW_W;
920 cdi->mask &= ~CDC_RAM;
922 cdi->mask |= CDC_RAM;
943 if (cdi->mmc3_profile != 0x1a) {
944 cd_dbg(CD_CLOSE, "%s: No DVD+RW\n", cdi->name);
948 if (!cdi->media_written) {
949 cd_dbg(CD_CLOSE, "%s: DVD+RW media clean\n", cdi->name);
953 pr_info("%s: dirty DVD+RW media, \"finalizing\"\n", cdi->name);
958 cdi->ops->generic_packet(cdi, &cgc);
964 cdi->ops->generic_packet(cdi, &cgc);
971 cdi->ops->generic_packet(cdi, &cgc);
973 cdi->media_written = 0;
976 /* badly broken, I know. Is due for a fixup anytime. */
982 tracks->data = 0;
983 tracks->audio = 0;
984 tracks->cdi = 0;
985 tracks->xa = 0;
986 tracks->error = 0;
990 tracks->error = CDS_NO_INFO;
995 ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header);
997 if (ret == -ENOMEDIUM)
998 tracks->error = CDS_NO_DISC;
1000 tracks->error = CDS_NO_INFO;
1007 if (cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &entry)) {
1008 tracks->error = CDS_NO_INFO;
1013 tracks->cdi++;
1015 tracks->xa++;
1017 tracks->data++;
1019 tracks->audio++;
1024 cd_dbg(CD_COUNT_TRACKS, "disc has %d tracks: %d=audio %d=data %d=Cd-I %d=XA\n",
1025 header.cdth_trk1, tracks->audio, tracks->data,
1026 tracks->cdi, tracks->xa);
1033 const struct cdrom_device_ops *cdo = cdi->ops;
1038 if (cdo->drive_status != NULL) {
1039 ret = cdo->drive_status(cdi, CDSL_CURRENT);
1045 cdi->options & CDO_AUTO_CLOSE) {
1047 ret=cdo->tray_move(cdi,0);
1055 ret=-ENOMEDIUM;
1060 ret=-ENOMEDIUM;
1064 ret = cdo->drive_status(cdi, CDSL_CURRENT);
1068 ret=-ENOMEDIUM;
1074 ret = cdo->drive_status(cdi, CDSL_CURRENT);
1076 ret = -ENOMEDIUM;
1083 ret=-ENOMEDIUM;
1086 /* CD-Players which don't use O_NONBLOCK, workman
1089 if (cdi->options & CDO_CHECK_TYPE) {
1095 ret=-EMEDIUMTYPE;
1106 ret = cdo->open(cdi, 0); /* open for data */
1115 if (CDROM_CAN(CDC_LOCK) && (cdi->options & CDO_LOCK)) {
1116 cdo->lock_door(cdi, 1);
1123 (notably ide-cd) lock the drive after every command. This produced
1129 if (CDROM_CAN(CDC_LOCK) && cdi->options & CDO_LOCK) {
1130 cdo->lock_door(cdi, 0);
1136 /* We use the open-option O_NONBLOCK to indicate that the
1140 * We hope that all cd-player programs will adopt this convention. It
1152 cdi->use_count++;
1153 if ((mode & BLK_OPEN_NDELAY) && (cdi->options & CDO_USE_FFLAGS)) {
1154 ret = cdi->ops->open(cdi, 1);
1162 ret = -EROFS;
1168 cdi->media_written = 0;
1170 cdi->opened_for_data = true;
1177 cdi->name, cdi->use_count);
1180 if (CDROM_CAN(CDC_LOCK) && cdi->options & CDO_LOCK) {
1181 cdi->ops->lock_door(cdi, 0);
1184 cdi->ops->release(cdi);
1186 cdi->use_count--;
1200 if (!(cdi->options & CDO_CHECK_TYPE))
1202 if (cdo->drive_status != NULL) {
1203 ret = cdo->drive_status(cdi, CDSL_CURRENT);
1209 cdi->options & CDO_AUTO_CLOSE) {
1211 ret=cdo->tray_move(cdi,0);
1219 return -ENOMEDIUM;
1223 return -ENOMEDIUM;
1226 ret = cdo->drive_status(cdi, CDSL_CURRENT);
1229 return -ENOMEDIUM;
1233 return -EIO;
1243 return -EMEDIUMTYPE;
1250 const struct cdrom_device_ops *cdo = cdi->ops;
1254 if (cdi->use_count > 0)
1255 cdi->use_count--;
1257 if (cdi->use_count == 0) {
1259 cdi->name);
1264 if ((cdo->capability & CDC_LOCK) && !cdi->keeplocked) {
1266 cdo->lock_door(cdi, 0);
1270 cdo->release(cdi);
1272 if (cdi->use_count == 0 && cdi->opened_for_data) {
1273 if (cdi->options & CDO_AUTO_EJECT && CDROM_CAN(CDC_OPEN_TRAY))
1274 cdo->tray_move(cdi, 1);
1275 cdi->opened_for_data = false;
1284 const struct cdrom_device_ops *cdo = cdi->ops;
1292 if (cdi->sanyo_slot) {
1293 buf->hdr.nslots = 3;
1294 buf->hdr.curslot = cdi->sanyo_slot == 3 ? 0 : cdi->sanyo_slot;
1296 buf->slots[length].disc_present = 1;
1297 buf->slots[length].change = 0;
1303 cdi->capacity * sizeof(struct cdrom_slot);
1309 return cdo->generic_packet(cdi, &cgc);
1318 if (cdi->sanyo_slot)
1323 return -ENOMEM;
1328 if (info->slots[slot].disc_present)
1348 cdi->capacity = 0;
1352 return -ENOMEM;
1355 nslots = info->hdr.nslots;
1369 if (cdi->sanyo_slot && slot < 0)
1381 if (cdi->sanyo_slot && -1 < slot) {
1385 cdi->sanyo_slot = slot ? slot : 3;
1388 return cdi->ops->generic_packet(cdi, &cgc);
1399 return -EDRIVE_CANT_DO_THIS;
1401 if (cdi->ops->check_events)
1402 cdi->ops->check_events(cdi, 0, slot);
1406 return cdrom_load_unload(cdi, -1);
1411 return -ENOMEM;
1418 curslot = info->hdr.curslot;
1421 if (cdi->use_count > 1 || cdi->keeplocked) {
1425 return -EBUSY;
1447 * event, it needs to buffer ->check_events() output, such that event
1449 * cdi->{vfs|ioctl}_events are used to buffer pending events for each
1452 * XXX: Locking is non-existent. cdi->ops->check_events() can be
1464 events = cdi->ops->check_events(cdi, clearing, CDSL_CURRENT);
1465 cdi->vfs_events |= events;
1466 cdi->ioctl_events |= events;
1475 events = cdi->vfs_events;
1476 cdi->vfs_events = 0;
1482 * ioctl. The main problem now is that we must double-buffer the
1483 * low-level implementation, to assure that the VFS and the user both
1491 int ret = !!(cdi->mc_flags & mask);
1500 changed = cdi->ioctl_events & DISK_EVENT_MEDIA_CHANGE;
1501 cdi->ioctl_events = 0;
1506 cdi->media_written = 0;
1509 cdi->mc_flags &= ~mask; /* clear bit */
1513 /* Requests to the low-level drivers will /always/ be done in the
1516 CDROM_LBA: all data-related requests.
1517 CDROM_MSF: all audio-related requests.
1519 However, a low-level implementation is allowed to refuse this
1523 format, or ask for multi-session info in MSF format. However, for
1525 the requests to the low-level drivers will be sanitized in the more
1536 addr->lba = (int) addr->msf.frame +
1537 75 * (addr->msf.second - 2 + 60 * addr->msf.minute);
1539 int lba = addr->lba;
1540 addr->msf.frame = lba % 75;
1543 addr->msf.second = lba % 60;
1544 addr->msf.minute = lba / 60;
1555 cgc->buffer = (char *) buf;
1556 cgc->buflen = len;
1557 cgc->data_direction = type;
1558 cgc->timeout = CDROM_DEF_TIMEOUT;
1569 cgc->cmd[0] = GPCMD_REPORT_KEY;
1570 cgc->cmd[10] = type | (agid << 6);
1573 cgc->buflen = 8;
1577 cgc->buflen = 16;
1581 cgc->buflen = 12;
1585 cgc->cmd[9] = cgc->buflen;
1586 cgc->data_direction = CGC_DATA_READ;
1591 cgc->cmd[0] = GPCMD_SEND_KEY;
1592 cgc->cmd[10] = type | (agid << 6);
1595 cgc->buflen = 16;
1599 cgc->buflen = 12;
1603 cgc->buflen = 8;
1607 cgc->cmd[9] = cgc->buflen;
1608 cgc->data_direction = CGC_DATA_WRITE;
1616 const struct cdrom_device_ops *cdo = cdi->ops;
1622 switch (ai->type) {
1627 setup_report_key(&cgc, ai->lsa.agid, 0);
1629 if ((ret = cdo->generic_packet(cdi, &cgc)))
1632 ai->lsa.agid = buf[7] >> 6;
1638 setup_report_key(&cgc, ai->lsk.agid, 2);
1640 if ((ret = cdo->generic_packet(cdi, &cgc)))
1643 copy_key(ai->lsk.key, &buf[4]);
1649 setup_report_key(&cgc, ai->lsc.agid, 1);
1651 if ((ret = cdo->generic_packet(cdi, &cgc)))
1654 copy_chal(ai->lsc.chal, &buf[4]);
1658 /* Post-auth key */
1662 setup_report_key(&cgc, ai->lstk.agid, 4);
1663 cgc.cmd[5] = ai->lstk.lba;
1664 cgc.cmd[4] = ai->lstk.lba >> 8;
1665 cgc.cmd[3] = ai->lstk.lba >> 16;
1666 cgc.cmd[2] = ai->lstk.lba >> 24;
1668 if ((ret = cdo->generic_packet(cdi, &cgc)))
1671 ai->lstk.cpm = (buf[4] >> 7) & 1;
1672 ai->lstk.cp_sec = (buf[4] >> 6) & 1;
1673 ai->lstk.cgms = (buf[4] >> 4) & 3;
1674 copy_key(ai->lstk.title_key, &buf[5]);
1680 setup_report_key(&cgc, ai->lsasf.agid, 5);
1682 if ((ret = cdo->generic_packet(cdi, &cgc)))
1685 ai->lsasf.asf = buf[7] & 1;
1691 setup_send_key(&cgc, ai->hsc.agid, 1);
1693 copy_chal(&buf[4], ai->hsc.chal);
1695 if ((ret = cdo->generic_packet(cdi, &cgc)))
1698 ai->type = DVD_LU_SEND_KEY1;
1703 setup_send_key(&cgc, ai->hsk.agid, 3);
1705 copy_key(&buf[4], ai->hsk.key);
1707 if ((ret = cdo->generic_packet(cdi, &cgc))) {
1708 ai->type = DVD_AUTH_FAILURE;
1711 ai->type = DVD_AUTH_ESTABLISHED;
1718 setup_report_key(&cgc, ai->lsa.agid, 0x3f);
1719 if ((ret = cdo->generic_packet(cdi, &cgc)))
1730 if ((ret = cdo->generic_packet(cdi, &cgc)))
1733 ai->lrpcs.type = rpc_state.type_code;
1734 ai->lrpcs.vra = rpc_state.vra;
1735 ai->lrpcs.ucca = rpc_state.ucca;
1736 ai->lrpcs.region_mask = rpc_state.region_mask;
1737 ai->lrpcs.rpc_scheme = rpc_state.rpc_scheme;
1745 buf[4] = ai->hrpcs.pdrc;
1747 if ((ret = cdo->generic_packet(cdi, &cgc)))
1752 cd_dbg(CD_WARNING, "Invalid DVD key ioctl (%d)\n", ai->type);
1753 return -ENOTTY;
1764 const struct cdrom_device_ops *cdo = cdi->ops;
1765 int ret, layer_num = s->physical.layer_num;
1768 return -EINVAL;
1771 cgc->cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1772 cgc->cmd[6] = layer_num;
1773 cgc->cmd[7] = s->type;
1774 cgc->cmd[9] = cgc->buflen & 0xff;
1777 * refrain from reporting errors on non-existing layers (mainly)
1779 cgc->quiet = 1;
1781 ret = cdo->generic_packet(cdi, cgc);
1786 layer = &s->physical.layer[layer_num];
1793 layer->book_version = base[0] & 0xf;
1794 layer->book_type = base[0] >> 4;
1795 layer->min_rate = base[1] & 0xf;
1796 layer->disc_size = base[1] >> 4;
1797 layer->layer_type = base[2] & 0xf;
1798 layer->track_path = (base[2] >> 4) & 1;
1799 layer->nlayers = (base[2] >> 5) & 3;
1800 layer->track_density = base[3] & 0xf;
1801 layer->linear_density = base[3] >> 4;
1802 layer->start_sector = base[5] << 16 | base[6] << 8 | base[7];
1803 layer->end_sector = base[9] << 16 | base[10] << 8 | base[11];
1804 layer->end_sector_l0 = base[13] << 16 | base[14] << 8 | base[15];
1805 layer->bca = base[16] >> 7;
1815 const struct cdrom_device_ops *cdo = cdi->ops;
1818 cgc->cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1819 cgc->cmd[6] = s->copyright.layer_num;
1820 cgc->cmd[7] = s->type;
1821 cgc->cmd[8] = cgc->buflen >> 8;
1822 cgc->cmd[9] = cgc->buflen & 0xff;
1824 ret = cdo->generic_packet(cdi, cgc);
1828 s->copyright.cpst = buf[4];
1829 s->copyright.rmi = buf[5];
1839 const struct cdrom_device_ops *cdo = cdi->ops;
1841 size = sizeof(s->disckey.value) + 4;
1845 return -ENOMEM;
1848 cgc->cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1849 cgc->cmd[7] = s->type;
1850 cgc->cmd[8] = size >> 8;
1851 cgc->cmd[9] = size & 0xff;
1852 cgc->cmd[10] = s->disckey.agid << 6;
1854 ret = cdo->generic_packet(cdi, cgc);
1856 memcpy(s->disckey.value, &buf[4], sizeof(s->disckey.value));
1867 const struct cdrom_device_ops *cdo = cdi->ops;
1871 return -ENOMEM;
1874 cgc->cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1875 cgc->cmd[7] = s->type;
1876 cgc->cmd[9] = cgc->buflen & 0xff;
1878 ret = cdo->generic_packet(cdi, cgc);
1882 s->bca.len = buf[0] << 8 | buf[1];
1883 if (s->bca.len < 12 || s->bca.len > 188) {
1885 s->bca.len);
1886 ret = -EIO;
1889 memcpy(s->bca.value, &buf[4], s->bca.len);
1901 const struct cdrom_device_ops *cdo = cdi->ops;
1903 size = sizeof(s->manufact.value) + 4;
1907 return -ENOMEM;
1910 cgc->cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1911 cgc->cmd[7] = s->type;
1912 cgc->cmd[8] = size >> 8;
1913 cgc->cmd[9] = size & 0xff;
1915 ret = cdo->generic_packet(cdi, cgc);
1919 s->manufact.len = buf[0] << 8 | buf[1];
1920 if (s->manufact.len < 0) {
1922 s->manufact.len);
1923 ret = -EIO;
1925 if (s->manufact.len > 2048) {
1927 s->manufact.len);
1928 s->manufact.len = 2048;
1930 memcpy(s->manufact.value, &buf[4], s->manufact.len);
1941 switch (s->type) {
1959 s->type);
1960 return -EINVAL;
1968 const struct cdrom_device_ops *cdo = cdi->ops;
1970 memset(cgc->cmd, 0, sizeof(cgc->cmd));
1972 cgc->cmd[0] = GPCMD_MODE_SENSE_10;
1973 cgc->cmd[2] = page_code | (page_control << 6);
1974 cgc->cmd[7] = cgc->buflen >> 8;
1975 cgc->cmd[8] = cgc->buflen & 0xff;
1976 cgc->data_direction = CGC_DATA_READ;
1977 return cdo->generic_packet(cdi, cgc);
1984 const struct cdrom_device_ops *cdo = cdi->ops;
1986 memset(cgc->cmd, 0, sizeof(cgc->cmd));
1987 memset(cgc->buffer, 0, 2);
1988 cgc->cmd[0] = GPCMD_MODE_SELECT_10;
1989 cgc->cmd[1] = 0x10; /* PF */
1990 cgc->cmd[7] = cgc->buflen >> 8;
1991 cgc->cmd[8] = cgc->buflen & 0xff;
1992 cgc->data_direction = CGC_DATA_WRITE;
1993 return cdo->generic_packet(cdi, cgc);
2000 const struct cdrom_device_ops *cdo = cdi->ops;
2007 cgc.cmd[1] = subchnl->cdsc_format;/* MSF or LBA addressing */
2012 if ((ret = cdo->generic_packet(cdi, &cgc)))
2015 subchnl->cdsc_audiostatus = cgc.buffer[1];
2016 subchnl->cdsc_ctrl = cgc.buffer[5] & 0xf;
2017 subchnl->cdsc_trk = cgc.buffer[6];
2018 subchnl->cdsc_ind = cgc.buffer[7];
2020 if (subchnl->cdsc_format == CDROM_LBA) {
2021 subchnl->cdsc_absaddr.lba = ((cgc.buffer[8] << 24) |
2025 subchnl->cdsc_reladdr.lba = ((cgc.buffer[12] << 24) |
2030 subchnl->cdsc_reladdr.msf.minute = cgc.buffer[13];
2031 subchnl->cdsc_reladdr.msf.second = cgc.buffer[14];
2032 subchnl->cdsc_reladdr.msf.frame = cgc.buffer[15];
2033 subchnl->cdsc_absaddr.msf.minute = cgc.buffer[9];
2034 subchnl->cdsc_absaddr.msf.second = cgc.buffer[10];
2035 subchnl->cdsc_absaddr.msf.frame = cgc.buffer[11];
2048 const struct cdrom_device_ops *cdo = cdi->ops;
2050 memset(&cgc->cmd, 0, sizeof(cgc->cmd));
2051 cgc->cmd[0] = GPCMD_READ_10;
2052 cgc->cmd[2] = (lba >> 24) & 0xff;
2053 cgc->cmd[3] = (lba >> 16) & 0xff;
2054 cgc->cmd[4] = (lba >> 8) & 0xff;
2055 cgc->cmd[5] = lba & 0xff;
2056 cgc->cmd[6] = (nblocks >> 16) & 0xff;
2057 cgc->cmd[7] = (nblocks >> 8) & 0xff;
2058 cgc->cmd[8] = nblocks & 0xff;
2059 cgc->buflen = blocksize * nblocks;
2060 return cdo->generic_packet(cdi, cgc);
2068 const struct cdrom_device_ops *cdo = cdi->ops;
2070 memset(&cgc->cmd, 0, sizeof(cgc->cmd));
2071 cgc->cmd[0] = GPCMD_READ_CD;
2072 /* expected sector size - cdda,mode1,etc. */
2073 cgc->cmd[1] = format << 2;
2075 cgc->cmd[2] = (lba >> 24) & 0xff;
2076 cgc->cmd[3] = (lba >> 16) & 0xff;
2077 cgc->cmd[4] = (lba >> 8) & 0xff;
2078 cgc->cmd[5] = lba & 0xff;
2080 cgc->cmd[6] = (nblocks >> 16) & 0xff;
2081 cgc->cmd[7] = (nblocks >> 8) & 0xff;
2082 cgc->cmd[8] = nblocks & 0xff;
2083 cgc->buflen = blksize * nblocks;
2087 case CD_FRAMESIZE_RAW0 : cgc->cmd[9] = 0x58; break;
2088 case CD_FRAMESIZE_RAW1 : cgc->cmd[9] = 0x78; break;
2089 case CD_FRAMESIZE_RAW : cgc->cmd[9] = 0xf8; break;
2090 default : cgc->cmd[9] = 0x10;
2093 return cdo->generic_packet(cdi, cgc);
2103 cdi->last_sense = 0;
2120 return -ENOMEM;
2131 ret = -EFAULT;
2135 nframes -= nr;
2145 int max_frames = (queue_max_sectors(cdi->disk->queue) << 9) /
2149 cdi->last_sense = 0;
2152 if (cdi->cdda_method == CDDA_BPC_SINGLE)
2157 ret = cdi->ops->read_cdda_bpc(cdi, ubuf, lba, nr,
2158 &cdi->last_sense);
2162 nframes -= nr;
2175 if (cdi->cdda_method == CDDA_OLD)
2183 if (!ret || ret != -EIO)
2187 * I've seen drives get sense 4/8/3 udma crc errors on multi
2190 if (cdi->cdda_method == CDDA_BPC_FULL && nframes > 1) {
2192 cdi->cdda_method = CDDA_BPC_SINGLE;
2201 if (cdi->last_sense != 0x04 && cdi->last_sense != 0x0b)
2204 pr_info("dropping to old style cdda (sense=%x)\n", cdi->last_sense);
2205 cdi->cdda_method = CDDA_OLD;
2215 if (!(cdi->ops->capability & CDC_MULTI_SESSION))
2216 return -ENOSYS;
2218 requested_format = info->addr_format;
2220 return -EINVAL;
2221 info->addr_format = CDROM_LBA;
2223 ret = cdi->ops->get_last_session(cdi, info);
2225 sanitize_format(&info->addr, &info->addr_format,
2240 return -EFAULT;
2245 return -EFAULT;
2256 return -ENOSYS;
2257 if (cdi->use_count != 1 || cdi->keeplocked)
2258 return -EBUSY;
2260 int ret = cdi->ops->lock_door(cdi, 0);
2265 return cdi->ops->tray_move(cdi, 1);
2273 return -ENOSYS;
2274 return cdi->ops->tray_move(cdi, 0);
2283 return -ENOSYS;
2284 if (cdi->keeplocked)
2285 return -EBUSY;
2287 cdi->options &= ~(CDO_AUTO_CLOSE | CDO_AUTO_EJECT);
2289 cdi->options |= CDO_AUTO_CLOSE | CDO_AUTO_EJECT;
2302 return -ENOSYS;
2308 if (arg >= cdi->capacity)
2309 return -EINVAL;
2312 arg = array_index_nospec(arg, cdi->capacity);
2316 return -ENOMEM;
2320 ret = info->slots[arg].change;
2329 * arg->last_media_change may be set by calling code to signal
2331 * Upon successful return, ioctl call will set arg->last_media_change
2333 * and set arg->has_changed to 1 if that timestamp is more recent
2344 return -ENOSYS;
2354 return -EFAULT;
2357 if (cdi->last_media_change_ms > tmp_info.last_media_change)
2360 tmp_info.last_media_change = cdi->last_media_change_ms;
2363 return -EFAULT;
2383 return -ENOSYS;
2386 return cdi->options;
2390 return -ENOSYS;
2392 cdi->options |= (int) arg;
2393 return cdi->options;
2401 cdi->options &= ~(int) arg;
2402 return cdi->options;
2411 return -ENOSYS;
2412 return cdi->ops->select_speed(cdi, arg);
2421 return -ENOSYS;
2424 if (arg >= cdi->capacity)
2425 return -EINVAL;
2438 return -EACCES;
2440 return -ENOSYS;
2442 return cdi->ops->reset(cdi);
2451 return -EDRIVE_CANT_DO_THIS;
2453 cdi->keeplocked = arg ? 1 : 0;
2459 if (cdi->use_count != 1 && !arg && !capable(CAP_SYS_ADMIN))
2460 return -EBUSY;
2461 return cdi->ops->lock_door(cdi, arg);
2470 return -EACCES;
2478 return (cdi->ops->capability & ~cdi->mask);
2495 if (!(cdi->ops->capability & CDC_MCN))
2496 return -ENOSYS;
2497 ret = cdi->ops->get_mcn(cdi, &mcn);
2502 return -EFAULT;
2512 if (!(cdi->ops->capability & CDC_DRIVE_STATUS))
2513 return -ENOSYS;
2516 return cdi->ops->drive_status(cdi, CDSL_CURRENT);
2517 if (arg >= cdi->capacity)
2518 return -EINVAL;
2533 * wasn't designed to use bitmasks... -Erik
2535 * Well, now we have the option CDS_MIXED: a mixed-type CD.
2537 * ---david
2572 return cdi->capacity;
2585 return -EFAULT;
2589 return -EINVAL;
2592 ret = cdi->ops->audio_ioctl(cdi, CDROMSUBCHNL, &q);
2601 return -EFAULT;
2615 return -EFAULT;
2617 ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header);
2622 return -EFAULT;
2630 u8 requested_format = entry->cdte_format;
2634 return -EINVAL;
2636 /* make interface to low-level uniform */
2637 entry->cdte_format = CDROM_MSF;
2638 ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, entry);
2640 sanitize_format(&entry->cdte_addr, &entry->cdte_format,
2653 return -EFAULT;
2656 return -EFAULT;
2668 return -ENOSYS;
2670 return -EFAULT;
2671 return cdi->ops->audio_ioctl(cdi, CDROMPLAYMSF, &msf);
2683 return -ENOSYS;
2685 return -EFAULT;
2687 ret = check_for_audio_disc(cdi, cdi->ops);
2690 return cdi->ops->audio_ioctl(cdi, CDROMPLAYTRKIND, &ti);
2700 return -ENOSYS;
2702 return -EFAULT;
2703 return cdi->ops->audio_ioctl(cdi, CDROMVOLCTRL, &volume);
2715 return -ENOSYS;
2717 ret = cdi->ops->audio_ioctl(cdi, CDROMVOLREAD, &volume);
2722 return -EFAULT;
2734 return -ENOSYS;
2735 ret = check_for_audio_disc(cdi, cdi->ops);
2738 return cdi->ops->audio_ioctl(cdi, cmd, NULL);
2747 const struct cdrom_device_ops *cdo = cdi->ops;
2767 return cdo->generic_packet(cdi, &cgc);
2773 const struct cdrom_device_ops *cdo = cdi->ops;
2785 ret = cdo->generic_packet(cdi, &cgc);
2789 buflen = be16_to_cpu(ti->track_information_length) +
2790 sizeof(ti->track_information_length);
2796 ret = cdo->generic_packet(cdi, &cgc);
2804 /* return the last written block on the CD-R media. this is for the udf
2812 int ret = -1, ti_size;
2832 last_track--;
2849 *last_written -= (be32_to_cpu(ti.free_blocks) + 7);
2859 return -ENOSYS;
2863 if ((ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &toc)))
2898 last_track--;
2945 return -EFAULT;
2949 return -EINVAL;
2951 cgc->buffer = kzalloc(blocksize, GFP_KERNEL);
2952 if (cgc->buffer == NULL)
2953 return -ENOMEM;
2956 cgc->sshdr = &sshdr;
2957 cgc->data_direction = CGC_DATA_READ;
2963 * SCSI-II devices are not required to support
2971 cgc->sshdr = NULL;
2976 if (!ret && copy_to_user(arg, cgc->buffer, blocksize))
2977 ret = -EFAULT;
2979 kfree(cgc->buffer);
2999 return -EFAULT;
3012 return -EFAULT;
3022 return -EINVAL;
3026 return -EINVAL;
3038 return -EFAULT;
3042 return -EINVAL;
3051 return -EFAULT;
3060 const struct cdrom_device_ops *cdo = cdi->ops;
3064 return -EFAULT;
3065 cgc->cmd[0] = GPCMD_PLAY_AUDIO_MSF;
3066 cgc->cmd[3] = msf.cdmsf_min0;
3067 cgc->cmd[4] = msf.cdmsf_sec0;
3068 cgc->cmd[5] = msf.cdmsf_frame0;
3069 cgc->cmd[6] = msf.cdmsf_min1;
3070 cgc->cmd[7] = msf.cdmsf_sec1;
3071 cgc->cmd[8] = msf.cdmsf_frame1;
3072 cgc->data_direction = CGC_DATA_NONE;
3073 return cdo->generic_packet(cdi, cgc);
3080 const struct cdrom_device_ops *cdo = cdi->ops;
3084 return -EFAULT;
3085 cgc->cmd[0] = GPCMD_PLAY_AUDIO_10;
3086 cgc->cmd[2] = (blk.from >> 24) & 0xff;
3087 cgc->cmd[3] = (blk.from >> 16) & 0xff;
3088 cgc->cmd[4] = (blk.from >> 8) & 0xff;
3089 cgc->cmd[5] = blk.from & 0xff;
3090 cgc->cmd[7] = (blk.len >> 8) & 0xff;
3091 cgc->cmd[8] = blk.len & 0xff;
3092 cgc->data_direction = CGC_DATA_NONE;
3093 return cdo->generic_packet(cdi, cgc);
3111 return -EFAULT;
3113 cgc->buffer = buffer;
3114 cgc->buflen = 24;
3126 return -E2BIG;
3128 if (offset + 16 > cgc->buflen) {
3129 cgc->buflen = offset + 16;
3139 return -EINVAL;
3150 return -EFAULT;
3155 cgc->buffer = mask;
3166 cgc->buffer = buffer + offset - 8;
3167 memset(cgc->buffer, 0, 8);
3175 const struct cdrom_device_ops *cdo = cdi->ops;
3177 cgc->cmd[0] = GPCMD_START_STOP_UNIT;
3178 cgc->cmd[1] = 1;
3179 cgc->cmd[4] = (cmd == CDROMSTART) ? 1 : 0;
3180 cgc->data_direction = CGC_DATA_NONE;
3181 return cdo->generic_packet(cdi, cgc);
3188 const struct cdrom_device_ops *cdo = cdi->ops;
3190 cgc->cmd[0] = GPCMD_PAUSE_RESUME;
3191 cgc->cmd[8] = (cmd == CDROMRESUME) ? 1 : 0;
3192 cgc->data_direction = CGC_DATA_NONE;
3193 return cdo->generic_packet(cdi, cgc);
3205 return -ENOSYS;
3218 ret = -EFAULT;
3230 return -ENOSYS;
3233 return -EFAULT;
3238 return -EFAULT;
3252 return -EFAULT;
3280 cdo->generic_packet() */
3313 return -ENOTTY;
3368 * interface. this may look at bit funny, but if -ENOTTY is
3374 if (ret != -ENOTTY)
3405 return -ENOSYS;
3436 ret = scnprintf(info + *pos, max_size - *pos, header);
3445 ret = scnprintf(info + *pos, max_size - *pos,
3446 "\t%s", cdi->name);
3449 ret = scnprintf(info + *pos, max_size - *pos,
3450 "\t%d", cdi->speed);
3453 ret = scnprintf(info + *pos, max_size - *pos,
3454 "\t%d", cdi->capacity);
3457 ret = scnprintf(info + *pos, max_size - *pos,
3486 pos = sprintf(info, "CD-ROM information, " VERSION "\n");
3521 if (cdrom_print_info("\nCan write CD-R:\t",
3524 if (cdrom_print_info("\nCan write CD-RW:",
3530 if (cdrom_print_info("\nCan write DVD-R:",
3533 if (cdrom_print_info("\nCan write DVD-RAM:",
3545 if (!scnprintf(info + pos, max_size - pos, "\n\n"))
3566 cdi->options |= CDO_AUTO_CLOSE;
3568 cdi->options &= ~CDO_AUTO_CLOSE;
3570 cdi->options |= CDO_AUTO_EJECT;
3572 cdi->options &= ~CDO_AUTO_EJECT;
3574 cdi->options |= CDO_LOCK;
3576 cdi->options &= ~CDO_LOCK;
3578 cdi->options |= CDO_CHECK_TYPE;
3580 cdi->options &= ~CDO_CHECK_TYPE;
3700 pr_info("Uniform CD-ROM driver unloaded\n");
3706 MODULE_DESCRIPTION("Uniform CD-ROM driver");