cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

megaraid_sas_base.c (253927B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 *  Linux MegaRAID driver for SAS based RAID controllers
      4 *
      5 *  Copyright (c) 2003-2013  LSI Corporation
      6 *  Copyright (c) 2013-2016  Avago Technologies
      7 *  Copyright (c) 2016-2018  Broadcom Inc.
      8 *
      9 *  Authors: Broadcom Inc.
     10 *           Sreenivas Bagalkote
     11 *           Sumant Patro
     12 *           Bo Yang
     13 *           Adam Radford
     14 *           Kashyap Desai <kashyap.desai@broadcom.com>
     15 *           Sumit Saxena <sumit.saxena@broadcom.com>
     16 *
     17 *  Send feedback to: megaraidlinux.pdl@broadcom.com
     18 */
     19
     20#include <linux/kernel.h>
     21#include <linux/types.h>
     22#include <linux/pci.h>
     23#include <linux/list.h>
     24#include <linux/moduleparam.h>
     25#include <linux/module.h>
     26#include <linux/spinlock.h>
     27#include <linux/interrupt.h>
     28#include <linux/delay.h>
     29#include <linux/uio.h>
     30#include <linux/slab.h>
     31#include <linux/uaccess.h>
     32#include <asm/unaligned.h>
     33#include <linux/fs.h>
     34#include <linux/compat.h>
     35#include <linux/blkdev.h>
     36#include <linux/mutex.h>
     37#include <linux/poll.h>
     38#include <linux/vmalloc.h>
     39#include <linux/irq_poll.h>
     40#include <linux/blk-mq-pci.h>
     41
     42#include <scsi/scsi.h>
     43#include <scsi/scsi_cmnd.h>
     44#include <scsi/scsi_device.h>
     45#include <scsi/scsi_host.h>
     46#include <scsi/scsi_tcq.h>
     47#include <scsi/scsi_dbg.h>
     48#include "megaraid_sas_fusion.h"
     49#include "megaraid_sas.h"
     50
     51/*
     52 * Number of sectors per IO command
     53 * Will be set in megasas_init_mfi if user does not provide
     54 */
     55static unsigned int max_sectors;
     56module_param_named(max_sectors, max_sectors, int, 0444);
     57MODULE_PARM_DESC(max_sectors,
     58	"Maximum number of sectors per IO command");
     59
     60static int msix_disable;
     61module_param(msix_disable, int, 0444);
     62MODULE_PARM_DESC(msix_disable, "Disable MSI-X interrupt handling. Default: 0");
     63
     64static unsigned int msix_vectors;
     65module_param(msix_vectors, int, 0444);
     66MODULE_PARM_DESC(msix_vectors, "MSI-X max vector count. Default: Set by FW");
     67
     68static int allow_vf_ioctls;
     69module_param(allow_vf_ioctls, int, 0444);
     70MODULE_PARM_DESC(allow_vf_ioctls, "Allow ioctls in SR-IOV VF mode. Default: 0");
     71
     72static unsigned int throttlequeuedepth = MEGASAS_THROTTLE_QUEUE_DEPTH;
     73module_param(throttlequeuedepth, int, 0444);
     74MODULE_PARM_DESC(throttlequeuedepth,
     75	"Adapter queue depth when throttled due to I/O timeout. Default: 16");
     76
     77unsigned int resetwaittime = MEGASAS_RESET_WAIT_TIME;
     78module_param(resetwaittime, int, 0444);
     79MODULE_PARM_DESC(resetwaittime, "Wait time in (1-180s) after I/O timeout before resetting adapter. Default: 180s");
     80
     81static int smp_affinity_enable = 1;
     82module_param(smp_affinity_enable, int, 0444);
     83MODULE_PARM_DESC(smp_affinity_enable, "SMP affinity feature enable/disable Default: enable(1)");
     84
     85static int rdpq_enable = 1;
     86module_param(rdpq_enable, int, 0444);
     87MODULE_PARM_DESC(rdpq_enable, "Allocate reply queue in chunks for large queue depth enable/disable Default: enable(1)");
     88
     89unsigned int dual_qdepth_disable;
     90module_param(dual_qdepth_disable, int, 0444);
     91MODULE_PARM_DESC(dual_qdepth_disable, "Disable dual queue depth feature. Default: 0");
     92
     93static unsigned int scmd_timeout = MEGASAS_DEFAULT_CMD_TIMEOUT;
     94module_param(scmd_timeout, int, 0444);
     95MODULE_PARM_DESC(scmd_timeout, "scsi command timeout (10-90s), default 90s. See megasas_reset_timer.");
     96
     97int perf_mode = -1;
     98module_param(perf_mode, int, 0444);
     99MODULE_PARM_DESC(perf_mode, "Performance mode (only for Aero adapters), options:\n\t\t"
    100		"0 - balanced: High iops and low latency queues are allocated &\n\t\t"
    101		"interrupt coalescing is enabled only on high iops queues\n\t\t"
    102		"1 - iops: High iops queues are not allocated &\n\t\t"
    103		"interrupt coalescing is enabled on all queues\n\t\t"
    104		"2 - latency: High iops queues are not allocated &\n\t\t"
    105		"interrupt coalescing is disabled on all queues\n\t\t"
    106		"default mode is 'balanced'"
    107		);
    108
    109int event_log_level = MFI_EVT_CLASS_CRITICAL;
    110module_param(event_log_level, int, 0644);
    111MODULE_PARM_DESC(event_log_level, "Asynchronous event logging level- range is: -2(CLASS_DEBUG) to 4(CLASS_DEAD), Default: 2(CLASS_CRITICAL)");
    112
    113unsigned int enable_sdev_max_qd;
    114module_param(enable_sdev_max_qd, int, 0444);
    115MODULE_PARM_DESC(enable_sdev_max_qd, "Enable sdev max qd as can_queue. Default: 0");
    116
    117int poll_queues;
    118module_param(poll_queues, int, 0444);
    119MODULE_PARM_DESC(poll_queues, "Number of queues to be use for io_uring poll mode.\n\t\t"
    120		"This parameter is effective only if host_tagset_enable=1 &\n\t\t"
    121		"It is not applicable for MFI_SERIES. &\n\t\t"
    122		"Driver will work in latency mode. &\n\t\t"
    123		"High iops queues are not allocated &\n\t\t"
    124		);
    125
    126int host_tagset_enable = 1;
    127module_param(host_tagset_enable, int, 0444);
    128MODULE_PARM_DESC(host_tagset_enable, "Shared host tagset enable/disable Default: enable(1)");
    129
    130MODULE_LICENSE("GPL");
    131MODULE_VERSION(MEGASAS_VERSION);
    132MODULE_AUTHOR("megaraidlinux.pdl@broadcom.com");
    133MODULE_DESCRIPTION("Broadcom MegaRAID SAS Driver");
    134
    135int megasas_transition_to_ready(struct megasas_instance *instance, int ocr);
    136static int megasas_get_pd_list(struct megasas_instance *instance);
    137static int megasas_ld_list_query(struct megasas_instance *instance,
    138				 u8 query_type);
    139static int megasas_issue_init_mfi(struct megasas_instance *instance);
    140static int megasas_register_aen(struct megasas_instance *instance,
    141				u32 seq_num, u32 class_locale_word);
    142static void megasas_get_pd_info(struct megasas_instance *instance,
    143				struct scsi_device *sdev);
    144static void
    145megasas_set_ld_removed_by_fw(struct megasas_instance *instance);
    146
    147/*
    148 * PCI ID table for all supported controllers
    149 */
    150static struct pci_device_id megasas_pci_table[] = {
    151
    152	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1064R)},
    153	/* xscale IOP */
    154	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1078R)},
    155	/* ppc IOP */
    156	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1078DE)},
    157	/* ppc IOP */
    158	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1078GEN2)},
    159	/* gen2*/
    160	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS0079GEN2)},
    161	/* gen2*/
    162	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS0073SKINNY)},
    163	/* skinny*/
    164	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS0071SKINNY)},
    165	/* skinny*/
    166	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_VERDE_ZCR)},
    167	/* xscale IOP, vega */
    168	{PCI_DEVICE(PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_DELL_PERC5)},
    169	/* xscale IOP */
    170	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FUSION)},
    171	/* Fusion */
    172	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_PLASMA)},
    173	/* Plasma */
    174	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_INVADER)},
    175	/* Invader */
    176	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_FURY)},
    177	/* Fury */
    178	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_INTRUDER)},
    179	/* Intruder */
    180	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_INTRUDER_24)},
    181	/* Intruder 24 port*/
    182	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_CUTLASS_52)},
    183	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_CUTLASS_53)},
    184	/* VENTURA */
    185	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_VENTURA)},
    186	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_CRUSADER)},
    187	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_HARPOON)},
    188	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_TOMCAT)},
    189	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_VENTURA_4PORT)},
    190	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_CRUSADER_4PORT)},
    191	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_AERO_10E1)},
    192	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_AERO_10E2)},
    193	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_AERO_10E5)},
    194	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_AERO_10E6)},
    195	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_AERO_10E0)},
    196	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_AERO_10E3)},
    197	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_AERO_10E4)},
    198	{PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_AERO_10E7)},
    199	{}
    200};
    201
    202MODULE_DEVICE_TABLE(pci, megasas_pci_table);
    203
    204static int megasas_mgmt_majorno;
    205struct megasas_mgmt_info megasas_mgmt_info;
    206static struct fasync_struct *megasas_async_queue;
    207static DEFINE_MUTEX(megasas_async_queue_mutex);
    208
    209static int megasas_poll_wait_aen;
    210static DECLARE_WAIT_QUEUE_HEAD(megasas_poll_wait);
    211static u32 support_poll_for_event;
    212u32 megasas_dbg_lvl;
    213static u32 support_device_change;
    214static bool support_nvme_encapsulation;
    215static bool support_pci_lane_margining;
    216
    217/* define lock for aen poll */
    218static DEFINE_SPINLOCK(poll_aen_lock);
    219
    220extern struct dentry *megasas_debugfs_root;
    221extern int megasas_blk_mq_poll(struct Scsi_Host *shost, unsigned int queue_num);
    222
    223void
    224megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,
    225		     u8 alt_status);
    226static u32
    227megasas_read_fw_status_reg_gen2(struct megasas_instance *instance);
    228static int
    229megasas_adp_reset_gen2(struct megasas_instance *instance,
    230		       struct megasas_register_set __iomem *reg_set);
    231static irqreturn_t megasas_isr(int irq, void *devp);
    232static u32
    233megasas_init_adapter_mfi(struct megasas_instance *instance);
    234u32
    235megasas_build_and_issue_cmd(struct megasas_instance *instance,
    236			    struct scsi_cmnd *scmd);
    237static void megasas_complete_cmd_dpc(unsigned long instance_addr);
    238int
    239wait_and_poll(struct megasas_instance *instance, struct megasas_cmd *cmd,
    240	int seconds);
    241void megasas_fusion_ocr_wq(struct work_struct *work);
    242static int megasas_get_ld_vf_affiliation(struct megasas_instance *instance,
    243					 int initial);
    244static int
    245megasas_set_dma_mask(struct megasas_instance *instance);
    246static int
    247megasas_alloc_ctrl_mem(struct megasas_instance *instance);
    248static inline void
    249megasas_free_ctrl_mem(struct megasas_instance *instance);
    250static inline int
    251megasas_alloc_ctrl_dma_buffers(struct megasas_instance *instance);
    252static inline void
    253megasas_free_ctrl_dma_buffers(struct megasas_instance *instance);
    254static inline void
    255megasas_init_ctrl_params(struct megasas_instance *instance);
    256
    257u32 megasas_readl(struct megasas_instance *instance,
    258		  const volatile void __iomem *addr)
    259{
    260	u32 i = 0, ret_val;
    261	/*
    262	 * Due to a HW errata in Aero controllers, reads to certain
    263	 * Fusion registers could intermittently return all zeroes.
    264	 * This behavior is transient in nature and subsequent reads will
    265	 * return valid value. As a workaround in driver, retry readl for
    266	 * upto three times until a non-zero value is read.
    267	 */
    268	if (instance->adapter_type == AERO_SERIES) {
    269		do {
    270			ret_val = readl(addr);
    271			i++;
    272		} while (ret_val == 0 && i < 3);
    273		return ret_val;
    274	} else {
    275		return readl(addr);
    276	}
    277}
    278
    279/**
    280 * megasas_set_dma_settings -	Populate DMA address, length and flags for DCMDs
    281 * @instance:			Adapter soft state
    282 * @dcmd:			DCMD frame inside MFI command
    283 * @dma_addr:			DMA address of buffer to be passed to FW
    284 * @dma_len:			Length of DMA buffer to be passed to FW
    285 * @return:			void
    286 */
    287void megasas_set_dma_settings(struct megasas_instance *instance,
    288			      struct megasas_dcmd_frame *dcmd,
    289			      dma_addr_t dma_addr, u32 dma_len)
    290{
    291	if (instance->consistent_mask_64bit) {
    292		dcmd->sgl.sge64[0].phys_addr = cpu_to_le64(dma_addr);
    293		dcmd->sgl.sge64[0].length = cpu_to_le32(dma_len);
    294		dcmd->flags = cpu_to_le16(dcmd->flags | MFI_FRAME_SGL64);
    295
    296	} else {
    297		dcmd->sgl.sge32[0].phys_addr =
    298				cpu_to_le32(lower_32_bits(dma_addr));
    299		dcmd->sgl.sge32[0].length = cpu_to_le32(dma_len);
    300		dcmd->flags = cpu_to_le16(dcmd->flags);
    301	}
    302}
    303
    304static void
    305megasas_issue_dcmd(struct megasas_instance *instance, struct megasas_cmd *cmd)
    306{
    307	instance->instancet->fire_cmd(instance,
    308		cmd->frame_phys_addr, 0, instance->reg_set);
    309	return;
    310}
    311
    312/**
    313 * megasas_get_cmd -	Get a command from the free pool
    314 * @instance:		Adapter soft state
    315 *
    316 * Returns a free command from the pool
    317 */
    318struct megasas_cmd *megasas_get_cmd(struct megasas_instance
    319						  *instance)
    320{
    321	unsigned long flags;
    322	struct megasas_cmd *cmd = NULL;
    323
    324	spin_lock_irqsave(&instance->mfi_pool_lock, flags);
    325
    326	if (!list_empty(&instance->cmd_pool)) {
    327		cmd = list_entry((&instance->cmd_pool)->next,
    328				 struct megasas_cmd, list);
    329		list_del_init(&cmd->list);
    330	} else {
    331		dev_err(&instance->pdev->dev, "Command pool empty!\n");
    332	}
    333
    334	spin_unlock_irqrestore(&instance->mfi_pool_lock, flags);
    335	return cmd;
    336}
    337
    338/**
    339 * megasas_return_cmd -	Return a cmd to free command pool
    340 * @instance:		Adapter soft state
    341 * @cmd:		Command packet to be returned to free command pool
    342 */
    343void
    344megasas_return_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd)
    345{
    346	unsigned long flags;
    347	u32 blk_tags;
    348	struct megasas_cmd_fusion *cmd_fusion;
    349	struct fusion_context *fusion = instance->ctrl_context;
    350
    351	/* This flag is used only for fusion adapter.
    352	 * Wait for Interrupt for Polled mode DCMD
    353	 */
    354	if (cmd->flags & DRV_DCMD_POLLED_MODE)
    355		return;
    356
    357	spin_lock_irqsave(&instance->mfi_pool_lock, flags);
    358
    359	if (fusion) {
    360		blk_tags = instance->max_scsi_cmds + cmd->index;
    361		cmd_fusion = fusion->cmd_list[blk_tags];
    362		megasas_return_cmd_fusion(instance, cmd_fusion);
    363	}
    364	cmd->scmd = NULL;
    365	cmd->frame_count = 0;
    366	cmd->flags = 0;
    367	memset(cmd->frame, 0, instance->mfi_frame_size);
    368	cmd->frame->io.context = cpu_to_le32(cmd->index);
    369	if (!fusion && reset_devices)
    370		cmd->frame->hdr.cmd = MFI_CMD_INVALID;
    371	list_add(&cmd->list, (&instance->cmd_pool)->next);
    372
    373	spin_unlock_irqrestore(&instance->mfi_pool_lock, flags);
    374
    375}
    376
    377static const char *
    378format_timestamp(uint32_t timestamp)
    379{
    380	static char buffer[32];
    381
    382	if ((timestamp & 0xff000000) == 0xff000000)
    383		snprintf(buffer, sizeof(buffer), "boot + %us", timestamp &
    384		0x00ffffff);
    385	else
    386		snprintf(buffer, sizeof(buffer), "%us", timestamp);
    387	return buffer;
    388}
    389
    390static const char *
    391format_class(int8_t class)
    392{
    393	static char buffer[6];
    394
    395	switch (class) {
    396	case MFI_EVT_CLASS_DEBUG:
    397		return "debug";
    398	case MFI_EVT_CLASS_PROGRESS:
    399		return "progress";
    400	case MFI_EVT_CLASS_INFO:
    401		return "info";
    402	case MFI_EVT_CLASS_WARNING:
    403		return "WARN";
    404	case MFI_EVT_CLASS_CRITICAL:
    405		return "CRIT";
    406	case MFI_EVT_CLASS_FATAL:
    407		return "FATAL";
    408	case MFI_EVT_CLASS_DEAD:
    409		return "DEAD";
    410	default:
    411		snprintf(buffer, sizeof(buffer), "%d", class);
    412		return buffer;
    413	}
    414}
    415
    416/**
    417  * megasas_decode_evt: Decode FW AEN event and print critical event
    418  * for information.
    419  * @instance:			Adapter soft state
    420  */
    421static void
    422megasas_decode_evt(struct megasas_instance *instance)
    423{
    424	struct megasas_evt_detail *evt_detail = instance->evt_detail;
    425	union megasas_evt_class_locale class_locale;
    426	class_locale.word = le32_to_cpu(evt_detail->cl.word);
    427
    428	if ((event_log_level < MFI_EVT_CLASS_DEBUG) ||
    429	    (event_log_level > MFI_EVT_CLASS_DEAD)) {
    430		printk(KERN_WARNING "megaraid_sas: provided event log level is out of range, setting it to default 2(CLASS_CRITICAL), permissible range is: -2 to 4\n");
    431		event_log_level = MFI_EVT_CLASS_CRITICAL;
    432	}
    433
    434	if (class_locale.members.class >= event_log_level)
    435		dev_info(&instance->pdev->dev, "%d (%s/0x%04x/%s) - %s\n",
    436			le32_to_cpu(evt_detail->seq_num),
    437			format_timestamp(le32_to_cpu(evt_detail->time_stamp)),
    438			(class_locale.members.locale),
    439			format_class(class_locale.members.class),
    440			evt_detail->description);
    441
    442	if (megasas_dbg_lvl & LD_PD_DEBUG)
    443		dev_info(&instance->pdev->dev,
    444			 "evt_detail.args.ld.target_id/index %d/%d\n",
    445			 evt_detail->args.ld.target_id, evt_detail->args.ld.ld_index);
    446
    447}
    448
    449/*
    450 * The following functions are defined for xscale
    451 * (deviceid : 1064R, PERC5) controllers
    452 */
    453
    454/**
    455 * megasas_enable_intr_xscale -	Enables interrupts
    456 * @instance:	Adapter soft state
    457 */
    458static inline void
    459megasas_enable_intr_xscale(struct megasas_instance *instance)
    460{
    461	struct megasas_register_set __iomem *regs;
    462
    463	regs = instance->reg_set;
    464	writel(0, &(regs)->outbound_intr_mask);
    465
    466	/* Dummy readl to force pci flush */
    467	readl(&regs->outbound_intr_mask);
    468}
    469
    470/**
    471 * megasas_disable_intr_xscale -Disables interrupt
    472 * @instance:	Adapter soft state
    473 */
    474static inline void
    475megasas_disable_intr_xscale(struct megasas_instance *instance)
    476{
    477	struct megasas_register_set __iomem *regs;
    478	u32 mask = 0x1f;
    479
    480	regs = instance->reg_set;
    481	writel(mask, &regs->outbound_intr_mask);
    482	/* Dummy readl to force pci flush */
    483	readl(&regs->outbound_intr_mask);
    484}
    485
    486/**
    487 * megasas_read_fw_status_reg_xscale - returns the current FW status value
    488 * @instance:	Adapter soft state
    489 */
    490static u32
    491megasas_read_fw_status_reg_xscale(struct megasas_instance *instance)
    492{
    493	return readl(&instance->reg_set->outbound_msg_0);
    494}
    495/**
    496 * megasas_clear_intr_xscale -	Check & clear interrupt
    497 * @instance:	Adapter soft state
    498 */
    499static int
    500megasas_clear_intr_xscale(struct megasas_instance *instance)
    501{
    502	u32 status;
    503	u32 mfiStatus = 0;
    504	struct megasas_register_set __iomem *regs;
    505	regs = instance->reg_set;
    506
    507	/*
    508	 * Check if it is our interrupt
    509	 */
    510	status = readl(&regs->outbound_intr_status);
    511
    512	if (status & MFI_OB_INTR_STATUS_MASK)
    513		mfiStatus = MFI_INTR_FLAG_REPLY_MESSAGE;
    514	if (status & MFI_XSCALE_OMR0_CHANGE_INTERRUPT)
    515		mfiStatus |= MFI_INTR_FLAG_FIRMWARE_STATE_CHANGE;
    516
    517	/*
    518	 * Clear the interrupt by writing back the same value
    519	 */
    520	if (mfiStatus)
    521		writel(status, &regs->outbound_intr_status);
    522
    523	/* Dummy readl to force pci flush */
    524	readl(&regs->outbound_intr_status);
    525
    526	return mfiStatus;
    527}
    528
    529/**
    530 * megasas_fire_cmd_xscale -	Sends command to the FW
    531 * @instance:		Adapter soft state
    532 * @frame_phys_addr :	Physical address of cmd
    533 * @frame_count :	Number of frames for the command
    534 * @regs :		MFI register set
    535 */
    536static inline void
    537megasas_fire_cmd_xscale(struct megasas_instance *instance,
    538		dma_addr_t frame_phys_addr,
    539		u32 frame_count,
    540		struct megasas_register_set __iomem *regs)
    541{
    542	unsigned long flags;
    543
    544	spin_lock_irqsave(&instance->hba_lock, flags);
    545	writel((frame_phys_addr >> 3)|(frame_count),
    546	       &(regs)->inbound_queue_port);
    547	spin_unlock_irqrestore(&instance->hba_lock, flags);
    548}
    549
    550/**
    551 * megasas_adp_reset_xscale -  For controller reset
    552 * @instance:	Adapter soft state
    553 * @regs:	MFI register set
    554 */
    555static int
    556megasas_adp_reset_xscale(struct megasas_instance *instance,
    557	struct megasas_register_set __iomem *regs)
    558{
    559	u32 i;
    560	u32 pcidata;
    561
    562	writel(MFI_ADP_RESET, &regs->inbound_doorbell);
    563
    564	for (i = 0; i < 3; i++)
    565		msleep(1000); /* sleep for 3 secs */
    566	pcidata  = 0;
    567	pci_read_config_dword(instance->pdev, MFI_1068_PCSR_OFFSET, &pcidata);
    568	dev_notice(&instance->pdev->dev, "pcidata = %x\n", pcidata);
    569	if (pcidata & 0x2) {
    570		dev_notice(&instance->pdev->dev, "mfi 1068 offset read=%x\n", pcidata);
    571		pcidata &= ~0x2;
    572		pci_write_config_dword(instance->pdev,
    573				MFI_1068_PCSR_OFFSET, pcidata);
    574
    575		for (i = 0; i < 2; i++)
    576			msleep(1000); /* need to wait 2 secs again */
    577
    578		pcidata  = 0;
    579		pci_read_config_dword(instance->pdev,
    580				MFI_1068_FW_HANDSHAKE_OFFSET, &pcidata);
    581		dev_notice(&instance->pdev->dev, "1068 offset handshake read=%x\n", pcidata);
    582		if ((pcidata & 0xffff0000) == MFI_1068_FW_READY) {
    583			dev_notice(&instance->pdev->dev, "1068 offset pcidt=%x\n", pcidata);
    584			pcidata = 0;
    585			pci_write_config_dword(instance->pdev,
    586				MFI_1068_FW_HANDSHAKE_OFFSET, pcidata);
    587		}
    588	}
    589	return 0;
    590}
    591
    592/**
    593 * megasas_check_reset_xscale -	For controller reset check
    594 * @instance:	Adapter soft state
    595 * @regs:	MFI register set
    596 */
    597static int
    598megasas_check_reset_xscale(struct megasas_instance *instance,
    599		struct megasas_register_set __iomem *regs)
    600{
    601	if ((atomic_read(&instance->adprecovery) != MEGASAS_HBA_OPERATIONAL) &&
    602	    (le32_to_cpu(*instance->consumer) ==
    603		MEGASAS_ADPRESET_INPROG_SIGN))
    604		return 1;
    605	return 0;
    606}
    607
    608static struct megasas_instance_template megasas_instance_template_xscale = {
    609
    610	.fire_cmd = megasas_fire_cmd_xscale,
    611	.enable_intr = megasas_enable_intr_xscale,
    612	.disable_intr = megasas_disable_intr_xscale,
    613	.clear_intr = megasas_clear_intr_xscale,
    614	.read_fw_status_reg = megasas_read_fw_status_reg_xscale,
    615	.adp_reset = megasas_adp_reset_xscale,
    616	.check_reset = megasas_check_reset_xscale,
    617	.service_isr = megasas_isr,
    618	.tasklet = megasas_complete_cmd_dpc,
    619	.init_adapter = megasas_init_adapter_mfi,
    620	.build_and_issue_cmd = megasas_build_and_issue_cmd,
    621	.issue_dcmd = megasas_issue_dcmd,
    622};
    623
    624/*
    625 * This is the end of set of functions & definitions specific
    626 * to xscale (deviceid : 1064R, PERC5) controllers
    627 */
    628
    629/*
    630 * The following functions are defined for ppc (deviceid : 0x60)
    631 * controllers
    632 */
    633
    634/**
    635 * megasas_enable_intr_ppc -	Enables interrupts
    636 * @instance:	Adapter soft state
    637 */
    638static inline void
    639megasas_enable_intr_ppc(struct megasas_instance *instance)
    640{
    641	struct megasas_register_set __iomem *regs;
    642
    643	regs = instance->reg_set;
    644	writel(0xFFFFFFFF, &(regs)->outbound_doorbell_clear);
    645
    646	writel(~0x80000000, &(regs)->outbound_intr_mask);
    647
    648	/* Dummy readl to force pci flush */
    649	readl(&regs->outbound_intr_mask);
    650}
    651
    652/**
    653 * megasas_disable_intr_ppc -	Disable interrupt
    654 * @instance:	Adapter soft state
    655 */
    656static inline void
    657megasas_disable_intr_ppc(struct megasas_instance *instance)
    658{
    659	struct megasas_register_set __iomem *regs;
    660	u32 mask = 0xFFFFFFFF;
    661
    662	regs = instance->reg_set;
    663	writel(mask, &regs->outbound_intr_mask);
    664	/* Dummy readl to force pci flush */
    665	readl(&regs->outbound_intr_mask);
    666}
    667
    668/**
    669 * megasas_read_fw_status_reg_ppc - returns the current FW status value
    670 * @instance:	Adapter soft state
    671 */
    672static u32
    673megasas_read_fw_status_reg_ppc(struct megasas_instance *instance)
    674{
    675	return readl(&instance->reg_set->outbound_scratch_pad_0);
    676}
    677
    678/**
    679 * megasas_clear_intr_ppc -	Check & clear interrupt
    680 * @instance:	Adapter soft state
    681 */
    682static int
    683megasas_clear_intr_ppc(struct megasas_instance *instance)
    684{
    685	u32 status, mfiStatus = 0;
    686	struct megasas_register_set __iomem *regs;
    687	regs = instance->reg_set;
    688
    689	/*
    690	 * Check if it is our interrupt
    691	 */
    692	status = readl(&regs->outbound_intr_status);
    693
    694	if (status & MFI_REPLY_1078_MESSAGE_INTERRUPT)
    695		mfiStatus = MFI_INTR_FLAG_REPLY_MESSAGE;
    696
    697	if (status & MFI_G2_OUTBOUND_DOORBELL_CHANGE_INTERRUPT)
    698		mfiStatus |= MFI_INTR_FLAG_FIRMWARE_STATE_CHANGE;
    699
    700	/*
    701	 * Clear the interrupt by writing back the same value
    702	 */
    703	writel(status, &regs->outbound_doorbell_clear);
    704
    705	/* Dummy readl to force pci flush */
    706	readl(&regs->outbound_doorbell_clear);
    707
    708	return mfiStatus;
    709}
    710
    711/**
    712 * megasas_fire_cmd_ppc -	Sends command to the FW
    713 * @instance:		Adapter soft state
    714 * @frame_phys_addr:	Physical address of cmd
    715 * @frame_count:	Number of frames for the command
    716 * @regs:		MFI register set
    717 */
    718static inline void
    719megasas_fire_cmd_ppc(struct megasas_instance *instance,
    720		dma_addr_t frame_phys_addr,
    721		u32 frame_count,
    722		struct megasas_register_set __iomem *regs)
    723{
    724	unsigned long flags;
    725
    726	spin_lock_irqsave(&instance->hba_lock, flags);
    727	writel((frame_phys_addr | (frame_count<<1))|1,
    728			&(regs)->inbound_queue_port);
    729	spin_unlock_irqrestore(&instance->hba_lock, flags);
    730}
    731
    732/**
    733 * megasas_check_reset_ppc -	For controller reset check
    734 * @instance:	Adapter soft state
    735 * @regs:	MFI register set
    736 */
    737static int
    738megasas_check_reset_ppc(struct megasas_instance *instance,
    739			struct megasas_register_set __iomem *regs)
    740{
    741	if (atomic_read(&instance->adprecovery) != MEGASAS_HBA_OPERATIONAL)
    742		return 1;
    743
    744	return 0;
    745}
    746
    747static struct megasas_instance_template megasas_instance_template_ppc = {
    748
    749	.fire_cmd = megasas_fire_cmd_ppc,
    750	.enable_intr = megasas_enable_intr_ppc,
    751	.disable_intr = megasas_disable_intr_ppc,
    752	.clear_intr = megasas_clear_intr_ppc,
    753	.read_fw_status_reg = megasas_read_fw_status_reg_ppc,
    754	.adp_reset = megasas_adp_reset_xscale,
    755	.check_reset = megasas_check_reset_ppc,
    756	.service_isr = megasas_isr,
    757	.tasklet = megasas_complete_cmd_dpc,
    758	.init_adapter = megasas_init_adapter_mfi,
    759	.build_and_issue_cmd = megasas_build_and_issue_cmd,
    760	.issue_dcmd = megasas_issue_dcmd,
    761};
    762
    763/**
    764 * megasas_enable_intr_skinny -	Enables interrupts
    765 * @instance:	Adapter soft state
    766 */
    767static inline void
    768megasas_enable_intr_skinny(struct megasas_instance *instance)
    769{
    770	struct megasas_register_set __iomem *regs;
    771
    772	regs = instance->reg_set;
    773	writel(0xFFFFFFFF, &(regs)->outbound_intr_mask);
    774
    775	writel(~MFI_SKINNY_ENABLE_INTERRUPT_MASK, &(regs)->outbound_intr_mask);
    776
    777	/* Dummy readl to force pci flush */
    778	readl(&regs->outbound_intr_mask);
    779}
    780
    781/**
    782 * megasas_disable_intr_skinny -	Disables interrupt
    783 * @instance:	Adapter soft state
    784 */
    785static inline void
    786megasas_disable_intr_skinny(struct megasas_instance *instance)
    787{
    788	struct megasas_register_set __iomem *regs;
    789	u32 mask = 0xFFFFFFFF;
    790
    791	regs = instance->reg_set;
    792	writel(mask, &regs->outbound_intr_mask);
    793	/* Dummy readl to force pci flush */
    794	readl(&regs->outbound_intr_mask);
    795}
    796
    797/**
    798 * megasas_read_fw_status_reg_skinny - returns the current FW status value
    799 * @instance:	Adapter soft state
    800 */
    801static u32
    802megasas_read_fw_status_reg_skinny(struct megasas_instance *instance)
    803{
    804	return readl(&instance->reg_set->outbound_scratch_pad_0);
    805}
    806
    807/**
    808 * megasas_clear_intr_skinny -	Check & clear interrupt
    809 * @instance:	Adapter soft state
    810 */
    811static int
    812megasas_clear_intr_skinny(struct megasas_instance *instance)
    813{
    814	u32 status;
    815	u32 mfiStatus = 0;
    816	struct megasas_register_set __iomem *regs;
    817	regs = instance->reg_set;
    818
    819	/*
    820	 * Check if it is our interrupt
    821	 */
    822	status = readl(&regs->outbound_intr_status);
    823
    824	if (!(status & MFI_SKINNY_ENABLE_INTERRUPT_MASK)) {
    825		return 0;
    826	}
    827
    828	/*
    829	 * Check if it is our interrupt
    830	 */
    831	if ((megasas_read_fw_status_reg_skinny(instance) & MFI_STATE_MASK) ==
    832	    MFI_STATE_FAULT) {
    833		mfiStatus = MFI_INTR_FLAG_FIRMWARE_STATE_CHANGE;
    834	} else
    835		mfiStatus = MFI_INTR_FLAG_REPLY_MESSAGE;
    836
    837	/*
    838	 * Clear the interrupt by writing back the same value
    839	 */
    840	writel(status, &regs->outbound_intr_status);
    841
    842	/*
    843	 * dummy read to flush PCI
    844	 */
    845	readl(&regs->outbound_intr_status);
    846
    847	return mfiStatus;
    848}
    849
    850/**
    851 * megasas_fire_cmd_skinny -	Sends command to the FW
    852 * @instance:		Adapter soft state
    853 * @frame_phys_addr:	Physical address of cmd
    854 * @frame_count:	Number of frames for the command
    855 * @regs:		MFI register set
    856 */
    857static inline void
    858megasas_fire_cmd_skinny(struct megasas_instance *instance,
    859			dma_addr_t frame_phys_addr,
    860			u32 frame_count,
    861			struct megasas_register_set __iomem *regs)
    862{
    863	unsigned long flags;
    864
    865	spin_lock_irqsave(&instance->hba_lock, flags);
    866	writel(upper_32_bits(frame_phys_addr),
    867	       &(regs)->inbound_high_queue_port);
    868	writel((lower_32_bits(frame_phys_addr) | (frame_count<<1))|1,
    869	       &(regs)->inbound_low_queue_port);
    870	spin_unlock_irqrestore(&instance->hba_lock, flags);
    871}
    872
    873/**
    874 * megasas_check_reset_skinny -	For controller reset check
    875 * @instance:	Adapter soft state
    876 * @regs:	MFI register set
    877 */
    878static int
    879megasas_check_reset_skinny(struct megasas_instance *instance,
    880				struct megasas_register_set __iomem *regs)
    881{
    882	if (atomic_read(&instance->adprecovery) != MEGASAS_HBA_OPERATIONAL)
    883		return 1;
    884
    885	return 0;
    886}
    887
    888static struct megasas_instance_template megasas_instance_template_skinny = {
    889
    890	.fire_cmd = megasas_fire_cmd_skinny,
    891	.enable_intr = megasas_enable_intr_skinny,
    892	.disable_intr = megasas_disable_intr_skinny,
    893	.clear_intr = megasas_clear_intr_skinny,
    894	.read_fw_status_reg = megasas_read_fw_status_reg_skinny,
    895	.adp_reset = megasas_adp_reset_gen2,
    896	.check_reset = megasas_check_reset_skinny,
    897	.service_isr = megasas_isr,
    898	.tasklet = megasas_complete_cmd_dpc,
    899	.init_adapter = megasas_init_adapter_mfi,
    900	.build_and_issue_cmd = megasas_build_and_issue_cmd,
    901	.issue_dcmd = megasas_issue_dcmd,
    902};
    903
    904
    905/*
    906 * The following functions are defined for gen2 (deviceid : 0x78 0x79)
    907 * controllers
    908 */
    909
    910/**
    911 * megasas_enable_intr_gen2 -  Enables interrupts
    912 * @instance:	Adapter soft state
    913 */
    914static inline void
    915megasas_enable_intr_gen2(struct megasas_instance *instance)
    916{
    917	struct megasas_register_set __iomem *regs;
    918
    919	regs = instance->reg_set;
    920	writel(0xFFFFFFFF, &(regs)->outbound_doorbell_clear);
    921
    922	/* write ~0x00000005 (4 & 1) to the intr mask*/
    923	writel(~MFI_GEN2_ENABLE_INTERRUPT_MASK, &(regs)->outbound_intr_mask);
    924
    925	/* Dummy readl to force pci flush */
    926	readl(&regs->outbound_intr_mask);
    927}
    928
    929/**
    930 * megasas_disable_intr_gen2 - Disables interrupt
    931 * @instance:	Adapter soft state
    932 */
    933static inline void
    934megasas_disable_intr_gen2(struct megasas_instance *instance)
    935{
    936	struct megasas_register_set __iomem *regs;
    937	u32 mask = 0xFFFFFFFF;
    938
    939	regs = instance->reg_set;
    940	writel(mask, &regs->outbound_intr_mask);
    941	/* Dummy readl to force pci flush */
    942	readl(&regs->outbound_intr_mask);
    943}
    944
    945/**
    946 * megasas_read_fw_status_reg_gen2 - returns the current FW status value
    947 * @instance:	Adapter soft state
    948 */
    949static u32
    950megasas_read_fw_status_reg_gen2(struct megasas_instance *instance)
    951{
    952	return readl(&instance->reg_set->outbound_scratch_pad_0);
    953}
    954
    955/**
    956 * megasas_clear_intr_gen2 -      Check & clear interrupt
    957 * @instance:	Adapter soft state
    958 */
    959static int
    960megasas_clear_intr_gen2(struct megasas_instance *instance)
    961{
    962	u32 status;
    963	u32 mfiStatus = 0;
    964	struct megasas_register_set __iomem *regs;
    965	regs = instance->reg_set;
    966
    967	/*
    968	 * Check if it is our interrupt
    969	 */
    970	status = readl(&regs->outbound_intr_status);
    971
    972	if (status & MFI_INTR_FLAG_REPLY_MESSAGE) {
    973		mfiStatus = MFI_INTR_FLAG_REPLY_MESSAGE;
    974	}
    975	if (status & MFI_G2_OUTBOUND_DOORBELL_CHANGE_INTERRUPT) {
    976		mfiStatus |= MFI_INTR_FLAG_FIRMWARE_STATE_CHANGE;
    977	}
    978
    979	/*
    980	 * Clear the interrupt by writing back the same value
    981	 */
    982	if (mfiStatus)
    983		writel(status, &regs->outbound_doorbell_clear);
    984
    985	/* Dummy readl to force pci flush */
    986	readl(&regs->outbound_intr_status);
    987
    988	return mfiStatus;
    989}
    990
    991/**
    992 * megasas_fire_cmd_gen2 -     Sends command to the FW
    993 * @instance:		Adapter soft state
    994 * @frame_phys_addr:	Physical address of cmd
    995 * @frame_count:	Number of frames for the command
    996 * @regs:		MFI register set
    997 */
    998static inline void
    999megasas_fire_cmd_gen2(struct megasas_instance *instance,
   1000			dma_addr_t frame_phys_addr,
   1001			u32 frame_count,
   1002			struct megasas_register_set __iomem *regs)
   1003{
   1004	unsigned long flags;
   1005
   1006	spin_lock_irqsave(&instance->hba_lock, flags);
   1007	writel((frame_phys_addr | (frame_count<<1))|1,
   1008			&(regs)->inbound_queue_port);
   1009	spin_unlock_irqrestore(&instance->hba_lock, flags);
   1010}
   1011
   1012/**
   1013 * megasas_adp_reset_gen2 -	For controller reset
   1014 * @instance:	Adapter soft state
   1015 * @reg_set:	MFI register set
   1016 */
   1017static int
   1018megasas_adp_reset_gen2(struct megasas_instance *instance,
   1019			struct megasas_register_set __iomem *reg_set)
   1020{
   1021	u32 retry = 0 ;
   1022	u32 HostDiag;
   1023	u32 __iomem *seq_offset = &reg_set->seq_offset;
   1024	u32 __iomem *hostdiag_offset = &reg_set->host_diag;
   1025
   1026	if (instance->instancet == &megasas_instance_template_skinny) {
   1027		seq_offset = &reg_set->fusion_seq_offset;
   1028		hostdiag_offset = &reg_set->fusion_host_diag;
   1029	}
   1030
   1031	writel(0, seq_offset);
   1032	writel(4, seq_offset);
   1033	writel(0xb, seq_offset);
   1034	writel(2, seq_offset);
   1035	writel(7, seq_offset);
   1036	writel(0xd, seq_offset);
   1037
   1038	msleep(1000);
   1039
   1040	HostDiag = (u32)readl(hostdiag_offset);
   1041
   1042	while (!(HostDiag & DIAG_WRITE_ENABLE)) {
   1043		msleep(100);
   1044		HostDiag = (u32)readl(hostdiag_offset);
   1045		dev_notice(&instance->pdev->dev, "RESETGEN2: retry=%x, hostdiag=%x\n",
   1046					retry, HostDiag);
   1047
   1048		if (retry++ >= 100)
   1049			return 1;
   1050
   1051	}
   1052
   1053	dev_notice(&instance->pdev->dev, "ADP_RESET_GEN2: HostDiag=%x\n", HostDiag);
   1054
   1055	writel((HostDiag | DIAG_RESET_ADAPTER), hostdiag_offset);
   1056
   1057	ssleep(10);
   1058
   1059	HostDiag = (u32)readl(hostdiag_offset);
   1060	while (HostDiag & DIAG_RESET_ADAPTER) {
   1061		msleep(100);
   1062		HostDiag = (u32)readl(hostdiag_offset);
   1063		dev_notice(&instance->pdev->dev, "RESET_GEN2: retry=%x, hostdiag=%x\n",
   1064				retry, HostDiag);
   1065
   1066		if (retry++ >= 1000)
   1067			return 1;
   1068
   1069	}
   1070	return 0;
   1071}
   1072
   1073/**
   1074 * megasas_check_reset_gen2 -	For controller reset check
   1075 * @instance:	Adapter soft state
   1076 * @regs:	MFI register set
   1077 */
   1078static int
   1079megasas_check_reset_gen2(struct megasas_instance *instance,
   1080		struct megasas_register_set __iomem *regs)
   1081{
   1082	if (atomic_read(&instance->adprecovery) != MEGASAS_HBA_OPERATIONAL)
   1083		return 1;
   1084
   1085	return 0;
   1086}
   1087
   1088static struct megasas_instance_template megasas_instance_template_gen2 = {
   1089
   1090	.fire_cmd = megasas_fire_cmd_gen2,
   1091	.enable_intr = megasas_enable_intr_gen2,
   1092	.disable_intr = megasas_disable_intr_gen2,
   1093	.clear_intr = megasas_clear_intr_gen2,
   1094	.read_fw_status_reg = megasas_read_fw_status_reg_gen2,
   1095	.adp_reset = megasas_adp_reset_gen2,
   1096	.check_reset = megasas_check_reset_gen2,
   1097	.service_isr = megasas_isr,
   1098	.tasklet = megasas_complete_cmd_dpc,
   1099	.init_adapter = megasas_init_adapter_mfi,
   1100	.build_and_issue_cmd = megasas_build_and_issue_cmd,
   1101	.issue_dcmd = megasas_issue_dcmd,
   1102};
   1103
   1104/*
   1105 * This is the end of set of functions & definitions
   1106 * specific to gen2 (deviceid : 0x78, 0x79) controllers
   1107 */
   1108
   1109/*
   1110 * Template added for TB (Fusion)
   1111 */
   1112extern struct megasas_instance_template megasas_instance_template_fusion;
   1113
   1114/**
   1115 * megasas_issue_polled -	Issues a polling command
   1116 * @instance:			Adapter soft state
   1117 * @cmd:			Command packet to be issued
   1118 *
   1119 * For polling, MFI requires the cmd_status to be set to MFI_STAT_INVALID_STATUS before posting.
   1120 */
   1121int
   1122megasas_issue_polled(struct megasas_instance *instance, struct megasas_cmd *cmd)
   1123{
   1124	struct megasas_header *frame_hdr = &cmd->frame->hdr;
   1125
   1126	frame_hdr->cmd_status = MFI_STAT_INVALID_STATUS;
   1127	frame_hdr->flags |= cpu_to_le16(MFI_FRAME_DONT_POST_IN_REPLY_QUEUE);
   1128
   1129	if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) {
   1130		dev_err(&instance->pdev->dev, "Failed from %s %d\n",
   1131			__func__, __LINE__);
   1132		return DCMD_INIT;
   1133	}
   1134
   1135	instance->instancet->issue_dcmd(instance, cmd);
   1136
   1137	return wait_and_poll(instance, cmd, instance->requestorId ?
   1138			MEGASAS_ROUTINE_WAIT_TIME_VF : MFI_IO_TIMEOUT_SECS);
   1139}
   1140
   1141/**
   1142 * megasas_issue_blocked_cmd -	Synchronous wrapper around regular FW cmds
   1143 * @instance:			Adapter soft state
   1144 * @cmd:			Command to be issued
   1145 * @timeout:			Timeout in seconds
   1146 *
   1147 * This function waits on an event for the command to be returned from ISR.
   1148 * Max wait time is MEGASAS_INTERNAL_CMD_WAIT_TIME secs
   1149 * Used to issue ioctl commands.
   1150 */
   1151int
   1152megasas_issue_blocked_cmd(struct megasas_instance *instance,
   1153			  struct megasas_cmd *cmd, int timeout)
   1154{
   1155	int ret = 0;
   1156	cmd->cmd_status_drv = DCMD_INIT;
   1157
   1158	if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) {
   1159		dev_err(&instance->pdev->dev, "Failed from %s %d\n",
   1160			__func__, __LINE__);
   1161		return DCMD_INIT;
   1162	}
   1163
   1164	instance->instancet->issue_dcmd(instance, cmd);
   1165
   1166	if (timeout) {
   1167		ret = wait_event_timeout(instance->int_cmd_wait_q,
   1168		cmd->cmd_status_drv != DCMD_INIT, timeout * HZ);
   1169		if (!ret) {
   1170			dev_err(&instance->pdev->dev,
   1171				"DCMD(opcode: 0x%x) is timed out, func:%s\n",
   1172				cmd->frame->dcmd.opcode, __func__);
   1173			return DCMD_TIMEOUT;
   1174		}
   1175	} else
   1176		wait_event(instance->int_cmd_wait_q,
   1177				cmd->cmd_status_drv != DCMD_INIT);
   1178
   1179	return cmd->cmd_status_drv;
   1180}
   1181
   1182/**
   1183 * megasas_issue_blocked_abort_cmd -	Aborts previously issued cmd
   1184 * @instance:				Adapter soft state
   1185 * @cmd_to_abort:			Previously issued cmd to be aborted
   1186 * @timeout:				Timeout in seconds
   1187 *
   1188 * MFI firmware can abort previously issued AEN comamnd (automatic event
   1189 * notification). The megasas_issue_blocked_abort_cmd() issues such abort
   1190 * cmd and waits for return status.
   1191 * Max wait time is MEGASAS_INTERNAL_CMD_WAIT_TIME secs
   1192 */
   1193static int
   1194megasas_issue_blocked_abort_cmd(struct megasas_instance *instance,
   1195				struct megasas_cmd *cmd_to_abort, int timeout)
   1196{
   1197	struct megasas_cmd *cmd;
   1198	struct megasas_abort_frame *abort_fr;
   1199	int ret = 0;
   1200	u32 opcode;
   1201
   1202	cmd = megasas_get_cmd(instance);
   1203
   1204	if (!cmd)
   1205		return -1;
   1206
   1207	abort_fr = &cmd->frame->abort;
   1208
   1209	/*
   1210	 * Prepare and issue the abort frame
   1211	 */
   1212	abort_fr->cmd = MFI_CMD_ABORT;
   1213	abort_fr->cmd_status = MFI_STAT_INVALID_STATUS;
   1214	abort_fr->flags = cpu_to_le16(0);
   1215	abort_fr->abort_context = cpu_to_le32(cmd_to_abort->index);
   1216	abort_fr->abort_mfi_phys_addr_lo =
   1217		cpu_to_le32(lower_32_bits(cmd_to_abort->frame_phys_addr));
   1218	abort_fr->abort_mfi_phys_addr_hi =
   1219		cpu_to_le32(upper_32_bits(cmd_to_abort->frame_phys_addr));
   1220
   1221	cmd->sync_cmd = 1;
   1222	cmd->cmd_status_drv = DCMD_INIT;
   1223
   1224	if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) {
   1225		dev_err(&instance->pdev->dev, "Failed from %s %d\n",
   1226			__func__, __LINE__);
   1227		return DCMD_INIT;
   1228	}
   1229
   1230	instance->instancet->issue_dcmd(instance, cmd);
   1231
   1232	if (timeout) {
   1233		ret = wait_event_timeout(instance->abort_cmd_wait_q,
   1234		cmd->cmd_status_drv != DCMD_INIT, timeout * HZ);
   1235		if (!ret) {
   1236			opcode = cmd_to_abort->frame->dcmd.opcode;
   1237			dev_err(&instance->pdev->dev,
   1238				"Abort(to be aborted DCMD opcode: 0x%x) is timed out func:%s\n",
   1239				opcode,  __func__);
   1240			return DCMD_TIMEOUT;
   1241		}
   1242	} else
   1243		wait_event(instance->abort_cmd_wait_q,
   1244		cmd->cmd_status_drv != DCMD_INIT);
   1245
   1246	cmd->sync_cmd = 0;
   1247
   1248	megasas_return_cmd(instance, cmd);
   1249	return cmd->cmd_status_drv;
   1250}
   1251
   1252/**
   1253 * megasas_make_sgl32 -	Prepares 32-bit SGL
   1254 * @instance:		Adapter soft state
   1255 * @scp:		SCSI command from the mid-layer
   1256 * @mfi_sgl:		SGL to be filled in
   1257 *
   1258 * If successful, this function returns the number of SG elements. Otherwise,
   1259 * it returnes -1.
   1260 */
   1261static int
   1262megasas_make_sgl32(struct megasas_instance *instance, struct scsi_cmnd *scp,
   1263		   union megasas_sgl *mfi_sgl)
   1264{
   1265	int i;
   1266	int sge_count;
   1267	struct scatterlist *os_sgl;
   1268
   1269	sge_count = scsi_dma_map(scp);
   1270	BUG_ON(sge_count < 0);
   1271
   1272	if (sge_count) {
   1273		scsi_for_each_sg(scp, os_sgl, sge_count, i) {
   1274			mfi_sgl->sge32[i].length = cpu_to_le32(sg_dma_len(os_sgl));
   1275			mfi_sgl->sge32[i].phys_addr = cpu_to_le32(sg_dma_address(os_sgl));
   1276		}
   1277	}
   1278	return sge_count;
   1279}
   1280
   1281/**
   1282 * megasas_make_sgl64 -	Prepares 64-bit SGL
   1283 * @instance:		Adapter soft state
   1284 * @scp:		SCSI command from the mid-layer
   1285 * @mfi_sgl:		SGL to be filled in
   1286 *
   1287 * If successful, this function returns the number of SG elements. Otherwise,
   1288 * it returnes -1.
   1289 */
   1290static int
   1291megasas_make_sgl64(struct megasas_instance *instance, struct scsi_cmnd *scp,
   1292		   union megasas_sgl *mfi_sgl)
   1293{
   1294	int i;
   1295	int sge_count;
   1296	struct scatterlist *os_sgl;
   1297
   1298	sge_count = scsi_dma_map(scp);
   1299	BUG_ON(sge_count < 0);
   1300
   1301	if (sge_count) {
   1302		scsi_for_each_sg(scp, os_sgl, sge_count, i) {
   1303			mfi_sgl->sge64[i].length = cpu_to_le32(sg_dma_len(os_sgl));
   1304			mfi_sgl->sge64[i].phys_addr = cpu_to_le64(sg_dma_address(os_sgl));
   1305		}
   1306	}
   1307	return sge_count;
   1308}
   1309
   1310/**
   1311 * megasas_make_sgl_skinny - Prepares IEEE SGL
   1312 * @instance:           Adapter soft state
   1313 * @scp:                SCSI command from the mid-layer
   1314 * @mfi_sgl:            SGL to be filled in
   1315 *
   1316 * If successful, this function returns the number of SG elements. Otherwise,
   1317 * it returnes -1.
   1318 */
   1319static int
   1320megasas_make_sgl_skinny(struct megasas_instance *instance,
   1321		struct scsi_cmnd *scp, union megasas_sgl *mfi_sgl)
   1322{
   1323	int i;
   1324	int sge_count;
   1325	struct scatterlist *os_sgl;
   1326
   1327	sge_count = scsi_dma_map(scp);
   1328
   1329	if (sge_count) {
   1330		scsi_for_each_sg(scp, os_sgl, sge_count, i) {
   1331			mfi_sgl->sge_skinny[i].length =
   1332				cpu_to_le32(sg_dma_len(os_sgl));
   1333			mfi_sgl->sge_skinny[i].phys_addr =
   1334				cpu_to_le64(sg_dma_address(os_sgl));
   1335			mfi_sgl->sge_skinny[i].flag = cpu_to_le32(0);
   1336		}
   1337	}
   1338	return sge_count;
   1339}
   1340
   1341 /**
   1342 * megasas_get_frame_count - Computes the number of frames
   1343 * @frame_type		: type of frame- io or pthru frame
   1344 * @sge_count		: number of sg elements
   1345 *
   1346 * Returns the number of frames required for numnber of sge's (sge_count)
   1347 */
   1348
   1349static u32 megasas_get_frame_count(struct megasas_instance *instance,
   1350			u8 sge_count, u8 frame_type)
   1351{
   1352	int num_cnt;
   1353	int sge_bytes;
   1354	u32 sge_sz;
   1355	u32 frame_count = 0;
   1356
   1357	sge_sz = (IS_DMA64) ? sizeof(struct megasas_sge64) :
   1358	    sizeof(struct megasas_sge32);
   1359
   1360	if (instance->flag_ieee) {
   1361		sge_sz = sizeof(struct megasas_sge_skinny);
   1362	}
   1363
   1364	/*
   1365	 * Main frame can contain 2 SGEs for 64-bit SGLs and
   1366	 * 3 SGEs for 32-bit SGLs for ldio &
   1367	 * 1 SGEs for 64-bit SGLs and
   1368	 * 2 SGEs for 32-bit SGLs for pthru frame
   1369	 */
   1370	if (unlikely(frame_type == PTHRU_FRAME)) {
   1371		if (instance->flag_ieee == 1) {
   1372			num_cnt = sge_count - 1;
   1373		} else if (IS_DMA64)
   1374			num_cnt = sge_count - 1;
   1375		else
   1376			num_cnt = sge_count - 2;
   1377	} else {
   1378		if (instance->flag_ieee == 1) {
   1379			num_cnt = sge_count - 1;
   1380		} else if (IS_DMA64)
   1381			num_cnt = sge_count - 2;
   1382		else
   1383			num_cnt = sge_count - 3;
   1384	}
   1385
   1386	if (num_cnt > 0) {
   1387		sge_bytes = sge_sz * num_cnt;
   1388
   1389		frame_count = (sge_bytes / MEGAMFI_FRAME_SIZE) +
   1390		    ((sge_bytes % MEGAMFI_FRAME_SIZE) ? 1 : 0) ;
   1391	}
   1392	/* Main frame */
   1393	frame_count += 1;
   1394
   1395	if (frame_count > 7)
   1396		frame_count = 8;
   1397	return frame_count;
   1398}
   1399
   1400/**
   1401 * megasas_build_dcdb -	Prepares a direct cdb (DCDB) command
   1402 * @instance:		Adapter soft state
   1403 * @scp:		SCSI command
   1404 * @cmd:		Command to be prepared in
   1405 *
   1406 * This function prepares CDB commands. These are typcially pass-through
   1407 * commands to the devices.
   1408 */
   1409static int
   1410megasas_build_dcdb(struct megasas_instance *instance, struct scsi_cmnd *scp,
   1411		   struct megasas_cmd *cmd)
   1412{
   1413	u32 is_logical;
   1414	u32 device_id;
   1415	u16 flags = 0;
   1416	struct megasas_pthru_frame *pthru;
   1417
   1418	is_logical = MEGASAS_IS_LOGICAL(scp->device);
   1419	device_id = MEGASAS_DEV_INDEX(scp);
   1420	pthru = (struct megasas_pthru_frame *)cmd->frame;
   1421
   1422	if (scp->sc_data_direction == DMA_TO_DEVICE)
   1423		flags = MFI_FRAME_DIR_WRITE;
   1424	else if (scp->sc_data_direction == DMA_FROM_DEVICE)
   1425		flags = MFI_FRAME_DIR_READ;
   1426	else if (scp->sc_data_direction == DMA_NONE)
   1427		flags = MFI_FRAME_DIR_NONE;
   1428
   1429	if (instance->flag_ieee == 1) {
   1430		flags |= MFI_FRAME_IEEE;
   1431	}
   1432
   1433	/*
   1434	 * Prepare the DCDB frame
   1435	 */
   1436	pthru->cmd = (is_logical) ? MFI_CMD_LD_SCSI_IO : MFI_CMD_PD_SCSI_IO;
   1437	pthru->cmd_status = 0x0;
   1438	pthru->scsi_status = 0x0;
   1439	pthru->target_id = device_id;
   1440	pthru->lun = scp->device->lun;
   1441	pthru->cdb_len = scp->cmd_len;
   1442	pthru->timeout = 0;
   1443	pthru->pad_0 = 0;
   1444	pthru->flags = cpu_to_le16(flags);
   1445	pthru->data_xfer_len = cpu_to_le32(scsi_bufflen(scp));
   1446
   1447	memcpy(pthru->cdb, scp->cmnd, scp->cmd_len);
   1448
   1449	/*
   1450	 * If the command is for the tape device, set the
   1451	 * pthru timeout to the os layer timeout value.
   1452	 */
   1453	if (scp->device->type == TYPE_TAPE) {
   1454		if (scsi_cmd_to_rq(scp)->timeout / HZ > 0xFFFF)
   1455			pthru->timeout = cpu_to_le16(0xFFFF);
   1456		else
   1457			pthru->timeout = cpu_to_le16(scsi_cmd_to_rq(scp)->timeout / HZ);
   1458	}
   1459
   1460	/*
   1461	 * Construct SGL
   1462	 */
   1463	if (instance->flag_ieee == 1) {
   1464		pthru->flags |= cpu_to_le16(MFI_FRAME_SGL64);
   1465		pthru->sge_count = megasas_make_sgl_skinny(instance, scp,
   1466						      &pthru->sgl);
   1467	} else if (IS_DMA64) {
   1468		pthru->flags |= cpu_to_le16(MFI_FRAME_SGL64);
   1469		pthru->sge_count = megasas_make_sgl64(instance, scp,
   1470						      &pthru->sgl);
   1471	} else
   1472		pthru->sge_count = megasas_make_sgl32(instance, scp,
   1473						      &pthru->sgl);
   1474
   1475	if (pthru->sge_count > instance->max_num_sge) {
   1476		dev_err(&instance->pdev->dev, "DCDB too many SGE NUM=%x\n",
   1477			pthru->sge_count);
   1478		return 0;
   1479	}
   1480
   1481	/*
   1482	 * Sense info specific
   1483	 */
   1484	pthru->sense_len = SCSI_SENSE_BUFFERSIZE;
   1485	pthru->sense_buf_phys_addr_hi =
   1486		cpu_to_le32(upper_32_bits(cmd->sense_phys_addr));
   1487	pthru->sense_buf_phys_addr_lo =
   1488		cpu_to_le32(lower_32_bits(cmd->sense_phys_addr));
   1489
   1490	/*
   1491	 * Compute the total number of frames this command consumes. FW uses
   1492	 * this number to pull sufficient number of frames from host memory.
   1493	 */
   1494	cmd->frame_count = megasas_get_frame_count(instance, pthru->sge_count,
   1495							PTHRU_FRAME);
   1496
   1497	return cmd->frame_count;
   1498}
   1499
   1500/**
   1501 * megasas_build_ldio -	Prepares IOs to logical devices
   1502 * @instance:		Adapter soft state
   1503 * @scp:		SCSI command
   1504 * @cmd:		Command to be prepared
   1505 *
   1506 * Frames (and accompanying SGLs) for regular SCSI IOs use this function.
   1507 */
   1508static int
   1509megasas_build_ldio(struct megasas_instance *instance, struct scsi_cmnd *scp,
   1510		   struct megasas_cmd *cmd)
   1511{
   1512	u32 device_id;
   1513	u8 sc = scp->cmnd[0];
   1514	u16 flags = 0;
   1515	struct megasas_io_frame *ldio;
   1516
   1517	device_id = MEGASAS_DEV_INDEX(scp);
   1518	ldio = (struct megasas_io_frame *)cmd->frame;
   1519
   1520	if (scp->sc_data_direction == DMA_TO_DEVICE)
   1521		flags = MFI_FRAME_DIR_WRITE;
   1522	else if (scp->sc_data_direction == DMA_FROM_DEVICE)
   1523		flags = MFI_FRAME_DIR_READ;
   1524
   1525	if (instance->flag_ieee == 1) {
   1526		flags |= MFI_FRAME_IEEE;
   1527	}
   1528
   1529	/*
   1530	 * Prepare the Logical IO frame: 2nd bit is zero for all read cmds
   1531	 */
   1532	ldio->cmd = (sc & 0x02) ? MFI_CMD_LD_WRITE : MFI_CMD_LD_READ;
   1533	ldio->cmd_status = 0x0;
   1534	ldio->scsi_status = 0x0;
   1535	ldio->target_id = device_id;
   1536	ldio->timeout = 0;
   1537	ldio->reserved_0 = 0;
   1538	ldio->pad_0 = 0;
   1539	ldio->flags = cpu_to_le16(flags);
   1540	ldio->start_lba_hi = 0;
   1541	ldio->access_byte = (scp->cmd_len != 6) ? scp->cmnd[1] : 0;
   1542
   1543	/*
   1544	 * 6-byte READ(0x08) or WRITE(0x0A) cdb
   1545	 */
   1546	if (scp->cmd_len == 6) {
   1547		ldio->lba_count = cpu_to_le32((u32) scp->cmnd[4]);
   1548		ldio->start_lba_lo = cpu_to_le32(((u32) scp->cmnd[1] << 16) |
   1549						 ((u32) scp->cmnd[2] << 8) |
   1550						 (u32) scp->cmnd[3]);
   1551
   1552		ldio->start_lba_lo &= cpu_to_le32(0x1FFFFF);
   1553	}
   1554
   1555	/*
   1556	 * 10-byte READ(0x28) or WRITE(0x2A) cdb
   1557	 */
   1558	else if (scp->cmd_len == 10) {
   1559		ldio->lba_count = cpu_to_le32((u32) scp->cmnd[8] |
   1560					      ((u32) scp->cmnd[7] << 8));
   1561		ldio->start_lba_lo = cpu_to_le32(((u32) scp->cmnd[2] << 24) |
   1562						 ((u32) scp->cmnd[3] << 16) |
   1563						 ((u32) scp->cmnd[4] << 8) |
   1564						 (u32) scp->cmnd[5]);
   1565	}
   1566
   1567	/*
   1568	 * 12-byte READ(0xA8) or WRITE(0xAA) cdb
   1569	 */
   1570	else if (scp->cmd_len == 12) {
   1571		ldio->lba_count = cpu_to_le32(((u32) scp->cmnd[6] << 24) |
   1572					      ((u32) scp->cmnd[7] << 16) |
   1573					      ((u32) scp->cmnd[8] << 8) |
   1574					      (u32) scp->cmnd[9]);
   1575
   1576		ldio->start_lba_lo = cpu_to_le32(((u32) scp->cmnd[2] << 24) |
   1577						 ((u32) scp->cmnd[3] << 16) |
   1578						 ((u32) scp->cmnd[4] << 8) |
   1579						 (u32) scp->cmnd[5]);
   1580	}
   1581
   1582	/*
   1583	 * 16-byte READ(0x88) or WRITE(0x8A) cdb
   1584	 */
   1585	else if (scp->cmd_len == 16) {
   1586		ldio->lba_count = cpu_to_le32(((u32) scp->cmnd[10] << 24) |
   1587					      ((u32) scp->cmnd[11] << 16) |
   1588					      ((u32) scp->cmnd[12] << 8) |
   1589					      (u32) scp->cmnd[13]);
   1590
   1591		ldio->start_lba_lo = cpu_to_le32(((u32) scp->cmnd[6] << 24) |
   1592						 ((u32) scp->cmnd[7] << 16) |
   1593						 ((u32) scp->cmnd[8] << 8) |
   1594						 (u32) scp->cmnd[9]);
   1595
   1596		ldio->start_lba_hi = cpu_to_le32(((u32) scp->cmnd[2] << 24) |
   1597						 ((u32) scp->cmnd[3] << 16) |
   1598						 ((u32) scp->cmnd[4] << 8) |
   1599						 (u32) scp->cmnd[5]);
   1600
   1601	}
   1602
   1603	/*
   1604	 * Construct SGL
   1605	 */
   1606	if (instance->flag_ieee) {
   1607		ldio->flags |= cpu_to_le16(MFI_FRAME_SGL64);
   1608		ldio->sge_count = megasas_make_sgl_skinny(instance, scp,
   1609					      &ldio->sgl);
   1610	} else if (IS_DMA64) {
   1611		ldio->flags |= cpu_to_le16(MFI_FRAME_SGL64);
   1612		ldio->sge_count = megasas_make_sgl64(instance, scp, &ldio->sgl);
   1613	} else
   1614		ldio->sge_count = megasas_make_sgl32(instance, scp, &ldio->sgl);
   1615
   1616	if (ldio->sge_count > instance->max_num_sge) {
   1617		dev_err(&instance->pdev->dev, "build_ld_io: sge_count = %x\n",
   1618			ldio->sge_count);
   1619		return 0;
   1620	}
   1621
   1622	/*
   1623	 * Sense info specific
   1624	 */
   1625	ldio->sense_len = SCSI_SENSE_BUFFERSIZE;
   1626	ldio->sense_buf_phys_addr_hi = 0;
   1627	ldio->sense_buf_phys_addr_lo = cpu_to_le32(cmd->sense_phys_addr);
   1628
   1629	/*
   1630	 * Compute the total number of frames this command consumes. FW uses
   1631	 * this number to pull sufficient number of frames from host memory.
   1632	 */
   1633	cmd->frame_count = megasas_get_frame_count(instance,
   1634			ldio->sge_count, IO_FRAME);
   1635
   1636	return cmd->frame_count;
   1637}
   1638
   1639/**
   1640 * megasas_cmd_type -		Checks if the cmd is for logical drive/sysPD
   1641 *				and whether it's RW or non RW
   1642 * @cmd:			SCSI command
   1643 *
   1644 */
   1645inline int megasas_cmd_type(struct scsi_cmnd *cmd)
   1646{
   1647	int ret;
   1648
   1649	switch (cmd->cmnd[0]) {
   1650	case READ_10:
   1651	case WRITE_10:
   1652	case READ_12:
   1653	case WRITE_12:
   1654	case READ_6:
   1655	case WRITE_6:
   1656	case READ_16:
   1657	case WRITE_16:
   1658		ret = (MEGASAS_IS_LOGICAL(cmd->device)) ?
   1659			READ_WRITE_LDIO : READ_WRITE_SYSPDIO;
   1660		break;
   1661	default:
   1662		ret = (MEGASAS_IS_LOGICAL(cmd->device)) ?
   1663			NON_READ_WRITE_LDIO : NON_READ_WRITE_SYSPDIO;
   1664	}
   1665	return ret;
   1666}
   1667
   1668 /**
   1669 * megasas_dump_pending_frames -	Dumps the frame address of all pending cmds
   1670 *					in FW
   1671 * @instance:				Adapter soft state
   1672 */
   1673static inline void
   1674megasas_dump_pending_frames(struct megasas_instance *instance)
   1675{
   1676	struct megasas_cmd *cmd;
   1677	int i,n;
   1678	union megasas_sgl *mfi_sgl;
   1679	struct megasas_io_frame *ldio;
   1680	struct megasas_pthru_frame *pthru;
   1681	u32 sgcount;
   1682	u16 max_cmd = instance->max_fw_cmds;
   1683
   1684	dev_err(&instance->pdev->dev, "[%d]: Dumping Frame Phys Address of all pending cmds in FW\n",instance->host->host_no);
   1685	dev_err(&instance->pdev->dev, "[%d]: Total OS Pending cmds : %d\n",instance->host->host_no,atomic_read(&instance->fw_outstanding));
   1686	if (IS_DMA64)
   1687		dev_err(&instance->pdev->dev, "[%d]: 64 bit SGLs were sent to FW\n",instance->host->host_no);
   1688	else
   1689		dev_err(&instance->pdev->dev, "[%d]: 32 bit SGLs were sent to FW\n",instance->host->host_no);
   1690
   1691	dev_err(&instance->pdev->dev, "[%d]: Pending OS cmds in FW : \n",instance->host->host_no);
   1692	for (i = 0; i < max_cmd; i++) {
   1693		cmd = instance->cmd_list[i];
   1694		if (!cmd->scmd)
   1695			continue;
   1696		dev_err(&instance->pdev->dev, "[%d]: Frame addr :0x%08lx : ",instance->host->host_no,(unsigned long)cmd->frame_phys_addr);
   1697		if (megasas_cmd_type(cmd->scmd) == READ_WRITE_LDIO) {
   1698			ldio = (struct megasas_io_frame *)cmd->frame;
   1699			mfi_sgl = &ldio->sgl;
   1700			sgcount = ldio->sge_count;
   1701			dev_err(&instance->pdev->dev, "[%d]: frame count : 0x%x, Cmd : 0x%x, Tgt id : 0x%x,"
   1702			" lba lo : 0x%x, lba_hi : 0x%x, sense_buf addr : 0x%x,sge count : 0x%x\n",
   1703			instance->host->host_no, cmd->frame_count, ldio->cmd, ldio->target_id,
   1704			le32_to_cpu(ldio->start_lba_lo), le32_to_cpu(ldio->start_lba_hi),
   1705			le32_to_cpu(ldio->sense_buf_phys_addr_lo), sgcount);
   1706		} else {
   1707			pthru = (struct megasas_pthru_frame *) cmd->frame;
   1708			mfi_sgl = &pthru->sgl;
   1709			sgcount = pthru->sge_count;
   1710			dev_err(&instance->pdev->dev, "[%d]: frame count : 0x%x, Cmd : 0x%x, Tgt id : 0x%x, "
   1711			"lun : 0x%x, cdb_len : 0x%x, data xfer len : 0x%x, sense_buf addr : 0x%x,sge count : 0x%x\n",
   1712			instance->host->host_no, cmd->frame_count, pthru->cmd, pthru->target_id,
   1713			pthru->lun, pthru->cdb_len, le32_to_cpu(pthru->data_xfer_len),
   1714			le32_to_cpu(pthru->sense_buf_phys_addr_lo), sgcount);
   1715		}
   1716		if (megasas_dbg_lvl & MEGASAS_DBG_LVL) {
   1717			for (n = 0; n < sgcount; n++) {
   1718				if (IS_DMA64)
   1719					dev_err(&instance->pdev->dev, "sgl len : 0x%x, sgl addr : 0x%llx\n",
   1720						le32_to_cpu(mfi_sgl->sge64[n].length),
   1721						le64_to_cpu(mfi_sgl->sge64[n].phys_addr));
   1722				else
   1723					dev_err(&instance->pdev->dev, "sgl len : 0x%x, sgl addr : 0x%x\n",
   1724						le32_to_cpu(mfi_sgl->sge32[n].length),
   1725						le32_to_cpu(mfi_sgl->sge32[n].phys_addr));
   1726			}
   1727		}
   1728	} /*for max_cmd*/
   1729	dev_err(&instance->pdev->dev, "[%d]: Pending Internal cmds in FW : \n",instance->host->host_no);
   1730	for (i = 0; i < max_cmd; i++) {
   1731
   1732		cmd = instance->cmd_list[i];
   1733
   1734		if (cmd->sync_cmd == 1)
   1735			dev_err(&instance->pdev->dev, "0x%08lx : ", (unsigned long)cmd->frame_phys_addr);
   1736	}
   1737	dev_err(&instance->pdev->dev, "[%d]: Dumping Done\n\n",instance->host->host_no);
   1738}
   1739
   1740u32
   1741megasas_build_and_issue_cmd(struct megasas_instance *instance,
   1742			    struct scsi_cmnd *scmd)
   1743{
   1744	struct megasas_cmd *cmd;
   1745	u32 frame_count;
   1746
   1747	cmd = megasas_get_cmd(instance);
   1748	if (!cmd)
   1749		return SCSI_MLQUEUE_HOST_BUSY;
   1750
   1751	/*
   1752	 * Logical drive command
   1753	 */
   1754	if (megasas_cmd_type(scmd) == READ_WRITE_LDIO)
   1755		frame_count = megasas_build_ldio(instance, scmd, cmd);
   1756	else
   1757		frame_count = megasas_build_dcdb(instance, scmd, cmd);
   1758
   1759	if (!frame_count)
   1760		goto out_return_cmd;
   1761
   1762	cmd->scmd = scmd;
   1763	megasas_priv(scmd)->cmd_priv = cmd;
   1764
   1765	/*
   1766	 * Issue the command to the FW
   1767	 */
   1768	atomic_inc(&instance->fw_outstanding);
   1769
   1770	instance->instancet->fire_cmd(instance, cmd->frame_phys_addr,
   1771				cmd->frame_count-1, instance->reg_set);
   1772
   1773	return 0;
   1774out_return_cmd:
   1775	megasas_return_cmd(instance, cmd);
   1776	return SCSI_MLQUEUE_HOST_BUSY;
   1777}
   1778
   1779
   1780/**
   1781 * megasas_queue_command -	Queue entry point
   1782 * @shost:			adapter SCSI host
   1783 * @scmd:			SCSI command to be queued
   1784 */
   1785static int
   1786megasas_queue_command(struct Scsi_Host *shost, struct scsi_cmnd *scmd)
   1787{
   1788	struct megasas_instance *instance;
   1789	struct MR_PRIV_DEVICE *mr_device_priv_data;
   1790	u32 ld_tgt_id;
   1791
   1792	instance = (struct megasas_instance *)
   1793	    scmd->device->host->hostdata;
   1794
   1795	if (instance->unload == 1) {
   1796		scmd->result = DID_NO_CONNECT << 16;
   1797		scsi_done(scmd);
   1798		return 0;
   1799	}
   1800
   1801	if (instance->issuepend_done == 0)
   1802		return SCSI_MLQUEUE_HOST_BUSY;
   1803
   1804
   1805	/* Check for an mpio path and adjust behavior */
   1806	if (atomic_read(&instance->adprecovery) == MEGASAS_ADPRESET_SM_INFAULT) {
   1807		if (megasas_check_mpio_paths(instance, scmd) ==
   1808		    (DID_REQUEUE << 16)) {
   1809			return SCSI_MLQUEUE_HOST_BUSY;
   1810		} else {
   1811			scmd->result = DID_NO_CONNECT << 16;
   1812			scsi_done(scmd);
   1813			return 0;
   1814		}
   1815	}
   1816
   1817	mr_device_priv_data = scmd->device->hostdata;
   1818	if (!mr_device_priv_data ||
   1819	    (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR)) {
   1820		scmd->result = DID_NO_CONNECT << 16;
   1821		scsi_done(scmd);
   1822		return 0;
   1823	}
   1824
   1825	if (MEGASAS_IS_LOGICAL(scmd->device)) {
   1826		ld_tgt_id = MEGASAS_TARGET_ID(scmd->device);
   1827		if (instance->ld_tgtid_status[ld_tgt_id] == LD_TARGET_ID_DELETED) {
   1828			scmd->result = DID_NO_CONNECT << 16;
   1829			scsi_done(scmd);
   1830			return 0;
   1831		}
   1832	}
   1833
   1834	if (atomic_read(&instance->adprecovery) != MEGASAS_HBA_OPERATIONAL)
   1835		return SCSI_MLQUEUE_HOST_BUSY;
   1836
   1837	if (mr_device_priv_data->tm_busy)
   1838		return SCSI_MLQUEUE_DEVICE_BUSY;
   1839
   1840
   1841	scmd->result = 0;
   1842
   1843	if (MEGASAS_IS_LOGICAL(scmd->device) &&
   1844	    (scmd->device->id >= instance->fw_supported_vd_count ||
   1845		scmd->device->lun)) {
   1846		scmd->result = DID_BAD_TARGET << 16;
   1847		goto out_done;
   1848	}
   1849
   1850	if ((scmd->cmnd[0] == SYNCHRONIZE_CACHE) &&
   1851	    MEGASAS_IS_LOGICAL(scmd->device) &&
   1852	    (!instance->fw_sync_cache_support)) {
   1853		scmd->result = DID_OK << 16;
   1854		goto out_done;
   1855	}
   1856
   1857	return instance->instancet->build_and_issue_cmd(instance, scmd);
   1858
   1859 out_done:
   1860	scsi_done(scmd);
   1861	return 0;
   1862}
   1863
   1864static struct megasas_instance *megasas_lookup_instance(u16 host_no)
   1865{
   1866	int i;
   1867
   1868	for (i = 0; i < megasas_mgmt_info.max_index; i++) {
   1869
   1870		if ((megasas_mgmt_info.instance[i]) &&
   1871		    (megasas_mgmt_info.instance[i]->host->host_no == host_no))
   1872			return megasas_mgmt_info.instance[i];
   1873	}
   1874
   1875	return NULL;
   1876}
   1877
   1878/*
   1879* megasas_set_dynamic_target_properties -
   1880* Device property set by driver may not be static and it is required to be
   1881* updated after OCR
   1882*
   1883* set tm_capable.
   1884* set dma alignment (only for eedp protection enable vd).
   1885*
   1886* @sdev: OS provided scsi device
   1887*
   1888* Returns void
   1889*/
   1890void megasas_set_dynamic_target_properties(struct scsi_device *sdev,
   1891					   bool is_target_prop)
   1892{
   1893	u16 pd_index = 0, ld;
   1894	u32 device_id;
   1895	struct megasas_instance *instance;
   1896	struct fusion_context *fusion;
   1897	struct MR_PRIV_DEVICE *mr_device_priv_data;
   1898	struct MR_PD_CFG_SEQ_NUM_SYNC *pd_sync;
   1899	struct MR_LD_RAID *raid;
   1900	struct MR_DRV_RAID_MAP_ALL *local_map_ptr;
   1901
   1902	instance = megasas_lookup_instance(sdev->host->host_no);
   1903	fusion = instance->ctrl_context;
   1904	mr_device_priv_data = sdev->hostdata;
   1905
   1906	if (!fusion || !mr_device_priv_data)
   1907		return;
   1908
   1909	if (MEGASAS_IS_LOGICAL(sdev)) {
   1910		device_id = ((sdev->channel % 2) * MEGASAS_MAX_DEV_PER_CHANNEL)
   1911					+ sdev->id;
   1912		local_map_ptr = fusion->ld_drv_map[(instance->map_id & 1)];
   1913		ld = MR_TargetIdToLdGet(device_id, local_map_ptr);
   1914		if (ld >= instance->fw_supported_vd_count)
   1915			return;
   1916		raid = MR_LdRaidGet(ld, local_map_ptr);
   1917
   1918		if (raid->capability.ldPiMode == MR_PROT_INFO_TYPE_CONTROLLER)
   1919			blk_queue_update_dma_alignment(sdev->request_queue, 0x7);
   1920
   1921		mr_device_priv_data->is_tm_capable =
   1922			raid->capability.tmCapable;
   1923
   1924		if (!raid->flags.isEPD)
   1925			sdev->no_write_same = 1;
   1926
   1927	} else if (instance->use_seqnum_jbod_fp) {
   1928		pd_index = (sdev->channel * MEGASAS_MAX_DEV_PER_CHANNEL) +
   1929			sdev->id;
   1930		pd_sync = (void *)fusion->pd_seq_sync
   1931				[(instance->pd_seq_map_id - 1) & 1];
   1932		mr_device_priv_data->is_tm_capable =
   1933			pd_sync->seq[pd_index].capability.tmCapable;
   1934	}
   1935
   1936	if (is_target_prop && instance->tgt_prop->reset_tmo) {
   1937		/*
   1938		 * If FW provides a target reset timeout value, driver will use
   1939		 * it. If not set, fallback to default values.
   1940		 */
   1941		mr_device_priv_data->target_reset_tmo =
   1942			min_t(u8, instance->max_reset_tmo,
   1943			      instance->tgt_prop->reset_tmo);
   1944		mr_device_priv_data->task_abort_tmo = instance->task_abort_tmo;
   1945	} else {
   1946		mr_device_priv_data->target_reset_tmo =
   1947						MEGASAS_DEFAULT_TM_TIMEOUT;
   1948		mr_device_priv_data->task_abort_tmo =
   1949						MEGASAS_DEFAULT_TM_TIMEOUT;
   1950	}
   1951}
   1952
   1953/*
   1954 * megasas_set_nvme_device_properties -
   1955 * set nomerges=2
   1956 * set virtual page boundary = 4K (current mr_nvme_pg_size is 4K).
   1957 * set maximum io transfer = MDTS of NVME device provided by MR firmware.
   1958 *
   1959 * MR firmware provides value in KB. Caller of this function converts
   1960 * kb into bytes.
   1961 *
   1962 * e.a MDTS=5 means 2^5 * nvme page size. (In case of 4K page size,
   1963 * MR firmware provides value 128 as (32 * 4K) = 128K.
   1964 *
   1965 * @sdev:				scsi device
   1966 * @max_io_size:				maximum io transfer size
   1967 *
   1968 */
   1969static inline void
   1970megasas_set_nvme_device_properties(struct scsi_device *sdev, u32 max_io_size)
   1971{
   1972	struct megasas_instance *instance;
   1973	u32 mr_nvme_pg_size;
   1974
   1975	instance = (struct megasas_instance *)sdev->host->hostdata;
   1976	mr_nvme_pg_size = max_t(u32, instance->nvme_page_size,
   1977				MR_DEFAULT_NVME_PAGE_SIZE);
   1978
   1979	blk_queue_max_hw_sectors(sdev->request_queue, (max_io_size / 512));
   1980
   1981	blk_queue_flag_set(QUEUE_FLAG_NOMERGES, sdev->request_queue);
   1982	blk_queue_virt_boundary(sdev->request_queue, mr_nvme_pg_size - 1);
   1983}
   1984
   1985/*
   1986 * megasas_set_fw_assisted_qd -
   1987 * set device queue depth to can_queue
   1988 * set device queue depth to fw assisted qd
   1989 *
   1990 * @sdev:				scsi device
   1991 * @is_target_prop			true, if fw provided target properties.
   1992 */
   1993static void megasas_set_fw_assisted_qd(struct scsi_device *sdev,
   1994						 bool is_target_prop)
   1995{
   1996	u8 interface_type;
   1997	u32 device_qd = MEGASAS_DEFAULT_CMD_PER_LUN;
   1998	u32 tgt_device_qd;
   1999	struct megasas_instance *instance;
   2000	struct MR_PRIV_DEVICE *mr_device_priv_data;
   2001
   2002	instance = megasas_lookup_instance(sdev->host->host_no);
   2003	mr_device_priv_data = sdev->hostdata;
   2004	interface_type  = mr_device_priv_data->interface_type;
   2005
   2006	switch (interface_type) {
   2007	case SAS_PD:
   2008		device_qd = MEGASAS_SAS_QD;
   2009		break;
   2010	case SATA_PD:
   2011		device_qd = MEGASAS_SATA_QD;
   2012		break;
   2013	case NVME_PD:
   2014		device_qd = MEGASAS_NVME_QD;
   2015		break;
   2016	}
   2017
   2018	if (is_target_prop) {
   2019		tgt_device_qd = le32_to_cpu(instance->tgt_prop->device_qdepth);
   2020		if (tgt_device_qd)
   2021			device_qd = min(instance->host->can_queue,
   2022					(int)tgt_device_qd);
   2023	}
   2024
   2025	if (instance->enable_sdev_max_qd && interface_type != UNKNOWN_DRIVE)
   2026		device_qd = instance->host->can_queue;
   2027
   2028	scsi_change_queue_depth(sdev, device_qd);
   2029}
   2030
   2031/*
   2032 * megasas_set_static_target_properties -
   2033 * Device property set by driver are static and it is not required to be
   2034 * updated after OCR.
   2035 *
   2036 * set io timeout
   2037 * set device queue depth
   2038 * set nvme device properties. see - megasas_set_nvme_device_properties
   2039 *
   2040 * @sdev:				scsi device
   2041 * @is_target_prop			true, if fw provided target properties.
   2042 */
   2043static void megasas_set_static_target_properties(struct scsi_device *sdev,
   2044						 bool is_target_prop)
   2045{
   2046	u32 max_io_size_kb = MR_DEFAULT_NVME_MDTS_KB;
   2047	struct megasas_instance *instance;
   2048
   2049	instance = megasas_lookup_instance(sdev->host->host_no);
   2050
   2051	/*
   2052	 * The RAID firmware may require extended timeouts.
   2053	 */
   2054	blk_queue_rq_timeout(sdev->request_queue, scmd_timeout * HZ);
   2055
   2056	/* max_io_size_kb will be set to non zero for
   2057	 * nvme based vd and syspd.
   2058	 */
   2059	if (is_target_prop)
   2060		max_io_size_kb = le32_to_cpu(instance->tgt_prop->max_io_size_kb);
   2061
   2062	if (instance->nvme_page_size && max_io_size_kb)
   2063		megasas_set_nvme_device_properties(sdev, (max_io_size_kb << 10));
   2064
   2065	megasas_set_fw_assisted_qd(sdev, is_target_prop);
   2066}
   2067
   2068
   2069static int megasas_slave_configure(struct scsi_device *sdev)
   2070{
   2071	u16 pd_index = 0;
   2072	struct megasas_instance *instance;
   2073	int ret_target_prop = DCMD_FAILED;
   2074	bool is_target_prop = false;
   2075
   2076	instance = megasas_lookup_instance(sdev->host->host_no);
   2077	if (instance->pd_list_not_supported) {
   2078		if (!MEGASAS_IS_LOGICAL(sdev) && sdev->type == TYPE_DISK) {
   2079			pd_index = (sdev->channel * MEGASAS_MAX_DEV_PER_CHANNEL) +
   2080				sdev->id;
   2081			if (instance->pd_list[pd_index].driveState !=
   2082				MR_PD_STATE_SYSTEM)
   2083				return -ENXIO;
   2084		}
   2085	}
   2086
   2087	mutex_lock(&instance->reset_mutex);
   2088	/* Send DCMD to Firmware and cache the information */
   2089	if ((instance->pd_info) && !MEGASAS_IS_LOGICAL(sdev))
   2090		megasas_get_pd_info(instance, sdev);
   2091
   2092	/* Some ventura firmware may not have instance->nvme_page_size set.
   2093	 * Do not send MR_DCMD_DRV_GET_TARGET_PROP
   2094	 */
   2095	if ((instance->tgt_prop) && (instance->nvme_page_size))
   2096		ret_target_prop = megasas_get_target_prop(instance, sdev);
   2097
   2098	is_target_prop = (ret_target_prop == DCMD_SUCCESS) ? true : false;
   2099	megasas_set_static_target_properties(sdev, is_target_prop);
   2100
   2101	/* This sdev property may change post OCR */
   2102	megasas_set_dynamic_target_properties(sdev, is_target_prop);
   2103
   2104	mutex_unlock(&instance->reset_mutex);
   2105
   2106	return 0;
   2107}
   2108
   2109static int megasas_slave_alloc(struct scsi_device *sdev)
   2110{
   2111	u16 pd_index = 0, ld_tgt_id;
   2112	struct megasas_instance *instance ;
   2113	struct MR_PRIV_DEVICE *mr_device_priv_data;
   2114
   2115	instance = megasas_lookup_instance(sdev->host->host_no);
   2116	if (!MEGASAS_IS_LOGICAL(sdev)) {
   2117		/*
   2118		 * Open the OS scan to the SYSTEM PD
   2119		 */
   2120		pd_index =
   2121			(sdev->channel * MEGASAS_MAX_DEV_PER_CHANNEL) +
   2122			sdev->id;
   2123		if ((instance->pd_list_not_supported ||
   2124			instance->pd_list[pd_index].driveState ==
   2125			MR_PD_STATE_SYSTEM)) {
   2126			goto scan_target;
   2127		}
   2128		return -ENXIO;
   2129	} else if (!MEGASAS_IS_LUN_VALID(sdev)) {
   2130		sdev_printk(KERN_INFO, sdev, "%s: invalid LUN\n", __func__);
   2131		return -ENXIO;
   2132	}
   2133
   2134scan_target:
   2135	mr_device_priv_data = kzalloc(sizeof(*mr_device_priv_data),
   2136					GFP_KERNEL);
   2137	if (!mr_device_priv_data)
   2138		return -ENOMEM;
   2139
   2140	if (MEGASAS_IS_LOGICAL(sdev)) {
   2141		ld_tgt_id = MEGASAS_TARGET_ID(sdev);
   2142		instance->ld_tgtid_status[ld_tgt_id] = LD_TARGET_ID_ACTIVE;
   2143		if (megasas_dbg_lvl & LD_PD_DEBUG)
   2144			sdev_printk(KERN_INFO, sdev, "LD target ID %d created.\n", ld_tgt_id);
   2145	}
   2146
   2147	sdev->hostdata = mr_device_priv_data;
   2148
   2149	atomic_set(&mr_device_priv_data->r1_ldio_hint,
   2150		   instance->r1_ldio_hint_default);
   2151	return 0;
   2152}
   2153
   2154static void megasas_slave_destroy(struct scsi_device *sdev)
   2155{
   2156	u16 ld_tgt_id;
   2157	struct megasas_instance *instance;
   2158
   2159	instance = megasas_lookup_instance(sdev->host->host_no);
   2160
   2161	if (MEGASAS_IS_LOGICAL(sdev)) {
   2162		if (!MEGASAS_IS_LUN_VALID(sdev)) {
   2163			sdev_printk(KERN_INFO, sdev, "%s: invalid LUN\n", __func__);
   2164			return;
   2165		}
   2166		ld_tgt_id = MEGASAS_TARGET_ID(sdev);
   2167		instance->ld_tgtid_status[ld_tgt_id] = LD_TARGET_ID_DELETED;
   2168		if (megasas_dbg_lvl & LD_PD_DEBUG)
   2169			sdev_printk(KERN_INFO, sdev,
   2170				    "LD target ID %d removed from OS stack\n", ld_tgt_id);
   2171	}
   2172
   2173	kfree(sdev->hostdata);
   2174	sdev->hostdata = NULL;
   2175}
   2176
   2177/*
   2178* megasas_complete_outstanding_ioctls - Complete outstanding ioctls after a
   2179*                                       kill adapter
   2180* @instance:				Adapter soft state
   2181*
   2182*/
   2183static void megasas_complete_outstanding_ioctls(struct megasas_instance *instance)
   2184{
   2185	int i;
   2186	struct megasas_cmd *cmd_mfi;
   2187	struct megasas_cmd_fusion *cmd_fusion;
   2188	struct fusion_context *fusion = instance->ctrl_context;
   2189
   2190	/* Find all outstanding ioctls */
   2191	if (fusion) {
   2192		for (i = 0; i < instance->max_fw_cmds; i++) {
   2193			cmd_fusion = fusion->cmd_list[i];
   2194			if (cmd_fusion->sync_cmd_idx != (u32)ULONG_MAX) {
   2195				cmd_mfi = instance->cmd_list[cmd_fusion->sync_cmd_idx];
   2196				if (cmd_mfi->sync_cmd &&
   2197				    (cmd_mfi->frame->hdr.cmd != MFI_CMD_ABORT)) {
   2198					cmd_mfi->frame->hdr.cmd_status =
   2199							MFI_STAT_WRONG_STATE;
   2200					megasas_complete_cmd(instance,
   2201							     cmd_mfi, DID_OK);
   2202				}
   2203			}
   2204		}
   2205	} else {
   2206		for (i = 0; i < instance->max_fw_cmds; i++) {
   2207			cmd_mfi = instance->cmd_list[i];
   2208			if (cmd_mfi->sync_cmd && cmd_mfi->frame->hdr.cmd !=
   2209				MFI_CMD_ABORT)
   2210				megasas_complete_cmd(instance, cmd_mfi, DID_OK);
   2211		}
   2212	}
   2213}
   2214
   2215
   2216void megaraid_sas_kill_hba(struct megasas_instance *instance)
   2217{
   2218	if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) {
   2219		dev_warn(&instance->pdev->dev,
   2220			 "Adapter already dead, skipping kill HBA\n");
   2221		return;
   2222	}
   2223
   2224	/* Set critical error to block I/O & ioctls in case caller didn't */
   2225	atomic_set(&instance->adprecovery, MEGASAS_HW_CRITICAL_ERROR);
   2226	/* Wait 1 second to ensure IO or ioctls in build have posted */
   2227	msleep(1000);
   2228	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
   2229		(instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
   2230		(instance->adapter_type != MFI_SERIES)) {
   2231		if (!instance->requestorId) {
   2232			writel(MFI_STOP_ADP, &instance->reg_set->doorbell);
   2233			/* Flush */
   2234			readl(&instance->reg_set->doorbell);
   2235		}
   2236		if (instance->requestorId && instance->peerIsPresent)
   2237			memset(instance->ld_ids, 0xff, MEGASAS_MAX_LD_IDS);
   2238	} else {
   2239		writel(MFI_STOP_ADP,
   2240			&instance->reg_set->inbound_doorbell);
   2241	}
   2242	/* Complete outstanding ioctls when adapter is killed */
   2243	megasas_complete_outstanding_ioctls(instance);
   2244}
   2245
   2246 /**
   2247  * megasas_check_and_restore_queue_depth - Check if queue depth needs to be
   2248  *					restored to max value
   2249  * @instance:			Adapter soft state
   2250  *
   2251  */
   2252void
   2253megasas_check_and_restore_queue_depth(struct megasas_instance *instance)
   2254{
   2255	unsigned long flags;
   2256
   2257	if (instance->flag & MEGASAS_FW_BUSY
   2258	    && time_after(jiffies, instance->last_time + 5 * HZ)
   2259	    && atomic_read(&instance->fw_outstanding) <
   2260	    instance->throttlequeuedepth + 1) {
   2261
   2262		spin_lock_irqsave(instance->host->host_lock, flags);
   2263		instance->flag &= ~MEGASAS_FW_BUSY;
   2264
   2265		instance->host->can_queue = instance->cur_can_queue;
   2266		spin_unlock_irqrestore(instance->host->host_lock, flags);
   2267	}
   2268}
   2269
   2270/**
   2271 * megasas_complete_cmd_dpc	 -	Returns FW's controller structure
   2272 * @instance_addr:			Address of adapter soft state
   2273 *
   2274 * Tasklet to complete cmds
   2275 */
   2276static void megasas_complete_cmd_dpc(unsigned long instance_addr)
   2277{
   2278	u32 producer;
   2279	u32 consumer;
   2280	u32 context;
   2281	struct megasas_cmd *cmd;
   2282	struct megasas_instance *instance =
   2283				(struct megasas_instance *)instance_addr;
   2284	unsigned long flags;
   2285
   2286	/* If we have already declared adapter dead, donot complete cmds */
   2287	if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR)
   2288		return;
   2289
   2290	spin_lock_irqsave(&instance->completion_lock, flags);
   2291
   2292	producer = le32_to_cpu(*instance->producer);
   2293	consumer = le32_to_cpu(*instance->consumer);
   2294
   2295	while (consumer != producer) {
   2296		context = le32_to_cpu(instance->reply_queue[consumer]);
   2297		if (context >= instance->max_fw_cmds) {
   2298			dev_err(&instance->pdev->dev, "Unexpected context value %x\n",
   2299				context);
   2300			BUG();
   2301		}
   2302
   2303		cmd = instance->cmd_list[context];
   2304
   2305		megasas_complete_cmd(instance, cmd, DID_OK);
   2306
   2307		consumer++;
   2308		if (consumer == (instance->max_fw_cmds + 1)) {
   2309			consumer = 0;
   2310		}
   2311	}
   2312
   2313	*instance->consumer = cpu_to_le32(producer);
   2314
   2315	spin_unlock_irqrestore(&instance->completion_lock, flags);
   2316
   2317	/*
   2318	 * Check if we can restore can_queue
   2319	 */
   2320	megasas_check_and_restore_queue_depth(instance);
   2321}
   2322
   2323static void megasas_sriov_heartbeat_handler(struct timer_list *t);
   2324
   2325/**
   2326 * megasas_start_timer - Initializes sriov heartbeat timer object
   2327 * @instance:		Adapter soft state
   2328 *
   2329 */
   2330void megasas_start_timer(struct megasas_instance *instance)
   2331{
   2332	struct timer_list *timer = &instance->sriov_heartbeat_timer;
   2333
   2334	timer_setup(timer, megasas_sriov_heartbeat_handler, 0);
   2335	timer->expires = jiffies + MEGASAS_SRIOV_HEARTBEAT_INTERVAL_VF;
   2336	add_timer(timer);
   2337}
   2338
   2339static void
   2340megasas_internal_reset_defer_cmds(struct megasas_instance *instance);
   2341
   2342static void
   2343process_fw_state_change_wq(struct work_struct *work);
   2344
   2345static void megasas_do_ocr(struct megasas_instance *instance)
   2346{
   2347	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS1064R) ||
   2348	(instance->pdev->device == PCI_DEVICE_ID_DELL_PERC5) ||
   2349	(instance->pdev->device == PCI_DEVICE_ID_LSI_VERDE_ZCR)) {
   2350		*instance->consumer = cpu_to_le32(MEGASAS_ADPRESET_INPROG_SIGN);
   2351	}
   2352	instance->instancet->disable_intr(instance);
   2353	atomic_set(&instance->adprecovery, MEGASAS_ADPRESET_SM_INFAULT);
   2354	instance->issuepend_done = 0;
   2355
   2356	atomic_set(&instance->fw_outstanding, 0);
   2357	megasas_internal_reset_defer_cmds(instance);
   2358	process_fw_state_change_wq(&instance->work_init);
   2359}
   2360
   2361static int megasas_get_ld_vf_affiliation_111(struct megasas_instance *instance,
   2362					    int initial)
   2363{
   2364	struct megasas_cmd *cmd;
   2365	struct megasas_dcmd_frame *dcmd;
   2366	struct MR_LD_VF_AFFILIATION_111 *new_affiliation_111 = NULL;
   2367	dma_addr_t new_affiliation_111_h;
   2368	int ld, retval = 0;
   2369	u8 thisVf;
   2370
   2371	cmd = megasas_get_cmd(instance);
   2372
   2373	if (!cmd) {
   2374		dev_printk(KERN_DEBUG, &instance->pdev->dev, "megasas_get_ld_vf_affiliation_111:"
   2375		       "Failed to get cmd for scsi%d\n",
   2376			instance->host->host_no);
   2377		return -ENOMEM;
   2378	}
   2379
   2380	dcmd = &cmd->frame->dcmd;
   2381
   2382	if (!instance->vf_affiliation_111) {
   2383		dev_warn(&instance->pdev->dev, "SR-IOV: Couldn't get LD/VF "
   2384		       "affiliation for scsi%d\n", instance->host->host_no);
   2385		megasas_return_cmd(instance, cmd);
   2386		return -ENOMEM;
   2387	}
   2388
   2389	if (initial)
   2390			memset(instance->vf_affiliation_111, 0,
   2391			       sizeof(struct MR_LD_VF_AFFILIATION_111));
   2392	else {
   2393		new_affiliation_111 =
   2394			dma_alloc_coherent(&instance->pdev->dev,
   2395					   sizeof(struct MR_LD_VF_AFFILIATION_111),
   2396					   &new_affiliation_111_h, GFP_KERNEL);
   2397		if (!new_affiliation_111) {
   2398			dev_printk(KERN_DEBUG, &instance->pdev->dev, "SR-IOV: Couldn't allocate "
   2399			       "memory for new affiliation for scsi%d\n",
   2400			       instance->host->host_no);
   2401			megasas_return_cmd(instance, cmd);
   2402			return -ENOMEM;
   2403		}
   2404	}
   2405
   2406	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
   2407
   2408	dcmd->cmd = MFI_CMD_DCMD;
   2409	dcmd->cmd_status = MFI_STAT_INVALID_STATUS;
   2410	dcmd->sge_count = 1;
   2411	dcmd->flags = cpu_to_le16(MFI_FRAME_DIR_BOTH);
   2412	dcmd->timeout = 0;
   2413	dcmd->pad_0 = 0;
   2414	dcmd->data_xfer_len =
   2415		cpu_to_le32(sizeof(struct MR_LD_VF_AFFILIATION_111));
   2416	dcmd->opcode = cpu_to_le32(MR_DCMD_LD_VF_MAP_GET_ALL_LDS_111);
   2417
   2418	if (initial)
   2419		dcmd->sgl.sge32[0].phys_addr =
   2420			cpu_to_le32(instance->vf_affiliation_111_h);
   2421	else
   2422		dcmd->sgl.sge32[0].phys_addr =
   2423			cpu_to_le32(new_affiliation_111_h);
   2424
   2425	dcmd->sgl.sge32[0].length = cpu_to_le32(
   2426		sizeof(struct MR_LD_VF_AFFILIATION_111));
   2427
   2428	dev_warn(&instance->pdev->dev, "SR-IOV: Getting LD/VF affiliation for "
   2429	       "scsi%d\n", instance->host->host_no);
   2430
   2431	if (megasas_issue_blocked_cmd(instance, cmd, 0) != DCMD_SUCCESS) {
   2432		dev_warn(&instance->pdev->dev, "SR-IOV: LD/VF affiliation DCMD"
   2433		       " failed with status 0x%x for scsi%d\n",
   2434		       dcmd->cmd_status, instance->host->host_no);
   2435		retval = 1; /* Do a scan if we couldn't get affiliation */
   2436		goto out;
   2437	}
   2438
   2439	if (!initial) {
   2440		thisVf = new_affiliation_111->thisVf;
   2441		for (ld = 0 ; ld < new_affiliation_111->vdCount; ld++)
   2442			if (instance->vf_affiliation_111->map[ld].policy[thisVf] !=
   2443			    new_affiliation_111->map[ld].policy[thisVf]) {
   2444				dev_warn(&instance->pdev->dev, "SR-IOV: "
   2445				       "Got new LD/VF affiliation for scsi%d\n",
   2446				       instance->host->host_no);
   2447				memcpy(instance->vf_affiliation_111,
   2448				       new_affiliation_111,
   2449				       sizeof(struct MR_LD_VF_AFFILIATION_111));
   2450				retval = 1;
   2451				goto out;
   2452			}
   2453	}
   2454out:
   2455	if (new_affiliation_111) {
   2456		dma_free_coherent(&instance->pdev->dev,
   2457				    sizeof(struct MR_LD_VF_AFFILIATION_111),
   2458				    new_affiliation_111,
   2459				    new_affiliation_111_h);
   2460	}
   2461
   2462	megasas_return_cmd(instance, cmd);
   2463
   2464	return retval;
   2465}
   2466
   2467static int megasas_get_ld_vf_affiliation_12(struct megasas_instance *instance,
   2468					    int initial)
   2469{
   2470	struct megasas_cmd *cmd;
   2471	struct megasas_dcmd_frame *dcmd;
   2472	struct MR_LD_VF_AFFILIATION *new_affiliation = NULL;
   2473	struct MR_LD_VF_MAP *newmap = NULL, *savedmap = NULL;
   2474	dma_addr_t new_affiliation_h;
   2475	int i, j, retval = 0, found = 0, doscan = 0;
   2476	u8 thisVf;
   2477
   2478	cmd = megasas_get_cmd(instance);
   2479
   2480	if (!cmd) {
   2481		dev_printk(KERN_DEBUG, &instance->pdev->dev, "megasas_get_ld_vf_affiliation12: "
   2482		       "Failed to get cmd for scsi%d\n",
   2483		       instance->host->host_no);
   2484		return -ENOMEM;
   2485	}
   2486
   2487	dcmd = &cmd->frame->dcmd;
   2488
   2489	if (!instance->vf_affiliation) {
   2490		dev_warn(&instance->pdev->dev, "SR-IOV: Couldn't get LD/VF "
   2491		       "affiliation for scsi%d\n", instance->host->host_no);
   2492		megasas_return_cmd(instance, cmd);
   2493		return -ENOMEM;
   2494	}
   2495
   2496	if (initial)
   2497		memset(instance->vf_affiliation, 0, (MAX_LOGICAL_DRIVES + 1) *
   2498		       sizeof(struct MR_LD_VF_AFFILIATION));
   2499	else {
   2500		new_affiliation =
   2501			dma_alloc_coherent(&instance->pdev->dev,
   2502					   (MAX_LOGICAL_DRIVES + 1) * sizeof(struct MR_LD_VF_AFFILIATION),
   2503					   &new_affiliation_h, GFP_KERNEL);
   2504		if (!new_affiliation) {
   2505			dev_printk(KERN_DEBUG, &instance->pdev->dev, "SR-IOV: Couldn't allocate "
   2506			       "memory for new affiliation for scsi%d\n",
   2507			       instance->host->host_no);
   2508			megasas_return_cmd(instance, cmd);
   2509			return -ENOMEM;
   2510		}
   2511	}
   2512
   2513	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
   2514
   2515	dcmd->cmd = MFI_CMD_DCMD;
   2516	dcmd->cmd_status = MFI_STAT_INVALID_STATUS;
   2517	dcmd->sge_count = 1;
   2518	dcmd->flags = cpu_to_le16(MFI_FRAME_DIR_BOTH);
   2519	dcmd->timeout = 0;
   2520	dcmd->pad_0 = 0;
   2521	dcmd->data_xfer_len = cpu_to_le32((MAX_LOGICAL_DRIVES + 1) *
   2522		sizeof(struct MR_LD_VF_AFFILIATION));
   2523	dcmd->opcode = cpu_to_le32(MR_DCMD_LD_VF_MAP_GET_ALL_LDS);
   2524
   2525	if (initial)
   2526		dcmd->sgl.sge32[0].phys_addr =
   2527			cpu_to_le32(instance->vf_affiliation_h);
   2528	else
   2529		dcmd->sgl.sge32[0].phys_addr =
   2530			cpu_to_le32(new_affiliation_h);
   2531
   2532	dcmd->sgl.sge32[0].length = cpu_to_le32((MAX_LOGICAL_DRIVES + 1) *
   2533		sizeof(struct MR_LD_VF_AFFILIATION));
   2534
   2535	dev_warn(&instance->pdev->dev, "SR-IOV: Getting LD/VF affiliation for "
   2536	       "scsi%d\n", instance->host->host_no);
   2537
   2538
   2539	if (megasas_issue_blocked_cmd(instance, cmd, 0) != DCMD_SUCCESS) {
   2540		dev_warn(&instance->pdev->dev, "SR-IOV: LD/VF affiliation DCMD"
   2541		       " failed with status 0x%x for scsi%d\n",
   2542		       dcmd->cmd_status, instance->host->host_no);
   2543		retval = 1; /* Do a scan if we couldn't get affiliation */
   2544		goto out;
   2545	}
   2546
   2547	if (!initial) {
   2548		if (!new_affiliation->ldCount) {
   2549			dev_warn(&instance->pdev->dev, "SR-IOV: Got new LD/VF "
   2550			       "affiliation for passive path for scsi%d\n",
   2551			       instance->host->host_no);
   2552			retval = 1;
   2553			goto out;
   2554		}
   2555		newmap = new_affiliation->map;
   2556		savedmap = instance->vf_affiliation->map;
   2557		thisVf = new_affiliation->thisVf;
   2558		for (i = 0 ; i < new_affiliation->ldCount; i++) {
   2559			found = 0;
   2560			for (j = 0; j < instance->vf_affiliation->ldCount;
   2561			     j++) {
   2562				if (newmap->ref.targetId ==
   2563				    savedmap->ref.targetId) {
   2564					found = 1;
   2565					if (newmap->policy[thisVf] !=
   2566					    savedmap->policy[thisVf]) {
   2567						doscan = 1;
   2568						goto out;
   2569					}
   2570				}
   2571				savedmap = (struct MR_LD_VF_MAP *)
   2572					((unsigned char *)savedmap +
   2573					 savedmap->size);
   2574			}
   2575			if (!found && newmap->policy[thisVf] !=
   2576			    MR_LD_ACCESS_HIDDEN) {
   2577				doscan = 1;
   2578				goto out;
   2579			}
   2580			newmap = (struct MR_LD_VF_MAP *)
   2581				((unsigned char *)newmap + newmap->size);
   2582		}
   2583
   2584		newmap = new_affiliation->map;
   2585		savedmap = instance->vf_affiliation->map;
   2586
   2587		for (i = 0 ; i < instance->vf_affiliation->ldCount; i++) {
   2588			found = 0;
   2589			for (j = 0 ; j < new_affiliation->ldCount; j++) {
   2590				if (savedmap->ref.targetId ==
   2591				    newmap->ref.targetId) {
   2592					found = 1;
   2593					if (savedmap->policy[thisVf] !=
   2594					    newmap->policy[thisVf]) {
   2595						doscan = 1;
   2596						goto out;
   2597					}
   2598				}
   2599				newmap = (struct MR_LD_VF_MAP *)
   2600					((unsigned char *)newmap +
   2601					 newmap->size);
   2602			}
   2603			if (!found && savedmap->policy[thisVf] !=
   2604			    MR_LD_ACCESS_HIDDEN) {
   2605				doscan = 1;
   2606				goto out;
   2607			}
   2608			savedmap = (struct MR_LD_VF_MAP *)
   2609				((unsigned char *)savedmap +
   2610				 savedmap->size);
   2611		}
   2612	}
   2613out:
   2614	if (doscan) {
   2615		dev_warn(&instance->pdev->dev, "SR-IOV: Got new LD/VF "
   2616		       "affiliation for scsi%d\n", instance->host->host_no);
   2617		memcpy(instance->vf_affiliation, new_affiliation,
   2618		       new_affiliation->size);
   2619		retval = 1;
   2620	}
   2621
   2622	if (new_affiliation)
   2623		dma_free_coherent(&instance->pdev->dev,
   2624				    (MAX_LOGICAL_DRIVES + 1) *
   2625				    sizeof(struct MR_LD_VF_AFFILIATION),
   2626				    new_affiliation, new_affiliation_h);
   2627	megasas_return_cmd(instance, cmd);
   2628
   2629	return retval;
   2630}
   2631
   2632/* This function will get the current SR-IOV LD/VF affiliation */
   2633static int megasas_get_ld_vf_affiliation(struct megasas_instance *instance,
   2634	int initial)
   2635{
   2636	int retval;
   2637
   2638	if (instance->PlasmaFW111)
   2639		retval = megasas_get_ld_vf_affiliation_111(instance, initial);
   2640	else
   2641		retval = megasas_get_ld_vf_affiliation_12(instance, initial);
   2642	return retval;
   2643}
   2644
   2645/* This function will tell FW to start the SR-IOV heartbeat */
   2646int megasas_sriov_start_heartbeat(struct megasas_instance *instance,
   2647					 int initial)
   2648{
   2649	struct megasas_cmd *cmd;
   2650	struct megasas_dcmd_frame *dcmd;
   2651	int retval = 0;
   2652
   2653	cmd = megasas_get_cmd(instance);
   2654
   2655	if (!cmd) {
   2656		dev_printk(KERN_DEBUG, &instance->pdev->dev, "megasas_sriov_start_heartbeat: "
   2657		       "Failed to get cmd for scsi%d\n",
   2658		       instance->host->host_no);
   2659		return -ENOMEM;
   2660	}
   2661
   2662	dcmd = &cmd->frame->dcmd;
   2663
   2664	if (initial) {
   2665		instance->hb_host_mem =
   2666			dma_alloc_coherent(&instance->pdev->dev,
   2667					   sizeof(struct MR_CTRL_HB_HOST_MEM),
   2668					   &instance->hb_host_mem_h,
   2669					   GFP_KERNEL);
   2670		if (!instance->hb_host_mem) {
   2671			dev_printk(KERN_DEBUG, &instance->pdev->dev, "SR-IOV: Couldn't allocate"
   2672			       " memory for heartbeat host memory for scsi%d\n",
   2673			       instance->host->host_no);
   2674			retval = -ENOMEM;
   2675			goto out;
   2676		}
   2677	}
   2678
   2679	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
   2680
   2681	dcmd->mbox.s[0] = cpu_to_le16(sizeof(struct MR_CTRL_HB_HOST_MEM));
   2682	dcmd->cmd = MFI_CMD_DCMD;
   2683	dcmd->cmd_status = MFI_STAT_INVALID_STATUS;
   2684	dcmd->sge_count = 1;
   2685	dcmd->flags = cpu_to_le16(MFI_FRAME_DIR_BOTH);
   2686	dcmd->timeout = 0;
   2687	dcmd->pad_0 = 0;
   2688	dcmd->data_xfer_len = cpu_to_le32(sizeof(struct MR_CTRL_HB_HOST_MEM));
   2689	dcmd->opcode = cpu_to_le32(MR_DCMD_CTRL_SHARED_HOST_MEM_ALLOC);
   2690
   2691	megasas_set_dma_settings(instance, dcmd, instance->hb_host_mem_h,
   2692				 sizeof(struct MR_CTRL_HB_HOST_MEM));
   2693
   2694	dev_warn(&instance->pdev->dev, "SR-IOV: Starting heartbeat for scsi%d\n",
   2695	       instance->host->host_no);
   2696
   2697	if ((instance->adapter_type != MFI_SERIES) &&
   2698	    !instance->mask_interrupts)
   2699		retval = megasas_issue_blocked_cmd(instance, cmd,
   2700			MEGASAS_ROUTINE_WAIT_TIME_VF);
   2701	else
   2702		retval = megasas_issue_polled(instance, cmd);
   2703
   2704	if (retval) {
   2705		dev_warn(&instance->pdev->dev, "SR-IOV: MR_DCMD_CTRL_SHARED_HOST"
   2706			"_MEM_ALLOC DCMD %s for scsi%d\n",
   2707			(dcmd->cmd_status == MFI_STAT_INVALID_STATUS) ?
   2708			"timed out" : "failed", instance->host->host_no);
   2709		retval = 1;
   2710	}
   2711
   2712out:
   2713	megasas_return_cmd(instance, cmd);
   2714
   2715	return retval;
   2716}
   2717
   2718/* Handler for SR-IOV heartbeat */
   2719static void megasas_sriov_heartbeat_handler(struct timer_list *t)
   2720{
   2721	struct megasas_instance *instance =
   2722		from_timer(instance, t, sriov_heartbeat_timer);
   2723
   2724	if (instance->hb_host_mem->HB.fwCounter !=
   2725	    instance->hb_host_mem->HB.driverCounter) {
   2726		instance->hb_host_mem->HB.driverCounter =
   2727			instance->hb_host_mem->HB.fwCounter;
   2728		mod_timer(&instance->sriov_heartbeat_timer,
   2729			  jiffies + MEGASAS_SRIOV_HEARTBEAT_INTERVAL_VF);
   2730	} else {
   2731		dev_warn(&instance->pdev->dev, "SR-IOV: Heartbeat never "
   2732		       "completed for scsi%d\n", instance->host->host_no);
   2733		schedule_work(&instance->work_init);
   2734	}
   2735}
   2736
   2737/**
   2738 * megasas_wait_for_outstanding -	Wait for all outstanding cmds
   2739 * @instance:				Adapter soft state
   2740 *
   2741 * This function waits for up to MEGASAS_RESET_WAIT_TIME seconds for FW to
   2742 * complete all its outstanding commands. Returns error if one or more IOs
   2743 * are pending after this time period. It also marks the controller dead.
   2744 */
   2745static int megasas_wait_for_outstanding(struct megasas_instance *instance)
   2746{
   2747	int i, sl, outstanding;
   2748	u32 reset_index;
   2749	u32 wait_time = MEGASAS_RESET_WAIT_TIME;
   2750	unsigned long flags;
   2751	struct list_head clist_local;
   2752	struct megasas_cmd *reset_cmd;
   2753	u32 fw_state;
   2754
   2755	if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) {
   2756		dev_info(&instance->pdev->dev, "%s:%d HBA is killed.\n",
   2757		__func__, __LINE__);
   2758		return FAILED;
   2759	}
   2760
   2761	if (atomic_read(&instance->adprecovery) != MEGASAS_HBA_OPERATIONAL) {
   2762
   2763		INIT_LIST_HEAD(&clist_local);
   2764		spin_lock_irqsave(&instance->hba_lock, flags);
   2765		list_splice_init(&instance->internal_reset_pending_q,
   2766				&clist_local);
   2767		spin_unlock_irqrestore(&instance->hba_lock, flags);
   2768
   2769		dev_notice(&instance->pdev->dev, "HBA reset wait ...\n");
   2770		for (i = 0; i < wait_time; i++) {
   2771			msleep(1000);
   2772			if (atomic_read(&instance->adprecovery) == MEGASAS_HBA_OPERATIONAL)
   2773				break;
   2774		}
   2775
   2776		if (atomic_read(&instance->adprecovery) != MEGASAS_HBA_OPERATIONAL) {
   2777			dev_notice(&instance->pdev->dev, "reset: Stopping HBA.\n");
   2778			atomic_set(&instance->adprecovery, MEGASAS_HW_CRITICAL_ERROR);
   2779			return FAILED;
   2780		}
   2781
   2782		reset_index = 0;
   2783		while (!list_empty(&clist_local)) {
   2784			reset_cmd = list_entry((&clist_local)->next,
   2785						struct megasas_cmd, list);
   2786			list_del_init(&reset_cmd->list);
   2787			if (reset_cmd->scmd) {
   2788				reset_cmd->scmd->result = DID_REQUEUE << 16;
   2789				dev_notice(&instance->pdev->dev, "%d:%p reset [%02x]\n",
   2790					reset_index, reset_cmd,
   2791					reset_cmd->scmd->cmnd[0]);
   2792
   2793				scsi_done(reset_cmd->scmd);
   2794				megasas_return_cmd(instance, reset_cmd);
   2795			} else if (reset_cmd->sync_cmd) {
   2796				dev_notice(&instance->pdev->dev, "%p synch cmds"
   2797						"reset queue\n",
   2798						reset_cmd);
   2799
   2800				reset_cmd->cmd_status_drv = DCMD_INIT;
   2801				instance->instancet->fire_cmd(instance,
   2802						reset_cmd->frame_phys_addr,
   2803						0, instance->reg_set);
   2804			} else {
   2805				dev_notice(&instance->pdev->dev, "%p unexpected"
   2806					"cmds lst\n",
   2807					reset_cmd);
   2808			}
   2809			reset_index++;
   2810		}
   2811
   2812		return SUCCESS;
   2813	}
   2814
   2815	for (i = 0; i < resetwaittime; i++) {
   2816		outstanding = atomic_read(&instance->fw_outstanding);
   2817
   2818		if (!outstanding)
   2819			break;
   2820
   2821		if (!(i % MEGASAS_RESET_NOTICE_INTERVAL)) {
   2822			dev_notice(&instance->pdev->dev, "[%2d]waiting for %d "
   2823			       "commands to complete\n",i,outstanding);
   2824			/*
   2825			 * Call cmd completion routine. Cmd to be
   2826			 * be completed directly without depending on isr.
   2827			 */
   2828			megasas_complete_cmd_dpc((unsigned long)instance);
   2829		}
   2830
   2831		msleep(1000);
   2832	}
   2833
   2834	i = 0;
   2835	outstanding = atomic_read(&instance->fw_outstanding);
   2836	fw_state = instance->instancet->read_fw_status_reg(instance) & MFI_STATE_MASK;
   2837
   2838	if ((!outstanding && (fw_state == MFI_STATE_OPERATIONAL)))
   2839		goto no_outstanding;
   2840
   2841	if (instance->disableOnlineCtrlReset)
   2842		goto kill_hba_and_failed;
   2843	do {
   2844		if ((fw_state == MFI_STATE_FAULT) || atomic_read(&instance->fw_outstanding)) {
   2845			dev_info(&instance->pdev->dev,
   2846				"%s:%d waiting_for_outstanding: before issue OCR. FW state = 0x%x, outstanding 0x%x\n",
   2847				__func__, __LINE__, fw_state, atomic_read(&instance->fw_outstanding));
   2848			if (i == 3)
   2849				goto kill_hba_and_failed;
   2850			megasas_do_ocr(instance);
   2851
   2852			if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) {
   2853				dev_info(&instance->pdev->dev, "%s:%d OCR failed and HBA is killed.\n",
   2854				__func__, __LINE__);
   2855				return FAILED;
   2856			}
   2857			dev_info(&instance->pdev->dev, "%s:%d waiting_for_outstanding: after issue OCR.\n",
   2858				__func__, __LINE__);
   2859
   2860			for (sl = 0; sl < 10; sl++)
   2861				msleep(500);
   2862
   2863			outstanding = atomic_read(&instance->fw_outstanding);
   2864
   2865			fw_state = instance->instancet->read_fw_status_reg(instance) & MFI_STATE_MASK;
   2866			if ((!outstanding && (fw_state == MFI_STATE_OPERATIONAL)))
   2867				goto no_outstanding;
   2868		}
   2869		i++;
   2870	} while (i <= 3);
   2871
   2872no_outstanding:
   2873
   2874	dev_info(&instance->pdev->dev, "%s:%d no more pending commands remain after reset handling.\n",
   2875		__func__, __LINE__);
   2876	return SUCCESS;
   2877
   2878kill_hba_and_failed:
   2879
   2880	/* Reset not supported, kill adapter */
   2881	dev_info(&instance->pdev->dev, "%s:%d killing adapter scsi%d"
   2882		" disableOnlineCtrlReset %d fw_outstanding %d \n",
   2883		__func__, __LINE__, instance->host->host_no, instance->disableOnlineCtrlReset,
   2884		atomic_read(&instance->fw_outstanding));
   2885	megasas_dump_pending_frames(instance);
   2886	megaraid_sas_kill_hba(instance);
   2887
   2888	return FAILED;
   2889}
   2890
   2891/**
   2892 * megasas_generic_reset -	Generic reset routine
   2893 * @scmd:			Mid-layer SCSI command
   2894 *
   2895 * This routine implements a generic reset handler for device, bus and host
   2896 * reset requests. Device, bus and host specific reset handlers can use this
   2897 * function after they do their specific tasks.
   2898 */
   2899static int megasas_generic_reset(struct scsi_cmnd *scmd)
   2900{
   2901	int ret_val;
   2902	struct megasas_instance *instance;
   2903
   2904	instance = (struct megasas_instance *)scmd->device->host->hostdata;
   2905
   2906	scmd_printk(KERN_NOTICE, scmd, "megasas: RESET cmd=%x retries=%x\n",
   2907		 scmd->cmnd[0], scmd->retries);
   2908
   2909	if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) {
   2910		dev_err(&instance->pdev->dev, "cannot recover from previous reset failures\n");
   2911		return FAILED;
   2912	}
   2913
   2914	ret_val = megasas_wait_for_outstanding(instance);
   2915	if (ret_val == SUCCESS)
   2916		dev_notice(&instance->pdev->dev, "reset successful\n");
   2917	else
   2918		dev_err(&instance->pdev->dev, "failed to do reset\n");
   2919
   2920	return ret_val;
   2921}
   2922
   2923/**
   2924 * megasas_reset_timer - quiesce the adapter if required
   2925 * @scmd:		scsi cmnd
   2926 *
   2927 * Sets the FW busy flag and reduces the host->can_queue if the
   2928 * cmd has not been completed within the timeout period.
   2929 */
   2930static enum
   2931blk_eh_timer_return megasas_reset_timer(struct scsi_cmnd *scmd)
   2932{
   2933	struct megasas_instance *instance;
   2934	unsigned long flags;
   2935
   2936	if (time_after(jiffies, scmd->jiffies_at_alloc +
   2937				(scmd_timeout * 2) * HZ)) {
   2938		return BLK_EH_DONE;
   2939	}
   2940
   2941	instance = (struct megasas_instance *)scmd->device->host->hostdata;
   2942	if (!(instance->flag & MEGASAS_FW_BUSY)) {
   2943		/* FW is busy, throttle IO */
   2944		spin_lock_irqsave(instance->host->host_lock, flags);
   2945
   2946		instance->host->can_queue = instance->throttlequeuedepth;
   2947		instance->last_time = jiffies;
   2948		instance->flag |= MEGASAS_FW_BUSY;
   2949
   2950		spin_unlock_irqrestore(instance->host->host_lock, flags);
   2951	}
   2952	return BLK_EH_RESET_TIMER;
   2953}
   2954
   2955/**
   2956 * megasas_dump -	This function will print hexdump of provided buffer.
   2957 * @buf:		Buffer to be dumped
   2958 * @sz:		Size in bytes
   2959 * @format:		Different formats of dumping e.g. format=n will
   2960 *			cause only 'n' 32 bit words to be dumped in a single
   2961 *			line.
   2962 */
   2963inline void
   2964megasas_dump(void *buf, int sz, int format)
   2965{
   2966	int i;
   2967	__le32 *buf_loc = (__le32 *)buf;
   2968
   2969	for (i = 0; i < (sz / sizeof(__le32)); i++) {
   2970		if ((i % format) == 0) {
   2971			if (i != 0)
   2972				printk(KERN_CONT "\n");
   2973			printk(KERN_CONT "%08x: ", (i * 4));
   2974		}
   2975		printk(KERN_CONT "%08x ", le32_to_cpu(buf_loc[i]));
   2976	}
   2977	printk(KERN_CONT "\n");
   2978}
   2979
   2980/**
   2981 * megasas_dump_reg_set -	This function will print hexdump of register set
   2982 * @reg_set:	Register set to be dumped
   2983 */
   2984inline void
   2985megasas_dump_reg_set(void __iomem *reg_set)
   2986{
   2987	unsigned int i, sz = 256;
   2988	u32 __iomem *reg = (u32 __iomem *)reg_set;
   2989
   2990	for (i = 0; i < (sz / sizeof(u32)); i++)
   2991		printk("%08x: %08x\n", (i * 4), readl(&reg[i]));
   2992}
   2993
   2994/**
   2995 * megasas_dump_fusion_io -	This function will print key details
   2996 *				of SCSI IO
   2997 * @scmd:			SCSI command pointer of SCSI IO
   2998 */
   2999void
   3000megasas_dump_fusion_io(struct scsi_cmnd *scmd)
   3001{
   3002	struct megasas_cmd_fusion *cmd = megasas_priv(scmd)->cmd_priv;
   3003	union MEGASAS_REQUEST_DESCRIPTOR_UNION *req_desc;
   3004	struct megasas_instance *instance;
   3005
   3006	instance = (struct megasas_instance *)scmd->device->host->hostdata;
   3007
   3008	scmd_printk(KERN_INFO, scmd,
   3009		    "scmd: (0x%p)  retries: 0x%x  allowed: 0x%x\n",
   3010		    scmd, scmd->retries, scmd->allowed);
   3011	scsi_print_command(scmd);
   3012
   3013	if (cmd) {
   3014		req_desc = (union MEGASAS_REQUEST_DESCRIPTOR_UNION *)cmd->request_desc;
   3015		scmd_printk(KERN_INFO, scmd, "Request descriptor details:\n");
   3016		scmd_printk(KERN_INFO, scmd,
   3017			    "RequestFlags:0x%x  MSIxIndex:0x%x  SMID:0x%x  LMID:0x%x  DevHandle:0x%x\n",
   3018			    req_desc->SCSIIO.RequestFlags,
   3019			    req_desc->SCSIIO.MSIxIndex, req_desc->SCSIIO.SMID,
   3020			    req_desc->SCSIIO.LMID, req_desc->SCSIIO.DevHandle);
   3021
   3022		printk(KERN_INFO "IO request frame:\n");
   3023		megasas_dump(cmd->io_request,
   3024			     MEGA_MPI2_RAID_DEFAULT_IO_FRAME_SIZE, 8);
   3025		printk(KERN_INFO "Chain frame:\n");
   3026		megasas_dump(cmd->sg_frame,
   3027			     instance->max_chain_frame_sz, 8);
   3028	}
   3029
   3030}
   3031
   3032/*
   3033 * megasas_dump_sys_regs - This function will dump system registers through
   3034 *			    sysfs.
   3035 * @reg_set:		    Pointer to System register set.
   3036 * @buf:		    Buffer to which output is to be written.
   3037 * @return:		    Number of bytes written to buffer.
   3038 */
   3039static inline ssize_t
   3040megasas_dump_sys_regs(void __iomem *reg_set, char *buf)
   3041{
   3042	unsigned int i, sz = 256;
   3043	int bytes_wrote = 0;
   3044	char *loc = (char *)buf;
   3045	u32 __iomem *reg = (u32 __iomem *)reg_set;
   3046
   3047	for (i = 0; i < sz / sizeof(u32); i++) {
   3048		bytes_wrote += scnprintf(loc + bytes_wrote,
   3049					 PAGE_SIZE - bytes_wrote,
   3050					 "%08x: %08x\n", (i * 4),
   3051					 readl(&reg[i]));
   3052	}
   3053	return bytes_wrote;
   3054}
   3055
   3056/**
   3057 * megasas_reset_bus_host -	Bus & host reset handler entry point
   3058 * @scmd:			Mid-layer SCSI command
   3059 */
   3060static int megasas_reset_bus_host(struct scsi_cmnd *scmd)
   3061{
   3062	int ret;
   3063	struct megasas_instance *instance;
   3064
   3065	instance = (struct megasas_instance *)scmd->device->host->hostdata;
   3066
   3067	scmd_printk(KERN_INFO, scmd,
   3068		"OCR is requested due to IO timeout!!\n");
   3069
   3070	scmd_printk(KERN_INFO, scmd,
   3071		"SCSI host state: %d  SCSI host busy: %d  FW outstanding: %d\n",
   3072		scmd->device->host->shost_state,
   3073		scsi_host_busy(scmd->device->host),
   3074		atomic_read(&instance->fw_outstanding));
   3075	/*
   3076	 * First wait for all commands to complete
   3077	 */
   3078	if (instance->adapter_type == MFI_SERIES) {
   3079		ret = megasas_generic_reset(scmd);
   3080	} else {
   3081		megasas_dump_fusion_io(scmd);
   3082		ret = megasas_reset_fusion(scmd->device->host,
   3083				SCSIIO_TIMEOUT_OCR);
   3084	}
   3085
   3086	return ret;
   3087}
   3088
   3089/**
   3090 * megasas_task_abort - Issues task abort request to firmware
   3091 *			(supported only for fusion adapters)
   3092 * @scmd:		SCSI command pointer
   3093 */
   3094static int megasas_task_abort(struct scsi_cmnd *scmd)
   3095{
   3096	int ret;
   3097	struct megasas_instance *instance;
   3098
   3099	instance = (struct megasas_instance *)scmd->device->host->hostdata;
   3100
   3101	if (instance->adapter_type != MFI_SERIES)
   3102		ret = megasas_task_abort_fusion(scmd);
   3103	else {
   3104		sdev_printk(KERN_NOTICE, scmd->device, "TASK ABORT not supported\n");
   3105		ret = FAILED;
   3106	}
   3107
   3108	return ret;
   3109}
   3110
   3111/**
   3112 * megasas_reset_target:  Issues target reset request to firmware
   3113 *                        (supported only for fusion adapters)
   3114 * @scmd:                 SCSI command pointer
   3115 */
   3116static int megasas_reset_target(struct scsi_cmnd *scmd)
   3117{
   3118	int ret;
   3119	struct megasas_instance *instance;
   3120
   3121	instance = (struct megasas_instance *)scmd->device->host->hostdata;
   3122
   3123	if (instance->adapter_type != MFI_SERIES)
   3124		ret = megasas_reset_target_fusion(scmd);
   3125	else {
   3126		sdev_printk(KERN_NOTICE, scmd->device, "TARGET RESET not supported\n");
   3127		ret = FAILED;
   3128	}
   3129
   3130	return ret;
   3131}
   3132
   3133/**
   3134 * megasas_bios_param - Returns disk geometry for a disk
   3135 * @sdev:		device handle
   3136 * @bdev:		block device
   3137 * @capacity:		drive capacity
   3138 * @geom:		geometry parameters
   3139 */
   3140static int
   3141megasas_bios_param(struct scsi_device *sdev, struct block_device *bdev,
   3142		 sector_t capacity, int geom[])
   3143{
   3144	int heads;
   3145	int sectors;
   3146	sector_t cylinders;
   3147	unsigned long tmp;
   3148
   3149	/* Default heads (64) & sectors (32) */
   3150	heads = 64;
   3151	sectors = 32;
   3152
   3153	tmp = heads * sectors;
   3154	cylinders = capacity;
   3155
   3156	sector_div(cylinders, tmp);
   3157
   3158	/*
   3159	 * Handle extended translation size for logical drives > 1Gb
   3160	 */
   3161
   3162	if (capacity >= 0x200000) {
   3163		heads = 255;
   3164		sectors = 63;
   3165		tmp = heads*sectors;
   3166		cylinders = capacity;
   3167		sector_div(cylinders, tmp);
   3168	}
   3169
   3170	geom[0] = heads;
   3171	geom[1] = sectors;
   3172	geom[2] = cylinders;
   3173
   3174	return 0;
   3175}
   3176
   3177static int megasas_map_queues(struct Scsi_Host *shost)
   3178{
   3179	struct megasas_instance *instance;
   3180	int qoff = 0, offset;
   3181	struct blk_mq_queue_map *map;
   3182
   3183	instance = (struct megasas_instance *)shost->hostdata;
   3184
   3185	if (shost->nr_hw_queues == 1)
   3186		return 0;
   3187
   3188	offset = instance->low_latency_index_start;
   3189
   3190	/* Setup Default hctx */
   3191	map = &shost->tag_set.map[HCTX_TYPE_DEFAULT];
   3192	map->nr_queues = instance->msix_vectors - offset;
   3193	map->queue_offset = 0;
   3194	blk_mq_pci_map_queues(map, instance->pdev, offset);
   3195	qoff += map->nr_queues;
   3196	offset += map->nr_queues;
   3197
   3198	/* Setup Poll hctx */
   3199	map = &shost->tag_set.map[HCTX_TYPE_POLL];
   3200	map->nr_queues = instance->iopoll_q_count;
   3201	if (map->nr_queues) {
   3202		/*
   3203		 * The poll queue(s) doesn't have an IRQ (and hence IRQ
   3204		 * affinity), so use the regular blk-mq cpu mapping
   3205		 */
   3206		map->queue_offset = qoff;
   3207		blk_mq_map_queues(map);
   3208	}
   3209
   3210	return 0;
   3211}
   3212
   3213static void megasas_aen_polling(struct work_struct *work);
   3214
   3215/**
   3216 * megasas_service_aen -	Processes an event notification
   3217 * @instance:			Adapter soft state
   3218 * @cmd:			AEN command completed by the ISR
   3219 *
   3220 * For AEN, driver sends a command down to FW that is held by the FW till an
   3221 * event occurs. When an event of interest occurs, FW completes the command
   3222 * that it was previously holding.
   3223 *
   3224 * This routines sends SIGIO signal to processes that have registered with the
   3225 * driver for AEN.
   3226 */
   3227static void
   3228megasas_service_aen(struct megasas_instance *instance, struct megasas_cmd *cmd)
   3229{
   3230	unsigned long flags;
   3231
   3232	/*
   3233	 * Don't signal app if it is just an aborted previously registered aen
   3234	 */
   3235	if ((!cmd->abort_aen) && (instance->unload == 0)) {
   3236		spin_lock_irqsave(&poll_aen_lock, flags);
   3237		megasas_poll_wait_aen = 1;
   3238		spin_unlock_irqrestore(&poll_aen_lock, flags);
   3239		wake_up(&megasas_poll_wait);
   3240		kill_fasync(&megasas_async_queue, SIGIO, POLL_IN);
   3241	}
   3242	else
   3243		cmd->abort_aen = 0;
   3244
   3245	instance->aen_cmd = NULL;
   3246
   3247	megasas_return_cmd(instance, cmd);
   3248
   3249	if ((instance->unload == 0) &&
   3250		((instance->issuepend_done == 1))) {
   3251		struct megasas_aen_event *ev;
   3252
   3253		ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
   3254		if (!ev) {
   3255			dev_err(&instance->pdev->dev, "megasas_service_aen: out of memory\n");
   3256		} else {
   3257			ev->instance = instance;
   3258			instance->ev = ev;
   3259			INIT_DELAYED_WORK(&ev->hotplug_work,
   3260					  megasas_aen_polling);
   3261			schedule_delayed_work(&ev->hotplug_work, 0);
   3262		}
   3263	}
   3264}
   3265
   3266static ssize_t
   3267fw_crash_buffer_store(struct device *cdev,
   3268	struct device_attribute *attr, const char *buf, size_t count)
   3269{
   3270	struct Scsi_Host *shost = class_to_shost(cdev);
   3271	struct megasas_instance *instance =
   3272		(struct megasas_instance *) shost->hostdata;
   3273	int val = 0;
   3274	unsigned long flags;
   3275
   3276	if (kstrtoint(buf, 0, &val) != 0)
   3277		return -EINVAL;
   3278
   3279	spin_lock_irqsave(&instance->crashdump_lock, flags);
   3280	instance->fw_crash_buffer_offset = val;
   3281	spin_unlock_irqrestore(&instance->crashdump_lock, flags);
   3282	return strlen(buf);
   3283}
   3284
   3285static ssize_t
   3286fw_crash_buffer_show(struct device *cdev,
   3287	struct device_attribute *attr, char *buf)
   3288{
   3289	struct Scsi_Host *shost = class_to_shost(cdev);
   3290	struct megasas_instance *instance =
   3291		(struct megasas_instance *) shost->hostdata;
   3292	u32 size;
   3293	unsigned long dmachunk = CRASH_DMA_BUF_SIZE;
   3294	unsigned long chunk_left_bytes;
   3295	unsigned long src_addr;
   3296	unsigned long flags;
   3297	u32 buff_offset;
   3298
   3299	spin_lock_irqsave(&instance->crashdump_lock, flags);
   3300	buff_offset = instance->fw_crash_buffer_offset;
   3301	if (!instance->crash_dump_buf &&
   3302		!((instance->fw_crash_state == AVAILABLE) ||
   3303		(instance->fw_crash_state == COPYING))) {
   3304		dev_err(&instance->pdev->dev,
   3305			"Firmware crash dump is not available\n");
   3306		spin_unlock_irqrestore(&instance->crashdump_lock, flags);
   3307		return -EINVAL;
   3308	}
   3309
   3310	if (buff_offset > (instance->fw_crash_buffer_size * dmachunk)) {
   3311		dev_err(&instance->pdev->dev,
   3312			"Firmware crash dump offset is out of range\n");
   3313		spin_unlock_irqrestore(&instance->crashdump_lock, flags);
   3314		return 0;
   3315	}
   3316
   3317	size = (instance->fw_crash_buffer_size * dmachunk) - buff_offset;
   3318	chunk_left_bytes = dmachunk - (buff_offset % dmachunk);
   3319	size = (size > chunk_left_bytes) ? chunk_left_bytes : size;
   3320	size = (size >= PAGE_SIZE) ? (PAGE_SIZE - 1) : size;
   3321
   3322	src_addr = (unsigned long)instance->crash_buf[buff_offset / dmachunk] +
   3323		(buff_offset % dmachunk);
   3324	memcpy(buf, (void *)src_addr, size);
   3325	spin_unlock_irqrestore(&instance->crashdump_lock, flags);
   3326
   3327	return size;
   3328}
   3329
   3330static ssize_t
   3331fw_crash_buffer_size_show(struct device *cdev,
   3332	struct device_attribute *attr, char *buf)
   3333{
   3334	struct Scsi_Host *shost = class_to_shost(cdev);
   3335	struct megasas_instance *instance =
   3336		(struct megasas_instance *) shost->hostdata;
   3337
   3338	return snprintf(buf, PAGE_SIZE, "%ld\n", (unsigned long)
   3339		((instance->fw_crash_buffer_size) * 1024 * 1024)/PAGE_SIZE);
   3340}
   3341
   3342static ssize_t
   3343fw_crash_state_store(struct device *cdev,
   3344	struct device_attribute *attr, const char *buf, size_t count)
   3345{
   3346	struct Scsi_Host *shost = class_to_shost(cdev);
   3347	struct megasas_instance *instance =
   3348		(struct megasas_instance *) shost->hostdata;
   3349	int val = 0;
   3350	unsigned long flags;
   3351
   3352	if (kstrtoint(buf, 0, &val) != 0)
   3353		return -EINVAL;
   3354
   3355	if ((val <= AVAILABLE || val > COPY_ERROR)) {
   3356		dev_err(&instance->pdev->dev, "application updates invalid "
   3357			"firmware crash state\n");
   3358		return -EINVAL;
   3359	}
   3360
   3361	instance->fw_crash_state = val;
   3362
   3363	if ((val == COPIED) || (val == COPY_ERROR)) {
   3364		spin_lock_irqsave(&instance->crashdump_lock, flags);
   3365		megasas_free_host_crash_buffer(instance);
   3366		spin_unlock_irqrestore(&instance->crashdump_lock, flags);
   3367		if (val == COPY_ERROR)
   3368			dev_info(&instance->pdev->dev, "application failed to "
   3369				"copy Firmware crash dump\n");
   3370		else
   3371			dev_info(&instance->pdev->dev, "Firmware crash dump "
   3372				"copied successfully\n");
   3373	}
   3374	return strlen(buf);
   3375}
   3376
   3377static ssize_t
   3378fw_crash_state_show(struct device *cdev,
   3379	struct device_attribute *attr, char *buf)
   3380{
   3381	struct Scsi_Host *shost = class_to_shost(cdev);
   3382	struct megasas_instance *instance =
   3383		(struct megasas_instance *) shost->hostdata;
   3384
   3385	return snprintf(buf, PAGE_SIZE, "%d\n", instance->fw_crash_state);
   3386}
   3387
   3388static ssize_t
   3389page_size_show(struct device *cdev,
   3390	struct device_attribute *attr, char *buf)
   3391{
   3392	return snprintf(buf, PAGE_SIZE, "%ld\n", (unsigned long)PAGE_SIZE - 1);
   3393}
   3394
   3395static ssize_t
   3396ldio_outstanding_show(struct device *cdev, struct device_attribute *attr,
   3397	char *buf)
   3398{
   3399	struct Scsi_Host *shost = class_to_shost(cdev);
   3400	struct megasas_instance *instance = (struct megasas_instance *)shost->hostdata;
   3401
   3402	return snprintf(buf, PAGE_SIZE, "%d\n", atomic_read(&instance->ldio_outstanding));
   3403}
   3404
   3405static ssize_t
   3406fw_cmds_outstanding_show(struct device *cdev,
   3407				 struct device_attribute *attr, char *buf)
   3408{
   3409	struct Scsi_Host *shost = class_to_shost(cdev);
   3410	struct megasas_instance *instance = (struct megasas_instance *)shost->hostdata;
   3411
   3412	return snprintf(buf, PAGE_SIZE, "%d\n", atomic_read(&instance->fw_outstanding));
   3413}
   3414
   3415static ssize_t
   3416enable_sdev_max_qd_show(struct device *cdev,
   3417	struct device_attribute *attr, char *buf)
   3418{
   3419	struct Scsi_Host *shost = class_to_shost(cdev);
   3420	struct megasas_instance *instance = (struct megasas_instance *)shost->hostdata;
   3421
   3422	return snprintf(buf, PAGE_SIZE, "%d\n", instance->enable_sdev_max_qd);
   3423}
   3424
   3425static ssize_t
   3426enable_sdev_max_qd_store(struct device *cdev,
   3427	struct device_attribute *attr, const char *buf, size_t count)
   3428{
   3429	struct Scsi_Host *shost = class_to_shost(cdev);
   3430	struct megasas_instance *instance = (struct megasas_instance *)shost->hostdata;
   3431	u32 val = 0;
   3432	bool is_target_prop;
   3433	int ret_target_prop = DCMD_FAILED;
   3434	struct scsi_device *sdev;
   3435
   3436	if (kstrtou32(buf, 0, &val) != 0) {
   3437		pr_err("megasas: could not set enable_sdev_max_qd\n");
   3438		return -EINVAL;
   3439	}
   3440
   3441	mutex_lock(&instance->reset_mutex);
   3442	if (val)
   3443		instance->enable_sdev_max_qd = true;
   3444	else
   3445		instance->enable_sdev_max_qd = false;
   3446
   3447	shost_for_each_device(sdev, shost) {
   3448		ret_target_prop = megasas_get_target_prop(instance, sdev);
   3449		is_target_prop = (ret_target_prop == DCMD_SUCCESS) ? true : false;
   3450		megasas_set_fw_assisted_qd(sdev, is_target_prop);
   3451	}
   3452	mutex_unlock(&instance->reset_mutex);
   3453
   3454	return strlen(buf);
   3455}
   3456
   3457static ssize_t
   3458dump_system_regs_show(struct device *cdev,
   3459			       struct device_attribute *attr, char *buf)
   3460{
   3461	struct Scsi_Host *shost = class_to_shost(cdev);
   3462	struct megasas_instance *instance =
   3463			(struct megasas_instance *)shost->hostdata;
   3464
   3465	return megasas_dump_sys_regs(instance->reg_set, buf);
   3466}
   3467
   3468static ssize_t
   3469raid_map_id_show(struct device *cdev, struct device_attribute *attr,
   3470			  char *buf)
   3471{
   3472	struct Scsi_Host *shost = class_to_shost(cdev);
   3473	struct megasas_instance *instance =
   3474			(struct megasas_instance *)shost->hostdata;
   3475
   3476	return snprintf(buf, PAGE_SIZE, "%ld\n",
   3477			(unsigned long)instance->map_id);
   3478}
   3479
   3480static DEVICE_ATTR_RW(fw_crash_buffer);
   3481static DEVICE_ATTR_RO(fw_crash_buffer_size);
   3482static DEVICE_ATTR_RW(fw_crash_state);
   3483static DEVICE_ATTR_RO(page_size);
   3484static DEVICE_ATTR_RO(ldio_outstanding);
   3485static DEVICE_ATTR_RO(fw_cmds_outstanding);
   3486static DEVICE_ATTR_RW(enable_sdev_max_qd);
   3487static DEVICE_ATTR_RO(dump_system_regs);
   3488static DEVICE_ATTR_RO(raid_map_id);
   3489
   3490static struct attribute *megaraid_host_attrs[] = {
   3491	&dev_attr_fw_crash_buffer_size.attr,
   3492	&dev_attr_fw_crash_buffer.attr,
   3493	&dev_attr_fw_crash_state.attr,
   3494	&dev_attr_page_size.attr,
   3495	&dev_attr_ldio_outstanding.attr,
   3496	&dev_attr_fw_cmds_outstanding.attr,
   3497	&dev_attr_enable_sdev_max_qd.attr,
   3498	&dev_attr_dump_system_regs.attr,
   3499	&dev_attr_raid_map_id.attr,
   3500	NULL,
   3501};
   3502
   3503ATTRIBUTE_GROUPS(megaraid_host);
   3504
   3505/*
   3506 * Scsi host template for megaraid_sas driver
   3507 */
   3508static struct scsi_host_template megasas_template = {
   3509
   3510	.module = THIS_MODULE,
   3511	.name = "Avago SAS based MegaRAID driver",
   3512	.proc_name = "megaraid_sas",
   3513	.slave_configure = megasas_slave_configure,
   3514	.slave_alloc = megasas_slave_alloc,
   3515	.slave_destroy = megasas_slave_destroy,
   3516	.queuecommand = megasas_queue_command,
   3517	.eh_target_reset_handler = megasas_reset_target,
   3518	.eh_abort_handler = megasas_task_abort,
   3519	.eh_host_reset_handler = megasas_reset_bus_host,
   3520	.eh_timed_out = megasas_reset_timer,
   3521	.shost_groups = megaraid_host_groups,
   3522	.bios_param = megasas_bios_param,
   3523	.map_queues = megasas_map_queues,
   3524	.mq_poll = megasas_blk_mq_poll,
   3525	.change_queue_depth = scsi_change_queue_depth,
   3526	.max_segment_size = 0xffffffff,
   3527	.cmd_size = sizeof(struct megasas_cmd_priv),
   3528};
   3529
   3530/**
   3531 * megasas_complete_int_cmd -	Completes an internal command
   3532 * @instance:			Adapter soft state
   3533 * @cmd:			Command to be completed
   3534 *
   3535 * The megasas_issue_blocked_cmd() function waits for a command to complete
   3536 * after it issues a command. This function wakes up that waiting routine by
   3537 * calling wake_up() on the wait queue.
   3538 */
   3539static void
   3540megasas_complete_int_cmd(struct megasas_instance *instance,
   3541			 struct megasas_cmd *cmd)
   3542{
   3543	if (cmd->cmd_status_drv == DCMD_INIT)
   3544		cmd->cmd_status_drv =
   3545		(cmd->frame->io.cmd_status == MFI_STAT_OK) ?
   3546		DCMD_SUCCESS : DCMD_FAILED;
   3547
   3548	wake_up(&instance->int_cmd_wait_q);
   3549}
   3550
   3551/**
   3552 * megasas_complete_abort -	Completes aborting a command
   3553 * @instance:			Adapter soft state
   3554 * @cmd:			Cmd that was issued to abort another cmd
   3555 *
   3556 * The megasas_issue_blocked_abort_cmd() function waits on abort_cmd_wait_q
   3557 * after it issues an abort on a previously issued command. This function
   3558 * wakes up all functions waiting on the same wait queue.
   3559 */
   3560static void
   3561megasas_complete_abort(struct megasas_instance *instance,
   3562		       struct megasas_cmd *cmd)
   3563{
   3564	if (cmd->sync_cmd) {
   3565		cmd->sync_cmd = 0;
   3566		cmd->cmd_status_drv = DCMD_SUCCESS;
   3567		wake_up(&instance->abort_cmd_wait_q);
   3568	}
   3569}
   3570
   3571static void
   3572megasas_set_ld_removed_by_fw(struct megasas_instance *instance)
   3573{
   3574	uint i;
   3575
   3576	for (i = 0; (i < MEGASAS_MAX_LD_IDS); i++) {
   3577		if (instance->ld_ids_prev[i] != 0xff &&
   3578		    instance->ld_ids_from_raidmap[i] == 0xff) {
   3579			if (megasas_dbg_lvl & LD_PD_DEBUG)
   3580				dev_info(&instance->pdev->dev,
   3581					 "LD target ID %d removed from RAID map\n", i);
   3582			instance->ld_tgtid_status[i] = LD_TARGET_ID_DELETED;
   3583		}
   3584	}
   3585}
   3586
   3587/**
   3588 * megasas_complete_cmd -	Completes a command
   3589 * @instance:			Adapter soft state
   3590 * @cmd:			Command to be completed
   3591 * @alt_status:			If non-zero, use this value as status to
   3592 *				SCSI mid-layer instead of the value returned
   3593 *				by the FW. This should be used if caller wants
   3594 *				an alternate status (as in the case of aborted
   3595 *				commands)
   3596 */
   3597void
   3598megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,
   3599		     u8 alt_status)
   3600{
   3601	int exception = 0;
   3602	struct megasas_header *hdr = &cmd->frame->hdr;
   3603	unsigned long flags;
   3604	struct fusion_context *fusion = instance->ctrl_context;
   3605	u32 opcode, status;
   3606
   3607	/* flag for the retry reset */
   3608	cmd->retry_for_fw_reset = 0;
   3609
   3610	if (cmd->scmd)
   3611		megasas_priv(cmd->scmd)->cmd_priv = NULL;
   3612
   3613	switch (hdr->cmd) {
   3614	case MFI_CMD_INVALID:
   3615		/* Some older 1068 controller FW may keep a pended
   3616		   MR_DCMD_CTRL_EVENT_GET_INFO left over from the main kernel
   3617		   when booting the kdump kernel.  Ignore this command to
   3618		   prevent a kernel panic on shutdown of the kdump kernel. */
   3619		dev_warn(&instance->pdev->dev, "MFI_CMD_INVALID command "
   3620		       "completed\n");
   3621		dev_warn(&instance->pdev->dev, "If you have a controller "
   3622		       "other than PERC5, please upgrade your firmware\n");
   3623		break;
   3624	case MFI_CMD_PD_SCSI_IO:
   3625	case MFI_CMD_LD_SCSI_IO:
   3626
   3627		/*
   3628		 * MFI_CMD_PD_SCSI_IO and MFI_CMD_LD_SCSI_IO could have been
   3629		 * issued either through an IO path or an IOCTL path. If it
   3630		 * was via IOCTL, we will send it to internal completion.
   3631		 */
   3632		if (cmd->sync_cmd) {
   3633			cmd->sync_cmd = 0;
   3634			megasas_complete_int_cmd(instance, cmd);
   3635			break;
   3636		}
   3637		fallthrough;
   3638
   3639	case MFI_CMD_LD_READ:
   3640	case MFI_CMD_LD_WRITE:
   3641
   3642		if (alt_status) {
   3643			cmd->scmd->result = alt_status << 16;
   3644			exception = 1;
   3645		}
   3646
   3647		if (exception) {
   3648
   3649			atomic_dec(&instance->fw_outstanding);
   3650
   3651			scsi_dma_unmap(cmd->scmd);
   3652			scsi_done(cmd->scmd);
   3653			megasas_return_cmd(instance, cmd);
   3654
   3655			break;
   3656		}
   3657
   3658		switch (hdr->cmd_status) {
   3659
   3660		case MFI_STAT_OK:
   3661			cmd->scmd->result = DID_OK << 16;
   3662			break;
   3663
   3664		case MFI_STAT_SCSI_IO_FAILED:
   3665		case MFI_STAT_LD_INIT_IN_PROGRESS:
   3666			cmd->scmd->result =
   3667			    (DID_ERROR << 16) | hdr->scsi_status;
   3668			break;
   3669
   3670		case MFI_STAT_SCSI_DONE_WITH_ERROR:
   3671
   3672			cmd->scmd->result = (DID_OK << 16) | hdr->scsi_status;
   3673
   3674			if (hdr->scsi_status == SAM_STAT_CHECK_CONDITION) {
   3675				memset(cmd->scmd->sense_buffer, 0,
   3676				       SCSI_SENSE_BUFFERSIZE);
   3677				memcpy(cmd->scmd->sense_buffer, cmd->sense,
   3678				       hdr->sense_len);
   3679			}
   3680
   3681			break;
   3682
   3683		case MFI_STAT_LD_OFFLINE:
   3684		case MFI_STAT_DEVICE_NOT_FOUND:
   3685			cmd->scmd->result = DID_BAD_TARGET << 16;
   3686			break;
   3687
   3688		default:
   3689			dev_printk(KERN_DEBUG, &instance->pdev->dev, "MFI FW status %#x\n",
   3690			       hdr->cmd_status);
   3691			cmd->scmd->result = DID_ERROR << 16;
   3692			break;
   3693		}
   3694
   3695		atomic_dec(&instance->fw_outstanding);
   3696
   3697		scsi_dma_unmap(cmd->scmd);
   3698		scsi_done(cmd->scmd);
   3699		megasas_return_cmd(instance, cmd);
   3700
   3701		break;
   3702
   3703	case MFI_CMD_SMP:
   3704	case MFI_CMD_STP:
   3705	case MFI_CMD_NVME:
   3706	case MFI_CMD_TOOLBOX:
   3707		megasas_complete_int_cmd(instance, cmd);
   3708		break;
   3709
   3710	case MFI_CMD_DCMD:
   3711		opcode = le32_to_cpu(cmd->frame->dcmd.opcode);
   3712		/* Check for LD map update */
   3713		if ((opcode == MR_DCMD_LD_MAP_GET_INFO)
   3714			&& (cmd->frame->dcmd.mbox.b[1] == 1)) {
   3715			fusion->fast_path_io = 0;
   3716			spin_lock_irqsave(instance->host->host_lock, flags);
   3717			status = cmd->frame->hdr.cmd_status;
   3718			instance->map_update_cmd = NULL;
   3719			if (status != MFI_STAT_OK) {
   3720				if (status != MFI_STAT_NOT_FOUND)
   3721					dev_warn(&instance->pdev->dev, "map syncfailed, status = 0x%x\n",
   3722					       cmd->frame->hdr.cmd_status);
   3723				else {
   3724					megasas_return_cmd(instance, cmd);
   3725					spin_unlock_irqrestore(
   3726						instance->host->host_lock,
   3727						flags);
   3728					break;
   3729				}
   3730			}
   3731
   3732			megasas_return_cmd(instance, cmd);
   3733
   3734			/*
   3735			 * Set fast path IO to ZERO.
   3736			 * Validate Map will set proper value.
   3737			 * Meanwhile all IOs will go as LD IO.
   3738			 */
   3739			if (status == MFI_STAT_OK &&
   3740			    (MR_ValidateMapInfo(instance, (instance->map_id + 1)))) {
   3741				instance->map_id++;
   3742				fusion->fast_path_io = 1;
   3743			} else {
   3744				fusion->fast_path_io = 0;
   3745			}
   3746
   3747			if (instance->adapter_type >= INVADER_SERIES)
   3748				megasas_set_ld_removed_by_fw(instance);
   3749
   3750			megasas_sync_map_info(instance);
   3751			spin_unlock_irqrestore(instance->host->host_lock,
   3752					       flags);
   3753
   3754			break;
   3755		}
   3756		if (opcode == MR_DCMD_CTRL_EVENT_GET_INFO ||
   3757		    opcode == MR_DCMD_CTRL_EVENT_GET) {
   3758			spin_lock_irqsave(&poll_aen_lock, flags);
   3759			megasas_poll_wait_aen = 0;
   3760			spin_unlock_irqrestore(&poll_aen_lock, flags);
   3761		}
   3762
   3763		/* FW has an updated PD sequence */
   3764		if ((opcode == MR_DCMD_SYSTEM_PD_MAP_GET_INFO) &&
   3765			(cmd->frame->dcmd.mbox.b[0] == 1)) {
   3766
   3767			spin_lock_irqsave(instance->host->host_lock, flags);
   3768			status = cmd->frame->hdr.cmd_status;
   3769			instance->jbod_seq_cmd = NULL;
   3770			megasas_return_cmd(instance, cmd);
   3771
   3772			if (status == MFI_STAT_OK) {
   3773				instance->pd_seq_map_id++;
   3774				/* Re-register a pd sync seq num cmd */
   3775				if (megasas_sync_pd_seq_num(instance, true))
   3776					instance->use_seqnum_jbod_fp = false;
   3777			} else
   3778				instance->use_seqnum_jbod_fp = false;
   3779
   3780			spin_unlock_irqrestore(instance->host->host_lock, flags);
   3781			break;
   3782		}
   3783
   3784		/*
   3785		 * See if got an event notification
   3786		 */
   3787		if (opcode == MR_DCMD_CTRL_EVENT_WAIT)
   3788			megasas_service_aen(instance, cmd);
   3789		else
   3790			megasas_complete_int_cmd(instance, cmd);
   3791
   3792		break;
   3793
   3794	case MFI_CMD_ABORT:
   3795		/*
   3796		 * Cmd issued to abort another cmd returned
   3797		 */
   3798		megasas_complete_abort(instance, cmd);
   3799		break;
   3800
   3801	default:
   3802		dev_info(&instance->pdev->dev, "Unknown command completed! [0x%X]\n",
   3803		       hdr->cmd);
   3804		megasas_complete_int_cmd(instance, cmd);
   3805		break;
   3806	}
   3807}
   3808
   3809/**
   3810 * megasas_issue_pending_cmds_again -	issue all pending cmds
   3811 *					in FW again because of the fw reset
   3812 * @instance:				Adapter soft state
   3813 */
   3814static inline void
   3815megasas_issue_pending_cmds_again(struct megasas_instance *instance)
   3816{
   3817	struct megasas_cmd *cmd;
   3818	struct list_head clist_local;
   3819	union megasas_evt_class_locale class_locale;
   3820	unsigned long flags;
   3821	u32 seq_num;
   3822
   3823	INIT_LIST_HEAD(&clist_local);
   3824	spin_lock_irqsave(&instance->hba_lock, flags);
   3825	list_splice_init(&instance->internal_reset_pending_q, &clist_local);
   3826	spin_unlock_irqrestore(&instance->hba_lock, flags);
   3827
   3828	while (!list_empty(&clist_local)) {
   3829		cmd = list_entry((&clist_local)->next,
   3830					struct megasas_cmd, list);
   3831		list_del_init(&cmd->list);
   3832
   3833		if (cmd->sync_cmd || cmd->scmd) {
   3834			dev_notice(&instance->pdev->dev, "command %p, %p:%d"
   3835				"detected to be pending while HBA reset\n",
   3836					cmd, cmd->scmd, cmd->sync_cmd);
   3837
   3838			cmd->retry_for_fw_reset++;
   3839
   3840			if (cmd->retry_for_fw_reset == 3) {
   3841				dev_notice(&instance->pdev->dev, "cmd %p, %p:%d"
   3842					"was tried multiple times during reset."
   3843					"Shutting down the HBA\n",
   3844					cmd, cmd->scmd, cmd->sync_cmd);
   3845				instance->instancet->disable_intr(instance);
   3846				atomic_set(&instance->fw_reset_no_pci_access, 1);
   3847				megaraid_sas_kill_hba(instance);
   3848				return;
   3849			}
   3850		}
   3851
   3852		if (cmd->sync_cmd == 1) {
   3853			if (cmd->scmd) {
   3854				dev_notice(&instance->pdev->dev, "unexpected"
   3855					"cmd attached to internal command!\n");
   3856			}
   3857			dev_notice(&instance->pdev->dev, "%p synchronous cmd"
   3858						"on the internal reset queue,"
   3859						"issue it again.\n", cmd);
   3860			cmd->cmd_status_drv = DCMD_INIT;
   3861			instance->instancet->fire_cmd(instance,
   3862							cmd->frame_phys_addr,
   3863							0, instance->reg_set);
   3864		} else if (cmd->scmd) {
   3865			dev_notice(&instance->pdev->dev, "%p scsi cmd [%02x]"
   3866			"detected on the internal queue, issue again.\n",
   3867			cmd, cmd->scmd->cmnd[0]);
   3868
   3869			atomic_inc(&instance->fw_outstanding);
   3870			instance->instancet->fire_cmd(instance,
   3871					cmd->frame_phys_addr,
   3872					cmd->frame_count-1, instance->reg_set);
   3873		} else {
   3874			dev_notice(&instance->pdev->dev, "%p unexpected cmd on the"
   3875				"internal reset defer list while re-issue!!\n",
   3876				cmd);
   3877		}
   3878	}
   3879
   3880	if (instance->aen_cmd) {
   3881		dev_notice(&instance->pdev->dev, "aen_cmd in def process\n");
   3882		megasas_return_cmd(instance, instance->aen_cmd);
   3883
   3884		instance->aen_cmd = NULL;
   3885	}
   3886
   3887	/*
   3888	 * Initiate AEN (Asynchronous Event Notification)
   3889	 */
   3890	seq_num = instance->last_seq_num;
   3891	class_locale.members.reserved = 0;
   3892	class_locale.members.locale = MR_EVT_LOCALE_ALL;
   3893	class_locale.members.class = MR_EVT_CLASS_DEBUG;
   3894
   3895	megasas_register_aen(instance, seq_num, class_locale.word);
   3896}
   3897
   3898/*
   3899 * Move the internal reset pending commands to a deferred queue.
   3900 *
   3901 * We move the commands pending at internal reset time to a
   3902 * pending queue. This queue would be flushed after successful
   3903 * completion of the internal reset sequence. if the internal reset
   3904 * did not complete in time, the kernel reset handler would flush
   3905 * these commands.
   3906 */
   3907static void
   3908megasas_internal_reset_defer_cmds(struct megasas_instance *instance)
   3909{
   3910	struct megasas_cmd *cmd;
   3911	int i;
   3912	u16 max_cmd = instance->max_fw_cmds;
   3913	u32 defer_index;
   3914	unsigned long flags;
   3915
   3916	defer_index = 0;
   3917	spin_lock_irqsave(&instance->mfi_pool_lock, flags);
   3918	for (i = 0; i < max_cmd; i++) {
   3919		cmd = instance->cmd_list[i];
   3920		if (cmd->sync_cmd == 1 || cmd->scmd) {
   3921			dev_notice(&instance->pdev->dev, "moving cmd[%d]:%p:%d:%p"
   3922					"on the defer queue as internal\n",
   3923				defer_index, cmd, cmd->sync_cmd, cmd->scmd);
   3924
   3925			if (!list_empty(&cmd->list)) {
   3926				dev_notice(&instance->pdev->dev, "ERROR while"
   3927					" moving this cmd:%p, %d %p, it was"
   3928					"discovered on some list?\n",
   3929					cmd, cmd->sync_cmd, cmd->scmd);
   3930
   3931				list_del_init(&cmd->list);
   3932			}
   3933			defer_index++;
   3934			list_add_tail(&cmd->list,
   3935				&instance->internal_reset_pending_q);
   3936		}
   3937	}
   3938	spin_unlock_irqrestore(&instance->mfi_pool_lock, flags);
   3939}
   3940
   3941
   3942static void
   3943process_fw_state_change_wq(struct work_struct *work)
   3944{
   3945	struct megasas_instance *instance =
   3946		container_of(work, struct megasas_instance, work_init);
   3947	u32 wait;
   3948	unsigned long flags;
   3949
   3950    if (atomic_read(&instance->adprecovery) != MEGASAS_ADPRESET_SM_INFAULT) {
   3951		dev_notice(&instance->pdev->dev, "error, recovery st %x\n",
   3952				atomic_read(&instance->adprecovery));
   3953		return ;
   3954	}
   3955
   3956	if (atomic_read(&instance->adprecovery) == MEGASAS_ADPRESET_SM_INFAULT) {
   3957		dev_notice(&instance->pdev->dev, "FW detected to be in fault"
   3958					"state, restarting it...\n");
   3959
   3960		instance->instancet->disable_intr(instance);
   3961		atomic_set(&instance->fw_outstanding, 0);
   3962
   3963		atomic_set(&instance->fw_reset_no_pci_access, 1);
   3964		instance->instancet->adp_reset(instance, instance->reg_set);
   3965		atomic_set(&instance->fw_reset_no_pci_access, 0);
   3966
   3967		dev_notice(&instance->pdev->dev, "FW restarted successfully,"
   3968					"initiating next stage...\n");
   3969
   3970		dev_notice(&instance->pdev->dev, "HBA recovery state machine,"
   3971					"state 2 starting...\n");
   3972
   3973		/* waiting for about 20 second before start the second init */
   3974		for (wait = 0; wait < 30; wait++) {
   3975			msleep(1000);
   3976		}
   3977
   3978		if (megasas_transition_to_ready(instance, 1)) {
   3979			dev_notice(&instance->pdev->dev, "adapter not ready\n");
   3980
   3981			atomic_set(&instance->fw_reset_no_pci_access, 1);
   3982			megaraid_sas_kill_hba(instance);
   3983			return ;
   3984		}
   3985
   3986		if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS1064R) ||
   3987			(instance->pdev->device == PCI_DEVICE_ID_DELL_PERC5) ||
   3988			(instance->pdev->device == PCI_DEVICE_ID_LSI_VERDE_ZCR)
   3989			) {
   3990			*instance->consumer = *instance->producer;
   3991		} else {
   3992			*instance->consumer = 0;
   3993			*instance->producer = 0;
   3994		}
   3995
   3996		megasas_issue_init_mfi(instance);
   3997
   3998		spin_lock_irqsave(&instance->hba_lock, flags);
   3999		atomic_set(&instance->adprecovery, MEGASAS_HBA_OPERATIONAL);
   4000		spin_unlock_irqrestore(&instance->hba_lock, flags);
   4001		instance->instancet->enable_intr(instance);
   4002
   4003		megasas_issue_pending_cmds_again(instance);
   4004		instance->issuepend_done = 1;
   4005	}
   4006}
   4007
   4008/**
   4009 * megasas_deplete_reply_queue -	Processes all completed commands
   4010 * @instance:				Adapter soft state
   4011 * @alt_status:				Alternate status to be returned to
   4012 *					SCSI mid-layer instead of the status
   4013 *					returned by the FW
   4014 * Note: this must be called with hba lock held
   4015 */
   4016static int
   4017megasas_deplete_reply_queue(struct megasas_instance *instance,
   4018					u8 alt_status)
   4019{
   4020	u32 mfiStatus;
   4021	u32 fw_state;
   4022
   4023	if ((mfiStatus = instance->instancet->check_reset(instance,
   4024					instance->reg_set)) == 1) {
   4025		return IRQ_HANDLED;
   4026	}
   4027
   4028	mfiStatus = instance->instancet->clear_intr(instance);
   4029	if (mfiStatus == 0) {
   4030		/* Hardware may not set outbound_intr_status in MSI-X mode */
   4031		if (!instance->msix_vectors)
   4032			return IRQ_NONE;
   4033	}
   4034
   4035	instance->mfiStatus = mfiStatus;
   4036
   4037	if ((mfiStatus & MFI_INTR_FLAG_FIRMWARE_STATE_CHANGE)) {
   4038		fw_state = instance->instancet->read_fw_status_reg(
   4039				instance) & MFI_STATE_MASK;
   4040
   4041		if (fw_state != MFI_STATE_FAULT) {
   4042			dev_notice(&instance->pdev->dev, "fw state:%x\n",
   4043						fw_state);
   4044		}
   4045
   4046		if ((fw_state == MFI_STATE_FAULT) &&
   4047				(instance->disableOnlineCtrlReset == 0)) {
   4048			dev_notice(&instance->pdev->dev, "wait adp restart\n");
   4049
   4050			if ((instance->pdev->device ==
   4051					PCI_DEVICE_ID_LSI_SAS1064R) ||
   4052				(instance->pdev->device ==
   4053					PCI_DEVICE_ID_DELL_PERC5) ||
   4054				(instance->pdev->device ==
   4055					PCI_DEVICE_ID_LSI_VERDE_ZCR)) {
   4056
   4057				*instance->consumer =
   4058					cpu_to_le32(MEGASAS_ADPRESET_INPROG_SIGN);
   4059			}
   4060
   4061
   4062			instance->instancet->disable_intr(instance);
   4063			atomic_set(&instance->adprecovery, MEGASAS_ADPRESET_SM_INFAULT);
   4064			instance->issuepend_done = 0;
   4065
   4066			atomic_set(&instance->fw_outstanding, 0);
   4067			megasas_internal_reset_defer_cmds(instance);
   4068
   4069			dev_notice(&instance->pdev->dev, "fwState=%x, stage:%d\n",
   4070					fw_state, atomic_read(&instance->adprecovery));
   4071
   4072			schedule_work(&instance->work_init);
   4073			return IRQ_HANDLED;
   4074
   4075		} else {
   4076			dev_notice(&instance->pdev->dev, "fwstate:%x, dis_OCR=%x\n",
   4077				fw_state, instance->disableOnlineCtrlReset);
   4078		}
   4079	}
   4080
   4081	tasklet_schedule(&instance->isr_tasklet);
   4082	return IRQ_HANDLED;
   4083}
   4084
   4085/**
   4086 * megasas_isr - isr entry point
   4087 * @irq:	IRQ number
   4088 * @devp:	IRQ context address
   4089 */
   4090static irqreturn_t megasas_isr(int irq, void *devp)
   4091{
   4092	struct megasas_irq_context *irq_context = devp;
   4093	struct megasas_instance *instance = irq_context->instance;
   4094	unsigned long flags;
   4095	irqreturn_t rc;
   4096
   4097	if (atomic_read(&instance->fw_reset_no_pci_access))
   4098		return IRQ_HANDLED;
   4099
   4100	spin_lock_irqsave(&instance->hba_lock, flags);
   4101	rc = megasas_deplete_reply_queue(instance, DID_OK);
   4102	spin_unlock_irqrestore(&instance->hba_lock, flags);
   4103
   4104	return rc;
   4105}
   4106
   4107/**
   4108 * megasas_transition_to_ready -	Move the FW to READY state
   4109 * @instance:				Adapter soft state
   4110 * @ocr:				Adapter reset state
   4111 *
   4112 * During the initialization, FW passes can potentially be in any one of
   4113 * several possible states. If the FW in operational, waiting-for-handshake
   4114 * states, driver must take steps to bring it to ready state. Otherwise, it
   4115 * has to wait for the ready state.
   4116 */
   4117int
   4118megasas_transition_to_ready(struct megasas_instance *instance, int ocr)
   4119{
   4120	int i;
   4121	u8 max_wait;
   4122	u32 fw_state;
   4123	u32 abs_state, curr_abs_state;
   4124
   4125	abs_state = instance->instancet->read_fw_status_reg(instance);
   4126	fw_state = abs_state & MFI_STATE_MASK;
   4127
   4128	if (fw_state != MFI_STATE_READY)
   4129		dev_info(&instance->pdev->dev, "Waiting for FW to come to ready"
   4130		       " state\n");
   4131
   4132	while (fw_state != MFI_STATE_READY) {
   4133
   4134		switch (fw_state) {
   4135
   4136		case MFI_STATE_FAULT:
   4137			dev_printk(KERN_ERR, &instance->pdev->dev,
   4138				   "FW in FAULT state, Fault code:0x%x subcode:0x%x func:%s\n",
   4139				   abs_state & MFI_STATE_FAULT_CODE,
   4140				   abs_state & MFI_STATE_FAULT_SUBCODE, __func__);
   4141			if (ocr) {
   4142				max_wait = MEGASAS_RESET_WAIT_TIME;
   4143				break;
   4144			} else {
   4145				dev_printk(KERN_DEBUG, &instance->pdev->dev, "System Register set:\n");
   4146				megasas_dump_reg_set(instance->reg_set);
   4147				return -ENODEV;
   4148			}
   4149
   4150		case MFI_STATE_WAIT_HANDSHAKE:
   4151			/*
   4152			 * Set the CLR bit in inbound doorbell
   4153			 */
   4154			if ((instance->pdev->device ==
   4155				PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
   4156				(instance->pdev->device ==
   4157				 PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
   4158				(instance->adapter_type != MFI_SERIES))
   4159				writel(
   4160				  MFI_INIT_CLEAR_HANDSHAKE|MFI_INIT_HOTPLUG,
   4161				  &instance->reg_set->doorbell);
   4162			else
   4163				writel(
   4164				    MFI_INIT_CLEAR_HANDSHAKE|MFI_INIT_HOTPLUG,
   4165					&instance->reg_set->inbound_doorbell);
   4166
   4167			max_wait = MEGASAS_RESET_WAIT_TIME;
   4168			break;
   4169
   4170		case MFI_STATE_BOOT_MESSAGE_PENDING:
   4171			if ((instance->pdev->device ==
   4172			     PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
   4173				(instance->pdev->device ==
   4174				 PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
   4175				(instance->adapter_type != MFI_SERIES))
   4176				writel(MFI_INIT_HOTPLUG,
   4177				       &instance->reg_set->doorbell);
   4178			else
   4179				writel(MFI_INIT_HOTPLUG,
   4180					&instance->reg_set->inbound_doorbell);
   4181
   4182			max_wait = MEGASAS_RESET_WAIT_TIME;
   4183			break;
   4184
   4185		case MFI_STATE_OPERATIONAL:
   4186			/*
   4187			 * Bring it to READY state; assuming max wait 10 secs
   4188			 */
   4189			instance->instancet->disable_intr(instance);
   4190			if ((instance->pdev->device ==
   4191				PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
   4192				(instance->pdev->device ==
   4193				PCI_DEVICE_ID_LSI_SAS0071SKINNY)  ||
   4194				(instance->adapter_type != MFI_SERIES)) {
   4195				writel(MFI_RESET_FLAGS,
   4196					&instance->reg_set->doorbell);
   4197
   4198				if (instance->adapter_type != MFI_SERIES) {
   4199					for (i = 0; i < (10 * 1000); i += 20) {
   4200						if (megasas_readl(
   4201							    instance,
   4202							    &instance->
   4203							    reg_set->
   4204							    doorbell) & 1)
   4205							msleep(20);
   4206						else
   4207							break;
   4208					}
   4209				}
   4210			} else
   4211				writel(MFI_RESET_FLAGS,
   4212					&instance->reg_set->inbound_doorbell);
   4213
   4214			max_wait = MEGASAS_RESET_WAIT_TIME;
   4215			break;
   4216
   4217		case MFI_STATE_UNDEFINED:
   4218			/*
   4219			 * This state should not last for more than 2 seconds
   4220			 */
   4221			max_wait = MEGASAS_RESET_WAIT_TIME;
   4222			break;
   4223
   4224		case MFI_STATE_BB_INIT:
   4225			max_wait = MEGASAS_RESET_WAIT_TIME;
   4226			break;
   4227
   4228		case MFI_STATE_FW_INIT:
   4229			max_wait = MEGASAS_RESET_WAIT_TIME;
   4230			break;
   4231
   4232		case MFI_STATE_FW_INIT_2:
   4233			max_wait = MEGASAS_RESET_WAIT_TIME;
   4234			break;
   4235
   4236		case MFI_STATE_DEVICE_SCAN:
   4237			max_wait = MEGASAS_RESET_WAIT_TIME;
   4238			break;
   4239
   4240		case MFI_STATE_FLUSH_CACHE:
   4241			max_wait = MEGASAS_RESET_WAIT_TIME;
   4242			break;
   4243
   4244		default:
   4245			dev_printk(KERN_DEBUG, &instance->pdev->dev, "Unknown state 0x%x\n",
   4246			       fw_state);
   4247			dev_printk(KERN_DEBUG, &instance->pdev->dev, "System Register set:\n");
   4248			megasas_dump_reg_set(instance->reg_set);
   4249			return -ENODEV;
   4250		}
   4251
   4252		/*
   4253		 * The cur_state should not last for more than max_wait secs
   4254		 */
   4255		for (i = 0; i < max_wait * 50; i++) {
   4256			curr_abs_state = instance->instancet->
   4257				read_fw_status_reg(instance);
   4258
   4259			if (abs_state == curr_abs_state) {
   4260				msleep(20);
   4261			} else
   4262				break;
   4263		}
   4264
   4265		/*
   4266		 * Return error if fw_state hasn't changed after max_wait
   4267		 */
   4268		if (curr_abs_state == abs_state) {
   4269			dev_printk(KERN_DEBUG, &instance->pdev->dev, "FW state [%d] hasn't changed "
   4270			       "in %d secs\n", fw_state, max_wait);
   4271			dev_printk(KERN_DEBUG, &instance->pdev->dev, "System Register set:\n");
   4272			megasas_dump_reg_set(instance->reg_set);
   4273			return -ENODEV;
   4274		}
   4275
   4276		abs_state = curr_abs_state;
   4277		fw_state = curr_abs_state & MFI_STATE_MASK;
   4278	}
   4279	dev_info(&instance->pdev->dev, "FW now in Ready state\n");
   4280
   4281	return 0;
   4282}
   4283
   4284/**
   4285 * megasas_teardown_frame_pool -	Destroy the cmd frame DMA pool
   4286 * @instance:				Adapter soft state
   4287 */
   4288static void megasas_teardown_frame_pool(struct megasas_instance *instance)
   4289{
   4290	int i;
   4291	u16 max_cmd = instance->max_mfi_cmds;
   4292	struct megasas_cmd *cmd;
   4293
   4294	if (!instance->frame_dma_pool)
   4295		return;
   4296
   4297	/*
   4298	 * Return all frames to pool
   4299	 */
   4300	for (i = 0; i < max_cmd; i++) {
   4301
   4302		cmd = instance->cmd_list[i];
   4303
   4304		if (cmd->frame)
   4305			dma_pool_free(instance->frame_dma_pool, cmd->frame,
   4306				      cmd->frame_phys_addr);
   4307
   4308		if (cmd->sense)
   4309			dma_pool_free(instance->sense_dma_pool, cmd->sense,
   4310				      cmd->sense_phys_addr);
   4311	}
   4312
   4313	/*
   4314	 * Now destroy the pool itself
   4315	 */
   4316	dma_pool_destroy(instance->frame_dma_pool);
   4317	dma_pool_destroy(instance->sense_dma_pool);
   4318
   4319	instance->frame_dma_pool = NULL;
   4320	instance->sense_dma_pool = NULL;
   4321}
   4322
   4323/**
   4324 * megasas_create_frame_pool -	Creates DMA pool for cmd frames
   4325 * @instance:			Adapter soft state
   4326 *
   4327 * Each command packet has an embedded DMA memory buffer that is used for
   4328 * filling MFI frame and the SG list that immediately follows the frame. This
   4329 * function creates those DMA memory buffers for each command packet by using
   4330 * PCI pool facility.
   4331 */
   4332static int megasas_create_frame_pool(struct megasas_instance *instance)
   4333{
   4334	int i;
   4335	u16 max_cmd;
   4336	u32 frame_count;
   4337	struct megasas_cmd *cmd;
   4338
   4339	max_cmd = instance->max_mfi_cmds;
   4340
   4341	/*
   4342	 * For MFI controllers.
   4343	 * max_num_sge = 60
   4344	 * max_sge_sz  = 16 byte (sizeof megasas_sge_skinny)
   4345	 * Total 960 byte (15 MFI frame of 64 byte)
   4346	 *
   4347	 * Fusion adapter require only 3 extra frame.
   4348	 * max_num_sge = 16 (defined as MAX_IOCTL_SGE)
   4349	 * max_sge_sz  = 12 byte (sizeof  megasas_sge64)
   4350	 * Total 192 byte (3 MFI frame of 64 byte)
   4351	 */
   4352	frame_count = (instance->adapter_type == MFI_SERIES) ?
   4353			(15 + 1) : (3 + 1);
   4354	instance->mfi_frame_size = MEGAMFI_FRAME_SIZE * frame_count;
   4355	/*
   4356	 * Use DMA pool facility provided by PCI layer
   4357	 */
   4358	instance->frame_dma_pool = dma_pool_create("megasas frame pool",
   4359					&instance->pdev->dev,
   4360					instance->mfi_frame_size, 256, 0);
   4361
   4362	if (!instance->frame_dma_pool) {
   4363		dev_printk(KERN_DEBUG, &instance->pdev->dev, "failed to setup frame pool\n");
   4364		return -ENOMEM;
   4365	}
   4366
   4367	instance->sense_dma_pool = dma_pool_create("megasas sense pool",
   4368						   &instance->pdev->dev, 128,
   4369						   4, 0);
   4370
   4371	if (!instance->sense_dma_pool) {
   4372		dev_printk(KERN_DEBUG, &instance->pdev->dev, "failed to setup sense pool\n");
   4373
   4374		dma_pool_destroy(instance->frame_dma_pool);
   4375		instance->frame_dma_pool = NULL;
   4376
   4377		return -ENOMEM;
   4378	}
   4379
   4380	/*
   4381	 * Allocate and attach a frame to each of the commands in cmd_list.
   4382	 * By making cmd->index as the context instead of the &cmd, we can
   4383	 * always use 32bit context regardless of the architecture
   4384	 */
   4385	for (i = 0; i < max_cmd; i++) {
   4386
   4387		cmd = instance->cmd_list[i];
   4388
   4389		cmd->frame = dma_pool_zalloc(instance->frame_dma_pool,
   4390					    GFP_KERNEL, &cmd->frame_phys_addr);
   4391
   4392		cmd->sense = dma_pool_alloc(instance->sense_dma_pool,
   4393					    GFP_KERNEL, &cmd->sense_phys_addr);
   4394
   4395		/*
   4396		 * megasas_teardown_frame_pool() takes care of freeing
   4397		 * whatever has been allocated
   4398		 */
   4399		if (!cmd->frame || !cmd->sense) {
   4400			dev_printk(KERN_DEBUG, &instance->pdev->dev, "dma_pool_alloc failed\n");
   4401			megasas_teardown_frame_pool(instance);
   4402			return -ENOMEM;
   4403		}
   4404
   4405		cmd->frame->io.context = cpu_to_le32(cmd->index);
   4406		cmd->frame->io.pad_0 = 0;
   4407		if ((instance->adapter_type == MFI_SERIES) && reset_devices)
   4408			cmd->frame->hdr.cmd = MFI_CMD_INVALID;
   4409	}
   4410
   4411	return 0;
   4412}
   4413
   4414/**
   4415 * megasas_free_cmds -	Free all the cmds in the free cmd pool
   4416 * @instance:		Adapter soft state
   4417 */
   4418void megasas_free_cmds(struct megasas_instance *instance)
   4419{
   4420	int i;
   4421
   4422	/* First free the MFI frame pool */
   4423	megasas_teardown_frame_pool(instance);
   4424
   4425	/* Free all the commands in the cmd_list */
   4426	for (i = 0; i < instance->max_mfi_cmds; i++)
   4427
   4428		kfree(instance->cmd_list[i]);
   4429
   4430	/* Free the cmd_list buffer itself */
   4431	kfree(instance->cmd_list);
   4432	instance->cmd_list = NULL;
   4433
   4434	INIT_LIST_HEAD(&instance->cmd_pool);
   4435}
   4436
   4437/**
   4438 * megasas_alloc_cmds -	Allocates the command packets
   4439 * @instance:		Adapter soft state
   4440 *
   4441 * Each command that is issued to the FW, whether IO commands from the OS or
   4442 * internal commands like IOCTLs, are wrapped in local data structure called
   4443 * megasas_cmd. The frame embedded in this megasas_cmd is actually issued to
   4444 * the FW.
   4445 *
   4446 * Each frame has a 32-bit field called context (tag). This context is used
   4447 * to get back the megasas_cmd from the frame when a frame gets completed in
   4448 * the ISR. Typically the address of the megasas_cmd itself would be used as
   4449 * the context. But we wanted to keep the differences between 32 and 64 bit
   4450 * systems to the mininum. We always use 32 bit integers for the context. In
   4451 * this driver, the 32 bit values are the indices into an array cmd_list.
   4452 * This array is used only to look up the megasas_cmd given the context. The
   4453 * free commands themselves are maintained in a linked list called cmd_pool.
   4454 */
   4455int megasas_alloc_cmds(struct megasas_instance *instance)
   4456{
   4457	int i;
   4458	int j;
   4459	u16 max_cmd;
   4460	struct megasas_cmd *cmd;
   4461
   4462	max_cmd = instance->max_mfi_cmds;
   4463
   4464	/*
   4465	 * instance->cmd_list is an array of struct megasas_cmd pointers.
   4466	 * Allocate the dynamic array first and then allocate individual
   4467	 * commands.
   4468	 */
   4469	instance->cmd_list = kcalloc(max_cmd, sizeof(struct megasas_cmd*), GFP_KERNEL);
   4470
   4471	if (!instance->cmd_list) {
   4472		dev_printk(KERN_DEBUG, &instance->pdev->dev, "out of memory\n");
   4473		return -ENOMEM;
   4474	}
   4475
   4476	for (i = 0; i < max_cmd; i++) {
   4477		instance->cmd_list[i] = kmalloc(sizeof(struct megasas_cmd),
   4478						GFP_KERNEL);
   4479
   4480		if (!instance->cmd_list[i]) {
   4481
   4482			for (j = 0; j < i; j++)
   4483				kfree(instance->cmd_list[j]);
   4484
   4485			kfree(instance->cmd_list);
   4486			instance->cmd_list = NULL;
   4487
   4488			return -ENOMEM;
   4489		}
   4490	}
   4491
   4492	for (i = 0; i < max_cmd; i++) {
   4493		cmd = instance->cmd_list[i];
   4494		memset(cmd, 0, sizeof(struct megasas_cmd));
   4495		cmd->index = i;
   4496		cmd->scmd = NULL;
   4497		cmd->instance = instance;
   4498
   4499		list_add_tail(&cmd->list, &instance->cmd_pool);
   4500	}
   4501
   4502	/*
   4503	 * Create a frame pool and assign one frame to each cmd
   4504	 */
   4505	if (megasas_create_frame_pool(instance)) {
   4506		dev_printk(KERN_DEBUG, &instance->pdev->dev, "Error creating frame DMA pool\n");
   4507		megasas_free_cmds(instance);
   4508		return -ENOMEM;
   4509	}
   4510
   4511	return 0;
   4512}
   4513
   4514/*
   4515 * dcmd_timeout_ocr_possible -	Check if OCR is possible based on Driver/FW state.
   4516 * @instance:				Adapter soft state
   4517 *
   4518 * Return 0 for only Fusion adapter, if driver load/unload is not in progress
   4519 * or FW is not under OCR.
   4520 */
   4521inline int
   4522dcmd_timeout_ocr_possible(struct megasas_instance *instance) {
   4523
   4524	if (instance->adapter_type == MFI_SERIES)
   4525		return KILL_ADAPTER;
   4526	else if (instance->unload ||
   4527			test_bit(MEGASAS_FUSION_OCR_NOT_POSSIBLE,
   4528				 &instance->reset_flags))
   4529		return IGNORE_TIMEOUT;
   4530	else
   4531		return INITIATE_OCR;
   4532}
   4533
   4534static void
   4535megasas_get_pd_info(struct megasas_instance *instance, struct scsi_device *sdev)
   4536{
   4537	int ret;
   4538	struct megasas_cmd *cmd;
   4539	struct megasas_dcmd_frame *dcmd;
   4540
   4541	struct MR_PRIV_DEVICE *mr_device_priv_data;
   4542	u16 device_id = 0;
   4543
   4544	device_id = (sdev->channel * MEGASAS_MAX_DEV_PER_CHANNEL) + sdev->id;
   4545	cmd = megasas_get_cmd(instance);
   4546
   4547	if (!cmd) {
   4548		dev_err(&instance->pdev->dev, "Failed to get cmd %s\n", __func__);
   4549		return;
   4550	}
   4551
   4552	dcmd = &cmd->frame->dcmd;
   4553
   4554	memset(instance->pd_info, 0, sizeof(*instance->pd_info));
   4555	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
   4556
   4557	dcmd->mbox.s[0] = cpu_to_le16(device_id);
   4558	dcmd->cmd = MFI_CMD_DCMD;
   4559	dcmd->cmd_status = 0xFF;
   4560	dcmd->sge_count = 1;
   4561	dcmd->flags = MFI_FRAME_DIR_READ;
   4562	dcmd->timeout = 0;
   4563	dcmd->pad_0 = 0;
   4564	dcmd->data_xfer_len = cpu_to_le32(sizeof(struct MR_PD_INFO));
   4565	dcmd->opcode = cpu_to_le32(MR_DCMD_PD_GET_INFO);
   4566
   4567	megasas_set_dma_settings(instance, dcmd, instance->pd_info_h,
   4568				 sizeof(struct MR_PD_INFO));
   4569
   4570	if ((instance->adapter_type != MFI_SERIES) &&
   4571	    !instance->mask_interrupts)
   4572		ret = megasas_issue_blocked_cmd(instance, cmd, MFI_IO_TIMEOUT_SECS);
   4573	else
   4574		ret = megasas_issue_polled(instance, cmd);
   4575
   4576	switch (ret) {
   4577	case DCMD_SUCCESS:
   4578		mr_device_priv_data = sdev->hostdata;
   4579		le16_to_cpus((u16 *)&instance->pd_info->state.ddf.pdType);
   4580		mr_device_priv_data->interface_type =
   4581				instance->pd_info->state.ddf.pdType.intf;
   4582		break;
   4583
   4584	case DCMD_TIMEOUT:
   4585
   4586		switch (dcmd_timeout_ocr_possible(instance)) {
   4587		case INITIATE_OCR:
   4588			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
   4589			mutex_unlock(&instance->reset_mutex);
   4590			megasas_reset_fusion(instance->host,
   4591				MFI_IO_TIMEOUT_OCR);
   4592			mutex_lock(&instance->reset_mutex);
   4593			break;
   4594		case KILL_ADAPTER:
   4595			megaraid_sas_kill_hba(instance);
   4596			break;
   4597		case IGNORE_TIMEOUT:
   4598			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
   4599				__func__, __LINE__);
   4600			break;
   4601		}
   4602
   4603		break;
   4604	}
   4605
   4606	if (ret != DCMD_TIMEOUT)
   4607		megasas_return_cmd(instance, cmd);
   4608
   4609	return;
   4610}
   4611/*
   4612 * megasas_get_pd_list_info -	Returns FW's pd_list structure
   4613 * @instance:				Adapter soft state
   4614 * @pd_list:				pd_list structure
   4615 *
   4616 * Issues an internal command (DCMD) to get the FW's controller PD
   4617 * list structure.  This information is mainly used to find out SYSTEM
   4618 * supported by the FW.
   4619 */
   4620static int
   4621megasas_get_pd_list(struct megasas_instance *instance)
   4622{
   4623	int ret = 0, pd_index = 0;
   4624	struct megasas_cmd *cmd;
   4625	struct megasas_dcmd_frame *dcmd;
   4626	struct MR_PD_LIST *ci;
   4627	struct MR_PD_ADDRESS *pd_addr;
   4628
   4629	if (instance->pd_list_not_supported) {
   4630		dev_info(&instance->pdev->dev, "MR_DCMD_PD_LIST_QUERY "
   4631		"not supported by firmware\n");
   4632		return ret;
   4633	}
   4634
   4635	ci = instance->pd_list_buf;
   4636
   4637	cmd = megasas_get_cmd(instance);
   4638
   4639	if (!cmd) {
   4640		dev_printk(KERN_DEBUG, &instance->pdev->dev, "(get_pd_list): Failed to get cmd\n");
   4641		return -ENOMEM;
   4642	}
   4643
   4644	dcmd = &cmd->frame->dcmd;
   4645
   4646	memset(ci, 0, sizeof(*ci));
   4647	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
   4648
   4649	dcmd->mbox.b[0] = MR_PD_QUERY_TYPE_EXPOSED_TO_HOST;
   4650	dcmd->mbox.b[1] = 0;
   4651	dcmd->cmd = MFI_CMD_DCMD;
   4652	dcmd->cmd_status = MFI_STAT_INVALID_STATUS;
   4653	dcmd->sge_count = 1;
   4654	dcmd->flags = MFI_FRAME_DIR_READ;
   4655	dcmd->timeout = 0;
   4656	dcmd->pad_0 = 0;
   4657	dcmd->data_xfer_len = cpu_to_le32(MEGASAS_MAX_PD * sizeof(struct MR_PD_LIST));
   4658	dcmd->opcode = cpu_to_le32(MR_DCMD_PD_LIST_QUERY);
   4659
   4660	megasas_set_dma_settings(instance, dcmd, instance->pd_list_buf_h,
   4661				 (MEGASAS_MAX_PD * sizeof(struct MR_PD_LIST)));
   4662
   4663	if ((instance->adapter_type != MFI_SERIES) &&
   4664	    !instance->mask_interrupts)
   4665		ret = megasas_issue_blocked_cmd(instance, cmd,
   4666			MFI_IO_TIMEOUT_SECS);
   4667	else
   4668		ret = megasas_issue_polled(instance, cmd);
   4669
   4670	switch (ret) {
   4671	case DCMD_FAILED:
   4672		dev_info(&instance->pdev->dev, "MR_DCMD_PD_LIST_QUERY "
   4673			"failed/not supported by firmware\n");
   4674
   4675		if (instance->adapter_type != MFI_SERIES)
   4676			megaraid_sas_kill_hba(instance);
   4677		else
   4678			instance->pd_list_not_supported = 1;
   4679		break;
   4680	case DCMD_TIMEOUT:
   4681
   4682		switch (dcmd_timeout_ocr_possible(instance)) {
   4683		case INITIATE_OCR:
   4684			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
   4685			/*
   4686			 * DCMD failed from AEN path.
   4687			 * AEN path already hold reset_mutex to avoid PCI access
   4688			 * while OCR is in progress.
   4689			 */
   4690			mutex_unlock(&instance->reset_mutex);
   4691			megasas_reset_fusion(instance->host,
   4692						MFI_IO_TIMEOUT_OCR);
   4693			mutex_lock(&instance->reset_mutex);
   4694			break;
   4695		case KILL_ADAPTER:
   4696			megaraid_sas_kill_hba(instance);
   4697			break;
   4698		case IGNORE_TIMEOUT:
   4699			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d \n",
   4700				__func__, __LINE__);
   4701			break;
   4702		}
   4703
   4704		break;
   4705
   4706	case DCMD_SUCCESS:
   4707		pd_addr = ci->addr;
   4708		if (megasas_dbg_lvl & LD_PD_DEBUG)
   4709			dev_info(&instance->pdev->dev, "%s, sysPD count: 0x%x\n",
   4710				 __func__, le32_to_cpu(ci->count));
   4711
   4712		if ((le32_to_cpu(ci->count) >
   4713			(MEGASAS_MAX_PD_CHANNELS * MEGASAS_MAX_DEV_PER_CHANNEL)))
   4714			break;
   4715
   4716		memset(instance->local_pd_list, 0,
   4717				MEGASAS_MAX_PD * sizeof(struct megasas_pd_list));
   4718
   4719		for (pd_index = 0; pd_index < le32_to_cpu(ci->count); pd_index++) {
   4720			instance->local_pd_list[le16_to_cpu(pd_addr->deviceId)].tid	=
   4721					le16_to_cpu(pd_addr->deviceId);
   4722			instance->local_pd_list[le16_to_cpu(pd_addr->deviceId)].driveType	=
   4723					pd_addr->scsiDevType;
   4724			instance->local_pd_list[le16_to_cpu(pd_addr->deviceId)].driveState	=
   4725					MR_PD_STATE_SYSTEM;
   4726			if (megasas_dbg_lvl & LD_PD_DEBUG)
   4727				dev_info(&instance->pdev->dev,
   4728					 "PD%d: targetID: 0x%03x deviceType:0x%x\n",
   4729					 pd_index, le16_to_cpu(pd_addr->deviceId),
   4730					 pd_addr->scsiDevType);
   4731			pd_addr++;
   4732		}
   4733
   4734		memcpy(instance->pd_list, instance->local_pd_list,
   4735			sizeof(instance->pd_list));
   4736		break;
   4737
   4738	}
   4739
   4740	if (ret != DCMD_TIMEOUT)
   4741		megasas_return_cmd(instance, cmd);
   4742
   4743	return ret;
   4744}
   4745
   4746/*
   4747 * megasas_get_ld_list_info -	Returns FW's ld_list structure
   4748 * @instance:				Adapter soft state
   4749 * @ld_list:				ld_list structure
   4750 *
   4751 * Issues an internal command (DCMD) to get the FW's controller PD
   4752 * list structure.  This information is mainly used to find out SYSTEM
   4753 * supported by the FW.
   4754 */
   4755static int
   4756megasas_get_ld_list(struct megasas_instance *instance)
   4757{
   4758	int ret = 0, ld_index = 0, ids = 0;
   4759	struct megasas_cmd *cmd;
   4760	struct megasas_dcmd_frame *dcmd;
   4761	struct MR_LD_LIST *ci;
   4762	dma_addr_t ci_h = 0;
   4763	u32 ld_count;
   4764
   4765	ci = instance->ld_list_buf;
   4766	ci_h = instance->ld_list_buf_h;
   4767
   4768	cmd = megasas_get_cmd(instance);
   4769
   4770	if (!cmd) {
   4771		dev_printk(KERN_DEBUG, &instance->pdev->dev, "megasas_get_ld_list: Failed to get cmd\n");
   4772		return -ENOMEM;
   4773	}
   4774
   4775	dcmd = &cmd->frame->dcmd;
   4776
   4777	memset(ci, 0, sizeof(*ci));
   4778	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
   4779
   4780	if (instance->supportmax256vd)
   4781		dcmd->mbox.b[0] = 1;
   4782	dcmd->cmd = MFI_CMD_DCMD;
   4783	dcmd->cmd_status = MFI_STAT_INVALID_STATUS;
   4784	dcmd->sge_count = 1;
   4785	dcmd->flags = MFI_FRAME_DIR_READ;
   4786	dcmd->timeout = 0;
   4787	dcmd->data_xfer_len = cpu_to_le32(sizeof(struct MR_LD_LIST));
   4788	dcmd->opcode = cpu_to_le32(MR_DCMD_LD_GET_LIST);
   4789	dcmd->pad_0  = 0;
   4790
   4791	megasas_set_dma_settings(instance, dcmd, ci_h,
   4792				 sizeof(struct MR_LD_LIST));
   4793
   4794	if ((instance->adapter_type != MFI_SERIES) &&
   4795	    !instance->mask_interrupts)
   4796		ret = megasas_issue_blocked_cmd(instance, cmd,
   4797			MFI_IO_TIMEOUT_SECS);
   4798	else
   4799		ret = megasas_issue_polled(instance, cmd);
   4800
   4801	ld_count = le32_to_cpu(ci->ldCount);
   4802
   4803	switch (ret) {
   4804	case DCMD_FAILED:
   4805		megaraid_sas_kill_hba(instance);
   4806		break;
   4807	case DCMD_TIMEOUT:
   4808
   4809		switch (dcmd_timeout_ocr_possible(instance)) {
   4810		case INITIATE_OCR:
   4811			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
   4812			/*
   4813			 * DCMD failed from AEN path.
   4814			 * AEN path already hold reset_mutex to avoid PCI access
   4815			 * while OCR is in progress.
   4816			 */
   4817			mutex_unlock(&instance->reset_mutex);
   4818			megasas_reset_fusion(instance->host,
   4819						MFI_IO_TIMEOUT_OCR);
   4820			mutex_lock(&instance->reset_mutex);
   4821			break;
   4822		case KILL_ADAPTER:
   4823			megaraid_sas_kill_hba(instance);
   4824			break;
   4825		case IGNORE_TIMEOUT:
   4826			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
   4827				__func__, __LINE__);
   4828			break;
   4829		}
   4830
   4831		break;
   4832
   4833	case DCMD_SUCCESS:
   4834		if (megasas_dbg_lvl & LD_PD_DEBUG)
   4835			dev_info(&instance->pdev->dev, "%s, LD count: 0x%x\n",
   4836				 __func__, ld_count);
   4837
   4838		if (ld_count > instance->fw_supported_vd_count)
   4839			break;
   4840
   4841		memset(instance->ld_ids, 0xff, MAX_LOGICAL_DRIVES_EXT);
   4842
   4843		for (ld_index = 0; ld_index < ld_count; ld_index++) {
   4844			if (ci->ldList[ld_index].state != 0) {
   4845				ids = ci->ldList[ld_index].ref.targetId;
   4846				instance->ld_ids[ids] = ci->ldList[ld_index].ref.targetId;
   4847				if (megasas_dbg_lvl & LD_PD_DEBUG)
   4848					dev_info(&instance->pdev->dev,
   4849						 "LD%d: targetID: 0x%03x\n",
   4850						 ld_index, ids);
   4851			}
   4852		}
   4853
   4854		break;
   4855	}
   4856
   4857	if (ret != DCMD_TIMEOUT)
   4858		megasas_return_cmd(instance, cmd);
   4859
   4860	return ret;
   4861}
   4862
   4863/**
   4864 * megasas_ld_list_query -	Returns FW's ld_list structure
   4865 * @instance:				Adapter soft state
   4866 * @query_type:				ld_list structure type
   4867 *
   4868 * Issues an internal command (DCMD) to get the FW's controller PD
   4869 * list structure.  This information is mainly used to find out SYSTEM
   4870 * supported by the FW.
   4871 */
   4872static int
   4873megasas_ld_list_query(struct megasas_instance *instance, u8 query_type)
   4874{
   4875	int ret = 0, ld_index = 0, ids = 0;
   4876	struct megasas_cmd *cmd;
   4877	struct megasas_dcmd_frame *dcmd;
   4878	struct MR_LD_TARGETID_LIST *ci;
   4879	dma_addr_t ci_h = 0;
   4880	u32 tgtid_count;
   4881
   4882	ci = instance->ld_targetid_list_buf;
   4883	ci_h = instance->ld_targetid_list_buf_h;
   4884
   4885	cmd = megasas_get_cmd(instance);
   4886
   4887	if (!cmd) {
   4888		dev_warn(&instance->pdev->dev,
   4889		         "megasas_ld_list_query: Failed to get cmd\n");
   4890		return -ENOMEM;
   4891	}
   4892
   4893	dcmd = &cmd->frame->dcmd;
   4894
   4895	memset(ci, 0, sizeof(*ci));
   4896	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
   4897
   4898	dcmd->mbox.b[0] = query_type;
   4899	if (instance->supportmax256vd)
   4900		dcmd->mbox.b[2] = 1;
   4901
   4902	dcmd->cmd = MFI_CMD_DCMD;
   4903	dcmd->cmd_status = MFI_STAT_INVALID_STATUS;
   4904	dcmd->sge_count = 1;
   4905	dcmd->flags = MFI_FRAME_DIR_READ;
   4906	dcmd->timeout = 0;
   4907	dcmd->data_xfer_len = cpu_to_le32(sizeof(struct MR_LD_TARGETID_LIST));
   4908	dcmd->opcode = cpu_to_le32(MR_DCMD_LD_LIST_QUERY);
   4909	dcmd->pad_0  = 0;
   4910
   4911	megasas_set_dma_settings(instance, dcmd, ci_h,
   4912				 sizeof(struct MR_LD_TARGETID_LIST));
   4913
   4914	if ((instance->adapter_type != MFI_SERIES) &&
   4915	    !instance->mask_interrupts)
   4916		ret = megasas_issue_blocked_cmd(instance, cmd, MFI_IO_TIMEOUT_SECS);
   4917	else
   4918		ret = megasas_issue_polled(instance, cmd);
   4919
   4920	switch (ret) {
   4921	case DCMD_FAILED:
   4922		dev_info(&instance->pdev->dev,
   4923			"DCMD not supported by firmware - %s %d\n",
   4924				__func__, __LINE__);
   4925		ret = megasas_get_ld_list(instance);
   4926		break;
   4927	case DCMD_TIMEOUT:
   4928		switch (dcmd_timeout_ocr_possible(instance)) {
   4929		case INITIATE_OCR:
   4930			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
   4931			/*
   4932			 * DCMD failed from AEN path.
   4933			 * AEN path already hold reset_mutex to avoid PCI access
   4934			 * while OCR is in progress.
   4935			 */
   4936			mutex_unlock(&instance->reset_mutex);
   4937			megasas_reset_fusion(instance->host,
   4938						MFI_IO_TIMEOUT_OCR);
   4939			mutex_lock(&instance->reset_mutex);
   4940			break;
   4941		case KILL_ADAPTER:
   4942			megaraid_sas_kill_hba(instance);
   4943			break;
   4944		case IGNORE_TIMEOUT:
   4945			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
   4946				__func__, __LINE__);
   4947			break;
   4948		}
   4949
   4950		break;
   4951	case DCMD_SUCCESS:
   4952		tgtid_count = le32_to_cpu(ci->count);
   4953
   4954		if (megasas_dbg_lvl & LD_PD_DEBUG)
   4955			dev_info(&instance->pdev->dev, "%s, LD count: 0x%x\n",
   4956				 __func__, tgtid_count);
   4957
   4958		if ((tgtid_count > (instance->fw_supported_vd_count)))
   4959			break;
   4960
   4961		memset(instance->ld_ids, 0xff, MEGASAS_MAX_LD_IDS);
   4962		for (ld_index = 0; ld_index < tgtid_count; ld_index++) {
   4963			ids = ci->targetId[ld_index];
   4964			instance->ld_ids[ids] = ci->targetId[ld_index];
   4965			if (megasas_dbg_lvl & LD_PD_DEBUG)
   4966				dev_info(&instance->pdev->dev, "LD%d: targetID: 0x%03x\n",
   4967					 ld_index, ci->targetId[ld_index]);
   4968		}
   4969
   4970		break;
   4971	}
   4972
   4973	if (ret != DCMD_TIMEOUT)
   4974		megasas_return_cmd(instance, cmd);
   4975
   4976	return ret;
   4977}
   4978
   4979/**
   4980 * megasas_host_device_list_query
   4981 * dcmd.opcode            - MR_DCMD_CTRL_DEVICE_LIST_GET
   4982 * dcmd.mbox              - reserved
   4983 * dcmd.sge IN            - ptr to return MR_HOST_DEVICE_LIST structure
   4984 * Desc:    This DCMD will return the combined device list
   4985 * Status:  MFI_STAT_OK - List returned successfully
   4986 *          MFI_STAT_INVALID_CMD - Firmware support for the feature has been
   4987 *                                 disabled
   4988 * @instance:			Adapter soft state
   4989 * @is_probe:			Driver probe check
   4990 * Return:			0 if DCMD succeeded
   4991 *				 non-zero if failed
   4992 */
   4993static int
   4994megasas_host_device_list_query(struct megasas_instance *instance,
   4995			       bool is_probe)
   4996{
   4997	int ret, i, target_id;
   4998	struct megasas_cmd *cmd;
   4999	struct megasas_dcmd_frame *dcmd;
   5000	struct MR_HOST_DEVICE_LIST *ci;
   5001	u32 count;
   5002	dma_addr_t ci_h;
   5003
   5004	ci = instance->host_device_list_buf;
   5005	ci_h = instance->host_device_list_buf_h;
   5006
   5007	cmd = megasas_get_cmd(instance);
   5008
   5009	if (!cmd) {
   5010		dev_warn(&instance->pdev->dev,
   5011			 "%s: failed to get cmd\n",
   5012			 __func__);
   5013		return -ENOMEM;
   5014	}
   5015
   5016	dcmd = &cmd->frame->dcmd;
   5017
   5018	memset(ci, 0, sizeof(*ci));
   5019	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
   5020
   5021	dcmd->mbox.b[0] = is_probe ? 0 : 1;
   5022	dcmd->cmd = MFI_CMD_DCMD;
   5023	dcmd->cmd_status = MFI_STAT_INVALID_STATUS;
   5024	dcmd->sge_count = 1;
   5025	dcmd->flags = MFI_FRAME_DIR_READ;
   5026	dcmd->timeout = 0;
   5027	dcmd->pad_0 = 0;
   5028	dcmd->data_xfer_len = cpu_to_le32(HOST_DEVICE_LIST_SZ);
   5029	dcmd->opcode = cpu_to_le32(MR_DCMD_CTRL_DEVICE_LIST_GET);
   5030
   5031	megasas_set_dma_settings(instance, dcmd, ci_h, HOST_DEVICE_LIST_SZ);
   5032
   5033	if (!instance->mask_interrupts) {
   5034		ret = megasas_issue_blocked_cmd(instance, cmd,
   5035						MFI_IO_TIMEOUT_SECS);
   5036	} else {
   5037		ret = megasas_issue_polled(instance, cmd);
   5038		cmd->flags |= DRV_DCMD_SKIP_REFIRE;
   5039	}
   5040
   5041	switch (ret) {
   5042	case DCMD_SUCCESS:
   5043		/* Fill the internal pd_list and ld_ids array based on
   5044		 * targetIds returned by FW
   5045		 */
   5046		count = le32_to_cpu(ci->count);
   5047
   5048		if (count > (MEGASAS_MAX_PD + MAX_LOGICAL_DRIVES_EXT))
   5049			break;
   5050
   5051		if (megasas_dbg_lvl & LD_PD_DEBUG)
   5052			dev_info(&instance->pdev->dev, "%s, Device count: 0x%x\n",
   5053				 __func__, count);
   5054
   5055		memset(instance->local_pd_list, 0,
   5056		       MEGASAS_MAX_PD * sizeof(struct megasas_pd_list));
   5057		memset(instance->ld_ids, 0xff, MAX_LOGICAL_DRIVES_EXT);
   5058		for (i = 0; i < count; i++) {
   5059			target_id = le16_to_cpu(ci->host_device_list[i].target_id);
   5060			if (ci->host_device_list[i].flags.u.bits.is_sys_pd) {
   5061				instance->local_pd_list[target_id].tid = target_id;
   5062				instance->local_pd_list[target_id].driveType =
   5063						ci->host_device_list[i].scsi_type;
   5064				instance->local_pd_list[target_id].driveState =
   5065						MR_PD_STATE_SYSTEM;
   5066				if (megasas_dbg_lvl & LD_PD_DEBUG)
   5067					dev_info(&instance->pdev->dev,
   5068						 "Device %d: PD targetID: 0x%03x deviceType:0x%x\n",
   5069						 i, target_id, ci->host_device_list[i].scsi_type);
   5070			} else {
   5071				instance->ld_ids[target_id] = target_id;
   5072				if (megasas_dbg_lvl & LD_PD_DEBUG)
   5073					dev_info(&instance->pdev->dev,
   5074						 "Device %d: LD targetID: 0x%03x\n",
   5075						 i, target_id);
   5076			}
   5077		}
   5078
   5079		memcpy(instance->pd_list, instance->local_pd_list,
   5080		       sizeof(instance->pd_list));
   5081		break;
   5082
   5083	case DCMD_TIMEOUT:
   5084		switch (dcmd_timeout_ocr_possible(instance)) {
   5085		case INITIATE_OCR:
   5086			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
   5087			mutex_unlock(&instance->reset_mutex);
   5088			megasas_reset_fusion(instance->host,
   5089				MFI_IO_TIMEOUT_OCR);
   5090			mutex_lock(&instance->reset_mutex);
   5091			break;
   5092		case KILL_ADAPTER:
   5093			megaraid_sas_kill_hba(instance);
   5094			break;
   5095		case IGNORE_TIMEOUT:
   5096			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
   5097				 __func__, __LINE__);
   5098			break;
   5099		}
   5100		break;
   5101	case DCMD_FAILED:
   5102		dev_err(&instance->pdev->dev,
   5103			"%s: MR_DCMD_CTRL_DEVICE_LIST_GET failed\n",
   5104			__func__);
   5105		break;
   5106	}
   5107
   5108	if (ret != DCMD_TIMEOUT)
   5109		megasas_return_cmd(instance, cmd);
   5110
   5111	return ret;
   5112}
   5113
   5114/*
   5115 * megasas_update_ext_vd_details : Update details w.r.t Extended VD
   5116 * instance			 : Controller's instance
   5117*/
   5118static void megasas_update_ext_vd_details(struct megasas_instance *instance)
   5119{
   5120	struct fusion_context *fusion;
   5121	u32 ventura_map_sz = 0;
   5122
   5123	fusion = instance->ctrl_context;
   5124	/* For MFI based controllers return dummy success */
   5125	if (!fusion)
   5126		return;
   5127
   5128	instance->supportmax256vd =
   5129		instance->ctrl_info_buf->adapterOperations3.supportMaxExtLDs;
   5130	/* Below is additional check to address future FW enhancement */
   5131	if (instance->ctrl_info_buf->max_lds > 64)
   5132		instance->supportmax256vd = 1;
   5133
   5134	instance->drv_supported_vd_count = MEGASAS_MAX_LD_CHANNELS
   5135					* MEGASAS_MAX_DEV_PER_CHANNEL;
   5136	instance->drv_supported_pd_count = MEGASAS_MAX_PD_CHANNELS
   5137					* MEGASAS_MAX_DEV_PER_CHANNEL;
   5138	if (instance->supportmax256vd) {
   5139		instance->fw_supported_vd_count = MAX_LOGICAL_DRIVES_EXT;
   5140		instance->fw_supported_pd_count = MAX_PHYSICAL_DEVICES;
   5141	} else {
   5142		instance->fw_supported_vd_count = MAX_LOGICAL_DRIVES;
   5143		instance->fw_supported_pd_count = MAX_PHYSICAL_DEVICES;
   5144	}
   5145
   5146	dev_info(&instance->pdev->dev,
   5147		"FW provided supportMaxExtLDs: %d\tmax_lds: %d\n",
   5148		instance->ctrl_info_buf->adapterOperations3.supportMaxExtLDs ? 1 : 0,
   5149		instance->ctrl_info_buf->max_lds);
   5150
   5151	if (instance->max_raid_mapsize) {
   5152		ventura_map_sz = instance->max_raid_mapsize *
   5153						MR_MIN_MAP_SIZE; /* 64k */
   5154		fusion->current_map_sz = ventura_map_sz;
   5155		fusion->max_map_sz = ventura_map_sz;
   5156	} else {
   5157		fusion->old_map_sz =  sizeof(struct MR_FW_RAID_MAP) +
   5158					(sizeof(struct MR_LD_SPAN_MAP) *
   5159					(instance->fw_supported_vd_count - 1));
   5160		fusion->new_map_sz =  sizeof(struct MR_FW_RAID_MAP_EXT);
   5161
   5162		fusion->max_map_sz =
   5163			max(fusion->old_map_sz, fusion->new_map_sz);
   5164
   5165		if (instance->supportmax256vd)
   5166			fusion->current_map_sz = fusion->new_map_sz;
   5167		else
   5168			fusion->current_map_sz = fusion->old_map_sz;
   5169	}
   5170	/* irrespective of FW raid maps, driver raid map is constant */
   5171	fusion->drv_map_sz = sizeof(struct MR_DRV_RAID_MAP_ALL);
   5172}
   5173
   5174/*
   5175 * dcmd.opcode                - MR_DCMD_CTRL_SNAPDUMP_GET_PROPERTIES
   5176 * dcmd.hdr.length            - number of bytes to read
   5177 * dcmd.sge                   - Ptr to MR_SNAPDUMP_PROPERTIES
   5178 * Desc:			 Fill in snapdump properties
   5179 * Status:			 MFI_STAT_OK- Command successful
   5180 */
   5181void megasas_get_snapdump_properties(struct megasas_instance *instance)
   5182{
   5183	int ret = 0;
   5184	struct megasas_cmd *cmd;
   5185	struct megasas_dcmd_frame *dcmd;
   5186	struct MR_SNAPDUMP_PROPERTIES *ci;
   5187	dma_addr_t ci_h = 0;
   5188
   5189	ci = instance->snapdump_prop;
   5190	ci_h = instance->snapdump_prop_h;
   5191
   5192	if (!ci)
   5193		return;
   5194
   5195	cmd = megasas_get_cmd(instance);
   5196
   5197	if (!cmd) {
   5198		dev_dbg(&instance->pdev->dev, "Failed to get a free cmd\n");
   5199		return;
   5200	}
   5201
   5202	dcmd = &cmd->frame->dcmd;
   5203
   5204	memset(ci, 0, sizeof(*ci));
   5205	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
   5206
   5207	dcmd->cmd = MFI_CMD_DCMD;
   5208	dcmd->cmd_status = MFI_STAT_INVALID_STATUS;
   5209	dcmd->sge_count = 1;
   5210	dcmd->flags = MFI_FRAME_DIR_READ;
   5211	dcmd->timeout = 0;
   5212	dcmd->pad_0 = 0;
   5213	dcmd->data_xfer_len = cpu_to_le32(sizeof(struct MR_SNAPDUMP_PROPERTIES));
   5214	dcmd->opcode = cpu_to_le32(MR_DCMD_CTRL_SNAPDUMP_GET_PROPERTIES);
   5215
   5216	megasas_set_dma_settings(instance, dcmd, ci_h,
   5217				 sizeof(struct MR_SNAPDUMP_PROPERTIES));
   5218
   5219	if (!instance->mask_interrupts) {
   5220		ret = megasas_issue_blocked_cmd(instance, cmd,
   5221						MFI_IO_TIMEOUT_SECS);
   5222	} else {
   5223		ret = megasas_issue_polled(instance, cmd);
   5224		cmd->flags |= DRV_DCMD_SKIP_REFIRE;
   5225	}
   5226
   5227	switch (ret) {
   5228	case DCMD_SUCCESS:
   5229		instance->snapdump_wait_time =
   5230			min_t(u8, ci->trigger_min_num_sec_before_ocr,
   5231				MEGASAS_MAX_SNAP_DUMP_WAIT_TIME);
   5232		break;
   5233
   5234	case DCMD_TIMEOUT:
   5235		switch (dcmd_timeout_ocr_possible(instance)) {
   5236		case INITIATE_OCR:
   5237			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
   5238			mutex_unlock(&instance->reset_mutex);
   5239			megasas_reset_fusion(instance->host,
   5240				MFI_IO_TIMEOUT_OCR);
   5241			mutex_lock(&instance->reset_mutex);
   5242			break;
   5243		case KILL_ADAPTER:
   5244			megaraid_sas_kill_hba(instance);
   5245			break;
   5246		case IGNORE_TIMEOUT:
   5247			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
   5248				__func__, __LINE__);
   5249			break;
   5250		}
   5251	}
   5252
   5253	if (ret != DCMD_TIMEOUT)
   5254		megasas_return_cmd(instance, cmd);
   5255}
   5256
   5257/**
   5258 * megasas_get_ctrl_info -	Returns FW's controller structure
   5259 * @instance:				Adapter soft state
   5260 *
   5261 * Issues an internal command (DCMD) to get the FW's controller structure.
   5262 * This information is mainly used to find out the maximum IO transfer per
   5263 * command supported by the FW.
   5264 */
   5265int
   5266megasas_get_ctrl_info(struct megasas_instance *instance)
   5267{
   5268	int ret = 0;
   5269	struct megasas_cmd *cmd;
   5270	struct megasas_dcmd_frame *dcmd;
   5271	struct megasas_ctrl_info *ci;
   5272	dma_addr_t ci_h = 0;
   5273
   5274	ci = instance->ctrl_info_buf;
   5275	ci_h = instance->ctrl_info_buf_h;
   5276
   5277	cmd = megasas_get_cmd(instance);
   5278
   5279	if (!cmd) {
   5280		dev_printk(KERN_DEBUG, &instance->pdev->dev, "Failed to get a free cmd\n");
   5281		return -ENOMEM;
   5282	}
   5283
   5284	dcmd = &cmd->frame->dcmd;
   5285
   5286	memset(ci, 0, sizeof(*ci));
   5287	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
   5288
   5289	dcmd->cmd = MFI_CMD_DCMD;
   5290	dcmd->cmd_status = MFI_STAT_INVALID_STATUS;
   5291	dcmd->sge_count = 1;
   5292	dcmd->flags = MFI_FRAME_DIR_READ;
   5293	dcmd->timeout = 0;
   5294	dcmd->pad_0 = 0;
   5295	dcmd->data_xfer_len = cpu_to_le32(sizeof(struct megasas_ctrl_info));
   5296	dcmd->opcode = cpu_to_le32(MR_DCMD_CTRL_GET_INFO);
   5297	dcmd->mbox.b[0] = 1;
   5298
   5299	megasas_set_dma_settings(instance, dcmd, ci_h,
   5300				 sizeof(struct megasas_ctrl_info));
   5301
   5302	if ((instance->adapter_type != MFI_SERIES) &&
   5303	    !instance->mask_interrupts) {
   5304		ret = megasas_issue_blocked_cmd(instance, cmd, MFI_IO_TIMEOUT_SECS);
   5305	} else {
   5306		ret = megasas_issue_polled(instance, cmd);
   5307		cmd->flags |= DRV_DCMD_SKIP_REFIRE;
   5308	}
   5309
   5310	switch (ret) {
   5311	case DCMD_SUCCESS:
   5312		/* Save required controller information in
   5313		 * CPU endianness format.
   5314		 */
   5315		le32_to_cpus((u32 *)&ci->properties.OnOffProperties);
   5316		le16_to_cpus((u16 *)&ci->properties.on_off_properties2);
   5317		le32_to_cpus((u32 *)&ci->adapterOperations2);
   5318		le32_to_cpus((u32 *)&ci->adapterOperations3);
   5319		le16_to_cpus((u16 *)&ci->adapter_operations4);
   5320		le32_to_cpus((u32 *)&ci->adapter_operations5);
   5321
   5322		/* Update the latest Ext VD info.
   5323		 * From Init path, store current firmware details.
   5324		 * From OCR path, detect any firmware properties changes.
   5325		 * in case of Firmware upgrade without system reboot.
   5326		 */
   5327		megasas_update_ext_vd_details(instance);
   5328		instance->support_seqnum_jbod_fp =
   5329			ci->adapterOperations3.useSeqNumJbodFP;
   5330		instance->support_morethan256jbod =
   5331			ci->adapter_operations4.support_pd_map_target_id;
   5332		instance->support_nvme_passthru =
   5333			ci->adapter_operations4.support_nvme_passthru;
   5334		instance->support_pci_lane_margining =
   5335			ci->adapter_operations5.support_pci_lane_margining;
   5336		instance->task_abort_tmo = ci->TaskAbortTO;
   5337		instance->max_reset_tmo = ci->MaxResetTO;
   5338
   5339		/*Check whether controller is iMR or MR */
   5340		instance->is_imr = (ci->memory_size ? 0 : 1);
   5341
   5342		instance->snapdump_wait_time =
   5343			(ci->properties.on_off_properties2.enable_snap_dump ?
   5344			 MEGASAS_DEFAULT_SNAP_DUMP_WAIT_TIME : 0);
   5345
   5346		instance->enable_fw_dev_list =
   5347			ci->properties.on_off_properties2.enable_fw_dev_list;
   5348
   5349		dev_info(&instance->pdev->dev,
   5350			"controller type\t: %s(%dMB)\n",
   5351			instance->is_imr ? "iMR" : "MR",
   5352			le16_to_cpu(ci->memory_size));
   5353
   5354		instance->disableOnlineCtrlReset =
   5355			ci->properties.OnOffProperties.disableOnlineCtrlReset;
   5356		instance->secure_jbod_support =
   5357			ci->adapterOperations3.supportSecurityonJBOD;
   5358		dev_info(&instance->pdev->dev, "Online Controller Reset(OCR)\t: %s\n",
   5359			instance->disableOnlineCtrlReset ? "Disabled" : "Enabled");
   5360		dev_info(&instance->pdev->dev, "Secure JBOD support\t: %s\n",
   5361			instance->secure_jbod_support ? "Yes" : "No");
   5362		dev_info(&instance->pdev->dev, "NVMe passthru support\t: %s\n",
   5363			 instance->support_nvme_passthru ? "Yes" : "No");
   5364		dev_info(&instance->pdev->dev,
   5365			 "FW provided TM TaskAbort/Reset timeout\t: %d secs/%d secs\n",
   5366			 instance->task_abort_tmo, instance->max_reset_tmo);
   5367		dev_info(&instance->pdev->dev, "JBOD sequence map support\t: %s\n",
   5368			 instance->support_seqnum_jbod_fp ? "Yes" : "No");
   5369		dev_info(&instance->pdev->dev, "PCI Lane Margining support\t: %s\n",
   5370			 instance->support_pci_lane_margining ? "Yes" : "No");
   5371
   5372		break;
   5373
   5374	case DCMD_TIMEOUT:
   5375		switch (dcmd_timeout_ocr_possible(instance)) {
   5376		case INITIATE_OCR:
   5377			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
   5378			mutex_unlock(&instance->reset_mutex);
   5379			megasas_reset_fusion(instance->host,
   5380				MFI_IO_TIMEOUT_OCR);
   5381			mutex_lock(&instance->reset_mutex);
   5382			break;
   5383		case KILL_ADAPTER:
   5384			megaraid_sas_kill_hba(instance);
   5385			break;
   5386		case IGNORE_TIMEOUT:
   5387			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
   5388				__func__, __LINE__);
   5389			break;
   5390		}
   5391		break;
   5392	case DCMD_FAILED:
   5393		megaraid_sas_kill_hba(instance);
   5394		break;
   5395
   5396	}
   5397
   5398	if (ret != DCMD_TIMEOUT)
   5399		megasas_return_cmd(instance, cmd);
   5400
   5401	return ret;
   5402}
   5403
   5404/*
   5405 * megasas_set_crash_dump_params -	Sends address of crash dump DMA buffer
   5406 *					to firmware
   5407 *
   5408 * @instance:				Adapter soft state
   5409 * @crash_buf_state		-	tell FW to turn ON/OFF crash dump feature
   5410					MR_CRASH_BUF_TURN_OFF = 0
   5411					MR_CRASH_BUF_TURN_ON = 1
   5412 * @return 0 on success non-zero on failure.
   5413 * Issues an internal command (DCMD) to set parameters for crash dump feature.
   5414 * Driver will send address of crash dump DMA buffer and set mbox to tell FW
   5415 * that driver supports crash dump feature. This DCMD will be sent only if
   5416 * crash dump feature is supported by the FW.
   5417 *
   5418 */
   5419int megasas_set_crash_dump_params(struct megasas_instance *instance,
   5420	u8 crash_buf_state)
   5421{
   5422	int ret = 0;
   5423	struct megasas_cmd *cmd;
   5424	struct megasas_dcmd_frame *dcmd;
   5425
   5426	cmd = megasas_get_cmd(instance);
   5427
   5428	if (!cmd) {
   5429		dev_err(&instance->pdev->dev, "Failed to get a free cmd\n");
   5430		return -ENOMEM;
   5431	}
   5432
   5433
   5434	dcmd = &cmd->frame->dcmd;
   5435
   5436	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
   5437	dcmd->mbox.b[0] = crash_buf_state;
   5438	dcmd->cmd = MFI_CMD_DCMD;
   5439	dcmd->cmd_status = MFI_STAT_INVALID_STATUS;
   5440	dcmd->sge_count = 1;
   5441	dcmd->flags = MFI_FRAME_DIR_NONE;
   5442	dcmd->timeout = 0;
   5443	dcmd->pad_0 = 0;
   5444	dcmd->data_xfer_len = cpu_to_le32(CRASH_DMA_BUF_SIZE);
   5445	dcmd->opcode = cpu_to_le32(MR_DCMD_CTRL_SET_CRASH_DUMP_PARAMS);
   5446
   5447	megasas_set_dma_settings(instance, dcmd, instance->crash_dump_h,
   5448				 CRASH_DMA_BUF_SIZE);
   5449
   5450	if ((instance->adapter_type != MFI_SERIES) &&
   5451	    !instance->mask_interrupts)
   5452		ret = megasas_issue_blocked_cmd(instance, cmd, MFI_IO_TIMEOUT_SECS);
   5453	else
   5454		ret = megasas_issue_polled(instance, cmd);
   5455
   5456	if (ret == DCMD_TIMEOUT) {
   5457		switch (dcmd_timeout_ocr_possible(instance)) {
   5458		case INITIATE_OCR:
   5459			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
   5460			megasas_reset_fusion(instance->host,
   5461					MFI_IO_TIMEOUT_OCR);
   5462			break;
   5463		case KILL_ADAPTER:
   5464			megaraid_sas_kill_hba(instance);
   5465			break;
   5466		case IGNORE_TIMEOUT:
   5467			dev_info(&instance->pdev->dev, "Ignore DCMD timeout: %s %d\n",
   5468				__func__, __LINE__);
   5469			break;
   5470		}
   5471	} else
   5472		megasas_return_cmd(instance, cmd);
   5473
   5474	return ret;
   5475}
   5476
   5477/**
   5478 * megasas_issue_init_mfi -	Initializes the FW
   5479 * @instance:		Adapter soft state
   5480 *
   5481 * Issues the INIT MFI cmd
   5482 */
   5483static int
   5484megasas_issue_init_mfi(struct megasas_instance *instance)
   5485{
   5486	__le32 context;
   5487	struct megasas_cmd *cmd;
   5488	struct megasas_init_frame *init_frame;
   5489	struct megasas_init_queue_info *initq_info;
   5490	dma_addr_t init_frame_h;
   5491	dma_addr_t initq_info_h;
   5492
   5493	/*
   5494	 * Prepare a init frame. Note the init frame points to queue info
   5495	 * structure. Each frame has SGL allocated after first 64 bytes. For
   5496	 * this frame - since we don't need any SGL - we use SGL's space as
   5497	 * queue info structure
   5498	 *
   5499	 * We will not get a NULL command below. We just created the pool.
   5500	 */
   5501	cmd = megasas_get_cmd(instance);
   5502
   5503	init_frame = (struct megasas_init_frame *)cmd->frame;
   5504	initq_info = (struct megasas_init_queue_info *)
   5505		((unsigned long)init_frame + 64);
   5506
   5507	init_frame_h = cmd->frame_phys_addr;
   5508	initq_info_h = init_frame_h + 64;
   5509
   5510	context = init_frame->context;
   5511	memset(init_frame, 0, MEGAMFI_FRAME_SIZE);
   5512	memset(initq_info, 0, sizeof(struct megasas_init_queue_info));
   5513	init_frame->context = context;
   5514
   5515	initq_info->reply_queue_entries = cpu_to_le32(instance->max_fw_cmds + 1);
   5516	initq_info->reply_queue_start_phys_addr_lo = cpu_to_le32(instance->reply_queue_h);
   5517
   5518	initq_info->producer_index_phys_addr_lo = cpu_to_le32(instance->producer_h);
   5519	initq_info->consumer_index_phys_addr_lo = cpu_to_le32(instance->consumer_h);
   5520
   5521	init_frame->cmd = MFI_CMD_INIT;
   5522	init_frame->cmd_status = MFI_STAT_INVALID_STATUS;
   5523	init_frame->queue_info_new_phys_addr_lo =
   5524		cpu_to_le32(lower_32_bits(initq_info_h));
   5525	init_frame->queue_info_new_phys_addr_hi =
   5526		cpu_to_le32(upper_32_bits(initq_info_h));
   5527
   5528	init_frame->data_xfer_len = cpu_to_le32(sizeof(struct megasas_init_queue_info));
   5529
   5530	/*
   5531	 * disable the intr before firing the init frame to FW
   5532	 */
   5533	instance->instancet->disable_intr(instance);
   5534
   5535	/*
   5536	 * Issue the init frame in polled mode
   5537	 */
   5538
   5539	if (megasas_issue_polled(instance, cmd)) {
   5540		dev_err(&instance->pdev->dev, "Failed to init firmware\n");
   5541		megasas_return_cmd(instance, cmd);
   5542		goto fail_fw_init;
   5543	}
   5544
   5545	megasas_return_cmd(instance, cmd);
   5546
   5547	return 0;
   5548
   5549fail_fw_init:
   5550	return -EINVAL;
   5551}
   5552
   5553static u32
   5554megasas_init_adapter_mfi(struct megasas_instance *instance)
   5555{
   5556	u32 context_sz;
   5557	u32 reply_q_sz;
   5558
   5559	/*
   5560	 * Get various operational parameters from status register
   5561	 */
   5562	instance->max_fw_cmds = instance->instancet->read_fw_status_reg(instance) & 0x00FFFF;
   5563	/*
   5564	 * Reduce the max supported cmds by 1. This is to ensure that the
   5565	 * reply_q_sz (1 more than the max cmd that driver may send)
   5566	 * does not exceed max cmds that the FW can support
   5567	 */
   5568	instance->max_fw_cmds = instance->max_fw_cmds-1;
   5569	instance->max_mfi_cmds = instance->max_fw_cmds;
   5570	instance->max_num_sge = (instance->instancet->read_fw_status_reg(instance) & 0xFF0000) >>
   5571					0x10;
   5572	/*
   5573	 * For MFI skinny adapters, MEGASAS_SKINNY_INT_CMDS commands
   5574	 * are reserved for IOCTL + driver's internal DCMDs.
   5575	 */
   5576	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
   5577		(instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0071SKINNY)) {
   5578		instance->max_scsi_cmds = (instance->max_fw_cmds -
   5579			MEGASAS_SKINNY_INT_CMDS);
   5580		sema_init(&instance->ioctl_sem, MEGASAS_SKINNY_INT_CMDS);
   5581	} else {
   5582		instance->max_scsi_cmds = (instance->max_fw_cmds -
   5583			MEGASAS_INT_CMDS);
   5584		sema_init(&instance->ioctl_sem, (MEGASAS_MFI_IOCTL_CMDS));
   5585	}
   5586
   5587	instance->cur_can_queue = instance->max_scsi_cmds;
   5588	/*
   5589	 * Create a pool of commands
   5590	 */
   5591	if (megasas_alloc_cmds(instance))
   5592		goto fail_alloc_cmds;
   5593
   5594	/*
   5595	 * Allocate memory for reply queue. Length of reply queue should
   5596	 * be _one_ more than the maximum commands handled by the firmware.
   5597	 *
   5598	 * Note: When FW completes commands, it places corresponding contex
   5599	 * values in this circular reply queue. This circular queue is a fairly
   5600	 * typical producer-consumer queue. FW is the producer (of completed
   5601	 * commands) and the driver is the consumer.
   5602	 */
   5603	context_sz = sizeof(u32);
   5604	reply_q_sz = context_sz * (instance->max_fw_cmds + 1);
   5605
   5606	instance->reply_queue = dma_alloc_coherent(&instance->pdev->dev,
   5607			reply_q_sz, &instance->reply_queue_h, GFP_KERNEL);
   5608
   5609	if (!instance->reply_queue) {
   5610		dev_printk(KERN_DEBUG, &instance->pdev->dev, "Out of DMA mem for reply queue\n");
   5611		goto fail_reply_queue;
   5612	}
   5613
   5614	if (megasas_issue_init_mfi(instance))
   5615		goto fail_fw_init;
   5616
   5617	if (megasas_get_ctrl_info(instance)) {
   5618		dev_err(&instance->pdev->dev, "(%d): Could get controller info "
   5619			"Fail from %s %d\n", instance->unique_id,
   5620			__func__, __LINE__);
   5621		goto fail_fw_init;
   5622	}
   5623
   5624	instance->fw_support_ieee = 0;
   5625	instance->fw_support_ieee =
   5626		(instance->instancet->read_fw_status_reg(instance) &
   5627		0x04000000);
   5628
   5629	dev_notice(&instance->pdev->dev, "megasas_init_mfi: fw_support_ieee=%d",
   5630			instance->fw_support_ieee);
   5631
   5632	if (instance->fw_support_ieee)
   5633		instance->flag_ieee = 1;
   5634
   5635	return 0;
   5636
   5637fail_fw_init:
   5638
   5639	dma_free_coherent(&instance->pdev->dev, reply_q_sz,
   5640			    instance->reply_queue, instance->reply_queue_h);
   5641fail_reply_queue:
   5642	megasas_free_cmds(instance);
   5643
   5644fail_alloc_cmds:
   5645	return 1;
   5646}
   5647
   5648static
   5649void megasas_setup_irq_poll(struct megasas_instance *instance)
   5650{
   5651	struct megasas_irq_context *irq_ctx;
   5652	u32 count, i;
   5653
   5654	count = instance->msix_vectors > 0 ? instance->msix_vectors : 1;
   5655
   5656	/* Initialize IRQ poll */
   5657	for (i = 0; i < count; i++) {
   5658		irq_ctx = &instance->irq_context[i];
   5659		irq_ctx->os_irq = pci_irq_vector(instance->pdev, i);
   5660		irq_ctx->irq_poll_scheduled = false;
   5661		irq_poll_init(&irq_ctx->irqpoll,
   5662			      instance->threshold_reply_count,
   5663			      megasas_irqpoll);
   5664	}
   5665}
   5666
   5667/*
   5668 * megasas_setup_irqs_ioapic -		register legacy interrupts.
   5669 * @instance:				Adapter soft state
   5670 *
   5671 * Do not enable interrupt, only setup ISRs.
   5672 *
   5673 * Return 0 on success.
   5674 */
   5675static int
   5676megasas_setup_irqs_ioapic(struct megasas_instance *instance)
   5677{
   5678	struct pci_dev *pdev;
   5679
   5680	pdev = instance->pdev;
   5681	instance->irq_context[0].instance = instance;
   5682	instance->irq_context[0].MSIxIndex = 0;
   5683	snprintf(instance->irq_context->name, MEGASAS_MSIX_NAME_LEN, "%s%u",
   5684		"megasas", instance->host->host_no);
   5685	if (request_irq(pci_irq_vector(pdev, 0),
   5686			instance->instancet->service_isr, IRQF_SHARED,
   5687			instance->irq_context->name, &instance->irq_context[0])) {
   5688		dev_err(&instance->pdev->dev,
   5689				"Failed to register IRQ from %s %d\n",
   5690				__func__, __LINE__);
   5691		return -1;
   5692	}
   5693	instance->perf_mode = MR_LATENCY_PERF_MODE;
   5694	instance->low_latency_index_start = 0;
   5695	return 0;
   5696}
   5697
   5698/**
   5699 * megasas_setup_irqs_msix -		register MSI-x interrupts.
   5700 * @instance:				Adapter soft state
   5701 * @is_probe:				Driver probe check
   5702 *
   5703 * Do not enable interrupt, only setup ISRs.
   5704 *
   5705 * Return 0 on success.
   5706 */
   5707static int
   5708megasas_setup_irqs_msix(struct megasas_instance *instance, u8 is_probe)
   5709{
   5710	int i, j;
   5711	struct pci_dev *pdev;
   5712
   5713	pdev = instance->pdev;
   5714
   5715	/* Try MSI-x */
   5716	for (i = 0; i < instance->msix_vectors; i++) {
   5717		instance->irq_context[i].instance = instance;
   5718		instance->irq_context[i].MSIxIndex = i;
   5719		snprintf(instance->irq_context[i].name, MEGASAS_MSIX_NAME_LEN, "%s%u-msix%u",
   5720			"megasas", instance->host->host_no, i);
   5721		if (request_irq(pci_irq_vector(pdev, i),
   5722			instance->instancet->service_isr, 0, instance->irq_context[i].name,
   5723			&instance->irq_context[i])) {
   5724			dev_err(&instance->pdev->dev,
   5725				"Failed to register IRQ for vector %d.\n", i);
   5726			for (j = 0; j < i; j++) {
   5727				if (j < instance->low_latency_index_start)
   5728					irq_update_affinity_hint(
   5729						pci_irq_vector(pdev, j), NULL);
   5730				free_irq(pci_irq_vector(pdev, j),
   5731					 &instance->irq_context[j]);
   5732			}
   5733			/* Retry irq register for IO_APIC*/
   5734			instance->msix_vectors = 0;
   5735			instance->msix_load_balance = false;
   5736			if (is_probe) {
   5737				pci_free_irq_vectors(instance->pdev);
   5738				return megasas_setup_irqs_ioapic(instance);
   5739			} else {
   5740				return -1;
   5741			}
   5742		}
   5743	}
   5744
   5745	return 0;
   5746}
   5747
   5748/*
   5749 * megasas_destroy_irqs-		unregister interrupts.
   5750 * @instance:				Adapter soft state
   5751 * return:				void
   5752 */
   5753static void
   5754megasas_destroy_irqs(struct megasas_instance *instance) {
   5755
   5756	int i;
   5757	int count;
   5758	struct megasas_irq_context *irq_ctx;
   5759
   5760	count = instance->msix_vectors > 0 ? instance->msix_vectors : 1;
   5761	if (instance->adapter_type != MFI_SERIES) {
   5762		for (i = 0; i < count; i++) {
   5763			irq_ctx = &instance->irq_context[i];
   5764			irq_poll_disable(&irq_ctx->irqpoll);
   5765		}
   5766	}
   5767
   5768	if (instance->msix_vectors)
   5769		for (i = 0; i < instance->msix_vectors; i++) {
   5770			if (i < instance->low_latency_index_start)
   5771				irq_update_affinity_hint(
   5772				    pci_irq_vector(instance->pdev, i), NULL);
   5773			free_irq(pci_irq_vector(instance->pdev, i),
   5774				 &instance->irq_context[i]);
   5775		}
   5776	else
   5777		free_irq(pci_irq_vector(instance->pdev, 0),
   5778			 &instance->irq_context[0]);
   5779}
   5780
   5781/**
   5782 * megasas_setup_jbod_map -	setup jbod map for FP seq_number.
   5783 * @instance:				Adapter soft state
   5784 *
   5785 * Return 0 on success.
   5786 */
   5787void
   5788megasas_setup_jbod_map(struct megasas_instance *instance)
   5789{
   5790	int i;
   5791	struct fusion_context *fusion = instance->ctrl_context;
   5792	u32 pd_seq_map_sz;
   5793
   5794	pd_seq_map_sz = sizeof(struct MR_PD_CFG_SEQ_NUM_SYNC) +
   5795		(sizeof(struct MR_PD_CFG_SEQ) * (MAX_PHYSICAL_DEVICES - 1));
   5796
   5797	instance->use_seqnum_jbod_fp =
   5798		instance->support_seqnum_jbod_fp;
   5799	if (reset_devices || !fusion ||
   5800		!instance->support_seqnum_jbod_fp) {
   5801		dev_info(&instance->pdev->dev,
   5802			"JBOD sequence map is disabled %s %d\n",
   5803			__func__, __LINE__);
   5804		instance->use_seqnum_jbod_fp = false;
   5805		return;
   5806	}
   5807
   5808	if (fusion->pd_seq_sync[0])
   5809		goto skip_alloc;
   5810
   5811	for (i = 0; i < JBOD_MAPS_COUNT; i++) {
   5812		fusion->pd_seq_sync[i] = dma_alloc_coherent
   5813			(&instance->pdev->dev, pd_seq_map_sz,
   5814			&fusion->pd_seq_phys[i], GFP_KERNEL);
   5815		if (!fusion->pd_seq_sync[i]) {
   5816			dev_err(&instance->pdev->dev,
   5817				"Failed to allocate memory from %s %d\n",
   5818				__func__, __LINE__);
   5819			if (i == 1) {
   5820				dma_free_coherent(&instance->pdev->dev,
   5821					pd_seq_map_sz, fusion->pd_seq_sync[0],
   5822					fusion->pd_seq_phys[0]);
   5823				fusion->pd_seq_sync[0] = NULL;
   5824			}
   5825			instance->use_seqnum_jbod_fp = false;
   5826			return;
   5827		}
   5828	}
   5829
   5830skip_alloc:
   5831	if (!megasas_sync_pd_seq_num(instance, false) &&
   5832		!megasas_sync_pd_seq_num(instance, true))
   5833		instance->use_seqnum_jbod_fp = true;
   5834	else
   5835		instance->use_seqnum_jbod_fp = false;
   5836}
   5837
   5838static void megasas_setup_reply_map(struct megasas_instance *instance)
   5839{
   5840	const struct cpumask *mask;
   5841	unsigned int queue, cpu, low_latency_index_start;
   5842
   5843	low_latency_index_start = instance->low_latency_index_start;
   5844
   5845	for (queue = low_latency_index_start; queue < instance->msix_vectors; queue++) {
   5846		mask = pci_irq_get_affinity(instance->pdev, queue);
   5847		if (!mask)
   5848			goto fallback;
   5849
   5850		for_each_cpu(cpu, mask)
   5851			instance->reply_map[cpu] = queue;
   5852	}
   5853	return;
   5854
   5855fallback:
   5856	queue = low_latency_index_start;
   5857	for_each_possible_cpu(cpu) {
   5858		instance->reply_map[cpu] = queue;
   5859		if (queue == (instance->msix_vectors - 1))
   5860			queue = low_latency_index_start;
   5861		else
   5862			queue++;
   5863	}
   5864}
   5865
   5866/**
   5867 * megasas_get_device_list -	Get the PD and LD device list from FW.
   5868 * @instance:			Adapter soft state
   5869 * @return:			Success or failure
   5870 *
   5871 * Issue DCMDs to Firmware to get the PD and LD list.
   5872 * Based on the FW support, driver sends the HOST_DEVICE_LIST or combination
   5873 * of PD_LIST/LD_LIST_QUERY DCMDs to get the device list.
   5874 */
   5875static
   5876int megasas_get_device_list(struct megasas_instance *instance)
   5877{
   5878	memset(instance->pd_list, 0,
   5879	       (MEGASAS_MAX_PD * sizeof(struct megasas_pd_list)));
   5880	memset(instance->ld_ids, 0xff, MEGASAS_MAX_LD_IDS);
   5881
   5882	if (instance->enable_fw_dev_list) {
   5883		if (megasas_host_device_list_query(instance, true))
   5884			return FAILED;
   5885	} else {
   5886		if (megasas_get_pd_list(instance) < 0) {
   5887			dev_err(&instance->pdev->dev, "failed to get PD list\n");
   5888			return FAILED;
   5889		}
   5890
   5891		if (megasas_ld_list_query(instance,
   5892					  MR_LD_QUERY_TYPE_EXPOSED_TO_HOST)) {
   5893			dev_err(&instance->pdev->dev, "failed to get LD list\n");
   5894			return FAILED;
   5895		}
   5896	}
   5897
   5898	return SUCCESS;
   5899}
   5900
   5901/**
   5902 * megasas_set_high_iops_queue_affinity_and_hint -	Set affinity and hint
   5903 *							for high IOPS queues
   5904 * @instance:						Adapter soft state
   5905 * return:						void
   5906 */
   5907static inline void
   5908megasas_set_high_iops_queue_affinity_and_hint(struct megasas_instance *instance)
   5909{
   5910	int i;
   5911	unsigned int irq;
   5912	const struct cpumask *mask;
   5913
   5914	if (instance->perf_mode == MR_BALANCED_PERF_MODE) {
   5915		mask = cpumask_of_node(dev_to_node(&instance->pdev->dev));
   5916
   5917		for (i = 0; i < instance->low_latency_index_start; i++) {
   5918			irq = pci_irq_vector(instance->pdev, i);
   5919			irq_set_affinity_and_hint(irq, mask);
   5920		}
   5921	}
   5922}
   5923
   5924static int
   5925__megasas_alloc_irq_vectors(struct megasas_instance *instance)
   5926{
   5927	int i, irq_flags;
   5928	struct irq_affinity desc = { .pre_vectors = instance->low_latency_index_start };
   5929	struct irq_affinity *descp = &desc;
   5930
   5931	irq_flags = PCI_IRQ_MSIX;
   5932
   5933	if (instance->smp_affinity_enable)
   5934		irq_flags |= PCI_IRQ_AFFINITY | PCI_IRQ_ALL_TYPES;
   5935	else
   5936		descp = NULL;
   5937
   5938	/* Do not allocate msix vectors for poll_queues.
   5939	 * msix_vectors is always within a range of FW supported reply queue.
   5940	 */
   5941	i = pci_alloc_irq_vectors_affinity(instance->pdev,
   5942		instance->low_latency_index_start,
   5943		instance->msix_vectors - instance->iopoll_q_count, irq_flags, descp);
   5944
   5945	return i;
   5946}
   5947
   5948/**
   5949 * megasas_alloc_irq_vectors -	Allocate IRQ vectors/enable MSI-x vectors
   5950 * @instance:			Adapter soft state
   5951 * return:			void
   5952 */
   5953static void
   5954megasas_alloc_irq_vectors(struct megasas_instance *instance)
   5955{
   5956	int i;
   5957	unsigned int num_msix_req;
   5958
   5959	instance->iopoll_q_count = 0;
   5960	if ((instance->adapter_type != MFI_SERIES) &&
   5961		poll_queues) {
   5962
   5963		instance->perf_mode = MR_LATENCY_PERF_MODE;
   5964		instance->low_latency_index_start = 1;
   5965
   5966		/* reserve for default and non-mananged pre-vector. */
   5967		if (instance->msix_vectors > (poll_queues + 2))
   5968			instance->iopoll_q_count = poll_queues;
   5969		else
   5970			instance->iopoll_q_count = 0;
   5971
   5972		num_msix_req = num_online_cpus() + instance->low_latency_index_start;
   5973		instance->msix_vectors = min(num_msix_req,
   5974				instance->msix_vectors);
   5975
   5976	}
   5977
   5978	i = __megasas_alloc_irq_vectors(instance);
   5979
   5980	if (((instance->perf_mode == MR_BALANCED_PERF_MODE)
   5981		|| instance->iopoll_q_count) &&
   5982	    (i != (instance->msix_vectors - instance->iopoll_q_count))) {
   5983		if (instance->msix_vectors)
   5984			pci_free_irq_vectors(instance->pdev);
   5985		/* Disable Balanced IOPS mode and try realloc vectors */
   5986		instance->perf_mode = MR_LATENCY_PERF_MODE;
   5987		instance->low_latency_index_start = 1;
   5988		num_msix_req = num_online_cpus() + instance->low_latency_index_start;
   5989
   5990		instance->msix_vectors = min(num_msix_req,
   5991				instance->msix_vectors);
   5992
   5993		instance->iopoll_q_count = 0;
   5994		i = __megasas_alloc_irq_vectors(instance);
   5995
   5996	}
   5997
   5998	dev_info(&instance->pdev->dev,
   5999		"requested/available msix %d/%d poll_queue %d\n",
   6000			instance->msix_vectors - instance->iopoll_q_count,
   6001			i, instance->iopoll_q_count);
   6002
   6003	if (i > 0)
   6004		instance->msix_vectors = i;
   6005	else
   6006		instance->msix_vectors = 0;
   6007
   6008	if (instance->smp_affinity_enable)
   6009		megasas_set_high_iops_queue_affinity_and_hint(instance);
   6010}
   6011
   6012/**
   6013 * megasas_init_fw -	Initializes the FW
   6014 * @instance:		Adapter soft state
   6015 *
   6016 * This is the main function for initializing firmware
   6017 */
   6018
   6019static int megasas_init_fw(struct megasas_instance *instance)
   6020{
   6021	u32 max_sectors_1;
   6022	u32 max_sectors_2, tmp_sectors, msix_enable;
   6023	u32 scratch_pad_1, scratch_pad_2, scratch_pad_3, status_reg;
   6024	resource_size_t base_addr;
   6025	void *base_addr_phys;
   6026	struct megasas_ctrl_info *ctrl_info = NULL;
   6027	unsigned long bar_list;
   6028	int i, j, loop;
   6029	struct IOV_111 *iovPtr;
   6030	struct fusion_context *fusion;
   6031	bool intr_coalescing;
   6032	unsigned int num_msix_req;
   6033	u16 lnksta, speed;
   6034
   6035	fusion = instance->ctrl_context;
   6036
   6037	/* Find first memory bar */
   6038	bar_list = pci_select_bars(instance->pdev, IORESOURCE_MEM);
   6039	instance->bar = find_first_bit(&bar_list, BITS_PER_LONG);
   6040	if (pci_request_selected_regions(instance->pdev, 1<<instance->bar,
   6041					 "megasas: LSI")) {
   6042		dev_printk(KERN_DEBUG, &instance->pdev->dev, "IO memory region busy!\n");
   6043		return -EBUSY;
   6044	}
   6045
   6046	base_addr = pci_resource_start(instance->pdev, instance->bar);
   6047	instance->reg_set = ioremap(base_addr, 8192);
   6048
   6049	if (!instance->reg_set) {
   6050		dev_printk(KERN_DEBUG, &instance->pdev->dev, "Failed to map IO mem\n");
   6051		goto fail_ioremap;
   6052	}
   6053
   6054	base_addr_phys = &base_addr;
   6055	dev_printk(KERN_DEBUG, &instance->pdev->dev,
   6056		   "BAR:0x%lx  BAR's base_addr(phys):%pa  mapped virt_addr:0x%p\n",
   6057		   instance->bar, base_addr_phys, instance->reg_set);
   6058
   6059	if (instance->adapter_type != MFI_SERIES)
   6060		instance->instancet = &megasas_instance_template_fusion;
   6061	else {
   6062		switch (instance->pdev->device) {
   6063		case PCI_DEVICE_ID_LSI_SAS1078R:
   6064		case PCI_DEVICE_ID_LSI_SAS1078DE:
   6065			instance->instancet = &megasas_instance_template_ppc;
   6066			break;
   6067		case PCI_DEVICE_ID_LSI_SAS1078GEN2:
   6068		case PCI_DEVICE_ID_LSI_SAS0079GEN2:
   6069			instance->instancet = &megasas_instance_template_gen2;
   6070			break;
   6071		case PCI_DEVICE_ID_LSI_SAS0073SKINNY:
   6072		case PCI_DEVICE_ID_LSI_SAS0071SKINNY:
   6073			instance->instancet = &megasas_instance_template_skinny;
   6074			break;
   6075		case PCI_DEVICE_ID_LSI_SAS1064R:
   6076		case PCI_DEVICE_ID_DELL_PERC5:
   6077		default:
   6078			instance->instancet = &megasas_instance_template_xscale;
   6079			instance->pd_list_not_supported = 1;
   6080			break;
   6081		}
   6082	}
   6083
   6084	if (megasas_transition_to_ready(instance, 0)) {
   6085		dev_info(&instance->pdev->dev,
   6086			 "Failed to transition controller to ready from %s!\n",
   6087			 __func__);
   6088		if (instance->adapter_type != MFI_SERIES) {
   6089			status_reg = instance->instancet->read_fw_status_reg(
   6090					instance);
   6091			if (status_reg & MFI_RESET_ADAPTER) {
   6092				if (megasas_adp_reset_wait_for_ready
   6093					(instance, true, 0) == FAILED)
   6094					goto fail_ready_state;
   6095			} else {
   6096				goto fail_ready_state;
   6097			}
   6098		} else {
   6099			atomic_set(&instance->fw_reset_no_pci_access, 1);
   6100			instance->instancet->adp_reset
   6101				(instance, instance->reg_set);
   6102			atomic_set(&instance->fw_reset_no_pci_access, 0);
   6103
   6104			/*waiting for about 30 second before retry*/
   6105			ssleep(30);
   6106
   6107			if (megasas_transition_to_ready(instance, 0))
   6108				goto fail_ready_state;
   6109		}
   6110
   6111		dev_info(&instance->pdev->dev,
   6112			 "FW restarted successfully from %s!\n",
   6113			 __func__);
   6114	}
   6115
   6116	megasas_init_ctrl_params(instance);
   6117
   6118	if (megasas_set_dma_mask(instance))
   6119		goto fail_ready_state;
   6120
   6121	if (megasas_alloc_ctrl_mem(instance))
   6122		goto fail_alloc_dma_buf;
   6123
   6124	if (megasas_alloc_ctrl_dma_buffers(instance))
   6125		goto fail_alloc_dma_buf;
   6126
   6127	fusion = instance->ctrl_context;
   6128
   6129	if (instance->adapter_type >= VENTURA_SERIES) {
   6130		scratch_pad_2 =
   6131			megasas_readl(instance,
   6132				      &instance->reg_set->outbound_scratch_pad_2);
   6133		instance->max_raid_mapsize = ((scratch_pad_2 >>
   6134			MR_MAX_RAID_MAP_SIZE_OFFSET_SHIFT) &
   6135			MR_MAX_RAID_MAP_SIZE_MASK);
   6136	}
   6137
   6138	instance->enable_sdev_max_qd = enable_sdev_max_qd;
   6139
   6140	switch (instance->adapter_type) {
   6141	case VENTURA_SERIES:
   6142		fusion->pcie_bw_limitation = true;
   6143		break;
   6144	case AERO_SERIES:
   6145		fusion->r56_div_offload = true;
   6146		break;
   6147	default:
   6148		break;
   6149	}
   6150
   6151	/* Check if MSI-X is supported while in ready state */
   6152	msix_enable = (instance->instancet->read_fw_status_reg(instance) &
   6153		       0x4000000) >> 0x1a;
   6154	if (msix_enable && !msix_disable) {
   6155
   6156		scratch_pad_1 = megasas_readl
   6157			(instance, &instance->reg_set->outbound_scratch_pad_1);
   6158		/* Check max MSI-X vectors */
   6159		if (fusion) {
   6160			if (instance->adapter_type == THUNDERBOLT_SERIES) {
   6161				/* Thunderbolt Series*/
   6162				instance->msix_vectors = (scratch_pad_1
   6163					& MR_MAX_REPLY_QUEUES_OFFSET) + 1;
   6164			} else {
   6165				instance->msix_vectors = ((scratch_pad_1
   6166					& MR_MAX_REPLY_QUEUES_EXT_OFFSET)
   6167					>> MR_MAX_REPLY_QUEUES_EXT_OFFSET_SHIFT) + 1;
   6168
   6169				/*
   6170				 * For Invader series, > 8 MSI-x vectors
   6171				 * supported by FW/HW implies combined
   6172				 * reply queue mode is enabled.
   6173				 * For Ventura series, > 16 MSI-x vectors
   6174				 * supported by FW/HW implies combined
   6175				 * reply queue mode is enabled.
   6176				 */
   6177				switch (instance->adapter_type) {
   6178				case INVADER_SERIES:
   6179					if (instance->msix_vectors > 8)
   6180						instance->msix_combined = true;
   6181					break;
   6182				case AERO_SERIES:
   6183				case VENTURA_SERIES:
   6184					if (instance->msix_vectors > 16)
   6185						instance->msix_combined = true;
   6186					break;
   6187				}
   6188
   6189				if (rdpq_enable)
   6190					instance->is_rdpq = (scratch_pad_1 & MR_RDPQ_MODE_OFFSET) ?
   6191								1 : 0;
   6192
   6193				if (instance->adapter_type >= INVADER_SERIES &&
   6194				    !instance->msix_combined) {
   6195					instance->msix_load_balance = true;
   6196					instance->smp_affinity_enable = false;
   6197				}
   6198
   6199				/* Save 1-15 reply post index address to local memory
   6200				 * Index 0 is already saved from reg offset
   6201				 * MPI2_REPLY_POST_HOST_INDEX_OFFSET
   6202				 */
   6203				for (loop = 1; loop < MR_MAX_MSIX_REG_ARRAY; loop++) {
   6204					instance->reply_post_host_index_addr[loop] =
   6205						(u32 __iomem *)
   6206						((u8 __iomem *)instance->reg_set +
   6207						MPI2_SUP_REPLY_POST_HOST_INDEX_OFFSET
   6208						+ (loop * 0x10));
   6209				}
   6210			}
   6211
   6212			dev_info(&instance->pdev->dev,
   6213				 "firmware supports msix\t: (%d)",
   6214				 instance->msix_vectors);
   6215			if (msix_vectors)
   6216				instance->msix_vectors = min(msix_vectors,
   6217					instance->msix_vectors);
   6218		} else /* MFI adapters */
   6219			instance->msix_vectors = 1;
   6220
   6221
   6222		/*
   6223		 * For Aero (if some conditions are met), driver will configure a
   6224		 * few additional reply queues with interrupt coalescing enabled.
   6225		 * These queues with interrupt coalescing enabled are called
   6226		 * High IOPS queues and rest of reply queues (based on number of
   6227		 * logical CPUs) are termed as Low latency queues.
   6228		 *
   6229		 * Total Number of reply queues = High IOPS queues + low latency queues
   6230		 *
   6231		 * For rest of fusion adapters, 1 additional reply queue will be
   6232		 * reserved for management commands, rest of reply queues
   6233		 * (based on number of logical CPUs) will be used for IOs and
   6234		 * referenced as IO queues.
   6235		 * Total Number of reply queues = 1 + IO queues
   6236		 *
   6237		 * MFI adapters supports single MSI-x so single reply queue
   6238		 * will be used for IO and management commands.
   6239		 */
   6240
   6241		intr_coalescing = (scratch_pad_1 & MR_INTR_COALESCING_SUPPORT_OFFSET) ?
   6242								true : false;
   6243		if (intr_coalescing &&
   6244			(num_online_cpus() >= MR_HIGH_IOPS_QUEUE_COUNT) &&
   6245			(instance->msix_vectors == MEGASAS_MAX_MSIX_QUEUES))
   6246			instance->perf_mode = MR_BALANCED_PERF_MODE;
   6247		else
   6248			instance->perf_mode = MR_LATENCY_PERF_MODE;
   6249
   6250
   6251		if (instance->adapter_type == AERO_SERIES) {
   6252			pcie_capability_read_word(instance->pdev, PCI_EXP_LNKSTA, &lnksta);
   6253			speed = lnksta & PCI_EXP_LNKSTA_CLS;
   6254
   6255			/*
   6256			 * For Aero, if PCIe link speed is <16 GT/s, then driver should operate
   6257			 * in latency perf mode and enable R1 PCI bandwidth algorithm
   6258			 */
   6259			if (speed < 0x4) {
   6260				instance->perf_mode = MR_LATENCY_PERF_MODE;
   6261				fusion->pcie_bw_limitation = true;
   6262			}
   6263
   6264			/*
   6265			 * Performance mode settings provided through module parameter-perf_mode will
   6266			 * take affect only for:
   6267			 * 1. Aero family of adapters.
   6268			 * 2. When user sets module parameter- perf_mode in range of 0-2.
   6269			 */
   6270			if ((perf_mode >= MR_BALANCED_PERF_MODE) &&
   6271				(perf_mode <= MR_LATENCY_PERF_MODE))
   6272				instance->perf_mode = perf_mode;
   6273			/*
   6274			 * If intr coalescing is not supported by controller FW, then IOPS
   6275			 * and Balanced modes are not feasible.
   6276			 */
   6277			if (!intr_coalescing)
   6278				instance->perf_mode = MR_LATENCY_PERF_MODE;
   6279
   6280		}
   6281
   6282		if (instance->perf_mode == MR_BALANCED_PERF_MODE)
   6283			instance->low_latency_index_start =
   6284				MR_HIGH_IOPS_QUEUE_COUNT;
   6285		else
   6286			instance->low_latency_index_start = 1;
   6287
   6288		num_msix_req = num_online_cpus() + instance->low_latency_index_start;
   6289
   6290		instance->msix_vectors = min(num_msix_req,
   6291				instance->msix_vectors);
   6292
   6293		megasas_alloc_irq_vectors(instance);
   6294		if (!instance->msix_vectors)
   6295			instance->msix_load_balance = false;
   6296	}
   6297	/*
   6298	 * MSI-X host index 0 is common for all adapter.
   6299	 * It is used for all MPT based Adapters.
   6300	 */
   6301	if (instance->msix_combined) {
   6302		instance->reply_post_host_index_addr[0] =
   6303				(u32 *)((u8 *)instance->reg_set +
   6304				MPI2_SUP_REPLY_POST_HOST_INDEX_OFFSET);
   6305	} else {
   6306		instance->reply_post_host_index_addr[0] =
   6307			(u32 *)((u8 *)instance->reg_set +
   6308			MPI2_REPLY_POST_HOST_INDEX_OFFSET);
   6309	}
   6310
   6311	if (!instance->msix_vectors) {
   6312		i = pci_alloc_irq_vectors(instance->pdev, 1, 1, PCI_IRQ_LEGACY);
   6313		if (i < 0)
   6314			goto fail_init_adapter;
   6315	}
   6316
   6317	megasas_setup_reply_map(instance);
   6318
   6319	dev_info(&instance->pdev->dev,
   6320		"current msix/online cpus\t: (%d/%d)\n",
   6321		instance->msix_vectors, (unsigned int)num_online_cpus());
   6322	dev_info(&instance->pdev->dev,
   6323		"RDPQ mode\t: (%s)\n", instance->is_rdpq ? "enabled" : "disabled");
   6324
   6325	tasklet_init(&instance->isr_tasklet, instance->instancet->tasklet,
   6326		(unsigned long)instance);
   6327
   6328	/*
   6329	 * Below are default value for legacy Firmware.
   6330	 * non-fusion based controllers
   6331	 */
   6332	instance->fw_supported_vd_count = MAX_LOGICAL_DRIVES;
   6333	instance->fw_supported_pd_count = MAX_PHYSICAL_DEVICES;
   6334	/* Get operational params, sge flags, send init cmd to controller */
   6335	if (instance->instancet->init_adapter(instance))
   6336		goto fail_init_adapter;
   6337
   6338	if (instance->adapter_type >= VENTURA_SERIES) {
   6339		scratch_pad_3 =
   6340			megasas_readl(instance,
   6341				      &instance->reg_set->outbound_scratch_pad_3);
   6342		if ((scratch_pad_3 & MR_NVME_PAGE_SIZE_MASK) >=
   6343			MR_DEFAULT_NVME_PAGE_SHIFT)
   6344			instance->nvme_page_size =
   6345				(1 << (scratch_pad_3 & MR_NVME_PAGE_SIZE_MASK));
   6346
   6347		dev_info(&instance->pdev->dev,
   6348			 "NVME page size\t: (%d)\n", instance->nvme_page_size);
   6349	}
   6350
   6351	if (instance->msix_vectors ?
   6352		megasas_setup_irqs_msix(instance, 1) :
   6353		megasas_setup_irqs_ioapic(instance))
   6354		goto fail_init_adapter;
   6355
   6356	if (instance->adapter_type != MFI_SERIES)
   6357		megasas_setup_irq_poll(instance);
   6358
   6359	instance->instancet->enable_intr(instance);
   6360
   6361	dev_info(&instance->pdev->dev, "INIT adapter done\n");
   6362
   6363	megasas_setup_jbod_map(instance);
   6364
   6365	if (megasas_get_device_list(instance) != SUCCESS) {
   6366		dev_err(&instance->pdev->dev,
   6367			"%s: megasas_get_device_list failed\n",
   6368			__func__);
   6369		goto fail_get_ld_pd_list;
   6370	}
   6371
   6372	/* stream detection initialization */
   6373	if (instance->adapter_type >= VENTURA_SERIES) {
   6374		fusion->stream_detect_by_ld =
   6375			kcalloc(MAX_LOGICAL_DRIVES_EXT,
   6376				sizeof(struct LD_STREAM_DETECT *),
   6377				GFP_KERNEL);
   6378		if (!fusion->stream_detect_by_ld) {
   6379			dev_err(&instance->pdev->dev,
   6380				"unable to allocate stream detection for pool of LDs\n");
   6381			goto fail_get_ld_pd_list;
   6382		}
   6383		for (i = 0; i < MAX_LOGICAL_DRIVES_EXT; ++i) {
   6384			fusion->stream_detect_by_ld[i] =
   6385				kzalloc(sizeof(struct LD_STREAM_DETECT),
   6386				GFP_KERNEL);
   6387			if (!fusion->stream_detect_by_ld[i]) {
   6388				dev_err(&instance->pdev->dev,
   6389					"unable to allocate stream detect by LD\n ");
   6390				for (j = 0; j < i; ++j)
   6391					kfree(fusion->stream_detect_by_ld[j]);
   6392				kfree(fusion->stream_detect_by_ld);
   6393				fusion->stream_detect_by_ld = NULL;
   6394				goto fail_get_ld_pd_list;
   6395			}
   6396			fusion->stream_detect_by_ld[i]->mru_bit_map
   6397				= MR_STREAM_BITMAP;
   6398		}
   6399	}
   6400
   6401	/*
   6402	 * Compute the max allowed sectors per IO: The controller info has two
   6403	 * limits on max sectors. Driver should use the minimum of these two.
   6404	 *
   6405	 * 1 << stripe_sz_ops.min = max sectors per strip
   6406	 *
   6407	 * Note that older firmwares ( < FW ver 30) didn't report information
   6408	 * to calculate max_sectors_1. So the number ended up as zero always.
   6409	 */
   6410	tmp_sectors = 0;
   6411	ctrl_info = instance->ctrl_info_buf;
   6412
   6413	max_sectors_1 = (1 << ctrl_info->stripe_sz_ops.min) *
   6414		le16_to_cpu(ctrl_info->max_strips_per_io);
   6415	max_sectors_2 = le32_to_cpu(ctrl_info->max_request_size);
   6416
   6417	tmp_sectors = min_t(u32, max_sectors_1, max_sectors_2);
   6418
   6419	instance->peerIsPresent = ctrl_info->cluster.peerIsPresent;
   6420	instance->passive = ctrl_info->cluster.passive;
   6421	memcpy(instance->clusterId, ctrl_info->clusterId, sizeof(instance->clusterId));
   6422	instance->UnevenSpanSupport =
   6423		ctrl_info->adapterOperations2.supportUnevenSpans;
   6424	if (instance->UnevenSpanSupport) {
   6425		struct fusion_context *fusion = instance->ctrl_context;
   6426		if (MR_ValidateMapInfo(instance, instance->map_id))
   6427			fusion->fast_path_io = 1;
   6428		else
   6429			fusion->fast_path_io = 0;
   6430
   6431	}
   6432	if (ctrl_info->host_interface.SRIOV) {
   6433		instance->requestorId = ctrl_info->iov.requestorId;
   6434		if (instance->pdev->device == PCI_DEVICE_ID_LSI_PLASMA) {
   6435			if (!ctrl_info->adapterOperations2.activePassive)
   6436			    instance->PlasmaFW111 = 1;
   6437
   6438			dev_info(&instance->pdev->dev, "SR-IOV: firmware type: %s\n",
   6439			    instance->PlasmaFW111 ? "1.11" : "new");
   6440
   6441			if (instance->PlasmaFW111) {
   6442			    iovPtr = (struct IOV_111 *)
   6443				((unsigned char *)ctrl_info + IOV_111_OFFSET);
   6444			    instance->requestorId = iovPtr->requestorId;
   6445			}
   6446		}
   6447		dev_info(&instance->pdev->dev, "SRIOV: VF requestorId %d\n",
   6448			instance->requestorId);
   6449	}
   6450
   6451	instance->crash_dump_fw_support =
   6452		ctrl_info->adapterOperations3.supportCrashDump;
   6453	instance->crash_dump_drv_support =
   6454		(instance->crash_dump_fw_support &&
   6455		instance->crash_dump_buf);
   6456	if (instance->crash_dump_drv_support)
   6457		megasas_set_crash_dump_params(instance,
   6458			MR_CRASH_BUF_TURN_OFF);
   6459
   6460	else {
   6461		if (instance->crash_dump_buf)
   6462			dma_free_coherent(&instance->pdev->dev,
   6463				CRASH_DMA_BUF_SIZE,
   6464				instance->crash_dump_buf,
   6465				instance->crash_dump_h);
   6466		instance->crash_dump_buf = NULL;
   6467	}
   6468
   6469	if (instance->snapdump_wait_time) {
   6470		megasas_get_snapdump_properties(instance);
   6471		dev_info(&instance->pdev->dev, "Snap dump wait time\t: %d\n",
   6472			 instance->snapdump_wait_time);
   6473	}
   6474
   6475	dev_info(&instance->pdev->dev,
   6476		"pci id\t\t: (0x%04x)/(0x%04x)/(0x%04x)/(0x%04x)\n",
   6477		le16_to_cpu(ctrl_info->pci.vendor_id),
   6478		le16_to_cpu(ctrl_info->pci.device_id),
   6479		le16_to_cpu(ctrl_info->pci.sub_vendor_id),
   6480		le16_to_cpu(ctrl_info->pci.sub_device_id));
   6481	dev_info(&instance->pdev->dev, "unevenspan support	: %s\n",
   6482		instance->UnevenSpanSupport ? "yes" : "no");
   6483	dev_info(&instance->pdev->dev, "firmware crash dump	: %s\n",
   6484		instance->crash_dump_drv_support ? "yes" : "no");
   6485	dev_info(&instance->pdev->dev, "JBOD sequence map	: %s\n",
   6486		instance->use_seqnum_jbod_fp ? "enabled" : "disabled");
   6487
   6488	instance->max_sectors_per_req = instance->max_num_sge *
   6489						SGE_BUFFER_SIZE / 512;
   6490	if (tmp_sectors && (instance->max_sectors_per_req > tmp_sectors))
   6491		instance->max_sectors_per_req = tmp_sectors;
   6492
   6493	/* Check for valid throttlequeuedepth module parameter */
   6494	if (throttlequeuedepth &&
   6495			throttlequeuedepth <= instance->max_scsi_cmds)
   6496		instance->throttlequeuedepth = throttlequeuedepth;
   6497	else
   6498		instance->throttlequeuedepth =
   6499				MEGASAS_THROTTLE_QUEUE_DEPTH;
   6500
   6501	if ((resetwaittime < 1) ||
   6502	    (resetwaittime > MEGASAS_RESET_WAIT_TIME))
   6503		resetwaittime = MEGASAS_RESET_WAIT_TIME;
   6504
   6505	if ((scmd_timeout < 10) || (scmd_timeout > MEGASAS_DEFAULT_CMD_TIMEOUT))
   6506		scmd_timeout = MEGASAS_DEFAULT_CMD_TIMEOUT;
   6507
   6508	/* Launch SR-IOV heartbeat timer */
   6509	if (instance->requestorId) {
   6510		if (!megasas_sriov_start_heartbeat(instance, 1)) {
   6511			megasas_start_timer(instance);
   6512		} else {
   6513			instance->skip_heartbeat_timer_del = 1;
   6514			goto fail_get_ld_pd_list;
   6515		}
   6516	}
   6517
   6518	/*
   6519	 * Create and start watchdog thread which will monitor
   6520	 * controller state every 1 sec and trigger OCR when
   6521	 * it enters fault state
   6522	 */
   6523	if (instance->adapter_type != MFI_SERIES)
   6524		if (megasas_fusion_start_watchdog(instance) != SUCCESS)
   6525			goto fail_start_watchdog;
   6526
   6527	return 0;
   6528
   6529fail_start_watchdog:
   6530	if (instance->requestorId && !instance->skip_heartbeat_timer_del)
   6531		del_timer_sync(&instance->sriov_heartbeat_timer);
   6532fail_get_ld_pd_list:
   6533	instance->instancet->disable_intr(instance);
   6534	megasas_destroy_irqs(instance);
   6535fail_init_adapter:
   6536	if (instance->msix_vectors)
   6537		pci_free_irq_vectors(instance->pdev);
   6538	instance->msix_vectors = 0;
   6539fail_alloc_dma_buf:
   6540	megasas_free_ctrl_dma_buffers(instance);
   6541	megasas_free_ctrl_mem(instance);
   6542fail_ready_state:
   6543	iounmap(instance->reg_set);
   6544
   6545fail_ioremap:
   6546	pci_release_selected_regions(instance->pdev, 1<<instance->bar);
   6547
   6548	dev_err(&instance->pdev->dev, "Failed from %s %d\n",
   6549		__func__, __LINE__);
   6550	return -EINVAL;
   6551}
   6552
   6553/**
   6554 * megasas_release_mfi -	Reverses the FW initialization
   6555 * @instance:			Adapter soft state
   6556 */
   6557static void megasas_release_mfi(struct megasas_instance *instance)
   6558{
   6559	u32 reply_q_sz = sizeof(u32) *(instance->max_mfi_cmds + 1);
   6560
   6561	if (instance->reply_queue)
   6562		dma_free_coherent(&instance->pdev->dev, reply_q_sz,
   6563			    instance->reply_queue, instance->reply_queue_h);
   6564
   6565	megasas_free_cmds(instance);
   6566
   6567	iounmap(instance->reg_set);
   6568
   6569	pci_release_selected_regions(instance->pdev, 1<<instance->bar);
   6570}
   6571
   6572/**
   6573 * megasas_get_seq_num -	Gets latest event sequence numbers
   6574 * @instance:			Adapter soft state
   6575 * @eli:			FW event log sequence numbers information
   6576 *
   6577 * FW maintains a log of all events in a non-volatile area. Upper layers would
   6578 * usually find out the latest sequence number of the events, the seq number at
   6579 * the boot etc. They would "read" all the events below the latest seq number
   6580 * by issuing a direct fw cmd (DCMD). For the future events (beyond latest seq
   6581 * number), they would subsribe to AEN (asynchronous event notification) and
   6582 * wait for the events to happen.
   6583 */
   6584static int
   6585megasas_get_seq_num(struct megasas_instance *instance,
   6586		    struct megasas_evt_log_info *eli)
   6587{
   6588	struct megasas_cmd *cmd;
   6589	struct megasas_dcmd_frame *dcmd;
   6590	struct megasas_evt_log_info *el_info;
   6591	dma_addr_t el_info_h = 0;
   6592	int ret;
   6593
   6594	cmd = megasas_get_cmd(instance);
   6595
   6596	if (!cmd) {
   6597		return -ENOMEM;
   6598	}
   6599
   6600	dcmd = &cmd->frame->dcmd;
   6601	el_info = dma_alloc_coherent(&instance->pdev->dev,
   6602				     sizeof(struct megasas_evt_log_info),
   6603				     &el_info_h, GFP_KERNEL);
   6604	if (!el_info) {
   6605		megasas_return_cmd(instance, cmd);
   6606		return -ENOMEM;
   6607	}
   6608
   6609	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
   6610
   6611	dcmd->cmd = MFI_CMD_DCMD;
   6612	dcmd->cmd_status = 0x0;
   6613	dcmd->sge_count = 1;
   6614	dcmd->flags = MFI_FRAME_DIR_READ;
   6615	dcmd->timeout = 0;
   6616	dcmd->pad_0 = 0;
   6617	dcmd->data_xfer_len = cpu_to_le32(sizeof(struct megasas_evt_log_info));
   6618	dcmd->opcode = cpu_to_le32(MR_DCMD_CTRL_EVENT_GET_INFO);
   6619
   6620	megasas_set_dma_settings(instance, dcmd, el_info_h,
   6621				 sizeof(struct megasas_evt_log_info));
   6622
   6623	ret = megasas_issue_blocked_cmd(instance, cmd, MFI_IO_TIMEOUT_SECS);
   6624	if (ret != DCMD_SUCCESS) {
   6625		dev_err(&instance->pdev->dev, "Failed from %s %d\n",
   6626			__func__, __LINE__);
   6627		goto dcmd_failed;
   6628	}
   6629
   6630	/*
   6631	 * Copy the data back into callers buffer
   6632	 */
   6633	eli->newest_seq_num = el_info->newest_seq_num;
   6634	eli->oldest_seq_num = el_info->oldest_seq_num;
   6635	eli->clear_seq_num = el_info->clear_seq_num;
   6636	eli->shutdown_seq_num = el_info->shutdown_seq_num;
   6637	eli->boot_seq_num = el_info->boot_seq_num;
   6638
   6639dcmd_failed:
   6640	dma_free_coherent(&instance->pdev->dev,
   6641			sizeof(struct megasas_evt_log_info),
   6642			el_info, el_info_h);
   6643
   6644	megasas_return_cmd(instance, cmd);
   6645
   6646	return ret;
   6647}
   6648
   6649/**
   6650 * megasas_register_aen -	Registers for asynchronous event notification
   6651 * @instance:			Adapter soft state
   6652 * @seq_num:			The starting sequence number
   6653 * @class_locale_word:		Class of the event
   6654 *
   6655 * This function subscribes for AEN for events beyond the @seq_num. It requests
   6656 * to be notified if and only if the event is of type @class_locale
   6657 */
   6658static int
   6659megasas_register_aen(struct megasas_instance *instance, u32 seq_num,
   6660		     u32 class_locale_word)
   6661{
   6662	int ret_val;
   6663	struct megasas_cmd *cmd;
   6664	struct megasas_dcmd_frame *dcmd;
   6665	union megasas_evt_class_locale curr_aen;
   6666	union megasas_evt_class_locale prev_aen;
   6667
   6668	/*
   6669	 * If there an AEN pending already (aen_cmd), check if the
   6670	 * class_locale of that pending AEN is inclusive of the new
   6671	 * AEN request we currently have. If it is, then we don't have
   6672	 * to do anything. In other words, whichever events the current
   6673	 * AEN request is subscribing to, have already been subscribed
   6674	 * to.
   6675	 *
   6676	 * If the old_cmd is _not_ inclusive, then we have to abort
   6677	 * that command, form a class_locale that is superset of both
   6678	 * old and current and re-issue to the FW
   6679	 */
   6680
   6681	curr_aen.word = class_locale_word;
   6682
   6683	if (instance->aen_cmd) {
   6684
   6685		prev_aen.word =
   6686			le32_to_cpu(instance->aen_cmd->frame->dcmd.mbox.w[1]);
   6687
   6688		if ((curr_aen.members.class < MFI_EVT_CLASS_DEBUG) ||
   6689		    (curr_aen.members.class > MFI_EVT_CLASS_DEAD)) {
   6690			dev_info(&instance->pdev->dev,
   6691				 "%s %d out of range class %d send by application\n",
   6692				 __func__, __LINE__, curr_aen.members.class);
   6693			return 0;
   6694		}
   6695
   6696		/*
   6697		 * A class whose enum value is smaller is inclusive of all
   6698		 * higher values. If a PROGRESS (= -1) was previously
   6699		 * registered, then a new registration requests for higher
   6700		 * classes need not be sent to FW. They are automatically
   6701		 * included.
   6702		 *
   6703		 * Locale numbers don't have such hierarchy. They are bitmap
   6704		 * values
   6705		 */
   6706		if ((prev_aen.members.class <= curr_aen.members.class) &&
   6707		    !((prev_aen.members.locale & curr_aen.members.locale) ^
   6708		      curr_aen.members.locale)) {
   6709			/*
   6710			 * Previously issued event registration includes
   6711			 * current request. Nothing to do.
   6712			 */
   6713			return 0;
   6714		} else {
   6715			curr_aen.members.locale |= prev_aen.members.locale;
   6716
   6717			if (prev_aen.members.class < curr_aen.members.class)
   6718				curr_aen.members.class = prev_aen.members.class;
   6719
   6720			instance->aen_cmd->abort_aen = 1;
   6721			ret_val = megasas_issue_blocked_abort_cmd(instance,
   6722								  instance->
   6723								  aen_cmd, 30);
   6724
   6725			if (ret_val) {
   6726				dev_printk(KERN_DEBUG, &instance->pdev->dev, "Failed to abort "
   6727				       "previous AEN command\n");
   6728				return ret_val;
   6729			}
   6730		}
   6731	}
   6732
   6733	cmd = megasas_get_cmd(instance);
   6734
   6735	if (!cmd)
   6736		return -ENOMEM;
   6737
   6738	dcmd = &cmd->frame->dcmd;
   6739
   6740	memset(instance->evt_detail, 0, sizeof(struct megasas_evt_detail));
   6741
   6742	/*
   6743	 * Prepare DCMD for aen registration
   6744	 */
   6745	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
   6746
   6747	dcmd->cmd = MFI_CMD_DCMD;
   6748	dcmd->cmd_status = 0x0;
   6749	dcmd->sge_count = 1;
   6750	dcmd->flags = MFI_FRAME_DIR_READ;
   6751	dcmd->timeout = 0;
   6752	dcmd->pad_0 = 0;
   6753	dcmd->data_xfer_len = cpu_to_le32(sizeof(struct megasas_evt_detail));
   6754	dcmd->opcode = cpu_to_le32(MR_DCMD_CTRL_EVENT_WAIT);
   6755	dcmd->mbox.w[0] = cpu_to_le32(seq_num);
   6756	instance->last_seq_num = seq_num;
   6757	dcmd->mbox.w[1] = cpu_to_le32(curr_aen.word);
   6758
   6759	megasas_set_dma_settings(instance, dcmd, instance->evt_detail_h,
   6760				 sizeof(struct megasas_evt_detail));
   6761
   6762	if (instance->aen_cmd != NULL) {
   6763		megasas_return_cmd(instance, cmd);
   6764		return 0;
   6765	}
   6766
   6767	/*
   6768	 * Store reference to the cmd used to register for AEN. When an
   6769	 * application wants us to register for AEN, we have to abort this
   6770	 * cmd and re-register with a new EVENT LOCALE supplied by that app
   6771	 */
   6772	instance->aen_cmd = cmd;
   6773
   6774	/*
   6775	 * Issue the aen registration frame
   6776	 */
   6777	instance->instancet->issue_dcmd(instance, cmd);
   6778
   6779	return 0;
   6780}
   6781
   6782/* megasas_get_target_prop - Send DCMD with below details to firmware.
   6783 *
   6784 * This DCMD will fetch few properties of LD/system PD defined
   6785 * in MR_TARGET_DEV_PROPERTIES. eg. Queue Depth, MDTS value.
   6786 *
   6787 * DCMD send by drivers whenever new target is added to the OS.
   6788 *
   6789 * dcmd.opcode         - MR_DCMD_DEV_GET_TARGET_PROP
   6790 * dcmd.mbox.b[0]      - DCMD is to be fired for LD or system PD.
   6791 *                       0 = system PD, 1 = LD.
   6792 * dcmd.mbox.s[1]      - TargetID for LD/system PD.
   6793 * dcmd.sge IN         - Pointer to return MR_TARGET_DEV_PROPERTIES.
   6794 *
   6795 * @instance:		Adapter soft state
   6796 * @sdev:		OS provided scsi device
   6797 *
   6798 * Returns 0 on success non-zero on failure.
   6799 */
   6800int
   6801megasas_get_target_prop(struct megasas_instance *instance,
   6802			struct scsi_device *sdev)
   6803{
   6804	int ret;
   6805	struct megasas_cmd *cmd;
   6806	struct megasas_dcmd_frame *dcmd;
   6807	u16 targetId = ((sdev->channel % 2) * MEGASAS_MAX_DEV_PER_CHANNEL) +
   6808			sdev->id;
   6809
   6810	cmd = megasas_get_cmd(instance);
   6811
   6812	if (!cmd) {
   6813		dev_err(&instance->pdev->dev,
   6814			"Failed to get cmd %s\n", __func__);
   6815		return -ENOMEM;
   6816	}
   6817
   6818	dcmd = &cmd->frame->dcmd;
   6819
   6820	memset(instance->tgt_prop, 0, sizeof(*instance->tgt_prop));
   6821	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
   6822	dcmd->mbox.b[0] = MEGASAS_IS_LOGICAL(sdev);
   6823
   6824	dcmd->mbox.s[1] = cpu_to_le16(targetId);
   6825	dcmd->cmd = MFI_CMD_DCMD;
   6826	dcmd->cmd_status = 0xFF;
   6827	dcmd->sge_count = 1;
   6828	dcmd->flags = MFI_FRAME_DIR_READ;
   6829	dcmd->timeout = 0;
   6830	dcmd->pad_0 = 0;
   6831	dcmd->data_xfer_len =
   6832		cpu_to_le32(sizeof(struct MR_TARGET_PROPERTIES));
   6833	dcmd->opcode = cpu_to_le32(MR_DCMD_DRV_GET_TARGET_PROP);
   6834
   6835	megasas_set_dma_settings(instance, dcmd, instance->tgt_prop_h,
   6836				 sizeof(struct MR_TARGET_PROPERTIES));
   6837
   6838	if ((instance->adapter_type != MFI_SERIES) &&
   6839	    !instance->mask_interrupts)
   6840		ret = megasas_issue_blocked_cmd(instance,
   6841						cmd, MFI_IO_TIMEOUT_SECS);
   6842	else
   6843		ret = megasas_issue_polled(instance, cmd);
   6844
   6845	switch (ret) {
   6846	case DCMD_TIMEOUT:
   6847		switch (dcmd_timeout_ocr_possible(instance)) {
   6848		case INITIATE_OCR:
   6849			cmd->flags |= DRV_DCMD_SKIP_REFIRE;
   6850			mutex_unlock(&instance->reset_mutex);
   6851			megasas_reset_fusion(instance->host,
   6852					     MFI_IO_TIMEOUT_OCR);
   6853			mutex_lock(&instance->reset_mutex);
   6854			break;
   6855		case KILL_ADAPTER:
   6856			megaraid_sas_kill_hba(instance);
   6857			break;
   6858		case IGNORE_TIMEOUT:
   6859			dev_info(&instance->pdev->dev,
   6860				 "Ignore DCMD timeout: %s %d\n",
   6861				 __func__, __LINE__);
   6862			break;
   6863		}
   6864		break;
   6865
   6866	default:
   6867		megasas_return_cmd(instance, cmd);
   6868	}
   6869	if (ret != DCMD_SUCCESS)
   6870		dev_err(&instance->pdev->dev,
   6871			"return from %s %d return value %d\n",
   6872			__func__, __LINE__, ret);
   6873
   6874	return ret;
   6875}
   6876
   6877/**
   6878 * megasas_start_aen -	Subscribes to AEN during driver load time
   6879 * @instance:		Adapter soft state
   6880 */
   6881static int megasas_start_aen(struct megasas_instance *instance)
   6882{
   6883	struct megasas_evt_log_info eli;
   6884	union megasas_evt_class_locale class_locale;
   6885
   6886	/*
   6887	 * Get the latest sequence number from FW
   6888	 */
   6889	memset(&eli, 0, sizeof(eli));
   6890
   6891	if (megasas_get_seq_num(instance, &eli))
   6892		return -1;
   6893
   6894	/*
   6895	 * Register AEN with FW for latest sequence number plus 1
   6896	 */
   6897	class_locale.members.reserved = 0;
   6898	class_locale.members.locale = MR_EVT_LOCALE_ALL;
   6899	class_locale.members.class = MR_EVT_CLASS_DEBUG;
   6900
   6901	return megasas_register_aen(instance,
   6902			le32_to_cpu(eli.newest_seq_num) + 1,
   6903			class_locale.word);
   6904}
   6905
   6906/**
   6907 * megasas_io_attach -	Attaches this driver to SCSI mid-layer
   6908 * @instance:		Adapter soft state
   6909 */
   6910static int megasas_io_attach(struct megasas_instance *instance)
   6911{
   6912	struct Scsi_Host *host = instance->host;
   6913
   6914	/*
   6915	 * Export parameters required by SCSI mid-layer
   6916	 */
   6917	host->unique_id = instance->unique_id;
   6918	host->can_queue = instance->max_scsi_cmds;
   6919	host->this_id = instance->init_id;
   6920	host->sg_tablesize = instance->max_num_sge;
   6921
   6922	if (instance->fw_support_ieee)
   6923		instance->max_sectors_per_req = MEGASAS_MAX_SECTORS_IEEE;
   6924
   6925	/*
   6926	 * Check if the module parameter value for max_sectors can be used
   6927	 */
   6928	if (max_sectors && max_sectors < instance->max_sectors_per_req)
   6929		instance->max_sectors_per_req = max_sectors;
   6930	else {
   6931		if (max_sectors) {
   6932			if (((instance->pdev->device ==
   6933				PCI_DEVICE_ID_LSI_SAS1078GEN2) ||
   6934				(instance->pdev->device ==
   6935				PCI_DEVICE_ID_LSI_SAS0079GEN2)) &&
   6936				(max_sectors <= MEGASAS_MAX_SECTORS)) {
   6937				instance->max_sectors_per_req = max_sectors;
   6938			} else {
   6939			dev_info(&instance->pdev->dev, "max_sectors should be > 0"
   6940				"and <= %d (or < 1MB for GEN2 controller)\n",
   6941				instance->max_sectors_per_req);
   6942			}
   6943		}
   6944	}
   6945
   6946	host->max_sectors = instance->max_sectors_per_req;
   6947	host->cmd_per_lun = MEGASAS_DEFAULT_CMD_PER_LUN;
   6948	host->max_channel = MEGASAS_MAX_CHANNELS - 1;
   6949	host->max_id = MEGASAS_MAX_DEV_PER_CHANNEL;
   6950	host->max_lun = MEGASAS_MAX_LUN;
   6951	host->max_cmd_len = 16;
   6952
   6953	/* Use shared host tagset only for fusion adaptors
   6954	 * if there are managed interrupts (smp affinity enabled case).
   6955	 * Single msix_vectors in kdump, so shared host tag is also disabled.
   6956	 */
   6957
   6958	host->host_tagset = 0;
   6959	host->nr_hw_queues = 1;
   6960
   6961	if ((instance->adapter_type != MFI_SERIES) &&
   6962		(instance->msix_vectors > instance->low_latency_index_start) &&
   6963		host_tagset_enable &&
   6964		instance->smp_affinity_enable) {
   6965		host->host_tagset = 1;
   6966		host->nr_hw_queues = instance->msix_vectors -
   6967			instance->low_latency_index_start + instance->iopoll_q_count;
   6968		if (instance->iopoll_q_count)
   6969			host->nr_maps = 3;
   6970	} else {
   6971		instance->iopoll_q_count = 0;
   6972	}
   6973
   6974	dev_info(&instance->pdev->dev,
   6975		"Max firmware commands: %d shared with default "
   6976		"hw_queues = %d poll_queues %d\n", instance->max_fw_cmds,
   6977		host->nr_hw_queues - instance->iopoll_q_count,
   6978		instance->iopoll_q_count);
   6979	/*
   6980	 * Notify the mid-layer about the new controller
   6981	 */
   6982	if (scsi_add_host(host, &instance->pdev->dev)) {
   6983		dev_err(&instance->pdev->dev,
   6984			"Failed to add host from %s %d\n",
   6985			__func__, __LINE__);
   6986		return -ENODEV;
   6987	}
   6988
   6989	return 0;
   6990}
   6991
   6992/**
   6993 * megasas_set_dma_mask -	Set DMA mask for supported controllers
   6994 *
   6995 * @instance:		Adapter soft state
   6996 * Description:
   6997 *
   6998 * For Ventura, driver/FW will operate in 63bit DMA addresses.
   6999 *
   7000 * For invader-
   7001 *	By default, driver/FW will operate in 32bit DMA addresses
   7002 *	for consistent DMA mapping but if 32 bit consistent
   7003 *	DMA mask fails, driver will try with 63 bit consistent
   7004 *	mask provided FW is true 63bit DMA capable
   7005 *
   7006 * For older controllers(Thunderbolt and MFI based adapters)-
   7007 *	driver/FW will operate in 32 bit consistent DMA addresses.
   7008 */
   7009static int
   7010megasas_set_dma_mask(struct megasas_instance *instance)
   7011{
   7012	u64 consistent_mask;
   7013	struct pci_dev *pdev;
   7014	u32 scratch_pad_1;
   7015
   7016	pdev = instance->pdev;
   7017	consistent_mask = (instance->adapter_type >= VENTURA_SERIES) ?
   7018				DMA_BIT_MASK(63) : DMA_BIT_MASK(32);
   7019
   7020	if (IS_DMA64) {
   7021		if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(63)) &&
   7022		    dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)))
   7023			goto fail_set_dma_mask;
   7024
   7025		if ((*pdev->dev.dma_mask == DMA_BIT_MASK(63)) &&
   7026		    (dma_set_coherent_mask(&pdev->dev, consistent_mask) &&
   7027		     dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)))) {
   7028			/*
   7029			 * If 32 bit DMA mask fails, then try for 64 bit mask
   7030			 * for FW capable of handling 64 bit DMA.
   7031			 */
   7032			scratch_pad_1 = megasas_readl
   7033				(instance, &instance->reg_set->outbound_scratch_pad_1);
   7034
   7035			if (!(scratch_pad_1 & MR_CAN_HANDLE_64_BIT_DMA_OFFSET))
   7036				goto fail_set_dma_mask;
   7037			else if (dma_set_mask_and_coherent(&pdev->dev,
   7038							   DMA_BIT_MASK(63)))
   7039				goto fail_set_dma_mask;
   7040		}
   7041	} else if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)))
   7042		goto fail_set_dma_mask;
   7043
   7044	if (pdev->dev.coherent_dma_mask == DMA_BIT_MASK(32))
   7045		instance->consistent_mask_64bit = false;
   7046	else
   7047		instance->consistent_mask_64bit = true;
   7048
   7049	dev_info(&pdev->dev, "%s bit DMA mask and %s bit consistent mask\n",
   7050		 ((*pdev->dev.dma_mask == DMA_BIT_MASK(63)) ? "63" : "32"),
   7051		 (instance->consistent_mask_64bit ? "63" : "32"));
   7052
   7053	return 0;
   7054
   7055fail_set_dma_mask:
   7056	dev_err(&pdev->dev, "Failed to set DMA mask\n");
   7057	return -1;
   7058
   7059}
   7060
   7061/*
   7062 * megasas_set_adapter_type -	Set adapter type.
   7063 *				Supported controllers can be divided in
   7064 *				different categories-
   7065 *					enum MR_ADAPTER_TYPE {
   7066 *						MFI_SERIES = 1,
   7067 *						THUNDERBOLT_SERIES = 2,
   7068 *						INVADER_SERIES = 3,
   7069 *						VENTURA_SERIES = 4,
   7070 *						AERO_SERIES = 5,
   7071 *					};
   7072 * @instance:			Adapter soft state
   7073 * return:			void
   7074 */
   7075static inline void megasas_set_adapter_type(struct megasas_instance *instance)
   7076{
   7077	if ((instance->pdev->vendor == PCI_VENDOR_ID_DELL) &&
   7078	    (instance->pdev->device == PCI_DEVICE_ID_DELL_PERC5)) {
   7079		instance->adapter_type = MFI_SERIES;
   7080	} else {
   7081		switch (instance->pdev->device) {
   7082		case PCI_DEVICE_ID_LSI_AERO_10E1:
   7083		case PCI_DEVICE_ID_LSI_AERO_10E2:
   7084		case PCI_DEVICE_ID_LSI_AERO_10E5:
   7085		case PCI_DEVICE_ID_LSI_AERO_10E6:
   7086			instance->adapter_type = AERO_SERIES;
   7087			break;
   7088		case PCI_DEVICE_ID_LSI_VENTURA:
   7089		case PCI_DEVICE_ID_LSI_CRUSADER:
   7090		case PCI_DEVICE_ID_LSI_HARPOON:
   7091		case PCI_DEVICE_ID_LSI_TOMCAT:
   7092		case PCI_DEVICE_ID_LSI_VENTURA_4PORT:
   7093		case PCI_DEVICE_ID_LSI_CRUSADER_4PORT:
   7094			instance->adapter_type = VENTURA_SERIES;
   7095			break;
   7096		case PCI_DEVICE_ID_LSI_FUSION:
   7097		case PCI_DEVICE_ID_LSI_PLASMA:
   7098			instance->adapter_type = THUNDERBOLT_SERIES;
   7099			break;
   7100		case PCI_DEVICE_ID_LSI_INVADER:
   7101		case PCI_DEVICE_ID_LSI_INTRUDER:
   7102		case PCI_DEVICE_ID_LSI_INTRUDER_24:
   7103		case PCI_DEVICE_ID_LSI_CUTLASS_52:
   7104		case PCI_DEVICE_ID_LSI_CUTLASS_53:
   7105		case PCI_DEVICE_ID_LSI_FURY:
   7106			instance->adapter_type = INVADER_SERIES;
   7107			break;
   7108		default: /* For all other supported controllers */
   7109			instance->adapter_type = MFI_SERIES;
   7110			break;
   7111		}
   7112	}
   7113}
   7114
   7115static inline int megasas_alloc_mfi_ctrl_mem(struct megasas_instance *instance)
   7116{
   7117	instance->producer = dma_alloc_coherent(&instance->pdev->dev,
   7118			sizeof(u32), &instance->producer_h, GFP_KERNEL);
   7119	instance->consumer = dma_alloc_coherent(&instance->pdev->dev,
   7120			sizeof(u32), &instance->consumer_h, GFP_KERNEL);
   7121
   7122	if (!instance->producer || !instance->consumer) {
   7123		dev_err(&instance->pdev->dev,
   7124			"Failed to allocate memory for producer, consumer\n");
   7125		return -1;
   7126	}
   7127
   7128	*instance->producer = 0;
   7129	*instance->consumer = 0;
   7130	return 0;
   7131}
   7132
   7133/**
   7134 * megasas_alloc_ctrl_mem -	Allocate per controller memory for core data
   7135 *				structures which are not common across MFI
   7136 *				adapters and fusion adapters.
   7137 *				For MFI based adapters, allocate producer and
   7138 *				consumer buffers. For fusion adapters, allocate
   7139 *				memory for fusion context.
   7140 * @instance:			Adapter soft state
   7141 * return:			0 for SUCCESS
   7142 */
   7143static int megasas_alloc_ctrl_mem(struct megasas_instance *instance)
   7144{
   7145	instance->reply_map = kcalloc(nr_cpu_ids, sizeof(unsigned int),
   7146				      GFP_KERNEL);
   7147	if (!instance->reply_map)
   7148		return -ENOMEM;
   7149
   7150	switch (instance->adapter_type) {
   7151	case MFI_SERIES:
   7152		if (megasas_alloc_mfi_ctrl_mem(instance))
   7153			goto fail;
   7154		break;
   7155	case AERO_SERIES:
   7156	case VENTURA_SERIES:
   7157	case THUNDERBOLT_SERIES:
   7158	case INVADER_SERIES:
   7159		if (megasas_alloc_fusion_context(instance))
   7160			goto fail;
   7161		break;
   7162	}
   7163
   7164	return 0;
   7165 fail:
   7166	kfree(instance->reply_map);
   7167	instance->reply_map = NULL;
   7168	return -ENOMEM;
   7169}
   7170
   7171/*
   7172 * megasas_free_ctrl_mem -	Free fusion context for fusion adapters and
   7173 *				producer, consumer buffers for MFI adapters
   7174 *
   7175 * @instance -			Adapter soft instance
   7176 *
   7177 */
   7178static inline void megasas_free_ctrl_mem(struct megasas_instance *instance)
   7179{
   7180	kfree(instance->reply_map);
   7181	if (instance->adapter_type == MFI_SERIES) {
   7182		if (instance->producer)
   7183			dma_free_coherent(&instance->pdev->dev, sizeof(u32),
   7184					    instance->producer,
   7185					    instance->producer_h);
   7186		if (instance->consumer)
   7187			dma_free_coherent(&instance->pdev->dev, sizeof(u32),
   7188					    instance->consumer,
   7189					    instance->consumer_h);
   7190	} else {
   7191		megasas_free_fusion_context(instance);
   7192	}
   7193}
   7194
   7195/**
   7196 * megasas_alloc_ctrl_dma_buffers -	Allocate consistent DMA buffers during
   7197 *					driver load time
   7198 *
   7199 * @instance:				Adapter soft instance
   7200 *
   7201 * @return:				O for SUCCESS
   7202 */
   7203static inline
   7204int megasas_alloc_ctrl_dma_buffers(struct megasas_instance *instance)
   7205{
   7206	struct pci_dev *pdev = instance->pdev;
   7207	struct fusion_context *fusion = instance->ctrl_context;
   7208
   7209	instance->evt_detail = dma_alloc_coherent(&pdev->dev,
   7210			sizeof(struct megasas_evt_detail),
   7211			&instance->evt_detail_h, GFP_KERNEL);
   7212
   7213	if (!instance->evt_detail) {
   7214		dev_err(&instance->pdev->dev,
   7215			"Failed to allocate event detail buffer\n");
   7216		return -ENOMEM;
   7217	}
   7218
   7219	if (fusion) {
   7220		fusion->ioc_init_request =
   7221			dma_alloc_coherent(&pdev->dev,
   7222					   sizeof(struct MPI2_IOC_INIT_REQUEST),
   7223					   &fusion->ioc_init_request_phys,
   7224					   GFP_KERNEL);
   7225
   7226		if (!fusion->ioc_init_request) {
   7227			dev_err(&pdev->dev,
   7228				"Failed to allocate PD list buffer\n");
   7229			return -ENOMEM;
   7230		}
   7231
   7232		instance->snapdump_prop = dma_alloc_coherent(&pdev->dev,
   7233				sizeof(struct MR_SNAPDUMP_PROPERTIES),
   7234				&instance->snapdump_prop_h, GFP_KERNEL);
   7235
   7236		if (!instance->snapdump_prop)
   7237			dev_err(&pdev->dev,
   7238				"Failed to allocate snapdump properties buffer\n");
   7239
   7240		instance->host_device_list_buf = dma_alloc_coherent(&pdev->dev,
   7241							HOST_DEVICE_LIST_SZ,
   7242							&instance->host_device_list_buf_h,
   7243							GFP_KERNEL);
   7244
   7245		if (!instance->host_device_list_buf) {
   7246			dev_err(&pdev->dev,
   7247				"Failed to allocate targetid list buffer\n");
   7248			return -ENOMEM;
   7249		}
   7250
   7251	}
   7252
   7253	instance->pd_list_buf =
   7254		dma_alloc_coherent(&pdev->dev,
   7255				     MEGASAS_MAX_PD * sizeof(struct MR_PD_LIST),
   7256				     &instance->pd_list_buf_h, GFP_KERNEL);
   7257
   7258	if (!instance->pd_list_buf) {
   7259		dev_err(&pdev->dev, "Failed to allocate PD list buffer\n");
   7260		return -ENOMEM;
   7261	}
   7262
   7263	instance->ctrl_info_buf =
   7264		dma_alloc_coherent(&pdev->dev,
   7265				     sizeof(struct megasas_ctrl_info),
   7266				     &instance->ctrl_info_buf_h, GFP_KERNEL);
   7267
   7268	if (!instance->ctrl_info_buf) {
   7269		dev_err(&pdev->dev,
   7270			"Failed to allocate controller info buffer\n");
   7271		return -ENOMEM;
   7272	}
   7273
   7274	instance->ld_list_buf =
   7275		dma_alloc_coherent(&pdev->dev,
   7276				     sizeof(struct MR_LD_LIST),
   7277				     &instance->ld_list_buf_h, GFP_KERNEL);
   7278
   7279	if (!instance->ld_list_buf) {
   7280		dev_err(&pdev->dev, "Failed to allocate LD list buffer\n");
   7281		return -ENOMEM;
   7282	}
   7283
   7284	instance->ld_targetid_list_buf =
   7285		dma_alloc_coherent(&pdev->dev,
   7286				sizeof(struct MR_LD_TARGETID_LIST),
   7287				&instance->ld_targetid_list_buf_h, GFP_KERNEL);
   7288
   7289	if (!instance->ld_targetid_list_buf) {
   7290		dev_err(&pdev->dev,
   7291			"Failed to allocate LD targetid list buffer\n");
   7292		return -ENOMEM;
   7293	}
   7294
   7295	if (!reset_devices) {
   7296		instance->system_info_buf =
   7297			dma_alloc_coherent(&pdev->dev,
   7298					sizeof(struct MR_DRV_SYSTEM_INFO),
   7299					&instance->system_info_h, GFP_KERNEL);
   7300		instance->pd_info =
   7301			dma_alloc_coherent(&pdev->dev,
   7302					sizeof(struct MR_PD_INFO),
   7303					&instance->pd_info_h, GFP_KERNEL);
   7304		instance->tgt_prop =
   7305			dma_alloc_coherent(&pdev->dev,
   7306					sizeof(struct MR_TARGET_PROPERTIES),
   7307					&instance->tgt_prop_h, GFP_KERNEL);
   7308		instance->crash_dump_buf =
   7309			dma_alloc_coherent(&pdev->dev, CRASH_DMA_BUF_SIZE,
   7310					&instance->crash_dump_h, GFP_KERNEL);
   7311
   7312		if (!instance->system_info_buf)
   7313			dev_err(&instance->pdev->dev,
   7314				"Failed to allocate system info buffer\n");
   7315
   7316		if (!instance->pd_info)
   7317			dev_err(&instance->pdev->dev,
   7318				"Failed to allocate pd_info buffer\n");
   7319
   7320		if (!instance->tgt_prop)
   7321			dev_err(&instance->pdev->dev,
   7322				"Failed to allocate tgt_prop buffer\n");
   7323
   7324		if (!instance->crash_dump_buf)
   7325			dev_err(&instance->pdev->dev,
   7326				"Failed to allocate crash dump buffer\n");
   7327	}
   7328
   7329	return 0;
   7330}
   7331
   7332/*
   7333 * megasas_free_ctrl_dma_buffers -	Free consistent DMA buffers allocated
   7334 *					during driver load time
   7335 *
   7336 * @instance-				Adapter soft instance
   7337 *
   7338 */
   7339static inline
   7340void megasas_free_ctrl_dma_buffers(struct megasas_instance *instance)
   7341{
   7342	struct pci_dev *pdev = instance->pdev;
   7343	struct fusion_context *fusion = instance->ctrl_context;
   7344
   7345	if (instance->evt_detail)
   7346		dma_free_coherent(&pdev->dev, sizeof(struct megasas_evt_detail),
   7347				    instance->evt_detail,
   7348				    instance->evt_detail_h);
   7349
   7350	if (fusion && fusion->ioc_init_request)
   7351		dma_free_coherent(&pdev->dev,
   7352				  sizeof(struct MPI2_IOC_INIT_REQUEST),
   7353				  fusion->ioc_init_request,
   7354				  fusion->ioc_init_request_phys);
   7355
   7356	if (instance->pd_list_buf)
   7357		dma_free_coherent(&pdev->dev,
   7358				    MEGASAS_MAX_PD * sizeof(struct MR_PD_LIST),
   7359				    instance->pd_list_buf,
   7360				    instance->pd_list_buf_h);
   7361
   7362	if (instance->ld_list_buf)
   7363		dma_free_coherent(&pdev->dev, sizeof(struct MR_LD_LIST),
   7364				    instance->ld_list_buf,
   7365				    instance->ld_list_buf_h);
   7366
   7367	if (instance->ld_targetid_list_buf)
   7368		dma_free_coherent(&pdev->dev, sizeof(struct MR_LD_TARGETID_LIST),
   7369				    instance->ld_targetid_list_buf,
   7370				    instance->ld_targetid_list_buf_h);
   7371
   7372	if (instance->ctrl_info_buf)
   7373		dma_free_coherent(&pdev->dev, sizeof(struct megasas_ctrl_info),
   7374				    instance->ctrl_info_buf,
   7375				    instance->ctrl_info_buf_h);
   7376
   7377	if (instance->system_info_buf)
   7378		dma_free_coherent(&pdev->dev, sizeof(struct MR_DRV_SYSTEM_INFO),
   7379				    instance->system_info_buf,
   7380				    instance->system_info_h);
   7381
   7382	if (instance->pd_info)
   7383		dma_free_coherent(&pdev->dev, sizeof(struct MR_PD_INFO),
   7384				    instance->pd_info, instance->pd_info_h);
   7385
   7386	if (instance->tgt_prop)
   7387		dma_free_coherent(&pdev->dev, sizeof(struct MR_TARGET_PROPERTIES),
   7388				    instance->tgt_prop, instance->tgt_prop_h);
   7389
   7390	if (instance->crash_dump_buf)
   7391		dma_free_coherent(&pdev->dev, CRASH_DMA_BUF_SIZE,
   7392				    instance->crash_dump_buf,
   7393				    instance->crash_dump_h);
   7394
   7395	if (instance->snapdump_prop)
   7396		dma_free_coherent(&pdev->dev,
   7397				  sizeof(struct MR_SNAPDUMP_PROPERTIES),
   7398				  instance->snapdump_prop,
   7399				  instance->snapdump_prop_h);
   7400
   7401	if (instance->host_device_list_buf)
   7402		dma_free_coherent(&pdev->dev,
   7403				  HOST_DEVICE_LIST_SZ,
   7404				  instance->host_device_list_buf,
   7405				  instance->host_device_list_buf_h);
   7406
   7407}
   7408
   7409/*
   7410 * megasas_init_ctrl_params -		Initialize controller's instance
   7411 *					parameters before FW init
   7412 * @instance -				Adapter soft instance
   7413 * @return -				void
   7414 */
   7415static inline void megasas_init_ctrl_params(struct megasas_instance *instance)
   7416{
   7417	instance->fw_crash_state = UNAVAILABLE;
   7418
   7419	megasas_poll_wait_aen = 0;
   7420	instance->issuepend_done = 1;
   7421	atomic_set(&instance->adprecovery, MEGASAS_HBA_OPERATIONAL);
   7422
   7423	/*
   7424	 * Initialize locks and queues
   7425	 */
   7426	INIT_LIST_HEAD(&instance->cmd_pool);
   7427	INIT_LIST_HEAD(&instance->internal_reset_pending_q);
   7428
   7429	atomic_set(&instance->fw_outstanding, 0);
   7430	atomic64_set(&instance->total_io_count, 0);
   7431
   7432	init_waitqueue_head(&instance->int_cmd_wait_q);
   7433	init_waitqueue_head(&instance->abort_cmd_wait_q);
   7434
   7435	spin_lock_init(&instance->crashdump_lock);
   7436	spin_lock_init(&instance->mfi_pool_lock);
   7437	spin_lock_init(&instance->hba_lock);
   7438	spin_lock_init(&instance->stream_lock);
   7439	spin_lock_init(&instance->completion_lock);
   7440
   7441	mutex_init(&instance->reset_mutex);
   7442
   7443	if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
   7444	    (instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0071SKINNY))
   7445		instance->flag_ieee = 1;
   7446
   7447	megasas_dbg_lvl = 0;
   7448	instance->flag = 0;
   7449	instance->unload = 1;
   7450	instance->last_time = 0;
   7451	instance->disableOnlineCtrlReset = 1;
   7452	instance->UnevenSpanSupport = 0;
   7453	instance->smp_affinity_enable = smp_affinity_enable ? true : false;
   7454	instance->msix_load_balance = false;
   7455
   7456	if (instance->adapter_type != MFI_SERIES)
   7457		INIT_WORK(&instance->work_init, megasas_fusion_ocr_wq);
   7458	else
   7459		INIT_WORK(&instance->work_init, process_fw_state_change_wq);
   7460}
   7461
   7462/**
   7463 * megasas_probe_one -	PCI hotplug entry point
   7464 * @pdev:		PCI device structure
   7465 * @id:			PCI ids of supported hotplugged adapter
   7466 */
   7467static int megasas_probe_one(struct pci_dev *pdev,
   7468			     const struct pci_device_id *id)
   7469{
   7470	int rval, pos;
   7471	struct Scsi_Host *host;
   7472	struct megasas_instance *instance;
   7473	u16 control = 0;
   7474
   7475	switch (pdev->device) {
   7476	case PCI_DEVICE_ID_LSI_AERO_10E0:
   7477	case PCI_DEVICE_ID_LSI_AERO_10E3:
   7478	case PCI_DEVICE_ID_LSI_AERO_10E4:
   7479	case PCI_DEVICE_ID_LSI_AERO_10E7:
   7480		dev_err(&pdev->dev, "Adapter is in non secure mode\n");
   7481		return 1;
   7482	case PCI_DEVICE_ID_LSI_AERO_10E1:
   7483	case PCI_DEVICE_ID_LSI_AERO_10E5:
   7484		dev_info(&pdev->dev, "Adapter is in configurable secure mode\n");
   7485		break;
   7486	}
   7487
   7488	/* Reset MSI-X in the kdump kernel */
   7489	if (reset_devices) {
   7490		pos = pci_find_capability(pdev, PCI_CAP_ID_MSIX);
   7491		if (pos) {
   7492			pci_read_config_word(pdev, pos + PCI_MSIX_FLAGS,
   7493					     &control);
   7494			if (control & PCI_MSIX_FLAGS_ENABLE) {
   7495				dev_info(&pdev->dev, "resetting MSI-X\n");
   7496				pci_write_config_word(pdev,
   7497						      pos + PCI_MSIX_FLAGS,
   7498						      control &
   7499						      ~PCI_MSIX_FLAGS_ENABLE);
   7500			}
   7501		}
   7502	}
   7503
   7504	/*
   7505	 * PCI prepping: enable device set bus mastering and dma mask
   7506	 */
   7507	rval = pci_enable_device_mem(pdev);
   7508
   7509	if (rval) {
   7510		return rval;
   7511	}
   7512
   7513	pci_set_master(pdev);
   7514
   7515	host = scsi_host_alloc(&megasas_template,
   7516			       sizeof(struct megasas_instance));
   7517
   7518	if (!host) {
   7519		dev_printk(KERN_DEBUG, &pdev->dev, "scsi_host_alloc failed\n");
   7520		goto fail_alloc_instance;
   7521	}
   7522
   7523	instance = (struct megasas_instance *)host->hostdata;
   7524	memset(instance, 0, sizeof(*instance));
   7525	atomic_set(&instance->fw_reset_no_pci_access, 0);
   7526
   7527	/*
   7528	 * Initialize PCI related and misc parameters
   7529	 */
   7530	instance->pdev = pdev;
   7531	instance->host = host;
   7532	instance->unique_id = pdev->bus->number << 8 | pdev->devfn;
   7533	instance->init_id = MEGASAS_DEFAULT_INIT_ID;
   7534
   7535	megasas_set_adapter_type(instance);
   7536
   7537	/*
   7538	 * Initialize MFI Firmware
   7539	 */
   7540	if (megasas_init_fw(instance))
   7541		goto fail_init_mfi;
   7542
   7543	if (instance->requestorId) {
   7544		if (instance->PlasmaFW111) {
   7545			instance->vf_affiliation_111 =
   7546				dma_alloc_coherent(&pdev->dev,
   7547					sizeof(struct MR_LD_VF_AFFILIATION_111),
   7548					&instance->vf_affiliation_111_h,
   7549					GFP_KERNEL);
   7550			if (!instance->vf_affiliation_111)
   7551				dev_warn(&pdev->dev, "Can't allocate "
   7552				       "memory for VF affiliation buffer\n");
   7553		} else {
   7554			instance->vf_affiliation =
   7555				dma_alloc_coherent(&pdev->dev,
   7556					(MAX_LOGICAL_DRIVES + 1) *
   7557					sizeof(struct MR_LD_VF_AFFILIATION),
   7558					&instance->vf_affiliation_h,
   7559					GFP_KERNEL);
   7560			if (!instance->vf_affiliation)
   7561				dev_warn(&pdev->dev, "Can't allocate "
   7562				       "memory for VF affiliation buffer\n");
   7563		}
   7564	}
   7565
   7566	/*
   7567	 * Store instance in PCI softstate
   7568	 */
   7569	pci_set_drvdata(pdev, instance);
   7570
   7571	/*
   7572	 * Add this controller to megasas_mgmt_info structure so that it
   7573	 * can be exported to management applications
   7574	 */
   7575	megasas_mgmt_info.count++;
   7576	megasas_mgmt_info.instance[megasas_mgmt_info.max_index] = instance;
   7577	megasas_mgmt_info.max_index++;
   7578
   7579	/*
   7580	 * Register with SCSI mid-layer
   7581	 */
   7582	if (megasas_io_attach(instance))
   7583		goto fail_io_attach;
   7584
   7585	instance->unload = 0;
   7586	/*
   7587	 * Trigger SCSI to scan our drives
   7588	 */
   7589	if (!instance->enable_fw_dev_list ||
   7590	    (instance->host_device_list_buf->count > 0))
   7591		scsi_scan_host(host);
   7592
   7593	/*
   7594	 * Initiate AEN (Asynchronous Event Notification)
   7595	 */
   7596	if (megasas_start_aen(instance)) {
   7597		dev_printk(KERN_DEBUG, &pdev->dev, "start aen failed\n");
   7598		goto fail_start_aen;
   7599	}
   7600
   7601	megasas_setup_debugfs(instance);
   7602
   7603	/* Get current SR-IOV LD/VF affiliation */
   7604	if (instance->requestorId)
   7605		megasas_get_ld_vf_affiliation(instance, 1);
   7606
   7607	return 0;
   7608
   7609fail_start_aen:
   7610	instance->unload = 1;
   7611	scsi_remove_host(instance->host);
   7612fail_io_attach:
   7613	megasas_mgmt_info.count--;
   7614	megasas_mgmt_info.max_index--;
   7615	megasas_mgmt_info.instance[megasas_mgmt_info.max_index] = NULL;
   7616
   7617	if (instance->requestorId && !instance->skip_heartbeat_timer_del)
   7618		del_timer_sync(&instance->sriov_heartbeat_timer);
   7619
   7620	instance->instancet->disable_intr(instance);
   7621	megasas_destroy_irqs(instance);
   7622
   7623	if (instance->adapter_type != MFI_SERIES)
   7624		megasas_release_fusion(instance);
   7625	else
   7626		megasas_release_mfi(instance);
   7627
   7628	if (instance->msix_vectors)
   7629		pci_free_irq_vectors(instance->pdev);
   7630	instance->msix_vectors = 0;
   7631
   7632	if (instance->fw_crash_state != UNAVAILABLE)
   7633		megasas_free_host_crash_buffer(instance);
   7634
   7635	if (instance->adapter_type != MFI_SERIES)
   7636		megasas_fusion_stop_watchdog(instance);
   7637fail_init_mfi:
   7638	scsi_host_put(host);
   7639fail_alloc_instance:
   7640	pci_disable_device(pdev);
   7641
   7642	return -ENODEV;
   7643}
   7644
   7645/**
   7646 * megasas_flush_cache -	Requests FW to flush all its caches
   7647 * @instance:			Adapter soft state
   7648 */
   7649static void megasas_flush_cache(struct megasas_instance *instance)
   7650{
   7651	struct megasas_cmd *cmd;
   7652	struct megasas_dcmd_frame *dcmd;
   7653
   7654	if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR)
   7655		return;
   7656
   7657	cmd = megasas_get_cmd(instance);
   7658
   7659	if (!cmd)
   7660		return;
   7661
   7662	dcmd = &cmd->frame->dcmd;
   7663
   7664	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
   7665
   7666	dcmd->cmd = MFI_CMD_DCMD;
   7667	dcmd->cmd_status = 0x0;
   7668	dcmd->sge_count = 0;
   7669	dcmd->flags = cpu_to_le16(MFI_FRAME_DIR_NONE);
   7670	dcmd->timeout = 0;
   7671	dcmd->pad_0 = 0;
   7672	dcmd->data_xfer_len = 0;
   7673	dcmd->opcode = cpu_to_le32(MR_DCMD_CTRL_CACHE_FLUSH);
   7674	dcmd->mbox.b[0] = MR_FLUSH_CTRL_CACHE | MR_FLUSH_DISK_CACHE;
   7675
   7676	if (megasas_issue_blocked_cmd(instance, cmd, MFI_IO_TIMEOUT_SECS)
   7677			!= DCMD_SUCCESS) {
   7678		dev_err(&instance->pdev->dev,
   7679			"return from %s %d\n", __func__, __LINE__);
   7680		return;
   7681	}
   7682
   7683	megasas_return_cmd(instance, cmd);
   7684}
   7685
   7686/**
   7687 * megasas_shutdown_controller -	Instructs FW to shutdown the controller
   7688 * @instance:				Adapter soft state
   7689 * @opcode:				Shutdown/Hibernate
   7690 */
   7691static void megasas_shutdown_controller(struct megasas_instance *instance,
   7692					u32 opcode)
   7693{
   7694	struct megasas_cmd *cmd;
   7695	struct megasas_dcmd_frame *dcmd;
   7696
   7697	if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR)
   7698		return;
   7699
   7700	cmd = megasas_get_cmd(instance);
   7701
   7702	if (!cmd)
   7703		return;
   7704
   7705	if (instance->aen_cmd)
   7706		megasas_issue_blocked_abort_cmd(instance,
   7707			instance->aen_cmd, MFI_IO_TIMEOUT_SECS);
   7708	if (instance->map_update_cmd)
   7709		megasas_issue_blocked_abort_cmd(instance,
   7710			instance->map_update_cmd, MFI_IO_TIMEOUT_SECS);
   7711	if (instance->jbod_seq_cmd)
   7712		megasas_issue_blocked_abort_cmd(instance,
   7713			instance->jbod_seq_cmd, MFI_IO_TIMEOUT_SECS);
   7714
   7715	dcmd = &cmd->frame->dcmd;
   7716
   7717	memset(dcmd->mbox.b, 0, MFI_MBOX_SIZE);
   7718
   7719	dcmd->cmd = MFI_CMD_DCMD;
   7720	dcmd->cmd_status = 0x0;
   7721	dcmd->sge_count = 0;
   7722	dcmd->flags = cpu_to_le16(MFI_FRAME_DIR_NONE);
   7723	dcmd->timeout = 0;
   7724	dcmd->pad_0 = 0;
   7725	dcmd->data_xfer_len = 0;
   7726	dcmd->opcode = cpu_to_le32(opcode);
   7727
   7728	if (megasas_issue_blocked_cmd(instance, cmd, MFI_IO_TIMEOUT_SECS)
   7729			!= DCMD_SUCCESS) {
   7730		dev_err(&instance->pdev->dev,
   7731			"return from %s %d\n", __func__, __LINE__);
   7732		return;
   7733	}
   7734
   7735	megasas_return_cmd(instance, cmd);
   7736}
   7737
   7738/**
   7739 * megasas_suspend -	driver suspend entry point
   7740 * @dev:		Device structure
   7741 */
   7742static int __maybe_unused
   7743megasas_suspend(struct device *dev)
   7744{
   7745	struct megasas_instance *instance;
   7746
   7747	instance = dev_get_drvdata(dev);
   7748
   7749	if (!instance)
   7750		return 0;
   7751
   7752	instance->unload = 1;
   7753
   7754	dev_info(dev, "%s is called\n", __func__);
   7755
   7756	/* Shutdown SR-IOV heartbeat timer */
   7757	if (instance->requestorId && !instance->skip_heartbeat_timer_del)
   7758		del_timer_sync(&instance->sriov_heartbeat_timer);
   7759
   7760	/* Stop the FW fault detection watchdog */
   7761	if (instance->adapter_type != MFI_SERIES)
   7762		megasas_fusion_stop_watchdog(instance);
   7763
   7764	megasas_flush_cache(instance);
   7765	megasas_shutdown_controller(instance, MR_DCMD_HIBERNATE_SHUTDOWN);
   7766
   7767	/* cancel the delayed work if this work still in queue */
   7768	if (instance->ev != NULL) {
   7769		struct megasas_aen_event *ev = instance->ev;
   7770		cancel_delayed_work_sync(&ev->hotplug_work);
   7771		instance->ev = NULL;
   7772	}
   7773
   7774	tasklet_kill(&instance->isr_tasklet);
   7775
   7776	pci_set_drvdata(instance->pdev, instance);
   7777	instance->instancet->disable_intr(instance);
   7778
   7779	megasas_destroy_irqs(instance);
   7780
   7781	if (instance->msix_vectors)
   7782		pci_free_irq_vectors(instance->pdev);
   7783
   7784	return 0;
   7785}
   7786
   7787/**
   7788 * megasas_resume-      driver resume entry point
   7789 * @dev:		Device structure
   7790 */
   7791static int __maybe_unused
   7792megasas_resume(struct device *dev)
   7793{
   7794	int rval;
   7795	struct Scsi_Host *host;
   7796	struct megasas_instance *instance;
   7797	u32 status_reg;
   7798
   7799	instance = dev_get_drvdata(dev);
   7800
   7801	if (!instance)
   7802		return 0;
   7803
   7804	host = instance->host;
   7805
   7806	dev_info(dev, "%s is called\n", __func__);
   7807
   7808	/*
   7809	 * We expect the FW state to be READY
   7810	 */
   7811
   7812	if (megasas_transition_to_ready(instance, 0)) {
   7813		dev_info(&instance->pdev->dev,
   7814			 "Failed to transition controller to ready from %s!\n",
   7815			 __func__);
   7816		if (instance->adapter_type != MFI_SERIES) {
   7817			status_reg =
   7818				instance->instancet->read_fw_status_reg(instance);
   7819			if (!(status_reg & MFI_RESET_ADAPTER) ||
   7820				((megasas_adp_reset_wait_for_ready
   7821				(instance, true, 0)) == FAILED))
   7822				goto fail_ready_state;
   7823		} else {
   7824			atomic_set(&instance->fw_reset_no_pci_access, 1);
   7825			instance->instancet->adp_reset
   7826				(instance, instance->reg_set);
   7827			atomic_set(&instance->fw_reset_no_pci_access, 0);
   7828
   7829			/* waiting for about 30 seconds before retry */
   7830			ssleep(30);
   7831
   7832			if (megasas_transition_to_ready(instance, 0))
   7833				goto fail_ready_state;
   7834		}
   7835
   7836		dev_info(&instance->pdev->dev,
   7837			 "FW restarted successfully from %s!\n",
   7838			 __func__);
   7839	}
   7840	if (megasas_set_dma_mask(instance))
   7841		goto fail_set_dma_mask;
   7842
   7843	/*
   7844	 * Initialize MFI Firmware
   7845	 */
   7846
   7847	atomic_set(&instance->fw_outstanding, 0);
   7848	atomic_set(&instance->ldio_outstanding, 0);
   7849
   7850	/* Now re-enable MSI-X */
   7851	if (instance->msix_vectors)
   7852		megasas_alloc_irq_vectors(instance);
   7853
   7854	if (!instance->msix_vectors) {
   7855		rval = pci_alloc_irq_vectors(instance->pdev, 1, 1,
   7856					     PCI_IRQ_LEGACY);
   7857		if (rval < 0)
   7858			goto fail_reenable_msix;
   7859	}
   7860
   7861	megasas_setup_reply_map(instance);
   7862
   7863	if (instance->adapter_type != MFI_SERIES) {
   7864		megasas_reset_reply_desc(instance);
   7865		if (megasas_ioc_init_fusion(instance)) {
   7866			megasas_free_cmds(instance);
   7867			megasas_free_cmds_fusion(instance);
   7868			goto fail_init_mfi;
   7869		}
   7870		if (!megasas_get_map_info(instance))
   7871			megasas_sync_map_info(instance);
   7872	} else {
   7873		*instance->producer = 0;
   7874		*instance->consumer = 0;
   7875		if (megasas_issue_init_mfi(instance))
   7876			goto fail_init_mfi;
   7877	}
   7878
   7879	if (megasas_get_ctrl_info(instance) != DCMD_SUCCESS)
   7880		goto fail_init_mfi;
   7881
   7882	tasklet_init(&instance->isr_tasklet, instance->instancet->tasklet,
   7883		     (unsigned long)instance);
   7884
   7885	if (instance->msix_vectors ?
   7886			megasas_setup_irqs_msix(instance, 0) :
   7887			megasas_setup_irqs_ioapic(instance))
   7888		goto fail_init_mfi;
   7889
   7890	if (instance->adapter_type != MFI_SERIES)
   7891		megasas_setup_irq_poll(instance);
   7892
   7893	/* Re-launch SR-IOV heartbeat timer */
   7894	if (instance->requestorId) {
   7895		if (!megasas_sriov_start_heartbeat(instance, 0))
   7896			megasas_start_timer(instance);
   7897		else {
   7898			instance->skip_heartbeat_timer_del = 1;
   7899			goto fail_init_mfi;
   7900		}
   7901	}
   7902
   7903	instance->instancet->enable_intr(instance);
   7904	megasas_setup_jbod_map(instance);
   7905	instance->unload = 0;
   7906
   7907	/*
   7908	 * Initiate AEN (Asynchronous Event Notification)
   7909	 */
   7910	if (megasas_start_aen(instance))
   7911		dev_err(&instance->pdev->dev, "Start AEN failed\n");
   7912
   7913	/* Re-launch FW fault watchdog */
   7914	if (instance->adapter_type != MFI_SERIES)
   7915		if (megasas_fusion_start_watchdog(instance) != SUCCESS)
   7916			goto fail_start_watchdog;
   7917
   7918	return 0;
   7919
   7920fail_start_watchdog:
   7921	if (instance->requestorId && !instance->skip_heartbeat_timer_del)
   7922		del_timer_sync(&instance->sriov_heartbeat_timer);
   7923fail_init_mfi:
   7924	megasas_free_ctrl_dma_buffers(instance);
   7925	megasas_free_ctrl_mem(instance);
   7926	scsi_host_put(host);
   7927
   7928fail_reenable_msix:
   7929fail_set_dma_mask:
   7930fail_ready_state:
   7931
   7932	return -ENODEV;
   7933}
   7934
   7935static inline int
   7936megasas_wait_for_adapter_operational(struct megasas_instance *instance)
   7937{
   7938	int wait_time = MEGASAS_RESET_WAIT_TIME * 2;
   7939	int i;
   7940	u8 adp_state;
   7941
   7942	for (i = 0; i < wait_time; i++) {
   7943		adp_state = atomic_read(&instance->adprecovery);
   7944		if ((adp_state == MEGASAS_HBA_OPERATIONAL) ||
   7945		    (adp_state == MEGASAS_HW_CRITICAL_ERROR))
   7946			break;
   7947
   7948		if (!(i % MEGASAS_RESET_NOTICE_INTERVAL))
   7949			dev_notice(&instance->pdev->dev, "waiting for controller reset to finish\n");
   7950
   7951		msleep(1000);
   7952	}
   7953
   7954	if (adp_state != MEGASAS_HBA_OPERATIONAL) {
   7955		dev_info(&instance->pdev->dev,
   7956			 "%s HBA failed to become operational, adp_state %d\n",
   7957			 __func__, adp_state);
   7958		return 1;
   7959	}
   7960
   7961	return 0;
   7962}
   7963
   7964/**
   7965 * megasas_detach_one -	PCI hot"un"plug entry point
   7966 * @pdev:		PCI device structure
   7967 */
   7968static void megasas_detach_one(struct pci_dev *pdev)
   7969{
   7970	int i;
   7971	struct Scsi_Host *host;
   7972	struct megasas_instance *instance;
   7973	struct fusion_context *fusion;
   7974	u32 pd_seq_map_sz;
   7975
   7976	instance = pci_get_drvdata(pdev);
   7977
   7978	if (!instance)
   7979		return;
   7980
   7981	host = instance->host;
   7982	fusion = instance->ctrl_context;
   7983
   7984	/* Shutdown SR-IOV heartbeat timer */
   7985	if (instance->requestorId && !instance->skip_heartbeat_timer_del)
   7986		del_timer_sync(&instance->sriov_heartbeat_timer);
   7987
   7988	/* Stop the FW fault detection watchdog */
   7989	if (instance->adapter_type != MFI_SERIES)
   7990		megasas_fusion_stop_watchdog(instance);
   7991
   7992	if (instance->fw_crash_state != UNAVAILABLE)
   7993		megasas_free_host_crash_buffer(instance);
   7994	scsi_remove_host(instance->host);
   7995	instance->unload = 1;
   7996
   7997	if (megasas_wait_for_adapter_operational(instance))
   7998		goto skip_firing_dcmds;
   7999
   8000	megasas_flush_cache(instance);
   8001	megasas_shutdown_controller(instance, MR_DCMD_CTRL_SHUTDOWN);
   8002
   8003skip_firing_dcmds:
   8004	/* cancel the delayed work if this work still in queue*/
   8005	if (instance->ev != NULL) {
   8006		struct megasas_aen_event *ev = instance->ev;
   8007		cancel_delayed_work_sync(&ev->hotplug_work);
   8008		instance->ev = NULL;
   8009	}
   8010
   8011	/* cancel all wait events */
   8012	wake_up_all(&instance->int_cmd_wait_q);
   8013
   8014	tasklet_kill(&instance->isr_tasklet);
   8015
   8016	/*
   8017	 * Take the instance off the instance array. Note that we will not
   8018	 * decrement the max_index. We let this array be sparse array
   8019	 */
   8020	for (i = 0; i < megasas_mgmt_info.max_index; i++) {
   8021		if (megasas_mgmt_info.instance[i] == instance) {
   8022			megasas_mgmt_info.count--;
   8023			megasas_mgmt_info.instance[i] = NULL;
   8024
   8025			break;
   8026		}
   8027	}
   8028
   8029	instance->instancet->disable_intr(instance);
   8030
   8031	megasas_destroy_irqs(instance);
   8032
   8033	if (instance->msix_vectors)
   8034		pci_free_irq_vectors(instance->pdev);
   8035
   8036	if (instance->adapter_type >= VENTURA_SERIES) {
   8037		for (i = 0; i < MAX_LOGICAL_DRIVES_EXT; ++i)
   8038			kfree(fusion->stream_detect_by_ld[i]);
   8039		kfree(fusion->stream_detect_by_ld);
   8040		fusion->stream_detect_by_ld = NULL;
   8041	}
   8042
   8043
   8044	if (instance->adapter_type != MFI_SERIES) {
   8045		megasas_release_fusion(instance);
   8046		pd_seq_map_sz = sizeof(struct MR_PD_CFG_SEQ_NUM_SYNC) +
   8047				(sizeof(struct MR_PD_CFG_SEQ) *
   8048					(MAX_PHYSICAL_DEVICES - 1));
   8049		for (i = 0; i < 2 ; i++) {
   8050			if (fusion->ld_map[i])
   8051				dma_free_coherent(&instance->pdev->dev,
   8052						  fusion->max_map_sz,
   8053						  fusion->ld_map[i],
   8054						  fusion->ld_map_phys[i]);
   8055			if (fusion->ld_drv_map[i]) {
   8056				if (is_vmalloc_addr(fusion->ld_drv_map[i]))
   8057					vfree(fusion->ld_drv_map[i]);
   8058				else
   8059					free_pages((ulong)fusion->ld_drv_map[i],
   8060						   fusion->drv_map_pages);
   8061			}
   8062
   8063			if (fusion->pd_seq_sync[i])
   8064				dma_free_coherent(&instance->pdev->dev,
   8065					pd_seq_map_sz,
   8066					fusion->pd_seq_sync[i],
   8067					fusion->pd_seq_phys[i]);
   8068		}
   8069	} else {
   8070		megasas_release_mfi(instance);
   8071	}
   8072
   8073	if (instance->vf_affiliation)
   8074		dma_free_coherent(&pdev->dev, (MAX_LOGICAL_DRIVES + 1) *
   8075				    sizeof(struct MR_LD_VF_AFFILIATION),
   8076				    instance->vf_affiliation,
   8077				    instance->vf_affiliation_h);
   8078
   8079	if (instance->vf_affiliation_111)
   8080		dma_free_coherent(&pdev->dev,
   8081				    sizeof(struct MR_LD_VF_AFFILIATION_111),
   8082				    instance->vf_affiliation_111,
   8083				    instance->vf_affiliation_111_h);
   8084
   8085	if (instance->hb_host_mem)
   8086		dma_free_coherent(&pdev->dev, sizeof(struct MR_CTRL_HB_HOST_MEM),
   8087				    instance->hb_host_mem,
   8088				    instance->hb_host_mem_h);
   8089
   8090	megasas_free_ctrl_dma_buffers(instance);
   8091
   8092	megasas_free_ctrl_mem(instance);
   8093
   8094	megasas_destroy_debugfs(instance);
   8095
   8096	scsi_host_put(host);
   8097
   8098	pci_disable_device(pdev);
   8099}
   8100
   8101/**
   8102 * megasas_shutdown -	Shutdown entry point
   8103 * @pdev:		PCI device structure
   8104 */
   8105static void megasas_shutdown(struct pci_dev *pdev)
   8106{
   8107	struct megasas_instance *instance = pci_get_drvdata(pdev);
   8108
   8109	if (!instance)
   8110		return;
   8111
   8112	instance->unload = 1;
   8113
   8114	if (megasas_wait_for_adapter_operational(instance))
   8115		goto skip_firing_dcmds;
   8116
   8117	megasas_flush_cache(instance);
   8118	megasas_shutdown_controller(instance, MR_DCMD_CTRL_SHUTDOWN);
   8119
   8120skip_firing_dcmds:
   8121	instance->instancet->disable_intr(instance);
   8122	megasas_destroy_irqs(instance);
   8123
   8124	if (instance->msix_vectors)
   8125		pci_free_irq_vectors(instance->pdev);
   8126}
   8127
   8128/*
   8129 * megasas_mgmt_open -	char node "open" entry point
   8130 * @inode:	char node inode
   8131 * @filep:	char node file
   8132 */
   8133static int megasas_mgmt_open(struct inode *inode, struct file *filep)
   8134{
   8135	/*
   8136	 * Allow only those users with admin rights
   8137	 */
   8138	if (!capable(CAP_SYS_ADMIN))
   8139		return -EACCES;
   8140
   8141	return 0;
   8142}
   8143
   8144/*
   8145 * megasas_mgmt_fasync -	Async notifier registration from applications
   8146 * @fd:		char node file descriptor number
   8147 * @filep:	char node file
   8148 * @mode:	notifier on/off
   8149 *
   8150 * This function adds the calling process to a driver global queue. When an
   8151 * event occurs, SIGIO will be sent to all processes in this queue.
   8152 */
   8153static int megasas_mgmt_fasync(int fd, struct file *filep, int mode)
   8154{
   8155	int rc;
   8156
   8157	mutex_lock(&megasas_async_queue_mutex);
   8158
   8159	rc = fasync_helper(fd, filep, mode, &megasas_async_queue);
   8160
   8161	mutex_unlock(&megasas_async_queue_mutex);
   8162
   8163	if (rc >= 0) {
   8164		/* For sanity check when we get ioctl */
   8165		filep->private_data = filep;
   8166		return 0;
   8167	}
   8168
   8169	printk(KERN_DEBUG "megasas: fasync_helper failed [%d]\n", rc);
   8170
   8171	return rc;
   8172}
   8173
   8174/*
   8175 * megasas_mgmt_poll -  char node "poll" entry point
   8176 * @filep:	char node file
   8177 * @wait:	Events to poll for
   8178 */
   8179static __poll_t megasas_mgmt_poll(struct file *file, poll_table *wait)
   8180{
   8181	__poll_t mask;
   8182	unsigned long flags;
   8183
   8184	poll_wait(file, &megasas_poll_wait, wait);
   8185	spin_lock_irqsave(&poll_aen_lock, flags);
   8186	if (megasas_poll_wait_aen)
   8187		mask = (EPOLLIN | EPOLLRDNORM);
   8188	else
   8189		mask = 0;
   8190	megasas_poll_wait_aen = 0;
   8191	spin_unlock_irqrestore(&poll_aen_lock, flags);
   8192	return mask;
   8193}
   8194
   8195/*
   8196 * megasas_set_crash_dump_params_ioctl:
   8197 *		Send CRASH_DUMP_MODE DCMD to all controllers
   8198 * @cmd:	MFI command frame
   8199 */
   8200
   8201static int megasas_set_crash_dump_params_ioctl(struct megasas_cmd *cmd)
   8202{
   8203	struct megasas_instance *local_instance;
   8204	int i, error = 0;
   8205	int crash_support;
   8206
   8207	crash_support = cmd->frame->dcmd.mbox.w[0];
   8208
   8209	for (i = 0; i < megasas_mgmt_info.max_index; i++) {
   8210		local_instance = megasas_mgmt_info.instance[i];
   8211		if (local_instance && local_instance->crash_dump_drv_support) {
   8212			if ((atomic_read(&local_instance->adprecovery) ==
   8213				MEGASAS_HBA_OPERATIONAL) &&
   8214				!megasas_set_crash_dump_params(local_instance,
   8215					crash_support)) {
   8216				local_instance->crash_dump_app_support =
   8217					crash_support;
   8218				dev_info(&local_instance->pdev->dev,
   8219					"Application firmware crash "
   8220					"dump mode set success\n");
   8221				error = 0;
   8222			} else {
   8223				dev_info(&local_instance->pdev->dev,
   8224					"Application firmware crash "
   8225					"dump mode set failed\n");
   8226				error = -1;
   8227			}
   8228		}
   8229	}
   8230	return error;
   8231}
   8232
   8233/**
   8234 * megasas_mgmt_fw_ioctl -	Issues management ioctls to FW
   8235 * @instance:			Adapter soft state
   8236 * @user_ioc:			User's ioctl packet
   8237 * @ioc:			ioctl packet
   8238 */
   8239static int
   8240megasas_mgmt_fw_ioctl(struct megasas_instance *instance,
   8241		      struct megasas_iocpacket __user * user_ioc,
   8242		      struct megasas_iocpacket *ioc)
   8243{
   8244	struct megasas_sge64 *kern_sge64 = NULL;
   8245	struct megasas_sge32 *kern_sge32 = NULL;
   8246	struct megasas_cmd *cmd;
   8247	void *kbuff_arr[MAX_IOCTL_SGE];
   8248	dma_addr_t buf_handle = 0;
   8249	int error = 0, i;
   8250	void *sense = NULL;
   8251	dma_addr_t sense_handle;
   8252	void *sense_ptr;
   8253	u32 opcode = 0;
   8254	int ret = DCMD_SUCCESS;
   8255
   8256	memset(kbuff_arr, 0, sizeof(kbuff_arr));
   8257
   8258	if (ioc->sge_count > MAX_IOCTL_SGE) {
   8259		dev_printk(KERN_DEBUG, &instance->pdev->dev, "SGE count [%d] >  max limit [%d]\n",
   8260		       ioc->sge_count, MAX_IOCTL_SGE);
   8261		return -EINVAL;
   8262	}
   8263
   8264	if ((ioc->frame.hdr.cmd >= MFI_CMD_OP_COUNT) ||
   8265	    ((ioc->frame.hdr.cmd == MFI_CMD_NVME) &&
   8266	    !instance->support_nvme_passthru) ||
   8267	    ((ioc->frame.hdr.cmd == MFI_CMD_TOOLBOX) &&
   8268	    !instance->support_pci_lane_margining)) {
   8269		dev_err(&instance->pdev->dev,
   8270			"Received invalid ioctl command 0x%x\n",
   8271			ioc->frame.hdr.cmd);
   8272		return -ENOTSUPP;
   8273	}
   8274
   8275	cmd = megasas_get_cmd(instance);
   8276	if (!cmd) {
   8277		dev_printk(KERN_DEBUG, &instance->pdev->dev, "Failed to get a cmd packet\n");
   8278		return -ENOMEM;
   8279	}
   8280
   8281	/*
   8282	 * User's IOCTL packet has 2 frames (maximum). Copy those two
   8283	 * frames into our cmd's frames. cmd->frame's context will get
   8284	 * overwritten when we copy from user's frames. So set that value
   8285	 * alone separately
   8286	 */
   8287	memcpy(cmd->frame, ioc->frame.raw, 2 * MEGAMFI_FRAME_SIZE);
   8288	cmd->frame->hdr.context = cpu_to_le32(cmd->index);
   8289	cmd->frame->hdr.pad_0 = 0;
   8290
   8291	cmd->frame->hdr.flags &= (~MFI_FRAME_IEEE);
   8292
   8293	if (instance->consistent_mask_64bit)
   8294		cmd->frame->hdr.flags |= cpu_to_le16((MFI_FRAME_SGL64 |
   8295				       MFI_FRAME_SENSE64));
   8296	else
   8297		cmd->frame->hdr.flags &= cpu_to_le16(~(MFI_FRAME_SGL64 |
   8298					       MFI_FRAME_SENSE64));
   8299
   8300	if (cmd->frame->hdr.cmd == MFI_CMD_DCMD)
   8301		opcode = le32_to_cpu(cmd->frame->dcmd.opcode);
   8302
   8303	if (opcode == MR_DCMD_CTRL_SHUTDOWN) {
   8304		mutex_lock(&instance->reset_mutex);
   8305		if (megasas_get_ctrl_info(instance) != DCMD_SUCCESS) {
   8306			megasas_return_cmd(instance, cmd);
   8307			mutex_unlock(&instance->reset_mutex);
   8308			return -1;
   8309		}
   8310		mutex_unlock(&instance->reset_mutex);
   8311	}
   8312
   8313	if (opcode == MR_DRIVER_SET_APP_CRASHDUMP_MODE) {
   8314		error = megasas_set_crash_dump_params_ioctl(cmd);
   8315		megasas_return_cmd(instance, cmd);
   8316		return error;
   8317	}
   8318
   8319	/*
   8320	 * The management interface between applications and the fw uses
   8321	 * MFI frames. E.g, RAID configuration changes, LD property changes
   8322	 * etc are accomplishes through different kinds of MFI frames. The
   8323	 * driver needs to care only about substituting user buffers with
   8324	 * kernel buffers in SGLs. The location of SGL is embedded in the
   8325	 * struct iocpacket itself.
   8326	 */
   8327	if (instance->consistent_mask_64bit)
   8328		kern_sge64 = (struct megasas_sge64 *)
   8329			((unsigned long)cmd->frame + ioc->sgl_off);
   8330	else
   8331		kern_sge32 = (struct megasas_sge32 *)
   8332			((unsigned long)cmd->frame + ioc->sgl_off);
   8333
   8334	/*
   8335	 * For each user buffer, create a mirror buffer and copy in
   8336	 */
   8337	for (i = 0; i < ioc->sge_count; i++) {
   8338		if (!ioc->sgl[i].iov_len)
   8339			continue;
   8340
   8341		kbuff_arr[i] = dma_alloc_coherent(&instance->pdev->dev,
   8342						    ioc->sgl[i].iov_len,
   8343						    &buf_handle, GFP_KERNEL);
   8344		if (!kbuff_arr[i]) {
   8345			dev_printk(KERN_DEBUG, &instance->pdev->dev, "Failed to alloc "
   8346			       "kernel SGL buffer for IOCTL\n");
   8347			error = -ENOMEM;
   8348			goto out;
   8349		}
   8350
   8351		/*
   8352		 * We don't change the dma_coherent_mask, so
   8353		 * dma_alloc_coherent only returns 32bit addresses
   8354		 */
   8355		if (instance->consistent_mask_64bit) {
   8356			kern_sge64[i].phys_addr = cpu_to_le64(buf_handle);
   8357			kern_sge64[i].length = cpu_to_le32(ioc->sgl[i].iov_len);
   8358		} else {
   8359			kern_sge32[i].phys_addr = cpu_to_le32(buf_handle);
   8360			kern_sge32[i].length = cpu_to_le32(ioc->sgl[i].iov_len);
   8361		}
   8362
   8363		/*
   8364		 * We created a kernel buffer corresponding to the
   8365		 * user buffer. Now copy in from the user buffer
   8366		 */
   8367		if (copy_from_user(kbuff_arr[i], ioc->sgl[i].iov_base,
   8368				   (u32) (ioc->sgl[i].iov_len))) {
   8369			error = -EFAULT;
   8370			goto out;
   8371		}
   8372	}
   8373
   8374	if (ioc->sense_len) {
   8375		/* make sure the pointer is part of the frame */
   8376		if (ioc->sense_off >
   8377		    (sizeof(union megasas_frame) - sizeof(__le64))) {
   8378			error = -EINVAL;
   8379			goto out;
   8380		}
   8381
   8382		sense = dma_alloc_coherent(&instance->pdev->dev, ioc->sense_len,
   8383					     &sense_handle, GFP_KERNEL);
   8384		if (!sense) {
   8385			error = -ENOMEM;
   8386			goto out;
   8387		}
   8388
   8389		/* always store 64 bits regardless of addressing */
   8390		sense_ptr = (void *)cmd->frame + ioc->sense_off;
   8391		put_unaligned_le64(sense_handle, sense_ptr);
   8392	}
   8393
   8394	/*
   8395	 * Set the sync_cmd flag so that the ISR knows not to complete this
   8396	 * cmd to the SCSI mid-layer
   8397	 */
   8398	cmd->sync_cmd = 1;
   8399
   8400	ret = megasas_issue_blocked_cmd(instance, cmd, 0);
   8401	switch (ret) {
   8402	case DCMD_INIT:
   8403	case DCMD_BUSY:
   8404		cmd->sync_cmd = 0;
   8405		dev_err(&instance->pdev->dev,
   8406			"return -EBUSY from %s %d cmd 0x%x opcode 0x%x cmd->cmd_status_drv 0x%x\n",
   8407			 __func__, __LINE__, cmd->frame->hdr.cmd, opcode,
   8408			 cmd->cmd_status_drv);
   8409		error = -EBUSY;
   8410		goto out;
   8411	}
   8412
   8413	cmd->sync_cmd = 0;
   8414
   8415	if (instance->unload == 1) {
   8416		dev_info(&instance->pdev->dev, "Driver unload is in progress "
   8417			"don't submit data to application\n");
   8418		goto out;
   8419	}
   8420	/*
   8421	 * copy out the kernel buffers to user buffers
   8422	 */
   8423	for (i = 0; i < ioc->sge_count; i++) {
   8424		if (copy_to_user(ioc->sgl[i].iov_base, kbuff_arr[i],
   8425				 ioc->sgl[i].iov_len)) {
   8426			error = -EFAULT;
   8427			goto out;
   8428		}
   8429	}
   8430
   8431	/*
   8432	 * copy out the sense
   8433	 */
   8434	if (ioc->sense_len) {
   8435		void __user *uptr;
   8436		/*
   8437		 * sense_ptr points to the location that has the user
   8438		 * sense buffer address
   8439		 */
   8440		sense_ptr = (void *)ioc->frame.raw + ioc->sense_off;
   8441		if (in_compat_syscall())
   8442			uptr = compat_ptr(get_unaligned((compat_uptr_t *)
   8443							sense_ptr));
   8444		else
   8445			uptr = get_unaligned((void __user **)sense_ptr);
   8446
   8447		if (copy_to_user(uptr, sense, ioc->sense_len)) {
   8448			dev_err(&instance->pdev->dev, "Failed to copy out to user "
   8449					"sense data\n");
   8450			error = -EFAULT;
   8451			goto out;
   8452		}
   8453	}
   8454
   8455	/*
   8456	 * copy the status codes returned by the fw
   8457	 */
   8458	if (copy_to_user(&user_ioc->frame.hdr.cmd_status,
   8459			 &cmd->frame->hdr.cmd_status, sizeof(u8))) {
   8460		dev_printk(KERN_DEBUG, &instance->pdev->dev, "Error copying out cmd_status\n");
   8461		error = -EFAULT;
   8462	}
   8463
   8464out:
   8465	if (sense) {
   8466		dma_free_coherent(&instance->pdev->dev, ioc->sense_len,
   8467				    sense, sense_handle);
   8468	}
   8469
   8470	for (i = 0; i < ioc->sge_count; i++) {
   8471		if (kbuff_arr[i]) {
   8472			if (instance->consistent_mask_64bit)
   8473				dma_free_coherent(&instance->pdev->dev,
   8474					le32_to_cpu(kern_sge64[i].length),
   8475					kbuff_arr[i],
   8476					le64_to_cpu(kern_sge64[i].phys_addr));
   8477			else
   8478				dma_free_coherent(&instance->pdev->dev,
   8479					le32_to_cpu(kern_sge32[i].length),
   8480					kbuff_arr[i],
   8481					le32_to_cpu(kern_sge32[i].phys_addr));
   8482			kbuff_arr[i] = NULL;
   8483		}
   8484	}
   8485
   8486	megasas_return_cmd(instance, cmd);
   8487	return error;
   8488}
   8489
   8490static struct megasas_iocpacket *
   8491megasas_compat_iocpacket_get_user(void __user *arg)
   8492{
   8493	struct megasas_iocpacket *ioc;
   8494	struct compat_megasas_iocpacket __user *cioc = arg;
   8495	size_t size;
   8496	int err = -EFAULT;
   8497	int i;
   8498
   8499	ioc = kzalloc(sizeof(*ioc), GFP_KERNEL);
   8500	if (!ioc)
   8501		return ERR_PTR(-ENOMEM);
   8502	size = offsetof(struct megasas_iocpacket, frame) + sizeof(ioc->frame);
   8503	if (copy_from_user(ioc, arg, size))
   8504		goto out;
   8505
   8506	for (i = 0; i < MAX_IOCTL_SGE; i++) {
   8507		compat_uptr_t iov_base;
   8508
   8509		if (get_user(iov_base, &cioc->sgl[i].iov_base) ||
   8510		    get_user(ioc->sgl[i].iov_len, &cioc->sgl[i].iov_len))
   8511			goto out;
   8512
   8513		ioc->sgl[i].iov_base = compat_ptr(iov_base);
   8514	}
   8515
   8516	return ioc;
   8517out:
   8518	kfree(ioc);
   8519	return ERR_PTR(err);
   8520}
   8521
   8522static int megasas_mgmt_ioctl_fw(struct file *file, unsigned long arg)
   8523{
   8524	struct megasas_iocpacket __user *user_ioc =
   8525	    (struct megasas_iocpacket __user *)arg;
   8526	struct megasas_iocpacket *ioc;
   8527	struct megasas_instance *instance;
   8528	int error;
   8529
   8530	if (in_compat_syscall())
   8531		ioc = megasas_compat_iocpacket_get_user(user_ioc);
   8532	else
   8533		ioc = memdup_user(user_ioc, sizeof(struct megasas_iocpacket));
   8534
   8535	if (IS_ERR(ioc))
   8536		return PTR_ERR(ioc);
   8537
   8538	instance = megasas_lookup_instance(ioc->host_no);
   8539	if (!instance) {
   8540		error = -ENODEV;
   8541		goto out_kfree_ioc;
   8542	}
   8543
   8544	/* Block ioctls in VF mode */
   8545	if (instance->requestorId && !allow_vf_ioctls) {
   8546		error = -ENODEV;
   8547		goto out_kfree_ioc;
   8548	}
   8549
   8550	if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) {
   8551		dev_err(&instance->pdev->dev, "Controller in crit error\n");
   8552		error = -ENODEV;
   8553		goto out_kfree_ioc;
   8554	}
   8555
   8556	if (instance->unload == 1) {
   8557		error = -ENODEV;
   8558		goto out_kfree_ioc;
   8559	}
   8560
   8561	if (down_interruptible(&instance->ioctl_sem)) {
   8562		error = -ERESTARTSYS;
   8563		goto out_kfree_ioc;
   8564	}
   8565
   8566	if  (megasas_wait_for_adapter_operational(instance)) {
   8567		error = -ENODEV;
   8568		goto out_up;
   8569	}
   8570
   8571	error = megasas_mgmt_fw_ioctl(instance, user_ioc, ioc);
   8572out_up:
   8573	up(&instance->ioctl_sem);
   8574
   8575out_kfree_ioc:
   8576	kfree(ioc);
   8577	return error;
   8578}
   8579
   8580static int megasas_mgmt_ioctl_aen(struct file *file, unsigned long arg)
   8581{
   8582	struct megasas_instance *instance;
   8583	struct megasas_aen aen;
   8584	int error;
   8585
   8586	if (file->private_data != file) {
   8587		printk(KERN_DEBUG "megasas: fasync_helper was not "
   8588		       "called first\n");
   8589		return -EINVAL;
   8590	}
   8591
   8592	if (copy_from_user(&aen, (void __user *)arg, sizeof(aen)))
   8593		return -EFAULT;
   8594
   8595	instance = megasas_lookup_instance(aen.host_no);
   8596
   8597	if (!instance)
   8598		return -ENODEV;
   8599
   8600	if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) {
   8601		return -ENODEV;
   8602	}
   8603
   8604	if (instance->unload == 1) {
   8605		return -ENODEV;
   8606	}
   8607
   8608	if  (megasas_wait_for_adapter_operational(instance))
   8609		return -ENODEV;
   8610
   8611	mutex_lock(&instance->reset_mutex);
   8612	error = megasas_register_aen(instance, aen.seq_num,
   8613				     aen.class_locale_word);
   8614	mutex_unlock(&instance->reset_mutex);
   8615	return error;
   8616}
   8617
   8618/**
   8619 * megasas_mgmt_ioctl -	char node ioctl entry point
   8620 * @file:	char device file pointer
   8621 * @cmd:	ioctl command
   8622 * @arg:	ioctl command arguments address
   8623 */
   8624static long
   8625megasas_mgmt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
   8626{
   8627	switch (cmd) {
   8628	case MEGASAS_IOC_FIRMWARE:
   8629		return megasas_mgmt_ioctl_fw(file, arg);
   8630
   8631	case MEGASAS_IOC_GET_AEN:
   8632		return megasas_mgmt_ioctl_aen(file, arg);
   8633	}
   8634
   8635	return -ENOTTY;
   8636}
   8637
   8638#ifdef CONFIG_COMPAT
   8639static long
   8640megasas_mgmt_compat_ioctl(struct file *file, unsigned int cmd,
   8641			  unsigned long arg)
   8642{
   8643	switch (cmd) {
   8644	case MEGASAS_IOC_FIRMWARE32:
   8645		return megasas_mgmt_ioctl_fw(file, arg);
   8646	case MEGASAS_IOC_GET_AEN:
   8647		return megasas_mgmt_ioctl_aen(file, arg);
   8648	}
   8649
   8650	return -ENOTTY;
   8651}
   8652#endif
   8653
   8654/*
   8655 * File operations structure for management interface
   8656 */
   8657static const struct file_operations megasas_mgmt_fops = {
   8658	.owner = THIS_MODULE,
   8659	.open = megasas_mgmt_open,
   8660	.fasync = megasas_mgmt_fasync,
   8661	.unlocked_ioctl = megasas_mgmt_ioctl,
   8662	.poll = megasas_mgmt_poll,
   8663#ifdef CONFIG_COMPAT
   8664	.compat_ioctl = megasas_mgmt_compat_ioctl,
   8665#endif
   8666	.llseek = noop_llseek,
   8667};
   8668
   8669static SIMPLE_DEV_PM_OPS(megasas_pm_ops, megasas_suspend, megasas_resume);
   8670
   8671/*
   8672 * PCI hotplug support registration structure
   8673 */
   8674static struct pci_driver megasas_pci_driver = {
   8675
   8676	.name = "megaraid_sas",
   8677	.id_table = megasas_pci_table,
   8678	.probe = megasas_probe_one,
   8679	.remove = megasas_detach_one,
   8680	.driver.pm = &megasas_pm_ops,
   8681	.shutdown = megasas_shutdown,
   8682};
   8683
   8684/*
   8685 * Sysfs driver attributes
   8686 */
   8687static ssize_t version_show(struct device_driver *dd, char *buf)
   8688{
   8689	return snprintf(buf, strlen(MEGASAS_VERSION) + 2, "%s\n",
   8690			MEGASAS_VERSION);
   8691}
   8692static DRIVER_ATTR_RO(version);
   8693
   8694static ssize_t release_date_show(struct device_driver *dd, char *buf)
   8695{
   8696	return snprintf(buf, strlen(MEGASAS_RELDATE) + 2, "%s\n",
   8697		MEGASAS_RELDATE);
   8698}
   8699static DRIVER_ATTR_RO(release_date);
   8700
   8701static ssize_t support_poll_for_event_show(struct device_driver *dd, char *buf)
   8702{
   8703	return sprintf(buf, "%u\n", support_poll_for_event);
   8704}
   8705static DRIVER_ATTR_RO(support_poll_for_event);
   8706
   8707static ssize_t support_device_change_show(struct device_driver *dd, char *buf)
   8708{
   8709	return sprintf(buf, "%u\n", support_device_change);
   8710}
   8711static DRIVER_ATTR_RO(support_device_change);
   8712
   8713static ssize_t dbg_lvl_show(struct device_driver *dd, char *buf)
   8714{
   8715	return sprintf(buf, "%u\n", megasas_dbg_lvl);
   8716}
   8717
   8718static ssize_t dbg_lvl_store(struct device_driver *dd, const char *buf,
   8719			     size_t count)
   8720{
   8721	int retval = count;
   8722
   8723	if (sscanf(buf, "%u", &megasas_dbg_lvl) < 1) {
   8724		printk(KERN_ERR "megasas: could not set dbg_lvl\n");
   8725		retval = -EINVAL;
   8726	}
   8727	return retval;
   8728}
   8729static DRIVER_ATTR_RW(dbg_lvl);
   8730
   8731static ssize_t
   8732support_nvme_encapsulation_show(struct device_driver *dd, char *buf)
   8733{
   8734	return sprintf(buf, "%u\n", support_nvme_encapsulation);
   8735}
   8736
   8737static DRIVER_ATTR_RO(support_nvme_encapsulation);
   8738
   8739static ssize_t
   8740support_pci_lane_margining_show(struct device_driver *dd, char *buf)
   8741{
   8742	return sprintf(buf, "%u\n", support_pci_lane_margining);
   8743}
   8744
   8745static DRIVER_ATTR_RO(support_pci_lane_margining);
   8746
   8747static inline void megasas_remove_scsi_device(struct scsi_device *sdev)
   8748{
   8749	sdev_printk(KERN_INFO, sdev, "SCSI device is removed\n");
   8750	scsi_remove_device(sdev);
   8751	scsi_device_put(sdev);
   8752}
   8753
   8754/**
   8755 * megasas_update_device_list -	Update the PD and LD device list from FW
   8756 *				after an AEN event notification
   8757 * @instance:			Adapter soft state
   8758 * @event_type:			Indicates type of event (PD or LD event)
   8759 *
   8760 * @return:			Success or failure
   8761 *
   8762 * Issue DCMDs to Firmware to update the internal device list in driver.
   8763 * Based on the FW support, driver sends the HOST_DEVICE_LIST or combination
   8764 * of PD_LIST/LD_LIST_QUERY DCMDs to get the device list.
   8765 */
   8766static
   8767int megasas_update_device_list(struct megasas_instance *instance,
   8768			       int event_type)
   8769{
   8770	int dcmd_ret = DCMD_SUCCESS;
   8771
   8772	if (instance->enable_fw_dev_list) {
   8773		dcmd_ret = megasas_host_device_list_query(instance, false);
   8774		if (dcmd_ret != DCMD_SUCCESS)
   8775			goto out;
   8776	} else {
   8777		if (event_type & SCAN_PD_CHANNEL) {
   8778			dcmd_ret = megasas_get_pd_list(instance);
   8779
   8780			if (dcmd_ret != DCMD_SUCCESS)
   8781				goto out;
   8782		}
   8783
   8784		if (event_type & SCAN_VD_CHANNEL) {
   8785			if (!instance->requestorId ||
   8786			megasas_get_ld_vf_affiliation(instance, 0)) {
   8787				dcmd_ret = megasas_ld_list_query(instance,
   8788						MR_LD_QUERY_TYPE_EXPOSED_TO_HOST);
   8789				if (dcmd_ret != DCMD_SUCCESS)
   8790					goto out;
   8791			}
   8792		}
   8793	}
   8794
   8795out:
   8796	return dcmd_ret;
   8797}
   8798
   8799/**
   8800 * megasas_add_remove_devices -	Add/remove devices to SCSI mid-layer
   8801 *				after an AEN event notification
   8802 * @instance:			Adapter soft state
   8803 * @scan_type:			Indicates type of devices (PD/LD) to add
   8804 * @return			void
   8805 */
   8806static
   8807void megasas_add_remove_devices(struct megasas_instance *instance,
   8808				int scan_type)
   8809{
   8810	int i, j;
   8811	u16 pd_index = 0;
   8812	u16 ld_index = 0;
   8813	u16 channel = 0, id = 0;
   8814	struct Scsi_Host *host;
   8815	struct scsi_device *sdev1;
   8816	struct MR_HOST_DEVICE_LIST *targetid_list = NULL;
   8817	struct MR_HOST_DEVICE_LIST_ENTRY *targetid_entry = NULL;
   8818
   8819	host = instance->host;
   8820
   8821	if (instance->enable_fw_dev_list) {
   8822		targetid_list = instance->host_device_list_buf;
   8823		for (i = 0; i < targetid_list->count; i++) {
   8824			targetid_entry = &targetid_list->host_device_list[i];
   8825			if (targetid_entry->flags.u.bits.is_sys_pd) {
   8826				channel = le16_to_cpu(targetid_entry->target_id) /
   8827						MEGASAS_MAX_DEV_PER_CHANNEL;
   8828				id = le16_to_cpu(targetid_entry->target_id) %
   8829						MEGASAS_MAX_DEV_PER_CHANNEL;
   8830			} else {
   8831				channel = MEGASAS_MAX_PD_CHANNELS +
   8832					  (le16_to_cpu(targetid_entry->target_id) /
   8833					   MEGASAS_MAX_DEV_PER_CHANNEL);
   8834				id = le16_to_cpu(targetid_entry->target_id) %
   8835						MEGASAS_MAX_DEV_PER_CHANNEL;
   8836			}
   8837			sdev1 = scsi_device_lookup(host, channel, id, 0);
   8838			if (!sdev1) {
   8839				scsi_add_device(host, channel, id, 0);
   8840			} else {
   8841				scsi_device_put(sdev1);
   8842			}
   8843		}
   8844	}
   8845
   8846	if (scan_type & SCAN_PD_CHANNEL) {
   8847		for (i = 0; i < MEGASAS_MAX_PD_CHANNELS; i++) {
   8848			for (j = 0; j < MEGASAS_MAX_DEV_PER_CHANNEL; j++) {
   8849				pd_index = i * MEGASAS_MAX_DEV_PER_CHANNEL + j;
   8850				sdev1 = scsi_device_lookup(host, i, j, 0);
   8851				if (instance->pd_list[pd_index].driveState ==
   8852							MR_PD_STATE_SYSTEM) {
   8853					if (!sdev1)
   8854						scsi_add_device(host, i, j, 0);
   8855					else
   8856						scsi_device_put(sdev1);
   8857				} else {
   8858					if (sdev1)
   8859						megasas_remove_scsi_device(sdev1);
   8860				}
   8861			}
   8862		}
   8863	}
   8864
   8865	if (scan_type & SCAN_VD_CHANNEL) {
   8866		for (i = 0; i < MEGASAS_MAX_LD_CHANNELS; i++) {
   8867			for (j = 0; j < MEGASAS_MAX_DEV_PER_CHANNEL; j++) {
   8868				ld_index = (i * MEGASAS_MAX_DEV_PER_CHANNEL) + j;
   8869				sdev1 = scsi_device_lookup(host,
   8870						MEGASAS_MAX_PD_CHANNELS + i, j, 0);
   8871				if (instance->ld_ids[ld_index] != 0xff) {
   8872					if (!sdev1)
   8873						scsi_add_device(host, MEGASAS_MAX_PD_CHANNELS + i, j, 0);
   8874					else
   8875						scsi_device_put(sdev1);
   8876				} else {
   8877					if (sdev1)
   8878						megasas_remove_scsi_device(sdev1);
   8879				}
   8880			}
   8881		}
   8882	}
   8883
   8884}
   8885
   8886static void
   8887megasas_aen_polling(struct work_struct *work)
   8888{
   8889	struct megasas_aen_event *ev =
   8890		container_of(work, struct megasas_aen_event, hotplug_work.work);
   8891	struct megasas_instance *instance = ev->instance;
   8892	union megasas_evt_class_locale class_locale;
   8893	int event_type = 0;
   8894	u32 seq_num;
   8895	u16 ld_target_id;
   8896	int error;
   8897	u8  dcmd_ret = DCMD_SUCCESS;
   8898	struct scsi_device *sdev1;
   8899
   8900	if (!instance) {
   8901		printk(KERN_ERR "invalid instance!\n");
   8902		kfree(ev);
   8903		return;
   8904	}
   8905
   8906	/* Don't run the event workqueue thread if OCR is running */
   8907	mutex_lock(&instance->reset_mutex);
   8908
   8909	instance->ev = NULL;
   8910	if (instance->evt_detail) {
   8911		megasas_decode_evt(instance);
   8912
   8913		switch (le32_to_cpu(instance->evt_detail->code)) {
   8914
   8915		case MR_EVT_PD_INSERTED:
   8916		case MR_EVT_PD_REMOVED:
   8917			event_type = SCAN_PD_CHANNEL;
   8918			break;
   8919
   8920		case MR_EVT_LD_OFFLINE:
   8921		case MR_EVT_LD_DELETED:
   8922			ld_target_id = instance->evt_detail->args.ld.target_id;
   8923			sdev1 = scsi_device_lookup(instance->host,
   8924						   MEGASAS_MAX_PD_CHANNELS +
   8925						   (ld_target_id / MEGASAS_MAX_DEV_PER_CHANNEL),
   8926						   (ld_target_id - MEGASAS_MAX_DEV_PER_CHANNEL),
   8927						   0);
   8928			if (sdev1)
   8929				megasas_remove_scsi_device(sdev1);
   8930
   8931			event_type = SCAN_VD_CHANNEL;
   8932			break;
   8933		case MR_EVT_LD_CREATED:
   8934			event_type = SCAN_VD_CHANNEL;
   8935			break;
   8936
   8937		case MR_EVT_CFG_CLEARED:
   8938		case MR_EVT_CTRL_HOST_BUS_SCAN_REQUESTED:
   8939		case MR_EVT_FOREIGN_CFG_IMPORTED:
   8940		case MR_EVT_LD_STATE_CHANGE:
   8941			event_type = SCAN_PD_CHANNEL | SCAN_VD_CHANNEL;
   8942			dev_info(&instance->pdev->dev, "scanning for scsi%d...\n",
   8943				instance->host->host_no);
   8944			break;
   8945
   8946		case MR_EVT_CTRL_PROP_CHANGED:
   8947			dcmd_ret = megasas_get_ctrl_info(instance);
   8948			if (dcmd_ret == DCMD_SUCCESS &&
   8949			    instance->snapdump_wait_time) {
   8950				megasas_get_snapdump_properties(instance);
   8951				dev_info(&instance->pdev->dev,
   8952					 "Snap dump wait time\t: %d\n",
   8953					 instance->snapdump_wait_time);
   8954			}
   8955			break;
   8956		default:
   8957			event_type = 0;
   8958			break;
   8959		}
   8960	} else {
   8961		dev_err(&instance->pdev->dev, "invalid evt_detail!\n");
   8962		mutex_unlock(&instance->reset_mutex);
   8963		kfree(ev);
   8964		return;
   8965	}
   8966
   8967	if (event_type)
   8968		dcmd_ret = megasas_update_device_list(instance, event_type);
   8969
   8970	mutex_unlock(&instance->reset_mutex);
   8971
   8972	if (event_type && dcmd_ret == DCMD_SUCCESS)
   8973		megasas_add_remove_devices(instance, event_type);
   8974
   8975	if (dcmd_ret == DCMD_SUCCESS)
   8976		seq_num = le32_to_cpu(instance->evt_detail->seq_num) + 1;
   8977	else
   8978		seq_num = instance->last_seq_num;
   8979
   8980	/* Register AEN with FW for latest sequence number plus 1 */
   8981	class_locale.members.reserved = 0;
   8982	class_locale.members.locale = MR_EVT_LOCALE_ALL;
   8983	class_locale.members.class = MR_EVT_CLASS_DEBUG;
   8984
   8985	if (instance->aen_cmd != NULL) {
   8986		kfree(ev);
   8987		return;
   8988	}
   8989
   8990	mutex_lock(&instance->reset_mutex);
   8991	error = megasas_register_aen(instance, seq_num,
   8992					class_locale.word);
   8993	if (error)
   8994		dev_err(&instance->pdev->dev,
   8995			"register aen failed error %x\n", error);
   8996
   8997	mutex_unlock(&instance->reset_mutex);
   8998	kfree(ev);
   8999}
   9000
   9001/**
   9002 * megasas_init - Driver load entry point
   9003 */
   9004static int __init megasas_init(void)
   9005{
   9006	int rval;
   9007
   9008	/*
   9009	 * Booted in kdump kernel, minimize memory footprints by
   9010	 * disabling few features
   9011	 */
   9012	if (reset_devices) {
   9013		msix_vectors = 1;
   9014		rdpq_enable = 0;
   9015		dual_qdepth_disable = 1;
   9016		poll_queues = 0;
   9017	}
   9018
   9019	/*
   9020	 * Announce driver version and other information
   9021	 */
   9022	pr_info("megasas: %s\n", MEGASAS_VERSION);
   9023
   9024	support_poll_for_event = 2;
   9025	support_device_change = 1;
   9026	support_nvme_encapsulation = true;
   9027	support_pci_lane_margining = true;
   9028
   9029	memset(&megasas_mgmt_info, 0, sizeof(megasas_mgmt_info));
   9030
   9031	/*
   9032	 * Register character device node
   9033	 */
   9034	rval = register_chrdev(0, "megaraid_sas_ioctl", &megasas_mgmt_fops);
   9035
   9036	if (rval < 0) {
   9037		printk(KERN_DEBUG "megasas: failed to open device node\n");
   9038		return rval;
   9039	}
   9040
   9041	megasas_mgmt_majorno = rval;
   9042
   9043	megasas_init_debugfs();
   9044
   9045	/*
   9046	 * Register ourselves as PCI hotplug module
   9047	 */
   9048	rval = pci_register_driver(&megasas_pci_driver);
   9049
   9050	if (rval) {
   9051		printk(KERN_DEBUG "megasas: PCI hotplug registration failed \n");
   9052		goto err_pcidrv;
   9053	}
   9054
   9055	if ((event_log_level < MFI_EVT_CLASS_DEBUG) ||
   9056	    (event_log_level > MFI_EVT_CLASS_DEAD)) {
   9057		pr_warn("megaraid_sas: provided event log level is out of range, setting it to default 2(CLASS_CRITICAL), permissible range is: -2 to 4\n");
   9058		event_log_level = MFI_EVT_CLASS_CRITICAL;
   9059	}
   9060
   9061	rval = driver_create_file(&megasas_pci_driver.driver,
   9062				  &driver_attr_version);
   9063	if (rval)
   9064		goto err_dcf_attr_ver;
   9065
   9066	rval = driver_create_file(&megasas_pci_driver.driver,
   9067				  &driver_attr_release_date);
   9068	if (rval)
   9069		goto err_dcf_rel_date;
   9070
   9071	rval = driver_create_file(&megasas_pci_driver.driver,
   9072				&driver_attr_support_poll_for_event);
   9073	if (rval)
   9074		goto err_dcf_support_poll_for_event;
   9075
   9076	rval = driver_create_file(&megasas_pci_driver.driver,
   9077				  &driver_attr_dbg_lvl);
   9078	if (rval)
   9079		goto err_dcf_dbg_lvl;
   9080	rval = driver_create_file(&megasas_pci_driver.driver,
   9081				&driver_attr_support_device_change);
   9082	if (rval)
   9083		goto err_dcf_support_device_change;
   9084
   9085	rval = driver_create_file(&megasas_pci_driver.driver,
   9086				  &driver_attr_support_nvme_encapsulation);
   9087	if (rval)
   9088		goto err_dcf_support_nvme_encapsulation;
   9089
   9090	rval = driver_create_file(&megasas_pci_driver.driver,
   9091				  &driver_attr_support_pci_lane_margining);
   9092	if (rval)
   9093		goto err_dcf_support_pci_lane_margining;
   9094
   9095	return rval;
   9096
   9097err_dcf_support_pci_lane_margining:
   9098	driver_remove_file(&megasas_pci_driver.driver,
   9099			   &driver_attr_support_nvme_encapsulation);
   9100
   9101err_dcf_support_nvme_encapsulation:
   9102	driver_remove_file(&megasas_pci_driver.driver,
   9103			   &driver_attr_support_device_change);
   9104
   9105err_dcf_support_device_change:
   9106	driver_remove_file(&megasas_pci_driver.driver,
   9107			   &driver_attr_dbg_lvl);
   9108err_dcf_dbg_lvl:
   9109	driver_remove_file(&megasas_pci_driver.driver,
   9110			&driver_attr_support_poll_for_event);
   9111err_dcf_support_poll_for_event:
   9112	driver_remove_file(&megasas_pci_driver.driver,
   9113			   &driver_attr_release_date);
   9114err_dcf_rel_date:
   9115	driver_remove_file(&megasas_pci_driver.driver, &driver_attr_version);
   9116err_dcf_attr_ver:
   9117	pci_unregister_driver(&megasas_pci_driver);
   9118err_pcidrv:
   9119	megasas_exit_debugfs();
   9120	unregister_chrdev(megasas_mgmt_majorno, "megaraid_sas_ioctl");
   9121	return rval;
   9122}
   9123
   9124/**
   9125 * megasas_exit - Driver unload entry point
   9126 */
   9127static void __exit megasas_exit(void)
   9128{
   9129	driver_remove_file(&megasas_pci_driver.driver,
   9130			   &driver_attr_dbg_lvl);
   9131	driver_remove_file(&megasas_pci_driver.driver,
   9132			&driver_attr_support_poll_for_event);
   9133	driver_remove_file(&megasas_pci_driver.driver,
   9134			&driver_attr_support_device_change);
   9135	driver_remove_file(&megasas_pci_driver.driver,
   9136			   &driver_attr_release_date);
   9137	driver_remove_file(&megasas_pci_driver.driver, &driver_attr_version);
   9138	driver_remove_file(&megasas_pci_driver.driver,
   9139			   &driver_attr_support_nvme_encapsulation);
   9140	driver_remove_file(&megasas_pci_driver.driver,
   9141			   &driver_attr_support_pci_lane_margining);
   9142
   9143	pci_unregister_driver(&megasas_pci_driver);
   9144	megasas_exit_debugfs();
   9145	unregister_chrdev(megasas_mgmt_majorno, "megaraid_sas_ioctl");
   9146}
   9147
   9148module_init(megasas_init);
   9149module_exit(megasas_exit);