xref: /OK3568_Linux_fs/kernel/drivers/scsi/esas2r/atioctl.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*  linux/drivers/scsi/esas2r/atioctl.h
2*4882a593Smuzhiyun  *      ATTO IOCTL Handling
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  *  Copyright (c) 2001-2013 ATTO Technology, Inc.
5*4882a593Smuzhiyun  *  (mailto:linuxdrivers@attotech.com)
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
8*4882a593Smuzhiyun /*
9*4882a593Smuzhiyun  *  This program is free software; you can redistribute it and/or modify
10*4882a593Smuzhiyun  *  it under the terms of the GNU General Public License as published by
11*4882a593Smuzhiyun  *  the Free Software Foundation; version 2 of the License.
12*4882a593Smuzhiyun  *
13*4882a593Smuzhiyun  *  This program is distributed in the hope that it will be useful,
14*4882a593Smuzhiyun  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15*4882a593Smuzhiyun  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16*4882a593Smuzhiyun  *  GNU General Public License for more details.
17*4882a593Smuzhiyun  *
18*4882a593Smuzhiyun  *  NO WARRANTY
19*4882a593Smuzhiyun  *  THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
20*4882a593Smuzhiyun  *  CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
21*4882a593Smuzhiyun  *  LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
22*4882a593Smuzhiyun  *  MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
23*4882a593Smuzhiyun  *  solely responsible for determining the appropriateness of using and
24*4882a593Smuzhiyun  *  distributing the Program and assumes all risks associated with its
25*4882a593Smuzhiyun  *  exercise of rights under this Agreement, including but not limited to
26*4882a593Smuzhiyun  *  the risks and costs of program errors, damage to or loss of data,
27*4882a593Smuzhiyun  *  programs or equipment, and unavailability or interruption of operations.
28*4882a593Smuzhiyun  *
29*4882a593Smuzhiyun  *  DISCLAIMER OF LIABILITY
30*4882a593Smuzhiyun  *  NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
31*4882a593Smuzhiyun  *  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32*4882a593Smuzhiyun  *  DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
33*4882a593Smuzhiyun  *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
34*4882a593Smuzhiyun  *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
35*4882a593Smuzhiyun  *  USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
36*4882a593Smuzhiyun  *  HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
37*4882a593Smuzhiyun  *
38*4882a593Smuzhiyun  *  You should have received a copy of the GNU General Public License
39*4882a593Smuzhiyun  *  along with this program; if not, write to the Free Software
40*4882a593Smuzhiyun  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
41*4882a593Smuzhiyun  */
42*4882a593Smuzhiyun /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun #include "atvda.h"
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun #ifndef ATIOCTL_H
47*4882a593Smuzhiyun #define ATIOCTL_H
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun #define EXPRESS_IOCTL_SIGNATURE        "Express"
50*4882a593Smuzhiyun #define EXPRESS_IOCTL_SIGNATURE_SIZE   8
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun /* structure definitions for IOCTls */
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun struct __packed atto_express_ioctl_header {
55*4882a593Smuzhiyun 	u8 signature[EXPRESS_IOCTL_SIGNATURE_SIZE];
56*4882a593Smuzhiyun 	u8 return_code;
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun #define IOCTL_SUCCESS               0
59*4882a593Smuzhiyun #define IOCTL_ERR_INVCMD          101
60*4882a593Smuzhiyun #define IOCTL_INIT_FAILED         102
61*4882a593Smuzhiyun #define IOCTL_NOT_IMPLEMENTED     103
62*4882a593Smuzhiyun #define IOCTL_BAD_CHANNEL         104
63*4882a593Smuzhiyun #define IOCTL_TARGET_OVERRUN      105
64*4882a593Smuzhiyun #define IOCTL_TARGET_NOT_ENABLED  106
65*4882a593Smuzhiyun #define IOCTL_BAD_FLASH_IMGTYPE   107
66*4882a593Smuzhiyun #define IOCTL_OUT_OF_RESOURCES    108
67*4882a593Smuzhiyun #define IOCTL_GENERAL_ERROR       109
68*4882a593Smuzhiyun #define IOCTL_INVALID_PARAM       110
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun 	u8 channel;
71*4882a593Smuzhiyun 	u8 retries;
72*4882a593Smuzhiyun 	u8 pad[5];
73*4882a593Smuzhiyun };
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun /*
76*4882a593Smuzhiyun  * NOTE - if channel == 0xFF, the request is
77*4882a593Smuzhiyun  * handled on the adapter it came in on.
78*4882a593Smuzhiyun  */
79*4882a593Smuzhiyun #define MAX_NODE_NAMES  256
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun struct __packed atto_firmware_rw_request {
82*4882a593Smuzhiyun 	u8 function;
83*4882a593Smuzhiyun 	#define FUNC_FW_DOWNLOAD        0x09
84*4882a593Smuzhiyun 	#define FUNC_FW_UPLOAD          0x12
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 	u8 img_type;
87*4882a593Smuzhiyun 	#define FW_IMG_FW               0x01
88*4882a593Smuzhiyun 	#define FW_IMG_BIOS             0x02
89*4882a593Smuzhiyun 	#define FW_IMG_NVR              0x03
90*4882a593Smuzhiyun 	#define FW_IMG_RAW              0x04
91*4882a593Smuzhiyun 	#define FW_IMG_FM_API           0x05
92*4882a593Smuzhiyun 	#define FW_IMG_FS_API           0x06
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun 	u8 pad[2];
95*4882a593Smuzhiyun 	u32 img_offset;
96*4882a593Smuzhiyun 	u32 img_size;
97*4882a593Smuzhiyun 	u8 image[0x80000];
98*4882a593Smuzhiyun };
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun struct __packed atto_param_rw_request {
101*4882a593Smuzhiyun 	u16 code;
102*4882a593Smuzhiyun 	char data_buffer[512];
103*4882a593Smuzhiyun };
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun #define MAX_CHANNEL 256
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun struct __packed atto_channel_list {
108*4882a593Smuzhiyun 	u32 num_channels;
109*4882a593Smuzhiyun 	u8 channel[MAX_CHANNEL];
110*4882a593Smuzhiyun };
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun struct __packed atto_channel_info {
113*4882a593Smuzhiyun 	u8 major_rev;
114*4882a593Smuzhiyun 	u8 minor_rev;
115*4882a593Smuzhiyun 	u8 IRQ;
116*4882a593Smuzhiyun 	u8 revision_id;
117*4882a593Smuzhiyun 	u8 pci_bus;
118*4882a593Smuzhiyun 	u8 pci_dev_func;
119*4882a593Smuzhiyun 	u8 core_rev;
120*4882a593Smuzhiyun 	u8 host_no;
121*4882a593Smuzhiyun 	u16 device_id;
122*4882a593Smuzhiyun 	u16 vendor_id;
123*4882a593Smuzhiyun 	u16 ven_dev_id;
124*4882a593Smuzhiyun 	u8 pad[3];
125*4882a593Smuzhiyun 	u32 hbaapi_rev;
126*4882a593Smuzhiyun };
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun /*
129*4882a593Smuzhiyun  * CSMI control codes
130*4882a593Smuzhiyun  * class independent
131*4882a593Smuzhiyun  */
132*4882a593Smuzhiyun #define CSMI_CC_GET_DRVR_INFO        1
133*4882a593Smuzhiyun #define CSMI_CC_GET_CNTLR_CFG        2
134*4882a593Smuzhiyun #define CSMI_CC_GET_CNTLR_STS        3
135*4882a593Smuzhiyun #define CSMI_CC_FW_DOWNLOAD          4
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun /* RAID class */
138*4882a593Smuzhiyun #define CSMI_CC_GET_RAID_INFO        10
139*4882a593Smuzhiyun #define CSMI_CC_GET_RAID_CFG         11
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun /* HBA class */
142*4882a593Smuzhiyun #define CSMI_CC_GET_PHY_INFO         20
143*4882a593Smuzhiyun #define CSMI_CC_SET_PHY_INFO         21
144*4882a593Smuzhiyun #define CSMI_CC_GET_LINK_ERRORS      22
145*4882a593Smuzhiyun #define CSMI_CC_SMP_PASSTHRU         23
146*4882a593Smuzhiyun #define CSMI_CC_SSP_PASSTHRU         24
147*4882a593Smuzhiyun #define CSMI_CC_STP_PASSTHRU         25
148*4882a593Smuzhiyun #define CSMI_CC_GET_SATA_SIG         26
149*4882a593Smuzhiyun #define CSMI_CC_GET_SCSI_ADDR        27
150*4882a593Smuzhiyun #define CSMI_CC_GET_DEV_ADDR         28
151*4882a593Smuzhiyun #define CSMI_CC_TASK_MGT             29
152*4882a593Smuzhiyun #define CSMI_CC_GET_CONN_INFO        30
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun /* PHY class */
155*4882a593Smuzhiyun #define CSMI_CC_PHY_CTRL             60
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun /*
158*4882a593Smuzhiyun  * CSMI status codes
159*4882a593Smuzhiyun  * class independent
160*4882a593Smuzhiyun  */
161*4882a593Smuzhiyun #define CSMI_STS_SUCCESS             0
162*4882a593Smuzhiyun #define CSMI_STS_FAILED              1
163*4882a593Smuzhiyun #define CSMI_STS_BAD_CTRL_CODE       2
164*4882a593Smuzhiyun #define CSMI_STS_INV_PARAM           3
165*4882a593Smuzhiyun #define CSMI_STS_WRITE_ATTEMPTED     4
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun /* RAID class */
168*4882a593Smuzhiyun #define CSMI_STS_INV_RAID_SET        1000
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun /* HBA class */
171*4882a593Smuzhiyun #define CSMI_STS_PHY_CHANGED         CSMI_STS_SUCCESS
172*4882a593Smuzhiyun #define CSMI_STS_PHY_UNCHANGEABLE    2000
173*4882a593Smuzhiyun #define CSMI_STS_INV_LINK_RATE       2001
174*4882a593Smuzhiyun #define CSMI_STS_INV_PHY             2002
175*4882a593Smuzhiyun #define CSMI_STS_INV_PHY_FOR_PORT    2003
176*4882a593Smuzhiyun #define CSMI_STS_PHY_UNSELECTABLE    2004
177*4882a593Smuzhiyun #define CSMI_STS_SELECT_PHY_OR_PORT  2005
178*4882a593Smuzhiyun #define CSMI_STS_INV_PORT            2006
179*4882a593Smuzhiyun #define CSMI_STS_PORT_UNSELECTABLE   2007
180*4882a593Smuzhiyun #define CSMI_STS_CONNECTION_FAILED   2008
181*4882a593Smuzhiyun #define CSMI_STS_NO_SATA_DEV         2009
182*4882a593Smuzhiyun #define CSMI_STS_NO_SATA_SIGNATURE   2010
183*4882a593Smuzhiyun #define CSMI_STS_SCSI_EMULATION      2011
184*4882a593Smuzhiyun #define CSMI_STS_NOT_AN_END_DEV      2012
185*4882a593Smuzhiyun #define CSMI_STS_NO_SCSI_ADDR        2013
186*4882a593Smuzhiyun #define CSMI_STS_NO_DEV_ADDR         2014
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun /* CSMI class independent structures */
189*4882a593Smuzhiyun struct atto_csmi_get_driver_info {
190*4882a593Smuzhiyun 	char name[81];
191*4882a593Smuzhiyun 	char description[81];
192*4882a593Smuzhiyun 	u16 major_rev;
193*4882a593Smuzhiyun 	u16 minor_rev;
194*4882a593Smuzhiyun 	u16 build_rev;
195*4882a593Smuzhiyun 	u16 release_rev;
196*4882a593Smuzhiyun 	u16 csmi_major_rev;
197*4882a593Smuzhiyun 	u16 csmi_minor_rev;
198*4882a593Smuzhiyun 	#define CSMI_MAJOR_REV_0_81      0
199*4882a593Smuzhiyun 	#define CSMI_MINOR_REV_0_81      81
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 	#define CSMI_MAJOR_REV           CSMI_MAJOR_REV_0_81
202*4882a593Smuzhiyun 	#define CSMI_MINOR_REV           CSMI_MINOR_REV_0_81
203*4882a593Smuzhiyun };
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun struct atto_csmi_get_pci_bus_addr {
206*4882a593Smuzhiyun 	u8 bus_num;
207*4882a593Smuzhiyun 	u8 device_num;
208*4882a593Smuzhiyun 	u8 function_num;
209*4882a593Smuzhiyun 	u8 reserved;
210*4882a593Smuzhiyun };
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun struct atto_csmi_get_cntlr_cfg {
213*4882a593Smuzhiyun 	u32 base_io_addr;
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun 	struct {
216*4882a593Smuzhiyun 		u32 base_memaddr_lo;
217*4882a593Smuzhiyun 		u32 base_memaddr_hi;
218*4882a593Smuzhiyun 	};
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun 	u32 board_id;
221*4882a593Smuzhiyun 	u16 slot_num;
222*4882a593Smuzhiyun 	#define CSMI_SLOT_NUM_UNKNOWN    0xFFFF
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 	u8 cntlr_class;
225*4882a593Smuzhiyun 	#define CSMI_CNTLR_CLASS_HBA     5
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun 	u8 io_bus_type;
228*4882a593Smuzhiyun 	#define CSMI_BUS_TYPE_PCI        3
229*4882a593Smuzhiyun 	#define CSMI_BUS_TYPE_PCMCIA     4
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun 	union {
232*4882a593Smuzhiyun 		struct atto_csmi_get_pci_bus_addr pci_addr;
233*4882a593Smuzhiyun 		u8 reserved[32];
234*4882a593Smuzhiyun 	};
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun 	char serial_num[81];
237*4882a593Smuzhiyun 	u16 major_rev;
238*4882a593Smuzhiyun 	u16 minor_rev;
239*4882a593Smuzhiyun 	u16 build_rev;
240*4882a593Smuzhiyun 	u16 release_rev;
241*4882a593Smuzhiyun 	u16 bios_major_rev;
242*4882a593Smuzhiyun 	u16 bios_minor_rev;
243*4882a593Smuzhiyun 	u16 bios_build_rev;
244*4882a593Smuzhiyun 	u16 bios_release_rev;
245*4882a593Smuzhiyun 	u32 cntlr_flags;
246*4882a593Smuzhiyun 	#define CSMI_CNTLRF_SAS_HBA      0x00000001
247*4882a593Smuzhiyun 	#define CSMI_CNTLRF_SAS_RAID     0x00000002
248*4882a593Smuzhiyun 	#define CSMI_CNTLRF_SATA_HBA     0x00000004
249*4882a593Smuzhiyun 	#define CSMI_CNTLRF_SATA_RAID    0x00000008
250*4882a593Smuzhiyun 	#define CSMI_CNTLRF_FWD_SUPPORT  0x00010000
251*4882a593Smuzhiyun 	#define CSMI_CNTLRF_FWD_ONLINE   0x00020000
252*4882a593Smuzhiyun 	#define CSMI_CNTLRF_FWD_SRESET   0x00040000
253*4882a593Smuzhiyun 	#define CSMI_CNTLRF_FWD_HRESET   0x00080000
254*4882a593Smuzhiyun 	#define CSMI_CNTLRF_FWD_RROM     0x00100000
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 	u16 rrom_major_rev;
257*4882a593Smuzhiyun 	u16 rrom_minor_rev;
258*4882a593Smuzhiyun 	u16 rrom_build_rev;
259*4882a593Smuzhiyun 	u16 rrom_release_rev;
260*4882a593Smuzhiyun 	u16 rrom_biosmajor_rev;
261*4882a593Smuzhiyun 	u16 rrom_biosminor_rev;
262*4882a593Smuzhiyun 	u16 rrom_biosbuild_rev;
263*4882a593Smuzhiyun 	u16 rrom_biosrelease_rev;
264*4882a593Smuzhiyun 	u8 reserved2[7];
265*4882a593Smuzhiyun };
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun struct atto_csmi_get_cntlr_sts {
268*4882a593Smuzhiyun 	u32 status;
269*4882a593Smuzhiyun 	#define CSMI_CNTLR_STS_GOOD          1
270*4882a593Smuzhiyun 	#define CSMI_CNTLR_STS_FAILED        2
271*4882a593Smuzhiyun 	#define CSMI_CNTLR_STS_OFFLINE       3
272*4882a593Smuzhiyun 	#define CSMI_CNTLR_STS_POWEROFF      4
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun 	u32 offline_reason;
275*4882a593Smuzhiyun 	#define CSMI_OFFLINE_NO_REASON       0
276*4882a593Smuzhiyun 	#define CSMI_OFFLINE_INITIALIZING    1
277*4882a593Smuzhiyun 	#define CSMI_OFFLINE_BUS_DEGRADED    2
278*4882a593Smuzhiyun 	#define CSMI_OFFLINE_BUS_FAILURE     3
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun 	u8 reserved[28];
281*4882a593Smuzhiyun };
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun struct atto_csmi_fw_download {
284*4882a593Smuzhiyun 	u32 buffer_len;
285*4882a593Smuzhiyun 	u32 download_flags;
286*4882a593Smuzhiyun 	#define CSMI_FWDF_VALIDATE       0x00000001
287*4882a593Smuzhiyun 	#define CSMI_FWDF_SOFT_RESET     0x00000002
288*4882a593Smuzhiyun 	#define CSMI_FWDF_HARD_RESET     0x00000004
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun 	u8 reserved[32];
291*4882a593Smuzhiyun 	u16 status;
292*4882a593Smuzhiyun 	#define CSMI_FWD_STS_SUCCESS     0
293*4882a593Smuzhiyun 	#define CSMI_FWD_STS_FAILED      1
294*4882a593Smuzhiyun 	#define CSMI_FWD_STS_USING_RROM  2
295*4882a593Smuzhiyun 	#define CSMI_FWD_STS_REJECT      3
296*4882a593Smuzhiyun 	#define CSMI_FWD_STS_DOWNREV     4
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun 	u16 severity;
299*4882a593Smuzhiyun 	#define CSMI_FWD_SEV_INFO        0
300*4882a593Smuzhiyun 	#define CSMI_FWD_SEV_WARNING     1
301*4882a593Smuzhiyun 	#define CSMI_FWD_SEV_ERROR       2
302*4882a593Smuzhiyun 	#define CSMI_FWD_SEV_FATAL       3
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun };
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun /* CSMI RAID class structures */
307*4882a593Smuzhiyun struct atto_csmi_get_raid_info {
308*4882a593Smuzhiyun 	u32 num_raid_sets;
309*4882a593Smuzhiyun 	u32 max_drivesper_set;
310*4882a593Smuzhiyun 	u8 reserved[92];
311*4882a593Smuzhiyun };
312*4882a593Smuzhiyun 
313*4882a593Smuzhiyun struct atto_csmi_raid_drives {
314*4882a593Smuzhiyun 	char model[40];
315*4882a593Smuzhiyun 	char firmware[8];
316*4882a593Smuzhiyun 	char serial_num[40];
317*4882a593Smuzhiyun 	u8 sas_addr[8];
318*4882a593Smuzhiyun 	u8 lun[8];
319*4882a593Smuzhiyun 	u8 drive_sts;
320*4882a593Smuzhiyun 	#define CSMI_DRV_STS_OK          0
321*4882a593Smuzhiyun 	#define CSMI_DRV_STS_REBUILDING  1
322*4882a593Smuzhiyun 	#define CSMI_DRV_STS_FAILED      2
323*4882a593Smuzhiyun 	#define CSMI_DRV_STS_DEGRADED    3
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun 	u8 drive_usage;
326*4882a593Smuzhiyun 	#define CSMI_DRV_USE_NOT_USED    0
327*4882a593Smuzhiyun 	#define CSMI_DRV_USE_MEMBER      1
328*4882a593Smuzhiyun 	#define CSMI_DRV_USE_SPARE       2
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun 	u8 reserved[30]; /* spec says 22 */
331*4882a593Smuzhiyun };
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun struct atto_csmi_get_raid_cfg {
334*4882a593Smuzhiyun 	u32 raid_set_index;
335*4882a593Smuzhiyun 	u32 capacity;
336*4882a593Smuzhiyun 	u32 stripe_size;
337*4882a593Smuzhiyun 	u8 raid_type;
338*4882a593Smuzhiyun 	u8 status;
339*4882a593Smuzhiyun 	u8 information;
340*4882a593Smuzhiyun 	u8 drive_cnt;
341*4882a593Smuzhiyun 	u8 reserved[20];
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun 	struct atto_csmi_raid_drives drives[1];
344*4882a593Smuzhiyun };
345*4882a593Smuzhiyun 
346*4882a593Smuzhiyun /* CSMI HBA class structures */
347*4882a593Smuzhiyun struct atto_csmi_phy_entity {
348*4882a593Smuzhiyun 	u8 ident_frame[0x1C];
349*4882a593Smuzhiyun 	u8 port_id;
350*4882a593Smuzhiyun 	u8 neg_link_rate;
351*4882a593Smuzhiyun 	u8 min_link_rate;
352*4882a593Smuzhiyun 	u8 max_link_rate;
353*4882a593Smuzhiyun 	u8 phy_change_cnt;
354*4882a593Smuzhiyun 	u8 auto_discover;
355*4882a593Smuzhiyun 	#define CSMI_DISC_NOT_SUPPORTED  0x00
356*4882a593Smuzhiyun 	#define CSMI_DISC_NOT_STARTED    0x01
357*4882a593Smuzhiyun 	#define CSMI_DISC_IN_PROGRESS    0x02
358*4882a593Smuzhiyun 	#define CSMI_DISC_COMPLETE       0x03
359*4882a593Smuzhiyun 	#define CSMI_DISC_ERROR          0x04
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun 	u8 reserved[2];
362*4882a593Smuzhiyun 	u8 attach_ident_frame[0x1C];
363*4882a593Smuzhiyun };
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun struct atto_csmi_get_phy_info {
366*4882a593Smuzhiyun 	u8 number_of_phys;
367*4882a593Smuzhiyun 	u8 reserved[3];
368*4882a593Smuzhiyun 	struct atto_csmi_phy_entity
369*4882a593Smuzhiyun 		phy[32];
370*4882a593Smuzhiyun };
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun struct atto_csmi_set_phy_info {
373*4882a593Smuzhiyun 	u8 phy_id;
374*4882a593Smuzhiyun 	u8 neg_link_rate;
375*4882a593Smuzhiyun 	#define CSMI_NEG_RATE_NEGOTIATE  0x00
376*4882a593Smuzhiyun 	#define CSMI_NEG_RATE_PHY_DIS    0x01
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun 	u8 prog_minlink_rate;
379*4882a593Smuzhiyun 	u8 prog_maxlink_rate;
380*4882a593Smuzhiyun 	u8 signal_class;
381*4882a593Smuzhiyun 	#define CSMI_SIG_CLASS_UNKNOWN   0x00
382*4882a593Smuzhiyun 	#define CSMI_SIG_CLASS_DIRECT    0x01
383*4882a593Smuzhiyun 	#define CSMI_SIG_CLASS_SERVER    0x02
384*4882a593Smuzhiyun 	#define CSMI_SIG_CLASS_ENCLOSURE 0x03
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun 	u8 reserved[3];
387*4882a593Smuzhiyun };
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun struct atto_csmi_get_link_errors {
390*4882a593Smuzhiyun 	u8 phy_id;
391*4882a593Smuzhiyun 	u8 reset_cnts;
392*4882a593Smuzhiyun 	#define CSMI_RESET_CNTS_NO       0x00
393*4882a593Smuzhiyun 	#define CSMI_RESET_CNTS_YES      0x01
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun 	u8 reserved[2];
396*4882a593Smuzhiyun 	u32 inv_dw_cnt;
397*4882a593Smuzhiyun 	u32 disp_err_cnt;
398*4882a593Smuzhiyun 	u32 loss_ofdw_sync_cnt;
399*4882a593Smuzhiyun 	u32 phy_reseterr_cnt;
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun 	/*
402*4882a593Smuzhiyun 	 * The following field has been added by ATTO for ease of
403*4882a593Smuzhiyun 	 * implementation of additional statistics.  Drivers must validate
404*4882a593Smuzhiyun 	 * the length of the IOCTL payload prior to filling them in so CSMI
405*4882a593Smuzhiyun 	 * complaint applications function correctly.
406*4882a593Smuzhiyun 	 */
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun 	u32 crc_err_cnt;
409*4882a593Smuzhiyun };
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun struct atto_csmi_smp_passthru {
412*4882a593Smuzhiyun 	u8 phy_id;
413*4882a593Smuzhiyun 	u8 port_id;
414*4882a593Smuzhiyun 	u8 conn_rate;
415*4882a593Smuzhiyun 	u8 reserved;
416*4882a593Smuzhiyun 	u8 dest_sas_addr[8];
417*4882a593Smuzhiyun 	u32 req_len;
418*4882a593Smuzhiyun 	u8 smp_req[1020];
419*4882a593Smuzhiyun 	u8 conn_sts;
420*4882a593Smuzhiyun 	u8 reserved2[3];
421*4882a593Smuzhiyun 	u32 rsp_len;
422*4882a593Smuzhiyun 	u8 smp_rsp[1020];
423*4882a593Smuzhiyun };
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun struct atto_csmi_ssp_passthru_sts {
426*4882a593Smuzhiyun 	u8 conn_sts;
427*4882a593Smuzhiyun 	u8 reserved[3];
428*4882a593Smuzhiyun 	u8 data_present;
429*4882a593Smuzhiyun 	u8 status;
430*4882a593Smuzhiyun 	u16 rsp_length;
431*4882a593Smuzhiyun 	u8 rsp[256];
432*4882a593Smuzhiyun 	u32 data_bytes;
433*4882a593Smuzhiyun };
434*4882a593Smuzhiyun 
435*4882a593Smuzhiyun struct atto_csmi_ssp_passthru {
436*4882a593Smuzhiyun 	u8 phy_id;
437*4882a593Smuzhiyun 	u8 port_id;
438*4882a593Smuzhiyun 	u8 conn_rate;
439*4882a593Smuzhiyun 	u8 reserved;
440*4882a593Smuzhiyun 	u8 dest_sas_addr[8];
441*4882a593Smuzhiyun 	u8 lun[8];
442*4882a593Smuzhiyun 	u8 cdb_len;
443*4882a593Smuzhiyun 	u8 add_cdb_len;
444*4882a593Smuzhiyun 	u8 reserved2[2];
445*4882a593Smuzhiyun 	u8 cdb[16];
446*4882a593Smuzhiyun 	u32 flags;
447*4882a593Smuzhiyun 	#define CSMI_SSPF_DD_READ        0x00000001
448*4882a593Smuzhiyun 	#define CSMI_SSPF_DD_WRITE       0x00000002
449*4882a593Smuzhiyun 	#define CSMI_SSPF_DD_UNSPECIFIED 0x00000004
450*4882a593Smuzhiyun 	#define CSMI_SSPF_TA_SIMPLE      0x00000000
451*4882a593Smuzhiyun 	#define CSMI_SSPF_TA_HEAD_OF_Q   0x00000010
452*4882a593Smuzhiyun 	#define CSMI_SSPF_TA_ORDERED     0x00000020
453*4882a593Smuzhiyun 	#define CSMI_SSPF_TA_ACA         0x00000040
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun 	u8 add_cdb[24];
456*4882a593Smuzhiyun 	u32 data_len;
457*4882a593Smuzhiyun 
458*4882a593Smuzhiyun 	struct atto_csmi_ssp_passthru_sts sts;
459*4882a593Smuzhiyun };
460*4882a593Smuzhiyun 
461*4882a593Smuzhiyun struct atto_csmi_stp_passthru_sts {
462*4882a593Smuzhiyun 	u8 conn_sts;
463*4882a593Smuzhiyun 	u8 reserved[3];
464*4882a593Smuzhiyun 	u8 sts_fis[20];
465*4882a593Smuzhiyun 	u32 scr[16];
466*4882a593Smuzhiyun 	u32 data_bytes;
467*4882a593Smuzhiyun };
468*4882a593Smuzhiyun 
469*4882a593Smuzhiyun struct atto_csmi_stp_passthru {
470*4882a593Smuzhiyun 	u8 phy_id;
471*4882a593Smuzhiyun 	u8 port_id;
472*4882a593Smuzhiyun 	u8 conn_rate;
473*4882a593Smuzhiyun 	u8 reserved;
474*4882a593Smuzhiyun 	u8 dest_sas_addr[8];
475*4882a593Smuzhiyun 	u8 reserved2[4];
476*4882a593Smuzhiyun 	u8 command_fis[20];
477*4882a593Smuzhiyun 	u32 flags;
478*4882a593Smuzhiyun 	#define CSMI_STPF_DD_READ        0x00000001
479*4882a593Smuzhiyun 	#define CSMI_STPF_DD_WRITE       0x00000002
480*4882a593Smuzhiyun 	#define CSMI_STPF_DD_UNSPECIFIED 0x00000004
481*4882a593Smuzhiyun 	#define CSMI_STPF_PIO            0x00000010
482*4882a593Smuzhiyun 	#define CSMI_STPF_DMA            0x00000020
483*4882a593Smuzhiyun 	#define CSMI_STPF_PACKET         0x00000040
484*4882a593Smuzhiyun 	#define CSMI_STPF_DMA_QUEUED     0x00000080
485*4882a593Smuzhiyun 	#define CSMI_STPF_EXECUTE_DIAG   0x00000100
486*4882a593Smuzhiyun 	#define CSMI_STPF_RESET_DEVICE   0x00000200
487*4882a593Smuzhiyun 
488*4882a593Smuzhiyun 	u32 data_len;
489*4882a593Smuzhiyun 
490*4882a593Smuzhiyun 	struct atto_csmi_stp_passthru_sts sts;
491*4882a593Smuzhiyun };
492*4882a593Smuzhiyun 
493*4882a593Smuzhiyun struct atto_csmi_get_sata_sig {
494*4882a593Smuzhiyun 	u8 phy_id;
495*4882a593Smuzhiyun 	u8 reserved[3];
496*4882a593Smuzhiyun 	u8 reg_dth_fis[20];
497*4882a593Smuzhiyun };
498*4882a593Smuzhiyun 
499*4882a593Smuzhiyun struct atto_csmi_get_scsi_addr {
500*4882a593Smuzhiyun 	u8 sas_addr[8];
501*4882a593Smuzhiyun 	u8 sas_lun[8];
502*4882a593Smuzhiyun 	u8 host_index;
503*4882a593Smuzhiyun 	u8 path_id;
504*4882a593Smuzhiyun 	u8 target_id;
505*4882a593Smuzhiyun 	u8 lun;
506*4882a593Smuzhiyun };
507*4882a593Smuzhiyun 
508*4882a593Smuzhiyun struct atto_csmi_get_dev_addr {
509*4882a593Smuzhiyun 	u8 host_index;
510*4882a593Smuzhiyun 	u8 path_id;
511*4882a593Smuzhiyun 	u8 target_id;
512*4882a593Smuzhiyun 	u8 lun;
513*4882a593Smuzhiyun 	u8 sas_addr[8];
514*4882a593Smuzhiyun 	u8 sas_lun[8];
515*4882a593Smuzhiyun };
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun struct atto_csmi_task_mgmt {
518*4882a593Smuzhiyun 	u8 host_index;
519*4882a593Smuzhiyun 	u8 path_id;
520*4882a593Smuzhiyun 	u8 target_id;
521*4882a593Smuzhiyun 	u8 lun;
522*4882a593Smuzhiyun 	u32 flags;
523*4882a593Smuzhiyun 	#define CSMI_TMF_TASK_IU         0x00000001
524*4882a593Smuzhiyun 	#define CSMI_TMF_HARD_RST        0x00000002
525*4882a593Smuzhiyun 	#define CSMI_TMF_SUPPRESS_RSLT   0x00000004
526*4882a593Smuzhiyun 
527*4882a593Smuzhiyun 	u32 queue_tag;
528*4882a593Smuzhiyun 	u32 reserved;
529*4882a593Smuzhiyun 	u8 task_mgt_func;
530*4882a593Smuzhiyun 	u8 reserved2[7];
531*4882a593Smuzhiyun 	u32 information;
532*4882a593Smuzhiyun 	#define CSMI_TM_INFO_TEST        1
533*4882a593Smuzhiyun 	#define CSMI_TM_INFO_EXCEEDED    2
534*4882a593Smuzhiyun 	#define CSMI_TM_INFO_DEMAND      3
535*4882a593Smuzhiyun 	#define CSMI_TM_INFO_TRIGGER     4
536*4882a593Smuzhiyun 
537*4882a593Smuzhiyun 	struct atto_csmi_ssp_passthru_sts sts;
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun };
540*4882a593Smuzhiyun 
541*4882a593Smuzhiyun struct atto_csmi_get_conn_info {
542*4882a593Smuzhiyun 	u32 pinout;
543*4882a593Smuzhiyun 	#define CSMI_CON_UNKNOWN         0x00000001
544*4882a593Smuzhiyun 	#define CSMI_CON_SFF_8482        0x00000002
545*4882a593Smuzhiyun 	#define CSMI_CON_SFF_8470_LANE_1 0x00000100
546*4882a593Smuzhiyun 	#define CSMI_CON_SFF_8470_LANE_2 0x00000200
547*4882a593Smuzhiyun 	#define CSMI_CON_SFF_8470_LANE_3 0x00000400
548*4882a593Smuzhiyun 	#define CSMI_CON_SFF_8470_LANE_4 0x00000800
549*4882a593Smuzhiyun 	#define CSMI_CON_SFF_8484_LANE_1 0x00010000
550*4882a593Smuzhiyun 	#define CSMI_CON_SFF_8484_LANE_2 0x00020000
551*4882a593Smuzhiyun 	#define CSMI_CON_SFF_8484_LANE_3 0x00040000
552*4882a593Smuzhiyun 	#define CSMI_CON_SFF_8484_LANE_4 0x00080000
553*4882a593Smuzhiyun 
554*4882a593Smuzhiyun 	u8 connector[16];
555*4882a593Smuzhiyun 	u8 location;
556*4882a593Smuzhiyun 	#define CSMI_CON_INTERNAL        0x02
557*4882a593Smuzhiyun 	#define CSMI_CON_EXTERNAL        0x04
558*4882a593Smuzhiyun 	#define CSMI_CON_SWITCHABLE      0x08
559*4882a593Smuzhiyun 	#define CSMI_CON_AUTO            0x10
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun 	u8 reserved[15];
562*4882a593Smuzhiyun };
563*4882a593Smuzhiyun 
564*4882a593Smuzhiyun /* CSMI PHY class structures */
565*4882a593Smuzhiyun struct atto_csmi_character {
566*4882a593Smuzhiyun 	u8 type_flags;
567*4882a593Smuzhiyun 	#define CSMI_CTF_POS_DISP        0x01
568*4882a593Smuzhiyun 	#define CSMI_CTF_NEG_DISP        0x02
569*4882a593Smuzhiyun 	#define CSMI_CTF_CTRL_CHAR       0x04
570*4882a593Smuzhiyun 
571*4882a593Smuzhiyun 	u8 value;
572*4882a593Smuzhiyun };
573*4882a593Smuzhiyun 
574*4882a593Smuzhiyun struct atto_csmi_pc_ctrl {
575*4882a593Smuzhiyun 	u8 type;
576*4882a593Smuzhiyun 	#define CSMI_PC_TYPE_UNDEFINED   0x00
577*4882a593Smuzhiyun 	#define CSMI_PC_TYPE_SATA        0x01
578*4882a593Smuzhiyun 	#define CSMI_PC_TYPE_SAS         0x02
579*4882a593Smuzhiyun 	u8 rate;
580*4882a593Smuzhiyun 	u8 reserved[6];
581*4882a593Smuzhiyun 	u32 vendor_unique[8];
582*4882a593Smuzhiyun 	u32 tx_flags;
583*4882a593Smuzhiyun 	#define CSMI_PC_TXF_PREEMP_DIS   0x00000001
584*4882a593Smuzhiyun 
585*4882a593Smuzhiyun 	signed char tx_amplitude;
586*4882a593Smuzhiyun 	signed char tx_preemphasis;
587*4882a593Smuzhiyun 	signed char tx_slew_rate;
588*4882a593Smuzhiyun 	signed char tx_reserved[13];
589*4882a593Smuzhiyun 	u8 tx_vendor_unique[64];
590*4882a593Smuzhiyun 	u32 rx_flags;
591*4882a593Smuzhiyun 	#define CSMI_PC_RXF_EQ_DIS       0x00000001
592*4882a593Smuzhiyun 
593*4882a593Smuzhiyun 	signed char rx_threshold;
594*4882a593Smuzhiyun 	signed char rx_equalization_gain;
595*4882a593Smuzhiyun 	signed char rx_reserved[14];
596*4882a593Smuzhiyun 	u8 rx_vendor_unique[64];
597*4882a593Smuzhiyun 	u32 pattern_flags;
598*4882a593Smuzhiyun 	#define CSMI_PC_PATF_FIXED       0x00000001
599*4882a593Smuzhiyun 	#define CSMI_PC_PATF_DIS_SCR     0x00000002
600*4882a593Smuzhiyun 	#define CSMI_PC_PATF_DIS_ALIGN   0x00000004
601*4882a593Smuzhiyun 	#define CSMI_PC_PATF_DIS_SSC     0x00000008
602*4882a593Smuzhiyun 
603*4882a593Smuzhiyun 	u8 fixed_pattern;
604*4882a593Smuzhiyun 	#define CSMI_PC_FP_CJPAT         0x00000001
605*4882a593Smuzhiyun 	#define CSMI_PC_FP_ALIGN         0x00000002
606*4882a593Smuzhiyun 
607*4882a593Smuzhiyun 	u8 user_pattern_len;
608*4882a593Smuzhiyun 	u8 pattern_reserved[6];
609*4882a593Smuzhiyun 
610*4882a593Smuzhiyun 	struct atto_csmi_character user_pattern_buffer[16];
611*4882a593Smuzhiyun };
612*4882a593Smuzhiyun 
613*4882a593Smuzhiyun struct atto_csmi_phy_ctrl {
614*4882a593Smuzhiyun 	u32 function;
615*4882a593Smuzhiyun 	#define CSMI_PC_FUNC_GET_SETUP   0x00000100
616*4882a593Smuzhiyun 
617*4882a593Smuzhiyun 	u8 phy_id;
618*4882a593Smuzhiyun 	u16 len_of_cntl;
619*4882a593Smuzhiyun 	u8 num_of_cntls;
620*4882a593Smuzhiyun 	u8 reserved[4];
621*4882a593Smuzhiyun 	u32 link_flags;
622*4882a593Smuzhiyun 	#define CSMI_PHY_ACTIVATE_CTRL   0x00000001
623*4882a593Smuzhiyun 	#define CSMI_PHY_UPD_SPINUP_RATE 0x00000002
624*4882a593Smuzhiyun 	#define CSMI_PHY_AUTO_COMWAKE    0x00000004
625*4882a593Smuzhiyun 
626*4882a593Smuzhiyun 	u8 spinup_rate;
627*4882a593Smuzhiyun 	u8 link_reserved[7];
628*4882a593Smuzhiyun 	u32 vendor_unique[8];
629*4882a593Smuzhiyun 
630*4882a593Smuzhiyun 	struct atto_csmi_pc_ctrl control[1];
631*4882a593Smuzhiyun };
632*4882a593Smuzhiyun 
633*4882a593Smuzhiyun union atto_ioctl_csmi {
634*4882a593Smuzhiyun 	struct atto_csmi_get_driver_info drvr_info;
635*4882a593Smuzhiyun 	struct atto_csmi_get_cntlr_cfg cntlr_cfg;
636*4882a593Smuzhiyun 	struct atto_csmi_get_cntlr_sts cntlr_sts;
637*4882a593Smuzhiyun 	struct atto_csmi_fw_download fw_dwnld;
638*4882a593Smuzhiyun 	struct atto_csmi_get_raid_info raid_info;
639*4882a593Smuzhiyun 	struct atto_csmi_get_raid_cfg raid_cfg;
640*4882a593Smuzhiyun 	struct atto_csmi_get_phy_info get_phy_info;
641*4882a593Smuzhiyun 	struct atto_csmi_set_phy_info set_phy_info;
642*4882a593Smuzhiyun 	struct atto_csmi_get_link_errors link_errs;
643*4882a593Smuzhiyun 	struct atto_csmi_smp_passthru smp_pass_thru;
644*4882a593Smuzhiyun 	struct atto_csmi_ssp_passthru ssp_pass_thru;
645*4882a593Smuzhiyun 	struct atto_csmi_stp_passthru stp_pass_thru;
646*4882a593Smuzhiyun 	struct atto_csmi_task_mgmt tsk_mgt;
647*4882a593Smuzhiyun 	struct atto_csmi_get_sata_sig sata_sig;
648*4882a593Smuzhiyun 	struct atto_csmi_get_scsi_addr scsi_addr;
649*4882a593Smuzhiyun 	struct atto_csmi_get_dev_addr dev_addr;
650*4882a593Smuzhiyun 	struct atto_csmi_get_conn_info conn_info[32];
651*4882a593Smuzhiyun 	struct atto_csmi_phy_ctrl phy_ctrl;
652*4882a593Smuzhiyun };
653*4882a593Smuzhiyun 
654*4882a593Smuzhiyun struct atto_csmi {
655*4882a593Smuzhiyun 	u32 control_code;
656*4882a593Smuzhiyun 	u32 status;
657*4882a593Smuzhiyun 	union atto_ioctl_csmi data;
658*4882a593Smuzhiyun };
659*4882a593Smuzhiyun 
660*4882a593Smuzhiyun struct atto_module_info {
661*4882a593Smuzhiyun 	void *adapter;
662*4882a593Smuzhiyun 	void *pci_dev;
663*4882a593Smuzhiyun 	void *scsi_host;
664*4882a593Smuzhiyun 	unsigned short host_no;
665*4882a593Smuzhiyun 	union {
666*4882a593Smuzhiyun 		struct {
667*4882a593Smuzhiyun 			u64 node_name;
668*4882a593Smuzhiyun 			u64 port_name;
669*4882a593Smuzhiyun 		};
670*4882a593Smuzhiyun 		u64 sas_addr;
671*4882a593Smuzhiyun 	};
672*4882a593Smuzhiyun };
673*4882a593Smuzhiyun 
674*4882a593Smuzhiyun #define ATTO_FUNC_GET_ADAP_INFO      0x00
675*4882a593Smuzhiyun #define ATTO_VER_GET_ADAP_INFO0      0
676*4882a593Smuzhiyun #define ATTO_VER_GET_ADAP_INFO       ATTO_VER_GET_ADAP_INFO0
677*4882a593Smuzhiyun 
678*4882a593Smuzhiyun struct __packed atto_hba_get_adapter_info {
679*4882a593Smuzhiyun 
680*4882a593Smuzhiyun 	struct {
681*4882a593Smuzhiyun 		u16 vendor_id;
682*4882a593Smuzhiyun 		u16 device_id;
683*4882a593Smuzhiyun 		u16 ss_vendor_id;
684*4882a593Smuzhiyun 		u16 ss_device_id;
685*4882a593Smuzhiyun 		u8 class_code[3];
686*4882a593Smuzhiyun 		u8 rev_id;
687*4882a593Smuzhiyun 		u8 bus_num;
688*4882a593Smuzhiyun 		u8 dev_num;
689*4882a593Smuzhiyun 		u8 func_num;
690*4882a593Smuzhiyun 		u8 link_width_max;
691*4882a593Smuzhiyun 		u8 link_width_curr;
692*4882a593Smuzhiyun 	    #define ATTO_GAI_PCILW_UNKNOWN   0x00
693*4882a593Smuzhiyun 
694*4882a593Smuzhiyun 		u8 link_speed_max;
695*4882a593Smuzhiyun 		u8 link_speed_curr;
696*4882a593Smuzhiyun 	    #define ATTO_GAI_PCILS_UNKNOWN   0x00
697*4882a593Smuzhiyun 	    #define ATTO_GAI_PCILS_GEN1      0x01
698*4882a593Smuzhiyun 	    #define ATTO_GAI_PCILS_GEN2      0x02
699*4882a593Smuzhiyun 	    #define ATTO_GAI_PCILS_GEN3      0x03
700*4882a593Smuzhiyun 
701*4882a593Smuzhiyun 		u8 interrupt_mode;
702*4882a593Smuzhiyun 	    #define ATTO_GAI_PCIIM_UNKNOWN   0x00
703*4882a593Smuzhiyun 	    #define ATTO_GAI_PCIIM_LEGACY    0x01
704*4882a593Smuzhiyun 	    #define ATTO_GAI_PCIIM_MSI       0x02
705*4882a593Smuzhiyun 	    #define ATTO_GAI_PCIIM_MSIX      0x03
706*4882a593Smuzhiyun 
707*4882a593Smuzhiyun 		u8 msi_vector_cnt;
708*4882a593Smuzhiyun 		u8 reserved[19];
709*4882a593Smuzhiyun 	} pci;
710*4882a593Smuzhiyun 
711*4882a593Smuzhiyun 	u8 adap_type;
712*4882a593Smuzhiyun 	#define ATTO_GAI_AT_EPCIU320     0x00
713*4882a593Smuzhiyun 	#define ATTO_GAI_AT_ESASRAID     0x01
714*4882a593Smuzhiyun 	#define ATTO_GAI_AT_ESASRAID2    0x02
715*4882a593Smuzhiyun 	#define ATTO_GAI_AT_ESASHBA      0x03
716*4882a593Smuzhiyun 	#define ATTO_GAI_AT_ESASHBA2     0x04
717*4882a593Smuzhiyun 	#define ATTO_GAI_AT_CELERITY     0x05
718*4882a593Smuzhiyun 	#define ATTO_GAI_AT_CELERITY8    0x06
719*4882a593Smuzhiyun 	#define ATTO_GAI_AT_FASTFRAME    0x07
720*4882a593Smuzhiyun 	#define ATTO_GAI_AT_ESASHBA3     0x08
721*4882a593Smuzhiyun 	#define ATTO_GAI_AT_CELERITY16   0x09
722*4882a593Smuzhiyun 	#define ATTO_GAI_AT_TLSASHBA     0x0A
723*4882a593Smuzhiyun 	#define ATTO_GAI_AT_ESASHBA4     0x0B
724*4882a593Smuzhiyun 
725*4882a593Smuzhiyun 	u8 adap_flags;
726*4882a593Smuzhiyun 	#define ATTO_GAI_AF_DEGRADED     0x01
727*4882a593Smuzhiyun 	#define ATTO_GAI_AF_SPT_SUPP     0x02
728*4882a593Smuzhiyun 	#define ATTO_GAI_AF_DEVADDR_SUPP 0x04
729*4882a593Smuzhiyun 	#define ATTO_GAI_AF_PHYCTRL_SUPP 0x08
730*4882a593Smuzhiyun 	#define ATTO_GAI_AF_TEST_SUPP    0x10
731*4882a593Smuzhiyun 	#define ATTO_GAI_AF_DIAG_SUPP    0x20
732*4882a593Smuzhiyun 	#define ATTO_GAI_AF_VIRT_SES     0x40
733*4882a593Smuzhiyun 	#define ATTO_GAI_AF_CONN_CTRL    0x80
734*4882a593Smuzhiyun 
735*4882a593Smuzhiyun 	u8 num_ports;
736*4882a593Smuzhiyun 	u8 num_phys;
737*4882a593Smuzhiyun 	u8 drvr_rev_major;
738*4882a593Smuzhiyun 	u8 drvr_rev_minor;
739*4882a593Smuzhiyun 	u8 drvr_revsub_minor;
740*4882a593Smuzhiyun 	u8 drvr_rev_build;
741*4882a593Smuzhiyun 	char drvr_rev_ascii[16];
742*4882a593Smuzhiyun 	char drvr_name[32];
743*4882a593Smuzhiyun 	char firmware_rev[16];
744*4882a593Smuzhiyun 	char flash_rev[16];
745*4882a593Smuzhiyun 	char model_name_short[16];
746*4882a593Smuzhiyun 	char model_name[32];
747*4882a593Smuzhiyun 	u32 num_targets;
748*4882a593Smuzhiyun 	u32 num_targsper_bus;
749*4882a593Smuzhiyun 	u32 num_lunsper_targ;
750*4882a593Smuzhiyun 	u8 num_busses;
751*4882a593Smuzhiyun 	u8 num_connectors;
752*4882a593Smuzhiyun 	u8 adap_flags2;
753*4882a593Smuzhiyun 	#define ATTO_GAI_AF2_FCOE_SUPP       0x01
754*4882a593Smuzhiyun 	#define ATTO_GAI_AF2_NIC_SUPP        0x02
755*4882a593Smuzhiyun 	#define ATTO_GAI_AF2_LOCATE_SUPP     0x04
756*4882a593Smuzhiyun 	#define ATTO_GAI_AF2_ADAP_CTRL_SUPP  0x08
757*4882a593Smuzhiyun 	#define ATTO_GAI_AF2_DEV_INFO_SUPP   0x10
758*4882a593Smuzhiyun 	#define ATTO_GAI_AF2_NPIV_SUPP       0x20
759*4882a593Smuzhiyun 	#define ATTO_GAI_AF2_MP_SUPP         0x40
760*4882a593Smuzhiyun 
761*4882a593Smuzhiyun 	u8 num_temp_sensors;
762*4882a593Smuzhiyun 	u32 num_targets_backend;
763*4882a593Smuzhiyun 	u32 tunnel_flags;
764*4882a593Smuzhiyun 	#define ATTO_GAI_TF_MEM_RW           0x00000001
765*4882a593Smuzhiyun 	#define ATTO_GAI_TF_TRACE            0x00000002
766*4882a593Smuzhiyun 	#define ATTO_GAI_TF_SCSI_PASS_THRU   0x00000004
767*4882a593Smuzhiyun 	#define ATTO_GAI_TF_GET_DEV_ADDR     0x00000008
768*4882a593Smuzhiyun 	#define ATTO_GAI_TF_PHY_CTRL         0x00000010
769*4882a593Smuzhiyun 	#define ATTO_GAI_TF_CONN_CTRL        0x00000020
770*4882a593Smuzhiyun 	#define ATTO_GAI_TF_GET_DEV_INFO     0x00000040
771*4882a593Smuzhiyun 
772*4882a593Smuzhiyun 	u8 reserved3[0x138];
773*4882a593Smuzhiyun };
774*4882a593Smuzhiyun 
775*4882a593Smuzhiyun #define ATTO_FUNC_GET_ADAP_ADDR      0x01
776*4882a593Smuzhiyun #define ATTO_VER_GET_ADAP_ADDR0      0
777*4882a593Smuzhiyun #define ATTO_VER_GET_ADAP_ADDR       ATTO_VER_GET_ADAP_ADDR0
778*4882a593Smuzhiyun 
779*4882a593Smuzhiyun struct __packed atto_hba_get_adapter_address {
780*4882a593Smuzhiyun 
781*4882a593Smuzhiyun 	u8 addr_type;
782*4882a593Smuzhiyun 	#define ATTO_GAA_AT_PORT         0x00
783*4882a593Smuzhiyun 	#define ATTO_GAA_AT_NODE         0x01
784*4882a593Smuzhiyun 	#define ATTO_GAA_AT_CURR_MAC     0x02
785*4882a593Smuzhiyun 	#define ATTO_GAA_AT_PERM_MAC     0x03
786*4882a593Smuzhiyun 	#define ATTO_GAA_AT_VNIC         0x04
787*4882a593Smuzhiyun 
788*4882a593Smuzhiyun 	u8 port_id;
789*4882a593Smuzhiyun 	u16 addr_len;
790*4882a593Smuzhiyun 	u8 address[256];
791*4882a593Smuzhiyun };
792*4882a593Smuzhiyun 
793*4882a593Smuzhiyun #define ATTO_FUNC_MEM_RW             0x02
794*4882a593Smuzhiyun #define ATTO_VER_MEM_RW0             0
795*4882a593Smuzhiyun #define ATTO_VER_MEM_RW              ATTO_VER_MEM_RW0
796*4882a593Smuzhiyun 
797*4882a593Smuzhiyun struct __packed atto_hba_memory_read_write {
798*4882a593Smuzhiyun 	u8 mem_func;
799*4882a593Smuzhiyun 	u8 mem_type;
800*4882a593Smuzhiyun 	union {
801*4882a593Smuzhiyun 		u8 pci_index;
802*4882a593Smuzhiyun 		u8 i2c_dev;
803*4882a593Smuzhiyun 	};
804*4882a593Smuzhiyun 	u8 i2c_status;
805*4882a593Smuzhiyun 	u32 length;
806*4882a593Smuzhiyun 	u64 address;
807*4882a593Smuzhiyun 	u8 reserved[48];
808*4882a593Smuzhiyun 
809*4882a593Smuzhiyun };
810*4882a593Smuzhiyun 
811*4882a593Smuzhiyun #define ATTO_FUNC_TRACE              0x03
812*4882a593Smuzhiyun #define ATTO_VER_TRACE0              0
813*4882a593Smuzhiyun #define ATTO_VER_TRACE1              1
814*4882a593Smuzhiyun #define ATTO_VER_TRACE               ATTO_VER_TRACE1
815*4882a593Smuzhiyun 
816*4882a593Smuzhiyun struct __packed atto_hba_trace {
817*4882a593Smuzhiyun 	u8 trace_func;
818*4882a593Smuzhiyun 	#define ATTO_TRC_TF_GET_INFO     0x00
819*4882a593Smuzhiyun 	#define ATTO_TRC_TF_ENABLE       0x01
820*4882a593Smuzhiyun 	#define ATTO_TRC_TF_DISABLE      0x02
821*4882a593Smuzhiyun 	#define ATTO_TRC_TF_SET_MASK     0x03
822*4882a593Smuzhiyun 	#define ATTO_TRC_TF_UPLOAD       0x04
823*4882a593Smuzhiyun 	#define ATTO_TRC_TF_RESET        0x05
824*4882a593Smuzhiyun 
825*4882a593Smuzhiyun 	u8 trace_type;
826*4882a593Smuzhiyun 	#define ATTO_TRC_TT_DRIVER       0x00
827*4882a593Smuzhiyun 	#define ATTO_TRC_TT_FWCOREDUMP   0x01
828*4882a593Smuzhiyun 
829*4882a593Smuzhiyun 	u8 reserved[2];
830*4882a593Smuzhiyun 	u32 current_offset;
831*4882a593Smuzhiyun 	u32 total_length;
832*4882a593Smuzhiyun 	u32 trace_mask;
833*4882a593Smuzhiyun 	u8 reserved2[48];
834*4882a593Smuzhiyun };
835*4882a593Smuzhiyun 
836*4882a593Smuzhiyun #define ATTO_FUNC_SCSI_PASS_THRU     0x04
837*4882a593Smuzhiyun #define ATTO_VER_SCSI_PASS_THRU0     0
838*4882a593Smuzhiyun #define ATTO_VER_SCSI_PASS_THRU      ATTO_VER_SCSI_PASS_THRU0
839*4882a593Smuzhiyun 
840*4882a593Smuzhiyun struct __packed atto_hba_scsi_pass_thru {
841*4882a593Smuzhiyun 	u8 cdb[32];
842*4882a593Smuzhiyun 	u8 cdb_length;
843*4882a593Smuzhiyun 	u8 req_status;
844*4882a593Smuzhiyun 	#define ATTO_SPT_RS_SUCCESS      0x00
845*4882a593Smuzhiyun 	#define ATTO_SPT_RS_FAILED       0x01
846*4882a593Smuzhiyun 	#define ATTO_SPT_RS_OVERRUN      0x02
847*4882a593Smuzhiyun 	#define ATTO_SPT_RS_UNDERRUN     0x03
848*4882a593Smuzhiyun 	#define ATTO_SPT_RS_NO_DEVICE    0x04
849*4882a593Smuzhiyun 	#define ATTO_SPT_RS_NO_LUN       0x05
850*4882a593Smuzhiyun 	#define ATTO_SPT_RS_TIMEOUT      0x06
851*4882a593Smuzhiyun 	#define ATTO_SPT_RS_BUS_RESET    0x07
852*4882a593Smuzhiyun 	#define ATTO_SPT_RS_ABORTED      0x08
853*4882a593Smuzhiyun 	#define ATTO_SPT_RS_BUSY         0x09
854*4882a593Smuzhiyun 	#define ATTO_SPT_RS_DEGRADED     0x0A
855*4882a593Smuzhiyun 
856*4882a593Smuzhiyun 	u8 scsi_status;
857*4882a593Smuzhiyun 	u8 sense_length;
858*4882a593Smuzhiyun 	u32 flags;
859*4882a593Smuzhiyun 	#define ATTO_SPTF_DATA_IN    0x00000001
860*4882a593Smuzhiyun 	#define ATTO_SPTF_DATA_OUT   0x00000002
861*4882a593Smuzhiyun 	#define ATTO_SPTF_SIMPLE_Q   0x00000004
862*4882a593Smuzhiyun 	#define ATTO_SPTF_HEAD_OF_Q  0x00000008
863*4882a593Smuzhiyun 	#define ATTO_SPTF_ORDERED_Q  0x00000010
864*4882a593Smuzhiyun 
865*4882a593Smuzhiyun 	u32 timeout;
866*4882a593Smuzhiyun 	u32 target_id;
867*4882a593Smuzhiyun 	u8 lun[8];
868*4882a593Smuzhiyun 	u32 residual_length;
869*4882a593Smuzhiyun 	u8 sense_data[0xFC];
870*4882a593Smuzhiyun 	u8 reserved[0x28];
871*4882a593Smuzhiyun };
872*4882a593Smuzhiyun 
873*4882a593Smuzhiyun #define ATTO_FUNC_GET_DEV_ADDR       0x05
874*4882a593Smuzhiyun #define ATTO_VER_GET_DEV_ADDR0       0
875*4882a593Smuzhiyun #define ATTO_VER_GET_DEV_ADDR        ATTO_VER_GET_DEV_ADDR0
876*4882a593Smuzhiyun 
877*4882a593Smuzhiyun struct __packed atto_hba_get_device_address {
878*4882a593Smuzhiyun 	u8 addr_type;
879*4882a593Smuzhiyun 	#define ATTO_GDA_AT_PORT         0x00
880*4882a593Smuzhiyun 	#define ATTO_GDA_AT_NODE         0x01
881*4882a593Smuzhiyun 	#define ATTO_GDA_AT_MAC          0x02
882*4882a593Smuzhiyun 	#define ATTO_GDA_AT_PORTID       0x03
883*4882a593Smuzhiyun 	#define ATTO_GDA_AT_UNIQUE       0x04
884*4882a593Smuzhiyun 
885*4882a593Smuzhiyun 	u8 reserved;
886*4882a593Smuzhiyun 	u16 addr_len;
887*4882a593Smuzhiyun 	u32 target_id;
888*4882a593Smuzhiyun 	u8 address[256];
889*4882a593Smuzhiyun };
890*4882a593Smuzhiyun 
891*4882a593Smuzhiyun /* The following functions are supported by firmware but do not have any
892*4882a593Smuzhiyun  * associated driver structures
893*4882a593Smuzhiyun  */
894*4882a593Smuzhiyun #define ATTO_FUNC_PHY_CTRL           0x06
895*4882a593Smuzhiyun #define ATTO_FUNC_CONN_CTRL          0x0C
896*4882a593Smuzhiyun #define ATTO_FUNC_ADAP_CTRL          0x0E
897*4882a593Smuzhiyun #define ATTO_VER_ADAP_CTRL0          0
898*4882a593Smuzhiyun #define ATTO_VER_ADAP_CTRL           ATTO_VER_ADAP_CTRL0
899*4882a593Smuzhiyun 
900*4882a593Smuzhiyun struct __packed atto_hba_adap_ctrl {
901*4882a593Smuzhiyun 	u8 adap_func;
902*4882a593Smuzhiyun 	#define ATTO_AC_AF_HARD_RST      0x00
903*4882a593Smuzhiyun 	#define ATTO_AC_AF_GET_STATE     0x01
904*4882a593Smuzhiyun 	#define ATTO_AC_AF_GET_TEMP      0x02
905*4882a593Smuzhiyun 
906*4882a593Smuzhiyun 	u8 adap_state;
907*4882a593Smuzhiyun 	#define ATTO_AC_AS_UNKNOWN       0x00
908*4882a593Smuzhiyun 	#define ATTO_AC_AS_OK            0x01
909*4882a593Smuzhiyun 	#define ATTO_AC_AS_RST_SCHED     0x02
910*4882a593Smuzhiyun 	#define ATTO_AC_AS_RST_IN_PROG   0x03
911*4882a593Smuzhiyun 	#define ATTO_AC_AS_RST_DISC      0x04
912*4882a593Smuzhiyun 	#define ATTO_AC_AS_DEGRADED      0x05
913*4882a593Smuzhiyun 	#define ATTO_AC_AS_DISABLED      0x06
914*4882a593Smuzhiyun 	#define ATTO_AC_AS_TEMP          0x07
915*4882a593Smuzhiyun 
916*4882a593Smuzhiyun 	u8 reserved[2];
917*4882a593Smuzhiyun 
918*4882a593Smuzhiyun 	union {
919*4882a593Smuzhiyun 		struct {
920*4882a593Smuzhiyun 			u8 temp_sensor;
921*4882a593Smuzhiyun 			u8 temp_state;
922*4882a593Smuzhiyun 
923*4882a593Smuzhiyun 	#define ATTO_AC_TS_UNSUPP        0x00
924*4882a593Smuzhiyun 	#define ATTO_AC_TS_UNKNOWN       0x01
925*4882a593Smuzhiyun 	#define ATTO_AC_TS_INIT_FAILED   0x02
926*4882a593Smuzhiyun 	#define ATTO_AC_TS_NORMAL        0x03
927*4882a593Smuzhiyun 	#define ATTO_AC_TS_OUT_OF_RANGE  0x04
928*4882a593Smuzhiyun 	#define ATTO_AC_TS_FAULT         0x05
929*4882a593Smuzhiyun 
930*4882a593Smuzhiyun 			signed short temp_value;
931*4882a593Smuzhiyun 			signed short temp_lower_lim;
932*4882a593Smuzhiyun 			signed short temp_upper_lim;
933*4882a593Smuzhiyun 			char temp_desc[32];
934*4882a593Smuzhiyun 			u8 reserved2[20];
935*4882a593Smuzhiyun 		};
936*4882a593Smuzhiyun 	};
937*4882a593Smuzhiyun };
938*4882a593Smuzhiyun 
939*4882a593Smuzhiyun #define ATTO_FUNC_GET_DEV_INFO       0x0F
940*4882a593Smuzhiyun #define ATTO_VER_GET_DEV_INFO0       0
941*4882a593Smuzhiyun #define ATTO_VER_GET_DEV_INFO        ATTO_VER_GET_DEV_INFO0
942*4882a593Smuzhiyun 
943*4882a593Smuzhiyun struct __packed atto_hba_sas_device_info {
944*4882a593Smuzhiyun 
945*4882a593Smuzhiyun     #define ATTO_SDI_MAX_PHYS_WIDE_PORT  16
946*4882a593Smuzhiyun 
947*4882a593Smuzhiyun 	u8 phy_id[ATTO_SDI_MAX_PHYS_WIDE_PORT]; /* IDs of parent exp/adapt */
948*4882a593Smuzhiyun 	#define ATTO_SDI_PHY_ID_INV      ATTO_SAS_PHY_ID_INV
949*4882a593Smuzhiyun 	u32 exp_target_id;
950*4882a593Smuzhiyun 	u32 sas_port_mask;
951*4882a593Smuzhiyun 	u8 sas_level;
952*4882a593Smuzhiyun 	#define ATTO_SDI_SAS_LVL_INV     0xFF
953*4882a593Smuzhiyun 
954*4882a593Smuzhiyun 	u8 slot_num;
955*4882a593Smuzhiyun 	#define ATTO_SDI_SLOT_NUM_INV    ATTO_SLOT_NUM_INV
956*4882a593Smuzhiyun 
957*4882a593Smuzhiyun 	u8 dev_type;
958*4882a593Smuzhiyun 	#define ATTO_SDI_DT_END_DEVICE   0
959*4882a593Smuzhiyun 	#define ATTO_SDI_DT_EXPANDER     1
960*4882a593Smuzhiyun 	#define ATTO_SDI_DT_PORT_MULT    2
961*4882a593Smuzhiyun 
962*4882a593Smuzhiyun 	u8 ini_flags;
963*4882a593Smuzhiyun 	u8 tgt_flags;
964*4882a593Smuzhiyun 	u8 link_rate; /* SMP_RATE_XXX */
965*4882a593Smuzhiyun 	u8 loc_flags;
966*4882a593Smuzhiyun 	#define ATTO_SDI_LF_DIRECT       0x01
967*4882a593Smuzhiyun 	#define ATTO_SDI_LF_EXPANDER     0x02
968*4882a593Smuzhiyun 	#define ATTO_SDI_LF_PORT_MULT    0x04
969*4882a593Smuzhiyun 	u8 pm_port;
970*4882a593Smuzhiyun 	u8 reserved[0x60];
971*4882a593Smuzhiyun };
972*4882a593Smuzhiyun 
973*4882a593Smuzhiyun union atto_hba_device_info {
974*4882a593Smuzhiyun 	struct atto_hba_sas_device_info sas_dev_info;
975*4882a593Smuzhiyun };
976*4882a593Smuzhiyun 
977*4882a593Smuzhiyun struct __packed atto_hba_get_device_info {
978*4882a593Smuzhiyun 	u32 target_id;
979*4882a593Smuzhiyun 	u8 info_type;
980*4882a593Smuzhiyun 	#define ATTO_GDI_IT_UNKNOWN      0x00
981*4882a593Smuzhiyun 	#define ATTO_GDI_IT_SAS          0x01
982*4882a593Smuzhiyun 	#define ATTO_GDI_IT_FC           0x02
983*4882a593Smuzhiyun 	#define ATTO_GDI_IT_FCOE         0x03
984*4882a593Smuzhiyun 
985*4882a593Smuzhiyun 	u8 reserved[11];
986*4882a593Smuzhiyun 	union atto_hba_device_info dev_info;
987*4882a593Smuzhiyun };
988*4882a593Smuzhiyun 
989*4882a593Smuzhiyun struct atto_ioctl {
990*4882a593Smuzhiyun 	u8 version;
991*4882a593Smuzhiyun 	u8 function; /* ATTO_FUNC_XXX */
992*4882a593Smuzhiyun 	u8 status;
993*4882a593Smuzhiyun #define ATTO_STS_SUCCESS         0x00
994*4882a593Smuzhiyun #define ATTO_STS_FAILED          0x01
995*4882a593Smuzhiyun #define ATTO_STS_INV_VERSION     0x02
996*4882a593Smuzhiyun #define ATTO_STS_OUT_OF_RSRC     0x03
997*4882a593Smuzhiyun #define ATTO_STS_INV_FUNC        0x04
998*4882a593Smuzhiyun #define ATTO_STS_UNSUPPORTED     0x05
999*4882a593Smuzhiyun #define ATTO_STS_INV_ADAPTER     0x06
1000*4882a593Smuzhiyun #define ATTO_STS_INV_DRVR_VER    0x07
1001*4882a593Smuzhiyun #define ATTO_STS_INV_PARAM       0x08
1002*4882a593Smuzhiyun #define ATTO_STS_TIMEOUT         0x09
1003*4882a593Smuzhiyun #define ATTO_STS_NOT_APPL        0x0A
1004*4882a593Smuzhiyun #define ATTO_STS_DEGRADED        0x0B
1005*4882a593Smuzhiyun 
1006*4882a593Smuzhiyun 	u8 flags;
1007*4882a593Smuzhiyun 	#define HBAF_TUNNEL      0x01
1008*4882a593Smuzhiyun 
1009*4882a593Smuzhiyun 	u32 data_length;
1010*4882a593Smuzhiyun 	u8 reserved2[56];
1011*4882a593Smuzhiyun 
1012*4882a593Smuzhiyun 	union {
1013*4882a593Smuzhiyun 		u8 byte[1];
1014*4882a593Smuzhiyun 		struct atto_hba_get_adapter_info get_adap_info;
1015*4882a593Smuzhiyun 		struct atto_hba_get_adapter_address get_adap_addr;
1016*4882a593Smuzhiyun 		struct atto_hba_scsi_pass_thru scsi_pass_thru;
1017*4882a593Smuzhiyun 		struct atto_hba_get_device_address get_dev_addr;
1018*4882a593Smuzhiyun 		struct atto_hba_adap_ctrl adap_ctrl;
1019*4882a593Smuzhiyun 		struct atto_hba_get_device_info get_dev_info;
1020*4882a593Smuzhiyun 		struct atto_hba_trace trace;
1021*4882a593Smuzhiyun 	} data;
1022*4882a593Smuzhiyun 
1023*4882a593Smuzhiyun };
1024*4882a593Smuzhiyun 
1025*4882a593Smuzhiyun struct __packed atto_ioctl_vda_scsi_cmd {
1026*4882a593Smuzhiyun 
1027*4882a593Smuzhiyun     #define ATTO_VDA_SCSI_VER0   0
1028*4882a593Smuzhiyun     #define ATTO_VDA_SCSI_VER    ATTO_VDA_SCSI_VER0
1029*4882a593Smuzhiyun 
1030*4882a593Smuzhiyun 	u8 cdb[16];
1031*4882a593Smuzhiyun 	u32 flags;
1032*4882a593Smuzhiyun 	u32 data_length;
1033*4882a593Smuzhiyun 	u32 residual_length;
1034*4882a593Smuzhiyun 	u16 target_id;
1035*4882a593Smuzhiyun 	u8 sense_len;
1036*4882a593Smuzhiyun 	u8 scsi_stat;
1037*4882a593Smuzhiyun 	u8 reserved[8];
1038*4882a593Smuzhiyun 	u8 sense_data[80];
1039*4882a593Smuzhiyun };
1040*4882a593Smuzhiyun 
1041*4882a593Smuzhiyun struct __packed atto_ioctl_vda_flash_cmd {
1042*4882a593Smuzhiyun 
1043*4882a593Smuzhiyun     #define ATTO_VDA_FLASH_VER0  0
1044*4882a593Smuzhiyun     #define ATTO_VDA_FLASH_VER   ATTO_VDA_FLASH_VER0
1045*4882a593Smuzhiyun 
1046*4882a593Smuzhiyun 	u32 flash_addr;
1047*4882a593Smuzhiyun 	u32 data_length;
1048*4882a593Smuzhiyun 	u8 sub_func;
1049*4882a593Smuzhiyun 	u8 reserved[15];
1050*4882a593Smuzhiyun 
1051*4882a593Smuzhiyun 	union {
1052*4882a593Smuzhiyun 		struct {
1053*4882a593Smuzhiyun 			u32 flash_size;
1054*4882a593Smuzhiyun 			u32 page_size;
1055*4882a593Smuzhiyun 			u8 prod_info[32];
1056*4882a593Smuzhiyun 		} info;
1057*4882a593Smuzhiyun 
1058*4882a593Smuzhiyun 		struct {
1059*4882a593Smuzhiyun 			char file_name[16]; /* 8.3 fname, NULL term, wc=* */
1060*4882a593Smuzhiyun 			u32 file_size;
1061*4882a593Smuzhiyun 		} file;
1062*4882a593Smuzhiyun 	} data;
1063*4882a593Smuzhiyun 
1064*4882a593Smuzhiyun };
1065*4882a593Smuzhiyun 
1066*4882a593Smuzhiyun struct __packed atto_ioctl_vda_diag_cmd {
1067*4882a593Smuzhiyun 
1068*4882a593Smuzhiyun     #define ATTO_VDA_DIAG_VER0   0
1069*4882a593Smuzhiyun     #define ATTO_VDA_DIAG_VER    ATTO_VDA_DIAG_VER0
1070*4882a593Smuzhiyun 
1071*4882a593Smuzhiyun 	u64 local_addr;
1072*4882a593Smuzhiyun 	u32 data_length;
1073*4882a593Smuzhiyun 	u8 sub_func;
1074*4882a593Smuzhiyun 	u8 flags;
1075*4882a593Smuzhiyun 	u8 reserved[3];
1076*4882a593Smuzhiyun };
1077*4882a593Smuzhiyun 
1078*4882a593Smuzhiyun struct __packed atto_ioctl_vda_cli_cmd {
1079*4882a593Smuzhiyun 
1080*4882a593Smuzhiyun     #define ATTO_VDA_CLI_VER0    0
1081*4882a593Smuzhiyun     #define ATTO_VDA_CLI_VER     ATTO_VDA_CLI_VER0
1082*4882a593Smuzhiyun 
1083*4882a593Smuzhiyun 	u32 cmd_rsp_len;
1084*4882a593Smuzhiyun };
1085*4882a593Smuzhiyun 
1086*4882a593Smuzhiyun struct __packed atto_ioctl_vda_smp_cmd {
1087*4882a593Smuzhiyun 
1088*4882a593Smuzhiyun     #define ATTO_VDA_SMP_VER0    0
1089*4882a593Smuzhiyun     #define ATTO_VDA_SMP_VER     ATTO_VDA_SMP_VER0
1090*4882a593Smuzhiyun 
1091*4882a593Smuzhiyun 	u64 dest;
1092*4882a593Smuzhiyun 	u32 cmd_rsp_len;
1093*4882a593Smuzhiyun };
1094*4882a593Smuzhiyun 
1095*4882a593Smuzhiyun struct __packed atto_ioctl_vda_cfg_cmd {
1096*4882a593Smuzhiyun 
1097*4882a593Smuzhiyun     #define ATTO_VDA_CFG_VER0    0
1098*4882a593Smuzhiyun     #define ATTO_VDA_CFG_VER     ATTO_VDA_CFG_VER0
1099*4882a593Smuzhiyun 
1100*4882a593Smuzhiyun 	u32 data_length;
1101*4882a593Smuzhiyun 	u8 cfg_func;
1102*4882a593Smuzhiyun 	u8 reserved[11];
1103*4882a593Smuzhiyun 
1104*4882a593Smuzhiyun 	union {
1105*4882a593Smuzhiyun 		u8 bytes[112];
1106*4882a593Smuzhiyun 		struct atto_vda_cfg_init init;
1107*4882a593Smuzhiyun 	} data;
1108*4882a593Smuzhiyun 
1109*4882a593Smuzhiyun };
1110*4882a593Smuzhiyun 
1111*4882a593Smuzhiyun struct __packed atto_ioctl_vda_mgt_cmd {
1112*4882a593Smuzhiyun 
1113*4882a593Smuzhiyun     #define ATTO_VDA_MGT_VER0    0
1114*4882a593Smuzhiyun     #define ATTO_VDA_MGT_VER     ATTO_VDA_MGT_VER0
1115*4882a593Smuzhiyun 
1116*4882a593Smuzhiyun 	u8 mgt_func;
1117*4882a593Smuzhiyun 	u8 scan_generation;
1118*4882a593Smuzhiyun 	u16 dev_index;
1119*4882a593Smuzhiyun 	u32 data_length;
1120*4882a593Smuzhiyun 	u8 reserved[8];
1121*4882a593Smuzhiyun 	union {
1122*4882a593Smuzhiyun 		u8 bytes[112];
1123*4882a593Smuzhiyun 		struct atto_vda_devinfo dev_info;
1124*4882a593Smuzhiyun 		struct atto_vda_grp_info grp_info;
1125*4882a593Smuzhiyun 		struct atto_vdapart_info part_info;
1126*4882a593Smuzhiyun 		struct atto_vda_dh_info dh_info;
1127*4882a593Smuzhiyun 		struct atto_vda_metrics_info metrics_info;
1128*4882a593Smuzhiyun 		struct atto_vda_schedule_info sched_info;
1129*4882a593Smuzhiyun 		struct atto_vda_n_vcache_info nvcache_info;
1130*4882a593Smuzhiyun 		struct atto_vda_buzzer_info buzzer_info;
1131*4882a593Smuzhiyun 		struct atto_vda_adapter_info adapter_info;
1132*4882a593Smuzhiyun 		struct atto_vda_temp_info temp_info;
1133*4882a593Smuzhiyun 		struct atto_vda_fan_info fan_info;
1134*4882a593Smuzhiyun 	} data;
1135*4882a593Smuzhiyun };
1136*4882a593Smuzhiyun 
1137*4882a593Smuzhiyun struct __packed atto_ioctl_vda_gsv_cmd {
1138*4882a593Smuzhiyun 
1139*4882a593Smuzhiyun     #define ATTO_VDA_GSV_VER0    0
1140*4882a593Smuzhiyun     #define ATTO_VDA_GSV_VER     ATTO_VDA_GSV_VER0
1141*4882a593Smuzhiyun 
1142*4882a593Smuzhiyun 	u8 rsp_len;
1143*4882a593Smuzhiyun 	u8 reserved[7];
1144*4882a593Smuzhiyun 	u8 version_info[1];
1145*4882a593Smuzhiyun 	#define ATTO_VDA_VER_UNSUPPORTED 0xFF
1146*4882a593Smuzhiyun 
1147*4882a593Smuzhiyun };
1148*4882a593Smuzhiyun 
1149*4882a593Smuzhiyun struct __packed atto_ioctl_vda {
1150*4882a593Smuzhiyun 	u8 version;
1151*4882a593Smuzhiyun 	u8 function;    /* VDA_FUNC_XXXX */
1152*4882a593Smuzhiyun 	u8 status;      /* ATTO_STS_XXX */
1153*4882a593Smuzhiyun 	u8 vda_status;  /* RS_XXX (if status == ATTO_STS_SUCCESS) */
1154*4882a593Smuzhiyun 	u32 data_length;
1155*4882a593Smuzhiyun 	u8 reserved[8];
1156*4882a593Smuzhiyun 
1157*4882a593Smuzhiyun 	union {
1158*4882a593Smuzhiyun 		struct atto_ioctl_vda_scsi_cmd scsi;
1159*4882a593Smuzhiyun 		struct atto_ioctl_vda_flash_cmd flash;
1160*4882a593Smuzhiyun 		struct atto_ioctl_vda_diag_cmd diag;
1161*4882a593Smuzhiyun 		struct atto_ioctl_vda_cli_cmd cli;
1162*4882a593Smuzhiyun 		struct atto_ioctl_vda_smp_cmd smp;
1163*4882a593Smuzhiyun 		struct atto_ioctl_vda_cfg_cmd cfg;
1164*4882a593Smuzhiyun 		struct atto_ioctl_vda_mgt_cmd mgt;
1165*4882a593Smuzhiyun 		struct atto_ioctl_vda_gsv_cmd gsv;
1166*4882a593Smuzhiyun 		u8 cmd_info[256];
1167*4882a593Smuzhiyun 	} cmd;
1168*4882a593Smuzhiyun 
1169*4882a593Smuzhiyun 	union {
1170*4882a593Smuzhiyun 		u8 data[1];
1171*4882a593Smuzhiyun 		struct atto_vda_devinfo2 dev_info2;
1172*4882a593Smuzhiyun 	} data;
1173*4882a593Smuzhiyun 
1174*4882a593Smuzhiyun };
1175*4882a593Smuzhiyun 
1176*4882a593Smuzhiyun struct __packed atto_ioctl_smp {
1177*4882a593Smuzhiyun 	u8 version;
1178*4882a593Smuzhiyun 	#define ATTO_SMP_VERSION0        0
1179*4882a593Smuzhiyun 	#define ATTO_SMP_VERSION1        1
1180*4882a593Smuzhiyun 	#define ATTO_SMP_VERSION2        2
1181*4882a593Smuzhiyun 	#define ATTO_SMP_VERSION         ATTO_SMP_VERSION2
1182*4882a593Smuzhiyun 
1183*4882a593Smuzhiyun 	u8 function;
1184*4882a593Smuzhiyun #define ATTO_SMP_FUNC_DISC_SMP           0x00
1185*4882a593Smuzhiyun #define ATTO_SMP_FUNC_DISC_TARG          0x01
1186*4882a593Smuzhiyun #define ATTO_SMP_FUNC_SEND_CMD           0x02
1187*4882a593Smuzhiyun #define ATTO_SMP_FUNC_DISC_TARG_DIRECT   0x03
1188*4882a593Smuzhiyun #define ATTO_SMP_FUNC_SEND_CMD_DIRECT    0x04
1189*4882a593Smuzhiyun #define ATTO_SMP_FUNC_DISC_SMP_DIRECT    0x05
1190*4882a593Smuzhiyun 
1191*4882a593Smuzhiyun 	u8 status;      /* ATTO_STS_XXX */
1192*4882a593Smuzhiyun 	u8 smp_status;  /* if status == ATTO_STS_SUCCESS */
1193*4882a593Smuzhiyun 	#define ATTO_SMP_STS_SUCCESS     0x00
1194*4882a593Smuzhiyun 	#define ATTO_SMP_STS_FAILURE     0x01
1195*4882a593Smuzhiyun 	#define ATTO_SMP_STS_RESCAN      0x02
1196*4882a593Smuzhiyun 	#define ATTO_SMP_STS_NOT_FOUND   0x03
1197*4882a593Smuzhiyun 
1198*4882a593Smuzhiyun 	u16 target_id;
1199*4882a593Smuzhiyun 	u8 phy_id;
1200*4882a593Smuzhiyun 	u8 dev_index;
1201*4882a593Smuzhiyun 	u64 smp_sas_addr;
1202*4882a593Smuzhiyun 	u64 targ_sas_addr;
1203*4882a593Smuzhiyun 	u32 req_length;
1204*4882a593Smuzhiyun 	u32 rsp_length;
1205*4882a593Smuzhiyun 	u8 flags;
1206*4882a593Smuzhiyun 	#define ATTO_SMPF_ROOT_EXP       0x01 /* expander direct attached */
1207*4882a593Smuzhiyun 
1208*4882a593Smuzhiyun 	u8 reserved[31];
1209*4882a593Smuzhiyun 
1210*4882a593Smuzhiyun 	union {
1211*4882a593Smuzhiyun 		u8 byte[1];
1212*4882a593Smuzhiyun 		u32 dword[1];
1213*4882a593Smuzhiyun 	} data;
1214*4882a593Smuzhiyun 
1215*4882a593Smuzhiyun };
1216*4882a593Smuzhiyun 
1217*4882a593Smuzhiyun struct __packed atto_express_ioctl {
1218*4882a593Smuzhiyun 	struct atto_express_ioctl_header header;
1219*4882a593Smuzhiyun 
1220*4882a593Smuzhiyun 	union {
1221*4882a593Smuzhiyun 		struct atto_firmware_rw_request fwrw;
1222*4882a593Smuzhiyun 		struct atto_param_rw_request prw;
1223*4882a593Smuzhiyun 		struct atto_channel_list chanlist;
1224*4882a593Smuzhiyun 		struct atto_channel_info chaninfo;
1225*4882a593Smuzhiyun 		struct atto_ioctl ioctl_hba;
1226*4882a593Smuzhiyun 		struct atto_module_info modinfo;
1227*4882a593Smuzhiyun 		struct atto_ioctl_vda ioctl_vda;
1228*4882a593Smuzhiyun 		struct atto_ioctl_smp ioctl_smp;
1229*4882a593Smuzhiyun 		struct atto_csmi csmi;
1230*4882a593Smuzhiyun 
1231*4882a593Smuzhiyun 	} data;
1232*4882a593Smuzhiyun };
1233*4882a593Smuzhiyun 
1234*4882a593Smuzhiyun /* The struct associated with the code is listed after the definition */
1235*4882a593Smuzhiyun #define EXPRESS_IOCTL_MIN             0x4500
1236*4882a593Smuzhiyun #define EXPRESS_IOCTL_RW_FIRMWARE     0x4500            /* FIRMWARERW    */
1237*4882a593Smuzhiyun #define EXPRESS_IOCTL_READ_PARAMS     0x4501            /* PARAMRW       */
1238*4882a593Smuzhiyun #define EXPRESS_IOCTL_WRITE_PARAMS    0x4502            /* PARAMRW       */
1239*4882a593Smuzhiyun #define EXPRESS_IOCTL_FC_API          0x4503            /* internal      */
1240*4882a593Smuzhiyun #define EXPRESS_IOCTL_GET_CHANNELS    0x4504            /* CHANNELLIST   */
1241*4882a593Smuzhiyun #define EXPRESS_IOCTL_CHAN_INFO       0x4505            /* CHANNELINFO   */
1242*4882a593Smuzhiyun #define EXPRESS_IOCTL_DEFAULT_PARAMS  0x4506            /* PARAMRW       */
1243*4882a593Smuzhiyun #define EXPRESS_ADDR_MEMORY           0x4507            /* MEMADDR       */
1244*4882a593Smuzhiyun #define EXPRESS_RW_MEMORY             0x4508            /* MEMRW         */
1245*4882a593Smuzhiyun #define EXPRESS_TSDK_DUMP             0x4509            /* TSDKDUMP      */
1246*4882a593Smuzhiyun #define EXPRESS_IOCTL_SMP             0x450A            /* IOCTL_SMP     */
1247*4882a593Smuzhiyun #define EXPRESS_CSMI                  0x450B            /* CSMI          */
1248*4882a593Smuzhiyun #define EXPRESS_IOCTL_HBA             0x450C            /* IOCTL_HBA     */
1249*4882a593Smuzhiyun #define EXPRESS_IOCTL_VDA             0x450D            /* IOCTL_VDA     */
1250*4882a593Smuzhiyun #define EXPRESS_IOCTL_GET_ID          0x450E            /* GET_ID        */
1251*4882a593Smuzhiyun #define EXPRESS_IOCTL_GET_MOD_INFO    0x450F            /* MODULE_INFO   */
1252*4882a593Smuzhiyun #define EXPRESS_IOCTL_MAX             0x450F
1253*4882a593Smuzhiyun 
1254*4882a593Smuzhiyun #endif
1255