1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * sr.h by David Giller 4*4882a593Smuzhiyun * CD-ROM disk driver header file 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * adapted from: 7*4882a593Smuzhiyun * sd.h Copyright (C) 1992 Drew Eckhardt 8*4882a593Smuzhiyun * SCSI disk driver header file by 9*4882a593Smuzhiyun * Drew Eckhardt 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * <drew@colorado.edu> 12*4882a593Smuzhiyun * 13*4882a593Smuzhiyun * Modified by Eric Youngdale eric@andante.org to 14*4882a593Smuzhiyun * add scatter-gather, multiple outstanding request, and other 15*4882a593Smuzhiyun * enhancements. 16*4882a593Smuzhiyun */ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #ifndef _SR_H 19*4882a593Smuzhiyun #define _SR_H 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #include <linux/genhd.h> 22*4882a593Smuzhiyun #include <linux/kref.h> 23*4882a593Smuzhiyun #include <linux/mutex.h> 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #define MAX_RETRIES 3 26*4882a593Smuzhiyun #define SR_TIMEOUT (30 * HZ) 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun struct scsi_device; 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* The CDROM is fairly slow, so we need a little extra time */ 31*4882a593Smuzhiyun /* In fact, it is very slow if it has to spin up first */ 32*4882a593Smuzhiyun #define IOCTL_TIMEOUT 30*HZ 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun typedef struct scsi_cd { 36*4882a593Smuzhiyun struct scsi_driver *driver; 37*4882a593Smuzhiyun unsigned capacity; /* size in blocks */ 38*4882a593Smuzhiyun struct scsi_device *device; 39*4882a593Smuzhiyun unsigned int vendor; /* vendor code, see sr_vendor.c */ 40*4882a593Smuzhiyun unsigned long ms_offset; /* for reading multisession-CD's */ 41*4882a593Smuzhiyun unsigned writeable : 1; 42*4882a593Smuzhiyun unsigned use:1; /* is this device still supportable */ 43*4882a593Smuzhiyun unsigned xa_flag:1; /* CD has XA sectors ? */ 44*4882a593Smuzhiyun unsigned readcd_known:1; /* drive supports READ_CD (0xbe) */ 45*4882a593Smuzhiyun unsigned readcd_cdda:1; /* reading audio data using READ_CD */ 46*4882a593Smuzhiyun unsigned media_present:1; /* media is present */ 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun /* GET_EVENT spurious event handling, blk layer guarantees exclusion */ 49*4882a593Smuzhiyun int tur_mismatch; /* nr of get_event TUR mismatches */ 50*4882a593Smuzhiyun bool tur_changed:1; /* changed according to TUR */ 51*4882a593Smuzhiyun bool get_event_changed:1; /* changed according to GET_EVENT */ 52*4882a593Smuzhiyun bool ignore_get_event:1; /* GET_EVENT is unreliable, use TUR */ 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun struct cdrom_device_info cdi; 55*4882a593Smuzhiyun struct mutex lock; 56*4882a593Smuzhiyun /* We hold gendisk and scsi_device references on probe and use 57*4882a593Smuzhiyun * the refs on this kref to decide when to release them */ 58*4882a593Smuzhiyun struct kref kref; 59*4882a593Smuzhiyun struct gendisk *disk; 60*4882a593Smuzhiyun } Scsi_CD; 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #define sr_printk(prefix, cd, fmt, a...) \ 63*4882a593Smuzhiyun sdev_prefix_printk(prefix, (cd)->device, (cd)->cdi.name, fmt, ##a) 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun int sr_do_ioctl(Scsi_CD *, struct packet_command *); 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun int sr_lock_door(struct cdrom_device_info *, int); 68*4882a593Smuzhiyun int sr_tray_move(struct cdrom_device_info *, int); 69*4882a593Smuzhiyun int sr_drive_status(struct cdrom_device_info *, int); 70*4882a593Smuzhiyun int sr_disk_status(struct cdrom_device_info *); 71*4882a593Smuzhiyun int sr_get_last_session(struct cdrom_device_info *, struct cdrom_multisession *); 72*4882a593Smuzhiyun int sr_get_mcn(struct cdrom_device_info *, struct cdrom_mcn *); 73*4882a593Smuzhiyun int sr_reset(struct cdrom_device_info *); 74*4882a593Smuzhiyun int sr_select_speed(struct cdrom_device_info *cdi, int speed); 75*4882a593Smuzhiyun int sr_audio_ioctl(struct cdrom_device_info *, unsigned int, void *); 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun int sr_is_xa(Scsi_CD *); 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun /* sr_vendor.c */ 80*4882a593Smuzhiyun void sr_vendor_init(Scsi_CD *); 81*4882a593Smuzhiyun int sr_cd_check(struct cdrom_device_info *); 82*4882a593Smuzhiyun int sr_set_blocklength(Scsi_CD *, int blocklength); 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun #endif 85