xref: /dflybsd-src/sys/dev/raid/tws/tws_hdm.h (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
186d7f5d3SJohn Marino /*
286d7f5d3SJohn Marino  * Copyright (c) 2010, LSI Corp.
386d7f5d3SJohn Marino  * All rights reserved.
486d7f5d3SJohn Marino  * Author : Manjunath Ranganathaiah
586d7f5d3SJohn Marino  * Support: freebsdraid@lsi.com
686d7f5d3SJohn Marino  *
786d7f5d3SJohn Marino  * Redistribution and use in source and binary forms, with or without
886d7f5d3SJohn Marino  * modification, are permitted provided that the following conditions
986d7f5d3SJohn Marino  * are met:
1086d7f5d3SJohn Marino  *
1186d7f5d3SJohn Marino  * 1. Redistributions of source code must retain the above copyright
1286d7f5d3SJohn Marino  *    notice, this list of conditions and the following disclaimer.
1386d7f5d3SJohn Marino  * 2. Redistributions in binary form must reproduce the above copyright
1486d7f5d3SJohn Marino  *    notice, this list of conditions and the following disclaimer in
1586d7f5d3SJohn Marino  *    the documentation and/or other materials provided with the
1686d7f5d3SJohn Marino  *    distribution.
1786d7f5d3SJohn Marino  * 3. Neither the name of the <ORGANIZATION> nor the names of its
1886d7f5d3SJohn Marino  *    contributors may be used to endorse or promote products derived
1986d7f5d3SJohn Marino  *    from this software without specific prior written permission.
2086d7f5d3SJohn Marino  *
2186d7f5d3SJohn Marino  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2286d7f5d3SJohn Marino  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2386d7f5d3SJohn Marino  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
2486d7f5d3SJohn Marino  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
2586d7f5d3SJohn Marino  * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
2686d7f5d3SJohn Marino  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
2786d7f5d3SJohn Marino  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
2886d7f5d3SJohn Marino  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
2986d7f5d3SJohn Marino  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3086d7f5d3SJohn Marino  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
3186d7f5d3SJohn Marino  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3286d7f5d3SJohn Marino  * POSSIBILITY OF SUCH DAMAGE.
3386d7f5d3SJohn Marino  *
3486d7f5d3SJohn Marino  * $FreeBSD: src/sys/dev/tws/tws_hdm.h,v 1.3 2007/05/09 04:16:32 mrangana Exp $
3586d7f5d3SJohn Marino  */
3686d7f5d3SJohn Marino 
3786d7f5d3SJohn Marino 
3886d7f5d3SJohn Marino /* bit's defination */
3986d7f5d3SJohn Marino 
4086d7f5d3SJohn Marino #define TWS_BIT0                              0x00000001
4186d7f5d3SJohn Marino #define TWS_BIT1                              0x00000002
4286d7f5d3SJohn Marino #define TWS_BIT2                              0x00000004
4386d7f5d3SJohn Marino #define TWS_BIT3                              0x00000008
4486d7f5d3SJohn Marino #define TWS_BIT4                              0x00000010
4586d7f5d3SJohn Marino #define TWS_BIT5                              0x00000020
4686d7f5d3SJohn Marino #define TWS_BIT6                              0x00000040
4786d7f5d3SJohn Marino #define TWS_BIT7                              0x00000080
4886d7f5d3SJohn Marino #define TWS_BIT8                              0x00000100
4986d7f5d3SJohn Marino #define TWS_BIT9                              0x00000200
5086d7f5d3SJohn Marino #define TWS_BIT10                             0x00000400
5186d7f5d3SJohn Marino #define TWS_BIT11                             0x00000800
5286d7f5d3SJohn Marino #define TWS_BIT12                             0x00001000
5386d7f5d3SJohn Marino #define TWS_BIT13                             0x00002000
5486d7f5d3SJohn Marino #define TWS_BIT14                             0x00004000
5586d7f5d3SJohn Marino #define TWS_BIT15                             0x00008000
5686d7f5d3SJohn Marino #define TWS_BIT16                             0x00010000
5786d7f5d3SJohn Marino #define TWS_BIT17                             0x00020000
5886d7f5d3SJohn Marino #define TWS_BIT18                             0x00040000
5986d7f5d3SJohn Marino #define TWS_BIT19                             0x00080000
6086d7f5d3SJohn Marino #define TWS_BIT20                             0x00100000
6186d7f5d3SJohn Marino #define TWS_BIT21                             0x00200000
6286d7f5d3SJohn Marino #define TWS_BIT22                             0x00400000
6386d7f5d3SJohn Marino #define TWS_BIT23                             0x00800000
6486d7f5d3SJohn Marino #define TWS_BIT24                             0x01000000
6586d7f5d3SJohn Marino #define TWS_BIT25                             0x02000000
6686d7f5d3SJohn Marino #define TWS_BIT26                             0x04000000
6786d7f5d3SJohn Marino #define TWS_BIT27                             0x08000000
6886d7f5d3SJohn Marino #define TWS_BIT28                             0x10000000
6986d7f5d3SJohn Marino #define TWS_BIT29                             0x20000000
7086d7f5d3SJohn Marino #define TWS_BIT30                             0x40000000
7186d7f5d3SJohn Marino #define TWS_BIT31                             0x80000000
7286d7f5d3SJohn Marino 
7386d7f5d3SJohn Marino #define TWS_SENSE_DATA_LENGTH                 18
7486d7f5d3SJohn Marino #define TWS_ERROR_SPECIFIC_DESC_LEN           98
7586d7f5d3SJohn Marino 
7686d7f5d3SJohn Marino /* response codes */
7786d7f5d3SJohn Marino #define TWS_SENSE_SCSI_CURRENT_ERROR          0x70
7886d7f5d3SJohn Marino #define TWS_SENSE_SCSI_DEFERRED_ERROR         0x71
7986d7f5d3SJohn Marino 
8086d7f5d3SJohn Marino #define TWS_SRC_CTRL_ERROR                    3
8186d7f5d3SJohn Marino #define TWS_SRC_CTRL_EVENT                    4
8286d7f5d3SJohn Marino #define TWS_SRC_FREEBSD_DRIVER                5
8386d7f5d3SJohn Marino #define TWS_SRC_FREEBSD_OS                    8
8486d7f5d3SJohn Marino 
8586d7f5d3SJohn Marino 
8686d7f5d3SJohn Marino enum tws_sense_severity {
8786d7f5d3SJohn Marino     error = 1,
8886d7f5d3SJohn Marino     warning ,
8986d7f5d3SJohn Marino     info,
9086d7f5d3SJohn Marino     debug,
9186d7f5d3SJohn Marino };
9286d7f5d3SJohn Marino 
9386d7f5d3SJohn Marino /*
9486d7f5d3SJohn Marino  * Some errors of interest (in cmd_hdr->status_block.error) when a command
9586d7f5d3SJohn Marino  * is completed by the firmware with an error.
9686d7f5d3SJohn Marino  */
9786d7f5d3SJohn Marino #define TWS_ERROR_LOGICAL_UNIT_NOT_SUPPORTED    0x010a
9886d7f5d3SJohn Marino #define TWS_ERROR_NOT_SUPPORTED                 0x010D
9986d7f5d3SJohn Marino #define TWS_ERROR_UNIT_OFFLINE                  0x0128
10086d7f5d3SJohn Marino #define TWS_ERROR_MORE_DATA                     0x0231
10186d7f5d3SJohn Marino 
10286d7f5d3SJohn Marino 
10386d7f5d3SJohn Marino /* AEN codes of interest. */
10486d7f5d3SJohn Marino #define TWS_AEN_QUEUE_EMPTY                     0x00
10586d7f5d3SJohn Marino #define TWS_AEN_SOFT_RESET                      0x01
10686d7f5d3SJohn Marino #define TWS_AEN_SYNC_TIME_WITH_HOST             0x31
10786d7f5d3SJohn Marino 
10886d7f5d3SJohn Marino 
10986d7f5d3SJohn Marino /* AEN severity */
11086d7f5d3SJohn Marino #define TWS_SEVERITY_ERROR                      0x1
11186d7f5d3SJohn Marino #define TWS_SEVERITY_WARNING                    0x2
11286d7f5d3SJohn Marino #define TWS_SEVERITY_INFO                       0x3
11386d7f5d3SJohn Marino #define TWS_SEVERITY_DEBUG                      0x4
11486d7f5d3SJohn Marino 
11586d7f5d3SJohn Marino #define TWS_64BIT_SG_ADDRESSES                  0x00000001
11686d7f5d3SJohn Marino #define TWS_BIT_EXTEND                          0x00000002
11786d7f5d3SJohn Marino 
11886d7f5d3SJohn Marino #define TWS_BASE_FW_SRL                         24
11986d7f5d3SJohn Marino #define TWS_BASE_FW_BRANCH                      0
12086d7f5d3SJohn Marino #define TWS_BASE_FW_BUILD                       1
12186d7f5d3SJohn Marino #define TWS_CURRENT_FW_SRL                      40
12286d7f5d3SJohn Marino 
12386d7f5d3SJohn Marino #define TWS_CURRENT_FW_BRANCH                   8
12486d7f5d3SJohn Marino #define TWS_CURRENT_FW_BUILD                    4
12586d7f5d3SJohn Marino #define TWS_CURRENT_ARCH_ID                     0x000A
12686d7f5d3SJohn Marino 
12786d7f5d3SJohn Marino 
12886d7f5d3SJohn Marino #define TWS_FIFO_EMPTY                          0xFFFFFFFFFFFFFFFFull
12986d7f5d3SJohn Marino #define TWS_FIFO_EMPTY32                        0xFFFFFFFFull
13086d7f5d3SJohn Marino 
13186d7f5d3SJohn Marino 
13286d7f5d3SJohn Marino /* Register offsets from base address. */
13386d7f5d3SJohn Marino #define TWS_CONTROL_REGISTER_OFFSET             0x0
13486d7f5d3SJohn Marino #define TWS_STATUS_REGISTER_OFFSET              0x4
13586d7f5d3SJohn Marino #define TWS_COMMAND_QUEUE_OFFSET                0x8
13686d7f5d3SJohn Marino #define TWS_RESPONSE_QUEUE_OFFSET               0xC
13786d7f5d3SJohn Marino #define TWS_COMMAND_QUEUE_OFFSET_LOW            0x20
13886d7f5d3SJohn Marino #define TWS_COMMAND_QUEUE_OFFSET_HIGH           0x24
13986d7f5d3SJohn Marino #define TWS_LARGE_RESPONSE_QUEUE_OFFSET         0x30
14086d7f5d3SJohn Marino 
14186d7f5d3SJohn Marino /* I2O offsets */
14286d7f5d3SJohn Marino #define TWS_I2O0_STATUS                         0x0
14386d7f5d3SJohn Marino 
14486d7f5d3SJohn Marino #define TWS_I2O0_HIBDB                          0x20
14586d7f5d3SJohn Marino 
14686d7f5d3SJohn Marino #define TWS_I2O0_HISTAT                         0x30
14786d7f5d3SJohn Marino #define TWS_I2O0_HIMASK                         0x34
14886d7f5d3SJohn Marino 
14986d7f5d3SJohn Marino #define TWS_I2O0_HIBQP                          0x40
15086d7f5d3SJohn Marino #define TWS_I2O0_HOBQP                          0x44
15186d7f5d3SJohn Marino 
15286d7f5d3SJohn Marino #define TWS_I2O0_CTL                            0x74
15386d7f5d3SJohn Marino 
15486d7f5d3SJohn Marino #define TWS_I2O0_IOBDB                          0x9C
15586d7f5d3SJohn Marino #define TWS_I2O0_HOBDBC                         0xA0
15686d7f5d3SJohn Marino 
15786d7f5d3SJohn Marino #define TWS_I2O0_SCRPD3                         0xBC
15886d7f5d3SJohn Marino 
15986d7f5d3SJohn Marino #define TWS_I2O0_HIBQPL                         0xC0 /* 64bit inb port low */
16086d7f5d3SJohn Marino #define TWS_I2O0_HIBQPH                         0xC4 /* 64bit inb port high */
16186d7f5d3SJohn Marino #define TWS_I2O0_HOBQPL                         0xC8 /* 64bit out port low */
16286d7f5d3SJohn Marino #define TWS_I2O0_HOBQPH                         0xCC /* 64bit out port high */
16386d7f5d3SJohn Marino 
16486d7f5d3SJohn Marino /* IOP related */
16586d7f5d3SJohn Marino #define TWS_I2O0_IOPOBQPL                       0xD8 /* OBFL */
16686d7f5d3SJohn Marino #define TWS_I2O0_IOPOBQPH                       0xDC /* OBFH */
16786d7f5d3SJohn Marino #define TWS_I2O0_SRC_ADDRH                      0xF8 /* Msg ASA */
16886d7f5d3SJohn Marino 
16986d7f5d3SJohn Marino #define TWS_MSG_ACC_MASK                        0x20000000
17086d7f5d3SJohn Marino #define TWS_32BIT_MASK                          0xFFFFFFFF
17186d7f5d3SJohn Marino 
17286d7f5d3SJohn Marino /* revisit */
17386d7f5d3SJohn Marino #define TWS_FW_CMD_NOP                     0x0
17486d7f5d3SJohn Marino #define TWS_FW_CMD_INIT_CONNECTION         0x01
17586d7f5d3SJohn Marino #define TWS_FW_CMD_EXECUTE_SCSI            0x10
17686d7f5d3SJohn Marino 
17786d7f5d3SJohn Marino #define TWS_FW_CMD_ATA_PASSTHROUGH         0x11
17886d7f5d3SJohn Marino #define TWS_FW_CMD_GET_PARAM               0x12
17986d7f5d3SJohn Marino #define TWS_FW_CMD_SET_PARAM               0x13
18086d7f5d3SJohn Marino 
18186d7f5d3SJohn Marino 
18286d7f5d3SJohn Marino #define BUILD_SGL_OFF__OPCODE(sgl_off, opcode)  \
18386d7f5d3SJohn Marino         ((sgl_off << 5) & 0xE0) | (opcode & 0x1F)       /* 3:5 */
18486d7f5d3SJohn Marino 
18586d7f5d3SJohn Marino #define BUILD_RES__OPCODE(res, opcode)          \
18686d7f5d3SJohn Marino         ((res << 5) & 0xE0) | (opcode & 0x1F)           /* 3:5 */
18786d7f5d3SJohn Marino 
18886d7f5d3SJohn Marino #define GET_OPCODE(sgl_off__opcode)     \
18986d7f5d3SJohn Marino         (sgl_off__opcode & 0x1F)                        /* 3:5 */
19086d7f5d3SJohn Marino 
19186d7f5d3SJohn Marino 
19286d7f5d3SJohn Marino 
19386d7f5d3SJohn Marino /* end revisit */
19486d7f5d3SJohn Marino 
19586d7f5d3SJohn Marino 
19686d7f5d3SJohn Marino /* Table #'s and id's of parameters of interest in firmware's param table. */
19786d7f5d3SJohn Marino #define TWS_PARAM_VERSION_TABLE         0x0402
19886d7f5d3SJohn Marino #define TWS_PARAM_VERSION_FW            3       /* firmware version [16] */
19986d7f5d3SJohn Marino #define TWS_PARAM_VERSION_BIOS          4       /* BIOSs version [16] */
20086d7f5d3SJohn Marino #define TWS_PARAM_CTLR_MODEL            8       /* Controller model [16] */
20186d7f5d3SJohn Marino 
20286d7f5d3SJohn Marino #define TWS_PARAM_CONTROLLER_TABLE      0x0403
20386d7f5d3SJohn Marino #define TWS_PARAM_CONTROLLER_PORT_COUNT 3       /* number of ports [1] */
20486d7f5d3SJohn Marino 
20586d7f5d3SJohn Marino #define TWS_PARAM_TIME_TABLE            0x40A
20686d7f5d3SJohn Marino #define TWS_PARAM_TIME_SCHED_TIME       0x3
20786d7f5d3SJohn Marino 
20886d7f5d3SJohn Marino #define TWS_PARAM_PHYS_TABLE            0x0001
20986d7f5d3SJohn Marino #define TWS_PARAM_CONTROLLER_PHYS_COUNT 2       /* number of phys */
21086d7f5d3SJohn Marino 
21186d7f5d3SJohn Marino #define TWS_9K_PARAM_DESCRIPTOR         0x8000
21286d7f5d3SJohn Marino 
21386d7f5d3SJohn Marino 
21486d7f5d3SJohn Marino /* ----------- request  ------------- */
21586d7f5d3SJohn Marino 
21686d7f5d3SJohn Marino 
21786d7f5d3SJohn Marino #pragma pack(1)
21886d7f5d3SJohn Marino 
21986d7f5d3SJohn Marino struct tws_cmd_init_connect {
22086d7f5d3SJohn Marino     u_int8_t        res1__opcode;   /* 3:5 */
22186d7f5d3SJohn Marino     u_int8_t        size;
22286d7f5d3SJohn Marino     u_int8_t        request_id;
22386d7f5d3SJohn Marino     u_int8_t        res2;
22486d7f5d3SJohn Marino     u_int8_t        status;
22586d7f5d3SJohn Marino     u_int8_t        flags;
22686d7f5d3SJohn Marino     u_int16_t       message_credits;
22786d7f5d3SJohn Marino     u_int32_t       features;
22886d7f5d3SJohn Marino     u_int16_t       fw_srl;
22986d7f5d3SJohn Marino     u_int16_t       fw_arch_id;
23086d7f5d3SJohn Marino     u_int16_t       fw_branch;
23186d7f5d3SJohn Marino     u_int16_t       fw_build;
23286d7f5d3SJohn Marino     u_int32_t       result;
23386d7f5d3SJohn Marino };
23486d7f5d3SJohn Marino 
23586d7f5d3SJohn Marino /* Structure for downloading firmware onto the controller. */
23686d7f5d3SJohn Marino struct tws_cmd_download_firmware {
23786d7f5d3SJohn Marino     u_int8_t        sgl_off__opcode;/* 3:5 */
23886d7f5d3SJohn Marino     u_int8_t        size;
23986d7f5d3SJohn Marino     u_int8_t        request_id;
24086d7f5d3SJohn Marino     u_int8_t        unit;
24186d7f5d3SJohn Marino     u_int8_t        status;
24286d7f5d3SJohn Marino     u_int8_t        flags;
24386d7f5d3SJohn Marino     u_int16_t       param;
24486d7f5d3SJohn Marino     u_int8_t        sgl[1];
24586d7f5d3SJohn Marino };
24686d7f5d3SJohn Marino 
24786d7f5d3SJohn Marino /* Structure for hard resetting the controller. */
24886d7f5d3SJohn Marino struct tws_cmd_reset_firmware {
24986d7f5d3SJohn Marino     u_int8_t        res1__opcode;   /* 3:5 */
25086d7f5d3SJohn Marino     u_int8_t        size;
25186d7f5d3SJohn Marino     u_int8_t        request_id;
25286d7f5d3SJohn Marino     u_int8_t        unit;
25386d7f5d3SJohn Marino     u_int8_t        status;
25486d7f5d3SJohn Marino     u_int8_t        flags;
25586d7f5d3SJohn Marino     u_int8_t        res2;
25686d7f5d3SJohn Marino     u_int8_t        param;
25786d7f5d3SJohn Marino };
25886d7f5d3SJohn Marino 
25986d7f5d3SJohn Marino 
26086d7f5d3SJohn Marino /* Structure for sending get/set param commands. */
26186d7f5d3SJohn Marino struct tws_cmd_param {
26286d7f5d3SJohn Marino     u_int8_t        sgl_off__opcode;/* 3:5 */
26386d7f5d3SJohn Marino     u_int8_t        size;
26486d7f5d3SJohn Marino     u_int8_t        request_id;
26586d7f5d3SJohn Marino     u_int8_t        host_id__unit;  /* 4:4 */
26686d7f5d3SJohn Marino     u_int8_t        status;
26786d7f5d3SJohn Marino     u_int8_t        flags;
26886d7f5d3SJohn Marino     u_int16_t       param_count;
26986d7f5d3SJohn Marino     u_int8_t        sgl[1];
27086d7f5d3SJohn Marino };
27186d7f5d3SJohn Marino 
27286d7f5d3SJohn Marino /* Generic command packet. */
27386d7f5d3SJohn Marino struct tws_cmd_generic {
27486d7f5d3SJohn Marino     u_int8_t        sgl_off__opcode;/* 3:5 */
27586d7f5d3SJohn Marino     u_int8_t        size;
27686d7f5d3SJohn Marino     u_int8_t        request_id;
27786d7f5d3SJohn Marino     u_int8_t        host_id__unit;  /* 4:4 */
27886d7f5d3SJohn Marino     u_int8_t        status;
27986d7f5d3SJohn Marino     u_int8_t        flags;
28086d7f5d3SJohn Marino     u_int16_t       count;  /* block cnt, parameter cnt, message credits */
28186d7f5d3SJohn Marino };
28286d7f5d3SJohn Marino 
28386d7f5d3SJohn Marino 
28486d7f5d3SJohn Marino 
28586d7f5d3SJohn Marino 
28686d7f5d3SJohn Marino /* Command packet header. */
28786d7f5d3SJohn Marino struct tws_command_header {
28886d7f5d3SJohn Marino     u_int8_t        sense_data[TWS_SENSE_DATA_LENGTH];
28986d7f5d3SJohn Marino     struct { /* status block - additional sense data */
29086d7f5d3SJohn Marino         u_int16_t       srcnum;
29186d7f5d3SJohn Marino         u_int8_t        reserved;
29286d7f5d3SJohn Marino         u_int8_t        status;
29386d7f5d3SJohn Marino         u_int16_t       error;
29486d7f5d3SJohn Marino         u_int8_t        res__srcid;     /* 4:4 */
29586d7f5d3SJohn Marino         u_int8_t        res__severity;  /* 5:3 */
29686d7f5d3SJohn Marino     } status_block;
29786d7f5d3SJohn Marino     u_int8_t        err_specific_desc[TWS_ERROR_SPECIFIC_DESC_LEN];
29886d7f5d3SJohn Marino     struct { /* sense buffer descriptor */
29986d7f5d3SJohn Marino         u_int8_t        size_header;
30086d7f5d3SJohn Marino         u_int16_t       request_id;
30186d7f5d3SJohn Marino         u_int8_t        size_sense;
30286d7f5d3SJohn Marino     } header_desc;
30386d7f5d3SJohn Marino };
30486d7f5d3SJohn Marino 
30586d7f5d3SJohn Marino /* Command - 1024 byte size including header (128+24+896)*/
30686d7f5d3SJohn Marino union tws_command_giga {
30786d7f5d3SJohn Marino     struct tws_cmd_init_connect       init_connect;
30886d7f5d3SJohn Marino     struct tws_cmd_download_firmware  download_fw;
30986d7f5d3SJohn Marino     struct tws_cmd_reset_firmware     reset_fw;
31086d7f5d3SJohn Marino     struct tws_cmd_param              param;
31186d7f5d3SJohn Marino     struct tws_cmd_generic            generic;
31286d7f5d3SJohn Marino     u_int8_t        padding[1024 - sizeof(struct tws_command_header)];
31386d7f5d3SJohn Marino };
31486d7f5d3SJohn Marino 
31586d7f5d3SJohn Marino /* driver command pkt - 1024 byte size including header(128+24+744+128) */
31686d7f5d3SJohn Marino /* h/w & f/w supported command size excluding header 768 */
31786d7f5d3SJohn Marino struct tws_command_apache {
31886d7f5d3SJohn Marino     u_int8_t        res__opcode;    /* 3:5 */
31986d7f5d3SJohn Marino     u_int8_t        unit;
32086d7f5d3SJohn Marino     u_int16_t       lun_l4__req_id; /* 4:12 */
32186d7f5d3SJohn Marino     u_int8_t        status;
32286d7f5d3SJohn Marino     u_int8_t        sgl_offset;     /* offset (in bytes) to sg_list,
32386d7f5d3SJohn Marino                                      from the end of sgl_entries */
32486d7f5d3SJohn Marino     u_int16_t       lun_h4__sgl_entries;
32586d7f5d3SJohn Marino     u_int8_t        cdb[16];
32686d7f5d3SJohn Marino     u_int8_t        sg_list[744];   /* 768 - 24 */
32786d7f5d3SJohn Marino     u_int8_t        padding[128];   /* make it 1024 bytes */
32886d7f5d3SJohn Marino };
32986d7f5d3SJohn Marino 
33086d7f5d3SJohn Marino struct tws_command_packet {
33186d7f5d3SJohn Marino     struct tws_command_header hdr;
33286d7f5d3SJohn Marino     union {
33386d7f5d3SJohn Marino         union tws_command_giga pkt_g;
33486d7f5d3SJohn Marino         struct tws_command_apache pkt_a;
33586d7f5d3SJohn Marino     } cmd;
33686d7f5d3SJohn Marino };
33786d7f5d3SJohn Marino 
33886d7f5d3SJohn Marino /* Structure describing payload for get/set param commands. */
33986d7f5d3SJohn Marino struct tws_getset_param {
34086d7f5d3SJohn Marino     u_int16_t       table_id;
34186d7f5d3SJohn Marino     u_int8_t        parameter_id;
34286d7f5d3SJohn Marino     u_int8_t        reserved;
34386d7f5d3SJohn Marino     u_int16_t       parameter_size_bytes;
34486d7f5d3SJohn Marino     u_int16_t       parameter_actual_size_bytes;
34586d7f5d3SJohn Marino     u_int8_t        data[1];
34686d7f5d3SJohn Marino };
34786d7f5d3SJohn Marino 
34886d7f5d3SJohn Marino struct tws_outbound_response {
34986d7f5d3SJohn Marino     u_int32_t     not_mfa   :1;   /* 1 if the structure is valid else MFA */
35086d7f5d3SJohn Marino     u_int32_t     reserved  :7;   /* reserved bits */
35186d7f5d3SJohn Marino     u_int32_t     status    :8;   /* should be 0 */
35286d7f5d3SJohn Marino     u_int32_t     request_id:16;  /* request id */
35386d7f5d3SJohn Marino };
35486d7f5d3SJohn Marino 
35586d7f5d3SJohn Marino 
35686d7f5d3SJohn Marino /* Scatter/Gather list entry with 32 bit addresses. */
35786d7f5d3SJohn Marino struct tws_sg_desc32 {
35886d7f5d3SJohn Marino     u_int32_t     address;
35986d7f5d3SJohn Marino     u_int32_t     length  :24;
36086d7f5d3SJohn Marino     u_int32_t     flag    :8;
36186d7f5d3SJohn Marino };
36286d7f5d3SJohn Marino 
36386d7f5d3SJohn Marino /* Scatter/Gather list entry with 64 bit addresses. */
36486d7f5d3SJohn Marino struct tws_sg_desc64 {
36586d7f5d3SJohn Marino     u_int64_t     address;
36686d7f5d3SJohn Marino     u_int64_t     length   :32;
36786d7f5d3SJohn Marino     u_int64_t     reserved :24;
36886d7f5d3SJohn Marino     u_int64_t     flag     :8;
36986d7f5d3SJohn Marino };
37086d7f5d3SJohn Marino 
37186d7f5d3SJohn Marino /*
37286d7f5d3SJohn Marino  * Packet that describes an AEN/error generated by the controller,
37386d7f5d3SJohn Marino  * shared with user
37486d7f5d3SJohn Marino  */
37586d7f5d3SJohn Marino struct tws_event_packet {
37686d7f5d3SJohn Marino     u_int32_t       sequence_id;
37786d7f5d3SJohn Marino     u_int32_t       time_stamp_sec;
37886d7f5d3SJohn Marino     u_int16_t       aen_code;
37986d7f5d3SJohn Marino     u_int8_t        severity;
38086d7f5d3SJohn Marino     u_int8_t        retrieved;
38186d7f5d3SJohn Marino     u_int8_t        repeat_count;
38286d7f5d3SJohn Marino     u_int8_t        parameter_len;
38386d7f5d3SJohn Marino     u_int8_t        parameter_data[TWS_ERROR_SPECIFIC_DESC_LEN];
38486d7f5d3SJohn Marino     u_int32_t       event_src;
38586d7f5d3SJohn Marino     u_int8_t        severity_str[20];
38686d7f5d3SJohn Marino };
38786d7f5d3SJohn Marino 
38886d7f5d3SJohn Marino 
38986d7f5d3SJohn Marino 
39086d7f5d3SJohn Marino #pragma pack()
39186d7f5d3SJohn Marino 
39286d7f5d3SJohn Marino struct tws_sense {
39386d7f5d3SJohn Marino     struct tws_command_header *hdr;
39486d7f5d3SJohn Marino     u_int64_t  hdr_pkt_phy;
39586d7f5d3SJohn Marino     boolean posted;
39686d7f5d3SJohn Marino };
39786d7f5d3SJohn Marino 
39886d7f5d3SJohn Marino struct tws_request {
39986d7f5d3SJohn Marino     struct tws_command_packet *cmd_pkt; /* command pkt */
40086d7f5d3SJohn Marino     u_int64_t    cmd_pkt_phy;    /* cmd pkt physical address */
40186d7f5d3SJohn Marino     void         *data;          /* ptr to data being passed to fw */
40286d7f5d3SJohn Marino     u_int32_t    length;         /* length of data being passed to fw */
40386d7f5d3SJohn Marino 
40486d7f5d3SJohn Marino     u_int32_t    state;          /* request state */
40586d7f5d3SJohn Marino     u_int32_t    type;           /* request type */
40686d7f5d3SJohn Marino     u_int32_t    flags;          /* request flags */
40786d7f5d3SJohn Marino 
40886d7f5d3SJohn Marino     u_int32_t    error_code;     /* error encountered before submission
40986d7f5d3SJohn Marino                                         of request to fw, if any */
41086d7f5d3SJohn Marino 
41186d7f5d3SJohn Marino     u_int32_t    request_id;     /* request id for tracking with fw */
41286d7f5d3SJohn Marino     void         (*cb)(struct tws_request *);      /* callback func */
41386d7f5d3SJohn Marino     bus_dmamap_t dma_map;        /* dma map */
41486d7f5d3SJohn Marino     union ccb    *ccb_ptr;       /* pointer to ccb */
41586d7f5d3SJohn Marino     struct callout thandle;      /* handle to req timeout */
41686d7f5d3SJohn Marino     struct tws_softc *sc;        /* pointer back to ctlr softc */
41786d7f5d3SJohn Marino 
41886d7f5d3SJohn Marino     struct tws_request *next;    /* pointer to next request */
41986d7f5d3SJohn Marino     struct tws_request *prev;    /* pointer to prev request */
42086d7f5d3SJohn Marino };
421