linux/drivers/scsi/megaraid/megaraid_sas.h

/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 *  Linux MegaRAID driver for SAS based RAID controllers
 *
 *  Copyright (c) 2003-2013  LSI Corporation
 *  Copyright (c) 2013-2016  Avago Technologies
 *  Copyright (c) 2016-2018  Broadcom Inc.
 *
 *  FILE: megaraid_sas.h
 *
 *  Authors: Broadcom Inc.
 *           Kashyap Desai <[email protected]>
 *           Sumit Saxena <[email protected]>
 *
 *  Send feedback to: [email protected]
 */

#ifndef LSI_MEGARAID_SAS_H
#define LSI_MEGARAID_SAS_H

#include <scsi/scsi_cmnd.h>

/*
 * MegaRAID SAS Driver meta data
 */
#define MEGASAS_VERSION
#define MEGASAS_RELDATE

#define MEGASAS_MSIX_NAME_LEN

/*
 * Device IDs
 */
#define PCI_DEVICE_ID_LSI_SAS1078R
#define PCI_DEVICE_ID_LSI_SAS1078DE
#define PCI_DEVICE_ID_LSI_VERDE_ZCR
#define PCI_DEVICE_ID_LSI_SAS1078GEN2
#define PCI_DEVICE_ID_LSI_SAS0079GEN2
#define PCI_DEVICE_ID_LSI_SAS0073SKINNY
#define PCI_DEVICE_ID_LSI_SAS0071SKINNY
#define PCI_DEVICE_ID_LSI_FUSION
#define PCI_DEVICE_ID_LSI_PLASMA
#define PCI_DEVICE_ID_LSI_INVADER
#define PCI_DEVICE_ID_LSI_FURY
#define PCI_DEVICE_ID_LSI_INTRUDER
#define PCI_DEVICE_ID_LSI_INTRUDER_24
#define PCI_DEVICE_ID_LSI_CUTLASS_52
#define PCI_DEVICE_ID_LSI_CUTLASS_53
#define PCI_DEVICE_ID_LSI_VENTURA
#define PCI_DEVICE_ID_LSI_CRUSADER
#define PCI_DEVICE_ID_LSI_HARPOON
#define PCI_DEVICE_ID_LSI_TOMCAT
#define PCI_DEVICE_ID_LSI_VENTURA_4PORT
#define PCI_DEVICE_ID_LSI_CRUSADER_4PORT
#define PCI_DEVICE_ID_LSI_AERO_10E1
#define PCI_DEVICE_ID_LSI_AERO_10E2
#define PCI_DEVICE_ID_LSI_AERO_10E5
#define PCI_DEVICE_ID_LSI_AERO_10E6
#define PCI_DEVICE_ID_LSI_AERO_10E0
#define PCI_DEVICE_ID_LSI_AERO_10E3
#define PCI_DEVICE_ID_LSI_AERO_10E4
#define PCI_DEVICE_ID_LSI_AERO_10E7

/*
 * Intel HBA SSDIDs
 */
#define MEGARAID_INTEL_RS3DC080_SSDID
#define MEGARAID_INTEL_RS3DC040_SSDID
#define MEGARAID_INTEL_RS3SC008_SSDID
#define MEGARAID_INTEL_RS3MC044_SSDID
#define MEGARAID_INTEL_RS3WC080_SSDID
#define MEGARAID_INTEL_RS3WC040_SSDID
#define MEGARAID_INTEL_RMS3BC160_SSDID

/*
 * Intruder HBA SSDIDs
 */
#define MEGARAID_INTRUDER_SSDID1
#define MEGARAID_INTRUDER_SSDID2
#define MEGARAID_INTRUDER_SSDID3

/*
 * Intel HBA branding
 */
#define MEGARAID_INTEL_RS3DC080_BRANDING
#define MEGARAID_INTEL_RS3DC040_BRANDING
#define MEGARAID_INTEL_RS3SC008_BRANDING
#define MEGARAID_INTEL_RS3MC044_BRANDING
#define MEGARAID_INTEL_RS3WC080_BRANDING
#define MEGARAID_INTEL_RS3WC040_BRANDING
#define MEGARAID_INTEL_RMS3BC160_BRANDING

/*
 * =====================================
 * MegaRAID SAS MFI firmware definitions
 * =====================================
 */

/*
 * MFI stands for  MegaRAID SAS FW Interface. This is just a moniker for
 * protocol between the software and firmware. Commands are issued using
 * "message frames"
 */

