ahcisata_core.c revision 1.58 1 1.58 jdolecek /* $NetBSD: ahcisata_core.c,v 1.58 2017/10/07 16:05:32 jdolecek Exp $ */
2 1.1 bouyer
3 1.1 bouyer /*
4 1.1 bouyer * Copyright (c) 2006 Manuel Bouyer.
5 1.1 bouyer *
6 1.1 bouyer * Redistribution and use in source and binary forms, with or without
7 1.1 bouyer * modification, are permitted provided that the following conditions
8 1.1 bouyer * are met:
9 1.1 bouyer * 1. Redistributions of source code must retain the above copyright
10 1.1 bouyer * notice, this list of conditions and the following disclaimer.
11 1.1 bouyer * 2. Redistributions in binary form must reproduce the above copyright
12 1.1 bouyer * notice, this list of conditions and the following disclaimer in the
13 1.1 bouyer * documentation and/or other materials provided with the distribution.
14 1.1 bouyer *
15 1.1 bouyer * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 1.1 bouyer * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 1.1 bouyer * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 1.1 bouyer * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 1.1 bouyer * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 1.1 bouyer * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 1.1 bouyer * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 1.1 bouyer * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 1.1 bouyer * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 1.1 bouyer * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 1.1 bouyer *
26 1.1 bouyer */
27 1.1 bouyer
28 1.1 bouyer #include <sys/cdefs.h>
29 1.58 jdolecek __KERNEL_RCSID(0, "$NetBSD: ahcisata_core.c,v 1.58 2017/10/07 16:05:32 jdolecek Exp $");
30 1.1 bouyer
31 1.1 bouyer #include <sys/types.h>
32 1.1 bouyer #include <sys/malloc.h>
33 1.1 bouyer #include <sys/param.h>
34 1.1 bouyer #include <sys/kernel.h>
35 1.1 bouyer #include <sys/systm.h>
36 1.1 bouyer #include <sys/disklabel.h>
37 1.4 ad #include <sys/proc.h>
38 1.8 bouyer #include <sys/buf.h>
39 1.1 bouyer
40 1.1 bouyer #include <dev/ata/atareg.h>
41 1.1 bouyer #include <dev/ata/satavar.h>
42 1.1 bouyer #include <dev/ata/satareg.h>
43 1.26 jakllsch #include <dev/ata/satafisvar.h>
44 1.20 jakllsch #include <dev/ata/satafisreg.h>
45 1.40 bouyer #include <dev/ata/satapmpreg.h>
46 1.1 bouyer #include <dev/ic/ahcisatavar.h>
47 1.40 bouyer #include <dev/ic/wdcreg.h>
48 1.1 bouyer
49 1.16 bouyer #include <dev/scsipi/scsi_all.h> /* for SCSI status */
50 1.16 bouyer
51 1.8 bouyer #include "atapibus.h"
52 1.8 bouyer
53 1.1 bouyer #ifdef AHCI_DEBUG
54 1.40 bouyer int ahcidebug_mask = 0;
55 1.1 bouyer #endif
56 1.1 bouyer
57 1.29 jakllsch static void ahci_probe_drive(struct ata_channel *);
58 1.29 jakllsch static void ahci_setup_channel(struct ata_channel *);
59 1.1 bouyer
60 1.58 jdolecek static int ahci_ata_bio(struct ata_drive_datas *, struct ata_xfer *);
61 1.58 jdolecek static int ahci_do_reset_drive(struct ata_channel *, int, int, uint32_t *,
62 1.58 jdolecek struct ata_xfer *xfer);
63 1.40 bouyer static void ahci_reset_drive(struct ata_drive_datas *, int, uint32_t *);
64 1.29 jakllsch static void ahci_reset_channel(struct ata_channel *, int);
65 1.58 jdolecek static int ahci_exec_command(struct ata_drive_datas *, struct ata_xfer *);
66 1.29 jakllsch static int ahci_ata_addref(struct ata_drive_datas *);
67 1.29 jakllsch static void ahci_ata_delref(struct ata_drive_datas *);
68 1.29 jakllsch static void ahci_killpending(struct ata_drive_datas *);
69 1.29 jakllsch
70 1.58 jdolecek static int ahci_cmd_start(struct ata_channel *, struct ata_xfer *);
71 1.29 jakllsch static int ahci_cmd_complete(struct ata_channel *, struct ata_xfer *, int);
72 1.58 jdolecek static void ahci_cmd_poll(struct ata_channel *, struct ata_xfer *);
73 1.58 jdolecek static void ahci_cmd_abort(struct ata_channel *, struct ata_xfer *);
74 1.58 jdolecek static void ahci_cmd_done(struct ata_channel *, struct ata_xfer *);
75 1.58 jdolecek static void ahci_cmd_done_end(struct ata_channel *, struct ata_xfer *);
76 1.58 jdolecek static void ahci_cmd_kill_xfer(struct ata_channel *, struct ata_xfer *, int);
77 1.58 jdolecek static int ahci_bio_start(struct ata_channel *, struct ata_xfer *);
78 1.58 jdolecek static void ahci_bio_poll(struct ata_channel *, struct ata_xfer *);
79 1.58 jdolecek static void ahci_bio_abort(struct ata_channel *, struct ata_xfer *);
80 1.29 jakllsch static int ahci_bio_complete(struct ata_channel *, struct ata_xfer *, int);
81 1.29 jakllsch static void ahci_bio_kill_xfer(struct ata_channel *, struct ata_xfer *, int) ;
82 1.29 jakllsch static void ahci_channel_stop(struct ahci_softc *, struct ata_channel *, int);
83 1.40 bouyer static void ahci_channel_start(struct ahci_softc *, struct ata_channel *,
84 1.40 bouyer int, int);
85 1.58 jdolecek void ahci_channel_recover(struct ahci_softc *, struct ata_channel *, int);
86 1.29 jakllsch static int ahci_dma_setup(struct ata_channel *, int, void *, size_t, int);
87 1.1 bouyer
88 1.8 bouyer #if NATAPIBUS > 0
89 1.29 jakllsch static void ahci_atapibus_attach(struct atabus_softc *);
90 1.29 jakllsch static void ahci_atapi_kill_pending(struct scsipi_periph *);
91 1.29 jakllsch static void ahci_atapi_minphys(struct buf *);
92 1.29 jakllsch static void ahci_atapi_scsipi_request(struct scsipi_channel *,
93 1.8 bouyer scsipi_adapter_req_t, void *);
94 1.58 jdolecek static int ahci_atapi_start(struct ata_channel *, struct ata_xfer *);
95 1.58 jdolecek static void ahci_atapi_poll(struct ata_channel *, struct ata_xfer *);
96 1.58 jdolecek static void ahci_atapi_abort(struct ata_channel *, struct ata_xfer *);
97 1.29 jakllsch static int ahci_atapi_complete(struct ata_channel *, struct ata_xfer *, int);
98 1.29 jakllsch static void ahci_atapi_kill_xfer(struct ata_channel *, struct ata_xfer *, int);
99 1.29 jakllsch static void ahci_atapi_probe_device(struct atapibus_softc *, int);
100 1.8 bouyer
101 1.8 bouyer static const struct scsipi_bustype ahci_atapi_bustype = {
102 1.8 bouyer SCSIPI_BUSTYPE_ATAPI,
103 1.8 bouyer atapi_scsipi_cmd,
104 1.8 bouyer atapi_interpret_sense,
105 1.8 bouyer atapi_print_addr,
106 1.8 bouyer ahci_atapi_kill_pending,
107 1.34 bouyer NULL,
108 1.8 bouyer };
109 1.8 bouyer #endif /* NATAPIBUS */
110 1.8 bouyer
111 1.1 bouyer #define ATA_DELAY 10000 /* 10s for a drive I/O */
112 1.24 bouyer #define ATA_RESET_DELAY 31000 /* 31s for a drive reset */
113 1.24 bouyer #define AHCI_RST_WAIT (ATA_RESET_DELAY / 10)
114 1.1 bouyer
115 1.1 bouyer const struct ata_bustype ahci_ata_bustype = {
116 1.1 bouyer SCSIPI_BUSTYPE_ATA,
117 1.1 bouyer ahci_ata_bio,
118 1.1 bouyer ahci_reset_drive,
119 1.1 bouyer ahci_reset_channel,
120 1.1 bouyer ahci_exec_command,
121 1.1 bouyer ata_get_params,
122 1.1 bouyer ahci_ata_addref,
123 1.1 bouyer ahci_ata_delref,
124 1.1 bouyer ahci_killpending
125 1.1 bouyer };
126 1.1 bouyer
127 1.29 jakllsch static void ahci_intr_port(struct ahci_softc *, struct ahci_channel *);
128 1.7 joerg static void ahci_setup_port(struct ahci_softc *sc, int i);
129 1.7 joerg
130 1.51 jmcneill static void
131 1.51 jmcneill ahci_enable(struct ahci_softc *sc)
132 1.51 jmcneill {
133 1.51 jmcneill uint32_t ghc;
134 1.51 jmcneill
135 1.51 jmcneill ghc = AHCI_READ(sc, AHCI_GHC);
136 1.51 jmcneill if (!(ghc & AHCI_GHC_AE)) {
137 1.51 jmcneill ghc |= AHCI_GHC_AE;
138 1.51 jmcneill AHCI_WRITE(sc, AHCI_GHC, ghc);
139 1.51 jmcneill }
140 1.51 jmcneill }
141 1.51 jmcneill
142 1.29 jakllsch static int
143 1.7 joerg ahci_reset(struct ahci_softc *sc)
144 1.1 bouyer {
145 1.7 joerg int i;
146 1.1 bouyer
147 1.1 bouyer /* reset controller */
148 1.1 bouyer AHCI_WRITE(sc, AHCI_GHC, AHCI_GHC_HR);
149 1.1 bouyer /* wait up to 1s for reset to complete */
150 1.1 bouyer for (i = 0; i < 1000; i++) {
151 1.6 bouyer delay(1000);
152 1.1 bouyer if ((AHCI_READ(sc, AHCI_GHC) & AHCI_GHC_HR) == 0)
153 1.1 bouyer break;
154 1.1 bouyer }
155 1.1 bouyer if ((AHCI_READ(sc, AHCI_GHC) & AHCI_GHC_HR)) {
156 1.1 bouyer aprint_error("%s: reset failed\n", AHCINAME(sc));
157 1.7 joerg return -1;
158 1.1 bouyer }
159 1.1 bouyer /* enable ahci mode */
160 1.51 jmcneill ahci_enable(sc);
161 1.51 jmcneill
162 1.51 jmcneill if (sc->sc_save_init_data) {
163 1.51 jmcneill AHCI_WRITE(sc, AHCI_CAP, sc->sc_init_data.cap);
164 1.51 jmcneill if (sc->sc_init_data.cap2)
165 1.51 jmcneill AHCI_WRITE(sc, AHCI_CAP2, sc->sc_init_data.cap2);
166 1.51 jmcneill AHCI_WRITE(sc, AHCI_PI, sc->sc_init_data.ports);
167 1.51 jmcneill }
168 1.51 jmcneill
169 1.7 joerg return 0;
170 1.7 joerg }
171 1.1 bouyer
172 1.29 jakllsch static void
173 1.7 joerg ahci_setup_ports(struct ahci_softc *sc)
174 1.7 joerg {
175 1.7 joerg int i, port;
176 1.7 joerg
177 1.7 joerg for (i = 0, port = 0; i < AHCI_MAX_PORTS; i++) {
178 1.50 matt if ((sc->sc_ahci_ports & (1 << i)) == 0)
179 1.7 joerg continue;
180 1.7 joerg if (port >= sc->sc_atac.atac_nchannels) {
181 1.7 joerg aprint_error("%s: more ports than announced\n",
182 1.7 joerg AHCINAME(sc));
183 1.7 joerg break;
184 1.7 joerg }
185 1.7 joerg ahci_setup_port(sc, i);
186 1.7 joerg }
187 1.7 joerg }
188 1.7 joerg
189 1.29 jakllsch static void
190 1.7 joerg ahci_reprobe_drives(struct ahci_softc *sc)
191 1.7 joerg {
192 1.7 joerg int i, port;
193 1.7 joerg struct ahci_channel *achp;
194 1.7 joerg struct ata_channel *chp;
195 1.7 joerg
196 1.7 joerg for (i = 0, port = 0; i < AHCI_MAX_PORTS; i++) {
197 1.50 matt if ((sc->sc_ahci_ports & (1 << i)) == 0)
198 1.7 joerg continue;
199 1.7 joerg if (port >= sc->sc_atac.atac_nchannels) {
200 1.7 joerg aprint_error("%s: more ports than announced\n",
201 1.7 joerg AHCINAME(sc));
202 1.7 joerg break;
203 1.7 joerg }
204 1.7 joerg achp = &sc->sc_channels[i];
205 1.7 joerg chp = &achp->ata_channel;
206 1.7 joerg
207 1.7 joerg ahci_probe_drive(chp);
208 1.7 joerg }
209 1.7 joerg }
210 1.7 joerg
211 1.7 joerg static void
212 1.7 joerg ahci_setup_port(struct ahci_softc *sc, int i)
213 1.7 joerg {
214 1.7 joerg struct ahci_channel *achp;
215 1.7 joerg
216 1.7 joerg achp = &sc->sc_channels[i];
217 1.7 joerg
218 1.7 joerg AHCI_WRITE(sc, AHCI_P_CLB(i), achp->ahcic_bus_cmdh);
219 1.28 jakllsch AHCI_WRITE(sc, AHCI_P_CLBU(i), (uint64_t)achp->ahcic_bus_cmdh>>32);
220 1.7 joerg AHCI_WRITE(sc, AHCI_P_FB(i), achp->ahcic_bus_rfis);
221 1.28 jakllsch AHCI_WRITE(sc, AHCI_P_FBU(i), (uint64_t)achp->ahcic_bus_rfis>>32);
222 1.7 joerg }
223 1.7 joerg
224 1.29 jakllsch static void
225 1.7 joerg ahci_enable_intrs(struct ahci_softc *sc)
226 1.7 joerg {
227 1.7 joerg
228 1.7 joerg /* clear interrupts */
229 1.7 joerg AHCI_WRITE(sc, AHCI_IS, AHCI_READ(sc, AHCI_IS));
230 1.7 joerg /* enable interrupts */
231 1.7 joerg AHCI_WRITE(sc, AHCI_GHC, AHCI_READ(sc, AHCI_GHC) | AHCI_GHC_IE);
232 1.7 joerg }
233 1.7 joerg
234 1.7 joerg void
235 1.7 joerg ahci_attach(struct ahci_softc *sc)
236 1.7 joerg {
237 1.50 matt uint32_t ahci_rev;
238 1.7 joerg int i, j, port;
239 1.7 joerg struct ahci_channel *achp;
240 1.7 joerg struct ata_channel *chp;
241 1.7 joerg int error;
242 1.7 joerg int dmasize;
243 1.32 jakllsch char buf[128];
244 1.7 joerg void *cmdhp;
245 1.7 joerg void *cmdtblp;
246 1.7 joerg
247 1.51 jmcneill if (sc->sc_save_init_data) {
248 1.51 jmcneill ahci_enable(sc);
249 1.51 jmcneill
250 1.51 jmcneill sc->sc_init_data.cap = AHCI_READ(sc, AHCI_CAP);
251 1.51 jmcneill sc->sc_init_data.ports = AHCI_READ(sc, AHCI_PI);
252 1.51 jmcneill
253 1.51 jmcneill ahci_rev = AHCI_READ(sc, AHCI_VS);
254 1.51 jmcneill if (AHCI_VS_MJR(ahci_rev) > 1 ||
255 1.51 jmcneill (AHCI_VS_MJR(ahci_rev) == 1 && AHCI_VS_MNR(ahci_rev) >= 20)) {
256 1.51 jmcneill sc->sc_init_data.cap2 = AHCI_READ(sc, AHCI_CAP2);
257 1.51 jmcneill } else {
258 1.51 jmcneill sc->sc_init_data.cap2 = 0;
259 1.51 jmcneill }
260 1.51 jmcneill if (sc->sc_init_data.ports == 0) {
261 1.51 jmcneill sc->sc_init_data.ports = sc->sc_ahci_ports;
262 1.51 jmcneill }
263 1.51 jmcneill }
264 1.51 jmcneill
265 1.7 joerg if (ahci_reset(sc) != 0)
266 1.7 joerg return;
267 1.1 bouyer
268 1.40 bouyer sc->sc_ahci_cap = AHCI_READ(sc, AHCI_CAP);
269 1.43 bouyer if (sc->sc_ahci_quirks & AHCI_QUIRK_BADPMP) {
270 1.41 bouyer aprint_verbose_dev(sc->sc_atac.atac_dev,
271 1.41 bouyer "ignoring broken port multiplier support\n");
272 1.41 bouyer sc->sc_ahci_cap &= ~AHCI_CAP_SPM;
273 1.41 bouyer }
274 1.40 bouyer sc->sc_atac.atac_nchannels = (sc->sc_ahci_cap & AHCI_CAP_NPMASK) + 1;
275 1.40 bouyer sc->sc_ncmds = ((sc->sc_ahci_cap & AHCI_CAP_NCS) >> 8) + 1;
276 1.1 bouyer ahci_rev = AHCI_READ(sc, AHCI_VS);
277 1.32 jakllsch snprintb(buf, sizeof(buf), "\177\020"
278 1.32 jakllsch /* "f\000\005NP\0" */
279 1.32 jakllsch "b\005SXS\0"
280 1.32 jakllsch "b\006EMS\0"
281 1.32 jakllsch "b\007CCCS\0"
282 1.32 jakllsch /* "f\010\005NCS\0" */
283 1.32 jakllsch "b\015PSC\0"
284 1.32 jakllsch "b\016SSC\0"
285 1.32 jakllsch "b\017PMD\0"
286 1.32 jakllsch "b\020FBSS\0"
287 1.32 jakllsch "b\021SPM\0"
288 1.32 jakllsch "b\022SAM\0"
289 1.32 jakllsch "b\023SNZO\0"
290 1.32 jakllsch "f\024\003ISS\0"
291 1.32 jakllsch "=\001Gen1\0"
292 1.32 jakllsch "=\002Gen2\0"
293 1.32 jakllsch "=\003Gen3\0"
294 1.32 jakllsch "b\030SCLO\0"
295 1.32 jakllsch "b\031SAL\0"
296 1.32 jakllsch "b\032SALP\0"
297 1.32 jakllsch "b\033SSS\0"
298 1.32 jakllsch "b\034SMPS\0"
299 1.32 jakllsch "b\035SSNTF\0"
300 1.32 jakllsch "b\036SNCQ\0"
301 1.32 jakllsch "b\037S64A\0"
302 1.40 bouyer "\0", sc->sc_ahci_cap);
303 1.32 jakllsch aprint_normal_dev(sc->sc_atac.atac_dev, "AHCI revision %u.%u"
304 1.49 matt ", %d port%s, %d slot%s, CAP %s\n",
305 1.32 jakllsch AHCI_VS_MJR(ahci_rev), AHCI_VS_MNR(ahci_rev),
306 1.49 matt sc->sc_atac.atac_nchannels,
307 1.49 matt (sc->sc_atac.atac_nchannels == 1 ? "" : "s"),
308 1.49 matt sc->sc_ncmds, (sc->sc_ncmds == 1 ? "" : "s"), buf);
309 1.1 bouyer
310 1.58 jdolecek sc->sc_atac.atac_cap = ATAC_CAP_DATA16 | ATAC_CAP_DMA | ATAC_CAP_UDMA
311 1.58 jdolecek | ((sc->sc_ahci_cap & AHCI_CAP_NCQ) ? ATAC_CAP_NCQ : 0);
312 1.12 xtraeme sc->sc_atac.atac_cap |= sc->sc_atac_capflags;
313 1.1 bouyer sc->sc_atac.atac_pio_cap = 4;
314 1.1 bouyer sc->sc_atac.atac_dma_cap = 2;
315 1.1 bouyer sc->sc_atac.atac_udma_cap = 6;
316 1.1 bouyer sc->sc_atac.atac_channels = sc->sc_chanarray;
317 1.1 bouyer sc->sc_atac.atac_probe = ahci_probe_drive;
318 1.1 bouyer sc->sc_atac.atac_bustype_ata = &ahci_ata_bustype;
319 1.1 bouyer sc->sc_atac.atac_set_modes = ahci_setup_channel;
320 1.8 bouyer #if NATAPIBUS > 0
321 1.8 bouyer sc->sc_atac.atac_atapibus_attach = ahci_atapibus_attach;
322 1.8 bouyer #endif
323 1.1 bouyer
324 1.1 bouyer dmasize =
325 1.1 bouyer (AHCI_RFIS_SIZE + AHCI_CMDH_SIZE) * sc->sc_atac.atac_nchannels;
326 1.1 bouyer error = bus_dmamem_alloc(sc->sc_dmat, dmasize, PAGE_SIZE, 0,
327 1.29 jakllsch &sc->sc_cmd_hdr_seg, 1, &sc->sc_cmd_hdr_nseg, BUS_DMA_NOWAIT);
328 1.1 bouyer if (error) {
329 1.1 bouyer aprint_error("%s: unable to allocate command header memory"
330 1.1 bouyer ", error=%d\n", AHCINAME(sc), error);
331 1.1 bouyer return;
332 1.1 bouyer }
333 1.29 jakllsch error = bus_dmamem_map(sc->sc_dmat, &sc->sc_cmd_hdr_seg,
334 1.29 jakllsch sc->sc_cmd_hdr_nseg, dmasize,
335 1.1 bouyer &cmdhp, BUS_DMA_NOWAIT|BUS_DMA_COHERENT);
336 1.1 bouyer if (error) {
337 1.1 bouyer aprint_error("%s: unable to map command header memory"
338 1.1 bouyer ", error=%d\n", AHCINAME(sc), error);
339 1.1 bouyer return;
340 1.1 bouyer }
341 1.1 bouyer error = bus_dmamap_create(sc->sc_dmat, dmasize, 1, dmasize, 0,
342 1.1 bouyer BUS_DMA_NOWAIT, &sc->sc_cmd_hdrd);
343 1.1 bouyer if (error) {
344 1.1 bouyer aprint_error("%s: unable to create command header map"
345 1.1 bouyer ", error=%d\n", AHCINAME(sc), error);
346 1.1 bouyer return;
347 1.1 bouyer }
348 1.1 bouyer error = bus_dmamap_load(sc->sc_dmat, sc->sc_cmd_hdrd,
349 1.1 bouyer cmdhp, dmasize, NULL, BUS_DMA_NOWAIT);
350 1.1 bouyer if (error) {
351 1.1 bouyer aprint_error("%s: unable to load command header map"
352 1.1 bouyer ", error=%d\n", AHCINAME(sc), error);
353 1.1 bouyer return;
354 1.1 bouyer }
355 1.1 bouyer sc->sc_cmd_hdr = cmdhp;
356 1.1 bouyer
357 1.7 joerg ahci_enable_intrs(sc);
358 1.1 bouyer
359 1.50 matt if (sc->sc_ahci_ports == 0) {
360 1.50 matt sc->sc_ahci_ports = AHCI_READ(sc, AHCI_PI);
361 1.50 matt AHCIDEBUG_PRINT(("active ports %#x\n", sc->sc_ahci_ports),
362 1.50 matt DEBUG_PROBE);
363 1.50 matt }
364 1.1 bouyer for (i = 0, port = 0; i < AHCI_MAX_PORTS; i++) {
365 1.50 matt if ((sc->sc_ahci_ports & (1 << i)) == 0)
366 1.1 bouyer continue;
367 1.1 bouyer if (port >= sc->sc_atac.atac_nchannels) {
368 1.1 bouyer aprint_error("%s: more ports than announced\n",
369 1.1 bouyer AHCINAME(sc));
370 1.1 bouyer break;
371 1.1 bouyer }
372 1.1 bouyer achp = &sc->sc_channels[i];
373 1.29 jakllsch chp = &achp->ata_channel;
374 1.1 bouyer sc->sc_chanarray[i] = chp;
375 1.1 bouyer chp->ch_channel = i;
376 1.1 bouyer chp->ch_atac = &sc->sc_atac;
377 1.58 jdolecek chp->ch_queue = ata_queue_alloc(sc->sc_ncmds);
378 1.1 bouyer if (chp->ch_queue == NULL) {
379 1.1 bouyer aprint_error("%s port %d: can't allocate memory for "
380 1.1 bouyer "command queue", AHCINAME(sc), i);
381 1.1 bouyer break;
382 1.1 bouyer }
383 1.1 bouyer dmasize = AHCI_CMDTBL_SIZE * sc->sc_ncmds;
384 1.1 bouyer error = bus_dmamem_alloc(sc->sc_dmat, dmasize, PAGE_SIZE, 0,
385 1.29 jakllsch &achp->ahcic_cmd_tbl_seg, 1, &achp->ahcic_cmd_tbl_nseg,
386 1.29 jakllsch BUS_DMA_NOWAIT);
387 1.1 bouyer if (error) {
388 1.1 bouyer aprint_error("%s: unable to allocate command table "
389 1.1 bouyer "memory, error=%d\n", AHCINAME(sc), error);
390 1.1 bouyer break;
391 1.1 bouyer }
392 1.29 jakllsch error = bus_dmamem_map(sc->sc_dmat, &achp->ahcic_cmd_tbl_seg,
393 1.29 jakllsch achp->ahcic_cmd_tbl_nseg, dmasize,
394 1.1 bouyer &cmdtblp, BUS_DMA_NOWAIT|BUS_DMA_COHERENT);
395 1.1 bouyer if (error) {
396 1.1 bouyer aprint_error("%s: unable to map command table memory"
397 1.1 bouyer ", error=%d\n", AHCINAME(sc), error);
398 1.1 bouyer break;
399 1.1 bouyer }
400 1.1 bouyer error = bus_dmamap_create(sc->sc_dmat, dmasize, 1, dmasize, 0,
401 1.1 bouyer BUS_DMA_NOWAIT, &achp->ahcic_cmd_tbld);
402 1.1 bouyer if (error) {
403 1.1 bouyer aprint_error("%s: unable to create command table map"
404 1.1 bouyer ", error=%d\n", AHCINAME(sc), error);
405 1.1 bouyer break;
406 1.1 bouyer }
407 1.1 bouyer error = bus_dmamap_load(sc->sc_dmat, achp->ahcic_cmd_tbld,
408 1.1 bouyer cmdtblp, dmasize, NULL, BUS_DMA_NOWAIT);
409 1.1 bouyer if (error) {
410 1.1 bouyer aprint_error("%s: unable to load command table map"
411 1.1 bouyer ", error=%d\n", AHCINAME(sc), error);
412 1.1 bouyer break;
413 1.1 bouyer }
414 1.1 bouyer achp->ahcic_cmdh = (struct ahci_cmd_header *)
415 1.1 bouyer ((char *)cmdhp + AHCI_CMDH_SIZE * port);
416 1.1 bouyer achp->ahcic_bus_cmdh = sc->sc_cmd_hdrd->dm_segs[0].ds_addr +
417 1.1 bouyer AHCI_CMDH_SIZE * port;
418 1.1 bouyer achp->ahcic_rfis = (struct ahci_r_fis *)
419 1.1 bouyer ((char *)cmdhp +
420 1.1 bouyer AHCI_CMDH_SIZE * sc->sc_atac.atac_nchannels +
421 1.1 bouyer AHCI_RFIS_SIZE * port);
422 1.1 bouyer achp->ahcic_bus_rfis = sc->sc_cmd_hdrd->dm_segs[0].ds_addr +
423 1.1 bouyer AHCI_CMDH_SIZE * sc->sc_atac.atac_nchannels +
424 1.1 bouyer AHCI_RFIS_SIZE * port;
425 1.28 jakllsch AHCIDEBUG_PRINT(("port %d cmdh %p (0x%" PRIx64 ") "
426 1.28 jakllsch "rfis %p (0x%" PRIx64 ")\n", i,
427 1.28 jakllsch achp->ahcic_cmdh, (uint64_t)achp->ahcic_bus_cmdh,
428 1.28 jakllsch achp->ahcic_rfis, (uint64_t)achp->ahcic_bus_rfis),
429 1.1 bouyer DEBUG_PROBE);
430 1.1 bouyer
431 1.1 bouyer for (j = 0; j < sc->sc_ncmds; j++) {
432 1.1 bouyer achp->ahcic_cmd_tbl[j] = (struct ahci_cmd_tbl *)
433 1.1 bouyer ((char *)cmdtblp + AHCI_CMDTBL_SIZE * j);
434 1.1 bouyer achp->ahcic_bus_cmd_tbl[j] =
435 1.1 bouyer achp->ahcic_cmd_tbld->dm_segs[0].ds_addr +
436 1.1 bouyer AHCI_CMDTBL_SIZE * j;
437 1.1 bouyer achp->ahcic_cmdh[j].cmdh_cmdtba =
438 1.28 jakllsch htole64(achp->ahcic_bus_cmd_tbl[j]);
439 1.28 jakllsch AHCIDEBUG_PRINT(("port %d/%d tbl %p (0x%" PRIx64 ")\n", i, j,
440 1.1 bouyer achp->ahcic_cmd_tbl[j],
441 1.28 jakllsch (uint64_t)achp->ahcic_bus_cmd_tbl[j]), DEBUG_PROBE);
442 1.1 bouyer /* The xfer DMA map */
443 1.1 bouyer error = bus_dmamap_create(sc->sc_dmat, MAXPHYS,
444 1.1 bouyer AHCI_NPRD, 0x400000 /* 4MB */, 0,
445 1.1 bouyer BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW,
446 1.1 bouyer &achp->ahcic_datad[j]);
447 1.1 bouyer if (error) {
448 1.1 bouyer aprint_error("%s: couldn't alloc xfer DMA map, "
449 1.1 bouyer "error=%d\n", AHCINAME(sc), error);
450 1.1 bouyer goto end;
451 1.1 bouyer }
452 1.1 bouyer }
453 1.7 joerg ahci_setup_port(sc, i);
454 1.1 bouyer if (bus_space_subregion(sc->sc_ahcit, sc->sc_ahcih,
455 1.22 jakllsch AHCI_P_SSTS(i), 4, &achp->ahcic_sstatus) != 0) {
456 1.1 bouyer aprint_error("%s: couldn't map channel %d "
457 1.1 bouyer "sata_status regs\n", AHCINAME(sc), i);
458 1.1 bouyer break;
459 1.1 bouyer }
460 1.1 bouyer if (bus_space_subregion(sc->sc_ahcit, sc->sc_ahcih,
461 1.22 jakllsch AHCI_P_SCTL(i), 4, &achp->ahcic_scontrol) != 0) {
462 1.1 bouyer aprint_error("%s: couldn't map channel %d "
463 1.1 bouyer "sata_control regs\n", AHCINAME(sc), i);
464 1.1 bouyer break;
465 1.1 bouyer }
466 1.1 bouyer if (bus_space_subregion(sc->sc_ahcit, sc->sc_ahcih,
467 1.22 jakllsch AHCI_P_SERR(i), 4, &achp->ahcic_serror) != 0) {
468 1.1 bouyer aprint_error("%s: couldn't map channel %d "
469 1.1 bouyer "sata_error regs\n", AHCINAME(sc), i);
470 1.1 bouyer break;
471 1.1 bouyer }
472 1.1 bouyer ata_channel_attach(chp);
473 1.1 bouyer port++;
474 1.1 bouyer end:
475 1.1 bouyer continue;
476 1.1 bouyer }
477 1.1 bouyer }
478 1.1 bouyer
479 1.1 bouyer int
480 1.29 jakllsch ahci_detach(struct ahci_softc *sc, int flags)
481 1.29 jakllsch {
482 1.29 jakllsch struct atac_softc *atac;
483 1.29 jakllsch struct ahci_channel *achp;
484 1.29 jakllsch struct ata_channel *chp;
485 1.29 jakllsch struct scsipi_adapter *adapt;
486 1.29 jakllsch int i, j;
487 1.29 jakllsch int error;
488 1.29 jakllsch
489 1.29 jakllsch atac = &sc->sc_atac;
490 1.29 jakllsch adapt = &atac->atac_atapi_adapter._generic;
491 1.29 jakllsch
492 1.29 jakllsch for (i = 0; i < AHCI_MAX_PORTS; i++) {
493 1.29 jakllsch achp = &sc->sc_channels[i];
494 1.29 jakllsch chp = &achp->ata_channel;
495 1.29 jakllsch
496 1.50 matt if ((sc->sc_ahci_ports & (1 << i)) == 0)
497 1.29 jakllsch continue;
498 1.29 jakllsch if (i >= sc->sc_atac.atac_nchannels) {
499 1.29 jakllsch aprint_error("%s: more ports than announced\n",
500 1.29 jakllsch AHCINAME(sc));
501 1.29 jakllsch break;
502 1.29 jakllsch }
503 1.29 jakllsch
504 1.29 jakllsch if (chp->atabus == NULL)
505 1.29 jakllsch continue;
506 1.29 jakllsch if ((error = config_detach(chp->atabus, flags)) != 0)
507 1.29 jakllsch return error;
508 1.29 jakllsch
509 1.29 jakllsch for (j = 0; j < sc->sc_ncmds; j++)
510 1.29 jakllsch bus_dmamap_destroy(sc->sc_dmat, achp->ahcic_datad[j]);
511 1.29 jakllsch
512 1.29 jakllsch bus_dmamap_unload(sc->sc_dmat, achp->ahcic_cmd_tbld);
513 1.29 jakllsch bus_dmamap_destroy(sc->sc_dmat, achp->ahcic_cmd_tbld);
514 1.29 jakllsch bus_dmamem_unmap(sc->sc_dmat, achp->ahcic_cmd_tbl[0],
515 1.29 jakllsch AHCI_CMDTBL_SIZE * sc->sc_ncmds);
516 1.29 jakllsch bus_dmamem_free(sc->sc_dmat, &achp->ahcic_cmd_tbl_seg,
517 1.29 jakllsch achp->ahcic_cmd_tbl_nseg);
518 1.29 jakllsch
519 1.58 jdolecek ata_queue_free(chp->ch_queue);
520 1.58 jdolecek chp->ch_queue = NULL;
521 1.29 jakllsch chp->atabus = NULL;
522 1.58 jdolecek
523 1.58 jdolecek ata_channel_detach(chp);
524 1.29 jakllsch }
525 1.29 jakllsch
526 1.29 jakllsch bus_dmamap_unload(sc->sc_dmat, sc->sc_cmd_hdrd);
527 1.29 jakllsch bus_dmamap_destroy(sc->sc_dmat, sc->sc_cmd_hdrd);
528 1.29 jakllsch bus_dmamem_unmap(sc->sc_dmat, sc->sc_cmd_hdr,
529 1.29 jakllsch (AHCI_RFIS_SIZE + AHCI_CMDH_SIZE) * sc->sc_atac.atac_nchannels);
530 1.29 jakllsch bus_dmamem_free(sc->sc_dmat, &sc->sc_cmd_hdr_seg, sc->sc_cmd_hdr_nseg);
531 1.29 jakllsch
532 1.29 jakllsch if (adapt->adapt_refcnt != 0)
533 1.29 jakllsch return EBUSY;
534 1.29 jakllsch
535 1.29 jakllsch return 0;
536 1.29 jakllsch }
537 1.29 jakllsch
538 1.29 jakllsch void
539 1.29 jakllsch ahci_resume(struct ahci_softc *sc)
540 1.29 jakllsch {
541 1.29 jakllsch ahci_reset(sc);
542 1.29 jakllsch ahci_setup_ports(sc);
543 1.29 jakllsch ahci_reprobe_drives(sc);
544 1.29 jakllsch ahci_enable_intrs(sc);
545 1.29 jakllsch }
546 1.29 jakllsch
547 1.29 jakllsch int
548 1.1 bouyer ahci_intr(void *v)
549 1.1 bouyer {
550 1.1 bouyer struct ahci_softc *sc = v;
551 1.27 jakllsch uint32_t is;
552 1.1 bouyer int i, r = 0;
553 1.1 bouyer
554 1.1 bouyer while ((is = AHCI_READ(sc, AHCI_IS))) {
555 1.1 bouyer AHCIDEBUG_PRINT(("%s ahci_intr 0x%x\n", AHCINAME(sc), is),
556 1.1 bouyer DEBUG_INTR);
557 1.1 bouyer r = 1;
558 1.1 bouyer AHCI_WRITE(sc, AHCI_IS, is);
559 1.1 bouyer for (i = 0; i < AHCI_MAX_PORTS; i++)
560 1.1 bouyer if (is & (1 << i))
561 1.1 bouyer ahci_intr_port(sc, &sc->sc_channels[i]);
562 1.1 bouyer }
563 1.1 bouyer return r;
564 1.1 bouyer }
565 1.1 bouyer
566 1.29 jakllsch static void
567 1.1 bouyer ahci_intr_port(struct ahci_softc *sc, struct ahci_channel *achp)
568 1.1 bouyer {
569 1.58 jdolecek uint32_t is, tfd, sact;
570 1.1 bouyer struct ata_channel *chp = &achp->ata_channel;
571 1.58 jdolecek struct ata_xfer *xfer;
572 1.58 jdolecek int slot = -1;
573 1.58 jdolecek bool recover = false;
574 1.1 bouyer
575 1.1 bouyer is = AHCI_READ(sc, AHCI_P_IS(chp->ch_channel));
576 1.1 bouyer AHCI_WRITE(sc, AHCI_P_IS(chp->ch_channel), is);
577 1.58 jdolecek AHCIDEBUG_PRINT((
578 1.58 jdolecek "ahci_intr_port %s port %d is 0x%x CI 0x%x SACT 0x%x TFD 0x%x\n",
579 1.58 jdolecek AHCINAME(sc),
580 1.58 jdolecek chp->ch_channel, is,
581 1.58 jdolecek AHCI_READ(sc, AHCI_P_CI(chp->ch_channel)),
582 1.58 jdolecek AHCI_READ(sc, AHCI_P_SACT(chp->ch_channel)),
583 1.58 jdolecek AHCI_READ(sc, AHCI_P_TFD(chp->ch_channel))),
584 1.1 bouyer DEBUG_INTR);
585 1.1 bouyer
586 1.58 jdolecek if ((chp->ch_flags & ATACH_NCQ) == 0) {
587 1.58 jdolecek /* Non-NCQ operation */
588 1.58 jdolecek sact = AHCI_READ(sc, AHCI_P_CI(chp->ch_channel));
589 1.58 jdolecek } else {
590 1.58 jdolecek /* NCQ operation */
591 1.58 jdolecek sact = AHCI_READ(sc, AHCI_P_SACT(chp->ch_channel));
592 1.58 jdolecek }
593 1.58 jdolecek
594 1.58 jdolecek /* Handle errors */
595 1.58 jdolecek if (is & (AHCI_P_IX_TFES | AHCI_P_IX_HBFS | AHCI_P_IX_HBDS |
596 1.58 jdolecek AHCI_P_IX_IFS | AHCI_P_IX_OFS | AHCI_P_IX_UFS)) {
597 1.58 jdolecek /* Fatal errors */
598 1.1 bouyer if (is & AHCI_P_IX_TFES) {
599 1.1 bouyer tfd = AHCI_READ(sc, AHCI_P_TFD(chp->ch_channel));
600 1.58 jdolecek
601 1.58 jdolecek if ((chp->ch_flags & ATACH_NCQ) == 0) {
602 1.58 jdolecek /* Slot valid only for Non-NCQ operation */
603 1.58 jdolecek slot = (AHCI_READ(sc,
604 1.58 jdolecek AHCI_P_CMD(chp->ch_channel))
605 1.58 jdolecek & AHCI_P_CMD_CCS_MASK)
606 1.58 jdolecek >> AHCI_P_CMD_CCS_SHIFT;
607 1.58 jdolecek }
608 1.58 jdolecek
609 1.58 jdolecek aprint_error("%s port %d: active %x is 0x%x tfd 0x%x\n",
610 1.58 jdolecek AHCINAME(sc), chp->ch_channel, sact, is, tfd);
611 1.1 bouyer } else {
612 1.58 jdolecek /* mark an error, and set BSY */
613 1.58 jdolecek tfd = (WDCE_ABRT << AHCI_P_TFD_ERR_SHIFT) |
614 1.58 jdolecek WDCS_ERR | WDCS_BSY;
615 1.1 bouyer }
616 1.58 jdolecek
617 1.40 bouyer if (is & AHCI_P_IX_IFS) {
618 1.40 bouyer aprint_error("%s port %d: SERR 0x%x\n",
619 1.40 bouyer AHCINAME(sc), chp->ch_channel,
620 1.40 bouyer AHCI_READ(sc, AHCI_P_SERR(chp->ch_channel)));
621 1.40 bouyer }
622 1.58 jdolecek
623 1.58 jdolecek if (!achp->ahcic_recovering)
624 1.58 jdolecek recover = true;
625 1.58 jdolecek } else if (is & (AHCI_P_IX_DHRS|AHCI_P_IX_SDBS)) {
626 1.58 jdolecek tfd = AHCI_READ(sc, AHCI_P_TFD(chp->ch_channel));
627 1.58 jdolecek
628 1.58 jdolecek /* D2H Register FIS or Set Device Bits */
629 1.58 jdolecek if ((tfd & WDCS_ERR) != 0) {
630 1.58 jdolecek if (!achp->ahcic_recovering)
631 1.58 jdolecek recover = true;
632 1.58 jdolecek
633 1.58 jdolecek aprint_error("%s port %d: transfer aborted 0x%x\n",
634 1.58 jdolecek AHCINAME(sc), chp->ch_channel, tfd);
635 1.58 jdolecek
636 1.58 jdolecek }
637 1.58 jdolecek } else {
638 1.58 jdolecek tfd = 0;
639 1.58 jdolecek }
640 1.58 jdolecek
641 1.58 jdolecek if (__predict_false(recover))
642 1.58 jdolecek ata_channel_freeze(chp);
643 1.58 jdolecek
644 1.58 jdolecek if (slot >= 0) {
645 1.58 jdolecek if ((achp->ahcic_cmds_active & __BIT(slot)) != 0 &&
646 1.58 jdolecek (sact & __BIT(slot)) == 0) {
647 1.58 jdolecek xfer = ata_queue_hwslot_to_xfer(chp, slot);
648 1.58 jdolecek xfer->c_intr(chp, xfer, tfd);
649 1.58 jdolecek }
650 1.1 bouyer } else {
651 1.58 jdolecek /*
652 1.58 jdolecek * For NCQ, HBA halts processing when error is notified,
653 1.58 jdolecek * and any further D2H FISes are ignored until the error
654 1.58 jdolecek * condition is cleared. Hence if a command is inactive,
655 1.58 jdolecek * it means it actually already finished successfully.
656 1.58 jdolecek * Note: active slots can change as c_intr() callback
657 1.58 jdolecek * can activate another command(s), so must only process
658 1.58 jdolecek * commands active before we start processing.
659 1.58 jdolecek */
660 1.58 jdolecek uint32_t aslots = achp->ahcic_cmds_active;
661 1.58 jdolecek
662 1.58 jdolecek for (slot=0; slot < sc->sc_ncmds; slot++) {
663 1.58 jdolecek if ((aslots & __BIT(slot)) != 0 &&
664 1.58 jdolecek (sact & __BIT(slot)) == 0) {
665 1.58 jdolecek xfer = ata_queue_hwslot_to_xfer(chp, slot);
666 1.58 jdolecek xfer->c_intr(chp, xfer, tfd);
667 1.58 jdolecek }
668 1.1 bouyer }
669 1.1 bouyer }
670 1.58 jdolecek
671 1.58 jdolecek if (__predict_false(recover)) {
672 1.58 jdolecek ata_channel_thaw(chp);
673 1.58 jdolecek ahci_channel_recover(sc, chp, tfd);
674 1.58 jdolecek }
675 1.1 bouyer }
676 1.1 bouyer
677 1.29 jakllsch static void
678 1.40 bouyer ahci_reset_drive(struct ata_drive_datas *drvp, int flags, uint32_t *sigp)
679 1.1 bouyer {
680 1.1 bouyer struct ata_channel *chp = drvp->chnl_softc;
681 1.40 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
682 1.58 jdolecek struct ata_xfer *xfer;
683 1.58 jdolecek
684 1.58 jdolecek xfer = ata_get_xfer_ext(chp, C_RECOVERY, 0);
685 1.58 jdolecek
686 1.58 jdolecek ata_channel_lock(chp);
687 1.58 jdolecek
688 1.40 bouyer AHCI_WRITE(sc, AHCI_GHC,
689 1.40 bouyer AHCI_READ(sc, AHCI_GHC) & ~AHCI_GHC_IE);
690 1.40 bouyer ahci_channel_stop(sc, chp, flags);
691 1.58 jdolecek if (ahci_do_reset_drive(chp, drvp->drive, flags, sigp, xfer) != 0)
692 1.40 bouyer ata_reset_channel(chp, flags);
693 1.40 bouyer AHCI_WRITE(sc, AHCI_GHC, AHCI_READ(sc, AHCI_GHC) | AHCI_GHC_IE);
694 1.58 jdolecek
695 1.58 jdolecek ata_channel_unlock(chp);
696 1.58 jdolecek
697 1.58 jdolecek ata_free_xfer(chp, xfer);
698 1.58 jdolecek
699 1.1 bouyer return;
700 1.1 bouyer }
701 1.1 bouyer
702 1.40 bouyer /* return error code from ata_bio */
703 1.40 bouyer static int
704 1.58 jdolecek ahci_exec_fis(struct ata_channel *chp, int timeout, int flags, int slot)
705 1.40 bouyer {
706 1.40 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
707 1.40 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
708 1.40 bouyer int i;
709 1.40 bouyer uint32_t is;
710 1.40 bouyer
711 1.52 joerg /*
712 1.52 joerg * Base timeout is specified in ms.
713 1.52 joerg * If we are allowed to sleep, wait a tick each round.
714 1.53 joerg * Otherwise delay for 10ms on each round.
715 1.52 joerg */
716 1.52 joerg if (flags & AT_WAIT)
717 1.52 joerg timeout = MAX(1, mstohz(timeout));
718 1.53 joerg else
719 1.53 joerg timeout = timeout / 10;
720 1.52 joerg
721 1.58 jdolecek AHCI_CMDH_SYNC(sc, achp, slot,
722 1.58 jdolecek BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
723 1.40 bouyer /* start command */
724 1.58 jdolecek AHCI_WRITE(sc, AHCI_P_CI(chp->ch_channel), 1 << slot);
725 1.40 bouyer for (i = 0; i < timeout; i++) {
726 1.58 jdolecek if ((AHCI_READ(sc, AHCI_P_CI(chp->ch_channel)) & (1 << slot)) ==
727 1.58 jdolecek 0)
728 1.40 bouyer return 0;
729 1.40 bouyer is = AHCI_READ(sc, AHCI_P_IS(chp->ch_channel));
730 1.58 jdolecek if (is & (AHCI_P_IX_TFES | AHCI_P_IX_HBFS | AHCI_P_IX_HBDS |
731 1.58 jdolecek AHCI_P_IX_IFS |
732 1.40 bouyer AHCI_P_IX_OFS | AHCI_P_IX_UFS)) {
733 1.40 bouyer if ((is & (AHCI_P_IX_DHRS|AHCI_P_IX_TFES)) ==
734 1.40 bouyer (AHCI_P_IX_DHRS|AHCI_P_IX_TFES)) {
735 1.40 bouyer /*
736 1.40 bouyer * we got the D2H FIS anyway,
737 1.40 bouyer * assume sig is valid.
738 1.40 bouyer * channel is restarted later
739 1.40 bouyer */
740 1.40 bouyer return ERROR;
741 1.40 bouyer }
742 1.40 bouyer aprint_debug("%s channel %d: error 0x%x sending FIS\n",
743 1.40 bouyer AHCINAME(sc), chp->ch_channel, is);
744 1.40 bouyer return ERR_DF;
745 1.40 bouyer }
746 1.58 jdolecek ata_delay(chp, 10, "ahcifis", flags);
747 1.40 bouyer }
748 1.52 joerg
749 1.40 bouyer aprint_debug("%s channel %d: timeout sending FIS\n",
750 1.40 bouyer AHCINAME(sc), chp->ch_channel);
751 1.40 bouyer return TIMEOUT;
752 1.40 bouyer }
753 1.40 bouyer
754 1.40 bouyer static int
755 1.40 bouyer ahci_do_reset_drive(struct ata_channel *chp, int drive, int flags,
756 1.58 jdolecek uint32_t *sigp, struct ata_xfer *xfer)
757 1.40 bouyer {
758 1.40 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
759 1.40 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
760 1.40 bouyer struct ahci_cmd_tbl *cmd_tbl;
761 1.40 bouyer struct ahci_cmd_header *cmd_h;
762 1.40 bouyer int i;
763 1.40 bouyer uint32_t sig;
764 1.40 bouyer
765 1.40 bouyer KASSERT((AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel)) & AHCI_P_CMD_CR) == 0);
766 1.58 jdolecek ata_channel_lock_owned(chp);
767 1.58 jdolecek
768 1.42 bouyer again:
769 1.40 bouyer /* clear port interrupt register */
770 1.40 bouyer AHCI_WRITE(sc, AHCI_P_IS(chp->ch_channel), 0xffffffff);
771 1.40 bouyer /* clear SErrors and start operations */
772 1.40 bouyer if ((sc->sc_ahci_cap & AHCI_CAP_CLO) == AHCI_CAP_CLO) {
773 1.40 bouyer /*
774 1.40 bouyer * issue a command list override to clear BSY.
775 1.40 bouyer * This is needed if there's a PMP with no drive
776 1.40 bouyer * on port 0
777 1.40 bouyer */
778 1.40 bouyer ahci_channel_start(sc, chp, flags, 1);
779 1.40 bouyer } else {
780 1.40 bouyer ahci_channel_start(sc, chp, flags, 0);
781 1.40 bouyer }
782 1.40 bouyer if (drive > 0) {
783 1.40 bouyer KASSERT(sc->sc_ahci_cap & AHCI_CAP_SPM);
784 1.40 bouyer }
785 1.54 jmcneill
786 1.54 jmcneill if (sc->sc_ahci_quirks & AHCI_QUIRK_SKIP_RESET)
787 1.54 jmcneill goto skip_reset;
788 1.54 jmcneill
789 1.40 bouyer /* polled command, assume interrupts are disabled */
790 1.58 jdolecek
791 1.58 jdolecek cmd_h = &achp->ahcic_cmdh[xfer->c_slot];
792 1.58 jdolecek cmd_tbl = achp->ahcic_cmd_tbl[xfer->c_slot];
793 1.40 bouyer cmd_h->cmdh_flags = htole16(AHCI_CMDH_F_RST | AHCI_CMDH_F_CBSY |
794 1.40 bouyer RHD_FISLEN / 4 | (drive << AHCI_CMDH_F_PMP_SHIFT));
795 1.40 bouyer cmd_h->cmdh_prdbc = 0;
796 1.40 bouyer memset(cmd_tbl->cmdt_cfis, 0, 64);
797 1.40 bouyer cmd_tbl->cmdt_cfis[fis_type] = RHD_FISTYPE;
798 1.40 bouyer cmd_tbl->cmdt_cfis[rhd_c] = drive;
799 1.40 bouyer cmd_tbl->cmdt_cfis[rhd_control] = WDCTL_RST;
800 1.58 jdolecek switch(ahci_exec_fis(chp, 100, flags, xfer->c_slot)) {
801 1.40 bouyer case ERR_DF:
802 1.40 bouyer case TIMEOUT:
803 1.40 bouyer aprint_error("%s channel %d: setting WDCTL_RST failed "
804 1.40 bouyer "for drive %d\n", AHCINAME(sc), chp->ch_channel, drive);
805 1.40 bouyer if (sigp)
806 1.40 bouyer *sigp = 0xffffffff;
807 1.40 bouyer goto end;
808 1.40 bouyer default:
809 1.40 bouyer break;
810 1.40 bouyer }
811 1.40 bouyer cmd_h->cmdh_flags = htole16(RHD_FISLEN / 4 |
812 1.40 bouyer (drive << AHCI_CMDH_F_PMP_SHIFT));
813 1.40 bouyer cmd_h->cmdh_prdbc = 0;
814 1.40 bouyer memset(cmd_tbl->cmdt_cfis, 0, 64);
815 1.40 bouyer cmd_tbl->cmdt_cfis[fis_type] = RHD_FISTYPE;
816 1.40 bouyer cmd_tbl->cmdt_cfis[rhd_c] = drive;
817 1.40 bouyer cmd_tbl->cmdt_cfis[rhd_control] = 0;
818 1.58 jdolecek switch(ahci_exec_fis(chp, 310, flags, xfer->c_slot)) {
819 1.40 bouyer case ERR_DF:
820 1.40 bouyer case TIMEOUT:
821 1.43 bouyer if ((sc->sc_ahci_quirks & AHCI_QUIRK_BADPMPRESET) != 0 &&
822 1.41 bouyer drive == PMP_PORT_CTL) {
823 1.41 bouyer /*
824 1.41 bouyer * some controllers fails to reset when
825 1.41 bouyer * targeting a PMP but a single drive is attached.
826 1.41 bouyer * try again with port 0
827 1.41 bouyer */
828 1.41 bouyer drive = 0;
829 1.42 bouyer ahci_channel_stop(sc, chp, flags);
830 1.41 bouyer goto again;
831 1.41 bouyer }
832 1.40 bouyer aprint_error("%s channel %d: clearing WDCTL_RST failed "
833 1.40 bouyer "for drive %d\n", AHCINAME(sc), chp->ch_channel, drive);
834 1.40 bouyer if (sigp)
835 1.40 bouyer *sigp = 0xffffffff;
836 1.40 bouyer goto end;
837 1.40 bouyer default:
838 1.40 bouyer break;
839 1.40 bouyer }
840 1.54 jmcneill
841 1.54 jmcneill skip_reset:
842 1.40 bouyer /*
843 1.40 bouyer * wait 31s for BSY to clear
844 1.40 bouyer * This should not be needed, but some controllers clear the
845 1.40 bouyer * command slot before receiving the D2H FIS ...
846 1.40 bouyer */
847 1.46 matt for (i = 0; i < AHCI_RST_WAIT; i++) {
848 1.40 bouyer sig = AHCI_READ(sc, AHCI_P_TFD(chp->ch_channel));
849 1.46 matt if ((__SHIFTOUT(sig, AHCI_P_TFD_ST) & WDCS_BSY) == 0)
850 1.40 bouyer break;
851 1.58 jdolecek ata_delay(chp, 10, "ahcid2h", flags);
852 1.40 bouyer }
853 1.40 bouyer if (i == AHCI_RST_WAIT) {
854 1.40 bouyer aprint_error("%s: BSY never cleared, TD 0x%x\n",
855 1.40 bouyer AHCINAME(sc), sig);
856 1.40 bouyer if (sigp)
857 1.40 bouyer *sigp = 0xffffffff;
858 1.40 bouyer goto end;
859 1.40 bouyer }
860 1.40 bouyer AHCIDEBUG_PRINT(("%s: BSY took %d ms\n", AHCINAME(sc), i * 10),
861 1.40 bouyer DEBUG_PROBE);
862 1.40 bouyer sig = AHCI_READ(sc, AHCI_P_SIG(chp->ch_channel));
863 1.40 bouyer if (sigp)
864 1.40 bouyer *sigp = sig;
865 1.40 bouyer AHCIDEBUG_PRINT(("%s: port %d: sig=0x%x CMD=0x%x\n",
866 1.40 bouyer AHCINAME(sc), chp->ch_channel, sig,
867 1.40 bouyer AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel))), DEBUG_PROBE);
868 1.40 bouyer end:
869 1.40 bouyer ahci_channel_stop(sc, chp, flags);
870 1.58 jdolecek ata_delay(chp, 500, "ahcirst", flags);
871 1.40 bouyer /* clear port interrupt register */
872 1.40 bouyer AHCI_WRITE(sc, AHCI_P_IS(chp->ch_channel), 0xffffffff);
873 1.47 bouyer ahci_channel_start(sc, chp, flags,
874 1.40 bouyer (sc->sc_ahci_cap & AHCI_CAP_CLO) ? 1 : 0);
875 1.40 bouyer return 0;
876 1.40 bouyer }
877 1.40 bouyer
878 1.29 jakllsch static void
879 1.1 bouyer ahci_reset_channel(struct ata_channel *chp, int flags)
880 1.1 bouyer {
881 1.1 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
882 1.1 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
883 1.18 bouyer int i, tfd;
884 1.1 bouyer
885 1.58 jdolecek ata_channel_lock(chp);
886 1.58 jdolecek
887 1.5 bouyer ahci_channel_stop(sc, chp, flags);
888 1.1 bouyer if (sata_reset_interface(chp, sc->sc_ahcit, achp->ahcic_scontrol,
889 1.47 bouyer achp->ahcic_sstatus, flags) != SStatus_DET_DEV) {
890 1.33 jakllsch printf("%s: port %d reset failed\n", AHCINAME(sc), chp->ch_channel);
891 1.1 bouyer /* XXX and then ? */
892 1.1 bouyer }
893 1.58 jdolecek ata_kill_active(chp, KILL_RESET, flags);
894 1.58 jdolecek ata_delay(chp, 500, "ahcirst", flags);
895 1.24 bouyer /* clear port interrupt register */
896 1.24 bouyer AHCI_WRITE(sc, AHCI_P_IS(chp->ch_channel), 0xffffffff);
897 1.24 bouyer /* clear SErrors and start operations */
898 1.57 jmcneill ahci_channel_start(sc, chp, flags,
899 1.57 jmcneill (sc->sc_ahci_cap & AHCI_CAP_CLO) ? 1 : 0);
900 1.18 bouyer /* wait 31s for BSY to clear */
901 1.24 bouyer for (i = 0; i <AHCI_RST_WAIT; i++) {
902 1.18 bouyer tfd = AHCI_READ(sc, AHCI_P_TFD(chp->ch_channel));
903 1.58 jdolecek if ((AHCI_TFD_ST(tfd) & WDCS_BSY) == 0)
904 1.8 bouyer break;
905 1.58 jdolecek ata_delay(chp, 10, "ahcid2h", flags);
906 1.8 bouyer }
907 1.58 jdolecek if ((AHCI_TFD_ST(tfd) & WDCS_BSY) != 0)
908 1.18 bouyer aprint_error("%s: BSY never cleared, TD 0x%x\n",
909 1.18 bouyer AHCINAME(sc), tfd);
910 1.18 bouyer AHCIDEBUG_PRINT(("%s: BSY took %d ms\n", AHCINAME(sc), i * 10),
911 1.18 bouyer DEBUG_PROBE);
912 1.8 bouyer /* clear port interrupt register */
913 1.8 bouyer AHCI_WRITE(sc, AHCI_P_IS(chp->ch_channel), 0xffffffff);
914 1.8 bouyer
915 1.58 jdolecek ata_channel_unlock(chp);
916 1.58 jdolecek
917 1.1 bouyer return;
918 1.1 bouyer }
919 1.1 bouyer
920 1.29 jakllsch static int
921 1.1 bouyer ahci_ata_addref(struct ata_drive_datas *drvp)
922 1.1 bouyer {
923 1.1 bouyer return 0;
924 1.1 bouyer }
925 1.1 bouyer
926 1.29 jakllsch static void
927 1.1 bouyer ahci_ata_delref(struct ata_drive_datas *drvp)
928 1.1 bouyer {
929 1.1 bouyer return;
930 1.1 bouyer }
931 1.1 bouyer
932 1.29 jakllsch static void
933 1.1 bouyer ahci_killpending(struct ata_drive_datas *drvp)
934 1.1 bouyer {
935 1.1 bouyer return;
936 1.1 bouyer }
937 1.1 bouyer
938 1.29 jakllsch static void
939 1.1 bouyer ahci_probe_drive(struct ata_channel *chp)
940 1.1 bouyer {
941 1.1 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
942 1.1 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
943 1.27 jakllsch uint32_t sig;
944 1.58 jdolecek struct ata_xfer *xfer;
945 1.58 jdolecek
946 1.58 jdolecek xfer = ata_get_xfer_ext(chp, 0, 0);
947 1.58 jdolecek if (xfer == NULL) {
948 1.58 jdolecek aprint_error_dev(sc->sc_atac.atac_dev,
949 1.58 jdolecek "%s: failed to get xfer port %d\n",
950 1.58 jdolecek __func__, chp->ch_channel);
951 1.58 jdolecek return;
952 1.58 jdolecek }
953 1.58 jdolecek
954 1.58 jdolecek ata_channel_lock(chp);
955 1.1 bouyer
956 1.18 bouyer /* bring interface up, accept FISs, power up and spin up device */
957 1.1 bouyer AHCI_WRITE(sc, AHCI_P_CMD(chp->ch_channel),
958 1.18 bouyer AHCI_P_CMD_ICC_AC | AHCI_P_CMD_FRE |
959 1.18 bouyer AHCI_P_CMD_POD | AHCI_P_CMD_SUD);
960 1.1 bouyer /* reset the PHY and bring online */
961 1.1 bouyer switch (sata_reset_interface(chp, sc->sc_ahcit, achp->ahcic_scontrol,
962 1.47 bouyer achp->ahcic_sstatus, AT_WAIT)) {
963 1.1 bouyer case SStatus_DET_DEV:
964 1.58 jdolecek ata_delay(chp, 500, "ahcidv", AT_WAIT);
965 1.40 bouyer if (sc->sc_ahci_cap & AHCI_CAP_SPM) {
966 1.58 jdolecek ahci_do_reset_drive(chp, PMP_PORT_CTL, AT_WAIT, &sig,
967 1.58 jdolecek xfer);
968 1.40 bouyer } else {
969 1.58 jdolecek ahci_do_reset_drive(chp, 0, AT_WAIT, &sig, xfer);
970 1.8 bouyer }
971 1.40 bouyer sata_interpret_sig(chp, 0, sig);
972 1.40 bouyer /* if we have a PMP attached, inform the controller */
973 1.40 bouyer if (chp->ch_ndrives > PMP_PORT_CTL &&
974 1.40 bouyer chp->ch_drive[PMP_PORT_CTL].drive_type == ATA_DRIVET_PM) {
975 1.40 bouyer AHCI_WRITE(sc, AHCI_P_CMD(chp->ch_channel),
976 1.40 bouyer AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel)) |
977 1.40 bouyer AHCI_P_CMD_PMA);
978 1.23 bouyer }
979 1.23 bouyer /* clear port interrupt register */
980 1.23 bouyer AHCI_WRITE(sc, AHCI_P_IS(chp->ch_channel), 0xffffffff);
981 1.44 matt
982 1.23 bouyer /* and enable interrupts */
983 1.1 bouyer AHCI_WRITE(sc, AHCI_P_IE(chp->ch_channel),
984 1.58 jdolecek AHCI_P_IX_TFES | AHCI_P_IX_HBFS | AHCI_P_IX_HBDS |
985 1.58 jdolecek AHCI_P_IX_IFS |
986 1.1 bouyer AHCI_P_IX_OFS | AHCI_P_IX_DPS | AHCI_P_IX_UFS |
987 1.58 jdolecek AHCI_P_IX_PSS | AHCI_P_IX_DHRS | AHCI_P_IX_SDBS);
988 1.17 dillo /* wait 500ms before actually starting operations */
989 1.58 jdolecek ata_delay(chp, 500, "ahciprb", AT_WAIT);
990 1.1 bouyer break;
991 1.1 bouyer
992 1.1 bouyer default:
993 1.1 bouyer break;
994 1.1 bouyer }
995 1.58 jdolecek ata_channel_unlock(chp);
996 1.1 bouyer }
997 1.1 bouyer
998 1.29 jakllsch static void
999 1.1 bouyer ahci_setup_channel(struct ata_channel *chp)
1000 1.1 bouyer {
1001 1.1 bouyer return;
1002 1.1 bouyer }
1003 1.1 bouyer
1004 1.29 jakllsch static int
1005 1.58 jdolecek ahci_exec_command(struct ata_drive_datas *drvp, struct ata_xfer *xfer)
1006 1.1 bouyer {
1007 1.1 bouyer struct ata_channel *chp = drvp->chnl_softc;
1008 1.58 jdolecek struct ata_command *ata_c = &xfer->c_ata_c;
1009 1.1 bouyer int ret;
1010 1.1 bouyer int s;
1011 1.1 bouyer
1012 1.1 bouyer AHCIDEBUG_PRINT(("ahci_exec_command port %d CI 0x%x\n",
1013 1.58 jdolecek chp->ch_channel,
1014 1.58 jdolecek AHCI_READ(AHCI_CH2SC(chp), AHCI_P_CI(chp->ch_channel))),
1015 1.1 bouyer DEBUG_XFERS);
1016 1.1 bouyer if (ata_c->flags & AT_POLL)
1017 1.1 bouyer xfer->c_flags |= C_POLL;
1018 1.1 bouyer if (ata_c->flags & AT_WAIT)
1019 1.1 bouyer xfer->c_flags |= C_WAIT;
1020 1.1 bouyer xfer->c_drive = drvp->drive;
1021 1.1 bouyer xfer->c_databuf = ata_c->data;
1022 1.1 bouyer xfer->c_bcount = ata_c->bcount;
1023 1.1 bouyer xfer->c_start = ahci_cmd_start;
1024 1.58 jdolecek xfer->c_poll = ahci_cmd_poll;
1025 1.58 jdolecek xfer->c_abort = ahci_cmd_abort;
1026 1.1 bouyer xfer->c_intr = ahci_cmd_complete;
1027 1.1 bouyer xfer->c_kill_xfer = ahci_cmd_kill_xfer;
1028 1.1 bouyer s = splbio();
1029 1.1 bouyer ata_exec_xfer(chp, xfer);
1030 1.1 bouyer #ifdef DIAGNOSTIC
1031 1.1 bouyer if ((ata_c->flags & AT_POLL) != 0 &&
1032 1.1 bouyer (ata_c->flags & AT_DONE) == 0)
1033 1.1 bouyer panic("ahci_exec_command: polled command not done");
1034 1.1 bouyer #endif
1035 1.1 bouyer if (ata_c->flags & AT_DONE) {
1036 1.1 bouyer ret = ATACMD_COMPLETE;
1037 1.1 bouyer } else {
1038 1.1 bouyer if (ata_c->flags & AT_WAIT) {
1039 1.58 jdolecek ata_channel_lock(chp);
1040 1.58 jdolecek if ((ata_c->flags & AT_DONE) == 0) {
1041 1.58 jdolecek ata_wait_xfer(chp, xfer);
1042 1.58 jdolecek KASSERT((ata_c->flags & AT_DONE) != 0);
1043 1.1 bouyer }
1044 1.58 jdolecek ata_channel_unlock(chp);
1045 1.1 bouyer ret = ATACMD_COMPLETE;
1046 1.1 bouyer } else {
1047 1.1 bouyer ret = ATACMD_QUEUED;
1048 1.1 bouyer }
1049 1.1 bouyer }
1050 1.1 bouyer splx(s);
1051 1.1 bouyer return ret;
1052 1.1 bouyer }
1053 1.1 bouyer
1054 1.58 jdolecek static int
1055 1.1 bouyer ahci_cmd_start(struct ata_channel *chp, struct ata_xfer *xfer)
1056 1.1 bouyer {
1057 1.58 jdolecek struct ahci_softc *sc = AHCI_CH2SC(chp);
1058 1.1 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
1059 1.58 jdolecek struct ata_command *ata_c = &xfer->c_ata_c;
1060 1.58 jdolecek int slot = xfer->c_slot;
1061 1.1 bouyer struct ahci_cmd_tbl *cmd_tbl;
1062 1.1 bouyer struct ahci_cmd_header *cmd_h;
1063 1.1 bouyer
1064 1.58 jdolecek AHCIDEBUG_PRINT(("ahci_cmd_start CI 0x%x timo %d\n slot %d",
1065 1.58 jdolecek AHCI_READ(sc, AHCI_P_CI(chp->ch_channel)),
1066 1.58 jdolecek ata_c->timeout, slot),
1067 1.44 matt DEBUG_XFERS);
1068 1.1 bouyer
1069 1.58 jdolecek ata_channel_lock_owned(chp);
1070 1.58 jdolecek KASSERT((achp->ahcic_cmds_active & (1 << slot)) == 0);
1071 1.58 jdolecek
1072 1.1 bouyer cmd_tbl = achp->ahcic_cmd_tbl[slot];
1073 1.1 bouyer AHCIDEBUG_PRINT(("%s port %d tbl %p\n", AHCINAME(sc), chp->ch_channel,
1074 1.1 bouyer cmd_tbl), DEBUG_XFERS);
1075 1.1 bouyer
1076 1.20 jakllsch satafis_rhd_construct_cmd(ata_c, cmd_tbl->cmdt_cfis);
1077 1.40 bouyer cmd_tbl->cmdt_cfis[rhd_c] |= xfer->c_drive;
1078 1.1 bouyer
1079 1.1 bouyer cmd_h = &achp->ahcic_cmdh[slot];
1080 1.1 bouyer AHCIDEBUG_PRINT(("%s port %d header %p\n", AHCINAME(sc),
1081 1.1 bouyer chp->ch_channel, cmd_h), DEBUG_XFERS);
1082 1.1 bouyer if (ahci_dma_setup(chp, slot,
1083 1.31 tsutsui (ata_c->flags & (AT_READ|AT_WRITE) && ata_c->bcount > 0) ?
1084 1.31 tsutsui ata_c->data : NULL,
1085 1.1 bouyer ata_c->bcount,
1086 1.1 bouyer (ata_c->flags & AT_READ) ? BUS_DMA_READ : BUS_DMA_WRITE)) {
1087 1.1 bouyer ata_c->flags |= AT_DF;
1088 1.58 jdolecek return ATASTART_ABORT;
1089 1.1 bouyer }
1090 1.1 bouyer cmd_h->cmdh_flags = htole16(
1091 1.1 bouyer ((ata_c->flags & AT_WRITE) ? AHCI_CMDH_F_WR : 0) |
1092 1.40 bouyer RHD_FISLEN / 4 | (xfer->c_drive << AHCI_CMDH_F_PMP_SHIFT));
1093 1.1 bouyer cmd_h->cmdh_prdbc = 0;
1094 1.1 bouyer AHCI_CMDH_SYNC(sc, achp, slot,
1095 1.1 bouyer BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1096 1.1 bouyer
1097 1.1 bouyer if (ata_c->flags & AT_POLL) {
1098 1.1 bouyer /* polled command, disable interrupts */
1099 1.1 bouyer AHCI_WRITE(sc, AHCI_GHC,
1100 1.1 bouyer AHCI_READ(sc, AHCI_GHC) & ~AHCI_GHC_IE);
1101 1.1 bouyer }
1102 1.1 bouyer /* start command */
1103 1.1 bouyer AHCI_WRITE(sc, AHCI_P_CI(chp->ch_channel), 1 << slot);
1104 1.1 bouyer /* and says we started this command */
1105 1.1 bouyer achp->ahcic_cmds_active |= 1 << slot;
1106 1.1 bouyer
1107 1.1 bouyer if ((ata_c->flags & AT_POLL) == 0) {
1108 1.58 jdolecek callout_reset(&xfer->c_timo_callout, mstohz(ata_c->timeout),
1109 1.58 jdolecek ata_timeout, xfer);
1110 1.58 jdolecek return ATASTART_STARTED;
1111 1.58 jdolecek } else
1112 1.58 jdolecek return ATASTART_POLL;
1113 1.58 jdolecek }
1114 1.58 jdolecek
1115 1.58 jdolecek static void
1116 1.58 jdolecek ahci_cmd_poll(struct ata_channel *chp, struct ata_xfer *xfer)
1117 1.58 jdolecek {
1118 1.58 jdolecek struct ahci_softc *sc = AHCI_CH2SC(chp);
1119 1.58 jdolecek struct ahci_channel *achp = (struct ahci_channel *)chp;
1120 1.58 jdolecek
1121 1.58 jdolecek ata_channel_lock(chp);
1122 1.58 jdolecek
1123 1.1 bouyer /*
1124 1.1 bouyer * Polled command.
1125 1.1 bouyer */
1126 1.58 jdolecek for (int i = 0; i < xfer->c_ata_c.timeout / 10; i++) {
1127 1.58 jdolecek if (xfer->c_ata_c.flags & AT_DONE)
1128 1.1 bouyer break;
1129 1.58 jdolecek ata_channel_unlock(chp);
1130 1.1 bouyer ahci_intr_port(sc, achp);
1131 1.58 jdolecek ata_channel_lock(chp);
1132 1.58 jdolecek ata_delay(chp, 10, "ahcipl", xfer->c_ata_c.flags);
1133 1.1 bouyer }
1134 1.58 jdolecek AHCIDEBUG_PRINT(("%s port %d poll end GHC 0x%x IS 0x%x list 0x%x%x fis 0x%x%x CMD 0x%x CI 0x%x\n", AHCINAME(sc), chp->ch_channel,
1135 1.1 bouyer AHCI_READ(sc, AHCI_GHC), AHCI_READ(sc, AHCI_IS),
1136 1.58 jdolecek AHCI_READ(sc, AHCI_P_CLBU(chp->ch_channel)),
1137 1.58 jdolecek AHCI_READ(sc, AHCI_P_CLB(chp->ch_channel)),
1138 1.58 jdolecek AHCI_READ(sc, AHCI_P_FBU(chp->ch_channel)),
1139 1.58 jdolecek AHCI_READ(sc, AHCI_P_FB(chp->ch_channel)),
1140 1.58 jdolecek AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel)),
1141 1.58 jdolecek AHCI_READ(sc, AHCI_P_CI(chp->ch_channel))),
1142 1.1 bouyer DEBUG_XFERS);
1143 1.58 jdolecek
1144 1.58 jdolecek ata_channel_unlock(chp);
1145 1.58 jdolecek
1146 1.58 jdolecek if ((xfer->c_ata_c.flags & AT_DONE) == 0) {
1147 1.58 jdolecek xfer->c_ata_c.flags |= AT_TIMEOU;
1148 1.58 jdolecek xfer->c_intr(chp, xfer, 0);
1149 1.1 bouyer }
1150 1.1 bouyer /* reenable interrupts */
1151 1.1 bouyer AHCI_WRITE(sc, AHCI_GHC, AHCI_READ(sc, AHCI_GHC) | AHCI_GHC_IE);
1152 1.1 bouyer }
1153 1.1 bouyer
1154 1.29 jakllsch static void
1155 1.58 jdolecek ahci_cmd_abort(struct ata_channel *chp, struct ata_xfer *xfer)
1156 1.58 jdolecek {
1157 1.58 jdolecek ahci_cmd_complete(chp, xfer, 0);
1158 1.58 jdolecek }
1159 1.58 jdolecek
1160 1.58 jdolecek static void
1161 1.1 bouyer ahci_cmd_kill_xfer(struct ata_channel *chp, struct ata_xfer *xfer, int reason)
1162 1.1 bouyer {
1163 1.58 jdolecek struct ahci_channel *achp = (struct ahci_channel *)chp;
1164 1.58 jdolecek struct ata_command *ata_c = &xfer->c_ata_c;
1165 1.58 jdolecek bool deactivate = true;
1166 1.58 jdolecek
1167 1.1 bouyer AHCIDEBUG_PRINT(("ahci_cmd_kill_xfer channel %d\n", chp->ch_channel),
1168 1.1 bouyer DEBUG_FUNCS);
1169 1.1 bouyer
1170 1.1 bouyer switch (reason) {
1171 1.58 jdolecek case KILL_GONE_INACTIVE:
1172 1.58 jdolecek deactivate = false;
1173 1.58 jdolecek /* FALLTHROUGH */
1174 1.1 bouyer case KILL_GONE:
1175 1.1 bouyer ata_c->flags |= AT_GONE;
1176 1.1 bouyer break;
1177 1.1 bouyer case KILL_RESET:
1178 1.1 bouyer ata_c->flags |= AT_RESET;
1179 1.1 bouyer break;
1180 1.58 jdolecek case KILL_REQUEUE:
1181 1.58 jdolecek panic("%s: not supposed to be requeued\n", __func__);
1182 1.58 jdolecek break;
1183 1.1 bouyer default:
1184 1.1 bouyer printf("ahci_cmd_kill_xfer: unknown reason %d\n", reason);
1185 1.1 bouyer panic("ahci_cmd_kill_xfer");
1186 1.1 bouyer }
1187 1.58 jdolecek
1188 1.58 jdolecek if (deactivate) {
1189 1.58 jdolecek KASSERT((achp->ahcic_cmds_active & (1 << xfer->c_slot)) != 0);
1190 1.58 jdolecek achp->ahcic_cmds_active &= ~(1 << xfer->c_slot);
1191 1.58 jdolecek ata_deactivate_xfer(chp, xfer);
1192 1.58 jdolecek }
1193 1.58 jdolecek
1194 1.58 jdolecek ahci_cmd_done_end(chp, xfer);
1195 1.1 bouyer }
1196 1.1 bouyer
1197 1.29 jakllsch static int
1198 1.58 jdolecek ahci_cmd_complete(struct ata_channel *chp, struct ata_xfer *xfer, int tfd)
1199 1.1 bouyer {
1200 1.58 jdolecek struct ata_command *ata_c = &xfer->c_ata_c;
1201 1.26 jakllsch struct ahci_channel *achp = (struct ahci_channel *)chp;
1202 1.1 bouyer
1203 1.1 bouyer AHCIDEBUG_PRINT(("ahci_cmd_complete channel %d CMD 0x%x CI 0x%x\n",
1204 1.58 jdolecek chp->ch_channel,
1205 1.58 jdolecek AHCI_READ(AHCI_CH2SC(chp), AHCI_P_CMD(chp->ch_channel)),
1206 1.58 jdolecek AHCI_READ(AHCI_CH2SC(chp), AHCI_P_CI(chp->ch_channel))),
1207 1.1 bouyer DEBUG_FUNCS);
1208 1.58 jdolecek
1209 1.58 jdolecek if (ata_waitdrain_xfer_check(chp, xfer))
1210 1.58 jdolecek return 0;
1211 1.58 jdolecek
1212 1.58 jdolecek KASSERT((achp->ahcic_cmds_active & (1 << xfer->c_slot)) != 0);
1213 1.58 jdolecek achp->ahcic_cmds_active &= ~(1 << xfer->c_slot);
1214 1.58 jdolecek ata_deactivate_xfer(chp, xfer);
1215 1.58 jdolecek
1216 1.1 bouyer if (xfer->c_flags & C_TIMEOU) {
1217 1.1 bouyer ata_c->flags |= AT_TIMEOU;
1218 1.1 bouyer }
1219 1.26 jakllsch
1220 1.58 jdolecek if (AHCI_TFD_ST(tfd) & WDCS_BSY) {
1221 1.26 jakllsch ata_c->flags |= AT_TIMEOU;
1222 1.58 jdolecek } else if (AHCI_TFD_ST(tfd) & WDCS_ERR) {
1223 1.58 jdolecek ata_c->r_error = AHCI_TFD_ERR(tfd);
1224 1.26 jakllsch ata_c->flags |= AT_ERROR;
1225 1.1 bouyer }
1226 1.26 jakllsch
1227 1.26 jakllsch if (ata_c->flags & AT_READREG)
1228 1.26 jakllsch satafis_rdh_cmd_readreg(ata_c, achp->ahcic_rfis->rfis_rfis);
1229 1.26 jakllsch
1230 1.58 jdolecek ahci_cmd_done(chp, xfer);
1231 1.1 bouyer return 0;
1232 1.1 bouyer }
1233 1.1 bouyer
1234 1.29 jakllsch static void
1235 1.58 jdolecek ahci_cmd_done(struct ata_channel *chp, struct ata_xfer *xfer)
1236 1.1 bouyer {
1237 1.1 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
1238 1.1 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
1239 1.58 jdolecek struct ata_command *ata_c = &xfer->c_ata_c;
1240 1.25 jakllsch uint16_t *idwordbuf;
1241 1.58 jdolecek int flags = ata_c->flags;
1242 1.25 jakllsch int i;
1243 1.1 bouyer
1244 1.58 jdolecek AHCIDEBUG_PRINT(("ahci_cmd_done channel %d flags %#x/%#x\n",
1245 1.58 jdolecek chp->ch_channel, xfer->c_flags, ata_c->flags), DEBUG_FUNCS);
1246 1.1 bouyer
1247 1.31 tsutsui if (ata_c->flags & (AT_READ|AT_WRITE) && ata_c->bcount > 0) {
1248 1.58 jdolecek bus_dmamap_t map = achp->ahcic_datad[xfer->c_slot];
1249 1.44 matt bus_dmamap_sync(sc->sc_dmat, map, 0, map->dm_mapsize,
1250 1.1 bouyer (ata_c->flags & AT_READ) ? BUS_DMASYNC_POSTREAD :
1251 1.1 bouyer BUS_DMASYNC_POSTWRITE);
1252 1.44 matt bus_dmamap_unload(sc->sc_dmat, map);
1253 1.1 bouyer }
1254 1.1 bouyer
1255 1.58 jdolecek AHCI_CMDH_SYNC(sc, achp, xfer->c_slot,
1256 1.2 fvdl BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
1257 1.2 fvdl
1258 1.25 jakllsch /* ata(4) expects IDENTIFY data to be in host endianess */
1259 1.25 jakllsch if (ata_c->r_command == WDCC_IDENTIFY ||
1260 1.25 jakllsch ata_c->r_command == ATAPI_IDENTIFY_DEVICE) {
1261 1.25 jakllsch idwordbuf = xfer->c_databuf;
1262 1.25 jakllsch for (i = 0; i < (xfer->c_bcount / sizeof(*idwordbuf)); i++) {
1263 1.25 jakllsch idwordbuf[i] = le16toh(idwordbuf[i]);
1264 1.25 jakllsch }
1265 1.25 jakllsch }
1266 1.25 jakllsch
1267 1.58 jdolecek if (achp->ahcic_cmdh[xfer->c_slot].cmdh_prdbc)
1268 1.58 jdolecek ata_c->flags |= AT_XFDONE;
1269 1.58 jdolecek ahci_cmd_done_end(chp, xfer);
1270 1.58 jdolecek if ((flags & (AT_TIMEOU|AT_ERROR)) == 0)
1271 1.58 jdolecek atastart(chp);
1272 1.58 jdolecek }
1273 1.58 jdolecek
1274 1.58 jdolecek static void
1275 1.58 jdolecek ahci_cmd_done_end(struct ata_channel *chp, struct ata_xfer *xfer)
1276 1.58 jdolecek {
1277 1.58 jdolecek struct ata_command *ata_c = &xfer->c_ata_c;
1278 1.58 jdolecek
1279 1.58 jdolecek ata_channel_lock(chp);
1280 1.58 jdolecek
1281 1.1 bouyer ata_c->flags |= AT_DONE;
1282 1.1 bouyer
1283 1.1 bouyer if (ata_c->flags & AT_WAIT)
1284 1.58 jdolecek ata_wake_xfer(chp, xfer);
1285 1.58 jdolecek
1286 1.58 jdolecek ata_channel_unlock(chp);
1287 1.1 bouyer return;
1288 1.1 bouyer }
1289 1.1 bouyer
1290 1.29 jakllsch static int
1291 1.58 jdolecek ahci_ata_bio(struct ata_drive_datas *drvp, struct ata_xfer *xfer)
1292 1.1 bouyer {
1293 1.1 bouyer struct ata_channel *chp = drvp->chnl_softc;
1294 1.58 jdolecek struct ata_bio *ata_bio = &xfer->c_bio;
1295 1.1 bouyer
1296 1.1 bouyer AHCIDEBUG_PRINT(("ahci_ata_bio port %d CI 0x%x\n",
1297 1.58 jdolecek chp->ch_channel,
1298 1.58 jdolecek AHCI_READ(AHCI_CH2SC(chp), AHCI_P_CI(chp->ch_channel))),
1299 1.1 bouyer DEBUG_XFERS);
1300 1.1 bouyer if (ata_bio->flags & ATA_POLL)
1301 1.1 bouyer xfer->c_flags |= C_POLL;
1302 1.1 bouyer xfer->c_drive = drvp->drive;
1303 1.1 bouyer xfer->c_databuf = ata_bio->databuf;
1304 1.1 bouyer xfer->c_bcount = ata_bio->bcount;
1305 1.1 bouyer xfer->c_start = ahci_bio_start;
1306 1.58 jdolecek xfer->c_poll = ahci_bio_poll;
1307 1.58 jdolecek xfer->c_abort = ahci_bio_abort;
1308 1.1 bouyer xfer->c_intr = ahci_bio_complete;
1309 1.1 bouyer xfer->c_kill_xfer = ahci_bio_kill_xfer;
1310 1.1 bouyer ata_exec_xfer(chp, xfer);
1311 1.1 bouyer return (ata_bio->flags & ATA_ITSDONE) ? ATACMD_COMPLETE : ATACMD_QUEUED;
1312 1.1 bouyer }
1313 1.1 bouyer
1314 1.58 jdolecek static int
1315 1.1 bouyer ahci_bio_start(struct ata_channel *chp, struct ata_xfer *xfer)
1316 1.1 bouyer {
1317 1.1 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
1318 1.1 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
1319 1.58 jdolecek struct ata_bio *ata_bio = &xfer->c_bio;
1320 1.1 bouyer struct ahci_cmd_tbl *cmd_tbl;
1321 1.1 bouyer struct ahci_cmd_header *cmd_h;
1322 1.1 bouyer
1323 1.1 bouyer AHCIDEBUG_PRINT(("ahci_bio_start CI 0x%x\n",
1324 1.1 bouyer AHCI_READ(sc, AHCI_P_CI(chp->ch_channel))), DEBUG_XFERS);
1325 1.1 bouyer
1326 1.58 jdolecek ata_channel_lock_owned(chp);
1327 1.58 jdolecek
1328 1.58 jdolecek cmd_tbl = achp->ahcic_cmd_tbl[xfer->c_slot];
1329 1.1 bouyer AHCIDEBUG_PRINT(("%s port %d tbl %p\n", AHCINAME(sc), chp->ch_channel,
1330 1.1 bouyer cmd_tbl), DEBUG_XFERS);
1331 1.1 bouyer
1332 1.20 jakllsch satafis_rhd_construct_bio(xfer, cmd_tbl->cmdt_cfis);
1333 1.40 bouyer cmd_tbl->cmdt_cfis[rhd_c] |= xfer->c_drive;
1334 1.1 bouyer
1335 1.58 jdolecek cmd_h = &achp->ahcic_cmdh[xfer->c_slot];
1336 1.1 bouyer AHCIDEBUG_PRINT(("%s port %d header %p\n", AHCINAME(sc),
1337 1.1 bouyer chp->ch_channel, cmd_h), DEBUG_XFERS);
1338 1.58 jdolecek if (ahci_dma_setup(chp, xfer->c_slot, ata_bio->databuf, ata_bio->bcount,
1339 1.1 bouyer (ata_bio->flags & ATA_READ) ? BUS_DMA_READ : BUS_DMA_WRITE)) {
1340 1.1 bouyer ata_bio->error = ERR_DMA;
1341 1.1 bouyer ata_bio->r_error = 0;
1342 1.58 jdolecek return ATASTART_ABORT;
1343 1.1 bouyer }
1344 1.1 bouyer cmd_h->cmdh_flags = htole16(
1345 1.1 bouyer ((ata_bio->flags & ATA_READ) ? 0 : AHCI_CMDH_F_WR) |
1346 1.40 bouyer RHD_FISLEN / 4 | (xfer->c_drive << AHCI_CMDH_F_PMP_SHIFT));
1347 1.1 bouyer cmd_h->cmdh_prdbc = 0;
1348 1.58 jdolecek AHCI_CMDH_SYNC(sc, achp, xfer->c_slot,
1349 1.2 fvdl BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1350 1.1 bouyer
1351 1.1 bouyer if (xfer->c_flags & C_POLL) {
1352 1.1 bouyer /* polled command, disable interrupts */
1353 1.1 bouyer AHCI_WRITE(sc, AHCI_GHC,
1354 1.1 bouyer AHCI_READ(sc, AHCI_GHC) & ~AHCI_GHC_IE);
1355 1.1 bouyer }
1356 1.58 jdolecek if (xfer->c_flags & C_NCQ)
1357 1.58 jdolecek AHCI_WRITE(sc, AHCI_P_SACT(chp->ch_channel), 1 << xfer->c_slot);
1358 1.1 bouyer /* start command */
1359 1.58 jdolecek AHCI_WRITE(sc, AHCI_P_CI(chp->ch_channel), 1 << xfer->c_slot);
1360 1.1 bouyer /* and says we started this command */
1361 1.58 jdolecek achp->ahcic_cmds_active |= 1 << xfer->c_slot;
1362 1.1 bouyer
1363 1.1 bouyer if ((xfer->c_flags & C_POLL) == 0) {
1364 1.58 jdolecek callout_reset(&xfer->c_timo_callout, mstohz(ATA_DELAY),
1365 1.58 jdolecek ata_timeout, xfer);
1366 1.58 jdolecek return ATASTART_STARTED;
1367 1.58 jdolecek } else
1368 1.58 jdolecek return ATASTART_POLL;
1369 1.58 jdolecek }
1370 1.58 jdolecek
1371 1.58 jdolecek static void
1372 1.58 jdolecek ahci_bio_poll(struct ata_channel *chp, struct ata_xfer *xfer)
1373 1.58 jdolecek {
1374 1.58 jdolecek struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
1375 1.58 jdolecek struct ahci_channel *achp = (struct ahci_channel *)chp;
1376 1.58 jdolecek
1377 1.1 bouyer /*
1378 1.1 bouyer * Polled command.
1379 1.1 bouyer */
1380 1.58 jdolecek for (int i = 0; i < ATA_DELAY * 10; i++) {
1381 1.58 jdolecek if (xfer->c_bio.flags & ATA_ITSDONE)
1382 1.1 bouyer break;
1383 1.1 bouyer ahci_intr_port(sc, achp);
1384 1.47 bouyer delay(100);
1385 1.1 bouyer }
1386 1.58 jdolecek AHCIDEBUG_PRINT(("%s port %d poll end GHC 0x%x IS 0x%x list 0x%x%x fis 0x%x%x CMD 0x%x CI 0x%x\n", AHCINAME(sc), chp->ch_channel,
1387 1.1 bouyer AHCI_READ(sc, AHCI_GHC), AHCI_READ(sc, AHCI_IS),
1388 1.58 jdolecek AHCI_READ(sc, AHCI_P_CLBU(chp->ch_channel)),
1389 1.58 jdolecek AHCI_READ(sc, AHCI_P_CLB(chp->ch_channel)),
1390 1.58 jdolecek AHCI_READ(sc, AHCI_P_FBU(chp->ch_channel)),
1391 1.58 jdolecek AHCI_READ(sc, AHCI_P_FB(chp->ch_channel)),
1392 1.58 jdolecek AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel)),
1393 1.58 jdolecek AHCI_READ(sc, AHCI_P_CI(chp->ch_channel))),
1394 1.1 bouyer DEBUG_XFERS);
1395 1.58 jdolecek if ((xfer->c_bio.flags & ATA_ITSDONE) == 0) {
1396 1.58 jdolecek xfer->c_bio.error = TIMEOUT;
1397 1.58 jdolecek xfer->c_intr(chp, xfer, 0);
1398 1.1 bouyer }
1399 1.1 bouyer /* reenable interrupts */
1400 1.1 bouyer AHCI_WRITE(sc, AHCI_GHC, AHCI_READ(sc, AHCI_GHC) | AHCI_GHC_IE);
1401 1.1 bouyer }
1402 1.1 bouyer
1403 1.29 jakllsch static void
1404 1.58 jdolecek ahci_bio_abort(struct ata_channel *chp, struct ata_xfer *xfer)
1405 1.58 jdolecek {
1406 1.58 jdolecek ahci_bio_complete(chp, xfer, 0);
1407 1.58 jdolecek }
1408 1.58 jdolecek
1409 1.58 jdolecek static void
1410 1.1 bouyer ahci_bio_kill_xfer(struct ata_channel *chp, struct ata_xfer *xfer, int reason)
1411 1.1 bouyer {
1412 1.1 bouyer int drive = xfer->c_drive;
1413 1.58 jdolecek struct ata_bio *ata_bio = &xfer->c_bio;
1414 1.1 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
1415 1.58 jdolecek bool deactivate = true;
1416 1.58 jdolecek
1417 1.1 bouyer AHCIDEBUG_PRINT(("ahci_bio_kill_xfer channel %d\n", chp->ch_channel),
1418 1.1 bouyer DEBUG_FUNCS);
1419 1.1 bouyer
1420 1.1 bouyer ata_bio->flags |= ATA_ITSDONE;
1421 1.1 bouyer switch (reason) {
1422 1.58 jdolecek case KILL_GONE_INACTIVE:
1423 1.58 jdolecek deactivate = false;
1424 1.58 jdolecek /* FALLTHROUGH */
1425 1.1 bouyer case KILL_GONE:
1426 1.1 bouyer ata_bio->error = ERR_NODEV;
1427 1.1 bouyer break;
1428 1.1 bouyer case KILL_RESET:
1429 1.1 bouyer ata_bio->error = ERR_RESET;
1430 1.1 bouyer break;
1431 1.58 jdolecek case KILL_REQUEUE:
1432 1.58 jdolecek ata_bio->error = REQUEUE;
1433 1.58 jdolecek break;
1434 1.1 bouyer default:
1435 1.1 bouyer printf("ahci_bio_kill_xfer: unknown reason %d\n", reason);
1436 1.1 bouyer panic("ahci_bio_kill_xfer");
1437 1.1 bouyer }
1438 1.1 bouyer ata_bio->r_error = WDCE_ABRT;
1439 1.58 jdolecek
1440 1.58 jdolecek if (deactivate) {
1441 1.58 jdolecek KASSERT((achp->ahcic_cmds_active & (1 << xfer->c_slot)) != 0);
1442 1.58 jdolecek achp->ahcic_cmds_active &= ~(1 << xfer->c_slot);
1443 1.58 jdolecek ata_deactivate_xfer(chp, xfer);
1444 1.58 jdolecek }
1445 1.58 jdolecek
1446 1.58 jdolecek (*chp->ch_drive[drive].drv_done)(chp->ch_drive[drive].drv_softc, xfer);
1447 1.1 bouyer }
1448 1.1 bouyer
1449 1.29 jakllsch static int
1450 1.58 jdolecek ahci_bio_complete(struct ata_channel *chp, struct ata_xfer *xfer, int tfd)
1451 1.1 bouyer {
1452 1.58 jdolecek struct ata_bio *ata_bio = &xfer->c_bio;
1453 1.1 bouyer int drive = xfer->c_drive;
1454 1.1 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
1455 1.1 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
1456 1.1 bouyer
1457 1.1 bouyer AHCIDEBUG_PRINT(("ahci_bio_complete channel %d\n", chp->ch_channel),
1458 1.1 bouyer DEBUG_FUNCS);
1459 1.1 bouyer
1460 1.58 jdolecek if (ata_waitdrain_xfer_check(chp, xfer))
1461 1.58 jdolecek return 0;
1462 1.58 jdolecek
1463 1.58 jdolecek KASSERT((achp->ahcic_cmds_active & (1 << xfer->c_slot)) != 0);
1464 1.58 jdolecek achp->ahcic_cmds_active &= ~(1 << xfer->c_slot);
1465 1.58 jdolecek ata_deactivate_xfer(chp, xfer);
1466 1.58 jdolecek
1467 1.5 bouyer if (xfer->c_flags & C_TIMEOU) {
1468 1.5 bouyer ata_bio->error = TIMEOUT;
1469 1.5 bouyer }
1470 1.1 bouyer
1471 1.58 jdolecek bus_dmamap_sync(sc->sc_dmat, achp->ahcic_datad[xfer->c_slot], 0,
1472 1.58 jdolecek achp->ahcic_datad[xfer->c_slot]->dm_mapsize,
1473 1.1 bouyer (ata_bio->flags & ATA_READ) ? BUS_DMASYNC_POSTREAD :
1474 1.1 bouyer BUS_DMASYNC_POSTWRITE);
1475 1.58 jdolecek bus_dmamap_unload(sc->sc_dmat, achp->ahcic_datad[xfer->c_slot]);
1476 1.1 bouyer
1477 1.1 bouyer ata_bio->flags |= ATA_ITSDONE;
1478 1.58 jdolecek if (AHCI_TFD_ERR(tfd) & WDCS_DWF) {
1479 1.1 bouyer ata_bio->error = ERR_DF;
1480 1.58 jdolecek } else if (AHCI_TFD_ST(tfd) & WDCS_ERR) {
1481 1.1 bouyer ata_bio->error = ERROR;
1482 1.58 jdolecek ata_bio->r_error = AHCI_TFD_ERR(tfd);
1483 1.58 jdolecek } else if (AHCI_TFD_ST(tfd) & WDCS_CORR)
1484 1.1 bouyer ata_bio->flags |= ATA_CORR;
1485 1.1 bouyer
1486 1.58 jdolecek AHCI_CMDH_SYNC(sc, achp, xfer->c_slot,
1487 1.1 bouyer BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
1488 1.1 bouyer AHCIDEBUG_PRINT(("ahci_bio_complete bcount %ld",
1489 1.1 bouyer ata_bio->bcount), DEBUG_XFERS);
1490 1.19 bouyer /*
1491 1.58 jdolecek * If it was a write, complete data buffer may have been transfered
1492 1.19 bouyer * before error detection; in this case don't use cmdh_prdbc
1493 1.19 bouyer * as it won't reflect what was written to media. Assume nothing
1494 1.19 bouyer * was transfered and leave bcount as-is.
1495 1.58 jdolecek * For queued commands, PRD Byte Count should not be used, and is
1496 1.58 jdolecek * not required to be valid; in that case underflow is always illegal.
1497 1.19 bouyer */
1498 1.58 jdolecek if ((xfer->c_flags & C_NCQ) != 0) {
1499 1.58 jdolecek if (ata_bio->error == NOERROR)
1500 1.58 jdolecek ata_bio->bcount = 0;
1501 1.58 jdolecek } else {
1502 1.58 jdolecek if ((ata_bio->flags & ATA_READ) || ata_bio->error == NOERROR)
1503 1.58 jdolecek ata_bio->bcount -=
1504 1.58 jdolecek le32toh(achp->ahcic_cmdh[xfer->c_slot].cmdh_prdbc);
1505 1.58 jdolecek }
1506 1.1 bouyer AHCIDEBUG_PRINT((" now %ld\n", ata_bio->bcount), DEBUG_XFERS);
1507 1.58 jdolecek (*chp->ch_drive[drive].drv_done)(chp->ch_drive[drive].drv_softc, xfer);
1508 1.58 jdolecek if ((AHCI_TFD_ST(tfd) & WDCS_ERR) == 0)
1509 1.58 jdolecek atastart(chp);
1510 1.1 bouyer return 0;
1511 1.1 bouyer }
1512 1.1 bouyer
1513 1.29 jakllsch static void
1514 1.5 bouyer ahci_channel_stop(struct ahci_softc *sc, struct ata_channel *chp, int flags)
1515 1.5 bouyer {
1516 1.5 bouyer int i;
1517 1.5 bouyer /* stop channel */
1518 1.5 bouyer AHCI_WRITE(sc, AHCI_P_CMD(chp->ch_channel),
1519 1.5 bouyer AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel)) & ~AHCI_P_CMD_ST);
1520 1.5 bouyer /* wait 1s for channel to stop */
1521 1.5 bouyer for (i = 0; i <100; i++) {
1522 1.5 bouyer if ((AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel)) & AHCI_P_CMD_CR)
1523 1.5 bouyer == 0)
1524 1.5 bouyer break;
1525 1.58 jdolecek ata_delay(chp, 10, "ahcistop", flags);
1526 1.5 bouyer }
1527 1.5 bouyer if (AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel)) & AHCI_P_CMD_CR) {
1528 1.5 bouyer printf("%s: channel wouldn't stop\n", AHCINAME(sc));
1529 1.5 bouyer /* XXX controller reset ? */
1530 1.5 bouyer return;
1531 1.5 bouyer }
1532 1.51 jmcneill
1533 1.51 jmcneill if (sc->sc_channel_stop)
1534 1.51 jmcneill sc->sc_channel_stop(sc, chp);
1535 1.5 bouyer }
1536 1.5 bouyer
1537 1.29 jakllsch static void
1538 1.40 bouyer ahci_channel_start(struct ahci_softc *sc, struct ata_channel *chp,
1539 1.40 bouyer int flags, int clo)
1540 1.1 bouyer {
1541 1.40 bouyer int i;
1542 1.40 bouyer uint32_t p_cmd;
1543 1.1 bouyer /* clear error */
1544 1.18 bouyer AHCI_WRITE(sc, AHCI_P_SERR(chp->ch_channel),
1545 1.18 bouyer AHCI_READ(sc, AHCI_P_SERR(chp->ch_channel)));
1546 1.1 bouyer
1547 1.40 bouyer if (clo) {
1548 1.40 bouyer /* issue command list override */
1549 1.40 bouyer KASSERT(sc->sc_ahci_cap & AHCI_CAP_CLO);
1550 1.40 bouyer AHCI_WRITE(sc, AHCI_P_CMD(chp->ch_channel),
1551 1.40 bouyer AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel)) | AHCI_P_CMD_CLO);
1552 1.40 bouyer /* wait 1s for AHCI_CAP_CLO to clear */
1553 1.40 bouyer for (i = 0; i <100; i++) {
1554 1.40 bouyer if ((AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel)) &
1555 1.40 bouyer AHCI_P_CMD_CLO) == 0)
1556 1.40 bouyer break;
1557 1.58 jdolecek ata_delay(chp, 10, "ahciclo", flags);
1558 1.40 bouyer }
1559 1.40 bouyer if (AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel)) & AHCI_P_CMD_CLO) {
1560 1.40 bouyer printf("%s: channel wouldn't CLO\n", AHCINAME(sc));
1561 1.40 bouyer /* XXX controller reset ? */
1562 1.40 bouyer return;
1563 1.40 bouyer }
1564 1.40 bouyer }
1565 1.51 jmcneill
1566 1.51 jmcneill if (sc->sc_channel_start)
1567 1.51 jmcneill sc->sc_channel_start(sc, chp);
1568 1.51 jmcneill
1569 1.1 bouyer /* and start controller */
1570 1.40 bouyer p_cmd = AHCI_P_CMD_ICC_AC | AHCI_P_CMD_POD | AHCI_P_CMD_SUD |
1571 1.40 bouyer AHCI_P_CMD_FRE | AHCI_P_CMD_ST;
1572 1.40 bouyer if (chp->ch_ndrives > PMP_PORT_CTL &&
1573 1.40 bouyer chp->ch_drive[PMP_PORT_CTL].drive_type == ATA_DRIVET_PM) {
1574 1.40 bouyer p_cmd |= AHCI_P_CMD_PMA;
1575 1.40 bouyer }
1576 1.40 bouyer AHCI_WRITE(sc, AHCI_P_CMD(chp->ch_channel), p_cmd);
1577 1.1 bouyer }
1578 1.1 bouyer
1579 1.29 jakllsch static void
1580 1.58 jdolecek ahci_hold(struct ahci_channel *achp)
1581 1.58 jdolecek {
1582 1.58 jdolecek achp->ahcic_cmds_hold |= achp->ahcic_cmds_active;
1583 1.58 jdolecek achp->ahcic_cmds_active = 0;
1584 1.58 jdolecek }
1585 1.58 jdolecek
1586 1.58 jdolecek static void
1587 1.58 jdolecek ahci_unhold(struct ahci_channel *achp)
1588 1.58 jdolecek {
1589 1.58 jdolecek achp->ahcic_cmds_active = achp->ahcic_cmds_hold;
1590 1.58 jdolecek achp->ahcic_cmds_hold = 0;
1591 1.58 jdolecek }
1592 1.58 jdolecek
1593 1.58 jdolecek /* Recover channel after command failure */
1594 1.58 jdolecek void
1595 1.58 jdolecek ahci_channel_recover(struct ahci_softc *sc, struct ata_channel *chp, int tfd)
1596 1.1 bouyer {
1597 1.58 jdolecek struct ahci_channel *achp = (struct ahci_channel *)chp;
1598 1.58 jdolecek struct ata_drive_datas *drvp;
1599 1.58 jdolecek uint8_t slot, eslot, st, err;
1600 1.58 jdolecek int drive = -1, error;
1601 1.58 jdolecek struct ata_xfer *xfer;
1602 1.58 jdolecek bool reset = false;
1603 1.58 jdolecek
1604 1.58 jdolecek KASSERT(!achp->ahcic_recovering);
1605 1.58 jdolecek
1606 1.58 jdolecek achp->ahcic_recovering = true;
1607 1.58 jdolecek
1608 1.58 jdolecek /*
1609 1.58 jdolecek * Read FBS to get the drive which caused the error, if PM is in use.
1610 1.58 jdolecek * According to AHCI 1.3 spec, this register is available regardless
1611 1.58 jdolecek * if FIS-based switching (FBSS) feature is supported, or disabled.
1612 1.58 jdolecek * If FIS-based switching is not in use, it merely maintains single
1613 1.58 jdolecek * pair of DRQ/BSY state, but it is enough since in that case we
1614 1.58 jdolecek * never issue commands for more than one device at the time anyway.
1615 1.58 jdolecek * XXX untested
1616 1.58 jdolecek */
1617 1.58 jdolecek if (chp->ch_ndrives > PMP_PORT_CTL) {
1618 1.58 jdolecek uint32_t fbs = AHCI_READ(sc, AHCI_P_FBS(chp->ch_channel));
1619 1.58 jdolecek if (fbs & AHCI_P_FBS_SDE) {
1620 1.58 jdolecek drive = (fbs & AHCI_P_FBS_DWE) >> AHCI_P_FBS_DWE_SHIFT;
1621 1.58 jdolecek
1622 1.58 jdolecek /*
1623 1.58 jdolecek * Tell HBA to reset PM port X (value in DWE) state,
1624 1.58 jdolecek * and resume processing commands for other ports.
1625 1.58 jdolecek */
1626 1.58 jdolecek fbs |= AHCI_P_FBS_DEC;
1627 1.58 jdolecek AHCI_WRITE(sc, AHCI_P_FBS(chp->ch_channel), fbs);
1628 1.58 jdolecek for (int i = 0; i < 1000; i++) {
1629 1.58 jdolecek fbs = AHCI_READ(sc,
1630 1.58 jdolecek AHCI_P_FBS(chp->ch_channel));
1631 1.58 jdolecek if ((fbs & AHCI_P_FBS_DEC) == 0)
1632 1.58 jdolecek break;
1633 1.58 jdolecek DELAY(1000);
1634 1.58 jdolecek }
1635 1.58 jdolecek if ((fbs & AHCI_P_FBS_DEC) != 0) {
1636 1.58 jdolecek /* follow non-device specific recovery */
1637 1.58 jdolecek drive = -1;
1638 1.58 jdolecek reset = true;
1639 1.58 jdolecek }
1640 1.58 jdolecek } else {
1641 1.58 jdolecek /* not device specific, reset channel */
1642 1.58 jdolecek drive = -1;
1643 1.58 jdolecek reset = true;
1644 1.58 jdolecek }
1645 1.58 jdolecek } else
1646 1.58 jdolecek drive = 0;
1647 1.58 jdolecek
1648 1.58 jdolecek drvp = &chp->ch_drive[drive];
1649 1.58 jdolecek
1650 1.58 jdolecek /*
1651 1.58 jdolecek * If BSY or DRQ bits are set, must execute COMRESET to return
1652 1.58 jdolecek * device to idle state. If drive is idle, it's enough to just
1653 1.58 jdolecek * reset CMD.ST, it's not necessary to do software reset.
1654 1.58 jdolecek * After resetting CMD.ST, need to execute READ LOG EXT for NCQ
1655 1.58 jdolecek * to unblock device processing if COMRESET was not done.
1656 1.58 jdolecek */
1657 1.58 jdolecek if (reset || (AHCI_TFD_ST(tfd) & (WDCS_BSY|WDCS_DRQ)) != 0)
1658 1.58 jdolecek goto reset;
1659 1.58 jdolecek
1660 1.58 jdolecek KASSERT(drive >= 0);
1661 1.58 jdolecek ahci_channel_stop(sc, chp, AT_POLL);
1662 1.58 jdolecek ahci_channel_start(sc, chp, AT_POLL,
1663 1.58 jdolecek (sc->sc_ahci_cap & AHCI_CAP_CLO) ? 1 : 0);
1664 1.58 jdolecek
1665 1.58 jdolecek ahci_hold(achp);
1666 1.58 jdolecek
1667 1.58 jdolecek /*
1668 1.58 jdolecek * When running NCQ commands, READ LOG EXT is necessary to clear the
1669 1.58 jdolecek * error condition and unblock the device.
1670 1.58 jdolecek */
1671 1.58 jdolecek error = ata_read_log_ext_ncq(drvp, AT_POLL, &eslot, &st, &err);
1672 1.58 jdolecek
1673 1.58 jdolecek ahci_unhold(achp);
1674 1.58 jdolecek
1675 1.58 jdolecek switch (error) {
1676 1.58 jdolecek case 0:
1677 1.58 jdolecek /* Error out the particular NCQ xfer, then requeue the others */
1678 1.58 jdolecek if ((achp->ahcic_cmds_active & (1 << eslot)) != 0) {
1679 1.58 jdolecek xfer = ata_queue_hwslot_to_xfer(chp, eslot);
1680 1.58 jdolecek xfer->c_flags |= C_RECOVERED;
1681 1.58 jdolecek xfer->c_intr(chp, xfer,
1682 1.58 jdolecek (err << AHCI_P_TFD_ERR_SHIFT) | st);
1683 1.58 jdolecek }
1684 1.58 jdolecek break;
1685 1.58 jdolecek
1686 1.58 jdolecek case EOPNOTSUPP:
1687 1.58 jdolecek /*
1688 1.58 jdolecek * Non-NCQ command error, just find the slot and end with
1689 1.58 jdolecek * the error.
1690 1.58 jdolecek */
1691 1.58 jdolecek for (slot = 0; slot < sc->sc_ncmds; slot++) {
1692 1.58 jdolecek if ((achp->ahcic_cmds_active & (1 << slot)) != 0) {
1693 1.58 jdolecek xfer = ata_queue_hwslot_to_xfer(chp, slot);
1694 1.58 jdolecek xfer->c_intr(chp, xfer, tfd);
1695 1.58 jdolecek }
1696 1.58 jdolecek }
1697 1.58 jdolecek break;
1698 1.58 jdolecek
1699 1.58 jdolecek case EAGAIN:
1700 1.58 jdolecek /*
1701 1.58 jdolecek * Failed to get resources to run the recovery command, must
1702 1.58 jdolecek * reset the drive. This will also kill all still outstanding
1703 1.58 jdolecek * transfers.
1704 1.58 jdolecek */
1705 1.58 jdolecek reset:
1706 1.58 jdolecek ahci_reset_channel(chp, AT_POLL);
1707 1.58 jdolecek goto out;
1708 1.58 jdolecek /* NOTREACHED */
1709 1.58 jdolecek
1710 1.58 jdolecek default:
1711 1.58 jdolecek /*
1712 1.58 jdolecek * The command to get the slot failed. Kill outstanding
1713 1.58 jdolecek * commands for the same drive only. No need to reset
1714 1.58 jdolecek * the drive, it's unblocked nevertheless.
1715 1.58 jdolecek */
1716 1.58 jdolecek break;
1717 1.58 jdolecek }
1718 1.58 jdolecek
1719 1.58 jdolecek /* Requeue all unfinished commands for same drive as failed command */
1720 1.58 jdolecek for (slot = 0; slot < sc->sc_ncmds; slot++) {
1721 1.58 jdolecek if ((achp->ahcic_cmds_active & (1 << slot)) == 0)
1722 1.58 jdolecek continue;
1723 1.58 jdolecek
1724 1.58 jdolecek xfer = ata_queue_hwslot_to_xfer(chp, slot);
1725 1.58 jdolecek if (drive != xfer->c_drive)
1726 1.58 jdolecek continue;
1727 1.58 jdolecek
1728 1.58 jdolecek xfer->c_kill_xfer(chp, xfer,
1729 1.58 jdolecek (error == 0) ? KILL_REQUEUE : KILL_RESET);
1730 1.1 bouyer }
1731 1.58 jdolecek
1732 1.58 jdolecek out:
1733 1.58 jdolecek /* Drive unblocked, back to normal operation */
1734 1.58 jdolecek achp->ahcic_recovering = false;
1735 1.58 jdolecek atastart(chp);
1736 1.1 bouyer }
1737 1.1 bouyer
1738 1.29 jakllsch static int
1739 1.1 bouyer ahci_dma_setup(struct ata_channel *chp, int slot, void *data,
1740 1.1 bouyer size_t count, int op)
1741 1.1 bouyer {
1742 1.1 bouyer int error, seg;
1743 1.1 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
1744 1.1 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
1745 1.1 bouyer struct ahci_cmd_tbl *cmd_tbl;
1746 1.1 bouyer struct ahci_cmd_header *cmd_h;
1747 1.1 bouyer
1748 1.1 bouyer cmd_h = &achp->ahcic_cmdh[slot];
1749 1.1 bouyer cmd_tbl = achp->ahcic_cmd_tbl[slot];
1750 1.1 bouyer
1751 1.1 bouyer if (data == NULL) {
1752 1.1 bouyer cmd_h->cmdh_prdtl = 0;
1753 1.1 bouyer goto end;
1754 1.1 bouyer }
1755 1.1 bouyer
1756 1.1 bouyer error = bus_dmamap_load(sc->sc_dmat, achp->ahcic_datad[slot],
1757 1.1 bouyer data, count, NULL,
1758 1.1 bouyer BUS_DMA_NOWAIT | BUS_DMA_STREAMING | op);
1759 1.1 bouyer if (error) {
1760 1.1 bouyer printf("%s port %d: failed to load xfer: %d\n",
1761 1.1 bouyer AHCINAME(sc), chp->ch_channel, error);
1762 1.1 bouyer return error;
1763 1.1 bouyer }
1764 1.1 bouyer bus_dmamap_sync(sc->sc_dmat, achp->ahcic_datad[slot], 0,
1765 1.1 bouyer achp->ahcic_datad[slot]->dm_mapsize,
1766 1.1 bouyer (op == BUS_DMA_READ) ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE);
1767 1.1 bouyer for (seg = 0; seg < achp->ahcic_datad[slot]->dm_nsegs; seg++) {
1768 1.28 jakllsch cmd_tbl->cmdt_prd[seg].prd_dba = htole64(
1769 1.1 bouyer achp->ahcic_datad[slot]->dm_segs[seg].ds_addr);
1770 1.1 bouyer cmd_tbl->cmdt_prd[seg].prd_dbc = htole32(
1771 1.1 bouyer achp->ahcic_datad[slot]->dm_segs[seg].ds_len - 1);
1772 1.1 bouyer }
1773 1.1 bouyer cmd_tbl->cmdt_prd[seg - 1].prd_dbc |= htole32(AHCI_PRD_DBC_IPC);
1774 1.1 bouyer cmd_h->cmdh_prdtl = htole16(achp->ahcic_datad[slot]->dm_nsegs);
1775 1.1 bouyer end:
1776 1.1 bouyer AHCI_CMDTBL_SYNC(sc, achp, slot, BUS_DMASYNC_PREWRITE);
1777 1.1 bouyer return 0;
1778 1.1 bouyer }
1779 1.8 bouyer
1780 1.8 bouyer #if NATAPIBUS > 0
1781 1.29 jakllsch static void
1782 1.8 bouyer ahci_atapibus_attach(struct atabus_softc * ata_sc)
1783 1.8 bouyer {
1784 1.8 bouyer struct ata_channel *chp = ata_sc->sc_chan;
1785 1.8 bouyer struct atac_softc *atac = chp->ch_atac;
1786 1.8 bouyer struct scsipi_adapter *adapt = &atac->atac_atapi_adapter._generic;
1787 1.8 bouyer struct scsipi_channel *chan = &chp->ch_atapi_channel;
1788 1.8 bouyer /*
1789 1.8 bouyer * Fill in the scsipi_adapter.
1790 1.8 bouyer */
1791 1.13 cube adapt->adapt_dev = atac->atac_dev;
1792 1.8 bouyer adapt->adapt_nchannels = atac->atac_nchannels;
1793 1.8 bouyer adapt->adapt_request = ahci_atapi_scsipi_request;
1794 1.8 bouyer adapt->adapt_minphys = ahci_atapi_minphys;
1795 1.8 bouyer atac->atac_atapi_adapter.atapi_probe_device = ahci_atapi_probe_device;
1796 1.8 bouyer
1797 1.8 bouyer /*
1798 1.8 bouyer * Fill in the scsipi_channel.
1799 1.8 bouyer */
1800 1.8 bouyer memset(chan, 0, sizeof(*chan));
1801 1.8 bouyer chan->chan_adapter = adapt;
1802 1.8 bouyer chan->chan_bustype = &ahci_atapi_bustype;
1803 1.8 bouyer chan->chan_channel = chp->ch_channel;
1804 1.8 bouyer chan->chan_flags = SCSIPI_CHAN_OPENINGS;
1805 1.8 bouyer chan->chan_openings = 1;
1806 1.8 bouyer chan->chan_max_periph = 1;
1807 1.8 bouyer chan->chan_ntargets = 1;
1808 1.8 bouyer chan->chan_nluns = 1;
1809 1.13 cube chp->atapibus = config_found_ia(ata_sc->sc_dev, "atapi", chan,
1810 1.8 bouyer atapiprint);
1811 1.8 bouyer }
1812 1.8 bouyer
1813 1.29 jakllsch static void
1814 1.8 bouyer ahci_atapi_minphys(struct buf *bp)
1815 1.8 bouyer {
1816 1.8 bouyer if (bp->b_bcount > MAXPHYS)
1817 1.8 bouyer bp->b_bcount = MAXPHYS;
1818 1.8 bouyer minphys(bp);
1819 1.8 bouyer }
1820 1.8 bouyer
1821 1.8 bouyer /*
1822 1.8 bouyer * Kill off all pending xfers for a periph.
1823 1.8 bouyer *
1824 1.8 bouyer * Must be called at splbio().
1825 1.8 bouyer */
1826 1.29 jakllsch static void
1827 1.8 bouyer ahci_atapi_kill_pending(struct scsipi_periph *periph)
1828 1.8 bouyer {
1829 1.8 bouyer struct atac_softc *atac =
1830 1.13 cube device_private(periph->periph_channel->chan_adapter->adapt_dev);
1831 1.8 bouyer struct ata_channel *chp =
1832 1.8 bouyer atac->atac_channels[periph->periph_channel->chan_channel];
1833 1.8 bouyer
1834 1.8 bouyer ata_kill_pending(&chp->ch_drive[periph->periph_target]);
1835 1.8 bouyer }
1836 1.8 bouyer
1837 1.29 jakllsch static void
1838 1.8 bouyer ahci_atapi_scsipi_request(struct scsipi_channel *chan,
1839 1.8 bouyer scsipi_adapter_req_t req, void *arg)
1840 1.8 bouyer {
1841 1.8 bouyer struct scsipi_adapter *adapt = chan->chan_adapter;
1842 1.8 bouyer struct scsipi_periph *periph;
1843 1.8 bouyer struct scsipi_xfer *sc_xfer;
1844 1.13 cube struct ahci_softc *sc = device_private(adapt->adapt_dev);
1845 1.8 bouyer struct atac_softc *atac = &sc->sc_atac;
1846 1.8 bouyer struct ata_xfer *xfer;
1847 1.8 bouyer int channel = chan->chan_channel;
1848 1.8 bouyer int drive, s;
1849 1.8 bouyer
1850 1.8 bouyer switch (req) {
1851 1.8 bouyer case ADAPTER_REQ_RUN_XFER:
1852 1.8 bouyer sc_xfer = arg;
1853 1.8 bouyer periph = sc_xfer->xs_periph;
1854 1.8 bouyer drive = periph->periph_target;
1855 1.13 cube if (!device_is_active(atac->atac_dev)) {
1856 1.8 bouyer sc_xfer->error = XS_DRIVER_STUFFUP;
1857 1.8 bouyer scsipi_done(sc_xfer);
1858 1.8 bouyer return;
1859 1.8 bouyer }
1860 1.58 jdolecek xfer = ata_get_xfer_ext(atac->atac_channels[channel], 0, 0);
1861 1.8 bouyer if (xfer == NULL) {
1862 1.8 bouyer sc_xfer->error = XS_RESOURCE_SHORTAGE;
1863 1.8 bouyer scsipi_done(sc_xfer);
1864 1.8 bouyer return;
1865 1.8 bouyer }
1866 1.8 bouyer
1867 1.8 bouyer if (sc_xfer->xs_control & XS_CTL_POLL)
1868 1.8 bouyer xfer->c_flags |= C_POLL;
1869 1.8 bouyer xfer->c_drive = drive;
1870 1.8 bouyer xfer->c_flags |= C_ATAPI;
1871 1.58 jdolecek xfer->c_scsipi = sc_xfer;
1872 1.8 bouyer xfer->c_databuf = sc_xfer->data;
1873 1.8 bouyer xfer->c_bcount = sc_xfer->datalen;
1874 1.8 bouyer xfer->c_start = ahci_atapi_start;
1875 1.58 jdolecek xfer->c_poll = ahci_atapi_poll;
1876 1.58 jdolecek xfer->c_abort = ahci_atapi_abort;
1877 1.8 bouyer xfer->c_intr = ahci_atapi_complete;
1878 1.8 bouyer xfer->c_kill_xfer = ahci_atapi_kill_xfer;
1879 1.8 bouyer xfer->c_dscpoll = 0;
1880 1.8 bouyer s = splbio();
1881 1.8 bouyer ata_exec_xfer(atac->atac_channels[channel], xfer);
1882 1.8 bouyer #ifdef DIAGNOSTIC
1883 1.8 bouyer if ((sc_xfer->xs_control & XS_CTL_POLL) != 0 &&
1884 1.8 bouyer (sc_xfer->xs_status & XS_STS_DONE) == 0)
1885 1.8 bouyer panic("ahci_atapi_scsipi_request: polled command "
1886 1.8 bouyer "not done");
1887 1.8 bouyer #endif
1888 1.8 bouyer splx(s);
1889 1.8 bouyer return;
1890 1.8 bouyer default:
1891 1.8 bouyer /* Not supported, nothing to do. */
1892 1.8 bouyer ;
1893 1.8 bouyer }
1894 1.8 bouyer }
1895 1.8 bouyer
1896 1.58 jdolecek static int
1897 1.8 bouyer ahci_atapi_start(struct ata_channel *chp, struct ata_xfer *xfer)
1898 1.8 bouyer {
1899 1.8 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
1900 1.8 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
1901 1.58 jdolecek struct scsipi_xfer *sc_xfer = xfer->c_scsipi;
1902 1.8 bouyer struct ahci_cmd_tbl *cmd_tbl;
1903 1.8 bouyer struct ahci_cmd_header *cmd_h;
1904 1.8 bouyer
1905 1.8 bouyer AHCIDEBUG_PRINT(("ahci_atapi_start CI 0x%x\n",
1906 1.8 bouyer AHCI_READ(sc, AHCI_P_CI(chp->ch_channel))), DEBUG_XFERS);
1907 1.8 bouyer
1908 1.58 jdolecek ata_channel_lock_owned(chp);
1909 1.58 jdolecek
1910 1.58 jdolecek cmd_tbl = achp->ahcic_cmd_tbl[xfer->c_slot];
1911 1.8 bouyer AHCIDEBUG_PRINT(("%s port %d tbl %p\n", AHCINAME(sc), chp->ch_channel,
1912 1.8 bouyer cmd_tbl), DEBUG_XFERS);
1913 1.8 bouyer
1914 1.20 jakllsch satafis_rhd_construct_atapi(xfer, cmd_tbl->cmdt_cfis);
1915 1.40 bouyer cmd_tbl->cmdt_cfis[rhd_c] |= xfer->c_drive;
1916 1.8 bouyer memset(&cmd_tbl->cmdt_acmd, 0, sizeof(cmd_tbl->cmdt_acmd));
1917 1.8 bouyer memcpy(cmd_tbl->cmdt_acmd, sc_xfer->cmd, sc_xfer->cmdlen);
1918 1.8 bouyer
1919 1.58 jdolecek cmd_h = &achp->ahcic_cmdh[xfer->c_slot];
1920 1.8 bouyer AHCIDEBUG_PRINT(("%s port %d header %p\n", AHCINAME(sc),
1921 1.8 bouyer chp->ch_channel, cmd_h), DEBUG_XFERS);
1922 1.58 jdolecek if (ahci_dma_setup(chp, xfer->c_slot,
1923 1.58 jdolecek sc_xfer->datalen ? sc_xfer->data : NULL,
1924 1.8 bouyer sc_xfer->datalen,
1925 1.8 bouyer (sc_xfer->xs_control & XS_CTL_DATA_IN) ?
1926 1.8 bouyer BUS_DMA_READ : BUS_DMA_WRITE)) {
1927 1.8 bouyer sc_xfer->error = XS_DRIVER_STUFFUP;
1928 1.58 jdolecek return ATASTART_ABORT;
1929 1.8 bouyer }
1930 1.8 bouyer cmd_h->cmdh_flags = htole16(
1931 1.8 bouyer ((sc_xfer->xs_control & XS_CTL_DATA_OUT) ? AHCI_CMDH_F_WR : 0) |
1932 1.40 bouyer RHD_FISLEN / 4 | AHCI_CMDH_F_A |
1933 1.40 bouyer (xfer->c_drive << AHCI_CMDH_F_PMP_SHIFT));
1934 1.8 bouyer cmd_h->cmdh_prdbc = 0;
1935 1.58 jdolecek AHCI_CMDH_SYNC(sc, achp, xfer->c_slot,
1936 1.8 bouyer BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1937 1.8 bouyer
1938 1.8 bouyer if (xfer->c_flags & C_POLL) {
1939 1.8 bouyer /* polled command, disable interrupts */
1940 1.8 bouyer AHCI_WRITE(sc, AHCI_GHC,
1941 1.8 bouyer AHCI_READ(sc, AHCI_GHC) & ~AHCI_GHC_IE);
1942 1.8 bouyer }
1943 1.8 bouyer /* start command */
1944 1.58 jdolecek AHCI_WRITE(sc, AHCI_P_CI(chp->ch_channel), 1 << xfer->c_slot);
1945 1.8 bouyer /* and says we started this command */
1946 1.58 jdolecek achp->ahcic_cmds_active |= 1 << xfer->c_slot;
1947 1.8 bouyer
1948 1.8 bouyer if ((xfer->c_flags & C_POLL) == 0) {
1949 1.58 jdolecek callout_reset(&xfer->c_timo_callout, mstohz(sc_xfer->timeout),
1950 1.58 jdolecek ata_timeout, xfer);
1951 1.58 jdolecek return ATASTART_STARTED;
1952 1.58 jdolecek } else
1953 1.58 jdolecek return ATASTART_POLL;
1954 1.58 jdolecek }
1955 1.58 jdolecek
1956 1.58 jdolecek static void
1957 1.58 jdolecek ahci_atapi_poll(struct ata_channel *chp, struct ata_xfer *xfer)
1958 1.58 jdolecek {
1959 1.58 jdolecek struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
1960 1.58 jdolecek struct ahci_channel *achp = (struct ahci_channel *)chp;
1961 1.58 jdolecek
1962 1.8 bouyer /*
1963 1.8 bouyer * Polled command.
1964 1.8 bouyer */
1965 1.58 jdolecek for (int i = 0; i < ATA_DELAY / 10; i++) {
1966 1.58 jdolecek if (xfer->c_scsipi->xs_status & XS_STS_DONE)
1967 1.8 bouyer break;
1968 1.8 bouyer ahci_intr_port(sc, achp);
1969 1.8 bouyer delay(10000);
1970 1.8 bouyer }
1971 1.58 jdolecek AHCIDEBUG_PRINT(("%s port %d poll end GHC 0x%x IS 0x%x list 0x%x%x fis 0x%x%x CMD 0x%x CI 0x%x\n", AHCINAME(sc), chp->ch_channel,
1972 1.8 bouyer AHCI_READ(sc, AHCI_GHC), AHCI_READ(sc, AHCI_IS),
1973 1.58 jdolecek AHCI_READ(sc, AHCI_P_CLBU(chp->ch_channel)),
1974 1.58 jdolecek AHCI_READ(sc, AHCI_P_CLB(chp->ch_channel)),
1975 1.58 jdolecek AHCI_READ(sc, AHCI_P_FBU(chp->ch_channel)),
1976 1.58 jdolecek AHCI_READ(sc, AHCI_P_FB(chp->ch_channel)),
1977 1.58 jdolecek AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel)),
1978 1.58 jdolecek AHCI_READ(sc, AHCI_P_CI(chp->ch_channel))),
1979 1.8 bouyer DEBUG_XFERS);
1980 1.58 jdolecek if ((xfer->c_scsipi->xs_status & XS_STS_DONE) == 0) {
1981 1.58 jdolecek xfer->c_scsipi->error = XS_TIMEOUT;
1982 1.58 jdolecek xfer->c_intr(chp, xfer, 0);
1983 1.8 bouyer }
1984 1.8 bouyer /* reenable interrupts */
1985 1.8 bouyer AHCI_WRITE(sc, AHCI_GHC, AHCI_READ(sc, AHCI_GHC) | AHCI_GHC_IE);
1986 1.8 bouyer }
1987 1.8 bouyer
1988 1.58 jdolecek static void
1989 1.58 jdolecek ahci_atapi_abort(struct ata_channel *chp, struct ata_xfer *xfer)
1990 1.58 jdolecek {
1991 1.58 jdolecek ahci_atapi_complete(chp, xfer, 0);
1992 1.58 jdolecek }
1993 1.58 jdolecek
1994 1.29 jakllsch static int
1995 1.58 jdolecek ahci_atapi_complete(struct ata_channel *chp, struct ata_xfer *xfer, int tfd)
1996 1.8 bouyer {
1997 1.58 jdolecek struct scsipi_xfer *sc_xfer = xfer->c_scsipi;
1998 1.8 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
1999 1.8 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
2000 1.8 bouyer
2001 1.8 bouyer AHCIDEBUG_PRINT(("ahci_atapi_complete channel %d\n", chp->ch_channel),
2002 1.8 bouyer DEBUG_FUNCS);
2003 1.8 bouyer
2004 1.58 jdolecek if (ata_waitdrain_xfer_check(chp, xfer))
2005 1.58 jdolecek return 0;
2006 1.58 jdolecek
2007 1.58 jdolecek KASSERT((achp->ahcic_cmds_active & (1 << xfer->c_slot)) != 0);
2008 1.58 jdolecek achp->ahcic_cmds_active &= ~(1 << xfer->c_slot);
2009 1.58 jdolecek ata_deactivate_xfer(chp, xfer);
2010 1.58 jdolecek
2011 1.8 bouyer if (xfer->c_flags & C_TIMEOU) {
2012 1.8 bouyer sc_xfer->error = XS_TIMEOUT;
2013 1.8 bouyer }
2014 1.8 bouyer
2015 1.55 jakllsch if (xfer->c_bcount > 0) {
2016 1.58 jdolecek bus_dmamap_sync(sc->sc_dmat, achp->ahcic_datad[xfer->c_slot], 0,
2017 1.58 jdolecek achp->ahcic_datad[xfer->c_slot]->dm_mapsize,
2018 1.55 jakllsch (sc_xfer->xs_control & XS_CTL_DATA_IN) ?
2019 1.55 jakllsch BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE);
2020 1.58 jdolecek bus_dmamap_unload(sc->sc_dmat, achp->ahcic_datad[xfer->c_slot]);
2021 1.55 jakllsch }
2022 1.8 bouyer
2023 1.58 jdolecek AHCI_CMDH_SYNC(sc, achp, xfer->c_slot,
2024 1.8 bouyer BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
2025 1.8 bouyer sc_xfer->resid = sc_xfer->datalen;
2026 1.58 jdolecek sc_xfer->resid -= le32toh(achp->ahcic_cmdh[xfer->c_slot].cmdh_prdbc);
2027 1.8 bouyer AHCIDEBUG_PRINT(("ahci_atapi_complete datalen %d resid %d\n",
2028 1.8 bouyer sc_xfer->datalen, sc_xfer->resid), DEBUG_XFERS);
2029 1.58 jdolecek if (AHCI_TFD_ST(tfd) & WDCS_ERR &&
2030 1.16 bouyer ((sc_xfer->xs_control & XS_CTL_REQSENSE) == 0 ||
2031 1.16 bouyer sc_xfer->resid == sc_xfer->datalen)) {
2032 1.16 bouyer sc_xfer->error = XS_SHORTSENSE;
2033 1.58 jdolecek sc_xfer->sense.atapi_sense = AHCI_TFD_ERR(tfd);
2034 1.16 bouyer if ((sc_xfer->xs_periph->periph_quirks &
2035 1.16 bouyer PQUIRK_NOSENSE) == 0) {
2036 1.16 bouyer /* ask scsipi to send a REQUEST_SENSE */
2037 1.16 bouyer sc_xfer->error = XS_BUSY;
2038 1.16 bouyer sc_xfer->status = SCSI_CHECK;
2039 1.16 bouyer }
2040 1.16 bouyer }
2041 1.58 jdolecek ata_free_xfer(chp, xfer);
2042 1.8 bouyer scsipi_done(sc_xfer);
2043 1.58 jdolecek if ((AHCI_TFD_ST(tfd) & WDCS_ERR) == 0)
2044 1.58 jdolecek atastart(chp);
2045 1.8 bouyer return 0;
2046 1.8 bouyer }
2047 1.8 bouyer
2048 1.29 jakllsch static void
2049 1.8 bouyer ahci_atapi_kill_xfer(struct ata_channel *chp, struct ata_xfer *xfer, int reason)
2050 1.8 bouyer {
2051 1.58 jdolecek struct scsipi_xfer *sc_xfer = xfer->c_scsipi;
2052 1.8 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
2053 1.58 jdolecek bool deactivate = true;
2054 1.8 bouyer
2055 1.8 bouyer /* remove this command from xfer queue */
2056 1.8 bouyer switch (reason) {
2057 1.58 jdolecek case KILL_GONE_INACTIVE:
2058 1.58 jdolecek deactivate = false;
2059 1.58 jdolecek /* FALLTHROUGH */
2060 1.8 bouyer case KILL_GONE:
2061 1.8 bouyer sc_xfer->error = XS_DRIVER_STUFFUP;
2062 1.8 bouyer break;
2063 1.8 bouyer case KILL_RESET:
2064 1.8 bouyer sc_xfer->error = XS_RESET;
2065 1.8 bouyer break;
2066 1.58 jdolecek case KILL_REQUEUE:
2067 1.58 jdolecek sc_xfer->error = XS_REQUEUE;
2068 1.58 jdolecek break;
2069 1.8 bouyer default:
2070 1.8 bouyer printf("ahci_ata_atapi_kill_xfer: unknown reason %d\n", reason);
2071 1.8 bouyer panic("ahci_ata_atapi_kill_xfer");
2072 1.8 bouyer }
2073 1.58 jdolecek
2074 1.58 jdolecek if (deactivate) {
2075 1.58 jdolecek KASSERT((achp->ahcic_cmds_active & (1 << xfer->c_slot)) != 0);
2076 1.58 jdolecek achp->ahcic_cmds_active &= ~(1 << xfer->c_slot);
2077 1.58 jdolecek ata_deactivate_xfer(chp, xfer);
2078 1.58 jdolecek }
2079 1.58 jdolecek
2080 1.8 bouyer ata_free_xfer(chp, xfer);
2081 1.8 bouyer scsipi_done(sc_xfer);
2082 1.8 bouyer }
2083 1.8 bouyer
2084 1.29 jakllsch static void
2085 1.8 bouyer ahci_atapi_probe_device(struct atapibus_softc *sc, int target)
2086 1.8 bouyer {
2087 1.8 bouyer struct scsipi_channel *chan = sc->sc_channel;
2088 1.8 bouyer struct scsipi_periph *periph;
2089 1.8 bouyer struct ataparams ids;
2090 1.8 bouyer struct ataparams *id = &ids;
2091 1.13 cube struct ahci_softc *ahcic =
2092 1.13 cube device_private(chan->chan_adapter->adapt_dev);
2093 1.8 bouyer struct atac_softc *atac = &ahcic->sc_atac;
2094 1.8 bouyer struct ata_channel *chp = atac->atac_channels[chan->chan_channel];
2095 1.8 bouyer struct ata_drive_datas *drvp = &chp->ch_drive[target];
2096 1.8 bouyer struct scsipibus_attach_args sa;
2097 1.8 bouyer char serial_number[21], model[41], firmware_revision[9];
2098 1.8 bouyer int s;
2099 1.8 bouyer
2100 1.8 bouyer /* skip if already attached */
2101 1.8 bouyer if (scsipi_lookup_periph(chan, target, 0) != NULL)
2102 1.8 bouyer return;
2103 1.8 bouyer
2104 1.8 bouyer /* if no ATAPI device detected at attach time, skip */
2105 1.40 bouyer if (drvp->drive_type != ATA_DRIVET_ATAPI) {
2106 1.8 bouyer AHCIDEBUG_PRINT(("ahci_atapi_probe_device: drive %d "
2107 1.8 bouyer "not present\n", target), DEBUG_PROBE);
2108 1.8 bouyer return;
2109 1.8 bouyer }
2110 1.8 bouyer
2111 1.8 bouyer /* Some ATAPI devices need a bit more time after software reset. */
2112 1.8 bouyer delay(5000);
2113 1.8 bouyer if (ata_get_params(drvp, AT_WAIT, id) == 0) {
2114 1.8 bouyer #ifdef ATAPI_DEBUG_PROBE
2115 1.8 bouyer printf("%s drive %d: cmdsz 0x%x drqtype 0x%x\n",
2116 1.14 cube AHCINAME(ahcic), target,
2117 1.8 bouyer id->atap_config & ATAPI_CFG_CMD_MASK,
2118 1.8 bouyer id->atap_config & ATAPI_CFG_DRQ_MASK);
2119 1.8 bouyer #endif
2120 1.8 bouyer periph = scsipi_alloc_periph(M_NOWAIT);
2121 1.8 bouyer if (periph == NULL) {
2122 1.14 cube aprint_error_dev(sc->sc_dev,
2123 1.14 cube "unable to allocate periph for drive %d\n",
2124 1.14 cube target);
2125 1.8 bouyer return;
2126 1.8 bouyer }
2127 1.8 bouyer periph->periph_dev = NULL;
2128 1.8 bouyer periph->periph_channel = chan;
2129 1.8 bouyer periph->periph_switch = &atapi_probe_periphsw;
2130 1.8 bouyer periph->periph_target = target;
2131 1.8 bouyer periph->periph_lun = 0;
2132 1.8 bouyer periph->periph_quirks = PQUIRK_ONLYBIG;
2133 1.8 bouyer
2134 1.8 bouyer #ifdef SCSIPI_DEBUG
2135 1.8 bouyer if (SCSIPI_DEBUG_TYPE == SCSIPI_BUSTYPE_ATAPI &&
2136 1.8 bouyer SCSIPI_DEBUG_TARGET == target)
2137 1.8 bouyer periph->periph_dbflags |= SCSIPI_DEBUG_FLAGS;
2138 1.8 bouyer #endif
2139 1.8 bouyer periph->periph_type = ATAPI_CFG_TYPE(id->atap_config);
2140 1.8 bouyer if (id->atap_config & ATAPI_CFG_REMOV)
2141 1.8 bouyer periph->periph_flags |= PERIPH_REMOVABLE;
2142 1.8 bouyer if (periph->periph_type == T_SEQUENTIAL) {
2143 1.8 bouyer s = splbio();
2144 1.40 bouyer drvp->drive_flags |= ATA_DRIVE_ATAPIDSCW;
2145 1.8 bouyer splx(s);
2146 1.8 bouyer }
2147 1.8 bouyer
2148 1.8 bouyer sa.sa_periph = periph;
2149 1.8 bouyer sa.sa_inqbuf.type = ATAPI_CFG_TYPE(id->atap_config);
2150 1.8 bouyer sa.sa_inqbuf.removable = id->atap_config & ATAPI_CFG_REMOV ?
2151 1.8 bouyer T_REMOV : T_FIXED;
2152 1.56 christos strnvisx(model, sizeof(model), id->atap_model, 40,
2153 1.56 christos VIS_TRIM|VIS_SAFE|VIS_OCTAL);
2154 1.56 christos strnvisx(serial_number, sizeof(serial_number), id->atap_serial,
2155 1.56 christos 20, VIS_TRIM|VIS_SAFE|VIS_OCTAL);
2156 1.56 christos strnvisx(firmware_revision, sizeof(firmware_revision),
2157 1.56 christos id->atap_revision, 8, VIS_TRIM|VIS_SAFE|VIS_OCTAL);
2158 1.8 bouyer sa.sa_inqbuf.vendor = model;
2159 1.8 bouyer sa.sa_inqbuf.product = serial_number;
2160 1.8 bouyer sa.sa_inqbuf.revision = firmware_revision;
2161 1.8 bouyer
2162 1.8 bouyer /*
2163 1.8 bouyer * Determine the operating mode capabilities of the device.
2164 1.8 bouyer */
2165 1.8 bouyer if ((id->atap_config & ATAPI_CFG_CMD_MASK) == ATAPI_CFG_CMD_16)
2166 1.8 bouyer periph->periph_cap |= PERIPH_CAP_CMD16;
2167 1.8 bouyer /* XXX This is gross. */
2168 1.8 bouyer periph->periph_cap |= (id->atap_config & ATAPI_CFG_DRQ_MASK);
2169 1.8 bouyer
2170 1.8 bouyer drvp->drv_softc = atapi_probe_device(sc, target, periph, &sa);
2171 1.8 bouyer
2172 1.8 bouyer if (drvp->drv_softc)
2173 1.8 bouyer ata_probe_caps(drvp);
2174 1.8 bouyer else {
2175 1.8 bouyer s = splbio();
2176 1.40 bouyer drvp->drive_type = ATA_DRIVET_NONE;
2177 1.8 bouyer splx(s);
2178 1.8 bouyer }
2179 1.8 bouyer } else {
2180 1.8 bouyer AHCIDEBUG_PRINT(("ahci_atapi_get_params: ATAPI_IDENTIFY_DEVICE "
2181 1.58 jdolecek "failed for drive %s:%d:%d\n",
2182 1.58 jdolecek AHCINAME(ahcic), chp->ch_channel, target), DEBUG_PROBE);
2183 1.8 bouyer s = splbio();
2184 1.40 bouyer drvp->drive_type = ATA_DRIVET_NONE;
2185 1.8 bouyer splx(s);
2186 1.8 bouyer }
2187 1.8 bouyer }
2188 1.8 bouyer #endif /* NATAPIBUS */
2189