linux/drivers/scsi/megaraid/mbox_defs.h

/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 *
 *			Linux MegaRAID Unified device driver
 *
 * Copyright (c) 2003-2004  LSI Logic Corporation.
 *
 * FILE		: mbox_defs.h
 */
#ifndef _MRAID_MBOX_DEFS_H_
#define _MRAID_MBOX_DEFS_H_

#include <linux/types.h>

/*
 * Commands and states for mailbox based controllers
 */

#define MBOXCMD_LREAD
#define MBOXCMD_LWRITE
#define MBOXCMD_PASSTHRU
#define MBOXCMD_ADPEXTINQ
#define MBOXCMD_ADAPTERINQ
#define MBOXCMD_LREAD64
#define MBOXCMD_LWRITE64
#define MBOXCMD_PASSTHRU64
#define MBOXCMD_EXTPTHRU

#define MAIN_MISC_OPCODE
#define GET_MAX_SG_SUPPORT
#define SUPPORT_EXT_CDB

#define FC_NEW_CONFIG
#define NC_SUBOP_PRODUCT_INFO
#define NC_SUBOP_ENQUIRY3
#define ENQ3_GET_SOLICITED_FULL
#define OP_DCMD_READ_CONFIG
#define NEW_READ_CONFIG_8LD
#define READ_CONFIG_8LD
#define FLUSH_ADAPTER
#define FLUSH_SYSTEM

/*
 * Command for random deletion of logical drives
 */
#define FC_DEL_LOGDRV
#define OP_SUP_DEL_LOGDRV
#define OP_GET_LDID_MAP
#define OP_DEL_LOGDRV

/*
 * BIOS commands
 */
#define IS_BIOS_ENABLED
#define GET_BIOS
#define CHNL_CLASS
#define GET_CHNL_CLASS
#define SET_CHNL_CLASS
#define CH_RAID
#define CH_SCSI
#define BIOS_PVT_DATA
#define GET_BIOS_PVT_DATA


/*
 * Commands to support clustering
 */
#define GET_TARGET_ID
#define CLUSTER_OP
#define GET_CLUSTER_MODE
#define CLUSTER_CMD
#define RESERVE_LD
#define RELEASE_LD
#define RESET_RESERVATIONS
#define RESERVATION_STATUS
#define RESERVE_PD
#define RELEASE_PD


/*
 * Module battery status
 */
#define BATTERY_MODULE_MISSING
#define BATTERY_LOW_VOLTAGE
#define BATTERY_TEMP_HIGH
#define BATTERY_PACK_MISSING
#define BATTERY_CHARGE_MASK
#define BATTERY_CHARGE_DONE
#define BATTERY_CHARGE_INPROG
#define BATTERY_CHARGE_FAIL
#define BATTERY_CYCLES_EXCEEDED

/*
 * Physical drive states.
 */
#define PDRV_UNCNF
#define PDRV_ONLINE
#define PDRV_FAILED
#define PDRV_RBLD
#define PDRV_HOTSPARE


/*
 * Raid logical drive states.
 */
#define RDRV_OFFLINE
#define RDRV_DEGRADED
#define RDRV_OPTIMAL
#define RDRV_DELETED

/*
 * Read, write and cache policies
 */
#define NO_READ_AHEAD
#define READ_AHEAD
#define ADAP_READ_AHEAD
#define WRMODE_WRITE_THRU
#define WRMODE_WRITE_BACK
#define CACHED_IO
#define DIRECT_IO

#define MAX_LOGICAL_DRIVES_8LD
#define MAX_LOGICAL_DRIVES_40LD
#define FC_MAX_PHYSICAL_DEVICES
#define MAX_MBOX_CHANNELS
#define MAX_MBOX_TARGET
#define MBOX_MAX_PHYSICAL_DRIVES
#define MAX_ROW_SIZE_40LD
#define MAX_ROW_SIZE_8LD
#define SPAN_DEPTH_8_SPANS
#define SPAN_DEPTH_4_SPANS
#define MAX_REQ_SENSE_LEN



