Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 *, int); |
| 49 | extern void scsi_release_request(struct scsi_request *); |
| 50 | extern void scsi_wait_req(struct scsi_request *, const void *cmnd, |
| 51 | void *buffer, unsigned bufflen, |
| 52 | int timeout, int retries); |
| 53 | extern void scsi_do_req(struct scsi_request *, const void *cmnd, |
| 54 | void *buffer, unsigned bufflen, |
| 55 | void (*done) (struct scsi_cmnd *), |
| 56 | int timeout, int retries); |
| 57 | |
| 58 | struct scsi_mode_data { |
| 59 | __u32 length; |
| 60 | __u16 block_descriptor_length; |
| 61 | __u8 medium_type; |
| 62 | __u8 device_specific; |
| 63 | __u8 header_length; |
| 64 | __u8 longlba:1; |
| 65 | }; |
| 66 | |
| 67 | extern int __scsi_mode_sense(struct scsi_request *SRpnt, int dbd, |
| 68 | int modepage, unsigned char *buffer, int len, |
| 69 | int timeout, int retries, |
| 70 | struct scsi_mode_data *data); |
| 71 | |
| 72 | |
| 73 | #endif /* _SCSI_SCSI_REQUEST_H */ |