xref: /dragonfly/sys/bus/cam/scsi/scsi_sg.h (revision 07f9383ee515180efb54f5e0a106b66aabb875a5)
1 /*
2  * Structures and definitions for SCSI commands to the SG passthrough device.
3  *
4  * $FreeBSD: src/sys/cam/scsi/scsi_sg.h,v 1.2 2007/04/10 20:03:42 scottl Exp $
5  */
6 
7 #ifndef _SCSI_SG_H
8 #define _SCSI_SG_H
9 
10 #include <sys/ioccom.h>
11 
12 #define SGIOC       '"'
13 #define SG_SET_TIMEOUT                  _IO(SGIOC, 0x01)
14 #define SG_GET_TIMEOUT                  _IO(SGIOC, 0x02)
15 #define SG_EMULATED_HOST      _IO(SGIOC, 0x03)
16 #define SG_SET_TRANSFORM      _IO(SGIOC, 0x04)
17 #define SG_GET_TRANSFORM      _IO(SGIOC, 0x05)
18 #define SG_GET_COMMAND_Q      _IO(SGIOC, 0x70)
19 #define SG_SET_COMMAND_Q      _IO(SGIOC, 0x71)
20 #define SG_GET_RESERVED_SIZE  _IO(SGIOC, 0x72)
21 #define SG_SET_RESERVED_SIZE  _IO(SGIOC, 0x75)
22 #define SG_GET_SCSI_ID                  _IO(SGIOC, 0x76)
23 #define SG_SET_FORCE_LOW_DMA  _IO(SGIOC, 0x79)
24 #define SG_GET_LOW_DMA                  _IO(SGIOC, 0x7a)
25 #define SG_SET_FORCE_PACK_ID  _IO(SGIOC, 0x7b)
26 #define SG_GET_PACK_ID                  _IO(SGIOC, 0x7c)
27 #define SG_GET_NUM_WAITING    _IO(SGIOC, 0x7d)
28 #define SG_SET_DEBUG                    _IO(SGIOC, 0x7e)
29 #define SG_GET_SG_TABLESIZE   _IO(SGIOC, 0x7f)
30 #define SG_GET_VERSION_NUM    _IO(SGIOC, 0x82)
31 #define SG_NEXT_CMD_LEN                 _IO(SGIOC, 0x83)
32 #define SG_SCSI_RESET                   _IO(SGIOC, 0x84)
33 #define SG_IO                           _IO(SGIOC, 0x85)
34 #define SG_GET_REQUEST_TABLE  _IO(SGIOC, 0x86)
35 #define SG_SET_KEEP_ORPHAN    _IO(SGIOC, 0x87)
36 #define SG_GET_KEEP_ORPHAN    _IO(SGIOC, 0x88)
37 #define SG_GET_ACCESS_COUNT   _IO(SGIOC, 0x89)
38 
39 struct sg_io_hdr {
40           int                 interface_id;
41           int                 dxfer_direction;
42           u_char              cmd_len;
43           u_char              mx_sb_len;
44           u_short             iovec_count;
45           u_int               dxfer_len;
46           void                *dxferp;
47           u_char              *cmdp;
48           u_char              *sbp;
49           u_int               timeout;
50           u_int               flags;
51           int                 pack_id;
52           void                *usr_ptr;
53           u_char              status;
54           u_char              masked_status;
55           u_char              msg_status;
56           u_char              sb_len_wr;
57           u_short             host_status;
58           u_short             driver_status;
59           int                 resid;
60           u_int               duration;
61           u_int               info;
62 };
63 
64 #define SG_DXFER_NONE                   -1
65 #define SG_DXFER_TO_DEV                 -2
66 #define SG_DXFER_FROM_DEV     -3
67 #define SG_DXFER_TO_FROM_DEV  -4
68 #define SG_DXFER_UNKNOWN      -5
69 
70 #define SG_MAX_SENSE            16
71 
72 struct sg_header {
73           int                 pack_len;
74           int                 reply_len;
75           int                 pack_id;
76           int                 result;
77           u_int               twelve_byte:1;
78           u_int               target_status:5;
79           u_int               host_status:8;
80           u_int               driver_status:8;
81           u_int               other_flags:10;
82           u_char              sense_buffer[SG_MAX_SENSE];
83 };
84 
85 struct sg_scsi_id {
86           int                 host_no;
87           int                 channel;
88           int                 scsi_id;
89           int                 lun;
90           int                 scsi_type;
91           short               h_cmd_per_lun;
92           short               d_queue_depth;
93           int                 unused[2];
94 };
95 
96 struct scsi_idlun {
97           uint32_t  dev_id;
98           uint32_t  host_unique_id;
99 };
100 
101 /*
102  * Host codes
103  */
104 #define DID_OK                0x00      /* OK */
105 #define DID_NO_CONNECT        0x01      /* timeout during connect */
106 #define DID_BUS_BUSY          0x02      /* timeout during command */
107 #define DID_TIME_OUT          0x03      /* other timeout */
108 #define DID_BAD_TARGET        0x04      /* bad target */
109 #define DID_ABORT   0x05      /* abort */
110 #define DID_PARITY  0x06      /* parity error */
111 #define DID_ERROR   0x07      /* internal error */
112 #define DID_RESET   0x08      /* reset by somebody */
113 #define DID_BAD_INTR          0x09      /* unexpected interrupt */
114 #define DID_PASSTHROUGH       0x0a      /* passthrough */
115 #define DID_SOFT_ERROR        0x0b      /* low driver wants retry */
116 #define DID_IMM_RETRY         0x0c      /* retry without decreasing retrycnt */
117 
118 /*
119  * Driver codes
120  */
121 #define DRIVER_OK   0x00
122 #define DRIVER_BUSY 0x01
123 #define DRIVER_SOFT 0x02
124 #define DRIVER_MEDIA          0x03
125 #define DRIVER_ERROR          0x04
126 
127 #define DRIVER_INVALID        0x05
128 #define DRIVER_TIMEOUT        0x06
129 #define DRIVER_HARD 0x07
130 #define DRIVER_SENSE          0x08
131 
132 #define SUGGEST_RETRY         0x10
133 #define SUGGEST_ABORT         0x20
134 #define SUGGEST_REMAP         0x30
135 #define SUGGEST_DIE 0x40
136 #define SUGGEST_SENSE         0x80
137 #define SUGGEST_IS_OK         0xff
138 
139 #define DRIVER_MASK 0x0f
140 #define SUGGEST_MASK          0xf0
141 
142 /* Other definitions */
143 /* HZ isn't always available, so simulate it */
144 #define SG_DEFAULT_HZ                   1000
145 #define SG_DEFAULT_TIMEOUT    (60*SG_DEFAULT_HZ)
146 
147 #endif /* !_SCSI_SG_H */
148