|
@@ -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);
|
|
|
|