/**
 * struct mbox_t - Driver and f/w handshake structure.
 * @cmd		: firmware command
 * @cmdid	: command id
 * @numsectors	: number of sectors to be transferred
 * @lba		: Logical Block Address on LD
 * @xferaddr	: DMA address for data transfer
 * @logdrv	: logical drive number
 * @numsge	: number of scatter gather elements in sg list
 * @resvd	: reserved
 * @busy	: f/w busy, must wait to issue more commands.
 * @numstatus	: number of commands completed.
 * @status	: status of the commands completed
 * @completed	: array of completed command ids.
 * @poll	: poll and ack sequence
 * @ack		: poll and ack sequence
 *
 * The central handshake structure between the driver and the firmware. This
 * structure must be allocated by the driver and aligned at 8-byte boundary.
 */
#define MBOX_MAX_FIRMWARE_STATUS
mbox_t;


/**
 * mbox64_t - 64-bit extension for the mailbox
 * @segment_lo	: the low 32-bits of the address of the scatter-gather list
 * @segment_hi	: the upper 32-bits of the address of the scatter-gather list
 * @mbox	: 32-bit mailbox, whose xferadder field must be set to
 *		0xFFFFFFFF
 *
 * This is the extension of the 32-bit mailbox to be able to perform DMA
 * beyond 4GB address range.
 */
mbox64_t;

/*
 * mailbox structure used for internal commands
 */
int_mbox_t;

/**
 * mraid_passthru_t - passthru structure to issue commands to physical devices
 * @timeout		: command timeout, 0=6sec, 1=60sec, 2=10min, 3=3hr
 * @ars			: set if ARS required after check condition
 * @islogical		: set if command meant for logical devices
 * @logdrv		: logical drive number if command for LD
 * @channel		: Channel on which physical device is located
 * @target		: SCSI target of the device
 * @queuetag		: unused
 * @queueaction		: unused
 * @cdb			: SCSI CDB
 * @cdblen		: length of the CDB
 * @reqsenselen		: amount of request sense data to be returned
 * @reqsensearea	: Sense information buffer
 * @numsge		: number of scatter-gather elements in the sg list
 * @scsistatus		: SCSI status of the command completed.
 * @dataxferaddr	: DMA data transfer address
 * @dataxferlen		: amount of the data to be transferred.
 */
mraid_passthru_t;

mega_passthru64_t;

/**
 * mraid_epassthru_t - passthru structure to issue commands to physical devices
 * @timeout		: command timeout, 0=6sec, 1=60sec, 2=10min, 3=3hr
 * @ars			: set if ARS required after check condition
 * @rsvd1		: reserved field
 * @cd_rom		: (?)
 * @rsvd2		: reserved field
 * @islogical		: set if command meant for logical devices
 * @logdrv		: logical drive number if command for LD
 * @channel		: Channel on which physical device is located
 * @target		: SCSI target of the device
 * @queuetag		: unused
 * @queueaction		: unused
 * @cdblen		: length of the CDB
 * @rsvd3		: reserved field
 * @cdb			: SCSI CDB
 * @numsge		: number of scatter-gather elements in the sg list
 * @status		: SCSI status of the command completed.
 * @reqsenselen		: amount of request sense data to be returned
 * @reqsensearea	: Sense information buffer
 * @rsvd4		: reserved field
 * @dataxferaddr	: DMA data transfer address
 * @dataxferlen		: amount of the data to be transferred.
 */
mraid_epassthru_t;


/**
 * mraid_pinfo_t - product info, static information about the controller
 * @data_size		: current size in bytes (not including resvd)
 * @config_signature	: Current value is 0x00282008
 * @fw_version		: Firmware version
 * @bios_version	: version of the BIOS
 * @product_name	: Name given to the controller
 * @max_commands	: Maximum concurrent commands supported
 * @nchannels		: Number of SCSI Channels detected
 * @fc_loop_present	: Number of Fibre Loops detected
 * @mem_type		: EDO, FPM, SDRAM etc
 * @signature		:
 * @dram_size		: In terms of MB
 * @subsysid		: device PCI subsystem ID
 * @subsysvid		: device PCI subsystem vendor ID
 * @notify_counters	:
 * @pad1k		: 135 + 889 resvd = 1024 total size
 *
 * This structures holds the information about the controller which is not
 * expected to change dynamically.
 *
 * The current value of config signature is 0x00282008:
 * 0x28 = MAX_LOGICAL_DRIVES,
 * 0x20 = Number of stripes and
 * 0x08 = Number of spans
 */
mraid_pinfo_t;