/*
 * FW posts its state in upper 4 bits of outbound_msg_0 register
 */
#define MFI_STATE_MASK
#define MFI_STATE_UNDEFINED
#define MFI_STATE_BB_INIT
#define MFI_STATE_FW_INIT
#define MFI_STATE_WAIT_HANDSHAKE
#define MFI_STATE_FW_INIT_2
#define MFI_STATE_DEVICE_SCAN
#define MFI_STATE_BOOT_MESSAGE_PENDING
#define MFI_STATE_FLUSH_CACHE
#define MFI_STATE_READY
#define MFI_STATE_OPERATIONAL
#define MFI_STATE_FAULT
#define MFI_STATE_FORCE_OCR
#define MFI_STATE_DMADONE
#define MFI_STATE_CRASH_DUMP_DONE
#define MFI_RESET_REQUIRED
#define MFI_RESET_ADAPTER
#define MEGAMFI_FRAME_SIZE

#define MFI_STATE_FAULT_CODE
#define MFI_STATE_FAULT_SUBCODE
/*
 * During FW init, clear pending cmds & reset state using inbound_msg_0
 *
 * ABORT	: Abort all pending cmds
 * READY	: Move from OPERATIONAL to READY state; discard queue info
 * MFIMODE	: Discard (possible) low MFA posted in 64-bit mode (??)
 * CLR_HANDSHAKE: FW is waiting for HANDSHAKE from BIOS or Driver
 * HOTPLUG	: Resume from Hotplug
 * MFI_STOP_ADP	: Send signal to FW to stop processing
 * MFI_ADP_TRIGGER_SNAP_DUMP: Inform firmware to initiate snap dump
 */
#define WRITE_SEQUENCE_OFFSET
#define HOST_DIAGNOSTIC_OFFSET
#define DIAG_WRITE_ENABLE
#define DIAG_RESET_ADAPTER

#define MFI_ADP_RESET
#define MFI_INIT_ABORT
#define MFI_INIT_READY
#define MFI_INIT_MFIMODE
#define MFI_INIT_CLEAR_HANDSHAKE
#define MFI_INIT_HOTPLUG
#define MFI_STOP_ADP
#define MFI_RESET_FLAGS
#define MFI_ADP_TRIGGER_SNAP_DUMP
#define MPI2_IOCINIT_MSGFLAG_RDPQ_ARRAY_MODE

/*
 * MFI frame flags
 */
#define MFI_FRAME_POST_IN_REPLY_QUEUE
#define MFI_FRAME_DONT_POST_IN_REPLY_QUEUE
#define MFI_FRAME_SGL32
#define MFI_FRAME_SGL64
#define MFI_FRAME_SENSE32
#define MFI_FRAME_SENSE64
#define MFI_FRAME_DIR_NONE
#define MFI_FRAME_DIR_WRITE
#define MFI_FRAME_DIR_READ
#define MFI_FRAME_DIR_BOTH
#define MFI_FRAME_IEEE

/* Driver internal */
#define DRV_DCMD_POLLED_MODE
#define DRV_DCMD_SKIP_REFIRE

/*
 * Definition for cmd_status
 */
#define MFI_CMD_STATUS_POLL_MODE

/*
 * MFI command opcodes
 */
enum MFI_CMD_OP {};

#define MR_DCMD_CTRL_GET_INFO
#define MR_DCMD_LD_GET_LIST
#define MR_DCMD_LD_LIST_QUERY

#define MR_DCMD_CTRL_CACHE_FLUSH
#define MR_FLUSH_CTRL_CACHE
#define MR_FLUSH_DISK_CACHE

#define MR_DCMD_CTRL_SHUTDOWN
#define MR_DCMD_HIBERNATE_SHUTDOWN
#define MR_ENABLE_DRIVE_SPINDOWN

#define MR_DCMD_CTRL_EVENT_GET_INFO
#define MR_DCMD_CTRL_EVENT_GET
#define MR_DCMD_CTRL_EVENT_WAIT
#define MR_DCMD_LD_GET_PROPERTIES

#define MR_DCMD_CLUSTER
#define MR_DCMD_CLUSTER_RESET_ALL
#define MR_DCMD_CLUSTER_RESET_LD
#define MR_DCMD_PD_LIST_QUERY

#define MR_DCMD_CTRL_SET_CRASH_DUMP_PARAMS
#define MR_DRIVER_SET_APP_CRASHDUMP_MODE
#define MR_DCMD_PD_GET_INFO

/*
 * Global functions
 */
