28#define TEST_UNIT_READY 0x00
29#define REZERO_UNIT 0x01
30#define REQUEST_SENSE 0x03
31#define FORMAT_UNIT 0x04
32#define READ_BLOCK_LIMITS 0x05
33#define REASSIGN_BLOCKS 0x07
37#define READ_REVERSE 0x0f
38#define WRITE_FILEMARKS 0x10
41#define RECOVER_BUFFERED_DATA 0x14
42#define MODE_SELECT 0x15
47#define MODE_SENSE 0x1a
48#define START_STOP 0x1b
49#define RECEIVE_DIAGNOSTIC 0x1c
50#define SEND_DIAGNOSTIC 0x1d
51#define ALLOW_MEDIUM_REMOVAL 0x1e
53#define SET_WINDOW 0x24
54#define READ_CAPACITY 0x25
58#define WRITE_VERIFY 0x2e
60#define SEARCH_HIGH 0x30
61#define SEARCH_EQUAL 0x31
62#define SEARCH_LOW 0x32
63#define SET_LIMITS 0x33
65#define READ_POSITION 0x34
66#define SYNCHRONIZE_CACHE 0x35
67#define LOCK_UNLOCK_CACHE 0x36
68#define READ_DEFECT_DATA 0x37
69#define MEDIUM_SCAN 0x38
71#define COPY_VERIFY 0x3a
72#define WRITE_BUFFER 0x3b
73#define READ_BUFFER 0x3c
74#define UPDATE_BLOCK 0x3d
76#define WRITE_LONG 0x3f
77#define CHANGE_DEFINITION 0x40
78#define WRITE_SAME 0x41
80#define LOG_SELECT 0x4c
82#define MODE_SELECT_10 0x55
83#define RESERVE_10 0x56
84#define RELEASE_10 0x57
85#define MODE_SENSE_10 0x5a
86#define PERSISTENT_RESERVE_IN 0x5e
87#define PERSISTENT_RESERVE_OUT 0x5f
88#define MOVE_MEDIUM 0xa5
91#define WRITE_VERIFY_12 0xae
92#define SEARCH_HIGH_12 0xb0
93#define SEARCH_EQUAL_12 0xb1
94#define SEARCH_LOW_12 0xb2
95#define READ_ELEMENT_STATUS 0xb8
96#define SEND_VOLUME_TAG 0xb6
97#define WRITE_LONG_2 0xea
103#define CHECK_CONDITION 0x01
104#define CONDITION_GOOD 0x02
106#define INTERMEDIATE_GOOD 0x08
107#define INTERMEDIATE_C_GOOD 0x0a
108#define RESERVATION_CONFLICT 0x0c
109#define COMMAND_TERMINATED 0x11
110#define QUEUE_FULL 0x14
111#define STATUS_MASK 0x3e
118#define RECOVERED_ERROR 0x01
119#define NOT_READY 0x02
120#define MEDIUM_ERROR 0x03
121#define HARDWARE_ERROR 0x04
122#define ILLEGAL_REQUEST 0x05
123#define UNIT_ATTENTION 0x06
124#define DATA_PROTECT 0x07
125#define BLANK_CHECK 0x08
126#define COPY_ABORTED 0x0a
127#define ABORTED_COMMAND 0x0b
128#define VOLUME_OVERFLOW 0x0d
129#define MISCOMPARE 0x0e
135#define TYPE_DISK 0x00
136#define TYPE_TAPE 0x01
137#define TYPE_PROCESSOR 0x03
138#define TYPE_WORM 0x04
139#define TYPE_CDROM 0x05
140#define TYPE_SCANNER 0x06
143#define TYPE_MEDIUM_CHANGER 0x08
144#define TYPE_COMM 0x09
145#define TYPE_ENCLOSURE 0x0d
146#define TYPE_NO_LUN 0x7f
151#define COMMAND_COMPLETE 0x00
152#define EXTENDED_MESSAGE 0x01
153#define EXTENDED_MODIFY_DATA_POINTER 0x00
154#define EXTENDED_SDTR 0x01
155#define EXTENDED_EXTENDED_IDENTIFY 0x02
156#define EXTENDED_WDTR 0x03
157#define SAVE_POINTERS 0x02
158#define RESTORE_POINTERS 0x03
159#define DISCONNECT 0x04
160#define INITIATOR_ERROR 0x05
162#define MESSAGE_REJECT 0x07
164#define MSG_PARITY_ERROR 0x09
165#define LINKED_CMD_COMPLETE 0x0a
166#define LINKED_FLG_CMD_COMPLETE 0x0b
167#define BUS_DEVICE_RESET 0x0c
169#define INITIATE_RECOVERY 0x0f
170#define RELEASE_RECOVERY 0x10
172#define SIMPLE_QUEUE_TAG 0x20
173#define HEAD_OF_QUEUE_TAG 0x21
174#define ORDERED_QUEUE_TAG 0x22
180#define SCSI_IOCTL_GET_IDLUN 0x5382
184#define SCSI_IOCTL_TAGGED_ENABLE 0x5383
185#define SCSI_IOCTL_TAGGED_DISABLE 0x5384
188#define SCSI_IOCTL_PROBE_HOST 0x5385
191#define SCSI_IOCTL_GET_BUS_NUMBER 0x5386
195typedef struct scatterlist
203#define ISA_DMA_THRESHOLD (0x00ffffff)
213#define SCSI_DATA_UNKNOWN 0
214#define SCSI_DATA_WRITE 1
215#define SCSI_DATA_READ 2
216#define SCSI_DATA_NONE 3
230#define SCSI_TIMEOUT (5*HZ)
232#define SCSI_TIMEOUT (2*HZ)
247#define status_byte(result) (((result) >> 1) & 0x1f)
248#define msg_byte(result) (((result) >> 8) & 0xff)
249#define host_byte(result) (((result) >> 16) & 0xff)
250#define driver_byte(result) (((result) >> 24) & 0xff)
251#define suggestion(result) (driver_byte(result) & SUGGEST_MASK)
253#define sense_class(sense) (((sense) >> 4) & 0x7)
254#define sense_error(sense) ((sense) & 0xf)
255#define sense_valid(sense) ((sense) & 0x80);
257#define NEEDS_RETRY 0x2001
258#define SUCCESS 0x2002
261#define SOFT_ERROR 0x2005
262#define ADD_TO_MLQUEUE 0x2006
267#define SCSI_STATE_TIMEOUT 0x1000
268#define SCSI_STATE_FINISHED 0x1001
269#define SCSI_STATE_FAILED 0x1002
270#define SCSI_STATE_QUEUED 0x1003
271#define SCSI_STATE_UNUSED 0x1006
272#define SCSI_STATE_DISCONNECTING 0x1008
273#define SCSI_STATE_INITIALIZING 0x1009
274#define SCSI_STATE_BHQUEUE 0x100a
275#define SCSI_STATE_MLQUEUE 0x100b
281#define SCSI_OWNER_HIGHLEVEL 0x100
282#define SCSI_OWNER_MIDLEVEL 0x101
283#define SCSI_OWNER_LOWLEVEL 0x102
284#define SCSI_OWNER_ERROR_HANDLER 0x103
285#define SCSI_OWNER_BH_HANDLER 0x104
286#define SCSI_OWNER_NOBODY 0x105
308#define DID_NO_CONNECT 0x01
309#define DID_BUS_BUSY 0x02
310#define DID_TIME_OUT 0x03
311#define DID_BAD_TARGET 0x04
312#define DID_ABORT 0x05
313#define DID_PARITY 0x06
314#define DID_ERROR 0x07
315#define DID_RESET 0x08
316#define DID_BAD_INTR 0x09
317#define DID_PASSTHROUGH 0x0a
318#define DID_SOFT_ERROR 0x0b
319#define DRIVER_OK 0x00
324#define DRIVER_BUSY 0x01
325#define DRIVER_SOFT 0x02
326#define DRIVER_MEDIA 0x03
327#define DRIVER_ERROR 0x04
329#define DRIVER_INVALID 0x05
330#define DRIVER_TIMEOUT 0x06
331#define DRIVER_HARD 0x07
332#define DRIVER_SENSE 0x08
334#define SUGGEST_RETRY 0x10
335#define SUGGEST_ABORT 0x20
336#define SUGGEST_REMAP 0x30
337#define SUGGEST_DIE 0x40
338#define SUGGEST_SENSE 0x80
339#define SUGGEST_IS_OK 0xff
341#define DRIVER_MASK 0x0f
342#define SUGGEST_MASK 0xf0
344#define MAX_COMMAND_SIZE 12
345#define SCSI_SENSE_BUFFERSIZE 64
351#define SCSI_UNKNOWN 0
370#define WAS_RESET 0x01
371#define WAS_TIMEDOUT 0x02
372#define WAS_SENSE 0x04
373#define IS_RESETTING 0x08
374#define IS_ABORTING 0x10
375#define ASKED_FOR_SENSE 0x20
376#define SYNC_RESET 0x40
385#define SCSI_CMND_MAGIC 0xE25C23A5
386#define SCSI_REQ_MAGIC 0x75F6D354
389#define RQ_INACTIVE (-1)
391#define RQ_SCSI_BUSY 0xffff
392#define RQ_SCSI_DONE 0xfffe
393#define RQ_SCSI_DISCONNECTING 0xffe0
408 uint32_t hard_sector, hard_nr_sectors;
409 uint32_t nr_segments;
410 uint32_t nr_hw_segments;
411 uint32_t current_nr_sectors;
414 struct buffer_head *bh;
415 struct buffer_head *bhtail;
424typedef struct scsi_pointer
428 struct scatterlist *buffer;
429 int buffers_residual;
432 volatile int Message;
433 volatile int have_data_in;
434 volatile int sent_command;
448typedef struct scsi_cmnd
450 struct umas_data *umas;
465 uint32_t serial_number;
472 uint8_t sc_data_direction;
473 uint8_t sc_old_data_direction;
476 uint8_t cmnd[MAX_COMMAND_SIZE];
477 uint32_t request_bufflen;
479 uint8_t *request_buff;
482 uint8_t data_cmnd[MAX_COMMAND_SIZE];
489 uint32_t transfersize;
494 struct request request;
496 uint8_t sense_buffer[SCSI_SENSE_BUFFERSIZE];
506#define NORMAL_TIMEOUT 0
511#define SCSI_MLQUEUE_HOST_BUSY 0x1055
512#define SCSI_MLQUEUE_DEVICE_BUSY 0x1056
517#define SCSI_TRY_RESET_DEVICE 1
518#define SCSI_TRY_RESET_BUS 2
519#define SCSI_TRY_RESET_HOST 3