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