162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * This is the Fusion MPT base driver providing common API layer interface
362306a36Sopenharmony_ci * for access to MPT (Message Passing Technology) firmware.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * This code is based on drivers/scsi/mpt3sas/mpt3sas_base.h
662306a36Sopenharmony_ci * Copyright (C) 2012-2014  LSI Corporation
762306a36Sopenharmony_ci * Copyright (C) 2013-2014 Avago Technologies
862306a36Sopenharmony_ci *  (mailto: MPT-FusionLinux.pdl@avagotech.com)
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci * This program is free software; you can redistribute it and/or
1162306a36Sopenharmony_ci * modify it under the terms of the GNU General Public License
1262306a36Sopenharmony_ci * as published by the Free Software Foundation; either version 2
1362306a36Sopenharmony_ci * of the License, or (at your option) any later version.
1462306a36Sopenharmony_ci *
1562306a36Sopenharmony_ci * This program is distributed in the hope that it will be useful,
1662306a36Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
1762306a36Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1862306a36Sopenharmony_ci * GNU General Public License for more details.
1962306a36Sopenharmony_ci *
2062306a36Sopenharmony_ci * NO WARRANTY
2162306a36Sopenharmony_ci * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
2262306a36Sopenharmony_ci * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
2362306a36Sopenharmony_ci * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
2462306a36Sopenharmony_ci * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
2562306a36Sopenharmony_ci * solely responsible for determining the appropriateness of using and
2662306a36Sopenharmony_ci * distributing the Program and assumes all risks associated with its
2762306a36Sopenharmony_ci * exercise of rights under this Agreement, including but not limited to
2862306a36Sopenharmony_ci * the risks and costs of program errors, damage to or loss of data,
2962306a36Sopenharmony_ci * programs or equipment, and unavailability or interruption of operations.
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci * DISCLAIMER OF LIABILITY
3262306a36Sopenharmony_ci * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
3362306a36Sopenharmony_ci * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3462306a36Sopenharmony_ci * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
3562306a36Sopenharmony_ci * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
3662306a36Sopenharmony_ci * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
3762306a36Sopenharmony_ci * USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
3862306a36Sopenharmony_ci * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci * You should have received a copy of the GNU General Public License
4162306a36Sopenharmony_ci * along with this program; if not, write to the Free Software
4262306a36Sopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
4362306a36Sopenharmony_ci * USA.
4462306a36Sopenharmony_ci */
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci#ifndef MPT3SAS_BASE_H_INCLUDED
4762306a36Sopenharmony_ci#define MPT3SAS_BASE_H_INCLUDED
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci#include "mpi/mpi2_type.h"
5062306a36Sopenharmony_ci#include "mpi/mpi2.h"
5162306a36Sopenharmony_ci#include "mpi/mpi2_ioc.h"
5262306a36Sopenharmony_ci#include "mpi/mpi2_cnfg.h"
5362306a36Sopenharmony_ci#include "mpi/mpi2_init.h"
5462306a36Sopenharmony_ci#include "mpi/mpi2_raid.h"
5562306a36Sopenharmony_ci#include "mpi/mpi2_tool.h"
5662306a36Sopenharmony_ci#include "mpi/mpi2_sas.h"
5762306a36Sopenharmony_ci#include "mpi/mpi2_pci.h"
5862306a36Sopenharmony_ci#include "mpi/mpi2_image.h"
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci#include <scsi/scsi.h>
6162306a36Sopenharmony_ci#include <scsi/scsi_cmnd.h>
6262306a36Sopenharmony_ci#include <scsi/scsi_device.h>
6362306a36Sopenharmony_ci#include <scsi/scsi_host.h>
6462306a36Sopenharmony_ci#include <scsi/scsi_tcq.h>
6562306a36Sopenharmony_ci#include <scsi/scsi_transport_sas.h>
6662306a36Sopenharmony_ci#include <scsi/scsi_dbg.h>
6762306a36Sopenharmony_ci#include <scsi/scsi_eh.h>
6862306a36Sopenharmony_ci#include <linux/pci.h>
6962306a36Sopenharmony_ci#include <linux/poll.h>
7062306a36Sopenharmony_ci#include <linux/irq_poll.h>
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci#include "mpt3sas_debug.h"
7362306a36Sopenharmony_ci#include "mpt3sas_trigger_diag.h"
7462306a36Sopenharmony_ci#include "mpt3sas_trigger_pages.h"
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci/* driver versioning info */
7762306a36Sopenharmony_ci#define MPT3SAS_DRIVER_NAME		"mpt3sas"
7862306a36Sopenharmony_ci#define MPT3SAS_AUTHOR "Avago Technologies <MPT-FusionLinux.pdl@avagotech.com>"
7962306a36Sopenharmony_ci#define MPT3SAS_DESCRIPTION	"LSI MPT Fusion SAS 3.0 Device Driver"
8062306a36Sopenharmony_ci#define MPT3SAS_DRIVER_VERSION		"43.100.00.00"
8162306a36Sopenharmony_ci#define MPT3SAS_MAJOR_VERSION		43
8262306a36Sopenharmony_ci#define MPT3SAS_MINOR_VERSION		100
8362306a36Sopenharmony_ci#define MPT3SAS_BUILD_VERSION		0
8462306a36Sopenharmony_ci#define MPT3SAS_RELEASE_VERSION	00
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci#define MPT2SAS_DRIVER_NAME		"mpt2sas"
8762306a36Sopenharmony_ci#define MPT2SAS_DESCRIPTION	"LSI MPT Fusion SAS 2.0 Device Driver"
8862306a36Sopenharmony_ci#define MPT2SAS_DRIVER_VERSION		"20.102.00.00"
8962306a36Sopenharmony_ci#define MPT2SAS_MAJOR_VERSION		20
9062306a36Sopenharmony_ci#define MPT2SAS_MINOR_VERSION		102
9162306a36Sopenharmony_ci#define MPT2SAS_BUILD_VERSION		0
9262306a36Sopenharmony_ci#define MPT2SAS_RELEASE_VERSION	00
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci/* CoreDump: Default timeout */
9562306a36Sopenharmony_ci#define MPT3SAS_DEFAULT_COREDUMP_TIMEOUT_SECONDS	(15) /*15 seconds*/
9662306a36Sopenharmony_ci#define MPT3SAS_COREDUMP_LOOP_DONE                     (0xFF)
9762306a36Sopenharmony_ci#define MPT3SAS_TIMESYNC_TIMEOUT_SECONDS		(10) /* 10 seconds */
9862306a36Sopenharmony_ci#define MPT3SAS_TIMESYNC_UPDATE_INTERVAL		(900) /* 15 minutes */
9962306a36Sopenharmony_ci#define MPT3SAS_TIMESYNC_UNIT_MASK			(0x80) /* bit 7 */
10062306a36Sopenharmony_ci#define MPT3SAS_TIMESYNC_MASK				(0x7F) /* 0 - 6 bits */
10162306a36Sopenharmony_ci#define SECONDS_PER_MIN					(60)
10262306a36Sopenharmony_ci#define SECONDS_PER_HOUR				(3600)
10362306a36Sopenharmony_ci#define MPT3SAS_COREDUMP_LOOP_DONE			(0xFF)
10462306a36Sopenharmony_ci#define MPI26_SET_IOC_PARAMETER_SYNC_TIMESTAMP		(0x81)
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci/*
10762306a36Sopenharmony_ci * Set MPT3SAS_SG_DEPTH value based on user input.
10862306a36Sopenharmony_ci */
10962306a36Sopenharmony_ci#define MPT_MAX_PHYS_SEGMENTS	SG_CHUNK_SIZE
11062306a36Sopenharmony_ci#define MPT_MIN_PHYS_SEGMENTS	16
11162306a36Sopenharmony_ci#define MPT_KDUMP_MIN_PHYS_SEGMENTS	32
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci#define MCPU_MAX_CHAINS_PER_IO	3
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci#ifdef CONFIG_SCSI_MPT3SAS_MAX_SGE
11662306a36Sopenharmony_ci#define MPT3SAS_SG_DEPTH		CONFIG_SCSI_MPT3SAS_MAX_SGE
11762306a36Sopenharmony_ci#else
11862306a36Sopenharmony_ci#define MPT3SAS_SG_DEPTH		MPT_MAX_PHYS_SEGMENTS
11962306a36Sopenharmony_ci#endif
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci#ifdef CONFIG_SCSI_MPT2SAS_MAX_SGE
12262306a36Sopenharmony_ci#define MPT2SAS_SG_DEPTH		CONFIG_SCSI_MPT2SAS_MAX_SGE
12362306a36Sopenharmony_ci#else
12462306a36Sopenharmony_ci#define MPT2SAS_SG_DEPTH		MPT_MAX_PHYS_SEGMENTS
12562306a36Sopenharmony_ci#endif
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci/*
12862306a36Sopenharmony_ci * Generic Defines
12962306a36Sopenharmony_ci */
13062306a36Sopenharmony_ci#define MPT3SAS_SATA_QUEUE_DEPTH	32
13162306a36Sopenharmony_ci#define MPT3SAS_SAS_QUEUE_DEPTH		254
13262306a36Sopenharmony_ci#define MPT3SAS_RAID_QUEUE_DEPTH	128
13362306a36Sopenharmony_ci#define MPT3SAS_KDUMP_SCSI_IO_DEPTH	200
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci#define MPT3SAS_RAID_MAX_SECTORS	8192
13662306a36Sopenharmony_ci#define MPT3SAS_HOST_PAGE_SIZE_4K	12
13762306a36Sopenharmony_ci#define MPT3SAS_NVME_QUEUE_DEPTH	128
13862306a36Sopenharmony_ci#define MPT_NAME_LENGTH			32	/* generic length of strings */
13962306a36Sopenharmony_ci#define MPT_STRING_LENGTH		64
14062306a36Sopenharmony_ci#define MPI_FRAME_START_OFFSET		256
14162306a36Sopenharmony_ci#define REPLY_FREE_POOL_SIZE		512 /*(32 maxcredix *4)*(4 times)*/
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci#define MPT_MAX_CALLBACKS		32
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ci#define MPT_MAX_HBA_NUM_PHYS		32
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci#define INTERNAL_CMDS_COUNT		10	/* reserved cmds */
14862306a36Sopenharmony_ci/* reserved for issuing internally framed scsi io cmds */
14962306a36Sopenharmony_ci#define INTERNAL_SCSIIO_CMDS_COUNT	3
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci#define MPI3_HIM_MASK			0xFFFFFFFF /* mask every bit*/
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci#define MPT3SAS_INVALID_DEVICE_HANDLE	0xFFFF
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci#define MAX_CHAIN_ELEMT_SZ		16
15662306a36Sopenharmony_ci#define DEFAULT_NUM_FWCHAIN_ELEMTS	8
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci#define IO_UNIT_CONTROL_SHUTDOWN_TIMEOUT 6
15962306a36Sopenharmony_ci#define FW_IMG_HDR_READ_TIMEOUT	15
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci#define IOC_OPERATIONAL_WAIT_COUNT	10
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci/*
16462306a36Sopenharmony_ci * NVMe defines
16562306a36Sopenharmony_ci */
16662306a36Sopenharmony_ci#define	NVME_PRP_SIZE			8	/* PRP size */
16762306a36Sopenharmony_ci#define	NVME_ERROR_RESPONSE_SIZE	16	/* Max NVME Error Response */
16862306a36Sopenharmony_ci#define NVME_TASK_ABORT_MIN_TIMEOUT	6
16962306a36Sopenharmony_ci#define NVME_TASK_ABORT_MAX_TIMEOUT	60
17062306a36Sopenharmony_ci#define NVME_TASK_MNGT_CUSTOM_MASK	(0x0010)
17162306a36Sopenharmony_ci#define	NVME_PRP_PAGE_SIZE		4096	/* Page size */
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_cistruct mpt3sas_nvme_cmd {
17462306a36Sopenharmony_ci	u8	rsvd[24];
17562306a36Sopenharmony_ci	__le64	prp1;
17662306a36Sopenharmony_ci	__le64	prp2;
17762306a36Sopenharmony_ci};
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci/*
18062306a36Sopenharmony_ci * logging format
18162306a36Sopenharmony_ci */
18262306a36Sopenharmony_ci#define ioc_err(ioc, fmt, ...)						\
18362306a36Sopenharmony_ci	pr_err("%s: " fmt, (ioc)->name, ##__VA_ARGS__)
18462306a36Sopenharmony_ci#define ioc_notice(ioc, fmt, ...)					\
18562306a36Sopenharmony_ci	pr_notice("%s: " fmt, (ioc)->name, ##__VA_ARGS__)
18662306a36Sopenharmony_ci#define ioc_warn(ioc, fmt, ...)						\
18762306a36Sopenharmony_ci	pr_warn("%s: " fmt, (ioc)->name, ##__VA_ARGS__)
18862306a36Sopenharmony_ci#define ioc_info(ioc, fmt, ...)						\
18962306a36Sopenharmony_ci	pr_info("%s: " fmt, (ioc)->name, ##__VA_ARGS__)
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ci/*
19262306a36Sopenharmony_ci *  WarpDrive Specific Log codes
19362306a36Sopenharmony_ci */
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci#define MPT2_WARPDRIVE_LOGENTRY		(0x8002)
19662306a36Sopenharmony_ci#define MPT2_WARPDRIVE_LC_SSDT			(0x41)
19762306a36Sopenharmony_ci#define MPT2_WARPDRIVE_LC_SSDLW		(0x43)
19862306a36Sopenharmony_ci#define MPT2_WARPDRIVE_LC_SSDLF		(0x44)
19962306a36Sopenharmony_ci#define MPT2_WARPDRIVE_LC_BRMF			(0x4D)
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci/*
20262306a36Sopenharmony_ci * per target private data
20362306a36Sopenharmony_ci */
20462306a36Sopenharmony_ci#define MPT_TARGET_FLAGS_RAID_COMPONENT	0x01
20562306a36Sopenharmony_ci#define MPT_TARGET_FLAGS_VOLUME		0x02
20662306a36Sopenharmony_ci#define MPT_TARGET_FLAGS_DELETED	0x04
20762306a36Sopenharmony_ci#define MPT_TARGET_FASTPATH_IO		0x08
20862306a36Sopenharmony_ci#define MPT_TARGET_FLAGS_PCIE_DEVICE	0x10
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci#define SAS2_PCI_DEVICE_B0_REVISION	(0x01)
21162306a36Sopenharmony_ci#define SAS3_PCI_DEVICE_C0_REVISION	(0x02)
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci/* Atlas PCIe Switch Management Port */
21462306a36Sopenharmony_ci#define MPI26_ATLAS_PCIe_SWITCH_DEVID	(0x00B2)
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci/*
21762306a36Sopenharmony_ci * Intel HBA branding
21862306a36Sopenharmony_ci */
21962306a36Sopenharmony_ci#define MPT2SAS_INTEL_RMS25JB080_BRANDING    \
22062306a36Sopenharmony_ci	"Intel(R) Integrated RAID Module RMS25JB080"
22162306a36Sopenharmony_ci#define MPT2SAS_INTEL_RMS25JB040_BRANDING    \
22262306a36Sopenharmony_ci	"Intel(R) Integrated RAID Module RMS25JB040"
22362306a36Sopenharmony_ci#define MPT2SAS_INTEL_RMS25KB080_BRANDING    \
22462306a36Sopenharmony_ci	"Intel(R) Integrated RAID Module RMS25KB080"
22562306a36Sopenharmony_ci#define MPT2SAS_INTEL_RMS25KB040_BRANDING    \
22662306a36Sopenharmony_ci	"Intel(R) Integrated RAID Module RMS25KB040"
22762306a36Sopenharmony_ci#define MPT2SAS_INTEL_RMS25LB040_BRANDING	\
22862306a36Sopenharmony_ci	"Intel(R) Integrated RAID Module RMS25LB040"
22962306a36Sopenharmony_ci#define MPT2SAS_INTEL_RMS25LB080_BRANDING	\
23062306a36Sopenharmony_ci	"Intel(R) Integrated RAID Module RMS25LB080"
23162306a36Sopenharmony_ci#define MPT2SAS_INTEL_RMS2LL080_BRANDING	\
23262306a36Sopenharmony_ci	"Intel Integrated RAID Module RMS2LL080"
23362306a36Sopenharmony_ci#define MPT2SAS_INTEL_RMS2LL040_BRANDING	\
23462306a36Sopenharmony_ci	"Intel Integrated RAID Module RMS2LL040"
23562306a36Sopenharmony_ci#define MPT2SAS_INTEL_RS25GB008_BRANDING       \
23662306a36Sopenharmony_ci	"Intel(R) RAID Controller RS25GB008"
23762306a36Sopenharmony_ci#define MPT2SAS_INTEL_SSD910_BRANDING          \
23862306a36Sopenharmony_ci	"Intel(R) SSD 910 Series"
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_ci#define MPT3SAS_INTEL_RMS3JC080_BRANDING       \
24162306a36Sopenharmony_ci	"Intel(R) Integrated RAID Module RMS3JC080"
24262306a36Sopenharmony_ci#define MPT3SAS_INTEL_RS3GC008_BRANDING       \
24362306a36Sopenharmony_ci	"Intel(R) RAID Controller RS3GC008"
24462306a36Sopenharmony_ci#define MPT3SAS_INTEL_RS3FC044_BRANDING       \
24562306a36Sopenharmony_ci	"Intel(R) RAID Controller RS3FC044"
24662306a36Sopenharmony_ci#define MPT3SAS_INTEL_RS3UC080_BRANDING       \
24762306a36Sopenharmony_ci	"Intel(R) RAID Controller RS3UC080"
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_ci/*
25062306a36Sopenharmony_ci * Intel HBA SSDIDs
25162306a36Sopenharmony_ci */
25262306a36Sopenharmony_ci#define MPT2SAS_INTEL_RMS25JB080_SSDID		0x3516
25362306a36Sopenharmony_ci#define MPT2SAS_INTEL_RMS25JB040_SSDID		0x3517
25462306a36Sopenharmony_ci#define MPT2SAS_INTEL_RMS25KB080_SSDID		0x3518
25562306a36Sopenharmony_ci#define MPT2SAS_INTEL_RMS25KB040_SSDID		0x3519
25662306a36Sopenharmony_ci#define MPT2SAS_INTEL_RMS25LB040_SSDID		0x351A
25762306a36Sopenharmony_ci#define MPT2SAS_INTEL_RMS25LB080_SSDID		0x351B
25862306a36Sopenharmony_ci#define MPT2SAS_INTEL_RMS2LL080_SSDID		0x350E
25962306a36Sopenharmony_ci#define MPT2SAS_INTEL_RMS2LL040_SSDID		0x350F
26062306a36Sopenharmony_ci#define MPT2SAS_INTEL_RS25GB008_SSDID		0x3000
26162306a36Sopenharmony_ci#define MPT2SAS_INTEL_SSD910_SSDID		0x3700
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci#define MPT3SAS_INTEL_RMS3JC080_SSDID		0x3521
26462306a36Sopenharmony_ci#define MPT3SAS_INTEL_RS3GC008_SSDID		0x3522
26562306a36Sopenharmony_ci#define MPT3SAS_INTEL_RS3FC044_SSDID		0x3523
26662306a36Sopenharmony_ci#define MPT3SAS_INTEL_RS3UC080_SSDID		0x3524
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci/*
26962306a36Sopenharmony_ci * Dell HBA branding
27062306a36Sopenharmony_ci */
27162306a36Sopenharmony_ci#define MPT2SAS_DELL_BRANDING_SIZE                 32
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ci#define MPT2SAS_DELL_6GBPS_SAS_HBA_BRANDING        "Dell 6Gbps SAS HBA"
27462306a36Sopenharmony_ci#define MPT2SAS_DELL_PERC_H200_ADAPTER_BRANDING    "Dell PERC H200 Adapter"
27562306a36Sopenharmony_ci#define MPT2SAS_DELL_PERC_H200_INTEGRATED_BRANDING "Dell PERC H200 Integrated"
27662306a36Sopenharmony_ci#define MPT2SAS_DELL_PERC_H200_MODULAR_BRANDING    "Dell PERC H200 Modular"
27762306a36Sopenharmony_ci#define MPT2SAS_DELL_PERC_H200_EMBEDDED_BRANDING   "Dell PERC H200 Embedded"
27862306a36Sopenharmony_ci#define MPT2SAS_DELL_PERC_H200_BRANDING            "Dell PERC H200"
27962306a36Sopenharmony_ci#define MPT2SAS_DELL_6GBPS_SAS_BRANDING            "Dell 6Gbps SAS"
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_ci#define MPT3SAS_DELL_12G_HBA_BRANDING       \
28262306a36Sopenharmony_ci	"Dell 12Gbps HBA"
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ci/*
28562306a36Sopenharmony_ci * Dell HBA SSDIDs
28662306a36Sopenharmony_ci */
28762306a36Sopenharmony_ci#define MPT2SAS_DELL_6GBPS_SAS_HBA_SSDID	0x1F1C
28862306a36Sopenharmony_ci#define MPT2SAS_DELL_PERC_H200_ADAPTER_SSDID	0x1F1D
28962306a36Sopenharmony_ci#define MPT2SAS_DELL_PERC_H200_INTEGRATED_SSDID	0x1F1E
29062306a36Sopenharmony_ci#define MPT2SAS_DELL_PERC_H200_MODULAR_SSDID	0x1F1F
29162306a36Sopenharmony_ci#define MPT2SAS_DELL_PERC_H200_EMBEDDED_SSDID	0x1F20
29262306a36Sopenharmony_ci#define MPT2SAS_DELL_PERC_H200_SSDID		0x1F21
29362306a36Sopenharmony_ci#define MPT2SAS_DELL_6GBPS_SAS_SSDID		0x1F22
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci#define MPT3SAS_DELL_12G_HBA_SSDID		0x1F46
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_ci/*
29862306a36Sopenharmony_ci * Cisco HBA branding
29962306a36Sopenharmony_ci */
30062306a36Sopenharmony_ci#define MPT3SAS_CISCO_12G_8E_HBA_BRANDING		\
30162306a36Sopenharmony_ci	"Cisco 9300-8E 12G SAS HBA"
30262306a36Sopenharmony_ci#define MPT3SAS_CISCO_12G_8I_HBA_BRANDING		\
30362306a36Sopenharmony_ci	"Cisco 9300-8i 12G SAS HBA"
30462306a36Sopenharmony_ci#define MPT3SAS_CISCO_12G_AVILA_HBA_BRANDING	\
30562306a36Sopenharmony_ci	"Cisco 12G Modular SAS Pass through Controller"
30662306a36Sopenharmony_ci#define MPT3SAS_CISCO_12G_COLUSA_MEZZANINE_HBA_BRANDING		\
30762306a36Sopenharmony_ci	"UCS C3X60 12G SAS Pass through Controller"
30862306a36Sopenharmony_ci/*
30962306a36Sopenharmony_ci * Cisco HBA SSSDIDs
31062306a36Sopenharmony_ci */
31162306a36Sopenharmony_ci#define MPT3SAS_CISCO_12G_8E_HBA_SSDID  0x14C
31262306a36Sopenharmony_ci#define MPT3SAS_CISCO_12G_8I_HBA_SSDID  0x154
31362306a36Sopenharmony_ci#define MPT3SAS_CISCO_12G_AVILA_HBA_SSDID  0x155
31462306a36Sopenharmony_ci#define MPT3SAS_CISCO_12G_COLUSA_MEZZANINE_HBA_SSDID  0x156
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ci/*
31762306a36Sopenharmony_ci * status bits for ioc->diag_buffer_status
31862306a36Sopenharmony_ci */
31962306a36Sopenharmony_ci#define MPT3_DIAG_BUFFER_IS_REGISTERED	(0x01)
32062306a36Sopenharmony_ci#define MPT3_DIAG_BUFFER_IS_RELEASED	(0x02)
32162306a36Sopenharmony_ci#define MPT3_DIAG_BUFFER_IS_DIAG_RESET	(0x04)
32262306a36Sopenharmony_ci#define MPT3_DIAG_BUFFER_IS_DRIVER_ALLOCATED (0x08)
32362306a36Sopenharmony_ci#define MPT3_DIAG_BUFFER_IS_APP_OWNED (0x10)
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ci/*
32662306a36Sopenharmony_ci * HP HBA branding
32762306a36Sopenharmony_ci */
32862306a36Sopenharmony_ci#define MPT2SAS_HP_3PAR_SSVID                0x1590
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_ci#define MPT2SAS_HP_2_4_INTERNAL_BRANDING	\
33162306a36Sopenharmony_ci	"HP H220 Host Bus Adapter"
33262306a36Sopenharmony_ci#define MPT2SAS_HP_2_4_EXTERNAL_BRANDING	\
33362306a36Sopenharmony_ci	"HP H221 Host Bus Adapter"
33462306a36Sopenharmony_ci#define MPT2SAS_HP_1_4_INTERNAL_1_4_EXTERNAL_BRANDING	\
33562306a36Sopenharmony_ci	"HP H222 Host Bus Adapter"
33662306a36Sopenharmony_ci#define MPT2SAS_HP_EMBEDDED_2_4_INTERNAL_BRANDING	\
33762306a36Sopenharmony_ci	"HP H220i Host Bus Adapter"
33862306a36Sopenharmony_ci#define MPT2SAS_HP_DAUGHTER_2_4_INTERNAL_BRANDING	\
33962306a36Sopenharmony_ci	"HP H210i Host Bus Adapter"
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci/*
34262306a36Sopenharmony_ci * HO HBA SSDIDs
34362306a36Sopenharmony_ci */
34462306a36Sopenharmony_ci#define MPT2SAS_HP_2_4_INTERNAL_SSDID			0x0041
34562306a36Sopenharmony_ci#define MPT2SAS_HP_2_4_EXTERNAL_SSDID			0x0042
34662306a36Sopenharmony_ci#define MPT2SAS_HP_1_4_INTERNAL_1_4_EXTERNAL_SSDID	0x0043
34762306a36Sopenharmony_ci#define MPT2SAS_HP_EMBEDDED_2_4_INTERNAL_SSDID		0x0044
34862306a36Sopenharmony_ci#define MPT2SAS_HP_DAUGHTER_2_4_INTERNAL_SSDID		0x0046
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_ci/*
35162306a36Sopenharmony_ci * Combined Reply Queue constants,
35262306a36Sopenharmony_ci * There are twelve Supplemental Reply Post Host Index Registers
35362306a36Sopenharmony_ci * and each register is at offset 0x10 bytes from the previous one.
35462306a36Sopenharmony_ci */
35562306a36Sopenharmony_ci#define MAX_COMBINED_MSIX_VECTORS(gen35) ((gen35 == 1) ? 16 : 8)
35662306a36Sopenharmony_ci#define MPT3_SUP_REPLY_POST_HOST_INDEX_REG_COUNT_G3	12
35762306a36Sopenharmony_ci#define MPT3_SUP_REPLY_POST_HOST_INDEX_REG_COUNT_G35	16
35862306a36Sopenharmony_ci#define MPT3_SUP_REPLY_POST_HOST_INDEX_REG_OFFSET	(0x10)
35962306a36Sopenharmony_ci#define MPT3_MIN_IRQS					1
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_ci/* OEM Identifiers */
36262306a36Sopenharmony_ci#define MFG10_OEM_ID_INVALID                   (0x00000000)
36362306a36Sopenharmony_ci#define MFG10_OEM_ID_DELL                      (0x00000001)
36462306a36Sopenharmony_ci#define MFG10_OEM_ID_FSC                       (0x00000002)
36562306a36Sopenharmony_ci#define MFG10_OEM_ID_SUN                       (0x00000003)
36662306a36Sopenharmony_ci#define MFG10_OEM_ID_IBM                       (0x00000004)
36762306a36Sopenharmony_ci
36862306a36Sopenharmony_ci/* GENERIC Flags 0*/
36962306a36Sopenharmony_ci#define MFG10_GF0_OCE_DISABLED                 (0x00000001)
37062306a36Sopenharmony_ci#define MFG10_GF0_R1E_DRIVE_COUNT              (0x00000002)
37162306a36Sopenharmony_ci#define MFG10_GF0_R10_DISPLAY                  (0x00000004)
37262306a36Sopenharmony_ci#define MFG10_GF0_SSD_DATA_SCRUB_DISABLE       (0x00000008)
37362306a36Sopenharmony_ci#define MFG10_GF0_SINGLE_DRIVE_R0              (0x00000010)
37462306a36Sopenharmony_ci
37562306a36Sopenharmony_ci#define VIRTUAL_IO_FAILED_RETRY			(0x32010081)
37662306a36Sopenharmony_ci
37762306a36Sopenharmony_ci/* High IOPs definitions */
37862306a36Sopenharmony_ci#define MPT3SAS_DEVICE_HIGH_IOPS_DEPTH		8
37962306a36Sopenharmony_ci#define MPT3SAS_HIGH_IOPS_REPLY_QUEUES		8
38062306a36Sopenharmony_ci#define MPT3SAS_HIGH_IOPS_BATCH_COUNT		16
38162306a36Sopenharmony_ci#define MPT3SAS_GEN35_MAX_MSIX_QUEUES		128
38262306a36Sopenharmony_ci#define RDPQ_MAX_INDEX_IN_ONE_CHUNK		16
38362306a36Sopenharmony_ci
38462306a36Sopenharmony_ci/* OEM Specific Flags will come from OEM specific header files */
38562306a36Sopenharmony_cistruct Mpi2ManufacturingPage10_t {
38662306a36Sopenharmony_ci	MPI2_CONFIG_PAGE_HEADER	Header;		/* 00h */
38762306a36Sopenharmony_ci	U8	OEMIdentifier;			/* 04h */
38862306a36Sopenharmony_ci	U8	Reserved1;			/* 05h */
38962306a36Sopenharmony_ci	U16	Reserved2;			/* 08h */
39062306a36Sopenharmony_ci	U32	Reserved3;			/* 0Ch */
39162306a36Sopenharmony_ci	U32	GenericFlags0;			/* 10h */
39262306a36Sopenharmony_ci	U32	GenericFlags1;			/* 14h */
39362306a36Sopenharmony_ci	U32	Reserved4;			/* 18h */
39462306a36Sopenharmony_ci	U32	OEMSpecificFlags0;		/* 1Ch */
39562306a36Sopenharmony_ci	U32	OEMSpecificFlags1;		/* 20h */
39662306a36Sopenharmony_ci	U32	Reserved5[18];			/* 24h - 60h*/
39762306a36Sopenharmony_ci};
39862306a36Sopenharmony_ci
39962306a36Sopenharmony_ci
40062306a36Sopenharmony_ci/* Miscellaneous options */
40162306a36Sopenharmony_cistruct Mpi2ManufacturingPage11_t {
40262306a36Sopenharmony_ci	MPI2_CONFIG_PAGE_HEADER Header;		/* 00h */
40362306a36Sopenharmony_ci	__le32	Reserved1;			/* 04h */
40462306a36Sopenharmony_ci	u8	Reserved2;			/* 08h */
40562306a36Sopenharmony_ci	u8	EEDPTagMode;			/* 09h */
40662306a36Sopenharmony_ci	u8	Reserved3;			/* 0Ah */
40762306a36Sopenharmony_ci	u8	Reserved4;			/* 0Bh */
40862306a36Sopenharmony_ci	__le32	Reserved5[8];			/* 0Ch-2Ch */
40962306a36Sopenharmony_ci	u16	AddlFlags2;			/* 2Ch */
41062306a36Sopenharmony_ci	u8	AddlFlags3;			/* 2Eh */
41162306a36Sopenharmony_ci	u8	Reserved6;			/* 2Fh */
41262306a36Sopenharmony_ci	__le32	Reserved7[7];			/* 30h - 4Bh */
41362306a36Sopenharmony_ci	u8	NVMeAbortTO;			/* 4Ch */
41462306a36Sopenharmony_ci	u8	NumPerDevEvents;		/* 4Dh */
41562306a36Sopenharmony_ci	u8	HostTraceBufferDecrementSizeKB;	/* 4Eh */
41662306a36Sopenharmony_ci	u8	HostTraceBufferFlags;		/* 4Fh */
41762306a36Sopenharmony_ci	u16	HostTraceBufferMaxSizeKB;	/* 50h */
41862306a36Sopenharmony_ci	u16	HostTraceBufferMinSizeKB;	/* 52h */
41962306a36Sopenharmony_ci	u8	CoreDumpTOSec;			/* 54h */
42062306a36Sopenharmony_ci	u8	TimeSyncInterval;		/* 55h */
42162306a36Sopenharmony_ci	u16	Reserved9;			/* 56h */
42262306a36Sopenharmony_ci	__le32	Reserved10;			/* 58h */
42362306a36Sopenharmony_ci};
42462306a36Sopenharmony_ci
42562306a36Sopenharmony_ci/**
42662306a36Sopenharmony_ci * struct MPT3SAS_TARGET - starget private hostdata
42762306a36Sopenharmony_ci * @starget: starget object
42862306a36Sopenharmony_ci * @sas_address: target sas address
42962306a36Sopenharmony_ci * @raid_device: raid_device pointer to access volume data
43062306a36Sopenharmony_ci * @handle: device handle
43162306a36Sopenharmony_ci * @num_luns: number luns
43262306a36Sopenharmony_ci * @flags: MPT_TARGET_FLAGS_XXX flags
43362306a36Sopenharmony_ci * @deleted: target flaged for deletion
43462306a36Sopenharmony_ci * @tm_busy: target is busy with TM request.
43562306a36Sopenharmony_ci * @port: hba port entry containing target's port number info
43662306a36Sopenharmony_ci * @sas_dev: The sas_device associated with this target
43762306a36Sopenharmony_ci * @pcie_dev: The pcie device associated with this target
43862306a36Sopenharmony_ci */
43962306a36Sopenharmony_cistruct MPT3SAS_TARGET {
44062306a36Sopenharmony_ci	struct scsi_target *starget;
44162306a36Sopenharmony_ci	u64	sas_address;
44262306a36Sopenharmony_ci	struct _raid_device *raid_device;
44362306a36Sopenharmony_ci	u16	handle;
44462306a36Sopenharmony_ci	int	num_luns;
44562306a36Sopenharmony_ci	u32	flags;
44662306a36Sopenharmony_ci	u8	deleted;
44762306a36Sopenharmony_ci	u8	tm_busy;
44862306a36Sopenharmony_ci	struct hba_port *port;
44962306a36Sopenharmony_ci	struct _sas_device *sas_dev;
45062306a36Sopenharmony_ci	struct _pcie_device *pcie_dev;
45162306a36Sopenharmony_ci};
45262306a36Sopenharmony_ci
45362306a36Sopenharmony_ci
45462306a36Sopenharmony_ci/*
45562306a36Sopenharmony_ci * per device private data
45662306a36Sopenharmony_ci */
45762306a36Sopenharmony_ci#define MPT_DEVICE_FLAGS_INIT		0x01
45862306a36Sopenharmony_ci
45962306a36Sopenharmony_ci#define MFG_PAGE10_HIDE_SSDS_MASK	(0x00000003)
46062306a36Sopenharmony_ci#define MFG_PAGE10_HIDE_ALL_DISKS	(0x00)
46162306a36Sopenharmony_ci#define MFG_PAGE10_EXPOSE_ALL_DISKS	(0x01)
46262306a36Sopenharmony_ci#define MFG_PAGE10_HIDE_IF_VOL_PRESENT	(0x02)
46362306a36Sopenharmony_ci
46462306a36Sopenharmony_ci/**
46562306a36Sopenharmony_ci * struct MPT3SAS_DEVICE - sdev private hostdata
46662306a36Sopenharmony_ci * @sas_target: starget private hostdata
46762306a36Sopenharmony_ci * @lun: lun number
46862306a36Sopenharmony_ci * @flags: MPT_DEVICE_XXX flags
46962306a36Sopenharmony_ci * @configured_lun: lun is configured
47062306a36Sopenharmony_ci * @block: device is in SDEV_BLOCK state
47162306a36Sopenharmony_ci * @tlr_snoop_check: flag used in determining whether to disable TLR
47262306a36Sopenharmony_ci * @eedp_enable: eedp support enable bit
47362306a36Sopenharmony_ci * @eedp_type: 0(type_1), 1(type_2), 2(type_3)
47462306a36Sopenharmony_ci * @eedp_block_length: block size
47562306a36Sopenharmony_ci * @ata_command_pending: SATL passthrough outstanding for device
47662306a36Sopenharmony_ci */
47762306a36Sopenharmony_cistruct MPT3SAS_DEVICE {
47862306a36Sopenharmony_ci	struct MPT3SAS_TARGET *sas_target;
47962306a36Sopenharmony_ci	unsigned int	lun;
48062306a36Sopenharmony_ci	u32	flags;
48162306a36Sopenharmony_ci	u8	configured_lun;
48262306a36Sopenharmony_ci	u8	block;
48362306a36Sopenharmony_ci	u8	tlr_snoop_check;
48462306a36Sopenharmony_ci	u8	ignore_delay_remove;
48562306a36Sopenharmony_ci	/* Iopriority Command Handling */
48662306a36Sopenharmony_ci	u8	ncq_prio_enable;
48762306a36Sopenharmony_ci	/*
48862306a36Sopenharmony_ci	 * Bug workaround for SATL handling: the mpt2/3sas firmware
48962306a36Sopenharmony_ci	 * doesn't return BUSY or TASK_SET_FULL for subsequent
49062306a36Sopenharmony_ci	 * commands while a SATL pass through is in operation as the
49162306a36Sopenharmony_ci	 * spec requires, it simply does nothing with them until the
49262306a36Sopenharmony_ci	 * pass through completes, causing them possibly to timeout if
49362306a36Sopenharmony_ci	 * the passthrough is a long executing command (like format or
49462306a36Sopenharmony_ci	 * secure erase).  This variable allows us to do the right
49562306a36Sopenharmony_ci	 * thing while a SATL command is pending.
49662306a36Sopenharmony_ci	 */
49762306a36Sopenharmony_ci	unsigned long ata_command_pending;
49862306a36Sopenharmony_ci
49962306a36Sopenharmony_ci};
50062306a36Sopenharmony_ci
50162306a36Sopenharmony_ci#define MPT3_CMD_NOT_USED	0x8000	/* free */
50262306a36Sopenharmony_ci#define MPT3_CMD_COMPLETE	0x0001	/* completed */
50362306a36Sopenharmony_ci#define MPT3_CMD_PENDING	0x0002	/* pending */
50462306a36Sopenharmony_ci#define MPT3_CMD_REPLY_VALID	0x0004	/* reply is valid */
50562306a36Sopenharmony_ci#define MPT3_CMD_RESET		0x0008	/* host reset dropped the command */
50662306a36Sopenharmony_ci#define MPT3_CMD_COMPLETE_ASYNC 0x0010  /* tells whether cmd completes in same thread or not */
50762306a36Sopenharmony_ci
50862306a36Sopenharmony_ci/**
50962306a36Sopenharmony_ci * struct _internal_cmd - internal commands struct
51062306a36Sopenharmony_ci * @mutex: mutex
51162306a36Sopenharmony_ci * @done: completion
51262306a36Sopenharmony_ci * @reply: reply message pointer
51362306a36Sopenharmony_ci * @sense: sense data
51462306a36Sopenharmony_ci * @status: MPT3_CMD_XXX status
51562306a36Sopenharmony_ci * @smid: system message id
51662306a36Sopenharmony_ci */
51762306a36Sopenharmony_cistruct _internal_cmd {
51862306a36Sopenharmony_ci	struct mutex mutex;
51962306a36Sopenharmony_ci	struct completion done;
52062306a36Sopenharmony_ci	void	*reply;
52162306a36Sopenharmony_ci	void	*sense;
52262306a36Sopenharmony_ci	u16	status;
52362306a36Sopenharmony_ci	u16	smid;
52462306a36Sopenharmony_ci};
52562306a36Sopenharmony_ci
52662306a36Sopenharmony_ci
52762306a36Sopenharmony_ci
52862306a36Sopenharmony_ci/**
52962306a36Sopenharmony_ci * struct _sas_device - attached device information
53062306a36Sopenharmony_ci * @list: sas device list
53162306a36Sopenharmony_ci * @starget: starget object
53262306a36Sopenharmony_ci * @sas_address: device sas address
53362306a36Sopenharmony_ci * @device_name: retrieved from the SAS IDENTIFY frame.
53462306a36Sopenharmony_ci * @handle: device handle
53562306a36Sopenharmony_ci * @sas_address_parent: sas address of parent expander or sas host
53662306a36Sopenharmony_ci * @enclosure_handle: enclosure handle
53762306a36Sopenharmony_ci * @enclosure_logical_id: enclosure logical identifier
53862306a36Sopenharmony_ci * @volume_handle: volume handle (valid when hidden raid member)
53962306a36Sopenharmony_ci * @volume_wwid: volume unique identifier
54062306a36Sopenharmony_ci * @device_info: bitfield provides detailed info about the device
54162306a36Sopenharmony_ci * @id: target id
54262306a36Sopenharmony_ci * @channel: target channel
54362306a36Sopenharmony_ci * @slot: number number
54462306a36Sopenharmony_ci * @phy: phy identifier provided in sas device page 0
54562306a36Sopenharmony_ci * @responding: used in _scsih_sas_device_mark_responding
54662306a36Sopenharmony_ci * @fast_path: fast path feature enable bit
54762306a36Sopenharmony_ci * @pfa_led_on: flag for PFA LED status
54862306a36Sopenharmony_ci * @pend_sas_rphy_add: flag to check if device is in sas_rphy_add()
54962306a36Sopenharmony_ci *	addition routine.
55062306a36Sopenharmony_ci * @chassis_slot: chassis slot
55162306a36Sopenharmony_ci * @is_chassis_slot_valid: chassis slot valid or not
55262306a36Sopenharmony_ci * @port: hba port entry containing device's port number info
55362306a36Sopenharmony_ci * @rphy: device's sas_rphy address used to identify this device structure in
55462306a36Sopenharmony_ci *	target_alloc callback function
55562306a36Sopenharmony_ci */
55662306a36Sopenharmony_cistruct _sas_device {
55762306a36Sopenharmony_ci	struct list_head list;
55862306a36Sopenharmony_ci	struct scsi_target *starget;
55962306a36Sopenharmony_ci	u64	sas_address;
56062306a36Sopenharmony_ci	u64	device_name;
56162306a36Sopenharmony_ci	u16	handle;
56262306a36Sopenharmony_ci	u64	sas_address_parent;
56362306a36Sopenharmony_ci	u16	enclosure_handle;
56462306a36Sopenharmony_ci	u64	enclosure_logical_id;
56562306a36Sopenharmony_ci	u16	volume_handle;
56662306a36Sopenharmony_ci	u64	volume_wwid;
56762306a36Sopenharmony_ci	u32	device_info;
56862306a36Sopenharmony_ci	int	id;
56962306a36Sopenharmony_ci	int	channel;
57062306a36Sopenharmony_ci	u16	slot;
57162306a36Sopenharmony_ci	u8	phy;
57262306a36Sopenharmony_ci	u8	responding;
57362306a36Sopenharmony_ci	u8	fast_path;
57462306a36Sopenharmony_ci	u8	pfa_led_on;
57562306a36Sopenharmony_ci	u8	pend_sas_rphy_add;
57662306a36Sopenharmony_ci	u8	enclosure_level;
57762306a36Sopenharmony_ci	u8	chassis_slot;
57862306a36Sopenharmony_ci	u8	is_chassis_slot_valid;
57962306a36Sopenharmony_ci	u8	connector_name[5];
58062306a36Sopenharmony_ci	struct kref refcount;
58162306a36Sopenharmony_ci	u8	port_type;
58262306a36Sopenharmony_ci	struct hba_port *port;
58362306a36Sopenharmony_ci	struct sas_rphy *rphy;
58462306a36Sopenharmony_ci};
58562306a36Sopenharmony_ci
58662306a36Sopenharmony_cistatic inline void sas_device_get(struct _sas_device *s)
58762306a36Sopenharmony_ci{
58862306a36Sopenharmony_ci	kref_get(&s->refcount);
58962306a36Sopenharmony_ci}
59062306a36Sopenharmony_ci
59162306a36Sopenharmony_cistatic inline void sas_device_free(struct kref *r)
59262306a36Sopenharmony_ci{
59362306a36Sopenharmony_ci	kfree(container_of(r, struct _sas_device, refcount));
59462306a36Sopenharmony_ci}
59562306a36Sopenharmony_ci
59662306a36Sopenharmony_cistatic inline void sas_device_put(struct _sas_device *s)
59762306a36Sopenharmony_ci{
59862306a36Sopenharmony_ci	kref_put(&s->refcount, sas_device_free);
59962306a36Sopenharmony_ci}
60062306a36Sopenharmony_ci
60162306a36Sopenharmony_ci/*
60262306a36Sopenharmony_ci * struct _pcie_device - attached PCIe device information
60362306a36Sopenharmony_ci * @list: pcie device list
60462306a36Sopenharmony_ci * @starget: starget object
60562306a36Sopenharmony_ci * @wwid: device WWID
60662306a36Sopenharmony_ci * @handle: device handle
60762306a36Sopenharmony_ci * @device_info: bitfield provides detailed info about the device
60862306a36Sopenharmony_ci * @id: target id
60962306a36Sopenharmony_ci * @channel: target channel
61062306a36Sopenharmony_ci * @slot: slot number
61162306a36Sopenharmony_ci * @port_num: port number
61262306a36Sopenharmony_ci * @responding: used in _scsih_pcie_device_mark_responding
61362306a36Sopenharmony_ci * @fast_path: fast path feature enable bit
61462306a36Sopenharmony_ci * @nvme_mdts: MaximumDataTransferSize from PCIe Device Page 2 for
61562306a36Sopenharmony_ci *		NVMe device only
61662306a36Sopenharmony_ci * @enclosure_handle: enclosure handle
61762306a36Sopenharmony_ci * @enclosure_logical_id: enclosure logical identifier
61862306a36Sopenharmony_ci * @enclosure_level: The level of device's enclosure from the controller
61962306a36Sopenharmony_ci * @connector_name: ASCII value of the Connector's name
62062306a36Sopenharmony_ci * @serial_number: pointer of serial number string allocated runtime
62162306a36Sopenharmony_ci * @access_status: Device's Access Status
62262306a36Sopenharmony_ci * @shutdown_latency: NVMe device's RTD3 Entry Latency
62362306a36Sopenharmony_ci * @refcount: reference count for deletion
62462306a36Sopenharmony_ci */
62562306a36Sopenharmony_cistruct _pcie_device {
62662306a36Sopenharmony_ci	struct list_head list;
62762306a36Sopenharmony_ci	struct scsi_target *starget;
62862306a36Sopenharmony_ci	u64	wwid;
62962306a36Sopenharmony_ci	u16	handle;
63062306a36Sopenharmony_ci	u32	device_info;
63162306a36Sopenharmony_ci	int	id;
63262306a36Sopenharmony_ci	int	channel;
63362306a36Sopenharmony_ci	u16	slot;
63462306a36Sopenharmony_ci	u8	port_num;
63562306a36Sopenharmony_ci	u8	responding;
63662306a36Sopenharmony_ci	u8	fast_path;
63762306a36Sopenharmony_ci	u32	nvme_mdts;
63862306a36Sopenharmony_ci	u16	enclosure_handle;
63962306a36Sopenharmony_ci	u64	enclosure_logical_id;
64062306a36Sopenharmony_ci	u8	enclosure_level;
64162306a36Sopenharmony_ci	u8	connector_name[4];
64262306a36Sopenharmony_ci	u8	*serial_number;
64362306a36Sopenharmony_ci	u8	reset_timeout;
64462306a36Sopenharmony_ci	u8	access_status;
64562306a36Sopenharmony_ci	u16	shutdown_latency;
64662306a36Sopenharmony_ci	struct kref refcount;
64762306a36Sopenharmony_ci};
64862306a36Sopenharmony_ci/**
64962306a36Sopenharmony_ci * pcie_device_get - Increment the pcie device reference count
65062306a36Sopenharmony_ci *
65162306a36Sopenharmony_ci * @p: pcie_device object
65262306a36Sopenharmony_ci *
65362306a36Sopenharmony_ci * When ever this function called it will increment the
65462306a36Sopenharmony_ci * reference count of the pcie device for which this function called.
65562306a36Sopenharmony_ci *
65662306a36Sopenharmony_ci */
65762306a36Sopenharmony_cistatic inline void pcie_device_get(struct _pcie_device *p)
65862306a36Sopenharmony_ci{
65962306a36Sopenharmony_ci	kref_get(&p->refcount);
66062306a36Sopenharmony_ci}
66162306a36Sopenharmony_ci
66262306a36Sopenharmony_ci/**
66362306a36Sopenharmony_ci * pcie_device_free - Release the pcie device object
66462306a36Sopenharmony_ci * @r - kref object
66562306a36Sopenharmony_ci *
66662306a36Sopenharmony_ci * Free's the pcie device object. It will be called when reference count
66762306a36Sopenharmony_ci * reaches to zero.
66862306a36Sopenharmony_ci */
66962306a36Sopenharmony_cistatic inline void pcie_device_free(struct kref *r)
67062306a36Sopenharmony_ci{
67162306a36Sopenharmony_ci	kfree(container_of(r, struct _pcie_device, refcount));
67262306a36Sopenharmony_ci}
67362306a36Sopenharmony_ci
67462306a36Sopenharmony_ci/**
67562306a36Sopenharmony_ci * pcie_device_put - Decrement the pcie device reference count
67662306a36Sopenharmony_ci *
67762306a36Sopenharmony_ci * @p: pcie_device object
67862306a36Sopenharmony_ci *
67962306a36Sopenharmony_ci * When ever this function called it will decrement the
68062306a36Sopenharmony_ci * reference count of the pcie device for which this function called.
68162306a36Sopenharmony_ci *
68262306a36Sopenharmony_ci * When refernce count reaches to Zero, this will call pcie_device_free to the
68362306a36Sopenharmony_ci * pcie_device object.
68462306a36Sopenharmony_ci */
68562306a36Sopenharmony_cistatic inline void pcie_device_put(struct _pcie_device *p)
68662306a36Sopenharmony_ci{
68762306a36Sopenharmony_ci	kref_put(&p->refcount, pcie_device_free);
68862306a36Sopenharmony_ci}
68962306a36Sopenharmony_ci/**
69062306a36Sopenharmony_ci * struct _raid_device - raid volume link list
69162306a36Sopenharmony_ci * @list: sas device list
69262306a36Sopenharmony_ci * @starget: starget object
69362306a36Sopenharmony_ci * @sdev: scsi device struct (volumes are single lun)
69462306a36Sopenharmony_ci * @wwid: unique identifier for the volume
69562306a36Sopenharmony_ci * @handle: device handle
69662306a36Sopenharmony_ci * @block_size: Block size of the volume
69762306a36Sopenharmony_ci * @id: target id
69862306a36Sopenharmony_ci * @channel: target channel
69962306a36Sopenharmony_ci * @volume_type: the raid level
70062306a36Sopenharmony_ci * @device_info: bitfield provides detailed info about the hidden components
70162306a36Sopenharmony_ci * @num_pds: number of hidden raid components
70262306a36Sopenharmony_ci * @responding: used in _scsih_raid_device_mark_responding
70362306a36Sopenharmony_ci * @percent_complete: resync percent complete
70462306a36Sopenharmony_ci * @direct_io_enabled: Whether direct io to PDs are allowed or not
70562306a36Sopenharmony_ci * @stripe_exponent: X where 2powX is the stripe sz in blocks
70662306a36Sopenharmony_ci * @block_exponent: X where 2powX is the block sz in bytes
70762306a36Sopenharmony_ci * @max_lba: Maximum number of LBA in the volume
70862306a36Sopenharmony_ci * @stripe_sz: Stripe Size of the volume
70962306a36Sopenharmony_ci * @device_info: Device info of the volume member disk
71062306a36Sopenharmony_ci * @pd_handle: Array of handles of the physical drives for direct I/O in le16
71162306a36Sopenharmony_ci */
71262306a36Sopenharmony_ci#define MPT_MAX_WARPDRIVE_PDS		8
71362306a36Sopenharmony_cistruct _raid_device {
71462306a36Sopenharmony_ci	struct list_head list;
71562306a36Sopenharmony_ci	struct scsi_target *starget;
71662306a36Sopenharmony_ci	struct scsi_device *sdev;
71762306a36Sopenharmony_ci	u64	wwid;
71862306a36Sopenharmony_ci	u16	handle;
71962306a36Sopenharmony_ci	u16	block_sz;
72062306a36Sopenharmony_ci	int	id;
72162306a36Sopenharmony_ci	int	channel;
72262306a36Sopenharmony_ci	u8	volume_type;
72362306a36Sopenharmony_ci	u8	num_pds;
72462306a36Sopenharmony_ci	u8	responding;
72562306a36Sopenharmony_ci	u8	percent_complete;
72662306a36Sopenharmony_ci	u8	direct_io_enabled;
72762306a36Sopenharmony_ci	u8	stripe_exponent;
72862306a36Sopenharmony_ci	u8	block_exponent;
72962306a36Sopenharmony_ci	u64	max_lba;
73062306a36Sopenharmony_ci	u32	stripe_sz;
73162306a36Sopenharmony_ci	u32	device_info;
73262306a36Sopenharmony_ci	u16	pd_handle[MPT_MAX_WARPDRIVE_PDS];
73362306a36Sopenharmony_ci};
73462306a36Sopenharmony_ci
73562306a36Sopenharmony_ci/**
73662306a36Sopenharmony_ci * struct _boot_device - boot device info
73762306a36Sopenharmony_ci *
73862306a36Sopenharmony_ci * @channel: sas, raid, or pcie channel
73962306a36Sopenharmony_ci * @device: holds pointer for struct _sas_device, struct _raid_device or
74062306a36Sopenharmony_ci *     struct _pcie_device
74162306a36Sopenharmony_ci */
74262306a36Sopenharmony_cistruct _boot_device {
74362306a36Sopenharmony_ci	int channel;
74462306a36Sopenharmony_ci	void *device;
74562306a36Sopenharmony_ci};
74662306a36Sopenharmony_ci
74762306a36Sopenharmony_ci/**
74862306a36Sopenharmony_ci * struct _sas_port - wide/narrow sas port information
74962306a36Sopenharmony_ci * @port_list: list of ports belonging to expander
75062306a36Sopenharmony_ci * @num_phys: number of phys belonging to this port
75162306a36Sopenharmony_ci * @remote_identify: attached device identification
75262306a36Sopenharmony_ci * @rphy: sas transport rphy object
75362306a36Sopenharmony_ci * @port: sas transport wide/narrow port object
75462306a36Sopenharmony_ci * @hba_port: hba port entry containing port's port number info
75562306a36Sopenharmony_ci * @phy_list: _sas_phy list objects belonging to this port
75662306a36Sopenharmony_ci */
75762306a36Sopenharmony_cistruct _sas_port {
75862306a36Sopenharmony_ci	struct list_head port_list;
75962306a36Sopenharmony_ci	u8	num_phys;
76062306a36Sopenharmony_ci	struct sas_identify remote_identify;
76162306a36Sopenharmony_ci	struct sas_rphy *rphy;
76262306a36Sopenharmony_ci	struct sas_port *port;
76362306a36Sopenharmony_ci	struct hba_port *hba_port;
76462306a36Sopenharmony_ci	struct list_head phy_list;
76562306a36Sopenharmony_ci};
76662306a36Sopenharmony_ci
76762306a36Sopenharmony_ci/**
76862306a36Sopenharmony_ci * struct _sas_phy - phy information
76962306a36Sopenharmony_ci * @port_siblings: list of phys belonging to a port
77062306a36Sopenharmony_ci * @identify: phy identification
77162306a36Sopenharmony_ci * @remote_identify: attached device identification
77262306a36Sopenharmony_ci * @phy: sas transport phy object
77362306a36Sopenharmony_ci * @phy_id: unique phy id
77462306a36Sopenharmony_ci * @handle: device handle for this phy
77562306a36Sopenharmony_ci * @attached_handle: device handle for attached device
77662306a36Sopenharmony_ci * @phy_belongs_to_port: port has been created for this phy
77762306a36Sopenharmony_ci * @port: hba port entry containing port number info
77862306a36Sopenharmony_ci */
77962306a36Sopenharmony_cistruct _sas_phy {
78062306a36Sopenharmony_ci	struct list_head port_siblings;
78162306a36Sopenharmony_ci	struct sas_identify identify;
78262306a36Sopenharmony_ci	struct sas_identify remote_identify;
78362306a36Sopenharmony_ci	struct sas_phy *phy;
78462306a36Sopenharmony_ci	u8	phy_id;
78562306a36Sopenharmony_ci	u16	handle;
78662306a36Sopenharmony_ci	u16	attached_handle;
78762306a36Sopenharmony_ci	u8	phy_belongs_to_port;
78862306a36Sopenharmony_ci	u8	hba_vphy;
78962306a36Sopenharmony_ci	struct hba_port *port;
79062306a36Sopenharmony_ci};
79162306a36Sopenharmony_ci
79262306a36Sopenharmony_ci/**
79362306a36Sopenharmony_ci * struct _sas_node - sas_host/expander information
79462306a36Sopenharmony_ci * @list: list of expanders
79562306a36Sopenharmony_ci * @parent_dev: parent device class
79662306a36Sopenharmony_ci * @num_phys: number phys belonging to this sas_host/expander
79762306a36Sopenharmony_ci * @sas_address: sas address of this sas_host/expander
79862306a36Sopenharmony_ci * @handle: handle for this sas_host/expander
79962306a36Sopenharmony_ci * @sas_address_parent: sas address of parent expander or sas host
80062306a36Sopenharmony_ci * @enclosure_handle: handle for this a member of an enclosure
80162306a36Sopenharmony_ci * @device_info: bitwise defining capabilities of this sas_host/expander
80262306a36Sopenharmony_ci * @responding: used in _scsih_expander_device_mark_responding
80362306a36Sopenharmony_ci * @nr_phys_allocated: Allocated memory for this many count phys
80462306a36Sopenharmony_ci * @phy: a list of phys that make up this sas_host/expander
80562306a36Sopenharmony_ci * @sas_port_list: list of ports attached to this sas_host/expander
80662306a36Sopenharmony_ci * @port: hba port entry containing node's port number info
80762306a36Sopenharmony_ci * @rphy: sas_rphy object of this expander
80862306a36Sopenharmony_ci */
80962306a36Sopenharmony_cistruct _sas_node {
81062306a36Sopenharmony_ci	struct list_head list;
81162306a36Sopenharmony_ci	struct device *parent_dev;
81262306a36Sopenharmony_ci	u8	num_phys;
81362306a36Sopenharmony_ci	u64	sas_address;
81462306a36Sopenharmony_ci	u16	handle;
81562306a36Sopenharmony_ci	u64	sas_address_parent;
81662306a36Sopenharmony_ci	u16	enclosure_handle;
81762306a36Sopenharmony_ci	u64	enclosure_logical_id;
81862306a36Sopenharmony_ci	u8	responding;
81962306a36Sopenharmony_ci	u8	nr_phys_allocated;
82062306a36Sopenharmony_ci	struct hba_port *port;
82162306a36Sopenharmony_ci	struct	_sas_phy *phy;
82262306a36Sopenharmony_ci	struct list_head sas_port_list;
82362306a36Sopenharmony_ci	struct sas_rphy *rphy;
82462306a36Sopenharmony_ci};
82562306a36Sopenharmony_ci
82662306a36Sopenharmony_ci/**
82762306a36Sopenharmony_ci * struct _enclosure_node - enclosure information
82862306a36Sopenharmony_ci * @list: list of enclosures
82962306a36Sopenharmony_ci * @pg0: enclosure pg0;
83062306a36Sopenharmony_ci */
83162306a36Sopenharmony_cistruct _enclosure_node {
83262306a36Sopenharmony_ci	struct list_head list;
83362306a36Sopenharmony_ci	Mpi2SasEnclosurePage0_t pg0;
83462306a36Sopenharmony_ci};
83562306a36Sopenharmony_ci
83662306a36Sopenharmony_ci/**
83762306a36Sopenharmony_ci * enum reset_type - reset state
83862306a36Sopenharmony_ci * @FORCE_BIG_HAMMER: issue diagnostic reset
83962306a36Sopenharmony_ci * @SOFT_RESET: issue message_unit_reset, if fails to to big hammer
84062306a36Sopenharmony_ci */
84162306a36Sopenharmony_cienum reset_type {
84262306a36Sopenharmony_ci	FORCE_BIG_HAMMER,
84362306a36Sopenharmony_ci	SOFT_RESET,
84462306a36Sopenharmony_ci};
84562306a36Sopenharmony_ci
84662306a36Sopenharmony_ci/**
84762306a36Sopenharmony_ci * struct pcie_sg_list - PCIe SGL buffer (contiguous per I/O)
84862306a36Sopenharmony_ci * @pcie_sgl: PCIe native SGL for NVMe devices
84962306a36Sopenharmony_ci * @pcie_sgl_dma: physical address
85062306a36Sopenharmony_ci */
85162306a36Sopenharmony_cistruct pcie_sg_list {
85262306a36Sopenharmony_ci	void            *pcie_sgl;
85362306a36Sopenharmony_ci	dma_addr_t      pcie_sgl_dma;
85462306a36Sopenharmony_ci};
85562306a36Sopenharmony_ci
85662306a36Sopenharmony_ci/**
85762306a36Sopenharmony_ci * struct chain_tracker - firmware chain tracker
85862306a36Sopenharmony_ci * @chain_buffer: chain buffer
85962306a36Sopenharmony_ci * @chain_buffer_dma: physical address
86062306a36Sopenharmony_ci * @tracker_list: list of free request (ioc->free_chain_list)
86162306a36Sopenharmony_ci */
86262306a36Sopenharmony_cistruct chain_tracker {
86362306a36Sopenharmony_ci	void *chain_buffer;
86462306a36Sopenharmony_ci	dma_addr_t chain_buffer_dma;
86562306a36Sopenharmony_ci};
86662306a36Sopenharmony_ci
86762306a36Sopenharmony_cistruct chain_lookup {
86862306a36Sopenharmony_ci	struct chain_tracker *chains_per_smid;
86962306a36Sopenharmony_ci	atomic_t	chain_offset;
87062306a36Sopenharmony_ci};
87162306a36Sopenharmony_ci
87262306a36Sopenharmony_ci/**
87362306a36Sopenharmony_ci * struct scsiio_tracker - scsi mf request tracker
87462306a36Sopenharmony_ci * @smid: system message id
87562306a36Sopenharmony_ci * @cb_idx: callback index
87662306a36Sopenharmony_ci * @direct_io: To indicate whether I/O is direct (WARPDRIVE)
87762306a36Sopenharmony_ci * @chain_list: list of associated firmware chain tracker
87862306a36Sopenharmony_ci * @msix_io: IO's msix
87962306a36Sopenharmony_ci */
88062306a36Sopenharmony_cistruct scsiio_tracker {
88162306a36Sopenharmony_ci	u16	smid;
88262306a36Sopenharmony_ci	struct scsi_cmnd *scmd;
88362306a36Sopenharmony_ci	u8	cb_idx;
88462306a36Sopenharmony_ci	u8	direct_io;
88562306a36Sopenharmony_ci	struct pcie_sg_list pcie_sg_list;
88662306a36Sopenharmony_ci	struct list_head chain_list;
88762306a36Sopenharmony_ci	u16     msix_io;
88862306a36Sopenharmony_ci};
88962306a36Sopenharmony_ci
89062306a36Sopenharmony_ci/**
89162306a36Sopenharmony_ci * struct request_tracker - firmware request tracker
89262306a36Sopenharmony_ci * @smid: system message id
89362306a36Sopenharmony_ci * @cb_idx: callback index
89462306a36Sopenharmony_ci * @tracker_list: list of free request (ioc->free_list)
89562306a36Sopenharmony_ci */
89662306a36Sopenharmony_cistruct request_tracker {
89762306a36Sopenharmony_ci	u16	smid;
89862306a36Sopenharmony_ci	u8	cb_idx;
89962306a36Sopenharmony_ci	struct list_head tracker_list;
90062306a36Sopenharmony_ci};
90162306a36Sopenharmony_ci
90262306a36Sopenharmony_ci/**
90362306a36Sopenharmony_ci * struct _tr_list - target reset list
90462306a36Sopenharmony_ci * @handle: device handle
90562306a36Sopenharmony_ci * @state: state machine
90662306a36Sopenharmony_ci */
90762306a36Sopenharmony_cistruct _tr_list {
90862306a36Sopenharmony_ci	struct list_head list;
90962306a36Sopenharmony_ci	u16	handle;
91062306a36Sopenharmony_ci	u16	state;
91162306a36Sopenharmony_ci};
91262306a36Sopenharmony_ci
91362306a36Sopenharmony_ci/**
91462306a36Sopenharmony_ci * struct _sc_list - delayed SAS_IO_UNIT_CONTROL message list
91562306a36Sopenharmony_ci * @handle: device handle
91662306a36Sopenharmony_ci */
91762306a36Sopenharmony_cistruct _sc_list {
91862306a36Sopenharmony_ci	struct list_head list;
91962306a36Sopenharmony_ci	u16     handle;
92062306a36Sopenharmony_ci};
92162306a36Sopenharmony_ci
92262306a36Sopenharmony_ci/**
92362306a36Sopenharmony_ci * struct _event_ack_list - delayed event acknowledgment list
92462306a36Sopenharmony_ci * @Event: Event ID
92562306a36Sopenharmony_ci * @EventContext: used to track the event uniquely
92662306a36Sopenharmony_ci */
92762306a36Sopenharmony_cistruct _event_ack_list {
92862306a36Sopenharmony_ci	struct list_head list;
92962306a36Sopenharmony_ci	U16     Event;
93062306a36Sopenharmony_ci	U32     EventContext;
93162306a36Sopenharmony_ci};
93262306a36Sopenharmony_ci
93362306a36Sopenharmony_ci/**
93462306a36Sopenharmony_ci * struct adapter_reply_queue - the reply queue struct
93562306a36Sopenharmony_ci * @ioc: per adapter object
93662306a36Sopenharmony_ci * @msix_index: msix index into vector table
93762306a36Sopenharmony_ci * @vector: irq vector
93862306a36Sopenharmony_ci * @reply_post_host_index: head index in the pool where FW completes IO
93962306a36Sopenharmony_ci * @reply_post_free: reply post base virt address
94062306a36Sopenharmony_ci * @name: the name registered to request_irq()
94162306a36Sopenharmony_ci * @busy: isr is actively processing replies on another cpu
94262306a36Sopenharmony_ci * @os_irq: irq number
94362306a36Sopenharmony_ci * @irqpoll: irq_poll object
94462306a36Sopenharmony_ci * @irq_poll_scheduled: Tells whether irq poll is scheduled or not
94562306a36Sopenharmony_ci * @is_iouring_poll_q: Tells whether reply queues is assigned
94662306a36Sopenharmony_ci *			to io uring poll queues or not
94762306a36Sopenharmony_ci * @list: this list
94862306a36Sopenharmony_ci*/
94962306a36Sopenharmony_cistruct adapter_reply_queue {
95062306a36Sopenharmony_ci	struct MPT3SAS_ADAPTER	*ioc;
95162306a36Sopenharmony_ci	u8			msix_index;
95262306a36Sopenharmony_ci	u32			reply_post_host_index;
95362306a36Sopenharmony_ci	Mpi2ReplyDescriptorsUnion_t *reply_post_free;
95462306a36Sopenharmony_ci	char			name[MPT_NAME_LENGTH];
95562306a36Sopenharmony_ci	atomic_t		busy;
95662306a36Sopenharmony_ci	u32			os_irq;
95762306a36Sopenharmony_ci	struct irq_poll         irqpoll;
95862306a36Sopenharmony_ci	bool			irq_poll_scheduled;
95962306a36Sopenharmony_ci	bool			irq_line_enable;
96062306a36Sopenharmony_ci	bool			is_iouring_poll_q;
96162306a36Sopenharmony_ci	struct list_head	list;
96262306a36Sopenharmony_ci};
96362306a36Sopenharmony_ci
96462306a36Sopenharmony_ci/**
96562306a36Sopenharmony_ci * struct io_uring_poll_queue - the io uring poll queue structure
96662306a36Sopenharmony_ci * @busy: Tells whether io uring poll queue is busy or not
96762306a36Sopenharmony_ci * @pause: Tells whether IOs are paused on io uring poll queue or not
96862306a36Sopenharmony_ci * @reply_q: reply queue mapped for io uring poll queue
96962306a36Sopenharmony_ci */
97062306a36Sopenharmony_cistruct io_uring_poll_queue {
97162306a36Sopenharmony_ci	atomic_t	busy;
97262306a36Sopenharmony_ci	atomic_t	pause;
97362306a36Sopenharmony_ci	struct adapter_reply_queue *reply_q;
97462306a36Sopenharmony_ci};
97562306a36Sopenharmony_ci
97662306a36Sopenharmony_citypedef void (*MPT_ADD_SGE)(void *paddr, u32 flags_length, dma_addr_t dma_addr);
97762306a36Sopenharmony_ci
97862306a36Sopenharmony_ci/* SAS3.0 support */
97962306a36Sopenharmony_citypedef int (*MPT_BUILD_SG_SCMD)(struct MPT3SAS_ADAPTER *ioc,
98062306a36Sopenharmony_ci	struct scsi_cmnd *scmd, u16 smid, struct _pcie_device *pcie_device);
98162306a36Sopenharmony_citypedef void (*MPT_BUILD_SG)(struct MPT3SAS_ADAPTER *ioc, void *psge,
98262306a36Sopenharmony_ci		dma_addr_t data_out_dma, size_t data_out_sz,
98362306a36Sopenharmony_ci		dma_addr_t data_in_dma, size_t data_in_sz);
98462306a36Sopenharmony_citypedef void (*MPT_BUILD_ZERO_LEN_SGE)(struct MPT3SAS_ADAPTER *ioc,
98562306a36Sopenharmony_ci		void *paddr);
98662306a36Sopenharmony_ci
98762306a36Sopenharmony_ci/* SAS3.5 support */
98862306a36Sopenharmony_citypedef void (*NVME_BUILD_PRP)(struct MPT3SAS_ADAPTER *ioc, u16 smid,
98962306a36Sopenharmony_ci	Mpi26NVMeEncapsulatedRequest_t *nvme_encap_request,
99062306a36Sopenharmony_ci	dma_addr_t data_out_dma, size_t data_out_sz, dma_addr_t data_in_dma,
99162306a36Sopenharmony_ci	size_t data_in_sz);
99262306a36Sopenharmony_ci
99362306a36Sopenharmony_ci/* To support atomic and non atomic descriptors*/
99462306a36Sopenharmony_citypedef void (*PUT_SMID_IO_FP_HIP) (struct MPT3SAS_ADAPTER *ioc, u16 smid,
99562306a36Sopenharmony_ci	u16 funcdep);
99662306a36Sopenharmony_citypedef void (*PUT_SMID_DEFAULT) (struct MPT3SAS_ADAPTER *ioc, u16 smid);
99762306a36Sopenharmony_citypedef u32 (*BASE_READ_REG) (const void __iomem *addr);
99862306a36Sopenharmony_ci/*
99962306a36Sopenharmony_ci * To get high iops reply queue's msix index when high iops mode is enabled
100062306a36Sopenharmony_ci * else get the msix index of general reply queues.
100162306a36Sopenharmony_ci */
100262306a36Sopenharmony_citypedef u8 (*GET_MSIX_INDEX) (struct MPT3SAS_ADAPTER *ioc,
100362306a36Sopenharmony_ci	struct scsi_cmnd *scmd);
100462306a36Sopenharmony_ci
100562306a36Sopenharmony_ci/* IOC Facts and Port Facts converted from little endian to cpu */
100662306a36Sopenharmony_ciunion mpi3_version_union {
100762306a36Sopenharmony_ci	MPI2_VERSION_STRUCT		Struct;
100862306a36Sopenharmony_ci	u32				Word;
100962306a36Sopenharmony_ci};
101062306a36Sopenharmony_ci
101162306a36Sopenharmony_cistruct mpt3sas_facts {
101262306a36Sopenharmony_ci	u16			MsgVersion;
101362306a36Sopenharmony_ci	u16			HeaderVersion;
101462306a36Sopenharmony_ci	u8			IOCNumber;
101562306a36Sopenharmony_ci	u8			VP_ID;
101662306a36Sopenharmony_ci	u8			VF_ID;
101762306a36Sopenharmony_ci	u16			IOCExceptions;
101862306a36Sopenharmony_ci	u16			IOCStatus;
101962306a36Sopenharmony_ci	u32			IOCLogInfo;
102062306a36Sopenharmony_ci	u8			MaxChainDepth;
102162306a36Sopenharmony_ci	u8			WhoInit;
102262306a36Sopenharmony_ci	u8			NumberOfPorts;
102362306a36Sopenharmony_ci	u8			MaxMSIxVectors;
102462306a36Sopenharmony_ci	u16			RequestCredit;
102562306a36Sopenharmony_ci	u16			ProductID;
102662306a36Sopenharmony_ci	u32			IOCCapabilities;
102762306a36Sopenharmony_ci	union mpi3_version_union	FWVersion;
102862306a36Sopenharmony_ci	u16			IOCRequestFrameSize;
102962306a36Sopenharmony_ci	u16			IOCMaxChainSegmentSize;
103062306a36Sopenharmony_ci	u16			MaxInitiators;
103162306a36Sopenharmony_ci	u16			MaxTargets;
103262306a36Sopenharmony_ci	u16			MaxSasExpanders;
103362306a36Sopenharmony_ci	u16			MaxEnclosures;
103462306a36Sopenharmony_ci	u16			ProtocolFlags;
103562306a36Sopenharmony_ci	u16			HighPriorityCredit;
103662306a36Sopenharmony_ci	u16			MaxReplyDescriptorPostQueueDepth;
103762306a36Sopenharmony_ci	u8			ReplyFrameSize;
103862306a36Sopenharmony_ci	u8			MaxVolumes;
103962306a36Sopenharmony_ci	u16			MaxDevHandle;
104062306a36Sopenharmony_ci	u16			MaxPersistentEntries;
104162306a36Sopenharmony_ci	u16			MinDevHandle;
104262306a36Sopenharmony_ci	u8			CurrentHostPageSize;
104362306a36Sopenharmony_ci};
104462306a36Sopenharmony_ci
104562306a36Sopenharmony_cistruct mpt3sas_port_facts {
104662306a36Sopenharmony_ci	u8			PortNumber;
104762306a36Sopenharmony_ci	u8			VP_ID;
104862306a36Sopenharmony_ci	u8			VF_ID;
104962306a36Sopenharmony_ci	u8			PortType;
105062306a36Sopenharmony_ci	u16			MaxPostedCmdBuffers;
105162306a36Sopenharmony_ci};
105262306a36Sopenharmony_ci
105362306a36Sopenharmony_cistruct reply_post_struct {
105462306a36Sopenharmony_ci	Mpi2ReplyDescriptorsUnion_t	*reply_post_free;
105562306a36Sopenharmony_ci	dma_addr_t			reply_post_free_dma;
105662306a36Sopenharmony_ci};
105762306a36Sopenharmony_ci
105862306a36Sopenharmony_ci/**
105962306a36Sopenharmony_ci * struct virtual_phy - vSES phy structure
106062306a36Sopenharmony_ci * sas_address: SAS Address of vSES device
106162306a36Sopenharmony_ci * phy_mask: vSES device's phy number
106262306a36Sopenharmony_ci * flags: flags used to manage this structure
106362306a36Sopenharmony_ci */
106462306a36Sopenharmony_cistruct virtual_phy {
106562306a36Sopenharmony_ci	struct	list_head list;
106662306a36Sopenharmony_ci	u64	sas_address;
106762306a36Sopenharmony_ci	u32	phy_mask;
106862306a36Sopenharmony_ci	u8	flags;
106962306a36Sopenharmony_ci};
107062306a36Sopenharmony_ci
107162306a36Sopenharmony_ci#define MPT_VPHY_FLAG_DIRTY_PHY	0x01
107262306a36Sopenharmony_ci
107362306a36Sopenharmony_ci/**
107462306a36Sopenharmony_ci * struct hba_port - Saves each HBA's Wide/Narrow port info
107562306a36Sopenharmony_ci * @sas_address: sas address of this wide/narrow port's attached device
107662306a36Sopenharmony_ci * @phy_mask: HBA PHY's belonging to this port
107762306a36Sopenharmony_ci * @port_id: port number
107862306a36Sopenharmony_ci * @flags: hba port flags
107962306a36Sopenharmony_ci * @vphys_mask : mask of vSES devices Phy number
108062306a36Sopenharmony_ci * @vphys_list : list containing vSES device structures
108162306a36Sopenharmony_ci */
108262306a36Sopenharmony_cistruct hba_port {
108362306a36Sopenharmony_ci	struct list_head list;
108462306a36Sopenharmony_ci	u64	sas_address;
108562306a36Sopenharmony_ci	u32	phy_mask;
108662306a36Sopenharmony_ci	u8      port_id;
108762306a36Sopenharmony_ci	u8	flags;
108862306a36Sopenharmony_ci	u32	vphys_mask;
108962306a36Sopenharmony_ci	struct list_head vphys_list;
109062306a36Sopenharmony_ci};
109162306a36Sopenharmony_ci
109262306a36Sopenharmony_ci/* hba port flags */
109362306a36Sopenharmony_ci#define HBA_PORT_FLAG_DIRTY_PORT       0x01
109462306a36Sopenharmony_ci#define HBA_PORT_FLAG_NEW_PORT         0x02
109562306a36Sopenharmony_ci
109662306a36Sopenharmony_ci#define MULTIPATH_DISABLED_PORT_ID     0xFF
109762306a36Sopenharmony_ci
109862306a36Sopenharmony_ci/**
109962306a36Sopenharmony_ci * struct htb_rel_query - diagnostic buffer release reason
110062306a36Sopenharmony_ci * @unique_id - unique id associated with this buffer.
110162306a36Sopenharmony_ci * @buffer_rel_condition - Release condition ioctl/sysfs/reset
110262306a36Sopenharmony_ci * @reserved
110362306a36Sopenharmony_ci * @trigger_type - Master/Event/scsi/MPI
110462306a36Sopenharmony_ci * @trigger_info_dwords - Data Correspondig to trigger type
110562306a36Sopenharmony_ci */
110662306a36Sopenharmony_cistruct htb_rel_query {
110762306a36Sopenharmony_ci	u16	buffer_rel_condition;
110862306a36Sopenharmony_ci	u16	reserved;
110962306a36Sopenharmony_ci	u32	trigger_type;
111062306a36Sopenharmony_ci	u32	trigger_info_dwords[2];
111162306a36Sopenharmony_ci};
111262306a36Sopenharmony_ci
111362306a36Sopenharmony_ci/* Buffer_rel_condition bit fields */
111462306a36Sopenharmony_ci
111562306a36Sopenharmony_ci/* Bit 0 - Diag Buffer not Released */
111662306a36Sopenharmony_ci#define MPT3_DIAG_BUFFER_NOT_RELEASED	(0x00)
111762306a36Sopenharmony_ci/* Bit 0 - Diag Buffer Released */
111862306a36Sopenharmony_ci#define MPT3_DIAG_BUFFER_RELEASED	(0x01)
111962306a36Sopenharmony_ci
112062306a36Sopenharmony_ci/*
112162306a36Sopenharmony_ci * Bit 1 - Diag Buffer Released by IOCTL,
112262306a36Sopenharmony_ci * This bit is valid only if Bit 0 is one
112362306a36Sopenharmony_ci */
112462306a36Sopenharmony_ci#define MPT3_DIAG_BUFFER_REL_IOCTL	(0x02 | MPT3_DIAG_BUFFER_RELEASED)
112562306a36Sopenharmony_ci
112662306a36Sopenharmony_ci/*
112762306a36Sopenharmony_ci * Bit 2 - Diag Buffer Released by Trigger,
112862306a36Sopenharmony_ci * This bit is valid only if Bit 0 is one
112962306a36Sopenharmony_ci */
113062306a36Sopenharmony_ci#define MPT3_DIAG_BUFFER_REL_TRIGGER	(0x04 | MPT3_DIAG_BUFFER_RELEASED)
113162306a36Sopenharmony_ci
113262306a36Sopenharmony_ci/*
113362306a36Sopenharmony_ci * Bit 3 - Diag Buffer Released by SysFs,
113462306a36Sopenharmony_ci * This bit is valid only if Bit 0 is one
113562306a36Sopenharmony_ci */
113662306a36Sopenharmony_ci#define MPT3_DIAG_BUFFER_REL_SYSFS	(0x08 | MPT3_DIAG_BUFFER_RELEASED)
113762306a36Sopenharmony_ci
113862306a36Sopenharmony_ci/* DIAG RESET Master trigger flags */
113962306a36Sopenharmony_ci#define MPT_DIAG_RESET_ISSUED_BY_DRIVER 0x00000000
114062306a36Sopenharmony_ci#define MPT_DIAG_RESET_ISSUED_BY_USER	0x00000001
114162306a36Sopenharmony_ci
114262306a36Sopenharmony_citypedef void (*MPT3SAS_FLUSH_RUNNING_CMDS)(struct MPT3SAS_ADAPTER *ioc);
114362306a36Sopenharmony_ci/**
114462306a36Sopenharmony_ci * struct MPT3SAS_ADAPTER - per adapter struct
114562306a36Sopenharmony_ci * @list: ioc_list
114662306a36Sopenharmony_ci * @shost: shost object
114762306a36Sopenharmony_ci * @id: unique adapter id
114862306a36Sopenharmony_ci * @cpu_count: number online cpus
114962306a36Sopenharmony_ci * @name: generic ioc string
115062306a36Sopenharmony_ci * @tmp_string: tmp string used for logging
115162306a36Sopenharmony_ci * @pdev: pci pdev object
115262306a36Sopenharmony_ci * @pio_chip: physical io register space
115362306a36Sopenharmony_ci * @chip: memory mapped register space
115462306a36Sopenharmony_ci * @chip_phys: physical addrss prior to mapping
115562306a36Sopenharmony_ci * @logging_level: see mpt3sas_debug.h
115662306a36Sopenharmony_ci * @fwfault_debug: debuging FW timeouts
115762306a36Sopenharmony_ci * @ir_firmware: IR firmware present
115862306a36Sopenharmony_ci * @bars: bitmask of BAR's that must be configured
115962306a36Sopenharmony_ci * @mask_interrupts: ignore interrupt
116062306a36Sopenharmony_ci * @pci_access_mutex: Mutex to synchronize ioctl, sysfs show path and
116162306a36Sopenharmony_ci *			pci resource handling
116262306a36Sopenharmony_ci * @fault_reset_work_q_name: fw fault work queue
116362306a36Sopenharmony_ci * @fault_reset_work_q: ""
116462306a36Sopenharmony_ci * @fault_reset_work: ""
116562306a36Sopenharmony_ci * @firmware_event_name: fw event work queue
116662306a36Sopenharmony_ci * @firmware_event_thread: ""
116762306a36Sopenharmony_ci * @fw_event_lock:
116862306a36Sopenharmony_ci * @fw_event_list: list of fw events
116962306a36Sopenharmony_ci * @current_evet: current processing firmware event
117062306a36Sopenharmony_ci * @fw_event_cleanup: set to one while cleaning up the fw events
117162306a36Sopenharmony_ci * @aen_event_read_flag: event log was read
117262306a36Sopenharmony_ci * @broadcast_aen_busy: broadcast aen waiting to be serviced
117362306a36Sopenharmony_ci * @shost_recovery: host reset in progress
117462306a36Sopenharmony_ci * @ioc_reset_in_progress_lock:
117562306a36Sopenharmony_ci * @ioc_link_reset_in_progress: phy/hard reset in progress
117662306a36Sopenharmony_ci * @ignore_loginfos: ignore loginfos during task management
117762306a36Sopenharmony_ci * @remove_host: flag for when driver unloads, to avoid sending dev resets
117862306a36Sopenharmony_ci * @pci_error_recovery: flag to prevent ioc access until slot reset completes
117962306a36Sopenharmony_ci * @wait_for_discovery_to_complete: flag set at driver load time when
118062306a36Sopenharmony_ci *                                               waiting on reporting devices
118162306a36Sopenharmony_ci * @is_driver_loading: flag set at driver load time
118262306a36Sopenharmony_ci * @port_enable_failed: flag set when port enable has failed
118362306a36Sopenharmony_ci * @start_scan: flag set from scan_start callback, cleared from _mpt3sas_fw_work
118462306a36Sopenharmony_ci * @start_scan_failed: means port enable failed, return's the ioc_status
118562306a36Sopenharmony_ci * @msix_enable: flag indicating msix is enabled
118662306a36Sopenharmony_ci * @msix_vector_count: number msix vectors
118762306a36Sopenharmony_ci * @cpu_msix_table: table for mapping cpus to msix index
118862306a36Sopenharmony_ci * @cpu_msix_table_sz: table size
118962306a36Sopenharmony_ci * @total_io_cnt: Gives total IO count, used to load balance the interrupts
119062306a36Sopenharmony_ci * @ioc_coredump_loop: will have non-zero value when FW is in CoreDump state
119162306a36Sopenharmony_ci * @timestamp_update_count: Counter to fire timeSync command
119262306a36Sopenharmony_ci * time_sync_interval: Time sync interval read from man page 11
119362306a36Sopenharmony_ci * @high_iops_outstanding: used to load balance the interrupts
119462306a36Sopenharmony_ci *				within high iops reply queues
119562306a36Sopenharmony_ci * @msix_load_balance: Enables load balancing of interrupts across
119662306a36Sopenharmony_ci * the multiple MSIXs
119762306a36Sopenharmony_ci * @schedule_dead_ioc_flush_running_cmds: callback to flush pending commands
119862306a36Sopenharmony_ci * @thresh_hold: Max number of reply descriptors processed
119962306a36Sopenharmony_ci *				before updating Host Index
120062306a36Sopenharmony_ci * @iopoll_q_start_index: starting index of io uring poll queues
120162306a36Sopenharmony_ci *				in reply queue list
120262306a36Sopenharmony_ci * @drv_internal_flags: Bit map internal to driver
120362306a36Sopenharmony_ci * @drv_support_bitmap: driver's supported feature bit map
120462306a36Sopenharmony_ci * @use_32bit_dma: Flag to use 32 bit consistent dma mask
120562306a36Sopenharmony_ci * @scsi_io_cb_idx: shost generated commands
120662306a36Sopenharmony_ci * @tm_cb_idx: task management commands
120762306a36Sopenharmony_ci * @scsih_cb_idx: scsih internal commands
120862306a36Sopenharmony_ci * @transport_cb_idx: transport internal commands
120962306a36Sopenharmony_ci * @ctl_cb_idx: clt internal commands
121062306a36Sopenharmony_ci * @base_cb_idx: base internal commands
121162306a36Sopenharmony_ci * @config_cb_idx: base internal commands
121262306a36Sopenharmony_ci * @tm_tr_cb_idx : device removal target reset handshake
121362306a36Sopenharmony_ci * @tm_tr_volume_cb_idx : volume removal target reset
121462306a36Sopenharmony_ci * @base_cmds:
121562306a36Sopenharmony_ci * @transport_cmds:
121662306a36Sopenharmony_ci * @scsih_cmds:
121762306a36Sopenharmony_ci * @tm_cmds:
121862306a36Sopenharmony_ci * @ctl_cmds:
121962306a36Sopenharmony_ci * @config_cmds:
122062306a36Sopenharmony_ci * @base_add_sg_single: handler for either 32/64 bit sgl's
122162306a36Sopenharmony_ci * @event_type: bits indicating which events to log
122262306a36Sopenharmony_ci * @event_context: unique id for each logged event
122362306a36Sopenharmony_ci * @event_log: event log pointer
122462306a36Sopenharmony_ci * @event_masks: events that are masked
122562306a36Sopenharmony_ci * @max_shutdown_latency: timeout value for NVMe shutdown operation,
122662306a36Sopenharmony_ci *			which is equal that NVMe drive's RTD3 Entry Latency
122762306a36Sopenharmony_ci *			which has reported maximum RTD3 Entry Latency value
122862306a36Sopenharmony_ci *			among attached NVMe drives.
122962306a36Sopenharmony_ci * @facts: static facts data
123062306a36Sopenharmony_ci * @prev_fw_facts: previous fw facts data
123162306a36Sopenharmony_ci * @pfacts: static port facts data
123262306a36Sopenharmony_ci * @manu_pg0: static manufacturing page 0
123362306a36Sopenharmony_ci * @manu_pg10: static manufacturing page 10
123462306a36Sopenharmony_ci * @manu_pg11: static manufacturing page 11
123562306a36Sopenharmony_ci * @bios_pg2: static bios page 2
123662306a36Sopenharmony_ci * @bios_pg3: static bios page 3
123762306a36Sopenharmony_ci * @ioc_pg8: static ioc page 8
123862306a36Sopenharmony_ci * @iounit_pg0: static iounit page 0
123962306a36Sopenharmony_ci * @iounit_pg1: static iounit page 1
124062306a36Sopenharmony_ci * @iounit_pg8: static iounit page 8
124162306a36Sopenharmony_ci * @sas_hba: sas host object
124262306a36Sopenharmony_ci * @sas_expander_list: expander object list
124362306a36Sopenharmony_ci * @enclosure_list: enclosure object list
124462306a36Sopenharmony_ci * @sas_node_lock:
124562306a36Sopenharmony_ci * @sas_device_list: sas device object list
124662306a36Sopenharmony_ci * @sas_device_init_list: sas device object list (used only at init time)
124762306a36Sopenharmony_ci * @sas_device_lock:
124862306a36Sopenharmony_ci * @pcie_device_list: pcie device object list
124962306a36Sopenharmony_ci * @pcie_device_init_list: pcie device object list (used only at init time)
125062306a36Sopenharmony_ci * @pcie_device_lock:
125162306a36Sopenharmony_ci * @io_missing_delay: time for IO completed by fw when PDR enabled
125262306a36Sopenharmony_ci * @device_missing_delay: time for device missing by fw when PDR enabled
125362306a36Sopenharmony_ci * @sas_id : used for setting volume target IDs
125462306a36Sopenharmony_ci * @pcie_target_id: used for setting pcie target IDs
125562306a36Sopenharmony_ci * @blocking_handles: bitmask used to identify which devices need blocking
125662306a36Sopenharmony_ci * @pd_handles : bitmask for PD handles
125762306a36Sopenharmony_ci * @pd_handles_sz : size of pd_handle bitmask
125862306a36Sopenharmony_ci * @config_page_sz: config page size
125962306a36Sopenharmony_ci * @config_page: reserve memory for config page payload
126062306a36Sopenharmony_ci * @config_page_dma:
126162306a36Sopenharmony_ci * @hba_queue_depth: hba request queue depth
126262306a36Sopenharmony_ci * @sge_size: sg element size for either 32/64 bit
126362306a36Sopenharmony_ci * @scsiio_depth: SCSI_IO queue depth
126462306a36Sopenharmony_ci * @request_sz: per request frame size
126562306a36Sopenharmony_ci * @request: pool of request frames
126662306a36Sopenharmony_ci * @request_dma:
126762306a36Sopenharmony_ci * @request_dma_sz:
126862306a36Sopenharmony_ci * @scsi_lookup: firmware request tracker list
126962306a36Sopenharmony_ci * @scsi_lookup_lock:
127062306a36Sopenharmony_ci * @free_list: free list of request
127162306a36Sopenharmony_ci * @pending_io_count:
127262306a36Sopenharmony_ci * @reset_wq:
127362306a36Sopenharmony_ci * @chain: pool of chains
127462306a36Sopenharmony_ci * @chain_dma:
127562306a36Sopenharmony_ci * @max_sges_in_main_message: number sg elements in main message
127662306a36Sopenharmony_ci * @max_sges_in_chain_message: number sg elements per chain
127762306a36Sopenharmony_ci * @chains_needed_per_io: max chains per io
127862306a36Sopenharmony_ci * @chain_depth: total chains allocated
127962306a36Sopenharmony_ci * @chain_segment_sz: gives the max number of
128062306a36Sopenharmony_ci *			SGEs accommodate on single chain buffer
128162306a36Sopenharmony_ci * @hi_priority_smid:
128262306a36Sopenharmony_ci * @hi_priority:
128362306a36Sopenharmony_ci * @hi_priority_dma:
128462306a36Sopenharmony_ci * @hi_priority_depth:
128562306a36Sopenharmony_ci * @hpr_lookup:
128662306a36Sopenharmony_ci * @hpr_free_list:
128762306a36Sopenharmony_ci * @internal_smid:
128862306a36Sopenharmony_ci * @internal:
128962306a36Sopenharmony_ci * @internal_dma:
129062306a36Sopenharmony_ci * @internal_depth:
129162306a36Sopenharmony_ci * @internal_lookup:
129262306a36Sopenharmony_ci * @internal_free_list:
129362306a36Sopenharmony_ci * @sense: pool of sense
129462306a36Sopenharmony_ci * @sense_dma:
129562306a36Sopenharmony_ci * @sense_dma_pool:
129662306a36Sopenharmony_ci * @reply_depth: hba reply queue depth:
129762306a36Sopenharmony_ci * @reply_sz: per reply frame size:
129862306a36Sopenharmony_ci * @reply: pool of replys:
129962306a36Sopenharmony_ci * @reply_dma:
130062306a36Sopenharmony_ci * @reply_dma_pool:
130162306a36Sopenharmony_ci * @reply_free_queue_depth: reply free depth
130262306a36Sopenharmony_ci * @reply_free: pool for reply free queue (32 bit addr)
130362306a36Sopenharmony_ci * @reply_free_dma:
130462306a36Sopenharmony_ci * @reply_free_dma_pool:
130562306a36Sopenharmony_ci * @reply_free_host_index: tail index in pool to insert free replys
130662306a36Sopenharmony_ci * @reply_post_queue_depth: reply post queue depth
130762306a36Sopenharmony_ci * @reply_post_struct: struct for reply_post_free physical & virt address
130862306a36Sopenharmony_ci * @rdpq_array_capable: FW supports multiple reply queue addresses in ioc_init
130962306a36Sopenharmony_ci * @rdpq_array_enable: rdpq_array support is enabled in the driver
131062306a36Sopenharmony_ci * @rdpq_array_enable_assigned: this ensures that rdpq_array_enable flag
131162306a36Sopenharmony_ci *				is assigned only ones
131262306a36Sopenharmony_ci * @reply_queue_count: number of reply queue's
131362306a36Sopenharmony_ci * @reply_queue_list: link list contaning the reply queue info
131462306a36Sopenharmony_ci * @msix96_vector: 96 MSI-X vector support
131562306a36Sopenharmony_ci * @replyPostRegisterIndex: index of next position in Reply Desc Post Queue
131662306a36Sopenharmony_ci * @delayed_tr_list: target reset link list
131762306a36Sopenharmony_ci * @delayed_tr_volume_list: volume target reset link list
131862306a36Sopenharmony_ci * @delayed_sc_list:
131962306a36Sopenharmony_ci * @delayed_event_ack_list:
132062306a36Sopenharmony_ci * @temp_sensors_count: flag to carry the number of temperature sensors
132162306a36Sopenharmony_ci * @pci_access_mutex: Mutex to synchronize ioctl,sysfs show path and
132262306a36Sopenharmony_ci *	pci resource handling. PCI resource freeing will lead to free
132362306a36Sopenharmony_ci *	vital hardware/memory resource, which might be in use by cli/sysfs
132462306a36Sopenharmony_ci *	path functions resulting in Null pointer reference followed by kernel
132562306a36Sopenharmony_ci *	crash. To avoid the above race condition we use mutex syncrhonization
132662306a36Sopenharmony_ci *	which ensures the syncrhonization between cli/sysfs_show path.
132762306a36Sopenharmony_ci * @atomic_desc_capable: Atomic Request Descriptor support.
132862306a36Sopenharmony_ci * @GET_MSIX_INDEX: Get the msix index of high iops queues.
132962306a36Sopenharmony_ci * @multipath_on_hba: flag to determine multipath on hba is enabled or not
133062306a36Sopenharmony_ci * @port_table_list: list containing HBA's wide/narrow port's info
133162306a36Sopenharmony_ci */
133262306a36Sopenharmony_cistruct MPT3SAS_ADAPTER {
133362306a36Sopenharmony_ci	struct list_head list;
133462306a36Sopenharmony_ci	struct Scsi_Host *shost;
133562306a36Sopenharmony_ci	u8		id;
133662306a36Sopenharmony_ci	int		cpu_count;
133762306a36Sopenharmony_ci	char		name[MPT_NAME_LENGTH];
133862306a36Sopenharmony_ci	char		driver_name[MPT_NAME_LENGTH - 8];
133962306a36Sopenharmony_ci	char		tmp_string[MPT_STRING_LENGTH];
134062306a36Sopenharmony_ci	struct pci_dev	*pdev;
134162306a36Sopenharmony_ci	Mpi2SystemInterfaceRegs_t __iomem *chip;
134262306a36Sopenharmony_ci	phys_addr_t	chip_phys;
134362306a36Sopenharmony_ci	int		logging_level;
134462306a36Sopenharmony_ci	int		fwfault_debug;
134562306a36Sopenharmony_ci	u8		ir_firmware;
134662306a36Sopenharmony_ci	int		bars;
134762306a36Sopenharmony_ci	u8		mask_interrupts;
134862306a36Sopenharmony_ci
134962306a36Sopenharmony_ci	/* fw fault handler */
135062306a36Sopenharmony_ci	char		fault_reset_work_q_name[20];
135162306a36Sopenharmony_ci	struct workqueue_struct *fault_reset_work_q;
135262306a36Sopenharmony_ci	struct delayed_work fault_reset_work;
135362306a36Sopenharmony_ci
135462306a36Sopenharmony_ci	/* fw event handler */
135562306a36Sopenharmony_ci	char		firmware_event_name[20];
135662306a36Sopenharmony_ci	struct workqueue_struct	*firmware_event_thread;
135762306a36Sopenharmony_ci	spinlock_t	fw_event_lock;
135862306a36Sopenharmony_ci	struct list_head fw_event_list;
135962306a36Sopenharmony_ci	struct fw_event_work	*current_event;
136062306a36Sopenharmony_ci	u8		fw_events_cleanup;
136162306a36Sopenharmony_ci
136262306a36Sopenharmony_ci	 /* misc flags */
136362306a36Sopenharmony_ci	int		aen_event_read_flag;
136462306a36Sopenharmony_ci	u8		broadcast_aen_busy;
136562306a36Sopenharmony_ci	u16		broadcast_aen_pending;
136662306a36Sopenharmony_ci	u8		shost_recovery;
136762306a36Sopenharmony_ci	u8		got_task_abort_from_ioctl;
136862306a36Sopenharmony_ci
136962306a36Sopenharmony_ci	struct mutex	reset_in_progress_mutex;
137062306a36Sopenharmony_ci	spinlock_t	ioc_reset_in_progress_lock;
137162306a36Sopenharmony_ci	u8		ioc_link_reset_in_progress;
137262306a36Sopenharmony_ci
137362306a36Sopenharmony_ci	u8		ignore_loginfos;
137462306a36Sopenharmony_ci	u8		remove_host;
137562306a36Sopenharmony_ci	u8		pci_error_recovery;
137662306a36Sopenharmony_ci	u8		wait_for_discovery_to_complete;
137762306a36Sopenharmony_ci	u8		is_driver_loading;
137862306a36Sopenharmony_ci	u8		port_enable_failed;
137962306a36Sopenharmony_ci	u8		start_scan;
138062306a36Sopenharmony_ci	u16		start_scan_failed;
138162306a36Sopenharmony_ci
138262306a36Sopenharmony_ci	u8		msix_enable;
138362306a36Sopenharmony_ci	u16		msix_vector_count;
138462306a36Sopenharmony_ci	u8		*cpu_msix_table;
138562306a36Sopenharmony_ci	u16		cpu_msix_table_sz;
138662306a36Sopenharmony_ci	resource_size_t __iomem **reply_post_host_index;
138762306a36Sopenharmony_ci	u32		ioc_reset_count;
138862306a36Sopenharmony_ci	MPT3SAS_FLUSH_RUNNING_CMDS schedule_dead_ioc_flush_running_cmds;
138962306a36Sopenharmony_ci	u32             non_operational_loop;
139062306a36Sopenharmony_ci	u8              ioc_coredump_loop;
139162306a36Sopenharmony_ci	u32		timestamp_update_count;
139262306a36Sopenharmony_ci	u32		time_sync_interval;
139362306a36Sopenharmony_ci	atomic64_t      total_io_cnt;
139462306a36Sopenharmony_ci	atomic64_t	high_iops_outstanding;
139562306a36Sopenharmony_ci	bool            msix_load_balance;
139662306a36Sopenharmony_ci	u16		thresh_hold;
139762306a36Sopenharmony_ci	u8		high_iops_queues;
139862306a36Sopenharmony_ci	u8		iopoll_q_start_index;
139962306a36Sopenharmony_ci	u32             drv_internal_flags;
140062306a36Sopenharmony_ci	u32		drv_support_bitmap;
140162306a36Sopenharmony_ci	u32             dma_mask;
140262306a36Sopenharmony_ci	bool		enable_sdev_max_qd;
140362306a36Sopenharmony_ci	bool		use_32bit_dma;
140462306a36Sopenharmony_ci	struct io_uring_poll_queue *io_uring_poll_queues;
140562306a36Sopenharmony_ci
140662306a36Sopenharmony_ci	/* internal commands, callback index */
140762306a36Sopenharmony_ci	u8		scsi_io_cb_idx;
140862306a36Sopenharmony_ci	u8		tm_cb_idx;
140962306a36Sopenharmony_ci	u8		transport_cb_idx;
141062306a36Sopenharmony_ci	u8		scsih_cb_idx;
141162306a36Sopenharmony_ci	u8		ctl_cb_idx;
141262306a36Sopenharmony_ci	u8		base_cb_idx;
141362306a36Sopenharmony_ci	u8		port_enable_cb_idx;
141462306a36Sopenharmony_ci	u8		config_cb_idx;
141562306a36Sopenharmony_ci	u8		tm_tr_cb_idx;
141662306a36Sopenharmony_ci	u8		tm_tr_volume_cb_idx;
141762306a36Sopenharmony_ci	u8		tm_sas_control_cb_idx;
141862306a36Sopenharmony_ci	struct _internal_cmd base_cmds;
141962306a36Sopenharmony_ci	struct _internal_cmd port_enable_cmds;
142062306a36Sopenharmony_ci	struct _internal_cmd transport_cmds;
142162306a36Sopenharmony_ci	struct _internal_cmd scsih_cmds;
142262306a36Sopenharmony_ci	struct _internal_cmd tm_cmds;
142362306a36Sopenharmony_ci	struct _internal_cmd ctl_cmds;
142462306a36Sopenharmony_ci	struct _internal_cmd config_cmds;
142562306a36Sopenharmony_ci
142662306a36Sopenharmony_ci	MPT_ADD_SGE	base_add_sg_single;
142762306a36Sopenharmony_ci
142862306a36Sopenharmony_ci	/* function ptr for either IEEE or MPI sg elements */
142962306a36Sopenharmony_ci	MPT_BUILD_SG_SCMD build_sg_scmd;
143062306a36Sopenharmony_ci	MPT_BUILD_SG    build_sg;
143162306a36Sopenharmony_ci	MPT_BUILD_ZERO_LEN_SGE build_zero_len_sge;
143262306a36Sopenharmony_ci	u16             sge_size_ieee;
143362306a36Sopenharmony_ci	u16		hba_mpi_version_belonged;
143462306a36Sopenharmony_ci
143562306a36Sopenharmony_ci	/* function ptr for MPI sg elements only */
143662306a36Sopenharmony_ci	MPT_BUILD_SG    build_sg_mpi;
143762306a36Sopenharmony_ci	MPT_BUILD_ZERO_LEN_SGE build_zero_len_sge_mpi;
143862306a36Sopenharmony_ci
143962306a36Sopenharmony_ci	/* function ptr for NVMe PRP elements only */
144062306a36Sopenharmony_ci	NVME_BUILD_PRP  build_nvme_prp;
144162306a36Sopenharmony_ci
144262306a36Sopenharmony_ci	/* event log */
144362306a36Sopenharmony_ci	u32		event_type[MPI2_EVENT_NOTIFY_EVENTMASK_WORDS];
144462306a36Sopenharmony_ci	u32		event_context;
144562306a36Sopenharmony_ci	void		*event_log;
144662306a36Sopenharmony_ci	u32		event_masks[MPI2_EVENT_NOTIFY_EVENTMASK_WORDS];
144762306a36Sopenharmony_ci
144862306a36Sopenharmony_ci	u8		tm_custom_handling;
144962306a36Sopenharmony_ci	u8		nvme_abort_timeout;
145062306a36Sopenharmony_ci	u16		max_shutdown_latency;
145162306a36Sopenharmony_ci	u16		max_wideport_qd;
145262306a36Sopenharmony_ci	u16		max_narrowport_qd;
145362306a36Sopenharmony_ci	u16		max_nvme_qd;
145462306a36Sopenharmony_ci	u8		max_sata_qd;
145562306a36Sopenharmony_ci
145662306a36Sopenharmony_ci	/* static config pages */
145762306a36Sopenharmony_ci	struct mpt3sas_facts facts;
145862306a36Sopenharmony_ci	struct mpt3sas_facts prev_fw_facts;
145962306a36Sopenharmony_ci	struct mpt3sas_port_facts *pfacts;
146062306a36Sopenharmony_ci	Mpi2ManufacturingPage0_t manu_pg0;
146162306a36Sopenharmony_ci	struct Mpi2ManufacturingPage10_t manu_pg10;
146262306a36Sopenharmony_ci	struct Mpi2ManufacturingPage11_t manu_pg11;
146362306a36Sopenharmony_ci	Mpi2BiosPage2_t	bios_pg2;
146462306a36Sopenharmony_ci	Mpi2BiosPage3_t	bios_pg3;
146562306a36Sopenharmony_ci	Mpi2IOCPage8_t ioc_pg8;
146662306a36Sopenharmony_ci	Mpi2IOUnitPage0_t iounit_pg0;
146762306a36Sopenharmony_ci	Mpi2IOUnitPage1_t iounit_pg1;
146862306a36Sopenharmony_ci	Mpi2IOUnitPage8_t iounit_pg8;
146962306a36Sopenharmony_ci	Mpi2IOCPage1_t	ioc_pg1_copy;
147062306a36Sopenharmony_ci
147162306a36Sopenharmony_ci	struct _boot_device req_boot_device;
147262306a36Sopenharmony_ci	struct _boot_device req_alt_boot_device;
147362306a36Sopenharmony_ci	struct _boot_device current_boot_device;
147462306a36Sopenharmony_ci
147562306a36Sopenharmony_ci	/* sas hba, expander, and device list */
147662306a36Sopenharmony_ci	struct _sas_node sas_hba;
147762306a36Sopenharmony_ci	struct list_head sas_expander_list;
147862306a36Sopenharmony_ci	struct list_head enclosure_list;
147962306a36Sopenharmony_ci	spinlock_t	sas_node_lock;
148062306a36Sopenharmony_ci	struct list_head sas_device_list;
148162306a36Sopenharmony_ci	struct list_head sas_device_init_list;
148262306a36Sopenharmony_ci	spinlock_t	sas_device_lock;
148362306a36Sopenharmony_ci	struct list_head pcie_device_list;
148462306a36Sopenharmony_ci	struct list_head pcie_device_init_list;
148562306a36Sopenharmony_ci	spinlock_t      pcie_device_lock;
148662306a36Sopenharmony_ci
148762306a36Sopenharmony_ci	struct list_head raid_device_list;
148862306a36Sopenharmony_ci	spinlock_t	raid_device_lock;
148962306a36Sopenharmony_ci	u8		io_missing_delay;
149062306a36Sopenharmony_ci	u16		device_missing_delay;
149162306a36Sopenharmony_ci	int		sas_id;
149262306a36Sopenharmony_ci	int		pcie_target_id;
149362306a36Sopenharmony_ci
149462306a36Sopenharmony_ci	void		*blocking_handles;
149562306a36Sopenharmony_ci	void		*pd_handles;
149662306a36Sopenharmony_ci	u16		pd_handles_sz;
149762306a36Sopenharmony_ci
149862306a36Sopenharmony_ci	void		*pend_os_device_add;
149962306a36Sopenharmony_ci	u16		pend_os_device_add_sz;
150062306a36Sopenharmony_ci
150162306a36Sopenharmony_ci	/* config page */
150262306a36Sopenharmony_ci	u16		config_page_sz;
150362306a36Sopenharmony_ci	void		*config_page;
150462306a36Sopenharmony_ci	dma_addr_t	config_page_dma;
150562306a36Sopenharmony_ci	void		*config_vaddr;
150662306a36Sopenharmony_ci
150762306a36Sopenharmony_ci	/* scsiio request */
150862306a36Sopenharmony_ci	u16		hba_queue_depth;
150962306a36Sopenharmony_ci	u16		sge_size;
151062306a36Sopenharmony_ci	u16		scsiio_depth;
151162306a36Sopenharmony_ci	u16		request_sz;
151262306a36Sopenharmony_ci	u8		*request;
151362306a36Sopenharmony_ci	dma_addr_t	request_dma;
151462306a36Sopenharmony_ci	u32		request_dma_sz;
151562306a36Sopenharmony_ci	struct pcie_sg_list *pcie_sg_lookup;
151662306a36Sopenharmony_ci	spinlock_t	scsi_lookup_lock;
151762306a36Sopenharmony_ci	int		pending_io_count;
151862306a36Sopenharmony_ci	wait_queue_head_t reset_wq;
151962306a36Sopenharmony_ci	u16		*io_queue_num;
152062306a36Sopenharmony_ci
152162306a36Sopenharmony_ci	/* PCIe SGL */
152262306a36Sopenharmony_ci	struct dma_pool *pcie_sgl_dma_pool;
152362306a36Sopenharmony_ci	/* Host Page Size */
152462306a36Sopenharmony_ci	u32		page_size;
152562306a36Sopenharmony_ci
152662306a36Sopenharmony_ci	/* chain */
152762306a36Sopenharmony_ci	struct chain_lookup *chain_lookup;
152862306a36Sopenharmony_ci	struct list_head free_chain_list;
152962306a36Sopenharmony_ci	struct dma_pool *chain_dma_pool;
153062306a36Sopenharmony_ci	ulong		chain_pages;
153162306a36Sopenharmony_ci	u16		max_sges_in_main_message;
153262306a36Sopenharmony_ci	u16		max_sges_in_chain_message;
153362306a36Sopenharmony_ci	u16		chains_needed_per_io;
153462306a36Sopenharmony_ci	u32		chain_depth;
153562306a36Sopenharmony_ci	u16		chain_segment_sz;
153662306a36Sopenharmony_ci	u16		chains_per_prp_buffer;
153762306a36Sopenharmony_ci
153862306a36Sopenharmony_ci	/* hi-priority queue */
153962306a36Sopenharmony_ci	u16		hi_priority_smid;
154062306a36Sopenharmony_ci	u8		*hi_priority;
154162306a36Sopenharmony_ci	dma_addr_t	hi_priority_dma;
154262306a36Sopenharmony_ci	u16		hi_priority_depth;
154362306a36Sopenharmony_ci	struct request_tracker *hpr_lookup;
154462306a36Sopenharmony_ci	struct list_head hpr_free_list;
154562306a36Sopenharmony_ci
154662306a36Sopenharmony_ci	/* internal queue */
154762306a36Sopenharmony_ci	u16		internal_smid;
154862306a36Sopenharmony_ci	u8		*internal;
154962306a36Sopenharmony_ci	dma_addr_t	internal_dma;
155062306a36Sopenharmony_ci	u16		internal_depth;
155162306a36Sopenharmony_ci	struct request_tracker *internal_lookup;
155262306a36Sopenharmony_ci	struct list_head internal_free_list;
155362306a36Sopenharmony_ci
155462306a36Sopenharmony_ci	/* sense */
155562306a36Sopenharmony_ci	u8		*sense;
155662306a36Sopenharmony_ci	dma_addr_t	sense_dma;
155762306a36Sopenharmony_ci	struct dma_pool *sense_dma_pool;
155862306a36Sopenharmony_ci
155962306a36Sopenharmony_ci	/* reply */
156062306a36Sopenharmony_ci	u16		reply_sz;
156162306a36Sopenharmony_ci	u8		*reply;
156262306a36Sopenharmony_ci	dma_addr_t	reply_dma;
156362306a36Sopenharmony_ci	u32		reply_dma_max_address;
156462306a36Sopenharmony_ci	u32		reply_dma_min_address;
156562306a36Sopenharmony_ci	struct dma_pool *reply_dma_pool;
156662306a36Sopenharmony_ci
156762306a36Sopenharmony_ci	/* reply free queue */
156862306a36Sopenharmony_ci	u16		reply_free_queue_depth;
156962306a36Sopenharmony_ci	__le32		*reply_free;
157062306a36Sopenharmony_ci	dma_addr_t	reply_free_dma;
157162306a36Sopenharmony_ci	struct dma_pool *reply_free_dma_pool;
157262306a36Sopenharmony_ci	u32		reply_free_host_index;
157362306a36Sopenharmony_ci
157462306a36Sopenharmony_ci	/* reply post queue */
157562306a36Sopenharmony_ci	u16		reply_post_queue_depth;
157662306a36Sopenharmony_ci	struct reply_post_struct *reply_post;
157762306a36Sopenharmony_ci	u8		rdpq_array_capable;
157862306a36Sopenharmony_ci	u8		rdpq_array_enable;
157962306a36Sopenharmony_ci	u8		rdpq_array_enable_assigned;
158062306a36Sopenharmony_ci	struct dma_pool *reply_post_free_dma_pool;
158162306a36Sopenharmony_ci	struct dma_pool *reply_post_free_array_dma_pool;
158262306a36Sopenharmony_ci	Mpi2IOCInitRDPQArrayEntry *reply_post_free_array;
158362306a36Sopenharmony_ci	dma_addr_t reply_post_free_array_dma;
158462306a36Sopenharmony_ci	u8		reply_queue_count;
158562306a36Sopenharmony_ci	struct list_head reply_queue_list;
158662306a36Sopenharmony_ci
158762306a36Sopenharmony_ci	u8		combined_reply_queue;
158862306a36Sopenharmony_ci	u8		combined_reply_index_count;
158962306a36Sopenharmony_ci	u8		smp_affinity_enable;
159062306a36Sopenharmony_ci	/* reply post register index */
159162306a36Sopenharmony_ci	resource_size_t	__iomem **replyPostRegisterIndex;
159262306a36Sopenharmony_ci
159362306a36Sopenharmony_ci	struct list_head delayed_tr_list;
159462306a36Sopenharmony_ci	struct list_head delayed_tr_volume_list;
159562306a36Sopenharmony_ci	struct list_head delayed_sc_list;
159662306a36Sopenharmony_ci	struct list_head delayed_event_ack_list;
159762306a36Sopenharmony_ci	u8		temp_sensors_count;
159862306a36Sopenharmony_ci	struct mutex pci_access_mutex;
159962306a36Sopenharmony_ci
160062306a36Sopenharmony_ci	/* diag buffer support */
160162306a36Sopenharmony_ci	u8		*diag_buffer[MPI2_DIAG_BUF_TYPE_COUNT];
160262306a36Sopenharmony_ci	u32		diag_buffer_sz[MPI2_DIAG_BUF_TYPE_COUNT];
160362306a36Sopenharmony_ci	dma_addr_t	diag_buffer_dma[MPI2_DIAG_BUF_TYPE_COUNT];
160462306a36Sopenharmony_ci	u8		diag_buffer_status[MPI2_DIAG_BUF_TYPE_COUNT];
160562306a36Sopenharmony_ci	u32		unique_id[MPI2_DIAG_BUF_TYPE_COUNT];
160662306a36Sopenharmony_ci	u32		product_specific[MPI2_DIAG_BUF_TYPE_COUNT][23];
160762306a36Sopenharmony_ci	u32		diagnostic_flags[MPI2_DIAG_BUF_TYPE_COUNT];
160862306a36Sopenharmony_ci	u32		ring_buffer_offset;
160962306a36Sopenharmony_ci	u32		ring_buffer_sz;
161062306a36Sopenharmony_ci	struct htb_rel_query htb_rel;
161162306a36Sopenharmony_ci	u8 reset_from_user;
161262306a36Sopenharmony_ci	u8		is_warpdrive;
161362306a36Sopenharmony_ci	u8		is_mcpu_endpoint;
161462306a36Sopenharmony_ci	u8		hide_ir_msg;
161562306a36Sopenharmony_ci	u8		mfg_pg10_hide_flag;
161662306a36Sopenharmony_ci	u8		hide_drives;
161762306a36Sopenharmony_ci	spinlock_t	diag_trigger_lock;
161862306a36Sopenharmony_ci	u8		diag_trigger_active;
161962306a36Sopenharmony_ci	u8		atomic_desc_capable;
162062306a36Sopenharmony_ci	BASE_READ_REG	base_readl;
162162306a36Sopenharmony_ci	BASE_READ_REG	base_readl_ext_retry;
162262306a36Sopenharmony_ci	struct SL_WH_MASTER_TRIGGER_T diag_trigger_master;
162362306a36Sopenharmony_ci	struct SL_WH_EVENT_TRIGGERS_T diag_trigger_event;
162462306a36Sopenharmony_ci	struct SL_WH_SCSI_TRIGGERS_T diag_trigger_scsi;
162562306a36Sopenharmony_ci	struct SL_WH_MPI_TRIGGERS_T diag_trigger_mpi;
162662306a36Sopenharmony_ci	u8		supports_trigger_pages;
162762306a36Sopenharmony_ci	void		*device_remove_in_progress;
162862306a36Sopenharmony_ci	u16		device_remove_in_progress_sz;
162962306a36Sopenharmony_ci	u8		is_gen35_ioc;
163062306a36Sopenharmony_ci	u8		is_aero_ioc;
163162306a36Sopenharmony_ci	struct dentry	*debugfs_root;
163262306a36Sopenharmony_ci	struct dentry	*ioc_dump;
163362306a36Sopenharmony_ci	PUT_SMID_IO_FP_HIP put_smid_scsi_io;
163462306a36Sopenharmony_ci	PUT_SMID_IO_FP_HIP put_smid_fast_path;
163562306a36Sopenharmony_ci	PUT_SMID_IO_FP_HIP put_smid_hi_priority;
163662306a36Sopenharmony_ci	PUT_SMID_DEFAULT put_smid_default;
163762306a36Sopenharmony_ci	GET_MSIX_INDEX get_msix_index_for_smlio;
163862306a36Sopenharmony_ci
163962306a36Sopenharmony_ci	u8		multipath_on_hba;
164062306a36Sopenharmony_ci	struct list_head port_table_list;
164162306a36Sopenharmony_ci};
164262306a36Sopenharmony_ci
164362306a36Sopenharmony_cistruct mpt3sas_debugfs_buffer {
164462306a36Sopenharmony_ci	void	*buf;
164562306a36Sopenharmony_ci	u32	len;
164662306a36Sopenharmony_ci};
164762306a36Sopenharmony_ci
164862306a36Sopenharmony_ci#define MPT_DRV_SUPPORT_BITMAP_MEMMOVE 0x00000001
164962306a36Sopenharmony_ci#define MPT_DRV_SUPPORT_BITMAP_ADDNLQUERY	0x00000002
165062306a36Sopenharmony_ci
165162306a36Sopenharmony_ci#define MPT_DRV_INTERNAL_FIRST_PE_ISSUED		0x00000001
165262306a36Sopenharmony_ci
165362306a36Sopenharmony_citypedef u8 (*MPT_CALLBACK)(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
165462306a36Sopenharmony_ci	u32 reply);
165562306a36Sopenharmony_ci
165662306a36Sopenharmony_ci/*
165762306a36Sopenharmony_ci * struct ATTO_SAS_NVRAM - ATTO NVRAM settings stored
165862306a36Sopenharmony_ci *				in Manufacturing page 1 used to get
165962306a36Sopenharmony_ci *				ATTO SasAddr.
166062306a36Sopenharmony_ci */
166162306a36Sopenharmony_cistruct ATTO_SAS_NVRAM {
166262306a36Sopenharmony_ci	u8		Signature[4];
166362306a36Sopenharmony_ci	u8		Version;
166462306a36Sopenharmony_ci#define ATTO_SASNVR_VERSION		0
166562306a36Sopenharmony_ci
166662306a36Sopenharmony_ci	u8		Checksum;
166762306a36Sopenharmony_ci#define ATTO_SASNVR_CKSUM_SEED	0x5A
166862306a36Sopenharmony_ci	u8		Pad[10];
166962306a36Sopenharmony_ci	u8		SasAddr[8];
167062306a36Sopenharmony_ci#define ATTO_SAS_ADDR_ALIGN		64
167162306a36Sopenharmony_ci	u8		Reserved[232];
167262306a36Sopenharmony_ci};
167362306a36Sopenharmony_ci
167462306a36Sopenharmony_ci#define ATTO_SAS_ADDR_DEVNAME_BIAS		63
167562306a36Sopenharmony_ci
167662306a36Sopenharmony_ciunion ATTO_SAS_ADDRESS {
167762306a36Sopenharmony_ci	U8		b[8];
167862306a36Sopenharmony_ci	U16		w[4];
167962306a36Sopenharmony_ci	U32		d[2];
168062306a36Sopenharmony_ci	U64		q;
168162306a36Sopenharmony_ci};
168262306a36Sopenharmony_ci
168362306a36Sopenharmony_ci/* base shared API */
168462306a36Sopenharmony_ciextern struct list_head mpt3sas_ioc_list;
168562306a36Sopenharmony_ciextern char    driver_name[MPT_NAME_LENGTH];
168662306a36Sopenharmony_ci/* spinlock on list operations over IOCs
168762306a36Sopenharmony_ci * Case: when multiple warpdrive cards(IOCs) are in use
168862306a36Sopenharmony_ci * Each IOC will added to the ioc list structure on initialization.
168962306a36Sopenharmony_ci * Watchdog threads run at regular intervals to check IOC for any
169062306a36Sopenharmony_ci * fault conditions which will trigger the dead_ioc thread to
169162306a36Sopenharmony_ci * deallocate pci resource, resulting deleting the IOC netry from list,
169262306a36Sopenharmony_ci * this deletion need to protected by spinlock to enusre that
169362306a36Sopenharmony_ci * ioc removal is syncrhonized, if not synchronized it might lead to
169462306a36Sopenharmony_ci * list_del corruption as the ioc list is traversed in cli path.
169562306a36Sopenharmony_ci */
169662306a36Sopenharmony_ciextern spinlock_t gioc_lock;
169762306a36Sopenharmony_ci
169862306a36Sopenharmony_civoid mpt3sas_base_start_watchdog(struct MPT3SAS_ADAPTER *ioc);
169962306a36Sopenharmony_civoid mpt3sas_base_stop_watchdog(struct MPT3SAS_ADAPTER *ioc);
170062306a36Sopenharmony_ci
170162306a36Sopenharmony_ciint mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc);
170262306a36Sopenharmony_civoid mpt3sas_base_detach(struct MPT3SAS_ADAPTER *ioc);
170362306a36Sopenharmony_ciint mpt3sas_base_map_resources(struct MPT3SAS_ADAPTER *ioc);
170462306a36Sopenharmony_civoid mpt3sas_base_free_resources(struct MPT3SAS_ADAPTER *ioc);
170562306a36Sopenharmony_civoid mpt3sas_free_enclosure_list(struct MPT3SAS_ADAPTER *ioc);
170662306a36Sopenharmony_ciint mpt3sas_base_hard_reset_handler(struct MPT3SAS_ADAPTER *ioc,
170762306a36Sopenharmony_ci	enum reset_type type);
170862306a36Sopenharmony_ci
170962306a36Sopenharmony_civoid *mpt3sas_base_get_msg_frame(struct MPT3SAS_ADAPTER *ioc, u16 smid);
171062306a36Sopenharmony_civoid *mpt3sas_base_get_sense_buffer(struct MPT3SAS_ADAPTER *ioc, u16 smid);
171162306a36Sopenharmony_ci__le32 mpt3sas_base_get_sense_buffer_dma(struct MPT3SAS_ADAPTER *ioc,
171262306a36Sopenharmony_ci	u16 smid);
171362306a36Sopenharmony_civoid *mpt3sas_base_get_pcie_sgl(struct MPT3SAS_ADAPTER *ioc, u16 smid);
171462306a36Sopenharmony_cidma_addr_t mpt3sas_base_get_pcie_sgl_dma(struct MPT3SAS_ADAPTER *ioc, u16 smid);
171562306a36Sopenharmony_civoid mpt3sas_base_sync_reply_irqs(struct MPT3SAS_ADAPTER *ioc, u8 poll);
171662306a36Sopenharmony_civoid mpt3sas_base_mask_interrupts(struct MPT3SAS_ADAPTER *ioc);
171762306a36Sopenharmony_civoid mpt3sas_base_unmask_interrupts(struct MPT3SAS_ADAPTER *ioc);
171862306a36Sopenharmony_ci
171962306a36Sopenharmony_civoid mpt3sas_base_put_smid_fast_path(struct MPT3SAS_ADAPTER *ioc, u16 smid,
172062306a36Sopenharmony_ci	u16 handle);
172162306a36Sopenharmony_civoid mpt3sas_base_put_smid_hi_priority(struct MPT3SAS_ADAPTER *ioc, u16 smid,
172262306a36Sopenharmony_ci	u16 msix_task);
172362306a36Sopenharmony_civoid mpt3sas_base_put_smid_nvme_encap(struct MPT3SAS_ADAPTER *ioc, u16 smid);
172462306a36Sopenharmony_civoid mpt3sas_base_put_smid_default(struct MPT3SAS_ADAPTER *ioc, u16 smid);
172562306a36Sopenharmony_ci/* hi-priority queue */
172662306a36Sopenharmony_ciu16 mpt3sas_base_get_smid_hpr(struct MPT3SAS_ADAPTER *ioc, u8 cb_idx);
172762306a36Sopenharmony_ciu16 mpt3sas_base_get_smid_scsiio(struct MPT3SAS_ADAPTER *ioc, u8 cb_idx,
172862306a36Sopenharmony_ci		struct scsi_cmnd *scmd);
172962306a36Sopenharmony_civoid mpt3sas_base_clear_st(struct MPT3SAS_ADAPTER *ioc,
173062306a36Sopenharmony_ci		struct scsiio_tracker *st);
173162306a36Sopenharmony_ci
173262306a36Sopenharmony_ciu16 mpt3sas_base_get_smid(struct MPT3SAS_ADAPTER *ioc, u8 cb_idx);
173362306a36Sopenharmony_civoid mpt3sas_base_free_smid(struct MPT3SAS_ADAPTER *ioc, u16 smid);
173462306a36Sopenharmony_civoid mpt3sas_base_initialize_callback_handler(void);
173562306a36Sopenharmony_ciu8 mpt3sas_base_register_callback_handler(MPT_CALLBACK cb_func);
173662306a36Sopenharmony_civoid mpt3sas_base_release_callback_handler(u8 cb_idx);
173762306a36Sopenharmony_ci
173862306a36Sopenharmony_ciu8 mpt3sas_base_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
173962306a36Sopenharmony_ci	u32 reply);
174062306a36Sopenharmony_ciu8 mpt3sas_port_enable_done(struct MPT3SAS_ADAPTER *ioc, u16 smid,
174162306a36Sopenharmony_ci	u8 msix_index, u32 reply);
174262306a36Sopenharmony_civoid *mpt3sas_base_get_reply_virt_addr(struct MPT3SAS_ADAPTER *ioc,
174362306a36Sopenharmony_ci	u32 phys_addr);
174462306a36Sopenharmony_ci
174562306a36Sopenharmony_ciu32 mpt3sas_base_get_iocstate(struct MPT3SAS_ADAPTER *ioc, int cooked);
174662306a36Sopenharmony_ci
174762306a36Sopenharmony_civoid mpt3sas_base_fault_info(struct MPT3SAS_ADAPTER *ioc , u16 fault_code);
174862306a36Sopenharmony_ci#define mpt3sas_print_fault_code(ioc, fault_code) \
174962306a36Sopenharmony_cido { pr_err("%s fault info from func: %s\n", ioc->name, __func__); \
175062306a36Sopenharmony_ci	mpt3sas_base_fault_info(ioc, fault_code); } while (0)
175162306a36Sopenharmony_ci
175262306a36Sopenharmony_civoid mpt3sas_base_coredump_info(struct MPT3SAS_ADAPTER *ioc, u16 fault_code);
175362306a36Sopenharmony_ci#define mpt3sas_print_coredump_info(ioc, fault_code) \
175462306a36Sopenharmony_cido { pr_err("%s fault info from func: %s\n", ioc->name, __func__); \
175562306a36Sopenharmony_ci	mpt3sas_base_coredump_info(ioc, fault_code); } while (0)
175662306a36Sopenharmony_ci
175762306a36Sopenharmony_ciint mpt3sas_base_wait_for_coredump_completion(struct MPT3SAS_ADAPTER *ioc,
175862306a36Sopenharmony_ci		const char *caller);
175962306a36Sopenharmony_ciint mpt3sas_base_sas_iounit_control(struct MPT3SAS_ADAPTER *ioc,
176062306a36Sopenharmony_ci	Mpi2SasIoUnitControlReply_t *mpi_reply,
176162306a36Sopenharmony_ci	Mpi2SasIoUnitControlRequest_t *mpi_request);
176262306a36Sopenharmony_ciint mpt3sas_base_scsi_enclosure_processor(struct MPT3SAS_ADAPTER *ioc,
176362306a36Sopenharmony_ci	Mpi2SepReply_t *mpi_reply, Mpi2SepRequest_t *mpi_request);
176462306a36Sopenharmony_ci
176562306a36Sopenharmony_civoid mpt3sas_base_validate_event_type(struct MPT3SAS_ADAPTER *ioc,
176662306a36Sopenharmony_ci	u32 *event_type);
176762306a36Sopenharmony_ci
176862306a36Sopenharmony_civoid mpt3sas_halt_firmware(struct MPT3SAS_ADAPTER *ioc);
176962306a36Sopenharmony_ci
177062306a36Sopenharmony_civoid mpt3sas_base_update_missing_delay(struct MPT3SAS_ADAPTER *ioc,
177162306a36Sopenharmony_ci	u16 device_missing_delay, u8 io_missing_delay);
177262306a36Sopenharmony_ci
177362306a36Sopenharmony_ciint mpt3sas_base_check_for_fault_and_issue_reset(
177462306a36Sopenharmony_ci	struct MPT3SAS_ADAPTER *ioc);
177562306a36Sopenharmony_ci
177662306a36Sopenharmony_ciint mpt3sas_port_enable(struct MPT3SAS_ADAPTER *ioc);
177762306a36Sopenharmony_ci
177862306a36Sopenharmony_civoid
177962306a36Sopenharmony_cimpt3sas_wait_for_commands_to_complete(struct MPT3SAS_ADAPTER *ioc);
178062306a36Sopenharmony_ci
178162306a36Sopenharmony_ciu8 mpt3sas_base_check_cmd_timeout(struct MPT3SAS_ADAPTER *ioc,
178262306a36Sopenharmony_ci	u8 status, void *mpi_request, int sz);
178362306a36Sopenharmony_ci#define mpt3sas_check_cmd_timeout(ioc, status, mpi_request, sz, issue_reset) \
178462306a36Sopenharmony_cido {	ioc_err(ioc, "In func: %s\n", __func__); \
178562306a36Sopenharmony_ci	issue_reset = mpt3sas_base_check_cmd_timeout(ioc, \
178662306a36Sopenharmony_ci	status, mpi_request, sz); } while (0)
178762306a36Sopenharmony_ci
178862306a36Sopenharmony_ciint mpt3sas_wait_for_ioc(struct MPT3SAS_ADAPTER *ioc, int wait_count);
178962306a36Sopenharmony_ciint mpt3sas_base_make_ioc_ready(struct MPT3SAS_ADAPTER *ioc, enum reset_type type);
179062306a36Sopenharmony_civoid mpt3sas_base_free_irq(struct MPT3SAS_ADAPTER *ioc);
179162306a36Sopenharmony_civoid mpt3sas_base_disable_msix(struct MPT3SAS_ADAPTER *ioc);
179262306a36Sopenharmony_ciint mpt3sas_blk_mq_poll(struct Scsi_Host *shost, unsigned int queue_num);
179362306a36Sopenharmony_civoid mpt3sas_base_pause_mq_polling(struct MPT3SAS_ADAPTER *ioc);
179462306a36Sopenharmony_civoid mpt3sas_base_resume_mq_polling(struct MPT3SAS_ADAPTER *ioc);
179562306a36Sopenharmony_ci
179662306a36Sopenharmony_ci/* scsih shared API */
179762306a36Sopenharmony_cistruct scsi_cmnd *mpt3sas_scsih_scsi_lookup_get(struct MPT3SAS_ADAPTER *ioc,
179862306a36Sopenharmony_ci	u16 smid);
179962306a36Sopenharmony_ciu8 mpt3sas_scsih_event_callback(struct MPT3SAS_ADAPTER *ioc, u8 msix_index,
180062306a36Sopenharmony_ci	u32 reply);
180162306a36Sopenharmony_civoid mpt3sas_scsih_pre_reset_handler(struct MPT3SAS_ADAPTER *ioc);
180262306a36Sopenharmony_civoid mpt3sas_scsih_clear_outstanding_scsi_tm_commands(
180362306a36Sopenharmony_ci	struct MPT3SAS_ADAPTER *ioc);
180462306a36Sopenharmony_civoid mpt3sas_scsih_reset_done_handler(struct MPT3SAS_ADAPTER *ioc);
180562306a36Sopenharmony_ci
180662306a36Sopenharmony_ciint mpt3sas_scsih_issue_tm(struct MPT3SAS_ADAPTER *ioc, u16 handle,
180762306a36Sopenharmony_ci	uint channel, uint id, u64 lun, u8 type, u16 smid_task,
180862306a36Sopenharmony_ci	u16 msix_task, u8 timeout, u8 tr_method);
180962306a36Sopenharmony_ciint mpt3sas_scsih_issue_locked_tm(struct MPT3SAS_ADAPTER *ioc, u16 handle,
181062306a36Sopenharmony_ci	uint channel, uint id, u64 lun, u8 type, u16 smid_task,
181162306a36Sopenharmony_ci	u16 msix_task, u8 timeout, u8 tr_method);
181262306a36Sopenharmony_ci
181362306a36Sopenharmony_civoid mpt3sas_scsih_set_tm_flag(struct MPT3SAS_ADAPTER *ioc, u16 handle);
181462306a36Sopenharmony_civoid mpt3sas_scsih_clear_tm_flag(struct MPT3SAS_ADAPTER *ioc, u16 handle);
181562306a36Sopenharmony_civoid mpt3sas_expander_remove(struct MPT3SAS_ADAPTER *ioc, u64 sas_address,
181662306a36Sopenharmony_ci	struct hba_port *port);
181762306a36Sopenharmony_civoid mpt3sas_device_remove_by_sas_address(struct MPT3SAS_ADAPTER *ioc,
181862306a36Sopenharmony_ci	u64 sas_address, struct hba_port *port);
181962306a36Sopenharmony_ciu8 mpt3sas_check_for_pending_internal_cmds(struct MPT3SAS_ADAPTER *ioc,
182062306a36Sopenharmony_ci	u16 smid);
182162306a36Sopenharmony_cistruct hba_port *
182262306a36Sopenharmony_cimpt3sas_get_port_by_id(struct MPT3SAS_ADAPTER *ioc, u8 port,
182362306a36Sopenharmony_ci	u8 bypass_dirty_port_flag);
182462306a36Sopenharmony_ci
182562306a36Sopenharmony_cistruct _sas_node *mpt3sas_scsih_expander_find_by_handle(
182662306a36Sopenharmony_ci	struct MPT3SAS_ADAPTER *ioc, u16 handle);
182762306a36Sopenharmony_cistruct _sas_node *mpt3sas_scsih_expander_find_by_sas_address(
182862306a36Sopenharmony_ci	struct MPT3SAS_ADAPTER *ioc, u64 sas_address,
182962306a36Sopenharmony_ci	struct hba_port *port);
183062306a36Sopenharmony_cistruct _sas_device *mpt3sas_get_sdev_by_addr(
183162306a36Sopenharmony_ci	 struct MPT3SAS_ADAPTER *ioc, u64 sas_address,
183262306a36Sopenharmony_ci	 struct hba_port *port);
183362306a36Sopenharmony_cistruct _sas_device *__mpt3sas_get_sdev_by_addr(
183462306a36Sopenharmony_ci	 struct MPT3SAS_ADAPTER *ioc, u64 sas_address,
183562306a36Sopenharmony_ci	 struct hba_port *port);
183662306a36Sopenharmony_cistruct _sas_device *mpt3sas_get_sdev_by_handle(struct MPT3SAS_ADAPTER *ioc,
183762306a36Sopenharmony_ci	u16 handle);
183862306a36Sopenharmony_cistruct _pcie_device *mpt3sas_get_pdev_by_handle(struct MPT3SAS_ADAPTER *ioc,
183962306a36Sopenharmony_ci	u16 handle);
184062306a36Sopenharmony_ci
184162306a36Sopenharmony_civoid mpt3sas_port_enable_complete(struct MPT3SAS_ADAPTER *ioc);
184262306a36Sopenharmony_cistruct _raid_device *
184362306a36Sopenharmony_cimpt3sas_raid_device_find_by_handle(struct MPT3SAS_ADAPTER *ioc, u16 handle);
184462306a36Sopenharmony_civoid mpt3sas_scsih_change_queue_depth(struct scsi_device *sdev, int qdepth);
184562306a36Sopenharmony_cistruct _sas_device *
184662306a36Sopenharmony_ci__mpt3sas_get_sdev_by_rphy(struct MPT3SAS_ADAPTER *ioc, struct sas_rphy *rphy);
184762306a36Sopenharmony_cistruct virtual_phy *
184862306a36Sopenharmony_cimpt3sas_get_vphy_by_phy(struct MPT3SAS_ADAPTER *ioc,
184962306a36Sopenharmony_ci	struct hba_port *port, u32 phy);
185062306a36Sopenharmony_ci
185162306a36Sopenharmony_ci/* config shared API */
185262306a36Sopenharmony_ciu8 mpt3sas_config_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
185362306a36Sopenharmony_ci	u32 reply);
185462306a36Sopenharmony_ciint mpt3sas_config_get_number_hba_phys(struct MPT3SAS_ADAPTER *ioc,
185562306a36Sopenharmony_ci	u8 *num_phys);
185662306a36Sopenharmony_ciint mpt3sas_config_get_manufacturing_pg0(struct MPT3SAS_ADAPTER *ioc,
185762306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi2ManufacturingPage0_t *config_page);
185862306a36Sopenharmony_ciint mpt3sas_config_get_manufacturing_pg1(struct MPT3SAS_ADAPTER *ioc,
185962306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi2ManufacturingPage1_t *config_page);
186062306a36Sopenharmony_ci
186162306a36Sopenharmony_ciint mpt3sas_config_get_manufacturing_pg7(struct MPT3SAS_ADAPTER *ioc,
186262306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi2ManufacturingPage7_t *config_page,
186362306a36Sopenharmony_ci	u16 sz);
186462306a36Sopenharmony_ciint mpt3sas_config_get_manufacturing_pg10(struct MPT3SAS_ADAPTER *ioc,
186562306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply,
186662306a36Sopenharmony_ci	struct Mpi2ManufacturingPage10_t *config_page);
186762306a36Sopenharmony_ci
186862306a36Sopenharmony_ciint mpt3sas_config_get_manufacturing_pg11(struct MPT3SAS_ADAPTER *ioc,
186962306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply,
187062306a36Sopenharmony_ci	struct Mpi2ManufacturingPage11_t  *config_page);
187162306a36Sopenharmony_ciint mpt3sas_config_set_manufacturing_pg11(struct MPT3SAS_ADAPTER *ioc,
187262306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply,
187362306a36Sopenharmony_ci	struct Mpi2ManufacturingPage11_t *config_page);
187462306a36Sopenharmony_ci
187562306a36Sopenharmony_ciint mpt3sas_config_get_bios_pg2(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigReply_t
187662306a36Sopenharmony_ci	*mpi_reply, Mpi2BiosPage2_t *config_page);
187762306a36Sopenharmony_ciint mpt3sas_config_get_bios_pg3(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigReply_t
187862306a36Sopenharmony_ci	*mpi_reply, Mpi2BiosPage3_t *config_page);
187962306a36Sopenharmony_ciint mpt3sas_config_set_bios_pg4(struct MPT3SAS_ADAPTER *ioc,
188062306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi2BiosPage4_t *config_page,
188162306a36Sopenharmony_ci	int sz_config_page);
188262306a36Sopenharmony_ciint mpt3sas_config_get_bios_pg4(struct MPT3SAS_ADAPTER *ioc,
188362306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi2BiosPage4_t *config_page,
188462306a36Sopenharmony_ci	int sz_config_page);
188562306a36Sopenharmony_ciint mpt3sas_config_get_iounit_pg0(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigReply_t
188662306a36Sopenharmony_ci	*mpi_reply, Mpi2IOUnitPage0_t *config_page);
188762306a36Sopenharmony_ciint mpt3sas_config_get_sas_device_pg0(struct MPT3SAS_ADAPTER *ioc,
188862306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi2SasDevicePage0_t *config_page,
188962306a36Sopenharmony_ci	u32 form, u32 handle);
189062306a36Sopenharmony_ciint mpt3sas_config_get_sas_device_pg1(struct MPT3SAS_ADAPTER *ioc,
189162306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi2SasDevicePage1_t *config_page,
189262306a36Sopenharmony_ci	u32 form, u32 handle);
189362306a36Sopenharmony_ciint mpt3sas_config_get_pcie_device_pg0(struct MPT3SAS_ADAPTER *ioc,
189462306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi26PCIeDevicePage0_t *config_page,
189562306a36Sopenharmony_ci	u32 form, u32 handle);
189662306a36Sopenharmony_ciint mpt3sas_config_get_pcie_device_pg2(struct MPT3SAS_ADAPTER *ioc,
189762306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi26PCIeDevicePage2_t *config_page,
189862306a36Sopenharmony_ci	u32 form, u32 handle);
189962306a36Sopenharmony_ciint mpt3sas_config_get_pcie_iounit_pg1(struct MPT3SAS_ADAPTER *ioc,
190062306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi26PCIeIOUnitPage1_t *config_page,
190162306a36Sopenharmony_ci	u16 sz);
190262306a36Sopenharmony_ciint mpt3sas_config_get_sas_iounit_pg0(struct MPT3SAS_ADAPTER *ioc,
190362306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi2SasIOUnitPage0_t *config_page,
190462306a36Sopenharmony_ci	u16 sz);
190562306a36Sopenharmony_ciint mpt3sas_config_get_iounit_pg1(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigReply_t
190662306a36Sopenharmony_ci	*mpi_reply, Mpi2IOUnitPage1_t *config_page);
190762306a36Sopenharmony_ciint mpt3sas_config_get_iounit_pg3(struct MPT3SAS_ADAPTER *ioc,
190862306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi2IOUnitPage3_t *config_page, u16 sz);
190962306a36Sopenharmony_ciint mpt3sas_config_set_iounit_pg1(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigReply_t
191062306a36Sopenharmony_ci	*mpi_reply, Mpi2IOUnitPage1_t *config_page);
191162306a36Sopenharmony_ciint mpt3sas_config_get_iounit_pg8(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigReply_t
191262306a36Sopenharmony_ci	*mpi_reply, Mpi2IOUnitPage8_t *config_page);
191362306a36Sopenharmony_ciint mpt3sas_config_get_sas_iounit_pg1(struct MPT3SAS_ADAPTER *ioc,
191462306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi2SasIOUnitPage1_t *config_page,
191562306a36Sopenharmony_ci	u16 sz);
191662306a36Sopenharmony_ciint mpt3sas_config_set_sas_iounit_pg1(struct MPT3SAS_ADAPTER *ioc,
191762306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi2SasIOUnitPage1_t *config_page,
191862306a36Sopenharmony_ci	u16 sz);
191962306a36Sopenharmony_ciint mpt3sas_config_get_ioc_pg1(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigReply_t
192062306a36Sopenharmony_ci	*mpi_reply, Mpi2IOCPage1_t *config_page);
192162306a36Sopenharmony_ciint mpt3sas_config_set_ioc_pg1(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigReply_t
192262306a36Sopenharmony_ci	*mpi_reply, Mpi2IOCPage1_t *config_page);
192362306a36Sopenharmony_ciint mpt3sas_config_get_ioc_pg8(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigReply_t
192462306a36Sopenharmony_ci	*mpi_reply, Mpi2IOCPage8_t *config_page);
192562306a36Sopenharmony_ciint mpt3sas_config_get_expander_pg0(struct MPT3SAS_ADAPTER *ioc,
192662306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi2ExpanderPage0_t *config_page,
192762306a36Sopenharmony_ci	u32 form, u32 handle);
192862306a36Sopenharmony_ciint mpt3sas_config_get_expander_pg1(struct MPT3SAS_ADAPTER *ioc,
192962306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi2ExpanderPage1_t *config_page,
193062306a36Sopenharmony_ci	u32 phy_number, u16 handle);
193162306a36Sopenharmony_ciint mpt3sas_config_get_enclosure_pg0(struct MPT3SAS_ADAPTER *ioc,
193262306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi2SasEnclosurePage0_t *config_page,
193362306a36Sopenharmony_ci	u32 form, u32 handle);
193462306a36Sopenharmony_ciint mpt3sas_config_get_phy_pg0(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigReply_t
193562306a36Sopenharmony_ci	*mpi_reply, Mpi2SasPhyPage0_t *config_page, u32 phy_number);
193662306a36Sopenharmony_ciint mpt3sas_config_get_phy_pg1(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigReply_t
193762306a36Sopenharmony_ci	*mpi_reply, Mpi2SasPhyPage1_t *config_page, u32 phy_number);
193862306a36Sopenharmony_ciint mpt3sas_config_get_raid_volume_pg1(struct MPT3SAS_ADAPTER *ioc,
193962306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi2RaidVolPage1_t *config_page, u32 form,
194062306a36Sopenharmony_ci	u32 handle);
194162306a36Sopenharmony_ciint mpt3sas_config_get_number_pds(struct MPT3SAS_ADAPTER *ioc, u16 handle,
194262306a36Sopenharmony_ci	u8 *num_pds);
194362306a36Sopenharmony_ciint mpt3sas_config_get_raid_volume_pg0(struct MPT3SAS_ADAPTER *ioc,
194462306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi2RaidVolPage0_t *config_page, u32 form,
194562306a36Sopenharmony_ci	u32 handle, u16 sz);
194662306a36Sopenharmony_ciint mpt3sas_config_get_phys_disk_pg0(struct MPT3SAS_ADAPTER *ioc,
194762306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi2RaidPhysDiskPage0_t *config_page,
194862306a36Sopenharmony_ci	u32 form, u32 form_specific);
194962306a36Sopenharmony_ciint mpt3sas_config_get_volume_handle(struct MPT3SAS_ADAPTER *ioc, u16 pd_handle,
195062306a36Sopenharmony_ci	u16 *volume_handle);
195162306a36Sopenharmony_ciint mpt3sas_config_get_volume_wwid(struct MPT3SAS_ADAPTER *ioc,
195262306a36Sopenharmony_ci	u16 volume_handle, u64 *wwid);
195362306a36Sopenharmony_ciint
195462306a36Sopenharmony_cimpt3sas_config_get_driver_trigger_pg0(struct MPT3SAS_ADAPTER *ioc,
195562306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi26DriverTriggerPage0_t *config_page);
195662306a36Sopenharmony_ciint
195762306a36Sopenharmony_cimpt3sas_config_get_driver_trigger_pg1(struct MPT3SAS_ADAPTER *ioc,
195862306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi26DriverTriggerPage1_t *config_page);
195962306a36Sopenharmony_ciint
196062306a36Sopenharmony_cimpt3sas_config_get_driver_trigger_pg2(struct MPT3SAS_ADAPTER *ioc,
196162306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi26DriverTriggerPage2_t *config_page);
196262306a36Sopenharmony_ciint
196362306a36Sopenharmony_cimpt3sas_config_get_driver_trigger_pg3(struct MPT3SAS_ADAPTER *ioc,
196462306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi26DriverTriggerPage3_t *config_page);
196562306a36Sopenharmony_ciint
196662306a36Sopenharmony_cimpt3sas_config_get_driver_trigger_pg4(struct MPT3SAS_ADAPTER *ioc,
196762306a36Sopenharmony_ci	Mpi2ConfigReply_t *mpi_reply, Mpi26DriverTriggerPage4_t *config_page);
196862306a36Sopenharmony_ciint
196962306a36Sopenharmony_cimpt3sas_config_update_driver_trigger_pg1(struct MPT3SAS_ADAPTER *ioc,
197062306a36Sopenharmony_ci	struct SL_WH_MASTER_TRIGGER_T *master_tg, bool set);
197162306a36Sopenharmony_ciint
197262306a36Sopenharmony_cimpt3sas_config_update_driver_trigger_pg2(struct MPT3SAS_ADAPTER *ioc,
197362306a36Sopenharmony_ci	struct SL_WH_EVENT_TRIGGERS_T *event_tg, bool set);
197462306a36Sopenharmony_ciint
197562306a36Sopenharmony_cimpt3sas_config_update_driver_trigger_pg3(struct MPT3SAS_ADAPTER *ioc,
197662306a36Sopenharmony_ci	struct SL_WH_SCSI_TRIGGERS_T *scsi_tg, bool set);
197762306a36Sopenharmony_ciint
197862306a36Sopenharmony_cimpt3sas_config_update_driver_trigger_pg4(struct MPT3SAS_ADAPTER *ioc,
197962306a36Sopenharmony_ci	struct SL_WH_MPI_TRIGGERS_T *mpi_tg, bool set);
198062306a36Sopenharmony_ci
198162306a36Sopenharmony_ci/* ctl shared API */
198262306a36Sopenharmony_ciextern const struct attribute_group *mpt3sas_host_groups[];
198362306a36Sopenharmony_ciextern const struct attribute_group *mpt3sas_dev_groups[];
198462306a36Sopenharmony_civoid mpt3sas_ctl_init(ushort hbas_to_enumerate);
198562306a36Sopenharmony_civoid mpt3sas_ctl_exit(ushort hbas_to_enumerate);
198662306a36Sopenharmony_ciu8 mpt3sas_ctl_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
198762306a36Sopenharmony_ci	u32 reply);
198862306a36Sopenharmony_civoid mpt3sas_ctl_pre_reset_handler(struct MPT3SAS_ADAPTER *ioc);
198962306a36Sopenharmony_civoid mpt3sas_ctl_clear_outstanding_ioctls(struct MPT3SAS_ADAPTER *ioc);
199062306a36Sopenharmony_civoid mpt3sas_ctl_reset_done_handler(struct MPT3SAS_ADAPTER *ioc);
199162306a36Sopenharmony_ciu8 mpt3sas_ctl_event_callback(struct MPT3SAS_ADAPTER *ioc,
199262306a36Sopenharmony_ci	u8 msix_index, u32 reply);
199362306a36Sopenharmony_civoid mpt3sas_ctl_add_to_event_log(struct MPT3SAS_ADAPTER *ioc,
199462306a36Sopenharmony_ci	Mpi2EventNotificationReply_t *mpi_reply);
199562306a36Sopenharmony_ci
199662306a36Sopenharmony_civoid mpt3sas_enable_diag_buffer(struct MPT3SAS_ADAPTER *ioc,
199762306a36Sopenharmony_ci	u8 bits_to_register);
199862306a36Sopenharmony_ciint mpt3sas_send_diag_release(struct MPT3SAS_ADAPTER *ioc, u8 buffer_type,
199962306a36Sopenharmony_ci	u8 *issue_reset);
200062306a36Sopenharmony_ci
200162306a36Sopenharmony_ci/* transport shared API */
200262306a36Sopenharmony_ciextern struct scsi_transport_template *mpt3sas_transport_template;
200362306a36Sopenharmony_ciu8 mpt3sas_transport_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
200462306a36Sopenharmony_ci	u32 reply);
200562306a36Sopenharmony_cistruct _sas_port *mpt3sas_transport_port_add(struct MPT3SAS_ADAPTER *ioc,
200662306a36Sopenharmony_ci	u16 handle, u64 sas_address, struct hba_port *port);
200762306a36Sopenharmony_civoid mpt3sas_transport_port_remove(struct MPT3SAS_ADAPTER *ioc, u64 sas_address,
200862306a36Sopenharmony_ci	u64 sas_address_parent, struct hba_port *port);
200962306a36Sopenharmony_ciint mpt3sas_transport_add_host_phy(struct MPT3SAS_ADAPTER *ioc, struct _sas_phy
201062306a36Sopenharmony_ci	*mpt3sas_phy, Mpi2SasPhyPage0_t phy_pg0, struct device *parent_dev);
201162306a36Sopenharmony_ciint mpt3sas_transport_add_expander_phy(struct MPT3SAS_ADAPTER *ioc,
201262306a36Sopenharmony_ci	struct _sas_phy *mpt3sas_phy, Mpi2ExpanderPage1_t expander_pg1,
201362306a36Sopenharmony_ci	struct device *parent_dev);
201462306a36Sopenharmony_civoid mpt3sas_transport_update_links(struct MPT3SAS_ADAPTER *ioc,
201562306a36Sopenharmony_ci	u64 sas_address, u16 handle, u8 phy_number, u8 link_rate,
201662306a36Sopenharmony_ci	struct hba_port *port);
201762306a36Sopenharmony_ciextern struct sas_function_template mpt3sas_transport_functions;
201862306a36Sopenharmony_ciextern struct scsi_transport_template *mpt3sas_transport_template;
201962306a36Sopenharmony_civoid
202062306a36Sopenharmony_cimpt3sas_transport_del_phy_from_an_existing_port(struct MPT3SAS_ADAPTER *ioc,
202162306a36Sopenharmony_ci	struct _sas_node *sas_node, struct _sas_phy *mpt3sas_phy);
202262306a36Sopenharmony_civoid
202362306a36Sopenharmony_cimpt3sas_transport_add_phy_to_an_existing_port(struct MPT3SAS_ADAPTER *ioc,
202462306a36Sopenharmony_ci	struct _sas_node *sas_node, struct _sas_phy *mpt3sas_phy,
202562306a36Sopenharmony_ci	u64 sas_address, struct hba_port *port);
202662306a36Sopenharmony_ci/* trigger data externs */
202762306a36Sopenharmony_civoid mpt3sas_send_trigger_data_event(struct MPT3SAS_ADAPTER *ioc,
202862306a36Sopenharmony_ci	struct SL_WH_TRIGGERS_EVENT_DATA_T *event_data);
202962306a36Sopenharmony_civoid mpt3sas_process_trigger_data(struct MPT3SAS_ADAPTER *ioc,
203062306a36Sopenharmony_ci	struct SL_WH_TRIGGERS_EVENT_DATA_T *event_data);
203162306a36Sopenharmony_civoid mpt3sas_trigger_master(struct MPT3SAS_ADAPTER *ioc,
203262306a36Sopenharmony_ci	u32 trigger_bitmask);
203362306a36Sopenharmony_civoid mpt3sas_trigger_event(struct MPT3SAS_ADAPTER *ioc, u16 event,
203462306a36Sopenharmony_ci	u16 log_entry_qualifier);
203562306a36Sopenharmony_civoid mpt3sas_trigger_scsi(struct MPT3SAS_ADAPTER *ioc, u8 sense_key,
203662306a36Sopenharmony_ci	u8 asc, u8 ascq);
203762306a36Sopenharmony_civoid mpt3sas_trigger_mpi(struct MPT3SAS_ADAPTER *ioc, u16 ioc_status,
203862306a36Sopenharmony_ci	u32 loginfo);
203962306a36Sopenharmony_ci
204062306a36Sopenharmony_ci/* warpdrive APIs */
204162306a36Sopenharmony_ciu8 mpt3sas_get_num_volumes(struct MPT3SAS_ADAPTER *ioc);
204262306a36Sopenharmony_civoid mpt3sas_init_warpdrive_properties(struct MPT3SAS_ADAPTER *ioc,
204362306a36Sopenharmony_ci	struct _raid_device *raid_device);
204462306a36Sopenharmony_civoid
204562306a36Sopenharmony_cimpt3sas_setup_direct_io(struct MPT3SAS_ADAPTER *ioc, struct scsi_cmnd *scmd,
204662306a36Sopenharmony_ci	struct _raid_device *raid_device, Mpi25SCSIIORequest_t *mpi_request);
204762306a36Sopenharmony_ci
204862306a36Sopenharmony_ci/* NCQ Prio Handling Check */
204962306a36Sopenharmony_cibool scsih_ncq_prio_supp(struct scsi_device *sdev);
205062306a36Sopenharmony_ci
205162306a36Sopenharmony_civoid mpt3sas_setup_debugfs(struct MPT3SAS_ADAPTER *ioc);
205262306a36Sopenharmony_civoid mpt3sas_destroy_debugfs(struct MPT3SAS_ADAPTER *ioc);
205362306a36Sopenharmony_civoid mpt3sas_init_debugfs(void);
205462306a36Sopenharmony_civoid mpt3sas_exit_debugfs(void);
205562306a36Sopenharmony_ci
205662306a36Sopenharmony_ci/**
205762306a36Sopenharmony_ci * _scsih_is_pcie_scsi_device - determines if device is an pcie scsi device
205862306a36Sopenharmony_ci * @device_info: bitfield providing information about the device.
205962306a36Sopenharmony_ci * Context: none
206062306a36Sopenharmony_ci *
206162306a36Sopenharmony_ci * Returns 1 if scsi device.
206262306a36Sopenharmony_ci */
206362306a36Sopenharmony_cistatic inline int
206462306a36Sopenharmony_cimpt3sas_scsih_is_pcie_scsi_device(u32 device_info)
206562306a36Sopenharmony_ci{
206662306a36Sopenharmony_ci	if ((device_info &
206762306a36Sopenharmony_ci	    MPI26_PCIE_DEVINFO_MASK_DEVICE_TYPE) == MPI26_PCIE_DEVINFO_SCSI)
206862306a36Sopenharmony_ci		return 1;
206962306a36Sopenharmony_ci	else
207062306a36Sopenharmony_ci		return 0;
207162306a36Sopenharmony_ci}
207262306a36Sopenharmony_ci#endif /* MPT3SAS_BASE_H_INCLUDED */
2073