1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#ifndef __FCPPROTO_H__
19#define __FCPPROTO_H__
20
21#include <protocol/scsi.h>
22
23#pragma pack(1)
24
25enum {
26 FCP_RJT = 0x01000000,
27 FCP_SRR_ACCEPT = 0x02000000,
28 FCP_SRR = 0x14000000,
29};
30
31
32
33
34struct fc_srr_s{
35 u32 ls_cmd;
36 u32 ox_id:16;
37 u32 rx_id:16;
38 u32 ro;
39 u32 r_ctl:8;
40 u32 res:24;
41};
42
43
44
45
46
47#define FCP_CMND_CDB_LEN 16
48#define FCP_CMND_LUN_LEN 8
49
50struct fcp_cmnd_s{
51 lun_t lun;
52 u8 crn;
53#ifdef __BIGENDIAN
54 u8 resvd:1,
55 priority:4,
56 taskattr:3;
57#else
58 u8 taskattr:3,
59 priority:4,
60 resvd:1;
61#endif
62 u8 tm_flags;
63#ifdef __BIGENDIAN
64 u8 addl_cdb_len:6,
65 iodir:2;
66#else
67 u8 iodir:2,
68 addl_cdb_len:6;
69#endif
70 struct scsi_cdb_s cdb;
71
72
73
74
75 u32 fcp_dl;
76};
77
78#define fcp_cmnd_cdb_len(_cmnd) ((_cmnd)->addl_cdb_len * 4 + FCP_CMND_CDB_LEN)
79#define fcp_cmnd_fcpdl(_cmnd) ((&(_cmnd)->fcp_dl)[(_cmnd)->addl_cdb_len])
80
81
82
83
84enum fcp_iodir{
85 FCP_IODIR_NONE = 0,
86 FCP_IODIR_WRITE = 1,
87 FCP_IODIR_READ = 2,
88 FCP_IODIR_RW = 3,
89};
90
91
92
93
94enum {
95 FCP_TASK_ATTR_SIMPLE = 0,
96 FCP_TASK_ATTR_HOQ = 1,
97 FCP_TASK_ATTR_ORDERED = 2,
98 FCP_TASK_ATTR_ACA = 4,
99 FCP_TASK_ATTR_UNTAGGED = 5,
100};
101
102
103
104
105#ifndef BIT
106#define BIT(_x) (1 << (_x))
107#endif
108enum fcp_tm_cmnd{
109 FCP_TM_ABORT_TASK_SET = BIT(1),
110 FCP_TM_CLEAR_TASK_SET = BIT(2),
111 FCP_TM_LUN_RESET = BIT(4),
112 FCP_TM_TARGET_RESET = BIT(5),
113 FCP_TM_CLEAR_ACA = BIT(6),
114};
115
116
117
118
119struct fcp_xfer_rdy_s{
120 u32 data_ro;
121 u32 burst_len;
122 u32 reserved;
123};
124
125
126
127
128enum fcp_residue{
129 FCP_NO_RESIDUE = 0,
130 FCP_RESID_OVER = 1,
131 FCP_RESID_UNDER = 2,
132};
133
134enum {
135 FCP_RSPINFO_GOOD = 0,
136 FCP_RSPINFO_DATALEN_MISMATCH = 1,
137 FCP_RSPINFO_CMND_INVALID = 2,
138 FCP_RSPINFO_ROLEN_MISMATCH = 3,
139 FCP_RSPINFO_TM_NOT_SUPP = 4,
140 FCP_RSPINFO_TM_FAILED = 5,
141};
142
143struct fcp_rspinfo_s{
144 u32 res0:24;
145 u32 rsp_code:8;
146 u32 res1;
147};
148
149struct fcp_resp_s{
150 u32 reserved[2];
151 u16 reserved2;
152#ifdef __BIGENDIAN
153 u8 reserved3:3;
154 u8 fcp_conf_req:1;
155 u8 resid_flags:2;
156 u8 sns_len_valid:1;
157 u8 rsp_len_valid:1;
158#else
159 u8 rsp_len_valid:1;
160 u8 sns_len_valid:1;
161 u8 resid_flags:2;
162 u8 fcp_conf_req:1;
163 u8 reserved3:3;
164#endif
165 u8 scsi_status;
166 u32 residue;
167 u32 sns_len;
168 u32 rsp_len;
169};
170
171#define fcp_snslen(__fcprsp) ((__fcprsp)->sns_len_valid ? \
172 (__fcprsp)->sns_len : 0)
173#define fcp_rsplen(__fcprsp) ((__fcprsp)->rsp_len_valid ? \
174 (__fcprsp)->rsp_len : 0)
175#define fcp_rspinfo(__fcprsp) ((struct fcp_rspinfo_s *)((__fcprsp) + 1))
176#define fcp_snsinfo(__fcprsp) (((u8 *)fcp_rspinfo(__fcprsp)) + \
177 fcp_rsplen(__fcprsp))
178
179struct fcp_cmnd_fr_s{
180 struct fchs_s fchs;
181 struct fcp_cmnd_s fcp;
182};
183
184#pragma pack()
185
186#endif
187