mptsas_var.h revision 96c4a178a18cd52ee5001195f1552d9cef0c38f0
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* Copyright (c) 2000 to 2009, LSI Corporation.
* All rights reserved.
*
* Redistribution and use in source and binary forms of all code within
* this file that is exclusively owned by LSI, with or without
* modification, is permitted provided that, in addition to the CDDL 1.0
* License requirements, the following conditions are met:
*
* Neither the name of the author nor the names of its contributors may be
* used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*/
#ifndef _SYS_SCSI_ADAPTERS_MPTVAR_H
#define _SYS_SCSI_ADAPTERS_MPTVAR_H
#include <sys/byteorder.h>
#include <sys/isa_defs.h>
#include <sys/mdi_impldefs.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* Compile options
*/
#ifdef DEBUG
#define MPTSAS_DEBUG /* turn on debugging code */
#endif /* DEBUG */
#define MPTSAS_INITIAL_SOFT_SPACE 4
#define MAX_MPI_PORTS 16
#define MPTSAS_MAX_PHYS 8
#define MPTSAS_INVALID_DEVHDL 0xffff
/*
* MPT HW defines
*/
#define MPTSAS_MAX_DISKS_IN_CONFIG 14
#define MPTSAS_MAX_DISKS_IN_VOL 10
#define MPTSAS_MAX_HOTSPARES 2
#define MPTSAS_MAX_RAIDVOLS 2
#define MPTSAS_MAX_RAIDCONFIGS 5
/*
* 64-bit SAS WWN is displayed as 16 characters as HEX characters,
* plus one means the end of the string '\0'.
*/
#define MPTSAS_MAX_GUID_LEN 64
/*
* DMA routine flags
*/
#define MPTSAS_DMA_HANDLE_ALLOCD 0x2
#define MPTSAS_DMA_MEMORY_ALLOCD 0x4
#define MPTSAS_DMA_HANDLE_BOUND 0x8
/*
* If the HBA supports DMA or bus-mastering, you may have your own
* scatter-gather list for physically non-contiguous memory in one
* I/O operation; if so, there's probably a size for that list.
* It must be placed in the ddi_dma_lim_t structure, so that the system
* DMA-support routines can use it to break up the I/O request, so we
* define it here.
*/
#if defined(__sparc)
#define MPTSAS_MAX_DMA_SEGS 1
#define MPTSAS_MAX_CMD_SEGS 1
#else
#define MPTSAS_MAX_DMA_SEGS 256
#define MPTSAS_MAX_CMD_SEGS 257
#endif
#define MPTSAS_MAX_FRAME_SGES(mpt) \
/*
* Caculating how many 64-bit DMA simple elements can be stored in the first
* frame. Note that msg_scsi_io_request contains 2 double-words (8 bytes) for
* element storage. And 64-bit dma element is 3 double-words (12 bytes) in
* size.
*/
#define MPTSAS_MAX_FRAME_SGES64(mpt) \
((mpt->m_req_frame_size - \
/*
* Scatter-gather list structure defined by HBA hardware
*/
typedef struct NcrTableIndirect { /* Table Indirect entries */
union {
struct {
} address64; /* 64 bit address */
} addr;
} mptti_t;
/*
* preferred pkt_private length in 64-bit quantities
*/
#ifdef _LP64
#define PKT_PRIV_SIZE 2
#else /* _ILP32 */
#define PKT_PRIV_SIZE 1
#endif
#define EXTCMDS_STATUS_SIZE (sizeof (struct scsi_arq_status))
/*
* get offset of item in structure
*/
/*
* WWID provided by LSI firmware is generated by firmware but the WWID is not
* IEEE NAA standard format, OBP has no chance to distinguish format of unit
* address. According LSI's confirmation, the top nibble of RAID WWID is
* meanless, so the consensus between Solaris and OBP is to replace top nibble
* of WWID provided by LSI to "3" always to hint OBP that this is a RAID WWID
* format unit address.
*/
#define MPTSAS_RAID_WWID(wwid) \
typedef struct mptsas_target {
/*
* m_dr_flag is a flag for DR, make sure the member
* take the place of dr_flag of mptsas_hash_data.
*/
typedef struct mptsas_smp {
} mptsas_smp_t;
typedef struct mptsas_hash_data {
typedef struct mptsas_cache_frames {
typedef struct mptsas_cmd {
struct buf *cmd_arq_buf;
struct buf *cmd_ext_arq_buf;
int cmd_pkt_flags;
/* timer for command in active slot */
int cmd_active_timeout;
struct scsi_arq_status cmd_scb;
struct mptsas_cmd *cmd_linkp;
} mptsas_cmd_t;
/*
* These are the defined cmd_flags for this structure.
*/
#define MPTSAS_SCSI_REPORTLUNS_ADDRESS_SIZE 8
#define MPTSAS_SCSI_REPORTLUNS_ADDRESS_MASK 0xC0
#define MPTSAS_SCSI_REPORTLUNS_ADDRESS_PERIPHERAL 0x00
#define MPTSAS_SCSI_REPORTLUNS_ADDRESS_FLAT_SPACE 0x40
#define MPTSAS_SCSI_REPORTLUNS_ADDRESS_LOGICAL_UNIT 0x80
#define MPTSAS_SCSI_REPORTLUNS_ADDRESS_EXTENDED_UNIT 0xC0
#define MPTSAS_SCSI_REPORTLUNS_ADDRESS_LOGICAL_UNIT_2B 0x00
#define MPTSAS_SCSI_REPORTLUNS_ADDRESS_LOGICAL_UNIT_4B 0x01
#define MPTSAS_SCSI_REPORTLUNS_ADDRESS_LOGICAL_UNIT_6B 0x10
#define MPTSAS_SCSI_REPORTLUNS_ADDRESS_LOGICAL_UNIT_8B 0x20
#define MPTSAS_SCSI_REPORTLUNS_ADDRESS_LOGICAL_UNIT_SIZE 0x30
#define MPTSAS_HASH_ARRAY_SIZE 16
/*
* hash table definition
*/
#define MPTSAS_HASH_FIRST 0xffff
#define MPTSAS_HASH_NEXT 0x0000
/*
* passthrough request structure
*/
typedef struct mptsas_pt_request {
/*
* config page request structure
*/
typedef struct mptsas_config_request {
typedef struct mptsas_hash_node {
void *data;
struct mptsas_hash_node *next;
typedef struct mptsas_hash_table {
/*
* last position in traverse
*/
struct mptsas_hash_node *cur;
/*
* RAID volume information
*/
typedef struct mptsas_raidvol {
int m_raidlevel;
int m_ndisks;
/*
* RAID configurations
*/
typedef struct mptsas_raidconfig {
/*
* Structure to hold active outstanding cmds. Also, keep
* timeout on a per target basis.
*/
typedef struct mptsas_slots {
/*
* Structure to hold command and packets for event ack
* and task management commands.
*/
typedef struct m_event_struct {
struct mptsas_cmd m_event_cmd;
struct m_event_struct *m_event_linkp;
/*
* event member record the failure event and eventcntx
* event member would be used in send ack pending process
*/
/* ... scsi_pkt_size() */
#define M_EVENT_STRUCT_SIZE (sizeof (m_event_struct_t) - \
sizeof (struct scsi_pkt) + scsi_pkt_size())
#define MAX_IOC_COMMANDS 8
/*
* A pool of MAX_IOC_COMMANDS is maintained for event ack commands.
* A new event ack command requests mptsas_cmd and scsi_pkt structures
* from this pool, and returns it back when done.
*/
typedef struct m_replyh_arg {
void *mpt;
/*
* Flags for DR handler topology change
*/
#define MPTSAS_TOPO_FLAG_DIRECT_ATTACHED_DEVICE 0x0
#define MPTSAS_TOPO_FLAG_EXPANDER_ASSOCIATED 0x1
#define MPTSAS_TOPO_FLAG_LUN_ASSOCIATED 0x2
#define MPTSAS_TOPO_FLAG_RAID_ASSOCIATED 0x4
#define MPTSAS_TOPO_FLAG_RAID_PHYSDRV_ASSOCIATED 0x8
#define MPTSAS_TOPO_FLAG_EXPANDER_ATTACHED_DEVICE 0x10
typedef struct mptsas_topo_change_list {
void *mpt;
union {
} un;
void *object;
struct mptsas_topo_change_list *next;
/*
* Status types when calling mptsas_get_target_device_info
*/
#define DEV_INFO_SUCCESS 0x0
#define DEV_INFO_FAIL_PAGE0 0x1
#define DEV_INFO_WRONG_DEVICE_TYPE 0x2
#define DEV_INFO_PHYS_DISK 0x3
#define DEV_INFO_FAIL_ALLOC 0x4
/*
* mpt hotplug event defines
*/
#define MPTSAS_DR_EVENT_RECONFIG_TARGET 0x01
#define MPTSAS_DR_EVENT_OFFLINE_TARGET 0x02
#define MPTSAS_TOPO_FLAG_REMOVE_HANDLE 0x04
/*
* SMP target hotplug events
*/
#define MPTSAS_DR_EVENT_RECONFIG_SMP 0x10
#define MPTSAS_DR_EVENT_OFFLINE_SMP 0x20
#define MPTSAS_DR_EVENT_MASK 0x3F
/*
* mpt hotplug status definition for m_dr_flag
*/
/*
* MPTSAS_DR_INACTIVE
*
* The target is in a normal operating state.
* No dynamic reconfiguration operation is in progress.
*/
#define MPTSAS_DR_INACTIVE 0x0
/*
* MPTSAS_DR_INTRANSITION
*
* The target is in a transition mode since
* hotplug event happens and offline procedure has not
* been finished
*/
#define MPTSAS_DR_INTRANSITION 0x1
typedef struct mptsas_tgt_private {
int t_lun;
struct mptsas_target *t_private;
/*
* The following defines are used in mptsas_set_init_mode to track the current
* state as we progress through reprogramming the HBA from target mode into
* initiator mode.
*/
#define IOUC_READ_PAGE0 0x00000100
#define IOUC_READ_PAGE1 0x00000200
#define IOUC_WRITE_PAGE1 0x00000400
#define IOUC_DONE 0x00000800
/*
* Last allocated slot is used for TM requests. Since only m_max_requests
* frames are allocated, the last SMID will be m_max_requests - 1.
*/
#define MPTSAS_SLOTS_SIZE(mpt) \
(sizeof (struct mptsas_slots) + (sizeof (struct mptsas_cmd *) * \
/*
* Macro for phy_flags
*/
typedef struct mptsas_phy_info {
typedef struct mptsas_doneq_thread_arg {
void *mpt;
uint64_t t;
#define MPTSAS_DONEQ_THREAD_ACTIVE 0x1
typedef struct mptsas_doneq_thread_list {
typedef struct mptsas {
int m_instance;
/*
* soft state flags
*/
int m_tx_draining; /* TX queue draining flag */
/*
* variables for helper threads (fan-out interrupts)
*/
int m_ncmds; /* number of outstanding commands */
struct _MPI2_SYSTEM_INTERFACE_REGS *m_reg;
/*
* list of reset notification requests
*/
/*
* qfull handling
*/
/*
* scsi reset delay per bus
*/
int m_pm_idle_delay;
struct kmem_cache *m_kmem_cache;
struct kmem_cache *m_cache_frames;
/*
* hba options.
*/
int m_in_callback;
int m_power_level; /* current power level */
int m_busy; /* power management busy state */
/*
*/
/*
* Max frames per request reprted in IOC Facts
*/
/*
* Max frames per request which is used in reality. It's adjusted
* according DMA SG length attribute, and shall not exceed the
* m_max_chain_depth.
*/
/*
* indicates if the firmware was upload by the driver
* at boot time
*/
/*
* per instance data structures for dma memory resources for
* MPI handshake protocol. only one handshake cmd can run at a time.
*/
/* Firmware version on the card at boot time */
/* MSI specific fields */
int m_intr_type; /* What type of interrupt */
int m_intr_cnt; /* # of intrs count returned */
int m_intr_cap; /* Interrupt capabilities */
/* SAS specific information */
union {
struct {
#ifdef _BIG_ENDIAN
#else
#endif
} sasaddr;
} un;
/* FMA Capabilities */
int m_fm_capabilities;
int m_mpxio_enable;
/*
* Event recording
*/
/*
* per instance cmd data structures for task management cmds
*/
/* ... scsi_pkt_size */
} mptsas_t;
#define MPTSAS_SIZE (sizeof (struct mptsas) - \
sizeof (struct scsi_pkt) + scsi_pkt_size())
/*
* Only one of below two conditions is satisfied, we
* think the target is associated to the iport and
* allow call into mptsas_probe_lun().
* 1. physicalsport == physport
* 2. (phymask & (1 << physport)) == 0
* The condition #2 is because LSI uses lowest PHY
* number as the value of physical port when auto port
* configuration.
*/
(1 << physport))))
typedef struct mptsas_dma_alloc_state
{
/*
* These should eventually migrate into the mpt header files
*/
#define MPTSAS_ENABLE_DRWE(hdl) \
/*
* m_options flags
*/
/*
* m_softstate flags
*/
#define MPTSAS_SS_DRAINING 0x02
#define MPTSAS_SS_QUIESCED 0x04
#define MPTSAS_SS_MSG_UNIT_RESET 0x08
/*
* regspec defines.
*/
#define CONFIG_SPACE 0 /* regset[0] - configuration space */
/*
* Handy constants
*/
#define FALSE 0
#define TRUE 1
#define UNDEFINED -1
#define FAILED -2
/*
* power management.
*/
#define MPTSAS_POWER_ON(mpt) { \
PCI_PMCSR_D0); \
}
#define MPTSAS_POWER_OFF(mpt) { \
PCI_PMCSR_D3HOT); \
}
/*
* inq_dtype:
* Bits 5 through 7 are the Peripheral Device Qualifier
* 001b: device not connected to the LUN
* Bits 0 through 4 are the Peripheral Device Type
* 1fh: Unknown or no device type
*
* Although the inquiry may return success, the following value
* means no valid LUN connected.
*/
#define MPTSAS_VALID_LUN(sd_inq) \
/*
* Default is to have 10 retries on receiving QFULL status and
* each retry to be after 100 ms.
*/
#define QFULL_RETRIES 10
#define QFULL_RETRY_INTERVAL 100
/*
* Handy macros
*/
((n) >= 'a' && (n) <= 'f') || ((n) >= 'A' && (n) <= 'F'))
/*
* poll time for mptsas_pollret() and mptsas_wait_intr()
*/
/*
* default time for mptsas_do_passthru
*/
/*
* macro for getting value in micro-seconds since last boot to be used as
* timeout in cv_timedwait call.
*/
/*
* macro to return the effective address of a given per-target field
*/
#define MPTSAS_SET_SIGP(P) \
req_desc_lo);\
#define INTPENDING(mpt) \
/*
* Mask all interrupts to disable
*/
#define MPTSAS_DISABLE_INTR(mpt) \
/*
* Mask Doorbell and Reset interrupts to enable reply desc int.
*/
#define MPTSAS_ENABLE_INTR(mpt) \
/* If the queue is now empty fix the tail pointer */ \
}
/* If the queue is now empty fix the tail pointer */ \
}
/*
* defaults for the global properties
*/
#define DEFAULT_SCSI_OPTIONS SCSI_OPTIONS_DR
#define DEFAULT_TAG_AGE_LIMIT 2
#define DEFAULT_WD_TICK 10
/*
* invalid hostid.
*/
#define MPTSAS_INVALID_HOSTID -1
/*
*/
/*
* Config space.
*/
#define MPTSAS_LATENCY_TIMER 0x40
/*
* Offset to firmware version
*/
#define MPTSAS_FW_VERSION_OFFSET 9
/*
* Offset and masks to get at the ProductId field
*/
#define MPTSAS_FW_PRODUCTID_OFFSET 8
#define MPTSAS_FW_PRODUCTID_MASK 0xFFFF0000
#define MPTSAS_FW_PRODUCTID_SHIFT 16
/*
* Subsystem ID for HBAs.
*/
#define MPTSAS_HBA_SUBSYSTEM_ID 0x10C0
#define MPTSAS_RHEA_SUBSYSTEM_ID 0x10B0
/*
* reset delay tick
*/
/*
* Ioc reset return values
*/
#define MPTSAS_RESET_FAIL -1
#define MPTSAS_NO_RESET 0
#define MPTSAS_SUCCESS_HARDRESET 1
/*
* throttle support.
*/
#define MAX_THROTTLE 32
#define HOLD_THROTTLE 0
#define DRAIN_THROTTLE -1
#define QFULL_THROTTLE -2
/*
* Passthrough/config request flags
*/
#define MPTSAS_DATA_ALLOCATED 0x0001
#define MPTSAS_DATAOUT_ALLOCATED 0x0002
#define MPTSAS_REQUEST_POOL_CMD 0x0004
#define MPTSAS_ADDRESS_REPLY 0x0008
#define MPTSAS_CMD_TIMEOUT 0x0010
/*
* response code tlr flag
*/
#define MPTSAS_SCSI_RESPONSE_CODE_TLR_OFF 0x02
/*
* System Events
*/
#ifndef DDI_VENDOR_LSI
#define DDI_VENDOR_LSI "LSI"
#endif /* DDI_VENDOR_LSI */
/*
* Shared functions
*/
int mptsas_download_firmware();
int mptsas_can_download_firmware();
/*
* impl functions
*/
/*
* init functions
*/
/*
* configuration pages operation
*/
mptsas_smp_t *info);
/*
* RAID functions
*/
/*
* debugging.
*/
#if defined(MPTSAS_DEBUG)
void mptsas_printf(char *fmt, ...);
#define MPTSAS_DBGPR(m, args) \
if (mptsas_debug_flags & (m)) \
#else /* ! defined(MPTSAS_DEBUG) */
#define MPTSAS_DBGPR(m, args)
#endif /* defined(MPTSAS_DEBUG) */
/*
* auto request sense
*/
#ifdef __cplusplus
}
#endif
#endif /* _SYS_SCSI_ADAPTERS_MPTVAR_H */