323 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * -- <linux/cdrom.h>4 * General header file for linux CD-ROM drivers 5 * Copyright (C) 1992 David Giller, rafetmad@oxy.edu6 * 1994, 1995 Eberhard Mönkeberg, emoenke@gwdg.de7 * 1996 David van Leeuwen, david@tm.tno.nl8 * 1997, 1998 Erik Andersen, andersee@debian.org9 * 1998-2002 Jens Axboe, axboe@suse.de10 */11#ifndef _LINUX_CDROM_H12#define _LINUX_CDROM_H13 14#include <linux/fs.h> /* not really needed, later.. */15#include <linux/list.h>16#include <linux/blkdev.h>17#include <scsi/scsi_common.h>18#include <uapi/linux/cdrom.h>19 20struct packet_command21{22 unsigned char cmd[CDROM_PACKET_SIZE];23 unsigned char *buffer;24 unsigned int buflen;25 int stat;26 struct scsi_sense_hdr *sshdr;27 unsigned char data_direction;28 int quiet;29 int timeout;30 void *reserved[1];31};32 33/*34 * _OLD will use PIO transfer on atapi devices, _BPC_* will use DMA35 */36#define CDDA_OLD 0 /* old style */37#define CDDA_BPC_SINGLE 1 /* single frame block pc */38#define CDDA_BPC_FULL 2 /* multi frame block pc */39 40/* Uniform cdrom data structures for cdrom.c */41struct cdrom_device_info {42 const struct cdrom_device_ops *ops; /* link to device_ops */43 struct list_head list; /* linked list of all device_info */44 struct gendisk *disk; /* matching block layer disk */45 void *handle; /* driver-dependent data */46/* specifications */47 int mask; /* mask of capability: disables them */48 int speed; /* maximum speed for reading data */49 int capacity; /* number of discs in jukebox */50/* device-related storage */51 unsigned int options : 30; /* options flags */52 unsigned mc_flags : 2; /* media change buffer flags */53 unsigned int vfs_events; /* cached events for vfs path */54 unsigned int ioctl_events; /* cached events for ioctl path */55 int use_count; /* number of times device opened */56 char name[20]; /* name of the device type */57/* per-device flags */58 __u8 sanyo_slot : 2; /* Sanyo 3 CD changer support */59 __u8 keeplocked : 1; /* CDROM_LOCKDOOR status */60 __u8 reserved : 5; /* not used yet */61 int cdda_method; /* see flags */62 __u8 last_sense;63 __u8 media_written; /* dirty flag, DVD+RW bookkeeping */64 unsigned short mmc3_profile; /* current MMC3 profile */65 int (*exit)(struct cdrom_device_info *);66 int mrw_mode_page;67 bool opened_for_data;68 __s64 last_media_change_ms;69};70 71struct cdrom_device_ops {72/* routines */73 int (*open) (struct cdrom_device_info *, int);74 void (*release) (struct cdrom_device_info *);75 int (*drive_status) (struct cdrom_device_info *, int);76 unsigned int (*check_events) (struct cdrom_device_info *cdi,77 unsigned int clearing, int slot);78 int (*tray_move) (struct cdrom_device_info *, int);79 int (*lock_door) (struct cdrom_device_info *, int);80 int (*select_speed) (struct cdrom_device_info *, unsigned long);81 int (*get_last_session) (struct cdrom_device_info *,82 struct cdrom_multisession *);83 int (*get_mcn) (struct cdrom_device_info *,84 struct cdrom_mcn *);85 /* hard reset device */86 int (*reset) (struct cdrom_device_info *);87 /* play stuff */88 int (*audio_ioctl) (struct cdrom_device_info *,unsigned int, void *);89 90 /* handle uniform packets for scsi type devices (scsi,atapi) */91 int (*generic_packet) (struct cdrom_device_info *,92 struct packet_command *);93 int (*read_cdda_bpc)(struct cdrom_device_info *cdi, void __user *ubuf,94 u32 lba, u32 nframes, u8 *last_sense);95/* driver specifications */96 const int capability; /* capability flags */97};98 99int cdrom_multisession(struct cdrom_device_info *cdi,100 struct cdrom_multisession *info);101int cdrom_read_tocentry(struct cdrom_device_info *cdi,102 struct cdrom_tocentry *entry);103 104/* the general block_device operations structure: */105int cdrom_open(struct cdrom_device_info *cdi, blk_mode_t mode);106void cdrom_release(struct cdrom_device_info *cdi);107int cdrom_ioctl(struct cdrom_device_info *cdi, struct block_device *bdev,108 unsigned int cmd, unsigned long arg);109extern unsigned int cdrom_check_events(struct cdrom_device_info *cdi,110 unsigned int clearing);111 112extern int register_cdrom(struct gendisk *disk, struct cdrom_device_info *cdi);113extern void unregister_cdrom(struct cdrom_device_info *cdi);114 115typedef struct {116 int data;117 int audio;118 int cdi;119 int xa;120 long error;121} tracktype;122 123extern int cdrom_get_last_written(struct cdrom_device_info *cdi, long *last_written);124extern int cdrom_number_of_slots(struct cdrom_device_info *cdi);125extern int cdrom_mode_select(struct cdrom_device_info *cdi,126 struct packet_command *cgc);127extern int cdrom_mode_sense(struct cdrom_device_info *cdi,128 struct packet_command *cgc,129 int page_code, int page_control);130extern void init_cdrom_command(struct packet_command *cgc,131 void *buffer, int len, int type);132extern int cdrom_dummy_generic_packet(struct cdrom_device_info *cdi,133 struct packet_command *cgc);134 135/* The SCSI spec says there could be 256 slots. */136#define CDROM_MAX_SLOTS 256137 138struct cdrom_mechstat_header {139#if defined(__BIG_ENDIAN_BITFIELD)140 __u8 fault : 1;141 __u8 changer_state : 2;142 __u8 curslot : 5;143 __u8 mech_state : 3;144 __u8 door_open : 1;145 __u8 reserved1 : 4;146#elif defined(__LITTLE_ENDIAN_BITFIELD)147 __u8 curslot : 5;148 __u8 changer_state : 2;149 __u8 fault : 1;150 __u8 reserved1 : 4;151 __u8 door_open : 1;152 __u8 mech_state : 3;153#endif154 __u8 curlba[3];155 __u8 nslots;156 __u16 slot_tablelen;157};158 159struct cdrom_slot {160#if defined(__BIG_ENDIAN_BITFIELD)161 __u8 disc_present : 1;162 __u8 reserved1 : 6;163 __u8 change : 1;164#elif defined(__LITTLE_ENDIAN_BITFIELD)165 __u8 change : 1;166 __u8 reserved1 : 6;167 __u8 disc_present : 1;168#endif169 __u8 reserved2[3];170};171 172struct cdrom_changer_info {173 struct cdrom_mechstat_header hdr;174 struct cdrom_slot slots[CDROM_MAX_SLOTS];175};176 177typedef enum {178 mechtype_caddy = 0,179 mechtype_tray = 1,180 mechtype_popup = 2,181 mechtype_individual_changer = 4,182 mechtype_cartridge_changer = 5183} mechtype_t;184 185typedef struct {186#if defined(__BIG_ENDIAN_BITFIELD)187 __u8 ps : 1;188 __u8 reserved1 : 1;189 __u8 page_code : 6;190 __u8 page_length;191 __u8 reserved2 : 1;192 __u8 bufe : 1;193 __u8 ls_v : 1;194 __u8 test_write : 1;195 __u8 write_type : 4;196 __u8 multi_session : 2; /* or border, DVD */197 __u8 fp : 1;198 __u8 copy : 1;199 __u8 track_mode : 4;200 __u8 reserved3 : 4;201 __u8 data_block_type : 4;202#elif defined(__LITTLE_ENDIAN_BITFIELD)203 __u8 page_code : 6;204 __u8 reserved1 : 1;205 __u8 ps : 1;206 __u8 page_length;207 __u8 write_type : 4;208 __u8 test_write : 1;209 __u8 ls_v : 1;210 __u8 bufe : 1;211 __u8 reserved2 : 1;212 __u8 track_mode : 4;213 __u8 copy : 1;214 __u8 fp : 1;215 __u8 multi_session : 2; /* or border, DVD */216 __u8 data_block_type : 4;217 __u8 reserved3 : 4;218#endif219 __u8 link_size;220 __u8 reserved4;221#if defined(__BIG_ENDIAN_BITFIELD)222 __u8 reserved5 : 2;223 __u8 app_code : 6;224#elif defined(__LITTLE_ENDIAN_BITFIELD)225 __u8 app_code : 6;226 __u8 reserved5 : 2;227#endif228 __u8 session_format;229 __u8 reserved6;230 __be32 packet_size;231 __u16 audio_pause;232 __u8 mcn[16];233 __u8 isrc[16];234 __u8 subhdr0;235 __u8 subhdr1;236 __u8 subhdr2;237 __u8 subhdr3;238} __attribute__((packed)) write_param_page;239 240struct modesel_head241{242 __u8 reserved1;243 __u8 medium;244 __u8 reserved2;245 __u8 block_desc_length;246 __u8 density;247 __u8 number_of_blocks_hi;248 __u8 number_of_blocks_med;249 __u8 number_of_blocks_lo;250 __u8 reserved3;251 __u8 block_length_hi;252 __u8 block_length_med;253 __u8 block_length_lo;254};255 256typedef struct {257 __u16 report_key_length;258 __u8 reserved1;259 __u8 reserved2;260#if defined(__BIG_ENDIAN_BITFIELD)261 __u8 type_code : 2;262 __u8 vra : 3;263 __u8 ucca : 3;264#elif defined(__LITTLE_ENDIAN_BITFIELD)265 __u8 ucca : 3;266 __u8 vra : 3;267 __u8 type_code : 2;268#endif269 __u8 region_mask;270 __u8 rpc_scheme;271 __u8 reserved3;272} rpc_state_t;273 274struct event_header {275 __be16 data_len;276#if defined(__BIG_ENDIAN_BITFIELD)277 __u8 nea : 1;278 __u8 reserved1 : 4;279 __u8 notification_class : 3;280#elif defined(__LITTLE_ENDIAN_BITFIELD)281 __u8 notification_class : 3;282 __u8 reserved1 : 4;283 __u8 nea : 1;284#endif285 __u8 supp_event_class;286};287 288struct media_event_desc {289#if defined(__BIG_ENDIAN_BITFIELD)290 __u8 reserved1 : 4;291 __u8 media_event_code : 4;292 __u8 reserved2 : 6;293 __u8 media_present : 1;294 __u8 door_open : 1;295#elif defined(__LITTLE_ENDIAN_BITFIELD)296 __u8 media_event_code : 4;297 __u8 reserved1 : 4;298 __u8 door_open : 1;299 __u8 media_present : 1;300 __u8 reserved2 : 6;301#endif302 __u8 start_slot;303 __u8 end_slot;304};305 306extern int cdrom_get_media_event(struct cdrom_device_info *cdi, struct media_event_desc *med);307 308static inline void lba_to_msf(int lba, u8 *m, u8 *s, u8 *f)309{310 lba += CD_MSF_OFFSET;311 lba &= 0xffffff; /* negative lbas use only 24 bits */312 *m = lba / (CD_SECS * CD_FRAMES);313 lba %= (CD_SECS * CD_FRAMES);314 *s = lba / CD_FRAMES;315 *f = lba % CD_FRAMES;316}317 318static inline int msf_to_lba(u8 m, u8 s, u8 f)319{320 return (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;321}322#endif /* _LINUX_CDROM_H */323