Merge branch 'origin'
[linux-2.6] / include / scsi / scsi_request.h
1 #ifndef _SCSI_SCSI_REQUEST_H
2 #define _SCSI_SCSI_REQUEST_H
3
4 #include <scsi/scsi_cmnd.h>
5
6 struct request;
7 struct scsi_cmnd;
8 struct scsi_device;
9 struct Scsi_Host;
10
11
12 /*
13  * This is essentially a slimmed down version of Scsi_Cmnd.  The point of
14  * having this is that requests that are injected into the queue as result
15  * of things like ioctls and character devices shouldn't be using a
16  * Scsi_Cmnd until such a time that the command is actually at the head
17  * of the queue and being sent to the driver.
18  */
19 struct scsi_request {
20         int     sr_magic;
21         int     sr_result;      /* Status code from lower level driver */
22         unsigned char sr_sense_buffer[SCSI_SENSE_BUFFERSIZE];           /* obtained by REQUEST SENSE
23                                                  * when CHECK CONDITION is
24                                                  * received on original command 
25                                                  * (auto-sense) */
26
27         struct Scsi_Host *sr_host;
28         struct scsi_device *sr_device;
29         struct scsi_cmnd *sr_command;
30         struct request *sr_request;     /* A copy of the command we are
31                                    working on */
32         unsigned sr_bufflen;    /* Size of data buffer */
33         void *sr_buffer;                /* Data buffer */
34         int sr_allowed;
35         enum dma_data_direction sr_data_direction;
36         unsigned char sr_cmd_len;
37         unsigned char sr_cmnd[MAX_COMMAND_SIZE];
38         void (*sr_done) (struct scsi_cmnd *);   /* Mid-level done function */
39         int sr_timeout_per_command;
40         unsigned short sr_use_sg;       /* Number of pieces of scatter-gather */
41         unsigned short sr_sglist_len;   /* size of malloc'd scatter-gather list */
42         unsigned sr_underflow;  /* Return error if less than
43                                    this amount is transferred */
44         void *upper_private_data;       /* reserved for owner (usually upper
45                                            level driver) of this request */
46 };
47
48 extern struct scsi_request *scsi_allocate_request(struct scsi_device *, gfp_t);
49 extern void scsi_release_request(struct scsi_request *);
50 extern void scsi_do_req(struct scsi_request *, const void *cmnd,
51                         void *buffer, unsigned bufflen,
52                         void (*done) (struct scsi_cmnd *),
53                         int timeout, int retries);
54 #endif /* _SCSI_SCSI_REQUEST_H */