/**
 * mraid_notify_t - the notification structure
 * @global_counter		: Any change increments this counter
 * @param_counter		: Indicates any params changed
 * @param_id			: Param modified - defined below
 * @param_val			: New val of last param modified
 * @write_config_counter	: write config occurred
 * @write_config_rsvd		:
 * @ldrv_op_counter		: Indicates ldrv op started/completed
 * @ldrv_opid			: ldrv num
 * @ldrv_opcmd			: ldrv operation - defined below
 * @ldrv_opstatus		: status of the operation
 * @ldrv_state_counter		: Indicates change of ldrv state
 * @ldrv_state_id		: ldrv num
 * @ldrv_state_new		: New state
 * @ldrv_state_old		: old state
 * @pdrv_state_counter		: Indicates change of ldrv state
 * @pdrv_state_id		: pdrv id
 * @pdrv_state_new		: New state
 * @pdrv_state_old		: old state
 * @pdrv_fmt_counter		: Indicates pdrv format started/over
 * @pdrv_fmt_id			: pdrv id
 * @pdrv_fmt_val		: format started/over
 * @pdrv_fmt_rsvd		:
 * @targ_xfer_counter		: Indicates SCSI-2 Xfer rate change
 * @targ_xfer_id		: pdrv Id
 * @targ_xfer_val		: new Xfer params of last pdrv
 * @targ_xfer_rsvd		:
 * @fcloop_id_chg_counter	: Indicates loopid changed
 * @fcloopid_pdrvid		: pdrv id
 * @fcloop_id0			: loopid on fc loop 0
 * @fcloop_id1			: loopid on fc loop 1
 * @fcloop_state_counter	: Indicates loop state changed
 * @fcloop_state0		: state of fc loop 0
 * @fcloop_state1		: state of fc loop 1
 * @fcloop_state_rsvd		:
 */
mraid_notify_t;


/**
 * mraid_inquiry3_t - enquiry for device information
 *
 * @data_size		: current size in bytes (not including resvd)
 * @notify		:
 * @notify_rsvd		:
 * @rebuild_rate	: rebuild rate (0% - 100%)
 * @cache_flush_int	: cache flush interval in seconds
 * @sense_alert		:
 * @drive_insert_count	: drive insertion count
 * @battery_status	:
 * @num_ldrv		: no. of Log Drives configured
 * @recon_state		: state of reconstruct
 * @ldrv_op_status	: logdrv Status
 * @ldrv_size		: size of each log drv
 * @ldrv_prop		:
 * @ldrv_state		: state of log drives
 * @pdrv_state		: state of phys drvs.
 * @pdrv_format		:
 * @targ_xfer		: phys device transfer rate
 * @pad1k		: 761 + 263reserved = 1024 bytes total size
 */
#define MAX_NOTIFY_SIZE
#define CUR_NOTIFY_SIZE

mraid_inquiry3_t;


/**
 * mraid_adapinfo_t - information about the adapter
 * @max_commands		: max concurrent commands supported
 * @rebuild_rate		: rebuild rate - 0% thru 100%
 * @max_targ_per_chan		: max targ per channel
 * @nchannels			: number of channels on HBA
 * @fw_version			: firmware version
 * @age_of_flash		: number of times FW has been flashed
 * @chip_set_value		: contents of 0xC0000832
 * @dram_size			: in MB
 * @cache_flush_interval	: in seconds
 * @bios_version		:
 * @board_type			:
 * @sense_alert			:
 * @write_config_count		: increase with every configuration change
 * @drive_inserted_count	: increase with every drive inserted
 * @inserted_drive		: channel:Id of inserted drive
 * @battery_status		: bit 0: battery module missing
 *				bit 1: VBAD
 *				bit 2: temperature high
 *				bit 3: battery pack missing
 *				bit 4,5:
 *					00 - charge complete
 *					01 - fast charge in progress
 *					10 - fast charge fail
 *					11 - undefined
 *				bit 6: counter > 1000
 *				bit 7: Undefined
 * @dec_fault_bus_info		:
 */
mraid_adapinfo_t;


/**
 * mraid_ldrv_info_t - information about the logical drives
 * @nldrv	: Number of logical drives configured
 * @rsvd	:
 * @size	: size of each logical drive
 * @prop	:
 * @state	: state of each logical drive
 */
mraid_ldrv_info_t;


/**
 * mraid_pdrv_info_t - information about the physical drives
 * @pdrv_state	: state of each physical drive
 */
mraid_pdrv_info_t;


