1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) 1996-98 Erik Andersen 4*4882a593Smuzhiyun * Copyright (C) 1998-2000 Jens Axboe 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun #ifndef _IDE_CD_H 7*4882a593Smuzhiyun #define _IDE_CD_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include <linux/cdrom.h> 10*4882a593Smuzhiyun #include <asm/byteorder.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #define IDECD_DEBUG_LOG 0 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #if IDECD_DEBUG_LOG 15*4882a593Smuzhiyun #define ide_debug_log(lvl, fmt, args...) __ide_debug_log(lvl, fmt, ## args) 16*4882a593Smuzhiyun #else 17*4882a593Smuzhiyun #define ide_debug_log(lvl, fmt, args...) do {} while (0) 18*4882a593Smuzhiyun #endif 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define ATAPI_WAIT_WRITE_BUSY (10 * HZ) 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /************************************************************************/ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #define SECTORS_PER_FRAME (CD_FRAMESIZE >> SECTOR_SHIFT) 25*4882a593Smuzhiyun #define SECTOR_BUFFER_SIZE (CD_FRAMESIZE * 32) 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /* Capabilities Page size including 8 bytes of Mode Page Header */ 28*4882a593Smuzhiyun #define ATAPI_CAPABILITIES_PAGE_SIZE (8 + 20) 29*4882a593Smuzhiyun #define ATAPI_CAPABILITIES_PAGE_PAD_SIZE 4 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun /* Structure of a MSF cdrom address. */ 32*4882a593Smuzhiyun struct atapi_msf { 33*4882a593Smuzhiyun u8 reserved; 34*4882a593Smuzhiyun u8 minute; 35*4882a593Smuzhiyun u8 second; 36*4882a593Smuzhiyun u8 frame; 37*4882a593Smuzhiyun }; 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /* Space to hold the disk TOC. */ 40*4882a593Smuzhiyun #define MAX_TRACKS 99 41*4882a593Smuzhiyun struct atapi_toc_header { 42*4882a593Smuzhiyun unsigned short toc_length; 43*4882a593Smuzhiyun u8 first_track; 44*4882a593Smuzhiyun u8 last_track; 45*4882a593Smuzhiyun }; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun struct atapi_toc_entry { 48*4882a593Smuzhiyun u8 reserved1; 49*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 50*4882a593Smuzhiyun u8 adr : 4; 51*4882a593Smuzhiyun u8 control : 4; 52*4882a593Smuzhiyun #elif defined(__LITTLE_ENDIAN_BITFIELD) 53*4882a593Smuzhiyun u8 control : 4; 54*4882a593Smuzhiyun u8 adr : 4; 55*4882a593Smuzhiyun #else 56*4882a593Smuzhiyun #error "Please fix <asm/byteorder.h>" 57*4882a593Smuzhiyun #endif 58*4882a593Smuzhiyun u8 track; 59*4882a593Smuzhiyun u8 reserved2; 60*4882a593Smuzhiyun union { 61*4882a593Smuzhiyun unsigned lba; 62*4882a593Smuzhiyun struct atapi_msf msf; 63*4882a593Smuzhiyun } addr; 64*4882a593Smuzhiyun }; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun struct atapi_toc { 67*4882a593Smuzhiyun int last_session_lba; 68*4882a593Smuzhiyun int xa_flag; 69*4882a593Smuzhiyun unsigned long capacity; 70*4882a593Smuzhiyun struct atapi_toc_header hdr; 71*4882a593Smuzhiyun struct atapi_toc_entry ent[MAX_TRACKS+1]; 72*4882a593Smuzhiyun /* One extra for the leadout. */ 73*4882a593Smuzhiyun }; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun /* Extra per-device info for cdrom drives. */ 76*4882a593Smuzhiyun struct cdrom_info { 77*4882a593Smuzhiyun ide_drive_t *drive; 78*4882a593Smuzhiyun struct ide_driver *driver; 79*4882a593Smuzhiyun struct gendisk *disk; 80*4882a593Smuzhiyun struct device dev; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun /* Buffer for table of contents. NULL if we haven't allocated 83*4882a593Smuzhiyun a TOC buffer for this device yet. */ 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun struct atapi_toc *toc; 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun u8 max_speed; /* Max speed of the drive. */ 88*4882a593Smuzhiyun u8 current_speed; /* Current speed of the drive. */ 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun /* Per-device info needed by cdrom.c generic driver. */ 91*4882a593Smuzhiyun struct cdrom_device_info devinfo; 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun unsigned long write_timeout; 94*4882a593Smuzhiyun }; 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun /* ide-cd_verbose.c */ 97*4882a593Smuzhiyun void ide_cd_log_error(const char *, struct request *, struct request_sense *); 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun /* ide-cd.c functions used by ide-cd_ioctl.c */ 100*4882a593Smuzhiyun int ide_cd_queue_pc(ide_drive_t *, const unsigned char *, int, void *, 101*4882a593Smuzhiyun unsigned *, struct scsi_sense_hdr *, int, req_flags_t); 102*4882a593Smuzhiyun int ide_cd_read_toc(ide_drive_t *); 103*4882a593Smuzhiyun int ide_cdrom_get_capabilities(ide_drive_t *, u8 *); 104*4882a593Smuzhiyun void ide_cdrom_update_speed(ide_drive_t *, u8 *); 105*4882a593Smuzhiyun int cdrom_check_status(ide_drive_t *, struct scsi_sense_hdr *); 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun /* ide-cd_ioctl.c */ 108*4882a593Smuzhiyun int ide_cdrom_open_real(struct cdrom_device_info *, int); 109*4882a593Smuzhiyun void ide_cdrom_release_real(struct cdrom_device_info *); 110*4882a593Smuzhiyun int ide_cdrom_drive_status(struct cdrom_device_info *, int); 111*4882a593Smuzhiyun unsigned int ide_cdrom_check_events_real(struct cdrom_device_info *, 112*4882a593Smuzhiyun unsigned int clearing, int slot_nr); 113*4882a593Smuzhiyun int ide_cdrom_tray_move(struct cdrom_device_info *, int); 114*4882a593Smuzhiyun int ide_cdrom_lock_door(struct cdrom_device_info *, int); 115*4882a593Smuzhiyun int ide_cdrom_select_speed(struct cdrom_device_info *, int); 116*4882a593Smuzhiyun int ide_cdrom_get_last_session(struct cdrom_device_info *, 117*4882a593Smuzhiyun struct cdrom_multisession *); 118*4882a593Smuzhiyun int ide_cdrom_get_mcn(struct cdrom_device_info *, struct cdrom_mcn *); 119*4882a593Smuzhiyun int ide_cdrom_reset(struct cdrom_device_info *cdi); 120*4882a593Smuzhiyun int ide_cdrom_audio_ioctl(struct cdrom_device_info *, unsigned int, void *); 121*4882a593Smuzhiyun int ide_cdrom_packet(struct cdrom_device_info *, struct packet_command *); 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun #endif /* _IDE_CD_H */ 124