This source file includes following definitions.
- ahci_lookup_device
- ahci_no_match
- ahci_vt8251_attach
- ahci_pci_match
- ahci_pci_attach
- ahci_map_regs
- ahci_unmap_regs
- ahci_map_intr
- ahci_unmap_intr
- ahci_init
- ahci_port_alloc
- ahci_port_free
- ahci_port_start
- ahci_port_stop
- ahci_port_clo
- ahci_port_softreset
- ahci_port_portreset
- ahci_load_prdt
- ahci_unload_prdt
- ahci_poll
- ahci_start
- ahci_issue_pending_ncq_commands
- ahci_issue_pending_commands
- ahci_intr
- ahci_port_intr
- ahci_get_ccb
- ahci_put_ccb
- ahci_get_err_ccb
- ahci_put_err_ccb
- ahci_port_read_ncq_error
- ahci_dmamem_alloc
- ahci_dmamem_free
- ahci_read
- ahci_write
- ahci_wait_ne
- ahci_pread
- ahci_pwrite
- ahci_pwait_eq
- ahci_ata_probe
- ahci_ata_get_xfer
- ahci_ata_put_xfer
- ahci_ata_cmd
- ahci_ata_cmd_done
- ahci_ata_cmd_timeout
- ahci_empty_done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #include <sys/param.h>
20 #include <sys/systm.h>
21 #include <sys/buf.h>
22 #include <sys/kernel.h>
23 #include <sys/malloc.h>
24 #include <sys/device.h>
25 #include <sys/proc.h>
26 #include <sys/queue.h>
27
28 #include <machine/bus.h>
29
30 #include <dev/pci/pcireg.h>
31 #include <dev/pci/pcivar.h>
32 #include <dev/pci/pcidevs.h>
33
34 #include <dev/ata/atascsi.h>
35
36
37 #define NO_AHCI_DEBUG
38
39 #ifdef AHCI_DEBUG
40 #define DPRINTF(m, f...) do { if ((ahcidebug & (m)) == (m)) printf(f); } \
41 while (0)
42 #define AHCI_D_TIMEOUT 0x00
43 #define AHCI_D_VERBOSE 0x01
44 #define AHCI_D_INTR 0x02
45 #define AHCI_D_XFER 0x08
46 int ahcidebug = AHCI_D_VERBOSE;
47 #else
48 #define DPRINTF(m, f...)
49 #endif
50
51 #define AHCI_PCI_BAR 0x24
52 #define AHCI_PCI_INTERFACE 0x01
53
54 #define AHCI_REG_CAP 0x000
55 #define AHCI_REG_CAP_NP(_r) (((_r) & 0x1f)+1)
56 #define AHCI_REG_CAP_SXS (1<<5)
57 #define AHCI_REG_CAP_EMS (1<<6)
58 #define AHCI_REG_CAP_CCCS (1<<7)
59 #define AHCI_REG_CAP_NCS(_r) ((((_r) & 0x1f00)>>8)+1)
60 #define AHCI_REG_CAP_PSC (1<<13)
61 #define AHCI_REG_CAP_SSC (1<<14)
62 #define AHCI_REG_CAP_PMD (1<<15)
63 #define AHCI_REG_CAP_FBSS (1<<16)
64 #define AHCI_REG_CAP_SPM (1<<17)
65 #define AHCI_REG_CAP_SAM (1<<18)
66 #define AHCI_REG_CAP_SNZO (1<<19)
67 #define AHCI_REG_CAP_ISS (0xf<<20)
68 #define AHCI_REG_CAP_ISS_G1 (0x1<<20)
69 #define AHCI_REG_CAP_ISS_G1_2 (0x2<<20)
70 #define AHCI_REG_CAP_SCLO (1<<24)
71 #define AHCI_REG_CAP_SAL (1<<25)
72 #define AHCI_REG_CAP_SALP (1<<26)
73 #define AHCI_REG_CAP_SSS (1<<27)
74 #define AHCI_REG_CAP_SMPS (1<<28)
75 #define AHCI_REG_CAP_SSNTF (1<<29)
76 #define AHCI_REG_CAP_SNCQ (1<<30)
77 #define AHCI_REG_CAP_S64A (1<<31)
78 #define AHCI_FMT_CAP "\020" "\040S64A" "\037NCQ" "\036SSNTF" \
79 "\035SMPS" "\034SSS" "\033SALP" "\032SAL" \
80 "\031SCLO" "\024SNZO" "\023SAM" "\022SPM" \
81 "\021FBSS" "\020PMD" "\017SSC" "\016PSC" \
82 "\010CCCS" "\007EMS" "\006SXS"
83 #define AHCI_REG_GHC 0x004
84 #define AHCI_REG_GHC_HR (1<<0)
85 #define AHCI_REG_GHC_IE (1<<1)
86 #define AHCI_REG_GHC_MRSM (1<<2)
87 #define AHCI_REG_GHC_AE (1<<31)
88 #define AHCI_FMT_GHC "\020" "\040AE" "\003MRSM" "\002IE" "\001HR"
89 #define AHCI_REG_IS 0x008
90 #define AHCI_REG_PI 0x00c
91 #define AHCI_REG_VS 0x010
92 #define AHCI_REG_VS_0_95 0x00000905
93 #define AHCI_REG_VS_1_0 0x00010000
94 #define AHCI_REG_VS_1_1 0x00010100
95 #define AHCI_REG_CCC_CTL 0x014
96 #define AHCI_REG_CCC_CTL_INT(_r) (((_r) & 0xf8) >> 3)
97 #define AHCI_REG_CCC_PORTS 0x018
98 #define AHCI_REG_EM_LOC 0x01c
99 #define AHCI_REG_EM_CTL 0x020
100
101 #define AHCI_PORT_REGION(_p) (0x100 + ((_p) * 0x80))
102 #define AHCI_PORT_SIZE 0x80
103
104 #define AHCI_PREG_CLB 0x00
105 #define AHCI_PREG_CLBU 0x04
106 #define AHCI_PREG_FB 0x08
107 #define AHCI_PREG_FBU 0x0c
108 #define AHCI_PREG_IS 0x10
109 #define AHCI_PREG_IS_DHRS (1<<0)
110 #define AHCI_PREG_IS_PSS (1<<1)
111 #define AHCI_PREG_IS_DSS (1<<2)
112 #define AHCI_PREG_IS_SDBS (1<<3)
113 #define AHCI_PREG_IS_UFS (1<<4)
114 #define AHCI_PREG_IS_DPS (1<<5)
115 #define AHCI_PREG_IS_PCS (1<<6)
116 #define AHCI_PREG_IS_DMPS (1<<7)
117 #define AHCI_PREG_IS_PRCS (1<<22)
118 #define AHCI_PREG_IS_IPMS (1<<23)
119 #define AHCI_PREG_IS_OFS (1<<24)
120 #define AHCI_PREG_IS_INFS (1<<26)
121 #define AHCI_PREG_IS_IFS (1<<27)
122 #define AHCI_PREG_IS_HBDS (1<<28)
123 #define AHCI_PREG_IS_HBFS (1<<29)
124 #define AHCI_PREG_IS_TFES (1<<30)
125 #define AHCI_PREG_IS_CPDS (1<<31)
126 #define AHCI_PFMT_IS "\20" "\040CPDS" "\037TFES" "\036HBFS" \
127 "\035HBDS" "\034IFS" "\033INFS" "\031OFS" \
128 "\030IPMS" "\027PRCS" "\010DMPS" "\006DPS" \
129 "\007PCS" "\005UFS" "\004SDBS" "\003DSS" \
130 "\002PSS" "\001DHRS"
131 #define AHCI_PREG_IE 0x14
132 #define AHCI_PREG_IE_DHRE (1<<0)
133 #define AHCI_PREG_IE_PSE (1<<1)
134 #define AHCI_PREG_IE_DSE (1<<2)
135 #define AHCI_PREG_IE_SDBE (1<<3)
136 #define AHCI_PREG_IE_UFE (1<<4)
137 #define AHCI_PREG_IE_DPE (1<<5)
138 #define AHCI_PREG_IE_PCE (1<<6)
139 #define AHCI_PREG_IE_DMPE (1<<7)
140 #define AHCI_PREG_IE_PRCE (1<<22)
141 #define AHCI_PREG_IE_IPME (1<<23)
142 #define AHCI_PREG_IE_OFE (1<<24)
143 #define AHCI_PREG_IE_INFE (1<<26)
144 #define AHCI_PREG_IE_IFE (1<<27)
145 #define AHCI_PREG_IE_HBDE (1<<28)
146 #define AHCI_PREG_IE_HBFE (1<<29)
147 #define AHCI_PREG_IE_TFEE (1<<30)
148 #define AHCI_PREG_IE_CPDE (1<<31)
149 #define AHCI_PFMT_IE "\20" "\040CPDE" "\037TFEE" "\036HBFE" \
150 "\035HBDE" "\034IFE" "\033INFE" "\031OFE" \
151 "\030IPME" "\027PRCE" "\010DMPE" "\007PCE" \
152 "\006DPE" "\005UFE" "\004SDBE" "\003DSE" \
153 "\002PSE" "\001DHRE"
154 #define AHCI_PREG_CMD 0x18
155 #define AHCI_PREG_CMD_ST (1<<0)
156 #define AHCI_PREG_CMD_SUD (1<<1)
157 #define AHCI_PREG_CMD_POD (1<<2)
158 #define AHCI_PREG_CMD_CLO (1<<3)
159 #define AHCI_PREG_CMD_FRE (1<<4)
160 #define AHCI_PREG_CMD_CCS(_r) (((_r) >> 8) & 0x1f)
161 #define AHCI_PREG_CMD_MPSS (1<<13)
162 #define AHCI_PREG_CMD_FR (1<<14)
163 #define AHCI_PREG_CMD_CR (1<<15)
164 #define AHCI_PREG_CMD_CPS (1<<16)
165 #define AHCI_PREG_CMD_PMA (1<<17)
166 #define AHCI_PREG_CMD_HPCP (1<<18)
167 #define AHCI_PREG_CMD_MPSP (1<<19)
168 #define AHCI_PREG_CMD_CPD (1<<20)
169 #define AHCI_PREG_CMD_ESP (1<<21)
170 #define AHCI_PREG_CMD_ATAPI (1<<24)
171 #define AHCI_PREG_CMD_DLAE (1<<25)
172 #define AHCI_PREG_CMD_ALPE (1<<26)
173 #define AHCI_PREG_CMD_ASP (1<<27)
174 #define AHCI_PREG_CMD_ICC 0xf0000000
175 #define AHCI_PREG_CMD_ICC_SLUMBER 0x60000000
176 #define AHCI_PREG_CMD_ICC_PARTIAL 0x20000000
177 #define AHCI_PREG_CMD_ICC_ACTIVE 0x10000000
178 #define AHCI_PREG_CMD_ICC_IDLE 0x00000000
179 #define AHCI_PFMT_CMD "\020" "\034ASP" "\033ALPE" "\032DLAE" \
180 "\031ATAPI" "\026ESP" "\025CPD" "\024MPSP" \
181 "\023HPCP" "\022PMA" "\021CPS" "\020CR" \
182 "\017FR" "\016MPSS" "\005FRE" "\004CLO" \
183 "\003POD" "\002SUD" "\001ST"
184 #define AHCI_PREG_TFD 0x20
185 #define AHCI_PREG_TFD_STS 0xff
186 #define AHCI_PREG_TFD_STS_ERR (1<<0)
187 #define AHCI_PREG_TFD_STS_DRQ (1<<3)
188 #define AHCI_PREG_TFD_STS_BSY (1<<7)
189 #define AHCI_PREG_TFD_ERR 0xff00
190 #define AHCI_PFMT_TFD_STS "\20" "\010BSY" "\004DRQ" "\001ERR"
191 #define AHCI_PREG_SIG 0x24
192 #define AHCI_PREG_SSTS 0x28
193 #define AHCI_PREG_SSTS_DET 0xf
194 #define AHCI_PREG_SSTS_DET_NONE 0x0
195 #define AHCI_PREG_SSTS_DET_DEV_NE 0x1
196 #define AHCI_PREG_SSTS_DET_DEV 0x3
197 #define AHCI_PREG_SSTS_DET_PHYOFFLINE 0x4
198 #define AHCI_PREG_SSTS_SPD 0xf0
199 #define AHCI_PREG_SSTS_SPD_NONE 0x00
200 #define AHCI_PREG_SSTS_SPD_GEN1 0x10
201 #define AHCI_PREG_SSTS_SPD_GEN2 0x20
202 #define AHCI_PREG_SSTS_IPM 0xf00
203 #define AHCI_PREG_SSTS_IPM_NONE 0x000
204 #define AHCI_PREG_SSTS_IPM_ACTIVE 0x100
205 #define AHCI_PREG_SSTS_IPM_PARTIAL 0x200
206 #define AHCI_PREG_SSTS_IPM_SLUMBER 0x600
207 #define AHCI_PREG_SCTL 0x2c
208 #define AHCI_PREG_SCTL_DET 0xf
209 #define AHCI_PREG_SCTL_DET_NONE 0x0
210 #define AHCI_PREG_SCTL_DET_INIT 0x1
211 #define AHCI_PREG_SCTL_DET_DISABLE 0x4
212 #define AHCI_PREG_SCTL_SPD 0xf0
213 #define AHCI_PREG_SCTL_SPD_ANY 0x00
214 #define AHCI_PREG_SCTL_SPD_GEN1 0x10
215 #define AHCI_PREG_SCTL_SPD_GEN2 0x20
216 #define AHCI_PREG_SCTL_IPM 0xf00
217 #define AHCI_PREG_SCTL_IPM_NONE 0x000
218 #define AHCI_PREG_SCTL_IPM_NOPARTIAL 0x100
219 #define AHCI_PREG_SCTL_IPM_NOSLUMBER 0x200
220 #define AHCI_PREG_SCTL_IPM_DISABLED 0x300
221 #define AHCI_PREG_SERR 0x30
222 #define AHCI_PREG_SERR_ERR(_r) ((_r) & 0xffff)
223 #define AHCI_PREG_SERR_ERR_I (1<<0)
224 #define AHCI_PREG_SERR_ERR_M (1<<1)
225 #define AHCI_PREG_SERR_ERR_T (1<<8)
226 #define AHCI_PREG_SERR_ERR_C (1<<9)
227 #define AHCI_PREG_SERR_ERR_P (1<<10)
228 #define AHCI_PREG_SERR_ERR_E (1<<11)
229 #define AHCI_PFMT_SERR_ERR "\020" "\014E" "\013P" "\012C" "\011T" "\002M" \
230 "\001I"
231 #define AHCI_PREG_SERR_DIAG(_r) (((_r) >> 16) & 0xffff)
232 #define AHCI_PREG_SERR_DIAG_N (1<<0)
233 #define AHCI_PREG_SERR_DIAG_I (1<<1)
234 #define AHCI_PREG_SERR_DIAG_W (1<<2)
235 #define AHCI_PREG_SERR_DIAG_B (1<<3)
236 #define AHCI_PREG_SERR_DIAG_D (1<<4)
237 #define AHCI_PREG_SERR_DIAG_C (1<<5)
238 #define AHCI_PREG_SERR_DIAG_H (1<<6)
239 #define AHCI_PREG_SERR_DIAG_S (1<<7)
240 #define AHCI_PREG_SERR_DIAG_T (1<<8)
241 #define AHCI_PREG_SERR_DIAG_F (1<<9)
242 #define AHCI_PREG_SERR_DIAG_X (1<<10)
243 #define AHCI_PFMT_SERR_DIAG "\020" "\013X" "\012F" "\011T" "\010S" "\007H" \
244 "\006C" "\005D" "\004B" "\003W" "\002I" \
245 "\001N"
246 #define AHCI_PREG_SACT 0x34
247 #define AHCI_PREG_CI 0x38
248 #define AHCI_PREG_CI_ALL_SLOTS 0xffffffff
249 #define AHCI_PREG_SNTF 0x3c
250
251 struct ahci_cmd_hdr {
252 u_int16_t flags;
253 #define AHCI_CMD_LIST_FLAG_CFL 0x001f
254 #define AHCI_CMD_LIST_FLAG_A (1<<5)
255 #define AHCI_CMD_LIST_FLAG_W (1<<6)
256 #define AHCI_CMD_LIST_FLAG_P (1<<7)
257 #define AHCI_CMD_LIST_FLAG_R (1<<8)
258 #define AHCI_CMD_LIST_FLAG_B (1<<9)
259 #define AHCI_CMD_LIST_FLAG_C (1<<10)
260 #define AHCI_CMD_LIST_FLAG_PMP 0xf000
261 u_int16_t prdtl;
262
263 u_int32_t prdbc;
264
265 u_int32_t ctba_lo;
266 u_int32_t ctba_hi;
267
268 u_int32_t reserved[4];
269 } __packed;
270
271 struct ahci_rfis {
272 u_int8_t dsfis[28];
273 u_int8_t reserved1[4];
274 u_int8_t psfis[24];
275 u_int8_t reserved2[8];
276 u_int8_t rfis[24];
277 u_int8_t reserved3[4];
278 u_int8_t sdbfis[4];
279 u_int8_t ufis[64];
280 u_int8_t reserved4[96];
281 } __packed;
282
283 struct ahci_prdt {
284 u_int32_t dba_lo;
285 u_int32_t dba_hi;
286 u_int32_t reserved;
287 u_int32_t flags;
288 #define AHCI_PRDT_FLAG_INTR (1<<31)
289 } __packed;
290
291
292 #define AHCI_MAX_PRDT 24
293
294 struct ahci_cmd_table {
295 u_int8_t cfis[64];
296 u_int8_t acmd[16];
297 u_int8_t reserved[48];
298
299 struct ahci_prdt prdt[AHCI_MAX_PRDT];
300 } __packed;
301
302 #define AHCI_MAX_PORTS 32
303
304 struct ahci_dmamem {
305 bus_dmamap_t adm_map;
306 bus_dma_segment_t adm_seg;
307 size_t adm_size;
308 caddr_t adm_kva;
309 };
310 #define AHCI_DMA_MAP(_adm) ((_adm)->adm_map)
311 #define AHCI_DMA_DVA(_adm) ((_adm)->adm_map->dm_segs[0].ds_addr)
312 #define AHCI_DMA_KVA(_adm) ((void *)(_adm)->adm_kva)
313
314 struct ahci_softc;
315 struct ahci_port;
316
317 struct ahci_ccb {
318
319 struct ata_xfer ccb_xa;
320
321 int ccb_slot;
322 struct ahci_port *ccb_port;
323
324 bus_dmamap_t ccb_dmamap;
325 struct ahci_cmd_hdr *ccb_cmd_hdr;
326 struct ahci_cmd_table *ccb_cmd_table;
327
328 void (*ccb_done)(struct ahci_ccb *);
329
330 TAILQ_ENTRY(ahci_ccb) ccb_entry;
331 };
332
333 struct ahci_port {
334 struct ahci_softc *ap_sc;
335 bus_space_handle_t ap_ioh;
336
337 #ifdef AHCI_COALESCE
338 int ap_num;
339 #endif
340
341 struct ahci_rfis *ap_rfis;
342 struct ahci_dmamem *ap_dmamem_rfis;
343
344 struct ahci_dmamem *ap_dmamem_cmd_list;
345 struct ahci_dmamem *ap_dmamem_cmd_table;
346
347 volatile u_int32_t ap_active;
348 volatile u_int32_t ap_active_cnt;
349 volatile u_int32_t ap_sactive;
350 struct ahci_ccb *ap_ccbs;
351
352 TAILQ_HEAD(, ahci_ccb) ap_ccb_free;
353 TAILQ_HEAD(, ahci_ccb) ap_ccb_pending;
354
355 u_int32_t ap_state;
356 #define AP_S_NORMAL 0
357 #define AP_S_FATAL_ERROR 1
358
359
360 #ifdef DIAGNOSTIC
361 int ap_err_busy;
362 #endif
363 u_int32_t ap_err_saved_sactive;
364 u_int32_t ap_err_saved_active;
365 u_int32_t ap_err_saved_active_cnt;
366
367 u_int8_t ap_err_scratch[512];
368
369 #ifdef AHCI_DEBUG
370 char ap_name[16];
371 #define PORTNAME(_ap) ((_ap)->ap_name)
372 #else
373 #define PORTNAME(_ap) DEVNAME((_ap)->ap_sc)
374 #endif
375 };
376
377 struct ahci_softc {
378 struct device sc_dev;
379
380 void *sc_ih;
381
382 bus_space_tag_t sc_iot;
383 bus_space_handle_t sc_ioh;
384 bus_size_t sc_ios;
385 bus_dma_tag_t sc_dmat;
386
387 int sc_flags;
388 #define AHCI_F_NO_NCQ (1<<0)
389
390 u_int sc_ncmds;
391
392 struct ahci_port *sc_ports[AHCI_MAX_PORTS];
393
394 struct atascsi *sc_atascsi;
395
396 #ifdef AHCI_COALESCE
397 u_int32_t sc_ccc_mask;
398 u_int32_t sc_ccc_ports;
399 u_int32_t sc_ccc_ports_cur;
400 #endif
401 };
402 #define DEVNAME(_s) ((_s)->sc_dev.dv_xname)
403
404 struct ahci_device {
405 pci_vendor_id_t ad_vendor;
406 pci_product_id_t ad_product;
407 int (*ad_match)(struct pci_attach_args *);
408 int (*ad_attach)(struct ahci_softc *,
409 struct pci_attach_args *);
410 };
411
412 const struct ahci_device *ahci_lookup_device(struct pci_attach_args *);
413
414 int ahci_no_match(struct pci_attach_args *);
415 int ahci_vt8251_attach(struct ahci_softc *,
416 struct pci_attach_args *);
417
418 static const struct ahci_device ahci_devices[] = {
419 { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_VT8251_SATA,
420 ahci_no_match, ahci_vt8251_attach }
421 };
422
423 int ahci_pci_match(struct device *, void *, void *);
424 void ahci_pci_attach(struct device *, struct device *,
425 void *);
426
427 struct cfattach ahci_pci_ca = {
428 sizeof(struct ahci_softc), ahci_pci_match, ahci_pci_attach
429 };
430
431 struct cfattach ahci_jmb_ca = {
432 sizeof(struct ahci_softc), ahci_pci_match, ahci_pci_attach
433 };
434
435 struct cfdriver ahci_cd = {
436 NULL, "ahci", DV_DULL
437 };
438
439
440 int ahci_map_regs(struct ahci_softc *,
441 struct pci_attach_args *);
442 void ahci_unmap_regs(struct ahci_softc *,
443 struct pci_attach_args *);
444 int ahci_map_intr(struct ahci_softc *,
445 struct pci_attach_args *, pci_intr_handle_t);
446 #ifdef notyet
447 void ahci_unmap_intr(struct ahci_softc *,
448 struct pci_attach_args *);
449 #endif
450
451 int ahci_init(struct ahci_softc *);
452 int ahci_port_alloc(struct ahci_softc *, u_int);
453 void ahci_port_free(struct ahci_softc *, u_int);
454
455 int ahci_port_start(struct ahci_port *, int);
456 int ahci_port_stop(struct ahci_port *, int);
457 int ahci_port_clo(struct ahci_port *);
458 int ahci_port_softreset(struct ahci_port *);
459 int ahci_port_portreset(struct ahci_port *);
460
461 int ahci_load_prdt(struct ahci_ccb *);
462 void ahci_unload_prdt(struct ahci_ccb *);
463
464 int ahci_poll(struct ahci_ccb *, int, void (*)(void *));
465 void ahci_start(struct ahci_ccb *);
466
467 void ahci_issue_pending_ncq_commands(struct ahci_port *);
468 void ahci_issue_pending_commands(struct ahci_port *, int);
469
470 int ahci_intr(void *);
471 u_int32_t ahci_port_intr(struct ahci_port *, u_int32_t);
472
473 struct ahci_ccb *ahci_get_ccb(struct ahci_port *);
474 void ahci_put_ccb(struct ahci_ccb *);
475
476 struct ahci_ccb *ahci_get_err_ccb(struct ahci_port *);
477 void ahci_put_err_ccb(struct ahci_ccb *);
478
479 int ahci_port_read_ncq_error(struct ahci_port *, int *);
480
481 struct ahci_dmamem *ahci_dmamem_alloc(struct ahci_softc *, size_t);
482 void ahci_dmamem_free(struct ahci_softc *,
483 struct ahci_dmamem *);
484
485 u_int32_t ahci_read(struct ahci_softc *, bus_size_t);
486 void ahci_write(struct ahci_softc *, bus_size_t, u_int32_t);
487 int ahci_wait_ne(struct ahci_softc *, bus_size_t,
488 u_int32_t, u_int32_t);
489
490 u_int32_t ahci_pread(struct ahci_port *, bus_size_t);
491 void ahci_pwrite(struct ahci_port *, bus_size_t, u_int32_t);
492 int ahci_pwait_eq(struct ahci_port *, bus_size_t,
493 u_int32_t, u_int32_t);
494
495
496 #define ahci_pwait_clr(_ap, _r, _b) ahci_pwait_eq((_ap), (_r), (_b), 0)
497
498
499 #define ahci_pwait_set(_ap, _r, _b) ahci_pwait_eq((_ap), (_r), (_b), (_b))
500
501
502 int ahci_ata_probe(void *, int);
503 struct ata_xfer * ahci_ata_get_xfer(void *, int);
504 void ahci_ata_put_xfer(struct ata_xfer *);
505 int ahci_ata_cmd(struct ata_xfer *);
506
507 struct atascsi_methods ahci_atascsi_methods = {
508 ahci_ata_probe,
509 ahci_ata_get_xfer,
510 ahci_ata_cmd
511 };
512
513
514 void ahci_ata_cmd_done(struct ahci_ccb *);
515 void ahci_ata_cmd_timeout(void *);
516 void ahci_empty_done(struct ahci_ccb *);
517
518 const struct ahci_device *
519 ahci_lookup_device(struct pci_attach_args *pa)
520 {
521 int i;
522 const struct ahci_device *ad;
523
524 for (i = 0; i < (sizeof(ahci_devices) / sizeof(ahci_devices[0])); i++) {
525 ad = &ahci_devices[i];
526 if (ad->ad_vendor == PCI_VENDOR(pa->pa_id) &&
527 ad->ad_product == PCI_PRODUCT(pa->pa_id))
528 return (ad);
529 }
530
531 return (NULL);
532 }
533
534 int
535 ahci_no_match(struct pci_attach_args *pa)
536 {
537 return (0);
538 }
539
540 int
541 ahci_vt8251_attach(struct ahci_softc *sc, struct pci_attach_args *pa)
542 {
543 sc->sc_flags |= AHCI_F_NO_NCQ;
544
545 return (0);
546 }
547
548 int
549 ahci_pci_match(struct device *parent, void *match, void *aux)
550 {
551 struct pci_attach_args *pa = aux;
552 const struct ahci_device *ad;
553
554 ad = ahci_lookup_device(pa);
555 if (ad != NULL) {
556
557 if (ad->ad_match != NULL)
558 return (ad->ad_match(pa));
559
560 return (2);
561 }
562
563 if (PCI_CLASS(pa->pa_class) == PCI_CLASS_MASS_STORAGE &&
564 PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_SATA &&
565 PCI_INTERFACE(pa->pa_class) == AHCI_PCI_INTERFACE)
566 return (2);
567
568 return (0);
569 }
570
571 void
572 ahci_pci_attach(struct device *parent, struct device *self, void *aux)
573 {
574 struct ahci_softc *sc = (struct ahci_softc *)self;
575 struct pci_attach_args *pa = aux;
576 struct atascsi_attach_args aaa;
577 const struct ahci_device *ad;
578 pci_intr_handle_t ih;
579 u_int32_t cap, pi;
580 int i;
581
582 ad = ahci_lookup_device(pa);
583 if (ad != NULL && ad->ad_attach != NULL) {
584 if (ad->ad_attach(sc, pa) != 0) {
585
586 return;
587 }
588 }
589
590 if (pci_intr_map(pa, &ih) != 0) {
591 printf(": unable to map interrupt\n");
592 return;
593 }
594 printf(": %s,", pci_intr_string(pa->pa_pc, ih));
595
596 if (ahci_map_regs(sc, pa) != 0) {
597
598 return;
599 }
600
601 if (ahci_init(sc) != 0) {
602
603 goto unmap;
604 }
605
606 if (ahci_map_intr(sc, pa, ih) != 0) {
607
608 goto unmap;
609 }
610
611 printf("\n");
612
613 sc->sc_dmat = pa->pa_dmat;
614
615 cap = ahci_read(sc, AHCI_REG_CAP);
616 sc->sc_ncmds = AHCI_REG_CAP_NCS(cap);
617 #ifdef AHCI_DEBUG
618 if (ahcidebug & AHCI_D_VERBOSE) {
619 const char *gen;
620
621 switch (cap & AHCI_REG_CAP_ISS) {
622 case AHCI_REG_CAP_ISS_G1:
623 gen = "1 (1.5Gbps)";
624 break;
625 case AHCI_REG_CAP_ISS_G1_2:
626 gen = "1 (1.5Gbps) and 2 (3Gbps)";
627 break;
628 default:
629 gen = "unknown";
630 break;
631 }
632
633 printf("%s: capabilities 0x%b, %d ports, %d cmds, gen %s\n",
634 DEVNAME(sc), cap, AHCI_FMT_CAP,
635 AHCI_REG_CAP_NP(cap), sc->sc_ncmds, gen);
636 }
637 #endif
638
639 pi = ahci_read(sc, AHCI_REG_PI);
640 DPRINTF(AHCI_D_VERBOSE, "%s: ports implemented: 0x%08x\n",
641 DEVNAME(sc), pi);
642
643 #ifdef AHCI_COALESCE
644
645 if (cap & AHCI_REG_CAP_CCCS) {
646 u_int16_t ccc_timeout = 20;
647 u_int8_t ccc_numcomplete = 12;
648 u_int32_t ccc_ctl;
649
650
651 ccc_ctl = ahci_read(sc, AHCI_REG_CCC_CTL);
652 ccc_ctl &= ~0x00000001;
653 ahci_write(sc, AHCI_REG_CCC_CTL, ccc_ctl);
654
655 sc->sc_ccc_mask = 1 << AHCI_REG_CCC_CTL_INT(ccc_ctl);
656 if (pi & sc->sc_ccc_mask) {
657
658 printf("%s: coalescing interrupt/implemented port list "
659 "conflict, PI: %08x, ccc_mask: %08x\n",
660 DEVNAME(sc), pi, sc->sc_ccc_mask);
661 sc->sc_ccc_mask = 0;
662 goto noccc;
663 }
664
665
666 sc->sc_ccc_ports = pi;
667 sc->sc_ccc_ports_cur = 0;
668
669
670 ccc_ctl &= ~0xffffff00;
671 ccc_ctl |= (ccc_timeout << 16) | (ccc_numcomplete << 8);
672 ahci_write(sc, AHCI_REG_CCC_CTL, ccc_ctl);
673 ahci_write(sc, AHCI_REG_CCC_PORTS, 0);
674 ahci_write(sc, AHCI_REG_CCC_CTL, ccc_ctl | 1);
675 }
676 noccc:
677 #endif
678 for (i = 0; i < AHCI_MAX_PORTS; i++) {
679 if (!ISSET(pi, 1 << i)) {
680
681 continue;
682 }
683
684 if (ahci_port_alloc(sc, i) == ENOMEM)
685 goto freeports;
686 }
687
688 bzero(&aaa, sizeof(aaa));
689 aaa.aaa_cookie = sc;
690 aaa.aaa_methods = &ahci_atascsi_methods;
691 aaa.aaa_minphys = minphys;
692 aaa.aaa_nports = AHCI_MAX_PORTS;
693 aaa.aaa_ncmds = sc->sc_ncmds;
694 aaa.aaa_capability = ASAA_CAP_NEEDS_RESERVED;
695 if (!(sc->sc_flags & AHCI_F_NO_NCQ) && (cap & AHCI_REG_CAP_SNCQ))
696 aaa.aaa_capability |= ASAA_CAP_NCQ;
697
698 sc->sc_atascsi = atascsi_attach(&sc->sc_dev, &aaa);
699
700
701 ahci_write(sc, AHCI_REG_GHC, AHCI_REG_GHC_AE | AHCI_REG_GHC_IE);
702
703 return;
704
705 freeports:
706 for (i = 0; i < AHCI_MAX_PORTS; i++)
707 if (sc->sc_ports[i] != NULL)
708 ahci_port_free(sc, i);
709 unmap:
710
711 ahci_write(sc, AHCI_REG_GHC, 0);
712 ahci_unmap_regs(sc, pa);
713 return;
714 }
715
716 int
717 ahci_map_regs(struct ahci_softc *sc, struct pci_attach_args *pa)
718 {
719 pcireg_t maptype;
720
721 maptype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, AHCI_PCI_BAR);
722 if (pci_mapreg_map(pa, AHCI_PCI_BAR, maptype, 0, &sc->sc_iot,
723 &sc->sc_ioh, NULL, &sc->sc_ios, 0) != 0) {
724 printf(" unable to map registers\n");
725 return (1);
726 }
727
728 return (0);
729 }
730
731 void
732 ahci_unmap_regs(struct ahci_softc *sc, struct pci_attach_args *pa)
733 {
734 bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios);
735 sc->sc_ios = 0;
736 }
737
738 int
739 ahci_map_intr(struct ahci_softc *sc, struct pci_attach_args *pa,
740 pci_intr_handle_t ih)
741 {
742 sc->sc_ih = pci_intr_establish(pa->pa_pc, ih, IPL_BIO,
743 ahci_intr, sc, DEVNAME(sc));
744 if (sc->sc_ih == NULL) {
745 printf("%s: unable to map interrupt\n", DEVNAME(sc));
746 return (1);
747 }
748
749 return (0);
750 }
751
752 #ifdef notyet
753
754 void
755 ahci_unmap_intr(struct ahci_softc *sc, struct pci_attach_args *pa)
756 {
757 pci_intr_disestablish(pa->pa_pc, sc->sc_ih);
758 }
759 #endif
760
761 int
762 ahci_init(struct ahci_softc *sc)
763 {
764 u_int32_t reg, cap, pi;
765 const char *revision;
766
767 DPRINTF(AHCI_D_VERBOSE, " GHC 0x%b", ahci_read(sc, AHCI_REG_GHC),
768 AHCI_FMT_GHC);
769
770
771 cap = ahci_read(sc, AHCI_REG_CAP);
772 cap &= AHCI_REG_CAP_SMPS;
773 cap |= AHCI_REG_CAP_SSS;
774 pi = ahci_read(sc, AHCI_REG_PI);
775
776 if (ISSET(AHCI_REG_GHC_AE, ahci_read(sc, AHCI_REG_GHC))) {
777
778 ahci_write(sc, AHCI_REG_GHC, AHCI_REG_GHC_HR);
779 if (ahci_wait_ne(sc, AHCI_REG_GHC, AHCI_REG_GHC_HR,
780 AHCI_REG_GHC_HR) != 0) {
781 printf(" unable to reset controller\n");
782 return (1);
783 }
784 }
785
786
787 ahci_write(sc, AHCI_REG_GHC, AHCI_REG_GHC_AE);
788
789
790 ahci_write(sc, AHCI_REG_CAP, cap);
791 ahci_write(sc, AHCI_REG_PI, pi);
792
793
794 reg = ahci_read(sc, AHCI_REG_VS);
795 switch (reg) {
796 case AHCI_REG_VS_0_95:
797 revision = "0.95";
798 break;
799 case AHCI_REG_VS_1_0:
800 revision = "1.0";
801 break;
802 case AHCI_REG_VS_1_1:
803 revision = "1.1";
804 break;
805
806 default:
807 printf(" unsupported AHCI revision 0x%08x\n", reg);
808 return (1);
809 }
810
811 printf(" AHCI %s", revision);
812
813 return (0);
814 }
815
816 int
817 ahci_port_alloc(struct ahci_softc *sc, u_int port)
818 {
819 struct ahci_port *ap;
820 struct ahci_ccb *ccb;
821 u_int64_t dva;
822 u_int32_t cmd;
823 struct ahci_cmd_hdr *hdr;
824 struct ahci_cmd_table *table;
825 int i, rc = ENOMEM;
826
827 ap = malloc(sizeof(struct ahci_port), M_DEVBUF, M_NOWAIT);
828 if (ap == NULL) {
829 printf("%s: unable to allocate memory for port %d\n",
830 DEVNAME(sc), port);
831 goto reterr;
832 }
833 bzero(ap, sizeof(struct ahci_port));
834
835 #ifdef AHCI_DEBUG
836 snprintf(ap->ap_name, sizeof(ap->ap_name), "%s.%d",
837 DEVNAME(sc), port);
838 #endif
839 sc->sc_ports[port] = ap;
840
841 if (bus_space_subregion(sc->sc_iot, sc->sc_ioh,
842 AHCI_PORT_REGION(port), AHCI_PORT_SIZE, &ap->ap_ioh) != 0) {
843 printf("%s: unable to create register window for port %d\n",
844 DEVNAME(sc), port);
845 goto freeport;
846 }
847
848 ap->ap_sc = sc;
849 #ifdef AHCI_COALESCE
850 ap->ap_num = port;
851 #endif
852 TAILQ_INIT(&ap->ap_ccb_free);
853 TAILQ_INIT(&ap->ap_ccb_pending);
854
855
856 ahci_pwrite(ap, AHCI_PREG_IE, 0);
857
858
859 cmd = ahci_pread(ap, AHCI_PREG_CMD);
860 if (ISSET(cmd, (AHCI_PREG_CMD_ST | AHCI_PREG_CMD_CR |
861 AHCI_PREG_CMD_FRE | AHCI_PREG_CMD_FR)) ||
862 ISSET(ahci_pread(ap, AHCI_PREG_SCTL), AHCI_PREG_SCTL_DET)) {
863 int r;
864
865 r = ahci_port_stop(ap, 1);
866 if (r) {
867 printf("%s: unable to disable %s, ignoring port %d\n",
868 DEVNAME(sc), r == 2 ? "CR" : "FR", port);
869 rc = ENXIO;
870 goto freeport;
871 }
872
873
874 ahci_pwrite(ap, AHCI_PREG_SCTL, 0);
875 }
876
877
878 ap->ap_dmamem_rfis = ahci_dmamem_alloc(sc, sizeof(struct ahci_rfis));
879 if (ap->ap_dmamem_rfis == NULL)
880 goto nomem;
881
882
883 ap->ap_rfis = (struct ahci_rfis *) AHCI_DMA_KVA(ap->ap_dmamem_rfis);
884 dva = AHCI_DMA_DVA(ap->ap_dmamem_rfis);
885 ahci_pwrite(ap, AHCI_PREG_FBU, (u_int32_t)(dva >> 32));
886 ahci_pwrite(ap, AHCI_PREG_FB, (u_int32_t)dva);
887
888
889 cmd = ahci_pread(ap, AHCI_PREG_CMD) & ~AHCI_PREG_CMD_ICC;
890 cmd |= AHCI_PREG_CMD_FRE | AHCI_PREG_CMD_POD | AHCI_PREG_CMD_SUD;
891 ahci_pwrite(ap, AHCI_PREG_CMD, cmd | AHCI_PREG_CMD_ICC_ACTIVE);
892
893
894 cmd = ahci_pread(ap, AHCI_PREG_CMD) & ~AHCI_PREG_CMD_ICC;
895 if (!ISSET(cmd, AHCI_PREG_CMD_FRE)) {
896 rc = ENXIO;
897 goto freeport;
898 }
899
900
901 ap->ap_ccbs = malloc(sizeof(struct ahci_ccb) * sc->sc_ncmds, M_DEVBUF,
902 M_NOWAIT);
903 if (ap->ap_ccbs == NULL) {
904 printf("%s: unable to allocate command list for port %d\n",
905 DEVNAME(sc), port);
906 goto freeport;
907 }
908 bzero(ap->ap_ccbs, sizeof(struct ahci_ccb) * sc->sc_ncmds);
909
910
911 ap->ap_dmamem_cmd_list = ahci_dmamem_alloc(sc,
912 sc->sc_ncmds * sizeof(struct ahci_cmd_hdr));
913 ap->ap_dmamem_cmd_table = ahci_dmamem_alloc(sc,
914 sc->sc_ncmds * sizeof(struct ahci_cmd_table));
915 if (ap->ap_dmamem_cmd_table == NULL || ap->ap_dmamem_cmd_list == NULL) {
916 nomem:
917 printf("%s: unable to allocate DMA memory for port %d\n",
918 DEVNAME(sc), port);
919 goto freeport;
920 }
921
922
923 dva = AHCI_DMA_DVA(ap->ap_dmamem_cmd_list);
924 ahci_pwrite(ap, AHCI_PREG_CLBU, (u_int32_t)(dva >> 32));
925 ahci_pwrite(ap, AHCI_PREG_CLB, (u_int32_t)dva);
926
927
928 hdr = AHCI_DMA_KVA(ap->ap_dmamem_cmd_list);
929 table = AHCI_DMA_KVA(ap->ap_dmamem_cmd_table);
930 for (i = 0; i < sc->sc_ncmds; i++) {
931 ccb = &ap->ap_ccbs[i];
932
933 if (bus_dmamap_create(sc->sc_dmat, MAXPHYS, AHCI_MAX_PRDT,
934 (4 * 1024 * 1024), 0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW,
935 &ccb->ccb_dmamap) != 0) {
936 printf("%s: unable to create dmamap for port %d "
937 "ccb %d\n", DEVNAME(sc), port, i);
938 goto freeport;
939 }
940
941 ccb->ccb_slot = i;
942 ccb->ccb_port = ap;
943 ccb->ccb_cmd_hdr = &hdr[i];
944 ccb->ccb_cmd_table = &table[i];
945 dva = AHCI_DMA_DVA(ap->ap_dmamem_cmd_table) +
946 ccb->ccb_slot * sizeof(struct ahci_cmd_table);
947 ccb->ccb_cmd_hdr->ctba_hi = htole32((u_int32_t)(dva >> 32));
948 ccb->ccb_cmd_hdr->ctba_lo = htole32((u_int32_t)dva);
949
950 ccb->ccb_xa.fis =
951 (struct ata_fis_h2d *)ccb->ccb_cmd_table->cfis;
952 ccb->ccb_xa.packetcmd = ccb->ccb_cmd_table->acmd;
953 ccb->ccb_xa.tag = i;
954
955 ccb->ccb_xa.ata_put_xfer = ahci_ata_put_xfer;
956
957 ccb->ccb_xa.state = ATA_S_COMPLETE;
958 ahci_put_ccb(ccb);
959 }
960
961
962 ahci_pwait_clr(ap, AHCI_PREG_CMD, AHCI_PREG_CMD_ICC);
963
964
965 rc = ahci_port_portreset(ap);
966 switch (rc) {
967 case ENODEV:
968 switch (ahci_pread(ap, AHCI_PREG_SSTS) & AHCI_PREG_SSTS_DET) {
969 case AHCI_PREG_SSTS_DET_DEV_NE:
970 printf("%s: device not communicating on port %d\n",
971 DEVNAME(sc), port);
972 break;
973 case AHCI_PREG_SSTS_DET_PHYOFFLINE:
974 printf("%s: PHY offline on port %d\n", DEVNAME(sc),
975 port);
976 break;
977 default:
978 DPRINTF(AHCI_D_VERBOSE, "%s: no device detected "
979 "on port %d\n", DEVNAME(sc), port);
980 break;
981 }
982 goto freeport;
983
984 case EBUSY:
985 printf("%s: device on port %d didn't come ready, "
986 "TFD: 0x%b\n", DEVNAME(sc), port,
987 ahci_pread(ap, AHCI_PREG_TFD), AHCI_PFMT_TFD_STS);
988
989
990 rc = ahci_port_softreset(ap);
991 if (rc) {
992 printf("%s: unable to communicate "
993 "with device on port %d\n", DEVNAME(sc), port);
994 goto freeport;
995 }
996 break;
997
998 default:
999 break;
1000 }
1001 DPRINTF(AHCI_D_VERBOSE, "%s: detected device on port %d\n",
1002 DEVNAME(sc), port);
1003
1004
1005 if (ahci_port_start(ap, 0)) {
1006 printf("%s: failed to start command DMA on port %d, "
1007 "disabling\n", DEVNAME(sc), port);
1008 rc = ENXIO;
1009 }
1010
1011
1012 ahci_pwrite(ap, AHCI_PREG_IS, ahci_pread(ap, AHCI_PREG_IS));
1013 ahci_write(sc, AHCI_REG_IS, 1 << port);
1014
1015
1016 ahci_pwrite(ap, AHCI_PREG_IE, AHCI_PREG_IE_TFEE | AHCI_PREG_IE_HBFE |
1017 AHCI_PREG_IE_IFE | AHCI_PREG_IE_OFE | AHCI_PREG_IE_DPE |
1018 AHCI_PREG_IE_UFE |
1019 #ifdef AHCI_COALESCE
1020 ((sc->sc_ccc_ports & (1 << port)) ? 0 : (AHCI_PREG_IE_SDBE |
1021 AHCI_PREG_IE_DHRE))
1022 #else
1023 AHCI_PREG_IE_SDBE | AHCI_PREG_IE_DHRE
1024 #endif
1025 );
1026
1027 freeport:
1028 if (rc != 0)
1029 ahci_port_free(sc, port);
1030 reterr:
1031 return (rc);
1032 }
1033
1034 void
1035 ahci_port_free(struct ahci_softc *sc, u_int port)
1036 {
1037 struct ahci_port *ap = sc->sc_ports[port];
1038 struct ahci_ccb *ccb;
1039
1040
1041 if (ap->ap_sc) {
1042 ahci_pwrite(ap, AHCI_PREG_CMD, 0);
1043 ahci_pwrite(ap, AHCI_PREG_IE, 0);
1044 ahci_pwrite(ap, AHCI_PREG_IS, ahci_pread(ap, AHCI_PREG_IS));
1045 ahci_write(sc, AHCI_REG_IS, 1 << port);
1046 }
1047
1048 if (ap->ap_ccbs) {
1049 while ((ccb = ahci_get_ccb(ap)) != NULL)
1050 bus_dmamap_destroy(sc->sc_dmat, ccb->ccb_dmamap);
1051 free(ap->ap_ccbs, M_DEVBUF);
1052 }
1053
1054 if (ap->ap_dmamem_cmd_list)
1055 ahci_dmamem_free(sc, ap->ap_dmamem_cmd_list);
1056 if (ap->ap_dmamem_rfis)
1057 ahci_dmamem_free(sc, ap->ap_dmamem_rfis);
1058 if (ap->ap_dmamem_cmd_table)
1059 ahci_dmamem_free(sc, ap->ap_dmamem_cmd_table);
1060
1061
1062
1063 free(ap, M_DEVBUF);
1064 sc->sc_ports[port] = NULL;
1065 }
1066
1067 int
1068 ahci_port_start(struct ahci_port *ap, int fre_only)
1069 {
1070 u_int32_t r;
1071
1072
1073 r = ahci_pread(ap, AHCI_PREG_CMD) & ~AHCI_PREG_CMD_ICC;
1074 r |= AHCI_PREG_CMD_FRE;
1075 if (!fre_only)
1076 r |= AHCI_PREG_CMD_ST;
1077 ahci_pwrite(ap, AHCI_PREG_CMD, r);
1078
1079 #ifdef AHCI_COALESCE
1080
1081 if (ap->ap_sc->sc_ccc_ports & (1 << ap->ap_num)) {
1082 ap->ap_sc->sc_ccc_ports_cur |= (1 << ap->ap_num);
1083 ahci_write(ap->ap_sc, AHCI_REG_CCC_PORTS,
1084 ap->ap_sc->sc_ccc_ports_cur);
1085 }
1086 #endif
1087
1088
1089 if (ahci_pwait_set(ap, AHCI_PREG_CMD, AHCI_PREG_CMD_FR))
1090 return (2);
1091
1092
1093 if (!fre_only && ahci_pwait_set(ap, AHCI_PREG_CMD, AHCI_PREG_CMD_CR))
1094 return (1);
1095
1096 return (0);
1097 }
1098
1099 int
1100 ahci_port_stop(struct ahci_port *ap, int stop_fis_rx)
1101 {
1102 u_int32_t r;
1103
1104 #ifdef AHCI_COALESCE
1105
1106 if (ap->ap_sc->sc_ccc_ports & (1 << ap->ap_num)) {
1107 ap->ap_sc->sc_ccc_ports_cur &= ~(1 << ap->ap_num);
1108 ahci_write(ap->ap_sc, AHCI_REG_CCC_PORTS,
1109 ap->ap_sc->sc_ccc_ports_cur);
1110 }
1111 #endif
1112
1113
1114 r = ahci_pread(ap, AHCI_PREG_CMD) & ~AHCI_PREG_CMD_ICC;
1115 r &= ~AHCI_PREG_CMD_ST;
1116 if (stop_fis_rx)
1117 r &= ~AHCI_PREG_CMD_FRE;
1118 ahci_pwrite(ap, AHCI_PREG_CMD, r);
1119
1120
1121 if (ahci_pwait_clr(ap, AHCI_PREG_CMD, AHCI_PREG_CMD_CR))
1122 return (1);
1123
1124
1125 if (stop_fis_rx && ahci_pwait_clr(ap, AHCI_PREG_CMD, AHCI_PREG_CMD_FR))
1126 return (2);
1127
1128 return (0);
1129 }
1130
1131
1132 int
1133 ahci_port_clo(struct ahci_port *ap)
1134 {
1135 struct ahci_softc *sc = ap->ap_sc;
1136 u_int32_t cmd;
1137
1138
1139 if (!ISSET(ahci_read(sc, AHCI_REG_CAP), AHCI_REG_CAP_SCLO))
1140 return (1);
1141
1142
1143 cmd = ahci_pread(ap, AHCI_PREG_CMD) & ~AHCI_PREG_CMD_ICC;
1144 #ifdef DIAGNOSTIC
1145 if (ISSET(cmd, AHCI_PREG_CMD_ST))
1146 printf("%s: CLO requested while port running\n", PORTNAME(ap));
1147 #endif
1148 ahci_pwrite(ap, AHCI_PREG_CMD, cmd | AHCI_PREG_CMD_CLO);
1149
1150
1151 if (ahci_pwait_clr(ap, AHCI_PREG_CMD, AHCI_PREG_CMD_CLO)) {
1152 printf("%s: CLO did not complete\n", PORTNAME(ap));
1153 return (1);
1154 }
1155
1156 return (0);
1157 }
1158
1159
1160 int
1161 ahci_port_softreset(struct ahci_port *ap)
1162 {
1163 struct ahci_ccb *ccb = NULL;
1164 struct ahci_cmd_hdr *cmd_slot;
1165 u_int8_t *fis;
1166 int s, rc = EIO;
1167 u_int32_t cmd;
1168
1169 DPRINTF(AHCI_D_VERBOSE, "%s: soft reset\n", PORTNAME(ap));
1170
1171 s = splbio();
1172
1173
1174 cmd = ahci_pread(ap, AHCI_PREG_CMD) & ~AHCI_PREG_CMD_ICC;
1175
1176
1177 if (ahci_port_stop(ap, 0)) {
1178 printf("%s: failed to stop port, cannot softreset\n",
1179 PORTNAME(ap));
1180 goto err;
1181 }
1182
1183
1184 if (ISSET(ahci_pread(ap, AHCI_PREG_TFD), AHCI_PREG_TFD_STS_BSY |
1185 AHCI_PREG_TFD_STS_DRQ))
1186 ahci_port_clo(ap);
1187
1188
1189 ahci_pwrite(ap, AHCI_PREG_SERR, ahci_pread(ap, AHCI_PREG_SERR));
1190
1191
1192 if (ahci_port_start(ap, 0)) {
1193 printf("%s: failed to start port, cannot softreset\n",
1194 PORTNAME(ap));
1195 goto err;
1196 }
1197
1198
1199 if (ahci_pwait_clr(ap, AHCI_PREG_TFD,
1200 AHCI_PREG_TFD_STS_BSY | AHCI_PREG_TFD_STS_DRQ)) {
1201 printf("%s: CLO %s, need port reset\n", PORTNAME(ap),
1202 ISSET(ahci_read(ap->ap_sc, AHCI_REG_CAP), AHCI_REG_CAP_SCLO)
1203 ? "failed" : "unsupported");
1204 rc = EBUSY;
1205 goto err;
1206 }
1207
1208
1209 ccb = ahci_get_err_ccb(ap);
1210 cmd_slot = ccb->ccb_cmd_hdr;
1211 bzero(ccb->ccb_cmd_table, sizeof(struct ahci_cmd_table));
1212
1213 fis = ccb->ccb_cmd_table->cfis;
1214 fis[0] = 0x27;
1215 fis[15] = 0x04;
1216
1217 cmd_slot->prdtl = 0;
1218 cmd_slot->flags = htole16(5);
1219 cmd_slot->flags |= htole16(AHCI_CMD_LIST_FLAG_C);
1220 cmd_slot->flags |= htole16(AHCI_CMD_LIST_FLAG_R);
1221 cmd_slot->flags |= htole16(AHCI_CMD_LIST_FLAG_W);
1222
1223 ccb->ccb_xa.state = ATA_S_PENDING;
1224 if (ahci_poll(ccb, 1000, NULL) != 0)
1225 goto err;
1226
1227
1228 fis[0] = 0x27;
1229 fis[15] = 0;
1230
1231 cmd_slot->prdtl = 0;
1232 cmd_slot->flags = htole16(5);
1233 cmd_slot->flags |= htole16(AHCI_CMD_LIST_FLAG_W);
1234
1235 ccb->ccb_xa.state = ATA_S_PENDING;
1236 if (ahci_poll(ccb, 1000, NULL) != 0)
1237 goto err;
1238
1239 if (ahci_pwait_clr(ap, AHCI_PREG_TFD, AHCI_PREG_TFD_STS_BSY |
1240 AHCI_PREG_TFD_STS_DRQ | AHCI_PREG_TFD_STS_ERR)) {
1241 printf("%s: device didn't come ready after reset, TFD: 0x%b\n",
1242 PORTNAME(ap), ahci_pread(ap, AHCI_PREG_TFD),
1243 AHCI_PFMT_TFD_STS);
1244 rc = EBUSY;
1245 goto err;
1246 }
1247
1248 rc = 0;
1249 err:
1250 if (ccb != NULL) {
1251
1252 if (rc != 0 && ISSET(ap->ap_active, 1 << ccb->ccb_slot)) {
1253 printf("%s: stopping the port, softreset slot %d was "
1254 "still active.\n", PORTNAME(ap), ccb->ccb_slot);
1255 ahci_port_stop(ap, 0);
1256 }
1257 ccb->ccb_xa.state = ATA_S_ERROR;
1258 ahci_put_err_ccb(ccb);
1259 }
1260
1261
1262 ahci_pwrite(ap, AHCI_PREG_CMD, cmd);
1263
1264 splx(s);
1265
1266 return (rc);
1267 }
1268
1269
1270 int
1271 ahci_port_portreset(struct ahci_port *ap)
1272 {
1273 u_int32_t cmd, r;
1274 int rc;
1275
1276 DPRINTF(AHCI_D_VERBOSE, "%s: port reset\n", PORTNAME(ap));
1277
1278
1279 cmd = ahci_pread(ap, AHCI_PREG_CMD) & ~AHCI_PREG_CMD_ICC;
1280
1281
1282 ahci_port_stop(ap, 0);
1283
1284
1285 ahci_pwrite(ap, AHCI_PREG_SCTL, 0);
1286 delay(10000);
1287 r = AHCI_PREG_SCTL_IPM_DISABLED | AHCI_PREG_SCTL_SPD_ANY |
1288 AHCI_PREG_SCTL_DET_INIT;
1289 ahci_pwrite(ap, AHCI_PREG_SCTL, r);
1290 delay(10000);
1291 r &= ~AHCI_PREG_SCTL_DET_INIT;
1292 r |= AHCI_PREG_SCTL_DET_NONE;
1293 ahci_pwrite(ap, AHCI_PREG_SCTL, r);
1294 delay(10000);
1295
1296
1297 if (ahci_pwait_eq(ap, AHCI_PREG_SSTS, AHCI_PREG_SSTS_DET,
1298 AHCI_PREG_SSTS_DET_DEV)) {
1299 rc = ENODEV;
1300 goto err;
1301 }
1302
1303
1304 ahci_pwrite(ap, AHCI_PREG_SERR, ahci_pread(ap, AHCI_PREG_SERR));
1305
1306
1307
1308 if (ahci_pwait_clr(ap, AHCI_PREG_TFD, AHCI_PREG_TFD_STS_BSY |
1309 AHCI_PREG_TFD_STS_DRQ | AHCI_PREG_TFD_STS_ERR)) {
1310 rc = EBUSY;
1311 goto err;
1312 }
1313
1314 rc = 0;
1315 err:
1316
1317 ahci_pwrite(ap, AHCI_PREG_CMD, cmd);
1318
1319 return (rc);
1320 }
1321
1322 int
1323 ahci_load_prdt(struct ahci_ccb *ccb)
1324 {
1325 struct ahci_port *ap = ccb->ccb_port;
1326 struct ahci_softc *sc = ap->ap_sc;
1327 struct ata_xfer *xa = &ccb->ccb_xa;
1328 struct ahci_prdt *prdt = ccb->ccb_cmd_table->prdt, *prd;
1329 bus_dmamap_t dmap = ccb->ccb_dmamap;
1330 struct ahci_cmd_hdr *cmd_slot = ccb->ccb_cmd_hdr;
1331 u_int64_t addr;
1332 int i, error;
1333
1334 if (xa->datalen == 0) {
1335 ccb->ccb_cmd_hdr->prdtl = 0;
1336 return (0);
1337 }
1338
1339 error = bus_dmamap_load(sc->sc_dmat, dmap, xa->data, xa->datalen, NULL,
1340 (xa->flags & ATA_F_NOWAIT) ? BUS_DMA_NOWAIT : BUS_DMA_WAITOK);
1341 if (error != 0) {
1342 printf("%s: error %d loading dmamap\n", PORTNAME(ap), error);
1343 return (1);
1344 }
1345
1346 for (i = 0; i < dmap->dm_nsegs; i++) {
1347 prd = &prdt[i];
1348
1349 addr = dmap->dm_segs[i].ds_addr;
1350 prd->dba_hi = htole32((u_int32_t)(addr >> 32));
1351 prd->dba_lo = htole32((u_int32_t)addr);
1352 #ifdef DIAGNOSTIC
1353 if (addr & 1) {
1354 printf("%s: requested DMA at an odd address %llx\n",
1355 PORTNAME(ap), (unsigned long long)addr);
1356 return (1);
1357 }
1358 if (dmap->dm_segs[i].ds_len & 1) {
1359 printf("%s: requested DMA length %d is not even\n",
1360 PORTNAME(ap), (int)dmap->dm_segs[i].ds_len);
1361 return (1);
1362 }
1363 #endif
1364 prd->flags = htole32(dmap->dm_segs[i].ds_len - 1);
1365 }
1366 if (xa->flags & ATA_F_PIO)
1367 prd->flags |= htole32(AHCI_PRDT_FLAG_INTR);
1368
1369 cmd_slot->prdtl = htole16(dmap->dm_nsegs);
1370
1371 bus_dmamap_sync(sc->sc_dmat, dmap, 0, dmap->dm_mapsize,
1372 (xa->flags & ATA_F_READ) ? BUS_DMASYNC_PREREAD :
1373 BUS_DMASYNC_PREWRITE);
1374
1375 return (0);
1376 }
1377
1378 void
1379 ahci_unload_prdt(struct ahci_ccb *ccb)
1380 {
1381 struct ahci_port *ap = ccb->ccb_port;
1382 struct ahci_softc *sc = ap->ap_sc;
1383 struct ata_xfer *xa = &ccb->ccb_xa;
1384 bus_dmamap_t dmap = ccb->ccb_dmamap;
1385
1386 if (xa->datalen != 0) {
1387 bus_dmamap_sync(sc->sc_dmat, dmap, 0, dmap->dm_mapsize,
1388 (xa->flags & ATA_F_READ) ? BUS_DMASYNC_POSTREAD :
1389 BUS_DMASYNC_POSTWRITE);
1390
1391 bus_dmamap_unload(sc->sc_dmat, dmap);
1392
1393 if (ccb->ccb_xa.flags & ATA_F_NCQ)
1394 xa->resid = 0;
1395 else
1396 xa->resid = xa->datalen -
1397 letoh32(ccb->ccb_cmd_hdr->prdbc);
1398 }
1399 }
1400
1401 int
1402 ahci_poll(struct ahci_ccb *ccb, int timeout, void (*timeout_fn)(void *))
1403 {
1404 struct ahci_port *ap = ccb->ccb_port;
1405 int s;
1406
1407 s = splbio();
1408 ahci_start(ccb);
1409 do {
1410 if (ISSET(ahci_port_intr(ap, AHCI_PREG_CI_ALL_SLOTS),
1411 1 << ccb->ccb_slot)) {
1412 splx(s);
1413 return (0);
1414 }
1415
1416 delay(1000);
1417 } while (--timeout > 0);
1418
1419
1420 if (timeout_fn != NULL)
1421 timeout_fn(ccb);
1422
1423 splx(s);
1424
1425 return (1);
1426 }
1427
1428 void
1429 ahci_start(struct ahci_ccb *ccb)
1430 {
1431 struct ahci_port *ap = ccb->ccb_port;
1432 struct ahci_softc *sc = ap->ap_sc;
1433
1434 KASSERT(ccb->ccb_xa.state == ATA_S_PENDING);
1435
1436
1437 ccb->ccb_cmd_hdr->prdbc = 0;
1438
1439
1440 bus_dmamap_sync(sc->sc_dmat, AHCI_DMA_MAP(ap->ap_dmamem_cmd_list),
1441 ccb->ccb_slot * sizeof(struct ahci_cmd_hdr),
1442 sizeof(struct ahci_cmd_hdr), BUS_DMASYNC_PREWRITE);
1443 bus_dmamap_sync(sc->sc_dmat, AHCI_DMA_MAP(ap->ap_dmamem_cmd_table),
1444 ccb->ccb_slot * sizeof(struct ahci_cmd_table),
1445 sizeof(struct ahci_cmd_table), BUS_DMASYNC_PREWRITE);
1446
1447
1448 bus_dmamap_sync(sc->sc_dmat, AHCI_DMA_MAP(ap->ap_dmamem_rfis), 0,
1449 sizeof(struct ahci_rfis), BUS_DMASYNC_PREREAD);
1450
1451 if (ccb->ccb_xa.flags & ATA_F_NCQ) {
1452
1453
1454 if (ap->ap_active != 0 || !TAILQ_EMPTY(&ap->ap_ccb_pending))
1455 TAILQ_INSERT_TAIL(&ap->ap_ccb_pending, ccb, ccb_entry);
1456 else {
1457 KASSERT(ap->ap_active_cnt == 0);
1458 ap->ap_sactive |= (1 << ccb->ccb_slot);
1459 ccb->ccb_xa.state = ATA_S_ONCHIP;
1460 ahci_pwrite(ap, AHCI_PREG_SACT, 1 << ccb->ccb_slot);
1461 ahci_pwrite(ap, AHCI_PREG_CI, 1 << ccb->ccb_slot);
1462 }
1463 } else {
1464
1465
1466 if (ap->ap_sactive != 0 || ap->ap_active_cnt == 2)
1467 TAILQ_INSERT_TAIL(&ap->ap_ccb_pending, ccb, ccb_entry);
1468 else if (ap->ap_active_cnt < 2) {
1469 ap->ap_active |= 1 << ccb->ccb_slot;
1470 ccb->ccb_xa.state = ATA_S_ONCHIP;
1471 ahci_pwrite(ap, AHCI_PREG_CI, 1 << ccb->ccb_slot);
1472 ap->ap_active_cnt++;
1473 }
1474 }
1475 }
1476
1477 void
1478 ahci_issue_pending_ncq_commands(struct ahci_port *ap)
1479 {
1480 struct ahci_ccb *nextccb;
1481 u_int32_t sact_change = 0;
1482
1483 KASSERT(ap->ap_active_cnt == 0);
1484
1485 nextccb = TAILQ_FIRST(&ap->ap_ccb_pending);
1486 if (nextccb == NULL || !(nextccb->ccb_xa.flags & ATA_F_NCQ))
1487 return;
1488
1489
1490 do {
1491 TAILQ_REMOVE(&ap->ap_ccb_pending, nextccb, ccb_entry);
1492 sact_change |= 1 << nextccb->ccb_slot;
1493 nextccb->ccb_xa.state = ATA_S_ONCHIP;
1494 nextccb = TAILQ_FIRST(&ap->ap_ccb_pending);
1495 } while (nextccb && (nextccb->ccb_xa.flags & ATA_F_NCQ));
1496
1497 ap->ap_sactive |= sact_change;
1498 ahci_pwrite(ap, AHCI_PREG_SACT, sact_change);
1499 ahci_pwrite(ap, AHCI_PREG_CI, sact_change);
1500
1501 return;
1502 }
1503
1504 void
1505 ahci_issue_pending_commands(struct ahci_port *ap, int last_was_ncq)
1506 {
1507 struct ahci_ccb *nextccb;
1508
1509 nextccb = TAILQ_FIRST(&ap->ap_ccb_pending);
1510 if (nextccb && (nextccb->ccb_xa.flags & ATA_F_NCQ)) {
1511 KASSERT(last_was_ncq == 0);
1512
1513
1514
1515
1516 ap->ap_active_cnt--;
1517 if (ap->ap_active == 0)
1518 ahci_issue_pending_ncq_commands(ap);
1519 else
1520 KASSERT(ap->ap_active_cnt == 1);
1521 } else if (nextccb) {
1522 if (ap->ap_sactive != 0 || last_was_ncq)
1523 KASSERT(ap->ap_active_cnt == 0);
1524
1525
1526
1527 if (ap->ap_sactive != 0)
1528 return;
1529
1530
1531 do {
1532 TAILQ_REMOVE(&ap->ap_ccb_pending, nextccb, ccb_entry);
1533 ap->ap_active |= 1 << nextccb->ccb_slot;
1534 nextccb->ccb_xa.state = ATA_S_ONCHIP;
1535 ahci_pwrite(ap, AHCI_PREG_CI, 1 << nextccb->ccb_slot);
1536 if (last_was_ncq)
1537 ap->ap_active_cnt++;
1538 if (ap->ap_active_cnt == 2)
1539 break;
1540 KASSERT(ap->ap_active_cnt == 1);
1541 nextccb = TAILQ_FIRST(&ap->ap_ccb_pending);
1542 } while (nextccb && !(nextccb->ccb_xa.flags & ATA_F_NCQ));
1543 } else if (!last_was_ncq) {
1544 KASSERT(ap->ap_active_cnt == 1 || ap->ap_active_cnt == 2);
1545
1546
1547 ap->ap_active_cnt--;
1548 } else {
1549 KASSERT(ap->ap_active_cnt == 0);
1550
1551
1552 }
1553 }
1554
1555 int
1556 ahci_intr(void *arg)
1557 {
1558 struct ahci_softc *sc = arg;
1559 u_int32_t is, ack = 0;
1560 int port;
1561
1562
1563 is = ahci_read(sc, AHCI_REG_IS);
1564 if (is == 0)
1565 return (0);
1566 ack = is;
1567
1568 #ifdef AHCI_COALESCE
1569
1570 if (is & sc->sc_ccc_mask) {
1571 DPRINTF(AHCI_D_INTR, "%s: command coalescing interrupt\n",
1572 DEVNAME(sc));
1573 is &= ~sc->sc_ccc_mask;
1574 is |= sc->sc_ccc_ports_cur;
1575 }
1576 #endif
1577
1578
1579 while (is) {
1580 port = ffs(is) - 1;
1581 if (sc->sc_ports[port])
1582 ahci_port_intr(sc->sc_ports[port],
1583 AHCI_PREG_CI_ALL_SLOTS);
1584 is &= ~(1 << port);
1585 }
1586
1587
1588 ahci_write(sc, AHCI_REG_IS, ack);
1589
1590 return (1);
1591 }
1592
1593 u_int32_t
1594 ahci_port_intr(struct ahci_port *ap, u_int32_t ci_mask)
1595 {
1596 struct ahci_softc *sc = ap->ap_sc;
1597 u_int32_t is, ci_saved, ci_masked, processed = 0;
1598 int slot, need_restart = 0;
1599 struct ahci_ccb *ccb;
1600 volatile u_int32_t *active;
1601 #ifdef DIAGNOSTIC
1602 u_int32_t tmp;
1603 #endif
1604
1605 is = ahci_pread(ap, AHCI_PREG_IS);
1606
1607
1608 if (ci_mask == AHCI_PREG_CI_ALL_SLOTS)
1609 ahci_pwrite(ap, AHCI_PREG_IS, is);
1610
1611 if (is)
1612 DPRINTF(AHCI_D_INTR, "%s: interrupt: %b\n", PORTNAME(ap),
1613 is, AHCI_PFMT_IS);
1614
1615 if (ap->ap_sactive) {
1616
1617 KASSERT(ap->ap_active == 0);
1618 KASSERT(ap->ap_active_cnt == 0);
1619 ci_saved = ahci_pread(ap, AHCI_PREG_SACT);
1620 active = &ap->ap_sactive;
1621 } else {
1622
1623 ci_saved = ahci_pread(ap, AHCI_PREG_CI);
1624 active = &ap->ap_active;
1625 }
1626
1627
1628 if (is & AHCI_PREG_IS_TFES) {
1629 u_int32_t tfd, serr;
1630 int err_slot;
1631
1632 tfd = ahci_pread(ap, AHCI_PREG_TFD);
1633 serr = ahci_pread(ap, AHCI_PREG_SERR);
1634
1635 if (ap->ap_sactive == 0) {
1636
1637 err_slot = AHCI_PREG_CMD_CCS(ahci_pread(ap,
1638 AHCI_PREG_CMD));
1639 ccb = &ap->ap_ccbs[err_slot];
1640
1641
1642 memcpy(&ccb->ccb_xa.rfis, ap->ap_rfis->rfis,
1643 sizeof(struct ata_fis_d2h));
1644 } else
1645 err_slot = -1;
1646
1647 DPRINTF(AHCI_D_VERBOSE, "%s: errored slot %d, TFD: %b, SERR:"
1648 " %b, DIAG: %b\n", PORTNAME(ap), err_slot, tfd,
1649 AHCI_PFMT_TFD_STS, AHCI_PREG_SERR_ERR(serr),
1650 AHCI_PFMT_SERR_ERR, AHCI_PREG_SERR_DIAG(serr),
1651 AHCI_PFMT_SERR_DIAG);
1652
1653
1654 ahci_port_stop(ap, 0);
1655 need_restart = 1;
1656
1657
1658 ahci_pwrite(ap, AHCI_PREG_SERR, serr);
1659
1660
1661 ahci_pwrite(ap, AHCI_PREG_IS, AHCI_PREG_IS_TFES |
1662 AHCI_PREG_IS_IFS);
1663 is = ahci_pread(ap, AHCI_PREG_IS);
1664
1665
1666 if (ISSET(tfd, AHCI_PREG_TFD_STS_BSY | AHCI_PREG_TFD_STS_DRQ)) {
1667 printf("%s: attempting to idle device\n", PORTNAME(ap));
1668 if (ahci_port_softreset(ap)) {
1669 printf("%s: failed to soft reset device\n",
1670 PORTNAME(ap));
1671 if (ahci_port_portreset(ap)) {
1672 printf("%s: failed to port reset "
1673 "device, give up on it\n",
1674 PORTNAME(ap));
1675 goto fatal;
1676 }
1677 }
1678
1679
1680 } else if (ap->ap_sactive) {
1681
1682 ahci_port_read_ncq_error(ap, &err_slot);
1683 if (err_slot < 0)
1684 goto failall;
1685
1686 DPRINTF(AHCI_D_VERBOSE, "%s: NCQ errored slot %d\n",
1687 PORTNAME(ap), err_slot);
1688
1689 ccb = &ap->ap_ccbs[err_slot];
1690 } else {
1691
1692 }
1693
1694
1695
1696
1697
1698 if (err_slot == -1) {
1699 if (ahci_port_softreset(ap) != 0 &&
1700 ahci_port_portreset(ap) != 0) {
1701 printf("%s: couldn't reset after NCQ error, "
1702 "disabling device.\n", PORTNAME(ap));
1703 goto fatal;
1704 }
1705 printf("%s: couldn't recover NCQ error, failing "
1706 "all outstanding commands.\n", PORTNAME(ap));
1707 goto failall;
1708 }
1709
1710
1711 ci_saved &= ~(1 << err_slot);
1712
1713
1714 KASSERT(ccb->ccb_xa.state == ATA_S_ONCHIP);
1715 ccb->ccb_xa.state = ATA_S_ERROR;
1716
1717 #ifdef DIAGNOSTIC
1718
1719 if (ap->ap_sactive == 0) {
1720 tmp = ci_saved;
1721 if (tmp) {
1722 slot = ffs(tmp) - 1;
1723 tmp &= ~(1 << slot);
1724 KASSERT(tmp == 0);
1725 }
1726 }
1727 #endif
1728 }
1729
1730
1731 if (is & (AHCI_PREG_IS_TFES | AHCI_PREG_IS_HBFS | AHCI_PREG_IS_IFS |
1732 AHCI_PREG_IS_OFS | AHCI_PREG_IS_UFS)) {
1733 printf("%s: unrecoverable errors (IS: %b), disabling port.\n",
1734 PORTNAME(ap), is, AHCI_PFMT_IS);
1735
1736
1737 goto fatal;
1738 }
1739
1740
1741 if (ap->ap_state == AP_S_FATAL_ERROR) {
1742 fatal:
1743 ap->ap_state = AP_S_FATAL_ERROR;
1744 failall:
1745
1746
1747 ahci_port_stop(ap, 1);
1748
1749
1750 ci_masked = ci_saved & *active;
1751 while (ci_masked) {
1752 slot = ffs(ci_masked) - 1;
1753 ccb = &ap->ap_ccbs[slot];
1754 ci_masked &= ~(1 << slot);
1755 ccb->ccb_xa.state = ATA_S_ERROR;
1756 }
1757
1758
1759 ci_saved &= ~*active;
1760
1761
1762 if (ap->ap_state == AP_S_FATAL_ERROR)
1763 need_restart = 0;
1764 }
1765
1766
1767
1768
1769
1770
1771 ci_masked = ~ci_saved & *active & ci_mask;
1772 while (ci_masked) {
1773 slot = ffs(ci_masked) - 1;
1774 ccb = &ap->ap_ccbs[slot];
1775 ci_masked &= ~(1 << slot);
1776
1777 DPRINTF(AHCI_D_INTR, "%s: slot %d is complete%s\n",
1778 PORTNAME(ap), slot, ccb->ccb_xa.state == ATA_S_ERROR ?
1779 " (error)" : "");
1780
1781 bus_dmamap_sync(sc->sc_dmat,
1782 AHCI_DMA_MAP(ap->ap_dmamem_cmd_list),
1783 ccb->ccb_slot * sizeof(struct ahci_cmd_hdr),
1784 sizeof(struct ahci_cmd_hdr), BUS_DMASYNC_POSTWRITE);
1785
1786 bus_dmamap_sync(sc->sc_dmat,
1787 AHCI_DMA_MAP(ap->ap_dmamem_cmd_table),
1788 ccb->ccb_slot * sizeof(struct ahci_cmd_table),
1789 sizeof(struct ahci_cmd_table), BUS_DMASYNC_POSTWRITE);
1790
1791 bus_dmamap_sync(sc->sc_dmat,
1792 AHCI_DMA_MAP(ap->ap_dmamem_rfis), 0,
1793 sizeof(struct ahci_rfis), BUS_DMASYNC_POSTREAD);
1794
1795 *active &= ~(1 << ccb->ccb_slot);
1796 ccb->ccb_done(ccb);
1797
1798 processed |= 1 << ccb->ccb_slot;
1799 }
1800
1801 if (need_restart) {
1802
1803 ahci_port_start(ap, 0);
1804
1805
1806 if (ci_saved) {
1807 #ifdef DIAGNOSTIC
1808 tmp = ci_saved;
1809 while (tmp) {
1810 slot = ffs(tmp) - 1;
1811 tmp &= ~(1 << slot);
1812 ccb = &ap->ap_ccbs[slot];
1813 KASSERT(ccb->ccb_xa.state == ATA_S_ONCHIP);
1814 KASSERT((!!(ccb->ccb_xa.flags & ATA_F_NCQ)) ==
1815 (!!ap->ap_sactive));
1816 }
1817 #endif
1818 DPRINTF(AHCI_D_VERBOSE, "%s: ahci_port_intr "
1819 "re-enabling%s slots %08x\n", PORTNAME(ap),
1820 ap->ap_sactive ? " NCQ" : "", ci_saved);
1821
1822 if (ap->ap_sactive)
1823 ahci_pwrite(ap, AHCI_PREG_SACT, ci_saved);
1824 ahci_pwrite(ap, AHCI_PREG_CI, ci_saved);
1825 }
1826 }
1827
1828 return (processed);
1829 }
1830
1831 struct ahci_ccb *
1832 ahci_get_ccb(struct ahci_port *ap)
1833 {
1834 struct ahci_ccb *ccb;
1835
1836 ccb = TAILQ_FIRST(&ap->ap_ccb_free);
1837 if (ccb != NULL) {
1838 KASSERT(ccb->ccb_xa.state == ATA_S_PUT);
1839 TAILQ_REMOVE(&ap->ap_ccb_free, ccb, ccb_entry);
1840 ccb->ccb_xa.state = ATA_S_SETUP;
1841 }
1842
1843 return (ccb);
1844 }
1845
1846 void
1847 ahci_put_ccb(struct ahci_ccb *ccb)
1848 {
1849 struct ahci_port *ap = ccb->ccb_port;
1850
1851 #ifdef DIAGNOSTIC
1852 if (ccb->ccb_xa.state != ATA_S_COMPLETE &&
1853 ccb->ccb_xa.state != ATA_S_TIMEOUT &&
1854 ccb->ccb_xa.state != ATA_S_ERROR) {
1855 printf("%s: invalid ata_xfer state %02x in ahci_put_ccb, "
1856 "slot %d\n", PORTNAME(ccb->ccb_port), ccb->ccb_xa.state,
1857 ccb->ccb_slot);
1858 }
1859 #endif
1860
1861 ccb->ccb_xa.state = ATA_S_PUT;
1862 TAILQ_INSERT_TAIL(&ap->ap_ccb_free, ccb, ccb_entry);
1863 }
1864
1865 struct ahci_ccb *
1866 ahci_get_err_ccb(struct ahci_port *ap)
1867 {
1868 struct ahci_ccb *err_ccb;
1869 u_int32_t sact;
1870
1871 splassert(IPL_BIO);
1872
1873
1874 sact = ahci_pread(ap, AHCI_PREG_SACT);
1875 if (sact != 0)
1876 printf("ahci_get_err_ccb but SACT %08x != 0?\n", sact);
1877 KASSERT(ahci_pread(ap, AHCI_PREG_CI) == 0);
1878
1879 #ifdef DIAGNOSTIC
1880 KASSERT(ap->ap_err_busy == 0);
1881 ap->ap_err_busy = 1;
1882 #endif
1883
1884 ap->ap_err_saved_active = ap->ap_active;
1885 ap->ap_err_saved_active_cnt = ap->ap_active_cnt;
1886 ap->ap_err_saved_sactive = ap->ap_sactive;
1887
1888
1889
1890
1891
1892 ap->ap_active = ap->ap_active_cnt = ap->ap_sactive = 0;
1893
1894
1895
1896
1897
1898 err_ccb = ahci_get_ccb(ap);
1899 KASSERT(err_ccb != NULL);
1900 err_ccb->ccb_xa.flags = 0;
1901 err_ccb->ccb_done = ahci_empty_done;
1902
1903 return err_ccb;
1904 }
1905
1906 void
1907 ahci_put_err_ccb(struct ahci_ccb *ccb)
1908 {
1909 struct ahci_port *ap = ccb->ccb_port;
1910 u_int32_t sact;
1911
1912 splassert(IPL_BIO);
1913
1914 #ifdef DIAGNOSTIC
1915 KASSERT(ap->ap_err_busy);
1916 #endif
1917
1918 sact = ahci_pread(ap, AHCI_PREG_SACT);
1919 if (sact != 0)
1920 printf("ahci_port_err_ccb_restore but SACT %08x != 0?\n", sact);
1921 KASSERT(ahci_pread(ap, AHCI_PREG_CI) == 0);
1922
1923
1924 ahci_put_ccb(ccb);
1925
1926
1927 ap->ap_sactive = ap->ap_err_saved_sactive;
1928 ap->ap_active_cnt = ap->ap_err_saved_active_cnt;
1929 ap->ap_active = ap->ap_err_saved_active;
1930
1931 #ifdef DIAGNOSTIC
1932 ap->ap_err_busy = 0;
1933 #endif
1934 }
1935
1936 int
1937 ahci_port_read_ncq_error(struct ahci_port *ap, int *err_slotp)
1938 {
1939 struct ahci_ccb *ccb;
1940 struct ahci_cmd_hdr *cmd_slot;
1941 u_int32_t cmd;
1942 struct ata_fis_h2d *fis;
1943 int rc = EIO;
1944
1945 DPRINTF(AHCI_D_VERBOSE, "%s: read log page\n", PORTNAME(ap));
1946
1947
1948 cmd = ahci_pread(ap, AHCI_PREG_CMD) & ~AHCI_PREG_CMD_ICC;
1949
1950
1951 KASSERT((cmd & AHCI_PREG_CMD_CR) == 0);
1952 ahci_port_start(ap, 0);
1953
1954
1955 ccb = ahci_get_err_ccb(ap);
1956 ccb->ccb_xa.flags = ATA_F_NOWAIT | ATA_F_READ | ATA_F_POLL;
1957 ccb->ccb_xa.data = ap->ap_err_scratch;
1958 ccb->ccb_xa.datalen = 512;
1959 cmd_slot = ccb->ccb_cmd_hdr;
1960 bzero(ccb->ccb_cmd_table, sizeof(struct ahci_cmd_table));
1961
1962 fis = (struct ata_fis_h2d *)ccb->ccb_cmd_table->cfis;
1963 fis->type = ATA_FIS_TYPE_H2D;
1964 fis->flags = ATA_H2D_FLAGS_CMD;
1965 fis->command = ATA_C_READ_LOG_EXT;
1966 fis->lba_low = 0x10;
1967 fis->sector_count = 1;
1968 fis->sector_count_exp = 0;
1969 fis->lba_mid = 0;
1970 fis->lba_mid_exp = 0;
1971 fis->device = 0;
1972
1973 cmd_slot->flags = htole16(5);
1974
1975 if (ahci_load_prdt(ccb) != 0) {
1976 rc = ENOMEM;
1977 goto err;
1978 }
1979
1980 ccb->ccb_xa.state = ATA_S_PENDING;
1981 if (ahci_poll(ccb, 1000, NULL) != 0)
1982 goto err;
1983
1984 rc = 0;
1985 err:
1986
1987 if (rc != 0 && ISSET(ap->ap_active, 1 << ccb->ccb_slot)) {
1988 printf("%s: log page read failed, slot %d was still active.\n",
1989 PORTNAME(ap), ccb->ccb_slot);
1990 ahci_port_stop(ap, 0);
1991 }
1992
1993
1994 ahci_unload_prdt(ccb);
1995 ahci_put_err_ccb(ccb);
1996
1997
1998 if (rc == 0) {
1999 struct ata_log_page_10h *log;
2000 int err_slot;
2001
2002 log = (struct ata_log_page_10h *)ap->ap_err_scratch;
2003 if (ISSET(log->err_regs.type, ATA_LOG_10H_TYPE_NOTQUEUED)) {
2004
2005 printf("%s: read NCQ error page, but not an NCQ "
2006 "error?\n", PORTNAME(ap));
2007 rc = ESRCH;
2008 } else {
2009
2010 *err_slotp = err_slot = log->err_regs.type &
2011 ATA_LOG_10H_TYPE_TAG_MASK;
2012
2013 ccb = &ap->ap_ccbs[err_slot];
2014 memcpy(&ccb->ccb_xa.rfis, &log->err_regs,
2015 sizeof(struct ata_fis_d2h));
2016 ccb->ccb_xa.rfis.type = ATA_FIS_TYPE_D2H;
2017 ccb->ccb_xa.rfis.flags = 0;
2018 }
2019 }
2020
2021
2022 ahci_pwrite(ap, AHCI_PREG_CMD, cmd);
2023
2024 return (rc);
2025 }
2026
2027 struct ahci_dmamem *
2028 ahci_dmamem_alloc(struct ahci_softc *sc, size_t size)
2029 {
2030 struct ahci_dmamem *adm;
2031 int nsegs;
2032
2033 adm = malloc(sizeof(struct ahci_dmamem), M_DEVBUF, M_NOWAIT);
2034 if (adm == NULL)
2035 return (NULL);
2036
2037 bzero(adm, sizeof(struct ahci_dmamem));
2038 adm->adm_size = size;
2039
2040 if (bus_dmamap_create(sc->sc_dmat, size, 1, size, 0,
2041 BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &adm->adm_map) != 0)
2042 goto admfree;
2043
2044 if (bus_dmamem_alloc(sc->sc_dmat, size, PAGE_SIZE, 0, &adm->adm_seg,
2045 1, &nsegs, BUS_DMA_NOWAIT) != 0)
2046 goto destroy;
2047
2048 if (bus_dmamem_map(sc->sc_dmat, &adm->adm_seg, nsegs, size,
2049 &adm->adm_kva, BUS_DMA_NOWAIT) != 0)
2050 goto free;
2051
2052 if (bus_dmamap_load(sc->sc_dmat, adm->adm_map, adm->adm_kva, size,
2053 NULL, BUS_DMA_NOWAIT) != 0)
2054 goto unmap;
2055
2056 bzero(adm->adm_kva, size);
2057
2058 return (adm);
2059
2060 unmap:
2061 bus_dmamem_unmap(sc->sc_dmat, adm->adm_kva, size);
2062 free:
2063 bus_dmamem_free(sc->sc_dmat, &adm->adm_seg, 1);
2064 destroy:
2065 bus_dmamap_destroy(sc->sc_dmat, adm->adm_map);
2066 admfree:
2067 free(adm, M_DEVBUF);
2068
2069 return (NULL);
2070 }
2071
2072 void
2073 ahci_dmamem_free(struct ahci_softc *sc, struct ahci_dmamem *adm)
2074 {
2075 bus_dmamap_unload(sc->sc_dmat, adm->adm_map);
2076 bus_dmamem_unmap(sc->sc_dmat, adm->adm_kva, adm->adm_size);
2077 bus_dmamem_free(sc->sc_dmat, &adm->adm_seg, 1);
2078 bus_dmamap_destroy(sc->sc_dmat, adm->adm_map);
2079 free(adm, M_DEVBUF);
2080 }
2081
2082 u_int32_t
2083 ahci_read(struct ahci_softc *sc, bus_size_t r)
2084 {
2085 bus_space_barrier(sc->sc_iot, sc->sc_ioh, r, 4,
2086 BUS_SPACE_BARRIER_READ);
2087 return (bus_space_read_4(sc->sc_iot, sc->sc_ioh, r));
2088 }
2089
2090 void
2091 ahci_write(struct ahci_softc *sc, bus_size_t r, u_int32_t v)
2092 {
2093 bus_space_write_4(sc->sc_iot, sc->sc_ioh, r, v);
2094 bus_space_barrier(sc->sc_iot, sc->sc_ioh, r, 4,
2095 BUS_SPACE_BARRIER_WRITE);
2096 }
2097
2098 int
2099 ahci_wait_ne(struct ahci_softc *sc, bus_size_t r, u_int32_t mask,
2100 u_int32_t target)
2101 {
2102 int i;
2103
2104 for (i = 0; i < 1000; i++) {
2105 if ((ahci_read(sc, r) & mask) != target)
2106 return (0);
2107 delay(1000);
2108 }
2109
2110 return (1);
2111 }
2112
2113 u_int32_t
2114 ahci_pread(struct ahci_port *ap, bus_size_t r)
2115 {
2116 bus_space_barrier(ap->ap_sc->sc_iot, ap->ap_ioh, r, 4,
2117 BUS_SPACE_BARRIER_READ);
2118 return (bus_space_read_4(ap->ap_sc->sc_iot, ap->ap_ioh, r));
2119 }
2120
2121 void
2122 ahci_pwrite(struct ahci_port *ap, bus_size_t r, u_int32_t v)
2123 {
2124 bus_space_write_4(ap->ap_sc->sc_iot, ap->ap_ioh, r, v);
2125 bus_space_barrier(ap->ap_sc->sc_iot, ap->ap_ioh, r, 4,
2126 BUS_SPACE_BARRIER_WRITE);
2127 }
2128
2129 int
2130 ahci_pwait_eq(struct ahci_port *ap, bus_size_t r, u_int32_t mask,
2131 u_int32_t target)
2132 {
2133 int i;
2134
2135 for (i = 0; i < 1000; i++) {
2136 if ((ahci_pread(ap, r) & mask) == target)
2137 return (0);
2138 delay(1000);
2139 }
2140
2141 return (1);
2142 }
2143
2144 int
2145 ahci_ata_probe(void *xsc, int port)
2146 {
2147 struct ahci_softc *sc = xsc;
2148 struct ahci_port *ap = sc->sc_ports[port];
2149 u_int32_t sig;
2150
2151 if (ap == NULL)
2152 return (ATA_PORT_T_NONE);
2153
2154 sig = ahci_pread(ap, AHCI_PREG_SIG);
2155 if ((sig & 0xffff0000) == (SATA_SIGNATURE_ATAPI & 0xffff0000))
2156 return (ATA_PORT_T_ATAPI);
2157 else
2158 return (ATA_PORT_T_DISK);
2159 }
2160
2161 struct ata_xfer *
2162 ahci_ata_get_xfer(void *aaa_cookie, int port)
2163 {
2164 struct ahci_softc *sc = aaa_cookie;
2165 struct ahci_port *ap = sc->sc_ports[port];
2166 struct ahci_ccb *ccb;
2167
2168 splassert(IPL_BIO);
2169
2170 ccb = ahci_get_ccb(ap);
2171 if (ccb == NULL) {
2172 DPRINTF(AHCI_D_XFER, "%s: ahci_ata_get_xfer: NULL ccb\n",
2173 PORTNAME(ap));
2174 return (NULL);
2175 }
2176
2177 DPRINTF(AHCI_D_XFER, "%s: ahci_ata_get_xfer got slot %d\n",
2178 PORTNAME(ap), ccb->ccb_slot);
2179
2180 return ((struct ata_xfer *)ccb);
2181 }
2182
2183 void
2184 ahci_ata_put_xfer(struct ata_xfer *xa)
2185 {
2186 struct ahci_ccb *ccb = (struct ahci_ccb *)xa;
2187
2188 splassert(IPL_BIO);
2189
2190 DPRINTF(AHCI_D_XFER, "ahci_ata_put_xfer slot %d\n", ccb->ccb_slot);
2191
2192 ahci_put_ccb(ccb);
2193 }
2194
2195 int
2196 ahci_ata_cmd(struct ata_xfer *xa)
2197 {
2198 struct ahci_ccb *ccb = (struct ahci_ccb *)xa;
2199 struct ahci_cmd_hdr *cmd_slot;
2200 int s;
2201
2202 KASSERT(xa->state == ATA_S_SETUP);
2203
2204 if (ccb->ccb_port->ap_state == AP_S_FATAL_ERROR)
2205 goto failcmd;
2206
2207 ccb->ccb_done = ahci_ata_cmd_done;
2208
2209 cmd_slot = ccb->ccb_cmd_hdr;
2210 cmd_slot->flags = htole16(5);
2211
2212 if (xa->flags & ATA_F_WRITE)
2213 cmd_slot->flags |= htole16(AHCI_CMD_LIST_FLAG_W);
2214
2215 if (xa->flags & ATA_F_PACKET)
2216 cmd_slot->flags |= htole16(AHCI_CMD_LIST_FLAG_A);
2217
2218 if (ahci_load_prdt(ccb) != 0)
2219 goto failcmd;
2220
2221 timeout_set(&xa->stimeout, ahci_ata_cmd_timeout, ccb);
2222
2223 xa->state = ATA_S_PENDING;
2224
2225 if (xa->flags & ATA_F_POLL) {
2226 ahci_poll(ccb, xa->timeout, ahci_ata_cmd_timeout);
2227 return (ATA_COMPLETE);
2228 }
2229
2230 timeout_add(&xa->stimeout, (xa->timeout * hz) / 1000);
2231
2232 s = splbio();
2233 ahci_start(ccb);
2234 splx(s);
2235 return (ATA_QUEUED);
2236
2237 failcmd:
2238 s = splbio();
2239 xa->state = ATA_S_ERROR;
2240 xa->complete(xa);
2241 splx(s);
2242 return (ATA_ERROR);
2243 }
2244
2245 void
2246 ahci_ata_cmd_done(struct ahci_ccb *ccb)
2247 {
2248 struct ata_xfer *xa = &ccb->ccb_xa;
2249
2250 timeout_del(&xa->stimeout);
2251
2252 if (xa->state == ATA_S_ONCHIP || xa->state == ATA_S_ERROR)
2253 ahci_issue_pending_commands(ccb->ccb_port,
2254 xa->flags & ATA_F_NCQ);
2255
2256 ahci_unload_prdt(ccb);
2257
2258 if (xa->state == ATA_S_ONCHIP)
2259 xa->state = ATA_S_COMPLETE;
2260 #ifdef DIAGNOSTIC
2261 else if (xa->state != ATA_S_ERROR && xa->state != ATA_S_TIMEOUT)
2262 printf("%s: invalid ata_xfer state %02x in ahci_ata_cmd_done, "
2263 "slot %d\n", PORTNAME(ccb->ccb_port), xa->state,
2264 ccb->ccb_slot);
2265 #endif
2266 if (xa->state != ATA_S_TIMEOUT)
2267 xa->complete(xa);
2268 }
2269
2270 void
2271 ahci_ata_cmd_timeout(void *arg)
2272 {
2273 struct ahci_ccb *ccb = arg;
2274 struct ata_xfer *xa = &ccb->ccb_xa;
2275 struct ahci_port *ap = ccb->ccb_port;
2276 int s, ccb_was_started, ncq_cmd;
2277 volatile u_int32_t *active;
2278
2279 s = splbio();
2280
2281 ncq_cmd = (xa->flags & ATA_F_NCQ);
2282 active = ncq_cmd ? &ap->ap_sactive : &ap->ap_active;
2283
2284 if (ccb->ccb_xa.state == ATA_S_PENDING) {
2285 DPRINTF(AHCI_D_TIMEOUT, "%s: command for slot %d timed out "
2286 "before it got on chip\n", PORTNAME(ap), ccb->ccb_slot);
2287 TAILQ_REMOVE(&ap->ap_ccb_pending, ccb, ccb_entry);
2288 ccb_was_started = 0;
2289 } else if (ccb->ccb_xa.state == ATA_S_ONCHIP && ahci_port_intr(ap,
2290 1 << ccb->ccb_slot)) {
2291 DPRINTF(AHCI_D_TIMEOUT, "%s: final poll of port completed "
2292 "command in slot %d\n", PORTNAME(ap), ccb->ccb_slot);
2293 goto ret;
2294 } else if (ccb->ccb_xa.state != ATA_S_ONCHIP) {
2295 DPRINTF(AHCI_D_TIMEOUT, "%s: command slot %d already "
2296 "handled%s\n", PORTNAME(ap), ccb->ccb_slot,
2297 ISSET(*active, 1 << ccb->ccb_slot) ?
2298 " but slot is still active?" : ".");
2299 goto ret;
2300 } else if (!ISSET(ahci_pread(ap, ncq_cmd ? AHCI_PREG_SACT :
2301 AHCI_PREG_CI), 1 << ccb->ccb_slot) && ISSET(*active,
2302 1 << ccb->ccb_slot)) {
2303 DPRINTF(AHCI_D_TIMEOUT, "%s: command slot %d completed but "
2304 "IRQ handler didn't detect it. Why?\n", PORTNAME(ap),
2305 ccb->ccb_slot);
2306 *active &= ~(1 << ccb->ccb_slot);
2307 ccb->ccb_done(ccb);
2308 goto ret;
2309 } else {
2310 ccb_was_started = 1;
2311 }
2312
2313
2314 ccb->ccb_xa.state = ATA_S_TIMEOUT;
2315 *active &= ~(1 << ccb->ccb_slot);
2316 DPRINTF(AHCI_D_TIMEOUT, "%s: run completion (1)\n", PORTNAME(ap));
2317 ccb->ccb_done(ccb);
2318
2319
2320
2321 if (ccb_was_started) {
2322 DPRINTF(AHCI_D_TIMEOUT, "%s: resetting port to abort%s command "
2323 "in slot %d, active %08x\n", PORTNAME(ap), ncq_cmd ? " NCQ"
2324 : "", ccb->ccb_slot, *active);
2325 if (ahci_port_softreset(ap) != 0 && ahci_port_portreset(ap)
2326 != 0) {
2327 printf("%s: failed to reset port during timeout "
2328 "handling, disabling it\n", PORTNAME(ap));
2329 ap->ap_state = AP_S_FATAL_ERROR;
2330 }
2331
2332
2333 if (*active) {
2334 DPRINTF(AHCI_D_TIMEOUT, "%s: re-enabling%s slots "
2335 "%08x\n", PORTNAME(ap), ncq_cmd ? " NCQ" : "",
2336 *active);
2337 if (ncq_cmd)
2338 ahci_pwrite(ap, AHCI_PREG_SACT, *active);
2339 ahci_pwrite(ap, AHCI_PREG_CI, *active);
2340 }
2341 }
2342
2343
2344 DPRINTF(AHCI_D_TIMEOUT, "%s: issue pending\n", PORTNAME(ap));
2345 if (ccb_was_started)
2346 ahci_issue_pending_commands(ap, ncq_cmd);
2347 else if (ap->ap_active == 0)
2348 ahci_issue_pending_ncq_commands(ap);
2349
2350
2351 DPRINTF(AHCI_D_TIMEOUT, "%s: run completion (2)\n", PORTNAME(ap));
2352 xa->complete(xa);
2353
2354 DPRINTF(AHCI_D_TIMEOUT, "%s: splx\n", PORTNAME(ap));
2355 ret:
2356 splx(s);
2357 }
2358
2359 void
2360 ahci_empty_done(struct ahci_ccb *ccb)
2361 {
2362 ccb->ccb_xa.state = ATA_S_COMPLETE;
2363 }