1#ifndef _SCSI_SCSI_CMND_H
2#define _SCSI_SCSI_CMND_H
3
4#include <linux/dma-mapping.h>
5#include <linux/list.h>
6#include <linux/types.h>
7#include <linux/timer.h>
8
9struct request;
10struct scatterlist;
11struct Scsi_Host;
12struct scsi_device;
13
14
15/* embedded in scsi_cmnd */
16struct scsi_pointer {
17	char *ptr;		/* data pointer */
18	int this_residual;	/* left in this buffer */
19	struct scatterlist *buffer;	/* which buffer */
20	int buffers_residual;	/* how many buffers left */
21
22        dma_addr_t dma_handle;
23
24	volatile int Status;
25	volatile int Message;
26	volatile int have_data_in;
27	volatile int sent_command;
28	volatile int phase;
29};
30
31struct scsi_cmnd {
32	struct scsi_device *device;
33	struct list_head list;  /* scsi_cmnd participates in queue lists */
34	struct list_head eh_entry; /* entry for the host eh_cmd_q */
35	int eh_eflags;		/* Used by error handlr */
36	void (*done) (struct scsi_cmnd *);	/* Mid-level done function */
37
38	/*
39	 * A SCSI Command is assigned a nonzero serial_number before passed
40	 * to the driver's queue command function.  The serial_number is
41	 * cleared when scsi_done is entered indicating that the command
42	 * has been completed.  It currently doesn't have much use other
43	 * than printk's.  Some lldd's use this number for other purposes.
44	 * It's almost certain that such usages are either incorrect or
45	 * meaningless.  Please kill all usages other than printk's.  Also,
46	 * as this number is always identical to ->pid, please convert
47	 * printk's to use ->pid, so that we can kill this field.
48	 */
49	unsigned long serial_number;
50	/*
51	 * This is set to jiffies as it was when the command was first
52	 * allocated.  It is used to time how long the command has
53	 * been outstanding
54	 */
55	unsigned long jiffies_at_alloc;
56
57	int retries;
58	int allowed;
59	int timeout_per_command;
60
61	unsigned char cmd_len;
62	enum dma_data_direction sc_data_direction;
63
64	/* These elements define the operation we are about to perform */
65#define MAX_COMMAND_SIZE	16
66	unsigned char cmnd[MAX_COMMAND_SIZE];
67	unsigned request_bufflen;	/* Actual request size */
68
69	struct timer_list eh_timeout;	/* Used to time out the command. */
70	void *request_buffer;		/* Actual requested buffer */
71
72	/* These elements define the operation we ultimately want to perform */
73	unsigned short use_sg;	/* Number of pieces of scatter-gather */
74	unsigned short sglist_len;	/* size of malloc'd scatter-gather list */
75
76	unsigned underflow;	/* Return error if less than
77				   this amount is transferred */
78
79	unsigned transfersize;	/* How much we are guaranteed to
80				   transfer with each SCSI transfer
81				   (ie, between disconnect /
82				   reconnects.   Probably == sector
83				   size */
84
85	int resid;		/* Number of bytes requested to be
86				   transferred less actual number
87				   transferred (0 if not supported) */
88
89	struct request *request;	/* The command we are
90				   	   working on */
91
92#define SCSI_SENSE_BUFFERSIZE 	96
93	unsigned char sense_buffer[SCSI_SENSE_BUFFERSIZE];
94				/* obtained by REQUEST SENSE when
95				 * CHECK CONDITION is received on original
96				 * command (auto-sense) */
97
98	/* Low-level done function - can be used by low-level driver to point
99	 *        to completion function.  Not used by mid/upper level code. */
100	void (*scsi_done) (struct scsi_cmnd *);
101
102	/*
103	 * The following fields can be written to by the host specific code.
104	 * Everything else should be left alone.
105	 */
106	struct scsi_pointer SCp;	/* Scratchpad used by some host adapters */
107
108	unsigned char *host_scribble;	/* The host adapter is allowed to
109					 * call scsi_malloc and get some memory
110					 * and hang it here.  The host adapter
111					 * is also expected to call scsi_free
112					 * to release this memory.  (The memory
113					 * obtained by scsi_malloc is guaranteed
114					 * to be at an address < 16Mb). */
115
116	int result;		/* Status code from lower level driver */
117
118	unsigned char tag;	/* SCSI-II queued command tag */
119	unsigned long pid;	/* Process ID, starts at 0. Unique per host. */
120};
121
122extern struct scsi_cmnd *scsi_get_command(struct scsi_device *, gfp_t);
123extern struct scsi_cmnd *__scsi_get_command(struct Scsi_Host *, gfp_t);
124extern void scsi_put_command(struct scsi_cmnd *);
125extern void __scsi_put_command(struct Scsi_Host *, struct scsi_cmnd *,
126			       struct device *);
127extern void scsi_io_completion(struct scsi_cmnd *, unsigned int);
128extern void scsi_finish_command(struct scsi_cmnd *cmd);
129extern void scsi_req_abort_cmd(struct scsi_cmnd *cmd);
130
131extern void *scsi_kmap_atomic_sg(struct scatterlist *sg, int sg_count,
132				 size_t *offset, size_t *len);
133extern void scsi_kunmap_atomic_sg(void *virt);
134
135extern struct scatterlist *scsi_alloc_sgtable(struct scsi_cmnd *, gfp_t);
136extern void scsi_free_sgtable(struct scatterlist *, int);
137
138#endif /* _SCSI_SCSI_CMND_H */
139