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