LCOV - code coverage report
Current view: top level - include/linux - cdrom.h (source / functions) Hit Total Coverage
Test: landlock.info Lines: 0 2 0.0 %
Date: 2021-04-22 12:43:58 Functions: 0 0 -

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

Generated by: LCOV version 1.14