1230592Sken/*-
2279253Sslm * Copyright (c) 2007-2015 LSI Corp.
3279253Sslm * Copyright (c) 2013-2015 Avago Technologies
4230592Sken * All rights reserved.
5230592Sken *
6230592Sken * Redistribution and use in source and binary forms, with or without
7230592Sken * modification, are permitted provided that the following conditions
8230592Sken * are met:
9230592Sken * 1. Redistributions of source code must retain the above copyright
10230592Sken *    notice, this list of conditions and the following disclaimer.
11230592Sken * 2. Redistributions in binary form must reproduce the above copyright
12230592Sken *    notice, this list of conditions and the following disclaimer in the
13230592Sken *    documentation and/or other materials provided with the distribution.
14230592Sken *
15230592Sken * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16230592Sken * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17230592Sken * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18230592Sken * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19230592Sken * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20230592Sken * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21230592Sken * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22230592Sken * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23230592Sken * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24230592Sken * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25230592Sken * SUCH DAMAGE.
26230592Sken *
27279253Sslm * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
28230592Sken *
29230592Sken * $FreeBSD$
30230592Sken */
31230592Sken
32212420Sken/*
33279253Sslm *  Copyright (c) 2007-2015 LSI Corporation.
34279253Sslm *  Copyright (c) 2013-2015 Avago Technologies
35212420Sken *
36212420Sken *
37212420Sken *           Name:  mpi2_sas.h
38212420Sken *          Title:  MPI Serial Attached SCSI structures and definitions
39212420Sken *  Creation Date:  February 9, 2007
40212420Sken *
41230592Sken *  mpi2_sas.h Version:  02.00.05
42212420Sken *
43212420Sken *  Version History
44212420Sken *  ---------------
45212420Sken *
46212420Sken *  Date      Version   Description
47212420Sken *  --------  --------  ------------------------------------------------------
48212420Sken *  04-30-07  02.00.00  Corresponds to Fusion-MPT MPI Specification Rev A.
49212420Sken *  06-26-07  02.00.01  Added Clear All Persistent Operation to SAS IO Unit
50212420Sken *                      Control Request.
51212420Sken *  10-02-08  02.00.02  Added Set IOC Parameter Operation to SAS IO Unit Control
52212420Sken *                      Request.
53212420Sken *  10-28-09  02.00.03  Changed the type of SGL in MPI2_SATA_PASSTHROUGH_REQUEST
54212420Sken *                      to MPI2_SGE_IO_UNION since it supports chained SGLs.
55230592Sken *  05-12-10  02.00.04  Modified some comments.
56230592Sken *  08-11-10  02.00.05  Added NCQ operations to SAS IO Unit Control.
57212420Sken *  --------------------------------------------------------------------------
58212420Sken */
59212420Sken
60212420Sken#ifndef MPI2_SAS_H
61212420Sken#define MPI2_SAS_H
62212420Sken
63212420Sken/*
64212420Sken * Values for SASStatus.
65212420Sken */
66212420Sken#define MPI2_SASSTATUS_SUCCESS                          (0x00)
67212420Sken#define MPI2_SASSTATUS_UNKNOWN_ERROR                    (0x01)
68212420Sken#define MPI2_SASSTATUS_INVALID_FRAME                    (0x02)
69212420Sken#define MPI2_SASSTATUS_UTC_BAD_DEST                     (0x03)
70212420Sken#define MPI2_SASSTATUS_UTC_BREAK_RECEIVED               (0x04)
71212420Sken#define MPI2_SASSTATUS_UTC_CONNECT_RATE_NOT_SUPPORTED   (0x05)
72212420Sken#define MPI2_SASSTATUS_UTC_PORT_LAYER_REQUEST           (0x06)
73212420Sken#define MPI2_SASSTATUS_UTC_PROTOCOL_NOT_SUPPORTED       (0x07)
74212420Sken#define MPI2_SASSTATUS_UTC_STP_RESOURCES_BUSY           (0x08)
75212420Sken#define MPI2_SASSTATUS_UTC_WRONG_DESTINATION            (0x09)
76212420Sken#define MPI2_SASSTATUS_SHORT_INFORMATION_UNIT           (0x0A)
77212420Sken#define MPI2_SASSTATUS_LONG_INFORMATION_UNIT            (0x0B)
78212420Sken#define MPI2_SASSTATUS_XFER_RDY_INCORRECT_WRITE_DATA    (0x0C)
79212420Sken#define MPI2_SASSTATUS_XFER_RDY_REQUEST_OFFSET_ERROR    (0x0D)
80212420Sken#define MPI2_SASSTATUS_XFER_RDY_NOT_EXPECTED            (0x0E)
81212420Sken#define MPI2_SASSTATUS_DATA_INCORRECT_DATA_LENGTH       (0x0F)
82212420Sken#define MPI2_SASSTATUS_DATA_TOO_MUCH_READ_DATA          (0x10)
83212420Sken#define MPI2_SASSTATUS_DATA_OFFSET_ERROR                (0x11)
84212420Sken#define MPI2_SASSTATUS_SDSF_NAK_RECEIVED                (0x12)
85212420Sken#define MPI2_SASSTATUS_SDSF_CONNECTION_FAILED           (0x13)
86212420Sken#define MPI2_SASSTATUS_INITIATOR_RESPONSE_TIMEOUT       (0x14)
87212420Sken
88212420Sken
89212420Sken/*
90212420Sken * Values for the SAS DeviceInfo field used in SAS Device Status Change Event
91212420Sken * data and SAS Configuration pages.
92212420Sken */
93212420Sken#define MPI2_SAS_DEVICE_INFO_SEP                (0x00004000)
94212420Sken#define MPI2_SAS_DEVICE_INFO_ATAPI_DEVICE       (0x00002000)
95212420Sken#define MPI2_SAS_DEVICE_INFO_LSI_DEVICE         (0x00001000)
96212420Sken#define MPI2_SAS_DEVICE_INFO_DIRECT_ATTACH      (0x00000800)
97212420Sken#define MPI2_SAS_DEVICE_INFO_SSP_TARGET         (0x00000400)
98212420Sken#define MPI2_SAS_DEVICE_INFO_STP_TARGET         (0x00000200)
99212420Sken#define MPI2_SAS_DEVICE_INFO_SMP_TARGET         (0x00000100)
100212420Sken#define MPI2_SAS_DEVICE_INFO_SATA_DEVICE        (0x00000080)
101212420Sken#define MPI2_SAS_DEVICE_INFO_SSP_INITIATOR      (0x00000040)
102212420Sken#define MPI2_SAS_DEVICE_INFO_STP_INITIATOR      (0x00000020)
103212420Sken#define MPI2_SAS_DEVICE_INFO_SMP_INITIATOR      (0x00000010)
104212420Sken#define MPI2_SAS_DEVICE_INFO_SATA_HOST          (0x00000008)
105212420Sken
106212420Sken#define MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE   (0x00000007)
107212420Sken#define MPI2_SAS_DEVICE_INFO_NO_DEVICE          (0x00000000)
108212420Sken#define MPI2_SAS_DEVICE_INFO_END_DEVICE         (0x00000001)
109212420Sken#define MPI2_SAS_DEVICE_INFO_EDGE_EXPANDER      (0x00000002)
110212420Sken#define MPI2_SAS_DEVICE_INFO_FANOUT_EXPANDER    (0x00000003)
111212420Sken
112212420Sken
113212420Sken/*****************************************************************************
114212420Sken*
115212420Sken*        SAS Messages
116212420Sken*
117212420Sken*****************************************************************************/
118212420Sken
119212420Sken/****************************************************************************
120212420Sken*  SMP Passthrough messages
121212420Sken****************************************************************************/
122212420Sken
123212420Sken/* SMP Passthrough Request Message */
124212420Skentypedef struct _MPI2_SMP_PASSTHROUGH_REQUEST
125212420Sken{
126212420Sken    U8                      PassthroughFlags;   /* 0x00 */
127212420Sken    U8                      PhysicalPort;       /* 0x01 */
128212420Sken    U8                      ChainOffset;        /* 0x02 */
129212420Sken    U8                      Function;           /* 0x03 */
130212420Sken    U16                     RequestDataLength;  /* 0x04 */
131212420Sken    U8                      SGLFlags;           /* 0x06 */
132212420Sken    U8                      MsgFlags;           /* 0x07 */
133212420Sken    U8                      VP_ID;              /* 0x08 */
134212420Sken    U8                      VF_ID;              /* 0x09 */
135212420Sken    U16                     Reserved1;          /* 0x0A */
136212420Sken    U32                     Reserved2;          /* 0x0C */
137212420Sken    U64                     SASAddress;         /* 0x10 */
138212420Sken    U32                     Reserved3;          /* 0x18 */
139212420Sken    U32                     Reserved4;          /* 0x1C */
140212420Sken    MPI2_SIMPLE_SGE_UNION   SGL;                /* 0x20 */
141212420Sken} MPI2_SMP_PASSTHROUGH_REQUEST, MPI2_POINTER PTR_MPI2_SMP_PASSTHROUGH_REQUEST,
142212420Sken  Mpi2SmpPassthroughRequest_t, MPI2_POINTER pMpi2SmpPassthroughRequest_t;
143212420Sken
144212420Sken/* values for PassthroughFlags field */
145212420Sken#define MPI2_SMP_PT_REQ_PT_FLAGS_IMMEDIATE      (0x80)
146212420Sken
147230592Sken/* use MPI2_SGLFLAGS_ defines from mpi2.h for the SGLFlags field */
148212420Sken
149212420Sken
150212420Sken/* SMP Passthrough Reply Message */
151212420Skentypedef struct _MPI2_SMP_PASSTHROUGH_REPLY
152212420Sken{
153212420Sken    U8                      PassthroughFlags;   /* 0x00 */
154212420Sken    U8                      PhysicalPort;       /* 0x01 */
155212420Sken    U8                      MsgLength;          /* 0x02 */
156212420Sken    U8                      Function;           /* 0x03 */
157212420Sken    U16                     ResponseDataLength; /* 0x04 */
158212420Sken    U8                      SGLFlags;           /* 0x06 */
159212420Sken    U8                      MsgFlags;           /* 0x07 */
160212420Sken    U8                      VP_ID;              /* 0x08 */
161212420Sken    U8                      VF_ID;              /* 0x09 */
162212420Sken    U16                     Reserved1;          /* 0x0A */
163212420Sken    U8                      Reserved2;          /* 0x0C */
164212420Sken    U8                      SASStatus;          /* 0x0D */
165212420Sken    U16                     IOCStatus;          /* 0x0E */
166212420Sken    U32                     IOCLogInfo;         /* 0x10 */
167212420Sken    U32                     Reserved3;          /* 0x14 */
168212420Sken    U8                      ResponseData[4];    /* 0x18 */
169212420Sken} MPI2_SMP_PASSTHROUGH_REPLY, MPI2_POINTER PTR_MPI2_SMP_PASSTHROUGH_REPLY,
170212420Sken  Mpi2SmpPassthroughReply_t, MPI2_POINTER pMpi2SmpPassthroughReply_t;
171212420Sken
172212420Sken/* values for PassthroughFlags field */
173212420Sken#define MPI2_SMP_PT_REPLY_PT_FLAGS_IMMEDIATE    (0x80)
174212420Sken
175212420Sken/* values for SASStatus field are at the top of this file */
176212420Sken
177212420Sken
178212420Sken/****************************************************************************
179212420Sken*  SATA Passthrough messages
180212420Sken****************************************************************************/
181212420Sken
182212420Sken/* SATA Passthrough Request Message */
183212420Skentypedef struct _MPI2_SATA_PASSTHROUGH_REQUEST
184212420Sken{
185212420Sken    U16                     DevHandle;          /* 0x00 */
186212420Sken    U8                      ChainOffset;        /* 0x02 */
187212420Sken    U8                      Function;           /* 0x03 */
188212420Sken    U16                     PassthroughFlags;   /* 0x04 */
189212420Sken    U8                      SGLFlags;           /* 0x06 */
190212420Sken    U8                      MsgFlags;           /* 0x07 */
191212420Sken    U8                      VP_ID;              /* 0x08 */
192212420Sken    U8                      VF_ID;              /* 0x09 */
193212420Sken    U16                     Reserved1;          /* 0x0A */
194212420Sken    U32                     Reserved2;          /* 0x0C */
195212420Sken    U32                     Reserved3;          /* 0x10 */
196212420Sken    U32                     Reserved4;          /* 0x14 */
197212420Sken    U32                     DataLength;         /* 0x18 */
198212420Sken    U8                      CommandFIS[20];     /* 0x1C */
199230592Sken    MPI2_SGE_IO_UNION       SGL;                /* 0x30 */
200212420Sken} MPI2_SATA_PASSTHROUGH_REQUEST, MPI2_POINTER PTR_MPI2_SATA_PASSTHROUGH_REQUEST,
201212420Sken  Mpi2SataPassthroughRequest_t, MPI2_POINTER pMpi2SataPassthroughRequest_t;
202212420Sken
203212420Sken/* values for PassthroughFlags field */
204212420Sken#define MPI2_SATA_PT_REQ_PT_FLAGS_EXECUTE_DIAG      (0x0100)
205212420Sken#define MPI2_SATA_PT_REQ_PT_FLAGS_DMA               (0x0020)
206212420Sken#define MPI2_SATA_PT_REQ_PT_FLAGS_PIO               (0x0010)
207212420Sken#define MPI2_SATA_PT_REQ_PT_FLAGS_UNSPECIFIED_VU    (0x0004)
208212420Sken#define MPI2_SATA_PT_REQ_PT_FLAGS_WRITE             (0x0002)
209212420Sken#define MPI2_SATA_PT_REQ_PT_FLAGS_READ              (0x0001)
210212420Sken
211230592Sken/* use MPI2_SGLFLAGS_ defines from mpi2.h for the SGLFlags field */
212212420Sken
213212420Sken
214212420Sken/* SATA Passthrough Reply Message */
215212420Skentypedef struct _MPI2_SATA_PASSTHROUGH_REPLY
216212420Sken{
217212420Sken    U16                     DevHandle;          /* 0x00 */
218212420Sken    U8                      MsgLength;          /* 0x02 */
219212420Sken    U8                      Function;           /* 0x03 */
220212420Sken    U16                     PassthroughFlags;   /* 0x04 */
221212420Sken    U8                      SGLFlags;           /* 0x06 */
222212420Sken    U8                      MsgFlags;           /* 0x07 */
223212420Sken    U8                      VP_ID;              /* 0x08 */
224212420Sken    U8                      VF_ID;              /* 0x09 */
225212420Sken    U16                     Reserved1;          /* 0x0A */
226212420Sken    U8                      Reserved2;          /* 0x0C */
227212420Sken    U8                      SASStatus;          /* 0x0D */
228212420Sken    U16                     IOCStatus;          /* 0x0E */
229212420Sken    U32                     IOCLogInfo;         /* 0x10 */
230212420Sken    U8                      StatusFIS[20];      /* 0x14 */
231212420Sken    U32                     StatusControlRegisters; /* 0x28 */
232212420Sken    U32                     TransferCount;      /* 0x2C */
233212420Sken} MPI2_SATA_PASSTHROUGH_REPLY, MPI2_POINTER PTR_MPI2_SATA_PASSTHROUGH_REPLY,
234212420Sken  Mpi2SataPassthroughReply_t, MPI2_POINTER pMpi2SataPassthroughReply_t;
235212420Sken
236212420Sken/* values for SASStatus field are at the top of this file */
237212420Sken
238212420Sken
239212420Sken/****************************************************************************
240212420Sken*  SAS IO Unit Control messages
241212420Sken****************************************************************************/
242212420Sken
243212420Sken/* SAS IO Unit Control Request Message */
244212420Skentypedef struct _MPI2_SAS_IOUNIT_CONTROL_REQUEST
245212420Sken{
246212420Sken    U8                      Operation;          /* 0x00 */
247212420Sken    U8                      Reserved1;          /* 0x01 */
248212420Sken    U8                      ChainOffset;        /* 0x02 */
249212420Sken    U8                      Function;           /* 0x03 */
250212420Sken    U16                     DevHandle;          /* 0x04 */
251212420Sken    U8                      IOCParameter;       /* 0x06 */
252212420Sken    U8                      MsgFlags;           /* 0x07 */
253212420Sken    U8                      VP_ID;              /* 0x08 */
254212420Sken    U8                      VF_ID;              /* 0x09 */
255212420Sken    U16                     Reserved3;          /* 0x0A */
256212420Sken    U16                     Reserved4;          /* 0x0C */
257212420Sken    U8                      PhyNum;             /* 0x0E */
258212420Sken    U8                      PrimFlags;          /* 0x0F */
259212420Sken    U32                     Primitive;          /* 0x10 */
260212420Sken    U8                      LookupMethod;       /* 0x14 */
261212420Sken    U8                      Reserved5;          /* 0x15 */
262212420Sken    U16                     SlotNumber;         /* 0x16 */
263212420Sken    U64                     LookupAddress;      /* 0x18 */
264212420Sken    U32                     IOCParameterValue;  /* 0x20 */
265212420Sken    U32                     Reserved7;          /* 0x24 */
266212420Sken    U32                     Reserved8;          /* 0x28 */
267212420Sken} MPI2_SAS_IOUNIT_CONTROL_REQUEST,
268212420Sken  MPI2_POINTER PTR_MPI2_SAS_IOUNIT_CONTROL_REQUEST,
269212420Sken  Mpi2SasIoUnitControlRequest_t, MPI2_POINTER pMpi2SasIoUnitControlRequest_t;
270212420Sken
271212420Sken/* values for the Operation field */
272212420Sken#define MPI2_SAS_OP_CLEAR_ALL_PERSISTENT        (0x02)
273212420Sken#define MPI2_SAS_OP_PHY_LINK_RESET              (0x06)
274212420Sken#define MPI2_SAS_OP_PHY_HARD_RESET              (0x07)
275212420Sken#define MPI2_SAS_OP_PHY_CLEAR_ERROR_LOG         (0x08)
276212420Sken#define MPI2_SAS_OP_SEND_PRIMITIVE              (0x0A)
277212420Sken#define MPI2_SAS_OP_FORCE_FULL_DISCOVERY        (0x0B)
278212420Sken#define MPI2_SAS_OP_TRANSMIT_PORT_SELECT_SIGNAL (0x0C)
279212420Sken#define MPI2_SAS_OP_REMOVE_DEVICE               (0x0D)
280212420Sken#define MPI2_SAS_OP_LOOKUP_MAPPING              (0x0E)
281212420Sken#define MPI2_SAS_OP_SET_IOC_PARAMETER           (0x0F)
282230592Sken#define MPI2_SAS_OP_DEV_ENABLE_NCQ              (0x14)
283230592Sken#define MPI2_SAS_OP_DEV_DISABLE_NCQ             (0x15)
284212420Sken#define MPI2_SAS_OP_PRODUCT_SPECIFIC_MIN        (0x80)
285212420Sken
286212420Sken/* values for the PrimFlags field */
287212420Sken#define MPI2_SAS_PRIMFLAGS_SINGLE               (0x08)
288212420Sken#define MPI2_SAS_PRIMFLAGS_TRIPLE               (0x02)
289212420Sken#define MPI2_SAS_PRIMFLAGS_REDUNDANT            (0x01)
290212420Sken
291212420Sken/* values for the LookupMethod field */
292212420Sken#define MPI2_SAS_LOOKUP_METHOD_SAS_ADDRESS          (0x01)
293212420Sken#define MPI2_SAS_LOOKUP_METHOD_SAS_ENCLOSURE_SLOT   (0x02)
294212420Sken#define MPI2_SAS_LOOKUP_METHOD_SAS_DEVICE_NAME      (0x03)
295212420Sken
296212420Sken
297212420Sken/* SAS IO Unit Control Reply Message */
298212420Skentypedef struct _MPI2_SAS_IOUNIT_CONTROL_REPLY
299212420Sken{
300212420Sken    U8                      Operation;          /* 0x00 */
301212420Sken    U8                      Reserved1;          /* 0x01 */
302212420Sken    U8                      MsgLength;          /* 0x02 */
303212420Sken    U8                      Function;           /* 0x03 */
304212420Sken    U16                     DevHandle;          /* 0x04 */
305212420Sken    U8                      IOCParameter;       /* 0x06 */
306212420Sken    U8                      MsgFlags;           /* 0x07 */
307212420Sken    U8                      VP_ID;              /* 0x08 */
308212420Sken    U8                      VF_ID;              /* 0x09 */
309212420Sken    U16                     Reserved3;          /* 0x0A */
310212420Sken    U16                     Reserved4;          /* 0x0C */
311212420Sken    U16                     IOCStatus;          /* 0x0E */
312212420Sken    U32                     IOCLogInfo;         /* 0x10 */
313212420Sken} MPI2_SAS_IOUNIT_CONTROL_REPLY,
314212420Sken  MPI2_POINTER PTR_MPI2_SAS_IOUNIT_CONTROL_REPLY,
315212420Sken  Mpi2SasIoUnitControlReply_t, MPI2_POINTER pMpi2SasIoUnitControlReply_t;
316212420Sken
317212420Sken
318212420Sken#endif
319212420Sken
320212420Sken
321