1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 struct atascsi;
20
21
22
23
24
25 #define ATA_C_READDMA_EXT 0x25
26 #define ATA_C_READ_LOG_EXT 0x2f
27 #define ATA_C_WRITEDMA_EXT 0x35
28 #define ATA_C_READ_FPDMA 0x60
29 #define ATA_C_WRITE_FPDMA 0x61
30 #define ATA_C_PACKET 0xa0
31 #define ATA_C_READDMA 0xc8
32 #define ATA_C_WRITEDMA 0xca
33 #define ATA_C_FLUSH_CACHE 0xe7
34 #define ATA_C_FLUSH_CACHE_EXT 0xea
35 #define ATA_C_IDENTIFY 0xec
36 #define ATA_C_SEC_FREEZE_LOCK 0xf5
37
38 struct ata_identify {
39 u_int16_t config;
40 u_int16_t ncyls;
41 u_int16_t reserved1;
42 u_int16_t nheads;
43 u_int16_t track_size;
44 u_int16_t sector_size;
45 u_int16_t nsectors;
46 u_int16_t reserved2[3];
47 u_int8_t serial[20];
48 u_int16_t buffer_type;
49 u_int16_t buffer_size;
50 u_int16_t ecc;
51 u_int8_t firmware[8];
52 u_int8_t model[40];
53 u_int16_t multi;
54 u_int16_t dwcap;
55 u_int16_t cap;
56 u_int16_t reserved3;
57 u_int16_t piomode;
58 u_int16_t dmamode;
59 u_int16_t validinfo;
60 u_int16_t curcyls;
61 u_int16_t curheads;
62 u_int16_t cursectrk;
63 u_int16_t curseccp[2];
64 u_int16_t mult2;
65 u_int16_t addrsec[2];
66 u_int16_t worddma;
67 u_int16_t dworddma;
68 u_int16_t advpiomode;
69 u_int16_t minmwdma;
70 u_int16_t recmwdma;
71 u_int16_t minpio;
72 u_int16_t minpioflow;
73 u_int16_t reserved4[2];
74 u_int16_t typtime[2];
75 u_int16_t reserved5[2];
76 u_int16_t qdepth;
77 u_int16_t satacap;
78 u_int16_t reserved6;
79 u_int16_t satafsup;
80 u_int16_t satafen;
81 u_int16_t majver;
82 u_int16_t minver;
83 u_int16_t cmdset82;
84 u_int16_t cmdset83;
85 u_int16_t cmdset84;
86 u_int16_t features85;
87 u_int16_t features86;
88 u_int16_t features87;
89 u_int16_t ultradma;
90 u_int16_t erasetime;
91 u_int16_t erasetimex;
92 u_int16_t apm;
93 u_int16_t masterpw;
94 u_int16_t hwreset;
95 u_int16_t acoustic;
96 u_int16_t stream_min;
97 u_int16_t stream_xfer_d;
98 u_int16_t stream_lat;
99 u_int16_t streamperf[2];
100 u_int16_t addrsecxt[4];
101 u_int16_t stream_xfer_p;
102 u_int16_t padding1;
103 u_int16_t phys_sect_sz;
104 u_int16_t seek_delay;
105 u_int16_t naa_ieee_oui;
106 u_int16_t ieee_oui_uid;
107 u_int16_t uid_mid;
108 u_int16_t uid_low;
109 u_int16_t resv_wwn[4];
110 u_int16_t incits;
111 u_int16_t words_lsec[2];
112 u_int16_t cmdset119;
113 u_int16_t features120;
114 u_int16_t padding2[6];
115 u_int16_t rmsn;
116 u_int16_t securestatus;
117 u_int16_t vendor[31];
118 u_int16_t padding3[16];
119 u_int16_t curmedser[30];
120 u_int16_t sctsupport;
121 u_int16_t padding4[48];
122 u_int16_t integrity;
123 } __packed;
124
125
126
127
128
129 #define ATA_FIS_LENGTH 20
130
131 struct ata_fis_h2d {
132 u_int8_t type;
133 #define ATA_FIS_TYPE_H2D 0x27
134 u_int8_t flags;
135 #define ATA_H2D_FLAGS_CMD (1<<7)
136 u_int8_t command;
137 u_int8_t features;
138 #define ATA_H2D_FEATURES_DMA (1<<0)
139 #define ATA_H2D_FEATURES_DIR (1<<2)
140 #define ATA_H2D_FEATURES_DIR_READ (1<<2)
141 #define ATA_H2D_FEATURES_DIR_WRITE (0<<2)
142
143 u_int8_t lba_low;
144 u_int8_t lba_mid;
145 u_int8_t lba_high;
146 u_int8_t device;
147 #define ATA_H2D_DEVICE_LBA 0x40
148
149 u_int8_t lba_low_exp;
150 u_int8_t lba_mid_exp;
151 u_int8_t lba_high_exp;
152 u_int8_t features_exp;
153
154 u_int8_t sector_count;
155 u_int8_t sector_count_exp;
156 u_int8_t reserved0;
157 u_int8_t control;
158
159 u_int8_t reserved1;
160 u_int8_t reserved2;
161 u_int8_t reserved3;
162 u_int8_t reserved4;
163 } __packed;
164
165 struct ata_fis_d2h {
166 u_int8_t type;
167 #define ATA_FIS_TYPE_D2H 0x34
168 u_int8_t flags;
169 #define ATA_D2H_FLAGS_INTR (1<<6)
170 u_int8_t status;
171 u_int8_t error;
172
173 u_int8_t lba_low;
174 u_int8_t lba_mid;
175 u_int8_t lba_high;
176 u_int8_t device;
177
178 u_int8_t lba_low_exp;
179 u_int8_t lba_mid_exp;
180 u_int8_t lba_high_exp;
181 u_int8_t reserved0;
182
183 u_int8_t sector_count;
184 u_int8_t sector_count_exp;
185 u_int8_t reserved1;
186 u_int8_t reserved2;
187
188 u_int8_t reserved3;
189 u_int8_t reserved4;
190 u_int8_t reserved5;
191 u_int8_t reserved6;
192 } __packed;
193
194
195
196
197
198 struct ata_log_page_10h {
199 struct ata_fis_d2h err_regs;
200 #define ATA_LOG_10H_TYPE_NOTQUEUED 0x80
201 #define ATA_LOG_10H_TYPE_TAG_MASK 0x1f
202 u_int8_t reserved[256 - sizeof(struct ata_fis_d2h)];
203 u_int8_t vendor_specific[255];
204 u_int8_t checksum;
205 } __packed;
206
207
208
209
210
211 #define SATA_SStatus_DET 0x00f
212 #define SATA_SStatus_DET_NODEV 0x000
213 #define SATA_SStatus_DET_NOPHY 0x001
214 #define SATA_SStatus_DET_DEV 0x003
215 #define SATA_SStatus_DET_OFFLINE 0x008
216
217 #define SATA_SStatus_SPD 0x0f0
218 #define SATA_SStatus_SPD_NONE 0x000
219 #define SATA_SStatus_SPD_1_5 0x010
220 #define SATA_SStatus_SPD_3_0 0x020
221
222 #define SATA_SStatus_IPM 0xf00
223 #define SATA_SStatus_IPM_NODEV 0x000
224 #define SATA_SStatus_IPM_ACTIVE 0x100
225 #define SATA_SStatus_IPM_PARTIAL 0x200
226 #define SATA_SStatus_IPM_SLUMBER 0x600
227
228 #define SATA_SIGNATURE_PORT_MULTIPLIER 0x96690101
229 #define SATA_SIGNATURE_ATAPI 0xeb140101
230 #define SATA_SIGNATURE_DISK 0x00000101
231
232
233
234
235
236 struct ata_port {
237 struct atascsi *ap_as;
238 int ap_port;
239 int ap_type;
240 #define ATA_PORT_T_NONE 0
241 #define ATA_PORT_T_DISK 1
242 #define ATA_PORT_T_ATAPI 2
243 int ap_features;
244 #define ATA_PORT_F_PROBED (1 << 0)
245 int ap_ncqdepth;
246 };
247
248 struct ata_xfer {
249 struct ata_fis_h2d *fis;
250 struct ata_fis_d2h rfis;
251 u_int8_t *packetcmd;
252 u_int8_t tag;
253
254 u_int8_t *data;
255 size_t datalen;
256 size_t resid;
257
258 void (*complete)(struct ata_xfer *);
259 struct timeout stimeout;
260 u_int timeout;
261
262 int flags;
263 #define ATA_F_READ (1<<0)
264 #define ATA_F_WRITE (1<<1)
265 #define ATA_F_NOWAIT (1<<2)
266 #define ATA_F_POLL (1<<3)
267 #define ATA_F_PIO (1<<4)
268 #define ATA_F_PACKET (1<<5)
269 #define ATA_F_NCQ (1<<6)
270 volatile int state;
271 #define ATA_S_SETUP 0
272 #define ATA_S_PENDING 1
273 #define ATA_S_COMPLETE 2
274 #define ATA_S_ERROR 3
275 #define ATA_S_TIMEOUT 4
276 #define ATA_S_ONCHIP 5
277 #define ATA_S_PUT 6
278
279 void *atascsi_private;
280
281 void (*ata_put_xfer)(struct ata_xfer *);
282 };
283
284 #define ATA_QUEUED 0
285 #define ATA_COMPLETE 1
286 #define ATA_ERROR 2
287
288
289
290
291
292 struct atascsi_methods {
293 int (*probe)(void *, int);
294 struct ata_xfer * (*ata_get_xfer)(void *, int );
295 int (*ata_cmd)(struct ata_xfer *);
296 };
297
298 struct atascsi_attach_args {
299 void *aaa_cookie;
300
301 struct atascsi_methods *aaa_methods;
302 void (*aaa_minphys)(struct buf *);
303 int aaa_nports;
304 int aaa_ncmds;
305 int aaa_capability;
306 #define ASAA_CAP_NCQ (1 << 0)
307 #define ASAA_CAP_NEEDS_RESERVED (1 << 1)
308 };
309
310 struct atascsi *atascsi_attach(struct device *, struct atascsi_attach_args *);
311 int atascsi_detach(struct atascsi *);
312
313 int atascsi_probe_dev(struct atascsi *, int);
314 int atascsi_detach_dev(struct atascsi *, int);