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