Merge branch 'bugfix' of git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen...
[firefly-linux-kernel-4.4.55.git] / drivers / scsi / fnic / fcpio.h
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
137 fcpio_tag_id_enc(struct fcpio_tag *tag, u32 id)
138 {
139         tag->u.req_id = id;
140 }
141
142 static inline void
143 fcpio_tag_id_dec(struct fcpio_tag *tag, u32 *id)
144 {
145         *id = tag->u.req_id;
146 }
147
148 static inline void
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
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
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
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  */
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
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_ */