xref: /freebsd-src/sys/dev/mpi3mr/mpi3mr.h (revision 3f3a15543a6721100dda0e4219eb48ecbe35731a)
12d1d418eSSumit Saxena /*
22d1d418eSSumit Saxena  * SPDX-License-Identifier: BSD-2-Clause
32d1d418eSSumit Saxena  *
4945c3ce4SChandrakanth patil  * Copyright (c) 2020-2024, Broadcom Inc. All rights reserved.
52d1d418eSSumit Saxena  * Support: <fbsd-storage-driver.pdl@broadcom.com>
62d1d418eSSumit Saxena  *
72d1d418eSSumit Saxena  * Authors: Sumit Saxena <sumit.saxena@broadcom.com>
82d1d418eSSumit Saxena  *	    Chandrakanth Patil <chandrakanth.patil@broadcom.com>
92d1d418eSSumit Saxena  *
102d1d418eSSumit Saxena  * Redistribution and use in source and binary forms, with or without
112d1d418eSSumit Saxena  * modification, are permitted provided that the following conditions are
122d1d418eSSumit Saxena  * met:
132d1d418eSSumit Saxena  *
142d1d418eSSumit Saxena  * 1. Redistributions of source code must retain the above copyright notice,
152d1d418eSSumit Saxena  *    this list of conditions and the following disclaimer.
162d1d418eSSumit Saxena  * 2. Redistributions in binary form must reproduce the above copyright notice,
172d1d418eSSumit Saxena  *    this list of conditions and the following disclaimer in the documentation and/or other
182d1d418eSSumit Saxena  *    materials provided with the distribution.
192d1d418eSSumit Saxena  * 3. Neither the name of the Broadcom Inc. nor the names of its contributors
202d1d418eSSumit Saxena  *    may be used to endorse or promote products derived from this software without
212d1d418eSSumit Saxena  *    specific prior written permission.
222d1d418eSSumit Saxena  *
232d1d418eSSumit Saxena  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
242d1d418eSSumit Saxena  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
252d1d418eSSumit Saxena  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
262d1d418eSSumit Saxena  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
272d1d418eSSumit Saxena  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
282d1d418eSSumit Saxena  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
292d1d418eSSumit Saxena  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
302d1d418eSSumit Saxena  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
312d1d418eSSumit Saxena  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
322d1d418eSSumit Saxena  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
332d1d418eSSumit Saxena  * POSSIBILITY OF SUCH DAMAGE.
342d1d418eSSumit Saxena  *
352d1d418eSSumit Saxena  * The views and conclusions contained in the software and documentation are
362d1d418eSSumit Saxena  * those of the authors and should not be interpreted as representing
372d1d418eSSumit Saxena  * official policies,either expressed or implied, of the FreeBSD Project.
382d1d418eSSumit Saxena  *
392d1d418eSSumit Saxena  * Mail to: Broadcom Inc 1320 Ridder Park Dr, San Jose, CA 95131
402d1d418eSSumit Saxena  *
412d1d418eSSumit Saxena  * Broadcom Inc. (Broadcom) MPI3MR Adapter FreeBSD
422d1d418eSSumit Saxena  */
432d1d418eSSumit Saxena 
442d1d418eSSumit Saxena #ifndef _MPI3MRVAR_H
452d1d418eSSumit Saxena #define _MPI3MRVAR_H
462d1d418eSSumit Saxena 
472d1d418eSSumit Saxena #include <sys/types.h>
482d1d418eSSumit Saxena #include <sys/param.h>
492d1d418eSSumit Saxena #include <sys/systm.h>
502d1d418eSSumit Saxena #include <sys/kernel.h>
512d1d418eSSumit Saxena #include <sys/module.h>
522d1d418eSSumit Saxena #include <sys/bus.h>
532d1d418eSSumit Saxena #include <sys/conf.h>
542d1d418eSSumit Saxena #include <sys/malloc.h>
552d1d418eSSumit Saxena #include <sys/sysctl.h>
562d1d418eSSumit Saxena #include <sys/uio.h>
572d1d418eSSumit Saxena #include <sys/selinfo.h>
582d1d418eSSumit Saxena #include <sys/poll.h>
592d1d418eSSumit Saxena 
602d1d418eSSumit Saxena #include <sys/lock.h>
612d1d418eSSumit Saxena #include <sys/mutex.h>
622d1d418eSSumit Saxena #include <sys/endian.h>
632d1d418eSSumit Saxena #include <sys/sysent.h>
642d1d418eSSumit Saxena #include <sys/taskqueue.h>
652d1d418eSSumit Saxena #include <sys/smp.h>
662d1d418eSSumit Saxena 
672d1d418eSSumit Saxena #include <machine/bus.h>
682d1d418eSSumit Saxena #include <machine/resource.h>
692d1d418eSSumit Saxena #include <sys/rman.h>
702d1d418eSSumit Saxena 
712d1d418eSSumit Saxena #include <dev/pci/pcireg.h>
722d1d418eSSumit Saxena #include <dev/pci/pcivar.h>
732d1d418eSSumit Saxena #include <dev/pci/pci_private.h>
742d1d418eSSumit Saxena 
752d1d418eSSumit Saxena #include <cam/cam.h>
762d1d418eSSumit Saxena #include <cam/cam_ccb.h>
772d1d418eSSumit Saxena #include <cam/cam_debug.h>
782d1d418eSSumit Saxena #include <cam/cam_sim.h>
792d1d418eSSumit Saxena #include <cam/cam_xpt_sim.h>
802d1d418eSSumit Saxena #include <cam/cam_xpt_periph.h>
812d1d418eSSumit Saxena #include <cam/cam_periph.h>
822d1d418eSSumit Saxena #include <cam/scsi/scsi_all.h>
832d1d418eSSumit Saxena #include <cam/scsi/scsi_message.h>
842d1d418eSSumit Saxena 
852d1d418eSSumit Saxena #include <cam/scsi/smp_all.h>
862d1d418eSSumit Saxena #include <sys/queue.h>
872d1d418eSSumit Saxena #include <sys/kthread.h>
882d1d418eSSumit Saxena #include "mpi/mpi30_api.h"
892d1d418eSSumit Saxena 
90df595fc4SChandrakanth patil #define MPI3MR_DRIVER_VERSION	"8.10.0.1.0"
91df595fc4SChandrakanth patil #define MPI3MR_DRIVER_RELDATE	"19th Mar 2024"
922d1d418eSSumit Saxena 
932d1d418eSSumit Saxena #define MPI3MR_DRIVER_NAME	"mpi3mr"
942d1d418eSSumit Saxena 
952d1d418eSSumit Saxena #define MPI3MR_NAME_LENGTH	32
962d1d418eSSumit Saxena #define IOCNAME			"%s: "
972d1d418eSSumit Saxena 
982d1d418eSSumit Saxena #define SAS4116_CHIP_REV_A0	0
992d1d418eSSumit Saxena #define SAS4116_CHIP_REV_B0	1
1002d1d418eSSumit Saxena 
1012d1d418eSSumit Saxena #define MPI3MR_SG_DEPTH		(MPI3MR_4K_PGSZ/sizeof(Mpi3SGESimple_t))
1022d1d418eSSumit Saxena #define MPI3MR_MAX_SECTORS	2048
1032d1d418eSSumit Saxena #define MPI3MR_MAX_CMDS_LUN	7
1042d1d418eSSumit Saxena #define MPI3MR_MAX_CDB_LENGTH	16
1052d1d418eSSumit Saxena #define MPI3MR_MAX_LUN 		16895
1062d1d418eSSumit Saxena 
1072d1d418eSSumit Saxena #define MPI3MR_SATA_QDEPTH	32
1082d1d418eSSumit Saxena #define MPI3MR_SAS_QDEPTH	64
1092d1d418eSSumit Saxena #define MPI3MR_RAID_QDEPTH	128
1102d1d418eSSumit Saxena #define MPI3MR_NVME_QDEPTH	128
1112d1d418eSSumit Saxena 
1122d1d418eSSumit Saxena #define MPI3MR_4K_PGSZ 		4096
1132d1d418eSSumit Saxena #define MPI3MR_AREQQ_SIZE	(2 * MPI3MR_4K_PGSZ)
1142d1d418eSSumit Saxena #define MPI3MR_AREPQ_SIZE	(4 * MPI3MR_4K_PGSZ)
1152d1d418eSSumit Saxena #define MPI3MR_AREQ_FRAME_SZ	128
1162d1d418eSSumit Saxena #define MPI3MR_AREP_FRAME_SZ	16
1172d1d418eSSumit Saxena 
1182d1d418eSSumit Saxena #define MPI3MR_OPREQQ_SIZE	(8 * MPI3MR_4K_PGSZ)
1192d1d418eSSumit Saxena #define MPI3MR_OPREPQ_SIZE	(4 * MPI3MR_4K_PGSZ)
1202d1d418eSSumit Saxena 
1212d1d418eSSumit Saxena /* Operational queue management definitions */
1222d1d418eSSumit Saxena #define MPI3MR_OP_REQ_Q_QD		512
1232d1d418eSSumit Saxena #define MPI3MR_OP_REP_Q_QD		1024
1242d1d418eSSumit Saxena #define MPI3MR_OP_REP_Q_QD_A0		4096
1252d1d418eSSumit Saxena 
126eb7a4b35SChandrakanth patil #define MPI3MR_THRESHOLD_REPLY_COUNT	100
127eb7a4b35SChandrakanth patil 
1282d1d418eSSumit Saxena #define MPI3MR_CHAINSGE_SIZE	MPI3MR_4K_PGSZ
1292d1d418eSSumit Saxena 
1302d1d418eSSumit Saxena #define MPI3MR_SGEFLAGS_SYSTEM_SIMPLE_END_OF_LIST	\
1312d1d418eSSumit Saxena 	(MPI3_SGE_FLAGS_ELEMENT_TYPE_SIMPLE | MPI3_SGE_FLAGS_DLAS_SYSTEM | \
1322d1d418eSSumit Saxena 	 MPI3_SGE_FLAGS_END_OF_LIST)
1332d1d418eSSumit Saxena 
1342d1d418eSSumit Saxena #define MPI3MR_HOSTTAG_INVALID          0xFFFF
1352d1d418eSSumit Saxena #define MPI3MR_HOSTTAG_INITCMDS         1
1362d1d418eSSumit Saxena #define MPI3MR_HOSTTAG_IOCTLCMDS        2
1372d1d418eSSumit Saxena #define MPI3MR_HOSTTAG_PELABORT         3
1382d1d418eSSumit Saxena #define MPI3MR_HOSTTAG_PELWAIT          4
1392d1d418eSSumit Saxena #define MPI3MR_HOSTTAG_TMS		5
1402d1d418eSSumit Saxena 
1412d1d418eSSumit Saxena #define MAX_MGMT_ADAPTERS 8
1422d1d418eSSumit Saxena #define MPI3MR_WAIT_BEFORE_CTRL_RESET 5
1432d1d418eSSumit Saxena 
1443012fa8fSChandrakanth patil #define MPI3MR_RESET_REASON_OSTYPE_FREEBSD        0x4
1453012fa8fSChandrakanth patil #define MPI3MR_RESET_REASON_OSTYPE_SHIFT	  28
1463012fa8fSChandrakanth patil #define MPI3MR_RESET_REASON_IOCNUM_SHIFT          20
1472d1d418eSSumit Saxena 
1482d1d418eSSumit Saxena struct mpi3mr_mgmt_info {
1492d1d418eSSumit Saxena 	uint16_t count;
1502d1d418eSSumit Saxena 	struct mpi3mr_softc *sc_ptr[MAX_MGMT_ADAPTERS];
1512d1d418eSSumit Saxena 	int max_index;
1522d1d418eSSumit Saxena };
1532d1d418eSSumit Saxena 
1542d1d418eSSumit Saxena extern char fmt_os_ver[16];
1552d1d418eSSumit Saxena 
1562d1d418eSSumit Saxena #define MPI3MR_OS_VERSION(raw_os_ver, fmt_os_ver)	sprintf(raw_os_ver, "%d", __FreeBSD_version); \
1572d1d418eSSumit Saxena 							sprintf(fmt_os_ver, "%c%c.%c%c.%c%c%c",\
1582d1d418eSSumit Saxena 								raw_os_ver[0], raw_os_ver[1], raw_os_ver[2],\
1592d1d418eSSumit Saxena 								raw_os_ver[3], raw_os_ver[4], raw_os_ver[5],\
1602d1d418eSSumit Saxena 								raw_os_ver[6]);
1612d1d418eSSumit Saxena #define MPI3MR_NUM_DEVRMCMD             1
1622d1d418eSSumit Saxena #define MPI3MR_HOSTTAG_DEVRMCMD_MIN     (MPI3MR_HOSTTAG_TMS + 1)
1632d1d418eSSumit Saxena #define MPI3MR_HOSTTAG_DEVRMCMD_MAX     (MPI3MR_HOSTTAG_DEVRMCMD_MIN + \
1642d1d418eSSumit Saxena                                                 MPI3MR_NUM_DEVRMCMD - 1)
1652d1d418eSSumit Saxena #define MPI3MR_INTERNALCMDS_RESVD       MPI3MR_HOSTTAG_DEVRMCMD_MAX
1662d1d418eSSumit Saxena 
1672d1d418eSSumit Saxena #define MPI3MR_NUM_EVTACKCMD		4
1682d1d418eSSumit Saxena #define MPI3MR_HOSTTAG_EVTACKCMD_MIN	(MPI3MR_HOSTTAG_DEVRMCMD_MAX + 1)
1692d1d418eSSumit Saxena #define MPI3MR_HOSTTAG_EVTACKCMD_MAX	(MPI3MR_HOSTTAG_EVTACKCMD_MIN + \
1702d1d418eSSumit Saxena 						MPI3MR_NUM_EVTACKCMD - 1)
1712d1d418eSSumit Saxena 
1722d1d418eSSumit Saxena /* command/controller interaction timeout definitions in seconds */
1732d1d418eSSumit Saxena #define MPI3MR_INTADMCMD_TIMEOUT		60
1742d1d418eSSumit Saxena #define MPI3MR_PORTENABLE_TIMEOUT		300
1752d1d418eSSumit Saxena #define MPI3MR_ABORTTM_TIMEOUT			60
1762d1d418eSSumit Saxena #define MPI3MR_RESETTM_TIMEOUT			60
1772d1d418eSSumit Saxena #define MPI3MR_TSUPDATE_INTERVAL		900
1782d1d418eSSumit Saxena #define MPI3MR_DEFAULT_SHUTDOWN_TIME		120
1792d1d418eSSumit Saxena #define	MPI3MR_RAID_ERRREC_RESET_TIMEOUT	180
1802d1d418eSSumit Saxena #define	MPI3MR_RESET_HOST_IOWAIT_TIMEOUT	5
1812d1d418eSSumit Saxena #define	MPI3MR_PREPARE_FOR_RESET_TIMEOUT	180
1822d1d418eSSumit Saxena #define MPI3MR_RESET_ACK_TIMEOUT		30
1832d1d418eSSumit Saxena #define MPI3MR_MUR_TIMEOUT			120
1842d1d418eSSumit Saxena 
1852d1d418eSSumit Saxena #define MPI3MR_CMD_NOTUSED	0x8000
1862d1d418eSSumit Saxena #define MPI3MR_CMD_COMPLETE	0x0001
1872d1d418eSSumit Saxena #define MPI3MR_CMD_PENDING	0x0002
1882d1d418eSSumit Saxena #define MPI3MR_CMD_REPLYVALID	0x0004
1892d1d418eSSumit Saxena #define MPI3MR_CMD_RESET	0x0008
1902d1d418eSSumit Saxena 
1912d1d418eSSumit Saxena #define MPI3MR_NUM_EVTREPLIES	64
1922d1d418eSSumit Saxena #define MPI3MR_SENSEBUF_SZ	256
1932d1d418eSSumit Saxena #define MPI3MR_SENSEBUF_FACTOR	3
1942d1d418eSSumit Saxena #define MPI3MR_CHAINBUF_FACTOR	3
1952d1d418eSSumit Saxena 
1962d1d418eSSumit Saxena #define MPT3SAS_HOSTPGSZ_4KEXP 12
1972d1d418eSSumit Saxena 
1982d1d418eSSumit Saxena #define MPI3MR_INVALID_DEV_HANDLE 0xFFFF
1992d1d418eSSumit Saxena 
2002d1d418eSSumit Saxena /* Controller Reset related definitions */
2012d1d418eSSumit Saxena #define MPI3MR_HOSTDIAG_UNLOCK_RETRY_COUNT	5
2022d1d418eSSumit Saxena #define MPI3MR_MAX_SHUTDOWN_RETRY_COUNT		2
2032d1d418eSSumit Saxena 
2042d1d418eSSumit Saxena /* ResponseCode values */
2052d1d418eSSumit Saxena #define MPI3MR_RI_MASK_RESPCODE		(0x000000FF)
2062d1d418eSSumit Saxena #define MPI3MR_RSP_TM_COMPLETE		0x00
2072d1d418eSSumit Saxena #define MPI3MR_RSP_INVALID_FRAME	0x02
2082d1d418eSSumit Saxena #define MPI3MR_RSP_TM_NOT_SUPPORTED	0x04
2092d1d418eSSumit Saxena #define MPI3MR_RSP_TM_FAILED		0x05
2102d1d418eSSumit Saxena #define MPI3MR_RSP_TM_SUCCEEDED		0x08
2112d1d418eSSumit Saxena #define MPI3MR_RSP_TM_INVALID_LUN	0x09
2122d1d418eSSumit Saxena #define MPI3MR_RSP_TM_OVERLAPPED_TAG	0x0A
2132d1d418eSSumit Saxena #define MPI3MR_RSP_IO_QUEUED_ON_IOC \
2142d1d418eSSumit Saxena 			MPI3_SCSITASKMGMT_RSPCODE_IO_QUEUED_ON_IOC
2152d1d418eSSumit Saxena 
2162d1d418eSSumit Saxena /* Definitions for the controller security status*/
2172d1d418eSSumit Saxena #define MPI3MR_CTLR_SECURITY_STATUS_MASK        0x0C
2182d1d418eSSumit Saxena #define MPI3MR_CTLR_SECURE_DBG_STATUS_MASK      0x02
2192d1d418eSSumit Saxena 
2202d1d418eSSumit Saxena #define MPI3MR_INVALID_DEVICE                   0x00
2212d1d418eSSumit Saxena #define MPI3MR_CONFIG_SECURE_DEVICE             0x04
2222d1d418eSSumit Saxena #define MPI3MR_HARD_SECURE_DEVICE               0x08
2232d1d418eSSumit Saxena #define MPI3MR_TAMPERED_DEVICE			0x0C
2242d1d418eSSumit Saxena 
2252d1d418eSSumit Saxena #define MPI3MR_DEFAULT_MDTS	(128 * 1024)
2262d1d418eSSumit Saxena #define MPI3MR_DEFAULT_PGSZEXP	(12)
2272d1d418eSSumit Saxena #define MPI3MR_MAX_IOCTL_TRANSFER_SIZE (1024 * 1024)
2282d1d418eSSumit Saxena 
2292d1d418eSSumit Saxena #define MPI3MR_DEVRMHS_RETRYCOUNT 3
2302d1d418eSSumit Saxena #define MPI3MR_PELCMDS_RETRYCOUNT 3
2312d1d418eSSumit Saxena 
2322d1d418eSSumit Saxena #define MPI3MR_PERIODIC_DELAY	1	/* 1 second heartbeat/watchdog check */
2332d1d418eSSumit Saxena 
234*3f3a1554SChandrakanth patil #define	WRITE_SAME_32	0x0d
235*3f3a1554SChandrakanth patil 
2362d1d418eSSumit Saxena struct completion {
2372d1d418eSSumit Saxena 	unsigned int done;
2382d1d418eSSumit Saxena 	struct mtx lock;
2392d1d418eSSumit Saxena };
2402d1d418eSSumit Saxena 
2412d1d418eSSumit Saxena typedef union {
2422d1d418eSSumit Saxena 	volatile unsigned int val;
2432d1d418eSSumit Saxena 	unsigned int val_rdonly;
2442d1d418eSSumit Saxena } mpi3mr_atomic_t;
2452d1d418eSSumit Saxena 
2462d1d418eSSumit Saxena #define	mpi3mr_atomic_read(v)	atomic_load_acq_int(&(v)->val)
2472d1d418eSSumit Saxena #define	mpi3mr_atomic_set(v,i)	atomic_store_rel_int(&(v)->val, i)
2482d1d418eSSumit Saxena #define	mpi3mr_atomic_dec(v)	atomic_subtract_int(&(v)->val, 1)
2492d1d418eSSumit Saxena #define	mpi3mr_atomic_inc(v)	atomic_add_int(&(v)->val, 1)
2502d1d418eSSumit Saxena #define	mpi3mr_atomic_add(v, u)	atomic_add_int(&(v)->val, u)
2512d1d418eSSumit Saxena #define	mpi3mr_atomic_sub(v, u)	atomic_subtract_int(&(v)->val, u)
2522d1d418eSSumit Saxena 
2532d1d418eSSumit Saxena /* IOCTL data transfer sge*/
2542d1d418eSSumit Saxena #define MPI3MR_NUM_IOCTL_SGE		256
2552d1d418eSSumit Saxena #define MPI3MR_IOCTL_SGE_SIZE		(8 * 1024)
2562d1d418eSSumit Saxena 
2572d1d418eSSumit Saxena struct dma_memory_desc {
2582d1d418eSSumit Saxena 	U32 size;
2592d1d418eSSumit Saxena 	void *addr;
2602d1d418eSSumit Saxena 	bus_dma_tag_t tag;
2612d1d418eSSumit Saxena 	bus_dmamap_t dmamap;
2622d1d418eSSumit Saxena 	bus_addr_t dma_addr;
2632d1d418eSSumit Saxena };
2642d1d418eSSumit Saxena 
2652d1d418eSSumit Saxena enum mpi3mr_iocstate {
2662d1d418eSSumit Saxena         MRIOC_STATE_READY = 1,
2672d1d418eSSumit Saxena         MRIOC_STATE_RESET,
2682d1d418eSSumit Saxena         MRIOC_STATE_FAULT,
2692d1d418eSSumit Saxena         MRIOC_STATE_BECOMING_READY,
2702d1d418eSSumit Saxena         MRIOC_STATE_RESET_REQUESTED,
2712d1d418eSSumit Saxena         MRIOC_STATE_UNRECOVERABLE,
2722d1d418eSSumit Saxena         MRIOC_STATE_COUNT,
2732d1d418eSSumit Saxena };
2742d1d418eSSumit Saxena 
2752d1d418eSSumit Saxena /* Init type definitions */
2762d1d418eSSumit Saxena enum mpi3mr_init_type {
2772d1d418eSSumit Saxena 	MPI3MR_INIT_TYPE_INIT = 0,
2782d1d418eSSumit Saxena 	MPI3MR_INIT_TYPE_RESET,
2792d1d418eSSumit Saxena 	MPI3MR_INIT_TYPE_RESUME,
2802d1d418eSSumit Saxena };
2812d1d418eSSumit Saxena 
2822d1d418eSSumit Saxena /* Reset reason code definitions*/
2832d1d418eSSumit Saxena enum mpi3mr_reset_reason {
2842d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_BRINGUP = 1,
2852d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_FAULT_WATCH = 2,
2862d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_IOCTL = 3,
2872d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_EH_HOS = 4,
2882d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_TM_TIMEOUT = 5,
2892d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_IOCTL_TIMEOUT = 6,
2902d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_MUR_FAILURE = 7,
2912d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_CTLR_CLEANUP = 8,
2922d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_CIACTIV_FAULT = 9,
2932d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_PE_TIMEOUT = 10,
2942d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_TSU_TIMEOUT = 11,
2952d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_DELREQQ_TIMEOUT = 12,
2962d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_DELREPQ_TIMEOUT = 13,
2972d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_CREATEREPQ_TIMEOUT = 14,
2982d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_CREATEREQQ_TIMEOUT = 15,
2992d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_IOCFACTS_TIMEOUT = 16,
3002d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_IOCINIT_TIMEOUT = 17,
3012d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_EVTNOTIFY_TIMEOUT = 18,
3022d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_EVTACK_TIMEOUT = 19,
3032d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_CIACTVRST_TIMER = 20,
3042d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_GETPKGVER_TIMEOUT = 21,
3052d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_PELABORT_TIMEOUT = 22,
3062d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_SYSFS = 23,
3072d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_SYSFS_TIMEOUT = 24,
3082d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_DIAG_BUFFER_POST_TIMEOUT = 25,
3092d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_SCSIIO_TIMEOUT = 26,
3102d1d418eSSumit Saxena 	MPI3MR_RESET_FROM_FIRMWARE = 27,
3112d1d418eSSumit Saxena 	MPI3MR_DEFAULT_RESET_REASON = 28,
3122d1d418eSSumit Saxena 	MPI3MR_RESET_REASON_COUNT,
3132d1d418eSSumit Saxena };
3142d1d418eSSumit Saxena 
3152d1d418eSSumit Saxena struct mpi3mr_compimg_ver
3162d1d418eSSumit Saxena {
3172d1d418eSSumit Saxena         U16 build_num;
3182d1d418eSSumit Saxena         U16 cust_id;
3192d1d418eSSumit Saxena         U8 ph_minor;
3202d1d418eSSumit Saxena         U8 ph_major;
3212d1d418eSSumit Saxena         U8 gen_minor;
3222d1d418eSSumit Saxena         U8 gen_major;
3232d1d418eSSumit Saxena };
3242d1d418eSSumit Saxena 
3252d1d418eSSumit Saxena struct mpi3mr_ioc_facts
3262d1d418eSSumit Saxena {
3272d1d418eSSumit Saxena         U32 ioc_capabilities;
3282d1d418eSSumit Saxena         struct mpi3mr_compimg_ver fw_ver;
3292d1d418eSSumit Saxena         U32 mpi_version;
3302d1d418eSSumit Saxena         U16 max_reqs;
3312d1d418eSSumit Saxena         U16 product_id;
3322d1d418eSSumit Saxena         U16 op_req_sz;
3332d1d418eSSumit Saxena 	U16 reply_sz;
3342d1d418eSSumit Saxena         U16 exceptions;
3352d1d418eSSumit Saxena         U16 max_perids;
3362d1d418eSSumit Saxena         U16 max_pds;
3372d1d418eSSumit Saxena         U16 max_sasexpanders;
3382d1d418eSSumit Saxena         U16 max_sasinitiators;
3392d1d418eSSumit Saxena         U16 max_enclosures;
3402d1d418eSSumit Saxena         U16 max_pcieswitches;
3412d1d418eSSumit Saxena         U16 max_nvme;
3422d1d418eSSumit Saxena         U16 max_vds;
3432d1d418eSSumit Saxena         U16 max_hpds;
3442d1d418eSSumit Saxena         U16 max_advhpds;
3452d1d418eSSumit Saxena         U16 max_raidpds;
3462d1d418eSSumit Saxena         U16 min_devhandle;
3472d1d418eSSumit Saxena         U16 max_devhandle;
3482d1d418eSSumit Saxena 	U16 max_op_req_q;
3492d1d418eSSumit Saxena 	U16 max_op_reply_q;
3502d1d418eSSumit Saxena         U16 shutdown_timeout;
3512d1d418eSSumit Saxena         U8 ioc_num;
3522d1d418eSSumit Saxena         U8 who_init;
3532d1d418eSSumit Saxena 	U16 max_msix_vectors;
3542d1d418eSSumit Saxena         U8 personality;
3552d1d418eSSumit Saxena 	U8 dma_mask;
3562d1d418eSSumit Saxena         U8 protocol_flags;
3572d1d418eSSumit Saxena         U8 sge_mod_mask;
3582d1d418eSSumit Saxena         U8 sge_mod_value;
3592d1d418eSSumit Saxena         U8 sge_mod_shift;
3602d1d418eSSumit Saxena 	U8 max_dev_per_tg;
3612d1d418eSSumit Saxena 	U16 max_io_throttle_group;
3622d1d418eSSumit Saxena 	U16 io_throttle_data_length;
3632d1d418eSSumit Saxena 	U16 io_throttle_low;
3642d1d418eSSumit Saxena 	U16 io_throttle_high;
3652d1d418eSSumit Saxena };
3662d1d418eSSumit Saxena 
3672d1d418eSSumit Saxena struct mpi3mr_op_req_queue {
3682d1d418eSSumit Saxena 	U16 ci;
3692d1d418eSSumit Saxena 	U16 pi;
3702d1d418eSSumit Saxena 	U16 num_reqs;
3712d1d418eSSumit Saxena 	U8  qid;
3722d1d418eSSumit Saxena 	U8  reply_qid;
3732d1d418eSSumit Saxena 	U32 qsz;
3742d1d418eSSumit Saxena 	void *q_base;
3752d1d418eSSumit Saxena 	bus_dma_tag_t q_base_tag;
3762d1d418eSSumit Saxena 	bus_dmamap_t q_base_dmamap;
3772d1d418eSSumit Saxena 	bus_addr_t q_base_phys;
3782d1d418eSSumit Saxena 	struct mtx q_lock;
3792d1d418eSSumit Saxena };
3802d1d418eSSumit Saxena 
3812d1d418eSSumit Saxena struct mpi3mr_op_reply_queue {
3822d1d418eSSumit Saxena 	U16 ci;
3832d1d418eSSumit Saxena 	U8 ephase;
3842d1d418eSSumit Saxena 	U8 qid;
3852d1d418eSSumit Saxena 	U16 num_replies;
3862d1d418eSSumit Saxena 	U32 qsz;
3872d1d418eSSumit Saxena 	bus_dma_tag_t q_base_tag;
3882d1d418eSSumit Saxena 	bus_dmamap_t q_base_dmamap;
3892d1d418eSSumit Saxena 	void *q_base;
3902d1d418eSSumit Saxena 	bus_addr_t q_base_phys;
3912d1d418eSSumit Saxena 	mpi3mr_atomic_t pend_ios;
3922d1d418eSSumit Saxena 	bool in_use;
3932d1d418eSSumit Saxena 	struct mtx q_lock;
3942d1d418eSSumit Saxena };
3952d1d418eSSumit Saxena 
3962d1d418eSSumit Saxena struct irq_info {
3972d1d418eSSumit Saxena 	MPI3_REPLY_DESCRIPTORS_UNION	*post_queue;
3982d1d418eSSumit Saxena 	bus_dma_tag_t			buffer_dmat;
3992d1d418eSSumit Saxena 	struct resource			*irq;
4002d1d418eSSumit Saxena 	void				*intrhand;
4012d1d418eSSumit Saxena 	int				irq_rid;
4022d1d418eSSumit Saxena };
4032d1d418eSSumit Saxena 
4042d1d418eSSumit Saxena struct mpi3mr_irq_context {
4052d1d418eSSumit Saxena 	struct mpi3mr_softc *sc;
4062d1d418eSSumit Saxena 	U16 msix_index;
4072d1d418eSSumit Saxena 	struct mpi3mr_op_reply_queue *op_reply_q;
4082d1d418eSSumit Saxena 	char name[MPI3MR_NAME_LENGTH];
4092d1d418eSSumit Saxena 	struct irq_info irq_info;
4102d1d418eSSumit Saxena };
4112d1d418eSSumit Saxena 
4122d1d418eSSumit Saxena MALLOC_DECLARE(M_MPI3MR);
4132d1d418eSSumit Saxena SYSCTL_DECL(_hw_mpi3mr);
4142d1d418eSSumit Saxena 
4152d1d418eSSumit Saxena typedef struct mpi3mr_drvr_cmd DRVR_CMD;
4162d1d418eSSumit Saxena typedef void (*DRVR_CMD_CALLBACK)(struct mpi3mr_softc *mrioc, DRVR_CMD *drvrcmd);
4172d1d418eSSumit Saxena struct mpi3mr_drvr_cmd {
4182d1d418eSSumit Saxena 	struct mtx lock;
4192d1d418eSSumit Saxena 	struct completion completion;
4202d1d418eSSumit Saxena 	void *reply;
4212d1d418eSSumit Saxena 	U8 *sensebuf;
4222d1d418eSSumit Saxena 	U8 iou_rc;
4232d1d418eSSumit Saxena 	U16 state;
4242d1d418eSSumit Saxena 	U16 dev_handle;
4252d1d418eSSumit Saxena 	U16 ioc_status;
4262d1d418eSSumit Saxena 	U32 ioc_loginfo;
4272d1d418eSSumit Saxena 	U8 is_waiting;
4282d1d418eSSumit Saxena 	U8 is_senseprst;
4292d1d418eSSumit Saxena 	U8 retry_count;
4302d1d418eSSumit Saxena 	U16 host_tag;
4312d1d418eSSumit Saxena 	DRVR_CMD_CALLBACK callback;
4322d1d418eSSumit Saxena };
4332d1d418eSSumit Saxena 
4342d1d418eSSumit Saxena struct mpi3mr_cmd;
4352d1d418eSSumit Saxena typedef void mpi3mr_evt_callback_t(struct mpi3mr_softc *, uintptr_t,
4362d1d418eSSumit Saxena 	Mpi3EventNotificationReply_t *reply);
4372d1d418eSSumit Saxena typedef void mpi3mr_cmd_callback_t(struct mpi3mr_softc *,
4382d1d418eSSumit Saxena 	struct mpi3mr_cmd *cmd);
4392d1d418eSSumit Saxena 
4402d1d418eSSumit Saxena #define       MPI3MR_IOVEC_COUNT 2
4412d1d418eSSumit Saxena 
4422d1d418eSSumit Saxena enum mpi3mr_data_xfer_direction {
4432d1d418eSSumit Saxena 	MPI3MR_READ = 1,
4442d1d418eSSumit Saxena 	MPI3MR_WRITE,
4452d1d418eSSumit Saxena };
4462d1d418eSSumit Saxena 
4472d1d418eSSumit Saxena enum mpi3mr_cmd_state {
4482d1d418eSSumit Saxena 	MPI3MR_CMD_STATE_FREE = 1,
4492d1d418eSSumit Saxena 	MPI3MR_CMD_STATE_BUSY,
4502d1d418eSSumit Saxena 	MPI3MR_CMD_STATE_IN_QUEUE,
4512d1d418eSSumit Saxena 	MPI3MR_CMD_STATE_IN_TM,
4522d1d418eSSumit Saxena };
4532d1d418eSSumit Saxena 
4542d1d418eSSumit Saxena enum mpi3mr_target_state {
4552d1d418eSSumit Saxena 	MPI3MR_DEV_CREATED = 1,
456701d776cSChandrakanth patil 	MPI3MR_DEV_REMOVE_HS_COMPLETED = 2,
4572d1d418eSSumit Saxena };
4582d1d418eSSumit Saxena 
4592d1d418eSSumit Saxena struct mpi3mr_cmd {
4602d1d418eSSumit Saxena 	TAILQ_ENTRY(mpi3mr_cmd) 	next;
4612d1d418eSSumit Saxena 	struct mpi3mr_softc		*sc;
4622d1d418eSSumit Saxena 	union ccb			*ccb;
4632d1d418eSSumit Saxena 	void				*data;
4642d1d418eSSumit Saxena 	u_int				length;
4652d1d418eSSumit Saxena 	struct mpi3mr_target		*targ;
4662d1d418eSSumit Saxena 	u_int				data_dir;
4672d1d418eSSumit Saxena 	u_int				state;
4682d1d418eSSumit Saxena 	bus_dmamap_t			dmamap;
4692d1d418eSSumit Saxena 	struct scsi_sense_data		*sense;
4702d1d418eSSumit Saxena 	struct callout			callout;
4712d1d418eSSumit Saxena 	bool				callout_owner;
4722d1d418eSSumit Saxena 	U16				hosttag;
4732d1d418eSSumit Saxena 	U8				req_qidx;
4742d1d418eSSumit Saxena 	Mpi3SCSIIORequest_t		io_request;
4752d1d418eSSumit Saxena };
4762d1d418eSSumit Saxena 
4772d1d418eSSumit Saxena struct mpi3mr_chain {
4782d1d418eSSumit Saxena 	bus_dmamap_t buf_dmamap;
4792d1d418eSSumit Saxena 	void *buf;
4802d1d418eSSumit Saxena 	bus_addr_t buf_phys;
4812d1d418eSSumit Saxena };
4822d1d418eSSumit Saxena 
4832d1d418eSSumit Saxena struct mpi3mr_event_handle {
4842d1d418eSSumit Saxena 	TAILQ_ENTRY(mpi3mr_event_handle)	eh_list;
4852d1d418eSSumit Saxena 	mpi3mr_evt_callback_t		*callback;
4862d1d418eSSumit Saxena 	void				*data;
4872d1d418eSSumit Saxena 	uint8_t				mask[16];
4882d1d418eSSumit Saxena };
4892d1d418eSSumit Saxena 
4902d1d418eSSumit Saxena struct mpi3mr_fw_event_work {
4912d1d418eSSumit Saxena 	U16			event;
4922d1d418eSSumit Saxena 	void			*event_data;
4932d1d418eSSumit Saxena 	TAILQ_ENTRY(mpi3mr_fw_event_work)	ev_link;
4942d1d418eSSumit Saxena 	U8			send_ack;
4952d1d418eSSumit Saxena 	U8			process_event;
4962d1d418eSSumit Saxena 	U32			event_context;
4972d1d418eSSumit Saxena 	U16			event_data_size;
4982d1d418eSSumit Saxena };
4992d1d418eSSumit Saxena 
5002d1d418eSSumit Saxena /**
5012d1d418eSSumit Saxena  * struct delayed_dev_rmhs_node - Delayed device removal node
5022d1d418eSSumit Saxena  *
5032d1d418eSSumit Saxena  * @list: list head
5042d1d418eSSumit Saxena  * @handle: Device handle
5052d1d418eSSumit Saxena  * @iou_rc: IO Unit Control Reason Code
5062d1d418eSSumit Saxena  */
5072d1d418eSSumit Saxena struct delayed_dev_rmhs_node {
5082d1d418eSSumit Saxena 	TAILQ_ENTRY(delayed_dev_rmhs_node) list;
5092d1d418eSSumit Saxena 	U16 handle;
5102d1d418eSSumit Saxena 	U8 iou_rc;
5112d1d418eSSumit Saxena };
5122d1d418eSSumit Saxena 
5132d1d418eSSumit Saxena /**
5142d1d418eSSumit Saxena  * struct delayed_evtack_node - Delayed event ack node
5152d1d418eSSumit Saxena  *
5162d1d418eSSumit Saxena  * @list: list head
5172d1d418eSSumit Saxena  * @event: MPI3 event ID
5182d1d418eSSumit Saxena  * @event_ctx: Event context
5192d1d418eSSumit Saxena  */
5202d1d418eSSumit Saxena struct delayed_evtack_node {
5212d1d418eSSumit Saxena 	TAILQ_ENTRY(delayed_evtack_node) list;
5222d1d418eSSumit Saxena 	U8 event;
5232d1d418eSSumit Saxena 	U32 event_ctx;
5242d1d418eSSumit Saxena };
5252d1d418eSSumit Saxena 
5262d1d418eSSumit Saxena /* Reset types */
5272d1d418eSSumit Saxena enum reset_type {
5282d1d418eSSumit Saxena 	MPI3MR_NO_RESET,
5292d1d418eSSumit Saxena 	MPI3MR_TRIGGER_SOFT_RESET,
5302d1d418eSSumit Saxena };
5312d1d418eSSumit Saxena 
5322d1d418eSSumit Saxena struct mpi3mr_reset {
5332d1d418eSSumit Saxena 	u_int type;
5342d1d418eSSumit Saxena 	U32 reason;
5352d1d418eSSumit Saxena 	int status;
5362d1d418eSSumit Saxena 	bool ioctl_reset_snapdump;
5372d1d418eSSumit Saxena };
5382d1d418eSSumit Saxena 
5392d1d418eSSumit Saxena struct mpi3mr_softc {
5402d1d418eSSumit Saxena 	device_t mpi3mr_dev;
5412d1d418eSSumit Saxena 	struct cdev *mpi3mr_cdev;
5422d1d418eSSumit Saxena 	u_int mpi3mr_flags;
5432d1d418eSSumit Saxena #define MPI3MR_FLAGS_SHUTDOWN		(1 << 0)
5442d1d418eSSumit Saxena #define MPI3MR_FLAGS_DIAGRESET		(1 << 1)
5452d1d418eSSumit Saxena #define	MPI3MR_FLAGS_ATTACH_DONE	(1 << 2)
5462d1d418eSSumit Saxena #define	MPI3MR_FLAGS_PORT_ENABLE_DONE	(1 << 3)
5472d1d418eSSumit Saxena 	U8 id;
5482d1d418eSSumit Saxena 	int cpu_count;
5492d1d418eSSumit Saxena 	char name[MPI3MR_NAME_LENGTH];
5502d1d418eSSumit Saxena 	char driver_name[MPI3MR_NAME_LENGTH];
5512d1d418eSSumit Saxena 	int bars;
552ee7c431cSWarner Losh 	bus_addr_t dma_loaddr;
5532d1d418eSSumit Saxena 	u_int mpi3mr_debug;
5542d1d418eSSumit Saxena 	struct mpi3mr_reset reset;
5552d1d418eSSumit Saxena 	int max_msix_vectors;
5562d1d418eSSumit Saxena 	int msix_count;
5572d1d418eSSumit Saxena 	bool  msix_enable;
5582d1d418eSSumit Saxena 	int io_cmds_highwater;
5592d1d418eSSumit Saxena 	int max_chains;
5602d1d418eSSumit Saxena 	uint32_t chain_frame_size;
5612d1d418eSSumit Saxena 	struct sysctl_ctx_list sysctl_ctx;
5622d1d418eSSumit Saxena 	struct sysctl_oid *sysctl_tree;
56328a27434SWarner Losh 	char fw_version[32];
5642d1d418eSSumit Saxena 	struct mpi3mr_chain *chains;
5652d1d418eSSumit Saxena 	struct callout periodic;
5662d1d418eSSumit Saxena 	struct callout device_check_callout;
5672d1d418eSSumit Saxena 
5682d1d418eSSumit Saxena 	struct mpi3mr_cam_softc	*cam_sc;
5692d1d418eSSumit Saxena 	struct mpi3mr_cmd **cmd_list;
5702d1d418eSSumit Saxena 	TAILQ_HEAD(, mpi3mr_cmd) cmd_list_head;
5712d1d418eSSumit Saxena 	struct mtx cmd_pool_lock;
5722d1d418eSSumit Saxena 
5732d1d418eSSumit Saxena 	struct resource			*mpi3mr_regs_resource;
5742d1d418eSSumit Saxena 	bus_space_handle_t		mpi3mr_bhandle;
5752d1d418eSSumit Saxena 	bus_space_tag_t			mpi3mr_btag;
5762d1d418eSSumit Saxena 	int				mpi3mr_regs_rid;
5772d1d418eSSumit Saxena 
5782d1d418eSSumit Saxena 	bus_dma_tag_t			mpi3mr_parent_dmat;
5792d1d418eSSumit Saxena 	bus_dma_tag_t			buffer_dmat;
5802d1d418eSSumit Saxena 
5812d1d418eSSumit Saxena 	int				num_reqs;
5822d1d418eSSumit Saxena 	int				num_replies;
5832d1d418eSSumit Saxena 	int				num_chains;
5842d1d418eSSumit Saxena 
5852d1d418eSSumit Saxena 	TAILQ_HEAD(, mpi3mr_event_handle)	event_list;
5862d1d418eSSumit Saxena 	struct mpi3mr_event_handle		*mpi3mr_log_eh;
5872d1d418eSSumit Saxena 	struct intr_config_hook		mpi3mr_ich;
5882d1d418eSSumit Saxena 
5892d1d418eSSumit Saxena 	struct mtx mpi3mr_mtx;
5902d1d418eSSumit Saxena 	struct mtx io_lock;
5912d1d418eSSumit Saxena 	U8 intr_enabled;
5922d1d418eSSumit Saxena 	TAILQ_HEAD(, delayed_dev_rmhs_node) delayed_rmhs_list;
5932d1d418eSSumit Saxena 	TAILQ_HEAD(, delayed_evtack_node) delayed_evtack_cmds_list;
5942d1d418eSSumit Saxena 
5952d1d418eSSumit Saxena 	U16 num_admin_reqs;
5962d1d418eSSumit Saxena 	U32 admin_req_q_sz;
5972d1d418eSSumit Saxena 	U16 admin_req_pi;
5982d1d418eSSumit Saxena 	U16 admin_req_ci;
5992d1d418eSSumit Saxena 	bus_dma_tag_t admin_req_tag;
6002d1d418eSSumit Saxena 	bus_dmamap_t admin_req_dmamap;
6012d1d418eSSumit Saxena 	bus_addr_t admin_req_phys;
6022d1d418eSSumit Saxena 	U8 *admin_req;
6032d1d418eSSumit Saxena 	struct mtx admin_req_lock;
6042d1d418eSSumit Saxena 
6052d1d418eSSumit Saxena 	U16 num_admin_replies;
6062d1d418eSSumit Saxena 	U32 admin_reply_q_sz;
6072d1d418eSSumit Saxena 	U16 admin_reply_ci;
6082d1d418eSSumit Saxena 	U8 admin_reply_ephase;
6092d1d418eSSumit Saxena 	bus_dma_tag_t admin_reply_tag;
6102d1d418eSSumit Saxena 	bus_dmamap_t admin_reply_dmamap;
6112d1d418eSSumit Saxena 	bus_addr_t admin_reply_phys;
6122d1d418eSSumit Saxena 	U8 *admin_reply;
6132d1d418eSSumit Saxena 	struct mtx admin_reply_lock;
6142d1d418eSSumit Saxena 	bool admin_in_use;
6152d1d418eSSumit Saxena 
6162d1d418eSSumit Saxena 	U32 num_reply_bufs;
6172d1d418eSSumit Saxena 	bus_dma_tag_t			reply_buf_tag;
6182d1d418eSSumit Saxena 	bus_dmamap_t			reply_buf_dmamap;
6192d1d418eSSumit Saxena 	bus_addr_t			reply_buf_phys;
6202d1d418eSSumit Saxena 	U8				*reply_buf;
6212d1d418eSSumit Saxena 	bus_addr_t			reply_buf_dma_max_address;
6222d1d418eSSumit Saxena 	bus_addr_t			reply_buf_dma_min_address;
6232d1d418eSSumit Saxena 
6242d1d418eSSumit Saxena 	U16 reply_free_q_sz;
6252d1d418eSSumit Saxena 	bus_dma_tag_t			reply_free_q_tag;
6262d1d418eSSumit Saxena 	bus_dmamap_t			reply_free_q_dmamap;
6272d1d418eSSumit Saxena 	bus_addr_t			reply_free_q_phys;
6282d1d418eSSumit Saxena 	U64				*reply_free_q;
6292d1d418eSSumit Saxena 	struct mtx reply_free_q_lock;
6302d1d418eSSumit Saxena 	U32 reply_free_q_host_index;
6312d1d418eSSumit Saxena 
6322d1d418eSSumit Saxena 	U32 num_sense_bufs;
6332d1d418eSSumit Saxena 	bus_dma_tag_t			sense_buf_tag;
6342d1d418eSSumit Saxena 	bus_dmamap_t			sense_buf_dmamap;
6352d1d418eSSumit Saxena 	bus_addr_t			sense_buf_phys;
6362d1d418eSSumit Saxena 	U8				*sense_buf;
6372d1d418eSSumit Saxena 
6382d1d418eSSumit Saxena 	U16 sense_buf_q_sz;
6392d1d418eSSumit Saxena 	bus_dma_tag_t			sense_buf_q_tag;
6402d1d418eSSumit Saxena 	bus_dmamap_t			sense_buf_q_dmamap;
6412d1d418eSSumit Saxena 	bus_addr_t			sense_buf_q_phys;
6422d1d418eSSumit Saxena 	U64				*sense_buf_q;
6432d1d418eSSumit Saxena 	struct mtx sense_buf_q_lock;
6442d1d418eSSumit Saxena 	U32 sense_buf_q_host_index;
6452d1d418eSSumit Saxena 
6462d1d418eSSumit Saxena 	void				*nvme_encap_prp_list;
6472d1d418eSSumit Saxena 	bus_addr_t			nvme_encap_prp_list_dma;
6482d1d418eSSumit Saxena 	bus_dma_tag_t			nvme_encap_prp_list_dmatag;
6492d1d418eSSumit Saxena 	bus_dmamap_t			nvme_encap_prp_list_dma_dmamap;
6502d1d418eSSumit Saxena 	U32 nvme_encap_prp_sz;
6512d1d418eSSumit Saxena 
6522d1d418eSSumit Saxena 	U32 ready_timeout;
6532d1d418eSSumit Saxena 
6542d1d418eSSumit Saxena 	struct mpi3mr_irq_context *irq_ctx;
6552d1d418eSSumit Saxena 
6562d1d418eSSumit Saxena 	U16 num_queues;		/* Number of request/reply queues */
6572d1d418eSSumit Saxena 	struct mpi3mr_op_req_queue *op_req_q;
6582d1d418eSSumit Saxena 	struct mpi3mr_op_reply_queue *op_reply_q;
6592d1d418eSSumit Saxena 	U16 num_hosttag_op_req_q;
6602d1d418eSSumit Saxena 
6612d1d418eSSumit Saxena 	struct mpi3mr_drvr_cmd init_cmds;
6622d1d418eSSumit Saxena 	struct mpi3mr_ioc_facts facts;
6632d1d418eSSumit Saxena 	U16 reply_sz;
6642d1d418eSSumit Saxena 	U16 op_reply_sz;
6652d1d418eSSumit Saxena 
6662d1d418eSSumit Saxena 	U32 event_masks[MPI3_EVENT_NOTIFY_EVENTMASK_WORDS];
6672d1d418eSSumit Saxena 
6682d1d418eSSumit Saxena 	char fwevt_worker_name[MPI3MR_NAME_LENGTH];
6692d1d418eSSumit Saxena 	struct workqueue_struct	*fwevt_worker_thread;
6702d1d418eSSumit Saxena 	struct mtx fwevt_lock;
6712d1d418eSSumit Saxena 	struct mtx target_lock;
6722d1d418eSSumit Saxena 
6732d1d418eSSumit Saxena 	U16 max_host_ios;
6742d1d418eSSumit Saxena 	bus_dma_tag_t	chain_sgl_list_tag;
6752d1d418eSSumit Saxena 	struct mpi3mr_chain *chain_sgl_list;
6762d1d418eSSumit Saxena 	U16  chain_bitmap_sz;
6772d1d418eSSumit Saxena 	void *chain_bitmap;
6782d1d418eSSumit Saxena 	struct mtx chain_buf_lock;
6792d1d418eSSumit Saxena 	U16 chain_buf_count;
6802d1d418eSSumit Saxena 
6812d1d418eSSumit Saxena 	struct mpi3mr_drvr_cmd ioctl_cmds;
6822d1d418eSSumit Saxena 	struct mpi3mr_drvr_cmd host_tm_cmds;
6832d1d418eSSumit Saxena 	struct mpi3mr_drvr_cmd dev_rmhs_cmds[MPI3MR_NUM_DEVRMCMD];
6842d1d418eSSumit Saxena 	struct mpi3mr_drvr_cmd evtack_cmds[MPI3MR_NUM_EVTACKCMD];
6852d1d418eSSumit Saxena 
6862d1d418eSSumit Saxena 	U16 devrem_bitmap_sz;
6872d1d418eSSumit Saxena 	void *devrem_bitmap;
6882d1d418eSSumit Saxena 
6892d1d418eSSumit Saxena 	U16 dev_handle_bitmap_sz;
6902d1d418eSSumit Saxena 	void *removepend_bitmap;
6912d1d418eSSumit Saxena 
6922d1d418eSSumit Saxena 	U16 evtack_cmds_bitmap_sz;
6932d1d418eSSumit Saxena 	void *evtack_cmds_bitmap;
6942d1d418eSSumit Saxena 
6952d1d418eSSumit Saxena 	U32 ts_update_counter;
6962d1d418eSSumit Saxena 	U8 reset_in_progress;
6972d1d418eSSumit Saxena         U8 unrecoverable;
6982d1d418eSSumit Saxena         U8 block_ioctls;
6992d1d418eSSumit Saxena         U8 in_prep_ciactv_rst;
7002d1d418eSSumit Saxena         U16 prep_ciactv_rst_counter;
7012d1d418eSSumit Saxena         struct mtx reset_mutex;
7022d1d418eSSumit Saxena 
7032d1d418eSSumit Saxena 	U8 prepare_for_reset;
7042d1d418eSSumit Saxena 	U16 prepare_for_reset_timeout_counter;
7052d1d418eSSumit Saxena 
7062d1d418eSSumit Saxena 	U16 diagsave_timeout;
7072d1d418eSSumit Saxena         int logging_level;
7082d1d418eSSumit Saxena         U16 flush_io_count;
7092d1d418eSSumit Saxena 
7102d1d418eSSumit Saxena         Mpi3DriverInfoLayout_t driver_info;
7112d1d418eSSumit Saxena 
7122d1d418eSSumit Saxena 	U16 change_count;
7132d1d418eSSumit Saxena 
7142d1d418eSSumit Saxena 	U8 *log_data_buffer;
7152d1d418eSSumit Saxena 	U16 log_data_buffer_index;
7162d1d418eSSumit Saxena 	U16 log_data_entry_size;
7172d1d418eSSumit Saxena 
7182d1d418eSSumit Saxena         U8 pel_wait_pend;
7192d1d418eSSumit Saxena         U8 pel_abort_requested;
7202d1d418eSSumit Saxena         U8 pel_class;
7212d1d418eSSumit Saxena         U16 pel_locale;
7222d1d418eSSumit Saxena 
7232d1d418eSSumit Saxena 	struct mpi3mr_drvr_cmd pel_cmds;
7242d1d418eSSumit Saxena         struct mpi3mr_drvr_cmd pel_abort_cmd;
7252d1d418eSSumit Saxena         U32 newest_seqnum;
7262d1d418eSSumit Saxena         void *pel_seq_number;
7272d1d418eSSumit Saxena         bus_addr_t pel_seq_number_dma;
7282d1d418eSSumit Saxena 	bus_dma_tag_t pel_seq_num_dmatag;
7292d1d418eSSumit Saxena 	bus_dmamap_t pel_seq_num_dmamap;
7302d1d418eSSumit Saxena         U32 pel_seq_number_sz;
7312d1d418eSSumit Saxena 
7322d1d418eSSumit Saxena 	struct selinfo mpi3mr_select;
7332d1d418eSSumit Saxena 	U32 mpi3mr_poll_waiting;
7342d1d418eSSumit Saxena 	U32 mpi3mr_aen_triggered;
7352d1d418eSSumit Saxena 
7362d1d418eSSumit Saxena 	U16 wait_for_port_enable;
7372d1d418eSSumit Saxena 	U16 track_mapping_events;
7382d1d418eSSumit Saxena 	U16 pending_map_events;
7392d1d418eSSumit Saxena 	mpi3mr_atomic_t fw_outstanding;
7402d1d418eSSumit Saxena 	mpi3mr_atomic_t pend_ioctls;
7412d1d418eSSumit Saxena 	struct proc *watchdog_thread;
7422d1d418eSSumit Saxena 	void   *watchdog_chan;
7432d1d418eSSumit Saxena 	void   *tm_chan;
7442d1d418eSSumit Saxena 	u_int8_t remove_in_progress;
7452d1d418eSSumit Saxena 	u_int8_t watchdog_thread_active;
7462d1d418eSSumit Saxena 	u_int8_t do_timedout_reset;
7472d1d418eSSumit Saxena 	bool allow_ios;
7482d1d418eSSumit Saxena 	bool secure_ctrl;
7492d1d418eSSumit Saxena 	mpi3mr_atomic_t pend_large_data_sz;
7502d1d418eSSumit Saxena 
7512d1d418eSSumit Saxena 	u_int32_t io_throttle_data_length;
7522d1d418eSSumit Saxena 	u_int32_t io_throttle_high;
7532d1d418eSSumit Saxena 	u_int32_t io_throttle_low;
7542d1d418eSSumit Saxena 	u_int16_t num_io_throttle_group;
7552d1d418eSSumit Saxena 	u_int iot_enable;
7562d1d418eSSumit Saxena 	struct mpi3mr_throttle_group_info *throttle_groups;
7572d1d418eSSumit Saxena 
7582d1d418eSSumit Saxena 	struct dma_memory_desc ioctl_sge[MPI3MR_NUM_IOCTL_SGE];
7592d1d418eSSumit Saxena 	struct dma_memory_desc ioctl_chain_sge;
7602d1d418eSSumit Saxena 	struct dma_memory_desc ioctl_resp_sge;
7612d1d418eSSumit Saxena 	bool ioctl_sges_allocated;
7622d1d418eSSumit Saxena };
7632d1d418eSSumit Saxena 
7642d1d418eSSumit Saxena static __inline uint64_t
mpi3mr_regread64(struct mpi3mr_softc * sc,uint32_t offset)7652d1d418eSSumit Saxena mpi3mr_regread64(struct mpi3mr_softc *sc, uint32_t offset)
7662d1d418eSSumit Saxena {
7672d1d418eSSumit Saxena 	return bus_space_read_8(sc->mpi3mr_btag, sc->mpi3mr_bhandle, offset);
7682d1d418eSSumit Saxena }
7692d1d418eSSumit Saxena 
7702d1d418eSSumit Saxena static __inline void
mpi3mr_regwrite64(struct mpi3mr_softc * sc,uint32_t offset,uint64_t val)7712d1d418eSSumit Saxena mpi3mr_regwrite64(struct mpi3mr_softc *sc, uint32_t offset, uint64_t val)
7722d1d418eSSumit Saxena {
7732d1d418eSSumit Saxena 	bus_space_write_8(sc->mpi3mr_btag, sc->mpi3mr_bhandle, offset, val);
7742d1d418eSSumit Saxena }
7752d1d418eSSumit Saxena 
7762d1d418eSSumit Saxena static __inline uint32_t
mpi3mr_regread(struct mpi3mr_softc * sc,uint32_t offset)7772d1d418eSSumit Saxena mpi3mr_regread(struct mpi3mr_softc *sc, uint32_t offset)
7782d1d418eSSumit Saxena {
7792d1d418eSSumit Saxena 	return bus_space_read_4(sc->mpi3mr_btag, sc->mpi3mr_bhandle, offset);
7802d1d418eSSumit Saxena }
7812d1d418eSSumit Saxena 
7822d1d418eSSumit Saxena static __inline void
mpi3mr_regwrite(struct mpi3mr_softc * sc,uint32_t offset,uint32_t val)7832d1d418eSSumit Saxena mpi3mr_regwrite(struct mpi3mr_softc *sc, uint32_t offset, uint32_t val)
7842d1d418eSSumit Saxena {
7852d1d418eSSumit Saxena 	bus_space_write_4(sc->mpi3mr_btag, sc->mpi3mr_bhandle, offset, val);
7862d1d418eSSumit Saxena }
7872d1d418eSSumit Saxena 
7882d1d418eSSumit Saxena #define MPI3MR_INFO	(1 << 0)	/* Basic info */
7892d1d418eSSumit Saxena #define MPI3MR_FAULT	(1 << 1)	/* Hardware faults */
7902d1d418eSSumit Saxena #define MPI3MR_EVENT	(1 << 2)	/* Event data from the controller */
7912d1d418eSSumit Saxena #define MPI3MR_LOG	(1 << 3)	/* Log data from the controller */
7922d1d418eSSumit Saxena #define MPI3MR_RECOVERY	(1 << 4)	/* Command error recovery tracing */
7932d1d418eSSumit Saxena #define MPI3MR_ERROR	(1 << 5)	/* Fatal driver/OS APIs failure */
7942d1d418eSSumit Saxena #define MPI3MR_XINFO	(1 << 6)	/* Additional info logs*/
7952d1d418eSSumit Saxena #define MPI3MR_TRACE	(1 << 7)	/* Trace functions */
7962d1d418eSSumit Saxena #define MPI3MR_IOT	(1 << 8)	/* IO throttling related debugs */
7972d1d418eSSumit Saxena #define MPI3MR_DEBUG_TM	(1 << 9)	/* Task management related debugs */
7982d1d418eSSumit Saxena #define MPI3MR_DEBUG_IOCTL	(1 << 10)	/* IOCTL related debugs */
7992d1d418eSSumit Saxena 
8002d1d418eSSumit Saxena #define mpi3mr_printf(sc, args...)				\
8012d1d418eSSumit Saxena 	device_printf((sc)->mpi3mr_dev, ##args)
8022d1d418eSSumit Saxena 
8032d1d418eSSumit Saxena #define mpi3mr_print_field(sc, msg, args...)		\
8042d1d418eSSumit Saxena 	printf("\t" msg, ##args)
8052d1d418eSSumit Saxena 
8062d1d418eSSumit Saxena #define mpi3mr_vprintf(sc, args...)			\
8072d1d418eSSumit Saxena do {							\
8082d1d418eSSumit Saxena 	if (bootverbose)				\
8092d1d418eSSumit Saxena 		mpi3mr_printf(sc, ##args);			\
8102d1d418eSSumit Saxena } while (0)
8112d1d418eSSumit Saxena 
8122d1d418eSSumit Saxena #define mpi3mr_dprint(sc, level, msg, args...)		\
8132d1d418eSSumit Saxena do {							\
8142d1d418eSSumit Saxena 	if ((sc)->mpi3mr_debug & (level))			\
8152d1d418eSSumit Saxena 		device_printf((sc)->mpi3mr_dev, msg, ##args);	\
8162d1d418eSSumit Saxena } while (0)
8172d1d418eSSumit Saxena 
8182d1d418eSSumit Saxena #define MPI3MR_PRINTFIELD_START(sc, tag...)	\
8192d1d418eSSumit Saxena 	mpi3mr_printf((sc), ##tag);		\
8202d1d418eSSumit Saxena 	mpi3mr_print_field((sc), ":\n")
8212d1d418eSSumit Saxena #define MPI3MR_PRINTFIELD_END(sc, tag)		\
8222d1d418eSSumit Saxena 	mpi3mr_printf((sc), tag "\n")
8232d1d418eSSumit Saxena #define MPI3MR_PRINTFIELD(sc, facts, attr, fmt)	\
8242d1d418eSSumit Saxena 	mpi3mr_print_field((sc), #attr ": " #fmt "\n", (facts)->attr)
8252d1d418eSSumit Saxena 
8262d1d418eSSumit Saxena #define mpi3mr_kproc_create(func, farg, proc_ptr, flags, stackpgs, fmtstr, arg) \
8272d1d418eSSumit Saxena     kproc_create(func, farg, proc_ptr, flags, stackpgs, fmtstr, arg)
8282d1d418eSSumit Saxena #define mpi3mr_kproc_exit(arg)	kproc_exit(arg)
8292d1d418eSSumit Saxena 
8302d1d418eSSumit Saxena #if defined(CAM_PRIORITY_XPT)
8312d1d418eSSumit Saxena #define MPI3MR_PRIORITY_XPT	CAM_PRIORITY_XPT
8322d1d418eSSumit Saxena #else
8332d1d418eSSumit Saxena #define MPI3MR_PRIORITY_XPT	5
8342d1d418eSSumit Saxena #endif
8352d1d418eSSumit Saxena 
8362d1d418eSSumit Saxena static __inline void
mpi3mr_clear_bit(int b,volatile void * p)8372d1d418eSSumit Saxena mpi3mr_clear_bit(int b, volatile void *p)
8382d1d418eSSumit Saxena {
8392d1d418eSSumit Saxena 	atomic_clear_int(((volatile int *)p) + (b >> 5), 1 << (b & 0x1f));
8402d1d418eSSumit Saxena }
8412d1d418eSSumit Saxena 
8422d1d418eSSumit Saxena static __inline void
mpi3mr_set_bit(int b,volatile void * p)8432d1d418eSSumit Saxena mpi3mr_set_bit(int b, volatile void *p)
8442d1d418eSSumit Saxena {
8452d1d418eSSumit Saxena 	atomic_set_int(((volatile int *)p) + (b >> 5), 1 << (b & 0x1f));
8462d1d418eSSumit Saxena }
8472d1d418eSSumit Saxena 
8482d1d418eSSumit Saxena static __inline int
mpi3mr_test_bit(int b,volatile void * p)8492d1d418eSSumit Saxena mpi3mr_test_bit(int b, volatile void *p)
8502d1d418eSSumit Saxena {
8512d1d418eSSumit Saxena 	return ((volatile int *)p)[b >> 5] & (1 << (b & 0x1f));
8522d1d418eSSumit Saxena }
8532d1d418eSSumit Saxena 
8542d1d418eSSumit Saxena static __inline int
mpi3mr_test_and_set_bit(int b,volatile void * p)8552d1d418eSSumit Saxena mpi3mr_test_and_set_bit(int b, volatile void *p)
8562d1d418eSSumit Saxena {
8572d1d418eSSumit Saxena 	int ret = ((volatile int *)p)[b >> 5] & (1 << (b & 0x1f));
8582d1d418eSSumit Saxena 
8592d1d418eSSumit Saxena 	atomic_set_int(((volatile int *)p) + (b >> 5), 1 << (b & 0x1f));
8602d1d418eSSumit Saxena 	return ret;
8612d1d418eSSumit Saxena }
8622d1d418eSSumit Saxena 
8632d1d418eSSumit Saxena static __inline int
mpi3mr_find_first_zero_bit(void * p,int bit_count)8642d1d418eSSumit Saxena mpi3mr_find_first_zero_bit(void *p, int bit_count)
8652d1d418eSSumit Saxena {
8662d1d418eSSumit Saxena 	int i, sz, j=0;
8672d1d418eSSumit Saxena 	U8 *loc;
8682d1d418eSSumit Saxena 
8692d1d418eSSumit Saxena 	sz = bit_count % 8 ? (bit_count / 8 + 1) : (bit_count / 8);
8702d1d418eSSumit Saxena 	loc = malloc(sz, M_MPI3MR, M_NOWAIT | M_ZERO);
8712d1d418eSSumit Saxena 
8722d1d418eSSumit Saxena 	memcpy(loc, p, sz);
8732d1d418eSSumit Saxena 
8742d1d418eSSumit Saxena 	for (i = 0; i < sz; i++) {
8752d1d418eSSumit Saxena 		j = 0;
8762d1d418eSSumit Saxena 		while (j < 8) {
8772d1d418eSSumit Saxena 			if (!((loc[i] >> j) & 0x1))
8782d1d418eSSumit Saxena 				goto out;
8792d1d418eSSumit Saxena 			j++;
8802d1d418eSSumit Saxena 		}
8812d1d418eSSumit Saxena 	}
8822d1d418eSSumit Saxena out:
8832d1d418eSSumit Saxena 	free(loc, M_MPI3MR);
8842d1d418eSSumit Saxena 	return (i + j);
8852d1d418eSSumit Saxena }
8862d1d418eSSumit Saxena 
8872d1d418eSSumit Saxena #define MPI3MR_DIV_ROUND_UP(n,d)       (((n) + (d) - 1) / (d))
8882d1d418eSSumit Saxena 
8892d1d418eSSumit Saxena void
8902d1d418eSSumit Saxena init_completion(struct completion *completion);
8912d1d418eSSumit Saxena 
8922d1d418eSSumit Saxena void
8932d1d418eSSumit Saxena complete(struct completion *completion);
8942d1d418eSSumit Saxena 
8952d1d418eSSumit Saxena void wait_for_completion_timeout(struct completion *completion,
8962d1d418eSSumit Saxena 	    U32 timeout);
8972d1d418eSSumit Saxena void wait_for_completion_timeout_tm(struct completion *completion,
8982d1d418eSSumit Saxena 	    U32 timeout, struct mpi3mr_softc *sc);
8992d1d418eSSumit Saxena void mpi3mr_add_sg_single(void *paddr, U8 flags, U32 length,
9002d1d418eSSumit Saxena     bus_addr_t dma_addr);
9012d1d418eSSumit Saxena void mpi3mr_enable_interrupts(struct mpi3mr_softc *sc);
9022d1d418eSSumit Saxena void mpi3mr_disable_interrupts(struct mpi3mr_softc *sc);
9032d1d418eSSumit Saxena void mpi3mr_memaddr_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error);
9042d1d418eSSumit Saxena int mpi3mr_submit_admin_cmd(struct mpi3mr_softc *mrioc, void *admin_req,
9052d1d418eSSumit Saxena     U16 admin_req_sz);
9062d1d418eSSumit Saxena int mpi3mr_submit_io(struct mpi3mr_softc *mrioc,
9072d1d418eSSumit Saxena     struct mpi3mr_op_req_queue *op_req_q, U8 *req);
9082d1d418eSSumit Saxena int
9092d1d418eSSumit Saxena mpi3mr_alloc_interrupts(struct mpi3mr_softc *sc, U16 setup_one);
9102d1d418eSSumit Saxena 
9112d1d418eSSumit Saxena void mpi3mr_cleanup_ioc(struct mpi3mr_softc *sc);
9122d1d418eSSumit Saxena int mpi3mr_initialize_ioc(struct mpi3mr_softc *sc, U8 reason);
9132d1d418eSSumit Saxena void mpi3mr_build_zero_len_sge(void *paddr);
9142d1d418eSSumit Saxena int mpi3mr_issue_event_notification(struct mpi3mr_softc *sc);
9152d1d418eSSumit Saxena int
9162d1d418eSSumit Saxena mpi3mr_register_events(struct mpi3mr_softc *sc);
9172d1d418eSSumit Saxena void mpi3mr_process_op_reply_desc(struct mpi3mr_softc *sc,
9182d1d418eSSumit Saxena     Mpi3DefaultReplyDescriptor_t *reply_desc, U64 *reply_dma);
9192d1d418eSSumit Saxena struct mpi3mr_cmd *
9202d1d418eSSumit Saxena mpi3mr_get_command(struct mpi3mr_softc *sc);
9212d1d418eSSumit Saxena void
9222d1d418eSSumit Saxena mpi3mr_release_command(struct mpi3mr_cmd *cmd);
9232d1d418eSSumit Saxena int
9242d1d418eSSumit Saxena mpi3mr_complete_io_cmd(struct mpi3mr_softc *sc,
9252d1d418eSSumit Saxena     struct mpi3mr_irq_context *irq_context);
9262d1d418eSSumit Saxena int
9272d1d418eSSumit Saxena mpi3mr_cam_detach(struct mpi3mr_softc *sc);
9282d1d418eSSumit Saxena int
9292d1d418eSSumit Saxena mpi3mr_cam_attach(struct mpi3mr_softc *sc);
9302d1d418eSSumit Saxena struct mpi3mr_target *
9312d1d418eSSumit Saxena mpi3mr_find_target_by_per_id(struct mpi3mr_cam_softc *cam_sc,
9322d1d418eSSumit Saxena     uint16_t per_id);
9332d1d418eSSumit Saxena struct mpi3mr_target *
9342d1d418eSSumit Saxena mpi3mr_find_target_by_dev_handle(struct mpi3mr_cam_softc *cam_sc,
9352d1d418eSSumit Saxena     uint16_t dev_handle);
9362d1d418eSSumit Saxena int mpi3mr_create_device(struct mpi3mr_softc *sc,
9372d1d418eSSumit Saxena     Mpi3DevicePage0_t *dev_pg0);
9382d1d418eSSumit Saxena void
9392d1d418eSSumit Saxena mpi3mr_unmap_request(struct mpi3mr_softc *sc, struct mpi3mr_cmd *cmd);
9402d1d418eSSumit Saxena void
9412d1d418eSSumit Saxena init_completion(struct completion *completion);
9422d1d418eSSumit Saxena void
9432d1d418eSSumit Saxena complete(struct completion *completion);
9442d1d418eSSumit Saxena void wait_for_completion_timeout(struct completion *completion,
9452d1d418eSSumit Saxena 	    U32 timeout);
9462d1d418eSSumit Saxena void
9472d1d418eSSumit Saxena poll_for_command_completion(struct mpi3mr_softc *sc,
9482d1d418eSSumit Saxena        struct mpi3mr_drvr_cmd *cmd, U16 wait);
9492d1d418eSSumit Saxena int
9502d1d418eSSumit Saxena mpi3mr_alloc_requests(struct mpi3mr_softc *sc);
9512d1d418eSSumit Saxena void
9522d1d418eSSumit Saxena mpi3mr_watchdog(void *arg);
9532d1d418eSSumit Saxena int mpi3mr_issue_port_enable(struct mpi3mr_softc *mrioc, U8 async);
9542d1d418eSSumit Saxena void
9552d1d418eSSumit Saxena mpi3mr_isr(void *privdata);
9562d1d418eSSumit Saxena int
9572d1d418eSSumit Saxena mpi3mr_alloc_msix_queues(struct mpi3mr_softc *sc);
9582d1d418eSSumit Saxena void
9592d1d418eSSumit Saxena mpi3mr_destory_mtx(struct mpi3mr_softc *sc);
9602d1d418eSSumit Saxena void
9612d1d418eSSumit Saxena mpi3mr_free_mem(struct mpi3mr_softc *sc);
9622d1d418eSSumit Saxena void
9632d1d418eSSumit Saxena mpi3mr_cleanup_interrupts(struct mpi3mr_softc *sc);
9642d1d418eSSumit Saxena int mpi3mr_setup_irqs(struct mpi3mr_softc *sc);
9652d1d418eSSumit Saxena void mpi3mr_cleanup_event_taskq(struct mpi3mr_softc *sc);
9662d1d418eSSumit Saxena void
9672d1d418eSSumit Saxena mpi3mr_hexdump(void *buf, int sz, int format);
9682d1d418eSSumit Saxena int mpi3mr_soft_reset_handler(struct mpi3mr_softc *sc,
9693012fa8fSChandrakanth patil 	U16 reset_reason, bool snapdump);
9702d1d418eSSumit Saxena void
9712d1d418eSSumit Saxena mpi3mrsas_release_simq_reinit(struct mpi3mr_cam_softc *cam_sc);
9722d1d418eSSumit Saxena void
9732d1d418eSSumit Saxena mpi3mr_watchdog_thread(void *arg);
9742d1d418eSSumit Saxena void mpi3mr_add_device(struct mpi3mr_softc *sc, U16 per_id);
9752d1d418eSSumit Saxena int mpi3mr_remove_device(struct mpi3mr_softc *sc, U16 handle);
9762d1d418eSSumit Saxena int
9772d1d418eSSumit Saxena mpi3mrsas_register_events(struct mpi3mr_softc *sc);
9782d1d418eSSumit Saxena int mpi3mr_process_event_ack(struct mpi3mr_softc *sc, U8 event,
9792d1d418eSSumit Saxena 	U32 event_ctx);
9802d1d418eSSumit Saxena int mpi3mr_remove_device_from_os(struct mpi3mr_softc *sc, U16 handle);
9812d1d418eSSumit Saxena void mpi3mr_remove_device_from_list(struct mpi3mr_softc *sc, struct mpi3mr_target *target,
9822d1d418eSSumit Saxena 				    bool must_delete);
9832d1d418eSSumit Saxena void mpi3mr_update_device(struct mpi3mr_softc *mrioc,
9842d1d418eSSumit Saxena     struct mpi3mr_target *tgtdev, Mpi3DevicePage0_t *dev_pg0, bool is_added);
9852d1d418eSSumit Saxena void mpi3mr_app_save_logdata(struct mpi3mr_softc *sc, char *event_data, U16 event_data_size);
9862d1d418eSSumit Saxena void mpi3mr_set_io_divert_for_all_vd_in_tg(struct mpi3mr_softc *sc,
9872d1d418eSSumit Saxena 	struct mpi3mr_throttle_group_info *tg, U8 divert_value);
9882d1d418eSSumit Saxena enum mpi3mr_iocstate mpi3mr_get_iocstate(struct mpi3mr_softc *sc);
9892d1d418eSSumit Saxena void mpi3mr_poll_pend_io_completions(struct mpi3mr_softc *sc);
9902d1d418eSSumit Saxena void int_to_lun(unsigned int lun, U8 *req_lun);
9913012fa8fSChandrakanth patil void trigger_reset_from_watchdog(struct mpi3mr_softc *sc, U8 reset_type, U16 reset_reason);
9922d1d418eSSumit Saxena void mpi3mr_alloc_ioctl_dma_memory(struct mpi3mr_softc *sc);
9932d1d418eSSumit Saxena #endif /*MPI3MR_H_INCLUDED*/
994