extern u8 MR_ValidateMapInfo(struct megasas_instance *instance, u64 map_id);


/*
 * MFI command completion codes
 */
enum MFI_STAT {};

enum mfi_evt_class {};

/*
 * Crash dump related defines
 */
#define MAX_CRASH_DUMP_SIZE
#define CRASH_DMA_BUF_SIZE

enum MR_FW_CRASH_DUMP_STATE {};

enum _MR_CRASH_BUF_STATUS {};

/*
 * Number of mailbox bytes in DCMD message frame
 */
#define MFI_MBOX_SIZE

enum MR_EVT_CLASS {};

enum MR_EVT_LOCALE {};

enum MR_EVT_ARGS {};


#define SGE_BUFFER_SIZE
#define MEGASAS_CLUSTER_ID_SIZE
/*
 * define constants for device list query options
 */
enum MR_PD_QUERY_TYPE {};

enum MR_LD_QUERY_TYPE {};


#define MR_EVT_CFG_CLEARED
#define MR_EVT_LD_STATE_CHANGE
#define MR_EVT_PD_INSERTED
#define MR_EVT_PD_REMOVED
#define MR_EVT_LD_CREATED
#define MR_EVT_LD_DELETED
#define MR_EVT_FOREIGN_CFG_IMPORTED
#define MR_EVT_LD_OFFLINE
#define MR_EVT_CTRL_HOST_BUS_SCAN_REQUESTED
#define MR_EVT_CTRL_PROP_CHANGED

enum MR_PD_STATE {};

MR_PD_REF;

/*
 * define the DDF Type bit structure
 */
MR_PD_DDF_TYPE __packed;

/*
 * defines the progress structure
 */
MR_PROGRESS __packed;

/*
 * defines the physical drive progress structure
 */
struct MR_PD_PROGRESS {} __packed;

struct  MR_PD_INFO {} __packed;

/*
 * Definition of structure used to expose attributes of VD or JBOD
 * (this structure is to be filled by firmware when MR_DCMD_DRV_GET_TARGET_PROP
 * is fired by driver)
 */
struct MR_TARGET_PROPERTIES {} __packed;

 /*
 * defines the physical drive address structure
 */
struct MR_PD_ADDRESS {} __packed;

/*
 * defines the physical drive list structure
 */
struct MR_PD_LIST {} __packed;

struct megasas_pd_list {} __packed;

 /*
 * defines the logical drive reference structure
 */
MR_LD_REF __packed;

/*
 * defines the logical drive list structure
 */
struct MR_LD_LIST {} __packed;

struct MR_LD_TARGETID_LIST {};

struct MR_HOST_DEVICE_LIST_ENTRY {} __packed;

struct MR_HOST_DEVICE_LIST {} __packed;

#define HOST_DEVICE_LIST_SZ


/*
 * SAS controller properties
 */
struct megasas_ctrl_prop {} __packed;

/*
 * SAS controller information
 */
struct megasas_ctrl_info {} __packed;

/*
 * ===============================
 * MegaRAID SAS driver definitions
 * ===============================
 */
#define MEGASAS_MAX_PD_CHANNELS
#define MEGASAS_MAX_LD_CHANNELS
#define MEGASAS_MAX_CHANNELS
#define MEGASAS_MAX_DEV_PER_CHANNEL
#define MEGASAS_DEFAULT_INIT_ID
#define MEGASAS_MAX_LUN
#define MEGASAS_DEFAULT_CMD_PER_LUN
#define MEGASAS_MAX_PD
#define MEGASAS_MAX_LD_IDS

#define MEGASAS_MAX_SUPPORTED_LD_IDS

#define MEGASAS_MAX_SECTORS
#define MEGASAS_MAX_SECTORS_IEEE
#define MEGASAS_DBG_LVL

#define MEGASAS_FW_BUSY

/* Driver's internal Logging levels*/
#define OCR_DEBUG
#define TM_DEBUG
#define LD_PD_DEBUG

#define SCAN_PD_CHANNEL
#define SCAN_VD_CHANNEL

#define MEGASAS_KDUMP_QUEUE_DEPTH
#define MR_LARGE_IO_MIN_SIZE
#define MR_R1_LDIO_PIGGYBACK_DEFAULT

enum MR_SCSI_CMD_TYPE {};

enum DCMD_TIMEOUT_ACTION {};

enum FW_BOOT_CONTEXT {};

/* Frame Type */
#define IO_FRAME
#define PTHRU_FRAME

