162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Driver for Broadcom MPI3 Storage Controllers
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2017-2023 Broadcom Inc.
662306a36Sopenharmony_ci *  (mailto: mpi3mr-linuxdrv.pdl@broadcom.com)
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef MPI3MR_H_INCLUDED
1162306a36Sopenharmony_ci#define MPI3MR_H_INCLUDED
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <linux/blkdev.h>
1462306a36Sopenharmony_ci#include <linux/blk-mq.h>
1562306a36Sopenharmony_ci#include <linux/blk-mq-pci.h>
1662306a36Sopenharmony_ci#include <linux/delay.h>
1762306a36Sopenharmony_ci#include <linux/dmapool.h>
1862306a36Sopenharmony_ci#include <linux/errno.h>
1962306a36Sopenharmony_ci#include <linux/init.h>
2062306a36Sopenharmony_ci#include <linux/io.h>
2162306a36Sopenharmony_ci#include <linux/interrupt.h>
2262306a36Sopenharmony_ci#include <linux/kernel.h>
2362306a36Sopenharmony_ci#include <linux/miscdevice.h>
2462306a36Sopenharmony_ci#include <linux/module.h>
2562306a36Sopenharmony_ci#include <linux/pci.h>
2662306a36Sopenharmony_ci#include <linux/poll.h>
2762306a36Sopenharmony_ci#include <linux/sched.h>
2862306a36Sopenharmony_ci#include <linux/slab.h>
2962306a36Sopenharmony_ci#include <linux/types.h>
3062306a36Sopenharmony_ci#include <linux/uaccess.h>
3162306a36Sopenharmony_ci#include <linux/utsname.h>
3262306a36Sopenharmony_ci#include <linux/workqueue.h>
3362306a36Sopenharmony_ci#include <asm/unaligned.h>
3462306a36Sopenharmony_ci#include <scsi/scsi.h>
3562306a36Sopenharmony_ci#include <scsi/scsi_cmnd.h>
3662306a36Sopenharmony_ci#include <scsi/scsi_dbg.h>
3762306a36Sopenharmony_ci#include <scsi/scsi_device.h>
3862306a36Sopenharmony_ci#include <scsi/scsi_host.h>
3962306a36Sopenharmony_ci#include <scsi/scsi_tcq.h>
4062306a36Sopenharmony_ci#include <uapi/scsi/scsi_bsg_mpi3mr.h>
4162306a36Sopenharmony_ci#include <scsi/scsi_transport_sas.h>
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#include "mpi/mpi30_transport.h"
4462306a36Sopenharmony_ci#include "mpi/mpi30_cnfg.h"
4562306a36Sopenharmony_ci#include "mpi/mpi30_image.h"
4662306a36Sopenharmony_ci#include "mpi/mpi30_init.h"
4762306a36Sopenharmony_ci#include "mpi/mpi30_ioc.h"
4862306a36Sopenharmony_ci#include "mpi/mpi30_sas.h"
4962306a36Sopenharmony_ci#include "mpi/mpi30_pci.h"
5062306a36Sopenharmony_ci#include "mpi3mr_debug.h"
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci/* Global list and lock for storing multiple adapters managed by the driver */
5362306a36Sopenharmony_ciextern spinlock_t mrioc_list_lock;
5462306a36Sopenharmony_ciextern struct list_head mrioc_list;
5562306a36Sopenharmony_ciextern int prot_mask;
5662306a36Sopenharmony_ciextern atomic64_t event_counter;
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci#define MPI3MR_DRIVER_VERSION	"8.5.0.0.0"
5962306a36Sopenharmony_ci#define MPI3MR_DRIVER_RELDATE	"24-July-2023"
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#define MPI3MR_DRIVER_NAME	"mpi3mr"
6262306a36Sopenharmony_ci#define MPI3MR_DRIVER_LICENSE	"GPL"
6362306a36Sopenharmony_ci#define MPI3MR_DRIVER_AUTHOR	"Broadcom Inc. <mpi3mr-linuxdrv.pdl@broadcom.com>"
6462306a36Sopenharmony_ci#define MPI3MR_DRIVER_DESC	"MPI3 Storage Controller Device Driver"
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci#define MPI3MR_NAME_LENGTH	32
6762306a36Sopenharmony_ci#define IOCNAME			"%s: "
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci#define MPI3MR_DEFAULT_MAX_IO_SIZE	(1 * 1024 * 1024)
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci/* Definitions for internal SGL and Chain SGL buffers */
7262306a36Sopenharmony_ci#define MPI3MR_PAGE_SIZE_4K		4096
7362306a36Sopenharmony_ci#define MPI3MR_DEFAULT_SGL_ENTRIES	256
7462306a36Sopenharmony_ci#define MPI3MR_MAX_SGL_ENTRIES		2048
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci/* Definitions for MAX values for shost */
7762306a36Sopenharmony_ci#define MPI3MR_MAX_CMDS_LUN	128
7862306a36Sopenharmony_ci#define MPI3MR_MAX_CDB_LENGTH	32
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci/* Admin queue management definitions */
8162306a36Sopenharmony_ci#define MPI3MR_ADMIN_REQ_Q_SIZE		(2 * MPI3MR_PAGE_SIZE_4K)
8262306a36Sopenharmony_ci#define MPI3MR_ADMIN_REPLY_Q_SIZE	(4 * MPI3MR_PAGE_SIZE_4K)
8362306a36Sopenharmony_ci#define MPI3MR_ADMIN_REQ_FRAME_SZ	128
8462306a36Sopenharmony_ci#define MPI3MR_ADMIN_REPLY_FRAME_SZ	16
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci/* Operational queue management definitions */
8762306a36Sopenharmony_ci#define MPI3MR_OP_REQ_Q_QD		512
8862306a36Sopenharmony_ci#define MPI3MR_OP_REP_Q_QD		1024
8962306a36Sopenharmony_ci#define MPI3MR_OP_REP_Q_QD4K		4096
9062306a36Sopenharmony_ci#define MPI3MR_OP_REQ_Q_SEG_SIZE	4096
9162306a36Sopenharmony_ci#define MPI3MR_OP_REP_Q_SEG_SIZE	4096
9262306a36Sopenharmony_ci#define MPI3MR_MAX_SEG_LIST_SIZE	4096
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci/* Reserved Host Tag definitions */
9562306a36Sopenharmony_ci#define MPI3MR_HOSTTAG_INVALID		0xFFFF
9662306a36Sopenharmony_ci#define MPI3MR_HOSTTAG_INITCMDS		1
9762306a36Sopenharmony_ci#define MPI3MR_HOSTTAG_BSG_CMDS		2
9862306a36Sopenharmony_ci#define MPI3MR_HOSTTAG_PEL_ABORT	3
9962306a36Sopenharmony_ci#define MPI3MR_HOSTTAG_PEL_WAIT		4
10062306a36Sopenharmony_ci#define MPI3MR_HOSTTAG_BLK_TMS		5
10162306a36Sopenharmony_ci#define MPI3MR_HOSTTAG_CFG_CMDS		6
10262306a36Sopenharmony_ci#define MPI3MR_HOSTTAG_TRANSPORT_CMDS	7
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci#define MPI3MR_NUM_DEVRMCMD		16
10562306a36Sopenharmony_ci#define MPI3MR_HOSTTAG_DEVRMCMD_MIN	(MPI3MR_HOSTTAG_TRANSPORT_CMDS + 1)
10662306a36Sopenharmony_ci#define MPI3MR_HOSTTAG_DEVRMCMD_MAX	(MPI3MR_HOSTTAG_DEVRMCMD_MIN + \
10762306a36Sopenharmony_ci						MPI3MR_NUM_DEVRMCMD - 1)
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci#define MPI3MR_INTERNAL_CMDS_RESVD	MPI3MR_HOSTTAG_DEVRMCMD_MAX
11062306a36Sopenharmony_ci#define MPI3MR_NUM_EVTACKCMD		4
11162306a36Sopenharmony_ci#define MPI3MR_HOSTTAG_EVTACKCMD_MIN	(MPI3MR_HOSTTAG_DEVRMCMD_MAX + 1)
11262306a36Sopenharmony_ci#define MPI3MR_HOSTTAG_EVTACKCMD_MAX	(MPI3MR_HOSTTAG_EVTACKCMD_MIN + \
11362306a36Sopenharmony_ci					MPI3MR_NUM_EVTACKCMD - 1)
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci/* Reduced resource count definition for crash kernel */
11662306a36Sopenharmony_ci#define MPI3MR_HOST_IOS_KDUMP		128
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci/* command/controller interaction timeout definitions in seconds */
11962306a36Sopenharmony_ci#define MPI3MR_INTADMCMD_TIMEOUT		60
12062306a36Sopenharmony_ci#define MPI3MR_PORTENABLE_TIMEOUT		300
12162306a36Sopenharmony_ci#define MPI3MR_PORTENABLE_POLL_INTERVAL		5
12262306a36Sopenharmony_ci#define MPI3MR_ABORTTM_TIMEOUT			60
12362306a36Sopenharmony_ci#define MPI3MR_RESETTM_TIMEOUT			60
12462306a36Sopenharmony_ci#define MPI3MR_RESET_HOST_IOWAIT_TIMEOUT	5
12562306a36Sopenharmony_ci#define MPI3MR_TSUPDATE_INTERVAL		900
12662306a36Sopenharmony_ci#define MPI3MR_DEFAULT_SHUTDOWN_TIME		120
12762306a36Sopenharmony_ci#define	MPI3MR_RAID_ERRREC_RESET_TIMEOUT	180
12862306a36Sopenharmony_ci#define MPI3MR_PREPARE_FOR_RESET_TIMEOUT	180
12962306a36Sopenharmony_ci#define MPI3MR_RESET_ACK_TIMEOUT		30
13062306a36Sopenharmony_ci#define MPI3MR_MUR_TIMEOUT			120
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci#define MPI3MR_WATCHDOG_INTERVAL		1000 /* in milli seconds */
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci#define MPI3MR_DEFAULT_CFG_PAGE_SZ		1024 /* in bytes */
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci#define MPI3MR_RESET_TOPOLOGY_SETTLE_TIME	10
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci#define MPI3MR_SCMD_TIMEOUT    (60 * HZ)
13962306a36Sopenharmony_ci#define MPI3MR_EH_SCMD_TIMEOUT (60 * HZ)
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci/* Internal admin command state definitions*/
14262306a36Sopenharmony_ci#define MPI3MR_CMD_NOTUSED	0x8000
14362306a36Sopenharmony_ci#define MPI3MR_CMD_COMPLETE	0x0001
14462306a36Sopenharmony_ci#define MPI3MR_CMD_PENDING	0x0002
14562306a36Sopenharmony_ci#define MPI3MR_CMD_REPLY_VALID	0x0004
14662306a36Sopenharmony_ci#define MPI3MR_CMD_RESET	0x0008
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci/* Definitions for Event replies and sense buffer allocated per controller */
14962306a36Sopenharmony_ci#define MPI3MR_NUM_EVT_REPLIES	64
15062306a36Sopenharmony_ci#define MPI3MR_SENSE_BUF_SZ	256
15162306a36Sopenharmony_ci#define MPI3MR_SENSEBUF_FACTOR	3
15262306a36Sopenharmony_ci#define MPI3MR_CHAINBUF_FACTOR	3
15362306a36Sopenharmony_ci#define MPI3MR_CHAINBUFDIX_FACTOR	2
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci/* Invalid target device handle */
15662306a36Sopenharmony_ci#define MPI3MR_INVALID_DEV_HANDLE	0xFFFF
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci/* Controller Reset related definitions */
15962306a36Sopenharmony_ci#define MPI3MR_HOSTDIAG_UNLOCK_RETRY_COUNT	5
16062306a36Sopenharmony_ci#define MPI3MR_MAX_RESET_RETRY_COUNT		3
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci/* ResponseCode definitions */
16362306a36Sopenharmony_ci#define MPI3MR_RI_MASK_RESPCODE		(0x000000FF)
16462306a36Sopenharmony_ci#define MPI3MR_RSP_IO_QUEUED_ON_IOC \
16562306a36Sopenharmony_ci			MPI3_SCSITASKMGMT_RSPCODE_IO_QUEUED_ON_IOC
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_ci#define MPI3MR_DEFAULT_MDTS	(128 * 1024)
16862306a36Sopenharmony_ci#define MPI3MR_DEFAULT_PGSZEXP         (12)
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci/* Command retry count definitions */
17162306a36Sopenharmony_ci#define MPI3MR_DEV_RMHS_RETRY_COUNT 3
17262306a36Sopenharmony_ci#define MPI3MR_PEL_RETRY_COUNT 3
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci/* Default target device queue depth */
17562306a36Sopenharmony_ci#define MPI3MR_DEFAULT_SDEV_QD	32
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_ci/* Definitions for Threaded IRQ poll*/
17862306a36Sopenharmony_ci#define MPI3MR_IRQ_POLL_SLEEP			2
17962306a36Sopenharmony_ci#define MPI3MR_IRQ_POLL_TRIGGER_IOCOUNT		8
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci/* Definitions for the controller security status*/
18262306a36Sopenharmony_ci#define MPI3MR_CTLR_SECURITY_STATUS_MASK	0x0C
18362306a36Sopenharmony_ci#define MPI3MR_CTLR_SECURE_DBG_STATUS_MASK	0x02
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci#define MPI3MR_INVALID_DEVICE			0x00
18662306a36Sopenharmony_ci#define MPI3MR_CONFIG_SECURE_DEVICE		0x04
18762306a36Sopenharmony_ci#define MPI3MR_HARD_SECURE_DEVICE		0x08
18862306a36Sopenharmony_ci#define MPI3MR_TAMPERED_DEVICE			0x0C
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci/* SGE Flag definition */
19162306a36Sopenharmony_ci#define MPI3MR_SGEFLAGS_SYSTEM_SIMPLE_END_OF_LIST \
19262306a36Sopenharmony_ci	(MPI3_SGE_FLAGS_ELEMENT_TYPE_SIMPLE | MPI3_SGE_FLAGS_DLAS_SYSTEM | \
19362306a36Sopenharmony_ci	MPI3_SGE_FLAGS_END_OF_LIST)
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci/* MSI Index from Reply Queue Index */
19662306a36Sopenharmony_ci#define REPLY_QUEUE_IDX_TO_MSIX_IDX(qidx, offset)	(qidx + offset)
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_ci/*
19962306a36Sopenharmony_ci * Maximum data transfer size definitions for management
20062306a36Sopenharmony_ci * application commands
20162306a36Sopenharmony_ci */
20262306a36Sopenharmony_ci#define MPI3MR_MAX_APP_XFER_SIZE	(1 * 1024 * 1024)
20362306a36Sopenharmony_ci#define MPI3MR_MAX_APP_XFER_SEGMENTS	512
20462306a36Sopenharmony_ci/*
20562306a36Sopenharmony_ci * 2048 sectors are for data buffers and additional 512 sectors for
20662306a36Sopenharmony_ci * other buffers
20762306a36Sopenharmony_ci */
20862306a36Sopenharmony_ci#define MPI3MR_MAX_APP_XFER_SECTORS	(2048 + 512)
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci#define MPI3MR_WRITE_SAME_MAX_LEN_256_BLKS 256
21162306a36Sopenharmony_ci#define MPI3MR_WRITE_SAME_MAX_LEN_2048_BLKS 2048
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci/**
21462306a36Sopenharmony_ci * struct mpi3mr_nvme_pt_sge -  Structure to store SGEs for NVMe
21562306a36Sopenharmony_ci * Encapsulated commands.
21662306a36Sopenharmony_ci *
21762306a36Sopenharmony_ci * @base_addr: Physical address
21862306a36Sopenharmony_ci * @length: SGE length
21962306a36Sopenharmony_ci * @rsvd: Reserved
22062306a36Sopenharmony_ci * @rsvd1: Reserved
22162306a36Sopenharmony_ci * @sgl_type: sgl type
22262306a36Sopenharmony_ci */
22362306a36Sopenharmony_cistruct mpi3mr_nvme_pt_sge {
22462306a36Sopenharmony_ci	u64 base_addr;
22562306a36Sopenharmony_ci	u32 length;
22662306a36Sopenharmony_ci	u16 rsvd;
22762306a36Sopenharmony_ci	u8 rsvd1;
22862306a36Sopenharmony_ci	u8 sgl_type;
22962306a36Sopenharmony_ci};
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_ci/**
23262306a36Sopenharmony_ci * struct mpi3mr_buf_map -  local structure to
23362306a36Sopenharmony_ci * track kernel and user buffers associated with an BSG
23462306a36Sopenharmony_ci * structure.
23562306a36Sopenharmony_ci *
23662306a36Sopenharmony_ci * @bsg_buf: BSG buffer virtual address
23762306a36Sopenharmony_ci * @bsg_buf_len:  BSG buffer length
23862306a36Sopenharmony_ci * @kern_buf: Kernel buffer virtual address
23962306a36Sopenharmony_ci * @kern_buf_len: Kernel buffer length
24062306a36Sopenharmony_ci * @kern_buf_dma: Kernel buffer DMA address
24162306a36Sopenharmony_ci * @data_dir: Data direction.
24262306a36Sopenharmony_ci */
24362306a36Sopenharmony_cistruct mpi3mr_buf_map {
24462306a36Sopenharmony_ci	void *bsg_buf;
24562306a36Sopenharmony_ci	u32 bsg_buf_len;
24662306a36Sopenharmony_ci	void *kern_buf;
24762306a36Sopenharmony_ci	u32 kern_buf_len;
24862306a36Sopenharmony_ci	dma_addr_t kern_buf_dma;
24962306a36Sopenharmony_ci	u8 data_dir;
25062306a36Sopenharmony_ci};
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci/* IOC State definitions */
25362306a36Sopenharmony_cienum mpi3mr_iocstate {
25462306a36Sopenharmony_ci	MRIOC_STATE_READY = 1,
25562306a36Sopenharmony_ci	MRIOC_STATE_RESET,
25662306a36Sopenharmony_ci	MRIOC_STATE_FAULT,
25762306a36Sopenharmony_ci	MRIOC_STATE_BECOMING_READY,
25862306a36Sopenharmony_ci	MRIOC_STATE_RESET_REQUESTED,
25962306a36Sopenharmony_ci	MRIOC_STATE_UNRECOVERABLE,
26062306a36Sopenharmony_ci};
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci/* Reset reason code definitions*/
26362306a36Sopenharmony_cienum mpi3mr_reset_reason {
26462306a36Sopenharmony_ci	MPI3MR_RESET_FROM_BRINGUP = 1,
26562306a36Sopenharmony_ci	MPI3MR_RESET_FROM_FAULT_WATCH = 2,
26662306a36Sopenharmony_ci	MPI3MR_RESET_FROM_APP = 3,
26762306a36Sopenharmony_ci	MPI3MR_RESET_FROM_EH_HOS = 4,
26862306a36Sopenharmony_ci	MPI3MR_RESET_FROM_TM_TIMEOUT = 5,
26962306a36Sopenharmony_ci	MPI3MR_RESET_FROM_APP_TIMEOUT = 6,
27062306a36Sopenharmony_ci	MPI3MR_RESET_FROM_MUR_FAILURE = 7,
27162306a36Sopenharmony_ci	MPI3MR_RESET_FROM_CTLR_CLEANUP = 8,
27262306a36Sopenharmony_ci	MPI3MR_RESET_FROM_CIACTIV_FAULT = 9,
27362306a36Sopenharmony_ci	MPI3MR_RESET_FROM_PE_TIMEOUT = 10,
27462306a36Sopenharmony_ci	MPI3MR_RESET_FROM_TSU_TIMEOUT = 11,
27562306a36Sopenharmony_ci	MPI3MR_RESET_FROM_DELREQQ_TIMEOUT = 12,
27662306a36Sopenharmony_ci	MPI3MR_RESET_FROM_DELREPQ_TIMEOUT = 13,
27762306a36Sopenharmony_ci	MPI3MR_RESET_FROM_CREATEREPQ_TIMEOUT = 14,
27862306a36Sopenharmony_ci	MPI3MR_RESET_FROM_CREATEREQQ_TIMEOUT = 15,
27962306a36Sopenharmony_ci	MPI3MR_RESET_FROM_IOCFACTS_TIMEOUT = 16,
28062306a36Sopenharmony_ci	MPI3MR_RESET_FROM_IOCINIT_TIMEOUT = 17,
28162306a36Sopenharmony_ci	MPI3MR_RESET_FROM_EVTNOTIFY_TIMEOUT = 18,
28262306a36Sopenharmony_ci	MPI3MR_RESET_FROM_EVTACK_TIMEOUT = 19,
28362306a36Sopenharmony_ci	MPI3MR_RESET_FROM_CIACTVRST_TIMER = 20,
28462306a36Sopenharmony_ci	MPI3MR_RESET_FROM_GETPKGVER_TIMEOUT = 21,
28562306a36Sopenharmony_ci	MPI3MR_RESET_FROM_PELABORT_TIMEOUT = 22,
28662306a36Sopenharmony_ci	MPI3MR_RESET_FROM_SYSFS = 23,
28762306a36Sopenharmony_ci	MPI3MR_RESET_FROM_SYSFS_TIMEOUT = 24,
28862306a36Sopenharmony_ci	MPI3MR_RESET_FROM_FIRMWARE = 27,
28962306a36Sopenharmony_ci	MPI3MR_RESET_FROM_CFG_REQ_TIMEOUT = 29,
29062306a36Sopenharmony_ci	MPI3MR_RESET_FROM_SAS_TRANSPORT_TIMEOUT = 30,
29162306a36Sopenharmony_ci};
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_ci/* Queue type definitions */
29462306a36Sopenharmony_cienum queue_type {
29562306a36Sopenharmony_ci	MPI3MR_DEFAULT_QUEUE = 0,
29662306a36Sopenharmony_ci	MPI3MR_POLL_QUEUE,
29762306a36Sopenharmony_ci};
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_ci/**
30062306a36Sopenharmony_ci * struct mpi3mr_compimg_ver - replica of component image
30162306a36Sopenharmony_ci * version defined in mpi30_image.h in host endianness
30262306a36Sopenharmony_ci *
30362306a36Sopenharmony_ci */
30462306a36Sopenharmony_cistruct mpi3mr_compimg_ver {
30562306a36Sopenharmony_ci	u16 build_num;
30662306a36Sopenharmony_ci	u16 cust_id;
30762306a36Sopenharmony_ci	u8 ph_minor;
30862306a36Sopenharmony_ci	u8 ph_major;
30962306a36Sopenharmony_ci	u8 gen_minor;
31062306a36Sopenharmony_ci	u8 gen_major;
31162306a36Sopenharmony_ci};
31262306a36Sopenharmony_ci
31362306a36Sopenharmony_ci/**
31462306a36Sopenharmony_ci * struct mpi3mr_ioc_facs - replica of component image version
31562306a36Sopenharmony_ci * defined in mpi30_ioc.h in host endianness
31662306a36Sopenharmony_ci *
31762306a36Sopenharmony_ci */
31862306a36Sopenharmony_cistruct mpi3mr_ioc_facts {
31962306a36Sopenharmony_ci	u32 ioc_capabilities;
32062306a36Sopenharmony_ci	struct mpi3mr_compimg_ver fw_ver;
32162306a36Sopenharmony_ci	u32 mpi_version;
32262306a36Sopenharmony_ci	u16 max_reqs;
32362306a36Sopenharmony_ci	u16 product_id;
32462306a36Sopenharmony_ci	u16 op_req_sz;
32562306a36Sopenharmony_ci	u16 reply_sz;
32662306a36Sopenharmony_ci	u16 exceptions;
32762306a36Sopenharmony_ci	u16 max_perids;
32862306a36Sopenharmony_ci	u16 max_pds;
32962306a36Sopenharmony_ci	u16 max_sasexpanders;
33062306a36Sopenharmony_ci	u32 max_data_length;
33162306a36Sopenharmony_ci	u16 max_sasinitiators;
33262306a36Sopenharmony_ci	u16 max_enclosures;
33362306a36Sopenharmony_ci	u16 max_pcie_switches;
33462306a36Sopenharmony_ci	u16 max_nvme;
33562306a36Sopenharmony_ci	u16 max_vds;
33662306a36Sopenharmony_ci	u16 max_hpds;
33762306a36Sopenharmony_ci	u16 max_advhpds;
33862306a36Sopenharmony_ci	u16 max_raid_pds;
33962306a36Sopenharmony_ci	u16 min_devhandle;
34062306a36Sopenharmony_ci	u16 max_devhandle;
34162306a36Sopenharmony_ci	u16 max_op_req_q;
34262306a36Sopenharmony_ci	u16 max_op_reply_q;
34362306a36Sopenharmony_ci	u16 shutdown_timeout;
34462306a36Sopenharmony_ci	u8 ioc_num;
34562306a36Sopenharmony_ci	u8 who_init;
34662306a36Sopenharmony_ci	u16 max_msix_vectors;
34762306a36Sopenharmony_ci	u8 personality;
34862306a36Sopenharmony_ci	u8 dma_mask;
34962306a36Sopenharmony_ci	u8 protocol_flags;
35062306a36Sopenharmony_ci	u8 sge_mod_mask;
35162306a36Sopenharmony_ci	u8 sge_mod_value;
35262306a36Sopenharmony_ci	u8 sge_mod_shift;
35362306a36Sopenharmony_ci	u8 max_dev_per_tg;
35462306a36Sopenharmony_ci	u16 max_io_throttle_group;
35562306a36Sopenharmony_ci	u16 io_throttle_data_length;
35662306a36Sopenharmony_ci	u16 io_throttle_low;
35762306a36Sopenharmony_ci	u16 io_throttle_high;
35862306a36Sopenharmony_ci
35962306a36Sopenharmony_ci};
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_ci/**
36262306a36Sopenharmony_ci * struct segments - memory descriptor structure to store
36362306a36Sopenharmony_ci * virtual and dma addresses for operational queue segments.
36462306a36Sopenharmony_ci *
36562306a36Sopenharmony_ci * @segment: virtual address
36662306a36Sopenharmony_ci * @segment_dma: dma address
36762306a36Sopenharmony_ci */
36862306a36Sopenharmony_cistruct segments {
36962306a36Sopenharmony_ci	void *segment;
37062306a36Sopenharmony_ci	dma_addr_t segment_dma;
37162306a36Sopenharmony_ci};
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ci/**
37462306a36Sopenharmony_ci * struct op_req_qinfo -  Operational Request Queue Information
37562306a36Sopenharmony_ci *
37662306a36Sopenharmony_ci * @ci: consumer index
37762306a36Sopenharmony_ci * @pi: producer index
37862306a36Sopenharmony_ci * @num_request: Maximum number of entries in the queue
37962306a36Sopenharmony_ci * @qid: Queue Id starting from 1
38062306a36Sopenharmony_ci * @reply_qid: Associated reply queue Id
38162306a36Sopenharmony_ci * @num_segments: Number of discontiguous memory segments
38262306a36Sopenharmony_ci * @segment_qd: Depth of each segments
38362306a36Sopenharmony_ci * @q_lock: Concurrent queue access lock
38462306a36Sopenharmony_ci * @q_segments: Segment descriptor pointer
38562306a36Sopenharmony_ci * @q_segment_list: Segment list base virtual address
38662306a36Sopenharmony_ci * @q_segment_list_dma: Segment list base DMA address
38762306a36Sopenharmony_ci */
38862306a36Sopenharmony_cistruct op_req_qinfo {
38962306a36Sopenharmony_ci	u16 ci;
39062306a36Sopenharmony_ci	u16 pi;
39162306a36Sopenharmony_ci	u16 num_requests;
39262306a36Sopenharmony_ci	u16 qid;
39362306a36Sopenharmony_ci	u16 reply_qid;
39462306a36Sopenharmony_ci	u16 num_segments;
39562306a36Sopenharmony_ci	u16 segment_qd;
39662306a36Sopenharmony_ci	spinlock_t q_lock;
39762306a36Sopenharmony_ci	struct segments *q_segments;
39862306a36Sopenharmony_ci	void *q_segment_list;
39962306a36Sopenharmony_ci	dma_addr_t q_segment_list_dma;
40062306a36Sopenharmony_ci};
40162306a36Sopenharmony_ci
40262306a36Sopenharmony_ci/**
40362306a36Sopenharmony_ci * struct op_reply_qinfo -  Operational Reply Queue Information
40462306a36Sopenharmony_ci *
40562306a36Sopenharmony_ci * @ci: consumer index
40662306a36Sopenharmony_ci * @qid: Queue Id starting from 1
40762306a36Sopenharmony_ci * @num_replies: Maximum number of entries in the queue
40862306a36Sopenharmony_ci * @num_segments: Number of discontiguous memory segments
40962306a36Sopenharmony_ci * @segment_qd: Depth of each segments
41062306a36Sopenharmony_ci * @q_segments: Segment descriptor pointer
41162306a36Sopenharmony_ci * @q_segment_list: Segment list base virtual address
41262306a36Sopenharmony_ci * @q_segment_list_dma: Segment list base DMA address
41362306a36Sopenharmony_ci * @ephase: Expected phased identifier for the reply queue
41462306a36Sopenharmony_ci * @pend_ios: Number of IOs pending in HW for this queue
41562306a36Sopenharmony_ci * @enable_irq_poll: Flag to indicate polling is enabled
41662306a36Sopenharmony_ci * @in_use: Queue is handled by poll/ISR
41762306a36Sopenharmony_ci * @qtype: Type of queue (types defined in enum queue_type)
41862306a36Sopenharmony_ci */
41962306a36Sopenharmony_cistruct op_reply_qinfo {
42062306a36Sopenharmony_ci	u16 ci;
42162306a36Sopenharmony_ci	u16 qid;
42262306a36Sopenharmony_ci	u16 num_replies;
42362306a36Sopenharmony_ci	u16 num_segments;
42462306a36Sopenharmony_ci	u16 segment_qd;
42562306a36Sopenharmony_ci	struct segments *q_segments;
42662306a36Sopenharmony_ci	void *q_segment_list;
42762306a36Sopenharmony_ci	dma_addr_t q_segment_list_dma;
42862306a36Sopenharmony_ci	u8 ephase;
42962306a36Sopenharmony_ci	atomic_t pend_ios;
43062306a36Sopenharmony_ci	bool enable_irq_poll;
43162306a36Sopenharmony_ci	atomic_t in_use;
43262306a36Sopenharmony_ci	enum queue_type qtype;
43362306a36Sopenharmony_ci};
43462306a36Sopenharmony_ci
43562306a36Sopenharmony_ci/**
43662306a36Sopenharmony_ci * struct mpi3mr_intr_info -  Interrupt cookie information
43762306a36Sopenharmony_ci *
43862306a36Sopenharmony_ci * @mrioc: Adapter instance reference
43962306a36Sopenharmony_ci * @os_irq: irq number
44062306a36Sopenharmony_ci * @msix_index: MSIx index
44162306a36Sopenharmony_ci * @op_reply_q: Associated operational reply queue
44262306a36Sopenharmony_ci * @name: Dev name for the irq claiming device
44362306a36Sopenharmony_ci */
44462306a36Sopenharmony_cistruct mpi3mr_intr_info {
44562306a36Sopenharmony_ci	struct mpi3mr_ioc *mrioc;
44662306a36Sopenharmony_ci	int os_irq;
44762306a36Sopenharmony_ci	u16 msix_index;
44862306a36Sopenharmony_ci	struct op_reply_qinfo *op_reply_q;
44962306a36Sopenharmony_ci	char name[MPI3MR_NAME_LENGTH];
45062306a36Sopenharmony_ci};
45162306a36Sopenharmony_ci
45262306a36Sopenharmony_ci/**
45362306a36Sopenharmony_ci * struct mpi3mr_throttle_group_info - Throttle group info
45462306a36Sopenharmony_ci *
45562306a36Sopenharmony_ci * @io_divert: Flag indicates io divert is on or off for the TG
45662306a36Sopenharmony_ci * @need_qd_reduction: Flag to indicate QD reduction is needed
45762306a36Sopenharmony_ci * @qd_reduction: Queue Depth reduction in units of 10%
45862306a36Sopenharmony_ci * @fw_qd: QueueDepth value reported by the firmware
45962306a36Sopenharmony_ci * @modified_qd: Modified QueueDepth value due to throttling
46062306a36Sopenharmony_ci * @id: Throttle Group ID.
46162306a36Sopenharmony_ci * @high: High limit to turn on throttling in 512 byte blocks
46262306a36Sopenharmony_ci * @low: Low limit to turn off throttling in 512 byte blocks
46362306a36Sopenharmony_ci * @pend_large_data_sz: Counter to track pending large data
46462306a36Sopenharmony_ci */
46562306a36Sopenharmony_cistruct mpi3mr_throttle_group_info {
46662306a36Sopenharmony_ci	u8 io_divert;
46762306a36Sopenharmony_ci	u8 need_qd_reduction;
46862306a36Sopenharmony_ci	u8 qd_reduction;
46962306a36Sopenharmony_ci	u16 fw_qd;
47062306a36Sopenharmony_ci	u16 modified_qd;
47162306a36Sopenharmony_ci	u16 id;
47262306a36Sopenharmony_ci	u32 high;
47362306a36Sopenharmony_ci	u32 low;
47462306a36Sopenharmony_ci	atomic_t pend_large_data_sz;
47562306a36Sopenharmony_ci};
47662306a36Sopenharmony_ci
47762306a36Sopenharmony_ci/* HBA port flags */
47862306a36Sopenharmony_ci#define MPI3MR_HBA_PORT_FLAG_DIRTY	0x01
47962306a36Sopenharmony_ci
48062306a36Sopenharmony_ci/**
48162306a36Sopenharmony_ci * struct mpi3mr_hba_port - HBA's port information
48262306a36Sopenharmony_ci * @port_id: Port number
48362306a36Sopenharmony_ci * @flags: HBA port flags
48462306a36Sopenharmony_ci */
48562306a36Sopenharmony_cistruct mpi3mr_hba_port {
48662306a36Sopenharmony_ci	struct list_head list;
48762306a36Sopenharmony_ci	u8 port_id;
48862306a36Sopenharmony_ci	u8 flags;
48962306a36Sopenharmony_ci};
49062306a36Sopenharmony_ci
49162306a36Sopenharmony_ci/**
49262306a36Sopenharmony_ci * struct mpi3mr_sas_port - Internal SAS port information
49362306a36Sopenharmony_ci * @port_list: List of ports belonging to a SAS node
49462306a36Sopenharmony_ci * @num_phys: Number of phys associated with port
49562306a36Sopenharmony_ci * @marked_responding: used while refresing the sas ports
49662306a36Sopenharmony_ci * @lowest_phy: lowest phy ID of current sas port
49762306a36Sopenharmony_ci * @phy_mask: phy_mask of current sas port
49862306a36Sopenharmony_ci * @hba_port: HBA port entry
49962306a36Sopenharmony_ci * @remote_identify: Attached device identification
50062306a36Sopenharmony_ci * @rphy: SAS transport layer rphy object
50162306a36Sopenharmony_ci * @port: SAS transport layer port object
50262306a36Sopenharmony_ci * @phy_list: mpi3mr_sas_phy objects belonging to this port
50362306a36Sopenharmony_ci */
50462306a36Sopenharmony_cistruct mpi3mr_sas_port {
50562306a36Sopenharmony_ci	struct list_head port_list;
50662306a36Sopenharmony_ci	u8 num_phys;
50762306a36Sopenharmony_ci	u8 marked_responding;
50862306a36Sopenharmony_ci	int lowest_phy;
50962306a36Sopenharmony_ci	u32 phy_mask;
51062306a36Sopenharmony_ci	struct mpi3mr_hba_port *hba_port;
51162306a36Sopenharmony_ci	struct sas_identify remote_identify;
51262306a36Sopenharmony_ci	struct sas_rphy *rphy;
51362306a36Sopenharmony_ci	struct sas_port *port;
51462306a36Sopenharmony_ci	struct list_head phy_list;
51562306a36Sopenharmony_ci};
51662306a36Sopenharmony_ci
51762306a36Sopenharmony_ci/**
51862306a36Sopenharmony_ci * struct mpi3mr_sas_phy - Internal SAS Phy information
51962306a36Sopenharmony_ci * @port_siblings: List of phys belonging to a port
52062306a36Sopenharmony_ci * @identify: Phy identification
52162306a36Sopenharmony_ci * @remote_identify: Attached device identification
52262306a36Sopenharmony_ci * @phy: SAS transport layer Phy object
52362306a36Sopenharmony_ci * @phy_id: Unique phy id within a port
52462306a36Sopenharmony_ci * @handle: Firmware device handle for this phy
52562306a36Sopenharmony_ci * @attached_handle: Firmware device handle for attached device
52662306a36Sopenharmony_ci * @phy_belongs_to_port: Flag to indicate phy belongs to port
52762306a36Sopenharmony_ci   @hba_port: HBA port entry
52862306a36Sopenharmony_ci */
52962306a36Sopenharmony_cistruct mpi3mr_sas_phy {
53062306a36Sopenharmony_ci	struct list_head port_siblings;
53162306a36Sopenharmony_ci	struct sas_identify identify;
53262306a36Sopenharmony_ci	struct sas_identify remote_identify;
53362306a36Sopenharmony_ci	struct sas_phy *phy;
53462306a36Sopenharmony_ci	u8 phy_id;
53562306a36Sopenharmony_ci	u16 handle;
53662306a36Sopenharmony_ci	u16 attached_handle;
53762306a36Sopenharmony_ci	u8 phy_belongs_to_port;
53862306a36Sopenharmony_ci	struct mpi3mr_hba_port *hba_port;
53962306a36Sopenharmony_ci};
54062306a36Sopenharmony_ci
54162306a36Sopenharmony_ci/**
54262306a36Sopenharmony_ci * struct mpi3mr_sas_node - SAS host/expander information
54362306a36Sopenharmony_ci * @list: List of sas nodes in a controller
54462306a36Sopenharmony_ci * @parent_dev: Parent device class
54562306a36Sopenharmony_ci * @num_phys: Number phys belonging to sas_node
54662306a36Sopenharmony_ci * @sas_address: SAS address of sas_node
54762306a36Sopenharmony_ci * @handle: Firmware device handle for this sas_host/expander
54862306a36Sopenharmony_ci * @sas_address_parent: SAS address of parent expander or host
54962306a36Sopenharmony_ci * @enclosure_handle: Firmware handle of enclosure of this node
55062306a36Sopenharmony_ci * @device_info: Capabilities of this sas_host/expander
55162306a36Sopenharmony_ci * @non_responding: used to refresh the expander devices during reset
55262306a36Sopenharmony_ci * @host_node: Flag to indicate this is a host_node
55362306a36Sopenharmony_ci * @hba_port: HBA port entry
55462306a36Sopenharmony_ci * @phy: A list of phys that make up this sas_host/expander
55562306a36Sopenharmony_ci * @sas_port_list: List of internal ports of this node
55662306a36Sopenharmony_ci * @rphy: sas_rphy object of this expander node
55762306a36Sopenharmony_ci */
55862306a36Sopenharmony_cistruct mpi3mr_sas_node {
55962306a36Sopenharmony_ci	struct list_head list;
56062306a36Sopenharmony_ci	struct device *parent_dev;
56162306a36Sopenharmony_ci	u8 num_phys;
56262306a36Sopenharmony_ci	u64 sas_address;
56362306a36Sopenharmony_ci	u16 handle;
56462306a36Sopenharmony_ci	u64 sas_address_parent;
56562306a36Sopenharmony_ci	u16 enclosure_handle;
56662306a36Sopenharmony_ci	u64 enclosure_logical_id;
56762306a36Sopenharmony_ci	u8 non_responding;
56862306a36Sopenharmony_ci	u8 host_node;
56962306a36Sopenharmony_ci	struct mpi3mr_hba_port *hba_port;
57062306a36Sopenharmony_ci	struct mpi3mr_sas_phy *phy;
57162306a36Sopenharmony_ci	struct list_head sas_port_list;
57262306a36Sopenharmony_ci	struct sas_rphy *rphy;
57362306a36Sopenharmony_ci};
57462306a36Sopenharmony_ci
57562306a36Sopenharmony_ci/**
57662306a36Sopenharmony_ci * struct mpi3mr_enclosure_node - enclosure information
57762306a36Sopenharmony_ci * @list: List of enclosures
57862306a36Sopenharmony_ci * @pg0: Enclosure page 0;
57962306a36Sopenharmony_ci */
58062306a36Sopenharmony_cistruct mpi3mr_enclosure_node {
58162306a36Sopenharmony_ci	struct list_head list;
58262306a36Sopenharmony_ci	struct mpi3_enclosure_page0 pg0;
58362306a36Sopenharmony_ci};
58462306a36Sopenharmony_ci
58562306a36Sopenharmony_ci/**
58662306a36Sopenharmony_ci * struct tgt_dev_sas_sata - SAS/SATA device specific
58762306a36Sopenharmony_ci * information cached from firmware given data
58862306a36Sopenharmony_ci *
58962306a36Sopenharmony_ci * @sas_address: World wide unique SAS address
59062306a36Sopenharmony_ci * @sas_address_parent: Sas address of parent expander or host
59162306a36Sopenharmony_ci * @dev_info: Device information bits
59262306a36Sopenharmony_ci * @phy_id: Phy identifier provided in device page 0
59362306a36Sopenharmony_ci * @attached_phy_id: Attached phy identifier provided in device page 0
59462306a36Sopenharmony_ci * @sas_transport_attached: Is this device exposed to transport
59562306a36Sopenharmony_ci * @pend_sas_rphy_add: Flag to check device is in process of add
59662306a36Sopenharmony_ci * @hba_port: HBA port entry
59762306a36Sopenharmony_ci * @rphy: SAS transport layer rphy object
59862306a36Sopenharmony_ci */
59962306a36Sopenharmony_cistruct tgt_dev_sas_sata {
60062306a36Sopenharmony_ci	u64 sas_address;
60162306a36Sopenharmony_ci	u64 sas_address_parent;
60262306a36Sopenharmony_ci	u16 dev_info;
60362306a36Sopenharmony_ci	u8 phy_id;
60462306a36Sopenharmony_ci	u8 attached_phy_id;
60562306a36Sopenharmony_ci	u8 sas_transport_attached;
60662306a36Sopenharmony_ci	u8 pend_sas_rphy_add;
60762306a36Sopenharmony_ci	struct mpi3mr_hba_port *hba_port;
60862306a36Sopenharmony_ci	struct sas_rphy *rphy;
60962306a36Sopenharmony_ci};
61062306a36Sopenharmony_ci
61162306a36Sopenharmony_ci/**
61262306a36Sopenharmony_ci * struct tgt_dev_pcie - PCIe device specific information cached
61362306a36Sopenharmony_ci * from firmware given data
61462306a36Sopenharmony_ci *
61562306a36Sopenharmony_ci * @mdts: Maximum data transfer size
61662306a36Sopenharmony_ci * @capb: Device capabilities
61762306a36Sopenharmony_ci * @pgsz: Device page size
61862306a36Sopenharmony_ci * @abort_to: Timeout for abort TM
61962306a36Sopenharmony_ci * @reset_to: Timeout for Target/LUN reset TM
62062306a36Sopenharmony_ci * @dev_info: Device information bits
62162306a36Sopenharmony_ci */
62262306a36Sopenharmony_cistruct tgt_dev_pcie {
62362306a36Sopenharmony_ci	u32 mdts;
62462306a36Sopenharmony_ci	u16 capb;
62562306a36Sopenharmony_ci	u8 pgsz;
62662306a36Sopenharmony_ci	u8 abort_to;
62762306a36Sopenharmony_ci	u8 reset_to;
62862306a36Sopenharmony_ci	u16 dev_info;
62962306a36Sopenharmony_ci};
63062306a36Sopenharmony_ci
63162306a36Sopenharmony_ci/**
63262306a36Sopenharmony_ci * struct tgt_dev_vd - virtual device specific information
63362306a36Sopenharmony_ci * cached from firmware given data
63462306a36Sopenharmony_ci *
63562306a36Sopenharmony_ci * @state: State of the VD
63662306a36Sopenharmony_ci * @tg_qd_reduction: Queue Depth reduction in units of 10%
63762306a36Sopenharmony_ci * @tg_id: VDs throttle group ID
63862306a36Sopenharmony_ci * @high: High limit to turn on throttling in 512 byte blocks
63962306a36Sopenharmony_ci * @low: Low limit to turn off throttling in 512 byte blocks
64062306a36Sopenharmony_ci * @tg: Pointer to throttle group info
64162306a36Sopenharmony_ci */
64262306a36Sopenharmony_cistruct tgt_dev_vd {
64362306a36Sopenharmony_ci	u8 state;
64462306a36Sopenharmony_ci	u8 tg_qd_reduction;
64562306a36Sopenharmony_ci	u16 tg_id;
64662306a36Sopenharmony_ci	u32 tg_high;
64762306a36Sopenharmony_ci	u32 tg_low;
64862306a36Sopenharmony_ci	struct mpi3mr_throttle_group_info *tg;
64962306a36Sopenharmony_ci};
65062306a36Sopenharmony_ci
65162306a36Sopenharmony_ci
65262306a36Sopenharmony_ci/**
65362306a36Sopenharmony_ci * union _form_spec_inf - union of device specific information
65462306a36Sopenharmony_ci */
65562306a36Sopenharmony_ciunion _form_spec_inf {
65662306a36Sopenharmony_ci	struct tgt_dev_sas_sata sas_sata_inf;
65762306a36Sopenharmony_ci	struct tgt_dev_pcie pcie_inf;
65862306a36Sopenharmony_ci	struct tgt_dev_vd vd_inf;
65962306a36Sopenharmony_ci};
66062306a36Sopenharmony_ci
66162306a36Sopenharmony_cienum mpi3mr_dev_state {
66262306a36Sopenharmony_ci	MPI3MR_DEV_CREATED = 1,
66362306a36Sopenharmony_ci	MPI3MR_DEV_REMOVE_HS_STARTED = 2,
66462306a36Sopenharmony_ci	MPI3MR_DEV_DELETED = 3,
66562306a36Sopenharmony_ci};
66662306a36Sopenharmony_ci
66762306a36Sopenharmony_ci/**
66862306a36Sopenharmony_ci * struct mpi3mr_tgt_dev - target device data structure
66962306a36Sopenharmony_ci *
67062306a36Sopenharmony_ci * @list: List pointer
67162306a36Sopenharmony_ci * @starget: Scsi_target pointer
67262306a36Sopenharmony_ci * @dev_handle: FW device handle
67362306a36Sopenharmony_ci * @parent_handle: FW parent device handle
67462306a36Sopenharmony_ci * @slot: Slot number
67562306a36Sopenharmony_ci * @encl_handle: FW enclosure handle
67662306a36Sopenharmony_ci * @perst_id: FW assigned Persistent ID
67762306a36Sopenharmony_ci * @devpg0_flag: Device Page0 flag
67862306a36Sopenharmony_ci * @dev_type: SAS/SATA/PCIE device type
67962306a36Sopenharmony_ci * @is_hidden: Should be exposed to upper layers or not
68062306a36Sopenharmony_ci * @host_exposed: Already exposed to host or not
68162306a36Sopenharmony_ci * @io_unit_port: IO Unit port ID
68262306a36Sopenharmony_ci * @non_stl: Is this device not to be attached with SAS TL
68362306a36Sopenharmony_ci * @io_throttle_enabled: I/O throttling needed or not
68462306a36Sopenharmony_ci * @wslen: Write same max length
68562306a36Sopenharmony_ci * @q_depth: Device specific Queue Depth
68662306a36Sopenharmony_ci * @wwid: World wide ID
68762306a36Sopenharmony_ci * @enclosure_logical_id: Enclosure logical identifier
68862306a36Sopenharmony_ci * @dev_spec: Device type specific information
68962306a36Sopenharmony_ci * @ref_count: Reference count
69062306a36Sopenharmony_ci * @state: device state
69162306a36Sopenharmony_ci */
69262306a36Sopenharmony_cistruct mpi3mr_tgt_dev {
69362306a36Sopenharmony_ci	struct list_head list;
69462306a36Sopenharmony_ci	struct scsi_target *starget;
69562306a36Sopenharmony_ci	u16 dev_handle;
69662306a36Sopenharmony_ci	u16 parent_handle;
69762306a36Sopenharmony_ci	u16 slot;
69862306a36Sopenharmony_ci	u16 encl_handle;
69962306a36Sopenharmony_ci	u16 perst_id;
70062306a36Sopenharmony_ci	u16 devpg0_flag;
70162306a36Sopenharmony_ci	u8 dev_type;
70262306a36Sopenharmony_ci	u8 is_hidden;
70362306a36Sopenharmony_ci	u8 host_exposed;
70462306a36Sopenharmony_ci	u8 io_unit_port;
70562306a36Sopenharmony_ci	u8 non_stl;
70662306a36Sopenharmony_ci	u8 io_throttle_enabled;
70762306a36Sopenharmony_ci	u16 wslen;
70862306a36Sopenharmony_ci	u16 q_depth;
70962306a36Sopenharmony_ci	u64 wwid;
71062306a36Sopenharmony_ci	u64 enclosure_logical_id;
71162306a36Sopenharmony_ci	union _form_spec_inf dev_spec;
71262306a36Sopenharmony_ci	struct kref ref_count;
71362306a36Sopenharmony_ci	enum mpi3mr_dev_state state;
71462306a36Sopenharmony_ci};
71562306a36Sopenharmony_ci
71662306a36Sopenharmony_ci/**
71762306a36Sopenharmony_ci * mpi3mr_tgtdev_get - k reference incrementor
71862306a36Sopenharmony_ci * @s: Target device reference
71962306a36Sopenharmony_ci *
72062306a36Sopenharmony_ci * Increment target device reference count.
72162306a36Sopenharmony_ci */
72262306a36Sopenharmony_cistatic inline void mpi3mr_tgtdev_get(struct mpi3mr_tgt_dev *s)
72362306a36Sopenharmony_ci{
72462306a36Sopenharmony_ci	kref_get(&s->ref_count);
72562306a36Sopenharmony_ci}
72662306a36Sopenharmony_ci
72762306a36Sopenharmony_ci/**
72862306a36Sopenharmony_ci * mpi3mr_free_tgtdev - target device memory dealloctor
72962306a36Sopenharmony_ci * @r: k reference pointer of the target device
73062306a36Sopenharmony_ci *
73162306a36Sopenharmony_ci * Free target device memory when no reference.
73262306a36Sopenharmony_ci */
73362306a36Sopenharmony_cistatic inline void mpi3mr_free_tgtdev(struct kref *r)
73462306a36Sopenharmony_ci{
73562306a36Sopenharmony_ci	kfree(container_of(r, struct mpi3mr_tgt_dev, ref_count));
73662306a36Sopenharmony_ci}
73762306a36Sopenharmony_ci
73862306a36Sopenharmony_ci/**
73962306a36Sopenharmony_ci * mpi3mr_tgtdev_put - k reference decrementor
74062306a36Sopenharmony_ci * @s: Target device reference
74162306a36Sopenharmony_ci *
74262306a36Sopenharmony_ci * Decrement target device reference count.
74362306a36Sopenharmony_ci */
74462306a36Sopenharmony_cistatic inline void mpi3mr_tgtdev_put(struct mpi3mr_tgt_dev *s)
74562306a36Sopenharmony_ci{
74662306a36Sopenharmony_ci	kref_put(&s->ref_count, mpi3mr_free_tgtdev);
74762306a36Sopenharmony_ci}
74862306a36Sopenharmony_ci
74962306a36Sopenharmony_ci
75062306a36Sopenharmony_ci/**
75162306a36Sopenharmony_ci * struct mpi3mr_stgt_priv_data - SCSI target private structure
75262306a36Sopenharmony_ci *
75362306a36Sopenharmony_ci * @starget: Scsi_target pointer
75462306a36Sopenharmony_ci * @dev_handle: FW device handle
75562306a36Sopenharmony_ci * @perst_id: FW assigned Persistent ID
75662306a36Sopenharmony_ci * @num_luns: Number of Logical Units
75762306a36Sopenharmony_ci * @block_io: I/O blocked to the device or not
75862306a36Sopenharmony_ci * @dev_removed: Device removed in the Firmware
75962306a36Sopenharmony_ci * @dev_removedelay: Device is waiting to be removed in FW
76062306a36Sopenharmony_ci * @dev_type: Device type
76162306a36Sopenharmony_ci * @dev_nvme_dif: Device is NVMe DIF enabled
76262306a36Sopenharmony_ci * @wslen: Write same max length
76362306a36Sopenharmony_ci * @io_throttle_enabled: I/O throttling needed or not
76462306a36Sopenharmony_ci * @io_divert: Flag indicates io divert is on or off for the dev
76562306a36Sopenharmony_ci * @throttle_group: Pointer to throttle group info
76662306a36Sopenharmony_ci * @tgt_dev: Internal target device pointer
76762306a36Sopenharmony_ci * @pend_count: Counter to track pending I/Os during error
76862306a36Sopenharmony_ci *		handling
76962306a36Sopenharmony_ci */
77062306a36Sopenharmony_cistruct mpi3mr_stgt_priv_data {
77162306a36Sopenharmony_ci	struct scsi_target *starget;
77262306a36Sopenharmony_ci	u16 dev_handle;
77362306a36Sopenharmony_ci	u16 perst_id;
77462306a36Sopenharmony_ci	u32 num_luns;
77562306a36Sopenharmony_ci	atomic_t block_io;
77662306a36Sopenharmony_ci	u8 dev_removed;
77762306a36Sopenharmony_ci	u8 dev_removedelay;
77862306a36Sopenharmony_ci	u8 dev_type;
77962306a36Sopenharmony_ci	u8 dev_nvme_dif;
78062306a36Sopenharmony_ci	u16 wslen;
78162306a36Sopenharmony_ci	u8 io_throttle_enabled;
78262306a36Sopenharmony_ci	u8 io_divert;
78362306a36Sopenharmony_ci	struct mpi3mr_throttle_group_info *throttle_group;
78462306a36Sopenharmony_ci	struct mpi3mr_tgt_dev *tgt_dev;
78562306a36Sopenharmony_ci	u32 pend_count;
78662306a36Sopenharmony_ci};
78762306a36Sopenharmony_ci
78862306a36Sopenharmony_ci/**
78962306a36Sopenharmony_ci * struct mpi3mr_stgt_priv_data - SCSI device private structure
79062306a36Sopenharmony_ci *
79162306a36Sopenharmony_ci * @tgt_priv_data: Scsi_target private data pointer
79262306a36Sopenharmony_ci * @lun_id: LUN ID of the device
79362306a36Sopenharmony_ci * @ncq_prio_enable: NCQ priority enable for SATA device
79462306a36Sopenharmony_ci * @pend_count: Counter to track pending I/Os during error
79562306a36Sopenharmony_ci *		handling
79662306a36Sopenharmony_ci * @wslen: Write same max length
79762306a36Sopenharmony_ci */
79862306a36Sopenharmony_cistruct mpi3mr_sdev_priv_data {
79962306a36Sopenharmony_ci	struct mpi3mr_stgt_priv_data *tgt_priv_data;
80062306a36Sopenharmony_ci	u32 lun_id;
80162306a36Sopenharmony_ci	u8 ncq_prio_enable;
80262306a36Sopenharmony_ci	u32 pend_count;
80362306a36Sopenharmony_ci	u16 wslen;
80462306a36Sopenharmony_ci};
80562306a36Sopenharmony_ci
80662306a36Sopenharmony_ci/**
80762306a36Sopenharmony_ci * struct mpi3mr_drv_cmd - Internal command tracker
80862306a36Sopenharmony_ci *
80962306a36Sopenharmony_ci * @mutex: Command mutex
81062306a36Sopenharmony_ci * @done: Completeor for wakeup
81162306a36Sopenharmony_ci * @reply: Firmware reply for internal commands
81262306a36Sopenharmony_ci * @sensebuf: Sensebuf for SCSI IO commands
81362306a36Sopenharmony_ci * @iou_rc: IO Unit control reason code
81462306a36Sopenharmony_ci * @state: Command State
81562306a36Sopenharmony_ci * @dev_handle: Firmware handle for device specific commands
81662306a36Sopenharmony_ci * @ioc_status: IOC status from the firmware
81762306a36Sopenharmony_ci * @ioc_loginfo:IOC log info from the firmware
81862306a36Sopenharmony_ci * @is_waiting: Is the command issued in block mode
81962306a36Sopenharmony_ci * @is_sense: Is Sense data present
82062306a36Sopenharmony_ci * @retry_count: Retry count for retriable commands
82162306a36Sopenharmony_ci * @host_tag: Host tag used by the command
82262306a36Sopenharmony_ci * @callback: Callback for non blocking commands
82362306a36Sopenharmony_ci */
82462306a36Sopenharmony_cistruct mpi3mr_drv_cmd {
82562306a36Sopenharmony_ci	struct mutex mutex;
82662306a36Sopenharmony_ci	struct completion done;
82762306a36Sopenharmony_ci	void *reply;
82862306a36Sopenharmony_ci	u8 *sensebuf;
82962306a36Sopenharmony_ci	u8 iou_rc;
83062306a36Sopenharmony_ci	u16 state;
83162306a36Sopenharmony_ci	u16 dev_handle;
83262306a36Sopenharmony_ci	u16 ioc_status;
83362306a36Sopenharmony_ci	u32 ioc_loginfo;
83462306a36Sopenharmony_ci	u8 is_waiting;
83562306a36Sopenharmony_ci	u8 is_sense;
83662306a36Sopenharmony_ci	u8 retry_count;
83762306a36Sopenharmony_ci	u16 host_tag;
83862306a36Sopenharmony_ci
83962306a36Sopenharmony_ci	void (*callback)(struct mpi3mr_ioc *mrioc,
84062306a36Sopenharmony_ci	    struct mpi3mr_drv_cmd *drv_cmd);
84162306a36Sopenharmony_ci};
84262306a36Sopenharmony_ci
84362306a36Sopenharmony_ci/**
84462306a36Sopenharmony_ci * struct dma_memory_desc - memory descriptor structure to store
84562306a36Sopenharmony_ci * virtual address, dma address and size for any generic dma
84662306a36Sopenharmony_ci * memory allocations in the driver.
84762306a36Sopenharmony_ci *
84862306a36Sopenharmony_ci * @size: buffer size
84962306a36Sopenharmony_ci * @addr: virtual address
85062306a36Sopenharmony_ci * @dma_addr: dma address
85162306a36Sopenharmony_ci */
85262306a36Sopenharmony_cistruct dma_memory_desc {
85362306a36Sopenharmony_ci	u32 size;
85462306a36Sopenharmony_ci	void *addr;
85562306a36Sopenharmony_ci	dma_addr_t dma_addr;
85662306a36Sopenharmony_ci};
85762306a36Sopenharmony_ci
85862306a36Sopenharmony_ci
85962306a36Sopenharmony_ci/**
86062306a36Sopenharmony_ci * struct chain_element - memory descriptor structure to store
86162306a36Sopenharmony_ci * virtual and dma addresses for chain elements.
86262306a36Sopenharmony_ci *
86362306a36Sopenharmony_ci * @addr: virtual address
86462306a36Sopenharmony_ci * @dma_addr: dma address
86562306a36Sopenharmony_ci */
86662306a36Sopenharmony_cistruct chain_element {
86762306a36Sopenharmony_ci	void *addr;
86862306a36Sopenharmony_ci	dma_addr_t dma_addr;
86962306a36Sopenharmony_ci};
87062306a36Sopenharmony_ci
87162306a36Sopenharmony_ci/**
87262306a36Sopenharmony_ci * struct scmd_priv - SCSI command private data
87362306a36Sopenharmony_ci *
87462306a36Sopenharmony_ci * @host_tag: Host tag specific to operational queue
87562306a36Sopenharmony_ci * @in_lld_scope: Command in LLD scope or not
87662306a36Sopenharmony_ci * @meta_sg_valid: DIX command with meta data SGL or not
87762306a36Sopenharmony_ci * @scmd: SCSI Command pointer
87862306a36Sopenharmony_ci * @req_q_idx: Operational request queue index
87962306a36Sopenharmony_ci * @chain_idx: Chain frame index
88062306a36Sopenharmony_ci * @meta_chain_idx: Chain frame index of meta data SGL
88162306a36Sopenharmony_ci * @mpi3mr_scsiio_req: MPI SCSI IO request
88262306a36Sopenharmony_ci */
88362306a36Sopenharmony_cistruct scmd_priv {
88462306a36Sopenharmony_ci	u16 host_tag;
88562306a36Sopenharmony_ci	u8 in_lld_scope;
88662306a36Sopenharmony_ci	u8 meta_sg_valid;
88762306a36Sopenharmony_ci	struct scsi_cmnd *scmd;
88862306a36Sopenharmony_ci	u16 req_q_idx;
88962306a36Sopenharmony_ci	int chain_idx;
89062306a36Sopenharmony_ci	int meta_chain_idx;
89162306a36Sopenharmony_ci	u8 mpi3mr_scsiio_req[MPI3MR_ADMIN_REQ_FRAME_SZ];
89262306a36Sopenharmony_ci};
89362306a36Sopenharmony_ci
89462306a36Sopenharmony_ci/**
89562306a36Sopenharmony_ci * struct mpi3mr_ioc - Adapter anchor structure stored in shost
89662306a36Sopenharmony_ci * private data
89762306a36Sopenharmony_ci *
89862306a36Sopenharmony_ci * @list: List pointer
89962306a36Sopenharmony_ci * @pdev: PCI device pointer
90062306a36Sopenharmony_ci * @shost: Scsi_Host pointer
90162306a36Sopenharmony_ci * @id: Controller ID
90262306a36Sopenharmony_ci * @cpu_count: Number of online CPUs
90362306a36Sopenharmony_ci * @irqpoll_sleep: usleep unit used in threaded isr irqpoll
90462306a36Sopenharmony_ci * @name: Controller ASCII name
90562306a36Sopenharmony_ci * @driver_name: Driver ASCII name
90662306a36Sopenharmony_ci * @sysif_regs: System interface registers virtual address
90762306a36Sopenharmony_ci * @sysif_regs_phys: System interface registers physical address
90862306a36Sopenharmony_ci * @bars: PCI BARS
90962306a36Sopenharmony_ci * @dma_mask: DMA mask
91062306a36Sopenharmony_ci * @msix_count: Number of MSIX vectors used
91162306a36Sopenharmony_ci * @intr_enabled: Is interrupts enabled
91262306a36Sopenharmony_ci * @num_admin_req: Number of admin requests
91362306a36Sopenharmony_ci * @admin_req_q_sz: Admin request queue size
91462306a36Sopenharmony_ci * @admin_req_pi: Admin request queue producer index
91562306a36Sopenharmony_ci * @admin_req_ci: Admin request queue consumer index
91662306a36Sopenharmony_ci * @admin_req_base: Admin request queue base virtual address
91762306a36Sopenharmony_ci * @admin_req_dma: Admin request queue base dma address
91862306a36Sopenharmony_ci * @admin_req_lock: Admin queue access lock
91962306a36Sopenharmony_ci * @num_admin_replies: Number of admin replies
92062306a36Sopenharmony_ci * @admin_reply_q_sz: Admin reply queue size
92162306a36Sopenharmony_ci * @admin_reply_ci: Admin reply queue consumer index
92262306a36Sopenharmony_ci * @admin_reply_ephase:Admin reply queue expected phase
92362306a36Sopenharmony_ci * @admin_reply_base: Admin reply queue base virtual address
92462306a36Sopenharmony_ci * @admin_reply_dma: Admin reply queue base dma address
92562306a36Sopenharmony_ci * @admin_reply_q_in_use: Queue is handled by poll/ISR
92662306a36Sopenharmony_ci * @ready_timeout: Controller ready timeout
92762306a36Sopenharmony_ci * @intr_info: Interrupt cookie pointer
92862306a36Sopenharmony_ci * @intr_info_count: Number of interrupt cookies
92962306a36Sopenharmony_ci * @is_intr_info_set: Flag to indicate intr info is setup
93062306a36Sopenharmony_ci * @num_queues: Number of operational queues
93162306a36Sopenharmony_ci * @num_op_req_q: Number of operational request queues
93262306a36Sopenharmony_ci * @req_qinfo: Operational request queue info pointer
93362306a36Sopenharmony_ci * @num_op_reply_q: Number of operational reply queues
93462306a36Sopenharmony_ci * @op_reply_qinfo: Operational reply queue info pointer
93562306a36Sopenharmony_ci * @init_cmds: Command tracker for initialization commands
93662306a36Sopenharmony_ci * @cfg_cmds: Command tracker for configuration requests
93762306a36Sopenharmony_ci * @facts: Cached IOC facts data
93862306a36Sopenharmony_ci * @op_reply_desc_sz: Operational reply descriptor size
93962306a36Sopenharmony_ci * @num_reply_bufs: Number of reply buffers allocated
94062306a36Sopenharmony_ci * @reply_buf_pool: Reply buffer pool
94162306a36Sopenharmony_ci * @reply_buf: Reply buffer base virtual address
94262306a36Sopenharmony_ci * @reply_buf_dma: Reply buffer DMA address
94362306a36Sopenharmony_ci * @reply_buf_dma_max_address: Reply DMA address max limit
94462306a36Sopenharmony_ci * @reply_free_qsz: Reply free queue size
94562306a36Sopenharmony_ci * @reply_free_q_pool: Reply free queue pool
94662306a36Sopenharmony_ci * @reply_free_q: Reply free queue base virtual address
94762306a36Sopenharmony_ci * @reply_free_q_dma: Reply free queue base DMA address
94862306a36Sopenharmony_ci * @reply_free_queue_lock: Reply free queue lock
94962306a36Sopenharmony_ci * @reply_free_queue_host_index: Reply free queue host index
95062306a36Sopenharmony_ci * @num_sense_bufs: Number of sense buffers
95162306a36Sopenharmony_ci * @sense_buf_pool: Sense buffer pool
95262306a36Sopenharmony_ci * @sense_buf: Sense buffer base virtual address
95362306a36Sopenharmony_ci * @sense_buf_dma: Sense buffer base DMA address
95462306a36Sopenharmony_ci * @sense_buf_q_sz: Sense buffer queue size
95562306a36Sopenharmony_ci * @sense_buf_q_pool: Sense buffer queue pool
95662306a36Sopenharmony_ci * @sense_buf_q: Sense buffer queue virtual address
95762306a36Sopenharmony_ci * @sense_buf_q_dma: Sense buffer queue DMA address
95862306a36Sopenharmony_ci * @sbq_lock: Sense buffer queue lock
95962306a36Sopenharmony_ci * @sbq_host_index: Sense buffer queuehost index
96062306a36Sopenharmony_ci * @event_masks: Event mask bitmap
96162306a36Sopenharmony_ci * @fwevt_worker_name: Firmware event worker thread name
96262306a36Sopenharmony_ci * @fwevt_worker_thread: Firmware event worker thread
96362306a36Sopenharmony_ci * @fwevt_lock: Firmware event lock
96462306a36Sopenharmony_ci * @fwevt_list: Firmware event list
96562306a36Sopenharmony_ci * @watchdog_work_q_name: Fault watchdog worker thread name
96662306a36Sopenharmony_ci * @watchdog_work_q: Fault watchdog worker thread
96762306a36Sopenharmony_ci * @watchdog_work: Fault watchdog work
96862306a36Sopenharmony_ci * @watchdog_lock: Fault watchdog lock
96962306a36Sopenharmony_ci * @is_driver_loading: Is driver still loading
97062306a36Sopenharmony_ci * @scan_started: Async scan started
97162306a36Sopenharmony_ci * @scan_failed: Asycn scan failed
97262306a36Sopenharmony_ci * @stop_drv_processing: Stop all command processing
97362306a36Sopenharmony_ci * @device_refresh_on: Don't process the events until devices are refreshed
97462306a36Sopenharmony_ci * @max_host_ios: Maximum host I/O count
97562306a36Sopenharmony_ci * @max_sgl_entries: Max SGL entries per I/O
97662306a36Sopenharmony_ci * @chain_buf_count: Chain buffer count
97762306a36Sopenharmony_ci * @chain_buf_pool: Chain buffer pool
97862306a36Sopenharmony_ci * @chain_sgl_list: Chain SGL list
97962306a36Sopenharmony_ci * @chain_bitmap: Chain buffer allocator bitmap
98062306a36Sopenharmony_ci * @chain_buf_lock: Chain buffer list lock
98162306a36Sopenharmony_ci * @bsg_cmds: Command tracker for BSG command
98262306a36Sopenharmony_ci * @host_tm_cmds: Command tracker for task management commands
98362306a36Sopenharmony_ci * @dev_rmhs_cmds: Command tracker for device removal commands
98462306a36Sopenharmony_ci * @evtack_cmds: Command tracker for event ack commands
98562306a36Sopenharmony_ci * @devrem_bitmap: Device removal bitmap
98662306a36Sopenharmony_ci * @dev_handle_bitmap_bits: Number of bits in device handle bitmap
98762306a36Sopenharmony_ci * @removepend_bitmap: Remove pending bitmap
98862306a36Sopenharmony_ci * @delayed_rmhs_list: Delayed device removal list
98962306a36Sopenharmony_ci * @evtack_cmds_bitmap: Event Ack bitmap
99062306a36Sopenharmony_ci * @delayed_evtack_cmds_list: Delayed event acknowledgment list
99162306a36Sopenharmony_ci * @ts_update_counter: Timestamp update counter
99262306a36Sopenharmony_ci * @reset_in_progress: Reset in progress flag
99362306a36Sopenharmony_ci * @unrecoverable: Controller unrecoverable flag
99462306a36Sopenharmony_ci * @prev_reset_result: Result of previous reset
99562306a36Sopenharmony_ci * @reset_mutex: Controller reset mutex
99662306a36Sopenharmony_ci * @reset_waitq: Controller reset  wait queue
99762306a36Sopenharmony_ci * @prepare_for_reset: Prepare for reset event received
99862306a36Sopenharmony_ci * @prepare_for_reset_timeout_counter: Prepare for reset timeout
99962306a36Sopenharmony_ci * @prp_list_virt: NVMe encapsulated PRP list virtual base
100062306a36Sopenharmony_ci * @prp_list_dma: NVMe encapsulated PRP list DMA
100162306a36Sopenharmony_ci * @prp_sz: NVME encapsulated PRP list size
100262306a36Sopenharmony_ci * @diagsave_timeout: Diagnostic information save timeout
100362306a36Sopenharmony_ci * @logging_level: Controller debug logging level
100462306a36Sopenharmony_ci * @flush_io_count: I/O count to flush after reset
100562306a36Sopenharmony_ci * @current_event: Firmware event currently in process
100662306a36Sopenharmony_ci * @driver_info: Driver, Kernel, OS information to firmware
100762306a36Sopenharmony_ci * @change_count: Topology change count
100862306a36Sopenharmony_ci * @pel_enabled: Persistent Event Log(PEL) enabled or not
100962306a36Sopenharmony_ci * @pel_abort_requested: PEL abort is requested or not
101062306a36Sopenharmony_ci * @pel_class: PEL Class identifier
101162306a36Sopenharmony_ci * @pel_locale: PEL Locale identifier
101262306a36Sopenharmony_ci * @pel_cmds: Command tracker for PEL wait command
101362306a36Sopenharmony_ci * @pel_abort_cmd: Command tracker for PEL abort command
101462306a36Sopenharmony_ci * @pel_newest_seqnum: Newest PEL sequenece number
101562306a36Sopenharmony_ci * @pel_seqnum_virt: PEL sequence number virtual address
101662306a36Sopenharmony_ci * @pel_seqnum_dma: PEL sequence number DMA address
101762306a36Sopenharmony_ci * @pel_seqnum_sz: PEL sequenece number size
101862306a36Sopenharmony_ci * @op_reply_q_offset: Operational reply queue offset with MSIx
101962306a36Sopenharmony_ci * @default_qcount: Total Default queues
102062306a36Sopenharmony_ci * @active_poll_qcount: Currently active poll queue count
102162306a36Sopenharmony_ci * @requested_poll_qcount: User requested poll queue count
102262306a36Sopenharmony_ci * @bsg_dev: BSG device structure
102362306a36Sopenharmony_ci * @bsg_queue: Request queue for BSG device
102462306a36Sopenharmony_ci * @stop_bsgs: Stop BSG request flag
102562306a36Sopenharmony_ci * @logdata_buf: Circular buffer to store log data entries
102662306a36Sopenharmony_ci * @logdata_buf_idx: Index of entry in buffer to store
102762306a36Sopenharmony_ci * @logdata_entry_sz: log data entry size
102862306a36Sopenharmony_ci * @pend_large_data_sz: Counter to track pending large data
102962306a36Sopenharmony_ci * @io_throttle_data_length: I/O size to track in 512b blocks
103062306a36Sopenharmony_ci * @io_throttle_high: I/O size to start throttle in 512b blocks
103162306a36Sopenharmony_ci * @io_throttle_low: I/O size to stop throttle in 512b blocks
103262306a36Sopenharmony_ci * @num_io_throttle_group: Maximum number of throttle groups
103362306a36Sopenharmony_ci * @throttle_groups: Pointer to throttle group info structures
103462306a36Sopenharmony_ci * @cfg_page: Default memory for configuration pages
103562306a36Sopenharmony_ci * @cfg_page_dma: Configuration page DMA address
103662306a36Sopenharmony_ci * @cfg_page_sz: Default configuration page memory size
103762306a36Sopenharmony_ci * @sas_transport_enabled: SAS transport enabled or not
103862306a36Sopenharmony_ci * @scsi_device_channel: Channel ID for SCSI devices
103962306a36Sopenharmony_ci * @transport_cmds: Command tracker for SAS transport commands
104062306a36Sopenharmony_ci * @sas_hba: SAS node for the controller
104162306a36Sopenharmony_ci * @sas_expander_list: SAS node list of expanders
104262306a36Sopenharmony_ci * @sas_node_lock: Lock to protect SAS node list
104362306a36Sopenharmony_ci * @hba_port_table_list: List of HBA Ports
104462306a36Sopenharmony_ci * @enclosure_list: List of Enclosure objects
104562306a36Sopenharmony_ci */
104662306a36Sopenharmony_cistruct mpi3mr_ioc {
104762306a36Sopenharmony_ci	struct list_head list;
104862306a36Sopenharmony_ci	struct pci_dev *pdev;
104962306a36Sopenharmony_ci	struct Scsi_Host *shost;
105062306a36Sopenharmony_ci	u8 id;
105162306a36Sopenharmony_ci	int cpu_count;
105262306a36Sopenharmony_ci	bool enable_segqueue;
105362306a36Sopenharmony_ci	u32 irqpoll_sleep;
105462306a36Sopenharmony_ci
105562306a36Sopenharmony_ci	char name[MPI3MR_NAME_LENGTH];
105662306a36Sopenharmony_ci	char driver_name[MPI3MR_NAME_LENGTH];
105762306a36Sopenharmony_ci
105862306a36Sopenharmony_ci	volatile struct mpi3_sysif_registers __iomem *sysif_regs;
105962306a36Sopenharmony_ci	resource_size_t sysif_regs_phys;
106062306a36Sopenharmony_ci	int bars;
106162306a36Sopenharmony_ci	u64 dma_mask;
106262306a36Sopenharmony_ci
106362306a36Sopenharmony_ci	u16 msix_count;
106462306a36Sopenharmony_ci	u8 intr_enabled;
106562306a36Sopenharmony_ci
106662306a36Sopenharmony_ci	u16 num_admin_req;
106762306a36Sopenharmony_ci	u32 admin_req_q_sz;
106862306a36Sopenharmony_ci	u16 admin_req_pi;
106962306a36Sopenharmony_ci	u16 admin_req_ci;
107062306a36Sopenharmony_ci	void *admin_req_base;
107162306a36Sopenharmony_ci	dma_addr_t admin_req_dma;
107262306a36Sopenharmony_ci	spinlock_t admin_req_lock;
107362306a36Sopenharmony_ci
107462306a36Sopenharmony_ci	u16 num_admin_replies;
107562306a36Sopenharmony_ci	u32 admin_reply_q_sz;
107662306a36Sopenharmony_ci	u16 admin_reply_ci;
107762306a36Sopenharmony_ci	u8 admin_reply_ephase;
107862306a36Sopenharmony_ci	void *admin_reply_base;
107962306a36Sopenharmony_ci	dma_addr_t admin_reply_dma;
108062306a36Sopenharmony_ci	atomic_t admin_reply_q_in_use;
108162306a36Sopenharmony_ci
108262306a36Sopenharmony_ci	u32 ready_timeout;
108362306a36Sopenharmony_ci
108462306a36Sopenharmony_ci	struct mpi3mr_intr_info *intr_info;
108562306a36Sopenharmony_ci	u16 intr_info_count;
108662306a36Sopenharmony_ci	bool is_intr_info_set;
108762306a36Sopenharmony_ci
108862306a36Sopenharmony_ci	u16 num_queues;
108962306a36Sopenharmony_ci	u16 num_op_req_q;
109062306a36Sopenharmony_ci	struct op_req_qinfo *req_qinfo;
109162306a36Sopenharmony_ci
109262306a36Sopenharmony_ci	u16 num_op_reply_q;
109362306a36Sopenharmony_ci	struct op_reply_qinfo *op_reply_qinfo;
109462306a36Sopenharmony_ci
109562306a36Sopenharmony_ci	struct mpi3mr_drv_cmd init_cmds;
109662306a36Sopenharmony_ci	struct mpi3mr_drv_cmd cfg_cmds;
109762306a36Sopenharmony_ci	struct mpi3mr_ioc_facts facts;
109862306a36Sopenharmony_ci	u16 op_reply_desc_sz;
109962306a36Sopenharmony_ci
110062306a36Sopenharmony_ci	u32 num_reply_bufs;
110162306a36Sopenharmony_ci	struct dma_pool *reply_buf_pool;
110262306a36Sopenharmony_ci	u8 *reply_buf;
110362306a36Sopenharmony_ci	dma_addr_t reply_buf_dma;
110462306a36Sopenharmony_ci	dma_addr_t reply_buf_dma_max_address;
110562306a36Sopenharmony_ci
110662306a36Sopenharmony_ci	u16 reply_free_qsz;
110762306a36Sopenharmony_ci	u16 reply_sz;
110862306a36Sopenharmony_ci	struct dma_pool *reply_free_q_pool;
110962306a36Sopenharmony_ci	__le64 *reply_free_q;
111062306a36Sopenharmony_ci	dma_addr_t reply_free_q_dma;
111162306a36Sopenharmony_ci	spinlock_t reply_free_queue_lock;
111262306a36Sopenharmony_ci	u32 reply_free_queue_host_index;
111362306a36Sopenharmony_ci
111462306a36Sopenharmony_ci	u32 num_sense_bufs;
111562306a36Sopenharmony_ci	struct dma_pool *sense_buf_pool;
111662306a36Sopenharmony_ci	u8 *sense_buf;
111762306a36Sopenharmony_ci	dma_addr_t sense_buf_dma;
111862306a36Sopenharmony_ci
111962306a36Sopenharmony_ci	u16 sense_buf_q_sz;
112062306a36Sopenharmony_ci	struct dma_pool *sense_buf_q_pool;
112162306a36Sopenharmony_ci	__le64 *sense_buf_q;
112262306a36Sopenharmony_ci	dma_addr_t sense_buf_q_dma;
112362306a36Sopenharmony_ci	spinlock_t sbq_lock;
112462306a36Sopenharmony_ci	u32 sbq_host_index;
112562306a36Sopenharmony_ci	u32 event_masks[MPI3_EVENT_NOTIFY_EVENTMASK_WORDS];
112662306a36Sopenharmony_ci
112762306a36Sopenharmony_ci	char fwevt_worker_name[MPI3MR_NAME_LENGTH];
112862306a36Sopenharmony_ci	struct workqueue_struct	*fwevt_worker_thread;
112962306a36Sopenharmony_ci	spinlock_t fwevt_lock;
113062306a36Sopenharmony_ci	struct list_head fwevt_list;
113162306a36Sopenharmony_ci
113262306a36Sopenharmony_ci	char watchdog_work_q_name[20];
113362306a36Sopenharmony_ci	struct workqueue_struct *watchdog_work_q;
113462306a36Sopenharmony_ci	struct delayed_work watchdog_work;
113562306a36Sopenharmony_ci	spinlock_t watchdog_lock;
113662306a36Sopenharmony_ci
113762306a36Sopenharmony_ci	u8 is_driver_loading;
113862306a36Sopenharmony_ci	u8 scan_started;
113962306a36Sopenharmony_ci	u16 scan_failed;
114062306a36Sopenharmony_ci	u8 stop_drv_processing;
114162306a36Sopenharmony_ci	u8 device_refresh_on;
114262306a36Sopenharmony_ci
114362306a36Sopenharmony_ci	u16 max_host_ios;
114462306a36Sopenharmony_ci	spinlock_t tgtdev_lock;
114562306a36Sopenharmony_ci	struct list_head tgtdev_list;
114662306a36Sopenharmony_ci	u16 max_sgl_entries;
114762306a36Sopenharmony_ci
114862306a36Sopenharmony_ci	u32 chain_buf_count;
114962306a36Sopenharmony_ci	struct dma_pool *chain_buf_pool;
115062306a36Sopenharmony_ci	struct chain_element *chain_sgl_list;
115162306a36Sopenharmony_ci	unsigned long *chain_bitmap;
115262306a36Sopenharmony_ci	spinlock_t chain_buf_lock;
115362306a36Sopenharmony_ci
115462306a36Sopenharmony_ci	struct mpi3mr_drv_cmd bsg_cmds;
115562306a36Sopenharmony_ci	struct mpi3mr_drv_cmd host_tm_cmds;
115662306a36Sopenharmony_ci	struct mpi3mr_drv_cmd dev_rmhs_cmds[MPI3MR_NUM_DEVRMCMD];
115762306a36Sopenharmony_ci	struct mpi3mr_drv_cmd evtack_cmds[MPI3MR_NUM_EVTACKCMD];
115862306a36Sopenharmony_ci	unsigned long *devrem_bitmap;
115962306a36Sopenharmony_ci	u16 dev_handle_bitmap_bits;
116062306a36Sopenharmony_ci	unsigned long *removepend_bitmap;
116162306a36Sopenharmony_ci	struct list_head delayed_rmhs_list;
116262306a36Sopenharmony_ci	unsigned long *evtack_cmds_bitmap;
116362306a36Sopenharmony_ci	struct list_head delayed_evtack_cmds_list;
116462306a36Sopenharmony_ci
116562306a36Sopenharmony_ci	u32 ts_update_counter;
116662306a36Sopenharmony_ci	u8 reset_in_progress;
116762306a36Sopenharmony_ci	u8 unrecoverable;
116862306a36Sopenharmony_ci	int prev_reset_result;
116962306a36Sopenharmony_ci	struct mutex reset_mutex;
117062306a36Sopenharmony_ci	wait_queue_head_t reset_waitq;
117162306a36Sopenharmony_ci
117262306a36Sopenharmony_ci	u8 prepare_for_reset;
117362306a36Sopenharmony_ci	u16 prepare_for_reset_timeout_counter;
117462306a36Sopenharmony_ci
117562306a36Sopenharmony_ci	void *prp_list_virt;
117662306a36Sopenharmony_ci	dma_addr_t prp_list_dma;
117762306a36Sopenharmony_ci	u32 prp_sz;
117862306a36Sopenharmony_ci
117962306a36Sopenharmony_ci	u16 diagsave_timeout;
118062306a36Sopenharmony_ci	int logging_level;
118162306a36Sopenharmony_ci	u16 flush_io_count;
118262306a36Sopenharmony_ci
118362306a36Sopenharmony_ci	struct mpi3mr_fwevt *current_event;
118462306a36Sopenharmony_ci	struct mpi3_driver_info_layout driver_info;
118562306a36Sopenharmony_ci	u16 change_count;
118662306a36Sopenharmony_ci
118762306a36Sopenharmony_ci	u8 pel_enabled;
118862306a36Sopenharmony_ci	u8 pel_abort_requested;
118962306a36Sopenharmony_ci	u8 pel_class;
119062306a36Sopenharmony_ci	u16 pel_locale;
119162306a36Sopenharmony_ci	struct mpi3mr_drv_cmd pel_cmds;
119262306a36Sopenharmony_ci	struct mpi3mr_drv_cmd pel_abort_cmd;
119362306a36Sopenharmony_ci
119462306a36Sopenharmony_ci	u32 pel_newest_seqnum;
119562306a36Sopenharmony_ci	void *pel_seqnum_virt;
119662306a36Sopenharmony_ci	dma_addr_t pel_seqnum_dma;
119762306a36Sopenharmony_ci	u32 pel_seqnum_sz;
119862306a36Sopenharmony_ci
119962306a36Sopenharmony_ci	u16 op_reply_q_offset;
120062306a36Sopenharmony_ci	u16 default_qcount;
120162306a36Sopenharmony_ci	u16 active_poll_qcount;
120262306a36Sopenharmony_ci	u16 requested_poll_qcount;
120362306a36Sopenharmony_ci
120462306a36Sopenharmony_ci	struct device bsg_dev;
120562306a36Sopenharmony_ci	struct request_queue *bsg_queue;
120662306a36Sopenharmony_ci	u8 stop_bsgs;
120762306a36Sopenharmony_ci	u8 *logdata_buf;
120862306a36Sopenharmony_ci	u16 logdata_buf_idx;
120962306a36Sopenharmony_ci	u16 logdata_entry_sz;
121062306a36Sopenharmony_ci
121162306a36Sopenharmony_ci	atomic_t pend_large_data_sz;
121262306a36Sopenharmony_ci	u32 io_throttle_data_length;
121362306a36Sopenharmony_ci	u32 io_throttle_high;
121462306a36Sopenharmony_ci	u32 io_throttle_low;
121562306a36Sopenharmony_ci	u16 num_io_throttle_group;
121662306a36Sopenharmony_ci	struct mpi3mr_throttle_group_info *throttle_groups;
121762306a36Sopenharmony_ci
121862306a36Sopenharmony_ci	void *cfg_page;
121962306a36Sopenharmony_ci	dma_addr_t cfg_page_dma;
122062306a36Sopenharmony_ci	u16 cfg_page_sz;
122162306a36Sopenharmony_ci
122262306a36Sopenharmony_ci	u8 sas_transport_enabled;
122362306a36Sopenharmony_ci	u8 scsi_device_channel;
122462306a36Sopenharmony_ci	struct mpi3mr_drv_cmd transport_cmds;
122562306a36Sopenharmony_ci	struct mpi3mr_sas_node sas_hba;
122662306a36Sopenharmony_ci	struct list_head sas_expander_list;
122762306a36Sopenharmony_ci	spinlock_t sas_node_lock;
122862306a36Sopenharmony_ci	struct list_head hba_port_table_list;
122962306a36Sopenharmony_ci	struct list_head enclosure_list;
123062306a36Sopenharmony_ci};
123162306a36Sopenharmony_ci
123262306a36Sopenharmony_ci/**
123362306a36Sopenharmony_ci * struct mpi3mr_fwevt - Firmware event structure.
123462306a36Sopenharmony_ci *
123562306a36Sopenharmony_ci * @list: list head
123662306a36Sopenharmony_ci * @work: Work structure
123762306a36Sopenharmony_ci * @mrioc: Adapter instance reference
123862306a36Sopenharmony_ci * @event_id: MPI3 firmware event ID
123962306a36Sopenharmony_ci * @send_ack: Event acknowledgment required or not
124062306a36Sopenharmony_ci * @process_evt: Bottomhalf processing required or not
124162306a36Sopenharmony_ci * @evt_ctx: Event context to send in Ack
124262306a36Sopenharmony_ci * @event_data_size: size of the event data in bytes
124362306a36Sopenharmony_ci * @pending_at_sml: waiting for device add/remove API to complete
124462306a36Sopenharmony_ci * @discard: discard this event
124562306a36Sopenharmony_ci * @ref_count: kref count
124662306a36Sopenharmony_ci * @event_data: Actual MPI3 event data
124762306a36Sopenharmony_ci */
124862306a36Sopenharmony_cistruct mpi3mr_fwevt {
124962306a36Sopenharmony_ci	struct list_head list;
125062306a36Sopenharmony_ci	struct work_struct work;
125162306a36Sopenharmony_ci	struct mpi3mr_ioc *mrioc;
125262306a36Sopenharmony_ci	u16 event_id;
125362306a36Sopenharmony_ci	bool send_ack;
125462306a36Sopenharmony_ci	bool process_evt;
125562306a36Sopenharmony_ci	u32 evt_ctx;
125662306a36Sopenharmony_ci	u16 event_data_size;
125762306a36Sopenharmony_ci	bool pending_at_sml;
125862306a36Sopenharmony_ci	bool discard;
125962306a36Sopenharmony_ci	struct kref ref_count;
126062306a36Sopenharmony_ci	char event_data[] __aligned(4);
126162306a36Sopenharmony_ci};
126262306a36Sopenharmony_ci
126362306a36Sopenharmony_ci
126462306a36Sopenharmony_ci/**
126562306a36Sopenharmony_ci * struct delayed_dev_rmhs_node - Delayed device removal node
126662306a36Sopenharmony_ci *
126762306a36Sopenharmony_ci * @list: list head
126862306a36Sopenharmony_ci * @handle: Device handle
126962306a36Sopenharmony_ci * @iou_rc: IO Unit Control Reason Code
127062306a36Sopenharmony_ci */
127162306a36Sopenharmony_cistruct delayed_dev_rmhs_node {
127262306a36Sopenharmony_ci	struct list_head list;
127362306a36Sopenharmony_ci	u16 handle;
127462306a36Sopenharmony_ci	u8 iou_rc;
127562306a36Sopenharmony_ci};
127662306a36Sopenharmony_ci
127762306a36Sopenharmony_ci/**
127862306a36Sopenharmony_ci * struct delayed_evt_ack_node - Delayed event ack node
127962306a36Sopenharmony_ci * @list: list head
128062306a36Sopenharmony_ci * @event: MPI3 event ID
128162306a36Sopenharmony_ci * @event_ctx: event context
128262306a36Sopenharmony_ci */
128362306a36Sopenharmony_cistruct delayed_evt_ack_node {
128462306a36Sopenharmony_ci	struct list_head list;
128562306a36Sopenharmony_ci	u8 event;
128662306a36Sopenharmony_ci	u32 event_ctx;
128762306a36Sopenharmony_ci};
128862306a36Sopenharmony_ci
128962306a36Sopenharmony_ciint mpi3mr_setup_resources(struct mpi3mr_ioc *mrioc);
129062306a36Sopenharmony_civoid mpi3mr_cleanup_resources(struct mpi3mr_ioc *mrioc);
129162306a36Sopenharmony_ciint mpi3mr_init_ioc(struct mpi3mr_ioc *mrioc);
129262306a36Sopenharmony_ciint mpi3mr_reinit_ioc(struct mpi3mr_ioc *mrioc, u8 is_resume);
129362306a36Sopenharmony_civoid mpi3mr_cleanup_ioc(struct mpi3mr_ioc *mrioc);
129462306a36Sopenharmony_ciint mpi3mr_issue_port_enable(struct mpi3mr_ioc *mrioc, u8 async);
129562306a36Sopenharmony_ciint mpi3mr_admin_request_post(struct mpi3mr_ioc *mrioc, void *admin_req,
129662306a36Sopenharmony_ciu16 admin_req_sz, u8 ignore_reset);
129762306a36Sopenharmony_ciint mpi3mr_op_request_post(struct mpi3mr_ioc *mrioc,
129862306a36Sopenharmony_ci			   struct op_req_qinfo *opreqq, u8 *req);
129962306a36Sopenharmony_civoid mpi3mr_add_sg_single(void *paddr, u8 flags, u32 length,
130062306a36Sopenharmony_ci			  dma_addr_t dma_addr);
130162306a36Sopenharmony_civoid mpi3mr_build_zero_len_sge(void *paddr);
130262306a36Sopenharmony_civoid *mpi3mr_get_sensebuf_virt_addr(struct mpi3mr_ioc *mrioc,
130362306a36Sopenharmony_ci				     dma_addr_t phys_addr);
130462306a36Sopenharmony_civoid *mpi3mr_get_reply_virt_addr(struct mpi3mr_ioc *mrioc,
130562306a36Sopenharmony_ci				     dma_addr_t phys_addr);
130662306a36Sopenharmony_civoid mpi3mr_repost_sense_buf(struct mpi3mr_ioc *mrioc,
130762306a36Sopenharmony_ci				     u64 sense_buf_dma);
130862306a36Sopenharmony_ci
130962306a36Sopenharmony_civoid mpi3mr_memset_buffers(struct mpi3mr_ioc *mrioc);
131062306a36Sopenharmony_civoid mpi3mr_free_mem(struct mpi3mr_ioc *mrioc);
131162306a36Sopenharmony_civoid mpi3mr_os_handle_events(struct mpi3mr_ioc *mrioc,
131262306a36Sopenharmony_ci			     struct mpi3_event_notification_reply *event_reply);
131362306a36Sopenharmony_civoid mpi3mr_process_op_reply_desc(struct mpi3mr_ioc *mrioc,
131462306a36Sopenharmony_ci				  struct mpi3_default_reply_descriptor *reply_desc,
131562306a36Sopenharmony_ci				  u64 *reply_dma, u16 qidx);
131662306a36Sopenharmony_civoid mpi3mr_start_watchdog(struct mpi3mr_ioc *mrioc);
131762306a36Sopenharmony_civoid mpi3mr_stop_watchdog(struct mpi3mr_ioc *mrioc);
131862306a36Sopenharmony_ci
131962306a36Sopenharmony_ciint mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc,
132062306a36Sopenharmony_ci			      u32 reset_reason, u8 snapdump);
132162306a36Sopenharmony_civoid mpi3mr_ioc_disable_intr(struct mpi3mr_ioc *mrioc);
132262306a36Sopenharmony_civoid mpi3mr_ioc_enable_intr(struct mpi3mr_ioc *mrioc);
132362306a36Sopenharmony_ci
132462306a36Sopenharmony_cienum mpi3mr_iocstate mpi3mr_get_iocstate(struct mpi3mr_ioc *mrioc);
132562306a36Sopenharmony_ciint mpi3mr_process_event_ack(struct mpi3mr_ioc *mrioc, u8 event,
132662306a36Sopenharmony_ci			  u32 event_ctx);
132762306a36Sopenharmony_ci
132862306a36Sopenharmony_civoid mpi3mr_wait_for_host_io(struct mpi3mr_ioc *mrioc, u32 timeout);
132962306a36Sopenharmony_civoid mpi3mr_cleanup_fwevt_list(struct mpi3mr_ioc *mrioc);
133062306a36Sopenharmony_civoid mpi3mr_flush_host_io(struct mpi3mr_ioc *mrioc);
133162306a36Sopenharmony_civoid mpi3mr_invalidate_devhandles(struct mpi3mr_ioc *mrioc);
133262306a36Sopenharmony_civoid mpi3mr_rfresh_tgtdevs(struct mpi3mr_ioc *mrioc);
133362306a36Sopenharmony_civoid mpi3mr_flush_delayed_cmd_lists(struct mpi3mr_ioc *mrioc);
133462306a36Sopenharmony_civoid mpi3mr_check_rh_fault_ioc(struct mpi3mr_ioc *mrioc, u32 reason_code);
133562306a36Sopenharmony_civoid mpi3mr_print_fault_info(struct mpi3mr_ioc *mrioc);
133662306a36Sopenharmony_civoid mpi3mr_check_rh_fault_ioc(struct mpi3mr_ioc *mrioc, u32 reason_code);
133762306a36Sopenharmony_ciint mpi3mr_process_op_reply_q(struct mpi3mr_ioc *mrioc,
133862306a36Sopenharmony_ci	struct op_reply_qinfo *op_reply_q);
133962306a36Sopenharmony_ciint mpi3mr_blk_mq_poll(struct Scsi_Host *shost, unsigned int queue_num);
134062306a36Sopenharmony_civoid mpi3mr_bsg_init(struct mpi3mr_ioc *mrioc);
134162306a36Sopenharmony_civoid mpi3mr_bsg_exit(struct mpi3mr_ioc *mrioc);
134262306a36Sopenharmony_ciint mpi3mr_issue_tm(struct mpi3mr_ioc *mrioc, u8 tm_type,
134362306a36Sopenharmony_ci	u16 handle, uint lun, u16 htag, ulong timeout,
134462306a36Sopenharmony_ci	struct mpi3mr_drv_cmd *drv_cmd,
134562306a36Sopenharmony_ci	u8 *resp_code, struct scsi_cmnd *scmd);
134662306a36Sopenharmony_cistruct mpi3mr_tgt_dev *mpi3mr_get_tgtdev_by_handle(
134762306a36Sopenharmony_ci	struct mpi3mr_ioc *mrioc, u16 handle);
134862306a36Sopenharmony_civoid mpi3mr_pel_get_seqnum_complete(struct mpi3mr_ioc *mrioc,
134962306a36Sopenharmony_ci	struct mpi3mr_drv_cmd *drv_cmd);
135062306a36Sopenharmony_ciint mpi3mr_pel_get_seqnum_post(struct mpi3mr_ioc *mrioc,
135162306a36Sopenharmony_ci	struct mpi3mr_drv_cmd *drv_cmd);
135262306a36Sopenharmony_civoid mpi3mr_app_save_logdata(struct mpi3mr_ioc *mrioc, char *event_data,
135362306a36Sopenharmony_ci	u16 event_data_size);
135462306a36Sopenharmony_cistruct mpi3mr_enclosure_node *mpi3mr_enclosure_find_by_handle(
135562306a36Sopenharmony_ci	struct mpi3mr_ioc *mrioc, u16 handle);
135662306a36Sopenharmony_ciextern const struct attribute_group *mpi3mr_host_groups[];
135762306a36Sopenharmony_ciextern const struct attribute_group *mpi3mr_dev_groups[];
135862306a36Sopenharmony_ci
135962306a36Sopenharmony_ciextern struct sas_function_template mpi3mr_transport_functions;
136062306a36Sopenharmony_ciextern struct scsi_transport_template *mpi3mr_transport_template;
136162306a36Sopenharmony_ci
136262306a36Sopenharmony_ciint mpi3mr_cfg_get_dev_pg0(struct mpi3mr_ioc *mrioc, u16 *ioc_status,
136362306a36Sopenharmony_ci	struct mpi3_device_page0 *dev_pg0, u16 pg_sz, u32 form, u32 form_spec);
136462306a36Sopenharmony_ciint mpi3mr_cfg_get_sas_phy_pg0(struct mpi3mr_ioc *mrioc, u16 *ioc_status,
136562306a36Sopenharmony_ci	struct mpi3_sas_phy_page0 *phy_pg0, u16 pg_sz, u32 form,
136662306a36Sopenharmony_ci	u32 form_spec);
136762306a36Sopenharmony_ciint mpi3mr_cfg_get_sas_phy_pg1(struct mpi3mr_ioc *mrioc, u16 *ioc_status,
136862306a36Sopenharmony_ci	struct mpi3_sas_phy_page1 *phy_pg1, u16 pg_sz, u32 form,
136962306a36Sopenharmony_ci	u32 form_spec);
137062306a36Sopenharmony_ciint mpi3mr_cfg_get_sas_exp_pg0(struct mpi3mr_ioc *mrioc, u16 *ioc_status,
137162306a36Sopenharmony_ci	struct mpi3_sas_expander_page0 *exp_pg0, u16 pg_sz, u32 form,
137262306a36Sopenharmony_ci	u32 form_spec);
137362306a36Sopenharmony_ciint mpi3mr_cfg_get_sas_exp_pg1(struct mpi3mr_ioc *mrioc, u16 *ioc_status,
137462306a36Sopenharmony_ci	struct mpi3_sas_expander_page1 *exp_pg1, u16 pg_sz, u32 form,
137562306a36Sopenharmony_ci	u32 form_spec);
137662306a36Sopenharmony_ciint mpi3mr_cfg_get_enclosure_pg0(struct mpi3mr_ioc *mrioc, u16 *ioc_status,
137762306a36Sopenharmony_ci	struct mpi3_enclosure_page0 *encl_pg0, u16 pg_sz, u32 form,
137862306a36Sopenharmony_ci	u32 form_spec);
137962306a36Sopenharmony_ciint mpi3mr_cfg_get_sas_io_unit_pg0(struct mpi3mr_ioc *mrioc,
138062306a36Sopenharmony_ci	struct mpi3_sas_io_unit_page0 *sas_io_unit_pg0, u16 pg_sz);
138162306a36Sopenharmony_ciint mpi3mr_cfg_get_sas_io_unit_pg1(struct mpi3mr_ioc *mrioc,
138262306a36Sopenharmony_ci	struct mpi3_sas_io_unit_page1 *sas_io_unit_pg1, u16 pg_sz);
138362306a36Sopenharmony_ciint mpi3mr_cfg_set_sas_io_unit_pg1(struct mpi3mr_ioc *mrioc,
138462306a36Sopenharmony_ci	struct mpi3_sas_io_unit_page1 *sas_io_unit_pg1, u16 pg_sz);
138562306a36Sopenharmony_ciint mpi3mr_cfg_get_driver_pg1(struct mpi3mr_ioc *mrioc,
138662306a36Sopenharmony_ci	struct mpi3_driver_page1 *driver_pg1, u16 pg_sz);
138762306a36Sopenharmony_ci
138862306a36Sopenharmony_ciu8 mpi3mr_is_expander_device(u16 device_info);
138962306a36Sopenharmony_ciint mpi3mr_expander_add(struct mpi3mr_ioc *mrioc, u16 handle);
139062306a36Sopenharmony_civoid mpi3mr_expander_remove(struct mpi3mr_ioc *mrioc, u64 sas_address,
139162306a36Sopenharmony_ci	struct mpi3mr_hba_port *hba_port);
139262306a36Sopenharmony_cistruct mpi3mr_sas_node *__mpi3mr_expander_find_by_handle(struct mpi3mr_ioc
139362306a36Sopenharmony_ci	*mrioc, u16 handle);
139462306a36Sopenharmony_cistruct mpi3mr_hba_port *mpi3mr_get_hba_port_by_id(struct mpi3mr_ioc *mrioc,
139562306a36Sopenharmony_ci	u8 port_id);
139662306a36Sopenharmony_civoid mpi3mr_sas_host_refresh(struct mpi3mr_ioc *mrioc);
139762306a36Sopenharmony_civoid mpi3mr_sas_host_add(struct mpi3mr_ioc *mrioc);
139862306a36Sopenharmony_civoid mpi3mr_update_links(struct mpi3mr_ioc *mrioc,
139962306a36Sopenharmony_ci	u64 sas_address_parent, u16 handle, u8 phy_number, u8 link_rate,
140062306a36Sopenharmony_ci	struct mpi3mr_hba_port *hba_port);
140162306a36Sopenharmony_civoid mpi3mr_remove_tgtdev_from_host(struct mpi3mr_ioc *mrioc,
140262306a36Sopenharmony_ci	struct mpi3mr_tgt_dev *tgtdev);
140362306a36Sopenharmony_ciint mpi3mr_report_tgtdev_to_sas_transport(struct mpi3mr_ioc *mrioc,
140462306a36Sopenharmony_ci	struct mpi3mr_tgt_dev *tgtdev);
140562306a36Sopenharmony_civoid mpi3mr_remove_tgtdev_from_sas_transport(struct mpi3mr_ioc *mrioc,
140662306a36Sopenharmony_ci	struct mpi3mr_tgt_dev *tgtdev);
140762306a36Sopenharmony_cistruct mpi3mr_tgt_dev *__mpi3mr_get_tgtdev_by_addr_and_rphy(
140862306a36Sopenharmony_ci	struct mpi3mr_ioc *mrioc, u64 sas_address, struct sas_rphy *rphy);
140962306a36Sopenharmony_civoid mpi3mr_print_device_event_notice(struct mpi3mr_ioc *mrioc,
141062306a36Sopenharmony_ci	bool device_add);
141162306a36Sopenharmony_civoid mpi3mr_refresh_sas_ports(struct mpi3mr_ioc *mrioc);
141262306a36Sopenharmony_civoid mpi3mr_refresh_expanders(struct mpi3mr_ioc *mrioc);
141362306a36Sopenharmony_civoid mpi3mr_add_event_wait_for_device_refresh(struct mpi3mr_ioc *mrioc);
141462306a36Sopenharmony_civoid mpi3mr_flush_drv_cmds(struct mpi3mr_ioc *mrioc);
141562306a36Sopenharmony_civoid mpi3mr_flush_cmds_for_unrecovered_controller(struct mpi3mr_ioc *mrioc);
141662306a36Sopenharmony_civoid mpi3mr_free_enclosure_list(struct mpi3mr_ioc *mrioc);
141762306a36Sopenharmony_ciint mpi3mr_process_admin_reply_q(struct mpi3mr_ioc *mrioc);
141862306a36Sopenharmony_civoid mpi3mr_expander_node_remove(struct mpi3mr_ioc *mrioc,
141962306a36Sopenharmony_ci	struct mpi3mr_sas_node *sas_expander);
142062306a36Sopenharmony_ci#endif /*MPI3MR_H_INCLUDED*/
1421