isci: kill isci_host list in favor of an array

isci_host_by_id() should have been a clue that an array would have been
a simpler approach.

Reported-by: James Bottomley <James.Bottomley@suse.de>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
diff --git a/drivers/scsi/isci/init.c b/drivers/scsi/isci/init.c
index d01c44f..f1b8a51 100644
--- a/drivers/scsi/isci/init.c
+++ b/drivers/scsi/isci/init.c
@@ -285,16 +285,6 @@
 	return 0;
 }
 
-static struct isci_host *isci_host_by_id(struct pci_dev *pdev, int id)
-{
-	struct isci_host *h;
-
-	for_each_isci_host(h, pdev)
-		if (h->id == id)
-			return h;
-	return NULL;
-}
-
 static int num_controllers(struct pci_dev *pdev)
 {
 	/* bar size alone can tell us if we are running with a dual controller
@@ -332,7 +322,7 @@
 	for (i = 0; i < num_msix; i++) {
 		int id = i / SCI_NUM_MSI_X_INT;
 		struct msix_entry *msix = &pci_info->msix_entries[i];
-		struct isci_host *isci_host = isci_host_by_id(pdev, id);
+		struct isci_host *isci_host = pci_info->hosts[id];
 		irq_handler_t isr;
 
 		/* odd numbered vectors are error interrupts */
@@ -351,7 +341,7 @@
 		dev_info(&pdev->dev, "msix setup failed falling back to intx\n");
 		while (i--) {
 			id = i / SCI_NUM_MSI_X_INT;
-			isci_host = isci_host_by_id(pdev, id);
+			isci_host = pci_info->hosts[id];
 			msix = &pci_info->msix_entries[i];
 			devm_free_irq(&pdev->dev, msix->vector, isci_host);
 		}
@@ -634,22 +624,20 @@
 			err = -ENOMEM;
 			goto err_host_alloc;
 		}
-
-		h->next = pci_info->hosts;
-		pci_info->hosts = h;
+		pci_info->hosts[i] = h;
 	}
 
 	err = isci_setup_interrupts(pdev);
 	if (err)
 		goto err_host_alloc;
 
-	for_each_isci_host(isci_host, pdev)
+	for_each_isci_host(i, isci_host, pdev)
 		scsi_scan_host(isci_host->shost);
 
 	return 0;
 
  err_host_alloc:
-	for_each_isci_host(isci_host, pdev)
+	for_each_isci_host(i, isci_host, pdev)
 		isci_unregister_sas_ha(isci_host);
 	return err;
 }
@@ -657,8 +645,9 @@
 static void __devexit isci_pci_remove(struct pci_dev *pdev)
 {
 	struct isci_host *isci_host;
+	int i;
 
-	for_each_isci_host(isci_host, pdev) {
+	for_each_isci_host(i, isci_host, pdev) {
 		isci_unregister_sas_ha(isci_host);
 		isci_host_deinit(isci_host);
 		scic_controller_disable_interrupts(isci_host->core_controller);