diff mbox

[02/12] megaraid_sas : Code optimization- remove PCI Ids based checks

Message ID 201510150816.t9F8GqPJ029555@palmhbs0.lsi.com (mailing list archive)
State Accepted, archived
Headers show

Commit Message

Sumit Saxena Oct. 15, 2015, 8:09 a.m. UTC
Code optimization: remove PCI id based checks and instead of those use instance->ctrl_context to make call whether controller is MFI based OR fusion adapter.
fusion adapters further are also divided in two categories- 1)THUNDERBOLT SERIES and 2)INVADER SERIES.

Signed-off-by: Sumit Saxena <sumit.saxena@avagotech.com>
Signed-off-by: Kashyap Desai <kashyap.desai@avagotech.com>
---
 drivers/scsi/megaraid/megaraid_sas_base.c   |  152 ++++++++------------------
 drivers/scsi/megaraid/megaraid_sas_fp.c     |   24 ++--
 drivers/scsi/megaraid/megaraid_sas_fusion.c |   40 ++-----
 drivers/scsi/megaraid/megaraid_sas_fusion.h |    6 +
 4 files changed, 76 insertions(+), 146 deletions(-)

Comments

Tomas Henzl Oct. 16, 2015, 2:39 p.m. UTC | #1
On 15.10.2015 10:09, sumit.saxena@avagotech.com wrote:
> Code optimization: remove PCI id based checks and instead of those use instance->ctrl_context to make call whether controller is MFI based OR fusion adapter.
> fusion adapters further are also divided in two categories- 1)THUNDERBOLT SERIES and 2)INVADER SERIES.
>
> Signed-off-by: Sumit Saxena <sumit.saxena@avagotech.com>
> Signed-off-by: Kashyap Desai <kashyap.desai@avagotech.com>
> ---
>  drivers/scsi/megaraid/megaraid_sas_base.c   |  152 ++++++++------------------
>  drivers/scsi/megaraid/megaraid_sas_fp.c     |   24 ++--
>  drivers/scsi/megaraid/megaraid_sas_fusion.c |   40 ++-----
>  drivers/scsi/megaraid/megaraid_sas_fusion.h |    6 +
>  4 files changed, 76 insertions(+), 146 deletions(-)
>
> diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c
> index d00d494..bc2bb13 100644
> --- a/drivers/scsi/megaraid/megaraid_sas_base.c
> +++ b/drivers/scsi/megaraid/megaraid_sas_base.c
> @@ -1797,10 +1797,7 @@ void megaraid_sas_kill_hba(struct megasas_instance *instance)
>  	msleep(1000);
>  	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
>  		(instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
> -		(instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
> -		(instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
> -		(instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> -		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
> +		(instance->ctrl_context)) {
>  		writel(MFI_STOP_ADP, &instance->reg_set->doorbell);
>  		/* Flush */
>  		readl(&instance->reg_set->doorbell);
> @@ -2567,10 +2564,7 @@ static int megasas_reset_bus_host(struct scsi_cmnd *scmd)
>  	/*
>  	 * First wait for all commands to complete
>  	 */
> -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
> +	if (instance->ctrl_context)
>  		ret = megasas_reset_fusion(scmd->device->host, 1);
>  	else
>  		ret = megasas_generic_reset(scmd);
> @@ -3431,22 +3425,14 @@ megasas_transition_to_ready(struct megasas_instance *instance, int ocr)
>  				PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
>  				(instance->pdev->device ==
>  				 PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
> -				(instance->pdev->device ==
> -				PCI_DEVICE_ID_LSI_FUSION) ||
> -				(instance->pdev->device ==
> -				PCI_DEVICE_ID_LSI_PLASMA) ||
> -				(instance->pdev->device ==
> -				PCI_DEVICE_ID_LSI_INVADER) ||
> -				(instance->pdev->device ==
> -				PCI_DEVICE_ID_LSI_FURY)) {
> +				(instance->ctrl_context))
>  				writel(
>  				  MFI_INIT_CLEAR_HANDSHAKE|MFI_INIT_HOTPLUG,
>  				  &instance->reg_set->doorbell);
> -			} else {
> +			else
>  				writel(
>  				    MFI_INIT_CLEAR_HANDSHAKE|MFI_INIT_HOTPLUG,
>  					&instance->reg_set->inbound_doorbell);
> -			}
>  
>  			max_wait = MEGASAS_RESET_WAIT_TIME;
>  			cur_state = MFI_STATE_WAIT_HANDSHAKE;
> @@ -3457,17 +3443,10 @@ megasas_transition_to_ready(struct megasas_instance *instance, int ocr)
>  			     PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
>  				(instance->pdev->device ==
>  				 PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
> -			    (instance->pdev->device ==
> -			     PCI_DEVICE_ID_LSI_FUSION) ||
> -			    (instance->pdev->device ==
> -			     PCI_DEVICE_ID_LSI_PLASMA) ||
> -			    (instance->pdev->device ==
> -			     PCI_DEVICE_ID_LSI_INVADER) ||
> -			    (instance->pdev->device ==
> -			     PCI_DEVICE_ID_LSI_FURY)) {
> +				(instance->ctrl_context))
>  				writel(MFI_INIT_HOTPLUG,
>  				       &instance->reg_set->doorbell);
> -			} else
> +			else
>  				writel(MFI_INIT_HOTPLUG,
>  					&instance->reg_set->inbound_doorbell);
>  
> @@ -3484,24 +3463,11 @@ megasas_transition_to_ready(struct megasas_instance *instance, int ocr)
>  				PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
>  				(instance->pdev->device ==
>  				PCI_DEVICE_ID_LSI_SAS0071SKINNY)  ||
> -				(instance->pdev->device
> -					== PCI_DEVICE_ID_LSI_FUSION) ||
> -				(instance->pdev->device
> -					== PCI_DEVICE_ID_LSI_PLASMA) ||
> -				(instance->pdev->device
> -					== PCI_DEVICE_ID_LSI_INVADER) ||
> -				(instance->pdev->device
> -					== PCI_DEVICE_ID_LSI_FURY)) {
> +				(instance->ctrl_context)) {
>  				writel(MFI_RESET_FLAGS,
>  					&instance->reg_set->doorbell);
> -				if ((instance->pdev->device ==
> -					PCI_DEVICE_ID_LSI_FUSION) ||
> -					(instance->pdev->device ==
> -					PCI_DEVICE_ID_LSI_PLASMA) ||
> -					(instance->pdev->device ==
> -					PCI_DEVICE_ID_LSI_INVADER) ||
> -					(instance->pdev->device ==
> -					PCI_DEVICE_ID_LSI_FURY)) {
> +
> +				if (instance->ctrl_context) {
>  					for (i = 0; i < (10 * 1000); i += 20) {
>  						if (readl(
>  							    &instance->
> @@ -3722,11 +3688,7 @@ static int megasas_create_frame_pool(struct megasas_instance *instance)
>  		memset(cmd->frame, 0, total_sz);
>  		cmd->frame->io.context = cpu_to_le32(cmd->index);
>  		cmd->frame->io.pad_0 = 0;
> -		if ((instance->pdev->device != PCI_DEVICE_ID_LSI_FUSION) &&
> -		    (instance->pdev->device != PCI_DEVICE_ID_LSI_PLASMA) &&
> -		    (instance->pdev->device != PCI_DEVICE_ID_LSI_INVADER) &&
> -			(instance->pdev->device != PCI_DEVICE_ID_LSI_FURY) &&
> -		    (reset_devices))
> +		if (!instance->ctrl_context && reset_devices)
>  			cmd->frame->hdr.cmd = MFI_CMD_INVALID;
>  	}
>  
> @@ -4639,6 +4601,9 @@ static int megasas_init_fw(struct megasas_instance *instance)
>  	unsigned long bar_list;
>  	int i, loop, fw_msix_count = 0;
>  	struct IOV_111 *iovPtr;
> +	struct fusion_context *fusion;
> +
> +	fusion = instance->ctrl_context;
>  
>  	/* Find first memory bar */
>  	bar_list = pci_select_bars(instance->pdev, IORESOURCE_MEM);
> @@ -4716,37 +4681,32 @@ static int megasas_init_fw(struct megasas_instance *instance)
>  		scratch_pad_2 = readl
>  			(&instance->reg_set->outbound_scratch_pad_2);
>  		/* Check max MSI-X vectors */
> -		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
> -		    (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA)) {
> -			instance->msix_vectors = (scratch_pad_2
> -				& MR_MAX_REPLY_QUEUES_OFFSET) + 1;
> -			fw_msix_count = instance->msix_vectors;
> -			if (msix_vectors)
> -				instance->msix_vectors =
> -					min(msix_vectors,
> -					    instance->msix_vectors);
> -		} else if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER)
> -			|| (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
> -			/* Invader/Fury supports more than 8 MSI-X */
> -			instance->msix_vectors = ((scratch_pad_2
> -				& MR_MAX_REPLY_QUEUES_EXT_OFFSET)
> -				>> MR_MAX_REPLY_QUEUES_EXT_OFFSET_SHIFT) + 1;
> -			fw_msix_count = instance->msix_vectors;
> -			/* Save 1-15 reply post index address to local memory
> -			 * Index 0 is already saved from reg offset
> -			 * MPI2_REPLY_POST_HOST_INDEX_OFFSET
> -			 */
> -			for (loop = 1; loop < MR_MAX_MSIX_REG_ARRAY; loop++) {
> -				instance->reply_post_host_index_addr[loop] =
> -					(u32 __iomem *)
> -					((u8 __iomem *)instance->reg_set +
> -					MPI2_SUP_REPLY_POST_HOST_INDEX_OFFSET
> -					+ (loop * 0x10));
> +		if (fusion) {
> +			if (fusion->adapter_type == THUNDERBOLT_SERIES) { /* Thunderbolt Series*/
> +				instance->msix_vectors = (scratch_pad_2
> +					& MR_MAX_REPLY_QUEUES_OFFSET) + 1;
> +				fw_msix_count = instance->msix_vectors;
> +			} else { /* Invader series supports more than 8 MSI-x vectors*/
> +				instance->msix_vectors = ((scratch_pad_2
> +					& MR_MAX_REPLY_QUEUES_EXT_OFFSET)
> +					>> MR_MAX_REPLY_QUEUES_EXT_OFFSET_SHIFT) + 1;
> +				fw_msix_count = instance->msix_vectors;
> +				/* Save 1-15 reply post index address to local memory
> +				 * Index 0 is already saved from reg offset
> +				 * MPI2_REPLY_POST_HOST_INDEX_OFFSET
> +				 */
> +				for (loop = 1; loop < MR_MAX_MSIX_REG_ARRAY; loop++) {
> +					instance->reply_post_host_index_addr[loop] =
> +						(u32 __iomem *)
> +						((u8 __iomem *)instance->reg_set +
> +						MPI2_SUP_REPLY_POST_HOST_INDEX_OFFSET
> +						+ (loop * 0x10));
> +				}
>  			}
>  			if (msix_vectors)
>  				instance->msix_vectors = min(msix_vectors,
>  					instance->msix_vectors);
> -		} else
> +		} else /* MFI adapters */
>  			instance->msix_vectors = 1;
>  		/* Don't bother allocating more MSI-X vectors than cpus */
>  		instance->msix_vectors = min(instance->msix_vectors,
> @@ -5241,10 +5201,7 @@ static int megasas_io_attach(struct megasas_instance *instance)
>  	host->max_cmd_len = 16;
>  
>  	/* Fusion only supports host reset */
> -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
> +	if (instance->ctrl_context) {
>  		host->hostt->eh_device_reset_handler = NULL;
>  		host->hostt->eh_bus_reset_handler = NULL;
>  	}
> @@ -5380,6 +5337,11 @@ static int megasas_probe_one(struct pci_dev *pdev,
>  		fusion = instance->ctrl_context;
>  		memset(fusion, 0,
>  			((1 << PAGE_SHIFT) << instance->ctrl_context_pages));
> +		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
> +			(instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA))
> +			fusion->adapter_type = THUNDERBOLT_SERIES;
> +		else
> +			fusion->adapter_type = INVADER_SERIES;
>  	}
>  	break;
>  	default: /* For all other supported controllers */
> @@ -5482,10 +5444,7 @@ static int megasas_probe_one(struct pci_dev *pdev,
>  	instance->disableOnlineCtrlReset = 1;
>  	instance->UnevenSpanSupport = 0;
>  
> -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
> +	if (instance->ctrl_context) {
>  		INIT_WORK(&instance->work_init, megasas_fusion_ocr_wq);
>  		INIT_WORK(&instance->crash_init, megasas_fusion_crash_dump_wq);
>  	} else
> @@ -5565,10 +5524,7 @@ fail_io_attach:
>  	instance->instancet->disable_intr(instance);
>  	megasas_destroy_irqs(instance);
>  
> -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
> +	if (instance->ctrl_context)
>  		megasas_release_fusion(instance);
>  	else
>  		megasas_release_mfi(instance);
> @@ -5781,12 +5737,7 @@ megasas_resume(struct pci_dev *pdev)
>  				  instance->msix_vectors))
>  		goto fail_reenable_msix;
>  
> -	switch (instance->pdev->device) {
> -	case PCI_DEVICE_ID_LSI_FUSION:
> -	case PCI_DEVICE_ID_LSI_PLASMA:
> -	case PCI_DEVICE_ID_LSI_INVADER:
> -	case PCI_DEVICE_ID_LSI_FURY:
> -	{
> +	if (instance->ctrl_context) {
>  		megasas_reset_reply_desc(instance);
>  		if (megasas_ioc_init_fusion(instance)) {
>  			megasas_free_cmds(instance);
> @@ -5795,14 +5746,11 @@ megasas_resume(struct pci_dev *pdev)
>  		}
>  		if (!megasas_get_map_info(instance))
>  			megasas_sync_map_info(instance);
> -	}
> -	break;
> -	default:
> +	} else {
>  		*instance->producer = 0;
>  		*instance->consumer = 0;
>  		if (megasas_issue_init_mfi(instance))
>  			goto fail_init_mfi;
> -		break;
>  	}
>  
>  	tasklet_init(&instance->isr_tasklet, instance->instancet->tasklet,
> @@ -5924,11 +5872,7 @@ static void megasas_detach_one(struct pci_dev *pdev)
>  	if (instance->msix_vectors)
>  		pci_disable_msix(instance->pdev);
>  
> -	switch (instance->pdev->device) {
> -	case PCI_DEVICE_ID_LSI_FUSION:
> -	case PCI_DEVICE_ID_LSI_PLASMA:
> -	case PCI_DEVICE_ID_LSI_INVADER:
> -	case PCI_DEVICE_ID_LSI_FURY:
> +	if (instance->ctrl_context) {
>  		megasas_release_fusion(instance);
>  			pd_seq_map_sz = sizeof(struct MR_PD_CFG_SEQ_NUM_SYNC) +
>  				(sizeof(struct MR_PD_CFG_SEQ) *
> @@ -5950,8 +5894,7 @@ static void megasas_detach_one(struct pci_dev *pdev)
>  		}
>  		free_pages((ulong)instance->ctrl_context,
>  			instance->ctrl_context_pages);
> -		break;
> -	default:
> +	} else {
>  		megasas_release_mfi(instance);
>  		pci_free_consistent(pdev, sizeof(u32),
>  				    instance->producer,
> @@ -5959,7 +5902,6 @@ static void megasas_detach_one(struct pci_dev *pdev)
>  		pci_free_consistent(pdev, sizeof(u32),
>  				    instance->consumer,
>  				    instance->consumer_h);
> -		break;
>  	}
>  
>  	kfree(instance->ctrl_info);
> diff --git a/drivers/scsi/megaraid/megaraid_sas_fp.c b/drivers/scsi/megaraid/megaraid_sas_fp.c
> index be57b18..ce5b832 100644
> --- a/drivers/scsi/megaraid/megaraid_sas_fp.c
> +++ b/drivers/scsi/megaraid/megaraid_sas_fp.c
> @@ -741,14 +741,12 @@ static u8 mr_spanset_get_phy_params(struct megasas_instance *instance, u32 ld,
>  	u8      physArm, span;
>  	u64     row;
>  	u8	retval = TRUE;
> -	u8	do_invader = 0;
>  	u64	*pdBlock = &io_info->pdBlock;
>  	__le16	*pDevHandle = &io_info->devHandle;
>  	u32	logArm, rowMod, armQ, arm;
> +	struct fusion_context *fusion;
>  
> -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER ||
> -		instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
> -		do_invader = 1;
> +	fusion = instance->ctrl_context;
>  
>  	/*Get row and span from io_info for Uneven Span IO.*/
>  	row	    = io_info->start_row;
> @@ -779,7 +777,8 @@ static u8 mr_spanset_get_phy_params(struct megasas_instance *instance, u32 ld,
>  	else {
>  		*pDevHandle = cpu_to_le16(MR_PD_INVALID);
>  		if ((raid->level >= 5) &&
> -			(!do_invader  || (do_invader &&
> +			((fusion->adapter_type == THUNDERBOLT_SERIES)  ||
> +			((fusion->adapter_type == INVADER_SERIES) &&

Isn't it possible that fusion is NULL here?

>  			(raid->regTypeReqOnRead != REGION_TYPE_UNUSED))))
>  			pRAID_Context->regLockFlags = REGION_TYPE_EXCLUSIVE;
>  		else if (raid->level == 1) {
> @@ -823,13 +822,12 @@ u8 MR_GetPhyParams(struct megasas_instance *instance, u32 ld, u64 stripRow,
>  	u8          physArm, span;
>  	u64         row;
>  	u8	    retval = TRUE;
> -	u8          do_invader = 0;
>  	u64	    *pdBlock = &io_info->pdBlock;
>  	__le16	    *pDevHandle = &io_info->devHandle;
> +	struct fusion_context *fusion;
> +
> +	fusion = instance->ctrl_context;

The same here and other instances (MR_BuildRaidContext) too ?

Tomas

>  
> -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER ||
> -		instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
> -		do_invader = 1;
>  
>  	row =  mega_div64_32(stripRow, raid->rowDataSize);
>  
> @@ -875,7 +873,8 @@ u8 MR_GetPhyParams(struct megasas_instance *instance, u32 ld, u64 stripRow,
>  		/* set dev handle as invalid. */
>  		*pDevHandle = cpu_to_le16(MR_PD_INVALID);
>  		if ((raid->level >= 5) &&
> -			(!do_invader  || (do_invader &&
> +			((fusion->adapter_type == THUNDERBOLT_SERIES)  ||
> +			((fusion->adapter_type == INVADER_SERIES) &&
>  			(raid->regTypeReqOnRead != REGION_TYPE_UNUSED))))
>  			pRAID_Context->regLockFlags = REGION_TYPE_EXCLUSIVE;
>  		else if (raid->level == 1) {
> @@ -909,6 +908,7 @@ MR_BuildRaidContext(struct megasas_instance *instance,
>  		    struct RAID_CONTEXT *pRAID_Context,
>  		    struct MR_DRV_RAID_MAP_ALL *map, u8 **raidLUN)
>  {
> +	struct fusion_context *fusion;
>  	struct MR_LD_RAID  *raid;
>  	u32         ld, stripSize, stripe_mask;
>  	u64         endLba, endStrip, endRow, start_row, start_strip;
> @@ -929,6 +929,7 @@ MR_BuildRaidContext(struct megasas_instance *instance,
>  	isRead = io_info->isRead;
>  	io_info->IoforUnevenSpan = 0;
>  	io_info->start_span	= SPAN_INVALID;
> +	fusion = instance->ctrl_context;
>  
>  	ld = MR_TargetIdToLdGet(ldTgtId, map);
>  	raid = MR_LdRaidGet(ld, map);
> @@ -1092,8 +1093,7 @@ MR_BuildRaidContext(struct megasas_instance *instance,
>  		cpu_to_le16(raid->fpIoTimeoutForLd ?
>  			    raid->fpIoTimeoutForLd :
>  			    map->raidMap.fpPdIoTimeoutSec);
> -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> -		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
> +	if (fusion->adapter_type == INVADER_SERIES)
>  		pRAID_Context->regLockFlags = (isRead) ?
>  			raid->regTypeReqOnRead : raid->regTypeReqOnWrite;
>  	else
> diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c b/drivers/scsi/megaraid/megaraid_sas_fusion.c
> index 1398950..365ec52 100644
> --- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
> +++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
> @@ -653,8 +653,7 @@ megasas_ioc_init_fusion(struct megasas_instance *instance)
>  	drv_ops = (MFI_CAPABILITIES *) &(init_frame->driver_operations);
>  
>  	/* driver support Extended MSIX */
> -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> -		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
> +	if (fusion->adapter_type == INVADER_SERIES)
>  		drv_ops->mfi_capabilities.support_additional_msix = 1;
>  	/* driver supports HA / Remote LUN over Fast Path interface */
>  	drv_ops->mfi_capabilities.support_fp_remote_lun = 1;
> @@ -1288,8 +1287,7 @@ megasas_make_sgl_fusion(struct megasas_instance *instance,
>  
>  	fusion = instance->ctrl_context;
>  
> -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> -		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
> +	if (fusion->adapter_type == INVADER_SERIES) {
>  		struct MPI25_IEEE_SGE_CHAIN64 *sgl_ptr_end = sgl_ptr;
>  		sgl_ptr_end += fusion->max_sge_in_main_msg - 1;
>  		sgl_ptr_end->Flags = 0;
> @@ -1306,11 +1304,9 @@ megasas_make_sgl_fusion(struct megasas_instance *instance,
>  		sgl_ptr->Length = cpu_to_le32(sg_dma_len(os_sgl));
>  		sgl_ptr->Address = cpu_to_le64(sg_dma_address(os_sgl));
>  		sgl_ptr->Flags = 0;
> -		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> -			(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
> +		if (fusion->adapter_type == INVADER_SERIES)
>  			if (i == sge_count - 1)
>  				sgl_ptr->Flags = IEEE_SGE_FLAGS_END_OF_LIST;
> -		}
>  		sgl_ptr++;
>  
>  		sg_processed = i + 1;
> @@ -1319,10 +1315,7 @@ megasas_make_sgl_fusion(struct megasas_instance *instance,
>  		    (sge_count > fusion->max_sge_in_main_msg)) {
>  
>  			struct MPI25_IEEE_SGE_CHAIN64 *sg_chain;
> -			if ((instance->pdev->device ==
> -				PCI_DEVICE_ID_LSI_INVADER) ||
> -				(instance->pdev->device ==
> -				PCI_DEVICE_ID_LSI_FURY)) {
> +			if (fusion->adapter_type == INVADER_SERIES) {
>  				if ((le16_to_cpu(cmd->io_request->IoFlags) &
>  					MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH) !=
>  					MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH)
> @@ -1338,10 +1331,7 @@ megasas_make_sgl_fusion(struct megasas_instance *instance,
>  			sg_chain = sgl_ptr;
>  			/* Prepare chain element */
>  			sg_chain->NextChainOffset = 0;
> -			if ((instance->pdev->device ==
> -				PCI_DEVICE_ID_LSI_INVADER) ||
> -				(instance->pdev->device ==
> -				PCI_DEVICE_ID_LSI_FURY))
> +			if (fusion->adapter_type == INVADER_SERIES)
>  				sg_chain->Flags = IEEE_SGE_FLAGS_CHAIN_ELEMENT;
>  			else
>  				sg_chain->Flags =
> @@ -1658,8 +1648,7 @@ megasas_build_ldio_fusion(struct megasas_instance *instance,
>  		cmd->request_desc->SCSIIO.RequestFlags =
>  			(MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY
>  			 << MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
> -		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> -			(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
> +		if (fusion->adapter_type == INVADER_SERIES) {
>  			if (io_request->RaidContext.regLockFlags ==
>  			    REGION_TYPE_UNUSED)
>  				cmd->request_desc->SCSIIO.RequestFlags =
> @@ -1700,8 +1689,7 @@ megasas_build_ldio_fusion(struct megasas_instance *instance,
>  		cmd->request_desc->SCSIIO.RequestFlags =
>  			(MEGASAS_REQ_DESCRIPT_FLAGS_LD_IO
>  			 << MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
> -		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> -			(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
> +		if (fusion->adapter_type == INVADER_SERIES) {
>  			if (io_request->RaidContext.regLockFlags ==
>  			    REGION_TYPE_UNUSED)
>  				cmd->request_desc->SCSIIO.RequestFlags =
> @@ -1890,8 +1878,7 @@ megasas_build_syspd_fusion(struct megasas_instance *instance,
>  		pRAID_Context->timeoutValue =
>  			cpu_to_le16((os_timeout_value > timeout_limit) ?
>  			timeout_limit : os_timeout_value);
> -		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> -			(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
> +		if (fusion->adapter_type == INVADER_SERIES) {
>  			pRAID_Context->Type = MPI2_TYPE_CUDA;
>  			pRAID_Context->nseg = 0x1;
>  			io_request->IoFlags |=
> @@ -2209,10 +2196,7 @@ complete_cmd_fusion(struct megasas_instance *instance, u32 MSIxIndex)
>  		 * pending to be completed
>  		 */
>  		if (threshold_reply_count >= THRESHOLD_REPLY_COUNT) {
> -			if ((instance->pdev->device ==
> -				PCI_DEVICE_ID_LSI_INVADER) ||
> -				(instance->pdev->device ==
> -				PCI_DEVICE_ID_LSI_FURY))
> +			if (fusion->adapter_type == INVADER_SERIES)
>  				writel(((MSIxIndex & 0x7) << 24) |
>  					fusion->last_reply_idx[MSIxIndex],
>  					instance->reply_post_host_index_addr[MSIxIndex/8]);
> @@ -2228,8 +2212,7 @@ complete_cmd_fusion(struct megasas_instance *instance, u32 MSIxIndex)
>  		return IRQ_NONE;
>  
>  	wmb();
> -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> -		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
> +	if (fusion->adapter_type == INVADER_SERIES)
>  		writel(((MSIxIndex & 0x7) << 24) |
>  			fusion->last_reply_idx[MSIxIndex],
>  			instance->reply_post_host_index_addr[MSIxIndex/8]);
> @@ -2352,8 +2335,7 @@ build_mpt_mfi_pass_thru(struct megasas_instance *instance,
>  
>  	io_req = cmd->io_request;
>  
> -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> -		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
> +	if (fusion->adapter_type == INVADER_SERIES) {
>  		struct MPI25_IEEE_SGE_CHAIN64 *sgl_ptr_end =
>  			(struct MPI25_IEEE_SGE_CHAIN64 *)&io_req->SGL;
>  		sgl_ptr_end += fusion->max_sge_in_main_msg - 1;
> diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.h b/drivers/scsi/megaraid/megaraid_sas_fusion.h
> index 7d89c1c..473005c 100644
> --- a/drivers/scsi/megaraid/megaraid_sas_fusion.h
> +++ b/drivers/scsi/megaraid/megaraid_sas_fusion.h
> @@ -96,6 +96,11 @@ enum MR_RAID_FLAGS_IO_SUB_TYPE {
>  #define THRESHOLD_REPLY_COUNT 50
>  #define JBOD_MAPS_COUNT	2
>  
> +enum MR_FUSION_ADAPTER_TYPE {
> +	THUNDERBOLT_SERIES = 0,
> +	INVADER_SERIES = 1,
> +};
> +
>  /*
>   * Raid Context structure which describes MegaRAID specific IO Parameters
>   * This resides at offset 0x60 where the SGL normally starts in MPT IO Frames
> @@ -857,6 +862,7 @@ struct fusion_context {
>  	u8 fast_path_io;
>  	struct LD_LOAD_BALANCE_INFO load_balance_info[MAX_LOGICAL_DRIVES_EXT];
>  	LD_SPAN_INFO log_to_span[MAX_LOGICAL_DRIVES_EXT];
> +	u8 adapter_type;
>  };
>  
>  union desc_value {

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Sumit Saxena Oct. 19, 2015, 5:48 a.m. UTC | #2
> -----Original Message-----
> From: Tomas Henzl [mailto:thenzl@redhat.com]
> Sent: Friday, October 16, 2015 8:10 PM
> To: sumit.saxena@avagotech.com; linux-scsi@vger.kernel.org;
> martin.petersen@oracle.com; hch@infradead.org; jbottomley@parallels.com;
> kashyap.desai@avagotech.com; kiran-kumar.kasturi@avagotech.com
> Cc: uday.lingala@avagotech.com
> Subject: Re: [PATCH 02/12] megaraid_sas : Code optimization- remove PCI
Ids
> based checks
>
> On 15.10.2015 10:09, sumit.saxena@avagotech.com wrote:
> > Code optimization: remove PCI id based checks and instead of those use
> instance->ctrl_context to make call whether controller is MFI based OR
fusion
> adapter.
> > fusion adapters further are also divided in two categories-
1)THUNDERBOLT
> SERIES and 2)INVADER SERIES.
> >
> > Signed-off-by: Sumit Saxena <sumit.saxena@avagotech.com>
> > Signed-off-by: Kashyap Desai <kashyap.desai@avagotech.com>
> > ---
> >  drivers/scsi/megaraid/megaraid_sas_base.c   |  152
++++++++------------------
> >  drivers/scsi/megaraid/megaraid_sas_fp.c     |   24 ++--
> >  drivers/scsi/megaraid/megaraid_sas_fusion.c |   40 ++-----
> >  drivers/scsi/megaraid/megaraid_sas_fusion.h |    6 +
> >  4 files changed, 76 insertions(+), 146 deletions(-)
> >
> > diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c
> > b/drivers/scsi/megaraid/megaraid_sas_base.c
> > index d00d494..bc2bb13 100644
> > --- a/drivers/scsi/megaraid/megaraid_sas_base.c
> > +++ b/drivers/scsi/megaraid/megaraid_sas_base.c
> > @@ -1797,10 +1797,7 @@ void megaraid_sas_kill_hba(struct
> megasas_instance *instance)
> >  	msleep(1000);
> >  	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
> >  		(instance->pdev->device ==
> PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
> > -		(instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
> > -		(instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
> > -		(instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> > -		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
> > +		(instance->ctrl_context)) {
> >  		writel(MFI_STOP_ADP, &instance->reg_set->doorbell);
> >  		/* Flush */
> >  		readl(&instance->reg_set->doorbell);
> > @@ -2567,10 +2564,7 @@ static int megasas_reset_bus_host(struct
> scsi_cmnd *scmd)
> >  	/*
> >  	 * First wait for all commands to complete
> >  	 */
> > -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
> > -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
> > -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> > -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
> > +	if (instance->ctrl_context)
> >  		ret = megasas_reset_fusion(scmd->device->host, 1);
> >  	else
> >  		ret = megasas_generic_reset(scmd);
> > @@ -3431,22 +3425,14 @@ megasas_transition_to_ready(struct
> megasas_instance *instance, int ocr)
> >  				PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
> >  				(instance->pdev->device ==
> >  				 PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
> > -				(instance->pdev->device ==
> > -				PCI_DEVICE_ID_LSI_FUSION) ||
> > -				(instance->pdev->device ==
> > -				PCI_DEVICE_ID_LSI_PLASMA) ||
> > -				(instance->pdev->device ==
> > -				PCI_DEVICE_ID_LSI_INVADER) ||
> > -				(instance->pdev->device ==
> > -				PCI_DEVICE_ID_LSI_FURY)) {
> > +				(instance->ctrl_context))
> >  				writel(
> >
> MFI_INIT_CLEAR_HANDSHAKE|MFI_INIT_HOTPLUG,
> >  				  &instance->reg_set->doorbell);
> > -			} else {
> > +			else
> >  				writel(
> >
> MFI_INIT_CLEAR_HANDSHAKE|MFI_INIT_HOTPLUG,
> >  					&instance->reg_set-
> >inbound_doorbell);
> > -			}
> >
> >  			max_wait = MEGASAS_RESET_WAIT_TIME;
> >  			cur_state = MFI_STATE_WAIT_HANDSHAKE; @@ -
> 3457,17 +3443,10 @@
> > megasas_transition_to_ready(struct megasas_instance *instance, int
ocr)
> >  			     PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
> >  				(instance->pdev->device ==
> >  				 PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
> > -			    (instance->pdev->device ==
> > -			     PCI_DEVICE_ID_LSI_FUSION) ||
> > -			    (instance->pdev->device ==
> > -			     PCI_DEVICE_ID_LSI_PLASMA) ||
> > -			    (instance->pdev->device ==
> > -			     PCI_DEVICE_ID_LSI_INVADER) ||
> > -			    (instance->pdev->device ==
> > -			     PCI_DEVICE_ID_LSI_FURY)) {
> > +				(instance->ctrl_context))
> >  				writel(MFI_INIT_HOTPLUG,
> >  				       &instance->reg_set->doorbell);
> > -			} else
> > +			else
> >  				writel(MFI_INIT_HOTPLUG,
> >  					&instance->reg_set-
> >inbound_doorbell);
> >
> > @@ -3484,24 +3463,11 @@ megasas_transition_to_ready(struct
> megasas_instance *instance, int ocr)
> >  				PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
> >  				(instance->pdev->device ==
> >  				PCI_DEVICE_ID_LSI_SAS0071SKINNY)  ||
> > -				(instance->pdev->device
> > -					== PCI_DEVICE_ID_LSI_FUSION) ||
> > -				(instance->pdev->device
> > -					== PCI_DEVICE_ID_LSI_PLASMA) ||
> > -				(instance->pdev->device
> > -					== PCI_DEVICE_ID_LSI_INVADER) ||
> > -				(instance->pdev->device
> > -					== PCI_DEVICE_ID_LSI_FURY)) {
> > +				(instance->ctrl_context)) {
> >  				writel(MFI_RESET_FLAGS,
> >  					&instance->reg_set->doorbell);
> > -				if ((instance->pdev->device ==
> > -					PCI_DEVICE_ID_LSI_FUSION) ||
> > -					(instance->pdev->device ==
> > -					PCI_DEVICE_ID_LSI_PLASMA) ||
> > -					(instance->pdev->device ==
> > -					PCI_DEVICE_ID_LSI_INVADER) ||
> > -					(instance->pdev->device ==
> > -					PCI_DEVICE_ID_LSI_FURY)) {
> > +
> > +				if (instance->ctrl_context) {
> >  					for (i = 0; i < (10 * 1000); i +=
20) {
> >  						if (readl(
> >  							    &instance->
> > @@ -3722,11 +3688,7 @@ static int megasas_create_frame_pool(struct
> megasas_instance *instance)
> >  		memset(cmd->frame, 0, total_sz);
> >  		cmd->frame->io.context = cpu_to_le32(cmd->index);
> >  		cmd->frame->io.pad_0 = 0;
> > -		if ((instance->pdev->device != PCI_DEVICE_ID_LSI_FUSION)
&&
> > -		    (instance->pdev->device != PCI_DEVICE_ID_LSI_PLASMA)
&&
> > -		    (instance->pdev->device != PCI_DEVICE_ID_LSI_INVADER)
&&
> > -			(instance->pdev->device != PCI_DEVICE_ID_LSI_FURY)
> &&
> > -		    (reset_devices))
> > +		if (!instance->ctrl_context && reset_devices)
> >  			cmd->frame->hdr.cmd = MFI_CMD_INVALID;
> >  	}
> >
> > @@ -4639,6 +4601,9 @@ static int megasas_init_fw(struct
megasas_instance
> *instance)
> >  	unsigned long bar_list;
> >  	int i, loop, fw_msix_count = 0;
> >  	struct IOV_111 *iovPtr;
> > +	struct fusion_context *fusion;
> > +
> > +	fusion = instance->ctrl_context;
> >
> >  	/* Find first memory bar */
> >  	bar_list = pci_select_bars(instance->pdev, IORESOURCE_MEM); @@
> > -4716,37 +4681,32 @@ static int megasas_init_fw(struct
megasas_instance
> *instance)
> >  		scratch_pad_2 = readl
> >  			(&instance->reg_set->outbound_scratch_pad_2);
> >  		/* Check max MSI-X vectors */
> > -		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION)
||
> > -		    (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA))
{
> > -			instance->msix_vectors = (scratch_pad_2
> > -				& MR_MAX_REPLY_QUEUES_OFFSET) + 1;
> > -			fw_msix_count = instance->msix_vectors;
> > -			if (msix_vectors)
> > -				instance->msix_vectors =
> > -					min(msix_vectors,
> > -					    instance->msix_vectors);
> > -		} else if ((instance->pdev->device ==
> PCI_DEVICE_ID_LSI_INVADER)
> > -			|| (instance->pdev->device ==
> PCI_DEVICE_ID_LSI_FURY)) {
> > -			/* Invader/Fury supports more than 8 MSI-X */
> > -			instance->msix_vectors = ((scratch_pad_2
> > -				& MR_MAX_REPLY_QUEUES_EXT_OFFSET)
> > -				>>
> MR_MAX_REPLY_QUEUES_EXT_OFFSET_SHIFT) + 1;
> > -			fw_msix_count = instance->msix_vectors;
> > -			/* Save 1-15 reply post index address to local
memory
> > -			 * Index 0 is already saved from reg offset
> > -			 * MPI2_REPLY_POST_HOST_INDEX_OFFSET
> > -			 */
> > -			for (loop = 1; loop < MR_MAX_MSIX_REG_ARRAY;
> loop++) {
> > -				instance->reply_post_host_index_addr[loop]
=
> > -					(u32 __iomem *)
> > -					((u8 __iomem *)instance->reg_set +
> > -
> 	MPI2_SUP_REPLY_POST_HOST_INDEX_OFFSET
> > -					+ (loop * 0x10));
> > +		if (fusion) {
> > +			if (fusion->adapter_type == THUNDERBOLT_SERIES) {
> /* Thunderbolt Series*/
> > +				instance->msix_vectors = (scratch_pad_2
> > +					& MR_MAX_REPLY_QUEUES_OFFSET)
> + 1;
> > +				fw_msix_count = instance->msix_vectors;
> > +			} else { /* Invader series supports more than 8
MSI-x
> vectors*/
> > +				instance->msix_vectors = ((scratch_pad_2
> > +					&
> MR_MAX_REPLY_QUEUES_EXT_OFFSET)
> > +					>>
> MR_MAX_REPLY_QUEUES_EXT_OFFSET_SHIFT) + 1;
> > +				fw_msix_count = instance->msix_vectors;
> > +				/* Save 1-15 reply post index address to
local
> memory
> > +				 * Index 0 is already saved from reg
offset
> > +				 * MPI2_REPLY_POST_HOST_INDEX_OFFSET
> > +				 */
> > +				for (loop = 1; loop <
> MR_MAX_MSIX_REG_ARRAY; loop++) {
> > +					instance-
> >reply_post_host_index_addr[loop] =
> > +						(u32 __iomem *)
> > +						((u8 __iomem *)instance-
> >reg_set +
> > +
> 	MPI2_SUP_REPLY_POST_HOST_INDEX_OFFSET
> > +						+ (loop * 0x10));
> > +				}
> >  			}
> >  			if (msix_vectors)
> >  				instance->msix_vectors = min(msix_vectors,
> >  					instance->msix_vectors);
> > -		} else
> > +		} else /* MFI adapters */
> >  			instance->msix_vectors = 1;
> >  		/* Don't bother allocating more MSI-X vectors than cpus */
> >  		instance->msix_vectors = min(instance->msix_vectors, @@ -
> 5241,10
> > +5201,7 @@ static int megasas_io_attach(struct megasas_instance
*instance)
> >  	host->max_cmd_len = 16;
> >
> >  	/* Fusion only supports host reset */
> > -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
> > -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
> > -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> > -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
> > +	if (instance->ctrl_context) {
> >  		host->hostt->eh_device_reset_handler = NULL;
> >  		host->hostt->eh_bus_reset_handler = NULL;
> >  	}
> > @@ -5380,6 +5337,11 @@ static int megasas_probe_one(struct pci_dev
> *pdev,
> >  		fusion = instance->ctrl_context;
> >  		memset(fusion, 0,
> >  			((1 << PAGE_SHIFT) <<
instance->ctrl_context_pages));
> > +		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION)
||
> > +			(instance->pdev->device ==
> PCI_DEVICE_ID_LSI_PLASMA))
> > +			fusion->adapter_type = THUNDERBOLT_SERIES;
> > +		else
> > +			fusion->adapter_type = INVADER_SERIES;
> >  	}
> >  	break;
> >  	default: /* For all other supported controllers */ @@ -5482,10
> > +5444,7 @@ static int megasas_probe_one(struct pci_dev *pdev,
> >  	instance->disableOnlineCtrlReset = 1;
> >  	instance->UnevenSpanSupport = 0;
> >
> > -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
> > -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
> > -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> > -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
> > +	if (instance->ctrl_context) {
> >  		INIT_WORK(&instance->work_init, megasas_fusion_ocr_wq);
> >  		INIT_WORK(&instance->crash_init,
> megasas_fusion_crash_dump_wq);
> >  	} else
> > @@ -5565,10 +5524,7 @@ fail_io_attach:
> >  	instance->instancet->disable_intr(instance);
> >  	megasas_destroy_irqs(instance);
> >
> > -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
> > -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
> > -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> > -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
> > +	if (instance->ctrl_context)
> >  		megasas_release_fusion(instance);
> >  	else
> >  		megasas_release_mfi(instance);
> > @@ -5781,12 +5737,7 @@ megasas_resume(struct pci_dev *pdev)
> >  				  instance->msix_vectors))
> >  		goto fail_reenable_msix;
> >
> > -	switch (instance->pdev->device) {
> > -	case PCI_DEVICE_ID_LSI_FUSION:
> > -	case PCI_DEVICE_ID_LSI_PLASMA:
> > -	case PCI_DEVICE_ID_LSI_INVADER:
> > -	case PCI_DEVICE_ID_LSI_FURY:
> > -	{
> > +	if (instance->ctrl_context) {
> >  		megasas_reset_reply_desc(instance);
> >  		if (megasas_ioc_init_fusion(instance)) {
> >  			megasas_free_cmds(instance);
> > @@ -5795,14 +5746,11 @@ megasas_resume(struct pci_dev *pdev)
> >  		}
> >  		if (!megasas_get_map_info(instance))
> >  			megasas_sync_map_info(instance);
> > -	}
> > -	break;
> > -	default:
> > +	} else {
> >  		*instance->producer = 0;
> >  		*instance->consumer = 0;
> >  		if (megasas_issue_init_mfi(instance))
> >  			goto fail_init_mfi;
> > -		break;
> >  	}
> >
> >  	tasklet_init(&instance->isr_tasklet, instance->instancet->tasklet,
> > @@ -5924,11 +5872,7 @@ static void megasas_detach_one(struct pci_dev
> *pdev)
> >  	if (instance->msix_vectors)
> >  		pci_disable_msix(instance->pdev);
> >
> > -	switch (instance->pdev->device) {
> > -	case PCI_DEVICE_ID_LSI_FUSION:
> > -	case PCI_DEVICE_ID_LSI_PLASMA:
> > -	case PCI_DEVICE_ID_LSI_INVADER:
> > -	case PCI_DEVICE_ID_LSI_FURY:
> > +	if (instance->ctrl_context) {
> >  		megasas_release_fusion(instance);
> >  			pd_seq_map_sz = sizeof(struct
> MR_PD_CFG_SEQ_NUM_SYNC) +
> >  				(sizeof(struct MR_PD_CFG_SEQ) *
> > @@ -5950,8 +5894,7 @@ static void megasas_detach_one(struct pci_dev
> *pdev)
> >  		}
> >  		free_pages((ulong)instance->ctrl_context,
> >  			instance->ctrl_context_pages);
> > -		break;
> > -	default:
> > +	} else {
> >  		megasas_release_mfi(instance);
> >  		pci_free_consistent(pdev, sizeof(u32),
> >  				    instance->producer,
> > @@ -5959,7 +5902,6 @@ static void megasas_detach_one(struct pci_dev
> *pdev)
> >  		pci_free_consistent(pdev, sizeof(u32),
> >  				    instance->consumer,
> >  				    instance->consumer_h);
> > -		break;
> >  	}
> >
> >  	kfree(instance->ctrl_info);
> > diff --git a/drivers/scsi/megaraid/megaraid_sas_fp.c
> > b/drivers/scsi/megaraid/megaraid_sas_fp.c
> > index be57b18..ce5b832 100644
> > --- a/drivers/scsi/megaraid/megaraid_sas_fp.c
> > +++ b/drivers/scsi/megaraid/megaraid_sas_fp.c
> > @@ -741,14 +741,12 @@ static u8 mr_spanset_get_phy_params(struct
> megasas_instance *instance, u32 ld,
> >  	u8      physArm, span;
> >  	u64     row;
> >  	u8	retval = TRUE;
> > -	u8	do_invader = 0;
> >  	u64	*pdBlock = &io_info->pdBlock;
> >  	__le16	*pDevHandle = &io_info->devHandle;
> >  	u32	logArm, rowMod, armQ, arm;
> > +	struct fusion_context *fusion;
> >
> > -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER ||
> > -		instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
> > -		do_invader = 1;
> > +	fusion = instance->ctrl_context;
> >
> >  	/*Get row and span from io_info for Uneven Span IO.*/
> >  	row	    = io_info->start_row;
> > @@ -779,7 +777,8 @@ static u8 mr_spanset_get_phy_params(struct
> megasas_instance *instance, u32 ld,
> >  	else {
> >  		*pDevHandle = cpu_to_le16(MR_PD_INVALID);
> >  		if ((raid->level >= 5) &&
> > -			(!do_invader  || (do_invader &&
> > +			((fusion->adapter_type == THUNDERBOLT_SERIES)  ||
> > +			((fusion->adapter_type == INVADER_SERIES) &&
>
> Isn't it possible that fusion is NULL here?

This function will be called for fusion adapters only so fusion should not
be NULL here.
>
> >  			(raid->regTypeReqOnRead !=
> REGION_TYPE_UNUSED))))
> >  			pRAID_Context->regLockFlags =
> REGION_TYPE_EXCLUSIVE;
> >  		else if (raid->level == 1) {
> > @@ -823,13 +822,12 @@ u8 MR_GetPhyParams(struct megasas_instance
> *instance, u32 ld, u64 stripRow,
> >  	u8          physArm, span;
> >  	u64         row;
> >  	u8	    retval = TRUE;
> > -	u8          do_invader = 0;
> >  	u64	    *pdBlock = &io_info->pdBlock;
> >  	__le16	    *pDevHandle = &io_info->devHandle;
> > +	struct fusion_context *fusion;
> > +
> > +	fusion = instance->ctrl_context;
>
> The same here and other instances (MR_BuildRaidContext) too ?

Same as above..
>
> Tomas
>
> >
> > -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER ||
> > -		instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
> > -		do_invader = 1;
> >
> >  	row =  mega_div64_32(stripRow, raid->rowDataSize);
> >
> > @@ -875,7 +873,8 @@ u8 MR_GetPhyParams(struct megasas_instance
> *instance, u32 ld, u64 stripRow,
> >  		/* set dev handle as invalid. */
> >  		*pDevHandle = cpu_to_le16(MR_PD_INVALID);
> >  		if ((raid->level >= 5) &&
> > -			(!do_invader  || (do_invader &&
> > +			((fusion->adapter_type == THUNDERBOLT_SERIES)  ||
> > +			((fusion->adapter_type == INVADER_SERIES) &&
> >  			(raid->regTypeReqOnRead !=
> REGION_TYPE_UNUSED))))
> >  			pRAID_Context->regLockFlags =
> REGION_TYPE_EXCLUSIVE;
> >  		else if (raid->level == 1) {
> > @@ -909,6 +908,7 @@ MR_BuildRaidContext(struct megasas_instance
> *instance,
> >  		    struct RAID_CONTEXT *pRAID_Context,
> >  		    struct MR_DRV_RAID_MAP_ALL *map, u8 **raidLUN)  {
> > +	struct fusion_context *fusion;
> >  	struct MR_LD_RAID  *raid;
> >  	u32         ld, stripSize, stripe_mask;
> >  	u64         endLba, endStrip, endRow, start_row, start_strip;
> > @@ -929,6 +929,7 @@ MR_BuildRaidContext(struct megasas_instance
> *instance,
> >  	isRead = io_info->isRead;
> >  	io_info->IoforUnevenSpan = 0;
> >  	io_info->start_span	= SPAN_INVALID;
> > +	fusion = instance->ctrl_context;
> >
> >  	ld = MR_TargetIdToLdGet(ldTgtId, map);
> >  	raid = MR_LdRaidGet(ld, map);
> > @@ -1092,8 +1093,7 @@ MR_BuildRaidContext(struct megasas_instance
> *instance,
> >  		cpu_to_le16(raid->fpIoTimeoutForLd ?
> >  			    raid->fpIoTimeoutForLd :
> >  			    map->raidMap.fpPdIoTimeoutSec);
> > -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> > -		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
> > +	if (fusion->adapter_type == INVADER_SERIES)
> >  		pRAID_Context->regLockFlags = (isRead) ?
> >  			raid->regTypeReqOnRead : raid->regTypeReqOnWrite;
> >  	else
> > diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c
> > b/drivers/scsi/megaraid/megaraid_sas_fusion.c
> > index 1398950..365ec52 100644
> > --- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
> > +++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
> > @@ -653,8 +653,7 @@ megasas_ioc_init_fusion(struct megasas_instance
> *instance)
> >  	drv_ops = (MFI_CAPABILITIES *) &(init_frame->driver_operations);
> >
> >  	/* driver support Extended MSIX */
> > -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> > -		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
> > +	if (fusion->adapter_type == INVADER_SERIES)
> >  		drv_ops->mfi_capabilities.support_additional_msix = 1;
> >  	/* driver supports HA / Remote LUN over Fast Path interface */
> >  	drv_ops->mfi_capabilities.support_fp_remote_lun = 1; @@ -1288,8
> > +1287,7 @@ megasas_make_sgl_fusion(struct megasas_instance *instance,
> >
> >  	fusion = instance->ctrl_context;
> >
> > -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> > -		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
> > +	if (fusion->adapter_type == INVADER_SERIES) {
> >  		struct MPI25_IEEE_SGE_CHAIN64 *sgl_ptr_end = sgl_ptr;
> >  		sgl_ptr_end += fusion->max_sge_in_main_msg - 1;
> >  		sgl_ptr_end->Flags = 0;
> > @@ -1306,11 +1304,9 @@ megasas_make_sgl_fusion(struct
> megasas_instance *instance,
> >  		sgl_ptr->Length = cpu_to_le32(sg_dma_len(os_sgl));
> >  		sgl_ptr->Address = cpu_to_le64(sg_dma_address(os_sgl));
> >  		sgl_ptr->Flags = 0;
> > -		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER)
||
> > -			(instance->pdev->device ==
PCI_DEVICE_ID_LSI_FURY))
> {
> > +		if (fusion->adapter_type == INVADER_SERIES)
> >  			if (i == sge_count - 1)
> >  				sgl_ptr->Flags =
> IEEE_SGE_FLAGS_END_OF_LIST;
> > -		}
> >  		sgl_ptr++;
> >
> >  		sg_processed = i + 1;
> > @@ -1319,10 +1315,7 @@ megasas_make_sgl_fusion(struct
> megasas_instance *instance,
> >  		    (sge_count > fusion->max_sge_in_main_msg)) {
> >
> >  			struct MPI25_IEEE_SGE_CHAIN64 *sg_chain;
> > -			if ((instance->pdev->device ==
> > -				PCI_DEVICE_ID_LSI_INVADER) ||
> > -				(instance->pdev->device ==
> > -				PCI_DEVICE_ID_LSI_FURY)) {
> > +			if (fusion->adapter_type == INVADER_SERIES) {
> >  				if ((le16_to_cpu(cmd->io_request->IoFlags)
&
> >
> 	MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH) !=
> >
> 	MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH)
> > @@ -1338,10 +1331,7 @@ megasas_make_sgl_fusion(struct
> megasas_instance *instance,
> >  			sg_chain = sgl_ptr;
> >  			/* Prepare chain element */
> >  			sg_chain->NextChainOffset = 0;
> > -			if ((instance->pdev->device ==
> > -				PCI_DEVICE_ID_LSI_INVADER) ||
> > -				(instance->pdev->device ==
> > -				PCI_DEVICE_ID_LSI_FURY))
> > +			if (fusion->adapter_type == INVADER_SERIES)
> >  				sg_chain->Flags =
> IEEE_SGE_FLAGS_CHAIN_ELEMENT;
> >  			else
> >  				sg_chain->Flags =
> > @@ -1658,8 +1648,7 @@ megasas_build_ldio_fusion(struct
> megasas_instance *instance,
> >  		cmd->request_desc->SCSIIO.RequestFlags =
> >  			(MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY
> >  			 << MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
> > -		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER)
||
> > -			(instance->pdev->device ==
PCI_DEVICE_ID_LSI_FURY))
> {
> > +		if (fusion->adapter_type == INVADER_SERIES) {
> >  			if (io_request->RaidContext.regLockFlags ==
> >  			    REGION_TYPE_UNUSED)
> >  				cmd->request_desc->SCSIIO.RequestFlags =
> @@ -1700,8 +1689,7 @@
> > megasas_build_ldio_fusion(struct megasas_instance *instance,
> >  		cmd->request_desc->SCSIIO.RequestFlags =
> >  			(MEGASAS_REQ_DESCRIPT_FLAGS_LD_IO
> >  			 << MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
> > -		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER)
||
> > -			(instance->pdev->device ==
PCI_DEVICE_ID_LSI_FURY))
> {
> > +		if (fusion->adapter_type == INVADER_SERIES) {
> >  			if (io_request->RaidContext.regLockFlags ==
> >  			    REGION_TYPE_UNUSED)
> >  				cmd->request_desc->SCSIIO.RequestFlags =
> @@ -1890,8 +1878,7 @@
> > megasas_build_syspd_fusion(struct megasas_instance *instance,
> >  		pRAID_Context->timeoutValue =
> >  			cpu_to_le16((os_timeout_value > timeout_limit) ?
> >  			timeout_limit : os_timeout_value);
> > -		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER)
||
> > -			(instance->pdev->device ==
PCI_DEVICE_ID_LSI_FURY))
> {
> > +		if (fusion->adapter_type == INVADER_SERIES) {
> >  			pRAID_Context->Type = MPI2_TYPE_CUDA;
> >  			pRAID_Context->nseg = 0x1;
> >  			io_request->IoFlags |=
> > @@ -2209,10 +2196,7 @@ complete_cmd_fusion(struct megasas_instance
> *instance, u32 MSIxIndex)
> >  		 * pending to be completed
> >  		 */
> >  		if (threshold_reply_count >= THRESHOLD_REPLY_COUNT) {
> > -			if ((instance->pdev->device ==
> > -				PCI_DEVICE_ID_LSI_INVADER) ||
> > -				(instance->pdev->device ==
> > -				PCI_DEVICE_ID_LSI_FURY))
> > +			if (fusion->adapter_type == INVADER_SERIES)
> >  				writel(((MSIxIndex & 0x7) << 24) |
> >  					fusion->last_reply_idx[MSIxIndex],
> >  					instance-
> >reply_post_host_index_addr[MSIxIndex/8]);
> > @@ -2228,8 +2212,7 @@ complete_cmd_fusion(struct megasas_instance
> *instance, u32 MSIxIndex)
> >  		return IRQ_NONE;
> >
> >  	wmb();
> > -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> > -		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
> > +	if (fusion->adapter_type == INVADER_SERIES)
> >  		writel(((MSIxIndex & 0x7) << 24) |
> >  			fusion->last_reply_idx[MSIxIndex],
> >
instance->reply_post_host_index_addr[MSIxIndex/8]);
> > @@ -2352,8 +2335,7 @@ build_mpt_mfi_pass_thru(struct megasas_instance
> > *instance,
> >
> >  	io_req = cmd->io_request;
> >
> > -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
> > -		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
> > +	if (fusion->adapter_type == INVADER_SERIES) {
> >  		struct MPI25_IEEE_SGE_CHAIN64 *sgl_ptr_end =
> >  			(struct MPI25_IEEE_SGE_CHAIN64 *)&io_req->SGL;
> >  		sgl_ptr_end += fusion->max_sge_in_main_msg - 1; diff --git
> > a/drivers/scsi/megaraid/megaraid_sas_fusion.h
> > b/drivers/scsi/megaraid/megaraid_sas_fusion.h
> > index 7d89c1c..473005c 100644
> > --- a/drivers/scsi/megaraid/megaraid_sas_fusion.h
> > +++ b/drivers/scsi/megaraid/megaraid_sas_fusion.h
> > @@ -96,6 +96,11 @@ enum MR_RAID_FLAGS_IO_SUB_TYPE {  #define
> > THRESHOLD_REPLY_COUNT 50
> >  #define JBOD_MAPS_COUNT	2
> >
> > +enum MR_FUSION_ADAPTER_TYPE {
> > +	THUNDERBOLT_SERIES = 0,
> > +	INVADER_SERIES = 1,
> > +};
> > +
> >  /*
> >   * Raid Context structure which describes MegaRAID specific IO
Parameters
> >   * This resides at offset 0x60 where the SGL normally starts in MPT
> > IO Frames @@ -857,6 +862,7 @@ struct fusion_context {
> >  	u8 fast_path_io;
> >  	struct LD_LOAD_BALANCE_INFO
> load_balance_info[MAX_LOGICAL_DRIVES_EXT];
> >  	LD_SPAN_INFO log_to_span[MAX_LOGICAL_DRIVES_EXT];
> > +	u8 adapter_type;
> >  };
> >
> >  union desc_value {
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Tomas Henzl Oct. 19, 2015, 11:59 a.m. UTC | #3
On 19.10.2015 07:48, Sumit Saxena wrote:
>> -----Original Message-----
>> From: Tomas Henzl [mailto:thenzl@redhat.com]
>> Sent: Friday, October 16, 2015 8:10 PM
>> To: sumit.saxena@avagotech.com; linux-scsi@vger.kernel.org;
>> martin.petersen@oracle.com; hch@infradead.org; jbottomley@parallels.com;
>> kashyap.desai@avagotech.com; kiran-kumar.kasturi@avagotech.com
>> Cc: uday.lingala@avagotech.com
>> Subject: Re: [PATCH 02/12] megaraid_sas : Code optimization- remove PCI
> Ids
>> based checks
>>
>> On 15.10.2015 10:09, sumit.saxena@avagotech.com wrote:
>>> Code optimization: remove PCI id based checks and instead of those use
>> instance->ctrl_context to make call whether controller is MFI based OR
> fusion
>> adapter.
>>> fusion adapters further are also divided in two categories-
> 1)THUNDERBOLT
>> SERIES and 2)INVADER SERIES.
>>> Signed-off-by: Sumit Saxena <sumit.saxena@avagotech.com>
>>> Signed-off-by: Kashyap Desai <kashyap.desai@avagotech.com>
>>> ---
>>>  drivers/scsi/megaraid/megaraid_sas_base.c   |  152
> ++++++++------------------
>>>  drivers/scsi/megaraid/megaraid_sas_fp.c     |   24 ++--
>>>  drivers/scsi/megaraid/megaraid_sas_fusion.c |   40 ++-----
>>>  drivers/scsi/megaraid/megaraid_sas_fusion.h |    6 +
>>>  4 files changed, 76 insertions(+), 146 deletions(-)
>>>
>>> diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c
>>> b/drivers/scsi/megaraid/megaraid_sas_base.c
>>> index d00d494..bc2bb13 100644
>>> --- a/drivers/scsi/megaraid/megaraid_sas_base.c
>>> +++ b/drivers/scsi/megaraid/megaraid_sas_base.c
>>> @@ -1797,10 +1797,7 @@ void megaraid_sas_kill_hba(struct
>> megasas_instance *instance)
>>>  	msleep(1000);
>>>  	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
>>>  		(instance->pdev->device ==
>> PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
>>> -		(instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
>>> -		(instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
>>> -		(instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
>>> -		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
>>> +		(instance->ctrl_context)) {
>>>  		writel(MFI_STOP_ADP, &instance->reg_set->doorbell);
>>>  		/* Flush */
>>>  		readl(&instance->reg_set->doorbell);
>>> @@ -2567,10 +2564,7 @@ static int megasas_reset_bus_host(struct
>> scsi_cmnd *scmd)
>>>  	/*
>>>  	 * First wait for all commands to complete
>>>  	 */
>>> -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
>>> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
>>> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
>>> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
>>> +	if (instance->ctrl_context)
>>>  		ret = megasas_reset_fusion(scmd->device->host, 1);
>>>  	else
>>>  		ret = megasas_generic_reset(scmd);
>>> @@ -3431,22 +3425,14 @@ megasas_transition_to_ready(struct
>> megasas_instance *instance, int ocr)
>>>  				PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
>>>  				(instance->pdev->device ==
>>>  				 PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
>>> -				(instance->pdev->device ==
>>> -				PCI_DEVICE_ID_LSI_FUSION) ||
>>> -				(instance->pdev->device ==
>>> -				PCI_DEVICE_ID_LSI_PLASMA) ||
>>> -				(instance->pdev->device ==
>>> -				PCI_DEVICE_ID_LSI_INVADER) ||
>>> -				(instance->pdev->device ==
>>> -				PCI_DEVICE_ID_LSI_FURY)) {
>>> +				(instance->ctrl_context))
>>>  				writel(
>>>
>> MFI_INIT_CLEAR_HANDSHAKE|MFI_INIT_HOTPLUG,
>>>  				  &instance->reg_set->doorbell);
>>> -			} else {
>>> +			else
>>>  				writel(
>>>
>> MFI_INIT_CLEAR_HANDSHAKE|MFI_INIT_HOTPLUG,
>>>  					&instance->reg_set-
>>> inbound_doorbell);
>>> -			}
>>>
>>>  			max_wait = MEGASAS_RESET_WAIT_TIME;
>>>  			cur_state = MFI_STATE_WAIT_HANDSHAKE; @@ -
>> 3457,17 +3443,10 @@
>>> megasas_transition_to_ready(struct megasas_instance *instance, int
> ocr)
>>>  			     PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
>>>  				(instance->pdev->device ==
>>>  				 PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
>>> -			    (instance->pdev->device ==
>>> -			     PCI_DEVICE_ID_LSI_FUSION) ||
>>> -			    (instance->pdev->device ==
>>> -			     PCI_DEVICE_ID_LSI_PLASMA) ||
>>> -			    (instance->pdev->device ==
>>> -			     PCI_DEVICE_ID_LSI_INVADER) ||
>>> -			    (instance->pdev->device ==
>>> -			     PCI_DEVICE_ID_LSI_FURY)) {
>>> +				(instance->ctrl_context))
>>>  				writel(MFI_INIT_HOTPLUG,
>>>  				       &instance->reg_set->doorbell);
>>> -			} else
>>> +			else
>>>  				writel(MFI_INIT_HOTPLUG,
>>>  					&instance->reg_set-
>>> inbound_doorbell);
>>>
>>> @@ -3484,24 +3463,11 @@ megasas_transition_to_ready(struct
>> megasas_instance *instance, int ocr)
>>>  				PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
>>>  				(instance->pdev->device ==
>>>  				PCI_DEVICE_ID_LSI_SAS0071SKINNY)  ||
>>> -				(instance->pdev->device
>>> -					== PCI_DEVICE_ID_LSI_FUSION) ||
>>> -				(instance->pdev->device
>>> -					== PCI_DEVICE_ID_LSI_PLASMA) ||
>>> -				(instance->pdev->device
>>> -					== PCI_DEVICE_ID_LSI_INVADER) ||
>>> -				(instance->pdev->device
>>> -					== PCI_DEVICE_ID_LSI_FURY)) {
>>> +				(instance->ctrl_context)) {
>>>  				writel(MFI_RESET_FLAGS,
>>>  					&instance->reg_set->doorbell);
>>> -				if ((instance->pdev->device ==
>>> -					PCI_DEVICE_ID_LSI_FUSION) ||
>>> -					(instance->pdev->device ==
>>> -					PCI_DEVICE_ID_LSI_PLASMA) ||
>>> -					(instance->pdev->device ==
>>> -					PCI_DEVICE_ID_LSI_INVADER) ||
>>> -					(instance->pdev->device ==
>>> -					PCI_DEVICE_ID_LSI_FURY)) {
>>> +
>>> +				if (instance->ctrl_context) {
>>>  					for (i = 0; i < (10 * 1000); i +=
> 20) {
>>>  						if (readl(
>>>  							    &instance->
>>> @@ -3722,11 +3688,7 @@ static int megasas_create_frame_pool(struct
>> megasas_instance *instance)
>>>  		memset(cmd->frame, 0, total_sz);
>>>  		cmd->frame->io.context = cpu_to_le32(cmd->index);
>>>  		cmd->frame->io.pad_0 = 0;
>>> -		if ((instance->pdev->device != PCI_DEVICE_ID_LSI_FUSION)
> &&
>>> -		    (instance->pdev->device != PCI_DEVICE_ID_LSI_PLASMA)
> &&
>>> -		    (instance->pdev->device != PCI_DEVICE_ID_LSI_INVADER)
> &&
>>> -			(instance->pdev->device != PCI_DEVICE_ID_LSI_FURY)
>> &&
>>> -		    (reset_devices))
>>> +		if (!instance->ctrl_context && reset_devices)
>>>  			cmd->frame->hdr.cmd = MFI_CMD_INVALID;
>>>  	}
>>>
>>> @@ -4639,6 +4601,9 @@ static int megasas_init_fw(struct
> megasas_instance
>> *instance)
>>>  	unsigned long bar_list;
>>>  	int i, loop, fw_msix_count = 0;
>>>  	struct IOV_111 *iovPtr;
>>> +	struct fusion_context *fusion;
>>> +
>>> +	fusion = instance->ctrl_context;
>>>
>>>  	/* Find first memory bar */
>>>  	bar_list = pci_select_bars(instance->pdev, IORESOURCE_MEM); @@
>>> -4716,37 +4681,32 @@ static int megasas_init_fw(struct
> megasas_instance
>> *instance)
>>>  		scratch_pad_2 = readl
>>>  			(&instance->reg_set->outbound_scratch_pad_2);
>>>  		/* Check max MSI-X vectors */
>>> -		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION)
> ||
>>> -		    (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA))
> {
>>> -			instance->msix_vectors = (scratch_pad_2
>>> -				& MR_MAX_REPLY_QUEUES_OFFSET) + 1;
>>> -			fw_msix_count = instance->msix_vectors;
>>> -			if (msix_vectors)
>>> -				instance->msix_vectors =
>>> -					min(msix_vectors,
>>> -					    instance->msix_vectors);
>>> -		} else if ((instance->pdev->device ==
>> PCI_DEVICE_ID_LSI_INVADER)
>>> -			|| (instance->pdev->device ==
>> PCI_DEVICE_ID_LSI_FURY)) {
>>> -			/* Invader/Fury supports more than 8 MSI-X */
>>> -			instance->msix_vectors = ((scratch_pad_2
>>> -				& MR_MAX_REPLY_QUEUES_EXT_OFFSET)
>>> -				>>
>> MR_MAX_REPLY_QUEUES_EXT_OFFSET_SHIFT) + 1;
>>> -			fw_msix_count = instance->msix_vectors;
>>> -			/* Save 1-15 reply post index address to local
> memory
>>> -			 * Index 0 is already saved from reg offset
>>> -			 * MPI2_REPLY_POST_HOST_INDEX_OFFSET
>>> -			 */
>>> -			for (loop = 1; loop < MR_MAX_MSIX_REG_ARRAY;
>> loop++) {
>>> -				instance->reply_post_host_index_addr[loop]
> =
>>> -					(u32 __iomem *)
>>> -					((u8 __iomem *)instance->reg_set +
>>> -
>> 	MPI2_SUP_REPLY_POST_HOST_INDEX_OFFSET
>>> -					+ (loop * 0x10));
>>> +		if (fusion) {
>>> +			if (fusion->adapter_type == THUNDERBOLT_SERIES) {
>> /* Thunderbolt Series*/
>>> +				instance->msix_vectors = (scratch_pad_2
>>> +					& MR_MAX_REPLY_QUEUES_OFFSET)
>> + 1;
>>> +				fw_msix_count = instance->msix_vectors;
>>> +			} else { /* Invader series supports more than 8
> MSI-x
>> vectors*/
>>> +				instance->msix_vectors = ((scratch_pad_2
>>> +					&
>> MR_MAX_REPLY_QUEUES_EXT_OFFSET)
>>> +					>>
>> MR_MAX_REPLY_QUEUES_EXT_OFFSET_SHIFT) + 1;
>>> +				fw_msix_count = instance->msix_vectors;
>>> +				/* Save 1-15 reply post index address to
> local
>> memory
>>> +				 * Index 0 is already saved from reg
> offset
>>> +				 * MPI2_REPLY_POST_HOST_INDEX_OFFSET
>>> +				 */
>>> +				for (loop = 1; loop <
>> MR_MAX_MSIX_REG_ARRAY; loop++) {
>>> +					instance-
>>> reply_post_host_index_addr[loop] =
>>> +						(u32 __iomem *)
>>> +						((u8 __iomem *)instance-
>>> reg_set +
>>> +
>> 	MPI2_SUP_REPLY_POST_HOST_INDEX_OFFSET
>>> +						+ (loop * 0x10));
>>> +				}
>>>  			}
>>>  			if (msix_vectors)
>>>  				instance->msix_vectors = min(msix_vectors,
>>>  					instance->msix_vectors);
>>> -		} else
>>> +		} else /* MFI adapters */
>>>  			instance->msix_vectors = 1;
>>>  		/* Don't bother allocating more MSI-X vectors than cpus */
>>>  		instance->msix_vectors = min(instance->msix_vectors, @@ -
>> 5241,10
>>> +5201,7 @@ static int megasas_io_attach(struct megasas_instance
> *instance)
>>>  	host->max_cmd_len = 16;
>>>
>>>  	/* Fusion only supports host reset */
>>> -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
>>> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
>>> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
>>> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
>>> +	if (instance->ctrl_context) {
>>>  		host->hostt->eh_device_reset_handler = NULL;
>>>  		host->hostt->eh_bus_reset_handler = NULL;
>>>  	}
>>> @@ -5380,6 +5337,11 @@ static int megasas_probe_one(struct pci_dev
>> *pdev,
>>>  		fusion = instance->ctrl_context;
>>>  		memset(fusion, 0,
>>>  			((1 << PAGE_SHIFT) <<
> instance->ctrl_context_pages));
>>> +		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION)
> ||
>>> +			(instance->pdev->device ==
>> PCI_DEVICE_ID_LSI_PLASMA))
>>> +			fusion->adapter_type = THUNDERBOLT_SERIES;
>>> +		else
>>> +			fusion->adapter_type = INVADER_SERIES;
>>>  	}
>>>  	break;
>>>  	default: /* For all other supported controllers */ @@ -5482,10
>>> +5444,7 @@ static int megasas_probe_one(struct pci_dev *pdev,
>>>  	instance->disableOnlineCtrlReset = 1;
>>>  	instance->UnevenSpanSupport = 0;
>>>
>>> -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
>>> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
>>> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
>>> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
>>> +	if (instance->ctrl_context) {
>>>  		INIT_WORK(&instance->work_init, megasas_fusion_ocr_wq);
>>>  		INIT_WORK(&instance->crash_init,
>> megasas_fusion_crash_dump_wq);
>>>  	} else
>>> @@ -5565,10 +5524,7 @@ fail_io_attach:
>>>  	instance->instancet->disable_intr(instance);
>>>  	megasas_destroy_irqs(instance);
>>>
>>> -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
>>> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
>>> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
>>> -	    (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
>>> +	if (instance->ctrl_context)
>>>  		megasas_release_fusion(instance);
>>>  	else
>>>  		megasas_release_mfi(instance);
>>> @@ -5781,12 +5737,7 @@ megasas_resume(struct pci_dev *pdev)
>>>  				  instance->msix_vectors))
>>>  		goto fail_reenable_msix;
>>>
>>> -	switch (instance->pdev->device) {
>>> -	case PCI_DEVICE_ID_LSI_FUSION:
>>> -	case PCI_DEVICE_ID_LSI_PLASMA:
>>> -	case PCI_DEVICE_ID_LSI_INVADER:
>>> -	case PCI_DEVICE_ID_LSI_FURY:
>>> -	{
>>> +	if (instance->ctrl_context) {
>>>  		megasas_reset_reply_desc(instance);
>>>  		if (megasas_ioc_init_fusion(instance)) {
>>>  			megasas_free_cmds(instance);
>>> @@ -5795,14 +5746,11 @@ megasas_resume(struct pci_dev *pdev)
>>>  		}
>>>  		if (!megasas_get_map_info(instance))
>>>  			megasas_sync_map_info(instance);
>>> -	}
>>> -	break;
>>> -	default:
>>> +	} else {
>>>  		*instance->producer = 0;
>>>  		*instance->consumer = 0;
>>>  		if (megasas_issue_init_mfi(instance))
>>>  			goto fail_init_mfi;
>>> -		break;
>>>  	}
>>>
>>>  	tasklet_init(&instance->isr_tasklet, instance->instancet->tasklet,
>>> @@ -5924,11 +5872,7 @@ static void megasas_detach_one(struct pci_dev
>> *pdev)
>>>  	if (instance->msix_vectors)
>>>  		pci_disable_msix(instance->pdev);
>>>
>>> -	switch (instance->pdev->device) {
>>> -	case PCI_DEVICE_ID_LSI_FUSION:
>>> -	case PCI_DEVICE_ID_LSI_PLASMA:
>>> -	case PCI_DEVICE_ID_LSI_INVADER:
>>> -	case PCI_DEVICE_ID_LSI_FURY:
>>> +	if (instance->ctrl_context) {
>>>  		megasas_release_fusion(instance);
>>>  			pd_seq_map_sz = sizeof(struct
>> MR_PD_CFG_SEQ_NUM_SYNC) +
>>>  				(sizeof(struct MR_PD_CFG_SEQ) *
>>> @@ -5950,8 +5894,7 @@ static void megasas_detach_one(struct pci_dev
>> *pdev)
>>>  		}
>>>  		free_pages((ulong)instance->ctrl_context,
>>>  			instance->ctrl_context_pages);
>>> -		break;
>>> -	default:
>>> +	} else {
>>>  		megasas_release_mfi(instance);
>>>  		pci_free_consistent(pdev, sizeof(u32),
>>>  				    instance->producer,
>>> @@ -5959,7 +5902,6 @@ static void megasas_detach_one(struct pci_dev
>> *pdev)
>>>  		pci_free_consistent(pdev, sizeof(u32),
>>>  				    instance->consumer,
>>>  				    instance->consumer_h);
>>> -		break;
>>>  	}
>>>
>>>  	kfree(instance->ctrl_info);
>>> diff --git a/drivers/scsi/megaraid/megaraid_sas_fp.c
>>> b/drivers/scsi/megaraid/megaraid_sas_fp.c
>>> index be57b18..ce5b832 100644
>>> --- a/drivers/scsi/megaraid/megaraid_sas_fp.c
>>> +++ b/drivers/scsi/megaraid/megaraid_sas_fp.c
>>> @@ -741,14 +741,12 @@ static u8 mr_spanset_get_phy_params(struct
>> megasas_instance *instance, u32 ld,
>>>  	u8      physArm, span;
>>>  	u64     row;
>>>  	u8	retval = TRUE;
>>> -	u8	do_invader = 0;
>>>  	u64	*pdBlock = &io_info->pdBlock;
>>>  	__le16	*pDevHandle = &io_info->devHandle;
>>>  	u32	logArm, rowMod, armQ, arm;
>>> +	struct fusion_context *fusion;
>>>
>>> -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER ||
>>> -		instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
>>> -		do_invader = 1;
>>> +	fusion = instance->ctrl_context;
>>>
>>>  	/*Get row and span from io_info for Uneven Span IO.*/
>>>  	row	    = io_info->start_row;
>>> @@ -779,7 +777,8 @@ static u8 mr_spanset_get_phy_params(struct
>> megasas_instance *instance, u32 ld,
>>>  	else {
>>>  		*pDevHandle = cpu_to_le16(MR_PD_INVALID);
>>>  		if ((raid->level >= 5) &&
>>> -			(!do_invader  || (do_invader &&
>>> +			((fusion->adapter_type == THUNDERBOLT_SERIES)  ||
>>> +			((fusion->adapter_type == INVADER_SERIES) &&
>> Isn't it possible that fusion is NULL here?
> This function will be called for fusion adapters only so fusion should not
> be NULL here.

OK, so -

Reviewed-by: Tomas Henzl <thenzl@redhat.com>

Tomas

>>>  			(raid->regTypeReqOnRead !=
>> REGION_TYPE_UNUSED))))
>>>  			pRAID_Context->regLockFlags =
>> REGION_TYPE_EXCLUSIVE;
>>>  		else if (raid->level == 1) {
>>> @@ -823,13 +822,12 @@ u8 MR_GetPhyParams(struct megasas_instance
>> *instance, u32 ld, u64 stripRow,
>>>  	u8          physArm, span;
>>>  	u64         row;
>>>  	u8	    retval = TRUE;
>>> -	u8          do_invader = 0;
>>>  	u64	    *pdBlock = &io_info->pdBlock;
>>>  	__le16	    *pDevHandle = &io_info->devHandle;
>>> +	struct fusion_context *fusion;
>>> +
>>> +	fusion = instance->ctrl_context;
>> The same here and other instances (MR_BuildRaidContext) too ?
> Same as above..
>> Tomas
>>
>>> -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER ||
>>> -		instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
>>> -		do_invader = 1;
>>>
>>>  	row =  mega_div64_32(stripRow, raid->rowDataSize);
>>>
>>> @@ -875,7 +873,8 @@ u8 MR_GetPhyParams(struct megasas_instance
>> *instance, u32 ld, u64 stripRow,
>>>  		/* set dev handle as invalid. */
>>>  		*pDevHandle = cpu_to_le16(MR_PD_INVALID);
>>>  		if ((raid->level >= 5) &&
>>> -			(!do_invader  || (do_invader &&
>>> +			((fusion->adapter_type == THUNDERBOLT_SERIES)  ||
>>> +			((fusion->adapter_type == INVADER_SERIES) &&
>>>  			(raid->regTypeReqOnRead !=
>> REGION_TYPE_UNUSED))))
>>>  			pRAID_Context->regLockFlags =
>> REGION_TYPE_EXCLUSIVE;
>>>  		else if (raid->level == 1) {
>>> @@ -909,6 +908,7 @@ MR_BuildRaidContext(struct megasas_instance
>> *instance,
>>>  		    struct RAID_CONTEXT *pRAID_Context,
>>>  		    struct MR_DRV_RAID_MAP_ALL *map, u8 **raidLUN)  {
>>> +	struct fusion_context *fusion;
>>>  	struct MR_LD_RAID  *raid;
>>>  	u32         ld, stripSize, stripe_mask;
>>>  	u64         endLba, endStrip, endRow, start_row, start_strip;
>>> @@ -929,6 +929,7 @@ MR_BuildRaidContext(struct megasas_instance
>> *instance,
>>>  	isRead = io_info->isRead;
>>>  	io_info->IoforUnevenSpan = 0;
>>>  	io_info->start_span	= SPAN_INVALID;
>>> +	fusion = instance->ctrl_context;
>>>
>>>  	ld = MR_TargetIdToLdGet(ldTgtId, map);
>>>  	raid = MR_LdRaidGet(ld, map);
>>> @@ -1092,8 +1093,7 @@ MR_BuildRaidContext(struct megasas_instance
>> *instance,
>>>  		cpu_to_le16(raid->fpIoTimeoutForLd ?
>>>  			    raid->fpIoTimeoutForLd :
>>>  			    map->raidMap.fpPdIoTimeoutSec);
>>> -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
>>> -		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
>>> +	if (fusion->adapter_type == INVADER_SERIES)
>>>  		pRAID_Context->regLockFlags = (isRead) ?
>>>  			raid->regTypeReqOnRead : raid->regTypeReqOnWrite;
>>>  	else
>>> diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c
>>> b/drivers/scsi/megaraid/megaraid_sas_fusion.c
>>> index 1398950..365ec52 100644
>>> --- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
>>> +++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
>>> @@ -653,8 +653,7 @@ megasas_ioc_init_fusion(struct megasas_instance
>> *instance)
>>>  	drv_ops = (MFI_CAPABILITIES *) &(init_frame->driver_operations);
>>>
>>>  	/* driver support Extended MSIX */
>>> -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
>>> -		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
>>> +	if (fusion->adapter_type == INVADER_SERIES)
>>>  		drv_ops->mfi_capabilities.support_additional_msix = 1;
>>>  	/* driver supports HA / Remote LUN over Fast Path interface */
>>>  	drv_ops->mfi_capabilities.support_fp_remote_lun = 1; @@ -1288,8
>>> +1287,7 @@ megasas_make_sgl_fusion(struct megasas_instance *instance,
>>>
>>>  	fusion = instance->ctrl_context;
>>>
>>> -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
>>> -		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
>>> +	if (fusion->adapter_type == INVADER_SERIES) {
>>>  		struct MPI25_IEEE_SGE_CHAIN64 *sgl_ptr_end = sgl_ptr;
>>>  		sgl_ptr_end += fusion->max_sge_in_main_msg - 1;
>>>  		sgl_ptr_end->Flags = 0;
>>> @@ -1306,11 +1304,9 @@ megasas_make_sgl_fusion(struct
>> megasas_instance *instance,
>>>  		sgl_ptr->Length = cpu_to_le32(sg_dma_len(os_sgl));
>>>  		sgl_ptr->Address = cpu_to_le64(sg_dma_address(os_sgl));
>>>  		sgl_ptr->Flags = 0;
>>> -		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER)
> ||
>>> -			(instance->pdev->device ==
> PCI_DEVICE_ID_LSI_FURY))
>> {
>>> +		if (fusion->adapter_type == INVADER_SERIES)
>>>  			if (i == sge_count - 1)
>>>  				sgl_ptr->Flags =
>> IEEE_SGE_FLAGS_END_OF_LIST;
>>> -		}
>>>  		sgl_ptr++;
>>>
>>>  		sg_processed = i + 1;
>>> @@ -1319,10 +1315,7 @@ megasas_make_sgl_fusion(struct
>> megasas_instance *instance,
>>>  		    (sge_count > fusion->max_sge_in_main_msg)) {
>>>
>>>  			struct MPI25_IEEE_SGE_CHAIN64 *sg_chain;
>>> -			if ((instance->pdev->device ==
>>> -				PCI_DEVICE_ID_LSI_INVADER) ||
>>> -				(instance->pdev->device ==
>>> -				PCI_DEVICE_ID_LSI_FURY)) {
>>> +			if (fusion->adapter_type == INVADER_SERIES) {
>>>  				if ((le16_to_cpu(cmd->io_request->IoFlags)
> &
>> 	MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH) !=
>> 	MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH)
>>> @@ -1338,10 +1331,7 @@ megasas_make_sgl_fusion(struct
>> megasas_instance *instance,
>>>  			sg_chain = sgl_ptr;
>>>  			/* Prepare chain element */
>>>  			sg_chain->NextChainOffset = 0;
>>> -			if ((instance->pdev->device ==
>>> -				PCI_DEVICE_ID_LSI_INVADER) ||
>>> -				(instance->pdev->device ==
>>> -				PCI_DEVICE_ID_LSI_FURY))
>>> +			if (fusion->adapter_type == INVADER_SERIES)
>>>  				sg_chain->Flags =
>> IEEE_SGE_FLAGS_CHAIN_ELEMENT;
>>>  			else
>>>  				sg_chain->Flags =
>>> @@ -1658,8 +1648,7 @@ megasas_build_ldio_fusion(struct
>> megasas_instance *instance,
>>>  		cmd->request_desc->SCSIIO.RequestFlags =
>>>  			(MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY
>>>  			 << MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
>>> -		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER)
> ||
>>> -			(instance->pdev->device ==
> PCI_DEVICE_ID_LSI_FURY))
>> {
>>> +		if (fusion->adapter_type == INVADER_SERIES) {
>>>  			if (io_request->RaidContext.regLockFlags ==
>>>  			    REGION_TYPE_UNUSED)
>>>  				cmd->request_desc->SCSIIO.RequestFlags =
>> @@ -1700,8 +1689,7 @@
>>> megasas_build_ldio_fusion(struct megasas_instance *instance,
>>>  		cmd->request_desc->SCSIIO.RequestFlags =
>>>  			(MEGASAS_REQ_DESCRIPT_FLAGS_LD_IO
>>>  			 << MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
>>> -		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER)
> ||
>>> -			(instance->pdev->device ==
> PCI_DEVICE_ID_LSI_FURY))
>> {
>>> +		if (fusion->adapter_type == INVADER_SERIES) {
>>>  			if (io_request->RaidContext.regLockFlags ==
>>>  			    REGION_TYPE_UNUSED)
>>>  				cmd->request_desc->SCSIIO.RequestFlags =
>> @@ -1890,8 +1878,7 @@
>>> megasas_build_syspd_fusion(struct megasas_instance *instance,
>>>  		pRAID_Context->timeoutValue =
>>>  			cpu_to_le16((os_timeout_value > timeout_limit) ?
>>>  			timeout_limit : os_timeout_value);
>>> -		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER)
> ||
>>> -			(instance->pdev->device ==
> PCI_DEVICE_ID_LSI_FURY))
>> {
>>> +		if (fusion->adapter_type == INVADER_SERIES) {
>>>  			pRAID_Context->Type = MPI2_TYPE_CUDA;
>>>  			pRAID_Context->nseg = 0x1;
>>>  			io_request->IoFlags |=
>>> @@ -2209,10 +2196,7 @@ complete_cmd_fusion(struct megasas_instance
>> *instance, u32 MSIxIndex)
>>>  		 * pending to be completed
>>>  		 */
>>>  		if (threshold_reply_count >= THRESHOLD_REPLY_COUNT) {
>>> -			if ((instance->pdev->device ==
>>> -				PCI_DEVICE_ID_LSI_INVADER) ||
>>> -				(instance->pdev->device ==
>>> -				PCI_DEVICE_ID_LSI_FURY))
>>> +			if (fusion->adapter_type == INVADER_SERIES)
>>>  				writel(((MSIxIndex & 0x7) << 24) |
>>>  					fusion->last_reply_idx[MSIxIndex],
>>>  					instance-
>>> reply_post_host_index_addr[MSIxIndex/8]);
>>> @@ -2228,8 +2212,7 @@ complete_cmd_fusion(struct megasas_instance
>> *instance, u32 MSIxIndex)
>>>  		return IRQ_NONE;
>>>
>>>  	wmb();
>>> -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
>>> -		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
>>> +	if (fusion->adapter_type == INVADER_SERIES)
>>>  		writel(((MSIxIndex & 0x7) << 24) |
>>>  			fusion->last_reply_idx[MSIxIndex],
>>>
> instance->reply_post_host_index_addr[MSIxIndex/8]);
>>> @@ -2352,8 +2335,7 @@ build_mpt_mfi_pass_thru(struct megasas_instance
>>> *instance,
>>>
>>>  	io_req = cmd->io_request;
>>>
>>> -	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
>>> -		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
>>> +	if (fusion->adapter_type == INVADER_SERIES) {
>>>  		struct MPI25_IEEE_SGE_CHAIN64 *sgl_ptr_end =
>>>  			(struct MPI25_IEEE_SGE_CHAIN64 *)&io_req->SGL;
>>>  		sgl_ptr_end += fusion->max_sge_in_main_msg - 1; diff --git
>>> a/drivers/scsi/megaraid/megaraid_sas_fusion.h
>>> b/drivers/scsi/megaraid/megaraid_sas_fusion.h
>>> index 7d89c1c..473005c 100644
>>> --- a/drivers/scsi/megaraid/megaraid_sas_fusion.h
>>> +++ b/drivers/scsi/megaraid/megaraid_sas_fusion.h
>>> @@ -96,6 +96,11 @@ enum MR_RAID_FLAGS_IO_SUB_TYPE {  #define
>>> THRESHOLD_REPLY_COUNT 50
>>>  #define JBOD_MAPS_COUNT	2
>>>
>>> +enum MR_FUSION_ADAPTER_TYPE {
>>> +	THUNDERBOLT_SERIES = 0,
>>> +	INVADER_SERIES = 1,
>>> +};
>>> +
>>>  /*
>>>   * Raid Context structure which describes MegaRAID specific IO
> Parameters
>>>   * This resides at offset 0x60 where the SGL normally starts in MPT
>>> IO Frames @@ -857,6 +862,7 @@ struct fusion_context {
>>>  	u8 fast_path_io;
>>>  	struct LD_LOAD_BALANCE_INFO
>> load_balance_info[MAX_LOGICAL_DRIVES_EXT];
>>>  	LD_SPAN_INFO log_to_span[MAX_LOGICAL_DRIVES_EXT];
>>> +	u8 adapter_type;
>>>  };
>>>
>>>  union desc_value {
> --
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Martin K. Petersen Oct. 28, 2015, 2:33 a.m. UTC | #4
>>>>> "Sumit" == sumit saxena <sumit.saxena@avagotech.com> writes:

Sumit> Code optimization: remove PCI id based checks and instead of
Sumit> those use instance->ctrl_context to make call whether controller
Sumit> is MFI based OR fusion adapter.  fusion adapters further are also
Sumit> divided in two categories- 1)THUNDERBOLT SERIES and 2)INVADER
Sumit> SERIES.

Does not apply against current upstream. Please fix and repost.
Sumit Saxena Oct. 28, 2015, 7:43 a.m. UTC | #5
> -----Original Message-----
> From: Martin K. Petersen [mailto:martin.petersen@oracle.com]
> Sent: Wednesday, October 28, 2015 8:03 AM
> To: sumit.saxena@avagotech.com
> Cc: linux-scsi@vger.kernel.org; thenzl@redhat.com;
> martin.petersen@oracle.com; hch@infradead.org; jbottomley@parallels.com;
> kashyap.desai@avagotech.com; kiran-kumar.kasturi@avagotech.com;
> uday.lingala@avagotech.com
> Subject: Re: [PATCH 02/12] megaraid_sas : Code optimization- remove PCI
Ids
> based checks
>
> >>>>> "Sumit" == sumit saxena <sumit.saxena@avagotech.com> writes:
>
> Sumit> Code optimization: remove PCI id based checks and instead of
> Sumit> those use instance->ctrl_context to make call whether controller
> Sumit> is MFI based OR fusion adapter.  fusion adapters further are also
> Sumit> divided in two categories- 1)THUNDERBOLT SERIES and 2)INVADER
> Sumit> SERIES.
>
> Does not apply against current upstream. Please fix and repost.

Martin, This patch set is not based on current upstream but rebased on top
of few patches sent by me prior to this patch series. Patches sent prior
to this patch series are not yet accepted.

Thanks,
Sumit
>
> --
> Martin K. Petersen	Oracle Linux Engineering
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Kashyap Desai Oct. 28, 2015, 2:30 p.m. UTC | #6
>
> > -----Original Message-----
> > From: Martin K. Petersen [mailto:martin.petersen@oracle.com]
> > Sent: Wednesday, October 28, 2015 8:03 AM
> > To: sumit.saxena@avagotech.com
> > Cc: linux-scsi@vger.kernel.org; thenzl@redhat.com;
> > martin.petersen@oracle.com; hch@infradead.org;
> > jbottomley@parallels.com; kashyap.desai@avagotech.com;
> > kiran-kumar.kasturi@avagotech.com;
> > uday.lingala@avagotech.com
> > Subject: Re: [PATCH 02/12] megaraid_sas : Code optimization- remove
> > PCI
> Ids
> > based checks
> >
> > >>>>> "Sumit" == sumit saxena <sumit.saxena@avagotech.com> writes:
> >
> > Sumit> Code optimization: remove PCI id based checks and instead of
> > Sumit> those use instance->ctrl_context to make call whether
> > Sumit> controller is MFI based OR fusion adapter.  fusion adapters
> > Sumit> further are also divided in two categories- 1)THUNDERBOLT
> > Sumit> SERIES and 2)INVADER SERIES.
> >
> > Does not apply against current upstream. Please fix and repost.
>
> Martin, This patch set is not based on current upstream but rebased on top
> of few patches sent by me prior to this patch series. Patches sent prior
> to
> this patch series are not yet accepted.

Martin -

Here is last outstanding patch series.
http://marc.info/?l=linux-scsi&m=144102204225400&w=2

Last patch series was missed because of small rebase issue. James suggested
not to ACK anything which is not critical to avoid such issue and probably
piggy back those patches.
Last series and latest series has reviewed-by tags. Can we have outstanding
patches committed in next window ?

>
> Thanks,
> Sumit
> >
> > --
> > Martin K. Petersen	Oracle Linux Engineering
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Martin K. Petersen Oct. 29, 2015, 4:40 a.m. UTC | #7
>>>>> "Kashyap" == Kashyap Desai <kashyap.desai@avagotech.com> writes:

Kashyap> Here is last outstanding patch series.
Kashyap> http://marc.info/?l=linux-scsi&m=144102204225400&w=2

Kashyap> Last patch series was missed because of small rebase
Kashyap> issue. James suggested not to ACK anything which is not
Kashyap> critical to avoid such issue and probably piggy back those
Kashyap> patches.  Last series and latest series has reviewed-by
Kashyap> tags. Can we have outstanding patches committed in next window
Kashyap> ?

Just pulled in the previous patch series. Will work on the latest one
next.
diff mbox

Patch

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c
index d00d494..bc2bb13 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -1797,10 +1797,7 @@  void megaraid_sas_kill_hba(struct megasas_instance *instance)
 	msleep(1000);
 	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
 		(instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
-		(instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
-		(instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
-		(instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
-		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
+		(instance->ctrl_context)) {
 		writel(MFI_STOP_ADP, &instance->reg_set->doorbell);
 		/* Flush */
 		readl(&instance->reg_set->doorbell);
@@ -2567,10 +2564,7 @@  static int megasas_reset_bus_host(struct scsi_cmnd *scmd)
 	/*
 	 * First wait for all commands to complete
 	 */
-	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
-	    (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
-	    (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
-	    (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
+	if (instance->ctrl_context)
 		ret = megasas_reset_fusion(scmd->device->host, 1);
 	else
 		ret = megasas_generic_reset(scmd);
@@ -3431,22 +3425,14 @@  megasas_transition_to_ready(struct megasas_instance *instance, int ocr)
 				PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
 				(instance->pdev->device ==
 				 PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
-				(instance->pdev->device ==
-				PCI_DEVICE_ID_LSI_FUSION) ||
-				(instance->pdev->device ==
-				PCI_DEVICE_ID_LSI_PLASMA) ||
-				(instance->pdev->device ==
-				PCI_DEVICE_ID_LSI_INVADER) ||
-				(instance->pdev->device ==
-				PCI_DEVICE_ID_LSI_FURY)) {
+				(instance->ctrl_context))
 				writel(
 				  MFI_INIT_CLEAR_HANDSHAKE|MFI_INIT_HOTPLUG,
 				  &instance->reg_set->doorbell);
-			} else {
+			else
 				writel(
 				    MFI_INIT_CLEAR_HANDSHAKE|MFI_INIT_HOTPLUG,
 					&instance->reg_set->inbound_doorbell);
-			}
 
 			max_wait = MEGASAS_RESET_WAIT_TIME;
 			cur_state = MFI_STATE_WAIT_HANDSHAKE;
@@ -3457,17 +3443,10 @@  megasas_transition_to_ready(struct megasas_instance *instance, int ocr)
 			     PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
 				(instance->pdev->device ==
 				 PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
-			    (instance->pdev->device ==
-			     PCI_DEVICE_ID_LSI_FUSION) ||
-			    (instance->pdev->device ==
-			     PCI_DEVICE_ID_LSI_PLASMA) ||
-			    (instance->pdev->device ==
-			     PCI_DEVICE_ID_LSI_INVADER) ||
-			    (instance->pdev->device ==
-			     PCI_DEVICE_ID_LSI_FURY)) {
+				(instance->ctrl_context))
 				writel(MFI_INIT_HOTPLUG,
 				       &instance->reg_set->doorbell);
-			} else
+			else
 				writel(MFI_INIT_HOTPLUG,
 					&instance->reg_set->inbound_doorbell);
 
@@ -3484,24 +3463,11 @@  megasas_transition_to_ready(struct megasas_instance *instance, int ocr)
 				PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
 				(instance->pdev->device ==
 				PCI_DEVICE_ID_LSI_SAS0071SKINNY)  ||
-				(instance->pdev->device
-					== PCI_DEVICE_ID_LSI_FUSION) ||
-				(instance->pdev->device
-					== PCI_DEVICE_ID_LSI_PLASMA) ||
-				(instance->pdev->device
-					== PCI_DEVICE_ID_LSI_INVADER) ||
-				(instance->pdev->device
-					== PCI_DEVICE_ID_LSI_FURY)) {
+				(instance->ctrl_context)) {
 				writel(MFI_RESET_FLAGS,
 					&instance->reg_set->doorbell);
-				if ((instance->pdev->device ==
-					PCI_DEVICE_ID_LSI_FUSION) ||
-					(instance->pdev->device ==
-					PCI_DEVICE_ID_LSI_PLASMA) ||
-					(instance->pdev->device ==
-					PCI_DEVICE_ID_LSI_INVADER) ||
-					(instance->pdev->device ==
-					PCI_DEVICE_ID_LSI_FURY)) {
+
+				if (instance->ctrl_context) {
 					for (i = 0; i < (10 * 1000); i += 20) {
 						if (readl(
 							    &instance->
@@ -3722,11 +3688,7 @@  static int megasas_create_frame_pool(struct megasas_instance *instance)
 		memset(cmd->frame, 0, total_sz);
 		cmd->frame->io.context = cpu_to_le32(cmd->index);
 		cmd->frame->io.pad_0 = 0;
-		if ((instance->pdev->device != PCI_DEVICE_ID_LSI_FUSION) &&
-		    (instance->pdev->device != PCI_DEVICE_ID_LSI_PLASMA) &&
-		    (instance->pdev->device != PCI_DEVICE_ID_LSI_INVADER) &&
-			(instance->pdev->device != PCI_DEVICE_ID_LSI_FURY) &&
-		    (reset_devices))
+		if (!instance->ctrl_context && reset_devices)
 			cmd->frame->hdr.cmd = MFI_CMD_INVALID;
 	}
 
@@ -4639,6 +4601,9 @@  static int megasas_init_fw(struct megasas_instance *instance)
 	unsigned long bar_list;
 	int i, loop, fw_msix_count = 0;
 	struct IOV_111 *iovPtr;
+	struct fusion_context *fusion;
+
+	fusion = instance->ctrl_context;
 
 	/* Find first memory bar */
 	bar_list = pci_select_bars(instance->pdev, IORESOURCE_MEM);
@@ -4716,37 +4681,32 @@  static int megasas_init_fw(struct megasas_instance *instance)
 		scratch_pad_2 = readl
 			(&instance->reg_set->outbound_scratch_pad_2);
 		/* Check max MSI-X vectors */
-		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
-		    (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA)) {
-			instance->msix_vectors = (scratch_pad_2
-				& MR_MAX_REPLY_QUEUES_OFFSET) + 1;
-			fw_msix_count = instance->msix_vectors;
-			if (msix_vectors)
-				instance->msix_vectors =
-					min(msix_vectors,
-					    instance->msix_vectors);
-		} else if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER)
-			|| (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
-			/* Invader/Fury supports more than 8 MSI-X */
-			instance->msix_vectors = ((scratch_pad_2
-				& MR_MAX_REPLY_QUEUES_EXT_OFFSET)
-				>> MR_MAX_REPLY_QUEUES_EXT_OFFSET_SHIFT) + 1;
-			fw_msix_count = instance->msix_vectors;
-			/* Save 1-15 reply post index address to local memory
-			 * Index 0 is already saved from reg offset
-			 * MPI2_REPLY_POST_HOST_INDEX_OFFSET
-			 */
-			for (loop = 1; loop < MR_MAX_MSIX_REG_ARRAY; loop++) {
-				instance->reply_post_host_index_addr[loop] =
-					(u32 __iomem *)
-					((u8 __iomem *)instance->reg_set +
-					MPI2_SUP_REPLY_POST_HOST_INDEX_OFFSET
-					+ (loop * 0x10));
+		if (fusion) {
+			if (fusion->adapter_type == THUNDERBOLT_SERIES) { /* Thunderbolt Series*/
+				instance->msix_vectors = (scratch_pad_2
+					& MR_MAX_REPLY_QUEUES_OFFSET) + 1;
+				fw_msix_count = instance->msix_vectors;
+			} else { /* Invader series supports more than 8 MSI-x vectors*/
+				instance->msix_vectors = ((scratch_pad_2
+					& MR_MAX_REPLY_QUEUES_EXT_OFFSET)
+					>> MR_MAX_REPLY_QUEUES_EXT_OFFSET_SHIFT) + 1;
+				fw_msix_count = instance->msix_vectors;
+				/* Save 1-15 reply post index address to local memory
+				 * Index 0 is already saved from reg offset
+				 * MPI2_REPLY_POST_HOST_INDEX_OFFSET
+				 */
+				for (loop = 1; loop < MR_MAX_MSIX_REG_ARRAY; loop++) {
+					instance->reply_post_host_index_addr[loop] =
+						(u32 __iomem *)
+						((u8 __iomem *)instance->reg_set +
+						MPI2_SUP_REPLY_POST_HOST_INDEX_OFFSET
+						+ (loop * 0x10));
+				}
 			}
 			if (msix_vectors)
 				instance->msix_vectors = min(msix_vectors,
 					instance->msix_vectors);
-		} else
+		} else /* MFI adapters */
 			instance->msix_vectors = 1;
 		/* Don't bother allocating more MSI-X vectors than cpus */
 		instance->msix_vectors = min(instance->msix_vectors,
@@ -5241,10 +5201,7 @@  static int megasas_io_attach(struct megasas_instance *instance)
 	host->max_cmd_len = 16;
 
 	/* Fusion only supports host reset */
-	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
-	    (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
-	    (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
-	    (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
+	if (instance->ctrl_context) {
 		host->hostt->eh_device_reset_handler = NULL;
 		host->hostt->eh_bus_reset_handler = NULL;
 	}
@@ -5380,6 +5337,11 @@  static int megasas_probe_one(struct pci_dev *pdev,
 		fusion = instance->ctrl_context;
 		memset(fusion, 0,
 			((1 << PAGE_SHIFT) << instance->ctrl_context_pages));
+		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
+			(instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA))
+			fusion->adapter_type = THUNDERBOLT_SERIES;
+		else
+			fusion->adapter_type = INVADER_SERIES;
 	}
 	break;
 	default: /* For all other supported controllers */
@@ -5482,10 +5444,7 @@  static int megasas_probe_one(struct pci_dev *pdev,
 	instance->disableOnlineCtrlReset = 1;
 	instance->UnevenSpanSupport = 0;
 
-	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
-	    (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
-	    (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
-	    (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
+	if (instance->ctrl_context) {
 		INIT_WORK(&instance->work_init, megasas_fusion_ocr_wq);
 		INIT_WORK(&instance->crash_init, megasas_fusion_crash_dump_wq);
 	} else
@@ -5565,10 +5524,7 @@  fail_io_attach:
 	instance->instancet->disable_intr(instance);
 	megasas_destroy_irqs(instance);
 
-	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_FUSION) ||
-	    (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) ||
-	    (instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
-	    (instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
+	if (instance->ctrl_context)
 		megasas_release_fusion(instance);
 	else
 		megasas_release_mfi(instance);
@@ -5781,12 +5737,7 @@  megasas_resume(struct pci_dev *pdev)
 				  instance->msix_vectors))
 		goto fail_reenable_msix;
 
-	switch (instance->pdev->device) {
-	case PCI_DEVICE_ID_LSI_FUSION:
-	case PCI_DEVICE_ID_LSI_PLASMA:
-	case PCI_DEVICE_ID_LSI_INVADER:
-	case PCI_DEVICE_ID_LSI_FURY:
-	{
+	if (instance->ctrl_context) {
 		megasas_reset_reply_desc(instance);
 		if (megasas_ioc_init_fusion(instance)) {
 			megasas_free_cmds(instance);
@@ -5795,14 +5746,11 @@  megasas_resume(struct pci_dev *pdev)
 		}
 		if (!megasas_get_map_info(instance))
 			megasas_sync_map_info(instance);
-	}
-	break;
-	default:
+	} else {
 		*instance->producer = 0;
 		*instance->consumer = 0;
 		if (megasas_issue_init_mfi(instance))
 			goto fail_init_mfi;
-		break;
 	}
 
 	tasklet_init(&instance->isr_tasklet, instance->instancet->tasklet,
@@ -5924,11 +5872,7 @@  static void megasas_detach_one(struct pci_dev *pdev)
 	if (instance->msix_vectors)
 		pci_disable_msix(instance->pdev);
 
-	switch (instance->pdev->device) {
-	case PCI_DEVICE_ID_LSI_FUSION:
-	case PCI_DEVICE_ID_LSI_PLASMA:
-	case PCI_DEVICE_ID_LSI_INVADER:
-	case PCI_DEVICE_ID_LSI_FURY:
+	if (instance->ctrl_context) {
 		megasas_release_fusion(instance);
 			pd_seq_map_sz = sizeof(struct MR_PD_CFG_SEQ_NUM_SYNC) +
 				(sizeof(struct MR_PD_CFG_SEQ) *
@@ -5950,8 +5894,7 @@  static void megasas_detach_one(struct pci_dev *pdev)
 		}
 		free_pages((ulong)instance->ctrl_context,
 			instance->ctrl_context_pages);
-		break;
-	default:
+	} else {
 		megasas_release_mfi(instance);
 		pci_free_consistent(pdev, sizeof(u32),
 				    instance->producer,
@@ -5959,7 +5902,6 @@  static void megasas_detach_one(struct pci_dev *pdev)
 		pci_free_consistent(pdev, sizeof(u32),
 				    instance->consumer,
 				    instance->consumer_h);
-		break;
 	}
 
 	kfree(instance->ctrl_info);
diff --git a/drivers/scsi/megaraid/megaraid_sas_fp.c b/drivers/scsi/megaraid/megaraid_sas_fp.c
index be57b18..ce5b832 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fp.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fp.c
@@ -741,14 +741,12 @@  static u8 mr_spanset_get_phy_params(struct megasas_instance *instance, u32 ld,
 	u8      physArm, span;
 	u64     row;
 	u8	retval = TRUE;
-	u8	do_invader = 0;
 	u64	*pdBlock = &io_info->pdBlock;
 	__le16	*pDevHandle = &io_info->devHandle;
 	u32	logArm, rowMod, armQ, arm;
+	struct fusion_context *fusion;
 
-	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER ||
-		instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
-		do_invader = 1;
+	fusion = instance->ctrl_context;
 
 	/*Get row and span from io_info for Uneven Span IO.*/
 	row	    = io_info->start_row;
@@ -779,7 +777,8 @@  static u8 mr_spanset_get_phy_params(struct megasas_instance *instance, u32 ld,
 	else {
 		*pDevHandle = cpu_to_le16(MR_PD_INVALID);
 		if ((raid->level >= 5) &&
-			(!do_invader  || (do_invader &&
+			((fusion->adapter_type == THUNDERBOLT_SERIES)  ||
+			((fusion->adapter_type == INVADER_SERIES) &&
 			(raid->regTypeReqOnRead != REGION_TYPE_UNUSED))))
 			pRAID_Context->regLockFlags = REGION_TYPE_EXCLUSIVE;
 		else if (raid->level == 1) {
@@ -823,13 +822,12 @@  u8 MR_GetPhyParams(struct megasas_instance *instance, u32 ld, u64 stripRow,
 	u8          physArm, span;
 	u64         row;
 	u8	    retval = TRUE;
-	u8          do_invader = 0;
 	u64	    *pdBlock = &io_info->pdBlock;
 	__le16	    *pDevHandle = &io_info->devHandle;
+	struct fusion_context *fusion;
+
+	fusion = instance->ctrl_context;
 
-	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER ||
-		instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
-		do_invader = 1;
 
 	row =  mega_div64_32(stripRow, raid->rowDataSize);
 
@@ -875,7 +873,8 @@  u8 MR_GetPhyParams(struct megasas_instance *instance, u32 ld, u64 stripRow,
 		/* set dev handle as invalid. */
 		*pDevHandle = cpu_to_le16(MR_PD_INVALID);
 		if ((raid->level >= 5) &&
-			(!do_invader  || (do_invader &&
+			((fusion->adapter_type == THUNDERBOLT_SERIES)  ||
+			((fusion->adapter_type == INVADER_SERIES) &&
 			(raid->regTypeReqOnRead != REGION_TYPE_UNUSED))))
 			pRAID_Context->regLockFlags = REGION_TYPE_EXCLUSIVE;
 		else if (raid->level == 1) {
@@ -909,6 +908,7 @@  MR_BuildRaidContext(struct megasas_instance *instance,
 		    struct RAID_CONTEXT *pRAID_Context,
 		    struct MR_DRV_RAID_MAP_ALL *map, u8 **raidLUN)
 {
+	struct fusion_context *fusion;
 	struct MR_LD_RAID  *raid;
 	u32         ld, stripSize, stripe_mask;
 	u64         endLba, endStrip, endRow, start_row, start_strip;
@@ -929,6 +929,7 @@  MR_BuildRaidContext(struct megasas_instance *instance,
 	isRead = io_info->isRead;
 	io_info->IoforUnevenSpan = 0;
 	io_info->start_span	= SPAN_INVALID;
+	fusion = instance->ctrl_context;
 
 	ld = MR_TargetIdToLdGet(ldTgtId, map);
 	raid = MR_LdRaidGet(ld, map);
@@ -1092,8 +1093,7 @@  MR_BuildRaidContext(struct megasas_instance *instance,
 		cpu_to_le16(raid->fpIoTimeoutForLd ?
 			    raid->fpIoTimeoutForLd :
 			    map->raidMap.fpPdIoTimeoutSec);
-	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
-		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
+	if (fusion->adapter_type == INVADER_SERIES)
 		pRAID_Context->regLockFlags = (isRead) ?
 			raid->regTypeReqOnRead : raid->regTypeReqOnWrite;
 	else
diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index 1398950..365ec52 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -653,8 +653,7 @@  megasas_ioc_init_fusion(struct megasas_instance *instance)
 	drv_ops = (MFI_CAPABILITIES *) &(init_frame->driver_operations);
 
 	/* driver support Extended MSIX */
-	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
-		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
+	if (fusion->adapter_type == INVADER_SERIES)
 		drv_ops->mfi_capabilities.support_additional_msix = 1;
 	/* driver supports HA / Remote LUN over Fast Path interface */
 	drv_ops->mfi_capabilities.support_fp_remote_lun = 1;
@@ -1288,8 +1287,7 @@  megasas_make_sgl_fusion(struct megasas_instance *instance,
 
 	fusion = instance->ctrl_context;
 
-	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
-		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
+	if (fusion->adapter_type == INVADER_SERIES) {
 		struct MPI25_IEEE_SGE_CHAIN64 *sgl_ptr_end = sgl_ptr;
 		sgl_ptr_end += fusion->max_sge_in_main_msg - 1;
 		sgl_ptr_end->Flags = 0;
@@ -1306,11 +1304,9 @@  megasas_make_sgl_fusion(struct megasas_instance *instance,
 		sgl_ptr->Length = cpu_to_le32(sg_dma_len(os_sgl));
 		sgl_ptr->Address = cpu_to_le64(sg_dma_address(os_sgl));
 		sgl_ptr->Flags = 0;
-		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
-			(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
+		if (fusion->adapter_type == INVADER_SERIES)
 			if (i == sge_count - 1)
 				sgl_ptr->Flags = IEEE_SGE_FLAGS_END_OF_LIST;
-		}
 		sgl_ptr++;
 
 		sg_processed = i + 1;
@@ -1319,10 +1315,7 @@  megasas_make_sgl_fusion(struct megasas_instance *instance,
 		    (sge_count > fusion->max_sge_in_main_msg)) {
 
 			struct MPI25_IEEE_SGE_CHAIN64 *sg_chain;
-			if ((instance->pdev->device ==
-				PCI_DEVICE_ID_LSI_INVADER) ||
-				(instance->pdev->device ==
-				PCI_DEVICE_ID_LSI_FURY)) {
+			if (fusion->adapter_type == INVADER_SERIES) {
 				if ((le16_to_cpu(cmd->io_request->IoFlags) &
 					MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH) !=
 					MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH)
@@ -1338,10 +1331,7 @@  megasas_make_sgl_fusion(struct megasas_instance *instance,
 			sg_chain = sgl_ptr;
 			/* Prepare chain element */
 			sg_chain->NextChainOffset = 0;
-			if ((instance->pdev->device ==
-				PCI_DEVICE_ID_LSI_INVADER) ||
-				(instance->pdev->device ==
-				PCI_DEVICE_ID_LSI_FURY))
+			if (fusion->adapter_type == INVADER_SERIES)
 				sg_chain->Flags = IEEE_SGE_FLAGS_CHAIN_ELEMENT;
 			else
 				sg_chain->Flags =
@@ -1658,8 +1648,7 @@  megasas_build_ldio_fusion(struct megasas_instance *instance,
 		cmd->request_desc->SCSIIO.RequestFlags =
 			(MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY
 			 << MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
-		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
-			(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
+		if (fusion->adapter_type == INVADER_SERIES) {
 			if (io_request->RaidContext.regLockFlags ==
 			    REGION_TYPE_UNUSED)
 				cmd->request_desc->SCSIIO.RequestFlags =
@@ -1700,8 +1689,7 @@  megasas_build_ldio_fusion(struct megasas_instance *instance,
 		cmd->request_desc->SCSIIO.RequestFlags =
 			(MEGASAS_REQ_DESCRIPT_FLAGS_LD_IO
 			 << MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT);
-		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
-			(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
+		if (fusion->adapter_type == INVADER_SERIES) {
 			if (io_request->RaidContext.regLockFlags ==
 			    REGION_TYPE_UNUSED)
 				cmd->request_desc->SCSIIO.RequestFlags =
@@ -1890,8 +1878,7 @@  megasas_build_syspd_fusion(struct megasas_instance *instance,
 		pRAID_Context->timeoutValue =
 			cpu_to_le16((os_timeout_value > timeout_limit) ?
 			timeout_limit : os_timeout_value);
-		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
-			(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
+		if (fusion->adapter_type == INVADER_SERIES) {
 			pRAID_Context->Type = MPI2_TYPE_CUDA;
 			pRAID_Context->nseg = 0x1;
 			io_request->IoFlags |=
@@ -2209,10 +2196,7 @@  complete_cmd_fusion(struct megasas_instance *instance, u32 MSIxIndex)
 		 * pending to be completed
 		 */
 		if (threshold_reply_count >= THRESHOLD_REPLY_COUNT) {
-			if ((instance->pdev->device ==
-				PCI_DEVICE_ID_LSI_INVADER) ||
-				(instance->pdev->device ==
-				PCI_DEVICE_ID_LSI_FURY))
+			if (fusion->adapter_type == INVADER_SERIES)
 				writel(((MSIxIndex & 0x7) << 24) |
 					fusion->last_reply_idx[MSIxIndex],
 					instance->reply_post_host_index_addr[MSIxIndex/8]);
@@ -2228,8 +2212,7 @@  complete_cmd_fusion(struct megasas_instance *instance, u32 MSIxIndex)
 		return IRQ_NONE;
 
 	wmb();
-	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
-		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY))
+	if (fusion->adapter_type == INVADER_SERIES)
 		writel(((MSIxIndex & 0x7) << 24) |
 			fusion->last_reply_idx[MSIxIndex],
 			instance->reply_post_host_index_addr[MSIxIndex/8]);
@@ -2352,8 +2335,7 @@  build_mpt_mfi_pass_thru(struct megasas_instance *instance,
 
 	io_req = cmd->io_request;
 
-	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_INVADER) ||
-		(instance->pdev->device == PCI_DEVICE_ID_LSI_FURY)) {
+	if (fusion->adapter_type == INVADER_SERIES) {
 		struct MPI25_IEEE_SGE_CHAIN64 *sgl_ptr_end =
 			(struct MPI25_IEEE_SGE_CHAIN64 *)&io_req->SGL;
 		sgl_ptr_end += fusion->max_sge_in_main_msg - 1;
diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.h b/drivers/scsi/megaraid/megaraid_sas_fusion.h
index 7d89c1c..473005c 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.h
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.h
@@ -96,6 +96,11 @@  enum MR_RAID_FLAGS_IO_SUB_TYPE {
 #define THRESHOLD_REPLY_COUNT 50
 #define JBOD_MAPS_COUNT	2
 
+enum MR_FUSION_ADAPTER_TYPE {
+	THUNDERBOLT_SERIES = 0,
+	INVADER_SERIES = 1,
+};
+
 /*
  * Raid Context structure which describes MegaRAID specific IO Parameters
  * This resides at offset 0x60 where the SGL normally starts in MPT IO Frames
@@ -857,6 +862,7 @@  struct fusion_context {
 	u8 fast_path_io;
 	struct LD_LOAD_BALANCE_INFO load_balance_info[MAX_LOGICAL_DRIVES_EXT];
 	LD_SPAN_INFO log_to_span[MAX_LOGICAL_DRIVES_EXT];
+	u8 adapter_type;
 };
 
 union desc_value {