xref: /OK3568_Linux_fs/kernel/drivers/scsi/sr.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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