summaryrefslogtreecommitdiffstats
path: root/sys/dev/mrsas/mrsas.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/mrsas/mrsas.h')
-rw-r--r--sys/dev/mrsas/mrsas.h124
1 files changed, 114 insertions, 10 deletions
diff --git a/sys/dev/mrsas/mrsas.h b/sys/dev/mrsas/mrsas.h
index 2c2a341..672b177 100644
--- a/sys/dev/mrsas/mrsas.h
+++ b/sys/dev/mrsas/mrsas.h
@@ -106,7 +106,7 @@ __FBSDID("$FreeBSD$");
*/
#define BYTE_ALIGNMENT 1
#define MRSAS_MAX_NAME_LENGTH 32
-#define MRSAS_VERSION "06.709.07.00-fbsd"
+#define MRSAS_VERSION "06.712.04.00-fbsd"
#define MRSAS_ULONG_MAX 0xFFFFFFFFFFFFFFFF
#define MRSAS_DEFAULT_TIMEOUT 0x14 /* Temporarily set */
#define DONE 0
@@ -205,7 +205,9 @@ typedef struct _RAID_CONTEXT {
#define MPI2_SCSIIO_EEDPFLAGS_CHECK_GUARD (0x0100)
#define MPI2_SCSIIO_EEDPFLAGS_INSERT_OP (0x0004)
#define MPI2_FUNCTION_SCSI_IO_REQUEST (0x00) /* SCSI IO */
-#define MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY (0x06)
+#define MPI2_FUNCTION_SCSI_TASK_MGMT (0x01)
+#define MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY (0x03)
+#define MPI2_REQ_DESCRIPT_FLAGS_FP_IO (0x06)
#define MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO (0x00)
#define MPI2_SGE_FLAGS_64_BIT_ADDRESSING (0x02)
#define MPI2_SCSIIO_CONTROL_WRITE (0x01000000)
@@ -314,6 +316,91 @@ typedef union {
} MPI2_SCSI_IO_CDB_UNION, MPI2_POINTER PTR_MPI2_SCSI_IO_CDB_UNION,
Mpi2ScsiIoCdb_t, MPI2_POINTER pMpi2ScsiIoCdb_t;
+/****************************************************************************
+ * * SCSI Task Management messages
+ * ****************************************************************************/
+
+/*SCSI Task Management Request Message */
+typedef struct _MPI2_SCSI_TASK_MANAGE_REQUEST {
+ u_int16_t DevHandle; /*0x00 */
+ u_int8_t ChainOffset; /*0x02 */
+ u_int8_t Function; /*0x03 */
+ u_int8_t Reserved1; /*0x04 */
+ u_int8_t TaskType; /*0x05 */
+ u_int8_t Reserved2; /*0x06 */
+ u_int8_t MsgFlags; /*0x07 */
+ u_int8_t VP_ID; /*0x08 */
+ u_int8_t VF_ID; /*0x09 */
+ u_int16_t Reserved3; /*0x0A */
+ u_int8_t LUN[8]; /*0x0C */
+ u_int32_t Reserved4[7]; /*0x14 */
+ u_int16_t TaskMID; /*0x30 */
+ u_int16_t Reserved5; /*0x32 */
+} MPI2_SCSI_TASK_MANAGE_REQUEST;
+
+/*SCSI Task Management Reply Message */
+typedef struct _MPI2_SCSI_TASK_MANAGE_REPLY {
+ u_int16_t DevHandle; /*0x00 */
+ u_int8_t MsgLength; /*0x02 */
+ u_int8_t Function; /*0x03 */
+ u_int8_t ResponseCode; /*0x04 */
+ u_int8_t TaskType; /*0x05 */
+ u_int8_t Reserved1; /*0x06 */
+ u_int8_t MsgFlags; /*0x07 */
+ u_int8_t VP_ID; /*0x08 */
+ u_int8_t VF_ID; /*0x09 */
+ u_int16_t Reserved2; /*0x0A */
+ u_int16_t Reserved3; /*0x0C */
+ u_int16_t IOCStatus; /*0x0E */
+ u_int32_t IOCLogInfo; /*0x10 */
+ u_int32_t TerminationCount; /*0x14 */
+ u_int32_t ResponseInfo; /*0x18 */
+} MPI2_SCSI_TASK_MANAGE_REPLY;
+
+typedef struct _MR_TM_REQUEST {
+ char request[128];
+} MR_TM_REQUEST;
+
+typedef struct _MR_TM_REPLY {
+ char reply[128];
+} MR_TM_REPLY;
+
+/* SCSI Task Management Request Message */
+typedef struct _MR_TASK_MANAGE_REQUEST {
+ /*To be type casted to struct MPI2_SCSI_TASK_MANAGE_REQUEST */
+ MR_TM_REQUEST TmRequest;
+ union {
+ struct {
+ u_int32_t isTMForLD:1;
+ u_int32_t isTMForPD:1;
+ u_int32_t reserved1:30;
+ u_int32_t reserved2;
+ } tmReqFlags;
+ MR_TM_REPLY TMReply;
+ } uTmReqReply;
+} MR_TASK_MANAGE_REQUEST;
+
+/* TaskType values */
+#define MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK (0x01)
+#define MPI2_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET (0x02)
+#define MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET (0x03)
+#define MPI2_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET (0x05)
+#define MPI2_SCSITASKMGMT_TASKTYPE_CLEAR_TASK_SET (0x06)
+#define MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK (0x07)
+#define MPI2_SCSITASKMGMT_TASKTYPE_CLR_ACA (0x08)
+#define MPI2_SCSITASKMGMT_TASKTYPE_QRY_TASK_SET (0x09)
+#define MPI2_SCSITASKMGMT_TASKTYPE_QRY_ASYNC_EVENT (0x0A)
+
+/* ResponseCode values */
+#define MPI2_SCSITASKMGMT_RSP_TM_COMPLETE (0x00)
+#define MPI2_SCSITASKMGMT_RSP_INVALID_FRAME (0x02)
+#define MPI2_SCSITASKMGMT_RSP_TM_NOT_SUPPORTED (0x04)
+#define MPI2_SCSITASKMGMT_RSP_TM_FAILED (0x05)
+#define MPI2_SCSITASKMGMT_RSP_TM_SUCCEEDED (0x08)
+#define MPI2_SCSITASKMGMT_RSP_TM_INVALID_LUN (0x09)
+#define MPI2_SCSITASKMGMT_RSP_TM_OVERLAPPED_TAG (0x0A)
+#define MPI2_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC (0x80)
+
/*
* RAID SCSI IO Request Message Total SGE count will be one less than
* _MPI2_SCSI_IO_REQUEST
@@ -584,7 +671,7 @@ Mpi2IOCInitRequest_t, MPI2_POINTER pMpi2IOCInitRequest_t;
#define MAX_RAIDMAP_PHYSICAL_DEVICES (MAX_PHYSICAL_DEVICES)
#define MR_DCMD_LD_MAP_GET_INFO 0x0300e101
#define MR_DCMD_SYSTEM_PD_MAP_GET_INFO 0x0200e102
-
+#define MR_DCMD_PD_MFI_TASK_MGMT 0x0200e100
#define MRSAS_MAX_PD_CHANNELS 1
#define MRSAS_MAX_LD_CHANNELS 1
@@ -599,7 +686,7 @@ Mpi2IOCInitRequest_t, MPI2_POINTER pMpi2IOCInitRequest_t;
#define VD_EXT_DEBUG 0
-
+#define TM_DEBUG 1
/*******************************************************************
* RAID map related structures
@@ -659,7 +746,8 @@ typedef struct _MR_LD_RAID {
u_int32_t fpWriteAcrossStripe:1;
u_int32_t fpReadAcrossStripe:1;
u_int32_t fpNonRWCapable:1;
- u_int32_t reserved4:7;
+ u_int32_t tmCapable:1;
+ u_int32_t reserved4:6;
} capability;
u_int32_t reserved6;
u_int64_t size;
@@ -876,7 +964,11 @@ struct IO_REQUEST_INFO {
struct MR_PD_CFG_SEQ {
u_int16_t seqNum;
u_int16_t devHandle;
- u_int8_t reserved[4];
+ struct {
+ u_int8_t tmCapable:1;
+ u_int8_t reserved:7;
+ } capability;
+ u_int8_t reserved[3];
} __packed;
struct MR_PD_CFG_SEQ_NUM_SYNC {
@@ -1242,7 +1334,6 @@ enum MR_EVT_ARGS {
MR_EVT_ARGS_GENERIC,
};
-
/*
* Thunderbolt (and later) Defines
*/
@@ -1256,7 +1347,8 @@ enum MR_EVT_ARGS {
#define HOST_DIAG_WRITE_ENABLE 0x80
#define HOST_DIAG_RESET_ADAPTER 0x4
#define MRSAS_TBOLT_MAX_RESET_TRIES 3
-#define MRSAS_MAX_MFI_CMDS 32
+#define MRSAS_MAX_MFI_CMDS 16
+#define MRSAS_MAX_IOCTL_CMDS 3
/*
* Invader Defines
@@ -1395,6 +1487,7 @@ struct mrsas_mpt_cmd {
union ccb *ccb_ptr;
struct callout cm_callout;
struct mrsas_softc *sc;
+ boolean_t tmCapable;
TAILQ_ENTRY(mrsas_mpt_cmd) next;
};
@@ -1448,6 +1541,7 @@ enum MR_PD_QUERY_TYPE {
#define MR_EVT_LD_DELETED 0x008b
#define MR_EVT_FOREIGN_CFG_IMPORTED 0x00db
#define MR_EVT_LD_OFFLINE 0x00fc
+#define MR_EVT_CTRL_PROP_CHANGED 0x012f
#define MR_EVT_CTRL_HOST_BUS_SCAN_REQUESTED 0x0152
enum MR_PD_STATE {
@@ -1990,6 +2084,11 @@ struct mrsas_ctrl_info {
#define MR_MAX_MSIX_REG_ARRAY 16
/*
+ * SYNC CACHE offset define
+ */
+#define MR_CAN_HANDLE_SYNC_CACHE_OFFSET 0X01000000
+
+/*
* 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
@@ -2470,8 +2569,7 @@ struct mrsas_irq_context {
enum MEGASAS_OCR_REASON {
FW_FAULT_OCR = 0,
- SCSIIO_TIMEOUT_OCR = 1,
- MFI_DCMD_TIMEOUT_OCR = 2,
+ MFI_DCMD_TIMEOUT_OCR = 1,
};
/* Controller management info added to support Linux Emulator */
@@ -2746,6 +2844,11 @@ struct mrsas_softc {
u_int8_t do_timedout_reset;
u_int32_t reset_in_progress;
u_int32_t reset_count;
+ u_int32_t block_sync_cache;
+ u_int8_t fw_sync_cache_support;
+ mrsas_atomic_t target_reset_outstanding;
+#define MRSAS_MAX_TM_TARGETS (MRSAS_MAX_PD + MRSAS_MAX_LD_IDS)
+ struct mrsas_mpt_cmd *target_reset_pool[MRSAS_MAX_TM_TARGETS];
bus_dma_tag_t jbodmap_tag[2];
bus_dmamap_t jbodmap_dmamap[2];
@@ -2794,6 +2897,7 @@ struct mrsas_softc {
LD_LOAD_BALANCE_INFO load_balance_info[MAX_LOGICAL_DRIVES_EXT];
LD_SPAN_INFO log_to_span[MAX_LOGICAL_DRIVES_EXT];
+ u_int8_t mrsas_gen3_ctrl;
u_int8_t secure_jbod_support;
u_int8_t use_seqnum_jbod_fp;
u_int8_t max256vdSupport;
OpenPOWER on IntegriCloud