Lines Matching refs:cdi

323 #define CDROM_CAN(type) (cdi->ops->capability & ~cdi->mask & (type))
337 static void signal_media_change(struct cdrom_device_info *cdi) in signal_media_change() argument
339 cdi->mc_flags = 0x3; /* set media changed bits, on both queues */ in signal_media_change()
340 cdi->last_media_change_ms = ktime_to_ms(ktime_get()); in signal_media_change()
343 int cdrom_dummy_generic_packet(struct cdrom_device_info *cdi, in cdrom_dummy_generic_packet() argument
357 static int cdrom_flush_cache(struct cdrom_device_info *cdi) in cdrom_flush_cache() argument
366 return cdi->ops->generic_packet(cdi, &cgc); in cdrom_flush_cache()
370 static int cdrom_get_disc_info(struct cdrom_device_info *cdi, in cdrom_get_disc_info() argument
373 const struct cdrom_device_ops *cdo = cdi->ops; in cdrom_get_disc_info()
383 ret = cdo->generic_packet(cdi, &cgc); in cdrom_get_disc_info()
397 ret = cdo->generic_packet(cdi, &cgc); in cdrom_get_disc_info()
420 static int cdrom_mrw_probe_pc(struct cdrom_device_info *cdi) in cdrom_mrw_probe_pc() argument
430 if (!cdrom_mode_sense(cdi, &cgc, MRW_MODE_PC, 0)) { in cdrom_mrw_probe_pc()
431 cdi->mrw_mode_page = MRW_MODE_PC; in cdrom_mrw_probe_pc()
433 } else if (!cdrom_mode_sense(cdi, &cgc, MRW_MODE_PC_PRE1, 0)) { in cdrom_mrw_probe_pc()
434 cdi->mrw_mode_page = MRW_MODE_PC_PRE1; in cdrom_mrw_probe_pc()
441 static int cdrom_is_mrw(struct cdrom_device_info *cdi, int *write) in cdrom_is_mrw() argument
457 if ((ret = cdi->ops->generic_packet(cdi, &cgc))) in cdrom_is_mrw()
465 if ((ret = cdrom_mrw_probe_pc(cdi))) { in cdrom_is_mrw()
473 static int cdrom_mrw_bgformat(struct cdrom_device_info *cdi, int cont) in cdrom_mrw_bgformat() argument
507 ret = cdi->ops->generic_packet(cdi, &cgc); in cdrom_mrw_bgformat()
514 static int cdrom_mrw_bgformat_susp(struct cdrom_device_info *cdi, int immed) in cdrom_mrw_bgformat_susp() argument
529 return cdi->ops->generic_packet(cdi, &cgc); in cdrom_mrw_bgformat_susp()
532 static int cdrom_mrw_exit(struct cdrom_device_info *cdi) in cdrom_mrw_exit() argument
537 ret = cdrom_get_disc_info(cdi, &di); in cdrom_mrw_exit()
544 ret = cdrom_mrw_bgformat_susp(cdi, 0); in cdrom_mrw_exit()
547 if (!ret && cdi->media_written) in cdrom_mrw_exit()
548 ret = cdrom_flush_cache(cdi); in cdrom_mrw_exit()
553 static int cdrom_mrw_set_lba_space(struct cdrom_device_info *cdi, int space) in cdrom_mrw_set_lba_space() argument
565 ret = cdrom_mode_sense(cdi, &cgc, cdi->mrw_mode_page, 0); in cdrom_mrw_set_lba_space()
576 ret = cdrom_mode_select(cdi, &cgc); in cdrom_mrw_set_lba_space()
581 cdi->name, mrw_address_space[space]); in cdrom_mrw_set_lba_space()
585 int register_cdrom(struct gendisk *disk, struct cdrom_device_info *cdi) in register_cdrom() argument
588 const struct cdrom_device_ops *cdo = cdi->ops; in register_cdrom()
600 cdi->disk = disk; in register_cdrom()
601 disk->cdi = cdi; in register_cdrom()
613 cdi->mc_flags = 0; in register_cdrom()
614 cdi->options = CDO_USE_FFLAGS; in register_cdrom()
615 cdi->last_media_change_ms = ktime_to_ms(ktime_get()); in register_cdrom()
618 cdi->options |= (int) CDO_AUTO_CLOSE; in register_cdrom()
620 cdi->options |= (int) CDO_AUTO_EJECT; in register_cdrom()
622 cdi->options |= (int) CDO_LOCK; in register_cdrom()
624 cdi->options |= (int) CDO_CHECK_TYPE; in register_cdrom()
627 cdi->exit = cdrom_mrw_exit; in register_cdrom()
629 if (cdi->ops->read_cdda_bpc) in register_cdrom()
630 cdi->cdda_method = CDDA_BPC_FULL; in register_cdrom()
632 cdi->cdda_method = CDDA_OLD; in register_cdrom()
636 cd_dbg(CD_REG_UNREG, "drive \"/dev/%s\" registered\n", cdi->name); in register_cdrom()
638 list_add(&cdi->list, &cdrom_list); in register_cdrom()
645 void unregister_cdrom(struct cdrom_device_info *cdi) in unregister_cdrom() argument
650 list_del(&cdi->list); in unregister_cdrom()
653 if (cdi->exit) in unregister_cdrom()
654 cdi->exit(cdi); in unregister_cdrom()
656 cd_dbg(CD_REG_UNREG, "drive \"/dev/%s\" unregistered\n", cdi->name); in unregister_cdrom()
660 int cdrom_get_media_event(struct cdrom_device_info *cdi, in cdrom_get_media_event() argument
674 if (cdi->ops->generic_packet(cdi, &cgc)) in cdrom_get_media_event()
688 static int cdrom_get_random_writable(struct cdrom_device_info *cdi, in cdrom_get_random_writable() argument
702 if ((ret = cdi->ops->generic_packet(cdi, &cgc))) in cdrom_get_random_writable()
709 static int cdrom_has_defect_mgt(struct cdrom_device_info *cdi) in cdrom_has_defect_mgt() argument
723 if ((ret = cdi->ops->generic_packet(cdi, &cgc))) in cdrom_has_defect_mgt()
734 static int cdrom_is_random_writable(struct cdrom_device_info *cdi, int *write) in cdrom_is_random_writable() argument
741 if ((ret = cdrom_get_random_writable(cdi, &rfd))) in cdrom_is_random_writable()
750 static int cdrom_media_erasable(struct cdrom_device_info *cdi) in cdrom_media_erasable() argument
755 ret = cdrom_get_disc_info(cdi, &di); in cdrom_media_erasable()
765 static int cdrom_dvdram_open_write(struct cdrom_device_info *cdi) in cdrom_dvdram_open_write() argument
767 int ret = cdrom_media_erasable(cdi); in cdrom_dvdram_open_write()
779 static int cdrom_mrw_open_write(struct cdrom_device_info *cdi) in cdrom_mrw_open_write() argument
787 if (cdrom_mrw_set_lba_space(cdi, MRW_LBA_DMA)) { in cdrom_mrw_open_write()
792 ret = cdrom_get_disc_info(cdi, &di); in cdrom_mrw_open_write()
812 ret = cdrom_mrw_bgformat(cdi, 1); in cdrom_mrw_open_write()
817 static int mo_open_write(struct cdrom_device_info *cdi) in mo_open_write() argument
831 ret = cdrom_mode_sense(cdi, &cgc, GPMODE_ALL_PAGES, 0); in mo_open_write()
833 ret = cdrom_mode_sense(cdi, &cgc, GPMODE_VENDOR_PAGE, 0); in mo_open_write()
836 ret = cdrom_mode_sense(cdi, &cgc, GPMODE_ALL_PAGES, 0); in mo_open_write()
846 static int cdrom_ram_open_write(struct cdrom_device_info *cdi) in cdrom_ram_open_write() argument
851 if ((ret = cdrom_has_defect_mgt(cdi))) in cdrom_ram_open_write()
854 if ((ret = cdrom_get_random_writable(cdi, &rfd))) in cdrom_ram_open_write()
863 static void cdrom_mmc3_profile(struct cdrom_device_info *cdi) in cdrom_mmc3_profile() argument
877 if (cdi->ops->generic_packet(cdi, &cgc)) in cdrom_mmc3_profile()
882 cdi->mmc3_profile = mmc3_profile; in cdrom_mmc3_profile()
885 static int cdrom_is_dvd_rw(struct cdrom_device_info *cdi) in cdrom_is_dvd_rw() argument
887 switch (cdi->mmc3_profile) { in cdrom_is_dvd_rw()
900 static int cdrom_open_write(struct cdrom_device_info *cdi) in cdrom_open_write() argument
906 if (!cdrom_is_mrw(cdi, &mrw_write)) in cdrom_open_write()
912 (void) cdrom_is_random_writable(cdi, &ram_write); in cdrom_open_write()
915 cdi->mask &= ~CDC_MRW; in cdrom_open_write()
917 cdi->mask |= CDC_MRW; in cdrom_open_write()
920 cdi->mask &= ~CDC_MRW_W; in cdrom_open_write()
922 cdi->mask |= CDC_MRW_W; in cdrom_open_write()
925 cdi->mask &= ~CDC_RAM; in cdrom_open_write()
927 cdi->mask |= CDC_RAM; in cdrom_open_write()
930 ret = cdrom_mrw_open_write(cdi); in cdrom_open_write()
932 ret = cdrom_dvdram_open_write(cdi); in cdrom_open_write()
935 ret = cdrom_ram_open_write(cdi); in cdrom_open_write()
937 ret = mo_open_write(cdi); in cdrom_open_write()
938 else if (!cdrom_is_dvd_rw(cdi)) in cdrom_open_write()
944 static void cdrom_dvd_rw_close_write(struct cdrom_device_info *cdi) in cdrom_dvd_rw_close_write() argument
948 if (cdi->mmc3_profile != 0x1a) { in cdrom_dvd_rw_close_write()
949 cd_dbg(CD_CLOSE, "%s: No DVD+RW\n", cdi->name); in cdrom_dvd_rw_close_write()
953 if (!cdi->media_written) { in cdrom_dvd_rw_close_write()
954 cd_dbg(CD_CLOSE, "%s: DVD+RW media clean\n", cdi->name); in cdrom_dvd_rw_close_write()
958 pr_info("%s: dirty DVD+RW media, \"finalizing\"\n", cdi->name); in cdrom_dvd_rw_close_write()
963 cdi->ops->generic_packet(cdi, &cgc); in cdrom_dvd_rw_close_write()
969 cdi->ops->generic_packet(cdi, &cgc); in cdrom_dvd_rw_close_write()
976 cdi->ops->generic_packet(cdi, &cgc); in cdrom_dvd_rw_close_write()
978 cdi->media_written = 0; in cdrom_dvd_rw_close_write()
981 static int cdrom_close_write(struct cdrom_device_info *cdi) in cdrom_close_write() argument
984 return cdrom_flush_cache(cdi); in cdrom_close_write()
991 static void cdrom_count_tracks(struct cdrom_device_info *cdi, tracktype *tracks) in cdrom_count_tracks() argument
998 tracks->cdi = 0; in cdrom_count_tracks()
1009 ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header); in cdrom_count_tracks()
1021 if (cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &entry)) { in cdrom_count_tracks()
1027 tracks->cdi++; in cdrom_count_tracks()
1040 tracks->cdi, tracks->xa); in cdrom_count_tracks()
1044 int open_for_data(struct cdrom_device_info *cdi) in open_for_data() argument
1047 const struct cdrom_device_ops *cdo = cdi->ops; in open_for_data()
1053 ret = cdo->drive_status(cdi, CDSL_CURRENT); in open_for_data()
1059 cdi->options & CDO_AUTO_CLOSE) { in open_for_data()
1061 ret=cdo->tray_move(cdi,0); in open_for_data()
1078 ret = cdo->drive_status(cdi, CDSL_CURRENT); in open_for_data()
1088 ret = cdo->drive_status(cdi, CDSL_CURRENT); in open_for_data()
1094 cdrom_count_tracks(cdi, &tracks); in open_for_data()
1103 if (cdi->options & CDO_CHECK_TYPE) { in open_for_data()
1120 ret = cdo->open(cdi, 0); /* open for data */ in open_for_data()
1129 if (CDROM_CAN(CDC_LOCK) && (cdi->options & CDO_LOCK)) { in open_for_data()
1130 cdo->lock_door(cdi, 1); in open_for_data()
1143 if (CDROM_CAN(CDC_LOCK) && cdi->options & CDO_LOCK) { in open_for_data()
1144 cdo->lock_door(cdi, 0); in open_for_data()
1158 int cdrom_open(struct cdrom_device_info *cdi, struct block_device *bdev, in cdrom_open() argument
1167 cdi->use_count++; in cdrom_open()
1168 if ((mode & FMODE_NDELAY) && (cdi->options & CDO_USE_FFLAGS)) { in cdrom_open()
1169 ret = cdi->ops->open(cdi, 1); in cdrom_open()
1171 ret = open_for_data(cdi); in cdrom_open()
1175 cdrom_mmc3_profile(cdi); in cdrom_open()
1178 if (cdrom_open_write(cdi)) in cdrom_open()
1183 cdi->media_written = 0; in cdrom_open()
1191 cdi->name, cdi->use_count); in cdrom_open()
1194 if (CDROM_CAN(CDC_LOCK) && cdi->options & CDO_LOCK) { in cdrom_open()
1195 cdi->ops->lock_door(cdi, 0); in cdrom_open()
1198 cdi->ops->release(cdi); in cdrom_open()
1200 cdi->use_count--; in cdrom_open()
1208 static int check_for_audio_disc(struct cdrom_device_info *cdi, in check_for_audio_disc() argument
1214 if (!(cdi->options & CDO_CHECK_TYPE)) in check_for_audio_disc()
1217 ret = cdo->drive_status(cdi, CDSL_CURRENT); in check_for_audio_disc()
1223 cdi->options & CDO_AUTO_CLOSE) { in check_for_audio_disc()
1225 ret=cdo->tray_move(cdi,0); in check_for_audio_disc()
1240 ret = cdo->drive_status(cdi, CDSL_CURRENT); in check_for_audio_disc()
1252 cdrom_count_tracks(cdi, &tracks); in check_for_audio_disc()
1262 void cdrom_release(struct cdrom_device_info *cdi, fmode_t mode) in cdrom_release() argument
1264 const struct cdrom_device_ops *cdo = cdi->ops; in cdrom_release()
1269 if (cdi->use_count > 0) in cdrom_release()
1270 cdi->use_count--; in cdrom_release()
1272 if (cdi->use_count == 0) { in cdrom_release()
1274 cdi->name); in cdrom_release()
1275 cdrom_dvd_rw_close_write(cdi); in cdrom_release()
1277 if ((cdo->capability & CDC_LOCK) && !cdi->keeplocked) { in cdrom_release()
1279 cdo->lock_door(cdi, 0); in cdrom_release()
1283 opened_for_data = !(cdi->options & CDO_USE_FFLAGS) || in cdrom_release()
1289 if (CDROM_CAN(CDC_RAM) && !cdi->use_count && cdi->for_data) in cdrom_release()
1290 cdrom_close_write(cdi); in cdrom_release()
1292 cdo->release(cdi); in cdrom_release()
1293 if (cdi->use_count == 0) { /* last process that closes dev*/ in cdrom_release()
1295 cdi->options & CDO_AUTO_EJECT && CDROM_CAN(CDC_OPEN_TRAY)) in cdrom_release()
1296 cdo->tray_move(cdi, 1); in cdrom_release()
1301 static int cdrom_read_mech_status(struct cdrom_device_info *cdi, in cdrom_read_mech_status() argument
1305 const struct cdrom_device_ops *cdo = cdi->ops; in cdrom_read_mech_status()
1313 if (cdi->sanyo_slot) { in cdrom_read_mech_status()
1315 buf->hdr.curslot = cdi->sanyo_slot == 3 ? 0 : cdi->sanyo_slot; in cdrom_read_mech_status()
1324 cdi->capacity * sizeof(struct cdrom_slot); in cdrom_read_mech_status()
1330 return cdo->generic_packet(cdi, &cgc); in cdrom_read_mech_status()
1333 static int cdrom_slot_status(struct cdrom_device_info *cdi, int slot) in cdrom_slot_status() argument
1339 if (cdi->sanyo_slot) in cdrom_slot_status()
1346 if ((ret = cdrom_read_mech_status(cdi, info))) in cdrom_slot_status()
1362 int cdrom_number_of_slots(struct cdrom_device_info *cdi) in cdrom_number_of_slots() argument
1369 cdi->capacity = 0; in cdrom_number_of_slots()
1375 if (cdrom_read_mech_status(cdi, info) == 0) in cdrom_number_of_slots()
1385 static int cdrom_load_unload(struct cdrom_device_info *cdi, int slot) in cdrom_load_unload() argument
1390 if (cdi->sanyo_slot && slot < 0) in cdrom_load_unload()
1402 if (cdi->sanyo_slot && -1 < slot) { in cdrom_load_unload()
1406 cdi->sanyo_slot = slot ? slot : 3; in cdrom_load_unload()
1409 return cdi->ops->generic_packet(cdi, &cgc); in cdrom_load_unload()
1412 static int cdrom_select_disc(struct cdrom_device_info *cdi, int slot) in cdrom_select_disc() argument
1422 if (cdi->ops->check_events) in cdrom_select_disc()
1423 cdi->ops->check_events(cdi, 0, slot); in cdrom_select_disc()
1426 signal_media_change(cdi); in cdrom_select_disc()
1427 return cdrom_load_unload(cdi, -1); in cdrom_select_disc()
1434 if ((ret = cdrom_read_mech_status(cdi, info))) { in cdrom_select_disc()
1442 if (cdi->use_count > 1 || cdi->keeplocked) { in cdrom_select_disc()
1459 signal_media_change(cdi); in cdrom_select_disc()
1460 if ((ret = cdrom_load_unload(cdi, slot))) in cdrom_select_disc()
1480 static void cdrom_update_events(struct cdrom_device_info *cdi, in cdrom_update_events() argument
1485 events = cdi->ops->check_events(cdi, clearing, CDSL_CURRENT); in cdrom_update_events()
1486 cdi->vfs_events |= events; in cdrom_update_events()
1487 cdi->ioctl_events |= events; in cdrom_update_events()
1490 unsigned int cdrom_check_events(struct cdrom_device_info *cdi, in cdrom_check_events() argument
1495 cdrom_update_events(cdi, clearing); in cdrom_check_events()
1496 events = cdi->vfs_events; in cdrom_check_events()
1497 cdi->vfs_events = 0; in cdrom_check_events()
1509 int media_changed(struct cdrom_device_info *cdi, int queue) in media_changed() argument
1512 int ret = !!(cdi->mc_flags & mask); in media_changed()
1520 cdrom_update_events(cdi, DISK_EVENT_MEDIA_CHANGE); in media_changed()
1521 changed = cdi->ioctl_events & DISK_EVENT_MEDIA_CHANGE; in media_changed()
1522 cdi->ioctl_events = 0; in media_changed()
1525 signal_media_change(cdi); in media_changed()
1527 cdi->media_written = 0; in media_changed()
1530 cdi->mc_flags &= ~mask; /* clear bit */ in media_changed()
1632 static int dvd_do_auth(struct cdrom_device_info *cdi, dvd_authinfo *ai) in dvd_do_auth() argument
1637 const struct cdrom_device_ops *cdo = cdi->ops; in dvd_do_auth()
1650 if ((ret = cdo->generic_packet(cdi, &cgc))) in dvd_do_auth()
1661 if ((ret = cdo->generic_packet(cdi, &cgc))) in dvd_do_auth()
1672 if ((ret = cdo->generic_packet(cdi, &cgc))) in dvd_do_auth()
1689 if ((ret = cdo->generic_packet(cdi, &cgc))) in dvd_do_auth()
1703 if ((ret = cdo->generic_packet(cdi, &cgc))) in dvd_do_auth()
1716 if ((ret = cdo->generic_packet(cdi, &cgc))) in dvd_do_auth()
1728 if ((ret = cdo->generic_packet(cdi, &cgc))) { in dvd_do_auth()
1740 if ((ret = cdo->generic_packet(cdi, &cgc))) in dvd_do_auth()
1751 if ((ret = cdo->generic_packet(cdi, &cgc))) in dvd_do_auth()
1768 if ((ret = cdo->generic_packet(cdi, &cgc))) in dvd_do_auth()
1780 static int dvd_read_physical(struct cdrom_device_info *cdi, dvd_struct *s, in dvd_read_physical() argument
1785 const struct cdrom_device_ops *cdo = cdi->ops; in dvd_read_physical()
1802 ret = cdo->generic_packet(cdi, cgc); in dvd_read_physical()
1831 static int dvd_read_copyright(struct cdrom_device_info *cdi, dvd_struct *s, in dvd_read_copyright() argument
1836 const struct cdrom_device_ops *cdo = cdi->ops; in dvd_read_copyright()
1845 ret = cdo->generic_packet(cdi, cgc); in dvd_read_copyright()
1855 static int dvd_read_disckey(struct cdrom_device_info *cdi, dvd_struct *s, in dvd_read_disckey() argument
1860 const struct cdrom_device_ops *cdo = cdi->ops; in dvd_read_disckey()
1875 ret = cdo->generic_packet(cdi, cgc); in dvd_read_disckey()
1883 static int dvd_read_bca(struct cdrom_device_info *cdi, dvd_struct *s, in dvd_read_bca() argument
1888 const struct cdrom_device_ops *cdo = cdi->ops; in dvd_read_bca()
1899 ret = cdo->generic_packet(cdi, cgc); in dvd_read_bca()
1917 static int dvd_read_manufact(struct cdrom_device_info *cdi, dvd_struct *s, in dvd_read_manufact() argument
1922 const struct cdrom_device_ops *cdo = cdi->ops; in dvd_read_manufact()
1936 ret = cdo->generic_packet(cdi, cgc); in dvd_read_manufact()
1959 static int dvd_read_struct(struct cdrom_device_info *cdi, dvd_struct *s, in dvd_read_struct() argument
1964 return dvd_read_physical(cdi, s, cgc); in dvd_read_struct()
1967 return dvd_read_copyright(cdi, s, cgc); in dvd_read_struct()
1970 return dvd_read_disckey(cdi, s, cgc); in dvd_read_struct()
1973 return dvd_read_bca(cdi, s, cgc); in dvd_read_struct()
1976 return dvd_read_manufact(cdi, s, cgc); in dvd_read_struct()
1985 int cdrom_mode_sense(struct cdrom_device_info *cdi, in cdrom_mode_sense() argument
1989 const struct cdrom_device_ops *cdo = cdi->ops; in cdrom_mode_sense()
1998 return cdo->generic_packet(cdi, cgc); in cdrom_mode_sense()
2002 int cdrom_mode_select(struct cdrom_device_info *cdi, in cdrom_mode_select() argument
2005 const struct cdrom_device_ops *cdo = cdi->ops; in cdrom_mode_select()
2014 return cdo->generic_packet(cdi, cgc); in cdrom_mode_select()
2018 static int cdrom_read_subchannel(struct cdrom_device_info *cdi, in cdrom_read_subchannel() argument
2021 const struct cdrom_device_ops *cdo = cdi->ops; in cdrom_read_subchannel()
2033 if ((ret = cdo->generic_packet(cdi, &cgc))) in cdrom_read_subchannel()
2065 static int cdrom_read_cd(struct cdrom_device_info *cdi, in cdrom_read_cd() argument
2069 const struct cdrom_device_ops *cdo = cdi->ops; in cdrom_read_cd()
2081 return cdo->generic_packet(cdi, cgc); in cdrom_read_cd()
2085 static int cdrom_read_block(struct cdrom_device_info *cdi, in cdrom_read_block() argument
2089 const struct cdrom_device_ops *cdo = cdi->ops; in cdrom_read_block()
2114 return cdo->generic_packet(cdi, cgc); in cdrom_read_block()
2117 static int cdrom_read_cdda_old(struct cdrom_device_info *cdi, __u8 __user *ubuf, in cdrom_read_cdda_old() argument
2124 cdi->last_sense = 0; in cdrom_read_cdda_old()
2148 ret = cdrom_read_block(cdi, &cgc, lba, nr, 1, CD_FRAMESIZE_RAW); in cdrom_read_cdda_old()
2163 static int cdrom_read_cdda_bpc(struct cdrom_device_info *cdi, __u8 __user *ubuf, in cdrom_read_cdda_bpc() argument
2166 int max_frames = (queue_max_sectors(cdi->disk->queue) << 9) / in cdrom_read_cdda_bpc()
2170 cdi->last_sense = 0; in cdrom_read_cdda_bpc()
2173 if (cdi->cdda_method == CDDA_BPC_SINGLE) in cdrom_read_cdda_bpc()
2178 ret = cdi->ops->read_cdda_bpc(cdi, ubuf, lba, nr, in cdrom_read_cdda_bpc()
2179 &cdi->last_sense); in cdrom_read_cdda_bpc()
2191 static int cdrom_read_cdda(struct cdrom_device_info *cdi, __u8 __user *ubuf, in cdrom_read_cdda() argument
2196 if (cdi->cdda_method == CDDA_OLD) in cdrom_read_cdda()
2197 return cdrom_read_cdda_old(cdi, ubuf, lba, nframes); in cdrom_read_cdda()
2203 ret = cdrom_read_cdda_bpc(cdi, ubuf, lba, nframes); in cdrom_read_cdda()
2211 if (cdi->cdda_method == CDDA_BPC_FULL && nframes > 1) { in cdrom_read_cdda()
2213 cdi->cdda_method = CDDA_BPC_SINGLE; in cdrom_read_cdda()
2222 if (cdi->last_sense != 0x04 && cdi->last_sense != 0x0b) in cdrom_read_cdda()
2225 pr_info("dropping to old style cdda (sense=%x)\n", cdi->last_sense); in cdrom_read_cdda()
2226 cdi->cdda_method = CDDA_OLD; in cdrom_read_cdda()
2227 return cdrom_read_cdda_old(cdi, ubuf, lba, nframes); in cdrom_read_cdda()
2230 int cdrom_multisession(struct cdrom_device_info *cdi, in cdrom_multisession() argument
2236 if (!(cdi->ops->capability & CDC_MULTI_SESSION)) in cdrom_multisession()
2244 ret = cdi->ops->get_last_session(cdi, info); in cdrom_multisession()
2252 static int cdrom_ioctl_multisession(struct cdrom_device_info *cdi, in cdrom_ioctl_multisession() argument
2262 ret = cdrom_multisession(cdi, &info); in cdrom_ioctl_multisession()
2272 static int cdrom_ioctl_eject(struct cdrom_device_info *cdi) in cdrom_ioctl_eject() argument
2278 if (cdi->use_count != 1 || cdi->keeplocked) in cdrom_ioctl_eject()
2281 int ret = cdi->ops->lock_door(cdi, 0); in cdrom_ioctl_eject()
2286 return cdi->ops->tray_move(cdi, 1); in cdrom_ioctl_eject()
2289 static int cdrom_ioctl_closetray(struct cdrom_device_info *cdi) in cdrom_ioctl_closetray() argument
2295 return cdi->ops->tray_move(cdi, 0); in cdrom_ioctl_closetray()
2298 static int cdrom_ioctl_eject_sw(struct cdrom_device_info *cdi, in cdrom_ioctl_eject_sw() argument
2305 if (cdi->keeplocked) in cdrom_ioctl_eject_sw()
2308 cdi->options &= ~(CDO_AUTO_CLOSE | CDO_AUTO_EJECT); in cdrom_ioctl_eject_sw()
2310 cdi->options |= CDO_AUTO_CLOSE | CDO_AUTO_EJECT; in cdrom_ioctl_eject_sw()
2314 static int cdrom_ioctl_media_changed(struct cdrom_device_info *cdi, in cdrom_ioctl_media_changed() argument
2327 return media_changed(cdi, 1); in cdrom_ioctl_media_changed()
2329 if (arg >= cdi->capacity) in cdrom_ioctl_media_changed()
2336 ret = cdrom_read_mech_status(cdi, info); in cdrom_ioctl_media_changed()
2354 static int cdrom_ioctl_timed_media_change(struct cdrom_device_info *cdi, in cdrom_ioctl_timed_media_change() argument
2367 ret = cdrom_ioctl_media_changed(cdi, CDSL_CURRENT); in cdrom_ioctl_timed_media_change()
2375 if (tmp_info.last_media_change - cdi->last_media_change_ms < 0) in cdrom_ioctl_timed_media_change()
2378 tmp_info.last_media_change = cdi->last_media_change_ms; in cdrom_ioctl_timed_media_change()
2386 static int cdrom_ioctl_set_options(struct cdrom_device_info *cdi, in cdrom_ioctl_set_options() argument
2404 return cdi->options; in cdrom_ioctl_set_options()
2410 cdi->options |= (int) arg; in cdrom_ioctl_set_options()
2411 return cdi->options; in cdrom_ioctl_set_options()
2414 static int cdrom_ioctl_clear_options(struct cdrom_device_info *cdi, in cdrom_ioctl_clear_options() argument
2419 cdi->options &= ~(int) arg; in cdrom_ioctl_clear_options()
2420 return cdi->options; in cdrom_ioctl_clear_options()
2423 static int cdrom_ioctl_select_speed(struct cdrom_device_info *cdi, in cdrom_ioctl_select_speed() argument
2430 return cdi->ops->select_speed(cdi, arg); in cdrom_ioctl_select_speed()
2433 static int cdrom_ioctl_select_disc(struct cdrom_device_info *cdi, in cdrom_ioctl_select_disc() argument
2442 if (arg >= cdi->capacity) in cdrom_ioctl_select_disc()
2447 return cdrom_select_disc(cdi, arg); in cdrom_ioctl_select_disc()
2450 static int cdrom_ioctl_reset(struct cdrom_device_info *cdi, in cdrom_ioctl_reset() argument
2460 return cdi->ops->reset(cdi); in cdrom_ioctl_reset()
2463 static int cdrom_ioctl_lock_door(struct cdrom_device_info *cdi, in cdrom_ioctl_lock_door() argument
2471 cdi->keeplocked = arg ? 1 : 0; in cdrom_ioctl_lock_door()
2477 if (cdi->use_count != 1 && !arg && !capable(CAP_SYS_ADMIN)) in cdrom_ioctl_lock_door()
2479 return cdi->ops->lock_door(cdi, arg); in cdrom_ioctl_lock_door()
2482 static int cdrom_ioctl_debug(struct cdrom_device_info *cdi, in cdrom_ioctl_debug() argument
2493 static int cdrom_ioctl_get_capability(struct cdrom_device_info *cdi) in cdrom_ioctl_get_capability() argument
2496 return (cdi->ops->capability & ~cdi->mask); in cdrom_ioctl_get_capability()
2505 static int cdrom_ioctl_get_mcn(struct cdrom_device_info *cdi, in cdrom_ioctl_get_mcn() argument
2513 if (!(cdi->ops->capability & CDC_MCN)) in cdrom_ioctl_get_mcn()
2515 ret = cdi->ops->get_mcn(cdi, &mcn); in cdrom_ioctl_get_mcn()
2525 static int cdrom_ioctl_drive_status(struct cdrom_device_info *cdi, in cdrom_ioctl_drive_status() argument
2530 if (!(cdi->ops->capability & CDC_DRIVE_STATUS)) in cdrom_ioctl_drive_status()
2534 return cdi->ops->drive_status(cdi, CDSL_CURRENT); in cdrom_ioctl_drive_status()
2535 if (arg >= cdi->capacity) in cdrom_ioctl_drive_status()
2537 return cdrom_slot_status(cdi, arg); in cdrom_ioctl_drive_status()
2557 static int cdrom_ioctl_disc_status(struct cdrom_device_info *cdi) in cdrom_ioctl_disc_status() argument
2563 cdrom_count_tracks(cdi, &tracks); in cdrom_ioctl_disc_status()
2569 if (!tracks.data && !tracks.cdi && !tracks.xa) in cdrom_ioctl_disc_status()
2575 if (tracks.cdi > 0) in cdrom_ioctl_disc_status()
2587 static int cdrom_ioctl_changer_nslots(struct cdrom_device_info *cdi) in cdrom_ioctl_changer_nslots() argument
2590 return cdi->capacity; in cdrom_ioctl_changer_nslots()
2593 static int cdrom_ioctl_get_subchnl(struct cdrom_device_info *cdi, in cdrom_ioctl_get_subchnl() argument
2610 ret = cdi->ops->audio_ioctl(cdi, CDROMSUBCHNL, &q); in cdrom_ioctl_get_subchnl()
2624 static int cdrom_ioctl_read_tochdr(struct cdrom_device_info *cdi, in cdrom_ioctl_read_tochdr() argument
2635 ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header); in cdrom_ioctl_read_tochdr()
2645 int cdrom_read_tocentry(struct cdrom_device_info *cdi, in cdrom_read_tocentry() argument
2656 ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, entry); in cdrom_read_tocentry()
2664 static int cdrom_ioctl_read_tocentry(struct cdrom_device_info *cdi, in cdrom_ioctl_read_tocentry() argument
2672 ret = cdrom_read_tocentry(cdi, &entry); in cdrom_ioctl_read_tocentry()
2678 static int cdrom_ioctl_play_msf(struct cdrom_device_info *cdi, in cdrom_ioctl_play_msf() argument
2689 return cdi->ops->audio_ioctl(cdi, CDROMPLAYMSF, &msf); in cdrom_ioctl_play_msf()
2692 static int cdrom_ioctl_play_trkind(struct cdrom_device_info *cdi, in cdrom_ioctl_play_trkind() argument
2705 ret = check_for_audio_disc(cdi, cdi->ops); in cdrom_ioctl_play_trkind()
2708 return cdi->ops->audio_ioctl(cdi, CDROMPLAYTRKIND, &ti); in cdrom_ioctl_play_trkind()
2710 static int cdrom_ioctl_volctrl(struct cdrom_device_info *cdi, in cdrom_ioctl_volctrl() argument
2721 return cdi->ops->audio_ioctl(cdi, CDROMVOLCTRL, &volume); in cdrom_ioctl_volctrl()
2724 static int cdrom_ioctl_volread(struct cdrom_device_info *cdi, in cdrom_ioctl_volread() argument
2735 ret = cdi->ops->audio_ioctl(cdi, CDROMVOLREAD, &volume); in cdrom_ioctl_volread()
2744 static int cdrom_ioctl_audioctl(struct cdrom_device_info *cdi, in cdrom_ioctl_audioctl() argument
2753 ret = check_for_audio_disc(cdi, cdi->ops); in cdrom_ioctl_audioctl()
2756 return cdi->ops->audio_ioctl(cdi, cmd, NULL); in cdrom_ioctl_audioctl()
2763 static int cdrom_switch_blocksize(struct cdrom_device_info *cdi, int size) in cdrom_switch_blocksize() argument
2765 const struct cdrom_device_ops *cdo = cdi->ops; in cdrom_switch_blocksize()
2785 return cdo->generic_packet(cdi, &cgc); in cdrom_switch_blocksize()
2788 static int cdrom_get_track_info(struct cdrom_device_info *cdi, in cdrom_get_track_info() argument
2791 const struct cdrom_device_ops *cdo = cdi->ops; in cdrom_get_track_info()
2803 ret = cdo->generic_packet(cdi, &cgc); in cdrom_get_track_info()
2814 ret = cdo->generic_packet(cdi, &cgc); in cdrom_get_track_info()
2824 int cdrom_get_last_written(struct cdrom_device_info *cdi, long *last_written) in cdrom_get_last_written() argument
2835 ret = cdrom_get_disc_info(cdi, &di); in cdrom_get_last_written()
2842 ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti); in cdrom_get_last_written()
2851 ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti); in cdrom_get_last_written()
2881 if ((ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &toc))) in cdrom_get_last_written()
2890 static int cdrom_get_next_writable(struct cdrom_device_info *cdi, in cdrom_get_next_writable() argument
2901 ret = cdrom_get_disc_info(cdi, &di); in cdrom_get_next_writable()
2908 ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti); in cdrom_get_next_writable()
2917 ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti); in cdrom_get_next_writable()
2930 ret = cdrom_get_last_written(cdi, next_writable); in cdrom_get_next_writable()
2940 static noinline int mmc_ioctl_cdrom_read_data(struct cdrom_device_info *cdi, in mmc_ioctl_cdrom_read_data() argument
2976 ret = cdrom_read_block(cdi, cgc, lba, 1, format, blocksize); in mmc_ioctl_cdrom_read_data()
2985 ret = cdrom_switch_blocksize(cdi, blocksize); in mmc_ioctl_cdrom_read_data()
2990 ret = cdrom_read_cd(cdi, cgc, lba, blocksize, 1); in mmc_ioctl_cdrom_read_data()
2992 ret |= cdrom_switch_blocksize(cdi, CD_FRAMESIZE); in mmc_ioctl_cdrom_read_data()
3001 static noinline int mmc_ioctl_cdrom_read_audio(struct cdrom_device_info *cdi, in mmc_ioctl_cdrom_read_audio() argument
3046 return cdrom_read_cdda(cdi, ra.buf, lba, ra.nframes); in mmc_ioctl_cdrom_read_audio()
3049 static noinline int mmc_ioctl_cdrom_subchannel(struct cdrom_device_info *cdi, in mmc_ioctl_cdrom_subchannel() argument
3062 ret = cdrom_read_subchannel(cdi, &q, 0); in mmc_ioctl_cdrom_subchannel()
3074 static noinline int mmc_ioctl_cdrom_play_msf(struct cdrom_device_info *cdi, in mmc_ioctl_cdrom_play_msf() argument
3078 const struct cdrom_device_ops *cdo = cdi->ops; in mmc_ioctl_cdrom_play_msf()
3091 return cdo->generic_packet(cdi, cgc); in mmc_ioctl_cdrom_play_msf()
3094 static noinline int mmc_ioctl_cdrom_play_blk(struct cdrom_device_info *cdi, in mmc_ioctl_cdrom_play_blk() argument
3098 const struct cdrom_device_ops *cdo = cdi->ops; in mmc_ioctl_cdrom_play_blk()
3111 return cdo->generic_packet(cdi, cgc); in mmc_ioctl_cdrom_play_blk()
3114 static noinline int mmc_ioctl_cdrom_volume(struct cdrom_device_info *cdi, in mmc_ioctl_cdrom_volume() argument
3133 ret = cdrom_mode_sense(cdi, cgc, GPMODE_AUDIO_CTL_PAGE, 0); in mmc_ioctl_cdrom_volume()
3148 ret = cdrom_mode_sense(cdi, cgc, in mmc_ioctl_cdrom_volume()
3174 ret = cdrom_mode_sense(cdi, cgc, GPMODE_AUDIO_CTL_PAGE, 1); in mmc_ioctl_cdrom_volume()
3186 return cdrom_mode_select(cdi, cgc); in mmc_ioctl_cdrom_volume()
3189 static noinline int mmc_ioctl_cdrom_start_stop(struct cdrom_device_info *cdi, in mmc_ioctl_cdrom_start_stop() argument
3193 const struct cdrom_device_ops *cdo = cdi->ops; in mmc_ioctl_cdrom_start_stop()
3199 return cdo->generic_packet(cdi, cgc); in mmc_ioctl_cdrom_start_stop()
3202 static noinline int mmc_ioctl_cdrom_pause_resume(struct cdrom_device_info *cdi, in mmc_ioctl_cdrom_pause_resume() argument
3206 const struct cdrom_device_ops *cdo = cdi->ops; in mmc_ioctl_cdrom_pause_resume()
3211 return cdo->generic_packet(cdi, cgc); in mmc_ioctl_cdrom_pause_resume()
3214 static noinline int mmc_ioctl_dvd_read_struct(struct cdrom_device_info *cdi, in mmc_ioctl_dvd_read_struct() argument
3231 ret = dvd_read_struct(cdi, s, cgc); in mmc_ioctl_dvd_read_struct()
3242 static noinline int mmc_ioctl_dvd_auth(struct cdrom_device_info *cdi, in mmc_ioctl_dvd_auth() argument
3252 ret = dvd_do_auth(cdi, &ai); in mmc_ioctl_dvd_auth()
3260 static noinline int mmc_ioctl_cdrom_next_writable(struct cdrom_device_info *cdi, in mmc_ioctl_cdrom_next_writable() argument
3266 ret = cdrom_get_next_writable(cdi, &next); in mmc_ioctl_cdrom_next_writable()
3274 static noinline int mmc_ioctl_cdrom_last_written(struct cdrom_device_info *cdi, in mmc_ioctl_cdrom_last_written() argument
3280 ret = cdrom_get_last_written(cdi, &last); in mmc_ioctl_cdrom_last_written()
3289 static int mmc_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, in mmc_ioctl() argument
3303 return mmc_ioctl_cdrom_read_data(cdi, userptr, &cgc, cmd); in mmc_ioctl()
3305 return mmc_ioctl_cdrom_read_audio(cdi, userptr); in mmc_ioctl()
3307 return mmc_ioctl_cdrom_subchannel(cdi, userptr); in mmc_ioctl()
3309 return mmc_ioctl_cdrom_play_msf(cdi, userptr, &cgc); in mmc_ioctl()
3311 return mmc_ioctl_cdrom_play_blk(cdi, userptr, &cgc); in mmc_ioctl()
3314 return mmc_ioctl_cdrom_volume(cdi, userptr, &cgc, cmd); in mmc_ioctl()
3317 return mmc_ioctl_cdrom_start_stop(cdi, &cgc, cmd); in mmc_ioctl()
3320 return mmc_ioctl_cdrom_pause_resume(cdi, &cgc, cmd); in mmc_ioctl()
3322 return mmc_ioctl_dvd_read_struct(cdi, userptr, &cgc); in mmc_ioctl()
3324 return mmc_ioctl_dvd_auth(cdi, userptr); in mmc_ioctl()
3326 return mmc_ioctl_cdrom_next_writable(cdi, userptr); in mmc_ioctl()
3328 return mmc_ioctl_cdrom_last_written(cdi, userptr); in mmc_ioctl()
3339 int cdrom_ioctl(struct cdrom_device_info *cdi, struct block_device *bdev, in cdrom_ioctl() argument
3347 return cdrom_ioctl_multisession(cdi, argp); in cdrom_ioctl()
3349 return cdrom_ioctl_eject(cdi); in cdrom_ioctl()
3351 return cdrom_ioctl_closetray(cdi); in cdrom_ioctl()
3353 return cdrom_ioctl_eject_sw(cdi, arg); in cdrom_ioctl()
3355 return cdrom_ioctl_media_changed(cdi, arg); in cdrom_ioctl()
3357 return cdrom_ioctl_timed_media_change(cdi, arg); in cdrom_ioctl()
3359 return cdrom_ioctl_set_options(cdi, arg); in cdrom_ioctl()
3361 return cdrom_ioctl_clear_options(cdi, arg); in cdrom_ioctl()
3363 return cdrom_ioctl_select_speed(cdi, arg); in cdrom_ioctl()
3365 return cdrom_ioctl_select_disc(cdi, arg); in cdrom_ioctl()
3367 return cdrom_ioctl_reset(cdi, bdev); in cdrom_ioctl()
3369 return cdrom_ioctl_lock_door(cdi, arg); in cdrom_ioctl()
3371 return cdrom_ioctl_debug(cdi, arg); in cdrom_ioctl()
3373 return cdrom_ioctl_get_capability(cdi); in cdrom_ioctl()
3375 return cdrom_ioctl_get_mcn(cdi, argp); in cdrom_ioctl()
3377 return cdrom_ioctl_drive_status(cdi, arg); in cdrom_ioctl()
3379 return cdrom_ioctl_disc_status(cdi); in cdrom_ioctl()
3381 return cdrom_ioctl_changer_nslots(cdi); in cdrom_ioctl()
3391 ret = mmc_ioctl(cdi, cmd, arg); in cdrom_ioctl()
3403 return cdrom_ioctl_get_subchnl(cdi, argp); in cdrom_ioctl()
3405 return cdrom_ioctl_read_tochdr(cdi, argp); in cdrom_ioctl()
3407 return cdrom_ioctl_read_tocentry(cdi, argp); in cdrom_ioctl()
3409 return cdrom_ioctl_play_msf(cdi, argp); in cdrom_ioctl()
3411 return cdrom_ioctl_play_trkind(cdi, argp); in cdrom_ioctl()
3413 return cdrom_ioctl_volctrl(cdi, argp); in cdrom_ioctl()
3415 return cdrom_ioctl_volread(cdi, argp); in cdrom_ioctl()
3420 return cdrom_ioctl_audioctl(cdi, cmd); in cdrom_ioctl()
3451 struct cdrom_device_info *cdi; in cdrom_print_info() local
3460 list_for_each_entry(cdi, &cdrom_list, list) { in cdrom_print_info()
3464 "\t%s", cdi->name); in cdrom_print_info()
3468 "\t%d", cdi->speed); in cdrom_print_info()
3472 "\t%d", cdi->capacity); in cdrom_print_info()
3579 struct cdrom_device_info *cdi; in cdrom_update_settings() local
3582 list_for_each_entry(cdi, &cdrom_list, list) { in cdrom_update_settings()
3584 cdi->options |= CDO_AUTO_CLOSE; in cdrom_update_settings()
3586 cdi->options &= ~CDO_AUTO_CLOSE; in cdrom_update_settings()
3588 cdi->options |= CDO_AUTO_EJECT; in cdrom_update_settings()
3590 cdi->options &= ~CDO_AUTO_EJECT; in cdrom_update_settings()
3592 cdi->options |= CDO_LOCK; in cdrom_update_settings()
3594 cdi->options &= ~CDO_LOCK; in cdrom_update_settings()
3596 cdi->options |= CDO_CHECK_TYPE; in cdrom_update_settings()
3598 cdi->options &= ~CDO_CHECK_TYPE; in cdrom_update_settings()