ahcisata_core.c revision 1.49 1 1.49 matt /* $NetBSD: ahcisata_core.c,v 1.49 2013/09/08 11:19:47 matt 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.49 matt __KERNEL_RCSID(0, "$NetBSD: ahcisata_core.c,v 1.49 2013/09/08 11:19:47 matt 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.29 jakllsch static int ahci_ata_bio(struct ata_drive_datas *, struct ata_bio *);
61 1.40 bouyer static int ahci_do_reset_drive(struct ata_channel *, int, int, uint32_t *);
62 1.40 bouyer static void ahci_reset_drive(struct ata_drive_datas *, int, uint32_t *);
63 1.29 jakllsch static void ahci_reset_channel(struct ata_channel *, int);
64 1.29 jakllsch static int ahci_exec_command(struct ata_drive_datas *, struct ata_command *);
65 1.29 jakllsch static int ahci_ata_addref(struct ata_drive_datas *);
66 1.29 jakllsch static void ahci_ata_delref(struct ata_drive_datas *);
67 1.29 jakllsch static void ahci_killpending(struct ata_drive_datas *);
68 1.29 jakllsch
69 1.29 jakllsch static void ahci_cmd_start(struct ata_channel *, struct ata_xfer *);
70 1.29 jakllsch static int ahci_cmd_complete(struct ata_channel *, struct ata_xfer *, int);
71 1.29 jakllsch static void ahci_cmd_done(struct ata_channel *, struct ata_xfer *, int);
72 1.29 jakllsch static void ahci_cmd_kill_xfer(struct ata_channel *, struct ata_xfer *, int) ;
73 1.29 jakllsch static void ahci_bio_start(struct ata_channel *, struct ata_xfer *);
74 1.29 jakllsch static int ahci_bio_complete(struct ata_channel *, struct ata_xfer *, int);
75 1.29 jakllsch static void ahci_bio_kill_xfer(struct ata_channel *, struct ata_xfer *, int) ;
76 1.29 jakllsch static void ahci_channel_stop(struct ahci_softc *, struct ata_channel *, int);
77 1.40 bouyer static void ahci_channel_start(struct ahci_softc *, struct ata_channel *,
78 1.40 bouyer int, int);
79 1.29 jakllsch static void ahci_timeout(void *);
80 1.29 jakllsch static int ahci_dma_setup(struct ata_channel *, int, void *, size_t, int);
81 1.1 bouyer
82 1.8 bouyer #if NATAPIBUS > 0
83 1.29 jakllsch static void ahci_atapibus_attach(struct atabus_softc *);
84 1.29 jakllsch static void ahci_atapi_kill_pending(struct scsipi_periph *);
85 1.29 jakllsch static void ahci_atapi_minphys(struct buf *);
86 1.29 jakllsch static void ahci_atapi_scsipi_request(struct scsipi_channel *,
87 1.8 bouyer scsipi_adapter_req_t, void *);
88 1.29 jakllsch static void ahci_atapi_start(struct ata_channel *, struct ata_xfer *);
89 1.29 jakllsch static int ahci_atapi_complete(struct ata_channel *, struct ata_xfer *, int);
90 1.29 jakllsch static void ahci_atapi_kill_xfer(struct ata_channel *, struct ata_xfer *, int);
91 1.29 jakllsch static void ahci_atapi_probe_device(struct atapibus_softc *, int);
92 1.8 bouyer
93 1.8 bouyer static const struct scsipi_bustype ahci_atapi_bustype = {
94 1.8 bouyer SCSIPI_BUSTYPE_ATAPI,
95 1.8 bouyer atapi_scsipi_cmd,
96 1.8 bouyer atapi_interpret_sense,
97 1.8 bouyer atapi_print_addr,
98 1.8 bouyer ahci_atapi_kill_pending,
99 1.34 bouyer NULL,
100 1.8 bouyer };
101 1.8 bouyer #endif /* NATAPIBUS */
102 1.8 bouyer
103 1.1 bouyer #define ATA_DELAY 10000 /* 10s for a drive I/O */
104 1.24 bouyer #define ATA_RESET_DELAY 31000 /* 31s for a drive reset */
105 1.24 bouyer #define AHCI_RST_WAIT (ATA_RESET_DELAY / 10)
106 1.1 bouyer
107 1.1 bouyer const struct ata_bustype ahci_ata_bustype = {
108 1.1 bouyer SCSIPI_BUSTYPE_ATA,
109 1.1 bouyer ahci_ata_bio,
110 1.1 bouyer ahci_reset_drive,
111 1.1 bouyer ahci_reset_channel,
112 1.1 bouyer ahci_exec_command,
113 1.1 bouyer ata_get_params,
114 1.1 bouyer ahci_ata_addref,
115 1.1 bouyer ahci_ata_delref,
116 1.1 bouyer ahci_killpending
117 1.1 bouyer };
118 1.1 bouyer
119 1.29 jakllsch static void ahci_intr_port(struct ahci_softc *, struct ahci_channel *);
120 1.7 joerg static void ahci_setup_port(struct ahci_softc *sc, int i);
121 1.7 joerg
122 1.29 jakllsch static int
123 1.7 joerg ahci_reset(struct ahci_softc *sc)
124 1.1 bouyer {
125 1.7 joerg int i;
126 1.1 bouyer
127 1.1 bouyer /* reset controller */
128 1.1 bouyer AHCI_WRITE(sc, AHCI_GHC, AHCI_GHC_HR);
129 1.1 bouyer /* wait up to 1s for reset to complete */
130 1.1 bouyer for (i = 0; i < 1000; i++) {
131 1.6 bouyer delay(1000);
132 1.1 bouyer if ((AHCI_READ(sc, AHCI_GHC) & AHCI_GHC_HR) == 0)
133 1.1 bouyer break;
134 1.1 bouyer }
135 1.1 bouyer if ((AHCI_READ(sc, AHCI_GHC) & AHCI_GHC_HR)) {
136 1.1 bouyer aprint_error("%s: reset failed\n", AHCINAME(sc));
137 1.7 joerg return -1;
138 1.1 bouyer }
139 1.1 bouyer /* enable ahci mode */
140 1.1 bouyer AHCI_WRITE(sc, AHCI_GHC, AHCI_GHC_AE);
141 1.7 joerg return 0;
142 1.7 joerg }
143 1.1 bouyer
144 1.29 jakllsch static void
145 1.7 joerg ahci_setup_ports(struct ahci_softc *sc)
146 1.7 joerg {
147 1.27 jakllsch uint32_t ahci_ports;
148 1.7 joerg int i, port;
149 1.7 joerg
150 1.7 joerg ahci_ports = AHCI_READ(sc, AHCI_PI);
151 1.7 joerg for (i = 0, port = 0; i < AHCI_MAX_PORTS; i++) {
152 1.7 joerg if ((ahci_ports & (1 << i)) == 0)
153 1.7 joerg continue;
154 1.7 joerg if (port >= sc->sc_atac.atac_nchannels) {
155 1.7 joerg aprint_error("%s: more ports than announced\n",
156 1.7 joerg AHCINAME(sc));
157 1.7 joerg break;
158 1.7 joerg }
159 1.7 joerg ahci_setup_port(sc, i);
160 1.7 joerg }
161 1.7 joerg }
162 1.7 joerg
163 1.29 jakllsch static void
164 1.7 joerg ahci_reprobe_drives(struct ahci_softc *sc)
165 1.7 joerg {
166 1.27 jakllsch uint32_t ahci_ports;
167 1.7 joerg int i, port;
168 1.7 joerg struct ahci_channel *achp;
169 1.7 joerg struct ata_channel *chp;
170 1.7 joerg
171 1.7 joerg ahci_ports = AHCI_READ(sc, AHCI_PI);
172 1.7 joerg for (i = 0, port = 0; i < AHCI_MAX_PORTS; i++) {
173 1.7 joerg if ((ahci_ports & (1 << i)) == 0)
174 1.7 joerg continue;
175 1.7 joerg if (port >= sc->sc_atac.atac_nchannels) {
176 1.7 joerg aprint_error("%s: more ports than announced\n",
177 1.7 joerg AHCINAME(sc));
178 1.7 joerg break;
179 1.7 joerg }
180 1.7 joerg achp = &sc->sc_channels[i];
181 1.7 joerg chp = &achp->ata_channel;
182 1.7 joerg
183 1.7 joerg ahci_probe_drive(chp);
184 1.7 joerg }
185 1.7 joerg }
186 1.7 joerg
187 1.7 joerg static void
188 1.7 joerg ahci_setup_port(struct ahci_softc *sc, int i)
189 1.7 joerg {
190 1.7 joerg struct ahci_channel *achp;
191 1.7 joerg
192 1.7 joerg achp = &sc->sc_channels[i];
193 1.7 joerg
194 1.7 joerg AHCI_WRITE(sc, AHCI_P_CLB(i), achp->ahcic_bus_cmdh);
195 1.28 jakllsch AHCI_WRITE(sc, AHCI_P_CLBU(i), (uint64_t)achp->ahcic_bus_cmdh>>32);
196 1.7 joerg AHCI_WRITE(sc, AHCI_P_FB(i), achp->ahcic_bus_rfis);
197 1.28 jakllsch AHCI_WRITE(sc, AHCI_P_FBU(i), (uint64_t)achp->ahcic_bus_rfis>>32);
198 1.7 joerg }
199 1.7 joerg
200 1.29 jakllsch static void
201 1.7 joerg ahci_enable_intrs(struct ahci_softc *sc)
202 1.7 joerg {
203 1.7 joerg
204 1.7 joerg /* clear interrupts */
205 1.7 joerg AHCI_WRITE(sc, AHCI_IS, AHCI_READ(sc, AHCI_IS));
206 1.7 joerg /* enable interrupts */
207 1.7 joerg AHCI_WRITE(sc, AHCI_GHC, AHCI_READ(sc, AHCI_GHC) | AHCI_GHC_IE);
208 1.7 joerg }
209 1.7 joerg
210 1.7 joerg void
211 1.7 joerg ahci_attach(struct ahci_softc *sc)
212 1.7 joerg {
213 1.40 bouyer uint32_t ahci_rev, ahci_ports;
214 1.7 joerg int i, j, port;
215 1.7 joerg struct ahci_channel *achp;
216 1.7 joerg struct ata_channel *chp;
217 1.7 joerg int error;
218 1.7 joerg int dmasize;
219 1.32 jakllsch char buf[128];
220 1.7 joerg void *cmdhp;
221 1.7 joerg void *cmdtblp;
222 1.7 joerg
223 1.7 joerg if (ahci_reset(sc) != 0)
224 1.7 joerg return;
225 1.1 bouyer
226 1.40 bouyer sc->sc_ahci_cap = AHCI_READ(sc, AHCI_CAP);
227 1.43 bouyer if (sc->sc_ahci_quirks & AHCI_QUIRK_BADPMP) {
228 1.41 bouyer aprint_verbose_dev(sc->sc_atac.atac_dev,
229 1.41 bouyer "ignoring broken port multiplier support\n");
230 1.41 bouyer sc->sc_ahci_cap &= ~AHCI_CAP_SPM;
231 1.41 bouyer }
232 1.40 bouyer sc->sc_atac.atac_nchannels = (sc->sc_ahci_cap & AHCI_CAP_NPMASK) + 1;
233 1.40 bouyer sc->sc_ncmds = ((sc->sc_ahci_cap & AHCI_CAP_NCS) >> 8) + 1;
234 1.1 bouyer ahci_rev = AHCI_READ(sc, AHCI_VS);
235 1.32 jakllsch snprintb(buf, sizeof(buf), "\177\020"
236 1.32 jakllsch /* "f\000\005NP\0" */
237 1.32 jakllsch "b\005SXS\0"
238 1.32 jakllsch "b\006EMS\0"
239 1.32 jakllsch "b\007CCCS\0"
240 1.32 jakllsch /* "f\010\005NCS\0" */
241 1.32 jakllsch "b\015PSC\0"
242 1.32 jakllsch "b\016SSC\0"
243 1.32 jakllsch "b\017PMD\0"
244 1.32 jakllsch "b\020FBSS\0"
245 1.32 jakllsch "b\021SPM\0"
246 1.32 jakllsch "b\022SAM\0"
247 1.32 jakllsch "b\023SNZO\0"
248 1.32 jakllsch "f\024\003ISS\0"
249 1.32 jakllsch "=\001Gen1\0"
250 1.32 jakllsch "=\002Gen2\0"
251 1.32 jakllsch "=\003Gen3\0"
252 1.32 jakllsch "b\030SCLO\0"
253 1.32 jakllsch "b\031SAL\0"
254 1.32 jakllsch "b\032SALP\0"
255 1.32 jakllsch "b\033SSS\0"
256 1.32 jakllsch "b\034SMPS\0"
257 1.32 jakllsch "b\035SSNTF\0"
258 1.32 jakllsch "b\036SNCQ\0"
259 1.32 jakllsch "b\037S64A\0"
260 1.40 bouyer "\0", sc->sc_ahci_cap);
261 1.32 jakllsch aprint_normal_dev(sc->sc_atac.atac_dev, "AHCI revision %u.%u"
262 1.49 matt ", %d port%s, %d slot%s, CAP %s\n",
263 1.32 jakllsch AHCI_VS_MJR(ahci_rev), AHCI_VS_MNR(ahci_rev),
264 1.49 matt sc->sc_atac.atac_nchannels,
265 1.49 matt (sc->sc_atac.atac_nchannels == 1 ? "" : "s"),
266 1.49 matt sc->sc_ncmds, (sc->sc_ncmds == 1 ? "" : "s"), buf);
267 1.1 bouyer
268 1.1 bouyer sc->sc_atac.atac_cap = ATAC_CAP_DATA16 | ATAC_CAP_DMA | ATAC_CAP_UDMA;
269 1.12 xtraeme sc->sc_atac.atac_cap |= sc->sc_atac_capflags;
270 1.1 bouyer sc->sc_atac.atac_pio_cap = 4;
271 1.1 bouyer sc->sc_atac.atac_dma_cap = 2;
272 1.1 bouyer sc->sc_atac.atac_udma_cap = 6;
273 1.1 bouyer sc->sc_atac.atac_channels = sc->sc_chanarray;
274 1.1 bouyer sc->sc_atac.atac_probe = ahci_probe_drive;
275 1.1 bouyer sc->sc_atac.atac_bustype_ata = &ahci_ata_bustype;
276 1.1 bouyer sc->sc_atac.atac_set_modes = ahci_setup_channel;
277 1.8 bouyer #if NATAPIBUS > 0
278 1.8 bouyer sc->sc_atac.atac_atapibus_attach = ahci_atapibus_attach;
279 1.8 bouyer #endif
280 1.1 bouyer
281 1.1 bouyer dmasize =
282 1.1 bouyer (AHCI_RFIS_SIZE + AHCI_CMDH_SIZE) * sc->sc_atac.atac_nchannels;
283 1.1 bouyer error = bus_dmamem_alloc(sc->sc_dmat, dmasize, PAGE_SIZE, 0,
284 1.29 jakllsch &sc->sc_cmd_hdr_seg, 1, &sc->sc_cmd_hdr_nseg, BUS_DMA_NOWAIT);
285 1.1 bouyer if (error) {
286 1.1 bouyer aprint_error("%s: unable to allocate command header memory"
287 1.1 bouyer ", error=%d\n", AHCINAME(sc), error);
288 1.1 bouyer return;
289 1.1 bouyer }
290 1.29 jakllsch error = bus_dmamem_map(sc->sc_dmat, &sc->sc_cmd_hdr_seg,
291 1.29 jakllsch sc->sc_cmd_hdr_nseg, dmasize,
292 1.1 bouyer &cmdhp, BUS_DMA_NOWAIT|BUS_DMA_COHERENT);
293 1.1 bouyer if (error) {
294 1.1 bouyer aprint_error("%s: unable to map command header memory"
295 1.1 bouyer ", error=%d\n", AHCINAME(sc), error);
296 1.1 bouyer return;
297 1.1 bouyer }
298 1.1 bouyer error = bus_dmamap_create(sc->sc_dmat, dmasize, 1, dmasize, 0,
299 1.1 bouyer BUS_DMA_NOWAIT, &sc->sc_cmd_hdrd);
300 1.1 bouyer if (error) {
301 1.1 bouyer aprint_error("%s: unable to create command header map"
302 1.1 bouyer ", error=%d\n", AHCINAME(sc), error);
303 1.1 bouyer return;
304 1.1 bouyer }
305 1.1 bouyer error = bus_dmamap_load(sc->sc_dmat, sc->sc_cmd_hdrd,
306 1.1 bouyer cmdhp, dmasize, NULL, BUS_DMA_NOWAIT);
307 1.1 bouyer if (error) {
308 1.1 bouyer aprint_error("%s: unable to load command header map"
309 1.1 bouyer ", error=%d\n", AHCINAME(sc), error);
310 1.1 bouyer return;
311 1.1 bouyer }
312 1.1 bouyer sc->sc_cmd_hdr = cmdhp;
313 1.1 bouyer
314 1.7 joerg ahci_enable_intrs(sc);
315 1.1 bouyer
316 1.1 bouyer ahci_ports = AHCI_READ(sc, AHCI_PI);
317 1.49 matt AHCIDEBUG_PRINT(("active ports %#x\n", ahci_ports), DEBUG_PROBE);
318 1.1 bouyer for (i = 0, port = 0; i < AHCI_MAX_PORTS; i++) {
319 1.1 bouyer if ((ahci_ports & (1 << i)) == 0)
320 1.1 bouyer continue;
321 1.1 bouyer if (port >= sc->sc_atac.atac_nchannels) {
322 1.1 bouyer aprint_error("%s: more ports than announced\n",
323 1.1 bouyer AHCINAME(sc));
324 1.1 bouyer break;
325 1.1 bouyer }
326 1.1 bouyer achp = &sc->sc_channels[i];
327 1.29 jakllsch chp = &achp->ata_channel;
328 1.1 bouyer sc->sc_chanarray[i] = chp;
329 1.1 bouyer chp->ch_channel = i;
330 1.1 bouyer chp->ch_atac = &sc->sc_atac;
331 1.1 bouyer chp->ch_queue = malloc(sizeof(struct ata_queue),
332 1.48 matt M_DEVBUF, M_NOWAIT|M_ZERO);
333 1.1 bouyer if (chp->ch_queue == NULL) {
334 1.1 bouyer aprint_error("%s port %d: can't allocate memory for "
335 1.1 bouyer "command queue", AHCINAME(sc), i);
336 1.1 bouyer break;
337 1.1 bouyer }
338 1.1 bouyer dmasize = AHCI_CMDTBL_SIZE * sc->sc_ncmds;
339 1.1 bouyer error = bus_dmamem_alloc(sc->sc_dmat, dmasize, PAGE_SIZE, 0,
340 1.29 jakllsch &achp->ahcic_cmd_tbl_seg, 1, &achp->ahcic_cmd_tbl_nseg,
341 1.29 jakllsch BUS_DMA_NOWAIT);
342 1.1 bouyer if (error) {
343 1.1 bouyer aprint_error("%s: unable to allocate command table "
344 1.1 bouyer "memory, error=%d\n", AHCINAME(sc), error);
345 1.1 bouyer break;
346 1.1 bouyer }
347 1.29 jakllsch error = bus_dmamem_map(sc->sc_dmat, &achp->ahcic_cmd_tbl_seg,
348 1.29 jakllsch achp->ahcic_cmd_tbl_nseg, dmasize,
349 1.1 bouyer &cmdtblp, BUS_DMA_NOWAIT|BUS_DMA_COHERENT);
350 1.1 bouyer if (error) {
351 1.1 bouyer aprint_error("%s: unable to map command table memory"
352 1.1 bouyer ", error=%d\n", AHCINAME(sc), error);
353 1.1 bouyer break;
354 1.1 bouyer }
355 1.1 bouyer error = bus_dmamap_create(sc->sc_dmat, dmasize, 1, dmasize, 0,
356 1.1 bouyer BUS_DMA_NOWAIT, &achp->ahcic_cmd_tbld);
357 1.1 bouyer if (error) {
358 1.1 bouyer aprint_error("%s: unable to create command table map"
359 1.1 bouyer ", error=%d\n", AHCINAME(sc), error);
360 1.1 bouyer break;
361 1.1 bouyer }
362 1.1 bouyer error = bus_dmamap_load(sc->sc_dmat, achp->ahcic_cmd_tbld,
363 1.1 bouyer cmdtblp, dmasize, NULL, BUS_DMA_NOWAIT);
364 1.1 bouyer if (error) {
365 1.1 bouyer aprint_error("%s: unable to load command table map"
366 1.1 bouyer ", error=%d\n", AHCINAME(sc), error);
367 1.1 bouyer break;
368 1.1 bouyer }
369 1.1 bouyer achp->ahcic_cmdh = (struct ahci_cmd_header *)
370 1.1 bouyer ((char *)cmdhp + AHCI_CMDH_SIZE * port);
371 1.1 bouyer achp->ahcic_bus_cmdh = sc->sc_cmd_hdrd->dm_segs[0].ds_addr +
372 1.1 bouyer AHCI_CMDH_SIZE * port;
373 1.1 bouyer achp->ahcic_rfis = (struct ahci_r_fis *)
374 1.1 bouyer ((char *)cmdhp +
375 1.1 bouyer AHCI_CMDH_SIZE * sc->sc_atac.atac_nchannels +
376 1.1 bouyer AHCI_RFIS_SIZE * port);
377 1.1 bouyer achp->ahcic_bus_rfis = sc->sc_cmd_hdrd->dm_segs[0].ds_addr +
378 1.1 bouyer AHCI_CMDH_SIZE * sc->sc_atac.atac_nchannels +
379 1.1 bouyer AHCI_RFIS_SIZE * port;
380 1.28 jakllsch AHCIDEBUG_PRINT(("port %d cmdh %p (0x%" PRIx64 ") "
381 1.28 jakllsch "rfis %p (0x%" PRIx64 ")\n", i,
382 1.28 jakllsch achp->ahcic_cmdh, (uint64_t)achp->ahcic_bus_cmdh,
383 1.28 jakllsch achp->ahcic_rfis, (uint64_t)achp->ahcic_bus_rfis),
384 1.1 bouyer DEBUG_PROBE);
385 1.1 bouyer
386 1.1 bouyer for (j = 0; j < sc->sc_ncmds; j++) {
387 1.1 bouyer achp->ahcic_cmd_tbl[j] = (struct ahci_cmd_tbl *)
388 1.1 bouyer ((char *)cmdtblp + AHCI_CMDTBL_SIZE * j);
389 1.1 bouyer achp->ahcic_bus_cmd_tbl[j] =
390 1.1 bouyer achp->ahcic_cmd_tbld->dm_segs[0].ds_addr +
391 1.1 bouyer AHCI_CMDTBL_SIZE * j;
392 1.1 bouyer achp->ahcic_cmdh[j].cmdh_cmdtba =
393 1.28 jakllsch htole64(achp->ahcic_bus_cmd_tbl[j]);
394 1.28 jakllsch AHCIDEBUG_PRINT(("port %d/%d tbl %p (0x%" PRIx64 ")\n", i, j,
395 1.1 bouyer achp->ahcic_cmd_tbl[j],
396 1.28 jakllsch (uint64_t)achp->ahcic_bus_cmd_tbl[j]), DEBUG_PROBE);
397 1.1 bouyer /* The xfer DMA map */
398 1.1 bouyer error = bus_dmamap_create(sc->sc_dmat, MAXPHYS,
399 1.1 bouyer AHCI_NPRD, 0x400000 /* 4MB */, 0,
400 1.1 bouyer BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW,
401 1.1 bouyer &achp->ahcic_datad[j]);
402 1.1 bouyer if (error) {
403 1.1 bouyer aprint_error("%s: couldn't alloc xfer DMA map, "
404 1.1 bouyer "error=%d\n", AHCINAME(sc), error);
405 1.1 bouyer goto end;
406 1.1 bouyer }
407 1.1 bouyer }
408 1.7 joerg ahci_setup_port(sc, i);
409 1.1 bouyer if (bus_space_subregion(sc->sc_ahcit, sc->sc_ahcih,
410 1.22 jakllsch AHCI_P_SSTS(i), 4, &achp->ahcic_sstatus) != 0) {
411 1.1 bouyer aprint_error("%s: couldn't map channel %d "
412 1.1 bouyer "sata_status regs\n", AHCINAME(sc), i);
413 1.1 bouyer break;
414 1.1 bouyer }
415 1.1 bouyer if (bus_space_subregion(sc->sc_ahcit, sc->sc_ahcih,
416 1.22 jakllsch AHCI_P_SCTL(i), 4, &achp->ahcic_scontrol) != 0) {
417 1.1 bouyer aprint_error("%s: couldn't map channel %d "
418 1.1 bouyer "sata_control regs\n", AHCINAME(sc), i);
419 1.1 bouyer break;
420 1.1 bouyer }
421 1.1 bouyer if (bus_space_subregion(sc->sc_ahcit, sc->sc_ahcih,
422 1.22 jakllsch AHCI_P_SERR(i), 4, &achp->ahcic_serror) != 0) {
423 1.1 bouyer aprint_error("%s: couldn't map channel %d "
424 1.1 bouyer "sata_error regs\n", AHCINAME(sc), i);
425 1.1 bouyer break;
426 1.1 bouyer }
427 1.1 bouyer ata_channel_attach(chp);
428 1.1 bouyer port++;
429 1.1 bouyer end:
430 1.1 bouyer continue;
431 1.1 bouyer }
432 1.1 bouyer }
433 1.1 bouyer
434 1.1 bouyer int
435 1.29 jakllsch ahci_detach(struct ahci_softc *sc, int flags)
436 1.29 jakllsch {
437 1.29 jakllsch struct atac_softc *atac;
438 1.29 jakllsch struct ahci_channel *achp;
439 1.29 jakllsch struct ata_channel *chp;
440 1.29 jakllsch struct scsipi_adapter *adapt;
441 1.29 jakllsch uint32_t ahci_ports;
442 1.29 jakllsch int i, j;
443 1.29 jakllsch int error;
444 1.29 jakllsch
445 1.29 jakllsch atac = &sc->sc_atac;
446 1.29 jakllsch adapt = &atac->atac_atapi_adapter._generic;
447 1.29 jakllsch
448 1.29 jakllsch ahci_ports = AHCI_READ(sc, AHCI_PI);
449 1.29 jakllsch for (i = 0; i < AHCI_MAX_PORTS; i++) {
450 1.29 jakllsch achp = &sc->sc_channels[i];
451 1.29 jakllsch chp = &achp->ata_channel;
452 1.29 jakllsch
453 1.29 jakllsch if ((ahci_ports & (1 << i)) == 0)
454 1.29 jakllsch continue;
455 1.29 jakllsch if (i >= sc->sc_atac.atac_nchannels) {
456 1.29 jakllsch aprint_error("%s: more ports than announced\n",
457 1.29 jakllsch AHCINAME(sc));
458 1.29 jakllsch break;
459 1.29 jakllsch }
460 1.29 jakllsch
461 1.29 jakllsch if (chp->atabus == NULL)
462 1.29 jakllsch continue;
463 1.29 jakllsch if ((error = config_detach(chp->atabus, flags)) != 0)
464 1.29 jakllsch return error;
465 1.29 jakllsch
466 1.29 jakllsch for (j = 0; j < sc->sc_ncmds; j++)
467 1.29 jakllsch bus_dmamap_destroy(sc->sc_dmat, achp->ahcic_datad[j]);
468 1.29 jakllsch
469 1.29 jakllsch bus_dmamap_unload(sc->sc_dmat, achp->ahcic_cmd_tbld);
470 1.29 jakllsch bus_dmamap_destroy(sc->sc_dmat, achp->ahcic_cmd_tbld);
471 1.29 jakllsch bus_dmamem_unmap(sc->sc_dmat, achp->ahcic_cmd_tbl[0],
472 1.29 jakllsch AHCI_CMDTBL_SIZE * sc->sc_ncmds);
473 1.29 jakllsch bus_dmamem_free(sc->sc_dmat, &achp->ahcic_cmd_tbl_seg,
474 1.29 jakllsch achp->ahcic_cmd_tbl_nseg);
475 1.29 jakllsch
476 1.29 jakllsch free(chp->ch_queue, M_DEVBUF);
477 1.29 jakllsch chp->atabus = NULL;
478 1.29 jakllsch }
479 1.29 jakllsch
480 1.29 jakllsch bus_dmamap_unload(sc->sc_dmat, sc->sc_cmd_hdrd);
481 1.29 jakllsch bus_dmamap_destroy(sc->sc_dmat, sc->sc_cmd_hdrd);
482 1.29 jakllsch bus_dmamem_unmap(sc->sc_dmat, sc->sc_cmd_hdr,
483 1.29 jakllsch (AHCI_RFIS_SIZE + AHCI_CMDH_SIZE) * sc->sc_atac.atac_nchannels);
484 1.29 jakllsch bus_dmamem_free(sc->sc_dmat, &sc->sc_cmd_hdr_seg, sc->sc_cmd_hdr_nseg);
485 1.29 jakllsch
486 1.29 jakllsch if (adapt->adapt_refcnt != 0)
487 1.29 jakllsch return EBUSY;
488 1.29 jakllsch
489 1.29 jakllsch return 0;
490 1.29 jakllsch }
491 1.29 jakllsch
492 1.29 jakllsch void
493 1.29 jakllsch ahci_resume(struct ahci_softc *sc)
494 1.29 jakllsch {
495 1.29 jakllsch ahci_reset(sc);
496 1.29 jakllsch ahci_setup_ports(sc);
497 1.29 jakllsch ahci_reprobe_drives(sc);
498 1.29 jakllsch ahci_enable_intrs(sc);
499 1.29 jakllsch }
500 1.29 jakllsch
501 1.29 jakllsch int
502 1.1 bouyer ahci_intr(void *v)
503 1.1 bouyer {
504 1.1 bouyer struct ahci_softc *sc = v;
505 1.27 jakllsch uint32_t is;
506 1.1 bouyer int i, r = 0;
507 1.1 bouyer
508 1.1 bouyer while ((is = AHCI_READ(sc, AHCI_IS))) {
509 1.1 bouyer AHCIDEBUG_PRINT(("%s ahci_intr 0x%x\n", AHCINAME(sc), is),
510 1.1 bouyer DEBUG_INTR);
511 1.1 bouyer r = 1;
512 1.1 bouyer AHCI_WRITE(sc, AHCI_IS, is);
513 1.1 bouyer for (i = 0; i < AHCI_MAX_PORTS; i++)
514 1.1 bouyer if (is & (1 << i))
515 1.1 bouyer ahci_intr_port(sc, &sc->sc_channels[i]);
516 1.1 bouyer }
517 1.1 bouyer return r;
518 1.1 bouyer }
519 1.1 bouyer
520 1.29 jakllsch static void
521 1.1 bouyer ahci_intr_port(struct ahci_softc *sc, struct ahci_channel *achp)
522 1.1 bouyer {
523 1.27 jakllsch uint32_t is, tfd;
524 1.1 bouyer struct ata_channel *chp = &achp->ata_channel;
525 1.1 bouyer struct ata_xfer *xfer = chp->ch_queue->active_xfer;
526 1.1 bouyer int slot;
527 1.1 bouyer
528 1.1 bouyer is = AHCI_READ(sc, AHCI_P_IS(chp->ch_channel));
529 1.1 bouyer AHCI_WRITE(sc, AHCI_P_IS(chp->ch_channel), is);
530 1.1 bouyer AHCIDEBUG_PRINT(("ahci_intr_port %s port %d is 0x%x CI 0x%x\n", AHCINAME(sc),
531 1.1 bouyer chp->ch_channel, is, AHCI_READ(sc, AHCI_P_CI(chp->ch_channel))),
532 1.1 bouyer DEBUG_INTR);
533 1.1 bouyer
534 1.1 bouyer if (is & (AHCI_P_IX_TFES | AHCI_P_IX_HBFS | AHCI_P_IX_IFS |
535 1.1 bouyer AHCI_P_IX_OFS | AHCI_P_IX_UFS)) {
536 1.1 bouyer slot = (AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel))
537 1.1 bouyer & AHCI_P_CMD_CCS_MASK) >> AHCI_P_CMD_CCS_SHIFT;
538 1.1 bouyer if ((achp->ahcic_cmds_active & (1 << slot)) == 0)
539 1.1 bouyer return;
540 1.1 bouyer /* stop channel */
541 1.5 bouyer ahci_channel_stop(sc, chp, 0);
542 1.1 bouyer if (slot != 0) {
543 1.1 bouyer printf("ahci_intr_port: slot %d\n", slot);
544 1.1 bouyer panic("ahci_intr_port");
545 1.1 bouyer }
546 1.1 bouyer if (is & AHCI_P_IX_TFES) {
547 1.1 bouyer tfd = AHCI_READ(sc, AHCI_P_TFD(chp->ch_channel));
548 1.1 bouyer chp->ch_error =
549 1.1 bouyer (tfd & AHCI_P_TFD_ERR_MASK) >> AHCI_P_TFD_ERR_SHIFT;
550 1.1 bouyer chp->ch_status = (tfd & 0xff);
551 1.1 bouyer } else {
552 1.1 bouyer /* emulate a CRC error */
553 1.1 bouyer chp->ch_error = WDCE_CRC;
554 1.1 bouyer chp->ch_status = WDCS_ERR;
555 1.1 bouyer }
556 1.40 bouyer if (is & AHCI_P_IX_IFS) {
557 1.40 bouyer aprint_error("%s port %d: SERR 0x%x\n",
558 1.40 bouyer AHCINAME(sc), chp->ch_channel,
559 1.40 bouyer AHCI_READ(sc, AHCI_P_SERR(chp->ch_channel)));
560 1.40 bouyer }
561 1.1 bouyer xfer->c_intr(chp, xfer, is);
562 1.5 bouyer /* if channel has not been restarted, do it now */
563 1.5 bouyer if ((AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel)) & AHCI_P_CMD_CR)
564 1.5 bouyer == 0)
565 1.40 bouyer ahci_channel_start(sc, chp, 0, 0);
566 1.1 bouyer } else {
567 1.1 bouyer slot = 0; /* XXX */
568 1.1 bouyer is = AHCI_READ(sc, AHCI_P_IS(chp->ch_channel));
569 1.1 bouyer AHCIDEBUG_PRINT(("ahci_intr_port port %d is 0x%x act 0x%x CI 0x%x\n",
570 1.1 bouyer chp->ch_channel, is, achp->ahcic_cmds_active,
571 1.1 bouyer AHCI_READ(sc, AHCI_P_CI(chp->ch_channel))), DEBUG_INTR);
572 1.1 bouyer if ((achp->ahcic_cmds_active & (1 << slot)) == 0)
573 1.1 bouyer return;
574 1.1 bouyer if ((AHCI_READ(sc, AHCI_P_CI(chp->ch_channel)) & (1 << slot))
575 1.1 bouyer == 0) {
576 1.1 bouyer xfer->c_intr(chp, xfer, 0);
577 1.1 bouyer }
578 1.1 bouyer }
579 1.1 bouyer }
580 1.1 bouyer
581 1.29 jakllsch static void
582 1.40 bouyer ahci_reset_drive(struct ata_drive_datas *drvp, int flags, uint32_t *sigp)
583 1.1 bouyer {
584 1.1 bouyer struct ata_channel *chp = drvp->chnl_softc;
585 1.40 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
586 1.40 bouyer AHCI_WRITE(sc, AHCI_GHC,
587 1.40 bouyer AHCI_READ(sc, AHCI_GHC) & ~AHCI_GHC_IE);
588 1.40 bouyer ahci_channel_stop(sc, chp, flags);
589 1.40 bouyer if (ahci_do_reset_drive(chp, drvp->drive, flags, sigp) != 0)
590 1.40 bouyer ata_reset_channel(chp, flags);
591 1.40 bouyer AHCI_WRITE(sc, AHCI_GHC, AHCI_READ(sc, AHCI_GHC) | AHCI_GHC_IE);
592 1.1 bouyer return;
593 1.1 bouyer }
594 1.1 bouyer
595 1.40 bouyer /* return error code from ata_bio */
596 1.40 bouyer static int
597 1.40 bouyer ahci_exec_fis(struct ata_channel *chp, int timeout, int flags)
598 1.40 bouyer {
599 1.40 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
600 1.40 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
601 1.40 bouyer int i;
602 1.40 bouyer uint32_t is;
603 1.40 bouyer
604 1.40 bouyer timeout = timeout * 10; /* wait is 10ms */
605 1.40 bouyer AHCI_CMDH_SYNC(sc, achp, 0, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
606 1.40 bouyer /* start command */
607 1.40 bouyer AHCI_WRITE(sc, AHCI_P_CI(chp->ch_channel), 1 << 0);
608 1.40 bouyer for (i = 0; i < timeout; i++) {
609 1.40 bouyer if ((AHCI_READ(sc, AHCI_P_CI(chp->ch_channel)) & 1 << 0) == 0)
610 1.40 bouyer return 0;
611 1.40 bouyer is = AHCI_READ(sc, AHCI_P_IS(chp->ch_channel));
612 1.40 bouyer if (is & (AHCI_P_IX_TFES | AHCI_P_IX_HBFS | AHCI_P_IX_IFS |
613 1.40 bouyer AHCI_P_IX_OFS | AHCI_P_IX_UFS)) {
614 1.40 bouyer if ((is & (AHCI_P_IX_DHRS|AHCI_P_IX_TFES)) ==
615 1.40 bouyer (AHCI_P_IX_DHRS|AHCI_P_IX_TFES)) {
616 1.40 bouyer /*
617 1.40 bouyer * we got the D2H FIS anyway,
618 1.40 bouyer * assume sig is valid.
619 1.40 bouyer * channel is restarted later
620 1.40 bouyer */
621 1.40 bouyer return ERROR;
622 1.40 bouyer }
623 1.40 bouyer aprint_debug("%s channel %d: error 0x%x sending FIS\n",
624 1.40 bouyer AHCINAME(sc), chp->ch_channel, is);
625 1.40 bouyer return ERR_DF;
626 1.40 bouyer }
627 1.40 bouyer if (flags & AT_WAIT)
628 1.40 bouyer tsleep(&sc, PRIBIO, "ahcifis", mstohz(10));
629 1.40 bouyer else
630 1.40 bouyer delay(10000);
631 1.40 bouyer }
632 1.40 bouyer aprint_debug("%s channel %d: timeout sending FIS\n",
633 1.40 bouyer AHCINAME(sc), chp->ch_channel);
634 1.40 bouyer return TIMEOUT;
635 1.40 bouyer }
636 1.40 bouyer
637 1.40 bouyer static int
638 1.40 bouyer ahci_do_reset_drive(struct ata_channel *chp, int drive, int flags,
639 1.40 bouyer uint32_t *sigp)
640 1.40 bouyer {
641 1.40 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
642 1.40 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
643 1.40 bouyer struct ahci_cmd_tbl *cmd_tbl;
644 1.40 bouyer struct ahci_cmd_header *cmd_h;
645 1.40 bouyer int i;
646 1.40 bouyer uint32_t sig;
647 1.40 bouyer
648 1.40 bouyer KASSERT((AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel)) & AHCI_P_CMD_CR) == 0);
649 1.42 bouyer again:
650 1.40 bouyer /* clear port interrupt register */
651 1.40 bouyer AHCI_WRITE(sc, AHCI_P_IS(chp->ch_channel), 0xffffffff);
652 1.40 bouyer /* clear SErrors and start operations */
653 1.40 bouyer if ((sc->sc_ahci_cap & AHCI_CAP_CLO) == AHCI_CAP_CLO) {
654 1.40 bouyer /*
655 1.40 bouyer * issue a command list override to clear BSY.
656 1.40 bouyer * This is needed if there's a PMP with no drive
657 1.40 bouyer * on port 0
658 1.40 bouyer */
659 1.40 bouyer ahci_channel_start(sc, chp, flags, 1);
660 1.40 bouyer } else {
661 1.40 bouyer ahci_channel_start(sc, chp, flags, 0);
662 1.40 bouyer }
663 1.40 bouyer if (drive > 0) {
664 1.40 bouyer KASSERT(sc->sc_ahci_cap & AHCI_CAP_SPM);
665 1.40 bouyer }
666 1.40 bouyer /* polled command, assume interrupts are disabled */
667 1.40 bouyer /* use slot 0 to send reset, the channel is idle */
668 1.40 bouyer cmd_h = &achp->ahcic_cmdh[0];
669 1.40 bouyer cmd_tbl = achp->ahcic_cmd_tbl[0];
670 1.40 bouyer cmd_h->cmdh_flags = htole16(AHCI_CMDH_F_RST | AHCI_CMDH_F_CBSY |
671 1.40 bouyer RHD_FISLEN / 4 | (drive << AHCI_CMDH_F_PMP_SHIFT));
672 1.40 bouyer cmd_h->cmdh_prdbc = 0;
673 1.40 bouyer memset(cmd_tbl->cmdt_cfis, 0, 64);
674 1.40 bouyer cmd_tbl->cmdt_cfis[fis_type] = RHD_FISTYPE;
675 1.40 bouyer cmd_tbl->cmdt_cfis[rhd_c] = drive;
676 1.40 bouyer cmd_tbl->cmdt_cfis[rhd_control] = WDCTL_RST;
677 1.40 bouyer switch(ahci_exec_fis(chp, 1, flags)) {
678 1.40 bouyer case ERR_DF:
679 1.40 bouyer case TIMEOUT:
680 1.40 bouyer aprint_error("%s channel %d: setting WDCTL_RST failed "
681 1.40 bouyer "for drive %d\n", AHCINAME(sc), chp->ch_channel, drive);
682 1.40 bouyer if (sigp)
683 1.40 bouyer *sigp = 0xffffffff;
684 1.40 bouyer goto end;
685 1.40 bouyer default:
686 1.40 bouyer break;
687 1.40 bouyer }
688 1.40 bouyer cmd_h->cmdh_flags = htole16(RHD_FISLEN / 4 |
689 1.40 bouyer (drive << AHCI_CMDH_F_PMP_SHIFT));
690 1.40 bouyer cmd_h->cmdh_prdbc = 0;
691 1.40 bouyer memset(cmd_tbl->cmdt_cfis, 0, 64);
692 1.40 bouyer cmd_tbl->cmdt_cfis[fis_type] = RHD_FISTYPE;
693 1.40 bouyer cmd_tbl->cmdt_cfis[rhd_c] = drive;
694 1.40 bouyer cmd_tbl->cmdt_cfis[rhd_control] = 0;
695 1.40 bouyer switch(ahci_exec_fis(chp, 31, flags)) {
696 1.40 bouyer case ERR_DF:
697 1.40 bouyer case TIMEOUT:
698 1.43 bouyer if ((sc->sc_ahci_quirks & AHCI_QUIRK_BADPMPRESET) != 0 &&
699 1.41 bouyer drive == PMP_PORT_CTL) {
700 1.41 bouyer /*
701 1.41 bouyer * some controllers fails to reset when
702 1.41 bouyer * targeting a PMP but a single drive is attached.
703 1.41 bouyer * try again with port 0
704 1.41 bouyer */
705 1.41 bouyer drive = 0;
706 1.42 bouyer ahci_channel_stop(sc, chp, flags);
707 1.41 bouyer goto again;
708 1.41 bouyer }
709 1.40 bouyer aprint_error("%s channel %d: clearing WDCTL_RST failed "
710 1.40 bouyer "for drive %d\n", AHCINAME(sc), chp->ch_channel, drive);
711 1.40 bouyer if (sigp)
712 1.40 bouyer *sigp = 0xffffffff;
713 1.40 bouyer goto end;
714 1.40 bouyer default:
715 1.40 bouyer break;
716 1.40 bouyer }
717 1.40 bouyer /*
718 1.40 bouyer * wait 31s for BSY to clear
719 1.40 bouyer * This should not be needed, but some controllers clear the
720 1.40 bouyer * command slot before receiving the D2H FIS ...
721 1.40 bouyer */
722 1.46 matt for (i = 0; i < AHCI_RST_WAIT; i++) {
723 1.40 bouyer sig = AHCI_READ(sc, AHCI_P_TFD(chp->ch_channel));
724 1.46 matt if ((__SHIFTOUT(sig, AHCI_P_TFD_ST) & WDCS_BSY) == 0)
725 1.40 bouyer break;
726 1.45 bouyer if (flags & AT_WAIT)
727 1.45 bouyer tsleep(&sc, PRIBIO, "ahcid2h", mstohz(10));
728 1.45 bouyer else
729 1.45 bouyer delay(10000);
730 1.40 bouyer }
731 1.40 bouyer if (i == AHCI_RST_WAIT) {
732 1.40 bouyer aprint_error("%s: BSY never cleared, TD 0x%x\n",
733 1.40 bouyer AHCINAME(sc), sig);
734 1.40 bouyer if (sigp)
735 1.40 bouyer *sigp = 0xffffffff;
736 1.40 bouyer goto end;
737 1.40 bouyer }
738 1.40 bouyer AHCIDEBUG_PRINT(("%s: BSY took %d ms\n", AHCINAME(sc), i * 10),
739 1.40 bouyer DEBUG_PROBE);
740 1.40 bouyer sig = AHCI_READ(sc, AHCI_P_SIG(chp->ch_channel));
741 1.40 bouyer if (sigp)
742 1.40 bouyer *sigp = sig;
743 1.40 bouyer AHCIDEBUG_PRINT(("%s: port %d: sig=0x%x CMD=0x%x\n",
744 1.40 bouyer AHCINAME(sc), chp->ch_channel, sig,
745 1.40 bouyer AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel))), DEBUG_PROBE);
746 1.40 bouyer end:
747 1.40 bouyer ahci_channel_stop(sc, chp, flags);
748 1.45 bouyer if (flags & AT_WAIT)
749 1.45 bouyer tsleep(&sc, PRIBIO, "ahcirst", mstohz(500));
750 1.45 bouyer else
751 1.45 bouyer delay(500000);
752 1.40 bouyer /* clear port interrupt register */
753 1.40 bouyer AHCI_WRITE(sc, AHCI_P_IS(chp->ch_channel), 0xffffffff);
754 1.47 bouyer ahci_channel_start(sc, chp, flags,
755 1.40 bouyer (sc->sc_ahci_cap & AHCI_CAP_CLO) ? 1 : 0);
756 1.40 bouyer return 0;
757 1.40 bouyer }
758 1.40 bouyer
759 1.29 jakllsch static void
760 1.1 bouyer ahci_reset_channel(struct ata_channel *chp, int flags)
761 1.1 bouyer {
762 1.1 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
763 1.1 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
764 1.18 bouyer int i, tfd;
765 1.1 bouyer
766 1.5 bouyer ahci_channel_stop(sc, chp, flags);
767 1.1 bouyer if (sata_reset_interface(chp, sc->sc_ahcit, achp->ahcic_scontrol,
768 1.47 bouyer achp->ahcic_sstatus, flags) != SStatus_DET_DEV) {
769 1.33 jakllsch printf("%s: port %d reset failed\n", AHCINAME(sc), chp->ch_channel);
770 1.1 bouyer /* XXX and then ? */
771 1.1 bouyer }
772 1.1 bouyer if (chp->ch_queue->active_xfer) {
773 1.1 bouyer chp->ch_queue->active_xfer->c_kill_xfer(chp,
774 1.1 bouyer chp->ch_queue->active_xfer, KILL_RESET);
775 1.1 bouyer }
776 1.47 bouyer ata_delay(500, "ahcirst", flags);
777 1.24 bouyer /* clear port interrupt register */
778 1.24 bouyer AHCI_WRITE(sc, AHCI_P_IS(chp->ch_channel), 0xffffffff);
779 1.24 bouyer /* clear SErrors and start operations */
780 1.40 bouyer ahci_channel_start(sc, chp, flags, 1);
781 1.18 bouyer /* wait 31s for BSY to clear */
782 1.24 bouyer for (i = 0; i <AHCI_RST_WAIT; i++) {
783 1.18 bouyer tfd = AHCI_READ(sc, AHCI_P_TFD(chp->ch_channel));
784 1.18 bouyer if ((((tfd & AHCI_P_TFD_ST) >> AHCI_P_TFD_ST_SHIFT)
785 1.18 bouyer & WDCS_BSY) == 0)
786 1.8 bouyer break;
787 1.47 bouyer ata_delay(10, "ahcid2h", flags);
788 1.8 bouyer }
789 1.24 bouyer if (i == AHCI_RST_WAIT)
790 1.18 bouyer aprint_error("%s: BSY never cleared, TD 0x%x\n",
791 1.18 bouyer AHCINAME(sc), tfd);
792 1.18 bouyer AHCIDEBUG_PRINT(("%s: BSY took %d ms\n", AHCINAME(sc), i * 10),
793 1.18 bouyer DEBUG_PROBE);
794 1.8 bouyer /* clear port interrupt register */
795 1.8 bouyer AHCI_WRITE(sc, AHCI_P_IS(chp->ch_channel), 0xffffffff);
796 1.8 bouyer
797 1.1 bouyer return;
798 1.1 bouyer }
799 1.1 bouyer
800 1.29 jakllsch static int
801 1.1 bouyer ahci_ata_addref(struct ata_drive_datas *drvp)
802 1.1 bouyer {
803 1.1 bouyer return 0;
804 1.1 bouyer }
805 1.1 bouyer
806 1.29 jakllsch static void
807 1.1 bouyer ahci_ata_delref(struct ata_drive_datas *drvp)
808 1.1 bouyer {
809 1.1 bouyer return;
810 1.1 bouyer }
811 1.1 bouyer
812 1.29 jakllsch static void
813 1.1 bouyer ahci_killpending(struct ata_drive_datas *drvp)
814 1.1 bouyer {
815 1.1 bouyer return;
816 1.1 bouyer }
817 1.1 bouyer
818 1.29 jakllsch static void
819 1.1 bouyer ahci_probe_drive(struct ata_channel *chp)
820 1.1 bouyer {
821 1.1 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
822 1.1 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
823 1.27 jakllsch uint32_t sig;
824 1.1 bouyer
825 1.18 bouyer /* bring interface up, accept FISs, power up and spin up device */
826 1.1 bouyer AHCI_WRITE(sc, AHCI_P_CMD(chp->ch_channel),
827 1.18 bouyer AHCI_P_CMD_ICC_AC | AHCI_P_CMD_FRE |
828 1.18 bouyer AHCI_P_CMD_POD | AHCI_P_CMD_SUD);
829 1.1 bouyer /* reset the PHY and bring online */
830 1.1 bouyer switch (sata_reset_interface(chp, sc->sc_ahcit, achp->ahcic_scontrol,
831 1.47 bouyer achp->ahcic_sstatus, AT_WAIT)) {
832 1.1 bouyer case SStatus_DET_DEV:
833 1.24 bouyer tsleep(&sc, PRIBIO, "ahcidv", mstohz(500));
834 1.40 bouyer if (sc->sc_ahci_cap & AHCI_CAP_SPM) {
835 1.40 bouyer ahci_do_reset_drive(chp, PMP_PORT_CTL, AT_WAIT, &sig);
836 1.40 bouyer } else {
837 1.40 bouyer ahci_do_reset_drive(chp, 0, AT_WAIT, &sig);
838 1.8 bouyer }
839 1.40 bouyer sata_interpret_sig(chp, 0, sig);
840 1.40 bouyer /* if we have a PMP attached, inform the controller */
841 1.40 bouyer if (chp->ch_ndrives > PMP_PORT_CTL &&
842 1.40 bouyer chp->ch_drive[PMP_PORT_CTL].drive_type == ATA_DRIVET_PM) {
843 1.40 bouyer AHCI_WRITE(sc, AHCI_P_CMD(chp->ch_channel),
844 1.40 bouyer AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel)) |
845 1.40 bouyer AHCI_P_CMD_PMA);
846 1.23 bouyer }
847 1.23 bouyer /* clear port interrupt register */
848 1.23 bouyer AHCI_WRITE(sc, AHCI_P_IS(chp->ch_channel), 0xffffffff);
849 1.44 matt
850 1.23 bouyer /* and enable interrupts */
851 1.1 bouyer AHCI_WRITE(sc, AHCI_P_IE(chp->ch_channel),
852 1.1 bouyer AHCI_P_IX_TFES | AHCI_P_IX_HBFS | AHCI_P_IX_IFS |
853 1.1 bouyer AHCI_P_IX_OFS | AHCI_P_IX_DPS | AHCI_P_IX_UFS |
854 1.44 matt AHCI_P_IX_PSS | AHCI_P_IX_DHRS);
855 1.17 dillo /* wait 500ms before actually starting operations */
856 1.17 dillo tsleep(&sc, PRIBIO, "ahciprb", mstohz(500));
857 1.1 bouyer break;
858 1.1 bouyer
859 1.1 bouyer default:
860 1.1 bouyer break;
861 1.1 bouyer }
862 1.1 bouyer }
863 1.1 bouyer
864 1.29 jakllsch static void
865 1.1 bouyer ahci_setup_channel(struct ata_channel *chp)
866 1.1 bouyer {
867 1.1 bouyer return;
868 1.1 bouyer }
869 1.1 bouyer
870 1.29 jakllsch static int
871 1.1 bouyer ahci_exec_command(struct ata_drive_datas *drvp, struct ata_command *ata_c)
872 1.1 bouyer {
873 1.1 bouyer struct ata_channel *chp = drvp->chnl_softc;
874 1.1 bouyer struct ata_xfer *xfer;
875 1.1 bouyer int ret;
876 1.1 bouyer int s;
877 1.1 bouyer
878 1.1 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
879 1.1 bouyer AHCIDEBUG_PRINT(("ahci_exec_command port %d CI 0x%x\n",
880 1.1 bouyer chp->ch_channel, AHCI_READ(sc, AHCI_P_CI(chp->ch_channel))),
881 1.1 bouyer DEBUG_XFERS);
882 1.1 bouyer xfer = ata_get_xfer(ata_c->flags & AT_WAIT ? ATAXF_CANSLEEP :
883 1.1 bouyer ATAXF_NOSLEEP);
884 1.1 bouyer if (xfer == NULL) {
885 1.1 bouyer return ATACMD_TRY_AGAIN;
886 1.1 bouyer }
887 1.1 bouyer if (ata_c->flags & AT_POLL)
888 1.1 bouyer xfer->c_flags |= C_POLL;
889 1.1 bouyer if (ata_c->flags & AT_WAIT)
890 1.1 bouyer xfer->c_flags |= C_WAIT;
891 1.1 bouyer xfer->c_drive = drvp->drive;
892 1.1 bouyer xfer->c_databuf = ata_c->data;
893 1.1 bouyer xfer->c_bcount = ata_c->bcount;
894 1.1 bouyer xfer->c_cmd = ata_c;
895 1.1 bouyer xfer->c_start = ahci_cmd_start;
896 1.1 bouyer xfer->c_intr = ahci_cmd_complete;
897 1.1 bouyer xfer->c_kill_xfer = ahci_cmd_kill_xfer;
898 1.1 bouyer s = splbio();
899 1.1 bouyer ata_exec_xfer(chp, xfer);
900 1.1 bouyer #ifdef DIAGNOSTIC
901 1.1 bouyer if ((ata_c->flags & AT_POLL) != 0 &&
902 1.1 bouyer (ata_c->flags & AT_DONE) == 0)
903 1.1 bouyer panic("ahci_exec_command: polled command not done");
904 1.1 bouyer #endif
905 1.1 bouyer if (ata_c->flags & AT_DONE) {
906 1.1 bouyer ret = ATACMD_COMPLETE;
907 1.1 bouyer } else {
908 1.1 bouyer if (ata_c->flags & AT_WAIT) {
909 1.1 bouyer while ((ata_c->flags & AT_DONE) == 0) {
910 1.1 bouyer tsleep(ata_c, PRIBIO, "ahcicmd", 0);
911 1.1 bouyer }
912 1.1 bouyer ret = ATACMD_COMPLETE;
913 1.1 bouyer } else {
914 1.1 bouyer ret = ATACMD_QUEUED;
915 1.1 bouyer }
916 1.1 bouyer }
917 1.1 bouyer splx(s);
918 1.1 bouyer return ret;
919 1.1 bouyer }
920 1.1 bouyer
921 1.29 jakllsch static void
922 1.1 bouyer ahci_cmd_start(struct ata_channel *chp, struct ata_xfer *xfer)
923 1.1 bouyer {
924 1.1 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
925 1.1 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
926 1.1 bouyer struct ata_command *ata_c = xfer->c_cmd;
927 1.1 bouyer int slot = 0 /* XXX slot */;
928 1.1 bouyer struct ahci_cmd_tbl *cmd_tbl;
929 1.1 bouyer struct ahci_cmd_header *cmd_h;
930 1.1 bouyer int i;
931 1.1 bouyer int channel = chp->ch_channel;
932 1.1 bouyer
933 1.44 matt AHCIDEBUG_PRINT(("ahci_cmd_start CI 0x%x timo %d\n",
934 1.44 matt AHCI_READ(sc, AHCI_P_CI(chp->ch_channel)), ata_c->timeout),
935 1.44 matt DEBUG_XFERS);
936 1.1 bouyer
937 1.1 bouyer cmd_tbl = achp->ahcic_cmd_tbl[slot];
938 1.1 bouyer AHCIDEBUG_PRINT(("%s port %d tbl %p\n", AHCINAME(sc), chp->ch_channel,
939 1.1 bouyer cmd_tbl), DEBUG_XFERS);
940 1.1 bouyer
941 1.20 jakllsch satafis_rhd_construct_cmd(ata_c, cmd_tbl->cmdt_cfis);
942 1.40 bouyer cmd_tbl->cmdt_cfis[rhd_c] |= xfer->c_drive;
943 1.1 bouyer
944 1.1 bouyer cmd_h = &achp->ahcic_cmdh[slot];
945 1.1 bouyer AHCIDEBUG_PRINT(("%s port %d header %p\n", AHCINAME(sc),
946 1.1 bouyer chp->ch_channel, cmd_h), DEBUG_XFERS);
947 1.1 bouyer if (ahci_dma_setup(chp, slot,
948 1.31 tsutsui (ata_c->flags & (AT_READ|AT_WRITE) && ata_c->bcount > 0) ?
949 1.31 tsutsui ata_c->data : NULL,
950 1.1 bouyer ata_c->bcount,
951 1.1 bouyer (ata_c->flags & AT_READ) ? BUS_DMA_READ : BUS_DMA_WRITE)) {
952 1.1 bouyer ata_c->flags |= AT_DF;
953 1.1 bouyer ahci_cmd_complete(chp, xfer, slot);
954 1.1 bouyer return;
955 1.1 bouyer }
956 1.1 bouyer cmd_h->cmdh_flags = htole16(
957 1.1 bouyer ((ata_c->flags & AT_WRITE) ? AHCI_CMDH_F_WR : 0) |
958 1.40 bouyer RHD_FISLEN / 4 | (xfer->c_drive << AHCI_CMDH_F_PMP_SHIFT));
959 1.1 bouyer cmd_h->cmdh_prdbc = 0;
960 1.1 bouyer AHCI_CMDH_SYNC(sc, achp, slot,
961 1.1 bouyer BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
962 1.1 bouyer
963 1.1 bouyer if (ata_c->flags & AT_POLL) {
964 1.1 bouyer /* polled command, disable interrupts */
965 1.1 bouyer AHCI_WRITE(sc, AHCI_GHC,
966 1.1 bouyer AHCI_READ(sc, AHCI_GHC) & ~AHCI_GHC_IE);
967 1.1 bouyer }
968 1.1 bouyer chp->ch_flags |= ATACH_IRQ_WAIT;
969 1.5 bouyer chp->ch_status = 0;
970 1.1 bouyer /* start command */
971 1.1 bouyer AHCI_WRITE(sc, AHCI_P_CI(chp->ch_channel), 1 << slot);
972 1.1 bouyer /* and says we started this command */
973 1.1 bouyer achp->ahcic_cmds_active |= 1 << slot;
974 1.1 bouyer
975 1.1 bouyer if ((ata_c->flags & AT_POLL) == 0) {
976 1.1 bouyer chp->ch_flags |= ATACH_IRQ_WAIT; /* wait for interrupt */
977 1.1 bouyer callout_reset(&chp->ch_callout, mstohz(ata_c->timeout),
978 1.1 bouyer ahci_timeout, chp);
979 1.1 bouyer return;
980 1.1 bouyer }
981 1.1 bouyer /*
982 1.1 bouyer * Polled command.
983 1.1 bouyer */
984 1.1 bouyer for (i = 0; i < ata_c->timeout / 10; i++) {
985 1.1 bouyer if (ata_c->flags & AT_DONE)
986 1.1 bouyer break;
987 1.1 bouyer ahci_intr_port(sc, achp);
988 1.1 bouyer if (ata_c->flags & AT_WAIT)
989 1.1 bouyer tsleep(&xfer, PRIBIO, "ahcipl", mstohz(10));
990 1.1 bouyer else
991 1.1 bouyer delay(10000);
992 1.1 bouyer }
993 1.1 bouyer 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), channel,
994 1.1 bouyer AHCI_READ(sc, AHCI_GHC), AHCI_READ(sc, AHCI_IS),
995 1.1 bouyer AHCI_READ(sc, AHCI_P_CLBU(channel)), AHCI_READ(sc, AHCI_P_CLB(channel)),
996 1.1 bouyer AHCI_READ(sc, AHCI_P_FBU(channel)), AHCI_READ(sc, AHCI_P_FB(channel)),
997 1.1 bouyer AHCI_READ(sc, AHCI_P_CMD(channel)), AHCI_READ(sc, AHCI_P_CI(channel))),
998 1.1 bouyer DEBUG_XFERS);
999 1.1 bouyer if ((ata_c->flags & AT_DONE) == 0) {
1000 1.1 bouyer ata_c->flags |= AT_TIMEOU;
1001 1.1 bouyer ahci_cmd_complete(chp, xfer, slot);
1002 1.1 bouyer }
1003 1.1 bouyer /* reenable interrupts */
1004 1.1 bouyer AHCI_WRITE(sc, AHCI_GHC, AHCI_READ(sc, AHCI_GHC) | AHCI_GHC_IE);
1005 1.1 bouyer }
1006 1.1 bouyer
1007 1.29 jakllsch static void
1008 1.1 bouyer ahci_cmd_kill_xfer(struct ata_channel *chp, struct ata_xfer *xfer, int reason)
1009 1.1 bouyer {
1010 1.1 bouyer struct ata_command *ata_c = xfer->c_cmd;
1011 1.1 bouyer AHCIDEBUG_PRINT(("ahci_cmd_kill_xfer channel %d\n", chp->ch_channel),
1012 1.1 bouyer DEBUG_FUNCS);
1013 1.1 bouyer
1014 1.1 bouyer switch (reason) {
1015 1.1 bouyer case KILL_GONE:
1016 1.1 bouyer ata_c->flags |= AT_GONE;
1017 1.1 bouyer break;
1018 1.1 bouyer case KILL_RESET:
1019 1.1 bouyer ata_c->flags |= AT_RESET;
1020 1.1 bouyer break;
1021 1.1 bouyer default:
1022 1.1 bouyer printf("ahci_cmd_kill_xfer: unknown reason %d\n", reason);
1023 1.1 bouyer panic("ahci_cmd_kill_xfer");
1024 1.1 bouyer }
1025 1.1 bouyer ahci_cmd_done(chp, xfer, 0 /* XXX slot */);
1026 1.1 bouyer }
1027 1.1 bouyer
1028 1.29 jakllsch static int
1029 1.1 bouyer ahci_cmd_complete(struct ata_channel *chp, struct ata_xfer *xfer, int is)
1030 1.1 bouyer {
1031 1.1 bouyer int slot = 0; /* XXX slot */
1032 1.1 bouyer struct ata_command *ata_c = xfer->c_cmd;
1033 1.1 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
1034 1.26 jakllsch struct ahci_channel *achp = (struct ahci_channel *)chp;
1035 1.1 bouyer
1036 1.1 bouyer AHCIDEBUG_PRINT(("ahci_cmd_complete channel %d CMD 0x%x CI 0x%x\n",
1037 1.1 bouyer chp->ch_channel, AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel)),
1038 1.1 bouyer AHCI_READ(sc, AHCI_P_CI(chp->ch_channel))),
1039 1.1 bouyer DEBUG_FUNCS);
1040 1.1 bouyer chp->ch_flags &= ~ATACH_IRQ_WAIT;
1041 1.1 bouyer if (xfer->c_flags & C_TIMEOU) {
1042 1.1 bouyer ata_c->flags |= AT_TIMEOU;
1043 1.1 bouyer } else
1044 1.1 bouyer callout_stop(&chp->ch_callout);
1045 1.1 bouyer
1046 1.1 bouyer chp->ch_queue->active_xfer = NULL;
1047 1.1 bouyer
1048 1.40 bouyer if (chp->ch_drive[xfer->c_drive].drive_flags & ATA_DRIVE_WAITDRAIN) {
1049 1.1 bouyer ahci_cmd_kill_xfer(chp, xfer, KILL_GONE);
1050 1.40 bouyer chp->ch_drive[xfer->c_drive].drive_flags &= ~ATA_DRIVE_WAITDRAIN;
1051 1.1 bouyer wakeup(&chp->ch_queue->active_xfer);
1052 1.1 bouyer return 0;
1053 1.1 bouyer }
1054 1.26 jakllsch
1055 1.26 jakllsch if (chp->ch_status & WDCS_BSY) {
1056 1.26 jakllsch ata_c->flags |= AT_TIMEOU;
1057 1.26 jakllsch } else if (chp->ch_status & WDCS_ERR) {
1058 1.26 jakllsch ata_c->r_error = chp->ch_error;
1059 1.26 jakllsch ata_c->flags |= AT_ERROR;
1060 1.1 bouyer }
1061 1.26 jakllsch
1062 1.26 jakllsch if (ata_c->flags & AT_READREG)
1063 1.26 jakllsch satafis_rdh_cmd_readreg(ata_c, achp->ahcic_rfis->rfis_rfis);
1064 1.26 jakllsch
1065 1.1 bouyer ahci_cmd_done(chp, xfer, slot);
1066 1.1 bouyer return 0;
1067 1.1 bouyer }
1068 1.1 bouyer
1069 1.29 jakllsch static void
1070 1.1 bouyer ahci_cmd_done(struct ata_channel *chp, struct ata_xfer *xfer, int slot)
1071 1.1 bouyer {
1072 1.1 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
1073 1.1 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
1074 1.1 bouyer struct ata_command *ata_c = xfer->c_cmd;
1075 1.25 jakllsch uint16_t *idwordbuf;
1076 1.25 jakllsch int i;
1077 1.1 bouyer
1078 1.44 matt AHCIDEBUG_PRINT(("ahci_cmd_done channel %d (status %#x) flags %#x/%#x\n",
1079 1.44 matt chp->ch_channel, chp->ch_status, xfer->c_flags, ata_c->flags), DEBUG_FUNCS);
1080 1.1 bouyer
1081 1.1 bouyer /* this comamnd is not active any more */
1082 1.1 bouyer achp->ahcic_cmds_active &= ~(1 << slot);
1083 1.1 bouyer
1084 1.31 tsutsui if (ata_c->flags & (AT_READ|AT_WRITE) && ata_c->bcount > 0) {
1085 1.44 matt bus_dmamap_t map = achp->ahcic_datad[slot];
1086 1.44 matt bus_dmamap_sync(sc->sc_dmat, map, 0, map->dm_mapsize,
1087 1.1 bouyer (ata_c->flags & AT_READ) ? BUS_DMASYNC_POSTREAD :
1088 1.1 bouyer BUS_DMASYNC_POSTWRITE);
1089 1.44 matt bus_dmamap_unload(sc->sc_dmat, map);
1090 1.1 bouyer }
1091 1.1 bouyer
1092 1.2 fvdl AHCI_CMDH_SYNC(sc, achp, slot,
1093 1.2 fvdl BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
1094 1.2 fvdl
1095 1.25 jakllsch /* ata(4) expects IDENTIFY data to be in host endianess */
1096 1.25 jakllsch if (ata_c->r_command == WDCC_IDENTIFY ||
1097 1.25 jakllsch ata_c->r_command == ATAPI_IDENTIFY_DEVICE) {
1098 1.25 jakllsch idwordbuf = xfer->c_databuf;
1099 1.25 jakllsch for (i = 0; i < (xfer->c_bcount / sizeof(*idwordbuf)); i++) {
1100 1.25 jakllsch idwordbuf[i] = le16toh(idwordbuf[i]);
1101 1.25 jakllsch }
1102 1.25 jakllsch }
1103 1.25 jakllsch
1104 1.1 bouyer ata_c->flags |= AT_DONE;
1105 1.1 bouyer if (achp->ahcic_cmdh[slot].cmdh_prdbc)
1106 1.1 bouyer ata_c->flags |= AT_XFDONE;
1107 1.1 bouyer
1108 1.1 bouyer ata_free_xfer(chp, xfer);
1109 1.1 bouyer if (ata_c->flags & AT_WAIT)
1110 1.1 bouyer wakeup(ata_c);
1111 1.1 bouyer else if (ata_c->callback)
1112 1.1 bouyer ata_c->callback(ata_c->callback_arg);
1113 1.1 bouyer atastart(chp);
1114 1.1 bouyer return;
1115 1.1 bouyer }
1116 1.1 bouyer
1117 1.29 jakllsch static int
1118 1.1 bouyer ahci_ata_bio(struct ata_drive_datas *drvp, struct ata_bio *ata_bio)
1119 1.1 bouyer {
1120 1.1 bouyer struct ata_channel *chp = drvp->chnl_softc;
1121 1.1 bouyer struct ata_xfer *xfer;
1122 1.1 bouyer
1123 1.1 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
1124 1.1 bouyer AHCIDEBUG_PRINT(("ahci_ata_bio port %d CI 0x%x\n",
1125 1.1 bouyer chp->ch_channel, AHCI_READ(sc, AHCI_P_CI(chp->ch_channel))),
1126 1.1 bouyer DEBUG_XFERS);
1127 1.1 bouyer xfer = ata_get_xfer(ATAXF_NOSLEEP);
1128 1.1 bouyer if (xfer == NULL) {
1129 1.1 bouyer return ATACMD_TRY_AGAIN;
1130 1.1 bouyer }
1131 1.1 bouyer if (ata_bio->flags & ATA_POLL)
1132 1.1 bouyer xfer->c_flags |= C_POLL;
1133 1.1 bouyer xfer->c_drive = drvp->drive;
1134 1.1 bouyer xfer->c_cmd = ata_bio;
1135 1.1 bouyer xfer->c_databuf = ata_bio->databuf;
1136 1.1 bouyer xfer->c_bcount = ata_bio->bcount;
1137 1.1 bouyer xfer->c_start = ahci_bio_start;
1138 1.1 bouyer xfer->c_intr = ahci_bio_complete;
1139 1.1 bouyer xfer->c_kill_xfer = ahci_bio_kill_xfer;
1140 1.1 bouyer ata_exec_xfer(chp, xfer);
1141 1.1 bouyer return (ata_bio->flags & ATA_ITSDONE) ? ATACMD_COMPLETE : ATACMD_QUEUED;
1142 1.1 bouyer }
1143 1.1 bouyer
1144 1.29 jakllsch static void
1145 1.1 bouyer ahci_bio_start(struct ata_channel *chp, struct ata_xfer *xfer)
1146 1.1 bouyer {
1147 1.1 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
1148 1.1 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
1149 1.1 bouyer struct ata_bio *ata_bio = xfer->c_cmd;
1150 1.1 bouyer int slot = 0 /* XXX slot */;
1151 1.1 bouyer struct ahci_cmd_tbl *cmd_tbl;
1152 1.1 bouyer struct ahci_cmd_header *cmd_h;
1153 1.20 jakllsch int i;
1154 1.1 bouyer int channel = chp->ch_channel;
1155 1.1 bouyer
1156 1.1 bouyer AHCIDEBUG_PRINT(("ahci_bio_start CI 0x%x\n",
1157 1.1 bouyer AHCI_READ(sc, AHCI_P_CI(chp->ch_channel))), DEBUG_XFERS);
1158 1.1 bouyer
1159 1.1 bouyer cmd_tbl = achp->ahcic_cmd_tbl[slot];
1160 1.1 bouyer AHCIDEBUG_PRINT(("%s port %d tbl %p\n", AHCINAME(sc), chp->ch_channel,
1161 1.1 bouyer cmd_tbl), DEBUG_XFERS);
1162 1.1 bouyer
1163 1.20 jakllsch satafis_rhd_construct_bio(xfer, cmd_tbl->cmdt_cfis);
1164 1.40 bouyer cmd_tbl->cmdt_cfis[rhd_c] |= xfer->c_drive;
1165 1.1 bouyer
1166 1.1 bouyer cmd_h = &achp->ahcic_cmdh[slot];
1167 1.1 bouyer AHCIDEBUG_PRINT(("%s port %d header %p\n", AHCINAME(sc),
1168 1.1 bouyer chp->ch_channel, cmd_h), DEBUG_XFERS);
1169 1.1 bouyer if (ahci_dma_setup(chp, slot, ata_bio->databuf, ata_bio->bcount,
1170 1.1 bouyer (ata_bio->flags & ATA_READ) ? BUS_DMA_READ : BUS_DMA_WRITE)) {
1171 1.1 bouyer ata_bio->error = ERR_DMA;
1172 1.1 bouyer ata_bio->r_error = 0;
1173 1.1 bouyer ahci_bio_complete(chp, xfer, slot);
1174 1.1 bouyer return;
1175 1.1 bouyer }
1176 1.1 bouyer cmd_h->cmdh_flags = htole16(
1177 1.1 bouyer ((ata_bio->flags & ATA_READ) ? 0 : AHCI_CMDH_F_WR) |
1178 1.40 bouyer RHD_FISLEN / 4 | (xfer->c_drive << AHCI_CMDH_F_PMP_SHIFT));
1179 1.1 bouyer cmd_h->cmdh_prdbc = 0;
1180 1.2 fvdl AHCI_CMDH_SYNC(sc, achp, slot,
1181 1.2 fvdl BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1182 1.1 bouyer
1183 1.1 bouyer if (xfer->c_flags & C_POLL) {
1184 1.1 bouyer /* polled command, disable interrupts */
1185 1.1 bouyer AHCI_WRITE(sc, AHCI_GHC,
1186 1.1 bouyer AHCI_READ(sc, AHCI_GHC) & ~AHCI_GHC_IE);
1187 1.1 bouyer }
1188 1.1 bouyer chp->ch_flags |= ATACH_IRQ_WAIT;
1189 1.5 bouyer chp->ch_status = 0;
1190 1.1 bouyer /* start command */
1191 1.1 bouyer AHCI_WRITE(sc, AHCI_P_CI(chp->ch_channel), 1 << slot);
1192 1.1 bouyer /* and says we started this command */
1193 1.1 bouyer achp->ahcic_cmds_active |= 1 << slot;
1194 1.1 bouyer
1195 1.1 bouyer if ((xfer->c_flags & C_POLL) == 0) {
1196 1.1 bouyer chp->ch_flags |= ATACH_IRQ_WAIT; /* wait for interrupt */
1197 1.1 bouyer callout_reset(&chp->ch_callout, mstohz(ATA_DELAY),
1198 1.1 bouyer ahci_timeout, chp);
1199 1.1 bouyer return;
1200 1.1 bouyer }
1201 1.1 bouyer /*
1202 1.1 bouyer * Polled command.
1203 1.1 bouyer */
1204 1.47 bouyer for (i = 0; i < ATA_DELAY * 10; i++) {
1205 1.1 bouyer if (ata_bio->flags & ATA_ITSDONE)
1206 1.1 bouyer break;
1207 1.1 bouyer ahci_intr_port(sc, achp);
1208 1.47 bouyer delay(100);
1209 1.1 bouyer }
1210 1.1 bouyer 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), channel,
1211 1.1 bouyer AHCI_READ(sc, AHCI_GHC), AHCI_READ(sc, AHCI_IS),
1212 1.1 bouyer AHCI_READ(sc, AHCI_P_CLBU(channel)), AHCI_READ(sc, AHCI_P_CLB(channel)),
1213 1.1 bouyer AHCI_READ(sc, AHCI_P_FBU(channel)), AHCI_READ(sc, AHCI_P_FB(channel)),
1214 1.1 bouyer AHCI_READ(sc, AHCI_P_CMD(channel)), AHCI_READ(sc, AHCI_P_CI(channel))),
1215 1.1 bouyer DEBUG_XFERS);
1216 1.1 bouyer if ((ata_bio->flags & ATA_ITSDONE) == 0) {
1217 1.1 bouyer ata_bio->error = TIMEOUT;
1218 1.1 bouyer ahci_bio_complete(chp, xfer, slot);
1219 1.1 bouyer }
1220 1.1 bouyer /* reenable interrupts */
1221 1.1 bouyer AHCI_WRITE(sc, AHCI_GHC, AHCI_READ(sc, AHCI_GHC) | AHCI_GHC_IE);
1222 1.1 bouyer }
1223 1.1 bouyer
1224 1.29 jakllsch static void
1225 1.1 bouyer ahci_bio_kill_xfer(struct ata_channel *chp, struct ata_xfer *xfer, int reason)
1226 1.1 bouyer {
1227 1.1 bouyer int slot = 0; /* XXX slot */
1228 1.1 bouyer int drive = xfer->c_drive;
1229 1.1 bouyer struct ata_bio *ata_bio = xfer->c_cmd;
1230 1.1 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
1231 1.1 bouyer AHCIDEBUG_PRINT(("ahci_bio_kill_xfer channel %d\n", chp->ch_channel),
1232 1.1 bouyer DEBUG_FUNCS);
1233 1.1 bouyer
1234 1.1 bouyer achp->ahcic_cmds_active &= ~(1 << slot);
1235 1.1 bouyer ata_free_xfer(chp, xfer);
1236 1.1 bouyer ata_bio->flags |= ATA_ITSDONE;
1237 1.1 bouyer switch (reason) {
1238 1.1 bouyer case KILL_GONE:
1239 1.1 bouyer ata_bio->error = ERR_NODEV;
1240 1.1 bouyer break;
1241 1.1 bouyer case KILL_RESET:
1242 1.1 bouyer ata_bio->error = ERR_RESET;
1243 1.1 bouyer break;
1244 1.1 bouyer default:
1245 1.1 bouyer printf("ahci_bio_kill_xfer: unknown reason %d\n", reason);
1246 1.1 bouyer panic("ahci_bio_kill_xfer");
1247 1.1 bouyer }
1248 1.1 bouyer ata_bio->r_error = WDCE_ABRT;
1249 1.1 bouyer (*chp->ch_drive[drive].drv_done)(chp->ch_drive[drive].drv_softc);
1250 1.1 bouyer }
1251 1.1 bouyer
1252 1.29 jakllsch static int
1253 1.1 bouyer ahci_bio_complete(struct ata_channel *chp, struct ata_xfer *xfer, int is)
1254 1.1 bouyer {
1255 1.1 bouyer int slot = 0; /* XXX slot */
1256 1.1 bouyer struct ata_bio *ata_bio = xfer->c_cmd;
1257 1.1 bouyer int drive = xfer->c_drive;
1258 1.1 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
1259 1.1 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
1260 1.1 bouyer
1261 1.1 bouyer AHCIDEBUG_PRINT(("ahci_bio_complete channel %d\n", chp->ch_channel),
1262 1.1 bouyer DEBUG_FUNCS);
1263 1.1 bouyer
1264 1.1 bouyer achp->ahcic_cmds_active &= ~(1 << slot);
1265 1.1 bouyer chp->ch_flags &= ~ATACH_IRQ_WAIT;
1266 1.5 bouyer if (xfer->c_flags & C_TIMEOU) {
1267 1.5 bouyer ata_bio->error = TIMEOUT;
1268 1.5 bouyer } else {
1269 1.5 bouyer callout_stop(&chp->ch_callout);
1270 1.19 bouyer ata_bio->error = NOERROR;
1271 1.5 bouyer }
1272 1.1 bouyer
1273 1.1 bouyer chp->ch_queue->active_xfer = NULL;
1274 1.1 bouyer bus_dmamap_sync(sc->sc_dmat, achp->ahcic_datad[slot], 0,
1275 1.1 bouyer achp->ahcic_datad[slot]->dm_mapsize,
1276 1.1 bouyer (ata_bio->flags & ATA_READ) ? BUS_DMASYNC_POSTREAD :
1277 1.1 bouyer BUS_DMASYNC_POSTWRITE);
1278 1.1 bouyer bus_dmamap_unload(sc->sc_dmat, achp->ahcic_datad[slot]);
1279 1.1 bouyer
1280 1.40 bouyer if (chp->ch_drive[xfer->c_drive].drive_flags & ATA_DRIVE_WAITDRAIN) {
1281 1.1 bouyer ahci_bio_kill_xfer(chp, xfer, KILL_GONE);
1282 1.40 bouyer chp->ch_drive[xfer->c_drive].drive_flags &= ~ATA_DRIVE_WAITDRAIN;
1283 1.1 bouyer wakeup(&chp->ch_queue->active_xfer);
1284 1.1 bouyer return 0;
1285 1.1 bouyer }
1286 1.1 bouyer ata_free_xfer(chp, xfer);
1287 1.1 bouyer ata_bio->flags |= ATA_ITSDONE;
1288 1.1 bouyer if (chp->ch_status & WDCS_DWF) {
1289 1.1 bouyer ata_bio->error = ERR_DF;
1290 1.1 bouyer } else if (chp->ch_status & WDCS_ERR) {
1291 1.1 bouyer ata_bio->error = ERROR;
1292 1.1 bouyer ata_bio->r_error = chp->ch_error;
1293 1.1 bouyer } else if (chp->ch_status & WDCS_CORR)
1294 1.1 bouyer ata_bio->flags |= ATA_CORR;
1295 1.1 bouyer
1296 1.1 bouyer AHCI_CMDH_SYNC(sc, achp, slot,
1297 1.1 bouyer BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
1298 1.1 bouyer AHCIDEBUG_PRINT(("ahci_bio_complete bcount %ld",
1299 1.1 bouyer ata_bio->bcount), DEBUG_XFERS);
1300 1.19 bouyer /*
1301 1.19 bouyer * if it was a write, complete data buffer may have been transfered
1302 1.19 bouyer * before error detection; in this case don't use cmdh_prdbc
1303 1.19 bouyer * as it won't reflect what was written to media. Assume nothing
1304 1.19 bouyer * was transfered and leave bcount as-is.
1305 1.19 bouyer */
1306 1.19 bouyer if ((ata_bio->flags & ATA_READ) || ata_bio->error == NOERROR)
1307 1.19 bouyer ata_bio->bcount -= le32toh(achp->ahcic_cmdh[slot].cmdh_prdbc);
1308 1.1 bouyer AHCIDEBUG_PRINT((" now %ld\n", ata_bio->bcount), DEBUG_XFERS);
1309 1.1 bouyer (*chp->ch_drive[drive].drv_done)(chp->ch_drive[drive].drv_softc);
1310 1.1 bouyer atastart(chp);
1311 1.1 bouyer return 0;
1312 1.1 bouyer }
1313 1.1 bouyer
1314 1.29 jakllsch static void
1315 1.5 bouyer ahci_channel_stop(struct ahci_softc *sc, struct ata_channel *chp, int flags)
1316 1.5 bouyer {
1317 1.5 bouyer int i;
1318 1.5 bouyer /* stop channel */
1319 1.5 bouyer AHCI_WRITE(sc, AHCI_P_CMD(chp->ch_channel),
1320 1.5 bouyer AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel)) & ~AHCI_P_CMD_ST);
1321 1.5 bouyer /* wait 1s for channel to stop */
1322 1.5 bouyer for (i = 0; i <100; i++) {
1323 1.5 bouyer if ((AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel)) & AHCI_P_CMD_CR)
1324 1.5 bouyer == 0)
1325 1.5 bouyer break;
1326 1.5 bouyer if (flags & AT_WAIT)
1327 1.40 bouyer tsleep(&sc, PRIBIO, "ahcistop", mstohz(10));
1328 1.5 bouyer else
1329 1.5 bouyer delay(10000);
1330 1.5 bouyer }
1331 1.5 bouyer if (AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel)) & AHCI_P_CMD_CR) {
1332 1.5 bouyer printf("%s: channel wouldn't stop\n", AHCINAME(sc));
1333 1.5 bouyer /* XXX controller reset ? */
1334 1.5 bouyer return;
1335 1.5 bouyer }
1336 1.5 bouyer }
1337 1.5 bouyer
1338 1.29 jakllsch static void
1339 1.40 bouyer ahci_channel_start(struct ahci_softc *sc, struct ata_channel *chp,
1340 1.40 bouyer int flags, int clo)
1341 1.1 bouyer {
1342 1.40 bouyer int i;
1343 1.40 bouyer uint32_t p_cmd;
1344 1.1 bouyer /* clear error */
1345 1.18 bouyer AHCI_WRITE(sc, AHCI_P_SERR(chp->ch_channel),
1346 1.18 bouyer AHCI_READ(sc, AHCI_P_SERR(chp->ch_channel)));
1347 1.1 bouyer
1348 1.40 bouyer if (clo) {
1349 1.40 bouyer /* issue command list override */
1350 1.40 bouyer KASSERT(sc->sc_ahci_cap & AHCI_CAP_CLO);
1351 1.40 bouyer AHCI_WRITE(sc, AHCI_P_CMD(chp->ch_channel),
1352 1.40 bouyer AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel)) | AHCI_P_CMD_CLO);
1353 1.40 bouyer /* wait 1s for AHCI_CAP_CLO to clear */
1354 1.40 bouyer for (i = 0; i <100; i++) {
1355 1.40 bouyer if ((AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel)) &
1356 1.40 bouyer AHCI_P_CMD_CLO) == 0)
1357 1.40 bouyer break;
1358 1.40 bouyer if (flags & AT_WAIT)
1359 1.40 bouyer tsleep(&sc, PRIBIO, "ahciclo", mstohz(10));
1360 1.40 bouyer else
1361 1.40 bouyer delay(10000);
1362 1.40 bouyer }
1363 1.40 bouyer if (AHCI_READ(sc, AHCI_P_CMD(chp->ch_channel)) & AHCI_P_CMD_CLO) {
1364 1.40 bouyer printf("%s: channel wouldn't CLO\n", AHCINAME(sc));
1365 1.40 bouyer /* XXX controller reset ? */
1366 1.40 bouyer return;
1367 1.40 bouyer }
1368 1.40 bouyer }
1369 1.1 bouyer /* and start controller */
1370 1.40 bouyer p_cmd = AHCI_P_CMD_ICC_AC | AHCI_P_CMD_POD | AHCI_P_CMD_SUD |
1371 1.40 bouyer AHCI_P_CMD_FRE | AHCI_P_CMD_ST;
1372 1.40 bouyer if (chp->ch_ndrives > PMP_PORT_CTL &&
1373 1.40 bouyer chp->ch_drive[PMP_PORT_CTL].drive_type == ATA_DRIVET_PM) {
1374 1.40 bouyer p_cmd |= AHCI_P_CMD_PMA;
1375 1.40 bouyer }
1376 1.40 bouyer AHCI_WRITE(sc, AHCI_P_CMD(chp->ch_channel), p_cmd);
1377 1.1 bouyer }
1378 1.1 bouyer
1379 1.29 jakllsch static void
1380 1.1 bouyer ahci_timeout(void *v)
1381 1.1 bouyer {
1382 1.1 bouyer struct ata_channel *chp = (struct ata_channel *)v;
1383 1.1 bouyer struct ata_xfer *xfer = chp->ch_queue->active_xfer;
1384 1.44 matt #ifdef AHCI_DEBUG
1385 1.44 matt struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
1386 1.44 matt #endif
1387 1.1 bouyer int s = splbio();
1388 1.44 matt AHCIDEBUG_PRINT(("ahci_timeout xfer %p intr %#x\n", xfer, AHCI_READ(sc, AHCI_P_IS(chp->ch_channel))), DEBUG_INTR);
1389 1.44 matt
1390 1.1 bouyer if ((chp->ch_flags & ATACH_IRQ_WAIT) != 0) {
1391 1.1 bouyer xfer->c_flags |= C_TIMEOU;
1392 1.1 bouyer xfer->c_intr(chp, xfer, 0);
1393 1.1 bouyer }
1394 1.1 bouyer splx(s);
1395 1.1 bouyer }
1396 1.1 bouyer
1397 1.29 jakllsch static int
1398 1.1 bouyer ahci_dma_setup(struct ata_channel *chp, int slot, void *data,
1399 1.1 bouyer size_t count, int op)
1400 1.1 bouyer {
1401 1.1 bouyer int error, seg;
1402 1.1 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
1403 1.1 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
1404 1.1 bouyer struct ahci_cmd_tbl *cmd_tbl;
1405 1.1 bouyer struct ahci_cmd_header *cmd_h;
1406 1.1 bouyer
1407 1.1 bouyer cmd_h = &achp->ahcic_cmdh[slot];
1408 1.1 bouyer cmd_tbl = achp->ahcic_cmd_tbl[slot];
1409 1.1 bouyer
1410 1.1 bouyer if (data == NULL) {
1411 1.1 bouyer cmd_h->cmdh_prdtl = 0;
1412 1.1 bouyer goto end;
1413 1.1 bouyer }
1414 1.1 bouyer
1415 1.1 bouyer error = bus_dmamap_load(sc->sc_dmat, achp->ahcic_datad[slot],
1416 1.1 bouyer data, count, NULL,
1417 1.1 bouyer BUS_DMA_NOWAIT | BUS_DMA_STREAMING | op);
1418 1.1 bouyer if (error) {
1419 1.1 bouyer printf("%s port %d: failed to load xfer: %d\n",
1420 1.1 bouyer AHCINAME(sc), chp->ch_channel, error);
1421 1.1 bouyer return error;
1422 1.1 bouyer }
1423 1.1 bouyer bus_dmamap_sync(sc->sc_dmat, achp->ahcic_datad[slot], 0,
1424 1.1 bouyer achp->ahcic_datad[slot]->dm_mapsize,
1425 1.1 bouyer (op == BUS_DMA_READ) ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE);
1426 1.1 bouyer for (seg = 0; seg < achp->ahcic_datad[slot]->dm_nsegs; seg++) {
1427 1.28 jakllsch cmd_tbl->cmdt_prd[seg].prd_dba = htole64(
1428 1.1 bouyer achp->ahcic_datad[slot]->dm_segs[seg].ds_addr);
1429 1.1 bouyer cmd_tbl->cmdt_prd[seg].prd_dbc = htole32(
1430 1.1 bouyer achp->ahcic_datad[slot]->dm_segs[seg].ds_len - 1);
1431 1.1 bouyer }
1432 1.1 bouyer cmd_tbl->cmdt_prd[seg - 1].prd_dbc |= htole32(AHCI_PRD_DBC_IPC);
1433 1.1 bouyer cmd_h->cmdh_prdtl = htole16(achp->ahcic_datad[slot]->dm_nsegs);
1434 1.1 bouyer end:
1435 1.1 bouyer AHCI_CMDTBL_SYNC(sc, achp, slot, BUS_DMASYNC_PREWRITE);
1436 1.1 bouyer return 0;
1437 1.1 bouyer }
1438 1.8 bouyer
1439 1.8 bouyer #if NATAPIBUS > 0
1440 1.29 jakllsch static void
1441 1.8 bouyer ahci_atapibus_attach(struct atabus_softc * ata_sc)
1442 1.8 bouyer {
1443 1.8 bouyer struct ata_channel *chp = ata_sc->sc_chan;
1444 1.8 bouyer struct atac_softc *atac = chp->ch_atac;
1445 1.8 bouyer struct scsipi_adapter *adapt = &atac->atac_atapi_adapter._generic;
1446 1.8 bouyer struct scsipi_channel *chan = &chp->ch_atapi_channel;
1447 1.8 bouyer /*
1448 1.8 bouyer * Fill in the scsipi_adapter.
1449 1.8 bouyer */
1450 1.13 cube adapt->adapt_dev = atac->atac_dev;
1451 1.8 bouyer adapt->adapt_nchannels = atac->atac_nchannels;
1452 1.8 bouyer adapt->adapt_request = ahci_atapi_scsipi_request;
1453 1.8 bouyer adapt->adapt_minphys = ahci_atapi_minphys;
1454 1.8 bouyer atac->atac_atapi_adapter.atapi_probe_device = ahci_atapi_probe_device;
1455 1.8 bouyer
1456 1.8 bouyer /*
1457 1.8 bouyer * Fill in the scsipi_channel.
1458 1.8 bouyer */
1459 1.8 bouyer memset(chan, 0, sizeof(*chan));
1460 1.8 bouyer chan->chan_adapter = adapt;
1461 1.8 bouyer chan->chan_bustype = &ahci_atapi_bustype;
1462 1.8 bouyer chan->chan_channel = chp->ch_channel;
1463 1.8 bouyer chan->chan_flags = SCSIPI_CHAN_OPENINGS;
1464 1.8 bouyer chan->chan_openings = 1;
1465 1.8 bouyer chan->chan_max_periph = 1;
1466 1.8 bouyer chan->chan_ntargets = 1;
1467 1.8 bouyer chan->chan_nluns = 1;
1468 1.13 cube chp->atapibus = config_found_ia(ata_sc->sc_dev, "atapi", chan,
1469 1.8 bouyer atapiprint);
1470 1.8 bouyer }
1471 1.8 bouyer
1472 1.29 jakllsch static void
1473 1.8 bouyer ahci_atapi_minphys(struct buf *bp)
1474 1.8 bouyer {
1475 1.8 bouyer if (bp->b_bcount > MAXPHYS)
1476 1.8 bouyer bp->b_bcount = MAXPHYS;
1477 1.8 bouyer minphys(bp);
1478 1.8 bouyer }
1479 1.8 bouyer
1480 1.8 bouyer /*
1481 1.8 bouyer * Kill off all pending xfers for a periph.
1482 1.8 bouyer *
1483 1.8 bouyer * Must be called at splbio().
1484 1.8 bouyer */
1485 1.29 jakllsch static void
1486 1.8 bouyer ahci_atapi_kill_pending(struct scsipi_periph *periph)
1487 1.8 bouyer {
1488 1.8 bouyer struct atac_softc *atac =
1489 1.13 cube device_private(periph->periph_channel->chan_adapter->adapt_dev);
1490 1.8 bouyer struct ata_channel *chp =
1491 1.8 bouyer atac->atac_channels[periph->periph_channel->chan_channel];
1492 1.8 bouyer
1493 1.8 bouyer ata_kill_pending(&chp->ch_drive[periph->periph_target]);
1494 1.8 bouyer }
1495 1.8 bouyer
1496 1.29 jakllsch static void
1497 1.8 bouyer ahci_atapi_scsipi_request(struct scsipi_channel *chan,
1498 1.8 bouyer scsipi_adapter_req_t req, void *arg)
1499 1.8 bouyer {
1500 1.8 bouyer struct scsipi_adapter *adapt = chan->chan_adapter;
1501 1.8 bouyer struct scsipi_periph *periph;
1502 1.8 bouyer struct scsipi_xfer *sc_xfer;
1503 1.13 cube struct ahci_softc *sc = device_private(adapt->adapt_dev);
1504 1.8 bouyer struct atac_softc *atac = &sc->sc_atac;
1505 1.8 bouyer struct ata_xfer *xfer;
1506 1.8 bouyer int channel = chan->chan_channel;
1507 1.8 bouyer int drive, s;
1508 1.8 bouyer
1509 1.8 bouyer switch (req) {
1510 1.8 bouyer case ADAPTER_REQ_RUN_XFER:
1511 1.8 bouyer sc_xfer = arg;
1512 1.8 bouyer periph = sc_xfer->xs_periph;
1513 1.8 bouyer drive = periph->periph_target;
1514 1.13 cube if (!device_is_active(atac->atac_dev)) {
1515 1.8 bouyer sc_xfer->error = XS_DRIVER_STUFFUP;
1516 1.8 bouyer scsipi_done(sc_xfer);
1517 1.8 bouyer return;
1518 1.8 bouyer }
1519 1.8 bouyer xfer = ata_get_xfer(ATAXF_NOSLEEP);
1520 1.8 bouyer if (xfer == NULL) {
1521 1.8 bouyer sc_xfer->error = XS_RESOURCE_SHORTAGE;
1522 1.8 bouyer scsipi_done(sc_xfer);
1523 1.8 bouyer return;
1524 1.8 bouyer }
1525 1.8 bouyer
1526 1.8 bouyer if (sc_xfer->xs_control & XS_CTL_POLL)
1527 1.8 bouyer xfer->c_flags |= C_POLL;
1528 1.8 bouyer xfer->c_drive = drive;
1529 1.8 bouyer xfer->c_flags |= C_ATAPI;
1530 1.8 bouyer xfer->c_cmd = sc_xfer;
1531 1.8 bouyer xfer->c_databuf = sc_xfer->data;
1532 1.8 bouyer xfer->c_bcount = sc_xfer->datalen;
1533 1.8 bouyer xfer->c_start = ahci_atapi_start;
1534 1.8 bouyer xfer->c_intr = ahci_atapi_complete;
1535 1.8 bouyer xfer->c_kill_xfer = ahci_atapi_kill_xfer;
1536 1.8 bouyer xfer->c_dscpoll = 0;
1537 1.8 bouyer s = splbio();
1538 1.8 bouyer ata_exec_xfer(atac->atac_channels[channel], xfer);
1539 1.8 bouyer #ifdef DIAGNOSTIC
1540 1.8 bouyer if ((sc_xfer->xs_control & XS_CTL_POLL) != 0 &&
1541 1.8 bouyer (sc_xfer->xs_status & XS_STS_DONE) == 0)
1542 1.8 bouyer panic("ahci_atapi_scsipi_request: polled command "
1543 1.8 bouyer "not done");
1544 1.8 bouyer #endif
1545 1.8 bouyer splx(s);
1546 1.8 bouyer return;
1547 1.8 bouyer default:
1548 1.8 bouyer /* Not supported, nothing to do. */
1549 1.8 bouyer ;
1550 1.8 bouyer }
1551 1.8 bouyer }
1552 1.8 bouyer
1553 1.29 jakllsch static void
1554 1.8 bouyer ahci_atapi_start(struct ata_channel *chp, struct ata_xfer *xfer)
1555 1.8 bouyer {
1556 1.8 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
1557 1.8 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
1558 1.8 bouyer struct scsipi_xfer *sc_xfer = xfer->c_cmd;
1559 1.8 bouyer int slot = 0 /* XXX slot */;
1560 1.8 bouyer struct ahci_cmd_tbl *cmd_tbl;
1561 1.8 bouyer struct ahci_cmd_header *cmd_h;
1562 1.8 bouyer int i;
1563 1.8 bouyer int channel = chp->ch_channel;
1564 1.8 bouyer
1565 1.8 bouyer AHCIDEBUG_PRINT(("ahci_atapi_start CI 0x%x\n",
1566 1.8 bouyer AHCI_READ(sc, AHCI_P_CI(chp->ch_channel))), DEBUG_XFERS);
1567 1.8 bouyer
1568 1.8 bouyer cmd_tbl = achp->ahcic_cmd_tbl[slot];
1569 1.8 bouyer AHCIDEBUG_PRINT(("%s port %d tbl %p\n", AHCINAME(sc), chp->ch_channel,
1570 1.8 bouyer cmd_tbl), DEBUG_XFERS);
1571 1.8 bouyer
1572 1.20 jakllsch satafis_rhd_construct_atapi(xfer, cmd_tbl->cmdt_cfis);
1573 1.40 bouyer cmd_tbl->cmdt_cfis[rhd_c] |= xfer->c_drive;
1574 1.8 bouyer memset(&cmd_tbl->cmdt_acmd, 0, sizeof(cmd_tbl->cmdt_acmd));
1575 1.8 bouyer memcpy(cmd_tbl->cmdt_acmd, sc_xfer->cmd, sc_xfer->cmdlen);
1576 1.8 bouyer
1577 1.8 bouyer cmd_h = &achp->ahcic_cmdh[slot];
1578 1.8 bouyer AHCIDEBUG_PRINT(("%s port %d header %p\n", AHCINAME(sc),
1579 1.8 bouyer chp->ch_channel, cmd_h), DEBUG_XFERS);
1580 1.8 bouyer if (ahci_dma_setup(chp, slot, sc_xfer->datalen ? sc_xfer->data : NULL,
1581 1.8 bouyer sc_xfer->datalen,
1582 1.8 bouyer (sc_xfer->xs_control & XS_CTL_DATA_IN) ?
1583 1.8 bouyer BUS_DMA_READ : BUS_DMA_WRITE)) {
1584 1.8 bouyer sc_xfer->error = XS_DRIVER_STUFFUP;
1585 1.8 bouyer ahci_atapi_complete(chp, xfer, slot);
1586 1.8 bouyer return;
1587 1.8 bouyer }
1588 1.8 bouyer cmd_h->cmdh_flags = htole16(
1589 1.8 bouyer ((sc_xfer->xs_control & XS_CTL_DATA_OUT) ? AHCI_CMDH_F_WR : 0) |
1590 1.40 bouyer RHD_FISLEN / 4 | AHCI_CMDH_F_A |
1591 1.40 bouyer (xfer->c_drive << AHCI_CMDH_F_PMP_SHIFT));
1592 1.8 bouyer cmd_h->cmdh_prdbc = 0;
1593 1.8 bouyer AHCI_CMDH_SYNC(sc, achp, slot,
1594 1.8 bouyer BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1595 1.8 bouyer
1596 1.8 bouyer if (xfer->c_flags & C_POLL) {
1597 1.8 bouyer /* polled command, disable interrupts */
1598 1.8 bouyer AHCI_WRITE(sc, AHCI_GHC,
1599 1.8 bouyer AHCI_READ(sc, AHCI_GHC) & ~AHCI_GHC_IE);
1600 1.8 bouyer }
1601 1.8 bouyer chp->ch_flags |= ATACH_IRQ_WAIT;
1602 1.8 bouyer chp->ch_status = 0;
1603 1.8 bouyer /* start command */
1604 1.8 bouyer AHCI_WRITE(sc, AHCI_P_CI(chp->ch_channel), 1 << slot);
1605 1.8 bouyer /* and says we started this command */
1606 1.8 bouyer achp->ahcic_cmds_active |= 1 << slot;
1607 1.8 bouyer
1608 1.8 bouyer if ((xfer->c_flags & C_POLL) == 0) {
1609 1.8 bouyer chp->ch_flags |= ATACH_IRQ_WAIT; /* wait for interrupt */
1610 1.8 bouyer callout_reset(&chp->ch_callout, mstohz(sc_xfer->timeout),
1611 1.8 bouyer ahci_timeout, chp);
1612 1.8 bouyer return;
1613 1.8 bouyer }
1614 1.8 bouyer /*
1615 1.8 bouyer * Polled command.
1616 1.8 bouyer */
1617 1.8 bouyer for (i = 0; i < ATA_DELAY / 10; i++) {
1618 1.8 bouyer if (sc_xfer->xs_status & XS_STS_DONE)
1619 1.8 bouyer break;
1620 1.8 bouyer ahci_intr_port(sc, achp);
1621 1.8 bouyer delay(10000);
1622 1.8 bouyer }
1623 1.8 bouyer 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), channel,
1624 1.8 bouyer AHCI_READ(sc, AHCI_GHC), AHCI_READ(sc, AHCI_IS),
1625 1.8 bouyer AHCI_READ(sc, AHCI_P_CLBU(channel)), AHCI_READ(sc, AHCI_P_CLB(channel)),
1626 1.8 bouyer AHCI_READ(sc, AHCI_P_FBU(channel)), AHCI_READ(sc, AHCI_P_FB(channel)),
1627 1.8 bouyer AHCI_READ(sc, AHCI_P_CMD(channel)), AHCI_READ(sc, AHCI_P_CI(channel))),
1628 1.8 bouyer DEBUG_XFERS);
1629 1.8 bouyer if ((sc_xfer->xs_status & XS_STS_DONE) == 0) {
1630 1.8 bouyer sc_xfer->error = XS_TIMEOUT;
1631 1.8 bouyer ahci_atapi_complete(chp, xfer, slot);
1632 1.8 bouyer }
1633 1.8 bouyer /* reenable interrupts */
1634 1.8 bouyer AHCI_WRITE(sc, AHCI_GHC, AHCI_READ(sc, AHCI_GHC) | AHCI_GHC_IE);
1635 1.8 bouyer }
1636 1.8 bouyer
1637 1.29 jakllsch static int
1638 1.8 bouyer ahci_atapi_complete(struct ata_channel *chp, struct ata_xfer *xfer, int irq)
1639 1.8 bouyer {
1640 1.8 bouyer int slot = 0; /* XXX slot */
1641 1.8 bouyer struct scsipi_xfer *sc_xfer = xfer->c_cmd;
1642 1.8 bouyer int drive = xfer->c_drive;
1643 1.8 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
1644 1.8 bouyer struct ahci_softc *sc = (struct ahci_softc *)chp->ch_atac;
1645 1.8 bouyer
1646 1.8 bouyer AHCIDEBUG_PRINT(("ahci_atapi_complete channel %d\n", chp->ch_channel),
1647 1.8 bouyer DEBUG_FUNCS);
1648 1.8 bouyer
1649 1.8 bouyer achp->ahcic_cmds_active &= ~(1 << slot);
1650 1.8 bouyer chp->ch_flags &= ~ATACH_IRQ_WAIT;
1651 1.8 bouyer if (xfer->c_flags & C_TIMEOU) {
1652 1.8 bouyer sc_xfer->error = XS_TIMEOUT;
1653 1.8 bouyer } else {
1654 1.8 bouyer callout_stop(&chp->ch_callout);
1655 1.8 bouyer sc_xfer->error = 0;
1656 1.8 bouyer }
1657 1.8 bouyer
1658 1.8 bouyer chp->ch_queue->active_xfer = NULL;
1659 1.8 bouyer bus_dmamap_sync(sc->sc_dmat, achp->ahcic_datad[slot], 0,
1660 1.8 bouyer achp->ahcic_datad[slot]->dm_mapsize,
1661 1.8 bouyer (sc_xfer->xs_control & XS_CTL_DATA_IN) ? BUS_DMASYNC_POSTREAD :
1662 1.8 bouyer BUS_DMASYNC_POSTWRITE);
1663 1.8 bouyer bus_dmamap_unload(sc->sc_dmat, achp->ahcic_datad[slot]);
1664 1.8 bouyer
1665 1.40 bouyer if (chp->ch_drive[drive].drive_flags & ATA_DRIVE_WAITDRAIN) {
1666 1.8 bouyer ahci_atapi_kill_xfer(chp, xfer, KILL_GONE);
1667 1.40 bouyer chp->ch_drive[drive].drive_flags &= ~ATA_DRIVE_WAITDRAIN;
1668 1.8 bouyer wakeup(&chp->ch_queue->active_xfer);
1669 1.8 bouyer return 0;
1670 1.8 bouyer }
1671 1.8 bouyer ata_free_xfer(chp, xfer);
1672 1.8 bouyer
1673 1.8 bouyer AHCI_CMDH_SYNC(sc, achp, slot,
1674 1.8 bouyer BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
1675 1.8 bouyer sc_xfer->resid = sc_xfer->datalen;
1676 1.8 bouyer sc_xfer->resid -= le32toh(achp->ahcic_cmdh[slot].cmdh_prdbc);
1677 1.8 bouyer AHCIDEBUG_PRINT(("ahci_atapi_complete datalen %d resid %d\n",
1678 1.8 bouyer sc_xfer->datalen, sc_xfer->resid), DEBUG_XFERS);
1679 1.16 bouyer if (chp->ch_status & WDCS_ERR &&
1680 1.16 bouyer ((sc_xfer->xs_control & XS_CTL_REQSENSE) == 0 ||
1681 1.16 bouyer sc_xfer->resid == sc_xfer->datalen)) {
1682 1.16 bouyer sc_xfer->error = XS_SHORTSENSE;
1683 1.16 bouyer sc_xfer->sense.atapi_sense = chp->ch_error;
1684 1.16 bouyer if ((sc_xfer->xs_periph->periph_quirks &
1685 1.16 bouyer PQUIRK_NOSENSE) == 0) {
1686 1.16 bouyer /* ask scsipi to send a REQUEST_SENSE */
1687 1.16 bouyer sc_xfer->error = XS_BUSY;
1688 1.16 bouyer sc_xfer->status = SCSI_CHECK;
1689 1.16 bouyer }
1690 1.16 bouyer }
1691 1.8 bouyer scsipi_done(sc_xfer);
1692 1.8 bouyer atastart(chp);
1693 1.8 bouyer return 0;
1694 1.8 bouyer }
1695 1.8 bouyer
1696 1.29 jakllsch static void
1697 1.8 bouyer ahci_atapi_kill_xfer(struct ata_channel *chp, struct ata_xfer *xfer, int reason)
1698 1.8 bouyer {
1699 1.8 bouyer struct scsipi_xfer *sc_xfer = xfer->c_cmd;
1700 1.8 bouyer struct ahci_channel *achp = (struct ahci_channel *)chp;
1701 1.8 bouyer int slot = 0; /* XXX slot */
1702 1.8 bouyer
1703 1.8 bouyer achp->ahcic_cmds_active &= ~(1 << slot);
1704 1.8 bouyer
1705 1.8 bouyer /* remove this command from xfer queue */
1706 1.8 bouyer switch (reason) {
1707 1.8 bouyer case KILL_GONE:
1708 1.8 bouyer sc_xfer->error = XS_DRIVER_STUFFUP;
1709 1.8 bouyer break;
1710 1.8 bouyer case KILL_RESET:
1711 1.8 bouyer sc_xfer->error = XS_RESET;
1712 1.8 bouyer break;
1713 1.8 bouyer default:
1714 1.8 bouyer printf("ahci_ata_atapi_kill_xfer: unknown reason %d\n", reason);
1715 1.8 bouyer panic("ahci_ata_atapi_kill_xfer");
1716 1.8 bouyer }
1717 1.8 bouyer ata_free_xfer(chp, xfer);
1718 1.8 bouyer scsipi_done(sc_xfer);
1719 1.8 bouyer }
1720 1.8 bouyer
1721 1.29 jakllsch static void
1722 1.8 bouyer ahci_atapi_probe_device(struct atapibus_softc *sc, int target)
1723 1.8 bouyer {
1724 1.8 bouyer struct scsipi_channel *chan = sc->sc_channel;
1725 1.8 bouyer struct scsipi_periph *periph;
1726 1.8 bouyer struct ataparams ids;
1727 1.8 bouyer struct ataparams *id = &ids;
1728 1.13 cube struct ahci_softc *ahcic =
1729 1.13 cube device_private(chan->chan_adapter->adapt_dev);
1730 1.8 bouyer struct atac_softc *atac = &ahcic->sc_atac;
1731 1.8 bouyer struct ata_channel *chp = atac->atac_channels[chan->chan_channel];
1732 1.8 bouyer struct ata_drive_datas *drvp = &chp->ch_drive[target];
1733 1.8 bouyer struct scsipibus_attach_args sa;
1734 1.8 bouyer char serial_number[21], model[41], firmware_revision[9];
1735 1.8 bouyer int s;
1736 1.8 bouyer
1737 1.8 bouyer /* skip if already attached */
1738 1.8 bouyer if (scsipi_lookup_periph(chan, target, 0) != NULL)
1739 1.8 bouyer return;
1740 1.8 bouyer
1741 1.8 bouyer /* if no ATAPI device detected at attach time, skip */
1742 1.40 bouyer if (drvp->drive_type != ATA_DRIVET_ATAPI) {
1743 1.8 bouyer AHCIDEBUG_PRINT(("ahci_atapi_probe_device: drive %d "
1744 1.8 bouyer "not present\n", target), DEBUG_PROBE);
1745 1.8 bouyer return;
1746 1.8 bouyer }
1747 1.8 bouyer
1748 1.8 bouyer /* Some ATAPI devices need a bit more time after software reset. */
1749 1.8 bouyer delay(5000);
1750 1.8 bouyer if (ata_get_params(drvp, AT_WAIT, id) == 0) {
1751 1.8 bouyer #ifdef ATAPI_DEBUG_PROBE
1752 1.8 bouyer printf("%s drive %d: cmdsz 0x%x drqtype 0x%x\n",
1753 1.14 cube AHCINAME(ahcic), target,
1754 1.8 bouyer id->atap_config & ATAPI_CFG_CMD_MASK,
1755 1.8 bouyer id->atap_config & ATAPI_CFG_DRQ_MASK);
1756 1.8 bouyer #endif
1757 1.8 bouyer periph = scsipi_alloc_periph(M_NOWAIT);
1758 1.8 bouyer if (periph == NULL) {
1759 1.14 cube aprint_error_dev(sc->sc_dev,
1760 1.14 cube "unable to allocate periph for drive %d\n",
1761 1.14 cube target);
1762 1.8 bouyer return;
1763 1.8 bouyer }
1764 1.8 bouyer periph->periph_dev = NULL;
1765 1.8 bouyer periph->periph_channel = chan;
1766 1.8 bouyer periph->periph_switch = &atapi_probe_periphsw;
1767 1.8 bouyer periph->periph_target = target;
1768 1.8 bouyer periph->periph_lun = 0;
1769 1.8 bouyer periph->periph_quirks = PQUIRK_ONLYBIG;
1770 1.8 bouyer
1771 1.8 bouyer #ifdef SCSIPI_DEBUG
1772 1.8 bouyer if (SCSIPI_DEBUG_TYPE == SCSIPI_BUSTYPE_ATAPI &&
1773 1.8 bouyer SCSIPI_DEBUG_TARGET == target)
1774 1.8 bouyer periph->periph_dbflags |= SCSIPI_DEBUG_FLAGS;
1775 1.8 bouyer #endif
1776 1.8 bouyer periph->periph_type = ATAPI_CFG_TYPE(id->atap_config);
1777 1.8 bouyer if (id->atap_config & ATAPI_CFG_REMOV)
1778 1.8 bouyer periph->periph_flags |= PERIPH_REMOVABLE;
1779 1.8 bouyer if (periph->periph_type == T_SEQUENTIAL) {
1780 1.8 bouyer s = splbio();
1781 1.40 bouyer drvp->drive_flags |= ATA_DRIVE_ATAPIDSCW;
1782 1.8 bouyer splx(s);
1783 1.8 bouyer }
1784 1.8 bouyer
1785 1.8 bouyer sa.sa_periph = periph;
1786 1.8 bouyer sa.sa_inqbuf.type = ATAPI_CFG_TYPE(id->atap_config);
1787 1.8 bouyer sa.sa_inqbuf.removable = id->atap_config & ATAPI_CFG_REMOV ?
1788 1.8 bouyer T_REMOV : T_FIXED;
1789 1.8 bouyer scsipi_strvis((u_char *)model, 40, id->atap_model, 40);
1790 1.8 bouyer scsipi_strvis((u_char *)serial_number, 20, id->atap_serial,
1791 1.8 bouyer 20);
1792 1.8 bouyer scsipi_strvis((u_char *)firmware_revision, 8,
1793 1.8 bouyer id->atap_revision, 8);
1794 1.8 bouyer sa.sa_inqbuf.vendor = model;
1795 1.8 bouyer sa.sa_inqbuf.product = serial_number;
1796 1.8 bouyer sa.sa_inqbuf.revision = firmware_revision;
1797 1.8 bouyer
1798 1.8 bouyer /*
1799 1.8 bouyer * Determine the operating mode capabilities of the device.
1800 1.8 bouyer */
1801 1.8 bouyer if ((id->atap_config & ATAPI_CFG_CMD_MASK) == ATAPI_CFG_CMD_16)
1802 1.8 bouyer periph->periph_cap |= PERIPH_CAP_CMD16;
1803 1.8 bouyer /* XXX This is gross. */
1804 1.8 bouyer periph->periph_cap |= (id->atap_config & ATAPI_CFG_DRQ_MASK);
1805 1.8 bouyer
1806 1.8 bouyer drvp->drv_softc = atapi_probe_device(sc, target, periph, &sa);
1807 1.8 bouyer
1808 1.8 bouyer if (drvp->drv_softc)
1809 1.8 bouyer ata_probe_caps(drvp);
1810 1.8 bouyer else {
1811 1.8 bouyer s = splbio();
1812 1.40 bouyer drvp->drive_type = ATA_DRIVET_NONE;
1813 1.8 bouyer splx(s);
1814 1.8 bouyer }
1815 1.8 bouyer } else {
1816 1.8 bouyer AHCIDEBUG_PRINT(("ahci_atapi_get_params: ATAPI_IDENTIFY_DEVICE "
1817 1.8 bouyer "failed for drive %s:%d:%d: error 0x%x\n",
1818 1.8 bouyer AHCINAME(ahcic), chp->ch_channel, target,
1819 1.8 bouyer chp->ch_error), DEBUG_PROBE);
1820 1.8 bouyer s = splbio();
1821 1.40 bouyer drvp->drive_type = ATA_DRIVET_NONE;
1822 1.8 bouyer splx(s);
1823 1.8 bouyer }
1824 1.8 bouyer }
1825 1.8 bouyer #endif /* NATAPIBUS */
1826