qla2xxx: Pull-down scsi-host-addition to follow board initialization.
Subsystems (2)
PATCH 1/1 qla2xxx: Pull-down scsi-host-addition to follow board initialization.
James,
Please apply for the following patch for 2.6.12 inclusion. This patch has already been ack'd by several qla2xxx users.
Thanks,
Andrew Vasquez
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 Andrew Vasquez <[email protected]>
---
drivers/scsi/qla2xxx/qla_os.c | 55 +++++++++++++++++++++--------------------- 1 files changed, 28 insertions(+), 27 deletions(-)
drivers/scsi/qla2xxx/qla_os.c +28 -27
@@ -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 *pdfc_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 *pd/* 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 *pdqla_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 *pd"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 *pdqla_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 *pdmsleep (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 *pd 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);