1#ifndef _SCSI_SCSI_CMND_H
2#define _SCSI_SCSI_CMND_H
3
4#include <linux/dma-mapping.h>
5#include <linux/blkdev.h>
6#include <linux/list.h>
7#include <linux/types.h>
8#include <linux/timer.h>
9#include <linux/scatterlist.h>
10#include <scsi/scsi_device.h>
11
12struct Scsi_Host;
13struct scsi_driver;
14
15#include <scsi/scsi_device.h>
16
17
18
19
20
21
22
23
24
25
26
27
28
29#define MAX_COMMAND_SIZE 16
30#if (MAX_COMMAND_SIZE > BLK_MAX_CDB)
31# error MAX_COMMAND_SIZE can not be bigger than BLK_MAX_CDB
32#endif
33
34struct scsi_data_buffer {
35 struct sg_table table;
36 unsigned length;
37 int resid;
38};
39
40
41struct scsi_pointer {
42 char *ptr;
43 int this_residual;
44 struct scatterlist *buffer;
45 int buffers_residual;
46
47 dma_addr_t dma_handle;
48
49 volatile int Status;
50 volatile int Message;
51 volatile int have_data_in;
52 volatile int sent_command;
53 volatile int phase;
54};
55
56
57#define SCMD_TAGGED (1 << 0)
58
59struct scsi_cmnd {
60 struct scsi_device *device;
61 struct list_head list;
62 struct list_head eh_entry;
63 struct delayed_work abort_work;
64 int eh_eflags;
65
66
67
68
69
70
71
72
73
74 unsigned long serial_number;
75
76
77
78
79
80
81 unsigned long jiffies_at_alloc;
82
83 int retries;
84 int allowed;
85
86 unsigned char prot_op;
87 unsigned char prot_type;
88 unsigned char prot_flags;
89
90 unsigned short cmd_len;
91 enum dma_data_direction sc_data_direction;
92
93
94 unsigned char *cmnd;
95
96
97
98 struct scsi_data_buffer sdb;
99 struct scsi_data_buffer *prot_sdb;
100
101 unsigned underflow;
102
103
104 unsigned transfersize;
105
106
107
108
109
110 struct request *request;
111
112
113#define SCSI_SENSE_BUFFERSIZE 96
114 unsigned char *sense_buffer;
115
116
117
118
119
120
121 void (*scsi_done) (struct scsi_cmnd *);
122
123
124
125
126
127 struct scsi_pointer SCp;
128
129 unsigned char *host_scribble;
130
131
132
133
134
135
136
137 int result;
138 int flags;
139
140 unsigned char tag;
141};
142
143
144
145
146
147static inline void *scsi_cmd_priv(struct scsi_cmnd *cmd)
148{
149 return cmd + 1;
150}
151
152
153static inline struct scsi_driver *scsi_cmd_to_driver(struct scsi_cmnd *cmd)
154{
155 return *(struct scsi_driver **)cmd->request->rq_disk->private_data;
156}
157
158extern struct scsi_cmnd *scsi_get_command(struct scsi_device *, gfp_t);
159extern void scsi_put_command(struct scsi_cmnd *);
160extern void scsi_finish_command(struct scsi_cmnd *cmd);
161
162extern void *scsi_kmap_atomic_sg(struct scatterlist *sg, int sg_count,
163 size_t *offset, size_t *len);
164extern void scsi_kunmap_atomic_sg(void *virt);
165
166extern int scsi_init_io(struct scsi_cmnd *cmd);
167
168extern int scsi_dma_map(struct scsi_cmnd *cmd);
169extern void scsi_dma_unmap(struct scsi_cmnd *cmd);
170
171static inline unsigned scsi_sg_count(struct scsi_cmnd *cmd)
172{
173 return cmd->sdb.table.nents;
174}
175
176static inline struct scatterlist *scsi_sglist(struct scsi_cmnd *cmd)
177{
178 return cmd->sdb.table.sgl;
179}
180
181static inline unsigned scsi_bufflen(struct scsi_cmnd *cmd)
182{
183 return cmd->sdb.length;
184}
185
186static inline void scsi_set_resid(struct scsi_cmnd *cmd, int resid)
187{
188 cmd->sdb.resid = resid;
189}
190
191static inline int scsi_get_resid(struct scsi_cmnd *cmd)
192{
193 return cmd->sdb.resid;
194}
195
196#define scsi_for_each_sg(cmd, sg, nseg, __i) \
197 for_each_sg(scsi_sglist(cmd), sg, nseg, __i)
198
199static inline int scsi_bidi_cmnd(struct scsi_cmnd *cmd)
200{
201 return blk_bidi_rq(cmd->request) &&
202 (cmd->request->next_rq->special != NULL);
203}
204
205static inline struct scsi_data_buffer *scsi_in(struct scsi_cmnd *cmd)
206{
207 return scsi_bidi_cmnd(cmd) ?
208 cmd->request->next_rq->special : &cmd->sdb;
209}
210
211static inline struct scsi_data_buffer *scsi_out(struct scsi_cmnd *cmd)
212{
213 return &cmd->sdb;
214}
215
216static inline int scsi_sg_copy_from_buffer(struct scsi_cmnd *cmd,
217 void *buf, int buflen)
218{
219 return sg_copy_from_buffer(scsi_sglist(cmd), scsi_sg_count(cmd),
220 buf, buflen);
221}
222
223static inline int scsi_sg_copy_to_buffer(struct scsi_cmnd *cmd,
224 void *buf, int buflen)
225{
226 return sg_copy_to_buffer(scsi_sglist(cmd), scsi_sg_count(cmd),
227 buf, buflen);
228}
229
230
231
232
233
234enum scsi_prot_operations {
235
236 SCSI_PROT_NORMAL = 0,
237
238
239 SCSI_PROT_READ_INSERT,
240 SCSI_PROT_WRITE_STRIP,
241
242
243 SCSI_PROT_READ_STRIP,
244 SCSI_PROT_WRITE_INSERT,
245
246
247 SCSI_PROT_READ_PASS,
248 SCSI_PROT_WRITE_PASS,
249};
250
251static inline void scsi_set_prot_op(struct scsi_cmnd *scmd, unsigned char op)
252{
253 scmd->prot_op = op;
254}
255
256static inline unsigned char scsi_get_prot_op(struct scsi_cmnd *scmd)
257{
258 return scmd->prot_op;
259}
260
261enum scsi_prot_flags {
262 SCSI_PROT_TRANSFER_PI = 1 << 0,
263 SCSI_PROT_GUARD_CHECK = 1 << 1,
264 SCSI_PROT_REF_CHECK = 1 << 2,
265 SCSI_PROT_REF_INCREMENT = 1 << 3,
266 SCSI_PROT_IP_CHECKSUM = 1 << 4,
267};
268
269
270
271
272
273
274
275enum scsi_prot_target_type {
276 SCSI_PROT_DIF_TYPE0 = 0,
277 SCSI_PROT_DIF_TYPE1,
278 SCSI_PROT_DIF_TYPE2,
279 SCSI_PROT_DIF_TYPE3,
280};
281
282static inline void scsi_set_prot_type(struct scsi_cmnd *scmd, unsigned char type)
283{
284 scmd->prot_type = type;
285}
286
287static inline unsigned char scsi_get_prot_type(struct scsi_cmnd *scmd)
288{
289 return scmd->prot_type;
290}
291
292static inline sector_t scsi_get_lba(struct scsi_cmnd *scmd)
293{
294 return blk_rq_pos(scmd->request);
295}
296
297static inline unsigned int scsi_prot_interval(struct scsi_cmnd *scmd)
298{
299 return scmd->device->sector_size;
300}
301
302static inline u32 scsi_prot_ref_tag(struct scsi_cmnd *scmd)
303{
304 return blk_rq_pos(scmd->request) >>
305 (ilog2(scsi_prot_interval(scmd)) - 9) & 0xffffffff;
306}
307
308static inline unsigned scsi_prot_sg_count(struct scsi_cmnd *cmd)
309{
310 return cmd->prot_sdb ? cmd->prot_sdb->table.nents : 0;
311}
312
313static inline struct scatterlist *scsi_prot_sglist(struct scsi_cmnd *cmd)
314{
315 return cmd->prot_sdb ? cmd->prot_sdb->table.sgl : NULL;
316}
317
318static inline struct scsi_data_buffer *scsi_prot(struct scsi_cmnd *cmd)
319{
320 return cmd->prot_sdb;
321}
322
323#define scsi_for_each_prot_sg(cmd, sg, nseg, __i) \
324 for_each_sg(scsi_prot_sglist(cmd), sg, nseg, __i)
325
326static inline void set_msg_byte(struct scsi_cmnd *cmd, char status)
327{
328 cmd->result = (cmd->result & 0xffff00ff) | (status << 8);
329}
330
331static inline void set_host_byte(struct scsi_cmnd *cmd, char status)
332{
333 cmd->result = (cmd->result & 0xff00ffff) | (status << 16);
334}
335
336static inline void set_driver_byte(struct scsi_cmnd *cmd, char status)
337{
338 cmd->result = (cmd->result & 0x00ffffff) | (status << 24);
339}
340
341static inline unsigned scsi_transfer_length(struct scsi_cmnd *scmd)
342{
343 unsigned int xfer_len = scsi_out(scmd)->length;
344 unsigned int prot_interval = scsi_prot_interval(scmd);
345
346 if (scmd->prot_flags & SCSI_PROT_TRANSFER_PI)
347 xfer_len += (xfer_len >> ilog2(prot_interval)) * 8;
348
349 return xfer_len;
350}
351
352#endif
353