sbpcd ignoring module options
PATCH 1/1 sbpcd ignoring module options
The old SB Pro CD-ROM driver currently ignores any and all options passed to it while used as a module (rendering it useless as it only autoprobes 1 address...) The driver could probably use a cleanup, as it has sbpcd_setup called for both modular and in kernel (rather than just in kernel only) and it maintains a lot of state in global variables making it hard to maintain. However it is a legacy driver and probably not worth the effort, besides it is 2.4.x now, etc etc.
Anyway this minimal patch fixes that, and also lets you specify max_drives as the 3rd setup int (vs. being compiled in) to get rid of those phantom detections on the really crap interface cards.
Paul.
cdrom/sbpcd.c renamed from cdrom/sbpcd.c~ +21 -8
@@ -322,6 +322,9 @@* CD_AUDIO_COMPLETED state so workman (and other playes) can repeat play. * Andrew J. Kroll <[email protected]> Wed Jul 26 04:24:10 EDT 2000 * +* 4.64 Fix module parameters - were being completely ignored. +* Can also specify max_drives as 3rd setup int to get rid of +* "ghost" drives on crap hardware (aren't they all?) Paul Gortmaker * * TODO * implement "read all subchannel data" (96 bytes per frame)
@@ -473,7 +476,7 @@#else static int sbpcd[] = {CDROM_PORT ,SBPRO };/* probe with user's setup only */ #endif -MODULE_PARM (sbpcd,"2i" ); +MODULE_PARM (sbpcd,"3i" );#define NUM_PROBE (sizeof(sbpcd) / sizeof(int))
@@ -561,7 +564,6 @@static int sbpcd_ioaddr =CDROM_PORT ;/* default I/O base address */ static int sbpro_type =SBPRO ; -static unsigned char setup_done;static unsigned char f_16bit;static unsigned char do_16bit;static int CDo_command, CDo_reset;
@@ -578,15 +580,19 @@static unsigned char msgnum;static char msgbuf[80 ]; -static const char *str_sb ="SoundBlaster" ; +static int max_drives =MAX_DRIVES ; +#ifndef MODULE +static unsigned char setup_done;static const char *str_sb_l ="soundblaster" ; -static const char *str_lm ="LaserMate" ; -static const char *str_sp ="SPEA" ;static const char *str_sp_l ="spea" ; -static const char *str_ss ="SoundScape" ;static const char *str_ss_l ="soundscape" ; -static const char *str_t16 ="Teac16bit" ;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 )
@@ -3739,7 +3745,7 @@msg (DBG_INI ,"check_drives entered.\n" ); ndrives=0 ; -for (j=0 ;j<MAX_DRIVES ;j++) +for (j=0 ;j<max_drives;j++) {D_S [ndrives].drv_id=j;if (sbpro_type==1 )D_S [ndrives].drv_sel=(j&0x01 )<<1 |(j&0x02 )>>1 ;
@@ -5540,6 +5546,7 @@ int sbpcd_setup(char *s)#endif { +#ifndef MODULE int p[4 ]; (void )get_options (s,ARRAY_SIZE (p), p); setup_done++;
@@ -5555,6 +5562,12 @@ else if (!strcmp(s,str_t16)) sbpro_type=3; else if (!strcmp(s,str_t16_l)) sbpro_type=3;if (p[0 ]>0 ) sbpcd_ioaddr=p[1 ]; +if (p[0 ]>2 ) max_drives=p[3 ]; +#else + sbpcd_ioaddr = sbpcd[0 ]; + sbpro_type = sbpcd[1 ]; + max_drives = sbpcd[2 ]; +#endif CDo_command=sbpcd_ioaddr; CDi_info=sbpcd_ioaddr;
_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
Please read the FAQ at http://www.tux.org/lkml/