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