xref: /freebsd/sys/dev/ocs_fc/ocs_ioctl.h (revision ef270ab1b656486947b3b4aaec9bc0a6b5d6af21)
1*ef270ab1SKenneth D. Merry /*-
2*ef270ab1SKenneth D. Merry  * Copyright (c) 2017 Broadcom. All rights reserved.
3*ef270ab1SKenneth D. Merry  * The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries.
4*ef270ab1SKenneth D. Merry  *
5*ef270ab1SKenneth D. Merry  * Redistribution and use in source and binary forms, with or without
6*ef270ab1SKenneth D. Merry  * modification, are permitted provided that the following conditions are met:
7*ef270ab1SKenneth D. Merry  *
8*ef270ab1SKenneth D. Merry  * 1. Redistributions of source code must retain the above copyright notice,
9*ef270ab1SKenneth D. Merry  *    this list of conditions and the following disclaimer.
10*ef270ab1SKenneth D. Merry  *
11*ef270ab1SKenneth D. Merry  * 2. Redistributions in binary form must reproduce the above copyright notice,
12*ef270ab1SKenneth D. Merry  *    this list of conditions and the following disclaimer in the documentation
13*ef270ab1SKenneth D. Merry  *    and/or other materials provided with the distribution.
14*ef270ab1SKenneth D. Merry  *
15*ef270ab1SKenneth D. Merry  * 3. Neither the name of the copyright holder nor the names of its contributors
16*ef270ab1SKenneth D. Merry  *    may be used to endorse or promote products derived from this software
17*ef270ab1SKenneth D. Merry  *    without specific prior written permission.
18*ef270ab1SKenneth D. Merry  *
19*ef270ab1SKenneth D. Merry  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20*ef270ab1SKenneth D. Merry  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*ef270ab1SKenneth D. Merry  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*ef270ab1SKenneth D. Merry  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23*ef270ab1SKenneth D. Merry  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*ef270ab1SKenneth D. Merry  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*ef270ab1SKenneth D. Merry  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*ef270ab1SKenneth D. Merry  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*ef270ab1SKenneth D. Merry  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*ef270ab1SKenneth D. Merry  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*ef270ab1SKenneth D. Merry  * POSSIBILITY OF SUCH DAMAGE.
30*ef270ab1SKenneth D. Merry  *
31*ef270ab1SKenneth D. Merry  * $FreeBSD$
32*ef270ab1SKenneth D. Merry  */
33*ef270ab1SKenneth D. Merry 
34*ef270ab1SKenneth D. Merry /**
35*ef270ab1SKenneth D. Merry  * @file
36*ef270ab1SKenneth D. Merry  * Common declartaions for the driver's IOCTL interface
37*ef270ab1SKenneth D. Merry  */
38*ef270ab1SKenneth D. Merry 
39*ef270ab1SKenneth D. Merry #if !defined(__OCS_IOCTL_H__)
40*ef270ab1SKenneth D. Merry #define __OCS_IOCTL_H__
41*ef270ab1SKenneth D. Merry 
42*ef270ab1SKenneth D. Merry /**
43*ef270ab1SKenneth D. Merry  * @brief OCS test ioctl
44*ef270ab1SKenneth D. Merry  *
45*ef270ab1SKenneth D. Merry  * Simple structure for testing the IOCTL interface
46*ef270ab1SKenneth D. Merry  */
47*ef270ab1SKenneth D. Merry 
48*ef270ab1SKenneth D. Merry typedef struct {
49*ef270ab1SKenneth D. Merry 	char string[32];		/**< fixed string buffer */
50*ef270ab1SKenneth D. Merry } ocs_ioctl_test_t;
51*ef270ab1SKenneth D. Merry 
52*ef270ab1SKenneth D. Merry /**
53*ef270ab1SKenneth D. Merry  * @brief DRIVER_INFO ioctl structure
54*ef270ab1SKenneth D. Merry  *
55*ef270ab1SKenneth D. Merry  * Structure is returned whtn the OCS_IOCTL_CMD_DRIVER_INFO is issued by a user space program.
56*ef270ab1SKenneth D. Merry  */
57*ef270ab1SKenneth D. Merry 
58*ef270ab1SKenneth D. Merry typedef struct {
59*ef270ab1SKenneth D. Merry 	uint16_t pci_vendor;		/**< PCI vender ID value (binary) */
60*ef270ab1SKenneth D. Merry 	uint16_t pci_device;		/**< PCI device ID value (binary) */
61*ef270ab1SKenneth D. Merry 	char businfo[16];		/**< Bus information (text) */
62*ef270ab1SKenneth D. Merry 	uint32_t sli_intf;		/**< SLI_INTF register value (binary) */
63*ef270ab1SKenneth D. Merry 	char desc[64];			/**< description (text) */
64*ef270ab1SKenneth D. Merry 	char fw_rev[32];		/**< firmware revision (text) */
65*ef270ab1SKenneth D. Merry         union {
66*ef270ab1SKenneth D. Merry             struct {
67*ef270ab1SKenneth D. Merry 	        uint8_t	wwnn[8];		/**< WWNN (binary) */
68*ef270ab1SKenneth D. Merry 	        uint8_t	wwpn[8];		/**< WWPN (binary) */
69*ef270ab1SKenneth D. Merry             } fc;
70*ef270ab1SKenneth D. Merry             struct {
71*ef270ab1SKenneth D. Merry 	        uint8_t	mac_addr[6];		/**< MAC address (binary) */
72*ef270ab1SKenneth D. Merry 	        uint8_t	reserved[10];
73*ef270ab1SKenneth D. Merry             } iscsi;
74*ef270ab1SKenneth D. Merry         } hw_addr;
75*ef270ab1SKenneth D. Merry 	char serialnum[32];		/**< board serial number (text) */
76*ef270ab1SKenneth D. Merry } ocs_ioctl_driver_info_t;
77*ef270ab1SKenneth D. Merry 
78*ef270ab1SKenneth D. Merry #define ELXU_BSD_MAGIC  0x30584c45
79*ef270ab1SKenneth D. Merry 
80*ef270ab1SKenneth D. Merry /**
81*ef270ab1SKenneth D. Merry  * @brief IOCTL_CMD_IOCTL_ELXU_MBOX ioctl structure
82*ef270ab1SKenneth D. Merry  *
83*ef270ab1SKenneth D. Merry  * Structure used to submit elxsdkutil mailbox requests for firmware download and
84*ef270ab1SKenneth D. Merry  * dump file retrieveal.
85*ef270ab1SKenneth D. Merry  */
86*ef270ab1SKenneth D. Merry 
87*ef270ab1SKenneth D. Merry typedef struct {
88*ef270ab1SKenneth D. Merry     uint32_t    magic;			/**< magic number */
89*ef270ab1SKenneth D. Merry     uint32_t    size;			/**< size of MBX command */
90*ef270ab1SKenneth D. Merry     uint8_t	payload[256];		/**< MBX command in/out payload buffer */
91*ef270ab1SKenneth D. Merry     uint64_t    in_addr;		/**< user space address of input buffer */
92*ef270ab1SKenneth D. Merry     uint64_t    in_bytes;		/**< length of user space input buffer in bytes */
93*ef270ab1SKenneth D. Merry     uint64_t    out_addr;		/**< user space address of output buffer */
94*ef270ab1SKenneth D. Merry     uint64_t    out_bytes;		/**< length of user space output buffer in bytes */
95*ef270ab1SKenneth D. Merry } ocs_ioctl_elxu_mbox_t;
96*ef270ab1SKenneth D. Merry 
97*ef270ab1SKenneth D. Merry enum {
98*ef270ab1SKenneth D. Merry 	ocs_ioctl_scsi_cmd_loop,	/**< Start command loop */
99*ef270ab1SKenneth D. Merry 	ocs_ioctl_scsi_cmd_loop_wait,	/**< Start command loop and wait for completion */
100*ef270ab1SKenneth D. Merry 	ocs_ioctl_scsi_cmd_stop,	/**< Stop command loop */
101*ef270ab1SKenneth D. Merry 	ocs_ioctl_scsi_cmd,		/**< Start one command */
102*ef270ab1SKenneth D. Merry 	ocs_ioctl_scsi_cmd_wait,	/**< Wait for a command to complete */
103*ef270ab1SKenneth D. Merry 	ocs_ioctl_scsi_cmd_abort,	/**< Start an abort */
104*ef270ab1SKenneth D. Merry 	ocs_ioctl_scsi_cmd_tmf,		/**< Start a tmf */
105*ef270ab1SKenneth D. Merry 	ocs_ioctl_els_send,		/**< Start an ELS */
106*ef270ab1SKenneth D. Merry 	ocs_ioctl_tgt_logout,		/**< logout of a target */
107*ef270ab1SKenneth D. Merry 	ocs_ioctl_scsi_cmd_wait_any,	/**< Wait for any command to complete */
108*ef270ab1SKenneth D. Merry };
109*ef270ab1SKenneth D. Merry 
110*ef270ab1SKenneth D. Merry enum {
111*ef270ab1SKenneth D. Merry 	ocs_ioctl_scsi_cmd_rd = (1U << 0),	/**< direction is read */
112*ef270ab1SKenneth D. Merry 	ocs_ioctl_scsi_cmd_wr = (1U << 1),	/**< direction is write */
113*ef270ab1SKenneth D. Merry };
114*ef270ab1SKenneth D. Merry 
115*ef270ab1SKenneth D. Merry /**
116*ef270ab1SKenneth D. Merry  * @brief OCS_IOCTL_CMD_SCSI_CMD ioctl command structure
117*ef270ab1SKenneth D. Merry  */
118*ef270ab1SKenneth D. Merry 
119*ef270ab1SKenneth D. Merry typedef enum {
120*ef270ab1SKenneth D. Merry 	DIF_OP_DISABLE = 0,
121*ef270ab1SKenneth D. Merry 	DIF_OP_IN_NODIF_OUT_CRC,
122*ef270ab1SKenneth D. Merry         DIF_OP_IN_CRC_OUT_NODIF,
123*ef270ab1SKenneth D. Merry         DIF_OP_IN_NODIF_OUT_CHKSUM,
124*ef270ab1SKenneth D. Merry         DIF_OP_IN_CHKSUM_OUT_NODIF,
125*ef270ab1SKenneth D. Merry         DIF_OP_IN_CRC_OUT_CRC,
126*ef270ab1SKenneth D. Merry         DIF_OP_IN_CHKSUM_OUT_CHKSUM,
127*ef270ab1SKenneth D. Merry         DIF_OP_IN_CRC_OUT_CHKSUM,
128*ef270ab1SKenneth D. Merry         DIF_OP_IN_CHKSUM_OUT_CRC,
129*ef270ab1SKenneth D. Merry         DIF_OP_IN_RAW_OUT_RAW,
130*ef270ab1SKenneth D. Merry 	} dif_op_t;
131*ef270ab1SKenneth D. Merry 
132*ef270ab1SKenneth D. Merry #define DIF_OP_PASS_THRU		DIF_OP_IN_CRC_OUT_CRC
133*ef270ab1SKenneth D. Merry #define DIF_OP_STRIP			DIF_OP_IN_CRC_OUT_NODIF
134*ef270ab1SKenneth D. Merry #define DIF_OP_INSERT			DIF_OP_IN_NODIF_OUT_CRC
135*ef270ab1SKenneth D. Merry 
136*ef270ab1SKenneth D. Merry typedef struct {
137*ef270ab1SKenneth D. Merry 	dif_op_t dif_op;
138*ef270ab1SKenneth D. Merry 	uint32_t
139*ef270ab1SKenneth D. Merry 		check_ref_tag:1,	/* check reference tag on initiator writes */
140*ef270ab1SKenneth D. Merry 		check_app_tag:1,	/* check application tag on initiator writes */
141*ef270ab1SKenneth D. Merry 		check_guard:1,		/* check CRC on initiator writes */
142*ef270ab1SKenneth D. Merry 		dif_separate:1;		/* use DIF separate transfers */
143*ef270ab1SKenneth D. Merry 	uint32_t ref_tag;		/* DIF reference tag */
144*ef270ab1SKenneth D. Merry 	uint16_t app_tag;		/* DIF application tag */
145*ef270ab1SKenneth D. Merry 	uint32_t blocksize;		/* DIF blocksize */
146*ef270ab1SKenneth D. Merry } dif_info_t;
147*ef270ab1SKenneth D. Merry 
148*ef270ab1SKenneth D. Merry typedef struct {
149*ef270ab1SKenneth D. Merry 	int command;			/**< SCSI command request command */
150*ef270ab1SKenneth D. Merry 	uint32_t target_idx;		/**< Target device index */
151*ef270ab1SKenneth D. Merry 	uint32_t dir;			/**< rd or wr */
152*ef270ab1SKenneth D. Merry 	uint32_t lun;			/**< lun value */
153*ef270ab1SKenneth D. Merry 	int32_t  tmf;			/**< TMF */
154*ef270ab1SKenneth D. Merry 	uint8_t cdb[32];		/**< SCSI CDB */
155*ef270ab1SKenneth D. Merry 	uint32_t cdb_len;		/**< SCSI CDB length in bytes */
156*ef270ab1SKenneth D. Merry 	uint32_t els_cmd;		/**< ELS command */
157*ef270ab1SKenneth D. Merry 	uint32_t flags;			/**< command flags */
158*ef270ab1SKenneth D. Merry 	uint32_t queue_depth;		/**< queue depth for command looping */
159*ef270ab1SKenneth D. Merry 	uint32_t payload_length;	/**< payload length for command */
160*ef270ab1SKenneth D. Merry 	uint32_t dif_payload_length;	/**< DIF payload length for command if separate */
161*ef270ab1SKenneth D. Merry 	uint32_t io_count;		/**< command count for looping */
162*ef270ab1SKenneth D. Merry 	uint32_t io_timeout;		/**< IO timeout in seconds (0 = no timeout) */
163*ef270ab1SKenneth D. Merry 
164*ef270ab1SKenneth D. Merry 	uint32_t directio;		/**< If set, DMA to and from user buffers */
165*ef270ab1SKenneth D. Merry 
166*ef270ab1SKenneth D. Merry 	uint32_t first_burst:1;		/**< If true send IO writes with first burst */
167*ef270ab1SKenneth D. Merry 	uint32_t first_burst_size;	/**< If first burst is enabled, then this size */
168*ef270ab1SKenneth D. Merry 
169*ef270ab1SKenneth D. Merry 	int32_t wait_timeout_usec;	/**< Wait timeout (usec) for wait, wait_any */
170*ef270ab1SKenneth D. Merry 
171*ef270ab1SKenneth D. Merry 	/* T10-PI */
172*ef270ab1SKenneth D. Merry 	dif_info_t dif;			/* DIF info */
173*ef270ab1SKenneth D. Merry 
174*ef270ab1SKenneth D. Merry 	/* user space buffers */
175*ef270ab1SKenneth D. Merry 	void *payload;			/**< pointer to user space payload buffer */
176*ef270ab1SKenneth D. Merry 	void *dif_payload;		/**< pointer to DIF block data if separate */
177*ef270ab1SKenneth D. Merry 	uint8_t scsi_status;		/**< SCSI status */
178*ef270ab1SKenneth D. Merry 	uint16_t scsi_status_qualifier; /**< SCSI status qualifier */
179*ef270ab1SKenneth D. Merry 	void *sense_data;		/**< pointer to sense data buffer */
180*ef270ab1SKenneth D. Merry 	uint32_t sense_data_length;	/**< length of sense data buffer (call=buffer leng, return=data written) */
181*ef270ab1SKenneth D. Merry 	int32_t residual;		/**< residual */
182*ef270ab1SKenneth D. Merry 	uint32_t tag_to_abort;		/**< tag to abort for an abort task request */
183*ef270ab1SKenneth D. Merry 
184*ef270ab1SKenneth D. Merry 	/* return value */
185*ef270ab1SKenneth D. Merry 	int32_t status;			/**< returned status */
186*ef270ab1SKenneth D. Merry 	uint32_t data_transferred;	/**< updated with data transferred */
187*ef270ab1SKenneth D. Merry 	uint32_t tag;			/**< returned unique I/O context tag */
188*ef270ab1SKenneth D. Merry 
189*ef270ab1SKenneth D. Merry 	/* for scsi loop */
190*ef270ab1SKenneth D. Merry 	uint32_t submit_count;		/**< count of submitted IOs */
191*ef270ab1SKenneth D. Merry 	uint32_t complete_count;	/**< count of completed IOs */
192*ef270ab1SKenneth D. Merry } ocs_ioctl_scsi_cmd_t;
193*ef270ab1SKenneth D. Merry 
194*ef270ab1SKenneth D. Merry /**
195*ef270ab1SKenneth D. Merry  * @brief coredump helper function command values
196*ef270ab1SKenneth D. Merry  */
197*ef270ab1SKenneth D. Merry 
198*ef270ab1SKenneth D. Merry typedef enum {
199*ef270ab1SKenneth D. Merry 	OCS_ECD_HELPER_CFG_READ8,
200*ef270ab1SKenneth D. Merry 	OCS_ECD_HELPER_CFG_READ16,
201*ef270ab1SKenneth D. Merry 	OCS_ECD_HELPER_CFG_READ32,
202*ef270ab1SKenneth D. Merry 	OCS_ECD_HELPER_CFG_WRITE8,
203*ef270ab1SKenneth D. Merry 	OCS_ECD_HELPER_CFG_WRITE16,
204*ef270ab1SKenneth D. Merry 	OCS_ECD_HELPER_CFG_WRITE32,
205*ef270ab1SKenneth D. Merry 	OCS_ECD_HELPER_BAR_READ8,
206*ef270ab1SKenneth D. Merry 	OCS_ECD_HELPER_BAR_READ16,
207*ef270ab1SKenneth D. Merry 	OCS_ECD_HELPER_BAR_READ32,
208*ef270ab1SKenneth D. Merry 	OCS_ECD_HELPER_BAR_WRITE8,
209*ef270ab1SKenneth D. Merry 	OCS_ECD_HELPER_BAR_WRITE16,
210*ef270ab1SKenneth D. Merry 	OCS_ECD_HELPER_BAR_WRITE32,
211*ef270ab1SKenneth D. Merry } ocs_ecd_helper_cmd_t;
212*ef270ab1SKenneth D. Merry 
213*ef270ab1SKenneth D. Merry /**
214*ef270ab1SKenneth D. Merry  * @brief OCS_IOCTL_CMD_ECD_HELPER ioctl structure
215*ef270ab1SKenneth D. Merry  */
216*ef270ab1SKenneth D. Merry 
217*ef270ab1SKenneth D. Merry typedef struct {
218*ef270ab1SKenneth D. Merry 	ocs_ecd_helper_cmd_t cmd;	/*<< coredump helper function command */
219*ef270ab1SKenneth D. Merry 	uint32_t bar;			/*<< BAR value to use */
220*ef270ab1SKenneth D. Merry 	uint32_t offset;		/*<< offset value to use */
221*ef270ab1SKenneth D. Merry 	uint32_t data;			/*<< 32 bit data value to write or return read data in */
222*ef270ab1SKenneth D. Merry 	int status;			/*<< status of helper function request */
223*ef270ab1SKenneth D. Merry } ocs_ioctl_ecd_helper_t;
224*ef270ab1SKenneth D. Merry 
225*ef270ab1SKenneth D. Merry /**
226*ef270ab1SKenneth D. Merry  * @brief OCS_IOCTL_CMD_VPORT ioctl structure
227*ef270ab1SKenneth D. Merry  */
228*ef270ab1SKenneth D. Merry 
229*ef270ab1SKenneth D. Merry typedef struct {
230*ef270ab1SKenneth D. Merry 	uint32_t domain_index;		/*<< domain instance index */
231*ef270ab1SKenneth D. Merry 	uint32_t req_create:1,		/*<< 1 = create vport, zero = remove vport */
232*ef270ab1SKenneth D. Merry 		 enable_ini:1,		/*<< 1 = enable vport as an initiator */
233*ef270ab1SKenneth D. Merry 		 enable_tgt:1;		/*<< 1 = enable vport as a target */
234*ef270ab1SKenneth D. Merry 	uint64_t wwpn;			/*<< wwpn to create or delete */
235*ef270ab1SKenneth D. Merry 	uint64_t wwnn;			/*<< wwnn to create or delete */
236*ef270ab1SKenneth D. Merry 	int status;			/*<< status of helper function request */
237*ef270ab1SKenneth D. Merry } ocs_ioctl_vport_t;
238*ef270ab1SKenneth D. Merry 
239*ef270ab1SKenneth D. Merry /**
240*ef270ab1SKenneth D. Merry  * @brief connection info ioctl structure
241*ef270ab1SKenneth D. Merry  *
242*ef270ab1SKenneth D. Merry  * Structure is returned when the OCS_IOCTL_CMD_CONNECTION_INFO is issued by a user space program.
243*ef270ab1SKenneth D. Merry  */
244*ef270ab1SKenneth D. Merry typedef struct {
245*ef270ab1SKenneth D. Merry         uint32_t connection_handle;
246*ef270ab1SKenneth D. Merry         uint16_t connection_id;
247*ef270ab1SKenneth D. Merry         uint8_t source_ip_type;
248*ef270ab1SKenneth D. Merry         uint8_t source_ip[16];
249*ef270ab1SKenneth D. Merry         uint16_t source_port;
250*ef270ab1SKenneth D. Merry         uint8_t dest_ip_type;
251*ef270ab1SKenneth D. Merry         uint8_t dest_ip[16];
252*ef270ab1SKenneth D. Merry         uint16_t dest_port;
253*ef270ab1SKenneth D. Merry } ocs_ioctl_connection_info_t;
254*ef270ab1SKenneth D. Merry 
255*ef270ab1SKenneth D. Merry typedef struct {
256*ef270ab1SKenneth D. Merry         uint32_t max_connections;
257*ef270ab1SKenneth D. Merry         uint32_t num_connections;
258*ef270ab1SKenneth D. Merry         ocs_ioctl_connection_info_t *connections;
259*ef270ab1SKenneth D. Merry } ocs_ioctl_connections_t;
260*ef270ab1SKenneth D. Merry 
261*ef270ab1SKenneth D. Merry /**
262*ef270ab1SKenneth D. Merry  * @brief driver-dump actions
263*ef270ab1SKenneth D. Merry  */
264*ef270ab1SKenneth D. Merry 
265*ef270ab1SKenneth D. Merry typedef enum {
266*ef270ab1SKenneth D. Merry 	OCS_IOCTL_DDUMP_GET,
267*ef270ab1SKenneth D. Merry 	OCS_IOCTL_DDUMP_GET_SAVED,
268*ef270ab1SKenneth D. Merry 	OCS_IOCTL_DDUMP_CLR_SAVED,
269*ef270ab1SKenneth D. Merry } ocs_ddump_action_t;
270*ef270ab1SKenneth D. Merry 
271*ef270ab1SKenneth D. Merry #define OCS_IOCTL_DDUMP_FLAGS_WQES	(1U << 0)
272*ef270ab1SKenneth D. Merry #define OCS_IOCTL_DDUMP_FLAGS_CQES	(1U << 1)
273*ef270ab1SKenneth D. Merry #define OCS_IOCTL_DDUMP_FLAGS_MQES	(1U << 2)
274*ef270ab1SKenneth D. Merry #define OCS_IOCTL_DDUMP_FLAGS_RQES	(1U << 3)
275*ef270ab1SKenneth D. Merry #define OCS_IOCTL_DDUMP_FLAGS_EQES	(1U << 4)
276*ef270ab1SKenneth D. Merry 
277*ef270ab1SKenneth D. Merry typedef struct {
278*ef270ab1SKenneth D. Merry 	ocs_ddump_action_t action;
279*ef270ab1SKenneth D. Merry 	uint32_t flags;
280*ef270ab1SKenneth D. Merry 	uint32_t q_entries;
281*ef270ab1SKenneth D. Merry } ocs_ioctl_ddump_arg_t;
282*ef270ab1SKenneth D. Merry 
283*ef270ab1SKenneth D. Merry /**
284*ef270ab1SKenneth D. Merry  * @brief OCS_CTL_CMD_GET_DDUMP ioctl structure
285*ef270ab1SKenneth D. Merry  */
286*ef270ab1SKenneth D. Merry 
287*ef270ab1SKenneth D. Merry typedef struct {
288*ef270ab1SKenneth D. Merry 	ocs_ioctl_ddump_arg_t args;	/*<< arguments for ddump */
289*ef270ab1SKenneth D. Merry 	uint8_t *user_buffer;		/*<< pointer to user space buffer */
290*ef270ab1SKenneth D. Merry 	uint32_t user_buffer_len;	/*<< length in bytes of user space buffer */
291*ef270ab1SKenneth D. Merry 	uint32_t bytes_written;		/*<< number of bytes written */
292*ef270ab1SKenneth D. Merry } ocs_ioctl_ddump_t;
293*ef270ab1SKenneth D. Merry 
294*ef270ab1SKenneth D. Merry /**
295*ef270ab1SKenneth D. Merry  * @brief OCS_CTL_CMD_GET_STATUS, OCS_CTL_CMD_GET_CONFIG
296*ef270ab1SKenneth D. Merry  */
297*ef270ab1SKenneth D. Merry 
298*ef270ab1SKenneth D. Merry typedef struct {
299*ef270ab1SKenneth D. Merry 	uint8_t *user_buffer;		/*<< pointer to user space buffer */
300*ef270ab1SKenneth D. Merry 	uint32_t user_buffer_len;	/*<< length in bytes of user space buffer */
301*ef270ab1SKenneth D. Merry 	uint32_t bytes_written;		/*<< number of bytes written */
302*ef270ab1SKenneth D. Merry } ocs_ioctl_mgmt_buffer_t;
303*ef270ab1SKenneth D. Merry 
304*ef270ab1SKenneth D. Merry typedef struct {
305*ef270ab1SKenneth D. Merry 	uint8_t		*name;			/*<< Input: name of property to retrieve */
306*ef270ab1SKenneth D. Merry 	uint8_t		*value;			/*<< Output: user space buffer in which to place the response */
307*ef270ab1SKenneth D. Merry 	uint32_t	value_length;		/*<< Input: size of the user space buffer */
308*ef270ab1SKenneth D. Merry } ocs_ioctl_cmd_get_t;
309*ef270ab1SKenneth D. Merry 
310*ef270ab1SKenneth D. Merry typedef struct {
311*ef270ab1SKenneth D. Merry 	uint8_t		*name;			/*<< Input: name of property to set */
312*ef270ab1SKenneth D. Merry 	uint8_t		*value;			/*<< Input: user space buffer which contains the new value */
313*ef270ab1SKenneth D. Merry 	int32_t		result;			/*<< Output: result */
314*ef270ab1SKenneth D. Merry } ocs_ioctl_cmd_set_t;
315*ef270ab1SKenneth D. Merry 
316*ef270ab1SKenneth D. Merry typedef struct {
317*ef270ab1SKenneth D. Merry 	uint8_t		*name;			/*<< Input: name of action to execute */
318*ef270ab1SKenneth D. Merry 	void		*arg_in;		/*<< Input: pointer to argument in user space */
319*ef270ab1SKenneth D. Merry 	uint32_t	arg_in_length;		/*<< Input: size of arg_in in bytes */
320*ef270ab1SKenneth D. Merry 	void		*arg_out;		/*<< Output: pointer to argument from kernel to user */
321*ef270ab1SKenneth D. Merry 	uint32_t	arg_out_length;		/*<< Input: size of arg_out in bytes */
322*ef270ab1SKenneth D. Merry 	int32_t		result;			/*<< Output: result */
323*ef270ab1SKenneth D. Merry } ocs_ioctl_action_t;
324*ef270ab1SKenneth D. Merry 
325*ef270ab1SKenneth D. Merry #define FC_HEADER_LEN	24
326*ef270ab1SKenneth D. Merry typedef struct {
327*ef270ab1SKenneth D. Merry 	uint8_t		fc_header[FC_HEADER_LEN]; /*<< FC Header to send */
328*ef270ab1SKenneth D. Merry 	uint8_t		*payload;		/*<< payload */
329*ef270ab1SKenneth D. Merry 	uint32_t	payload_len;		/*<< payload length (bytes) */
330*ef270ab1SKenneth D. Merry 	uint8_t		sof;			/*<< SOF value */
331*ef270ab1SKenneth D. Merry 	uint8_t		eof;			/*<< EOF Value */
332*ef270ab1SKenneth D. Merry } ocs_ioctl_send_frame_t;
333*ef270ab1SKenneth D. Merry 
334*ef270ab1SKenneth D. Merry /**
335*ef270ab1SKenneth D. Merry  * @brief linkcfg strings
336*ef270ab1SKenneth D. Merry  */
337*ef270ab1SKenneth D. Merry #define OCS_CONFIG_LINKCFG_4X10G	"ETH_4x10G"
338*ef270ab1SKenneth D. Merry #define OCS_CONFIG_LINKCFG_1X40G	"ETH_1x40G"
339*ef270ab1SKenneth D. Merry #define OCS_CONFIG_LINKCFG_2X16G	"FC_2x16G"
340*ef270ab1SKenneth D. Merry #define OCS_CONFIG_LINKCFG_4X8G		"FC_4x8G"
341*ef270ab1SKenneth D. Merry #define OCS_CONFIG_LINKCFG_4X1G		"FC_4x1G"
342*ef270ab1SKenneth D. Merry #define OCS_CONFIG_LINKCFG_2X10G	"ETH_2x10G"
343*ef270ab1SKenneth D. Merry #define OCS_CONFIG_LINKCFG_2X10G_2X8G	"ETH_2x10G_FC_2x8G"
344*ef270ab1SKenneth D. Merry #define OCS_CONFIG_LINKCFG_UNKNOWN	"UNKNOWN"
345*ef270ab1SKenneth D. Merry 
346*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_BASE		'o'
347*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_TEST		_IOWR(OCS_IOCTL_CMD_BASE, 1, ocs_ioctl_test_t)
348*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_ELXU_MBOX		_IOWR(OCS_IOCTL_CMD_BASE, 2, ocs_ioctl_elxu_mbox_t)
349*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_SCSI_CMD		_IOWR(OCS_IOCTL_CMD_BASE, 3, ocs_ioctl_scsi_cmd_t)
350*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_DRIVER_INFO	_IOWR(OCS_IOCTL_CMD_BASE, 4, ocs_ioctl_driver_info_t)
351*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_ECD_HELPER	_IOWR(OCS_IOCTL_CMD_BASE, 5, ocs_ioctl_ecd_helper_t)
352*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_CONNECTION_INFO   _IOWR(OCS_IOCTL_CMD_BASE, 6, ocs_ioctl_connection_info_t)
353*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_VPORT		_IOWR(OCS_IOCTL_CMD_BASE, 7, ocs_ioctl_vport_t)
354*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_GET_DDUMP		_IOWR(OCS_IOCTL_CMD_BASE, 8, ocs_ioctl_ddump_t)
355*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_MGMT_GET		_IOWR(OCS_IOCTL_CMD_BASE, 9, ocs_ioctl_cmd_get_t)
356*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_MGMT_GET_ALL	_IOWR(OCS_IOCTL_CMD_BASE, 10, ocs_ioctl_mgmt_buffer_t)
357*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_MGMT_SET		_IOWR(OCS_IOCTL_CMD_BASE, 11, ocs_ioctl_cmd_set_t)
358*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_MGMT_LIST		_IOWR(OCS_IOCTL_CMD_BASE, 12, ocs_ioctl_mgmt_buffer_t)
359*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_MGMT_EXEC		_IOWR(OCS_IOCTL_CMD_BASE, 13, ocs_ioctl_action_t)
360*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_LINK_ONLINE	_IOWR(OCS_IOCTL_CMD_BASE, 16, int)
361*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_GEN_DUMP		_IOWR(OCS_IOCTL_CMD_BASE, 17, int)
362*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_UNLOAD		_IO(OCS_IOCTL_CMD_BASE, 18)
363*ef270ab1SKenneth D. Merry #define OCS_IOCTL_CMD_SEND_FRAME	_IOWR(OCS_IOCTL_CMD_BASE, 19, ocs_ioctl_send_frame_t)
364*ef270ab1SKenneth D. Merry 
365*ef270ab1SKenneth D. Merry 
366*ef270ab1SKenneth D. Merry extern void ocs_info_get_xport_address(ocs_t *ocs, ocs_ioctl_driver_info_t *info);
367*ef270ab1SKenneth D. Merry extern int32_t ocs_device_ioctl_xport(ocs_t *ocs, unsigned int cmd, unsigned long arg);
368*ef270ab1SKenneth D. Merry #endif
369