xref: /openbmc/linux/drivers/scsi/esas2r/atioctl.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
126780d9eSBradley Grove /*  linux/drivers/scsi/esas2r/atioctl.h
226780d9eSBradley Grove  *      ATTO IOCTL Handling
326780d9eSBradley Grove  *
426780d9eSBradley Grove  *  Copyright (c) 2001-2013 ATTO Technology, Inc.
526780d9eSBradley Grove  *  (mailto:linuxdrivers@attotech.com)
626780d9eSBradley Grove  */
726780d9eSBradley Grove /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
826780d9eSBradley Grove /*
926780d9eSBradley Grove  *  This program is free software; you can redistribute it and/or modify
1026780d9eSBradley Grove  *  it under the terms of the GNU General Public License as published by
1126780d9eSBradley Grove  *  the Free Software Foundation; version 2 of the License.
1226780d9eSBradley Grove  *
1326780d9eSBradley Grove  *  This program is distributed in the hope that it will be useful,
1426780d9eSBradley Grove  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
1526780d9eSBradley Grove  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1626780d9eSBradley Grove  *  GNU General Public License for more details.
1726780d9eSBradley Grove  *
1826780d9eSBradley Grove  *  NO WARRANTY
1926780d9eSBradley Grove  *  THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
2026780d9eSBradley Grove  *  CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
2126780d9eSBradley Grove  *  LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
2226780d9eSBradley Grove  *  MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
2326780d9eSBradley Grove  *  solely responsible for determining the appropriateness of using and
2426780d9eSBradley Grove  *  distributing the Program and assumes all risks associated with its
2526780d9eSBradley Grove  *  exercise of rights under this Agreement, including but not limited to
2626780d9eSBradley Grove  *  the risks and costs of program errors, damage to or loss of data,
2726780d9eSBradley Grove  *  programs or equipment, and unavailability or interruption of operations.
2826780d9eSBradley Grove  *
2926780d9eSBradley Grove  *  DISCLAIMER OF LIABILITY
3026780d9eSBradley Grove  *  NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
3126780d9eSBradley Grove  *  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3226780d9eSBradley Grove  *  DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
3326780d9eSBradley Grove  *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
3426780d9eSBradley Grove  *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
3526780d9eSBradley Grove  *  USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
3626780d9eSBradley Grove  *  HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
3726780d9eSBradley Grove  *
3826780d9eSBradley Grove  *  You should have received a copy of the GNU General Public License
3926780d9eSBradley Grove  *  along with this program; if not, write to the Free Software
4026780d9eSBradley Grove  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
4126780d9eSBradley Grove  */
4226780d9eSBradley Grove /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
4326780d9eSBradley Grove 
4426780d9eSBradley Grove #include "atvda.h"
4526780d9eSBradley Grove 
4626780d9eSBradley Grove #ifndef ATIOCTL_H
4726780d9eSBradley Grove #define ATIOCTL_H
4826780d9eSBradley Grove 
4926780d9eSBradley Grove #define EXPRESS_IOCTL_SIGNATURE        "Express"
5026780d9eSBradley Grove #define EXPRESS_IOCTL_SIGNATURE_SIZE   8
5126780d9eSBradley Grove 
5226780d9eSBradley Grove /* structure definitions for IOCTls */
5326780d9eSBradley Grove 
5426780d9eSBradley Grove struct __packed atto_express_ioctl_header {
5526780d9eSBradley Grove 	u8 signature[EXPRESS_IOCTL_SIGNATURE_SIZE];
5626780d9eSBradley Grove 	u8 return_code;
5726780d9eSBradley Grove 
5826780d9eSBradley Grove #define IOCTL_SUCCESS               0
5926780d9eSBradley Grove #define IOCTL_ERR_INVCMD          101
6026780d9eSBradley Grove #define IOCTL_INIT_FAILED         102
6126780d9eSBradley Grove #define IOCTL_NOT_IMPLEMENTED     103
6226780d9eSBradley Grove #define IOCTL_BAD_CHANNEL         104
6326780d9eSBradley Grove #define IOCTL_TARGET_OVERRUN      105
6426780d9eSBradley Grove #define IOCTL_TARGET_NOT_ENABLED  106
6526780d9eSBradley Grove #define IOCTL_BAD_FLASH_IMGTYPE   107
6626780d9eSBradley Grove #define IOCTL_OUT_OF_RESOURCES    108
6726780d9eSBradley Grove #define IOCTL_GENERAL_ERROR       109
6826780d9eSBradley Grove #define IOCTL_INVALID_PARAM       110
6926780d9eSBradley Grove 
7026780d9eSBradley Grove 	u8 channel;
7126780d9eSBradley Grove 	u8 retries;
7226780d9eSBradley Grove 	u8 pad[5];
7326780d9eSBradley Grove };
7426780d9eSBradley Grove 
7526780d9eSBradley Grove /*
7626780d9eSBradley Grove  * NOTE - if channel == 0xFF, the request is
7726780d9eSBradley Grove  * handled on the adapter it came in on.
7826780d9eSBradley Grove  */
7926780d9eSBradley Grove #define MAX_NODE_NAMES  256
8026780d9eSBradley Grove 
8126780d9eSBradley Grove struct __packed atto_firmware_rw_request {
8226780d9eSBradley Grove 	u8 function;
8326780d9eSBradley Grove 	#define FUNC_FW_DOWNLOAD        0x09
8426780d9eSBradley Grove 	#define FUNC_FW_UPLOAD          0x12
8526780d9eSBradley Grove 
8626780d9eSBradley Grove 	u8 img_type;
8726780d9eSBradley Grove 	#define FW_IMG_FW               0x01
8826780d9eSBradley Grove 	#define FW_IMG_BIOS             0x02
8926780d9eSBradley Grove 	#define FW_IMG_NVR              0x03
9026780d9eSBradley Grove 	#define FW_IMG_RAW              0x04
9126780d9eSBradley Grove 	#define FW_IMG_FM_API           0x05
9226780d9eSBradley Grove 	#define FW_IMG_FS_API           0x06
9326780d9eSBradley Grove 
9426780d9eSBradley Grove 	u8 pad[2];
9526780d9eSBradley Grove 	u32 img_offset;
9626780d9eSBradley Grove 	u32 img_size;
9726780d9eSBradley Grove 	u8 image[0x80000];
9826780d9eSBradley Grove };
9926780d9eSBradley Grove 
10026780d9eSBradley Grove struct __packed atto_param_rw_request {
10126780d9eSBradley Grove 	u16 code;
10226780d9eSBradley Grove 	char data_buffer[512];
10326780d9eSBradley Grove };
10426780d9eSBradley Grove 
10526780d9eSBradley Grove #define MAX_CHANNEL 256
10626780d9eSBradley Grove 
10726780d9eSBradley Grove struct __packed atto_channel_list {
10826780d9eSBradley Grove 	u32 num_channels;
10926780d9eSBradley Grove 	u8 channel[MAX_CHANNEL];
11026780d9eSBradley Grove };
11126780d9eSBradley Grove 
11226780d9eSBradley Grove struct __packed atto_channel_info {
11326780d9eSBradley Grove 	u8 major_rev;
11426780d9eSBradley Grove 	u8 minor_rev;
11526780d9eSBradley Grove 	u8 IRQ;
11626780d9eSBradley Grove 	u8 revision_id;
11726780d9eSBradley Grove 	u8 pci_bus;
11826780d9eSBradley Grove 	u8 pci_dev_func;
11926780d9eSBradley Grove 	u8 core_rev;
12026780d9eSBradley Grove 	u8 host_no;
12126780d9eSBradley Grove 	u16 device_id;
12226780d9eSBradley Grove 	u16 vendor_id;
12326780d9eSBradley Grove 	u16 ven_dev_id;
12426780d9eSBradley Grove 	u8 pad[3];
12526780d9eSBradley Grove 	u32 hbaapi_rev;
12626780d9eSBradley Grove };
12726780d9eSBradley Grove 
12826780d9eSBradley Grove /*
12926780d9eSBradley Grove  * CSMI control codes
13026780d9eSBradley Grove  * class independent
13126780d9eSBradley Grove  */
13226780d9eSBradley Grove #define CSMI_CC_GET_DRVR_INFO        1
13326780d9eSBradley Grove #define CSMI_CC_GET_CNTLR_CFG        2
13426780d9eSBradley Grove #define CSMI_CC_GET_CNTLR_STS        3
13526780d9eSBradley Grove #define CSMI_CC_FW_DOWNLOAD          4
13626780d9eSBradley Grove 
13726780d9eSBradley Grove /* RAID class */
13826780d9eSBradley Grove #define CSMI_CC_GET_RAID_INFO        10
13926780d9eSBradley Grove #define CSMI_CC_GET_RAID_CFG         11
14026780d9eSBradley Grove 
14126780d9eSBradley Grove /* HBA class */
14226780d9eSBradley Grove #define CSMI_CC_GET_PHY_INFO         20
14326780d9eSBradley Grove #define CSMI_CC_SET_PHY_INFO         21
14426780d9eSBradley Grove #define CSMI_CC_GET_LINK_ERRORS      22
14526780d9eSBradley Grove #define CSMI_CC_SMP_PASSTHRU         23
14626780d9eSBradley Grove #define CSMI_CC_SSP_PASSTHRU         24
14726780d9eSBradley Grove #define CSMI_CC_STP_PASSTHRU         25
14826780d9eSBradley Grove #define CSMI_CC_GET_SATA_SIG         26
14926780d9eSBradley Grove #define CSMI_CC_GET_SCSI_ADDR        27
15026780d9eSBradley Grove #define CSMI_CC_GET_DEV_ADDR         28
15126780d9eSBradley Grove #define CSMI_CC_TASK_MGT             29
15226780d9eSBradley Grove #define CSMI_CC_GET_CONN_INFO        30
15326780d9eSBradley Grove 
15426780d9eSBradley Grove /* PHY class */
15526780d9eSBradley Grove #define CSMI_CC_PHY_CTRL             60
15626780d9eSBradley Grove 
15726780d9eSBradley Grove /*
15826780d9eSBradley Grove  * CSMI status codes
15926780d9eSBradley Grove  * class independent
16026780d9eSBradley Grove  */
16126780d9eSBradley Grove #define CSMI_STS_SUCCESS             0
16226780d9eSBradley Grove #define CSMI_STS_FAILED              1
16326780d9eSBradley Grove #define CSMI_STS_BAD_CTRL_CODE       2
16426780d9eSBradley Grove #define CSMI_STS_INV_PARAM           3
16526780d9eSBradley Grove #define CSMI_STS_WRITE_ATTEMPTED     4
16626780d9eSBradley Grove 
16726780d9eSBradley Grove /* RAID class */
16826780d9eSBradley Grove #define CSMI_STS_INV_RAID_SET        1000
16926780d9eSBradley Grove 
17026780d9eSBradley Grove /* HBA class */
17126780d9eSBradley Grove #define CSMI_STS_PHY_CHANGED         CSMI_STS_SUCCESS
17226780d9eSBradley Grove #define CSMI_STS_PHY_UNCHANGEABLE    2000
17326780d9eSBradley Grove #define CSMI_STS_INV_LINK_RATE       2001
17426780d9eSBradley Grove #define CSMI_STS_INV_PHY             2002
17526780d9eSBradley Grove #define CSMI_STS_INV_PHY_FOR_PORT    2003
17626780d9eSBradley Grove #define CSMI_STS_PHY_UNSELECTABLE    2004
17726780d9eSBradley Grove #define CSMI_STS_SELECT_PHY_OR_PORT  2005
17826780d9eSBradley Grove #define CSMI_STS_INV_PORT            2006
17926780d9eSBradley Grove #define CSMI_STS_PORT_UNSELECTABLE   2007
18026780d9eSBradley Grove #define CSMI_STS_CONNECTION_FAILED   2008
18126780d9eSBradley Grove #define CSMI_STS_NO_SATA_DEV         2009
18226780d9eSBradley Grove #define CSMI_STS_NO_SATA_SIGNATURE   2010
18326780d9eSBradley Grove #define CSMI_STS_SCSI_EMULATION      2011
18426780d9eSBradley Grove #define CSMI_STS_NOT_AN_END_DEV      2012
18526780d9eSBradley Grove #define CSMI_STS_NO_SCSI_ADDR        2013
18626780d9eSBradley Grove #define CSMI_STS_NO_DEV_ADDR         2014
18726780d9eSBradley Grove 
18826780d9eSBradley Grove /* CSMI class independent structures */
18926780d9eSBradley Grove struct atto_csmi_get_driver_info {
19026780d9eSBradley Grove 	char name[81];
19126780d9eSBradley Grove 	char description[81];
19226780d9eSBradley Grove 	u16 major_rev;
19326780d9eSBradley Grove 	u16 minor_rev;
19426780d9eSBradley Grove 	u16 build_rev;
19526780d9eSBradley Grove 	u16 release_rev;
19626780d9eSBradley Grove 	u16 csmi_major_rev;
19726780d9eSBradley Grove 	u16 csmi_minor_rev;
19826780d9eSBradley Grove 	#define CSMI_MAJOR_REV_0_81      0
19926780d9eSBradley Grove 	#define CSMI_MINOR_REV_0_81      81
20026780d9eSBradley Grove 
20126780d9eSBradley Grove 	#define CSMI_MAJOR_REV           CSMI_MAJOR_REV_0_81
20226780d9eSBradley Grove 	#define CSMI_MINOR_REV           CSMI_MINOR_REV_0_81
20326780d9eSBradley Grove };
20426780d9eSBradley Grove 
20526780d9eSBradley Grove struct atto_csmi_get_pci_bus_addr {
20626780d9eSBradley Grove 	u8 bus_num;
20726780d9eSBradley Grove 	u8 device_num;
20826780d9eSBradley Grove 	u8 function_num;
20926780d9eSBradley Grove 	u8 reserved;
21026780d9eSBradley Grove };
21126780d9eSBradley Grove 
21226780d9eSBradley Grove struct atto_csmi_get_cntlr_cfg {
21326780d9eSBradley Grove 	u32 base_io_addr;
21426780d9eSBradley Grove 
21526780d9eSBradley Grove 	struct {
21626780d9eSBradley Grove 		u32 base_memaddr_lo;
21726780d9eSBradley Grove 		u32 base_memaddr_hi;
21826780d9eSBradley Grove 	};
21926780d9eSBradley Grove 
22026780d9eSBradley Grove 	u32 board_id;
22126780d9eSBradley Grove 	u16 slot_num;
22226780d9eSBradley Grove 	#define CSMI_SLOT_NUM_UNKNOWN    0xFFFF
22326780d9eSBradley Grove 
22426780d9eSBradley Grove 	u8 cntlr_class;
22526780d9eSBradley Grove 	#define CSMI_CNTLR_CLASS_HBA     5
22626780d9eSBradley Grove 
22726780d9eSBradley Grove 	u8 io_bus_type;
22826780d9eSBradley Grove 	#define CSMI_BUS_TYPE_PCI        3
22926780d9eSBradley Grove 	#define CSMI_BUS_TYPE_PCMCIA     4
23026780d9eSBradley Grove 
23126780d9eSBradley Grove 	union {
23226780d9eSBradley Grove 		struct atto_csmi_get_pci_bus_addr pci_addr;
23326780d9eSBradley Grove 		u8 reserved[32];
23426780d9eSBradley Grove 	};
23526780d9eSBradley Grove 
23626780d9eSBradley Grove 	char serial_num[81];
23726780d9eSBradley Grove 	u16 major_rev;
23826780d9eSBradley Grove 	u16 minor_rev;
23926780d9eSBradley Grove 	u16 build_rev;
24026780d9eSBradley Grove 	u16 release_rev;
24126780d9eSBradley Grove 	u16 bios_major_rev;
24226780d9eSBradley Grove 	u16 bios_minor_rev;
24326780d9eSBradley Grove 	u16 bios_build_rev;
24426780d9eSBradley Grove 	u16 bios_release_rev;
24526780d9eSBradley Grove 	u32 cntlr_flags;
24626780d9eSBradley Grove 	#define CSMI_CNTLRF_SAS_HBA      0x00000001
24726780d9eSBradley Grove 	#define CSMI_CNTLRF_SAS_RAID     0x00000002
24826780d9eSBradley Grove 	#define CSMI_CNTLRF_SATA_HBA     0x00000004
24926780d9eSBradley Grove 	#define CSMI_CNTLRF_SATA_RAID    0x00000008
25026780d9eSBradley Grove 	#define CSMI_CNTLRF_FWD_SUPPORT  0x00010000
25126780d9eSBradley Grove 	#define CSMI_CNTLRF_FWD_ONLINE   0x00020000
25226780d9eSBradley Grove 	#define CSMI_CNTLRF_FWD_SRESET   0x00040000
25326780d9eSBradley Grove 	#define CSMI_CNTLRF_FWD_HRESET   0x00080000
25426780d9eSBradley Grove 	#define CSMI_CNTLRF_FWD_RROM     0x00100000
25526780d9eSBradley Grove 
25626780d9eSBradley Grove 	u16 rrom_major_rev;
25726780d9eSBradley Grove 	u16 rrom_minor_rev;
25826780d9eSBradley Grove 	u16 rrom_build_rev;
25926780d9eSBradley Grove 	u16 rrom_release_rev;
26026780d9eSBradley Grove 	u16 rrom_biosmajor_rev;
26126780d9eSBradley Grove 	u16 rrom_biosminor_rev;
26226780d9eSBradley Grove 	u16 rrom_biosbuild_rev;
26326780d9eSBradley Grove 	u16 rrom_biosrelease_rev;
26426780d9eSBradley Grove 	u8 reserved2[7];
26526780d9eSBradley Grove };
26626780d9eSBradley Grove 
26726780d9eSBradley Grove struct atto_csmi_get_cntlr_sts {
26826780d9eSBradley Grove 	u32 status;
26926780d9eSBradley Grove 	#define CSMI_CNTLR_STS_GOOD          1
27026780d9eSBradley Grove 	#define CSMI_CNTLR_STS_FAILED        2
27126780d9eSBradley Grove 	#define CSMI_CNTLR_STS_OFFLINE       3
27226780d9eSBradley Grove 	#define CSMI_CNTLR_STS_POWEROFF      4
27326780d9eSBradley Grove 
27426780d9eSBradley Grove 	u32 offline_reason;
27526780d9eSBradley Grove 	#define CSMI_OFFLINE_NO_REASON       0
27626780d9eSBradley Grove 	#define CSMI_OFFLINE_INITIALIZING    1
27726780d9eSBradley Grove 	#define CSMI_OFFLINE_BUS_DEGRADED    2
27826780d9eSBradley Grove 	#define CSMI_OFFLINE_BUS_FAILURE     3
27926780d9eSBradley Grove 
28026780d9eSBradley Grove 	u8 reserved[28];
28126780d9eSBradley Grove };
28226780d9eSBradley Grove 
28326780d9eSBradley Grove struct atto_csmi_fw_download {
28426780d9eSBradley Grove 	u32 buffer_len;
28526780d9eSBradley Grove 	u32 download_flags;
28626780d9eSBradley Grove 	#define CSMI_FWDF_VALIDATE       0x00000001
28726780d9eSBradley Grove 	#define CSMI_FWDF_SOFT_RESET     0x00000002
28826780d9eSBradley Grove 	#define CSMI_FWDF_HARD_RESET     0x00000004
28926780d9eSBradley Grove 
29026780d9eSBradley Grove 	u8 reserved[32];
29126780d9eSBradley Grove 	u16 status;
29226780d9eSBradley Grove 	#define CSMI_FWD_STS_SUCCESS     0
29326780d9eSBradley Grove 	#define CSMI_FWD_STS_FAILED      1
29426780d9eSBradley Grove 	#define CSMI_FWD_STS_USING_RROM  2
29526780d9eSBradley Grove 	#define CSMI_FWD_STS_REJECT      3
29626780d9eSBradley Grove 	#define CSMI_FWD_STS_DOWNREV     4
29726780d9eSBradley Grove 
29826780d9eSBradley Grove 	u16 severity;
29926780d9eSBradley Grove 	#define CSMI_FWD_SEV_INFO        0
30026780d9eSBradley Grove 	#define CSMI_FWD_SEV_WARNING     1
30126780d9eSBradley Grove 	#define CSMI_FWD_SEV_ERROR       2
30226780d9eSBradley Grove 	#define CSMI_FWD_SEV_FATAL       3
30326780d9eSBradley Grove 
30426780d9eSBradley Grove };
30526780d9eSBradley Grove 
30626780d9eSBradley Grove /* CSMI RAID class structures */
30726780d9eSBradley Grove struct atto_csmi_get_raid_info {
30826780d9eSBradley Grove 	u32 num_raid_sets;
30926780d9eSBradley Grove 	u32 max_drivesper_set;
31026780d9eSBradley Grove 	u8 reserved[92];
31126780d9eSBradley Grove };
31226780d9eSBradley Grove 
31326780d9eSBradley Grove struct atto_csmi_raid_drives {
31426780d9eSBradley Grove 	char model[40];
31526780d9eSBradley Grove 	char firmware[8];
31626780d9eSBradley Grove 	char serial_num[40];
31726780d9eSBradley Grove 	u8 sas_addr[8];
31826780d9eSBradley Grove 	u8 lun[8];
31926780d9eSBradley Grove 	u8 drive_sts;
32026780d9eSBradley Grove 	#define CSMI_DRV_STS_OK          0
32126780d9eSBradley Grove 	#define CSMI_DRV_STS_REBUILDING  1
32226780d9eSBradley Grove 	#define CSMI_DRV_STS_FAILED      2
32326780d9eSBradley Grove 	#define CSMI_DRV_STS_DEGRADED    3
32426780d9eSBradley Grove 
32526780d9eSBradley Grove 	u8 drive_usage;
32626780d9eSBradley Grove 	#define CSMI_DRV_USE_NOT_USED    0
32726780d9eSBradley Grove 	#define CSMI_DRV_USE_MEMBER      1
32826780d9eSBradley Grove 	#define CSMI_DRV_USE_SPARE       2
32926780d9eSBradley Grove 
33026780d9eSBradley Grove 	u8 reserved[30]; /* spec says 22 */
33126780d9eSBradley Grove };
33226780d9eSBradley Grove 
33326780d9eSBradley Grove struct atto_csmi_get_raid_cfg {
33426780d9eSBradley Grove 	u32 raid_set_index;
33526780d9eSBradley Grove 	u32 capacity;
33626780d9eSBradley Grove 	u32 stripe_size;
33726780d9eSBradley Grove 	u8 raid_type;
33826780d9eSBradley Grove 	u8 status;
33926780d9eSBradley Grove 	u8 information;
34026780d9eSBradley Grove 	u8 drive_cnt;
34126780d9eSBradley Grove 	u8 reserved[20];
34226780d9eSBradley Grove 
34326780d9eSBradley Grove 	struct atto_csmi_raid_drives drives[1];
34426780d9eSBradley Grove };
34526780d9eSBradley Grove 
34626780d9eSBradley Grove /* CSMI HBA class structures */
34726780d9eSBradley Grove struct atto_csmi_phy_entity {
34826780d9eSBradley Grove 	u8 ident_frame[0x1C];
34926780d9eSBradley Grove 	u8 port_id;
35026780d9eSBradley Grove 	u8 neg_link_rate;
35126780d9eSBradley Grove 	u8 min_link_rate;
35226780d9eSBradley Grove 	u8 max_link_rate;
35326780d9eSBradley Grove 	u8 phy_change_cnt;
35426780d9eSBradley Grove 	u8 auto_discover;
35526780d9eSBradley Grove 	#define CSMI_DISC_NOT_SUPPORTED  0x00
35626780d9eSBradley Grove 	#define CSMI_DISC_NOT_STARTED    0x01
35726780d9eSBradley Grove 	#define CSMI_DISC_IN_PROGRESS    0x02
35826780d9eSBradley Grove 	#define CSMI_DISC_COMPLETE       0x03
35926780d9eSBradley Grove 	#define CSMI_DISC_ERROR          0x04
36026780d9eSBradley Grove 
36126780d9eSBradley Grove 	u8 reserved[2];
36226780d9eSBradley Grove 	u8 attach_ident_frame[0x1C];
36326780d9eSBradley Grove };
36426780d9eSBradley Grove 
36526780d9eSBradley Grove struct atto_csmi_get_phy_info {
36626780d9eSBradley Grove 	u8 number_of_phys;
36726780d9eSBradley Grove 	u8 reserved[3];
36826780d9eSBradley Grove 	struct atto_csmi_phy_entity
36926780d9eSBradley Grove 		phy[32];
37026780d9eSBradley Grove };
37126780d9eSBradley Grove 
37226780d9eSBradley Grove struct atto_csmi_set_phy_info {
37326780d9eSBradley Grove 	u8 phy_id;
37426780d9eSBradley Grove 	u8 neg_link_rate;
37526780d9eSBradley Grove 	#define CSMI_NEG_RATE_NEGOTIATE  0x00
37626780d9eSBradley Grove 	#define CSMI_NEG_RATE_PHY_DIS    0x01
37726780d9eSBradley Grove 
37826780d9eSBradley Grove 	u8 prog_minlink_rate;
37926780d9eSBradley Grove 	u8 prog_maxlink_rate;
38026780d9eSBradley Grove 	u8 signal_class;
38126780d9eSBradley Grove 	#define CSMI_SIG_CLASS_UNKNOWN   0x00
38226780d9eSBradley Grove 	#define CSMI_SIG_CLASS_DIRECT    0x01
38326780d9eSBradley Grove 	#define CSMI_SIG_CLASS_SERVER    0x02
38426780d9eSBradley Grove 	#define CSMI_SIG_CLASS_ENCLOSURE 0x03
38526780d9eSBradley Grove 
38626780d9eSBradley Grove 	u8 reserved[3];
38726780d9eSBradley Grove };
38826780d9eSBradley Grove 
38926780d9eSBradley Grove struct atto_csmi_get_link_errors {
39026780d9eSBradley Grove 	u8 phy_id;
39126780d9eSBradley Grove 	u8 reset_cnts;
39226780d9eSBradley Grove 	#define CSMI_RESET_CNTS_NO       0x00
39326780d9eSBradley Grove 	#define CSMI_RESET_CNTS_YES      0x01
39426780d9eSBradley Grove 
39526780d9eSBradley Grove 	u8 reserved[2];
39626780d9eSBradley Grove 	u32 inv_dw_cnt;
39726780d9eSBradley Grove 	u32 disp_err_cnt;
39826780d9eSBradley Grove 	u32 loss_ofdw_sync_cnt;
39926780d9eSBradley Grove 	u32 phy_reseterr_cnt;
40026780d9eSBradley Grove 
40126780d9eSBradley Grove 	/*
40226780d9eSBradley Grove 	 * The following field has been added by ATTO for ease of
40326780d9eSBradley Grove 	 * implementation of additional statistics.  Drivers must validate
40426780d9eSBradley Grove 	 * the length of the IOCTL payload prior to filling them in so CSMI
40526780d9eSBradley Grove 	 * complaint applications function correctly.
40626780d9eSBradley Grove 	 */
40726780d9eSBradley Grove 
40826780d9eSBradley Grove 	u32 crc_err_cnt;
40926780d9eSBradley Grove };
41026780d9eSBradley Grove 
41126780d9eSBradley Grove struct atto_csmi_smp_passthru {
41226780d9eSBradley Grove 	u8 phy_id;
41326780d9eSBradley Grove 	u8 port_id;
41426780d9eSBradley Grove 	u8 conn_rate;
41526780d9eSBradley Grove 	u8 reserved;
41626780d9eSBradley Grove 	u8 dest_sas_addr[8];
41726780d9eSBradley Grove 	u32 req_len;
41826780d9eSBradley Grove 	u8 smp_req[1020];
41926780d9eSBradley Grove 	u8 conn_sts;
42026780d9eSBradley Grove 	u8 reserved2[3];
42126780d9eSBradley Grove 	u32 rsp_len;
42226780d9eSBradley Grove 	u8 smp_rsp[1020];
42326780d9eSBradley Grove };
42426780d9eSBradley Grove 
42526780d9eSBradley Grove struct atto_csmi_ssp_passthru_sts {
42626780d9eSBradley Grove 	u8 conn_sts;
42726780d9eSBradley Grove 	u8 reserved[3];
42826780d9eSBradley Grove 	u8 data_present;
42926780d9eSBradley Grove 	u8 status;
43026780d9eSBradley Grove 	u16 rsp_length;
43126780d9eSBradley Grove 	u8 rsp[256];
43226780d9eSBradley Grove 	u32 data_bytes;
43326780d9eSBradley Grove };
43426780d9eSBradley Grove 
43526780d9eSBradley Grove struct atto_csmi_ssp_passthru {
43626780d9eSBradley Grove 	u8 phy_id;
43726780d9eSBradley Grove 	u8 port_id;
43826780d9eSBradley Grove 	u8 conn_rate;
43926780d9eSBradley Grove 	u8 reserved;
44026780d9eSBradley Grove 	u8 dest_sas_addr[8];
44126780d9eSBradley Grove 	u8 lun[8];
44226780d9eSBradley Grove 	u8 cdb_len;
44326780d9eSBradley Grove 	u8 add_cdb_len;
44426780d9eSBradley Grove 	u8 reserved2[2];
44526780d9eSBradley Grove 	u8 cdb[16];
44626780d9eSBradley Grove 	u32 flags;
44726780d9eSBradley Grove 	#define CSMI_SSPF_DD_READ        0x00000001
44826780d9eSBradley Grove 	#define CSMI_SSPF_DD_WRITE       0x00000002
44926780d9eSBradley Grove 	#define CSMI_SSPF_DD_UNSPECIFIED 0x00000004
45026780d9eSBradley Grove 	#define CSMI_SSPF_TA_SIMPLE      0x00000000
45126780d9eSBradley Grove 	#define CSMI_SSPF_TA_HEAD_OF_Q   0x00000010
45226780d9eSBradley Grove 	#define CSMI_SSPF_TA_ORDERED     0x00000020
45326780d9eSBradley Grove 	#define CSMI_SSPF_TA_ACA         0x00000040
45426780d9eSBradley Grove 
45526780d9eSBradley Grove 	u8 add_cdb[24];
45626780d9eSBradley Grove 	u32 data_len;
45726780d9eSBradley Grove 
45826780d9eSBradley Grove 	struct atto_csmi_ssp_passthru_sts sts;
45926780d9eSBradley Grove };
46026780d9eSBradley Grove 
46126780d9eSBradley Grove struct atto_csmi_stp_passthru_sts {
46226780d9eSBradley Grove 	u8 conn_sts;
46326780d9eSBradley Grove 	u8 reserved[3];
46426780d9eSBradley Grove 	u8 sts_fis[20];
46526780d9eSBradley Grove 	u32 scr[16];
46626780d9eSBradley Grove 	u32 data_bytes;
46726780d9eSBradley Grove };
46826780d9eSBradley Grove 
46926780d9eSBradley Grove struct atto_csmi_stp_passthru {
47026780d9eSBradley Grove 	u8 phy_id;
47126780d9eSBradley Grove 	u8 port_id;
47226780d9eSBradley Grove 	u8 conn_rate;
47326780d9eSBradley Grove 	u8 reserved;
47426780d9eSBradley Grove 	u8 dest_sas_addr[8];
47526780d9eSBradley Grove 	u8 reserved2[4];
47626780d9eSBradley Grove 	u8 command_fis[20];
47726780d9eSBradley Grove 	u32 flags;
47826780d9eSBradley Grove 	#define CSMI_STPF_DD_READ        0x00000001
47926780d9eSBradley Grove 	#define CSMI_STPF_DD_WRITE       0x00000002
48026780d9eSBradley Grove 	#define CSMI_STPF_DD_UNSPECIFIED 0x00000004
48126780d9eSBradley Grove 	#define CSMI_STPF_PIO            0x00000010
48226780d9eSBradley Grove 	#define CSMI_STPF_DMA            0x00000020
48326780d9eSBradley Grove 	#define CSMI_STPF_PACKET         0x00000040
48426780d9eSBradley Grove 	#define CSMI_STPF_DMA_QUEUED     0x00000080
48526780d9eSBradley Grove 	#define CSMI_STPF_EXECUTE_DIAG   0x00000100
48626780d9eSBradley Grove 	#define CSMI_STPF_RESET_DEVICE   0x00000200
48726780d9eSBradley Grove 
48826780d9eSBradley Grove 	u32 data_len;
48926780d9eSBradley Grove 
49026780d9eSBradley Grove 	struct atto_csmi_stp_passthru_sts sts;
49126780d9eSBradley Grove };
49226780d9eSBradley Grove 
49326780d9eSBradley Grove struct atto_csmi_get_sata_sig {
49426780d9eSBradley Grove 	u8 phy_id;
49526780d9eSBradley Grove 	u8 reserved[3];
49626780d9eSBradley Grove 	u8 reg_dth_fis[20];
49726780d9eSBradley Grove };
49826780d9eSBradley Grove 
49926780d9eSBradley Grove struct atto_csmi_get_scsi_addr {
50026780d9eSBradley Grove 	u8 sas_addr[8];
50126780d9eSBradley Grove 	u8 sas_lun[8];
50226780d9eSBradley Grove 	u8 host_index;
50326780d9eSBradley Grove 	u8 path_id;
50426780d9eSBradley Grove 	u8 target_id;
50526780d9eSBradley Grove 	u8 lun;
50626780d9eSBradley Grove };
50726780d9eSBradley Grove 
50826780d9eSBradley Grove struct atto_csmi_get_dev_addr {
50926780d9eSBradley Grove 	u8 host_index;
51026780d9eSBradley Grove 	u8 path_id;
51126780d9eSBradley Grove 	u8 target_id;
51226780d9eSBradley Grove 	u8 lun;
51326780d9eSBradley Grove 	u8 sas_addr[8];
51426780d9eSBradley Grove 	u8 sas_lun[8];
51526780d9eSBradley Grove };
51626780d9eSBradley Grove 
51726780d9eSBradley Grove struct atto_csmi_task_mgmt {
51826780d9eSBradley Grove 	u8 host_index;
51926780d9eSBradley Grove 	u8 path_id;
52026780d9eSBradley Grove 	u8 target_id;
52126780d9eSBradley Grove 	u8 lun;
52226780d9eSBradley Grove 	u32 flags;
52326780d9eSBradley Grove 	#define CSMI_TMF_TASK_IU         0x00000001
52426780d9eSBradley Grove 	#define CSMI_TMF_HARD_RST        0x00000002
52526780d9eSBradley Grove 	#define CSMI_TMF_SUPPRESS_RSLT   0x00000004
52626780d9eSBradley Grove 
52726780d9eSBradley Grove 	u32 queue_tag;
52826780d9eSBradley Grove 	u32 reserved;
52926780d9eSBradley Grove 	u8 task_mgt_func;
53026780d9eSBradley Grove 	u8 reserved2[7];
53126780d9eSBradley Grove 	u32 information;
53226780d9eSBradley Grove 	#define CSMI_TM_INFO_TEST        1
53326780d9eSBradley Grove 	#define CSMI_TM_INFO_EXCEEDED    2
53426780d9eSBradley Grove 	#define CSMI_TM_INFO_DEMAND      3
53526780d9eSBradley Grove 	#define CSMI_TM_INFO_TRIGGER     4
53626780d9eSBradley Grove 
53726780d9eSBradley Grove 	struct atto_csmi_ssp_passthru_sts sts;
53826780d9eSBradley Grove 
53926780d9eSBradley Grove };
54026780d9eSBradley Grove 
54126780d9eSBradley Grove struct atto_csmi_get_conn_info {
54226780d9eSBradley Grove 	u32 pinout;
54326780d9eSBradley Grove 	#define CSMI_CON_UNKNOWN         0x00000001
54426780d9eSBradley Grove 	#define CSMI_CON_SFF_8482        0x00000002
54526780d9eSBradley Grove 	#define CSMI_CON_SFF_8470_LANE_1 0x00000100
54626780d9eSBradley Grove 	#define CSMI_CON_SFF_8470_LANE_2 0x00000200
54726780d9eSBradley Grove 	#define CSMI_CON_SFF_8470_LANE_3 0x00000400
54826780d9eSBradley Grove 	#define CSMI_CON_SFF_8470_LANE_4 0x00000800
54926780d9eSBradley Grove 	#define CSMI_CON_SFF_8484_LANE_1 0x00010000
55026780d9eSBradley Grove 	#define CSMI_CON_SFF_8484_LANE_2 0x00020000
55126780d9eSBradley Grove 	#define CSMI_CON_SFF_8484_LANE_3 0x00040000
55226780d9eSBradley Grove 	#define CSMI_CON_SFF_8484_LANE_4 0x00080000
55326780d9eSBradley Grove 
55426780d9eSBradley Grove 	u8 connector[16];
55526780d9eSBradley Grove 	u8 location;
55626780d9eSBradley Grove 	#define CSMI_CON_INTERNAL        0x02
55726780d9eSBradley Grove 	#define CSMI_CON_EXTERNAL        0x04
55826780d9eSBradley Grove 	#define CSMI_CON_SWITCHABLE      0x08
55926780d9eSBradley Grove 	#define CSMI_CON_AUTO            0x10
56026780d9eSBradley Grove 
56126780d9eSBradley Grove 	u8 reserved[15];
56226780d9eSBradley Grove };
56326780d9eSBradley Grove 
56426780d9eSBradley Grove /* CSMI PHY class structures */
56526780d9eSBradley Grove struct atto_csmi_character {
56626780d9eSBradley Grove 	u8 type_flags;
56726780d9eSBradley Grove 	#define CSMI_CTF_POS_DISP        0x01
56826780d9eSBradley Grove 	#define CSMI_CTF_NEG_DISP        0x02
56926780d9eSBradley Grove 	#define CSMI_CTF_CTRL_CHAR       0x04
57026780d9eSBradley Grove 
57126780d9eSBradley Grove 	u8 value;
57226780d9eSBradley Grove };
57326780d9eSBradley Grove 
57426780d9eSBradley Grove struct atto_csmi_pc_ctrl {
57526780d9eSBradley Grove 	u8 type;
57626780d9eSBradley Grove 	#define CSMI_PC_TYPE_UNDEFINED   0x00
57726780d9eSBradley Grove 	#define CSMI_PC_TYPE_SATA        0x01
57826780d9eSBradley Grove 	#define CSMI_PC_TYPE_SAS         0x02
57926780d9eSBradley Grove 	u8 rate;
58026780d9eSBradley Grove 	u8 reserved[6];
58126780d9eSBradley Grove 	u32 vendor_unique[8];
58226780d9eSBradley Grove 	u32 tx_flags;
58326780d9eSBradley Grove 	#define CSMI_PC_TXF_PREEMP_DIS   0x00000001
58426780d9eSBradley Grove 
58526780d9eSBradley Grove 	signed char tx_amplitude;
58626780d9eSBradley Grove 	signed char tx_preemphasis;
58726780d9eSBradley Grove 	signed char tx_slew_rate;
58826780d9eSBradley Grove 	signed char tx_reserved[13];
58926780d9eSBradley Grove 	u8 tx_vendor_unique[64];
59026780d9eSBradley Grove 	u32 rx_flags;
59126780d9eSBradley Grove 	#define CSMI_PC_RXF_EQ_DIS       0x00000001
59226780d9eSBradley Grove 
59326780d9eSBradley Grove 	signed char rx_threshold;
59426780d9eSBradley Grove 	signed char rx_equalization_gain;
59526780d9eSBradley Grove 	signed char rx_reserved[14];
59626780d9eSBradley Grove 	u8 rx_vendor_unique[64];
59726780d9eSBradley Grove 	u32 pattern_flags;
59826780d9eSBradley Grove 	#define CSMI_PC_PATF_FIXED       0x00000001
59926780d9eSBradley Grove 	#define CSMI_PC_PATF_DIS_SCR     0x00000002
60026780d9eSBradley Grove 	#define CSMI_PC_PATF_DIS_ALIGN   0x00000004
60126780d9eSBradley Grove 	#define CSMI_PC_PATF_DIS_SSC     0x00000008
60226780d9eSBradley Grove 
60326780d9eSBradley Grove 	u8 fixed_pattern;
60426780d9eSBradley Grove 	#define CSMI_PC_FP_CJPAT         0x00000001
60526780d9eSBradley Grove 	#define CSMI_PC_FP_ALIGN         0x00000002
60626780d9eSBradley Grove 
60726780d9eSBradley Grove 	u8 user_pattern_len;
60826780d9eSBradley Grove 	u8 pattern_reserved[6];
60926780d9eSBradley Grove 
61026780d9eSBradley Grove 	struct atto_csmi_character user_pattern_buffer[16];
61126780d9eSBradley Grove };
61226780d9eSBradley Grove 
61326780d9eSBradley Grove struct atto_csmi_phy_ctrl {
61426780d9eSBradley Grove 	u32 function;
61526780d9eSBradley Grove 	#define CSMI_PC_FUNC_GET_SETUP   0x00000100
61626780d9eSBradley Grove 
61726780d9eSBradley Grove 	u8 phy_id;
61826780d9eSBradley Grove 	u16 len_of_cntl;
61926780d9eSBradley Grove 	u8 num_of_cntls;
62026780d9eSBradley Grove 	u8 reserved[4];
62126780d9eSBradley Grove 	u32 link_flags;
62226780d9eSBradley Grove 	#define CSMI_PHY_ACTIVATE_CTRL   0x00000001
62326780d9eSBradley Grove 	#define CSMI_PHY_UPD_SPINUP_RATE 0x00000002
62426780d9eSBradley Grove 	#define CSMI_PHY_AUTO_COMWAKE    0x00000004
62526780d9eSBradley Grove 
62626780d9eSBradley Grove 	u8 spinup_rate;
62726780d9eSBradley Grove 	u8 link_reserved[7];
62826780d9eSBradley Grove 	u32 vendor_unique[8];
62926780d9eSBradley Grove 
63026780d9eSBradley Grove 	struct atto_csmi_pc_ctrl control[1];
63126780d9eSBradley Grove };
63226780d9eSBradley Grove 
63326780d9eSBradley Grove union atto_ioctl_csmi {
63426780d9eSBradley Grove 	struct atto_csmi_get_driver_info drvr_info;
63526780d9eSBradley Grove 	struct atto_csmi_get_cntlr_cfg cntlr_cfg;
63626780d9eSBradley Grove 	struct atto_csmi_get_cntlr_sts cntlr_sts;
63726780d9eSBradley Grove 	struct atto_csmi_fw_download fw_dwnld;
63826780d9eSBradley Grove 	struct atto_csmi_get_raid_info raid_info;
63926780d9eSBradley Grove 	struct atto_csmi_get_raid_cfg raid_cfg;
64026780d9eSBradley Grove 	struct atto_csmi_get_phy_info get_phy_info;
64126780d9eSBradley Grove 	struct atto_csmi_set_phy_info set_phy_info;
64226780d9eSBradley Grove 	struct atto_csmi_get_link_errors link_errs;
64326780d9eSBradley Grove 	struct atto_csmi_smp_passthru smp_pass_thru;
64426780d9eSBradley Grove 	struct atto_csmi_ssp_passthru ssp_pass_thru;
64526780d9eSBradley Grove 	struct atto_csmi_stp_passthru stp_pass_thru;
64626780d9eSBradley Grove 	struct atto_csmi_task_mgmt tsk_mgt;
64726780d9eSBradley Grove 	struct atto_csmi_get_sata_sig sata_sig;
64826780d9eSBradley Grove 	struct atto_csmi_get_scsi_addr scsi_addr;
64926780d9eSBradley Grove 	struct atto_csmi_get_dev_addr dev_addr;
65026780d9eSBradley Grove 	struct atto_csmi_get_conn_info conn_info[32];
65126780d9eSBradley Grove 	struct atto_csmi_phy_ctrl phy_ctrl;
65226780d9eSBradley Grove };
65326780d9eSBradley Grove 
65426780d9eSBradley Grove struct atto_csmi {
65526780d9eSBradley Grove 	u32 control_code;
65626780d9eSBradley Grove 	u32 status;
65726780d9eSBradley Grove 	union atto_ioctl_csmi data;
65826780d9eSBradley Grove };
65926780d9eSBradley Grove 
66026780d9eSBradley Grove struct atto_module_info {
66126780d9eSBradley Grove 	void *adapter;
66226780d9eSBradley Grove 	void *pci_dev;
66326780d9eSBradley Grove 	void *scsi_host;
66426780d9eSBradley Grove 	unsigned short host_no;
66526780d9eSBradley Grove 	union {
66626780d9eSBradley Grove 		struct {
66726780d9eSBradley Grove 			u64 node_name;
66826780d9eSBradley Grove 			u64 port_name;
66926780d9eSBradley Grove 		};
67026780d9eSBradley Grove 		u64 sas_addr;
67126780d9eSBradley Grove 	};
67226780d9eSBradley Grove };
67326780d9eSBradley Grove 
67426780d9eSBradley Grove #define ATTO_FUNC_GET_ADAP_INFO      0x00
67526780d9eSBradley Grove #define ATTO_VER_GET_ADAP_INFO0      0
67626780d9eSBradley Grove #define ATTO_VER_GET_ADAP_INFO       ATTO_VER_GET_ADAP_INFO0
67726780d9eSBradley Grove 
67826780d9eSBradley Grove struct __packed atto_hba_get_adapter_info {
67926780d9eSBradley Grove 
68026780d9eSBradley Grove 	struct {
68126780d9eSBradley Grove 		u16 vendor_id;
68226780d9eSBradley Grove 		u16 device_id;
68326780d9eSBradley Grove 		u16 ss_vendor_id;
68426780d9eSBradley Grove 		u16 ss_device_id;
68526780d9eSBradley Grove 		u8 class_code[3];
68626780d9eSBradley Grove 		u8 rev_id;
68726780d9eSBradley Grove 		u8 bus_num;
68826780d9eSBradley Grove 		u8 dev_num;
68926780d9eSBradley Grove 		u8 func_num;
69026780d9eSBradley Grove 		u8 link_width_max;
69126780d9eSBradley Grove 		u8 link_width_curr;
69226780d9eSBradley Grove 	    #define ATTO_GAI_PCILW_UNKNOWN   0x00
69326780d9eSBradley Grove 
69426780d9eSBradley Grove 		u8 link_speed_max;
69526780d9eSBradley Grove 		u8 link_speed_curr;
69626780d9eSBradley Grove 	    #define ATTO_GAI_PCILS_UNKNOWN   0x00
69726780d9eSBradley Grove 	    #define ATTO_GAI_PCILS_GEN1      0x01
69826780d9eSBradley Grove 	    #define ATTO_GAI_PCILS_GEN2      0x02
69926780d9eSBradley Grove 	    #define ATTO_GAI_PCILS_GEN3      0x03
70026780d9eSBradley Grove 
70126780d9eSBradley Grove 		u8 interrupt_mode;
70226780d9eSBradley Grove 	    #define ATTO_GAI_PCIIM_UNKNOWN   0x00
70326780d9eSBradley Grove 	    #define ATTO_GAI_PCIIM_LEGACY    0x01
70426780d9eSBradley Grove 	    #define ATTO_GAI_PCIIM_MSI       0x02
70526780d9eSBradley Grove 	    #define ATTO_GAI_PCIIM_MSIX      0x03
70626780d9eSBradley Grove 
70726780d9eSBradley Grove 		u8 msi_vector_cnt;
70826780d9eSBradley Grove 		u8 reserved[19];
70926780d9eSBradley Grove 	} pci;
71026780d9eSBradley Grove 
71126780d9eSBradley Grove 	u8 adap_type;
71226780d9eSBradley Grove 	#define ATTO_GAI_AT_EPCIU320     0x00
71326780d9eSBradley Grove 	#define ATTO_GAI_AT_ESASRAID     0x01
71426780d9eSBradley Grove 	#define ATTO_GAI_AT_ESASRAID2    0x02
71526780d9eSBradley Grove 	#define ATTO_GAI_AT_ESASHBA      0x03
71626780d9eSBradley Grove 	#define ATTO_GAI_AT_ESASHBA2     0x04
71726780d9eSBradley Grove 	#define ATTO_GAI_AT_CELERITY     0x05
71826780d9eSBradley Grove 	#define ATTO_GAI_AT_CELERITY8    0x06
71926780d9eSBradley Grove 	#define ATTO_GAI_AT_FASTFRAME    0x07
72026780d9eSBradley Grove 	#define ATTO_GAI_AT_ESASHBA3     0x08
72126780d9eSBradley Grove 	#define ATTO_GAI_AT_CELERITY16   0x09
72226780d9eSBradley Grove 	#define ATTO_GAI_AT_TLSASHBA     0x0A
72326780d9eSBradley Grove 	#define ATTO_GAI_AT_ESASHBA4     0x0B
72426780d9eSBradley Grove 
72526780d9eSBradley Grove 	u8 adap_flags;
72626780d9eSBradley Grove 	#define ATTO_GAI_AF_DEGRADED     0x01
72726780d9eSBradley Grove 	#define ATTO_GAI_AF_SPT_SUPP     0x02
72826780d9eSBradley Grove 	#define ATTO_GAI_AF_DEVADDR_SUPP 0x04
72926780d9eSBradley Grove 	#define ATTO_GAI_AF_PHYCTRL_SUPP 0x08
73026780d9eSBradley Grove 	#define ATTO_GAI_AF_TEST_SUPP    0x10
73126780d9eSBradley Grove 	#define ATTO_GAI_AF_DIAG_SUPP    0x20
73226780d9eSBradley Grove 	#define ATTO_GAI_AF_VIRT_SES     0x40
73326780d9eSBradley Grove 	#define ATTO_GAI_AF_CONN_CTRL    0x80
73426780d9eSBradley Grove 
73526780d9eSBradley Grove 	u8 num_ports;
73626780d9eSBradley Grove 	u8 num_phys;
73726780d9eSBradley Grove 	u8 drvr_rev_major;
73826780d9eSBradley Grove 	u8 drvr_rev_minor;
73926780d9eSBradley Grove 	u8 drvr_revsub_minor;
74026780d9eSBradley Grove 	u8 drvr_rev_build;
74126780d9eSBradley Grove 	char drvr_rev_ascii[16];
74226780d9eSBradley Grove 	char drvr_name[32];
74326780d9eSBradley Grove 	char firmware_rev[16];
74426780d9eSBradley Grove 	char flash_rev[16];
74526780d9eSBradley Grove 	char model_name_short[16];
74626780d9eSBradley Grove 	char model_name[32];
74726780d9eSBradley Grove 	u32 num_targets;
74826780d9eSBradley Grove 	u32 num_targsper_bus;
74926780d9eSBradley Grove 	u32 num_lunsper_targ;
75026780d9eSBradley Grove 	u8 num_busses;
75126780d9eSBradley Grove 	u8 num_connectors;
75226780d9eSBradley Grove 	u8 adap_flags2;
75326780d9eSBradley Grove 	#define ATTO_GAI_AF2_FCOE_SUPP       0x01
75426780d9eSBradley Grove 	#define ATTO_GAI_AF2_NIC_SUPP        0x02
75526780d9eSBradley Grove 	#define ATTO_GAI_AF2_LOCATE_SUPP     0x04
75626780d9eSBradley Grove 	#define ATTO_GAI_AF2_ADAP_CTRL_SUPP  0x08
75726780d9eSBradley Grove 	#define ATTO_GAI_AF2_DEV_INFO_SUPP   0x10
75826780d9eSBradley Grove 	#define ATTO_GAI_AF2_NPIV_SUPP       0x20
75926780d9eSBradley Grove 	#define ATTO_GAI_AF2_MP_SUPP         0x40
76026780d9eSBradley Grove 
76126780d9eSBradley Grove 	u8 num_temp_sensors;
76226780d9eSBradley Grove 	u32 num_targets_backend;
76326780d9eSBradley Grove 	u32 tunnel_flags;
76426780d9eSBradley Grove 	#define ATTO_GAI_TF_MEM_RW           0x00000001
76526780d9eSBradley Grove 	#define ATTO_GAI_TF_TRACE            0x00000002
76626780d9eSBradley Grove 	#define ATTO_GAI_TF_SCSI_PASS_THRU   0x00000004
76726780d9eSBradley Grove 	#define ATTO_GAI_TF_GET_DEV_ADDR     0x00000008
76826780d9eSBradley Grove 	#define ATTO_GAI_TF_PHY_CTRL         0x00000010
76926780d9eSBradley Grove 	#define ATTO_GAI_TF_CONN_CTRL        0x00000020
77026780d9eSBradley Grove 	#define ATTO_GAI_TF_GET_DEV_INFO     0x00000040
77126780d9eSBradley Grove 
77226780d9eSBradley Grove 	u8 reserved3[0x138];
77326780d9eSBradley Grove };
77426780d9eSBradley Grove 
77526780d9eSBradley Grove #define ATTO_FUNC_GET_ADAP_ADDR      0x01
77626780d9eSBradley Grove #define ATTO_VER_GET_ADAP_ADDR0      0
77726780d9eSBradley Grove #define ATTO_VER_GET_ADAP_ADDR       ATTO_VER_GET_ADAP_ADDR0
77826780d9eSBradley Grove 
77926780d9eSBradley Grove struct __packed atto_hba_get_adapter_address {
78026780d9eSBradley Grove 
78126780d9eSBradley Grove 	u8 addr_type;
78226780d9eSBradley Grove 	#define ATTO_GAA_AT_PORT         0x00
78326780d9eSBradley Grove 	#define ATTO_GAA_AT_NODE         0x01
78426780d9eSBradley Grove 	#define ATTO_GAA_AT_CURR_MAC     0x02
78526780d9eSBradley Grove 	#define ATTO_GAA_AT_PERM_MAC     0x03
78626780d9eSBradley Grove 	#define ATTO_GAA_AT_VNIC         0x04
78726780d9eSBradley Grove 
78826780d9eSBradley Grove 	u8 port_id;
78926780d9eSBradley Grove 	u16 addr_len;
79026780d9eSBradley Grove 	u8 address[256];
79126780d9eSBradley Grove };
79226780d9eSBradley Grove 
79326780d9eSBradley Grove #define ATTO_FUNC_MEM_RW             0x02
79426780d9eSBradley Grove #define ATTO_VER_MEM_RW0             0
79526780d9eSBradley Grove #define ATTO_VER_MEM_RW              ATTO_VER_MEM_RW0
79626780d9eSBradley Grove 
79726780d9eSBradley Grove struct __packed atto_hba_memory_read_write {
79826780d9eSBradley Grove 	u8 mem_func;
79926780d9eSBradley Grove 	u8 mem_type;
80026780d9eSBradley Grove 	union {
80126780d9eSBradley Grove 		u8 pci_index;
80226780d9eSBradley Grove 		u8 i2c_dev;
80326780d9eSBradley Grove 	};
80426780d9eSBradley Grove 	u8 i2c_status;
80526780d9eSBradley Grove 	u32 length;
80626780d9eSBradley Grove 	u64 address;
80726780d9eSBradley Grove 	u8 reserved[48];
80826780d9eSBradley Grove 
80926780d9eSBradley Grove };
81026780d9eSBradley Grove 
81126780d9eSBradley Grove #define ATTO_FUNC_TRACE              0x03
81226780d9eSBradley Grove #define ATTO_VER_TRACE0              0
81326780d9eSBradley Grove #define ATTO_VER_TRACE1              1
81426780d9eSBradley Grove #define ATTO_VER_TRACE               ATTO_VER_TRACE1
81526780d9eSBradley Grove 
81626780d9eSBradley Grove struct __packed atto_hba_trace {
81726780d9eSBradley Grove 	u8 trace_func;
81826780d9eSBradley Grove 	#define ATTO_TRC_TF_GET_INFO     0x00
81926780d9eSBradley Grove 	#define ATTO_TRC_TF_ENABLE       0x01
82026780d9eSBradley Grove 	#define ATTO_TRC_TF_DISABLE      0x02
82126780d9eSBradley Grove 	#define ATTO_TRC_TF_SET_MASK     0x03
82226780d9eSBradley Grove 	#define ATTO_TRC_TF_UPLOAD       0x04
82326780d9eSBradley Grove 	#define ATTO_TRC_TF_RESET        0x05
82426780d9eSBradley Grove 
82526780d9eSBradley Grove 	u8 trace_type;
82626780d9eSBradley Grove 	#define ATTO_TRC_TT_DRIVER       0x00
82726780d9eSBradley Grove 	#define ATTO_TRC_TT_FWCOREDUMP   0x01
82826780d9eSBradley Grove 
82926780d9eSBradley Grove 	u8 reserved[2];
83026780d9eSBradley Grove 	u32 current_offset;
83126780d9eSBradley Grove 	u32 total_length;
83226780d9eSBradley Grove 	u32 trace_mask;
83326780d9eSBradley Grove 	u8 reserved2[48];
834*1ce871deSKees Cook 	u8 contents[];
83526780d9eSBradley Grove };
83626780d9eSBradley Grove 
83726780d9eSBradley Grove #define ATTO_FUNC_SCSI_PASS_THRU     0x04
83826780d9eSBradley Grove #define ATTO_VER_SCSI_PASS_THRU0     0
83926780d9eSBradley Grove #define ATTO_VER_SCSI_PASS_THRU      ATTO_VER_SCSI_PASS_THRU0
84026780d9eSBradley Grove 
84126780d9eSBradley Grove struct __packed atto_hba_scsi_pass_thru {
84226780d9eSBradley Grove 	u8 cdb[32];
84326780d9eSBradley Grove 	u8 cdb_length;
84426780d9eSBradley Grove 	u8 req_status;
84526780d9eSBradley Grove 	#define ATTO_SPT_RS_SUCCESS      0x00
84626780d9eSBradley Grove 	#define ATTO_SPT_RS_FAILED       0x01
84726780d9eSBradley Grove 	#define ATTO_SPT_RS_OVERRUN      0x02
84826780d9eSBradley Grove 	#define ATTO_SPT_RS_UNDERRUN     0x03
84926780d9eSBradley Grove 	#define ATTO_SPT_RS_NO_DEVICE    0x04
85026780d9eSBradley Grove 	#define ATTO_SPT_RS_NO_LUN       0x05
85126780d9eSBradley Grove 	#define ATTO_SPT_RS_TIMEOUT      0x06
85226780d9eSBradley Grove 	#define ATTO_SPT_RS_BUS_RESET    0x07
85326780d9eSBradley Grove 	#define ATTO_SPT_RS_ABORTED      0x08
85426780d9eSBradley Grove 	#define ATTO_SPT_RS_BUSY         0x09
85526780d9eSBradley Grove 	#define ATTO_SPT_RS_DEGRADED     0x0A
85626780d9eSBradley Grove 
85726780d9eSBradley Grove 	u8 scsi_status;
85826780d9eSBradley Grove 	u8 sense_length;
85926780d9eSBradley Grove 	u32 flags;
86026780d9eSBradley Grove 	#define ATTO_SPTF_DATA_IN    0x00000001
86126780d9eSBradley Grove 	#define ATTO_SPTF_DATA_OUT   0x00000002
86226780d9eSBradley Grove 	#define ATTO_SPTF_SIMPLE_Q   0x00000004
86326780d9eSBradley Grove 	#define ATTO_SPTF_HEAD_OF_Q  0x00000008
86426780d9eSBradley Grove 	#define ATTO_SPTF_ORDERED_Q  0x00000010
86526780d9eSBradley Grove 
86626780d9eSBradley Grove 	u32 timeout;
86726780d9eSBradley Grove 	u32 target_id;
86826780d9eSBradley Grove 	u8 lun[8];
86926780d9eSBradley Grove 	u32 residual_length;
87026780d9eSBradley Grove 	u8 sense_data[0xFC];
87126780d9eSBradley Grove 	u8 reserved[0x28];
87226780d9eSBradley Grove };
87326780d9eSBradley Grove 
87426780d9eSBradley Grove #define ATTO_FUNC_GET_DEV_ADDR       0x05
87526780d9eSBradley Grove #define ATTO_VER_GET_DEV_ADDR0       0
87626780d9eSBradley Grove #define ATTO_VER_GET_DEV_ADDR        ATTO_VER_GET_DEV_ADDR0
87726780d9eSBradley Grove 
87826780d9eSBradley Grove struct __packed atto_hba_get_device_address {
87926780d9eSBradley Grove 	u8 addr_type;
88026780d9eSBradley Grove 	#define ATTO_GDA_AT_PORT         0x00
88126780d9eSBradley Grove 	#define ATTO_GDA_AT_NODE         0x01
88226780d9eSBradley Grove 	#define ATTO_GDA_AT_MAC          0x02
88326780d9eSBradley Grove 	#define ATTO_GDA_AT_PORTID       0x03
88426780d9eSBradley Grove 	#define ATTO_GDA_AT_UNIQUE       0x04
88526780d9eSBradley Grove 
88626780d9eSBradley Grove 	u8 reserved;
88726780d9eSBradley Grove 	u16 addr_len;
88826780d9eSBradley Grove 	u32 target_id;
88926780d9eSBradley Grove 	u8 address[256];
89026780d9eSBradley Grove };
89126780d9eSBradley Grove 
89226780d9eSBradley Grove /* The following functions are supported by firmware but do not have any
89326780d9eSBradley Grove  * associated driver structures
89426780d9eSBradley Grove  */
89526780d9eSBradley Grove #define ATTO_FUNC_PHY_CTRL           0x06
89626780d9eSBradley Grove #define ATTO_FUNC_CONN_CTRL          0x0C
89726780d9eSBradley Grove #define ATTO_FUNC_ADAP_CTRL          0x0E
89826780d9eSBradley Grove #define ATTO_VER_ADAP_CTRL0          0
89926780d9eSBradley Grove #define ATTO_VER_ADAP_CTRL           ATTO_VER_ADAP_CTRL0
90026780d9eSBradley Grove 
90126780d9eSBradley Grove struct __packed atto_hba_adap_ctrl {
90226780d9eSBradley Grove 	u8 adap_func;
90326780d9eSBradley Grove 	#define ATTO_AC_AF_HARD_RST      0x00
90426780d9eSBradley Grove 	#define ATTO_AC_AF_GET_STATE     0x01
90526780d9eSBradley Grove 	#define ATTO_AC_AF_GET_TEMP      0x02
90626780d9eSBradley Grove 
90726780d9eSBradley Grove 	u8 adap_state;
90826780d9eSBradley Grove 	#define ATTO_AC_AS_UNKNOWN       0x00
90926780d9eSBradley Grove 	#define ATTO_AC_AS_OK            0x01
91026780d9eSBradley Grove 	#define ATTO_AC_AS_RST_SCHED     0x02
91126780d9eSBradley Grove 	#define ATTO_AC_AS_RST_IN_PROG   0x03
91226780d9eSBradley Grove 	#define ATTO_AC_AS_RST_DISC      0x04
91326780d9eSBradley Grove 	#define ATTO_AC_AS_DEGRADED      0x05
91426780d9eSBradley Grove 	#define ATTO_AC_AS_DISABLED      0x06
91526780d9eSBradley Grove 	#define ATTO_AC_AS_TEMP          0x07
91626780d9eSBradley Grove 
91726780d9eSBradley Grove 	u8 reserved[2];
91826780d9eSBradley Grove 
91926780d9eSBradley Grove 	union {
92026780d9eSBradley Grove 		struct {
92126780d9eSBradley Grove 			u8 temp_sensor;
92226780d9eSBradley Grove 			u8 temp_state;
92326780d9eSBradley Grove 
92426780d9eSBradley Grove 	#define ATTO_AC_TS_UNSUPP        0x00
92526780d9eSBradley Grove 	#define ATTO_AC_TS_UNKNOWN       0x01
92626780d9eSBradley Grove 	#define ATTO_AC_TS_INIT_FAILED   0x02
92726780d9eSBradley Grove 	#define ATTO_AC_TS_NORMAL        0x03
92826780d9eSBradley Grove 	#define ATTO_AC_TS_OUT_OF_RANGE  0x04
92926780d9eSBradley Grove 	#define ATTO_AC_TS_FAULT         0x05
93026780d9eSBradley Grove 
93126780d9eSBradley Grove 			signed short temp_value;
93226780d9eSBradley Grove 			signed short temp_lower_lim;
93326780d9eSBradley Grove 			signed short temp_upper_lim;
93426780d9eSBradley Grove 			char temp_desc[32];
93526780d9eSBradley Grove 			u8 reserved2[20];
93626780d9eSBradley Grove 		};
93726780d9eSBradley Grove 	};
93826780d9eSBradley Grove };
93926780d9eSBradley Grove 
94026780d9eSBradley Grove #define ATTO_FUNC_GET_DEV_INFO       0x0F
94126780d9eSBradley Grove #define ATTO_VER_GET_DEV_INFO0       0
94226780d9eSBradley Grove #define ATTO_VER_GET_DEV_INFO        ATTO_VER_GET_DEV_INFO0
94326780d9eSBradley Grove 
94426780d9eSBradley Grove struct __packed atto_hba_sas_device_info {
94526780d9eSBradley Grove 
94626780d9eSBradley Grove     #define ATTO_SDI_MAX_PHYS_WIDE_PORT  16
94726780d9eSBradley Grove 
94826780d9eSBradley Grove 	u8 phy_id[ATTO_SDI_MAX_PHYS_WIDE_PORT]; /* IDs of parent exp/adapt */
94926780d9eSBradley Grove 	#define ATTO_SDI_PHY_ID_INV      ATTO_SAS_PHY_ID_INV
95026780d9eSBradley Grove 	u32 exp_target_id;
95126780d9eSBradley Grove 	u32 sas_port_mask;
95226780d9eSBradley Grove 	u8 sas_level;
95326780d9eSBradley Grove 	#define ATTO_SDI_SAS_LVL_INV     0xFF
95426780d9eSBradley Grove 
95526780d9eSBradley Grove 	u8 slot_num;
95626780d9eSBradley Grove 	#define ATTO_SDI_SLOT_NUM_INV    ATTO_SLOT_NUM_INV
95726780d9eSBradley Grove 
95826780d9eSBradley Grove 	u8 dev_type;
95926780d9eSBradley Grove 	#define ATTO_SDI_DT_END_DEVICE   0
96026780d9eSBradley Grove 	#define ATTO_SDI_DT_EXPANDER     1
96126780d9eSBradley Grove 	#define ATTO_SDI_DT_PORT_MULT    2
96226780d9eSBradley Grove 
96326780d9eSBradley Grove 	u8 ini_flags;
96426780d9eSBradley Grove 	u8 tgt_flags;
96526780d9eSBradley Grove 	u8 link_rate; /* SMP_RATE_XXX */
96626780d9eSBradley Grove 	u8 loc_flags;
96726780d9eSBradley Grove 	#define ATTO_SDI_LF_DIRECT       0x01
96826780d9eSBradley Grove 	#define ATTO_SDI_LF_EXPANDER     0x02
96926780d9eSBradley Grove 	#define ATTO_SDI_LF_PORT_MULT    0x04
97026780d9eSBradley Grove 	u8 pm_port;
97126780d9eSBradley Grove 	u8 reserved[0x60];
97226780d9eSBradley Grove };
97326780d9eSBradley Grove 
97426780d9eSBradley Grove union atto_hba_device_info {
97526780d9eSBradley Grove 	struct atto_hba_sas_device_info sas_dev_info;
97626780d9eSBradley Grove };
97726780d9eSBradley Grove 
97826780d9eSBradley Grove struct __packed atto_hba_get_device_info {
97926780d9eSBradley Grove 	u32 target_id;
98026780d9eSBradley Grove 	u8 info_type;
98126780d9eSBradley Grove 	#define ATTO_GDI_IT_UNKNOWN      0x00
98226780d9eSBradley Grove 	#define ATTO_GDI_IT_SAS          0x01
98326780d9eSBradley Grove 	#define ATTO_GDI_IT_FC           0x02
98426780d9eSBradley Grove 	#define ATTO_GDI_IT_FCOE         0x03
98526780d9eSBradley Grove 
98626780d9eSBradley Grove 	u8 reserved[11];
98726780d9eSBradley Grove 	union atto_hba_device_info dev_info;
98826780d9eSBradley Grove };
98926780d9eSBradley Grove 
99026780d9eSBradley Grove struct atto_ioctl {
99126780d9eSBradley Grove 	u8 version;
99226780d9eSBradley Grove 	u8 function; /* ATTO_FUNC_XXX */
99326780d9eSBradley Grove 	u8 status;
99426780d9eSBradley Grove #define ATTO_STS_SUCCESS         0x00
99526780d9eSBradley Grove #define ATTO_STS_FAILED          0x01
99626780d9eSBradley Grove #define ATTO_STS_INV_VERSION     0x02
99726780d9eSBradley Grove #define ATTO_STS_OUT_OF_RSRC     0x03
99826780d9eSBradley Grove #define ATTO_STS_INV_FUNC        0x04
99926780d9eSBradley Grove #define ATTO_STS_UNSUPPORTED     0x05
100026780d9eSBradley Grove #define ATTO_STS_INV_ADAPTER     0x06
100126780d9eSBradley Grove #define ATTO_STS_INV_DRVR_VER    0x07
100226780d9eSBradley Grove #define ATTO_STS_INV_PARAM       0x08
100326780d9eSBradley Grove #define ATTO_STS_TIMEOUT         0x09
100426780d9eSBradley Grove #define ATTO_STS_NOT_APPL        0x0A
100526780d9eSBradley Grove #define ATTO_STS_DEGRADED        0x0B
100626780d9eSBradley Grove 
100726780d9eSBradley Grove 	u8 flags;
100826780d9eSBradley Grove 	#define HBAF_TUNNEL      0x01
100926780d9eSBradley Grove 
101026780d9eSBradley Grove 	u32 data_length;
101126780d9eSBradley Grove 	u8 reserved2[56];
101226780d9eSBradley Grove 
101326780d9eSBradley Grove 	union {
101426780d9eSBradley Grove 		u8 byte[1];
101526780d9eSBradley Grove 		struct atto_hba_get_adapter_info get_adap_info;
101626780d9eSBradley Grove 		struct atto_hba_get_adapter_address get_adap_addr;
101726780d9eSBradley Grove 		struct atto_hba_scsi_pass_thru scsi_pass_thru;
101826780d9eSBradley Grove 		struct atto_hba_get_device_address get_dev_addr;
101926780d9eSBradley Grove 		struct atto_hba_adap_ctrl adap_ctrl;
102026780d9eSBradley Grove 		struct atto_hba_get_device_info get_dev_info;
102126780d9eSBradley Grove 		struct atto_hba_trace trace;
102226780d9eSBradley Grove 	} data;
102326780d9eSBradley Grove 
102426780d9eSBradley Grove };
102526780d9eSBradley Grove 
102626780d9eSBradley Grove struct __packed atto_ioctl_vda_scsi_cmd {
102726780d9eSBradley Grove 
102826780d9eSBradley Grove     #define ATTO_VDA_SCSI_VER0   0
102926780d9eSBradley Grove     #define ATTO_VDA_SCSI_VER    ATTO_VDA_SCSI_VER0
103026780d9eSBradley Grove 
103126780d9eSBradley Grove 	u8 cdb[16];
103226780d9eSBradley Grove 	u32 flags;
103326780d9eSBradley Grove 	u32 data_length;
103426780d9eSBradley Grove 	u32 residual_length;
103526780d9eSBradley Grove 	u16 target_id;
103626780d9eSBradley Grove 	u8 sense_len;
103726780d9eSBradley Grove 	u8 scsi_stat;
103826780d9eSBradley Grove 	u8 reserved[8];
103926780d9eSBradley Grove 	u8 sense_data[80];
104026780d9eSBradley Grove };
104126780d9eSBradley Grove 
104226780d9eSBradley Grove struct __packed atto_ioctl_vda_flash_cmd {
104326780d9eSBradley Grove 
104426780d9eSBradley Grove     #define ATTO_VDA_FLASH_VER0  0
104526780d9eSBradley Grove     #define ATTO_VDA_FLASH_VER   ATTO_VDA_FLASH_VER0
104626780d9eSBradley Grove 
104726780d9eSBradley Grove 	u32 flash_addr;
104826780d9eSBradley Grove 	u32 data_length;
104926780d9eSBradley Grove 	u8 sub_func;
105026780d9eSBradley Grove 	u8 reserved[15];
105126780d9eSBradley Grove 
105226780d9eSBradley Grove 	union {
105326780d9eSBradley Grove 		struct {
105426780d9eSBradley Grove 			u32 flash_size;
105526780d9eSBradley Grove 			u32 page_size;
105626780d9eSBradley Grove 			u8 prod_info[32];
105726780d9eSBradley Grove 		} info;
105826780d9eSBradley Grove 
105926780d9eSBradley Grove 		struct {
106026780d9eSBradley Grove 			char file_name[16]; /* 8.3 fname, NULL term, wc=* */
106126780d9eSBradley Grove 			u32 file_size;
106226780d9eSBradley Grove 		} file;
106326780d9eSBradley Grove 	} data;
106426780d9eSBradley Grove 
106526780d9eSBradley Grove };
106626780d9eSBradley Grove 
106726780d9eSBradley Grove struct __packed atto_ioctl_vda_diag_cmd {
106826780d9eSBradley Grove 
106926780d9eSBradley Grove     #define ATTO_VDA_DIAG_VER0   0
107026780d9eSBradley Grove     #define ATTO_VDA_DIAG_VER    ATTO_VDA_DIAG_VER0
107126780d9eSBradley Grove 
107226780d9eSBradley Grove 	u64 local_addr;
107326780d9eSBradley Grove 	u32 data_length;
107426780d9eSBradley Grove 	u8 sub_func;
107526780d9eSBradley Grove 	u8 flags;
107626780d9eSBradley Grove 	u8 reserved[3];
107726780d9eSBradley Grove };
107826780d9eSBradley Grove 
107926780d9eSBradley Grove struct __packed atto_ioctl_vda_cli_cmd {
108026780d9eSBradley Grove 
108126780d9eSBradley Grove     #define ATTO_VDA_CLI_VER0    0
108226780d9eSBradley Grove     #define ATTO_VDA_CLI_VER     ATTO_VDA_CLI_VER0
108326780d9eSBradley Grove 
108426780d9eSBradley Grove 	u32 cmd_rsp_len;
108526780d9eSBradley Grove };
108626780d9eSBradley Grove 
108726780d9eSBradley Grove struct __packed atto_ioctl_vda_smp_cmd {
108826780d9eSBradley Grove 
108926780d9eSBradley Grove     #define ATTO_VDA_SMP_VER0    0
109026780d9eSBradley Grove     #define ATTO_VDA_SMP_VER     ATTO_VDA_SMP_VER0
109126780d9eSBradley Grove 
109226780d9eSBradley Grove 	u64 dest;
109326780d9eSBradley Grove 	u32 cmd_rsp_len;
109426780d9eSBradley Grove };
109526780d9eSBradley Grove 
109626780d9eSBradley Grove struct __packed atto_ioctl_vda_cfg_cmd {
109726780d9eSBradley Grove 
109826780d9eSBradley Grove     #define ATTO_VDA_CFG_VER0    0
109926780d9eSBradley Grove     #define ATTO_VDA_CFG_VER     ATTO_VDA_CFG_VER0
110026780d9eSBradley Grove 
110126780d9eSBradley Grove 	u32 data_length;
110226780d9eSBradley Grove 	u8 cfg_func;
110326780d9eSBradley Grove 	u8 reserved[11];
110426780d9eSBradley Grove 
110526780d9eSBradley Grove 	union {
110626780d9eSBradley Grove 		u8 bytes[112];
110726780d9eSBradley Grove 		struct atto_vda_cfg_init init;
110826780d9eSBradley Grove 	} data;
110926780d9eSBradley Grove 
111026780d9eSBradley Grove };
111126780d9eSBradley Grove 
111226780d9eSBradley Grove struct __packed atto_ioctl_vda_mgt_cmd {
111326780d9eSBradley Grove 
111426780d9eSBradley Grove     #define ATTO_VDA_MGT_VER0    0
111526780d9eSBradley Grove     #define ATTO_VDA_MGT_VER     ATTO_VDA_MGT_VER0
111626780d9eSBradley Grove 
111726780d9eSBradley Grove 	u8 mgt_func;
111826780d9eSBradley Grove 	u8 scan_generation;
111926780d9eSBradley Grove 	u16 dev_index;
112026780d9eSBradley Grove 	u32 data_length;
112126780d9eSBradley Grove 	u8 reserved[8];
112226780d9eSBradley Grove 	union {
112326780d9eSBradley Grove 		u8 bytes[112];
112426780d9eSBradley Grove 		struct atto_vda_devinfo dev_info;
112526780d9eSBradley Grove 		struct atto_vda_grp_info grp_info;
112626780d9eSBradley Grove 		struct atto_vdapart_info part_info;
112726780d9eSBradley Grove 		struct atto_vda_dh_info dh_info;
112826780d9eSBradley Grove 		struct atto_vda_metrics_info metrics_info;
112926780d9eSBradley Grove 		struct atto_vda_schedule_info sched_info;
113026780d9eSBradley Grove 		struct atto_vda_n_vcache_info nvcache_info;
113126780d9eSBradley Grove 		struct atto_vda_buzzer_info buzzer_info;
113226780d9eSBradley Grove 		struct atto_vda_adapter_info adapter_info;
113326780d9eSBradley Grove 		struct atto_vda_temp_info temp_info;
113426780d9eSBradley Grove 		struct atto_vda_fan_info fan_info;
113526780d9eSBradley Grove 	} data;
113626780d9eSBradley Grove };
113726780d9eSBradley Grove 
113826780d9eSBradley Grove struct __packed atto_ioctl_vda_gsv_cmd {
113926780d9eSBradley Grove 
114026780d9eSBradley Grove     #define ATTO_VDA_GSV_VER0    0
114126780d9eSBradley Grove     #define ATTO_VDA_GSV_VER     ATTO_VDA_GSV_VER0
114226780d9eSBradley Grove 
114326780d9eSBradley Grove 	u8 rsp_len;
114426780d9eSBradley Grove 	u8 reserved[7];
114566fc475bSKees Cook 	u8 version_info[];
114626780d9eSBradley Grove 	#define ATTO_VDA_VER_UNSUPPORTED 0xFF
114726780d9eSBradley Grove 
114826780d9eSBradley Grove };
114926780d9eSBradley Grove 
115026780d9eSBradley Grove struct __packed atto_ioctl_vda {
115126780d9eSBradley Grove 	u8 version;
115226780d9eSBradley Grove 	u8 function;    /* VDA_FUNC_XXXX */
115326780d9eSBradley Grove 	u8 status;      /* ATTO_STS_XXX */
115426780d9eSBradley Grove 	u8 vda_status;  /* RS_XXX (if status == ATTO_STS_SUCCESS) */
115526780d9eSBradley Grove 	u32 data_length;
115626780d9eSBradley Grove 	u8 reserved[8];
115726780d9eSBradley Grove 
115826780d9eSBradley Grove 	union {
115926780d9eSBradley Grove 		struct atto_ioctl_vda_scsi_cmd scsi;
116026780d9eSBradley Grove 		struct atto_ioctl_vda_flash_cmd flash;
116126780d9eSBradley Grove 		struct atto_ioctl_vda_diag_cmd diag;
116226780d9eSBradley Grove 		struct atto_ioctl_vda_cli_cmd cli;
116326780d9eSBradley Grove 		struct atto_ioctl_vda_smp_cmd smp;
116426780d9eSBradley Grove 		struct atto_ioctl_vda_cfg_cmd cfg;
116526780d9eSBradley Grove 		struct atto_ioctl_vda_mgt_cmd mgt;
116626780d9eSBradley Grove 		struct atto_ioctl_vda_gsv_cmd gsv;
116726780d9eSBradley Grove 		u8 cmd_info[256];
116826780d9eSBradley Grove 	} cmd;
116926780d9eSBradley Grove 
117026780d9eSBradley Grove 	union {
117126780d9eSBradley Grove 		u8 data[1];
117226780d9eSBradley Grove 		struct atto_vda_devinfo2 dev_info2;
117326780d9eSBradley Grove 	} data;
117426780d9eSBradley Grove 
117526780d9eSBradley Grove };
117626780d9eSBradley Grove 
117726780d9eSBradley Grove struct __packed atto_ioctl_smp {
117826780d9eSBradley Grove 	u8 version;
117926780d9eSBradley Grove 	#define ATTO_SMP_VERSION0        0
118026780d9eSBradley Grove 	#define ATTO_SMP_VERSION1        1
118126780d9eSBradley Grove 	#define ATTO_SMP_VERSION2        2
118226780d9eSBradley Grove 	#define ATTO_SMP_VERSION         ATTO_SMP_VERSION2
118326780d9eSBradley Grove 
118426780d9eSBradley Grove 	u8 function;
118526780d9eSBradley Grove #define ATTO_SMP_FUNC_DISC_SMP           0x00
118626780d9eSBradley Grove #define ATTO_SMP_FUNC_DISC_TARG          0x01
118726780d9eSBradley Grove #define ATTO_SMP_FUNC_SEND_CMD           0x02
118826780d9eSBradley Grove #define ATTO_SMP_FUNC_DISC_TARG_DIRECT   0x03
118926780d9eSBradley Grove #define ATTO_SMP_FUNC_SEND_CMD_DIRECT    0x04
119026780d9eSBradley Grove #define ATTO_SMP_FUNC_DISC_SMP_DIRECT    0x05
119126780d9eSBradley Grove 
119226780d9eSBradley Grove 	u8 status;      /* ATTO_STS_XXX */
119326780d9eSBradley Grove 	u8 smp_status;  /* if status == ATTO_STS_SUCCESS */
119426780d9eSBradley Grove 	#define ATTO_SMP_STS_SUCCESS     0x00
119526780d9eSBradley Grove 	#define ATTO_SMP_STS_FAILURE     0x01
119626780d9eSBradley Grove 	#define ATTO_SMP_STS_RESCAN      0x02
119726780d9eSBradley Grove 	#define ATTO_SMP_STS_NOT_FOUND   0x03
119826780d9eSBradley Grove 
119926780d9eSBradley Grove 	u16 target_id;
120026780d9eSBradley Grove 	u8 phy_id;
120126780d9eSBradley Grove 	u8 dev_index;
120226780d9eSBradley Grove 	u64 smp_sas_addr;
120326780d9eSBradley Grove 	u64 targ_sas_addr;
120426780d9eSBradley Grove 	u32 req_length;
120526780d9eSBradley Grove 	u32 rsp_length;
120626780d9eSBradley Grove 	u8 flags;
120726780d9eSBradley Grove 	#define ATTO_SMPF_ROOT_EXP       0x01 /* expander direct attached */
120826780d9eSBradley Grove 
120926780d9eSBradley Grove 	u8 reserved[31];
121026780d9eSBradley Grove 
121126780d9eSBradley Grove 	union {
121226780d9eSBradley Grove 		u8 byte[1];
121326780d9eSBradley Grove 		u32 dword[1];
121426780d9eSBradley Grove 	} data;
121526780d9eSBradley Grove 
121626780d9eSBradley Grove };
121726780d9eSBradley Grove 
121826780d9eSBradley Grove struct __packed atto_express_ioctl {
121926780d9eSBradley Grove 	struct atto_express_ioctl_header header;
122026780d9eSBradley Grove 
122126780d9eSBradley Grove 	union {
122226780d9eSBradley Grove 		struct atto_firmware_rw_request fwrw;
122326780d9eSBradley Grove 		struct atto_param_rw_request prw;
122426780d9eSBradley Grove 		struct atto_channel_list chanlist;
122526780d9eSBradley Grove 		struct atto_channel_info chaninfo;
122626780d9eSBradley Grove 		struct atto_ioctl ioctl_hba;
122726780d9eSBradley Grove 		struct atto_module_info modinfo;
122826780d9eSBradley Grove 		struct atto_ioctl_vda ioctl_vda;
122926780d9eSBradley Grove 		struct atto_ioctl_smp ioctl_smp;
123026780d9eSBradley Grove 		struct atto_csmi csmi;
123126780d9eSBradley Grove 
123226780d9eSBradley Grove 	} data;
123326780d9eSBradley Grove };
123426780d9eSBradley Grove 
123526780d9eSBradley Grove /* The struct associated with the code is listed after the definition */
123626780d9eSBradley Grove #define EXPRESS_IOCTL_MIN             0x4500
123726780d9eSBradley Grove #define EXPRESS_IOCTL_RW_FIRMWARE     0x4500            /* FIRMWARERW    */
123826780d9eSBradley Grove #define EXPRESS_IOCTL_READ_PARAMS     0x4501            /* PARAMRW       */
123926780d9eSBradley Grove #define EXPRESS_IOCTL_WRITE_PARAMS    0x4502            /* PARAMRW       */
124026780d9eSBradley Grove #define EXPRESS_IOCTL_FC_API          0x4503            /* internal      */
124126780d9eSBradley Grove #define EXPRESS_IOCTL_GET_CHANNELS    0x4504            /* CHANNELLIST   */
124226780d9eSBradley Grove #define EXPRESS_IOCTL_CHAN_INFO       0x4505            /* CHANNELINFO   */
124326780d9eSBradley Grove #define EXPRESS_IOCTL_DEFAULT_PARAMS  0x4506            /* PARAMRW       */
124426780d9eSBradley Grove #define EXPRESS_ADDR_MEMORY           0x4507            /* MEMADDR       */
124526780d9eSBradley Grove #define EXPRESS_RW_MEMORY             0x4508            /* MEMRW         */
124626780d9eSBradley Grove #define EXPRESS_TSDK_DUMP             0x4509            /* TSDKDUMP      */
124726780d9eSBradley Grove #define EXPRESS_IOCTL_SMP             0x450A            /* IOCTL_SMP     */
124826780d9eSBradley Grove #define EXPRESS_CSMI                  0x450B            /* CSMI          */
124926780d9eSBradley Grove #define EXPRESS_IOCTL_HBA             0x450C            /* IOCTL_HBA     */
125026780d9eSBradley Grove #define EXPRESS_IOCTL_VDA             0x450D            /* IOCTL_VDA     */
125126780d9eSBradley Grove #define EXPRESS_IOCTL_GET_ID          0x450E            /* GET_ID        */
125226780d9eSBradley Grove #define EXPRESS_IOCTL_GET_MOD_INFO    0x450F            /* MODULE_INFO   */
125326780d9eSBradley Grove #define EXPRESS_IOCTL_MAX             0x450F
125426780d9eSBradley Grove 
125526780d9eSBradley Grove #endif
1256