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