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