--- linux/drivers/scsi/pci2000.c Mon Mar 22 21:05:53 1999 +++ linux-2.2.4-pci2k/drivers/scsi/pci2000.c Wed Mar 24 13:35:39 1999 @@ -34,10 +34,8 @@ #include #include -#include #include #include -#include #include #include #include @@ -570,58 +568,53 @@ ****************************************************************/ int Pci2000_Detect (Scsi_Host_Template *tpnt) { - int pci_index = 0; + int num_found = 0; struct Scsi_Host *pshost; PADAPTER2000 padapter; int z, zz; int setirq; + struct pci_dev *pdev = NULL; - if ( pcibios_present () ) - { - for ( pci_index = 0; pci_index <= MAXADAPTER; ++pci_index ) - { - UCHAR pci_bus, pci_device_fn; - - if ( pcibios_find_device (VENDOR_PSI, DEVICE_ROY_1, pci_index, &pci_bus, &pci_device_fn) != 0 ) - break; - - pshost = scsi_register (tpnt, sizeof(ADAPTER2000)); - padapter = HOSTDATA(pshost); - - pcibios_read_config_word (pci_bus, pci_device_fn, PCI_BASE_ADDRESS_1, &padapter->basePort); - padapter->basePort &= 0xFFFE; - DEB (printk ("\nBase Regs = %#04X", padapter->basePort)); // get the base I/O port address - padapter->mb0 = padapter->basePort + RTR_MAILBOX; // get the 32 bit mail boxes - padapter->mb1 = padapter->basePort + RTR_MAILBOX + 4; - padapter->mb2 = padapter->basePort + RTR_MAILBOX + 8; - padapter->mb3 = padapter->basePort + RTR_MAILBOX + 12; - padapter->mb4 = padapter->basePort + RTR_MAILBOX + 16; - padapter->cmd = padapter->basePort + RTR_LOCAL_DOORBELL; // command register - padapter->tag = padapter->basePort + RTR_PCI_DOORBELL; // tag/response register - - if ( WaitReady (padapter) ) - goto unregister; - outb_p (0x84, padapter->mb0); - outb_p (CMD_SPECIFY, padapter->cmd); - if ( WaitReady (padapter) ) - goto unregister; + if (!pci_present()) { + printk("pci2000: PCI BIOS not present\n"); + return 0; + } + while ((pdev = pci_find_device(VENDOR_PSI, DEVICE_ROY_1, pdev)) != NULL) { + pshost = scsi_register (tpnt, sizeof(ADAPTER2000)); + padapter = HOSTDATA(pshost); + padapter->basePort = pdev->base_address[1] & 0xFFFE; + DEB (printk("\nBase Regs = %#04X", padapter->basePort)); // get the base I/O port address + + padapter->mb0 = padapter->basePort + RTR_MAILBOX; // get the 32 bit mail boxes + padapter->mb1 = padapter->basePort + RTR_MAILBOX + 4; + padapter->mb2 = padapter->basePort + RTR_MAILBOX + 8; + padapter->mb3 = padapter->basePort + RTR_MAILBOX + 12; + padapter->mb4 = padapter->basePort + RTR_MAILBOX + 16; + padapter->cmd = padapter->basePort + RTR_LOCAL_DOORBELL; // command register + padapter->tag = padapter->basePort + RTR_PCI_DOORBELL; // tag/response register + if ( WaitReady (padapter) ) + goto unregister; + outb_p (0x84, padapter->mb0); + outb_p (CMD_SPECIFY, padapter->cmd); + if ( WaitReady (padapter) ) + goto unregister; - pcibios_read_config_byte (pci_bus, pci_device_fn, PCI_INTERRUPT_LINE, &pshost->irq); - setirq = 1; - for ( z = 0; z < pci_index; z++ ) // scan for shared interrupts - { - if ( PsiHost[z]->irq == pshost->irq ) // if shared then, don't posses - setirq = 0; - } - if ( setirq ) // if not shared, posses + pshost->irq = pdev->irq; + setirq = 1; + for ( z = 0; z < num_found; z++ ) // scan for shared interrupts + { + if ( PsiHost[z]->irq == pshost->irq ) // if shared then, don't posses + setirq = 0; + } + if ( setirq ) // if not shared, posses + { + if ( request_irq (pshost->irq, Irq_Handler, 0, "pci2000", NULL) ) { - if ( request_irq (pshost->irq, Irq_Handler, 0, "pci2000", NULL) ) - { - printk ("Unable to allocate IRQ for PSI-2000 controller.\n"); - goto unregister; - } + printk ("Unable to allocate IRQ for PSI-2000 controller.\n"); + goto unregister; } - PsiHost[pci_index] = pshost; // save SCSI_HOST pointer + } + PsiHost[num_found] = pshost; // save SCSI_HOST pointer pshost->unique_id = padapter->basePort; pshost->max_id = 16; @@ -633,13 +626,14 @@ printk("\nPSI-2000 Intelligent Storage SCSI CONTROLLER: at I/O = %X IRQ = %d\n", padapter->basePort, pshost->irq); printk("Version %s, Compiled %s %s\n\n", PCI2000_VERSION, __DATE__, __TIME__); + if (++num_found >= MAXADAPTER) + break; continue; unregister:; scsi_unregister (pshost); - } } - NumAdapters = pci_index; - return pci_index; + NumAdapters = num_found; + return num_found; } /**************************************************************** * Name: Pci2220i_Abort .