/**
 * mraid_inquiry_t - RAID inquiry, mailbox command 0x05
 * @mraid_adapinfo_t	: adapter information
 * @mraid_ldrv_info_t	: logical drives information
 * @mraid_pdrv_info_t	: physical drives information
 */
mraid_inquiry_t;


/**
 * mraid_extinq_t - RAID extended inquiry, mailbox command 0x04
 *
 * @raid_inq		: raid inquiry
 * @phys_drv_format	:
 * @stack_attn		:
 * @modem_status	:
 * @rsvd		:
 */
mraid_extinq_t;


/**
 * adap_device_t - device information
 * @channel	: channel fpor the device
 * @target	: target ID of the device
 */
adap_device_t;


/**
 * adap_span_40ld_t - 40LD span
 * @start_blk	: starting block
 * @num_blks	: number of blocks
 */
adap_span_40ld_t;


/**
 * adap_span_8ld_t - 8LD span
 * @start_blk	: starting block
 * @num_blks	: number of blocks
 */
adap_span_8ld_t;


/**
 * logdrv_param_t - logical drives parameters
 *
 * @span_depth	: total number of spans
 * @level	: RAID level
 * @read_ahead	: read ahead, no read ahead, adaptive read ahead
 * @stripe_sz	: encoded stripe size
 * @status	: status of the logical drive
 * @write_mode	: write mode, write_through/write_back
 * @direct_io	: direct io or through cache
 * @row_size	: number of stripes in a row
 */
logdrv_param_t;


/**
 * logdrv_40ld_t - logical drive definition for 40LD controllers
 * @lparam	: logical drives parameters
 * @span	: span
 */
logdrv_40ld_t;


/**
 * logdrv_8ld_span8_t - logical drive definition for 8LD controllers
 * @lparam	: logical drives parameters
 * @span	: span
 *
 * 8-LD logical drive with up to 8 spans
 */
logdrv_8ld_span8_t;


/**
 * logdrv_8ld_span4_t - logical drive definition for 8LD controllers
 * @lparam	: logical drives parameters
 * @span	: span
 *
 * 8-LD logical drive with up to 4 spans
 */
logdrv_8ld_span4_t;


/**
 * phys_drive_t - physical device information
 * @type	: Type of the device
 * @cur_status	: current status of the device
 * @tag_depth	: Level of tagging
 * @sync_neg	: sync negotiation - ENABLE or DISABLE
 * @size	: configurable size in terms of 512 byte
 */
phys_drive_t;


/**
 * disk_array_40ld_t - disk array for 40LD controllers
 * @numldrv	: number of logical drives
 * @resvd	:
 * @ldrv	: logical drives information
 * @pdrv	: physical drives information
 */
disk_array_40ld_t;


/**
 * disk_array_8ld_span8_t - disk array for 8LD controllers
 * @numldrv	: number of logical drives
 * @resvd	:
 * @ldrv	: logical drives information
 * @pdrv	: physical drives information
 *
 * Disk array for 8LD logical drives with up to 8 spans
 */
disk_array_8ld_span8_t;


/**
 * disk_array_8ld_span4_t - disk array for 8LD controllers
 * @numldrv	: number of logical drives
 * @resvd	:
 * @ldrv	: logical drives information
 * @pdrv	: physical drives information
 *
 * Disk array for 8LD logical drives with up to 4 spans
 */
disk_array_8ld_span4_t;


/**
 * struct private_bios_data - bios private data for boot devices
 * @geometry	: bits 0-3 - BIOS geometry, 0x0001 - 1GB, 0x0010 - 2GB,
 *		0x1000 - 8GB, Others values are invalid
 * @unused	: bits 4-7 are unused
 * @boot_drv	: logical drive set as boot drive, 0..7 - for 8LD cards,
 * 		0..39 - for 40LD cards
 * @cksum	: 0-(sum of first 13 bytes of this structure)
 */
struct private_bios_data {} __attribute__ ((packed));


/**
 * mbox_sgl64 - 64-bit scatter list for mailbox based controllers
 * @address	: address of the buffer
 * @length	: data transfer length
 */
mbox_sgl64;

/**
 * mbox_sgl32 - 32-bit scatter list for mailbox based controllers
 * @address	: address of the buffer
 * @length	: data transfer length
 */
mbox_sgl32;

#endif		// _MRAID_MBOX_DEFS_H_