/*
 * When SCSI mid-layer calls driver's reset routine, driver waits for
 * MEGASAS_RESET_WAIT_TIME seconds for all outstanding IO to complete. Note
 * that the driver cannot _actually_ abort or reset pending commands. While
 * it is waiting for the commands to complete, it prints a diagnostic message
 * every MEGASAS_RESET_NOTICE_INTERVAL seconds
 */
#define MEGASAS_RESET_WAIT_TIME
#define MEGASAS_INTERNAL_CMD_WAIT_TIME
#define MEGASAS_RESET_NOTICE_INTERVAL
#define MEGASAS_IOCTL_CMD
#define MEGASAS_DEFAULT_CMD_TIMEOUT
#define MEGASAS_THROTTLE_QUEUE_DEPTH
#define MEGASAS_DEFAULT_TM_TIMEOUT
/*
 * FW reports the maximum of number of commands that it can accept (maximum
 * commands that can be outstanding) at any time. The driver must report a
 * lower number to the mid layer because it can issue a few internal commands
 * itself (E.g, AEN, abort cmd, IOCTLs etc). The number of commands it needs
 * is shown below
 */
#define MEGASAS_INT_CMDS
#define MEGASAS_SKINNY_INT_CMDS
#define MEGASAS_FUSION_INTERNAL_CMDS
#define MEGASAS_FUSION_IOCTL_CMDS
#define MEGASAS_MFI_IOCTL_CMDS

#define MEGASAS_MAX_MSIX_QUEUES
/*
 * FW can accept both 32 and 64 bit SGLs. We want to allocate 32/64 bit
 * SGLs based on the size of dma_addr_t
 */
#define IS_DMA64

#define MFI_XSCALE_OMR0_CHANGE_INTERRUPT

#define MFI_INTR_FLAG_REPLY_MESSAGE
#define MFI_INTR_FLAG_FIRMWARE_STATE_CHANGE
#define MFI_G2_OUTBOUND_DOORBELL_CHANGE_INTERRUPT

#define MFI_OB_INTR_STATUS_MASK
#define MFI_POLL_TIMEOUT_SECS
#define MFI_IO_TIMEOUT_SECS
#define MEGASAS_SRIOV_HEARTBEAT_INTERVAL_VF
#define MEGASAS_OCR_SETTLE_TIME_VF
#define MEGASAS_SRIOV_MAX_RESET_TRIES_VF
#define MEGASAS_ROUTINE_WAIT_TIME_VF
#define MFI_REPLY_1078_MESSAGE_INTERRUPT
#define MFI_REPLY_GEN2_MESSAGE_INTERRUPT
#define MFI_GEN2_ENABLE_INTERRUPT_MASK
#define MFI_REPLY_SKINNY_MESSAGE_INTERRUPT
#define MFI_SKINNY_ENABLE_INTERRUPT_MASK

#define MFI_1068_PCSR_OFFSET
#define MFI_1068_FW_HANDSHAKE_OFFSET
#define MFI_1068_FW_READY

#define MR_MAX_REPLY_QUEUES_OFFSET
#define MR_MAX_REPLY_QUEUES_EXT_OFFSET
#define MR_MAX_REPLY_QUEUES_EXT_OFFSET_SHIFT
#define MR_MAX_MSIX_REG_ARRAY
#define MR_RDPQ_MODE_OFFSET

#define MR_MAX_RAID_MAP_SIZE_OFFSET_SHIFT
#define MR_MAX_RAID_MAP_SIZE_MASK
#define MR_MIN_MAP_SIZE
/* 64k */

#define MR_CAN_HANDLE_SYNC_CACHE_OFFSET

#define MR_ATOMIC_DESCRIPTOR_SUPPORT_OFFSET

#define MR_CAN_HANDLE_64_BIT_DMA_OFFSET
#define MR_INTR_COALESCING_SUPPORT_OFFSET

#define MEGASAS_WATCHDOG_THREAD_INTERVAL
#define MEGASAS_WAIT_FOR_NEXT_DMA_MSECS
#define MEGASAS_WATCHDOG_WAIT_COUNT

enum MR_ADAPTER_TYPE {};

/*
* register set for both 1068 and 1078 controllers
* structure extended for 1078 registers
*/

struct megasas_register_set {} __attribute__ ((packed));

struct megasas_sge32 {} __attribute__ ((packed));

struct megasas_sge64 {} __attribute__ ((packed));

struct megasas_sge_skinny {} __packed;

megasas_sgl __attribute__ ((packed));

struct megasas_header {} __attribute__ ((packed));

megasas_sgl_frame __attribute__ ((packed));

MFI_CAPABILITIES;

struct megasas_init_frame {} __attribute__ ((packed));

struct megasas_init_queue_info {} __attribute__ ((packed));

struct megasas_io_frame {} __attribute__ ((packed));

struct megasas_pthru_frame {} __attribute__ ((packed));

struct megasas_dcmd_frame {} __attribute__ ((packed));

struct megasas_abort_frame {} __attribute__ ((packed));

struct megasas_smp_frame {} __attribute__ ((packed));

struct megasas_stp_frame {} __attribute__ ((packed));

megasas_frame;

/**
 * struct MR_PRIV_DEVICE - sdev private hostdata
 * @is_tm_capable: firmware managed tm_capable flag
 * @tm_busy: TM request is in progress
 * @sdev_priv_busy: pending command per sdev
 */
struct MR_PRIV_DEVICE {};
struct megasas_cmd;

megasas_evt_class_locale __attribute__ ((packed));

struct megasas_evt_log_info {} __attribute__ ((packed));

struct megasas_progress {} __attribute__ ((packed));

struct megasas_evtarg_ld {} __attribute__ ((packed));

struct megasas_evtarg_pd {} __attribute__ ((packed));

struct megasas_evt_detail {} __attribute__ ((packed));

struct megasas_aen_event {};

struct megasas_irq_context {};

struct MR_DRV_SYSTEM_INFO {};

enum MR_PD_TYPE {};

/* JBOD Queue depth definitions */
#define MEGASAS_SATA_QD
#define MEGASAS_SAS_QD
#define MEGASAS_DEFAULT_PD_QD
#define MEGASAS_NVME_QD

#define MR_DEFAULT_NVME_PAGE_SIZE
#define MR_DEFAULT_NVME_PAGE_SHIFT
#define MR_DEFAULT_NVME_MDTS_KB
#define MR_NVME_PAGE_SIZE_MASK

/*Aero performance parameters*/
#define MR_HIGH_IOPS_QUEUE_COUNT
#define MR_DEVICE_HIGH_IOPS_DEPTH
#define MR_HIGH_IOPS_BATCH_COUNT

enum MR_PERF_MODE {};

#define MEGASAS_PERF_MODE_2STR(mode)

enum MEGASAS_LD_TARGET_ID_STATUS {};

#define MEGASAS_TARGET_ID(sdev)

struct megasas_instance {};

struct MR_LD_VF_MAP {};

struct MR_LD_VF_AFFILIATION {};

/* Plasma 1.11 FW backward compatibility structures */
#define IOV_111_OFFSET
#define MAX_VIRTUAL_FUNCTIONS
#define MR_LD_ACCESS_HIDDEN

struct IOV_111 {};

struct MR_LD_VF_MAP_111 {};

struct MR_LD_VF_AFFILIATION_111 {};

struct MR_CTRL_HB_HOST_MEM {};

enum {};

struct megasas_instance_template {};

#define MEGASAS_IS_LOGICAL(sdev)

#define MEGASAS_IS_LUN_VALID(sdev)

#define MEGASAS_DEV_INDEX(scp)

#define MEGASAS_PD_INDEX(scp)

struct megasas_cmd {};

struct megasas_cmd_priv {};

static inline struct megasas_cmd_priv *megasas_priv(struct scsi_cmnd *cmd)
{}

#define MAX_MGMT_ADAPTERS
#define MAX_IOCTL_SGE

struct megasas_iocpacket {} __attribute__ ((packed));

struct megasas_aen {} __attribute__ ((packed));

struct compat_megasas_iocpacket {} __attribute__ ((packed));

#define MEGASAS_IOC_FIRMWARE32

#define MEGASAS_IOC_FIRMWARE
#define MEGASAS_IOC_GET_AEN

struct megasas_mgmt_info {};

enum MEGASAS_OCR_CAUSE {};

enum DCMD_RETURN_STATUS {};

u8
MR_BuildRaidContext(struct megasas_instance *instance,
		    struct IO_REQUEST_INFO *io_info,
		    struct RAID_CONTEXT *pRAID_Context,
		    struct MR_DRV_RAID_MAP_ALL *map, u8 **raidLUN);
u16 MR_TargetIdToLdGet(u32 ldTgtId, struct MR_DRV_RAID_MAP_ALL *map);
struct MR_LD_RAID *MR_LdRaidGet(u32 ld, struct MR_DRV_RAID_MAP_ALL *map);
u16 MR_ArPdGet(u32 ar, u32 arm, struct MR_DRV_RAID_MAP_ALL *map);
u16 MR_LdSpanArrayGet(u32 ld, u32 span, struct MR_DRV_RAID_MAP_ALL *map);
__le16 MR_PdDevHandleGet(u32 pd, struct MR_DRV_RAID_MAP_ALL *map);
u16 MR_GetLDTgtId(u32 ld, struct MR_DRV_RAID_MAP_ALL *map);

__le16 get_updated_dev_handle(struct megasas_instance *instance,
			      struct LD_LOAD_BALANCE_INFO *lbInfo,
			      struct IO_REQUEST_INFO *in_info,
			      struct MR_DRV_RAID_MAP_ALL *drv_map);
void mr_update_load_balance_params(struct MR_DRV_RAID_MAP_ALL *map,
	struct LD_LOAD_BALANCE_INFO *lbInfo);
int megasas_get_ctrl_info(struct megasas_instance *instance);
/* PD sequence */
int
megasas_sync_pd_seq_num(struct megasas_instance *instance, bool pend);
void megasas_set_dynamic_target_properties(struct scsi_device *sdev,
		struct queue_limits *lim, bool is_target_prop);
int megasas_get_target_prop(struct megasas_instance *instance,
			    struct scsi_device *sdev);
void megasas_get_snapdump_properties(struct megasas_instance *instance);

int megasas_set_crash_dump_params(struct megasas_instance *instance,
	u8 crash_buf_state);
void megasas_free_host_crash_buffer(struct megasas_instance *instance);

void megasas_return_cmd_fusion(struct megasas_instance *instance,
	struct megasas_cmd_fusion *cmd);
int megasas_issue_blocked_cmd(struct megasas_instance *instance,
	struct megasas_cmd *cmd, int timeout);
void __megasas_return_cmd(struct megasas_instance *instance,
	struct megasas_cmd *cmd);

void megasas_return_mfi_mpt_pthr(struct megasas_instance *instance,
	struct megasas_cmd *cmd_mfi, struct megasas_cmd_fusion *cmd_fusion);
int megasas_cmd_type(struct scsi_cmnd *cmd);
void megasas_setup_jbod_map(struct megasas_instance *instance);

void megasas_update_sdev_properties(struct scsi_device *sdev);
int megasas_reset_fusion(struct Scsi_Host *shost, int reason);
int megasas_task_abort_fusion(struct scsi_cmnd *scmd);
int megasas_reset_target_fusion(struct scsi_cmnd *scmd);
u32 mega_mod64(u64 dividend, u32 divisor);
int megasas_alloc_fusion_context(struct megasas_instance *instance);
void megasas_free_fusion_context(struct megasas_instance *instance);
int megasas_fusion_start_watchdog(struct megasas_instance *instance);
void megasas_fusion_stop_watchdog(struct megasas_instance *instance);

void megasas_set_dma_settings(struct megasas_instance *instance,
			      struct megasas_dcmd_frame *dcmd,
			      dma_addr_t dma_addr, u32 dma_len);
int megasas_adp_reset_wait_for_ready(struct megasas_instance *instance,
				     bool do_adp_reset,
				     int ocr_context);
int megasas_irqpoll(struct irq_poll *irqpoll, int budget);
void megasas_dump_fusion_io(struct scsi_cmnd *scmd);
u32 megasas_readl(struct megasas_instance *instance,
		  const volatile void __iomem *addr);
struct megasas_cmd *megasas_get_cmd(struct megasas_instance *instance);
void megasas_return_cmd(struct megasas_instance *instance,
			struct megasas_cmd *cmd);
int megasas_issue_polled(struct megasas_instance *instance,
			 struct megasas_cmd *cmd);
void megaraid_sas_kill_hba(struct megasas_instance *instance);
void megasas_check_and_restore_queue_depth(struct megasas_instance *instance);
void megasas_start_timer(struct megasas_instance *instance);
int megasas_sriov_start_heartbeat(struct megasas_instance *instance,
				  int initial);
int megasas_alloc_cmds(struct megasas_instance *instance);
void megasas_free_cmds(struct megasas_instance *instance);

void megasas_init_debugfs(void);
void megasas_exit_debugfs(void);
void megasas_setup_debugfs(struct megasas_instance *instance);
void megasas_destroy_debugfs(struct megasas_instance *instance);
int megasas_blk_mq_poll(struct Scsi_Host *shost, unsigned int queue_num);

#endif				/*LSI_MEGARAID_SAS_H */