--- linux/drivers/scsi/wd7000.c Fri Nov 12 00:57:31 1999 +++ 4alan/drivers/scsi/wd7000.c Thu Dec 16 13:14:33 1999 @@ -160,6 +160,7 @@ #include #include #include +#include #include "scsi.h" #include "hosts.h" #include "sd.h" @@ -557,6 +558,10 @@ unchar data[18]; } Icb; +#ifdef MODULE +static char * wd7000 = NULL; +MODULE_PARM(wd7000, "s"); +#endif /* * Driver SCB structure pool. @@ -599,108 +604,102 @@ * will configure the driver for a WD-7000 controller * using IRQ 15 with a DMA channel 6, at IO base address 0x350. */ -void wd7000_setup (char *str, int *ints) +static int __init wd7000_setup(char *str) { - static short wd7000_card_num = 0; - short i, j; - - if (wd7000_card_num >= NUM_CONFIGS) { - printk ("wd7000_setup: Too many \"wd7000=\" configurations in " - "command line!\n"); - return; - } - - if ((ints[0] < 3) || (ints[0] > 5)) - printk ("wd7000_setup: Error in command line! " - "Usage: wd7000=,,IO>[,[,]]\n"); - else { - for (i = 0; i < NUM_IRQS; i++) - if (ints[1] == wd7000_irq[i]) - break; - - if (i == NUM_IRQS) { - setup_error ("invalid IRQ.", ints); - return; - } - else - configs[wd7000_card_num].irq = ints[1]; + static short wd7000_card_num = 0; + short i, j; + int ints[6]; - for (i = 0; i < NUM_DMAS; i++) - if (ints[2] == wd7000_dma[i]) - break; + (void)get_options(str, ARRAY_SIZE(ints), ints); - if (i == NUM_DMAS) { - setup_error ("invalid DMA channel.", ints); - return; - } - else - configs[wd7000_card_num].dma = ints[2]; - - for (i = 0; i < NUM_IOPORTS; i++) - if (ints[3] == wd7000_iobase[i]) - break; - - if (i == NUM_IOPORTS) { - setup_error ("invalid I/O base address.", ints); - return; + if (wd7000_card_num >= NUM_CONFIGS) { + printk("wd7000_setup: Too many \"wd7000=\" configurations in " + "command line!\n"); + return 0; } - else - configs[wd7000_card_num].iobase = ints[3]; - if (ints[0] > 3) { - if ((ints[4] < 500) || (ints[4] > 31875)) { - setup_error ("BUS_ON value is out of range (500 to 31875 nanoseconds)!", - ints); - configs[wd7000_card_num].bus_on = BUS_ON; - } - else - configs[wd7000_card_num].bus_on = ints[4] / 125; - } - else - configs[wd7000_card_num].bus_on = BUS_ON; - - if (ints[0] > 4) { - if ((ints[5] < 500) || (ints[5] > 31875)) { - setup_error ("BUS_OFF value is out of range (500 to 31875 nanoseconds)!", - ints); - configs[wd7000_card_num].bus_off = BUS_OFF; - } - else - configs[wd7000_card_num].bus_off = ints[5] / 125; - } - else - configs[wd7000_card_num].bus_off = BUS_OFF; - - if (wd7000_card_num) { - for (i = 0; i < (wd7000_card_num - 1); i++) - for (j = i + 1; j < wd7000_card_num; j++) - if (configs[i].irq == configs[j].irq) { - setup_error ("duplicated IRQ!", ints); - return; - } - else if (configs[i].dma == configs[j].dma) { - setup_error ("duplicated DMA channel!", ints); - return; - } - else if (configs[i].iobase == configs[j].iobase) { - setup_error ("duplicated I/O base address!", ints); - return; - } - } + if ((ints[0] < 3) || (ints[0] > 5)) { + printk("wd7000_setup: Error in command line! " + "Usage: wd7000=,,IO>[,[,]]\n"); + } else { + for (i = 0; i < NUM_IRQS; i++) + if (ints[1] == wd7000_irq[i]) + break; + + if (i == NUM_IRQS) { + setup_error("invalid IRQ.", ints); + return 0; + } else + configs[wd7000_card_num].irq = ints[1]; + + for (i = 0; i < NUM_DMAS; i++) + if (ints[2] == wd7000_dma[i]) + break; + + if (i == NUM_DMAS) { + setup_error("invalid DMA channel.", ints); + return 0; + } else + configs[wd7000_card_num].dma = ints[2]; + + for (i = 0; i < NUM_IOPORTS; i++) + if (ints[3] == wd7000_iobase[i]) + break; + + if (i == NUM_IOPORTS) { + setup_error("invalid I/O base address.", ints); + return 0; + } else + configs[wd7000_card_num].iobase = ints[3]; + + if (ints[0] > 3) { + if ((ints[4] < 500) || (ints[4] > 31875)) { + setup_error("BUS_ON value is out of range (500 to 31875 nanoseconds)!", ints); + configs[wd7000_card_num].bus_on = BUS_ON; + } else + configs[wd7000_card_num].bus_on = ints[4] / 125; + } else + configs[wd7000_card_num].bus_on = BUS_ON; + + if (ints[0] > 4) { + if ((ints[5] < 500) || (ints[5] > 31875)) { + setup_error("BUS_OFF value is out of range (500 to 31875 nanoseconds)!", ints); + configs[wd7000_card_num].bus_off = BUS_OFF; + } else + configs[wd7000_card_num].bus_off = ints[5] / 125; + } else + configs[wd7000_card_num].bus_off = BUS_OFF; + + if (wd7000_card_num) { + for (i = 0; i < (wd7000_card_num - 1); i++) + for (j = i + 1; j < wd7000_card_num; j++) + if (configs[i].irq == configs[j].irq) { + setup_error("duplicated IRQ!", ints); + return 0; + } else if (configs[i].dma == configs[j].dma) { + setup_error("duplicated DMA channel!", ints); + return 0; + } else if (configs[i].iobase == configs[j].iobase) { + setup_error ("duplicated I/O base address!", ints); + return 0; + } + } #ifdef WD7000_DEBUG - printk ("wd7000_setup: IRQ=%d, DMA=%d, I/O=0x%x, BUS_ON=%dns, BUS_OFF=%dns\n", - configs[wd7000_card_num].irq, - configs[wd7000_card_num].dma, - configs[wd7000_card_num].iobase, - configs[wd7000_card_num].bus_on * 125, - configs[wd7000_card_num].bus_off * 125); + printk ("wd7000_setup: IRQ=%d, DMA=%d, I/O=0x%x, BUS_ON=%dns, BUS_OFF=%dns\n", + configs[wd7000_card_num].irq, + configs[wd7000_card_num].dma, + configs[wd7000_card_num].iobase, + configs[wd7000_card_num].bus_on * 125, + configs[wd7000_card_num].bus_off * 125); #endif - wd7000_card_num++; - } + wd7000_card_num++; + } + return 1; } +__setup("wd7000=", wd7000_setup); #ifdef ANY2SCSI_INLINE /* @@ -1526,6 +1525,11 @@ #ifdef WD7000_DEBUG printk ("wd7000_detect: started\n"); +#endif + +#ifdef MODULE + if (wd7000) + wd7000_setup(wd7000); #endif for (i = 0; i < IRQS; wd7000_host[i++] = NULL) ; .