Commit 906aa4d2 authored by Andrew Vasquez's avatar Andrew Vasquez Committed by Chris Wright

[PATCH] qla2xxx: Pull-down scsi-host-addition to follow board initialization.

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: default avatarAndrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
Signed-off-by: default avatarChris Wright <chrisw@osdl.org>
parent 49bbb396
...@@ -1150,7 +1150,7 @@ qla2x00_iospace_config(scsi_qla_host_t *ha) ...@@ -1150,7 +1150,7 @@ qla2x00_iospace_config(scsi_qla_host_t *ha)
*/ */
int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
{ {
int ret; int ret = -ENODEV;
device_reg_t __iomem *reg; device_reg_t __iomem *reg;
struct Scsi_Host *host; struct Scsi_Host *host;
scsi_qla_host_t *ha; scsi_qla_host_t *ha;
...@@ -1161,7 +1161,7 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) ...@@ -1161,7 +1161,7 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
fc_port_t *fcport; fc_port_t *fcport;
if (pci_enable_device(pdev)) if (pci_enable_device(pdev))
return -1; goto probe_out;
host = scsi_host_alloc(&qla2x00_driver_template, host = scsi_host_alloc(&qla2x00_driver_template,
sizeof(scsi_qla_host_t)); sizeof(scsi_qla_host_t));
...@@ -1183,9 +1183,8 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) ...@@ -1183,9 +1183,8 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
/* Configure PCI I/O space */ /* Configure PCI I/O space */
ret = qla2x00_iospace_config(ha); ret = qla2x00_iospace_config(ha);
if (ret != 0) { if (ret)
goto probe_alloc_failed; goto probe_failed;
}
/* Sanitize the information from PCI BIOS. */ /* Sanitize the information from PCI BIOS. */
host->irq = pdev->irq; host->irq = pdev->irq;
...@@ -1258,23 +1257,10 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) ...@@ -1258,23 +1257,10 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
qla_printk(KERN_WARNING, ha, qla_printk(KERN_WARNING, ha,
"[ERROR] Failed to allocate memory for adapter\n"); "[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) && if (qla2x00_initialize_adapter(ha) &&
!(ha->device_flags & DFLG_NO_CABLE)) { !(ha->device_flags & DFLG_NO_CABLE)) {
...@@ -1285,11 +1271,10 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) ...@@ -1285,11 +1271,10 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
"Adapter flags %x.\n", "Adapter flags %x.\n",
ha->host_no, ha->device_flags)); ha->host_no, ha->device_flags));
ret = -ENODEV;
goto probe_failed; goto probe_failed;
} }
qla2x00_init_host_attr(ha);
/* /*
* Startup the kernel thread for this host adapter * 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) ...@@ -1299,17 +1284,26 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
qla_printk(KERN_WARNING, ha, qla_printk(KERN_WARNING, ha,
"Unable to start DPC thread!\n"); "Unable to start DPC thread!\n");
ret = -ENODEV;
goto probe_failed; goto probe_failed;
} }
wait_for_completion(&ha->dpc_inited); 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)) if (IS_QLA2100(ha) || IS_QLA2200(ha))
ret = request_irq(host->irq, qla2100_intr_handler, ret = request_irq(host->irq, qla2100_intr_handler,
SA_INTERRUPT|SA_SHIRQ, ha->brd_info->drv_name, ha); SA_INTERRUPT|SA_SHIRQ, ha->brd_info->drv_name, ha);
else else
ret = request_irq(host->irq, qla2300_intr_handler, ret = request_irq(host->irq, qla2300_intr_handler,
SA_INTERRUPT|SA_SHIRQ, ha->brd_info->drv_name, ha); SA_INTERRUPT|SA_SHIRQ, ha->brd_info->drv_name, ha);
if (ret != 0) { if (ret) {
qla_printk(KERN_WARNING, ha, qla_printk(KERN_WARNING, ha,
"Failed to reserve interrupt %d already in use.\n", "Failed to reserve interrupt %d already in use.\n",
host->irq); host->irq);
...@@ -1363,9 +1357,18 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) ...@@ -1363,9 +1357,18 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
msleep(10); msleep(10);
} }
pci_set_drvdata(pdev, ha);
ha->flags.init_done = 1; ha->flags.init_done = 1;
num_hosts++; 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" qla_printk(KERN_INFO, ha, "\n"
" QLogic Fibre Channel HBA Driver: %s\n" " QLogic Fibre Channel HBA Driver: %s\n"
" QLogic %s - %s\n" " QLogic %s - %s\n"
...@@ -1384,9 +1387,6 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) ...@@ -1384,9 +1387,6 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
probe_failed: probe_failed:
fc_remove_host(ha->host); fc_remove_host(ha->host);
scsi_remove_host(host);
probe_alloc_failed:
qla2x00_free_device(ha); qla2x00_free_device(ha);
scsi_host_put(host); scsi_host_put(host);
...@@ -1394,7 +1394,8 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) ...@@ -1394,7 +1394,8 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
probe_disable_device: probe_disable_device:
pci_disable_device(pdev); pci_disable_device(pdev);
return -1; probe_out:
return ret;
} }
EXPORT_SYMBOL_GPL(qla2x00_probe_one); EXPORT_SYMBOL_GPL(qla2x00_probe_one);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment