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