--- 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 <linux/module.h>
 
 #include <linux/kernel.h>
-#include <linux/head.h>
 #include <linux/types.h>
 #include <linux/string.h>
-#include <linux/bios32.h>
 #include <linux/pci.h>
 #include <linux/ioport.h>
 #include <linux/delay.h>
@@ -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
