[SCSI] qla2xxx: Pull-down scsi-host-addition to follow board initialization.
authorAndrew Vasquez <andrew.vasquez@qlogic.com>
Fri, 10 Jun 2005 00:21:28 +0000 (17:21 -0700)
committerJames Bottomley <jejb@mulgrave.(none)>
Sat, 11 Jun 2005 18:06:22 +0000 (13:06 -0500)
Return to previous held-logic of calling scsi_add_host() only
after the board has been completely initialized.  Also return
pci_*() error-codes during probe failure paths.

This also corrects an issue where only lun 0 is being scanned for
a given port.

Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/scsi/qla2xxx/qla_os.c

index 3c97aa45772dc4aea2b7c4dbd759e76fa46c1745..d960637fd56a391b7d742586cd36bbafa48f0505 100644 (file)
@@ -1150,7 +1150,7 @@ iospace_error_exit:
  */
 int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
 {
-       int     ret;
+       int     ret = -ENODEV;
        device_reg_t __iomem *reg;
        struct Scsi_Host *host;
        scsi_qla_host_t *ha;
@@ -1161,7 +1161,7 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
        fc_port_t *fcport;
 
        if (pci_enable_device(pdev))
-               return -1;
+               goto probe_out;
 
        host = scsi_host_alloc(&qla2x00_driver_template,
            sizeof(scsi_qla_host_t));
@@ -1183,9 +1183,8 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
 
        /* Configure PCI I/O space */
        ret = qla2x00_iospace_config(ha);
-       if (ret != 0) {
-               goto probe_alloc_failed;
-       }
+       if (ret)
+               goto probe_failed;
 
        /* Sanitize the information from PCI BIOS. */
        host->irq = pdev->irq;
@@ -1258,23 +1257,10 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
                qla_printk(KERN_WARNING, ha,
                    "[ERROR] Failed to allocate memory for adapter\n");
 
-               goto probe_alloc_failed;
+               ret = -ENOMEM;
+               goto probe_failed;
        }
 
-       pci_set_drvdata(pdev, ha);
-       host->this_id = 255;
-       host->cmd_per_lun = 3;
-       host->unique_id = ha->instance;
-       host->max_cmd_len = MAX_CMDSZ;
-       host->max_channel = ha->ports - 1;
-       host->max_id = ha->max_targets;
-       host->max_lun = ha->max_luns;
-       host->transportt = qla2xxx_transport_template;
-       if (scsi_add_host(host, &pdev->dev))
-               goto probe_alloc_failed;
-
-       qla2x00_alloc_sysfs_attr(ha);
-
        if (qla2x00_initialize_adapter(ha) &&
            !(ha->device_flags & DFLG_NO_CABLE)) {
 
@@ -1285,11 +1271,10 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
                    "Adapter flags %x.\n",
                    ha->host_no, ha->device_flags));
 
+               ret = -ENODEV;
                goto probe_failed;
        }
 
-       qla2x00_init_host_attr(ha);
-
        /*
         * Startup the kernel thread for this host adapter
         */
@@ -1299,17 +1284,26 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
                qla_printk(KERN_WARNING, ha,
                    "Unable to start DPC thread!\n");
 
+               ret = -ENODEV;
                goto probe_failed;
        }
        wait_for_completion(&ha->dpc_inited);
 
+       host->this_id = 255;
+       host->cmd_per_lun = 3;
+       host->unique_id = ha->instance;
+       host->max_cmd_len = MAX_CMDSZ;
+       host->max_channel = ha->ports - 1;
+       host->max_lun = MAX_LUNS;
+       host->transportt = qla2xxx_transport_template;
+
        if (IS_QLA2100(ha) || IS_QLA2200(ha))
                ret = request_irq(host->irq, qla2100_intr_handler,
                    SA_INTERRUPT|SA_SHIRQ, ha->brd_info->drv_name, ha);
        else
                ret = request_irq(host->irq, qla2300_intr_handler,
                    SA_INTERRUPT|SA_SHIRQ, ha->brd_info->drv_name, ha);
-       if (ret != 0) {
+       if (ret) {
                qla_printk(KERN_WARNING, ha,
                    "Failed to reserve interrupt %d already in use.\n",
                    host->irq);
@@ -1363,9 +1357,18 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
                msleep(10);
        }
 
+       pci_set_drvdata(pdev, ha);
        ha->flags.init_done = 1;
        num_hosts++;
 
+       ret = scsi_add_host(host, &pdev->dev);
+       if (ret)
+               goto probe_failed;
+
+       qla2x00_alloc_sysfs_attr(ha);
+
+       qla2x00_init_host_attr(ha);
+
        qla_printk(KERN_INFO, ha, "\n"
            " QLogic Fibre Channel HBA Driver: %s\n"
            "  QLogic %s - %s\n"
@@ -1384,9 +1387,6 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
 probe_failed:
        fc_remove_host(ha->host);
 
-       scsi_remove_host(host);
-
-probe_alloc_failed:
        qla2x00_free_device(ha);
 
        scsi_host_put(host);
@@ -1394,7 +1394,8 @@ probe_alloc_failed:
 probe_disable_device:
        pci_disable_device(pdev);
 
-       return -1;
+probe_out:
+       return ret;
 }
 EXPORT_SYMBOL_GPL(qla2x00_probe_one);