Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8de5b958 authored by Lalit Chandivade's avatar Lalit Chandivade Committed by James Bottomley
Browse files

[SCSI] qla4xxx: Fix exporting boot targets to sysfs



The driver failed to export primary boot target if secondary target did not
exist in the FLASH. If boot targets are not valid then driver assumed 0 and
1 as default boot targets. Since these target did not exist in flash, the
driver failed exporting all the targets.

JIRA Key: UPSISCSI-148

Signed-off-by: default avatarLalit Chandivade <lalit.chandivade@qlogic.com>
Signed-off-by: default avatarVikas Chaudhary <vikas.chaudhary@qlogic.com>
Reviewed-by: default avatarMike Christie <michaelc@cs.wisc.edu>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent 4549415a
Loading
Loading
Loading
Loading
+21 −16
Original line number Diff line number Diff line
@@ -2812,15 +2812,11 @@ static int get_fw_boot_info(struct scsi_qla_host *ha, uint16_t ddb_index[])
		val = rd_nvram_byte(ha, pri_addr);
		if (val & BIT_7)
			ddb_index[0] = (val & 0x7f);
		else
			ddb_index[0] = 0;

		/* get secondary valid target index */
		val = rd_nvram_byte(ha, sec_addr);
		if (val & BIT_7)
			ddb_index[1] = (val & 0x7f);
		else
			ddb_index[1] = 1;

	} else if (is_qla8022(ha)) {
		buf = dma_alloc_coherent(&ha->pdev->dev, size,
@@ -2862,15 +2858,10 @@ static int get_fw_boot_info(struct scsi_qla_host *ha, uint16_t ddb_index[])
		/* get primary valid target index */
		if (buf[2] & BIT_7)
			ddb_index[0] = buf[2] & 0x7f;
		else
			ddb_index[0] = 0;

		/* get secondary valid target index */
		if (buf[11] & BIT_7)
			ddb_index[1] = buf[11] & 0x7f;
		else
			ddb_index[1] = 1;

	} else {
		ret = QLA_ERROR;
		goto exit_boot_info;
@@ -2980,9 +2971,12 @@ static int qla4xxx_get_boot_target(struct scsi_qla_host *ha,
static int qla4xxx_get_boot_info(struct scsi_qla_host *ha)
{
	uint16_t ddb_index[2];
	int ret = QLA_SUCCESS;
	int ret = QLA_ERROR;
	int rval;

	memset(ddb_index, 0, sizeof(ddb_index));
	ddb_index[0] = 0xffff;
	ddb_index[1] = 0xffff;
	ret = get_fw_boot_info(ha, ddb_index);
	if (ret != QLA_SUCCESS) {
		DEBUG2(ql4_printk(KERN_ERR, ha,
@@ -2990,19 +2984,30 @@ static int qla4xxx_get_boot_info(struct scsi_qla_host *ha)
		return ret;
	}

	ret = qla4xxx_get_boot_target(ha, &(ha->boot_tgt.boot_pri_sess),
	if (ddb_index[0] == 0xffff)
		goto sec_target;

	rval = qla4xxx_get_boot_target(ha, &(ha->boot_tgt.boot_pri_sess),
				      ddb_index[0]);
	if (ret != QLA_SUCCESS) {
	if (rval != QLA_SUCCESS) {
		DEBUG2(ql4_printk(KERN_ERR, ha, "%s: Failed to get "
				  "primary target\n", __func__));
	}
	} else
		ret = QLA_SUCCESS;

	ret = qla4xxx_get_boot_target(ha, &(ha->boot_tgt.boot_sec_sess),
sec_target:
	if (ddb_index[1] == 0xffff)
		goto exit_get_boot_info;

	rval = qla4xxx_get_boot_target(ha, &(ha->boot_tgt.boot_sec_sess),
				      ddb_index[1]);
	if (ret != QLA_SUCCESS) {
	if (rval != QLA_SUCCESS) {
		DEBUG2(ql4_printk(KERN_ERR, ha, "%s: Failed to get "
				  "secondary target\n", __func__));
	}
	} else
		ret = QLA_SUCCESS;

exit_get_boot_info:
	return ret;
}