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

Commit 30845586 authored by Sumit Saxena's avatar Sumit Saxena Committed by Martin K. Petersen
Browse files

megaraid_sas: Don't issue kill adapter for MFI controllers in case of PD list DCMD failure



There are few MFI adapters which do not support MR_DCMD_PD_LIST_QUERY so
if MFI adapters fail this DCMD, it should not be considered as FATAL and
driver should not issue kill adapter and set per controller's instance
variable- pd_list_not_supported so that same variable can be used inside
functions- slave_alloc and slave_configure to allow firmware scan.

Killing adapter because of DCMD failure when this DCMD is not supported
causes driver's probe getting failed. This issue got introduced by
commit 6d40afbc ("megaraid_sas: MFI IO timeout handling").

Killing adapter in case of this DCMD failure should be limited to Fusion
adapters only. Per controller's instance variable allow_fw_scan is
removed as pd_list_not_supported better reflect the purpose.

Fixes: 6d40afbc
Signed-off-by: default avatarSumit Saxena <sumit.saxena@broadcom.com>
Reviewed-by: default avatarJohannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: default avatarHannes Reinicke <hare@suse.de>
Reviewed-by: default avatarEwan Milne <emilne@redhat.com>
Reviewed-by: default avatarTomas Henzl <thenzl@redhat.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 7f8b8f3f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2097,7 +2097,7 @@ struct megasas_instance {
	u8 UnevenSpanSupport;

	u8 supportmax256vd;
	u8 allow_fw_scan;
	u8 pd_list_not_supported;
	u16 fw_supported_vd_count;
	u16 fw_supported_pd_count;

+10 −4
Original line number Diff line number Diff line
@@ -1838,7 +1838,7 @@ static int megasas_slave_configure(struct scsi_device *sdev)
	struct megasas_instance *instance;

	instance = megasas_lookup_instance(sdev->host->host_no);
	if (instance->allow_fw_scan) {
	if (instance->pd_list_not_supported) {
		if (sdev->channel < MEGASAS_MAX_PD_CHANNELS &&
			sdev->type == TYPE_DISK) {
			pd_index = (sdev->channel * MEGASAS_MAX_DEV_PER_CHANNEL) +
@@ -1874,7 +1874,8 @@ static int megasas_slave_alloc(struct scsi_device *sdev)
		pd_index =
			(sdev->channel * MEGASAS_MAX_DEV_PER_CHANNEL) +
			sdev->id;
		if ((instance->allow_fw_scan || instance->pd_list[pd_index].driveState ==
		if ((instance->pd_list_not_supported ||
			instance->pd_list[pd_index].driveState ==
			MR_PD_STATE_SYSTEM)) {
			goto scan_target;
		}
@@ -4087,7 +4088,13 @@ megasas_get_pd_list(struct megasas_instance *instance)

	switch (ret) {
	case DCMD_FAILED:
		dev_info(&instance->pdev->dev, "MR_DCMD_PD_LIST_QUERY "
			"failed/not supported by firmware\n");

		if (instance->ctrl_context)
			megaraid_sas_kill_hba(instance);
		else
			instance->pd_list_not_supported = 1;
		break;
	case DCMD_TIMEOUT:

@@ -5034,7 +5041,6 @@ static int megasas_init_fw(struct megasas_instance *instance)
	case PCI_DEVICE_ID_DELL_PERC5:
	default:
		instance->instancet = &megasas_instance_template_xscale;
		instance->allow_fw_scan = 1;
		break;
	}