📄 sbpcd.c
字号:
#define SBPCD_INIT(a) sbpcd2_init(a)
#endif
#if !(SBPCD_ISSUE-3)
#define DO_SBPCD_REQUEST(a) do_sbpcd3_request(a)
#define SBPCD_INIT(a) sbpcd3_init(a)
#endif
#if !(SBPCD_ISSUE-4)
#define DO_SBPCD_REQUEST(a) do_sbpcd4_request(a)
#define SBPCD_INIT(a) sbpcd4_init(a)
#endif
/*==========================================================================*/
#if SBPCD_DIS_IRQ
#define SBPCD_CLI cli()
#define SBPCD_STI sti()
#else
#define SBPCD_CLI
#define SBPCD_STI
#endif /* SBPCD_DIS_IRQ */
/*==========================================================================*/
/*
* auto-probing address list
* inspired by Adam J. Richter from Yggdrasil
*
* still not good enough - can cause a hang.
* example: a NE 2000 ethernet card at 300 will cause a hang probing 310.
* if that happens, reboot and use the LILO (kernel) command line.
* The possibly conflicting ethernet card addresses get NOT probed
* by default - to minimize the hang possibilities.
*
* The SB Pro addresses get "mirrored" at 0x6xx and some more locations - to
* avoid a type error, the 0x2xx-addresses must get checked before 0x6xx.
*
* send mail to emoenke@gwdg.de if your interface card is not FULLY
* represented here.
*/
#if !(SBPCD_ISSUE-1)
static int sbpcd[] =
{
CDROM_PORT, SBPRO, /* probe with user's setup first */
#if DISTRIBUTION
0x230, 1, /* Soundblaster Pro and 16 (default) */
#if 0
0x300, 0, /* CI-101P (default), WDH-7001C (default),
Galaxy (default), Reveal (one default) */
0x250, 1, /* OmniCD default, Soundblaster Pro and 16 */
0x2C0, 3, /* Teac 16-bit cards */
0x260, 1, /* OmniCD */
0x320, 0, /* Lasermate, CI-101P, WDH-7001C, Galaxy, Reveal (other default),
Longshine LCS-6853 (default) */
0x338, 0, /* Reveal Sound Wave 32 card model #SC600 */
0x340, 0, /* Mozart sound card (default), Lasermate, CI-101P */
0x360, 0, /* Lasermate, CI-101P */
0x270, 1, /* Soundblaster 16 */
0x670, 0, /* "sound card #9" */
0x690, 0, /* "sound card #9" */
0x338, 2, /* SPEA Media FX, Ensonic SoundScape (default) */
0x328, 2, /* SPEA Media FX */
0x348, 2, /* SPEA Media FX */
0x634, 0, /* some newer sound cards */
0x638, 0, /* some newer sound cards */
0x230, 1, /* some newer sound cards */
/* due to incomplete address decoding of the SbPro card, these must be last */
0x630, 0, /* "sound card #9" (default) */
0x650, 0, /* "sound card #9" */
#ifdef MODULE
/*
* some "hazardous" locations (no harm with the loadable version)
* (will stop the bus if a NE2000 ethernet card resides at offset -0x10)
*/
0x330, 0, /* Lasermate, CI-101P, WDH-7001C */
0x350, 0, /* Lasermate, CI-101P */
0x358, 2, /* SPEA Media FX */
0x370, 0, /* Lasermate, CI-101P */
0x290, 1, /* Soundblaster 16 */
0x310, 0, /* Lasermate, CI-101P, WDH-7001C */
#endif /* MODULE */
#endif
#endif /* DISTRIBUTION */
};
#else
static int sbpcd[] = {CDROM_PORT, SBPRO}; /* probe with user's setup only */
#endif
MODULE_PARM(sbpcd, "2i");
MODULE_PARM(max_drives, "i");
#define NUM_PROBE (sizeof(sbpcd) / sizeof(int))
/*==========================================================================*/
/*
* the external references:
*/
#if !(SBPCD_ISSUE-1)
#ifdef CONFIG_SBPCD2
extern int sbpcd2_init(void);
#endif
#ifdef CONFIG_SBPCD3
extern int sbpcd3_init(void);
#endif
#ifdef CONFIG_SBPCD4
extern int sbpcd4_init(void);
#endif
#endif
/*==========================================================================*/
#define INLINE inline
/*==========================================================================*/
/*
* the forward references:
*/
static void sbp_sleep(u_int);
static void mark_timeout_delay(u_long);
static void mark_timeout_data(u_long);
#if 0
static void mark_timeout_audio(u_long);
#endif
static void sbp_read_cmd(struct request *req);
static int sbp_data(struct request *req);
static int cmd_out(void);
static int DiskInfo(void);
static int sbpcd_chk_disk_change(kdev_t);
/*==========================================================================*/
/*
* pattern for printk selection:
*
* (1<<DBG_INF) necessary information
* (1<<DBG_BSZ) BLOCK_SIZE trace
* (1<<DBG_REA) "read" status trace
* (1<<DBG_CHK) "media check" trace
* (1<<DBG_TIM) datarate timer test
* (1<<DBG_INI) initialization trace
* (1<<DBG_TOC) tell TocEntry values
* (1<<DBG_IOC) ioctl trace
* (1<<DBG_STA) "ResponseStatus" trace
* (1<<DBG_ERR) "cc_ReadError" trace
* (1<<DBG_CMD) "cmd_out" trace
* (1<<DBG_WRN) give explanation before auto-probing
* (1<<DBG_MUL) multi session code test
* (1<<DBG_IDX) "drive_id != 0" test code
* (1<<DBG_IOX) some special information
* (1<<DBG_DID) drive ID test
* (1<<DBG_RES) drive reset info
* (1<<DBG_SPI) SpinUp test info
* (1<<DBG_IOS) ioctl trace: "subchannel"
* (1<<DBG_IO2) ioctl trace: general
* (1<<DBG_UPC) show UPC info
* (1<<DBG_XA1) XA mode debugging
* (1<<DBG_LCK) door (un)lock info
* (1<<DBG_SQ1) dump SubQ frame
* (1<<DBG_AUD) "read audio" debugging
* (1<<DBG_SEQ) Sequoia interface configuration trace
* (1<<DBG_LCS) Longshine LCS-7260 debugging trace
* (1<<DBG_CD2) MKE/Funai CD200 debugging trace
* (1<<DBG_TEA) TEAC CD-55A debugging trace
* (1<<DBG_ECS) ECS-AT (Vertos-100) debugging trace
* (1<<DBG_000) unnecessary information
*/
#if DISTRIBUTION
static int sbpcd_debug = (1<<DBG_INF);
#else
static int sbpcd_debug = 0 & ((1<<DBG_INF) |
(1<<DBG_TOC) |
(1<<DBG_MUL) |
(1<<DBG_UPC));
#endif /* DISTRIBUTION */
static int sbpcd_ioaddr = CDROM_PORT; /* default I/O base address */
static int sbpro_type = SBPRO;
static unsigned char f_16bit;
static unsigned char do_16bit;
static int CDo_command, CDo_reset;
static int CDo_sel_i_d, CDo_enable;
static int CDi_info, CDi_status, CDi_data;
static struct cdrom_msf msf;
static struct cdrom_ti ti;
static struct cdrom_tochdr tochdr;
static struct cdrom_tocentry tocentry;
static struct cdrom_subchnl SC;
static struct cdrom_volctrl volctrl;
static struct cdrom_read_audio read_audio;
static unsigned char msgnum;
static char msgbuf[80];
static int max_drives = MAX_DRIVES;
#ifndef MODULE
static unsigned char setup_done;
static const char *str_sb_l = "soundblaster";
static const char *str_sp_l = "spea";
static const char *str_ss_l = "soundscape";
static const char *str_t16_l = "teac16bit";
static const char *str_ss = "SoundScape";
#endif
static const char *str_sb = "SoundBlaster";
static const char *str_lm = "LaserMate";
static const char *str_sp = "SPEA";
static const char *str_t16 = "Teac16bit";
static const char *type;
#if !(SBPCD_ISSUE-1)
static const char *major_name="sbpcd";
#endif
#if !(SBPCD_ISSUE-2)
static const char *major_name="sbpcd2";
#endif
#if !(SBPCD_ISSUE-3)
static const char *major_name="sbpcd3";
#endif
#if !(SBPCD_ISSUE-4)
static const char *major_name="sbpcd4";
#endif
/*==========================================================================*/
#if FUTURE
static DECLARE_WAIT_QUEUE_HEAD(sbp_waitq);
#endif /* FUTURE */
static int teac=SBP_TEAC_SPEED;
static int buffers=SBP_BUFFER_FRAMES;
static u_char family0[]="MATSHITA"; /* MKE CR-521, CR-522, CR-523 */
static u_char family1[]="CR-56"; /* MKE CR-562, CR-563 */
static u_char family2[]="CD200"; /* MKE CD200, Funai CD200F */
static u_char familyL[]="LCS-7260"; /* Longshine LCS-7260 */
static u_char familyT[]="CD-55"; /* TEAC CD-55A */
static u_char familyV[]="ECS-AT"; /* ECS Vertos 100 */
static u_int recursion; /* internal testing only */
static u_int fatal_err; /* internal testing only */
static u_int response_count;
static u_int flags_cmd_out;
static u_char cmd_type;
static u_char drvcmd[10];
static u_char infobuf[20];
static u_char xa_head_buf[CD_XA_HEAD];
static u_char xa_tail_buf[CD_XA_TAIL];
#if OLD_BUSY
static volatile u_char busy_data;
static volatile u_char busy_audio; /* true semaphores would be safer */
#endif /* OLD_BUSY */
static DECLARE_MUTEX(ioctl_read_sem);
static u_long timeout;
static volatile u_char timed_out_delay;
static volatile u_char timed_out_data;
#if 0
static volatile u_char timed_out_audio;
#endif
static u_int datarate= 1000000;
static u_int maxtim16=16000000;
static u_int maxtim04= 4000000;
static u_int maxtim02= 2000000;
static u_int maxtim_8= 30000;
#if LONG_TIMING
static u_int maxtim_data= 9000;
#else
static u_int maxtim_data= 3000;
#endif /* LONG_TIMING */
#if DISTRIBUTION
static int n_retries=6;
#else
static int n_retries=6;
#endif
/*==========================================================================*/
static int ndrives;
static u_char drv_pattern[NR_SBPCD]={speed_auto,speed_auto,speed_auto,speed_auto};
static int sbpcd_blocksizes[NR_SBPCD];
/*==========================================================================*/
/*
* drive space begins here (needed separate for each unit)
*/
static int d; /* DriveStruct index: drive number */
static struct {
char drv_id; /* "jumpered" drive ID or -1 */
char drv_sel; /* drive select lines bits */
char drive_model[9];
u_char firmware_version[4];
char f_eject; /* auto-eject flag: 0 or 1 */
u_char *sbp_buf; /* Pointer to internal data buffer,
space allocated during sbpcd_init() */
u_int sbp_bufsiz; /* size of sbp_buf (# of frames) */
int sbp_first_frame; /* First frame in buffer */
int sbp_last_frame; /* Last frame in buffer */
int sbp_read_frames; /* Number of frames being read to buffer */
int sbp_current; /* Frame being currently read */
u_char mode; /* read_mode: READ_M1, READ_M2, READ_SC, READ_AU */
u_char *aud_buf; /* Pointer to audio data buffer,
space allocated during sbpcd_init() */
u_int sbp_audsiz; /* size of aud_buf (# of raw frames) */
u_int drv_type;
u_char drv_options;
int status_bits;
u_char diskstate_flags;
u_char sense_byte;
u_char CD_changed;
char open_count;
u_char error_byte;
u_char f_multisession;
u_int lba_multi;
int first_session;
int last_session;
int track_of_last_session;
u_char audio_state;
u_int pos_audio_start;
u_int pos_audio_end;
char vol_chan0;
u_char vol_ctrl0;
char vol_chan1;
u_char vol_ctrl1;
#if 000 /* no supported drive has it */
char vol_chan2;
u_char vol_ctrl2;
char vol_chan3;
u_char vol_ctrl3;
#endif /*000 */
u_char volume_control; /* TEAC on/off bits */
u_char SubQ_ctl_adr;
u_char SubQ_trk;
u_char SubQ_pnt_idx;
u_int SubQ_run_tot;
u_int SubQ_run_trk;
u_char SubQ_whatisthis;
u_char UPC_ctl_adr;
u_char UPC_buf[7];
int frame_size;
int CDsize_frm;
u_char xa_byte; /* 0x20: XA capabilities */
u_char n_first_track; /* binary */
u_char n_last_track; /* binary (not bcd), 0x01...0x63 */
u_int size_msf; /* time of whole CD, position of LeadOut track */
u_int size_blk;
u_char TocEnt_nixbyte; /* em */
u_char TocEnt_ctl_adr;
u_char TocEnt_number;
u_char TocEnt_format; /* em */
u_int TocEnt_address;
#if SAFE_MIXED
char has_data;
#endif /* SAFE_MIXED */
u_char ored_ctl_adr; /* to detect if CDROM contains data tracks */
struct {
u_char nixbyte; /* em */
u_char ctl_adr; /* 0x4x: data, 0x0x: audio */
u_char number;
u_char format; /* em */ /* 0x00: lba, 0x01: msf */
u_int address;
} TocBuffer[MAX_TRACKS+1]; /* last entry faked */
int in_SpinUp; /* CR-52x test flag */
int n_bytes; /* TEAC awaited response count */
u_char error_state, b3, b4; /* TEAC command error state */
u_char f_drv_error; /* TEAC command error flag */
u_char speed_byte;
int frmsiz;
u_char f_XA; /* 1: XA */
u_char type_byte; /* 0, 1, 3 */
u_char mode_xb_6;
u_char mode_yb_7;
u_char mode_xb_8;
u_char delay;
struct cdrom_device_info *sbpcd_infop;
} D_S[NR_SBPCD];
/*
* drive space ends here (needed separate for each unit)
*/
/*==========================================================================*/
#if 0
unsigned long cli_sti; /* for saving the processor flags */
#endif
/*==========================================================================*/
static struct timer_list delay_timer = { function: mark_timeout_delay};
static struct timer_list data_timer = { function: mark_timeout_data};
#if 0
static struct timer_list audio_timer = { function: mark_timeout_audio};
#endif
/*==========================================================================*/
/*
* DDI interface
*/
static void msg(int level, const char *fmt, ...)
{
#if DISTRIBUTION
#define MSG_LEVEL KERN_NOTICE
#else
#define MSG_LEVEL KERN_INFO
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -