xref: /OK3568_Linux_fs/kernel/drivers/scsi/fnic/fcpio.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2008 Cisco Systems, Inc.  All rights reserved.
3*4882a593Smuzhiyun  * Copyright 2007 Nuova Systems, Inc.  All rights reserved.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This program is free software; you may redistribute it and/or modify
6*4882a593Smuzhiyun  * it under the terms of the GNU General Public License as published by
7*4882a593Smuzhiyun  * the Free Software Foundation; version 2 of the License.
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
10*4882a593Smuzhiyun  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
11*4882a593Smuzhiyun  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
12*4882a593Smuzhiyun  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
13*4882a593Smuzhiyun  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
14*4882a593Smuzhiyun  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
15*4882a593Smuzhiyun  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
16*4882a593Smuzhiyun  * SOFTWARE.
17*4882a593Smuzhiyun  */
18*4882a593Smuzhiyun #ifndef _FCPIO_H_
19*4882a593Smuzhiyun #define _FCPIO_H_
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #include <linux/if_ether.h>
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun /*
24*4882a593Smuzhiyun  * This header file includes all of the data structures used for
25*4882a593Smuzhiyun  * communication by the host driver to the fcp firmware.
26*4882a593Smuzhiyun  */
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun /*
29*4882a593Smuzhiyun  * Exchange and sequence id space allocated to the host driver
30*4882a593Smuzhiyun  */
31*4882a593Smuzhiyun #define FCPIO_HOST_EXCH_RANGE_START         0x1000
32*4882a593Smuzhiyun #define FCPIO_HOST_EXCH_RANGE_END           0x1fff
33*4882a593Smuzhiyun #define FCPIO_HOST_SEQ_ID_RANGE_START       0x80
34*4882a593Smuzhiyun #define FCPIO_HOST_SEQ_ID_RANGE_END         0xff
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /*
37*4882a593Smuzhiyun  * Command entry type
38*4882a593Smuzhiyun  */
39*4882a593Smuzhiyun enum fcpio_type {
40*4882a593Smuzhiyun 	/*
41*4882a593Smuzhiyun 	 * Initiator request types
42*4882a593Smuzhiyun 	 */
43*4882a593Smuzhiyun 	FCPIO_ICMND_16 = 0x1,
44*4882a593Smuzhiyun 	FCPIO_ICMND_32,
45*4882a593Smuzhiyun 	FCPIO_ICMND_CMPL,
46*4882a593Smuzhiyun 	FCPIO_ITMF,
47*4882a593Smuzhiyun 	FCPIO_ITMF_CMPL,
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun 	/*
50*4882a593Smuzhiyun 	 * Target request types
51*4882a593Smuzhiyun 	 */
52*4882a593Smuzhiyun 	FCPIO_TCMND_16 = 0x11,
53*4882a593Smuzhiyun 	FCPIO_TCMND_32,
54*4882a593Smuzhiyun 	FCPIO_TDATA,
55*4882a593Smuzhiyun 	FCPIO_TXRDY,
56*4882a593Smuzhiyun 	FCPIO_TRSP,
57*4882a593Smuzhiyun 	FCPIO_TDRSP_CMPL,
58*4882a593Smuzhiyun 	FCPIO_TTMF,
59*4882a593Smuzhiyun 	FCPIO_TTMF_ACK,
60*4882a593Smuzhiyun 	FCPIO_TABORT,
61*4882a593Smuzhiyun 	FCPIO_TABORT_CMPL,
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 	/*
64*4882a593Smuzhiyun 	 * Misc request types
65*4882a593Smuzhiyun 	 */
66*4882a593Smuzhiyun 	FCPIO_ACK = 0x20,
67*4882a593Smuzhiyun 	FCPIO_RESET,
68*4882a593Smuzhiyun 	FCPIO_RESET_CMPL,
69*4882a593Smuzhiyun 	FCPIO_FLOGI_REG,
70*4882a593Smuzhiyun 	FCPIO_FLOGI_REG_CMPL,
71*4882a593Smuzhiyun 	FCPIO_ECHO,
72*4882a593Smuzhiyun 	FCPIO_ECHO_CMPL,
73*4882a593Smuzhiyun 	FCPIO_LUNMAP_CHNG,
74*4882a593Smuzhiyun 	FCPIO_LUNMAP_REQ,
75*4882a593Smuzhiyun 	FCPIO_LUNMAP_REQ_CMPL,
76*4882a593Smuzhiyun 	FCPIO_FLOGI_FIP_REG,
77*4882a593Smuzhiyun 	FCPIO_FLOGI_FIP_REG_CMPL,
78*4882a593Smuzhiyun };
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun /*
81*4882a593Smuzhiyun  * Header status codes from the firmware
82*4882a593Smuzhiyun  */
83*4882a593Smuzhiyun enum fcpio_status {
84*4882a593Smuzhiyun 	FCPIO_SUCCESS = 0,              /* request was successful */
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 	/*
87*4882a593Smuzhiyun 	 * If a request to the firmware is rejected, the original request
88*4882a593Smuzhiyun 	 * header will be returned with the status set to one of the following:
89*4882a593Smuzhiyun 	 */
90*4882a593Smuzhiyun 	FCPIO_INVALID_HEADER,    /* header contains invalid data */
91*4882a593Smuzhiyun 	FCPIO_OUT_OF_RESOURCE,   /* out of resources to complete request */
92*4882a593Smuzhiyun 	FCPIO_INVALID_PARAM,     /* some parameter in request is invalid */
93*4882a593Smuzhiyun 	FCPIO_REQ_NOT_SUPPORTED, /* request type is not supported */
94*4882a593Smuzhiyun 	FCPIO_IO_NOT_FOUND,      /* requested I/O was not found */
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun 	/*
97*4882a593Smuzhiyun 	 * Once a request is processed, the firmware will usually return
98*4882a593Smuzhiyun 	 * a cmpl message type.  In cases where errors occurred,
99*4882a593Smuzhiyun 	 * the header status field would be filled in with one of the following:
100*4882a593Smuzhiyun 	 */
101*4882a593Smuzhiyun 	FCPIO_ABORTED = 0x41,     /* request was aborted */
102*4882a593Smuzhiyun 	FCPIO_TIMEOUT,            /* request was timed out */
103*4882a593Smuzhiyun 	FCPIO_SGL_INVALID,        /* request was aborted due to sgl error */
104*4882a593Smuzhiyun 	FCPIO_MSS_INVALID,        /* request was aborted due to mss error */
105*4882a593Smuzhiyun 	FCPIO_DATA_CNT_MISMATCH,  /* recv/sent more/less data than exp. */
106*4882a593Smuzhiyun 	FCPIO_FW_ERR,             /* request was terminated due to fw error */
107*4882a593Smuzhiyun 	FCPIO_ITMF_REJECTED,      /* itmf req was rejected by remote node */
108*4882a593Smuzhiyun 	FCPIO_ITMF_FAILED,        /* itmf req was failed by remote node */
109*4882a593Smuzhiyun 	FCPIO_ITMF_INCORRECT_LUN, /* itmf req targeted incorrect LUN */
110*4882a593Smuzhiyun 	FCPIO_CMND_REJECTED,      /* request was invalid and rejected */
111*4882a593Smuzhiyun 	FCPIO_NO_PATH_AVAIL,      /* no paths to the lun was available */
112*4882a593Smuzhiyun 	FCPIO_PATH_FAILED,        /* i/o sent to current path failed */
113*4882a593Smuzhiyun 	FCPIO_LUNMAP_CHNG_PEND,   /* i/o rejected due to lunmap change */
114*4882a593Smuzhiyun };
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun /*
117*4882a593Smuzhiyun  * The header command tag.  All host requests will use the "tag" field
118*4882a593Smuzhiyun  * to mark commands with a unique tag.  When the firmware responds to
119*4882a593Smuzhiyun  * a host request, it will copy the tag field into the response.
120*4882a593Smuzhiyun  *
121*4882a593Smuzhiyun  * The only firmware requests that will use the rx_id/ox_id fields instead
122*4882a593Smuzhiyun  * of the tag field will be the target command and target task management
123*4882a593Smuzhiyun  * requests.  These two requests do not have corresponding host requests
124*4882a593Smuzhiyun  * since they come directly from the FC initiator on the network.
125*4882a593Smuzhiyun  */
126*4882a593Smuzhiyun struct fcpio_tag {
127*4882a593Smuzhiyun 	union {
128*4882a593Smuzhiyun 		u32 req_id;
129*4882a593Smuzhiyun 		struct {
130*4882a593Smuzhiyun 			u16 rx_id;
131*4882a593Smuzhiyun 			u16 ox_id;
132*4882a593Smuzhiyun 		} ex_id;
133*4882a593Smuzhiyun 	} u;
134*4882a593Smuzhiyun };
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun static inline void
fcpio_tag_id_enc(struct fcpio_tag * tag,u32 id)137*4882a593Smuzhiyun fcpio_tag_id_enc(struct fcpio_tag *tag, u32 id)
138*4882a593Smuzhiyun {
139*4882a593Smuzhiyun 	tag->u.req_id = id;
140*4882a593Smuzhiyun }
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun static inline void
fcpio_tag_id_dec(struct fcpio_tag * tag,u32 * id)143*4882a593Smuzhiyun fcpio_tag_id_dec(struct fcpio_tag *tag, u32 *id)
144*4882a593Smuzhiyun {
145*4882a593Smuzhiyun 	*id = tag->u.req_id;
146*4882a593Smuzhiyun }
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun static inline void
fcpio_tag_exid_enc(struct fcpio_tag * tag,u16 ox_id,u16 rx_id)149*4882a593Smuzhiyun fcpio_tag_exid_enc(struct fcpio_tag *tag, u16 ox_id, u16 rx_id)
150*4882a593Smuzhiyun {
151*4882a593Smuzhiyun 	tag->u.ex_id.rx_id = rx_id;
152*4882a593Smuzhiyun 	tag->u.ex_id.ox_id = ox_id;
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun static inline void
fcpio_tag_exid_dec(struct fcpio_tag * tag,u16 * ox_id,u16 * rx_id)156*4882a593Smuzhiyun fcpio_tag_exid_dec(struct fcpio_tag *tag, u16 *ox_id, u16 *rx_id)
157*4882a593Smuzhiyun {
158*4882a593Smuzhiyun 	*rx_id = tag->u.ex_id.rx_id;
159*4882a593Smuzhiyun 	*ox_id = tag->u.ex_id.ox_id;
160*4882a593Smuzhiyun }
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun /*
163*4882a593Smuzhiyun  * The header for an fcpio request, whether from the firmware or from the
164*4882a593Smuzhiyun  * host driver
165*4882a593Smuzhiyun  */
166*4882a593Smuzhiyun struct fcpio_header {
167*4882a593Smuzhiyun 	u8            type;           /* enum fcpio_type */
168*4882a593Smuzhiyun 	u8            status;         /* header status entry */
169*4882a593Smuzhiyun 	u16           _resvd;         /* reserved */
170*4882a593Smuzhiyun 	struct fcpio_tag    tag;      /* header tag */
171*4882a593Smuzhiyun };
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun static inline void
fcpio_header_enc(struct fcpio_header * hdr,u8 type,u8 status,struct fcpio_tag tag)174*4882a593Smuzhiyun fcpio_header_enc(struct fcpio_header *hdr,
175*4882a593Smuzhiyun 		 u8 type, u8 status,
176*4882a593Smuzhiyun 		 struct fcpio_tag tag)
177*4882a593Smuzhiyun {
178*4882a593Smuzhiyun 	hdr->type = type;
179*4882a593Smuzhiyun 	hdr->status = status;
180*4882a593Smuzhiyun 	hdr->_resvd = 0;
181*4882a593Smuzhiyun 	hdr->tag = tag;
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun static inline void
fcpio_header_dec(struct fcpio_header * hdr,u8 * type,u8 * status,struct fcpio_tag * tag)185*4882a593Smuzhiyun fcpio_header_dec(struct fcpio_header *hdr,
186*4882a593Smuzhiyun 		 u8 *type, u8 *status,
187*4882a593Smuzhiyun 		 struct fcpio_tag *tag)
188*4882a593Smuzhiyun {
189*4882a593Smuzhiyun 	*type = hdr->type;
190*4882a593Smuzhiyun 	*status = hdr->status;
191*4882a593Smuzhiyun 	*tag = hdr->tag;
192*4882a593Smuzhiyun }
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun #define CDB_16      16
195*4882a593Smuzhiyun #define CDB_32      32
196*4882a593Smuzhiyun #define LUN_ADDRESS 8
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun /*
199*4882a593Smuzhiyun  * fcpio_icmnd_16: host -> firmware request
200*4882a593Smuzhiyun  *
201*4882a593Smuzhiyun  * used for sending out an initiator SCSI 16-byte command
202*4882a593Smuzhiyun  */
203*4882a593Smuzhiyun struct fcpio_icmnd_16 {
204*4882a593Smuzhiyun 	u32	  lunmap_id;		/* index into lunmap table */
205*4882a593Smuzhiyun 	u8	  special_req_flags;	/* special exchange request flags */
206*4882a593Smuzhiyun 	u8	  _resvd0[3];	        /* reserved */
207*4882a593Smuzhiyun 	u32	  sgl_cnt;		/* scatter-gather list count */
208*4882a593Smuzhiyun 	u32	  sense_len;		/* sense buffer length */
209*4882a593Smuzhiyun 	u64	  sgl_addr;		/* scatter-gather list addr */
210*4882a593Smuzhiyun 	u64	  sense_addr;		/* sense buffer address */
211*4882a593Smuzhiyun 	u8	  crn;			/* SCSI Command Reference No. */
212*4882a593Smuzhiyun 	u8	  pri_ta;		/* SCSI Priority and Task attribute */
213*4882a593Smuzhiyun 	u8	  _resvd1;		/* reserved: should be 0 */
214*4882a593Smuzhiyun 	u8	  flags;		/* command flags */
215*4882a593Smuzhiyun 	u8	  scsi_cdb[CDB_16];	/* SCSI Cmnd Descriptor Block */
216*4882a593Smuzhiyun 	u32	  data_len;		/* length of data expected */
217*4882a593Smuzhiyun 	u8	  lun[LUN_ADDRESS];	/* FC vNIC only: LUN address */
218*4882a593Smuzhiyun 	u8	  _resvd2;		/* reserved */
219*4882a593Smuzhiyun 	u8	  d_id[3];		/* FC vNIC only: Target D_ID */
220*4882a593Smuzhiyun 	u16	  mss;			/* FC vNIC only: max burst */
221*4882a593Smuzhiyun 	u16	  _resvd3;		/* reserved */
222*4882a593Smuzhiyun 	u32	  r_a_tov;		/* FC vNIC only: Res. Alloc Timeout */
223*4882a593Smuzhiyun 	u32	  e_d_tov;	        /* FC vNIC only: Err Detect Timeout */
224*4882a593Smuzhiyun };
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun /*
227*4882a593Smuzhiyun  * Special request flags
228*4882a593Smuzhiyun  */
229*4882a593Smuzhiyun #define FCPIO_ICMND_SRFLAG_RETRY 0x01   /* Enable Retry handling on exchange */
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun /*
232*4882a593Smuzhiyun  * Priority/Task Attribute settings
233*4882a593Smuzhiyun  */
234*4882a593Smuzhiyun #define FCPIO_ICMND_PTA_SIMPLE      0   /* simple task attribute */
235*4882a593Smuzhiyun #define FCPIO_ICMND_PTA_HEADQ       1   /* head of queue task attribute */
236*4882a593Smuzhiyun #define FCPIO_ICMND_PTA_ORDERED     2   /* ordered task attribute */
237*4882a593Smuzhiyun #define FCPIO_ICMND_PTA_ACA         4   /* auto contingent allegiance */
238*4882a593Smuzhiyun #define FCPIO_ICMND_PRI_SHIFT       3   /* priority field starts in bit 3 */
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun /*
241*4882a593Smuzhiyun  * Command flags
242*4882a593Smuzhiyun  */
243*4882a593Smuzhiyun #define FCPIO_ICMND_RDDATA      0x02    /* read data */
244*4882a593Smuzhiyun #define FCPIO_ICMND_WRDATA      0x01    /* write data */
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun /*
247*4882a593Smuzhiyun  * fcpio_icmnd_32: host -> firmware request
248*4882a593Smuzhiyun  *
249*4882a593Smuzhiyun  * used for sending out an initiator SCSI 32-byte command
250*4882a593Smuzhiyun  */
251*4882a593Smuzhiyun struct fcpio_icmnd_32 {
252*4882a593Smuzhiyun 	u32   lunmap_id;              /* index into lunmap table */
253*4882a593Smuzhiyun 	u8    special_req_flags;      /* special exchange request flags */
254*4882a593Smuzhiyun 	u8    _resvd0[3];             /* reserved */
255*4882a593Smuzhiyun 	u32   sgl_cnt;                /* scatter-gather list count */
256*4882a593Smuzhiyun 	u32   sense_len;              /* sense buffer length */
257*4882a593Smuzhiyun 	u64   sgl_addr;               /* scatter-gather list addr */
258*4882a593Smuzhiyun 	u64   sense_addr;             /* sense buffer address */
259*4882a593Smuzhiyun 	u8    crn;                    /* SCSI Command Reference No. */
260*4882a593Smuzhiyun 	u8    pri_ta;                 /* SCSI Priority and Task attribute */
261*4882a593Smuzhiyun 	u8    _resvd1;                /* reserved: should be 0 */
262*4882a593Smuzhiyun 	u8    flags;                  /* command flags */
263*4882a593Smuzhiyun 	u8    scsi_cdb[CDB_32];       /* SCSI Cmnd Descriptor Block */
264*4882a593Smuzhiyun 	u32   data_len;               /* length of data expected */
265*4882a593Smuzhiyun 	u8    lun[LUN_ADDRESS];       /* FC vNIC only: LUN address */
266*4882a593Smuzhiyun 	u8    _resvd2;                /* reserved */
267*4882a593Smuzhiyun 	u8    d_id[3];		      /* FC vNIC only: Target D_ID */
268*4882a593Smuzhiyun 	u16   mss;                    /* FC vNIC only: max burst */
269*4882a593Smuzhiyun 	u16   _resvd3;                /* reserved */
270*4882a593Smuzhiyun 	u32   r_a_tov;                /* FC vNIC only: Res. Alloc Timeout */
271*4882a593Smuzhiyun 	u32   e_d_tov;                /* FC vNIC only: Error Detect Timeout */
272*4882a593Smuzhiyun };
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun /*
275*4882a593Smuzhiyun  * fcpio_itmf: host -> firmware request
276*4882a593Smuzhiyun  *
277*4882a593Smuzhiyun  * used for requesting the firmware to abort a request and/or send out
278*4882a593Smuzhiyun  * a task management function
279*4882a593Smuzhiyun  *
280*4882a593Smuzhiyun  * The t_tag field is only needed when the request type is ABT_TASK.
281*4882a593Smuzhiyun  */
282*4882a593Smuzhiyun struct fcpio_itmf {
283*4882a593Smuzhiyun 	u32   lunmap_id;              /* index into lunmap table */
284*4882a593Smuzhiyun 	u32   tm_req;                 /* SCSI Task Management request */
285*4882a593Smuzhiyun 	u32   t_tag;                  /* header tag of fcpio to be aborted */
286*4882a593Smuzhiyun 	u32   _resvd;                 /* _reserved */
287*4882a593Smuzhiyun 	u8    lun[LUN_ADDRESS];       /* FC vNIC only: LUN address */
288*4882a593Smuzhiyun 	u8    _resvd1;                /* reserved */
289*4882a593Smuzhiyun 	u8    d_id[3];		      /* FC vNIC only: Target D_ID */
290*4882a593Smuzhiyun 	u32   r_a_tov;                /* FC vNIC only: R_A_TOV in msec */
291*4882a593Smuzhiyun 	u32   e_d_tov;                /* FC vNIC only: E_D_TOV in msec */
292*4882a593Smuzhiyun };
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun /*
295*4882a593Smuzhiyun  * Task Management request
296*4882a593Smuzhiyun  */
297*4882a593Smuzhiyun enum fcpio_itmf_tm_req_type {
298*4882a593Smuzhiyun 	FCPIO_ITMF_ABT_TASK_TERM = 0x01,    /* abort task and terminate */
299*4882a593Smuzhiyun 	FCPIO_ITMF_ABT_TASK,                /* abort task and issue abts */
300*4882a593Smuzhiyun 	FCPIO_ITMF_ABT_TASK_SET,            /* abort task set */
301*4882a593Smuzhiyun 	FCPIO_ITMF_CLR_TASK_SET,            /* clear task set */
302*4882a593Smuzhiyun 	FCPIO_ITMF_LUN_RESET,               /* logical unit reset task mgmt */
303*4882a593Smuzhiyun 	FCPIO_ITMF_CLR_ACA,                 /* Clear ACA condition */
304*4882a593Smuzhiyun };
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun /*
307*4882a593Smuzhiyun  * fcpio_tdata: host -> firmware request
308*4882a593Smuzhiyun  *
309*4882a593Smuzhiyun  * used for requesting the firmware to send out a read data transfer for a
310*4882a593Smuzhiyun  * target command
311*4882a593Smuzhiyun  */
312*4882a593Smuzhiyun struct fcpio_tdata {
313*4882a593Smuzhiyun 	u16   rx_id;                  /* FC rx_id of target command */
314*4882a593Smuzhiyun 	u16   flags;                  /* command flags */
315*4882a593Smuzhiyun 	u32   rel_offset;             /* data sequence relative offset */
316*4882a593Smuzhiyun 	u32   sgl_cnt;                /* scatter-gather list count */
317*4882a593Smuzhiyun 	u32   data_len;               /* length of data expected to send */
318*4882a593Smuzhiyun 	u64   sgl_addr;               /* scatter-gather list address */
319*4882a593Smuzhiyun };
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun /*
322*4882a593Smuzhiyun  * Command flags
323*4882a593Smuzhiyun  */
324*4882a593Smuzhiyun #define FCPIO_TDATA_SCSI_RSP    0x01    /* send a scsi resp. after last frame */
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun /*
327*4882a593Smuzhiyun  * fcpio_txrdy: host -> firmware request
328*4882a593Smuzhiyun  *
329*4882a593Smuzhiyun  * used for requesting the firmware to send out a write data transfer for a
330*4882a593Smuzhiyun  * target command
331*4882a593Smuzhiyun  */
332*4882a593Smuzhiyun struct fcpio_txrdy {
333*4882a593Smuzhiyun 	u16   rx_id;                  /* FC rx_id of target command */
334*4882a593Smuzhiyun 	u16   _resvd0;                /* reserved */
335*4882a593Smuzhiyun 	u32   rel_offset;             /* data sequence relative offset */
336*4882a593Smuzhiyun 	u32   sgl_cnt;                /* scatter-gather list count */
337*4882a593Smuzhiyun 	u32   data_len;               /* length of data expected to send */
338*4882a593Smuzhiyun 	u64   sgl_addr;               /* scatter-gather list address */
339*4882a593Smuzhiyun };
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun /*
342*4882a593Smuzhiyun  * fcpio_trsp: host -> firmware request
343*4882a593Smuzhiyun  *
344*4882a593Smuzhiyun  * used for requesting the firmware to send out a response for a target
345*4882a593Smuzhiyun  * command
346*4882a593Smuzhiyun  */
347*4882a593Smuzhiyun struct fcpio_trsp {
348*4882a593Smuzhiyun 	u16   rx_id;                  /* FC rx_id of target command */
349*4882a593Smuzhiyun 	u16   _resvd0;                /* reserved */
350*4882a593Smuzhiyun 	u32   sense_len;              /* sense data buffer length */
351*4882a593Smuzhiyun 	u64   sense_addr;             /* sense data buffer address */
352*4882a593Smuzhiyun 	u16   _resvd1;                /* reserved */
353*4882a593Smuzhiyun 	u8    flags;                  /* response request flags */
354*4882a593Smuzhiyun 	u8    scsi_status;            /* SCSI status */
355*4882a593Smuzhiyun 	u32   residual;               /* SCSI data residual value of I/O */
356*4882a593Smuzhiyun };
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun /*
359*4882a593Smuzhiyun  * resposnse request flags
360*4882a593Smuzhiyun  */
361*4882a593Smuzhiyun #define FCPIO_TRSP_RESID_UNDER  0x08   /* residual is valid and is underflow */
362*4882a593Smuzhiyun #define FCPIO_TRSP_RESID_OVER   0x04   /* residual is valid and is overflow */
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun /*
365*4882a593Smuzhiyun  * fcpio_ttmf_ack: host -> firmware response
366*4882a593Smuzhiyun  *
367*4882a593Smuzhiyun  * used by the host to indicate to the firmware it has received and processed
368*4882a593Smuzhiyun  * the target tmf request
369*4882a593Smuzhiyun  */
370*4882a593Smuzhiyun struct fcpio_ttmf_ack {
371*4882a593Smuzhiyun 	u16   rx_id;                  /* FC rx_id of target command */
372*4882a593Smuzhiyun 	u16   _resvd0;                /* reserved */
373*4882a593Smuzhiyun 	u32   tmf_status;             /* SCSI task management status */
374*4882a593Smuzhiyun };
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun /*
377*4882a593Smuzhiyun  * fcpio_tabort: host -> firmware request
378*4882a593Smuzhiyun  *
379*4882a593Smuzhiyun  * used by the host to request the firmware to abort a target request that was
380*4882a593Smuzhiyun  * received by the firmware
381*4882a593Smuzhiyun  */
382*4882a593Smuzhiyun struct fcpio_tabort {
383*4882a593Smuzhiyun 	u16   rx_id;                  /* rx_id of the target request */
384*4882a593Smuzhiyun };
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun /*
387*4882a593Smuzhiyun  * fcpio_reset: host -> firmware request
388*4882a593Smuzhiyun  *
389*4882a593Smuzhiyun  * used by the host to signal a reset of the driver to the firmware
390*4882a593Smuzhiyun  * and to request firmware to clean up all outstanding I/O
391*4882a593Smuzhiyun  */
392*4882a593Smuzhiyun struct fcpio_reset {
393*4882a593Smuzhiyun 	u32   _resvd;
394*4882a593Smuzhiyun };
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun enum fcpio_flogi_reg_format_type {
397*4882a593Smuzhiyun 	FCPIO_FLOGI_REG_DEF_DEST = 0,    /* Use the oui | s_id mac format */
398*4882a593Smuzhiyun 	FCPIO_FLOGI_REG_GW_DEST,         /* Use the fixed gateway mac */
399*4882a593Smuzhiyun };
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun /*
402*4882a593Smuzhiyun  * fcpio_flogi_reg: host -> firmware request
403*4882a593Smuzhiyun  *
404*4882a593Smuzhiyun  * fc vnic only
405*4882a593Smuzhiyun  * used by the host to notify the firmware of the lif's s_id
406*4882a593Smuzhiyun  * and destination mac address format
407*4882a593Smuzhiyun  */
408*4882a593Smuzhiyun struct fcpio_flogi_reg {
409*4882a593Smuzhiyun 	u8 format;
410*4882a593Smuzhiyun 	u8 s_id[3];			/* FC vNIC only: Source S_ID */
411*4882a593Smuzhiyun 	u8 gateway_mac[ETH_ALEN];	/* Destination gateway mac */
412*4882a593Smuzhiyun 	u16 _resvd;
413*4882a593Smuzhiyun 	u32 r_a_tov;			/* R_A_TOV in msec */
414*4882a593Smuzhiyun 	u32 e_d_tov;			/* E_D_TOV in msec */
415*4882a593Smuzhiyun };
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun /*
418*4882a593Smuzhiyun  * fcpio_echo: host -> firmware request
419*4882a593Smuzhiyun  *
420*4882a593Smuzhiyun  * sends a heartbeat echo request to the firmware
421*4882a593Smuzhiyun  */
422*4882a593Smuzhiyun struct fcpio_echo {
423*4882a593Smuzhiyun 	u32 _resvd;
424*4882a593Smuzhiyun };
425*4882a593Smuzhiyun 
426*4882a593Smuzhiyun /*
427*4882a593Smuzhiyun  * fcpio_lunmap_req: host -> firmware request
428*4882a593Smuzhiyun  *
429*4882a593Smuzhiyun  * scsi vnic only
430*4882a593Smuzhiyun  * sends a request to retrieve the lunmap table for scsi vnics
431*4882a593Smuzhiyun  */
432*4882a593Smuzhiyun struct fcpio_lunmap_req {
433*4882a593Smuzhiyun 	u64 addr;                     /* address of the buffer */
434*4882a593Smuzhiyun 	u32 len;                      /* len of the buffer */
435*4882a593Smuzhiyun };
436*4882a593Smuzhiyun 
437*4882a593Smuzhiyun /*
438*4882a593Smuzhiyun  * fcpio_flogi_fip_reg: host -> firmware request
439*4882a593Smuzhiyun  *
440*4882a593Smuzhiyun  * fc vnic only
441*4882a593Smuzhiyun  * used by the host to notify the firmware of the lif's s_id
442*4882a593Smuzhiyun  * and destination mac address format
443*4882a593Smuzhiyun  */
444*4882a593Smuzhiyun struct fcpio_flogi_fip_reg {
445*4882a593Smuzhiyun 	u8    _resvd0;
446*4882a593Smuzhiyun 	u8     s_id[3];               /* FC vNIC only: Source S_ID */
447*4882a593Smuzhiyun 	u8     fcf_mac[ETH_ALEN];     /* FCF Target destination mac */
448*4882a593Smuzhiyun 	u16   _resvd1;
449*4882a593Smuzhiyun 	u32   r_a_tov;                /* R_A_TOV in msec */
450*4882a593Smuzhiyun 	u32   e_d_tov;                /* E_D_TOV in msec */
451*4882a593Smuzhiyun 	u8    ha_mac[ETH_ALEN];       /* Host adapter source mac */
452*4882a593Smuzhiyun 	u16   _resvd2;
453*4882a593Smuzhiyun };
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun /*
456*4882a593Smuzhiyun  * Basic structure for all fcpio structures that are sent from the host to the
457*4882a593Smuzhiyun  * firmware.  They are 128 bytes per structure.
458*4882a593Smuzhiyun  */
459*4882a593Smuzhiyun #define FCPIO_HOST_REQ_LEN      128     /* expected length of host requests */
460*4882a593Smuzhiyun 
461*4882a593Smuzhiyun struct fcpio_host_req {
462*4882a593Smuzhiyun 	struct fcpio_header hdr;
463*4882a593Smuzhiyun 
464*4882a593Smuzhiyun 	union {
465*4882a593Smuzhiyun 		/*
466*4882a593Smuzhiyun 		 * Defines space needed for request
467*4882a593Smuzhiyun 		 */
468*4882a593Smuzhiyun 		u8 buf[FCPIO_HOST_REQ_LEN - sizeof(struct fcpio_header)];
469*4882a593Smuzhiyun 
470*4882a593Smuzhiyun 		/*
471*4882a593Smuzhiyun 		 * Initiator host requests
472*4882a593Smuzhiyun 		 */
473*4882a593Smuzhiyun 		struct fcpio_icmnd_16               icmnd_16;
474*4882a593Smuzhiyun 		struct fcpio_icmnd_32               icmnd_32;
475*4882a593Smuzhiyun 		struct fcpio_itmf                   itmf;
476*4882a593Smuzhiyun 
477*4882a593Smuzhiyun 		/*
478*4882a593Smuzhiyun 		 * Target host requests
479*4882a593Smuzhiyun 		 */
480*4882a593Smuzhiyun 		struct fcpio_tdata                  tdata;
481*4882a593Smuzhiyun 		struct fcpio_txrdy                  txrdy;
482*4882a593Smuzhiyun 		struct fcpio_trsp                   trsp;
483*4882a593Smuzhiyun 		struct fcpio_ttmf_ack               ttmf_ack;
484*4882a593Smuzhiyun 		struct fcpio_tabort                 tabort;
485*4882a593Smuzhiyun 
486*4882a593Smuzhiyun 		/*
487*4882a593Smuzhiyun 		 * Misc requests
488*4882a593Smuzhiyun 		 */
489*4882a593Smuzhiyun 		struct fcpio_reset                  reset;
490*4882a593Smuzhiyun 		struct fcpio_flogi_reg              flogi_reg;
491*4882a593Smuzhiyun 		struct fcpio_echo                   echo;
492*4882a593Smuzhiyun 		struct fcpio_lunmap_req             lunmap_req;
493*4882a593Smuzhiyun 		struct fcpio_flogi_fip_reg          flogi_fip_reg;
494*4882a593Smuzhiyun 	} u;
495*4882a593Smuzhiyun };
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun /*
498*4882a593Smuzhiyun  * fcpio_icmnd_cmpl: firmware -> host response
499*4882a593Smuzhiyun  *
500*4882a593Smuzhiyun  * used for sending the host a response to an initiator command
501*4882a593Smuzhiyun  */
502*4882a593Smuzhiyun struct fcpio_icmnd_cmpl {
503*4882a593Smuzhiyun 	u8    _resvd0[6];             /* reserved */
504*4882a593Smuzhiyun 	u8    flags;                  /* response flags */
505*4882a593Smuzhiyun 	u8    scsi_status;            /* SCSI status */
506*4882a593Smuzhiyun 	u32   residual;               /* SCSI data residual length */
507*4882a593Smuzhiyun 	u32   sense_len;              /* SCSI sense length */
508*4882a593Smuzhiyun };
509*4882a593Smuzhiyun 
510*4882a593Smuzhiyun /*
511*4882a593Smuzhiyun  * response flags
512*4882a593Smuzhiyun  */
513*4882a593Smuzhiyun #define FCPIO_ICMND_CMPL_RESID_UNDER    0x08    /* resid under and valid */
514*4882a593Smuzhiyun #define FCPIO_ICMND_CMPL_RESID_OVER     0x04    /* resid over and valid */
515*4882a593Smuzhiyun 
516*4882a593Smuzhiyun /*
517*4882a593Smuzhiyun  * fcpio_itmf_cmpl: firmware -> host response
518*4882a593Smuzhiyun  *
519*4882a593Smuzhiyun  * used for sending the host a response for a itmf request
520*4882a593Smuzhiyun  */
521*4882a593Smuzhiyun struct fcpio_itmf_cmpl {
522*4882a593Smuzhiyun 	u32    _resvd;                /* reserved */
523*4882a593Smuzhiyun };
524*4882a593Smuzhiyun 
525*4882a593Smuzhiyun /*
526*4882a593Smuzhiyun  * fcpio_tcmnd_16: firmware -> host request
527*4882a593Smuzhiyun  *
528*4882a593Smuzhiyun  * used by the firmware to notify the host of an incoming target SCSI 16-Byte
529*4882a593Smuzhiyun  * request
530*4882a593Smuzhiyun  */
531*4882a593Smuzhiyun struct fcpio_tcmnd_16 {
532*4882a593Smuzhiyun 	u8    lun[LUN_ADDRESS];       /* FC vNIC only: LUN address */
533*4882a593Smuzhiyun 	u8    crn;                    /* SCSI Command Reference No. */
534*4882a593Smuzhiyun 	u8    pri_ta;                 /* SCSI Priority and Task attribute */
535*4882a593Smuzhiyun 	u8    _resvd2;                /* reserved: should be 0 */
536*4882a593Smuzhiyun 	u8    flags;                  /* command flags */
537*4882a593Smuzhiyun 	u8    scsi_cdb[CDB_16];       /* SCSI Cmnd Descriptor Block */
538*4882a593Smuzhiyun 	u32   data_len;               /* length of data expected */
539*4882a593Smuzhiyun 	u8    _resvd1;                /* reserved */
540*4882a593Smuzhiyun 	u8    s_id[3];		      /* FC vNIC only: Source S_ID */
541*4882a593Smuzhiyun };
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun /*
544*4882a593Smuzhiyun  * Priority/Task Attribute settings
545*4882a593Smuzhiyun  */
546*4882a593Smuzhiyun #define FCPIO_TCMND_PTA_SIMPLE      0   /* simple task attribute */
547*4882a593Smuzhiyun #define FCPIO_TCMND_PTA_HEADQ       1   /* head of queue task attribute */
548*4882a593Smuzhiyun #define FCPIO_TCMND_PTA_ORDERED     2   /* ordered task attribute */
549*4882a593Smuzhiyun #define FCPIO_TCMND_PTA_ACA         4   /* auto contingent allegiance */
550*4882a593Smuzhiyun #define FCPIO_TCMND_PRI_SHIFT       3   /* priority field starts in bit 3 */
551*4882a593Smuzhiyun 
552*4882a593Smuzhiyun /*
553*4882a593Smuzhiyun  * Command flags
554*4882a593Smuzhiyun  */
555*4882a593Smuzhiyun #define FCPIO_TCMND_RDDATA      0x02    /* read data */
556*4882a593Smuzhiyun #define FCPIO_TCMND_WRDATA      0x01    /* write data */
557*4882a593Smuzhiyun 
558*4882a593Smuzhiyun /*
559*4882a593Smuzhiyun  * fcpio_tcmnd_32: firmware -> host request
560*4882a593Smuzhiyun  *
561*4882a593Smuzhiyun  * used by the firmware to notify the host of an incoming target SCSI 32-Byte
562*4882a593Smuzhiyun  * request
563*4882a593Smuzhiyun  */
564*4882a593Smuzhiyun struct fcpio_tcmnd_32 {
565*4882a593Smuzhiyun 	u8    lun[LUN_ADDRESS];       /* FC vNIC only: LUN address */
566*4882a593Smuzhiyun 	u8    crn;                    /* SCSI Command Reference No. */
567*4882a593Smuzhiyun 	u8    pri_ta;                 /* SCSI Priority and Task attribute */
568*4882a593Smuzhiyun 	u8    _resvd2;                /* reserved: should be 0 */
569*4882a593Smuzhiyun 	u8    flags;                  /* command flags */
570*4882a593Smuzhiyun 	u8    scsi_cdb[CDB_32];       /* SCSI Cmnd Descriptor Block */
571*4882a593Smuzhiyun 	u32   data_len;               /* length of data expected */
572*4882a593Smuzhiyun 	u8    _resvd0;                /* reserved */
573*4882a593Smuzhiyun 	u8    s_id[3];		      /* FC vNIC only: Source S_ID */
574*4882a593Smuzhiyun };
575*4882a593Smuzhiyun 
576*4882a593Smuzhiyun /*
577*4882a593Smuzhiyun  * fcpio_tdrsp_cmpl: firmware -> host response
578*4882a593Smuzhiyun  *
579*4882a593Smuzhiyun  * used by the firmware to notify the host of a response to a host target
580*4882a593Smuzhiyun  * command
581*4882a593Smuzhiyun  */
582*4882a593Smuzhiyun struct fcpio_tdrsp_cmpl {
583*4882a593Smuzhiyun 	u16   rx_id;                  /* rx_id of the target request */
584*4882a593Smuzhiyun 	u16   _resvd0;                /* reserved */
585*4882a593Smuzhiyun };
586*4882a593Smuzhiyun 
587*4882a593Smuzhiyun /*
588*4882a593Smuzhiyun  * fcpio_ttmf: firmware -> host request
589*4882a593Smuzhiyun  *
590*4882a593Smuzhiyun  * used by the firmware to notify the host of an incoming task management
591*4882a593Smuzhiyun  * function request
592*4882a593Smuzhiyun  */
593*4882a593Smuzhiyun struct fcpio_ttmf {
594*4882a593Smuzhiyun 	u8    _resvd0;                /* reserved */
595*4882a593Smuzhiyun 	u8    s_id[3];		      /* FC vNIC only: Source S_ID */
596*4882a593Smuzhiyun 	u8    lun[LUN_ADDRESS];       /* FC vNIC only: LUN address */
597*4882a593Smuzhiyun 	u8    crn;                    /* SCSI Command Reference No. */
598*4882a593Smuzhiyun 	u8    _resvd2[3];             /* reserved */
599*4882a593Smuzhiyun 	u32   tmf_type;               /* task management request type */
600*4882a593Smuzhiyun };
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun /*
603*4882a593Smuzhiyun  * Task Management request
604*4882a593Smuzhiyun  */
605*4882a593Smuzhiyun #define FCPIO_TTMF_CLR_ACA      0x40    /* Clear ACA condition */
606*4882a593Smuzhiyun #define FCPIO_TTMF_LUN_RESET    0x10    /* logical unit reset task mgmt */
607*4882a593Smuzhiyun #define FCPIO_TTMF_CLR_TASK_SET 0x04    /* clear task set */
608*4882a593Smuzhiyun #define FCPIO_TTMF_ABT_TASK_SET 0x02    /* abort task set */
609*4882a593Smuzhiyun #define FCPIO_TTMF_ABT_TASK     0x01    /* abort task */
610*4882a593Smuzhiyun 
611*4882a593Smuzhiyun /*
612*4882a593Smuzhiyun  * fcpio_tabort_cmpl: firmware -> host response
613*4882a593Smuzhiyun  *
614*4882a593Smuzhiyun  * used by the firmware to respond to a host's tabort request
615*4882a593Smuzhiyun  */
616*4882a593Smuzhiyun struct fcpio_tabort_cmpl {
617*4882a593Smuzhiyun 	u16   rx_id;                  /* rx_id of the target request */
618*4882a593Smuzhiyun 	u16   _resvd0;                /* reserved */
619*4882a593Smuzhiyun };
620*4882a593Smuzhiyun 
621*4882a593Smuzhiyun /*
622*4882a593Smuzhiyun  * fcpio_ack: firmware -> host response
623*4882a593Smuzhiyun  *
624*4882a593Smuzhiyun  * used by firmware to notify the host of the last work request received
625*4882a593Smuzhiyun  */
626*4882a593Smuzhiyun struct fcpio_ack {
627*4882a593Smuzhiyun 	u16  request_out;             /* last host entry received */
628*4882a593Smuzhiyun 	u16  _resvd;
629*4882a593Smuzhiyun };
630*4882a593Smuzhiyun 
631*4882a593Smuzhiyun /*
632*4882a593Smuzhiyun  * fcpio_reset_cmpl: firmware -> host response
633*4882a593Smuzhiyun  *
634*4882a593Smuzhiyun  * use by firmware to respond to the host's reset request
635*4882a593Smuzhiyun  */
636*4882a593Smuzhiyun struct fcpio_reset_cmpl {
637*4882a593Smuzhiyun 	u16   vnic_id;
638*4882a593Smuzhiyun };
639*4882a593Smuzhiyun 
640*4882a593Smuzhiyun /*
641*4882a593Smuzhiyun  * fcpio_flogi_reg_cmpl: firmware -> host response
642*4882a593Smuzhiyun  *
643*4882a593Smuzhiyun  * fc vnic only
644*4882a593Smuzhiyun  * response to the fcpio_flogi_reg request
645*4882a593Smuzhiyun  */
646*4882a593Smuzhiyun struct fcpio_flogi_reg_cmpl {
647*4882a593Smuzhiyun 	u32 _resvd;
648*4882a593Smuzhiyun };
649*4882a593Smuzhiyun 
650*4882a593Smuzhiyun /*
651*4882a593Smuzhiyun  * fcpio_echo_cmpl: firmware -> host response
652*4882a593Smuzhiyun  *
653*4882a593Smuzhiyun  * response to the fcpio_echo request
654*4882a593Smuzhiyun  */
655*4882a593Smuzhiyun struct fcpio_echo_cmpl {
656*4882a593Smuzhiyun 	u32 _resvd;
657*4882a593Smuzhiyun };
658*4882a593Smuzhiyun 
659*4882a593Smuzhiyun /*
660*4882a593Smuzhiyun  * fcpio_lunmap_chng: firmware -> host notification
661*4882a593Smuzhiyun  *
662*4882a593Smuzhiyun  * scsi vnic only
663*4882a593Smuzhiyun  * notifies the host that the lunmap tables have changed
664*4882a593Smuzhiyun  */
665*4882a593Smuzhiyun struct fcpio_lunmap_chng {
666*4882a593Smuzhiyun 	u32 _resvd;
667*4882a593Smuzhiyun };
668*4882a593Smuzhiyun 
669*4882a593Smuzhiyun /*
670*4882a593Smuzhiyun  * fcpio_lunmap_req_cmpl: firmware -> host response
671*4882a593Smuzhiyun  *
672*4882a593Smuzhiyun  * scsi vnic only
673*4882a593Smuzhiyun  * response for lunmap table request from the host
674*4882a593Smuzhiyun  */
675*4882a593Smuzhiyun struct fcpio_lunmap_req_cmpl {
676*4882a593Smuzhiyun 	u32 _resvd;
677*4882a593Smuzhiyun };
678*4882a593Smuzhiyun 
679*4882a593Smuzhiyun /*
680*4882a593Smuzhiyun  * Basic structure for all fcpio structures that are sent from the firmware to
681*4882a593Smuzhiyun  * the host.  They are 64 bytes per structure.
682*4882a593Smuzhiyun  */
683*4882a593Smuzhiyun #define FCPIO_FW_REQ_LEN        64      /* expected length of fw requests */
684*4882a593Smuzhiyun struct fcpio_fw_req {
685*4882a593Smuzhiyun 	struct fcpio_header hdr;
686*4882a593Smuzhiyun 
687*4882a593Smuzhiyun 	union {
688*4882a593Smuzhiyun 		/*
689*4882a593Smuzhiyun 		 * Defines space needed for request
690*4882a593Smuzhiyun 		 */
691*4882a593Smuzhiyun 		u8 buf[FCPIO_FW_REQ_LEN - sizeof(struct fcpio_header)];
692*4882a593Smuzhiyun 
693*4882a593Smuzhiyun 		/*
694*4882a593Smuzhiyun 		 * Initiator firmware responses
695*4882a593Smuzhiyun 		 */
696*4882a593Smuzhiyun 		struct fcpio_icmnd_cmpl         icmnd_cmpl;
697*4882a593Smuzhiyun 		struct fcpio_itmf_cmpl          itmf_cmpl;
698*4882a593Smuzhiyun 
699*4882a593Smuzhiyun 		/*
700*4882a593Smuzhiyun 		 * Target firmware new requests
701*4882a593Smuzhiyun 		 */
702*4882a593Smuzhiyun 		struct fcpio_tcmnd_16           tcmnd_16;
703*4882a593Smuzhiyun 		struct fcpio_tcmnd_32           tcmnd_32;
704*4882a593Smuzhiyun 
705*4882a593Smuzhiyun 		/*
706*4882a593Smuzhiyun 		 * Target firmware responses
707*4882a593Smuzhiyun 		 */
708*4882a593Smuzhiyun 		struct fcpio_tdrsp_cmpl         tdrsp_cmpl;
709*4882a593Smuzhiyun 		struct fcpio_ttmf               ttmf;
710*4882a593Smuzhiyun 		struct fcpio_tabort_cmpl        tabort_cmpl;
711*4882a593Smuzhiyun 
712*4882a593Smuzhiyun 		/*
713*4882a593Smuzhiyun 		 * Firmware response to work received
714*4882a593Smuzhiyun 		 */
715*4882a593Smuzhiyun 		struct fcpio_ack                ack;
716*4882a593Smuzhiyun 
717*4882a593Smuzhiyun 		/*
718*4882a593Smuzhiyun 		 * Misc requests
719*4882a593Smuzhiyun 		 */
720*4882a593Smuzhiyun 		struct fcpio_reset_cmpl         reset_cmpl;
721*4882a593Smuzhiyun 		struct fcpio_flogi_reg_cmpl     flogi_reg_cmpl;
722*4882a593Smuzhiyun 		struct fcpio_echo_cmpl          echo_cmpl;
723*4882a593Smuzhiyun 		struct fcpio_lunmap_chng        lunmap_chng;
724*4882a593Smuzhiyun 		struct fcpio_lunmap_req_cmpl    lunmap_req_cmpl;
725*4882a593Smuzhiyun 	} u;
726*4882a593Smuzhiyun };
727*4882a593Smuzhiyun 
728*4882a593Smuzhiyun /*
729*4882a593Smuzhiyun  * Access routines to encode and decode the color bit, which is the most
730*4882a593Smuzhiyun  * significant bit of the MSB of the structure
731*4882a593Smuzhiyun  */
fcpio_color_enc(struct fcpio_fw_req * fw_req,u8 color)732*4882a593Smuzhiyun static inline void fcpio_color_enc(struct fcpio_fw_req *fw_req, u8 color)
733*4882a593Smuzhiyun {
734*4882a593Smuzhiyun 	u8 *c = ((u8 *) fw_req) + sizeof(struct fcpio_fw_req) - 1;
735*4882a593Smuzhiyun 
736*4882a593Smuzhiyun 	if (color)
737*4882a593Smuzhiyun 		*c |= 0x80;
738*4882a593Smuzhiyun 	else
739*4882a593Smuzhiyun 		*c &= ~0x80;
740*4882a593Smuzhiyun }
741*4882a593Smuzhiyun 
fcpio_color_dec(struct fcpio_fw_req * fw_req,u8 * color)742*4882a593Smuzhiyun static inline void fcpio_color_dec(struct fcpio_fw_req *fw_req, u8 *color)
743*4882a593Smuzhiyun {
744*4882a593Smuzhiyun 	u8 *c = ((u8 *) fw_req) + sizeof(struct fcpio_fw_req) - 1;
745*4882a593Smuzhiyun 
746*4882a593Smuzhiyun 	*color = *c >> 7;
747*4882a593Smuzhiyun 
748*4882a593Smuzhiyun 	/*
749*4882a593Smuzhiyun 	 * Make sure color bit is read from desc *before* other fields
750*4882a593Smuzhiyun 	 * are read from desc.  Hardware guarantees color bit is last
751*4882a593Smuzhiyun 	 * bit (byte) written.  Adding the rmb() prevents the compiler
752*4882a593Smuzhiyun 	 * and/or CPU from reordering the reads which would potentially
753*4882a593Smuzhiyun 	 * result in reading stale values.
754*4882a593Smuzhiyun 	 */
755*4882a593Smuzhiyun 
756*4882a593Smuzhiyun 	rmb();
757*4882a593Smuzhiyun 
758*4882a593Smuzhiyun }
759*4882a593Smuzhiyun 
760*4882a593Smuzhiyun /*
761*4882a593Smuzhiyun  * Lunmap table entry for scsi vnics
762*4882a593Smuzhiyun  */
763*4882a593Smuzhiyun #define FCPIO_LUNMAP_TABLE_SIZE     256
764*4882a593Smuzhiyun #define FCPIO_FLAGS_LUNMAP_VALID    0x80
765*4882a593Smuzhiyun #define FCPIO_FLAGS_BOOT            0x01
766*4882a593Smuzhiyun struct fcpio_lunmap_entry {
767*4882a593Smuzhiyun 	u8    bus;
768*4882a593Smuzhiyun 	u8    target;
769*4882a593Smuzhiyun 	u8    lun;
770*4882a593Smuzhiyun 	u8    path_cnt;
771*4882a593Smuzhiyun 	u16   flags;
772*4882a593Smuzhiyun 	u16   update_cnt;
773*4882a593Smuzhiyun };
774*4882a593Smuzhiyun 
775*4882a593Smuzhiyun struct fcpio_lunmap_tbl {
776*4882a593Smuzhiyun 	u32                   update_cnt;
777*4882a593Smuzhiyun 	struct fcpio_lunmap_entry   lunmaps[FCPIO_LUNMAP_TABLE_SIZE];
778*4882a593Smuzhiyun };
779*4882a593Smuzhiyun 
780*4882a593Smuzhiyun #endif /* _FCPIO_H_ */
781