• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/scsi/fnic/
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 */
39enum 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 */
83enum 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 */
126struct 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
136static inline void
137fcpio_tag_id_enc(struct fcpio_tag *tag, u32 id)
138{
139	tag->u.req_id = id;
140}
141
142static inline void
143fcpio_tag_id_dec(struct fcpio_tag *tag, u32 *id)
144{
145	*id = tag->u.req_id;
146}
147
148static inline void
149fcpio_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
155static inline void
156fcpio_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 */
166struct 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
173static inline void
174fcpio_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
184static inline void
185fcpio_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 */
203struct 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 */
251struct 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 */
282struct 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 */
297enum 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 */
312struct 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 */
332struct 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 */
347struct 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 */
370struct 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 */
382struct 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 */
392struct fcpio_reset {
393	u32   _resvd;
394};
395
396enum 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 */
408struct 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 */
422struct 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 */
432struct 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 */
444struct 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
461struct 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 */
502struct 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 */
521struct 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 */
531struct 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 */
564struct 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 */
582struct 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 */
593struct 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 */
616struct 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 */
626struct 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 */
636struct 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 */
646struct 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 */
655struct 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 */
665struct 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 */
675struct 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 */
684struct 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 */
732static 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
742static 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
766struct 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
775struct fcpio_lunmap_tbl {
776	u32                   update_cnt;
777	struct fcpio_lunmap_entry   lunmaps[FCPIO_LUNMAP_TABLE_SIZE];
778};
779
780#endif /* _FCPIO_H_ */
781