1 1.62 msaitoh /* $NetBSD: mvsata.c,v 1.62 2021/12/05 04:37:11 msaitoh Exp $ */ 2 1.1 kiyohara /* 3 1.1 kiyohara * Copyright (c) 2008 KIYOHARA Takashi 4 1.1 kiyohara * All rights reserved. 5 1.1 kiyohara * 6 1.1 kiyohara * Redistribution and use in source and binary forms, with or without 7 1.1 kiyohara * modification, are permitted provided that the following conditions 8 1.1 kiyohara * are met: 9 1.1 kiyohara * 1. Redistributions of source code must retain the above copyright 10 1.1 kiyohara * notice, this list of conditions and the following disclaimer. 11 1.1 kiyohara * 2. Redistributions in binary form must reproduce the above copyright 12 1.1 kiyohara * notice, this list of conditions and the following disclaimer in the 13 1.1 kiyohara * documentation and/or other materials provided with the distribution. 14 1.1 kiyohara * 15 1.1 kiyohara * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 1.1 kiyohara * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 1.1 kiyohara * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 1.1 kiyohara * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 19 1.1 kiyohara * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20 1.1 kiyohara * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 21 1.1 kiyohara * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 1.1 kiyohara * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 23 1.1 kiyohara * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 24 1.1 kiyohara * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25 1.1 kiyohara * POSSIBILITY OF SUCH DAMAGE. 26 1.1 kiyohara */ 27 1.1 kiyohara 28 1.1 kiyohara #include <sys/cdefs.h> 29 1.62 msaitoh __KERNEL_RCSID(0, "$NetBSD: mvsata.c,v 1.62 2021/12/05 04:37:11 msaitoh Exp $"); 30 1.1 kiyohara 31 1.1 kiyohara #include "opt_mvsata.h" 32 1.1 kiyohara 33 1.1 kiyohara #include <sys/param.h> 34 1.1 kiyohara #include <sys/buf.h> 35 1.1 kiyohara #include <sys/bus.h> 36 1.1 kiyohara #include <sys/cpu.h> 37 1.1 kiyohara #include <sys/device.h> 38 1.1 kiyohara #include <sys/disklabel.h> 39 1.1 kiyohara #include <sys/errno.h> 40 1.1 kiyohara #include <sys/kernel.h> 41 1.1 kiyohara #include <sys/malloc.h> 42 1.1 kiyohara #include <sys/proc.h> 43 1.1 kiyohara 44 1.1 kiyohara #include <machine/vmparam.h> 45 1.1 kiyohara 46 1.1 kiyohara #include <dev/ata/atareg.h> 47 1.1 kiyohara #include <dev/ata/atavar.h> 48 1.1 kiyohara #include <dev/ic/wdcvar.h> 49 1.36 jdolecek #include <dev/ata/satafisvar.h> 50 1.36 jdolecek #include <dev/ata/satafisreg.h> 51 1.29 jakllsch #include <dev/ata/satapmpreg.h> 52 1.1 kiyohara #include <dev/ata/satareg.h> 53 1.1 kiyohara #include <dev/ata/satavar.h> 54 1.1 kiyohara 55 1.1 kiyohara #include <dev/scsipi/scsi_all.h> /* for SCSI status */ 56 1.1 kiyohara 57 1.36 jdolecek #include "atapibus.h" 58 1.36 jdolecek 59 1.36 jdolecek #include <dev/pci/pcidevs.h> /* XXX should not be here */ 60 1.1 kiyohara 61 1.44 jdolecek /* 62 1.44 jdolecek * Nice things to do: 63 1.44 jdolecek * 64 1.44 jdolecek * - MSI/MSI-X support - though on some models MSI actually doesn't work 65 1.44 jdolecek * even when hardware claims to support it, according to FreeBSD/OpenBSD 66 1.44 jdolecek * - move pci-specific code to the pci attach code 67 1.44 jdolecek * - mvsata(4) use 64-bit DMA on hardware which claims to support it 68 1.44 jdolecek * - e.g. AHA1430SA does not really work, crash in mvsata_intr() on boot 69 1.44 jdolecek */ 70 1.44 jdolecek 71 1.1 kiyohara #include <dev/ic/mvsatareg.h> 72 1.1 kiyohara #include <dev/ic/mvsatavar.h> 73 1.1 kiyohara 74 1.1 kiyohara #define MVSATA_DEV(sc) ((sc)->sc_wdcdev.sc_atac.atac_dev) 75 1.1 kiyohara #define MVSATA_DEV2(mvport) ((mvport)->port_ata_channel.ch_atac->atac_dev) 76 1.1 kiyohara 77 1.1 kiyohara #define MVSATA_HC_READ_4(hc, reg) \ 78 1.1 kiyohara bus_space_read_4((hc)->hc_iot, (hc)->hc_ioh, (reg)) 79 1.1 kiyohara #define MVSATA_HC_WRITE_4(hc, reg, val) \ 80 1.1 kiyohara bus_space_write_4((hc)->hc_iot, (hc)->hc_ioh, (reg), (val)) 81 1.1 kiyohara #define MVSATA_EDMA_READ_4(mvport, reg) \ 82 1.1 kiyohara bus_space_read_4((mvport)->port_iot, (mvport)->port_ioh, (reg)) 83 1.1 kiyohara #define MVSATA_EDMA_WRITE_4(mvport, reg, val) \ 84 1.1 kiyohara bus_space_write_4((mvport)->port_iot, (mvport)->port_ioh, (reg), (val)) 85 1.1 kiyohara #define MVSATA_WDC_READ_2(mvport, reg) \ 86 1.24 bouyer bus_space_read_2((mvport)->port_iot, (mvport)->port_ioh, \ 87 1.24 bouyer SHADOW_REG_BLOCK_OFFSET + (reg)) 88 1.1 kiyohara #define MVSATA_WDC_READ_1(mvport, reg) \ 89 1.24 bouyer bus_space_read_1((mvport)->port_iot, (mvport)->port_ioh, \ 90 1.24 bouyer SHADOW_REG_BLOCK_OFFSET + (reg)) 91 1.1 kiyohara #define MVSATA_WDC_WRITE_2(mvport, reg, val) \ 92 1.24 bouyer bus_space_write_2((mvport)->port_iot, (mvport)->port_ioh, \ 93 1.24 bouyer SHADOW_REG_BLOCK_OFFSET + (reg), (val)) 94 1.1 kiyohara #define MVSATA_WDC_WRITE_1(mvport, reg, val) \ 95 1.24 bouyer bus_space_write_1((mvport)->port_iot, (mvport)->port_ioh, \ 96 1.24 bouyer SHADOW_REG_BLOCK_OFFSET + (reg), (val)) 97 1.1 kiyohara 98 1.1 kiyohara #ifdef MVSATA_DEBUG 99 1.36 jdolecek 100 1.36 jdolecek #define DEBUG_INTR 0x01 101 1.36 jdolecek #define DEBUG_XFERS 0x02 102 1.36 jdolecek #define DEBUG_FUNCS 0x08 103 1.36 jdolecek #define DEBUG_PROBE 0x10 104 1.36 jdolecek 105 1.36 jdolecek #define DPRINTF(n,x) if (mvsata_debug & (n)) printf x 106 1.36 jdolecek int mvsata_debug = 0; 107 1.1 kiyohara #else 108 1.36 jdolecek #define DPRINTF(n,x) 109 1.1 kiyohara #endif 110 1.1 kiyohara 111 1.1 kiyohara #define ATA_DELAY 10000 /* 10s for a drive I/O */ 112 1.1 kiyohara #define ATAPI_DELAY 10 /* 10 ms, this is used only before 113 1.1 kiyohara sending a cmd */ 114 1.2 snj #define ATAPI_MODE_DELAY 1000 /* 1s, timeout for SET_FEATURE cmds */ 115 1.1 kiyohara 116 1.47 tsutsui #define MVSATA_MAX_SEGS (MAXPHYS / PAGE_SIZE + 1) 117 1.47 tsutsui #define MVSATA_EPRD_MAX_SIZE (sizeof(struct eprd) * MVSATA_MAX_SEGS) 118 1.1 kiyohara 119 1.1 kiyohara 120 1.32 kiyohara static void mvsata_probe_drive(struct ata_channel *); 121 1.36 jdolecek 122 1.1 kiyohara #ifndef MVSATA_WITHOUTDMA 123 1.43 jdolecek static void mvsata_reset_channel(struct ata_channel *, int); 124 1.56 jdolecek static void mvsata_bio(struct ata_drive_datas *, struct ata_xfer *); 125 1.24 bouyer static void mvsata_reset_drive(struct ata_drive_datas *, int, uint32_t *); 126 1.56 jdolecek static void mvsata_exec_command(struct ata_drive_datas *, struct ata_xfer *); 127 1.1 kiyohara static int mvsata_addref(struct ata_drive_datas *); 128 1.1 kiyohara static void mvsata_delref(struct ata_drive_datas *); 129 1.1 kiyohara static void mvsata_killpending(struct ata_drive_datas *); 130 1.1 kiyohara 131 1.1 kiyohara #if NATAPIBUS > 0 132 1.1 kiyohara static void mvsata_atapibus_attach(struct atabus_softc *); 133 1.1 kiyohara static void mvsata_atapi_scsipi_request(struct scsipi_channel *, 134 1.1 kiyohara scsipi_adapter_req_t, void *); 135 1.1 kiyohara static void mvsata_atapi_minphys(struct buf *); 136 1.1 kiyohara static void mvsata_atapi_probe_device(struct atapibus_softc *, int); 137 1.1 kiyohara static void mvsata_atapi_kill_pending(struct scsipi_periph *); 138 1.1 kiyohara #endif 139 1.1 kiyohara #endif 140 1.1 kiyohara 141 1.1 kiyohara static void mvsata_setup_channel(struct ata_channel *); 142 1.1 kiyohara 143 1.1 kiyohara #ifndef MVSATA_WITHOUTDMA 144 1.36 jdolecek static int mvsata_bio_start(struct ata_channel *, struct ata_xfer *); 145 1.1 kiyohara static int mvsata_bio_intr(struct ata_channel *, struct ata_xfer *, int); 146 1.61 rin static int mvsata_bio_poll(struct ata_channel *, struct ata_xfer *); 147 1.1 kiyohara static void mvsata_bio_kill_xfer(struct ata_channel *, struct ata_xfer *, int); 148 1.1 kiyohara static void mvsata_bio_done(struct ata_channel *, struct ata_xfer *); 149 1.1 kiyohara static int mvsata_bio_ready(struct mvsata_port *, struct ata_bio *, int, 150 1.1 kiyohara int); 151 1.36 jdolecek static int mvsata_wdc_cmd_start(struct ata_channel *, struct ata_xfer *); 152 1.1 kiyohara static int mvsata_wdc_cmd_intr(struct ata_channel *, struct ata_xfer *, int); 153 1.61 rin static int mvsata_wdc_cmd_poll(struct ata_channel *, struct ata_xfer *); 154 1.1 kiyohara static void mvsata_wdc_cmd_kill_xfer(struct ata_channel *, struct ata_xfer *, 155 1.1 kiyohara int); 156 1.1 kiyohara static void mvsata_wdc_cmd_done(struct ata_channel *, struct ata_xfer *); 157 1.1 kiyohara static void mvsata_wdc_cmd_done_end(struct ata_channel *, struct ata_xfer *); 158 1.1 kiyohara #if NATAPIBUS > 0 159 1.36 jdolecek static int mvsata_atapi_start(struct ata_channel *, struct ata_xfer *); 160 1.1 kiyohara static int mvsata_atapi_intr(struct ata_channel *, struct ata_xfer *, int); 161 1.61 rin static int mvsata_atapi_poll(struct ata_channel *, struct ata_xfer *); 162 1.1 kiyohara static void mvsata_atapi_kill_xfer(struct ata_channel *, struct ata_xfer *, 163 1.1 kiyohara int); 164 1.1 kiyohara static void mvsata_atapi_reset(struct ata_channel *, struct ata_xfer *); 165 1.46 jdolecek static void mvsata_atapi_phase_complete(struct ata_xfer *, int); 166 1.1 kiyohara static void mvsata_atapi_done(struct ata_channel *, struct ata_xfer *); 167 1.1 kiyohara static void mvsata_atapi_polldsc(void *); 168 1.1 kiyohara #endif 169 1.1 kiyohara 170 1.36 jdolecek static int mvsata_edma_enqueue(struct mvsata_port *, struct ata_xfer *); 171 1.1 kiyohara static int mvsata_edma_handle(struct mvsata_port *, struct ata_xfer *); 172 1.1 kiyohara static int mvsata_edma_wait(struct mvsata_port *, struct ata_xfer *, int); 173 1.1 kiyohara static void mvsata_edma_rqq_remove(struct mvsata_port *, struct ata_xfer *); 174 1.1 kiyohara #if NATAPIBUS > 0 175 1.36 jdolecek static int mvsata_bdma_init(struct mvsata_port *, struct ata_xfer *); 176 1.1 kiyohara static void mvsata_bdma_start(struct mvsata_port *); 177 1.1 kiyohara #endif 178 1.1 kiyohara #endif 179 1.1 kiyohara 180 1.36 jdolecek static int mvsata_nondma_handle(struct mvsata_port *); 181 1.36 jdolecek 182 1.1 kiyohara static int mvsata_port_init(struct mvsata_hc *, int); 183 1.1 kiyohara static int mvsata_wdc_reg_init(struct mvsata_port *, struct wdc_regs *); 184 1.1 kiyohara #ifndef MVSATA_WITHOUTDMA 185 1.43 jdolecek static void mvsata_channel_recover(struct ata_channel *, int, uint32_t); 186 1.1 kiyohara static void *mvsata_edma_resource_prepare(struct mvsata_port *, bus_dma_tag_t, 187 1.1 kiyohara bus_dmamap_t *, size_t, int); 188 1.1 kiyohara static void mvsata_edma_resource_purge(struct mvsata_port *, bus_dma_tag_t, 189 1.1 kiyohara bus_dmamap_t, void *); 190 1.1 kiyohara static int mvsata_dma_bufload(struct mvsata_port *, int, void *, size_t, int); 191 1.1 kiyohara static inline void mvsata_dma_bufunload(struct mvsata_port *, int, int); 192 1.1 kiyohara #endif 193 1.1 kiyohara 194 1.1 kiyohara static void mvsata_hreset_port(struct mvsata_port *); 195 1.1 kiyohara static void mvsata_reset_port(struct mvsata_port *); 196 1.1 kiyohara static void mvsata_reset_hc(struct mvsata_hc *); 197 1.29 jakllsch static uint32_t mvsata_softreset(struct mvsata_port *, int); 198 1.1 kiyohara #ifndef MVSATA_WITHOUTDMA 199 1.1 kiyohara static void mvsata_edma_reset_qptr(struct mvsata_port *); 200 1.1 kiyohara static inline void mvsata_edma_enable(struct mvsata_port *); 201 1.50 jdolecek static void mvsata_edma_disable(struct mvsata_port *, int, int); 202 1.36 jdolecek static void mvsata_edma_config(struct mvsata_port *, enum mvsata_edmamode); 203 1.1 kiyohara 204 1.36 jdolecek static void mvsata_edma_setup_crqb(struct mvsata_port *, int, 205 1.36 jdolecek struct ata_xfer *); 206 1.1 kiyohara #endif 207 1.1 kiyohara static uint32_t mvsata_read_preamps_gen1(struct mvsata_port *); 208 1.1 kiyohara static void mvsata_fix_phy_gen1(struct mvsata_port *); 209 1.1 kiyohara static void mvsata_devconn_gen1(struct mvsata_port *); 210 1.1 kiyohara 211 1.1 kiyohara static uint32_t mvsata_read_preamps_gen2(struct mvsata_port *); 212 1.1 kiyohara static void mvsata_fix_phy_gen2(struct mvsata_port *); 213 1.1 kiyohara #ifndef MVSATA_WITHOUTDMA 214 1.36 jdolecek static void mvsata_edma_setup_crqb_gen2e(struct mvsata_port *, int, 215 1.36 jdolecek struct ata_xfer *); 216 1.1 kiyohara 217 1.1 kiyohara #ifdef MVSATA_DEBUG 218 1.1 kiyohara static void mvsata_print_crqb(struct mvsata_port *, int); 219 1.1 kiyohara static void mvsata_print_crpb(struct mvsata_port *, int); 220 1.1 kiyohara static void mvsata_print_eprd(struct mvsata_port *, int); 221 1.1 kiyohara #endif 222 1.1 kiyohara 223 1.36 jdolecek static const struct ata_bustype mvsata_ata_bustype = { 224 1.58 skrll .bustype_type = SCSIPI_BUSTYPE_ATA, 225 1.58 skrll .ata_bio = mvsata_bio, 226 1.58 skrll .ata_reset_drive = mvsata_reset_drive, 227 1.58 skrll .ata_reset_channel = mvsata_reset_channel, 228 1.58 skrll .ata_exec_command = mvsata_exec_command, 229 1.58 skrll .ata_get_params = ata_get_params, 230 1.58 skrll .ata_addref = mvsata_addref, 231 1.58 skrll .ata_delref = mvsata_delref, 232 1.58 skrll .ata_killpending = mvsata_killpending, 233 1.58 skrll .ata_recovery = mvsata_channel_recover, 234 1.1 kiyohara }; 235 1.1 kiyohara 236 1.1 kiyohara #if NATAPIBUS > 0 237 1.1 kiyohara static const struct scsipi_bustype mvsata_atapi_bustype = { 238 1.53 riastrad .bustype_type = SCSIPI_BUSTYPE_ATAPI, 239 1.53 riastrad .bustype_cmd = atapi_scsipi_cmd, 240 1.53 riastrad .bustype_interpret_sense = atapi_interpret_sense, 241 1.53 riastrad .bustype_printaddr = atapi_print_addr, 242 1.53 riastrad .bustype_kill_pending = mvsata_atapi_kill_pending, 243 1.53 riastrad .bustype_async_event_xfer_mode = NULL, 244 1.1 kiyohara }; 245 1.1 kiyohara #endif /* NATAPIBUS */ 246 1.1 kiyohara #endif 247 1.1 kiyohara 248 1.29 jakllsch static void 249 1.29 jakllsch mvsata_pmp_select(struct mvsata_port *mvport, int pmpport) 250 1.29 jakllsch { 251 1.29 jakllsch uint32_t ifctl; 252 1.29 jakllsch 253 1.29 jakllsch KASSERT(pmpport < PMP_MAX_DRIVES); 254 1.29 jakllsch #if defined(DIAGNOSTIC) || defined(MVSATA_DEBUG) 255 1.29 jakllsch if ((MVSATA_EDMA_READ_4(mvport, EDMA_CMD) & EDMA_CMD_EENEDMA) != 0) { 256 1.29 jakllsch panic("EDMA enabled"); 257 1.29 jakllsch } 258 1.29 jakllsch #endif 259 1.29 jakllsch 260 1.29 jakllsch ifctl = MVSATA_EDMA_READ_4(mvport, SATA_SATAICTL); 261 1.29 jakllsch ifctl &= ~0xf; 262 1.29 jakllsch ifctl |= pmpport; 263 1.29 jakllsch MVSATA_EDMA_WRITE_4(mvport, SATA_SATAICTL, ifctl); 264 1.29 jakllsch } 265 1.1 kiyohara 266 1.1 kiyohara int 267 1.41 jdolecek mvsata_attach(struct mvsata_softc *sc, const struct mvsata_product *product, 268 1.1 kiyohara int (*mvsata_sreset)(struct mvsata_softc *), 269 1.1 kiyohara int (*mvsata_misc_reset)(struct mvsata_softc *), 270 1.1 kiyohara int read_pre_amps) 271 1.1 kiyohara { 272 1.1 kiyohara struct mvsata_hc *mvhc; 273 1.1 kiyohara struct mvsata_port *mvport; 274 1.1 kiyohara uint32_t (*read_preamps)(struct mvsata_port *) = NULL; 275 1.1 kiyohara void (*_fix_phy)(struct mvsata_port *) = NULL; 276 1.1 kiyohara #ifndef MVSATA_WITHOUTDMA 277 1.1 kiyohara void (*edma_setup_crqb) 278 1.36 jdolecek (struct mvsata_port *, int, struct ata_xfer *) = NULL; 279 1.1 kiyohara #endif 280 1.5 kiyohara int hc, port, channel; 281 1.1 kiyohara 282 1.1 kiyohara aprint_normal_dev(MVSATA_DEV(sc), "Gen%s, %dhc, %dport/hc\n", 283 1.1 kiyohara (product->generation == gen1) ? "I" : 284 1.1 kiyohara ((product->generation == gen2) ? "II" : "IIe"), 285 1.1 kiyohara product->hc, product->port); 286 1.1 kiyohara 287 1.1 kiyohara 288 1.1 kiyohara switch (product->generation) { 289 1.1 kiyohara case gen1: 290 1.1 kiyohara mvsata_sreset = NULL; 291 1.1 kiyohara read_pre_amps = 1; /* MUST */ 292 1.1 kiyohara read_preamps = mvsata_read_preamps_gen1; 293 1.1 kiyohara _fix_phy = mvsata_fix_phy_gen1; 294 1.1 kiyohara #ifndef MVSATA_WITHOUTDMA 295 1.1 kiyohara edma_setup_crqb = mvsata_edma_setup_crqb; 296 1.1 kiyohara #endif 297 1.1 kiyohara break; 298 1.1 kiyohara 299 1.1 kiyohara case gen2: 300 1.1 kiyohara read_preamps = mvsata_read_preamps_gen2; 301 1.1 kiyohara _fix_phy = mvsata_fix_phy_gen2; 302 1.1 kiyohara #ifndef MVSATA_WITHOUTDMA 303 1.1 kiyohara edma_setup_crqb = mvsata_edma_setup_crqb; 304 1.1 kiyohara #endif 305 1.1 kiyohara break; 306 1.1 kiyohara 307 1.1 kiyohara case gen2e: 308 1.1 kiyohara read_preamps = mvsata_read_preamps_gen2; 309 1.1 kiyohara _fix_phy = mvsata_fix_phy_gen2; 310 1.1 kiyohara #ifndef MVSATA_WITHOUTDMA 311 1.1 kiyohara edma_setup_crqb = mvsata_edma_setup_crqb_gen2e; 312 1.36 jdolecek sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_NCQ; 313 1.1 kiyohara #endif 314 1.1 kiyohara break; 315 1.1 kiyohara } 316 1.1 kiyohara 317 1.5 kiyohara sc->sc_gen = product->generation; 318 1.5 kiyohara sc->sc_hc = product->hc; 319 1.5 kiyohara sc->sc_port = product->port; 320 1.5 kiyohara sc->sc_flags = product->flags; 321 1.1 kiyohara 322 1.1 kiyohara #ifdef MVSATA_WITHOUTDMA 323 1.1 kiyohara sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_DATA16; 324 1.1 kiyohara #else 325 1.3 mbalmer sc->sc_edma_setup_crqb = edma_setup_crqb; 326 1.1 kiyohara sc->sc_wdcdev.sc_atac.atac_cap |= 327 1.1 kiyohara (ATAC_CAP_DATA16 | ATAC_CAP_DMA | ATAC_CAP_UDMA); 328 1.1 kiyohara #endif 329 1.1 kiyohara sc->sc_wdcdev.sc_atac.atac_pio_cap = 4; 330 1.6 kiyohara #ifdef MVSATA_WITHOUTDMA 331 1.1 kiyohara sc->sc_wdcdev.sc_atac.atac_dma_cap = 0; 332 1.1 kiyohara sc->sc_wdcdev.sc_atac.atac_udma_cap = 0; 333 1.1 kiyohara #else 334 1.1 kiyohara sc->sc_wdcdev.sc_atac.atac_dma_cap = 2; 335 1.1 kiyohara sc->sc_wdcdev.sc_atac.atac_udma_cap = 6; 336 1.1 kiyohara #endif 337 1.1 kiyohara sc->sc_wdcdev.sc_atac.atac_channels = sc->sc_ata_channels; 338 1.1 kiyohara sc->sc_wdcdev.sc_atac.atac_nchannels = sc->sc_hc * sc->sc_port; 339 1.1 kiyohara #ifndef MVSATA_WITHOUTDMA 340 1.1 kiyohara sc->sc_wdcdev.sc_atac.atac_bustype_ata = &mvsata_ata_bustype; 341 1.1 kiyohara #if NATAPIBUS > 0 342 1.1 kiyohara sc->sc_wdcdev.sc_atac.atac_atapibus_attach = mvsata_atapibus_attach; 343 1.1 kiyohara #endif 344 1.1 kiyohara #endif 345 1.24 bouyer sc->sc_wdcdev.wdc_maxdrives = 1; /* SATA is always 1 drive */ 346 1.29 jakllsch sc->sc_wdcdev.sc_atac.atac_probe = mvsata_probe_drive; 347 1.1 kiyohara sc->sc_wdcdev.sc_atac.atac_set_modes = mvsata_setup_channel; 348 1.1 kiyohara 349 1.1 kiyohara sc->sc_wdc_regs = 350 1.1 kiyohara malloc(sizeof(struct wdc_regs) * product->hc * product->port, 351 1.49 chs M_DEVBUF, M_WAITOK); 352 1.1 kiyohara sc->sc_wdcdev.regs = sc->sc_wdc_regs; 353 1.1 kiyohara 354 1.1 kiyohara for (hc = 0; hc < sc->sc_hc; hc++) { 355 1.1 kiyohara mvhc = &sc->sc_hcs[hc]; 356 1.1 kiyohara mvhc->hc = hc; 357 1.1 kiyohara mvhc->hc_sc = sc; 358 1.1 kiyohara mvhc->hc_iot = sc->sc_iot; 359 1.1 kiyohara if (bus_space_subregion(sc->sc_iot, sc->sc_ioh, 360 1.1 kiyohara hc * SATAHC_REGISTER_SIZE, SATAHC_REGISTER_SIZE, 361 1.1 kiyohara &mvhc->hc_ioh)) { 362 1.1 kiyohara aprint_error_dev(MVSATA_DEV(sc), 363 1.1 kiyohara "can't subregion SATAHC %d registers\n", hc); 364 1.1 kiyohara continue; 365 1.1 kiyohara } 366 1.1 kiyohara 367 1.1 kiyohara for (port = 0; port < sc->sc_port; port++) 368 1.1 kiyohara if (mvsata_port_init(mvhc, port) == 0) { 369 1.1 kiyohara int pre_amps; 370 1.1 kiyohara 371 1.1 kiyohara mvport = mvhc->hc_ports[port]; 372 1.1 kiyohara pre_amps = read_pre_amps ? 373 1.1 kiyohara read_preamps(mvport) : 0x00000720; 374 1.1 kiyohara mvport->_fix_phy_param.pre_amps = pre_amps; 375 1.1 kiyohara mvport->_fix_phy_param._fix_phy = _fix_phy; 376 1.1 kiyohara 377 1.1 kiyohara if (!mvsata_sreset) 378 1.1 kiyohara mvsata_reset_port(mvport); 379 1.1 kiyohara } 380 1.1 kiyohara 381 1.1 kiyohara if (!mvsata_sreset) 382 1.1 kiyohara mvsata_reset_hc(mvhc); 383 1.1 kiyohara } 384 1.1 kiyohara if (mvsata_sreset) 385 1.1 kiyohara mvsata_sreset(sc); 386 1.1 kiyohara 387 1.1 kiyohara if (mvsata_misc_reset) 388 1.1 kiyohara mvsata_misc_reset(sc); 389 1.1 kiyohara 390 1.1 kiyohara for (hc = 0; hc < sc->sc_hc; hc++) 391 1.1 kiyohara for (port = 0; port < sc->sc_port; port++) { 392 1.1 kiyohara mvport = sc->sc_hcs[hc].hc_ports[port]; 393 1.1 kiyohara if (mvport == NULL) 394 1.1 kiyohara continue; 395 1.1 kiyohara if (mvsata_sreset) 396 1.1 kiyohara mvport->_fix_phy_param._fix_phy(mvport); 397 1.1 kiyohara } 398 1.1 kiyohara for (channel = 0; channel < sc->sc_hc * sc->sc_port; channel++) 399 1.1 kiyohara wdcattach(sc->sc_ata_channels[channel]); 400 1.1 kiyohara 401 1.1 kiyohara return 0; 402 1.1 kiyohara } 403 1.1 kiyohara 404 1.1 kiyohara int 405 1.1 kiyohara mvsata_intr(struct mvsata_hc *mvhc) 406 1.1 kiyohara { 407 1.1 kiyohara struct mvsata_softc *sc = mvhc->hc_sc; 408 1.1 kiyohara struct mvsata_port *mvport; 409 1.1 kiyohara uint32_t cause; 410 1.1 kiyohara int port, handled = 0; 411 1.1 kiyohara 412 1.1 kiyohara cause = MVSATA_HC_READ_4(mvhc, SATAHC_IC); 413 1.1 kiyohara 414 1.36 jdolecek DPRINTF(DEBUG_INTR, ("%s:%d: mvsata_intr: cause=0x%08x\n", 415 1.1 kiyohara device_xname(MVSATA_DEV(sc)), mvhc->hc, cause)); 416 1.1 kiyohara 417 1.1 kiyohara if (cause & SATAHC_IC_SAINTCOAL) 418 1.1 kiyohara MVSATA_HC_WRITE_4(mvhc, SATAHC_IC, ~SATAHC_IC_SAINTCOAL); 419 1.1 kiyohara cause &= ~SATAHC_IC_SAINTCOAL; 420 1.36 jdolecek 421 1.1 kiyohara for (port = 0; port < sc->sc_port; port++) { 422 1.1 kiyohara mvport = mvhc->hc_ports[port]; 423 1.1 kiyohara 424 1.1 kiyohara if (cause & SATAHC_IC_DONE(port)) { 425 1.1 kiyohara #ifndef MVSATA_WITHOUTDMA 426 1.1 kiyohara handled = mvsata_edma_handle(mvport, NULL); 427 1.1 kiyohara #endif 428 1.1 kiyohara MVSATA_HC_WRITE_4(mvhc, SATAHC_IC, 429 1.1 kiyohara ~SATAHC_IC_DONE(port)); 430 1.1 kiyohara } 431 1.1 kiyohara 432 1.1 kiyohara if (cause & SATAHC_IC_SADEVINTERRUPT(port)) { 433 1.36 jdolecek (void) mvsata_nondma_handle(mvport); 434 1.1 kiyohara MVSATA_HC_WRITE_4(mvhc, SATAHC_IC, 435 1.1 kiyohara ~SATAHC_IC_SADEVINTERRUPT(port)); 436 1.1 kiyohara handled = 1; 437 1.1 kiyohara } 438 1.1 kiyohara } 439 1.1 kiyohara 440 1.1 kiyohara return handled; 441 1.1 kiyohara } 442 1.1 kiyohara 443 1.36 jdolecek static int 444 1.36 jdolecek mvsata_nondma_handle(struct mvsata_port *mvport) 445 1.36 jdolecek { 446 1.36 jdolecek struct ata_channel *chp = &mvport->port_ata_channel; 447 1.36 jdolecek struct ata_xfer *xfer; 448 1.36 jdolecek int ret; 449 1.36 jdolecek 450 1.36 jdolecek /* 451 1.36 jdolecek * The chip doesn't support several pending non-DMA commands, 452 1.36 jdolecek * and the ata middle layer never issues several non-NCQ commands, 453 1.36 jdolecek * so there must be exactly one active command at this moment. 454 1.36 jdolecek */ 455 1.36 jdolecek xfer = ata_queue_get_active_xfer(chp); 456 1.36 jdolecek if (xfer == NULL) { 457 1.36 jdolecek /* Can happen after error recovery, ignore */ 458 1.36 jdolecek DPRINTF(DEBUG_FUNCS|DEBUG_XFERS, 459 1.36 jdolecek ("%s:%d: %s: intr without xfer\n", 460 1.36 jdolecek device_xname(MVSATA_DEV2(mvport)), chp->ch_channel, 461 1.36 jdolecek __func__)); 462 1.36 jdolecek return 0; 463 1.36 jdolecek } 464 1.36 jdolecek 465 1.43 jdolecek ret = xfer->ops->c_intr(chp, xfer, 1); 466 1.36 jdolecek return (ret); 467 1.36 jdolecek } 468 1.36 jdolecek 469 1.1 kiyohara int 470 1.1 kiyohara mvsata_error(struct mvsata_port *mvport) 471 1.1 kiyohara { 472 1.1 kiyohara struct mvsata_softc *sc = device_private(MVSATA_DEV2(mvport)); 473 1.1 kiyohara uint32_t cause; 474 1.1 kiyohara 475 1.1 kiyohara cause = MVSATA_EDMA_READ_4(mvport, EDMA_IEC); 476 1.29 jakllsch /* 477 1.62 msaitoh * We must ack SATA_SE and SATA_FISIC before acking corresponding bits 478 1.29 jakllsch * in EDMA_IEC. 479 1.29 jakllsch */ 480 1.29 jakllsch if (cause & EDMA_IE_SERRINT) { 481 1.29 jakllsch MVSATA_EDMA_WRITE_4(mvport, SATA_SE, 482 1.29 jakllsch MVSATA_EDMA_READ_4(mvport, SATA_SEIM)); 483 1.29 jakllsch } 484 1.29 jakllsch if (cause & EDMA_IE_ETRANSINT) { 485 1.29 jakllsch MVSATA_EDMA_WRITE_4(mvport, SATA_FISIC, 486 1.29 jakllsch ~MVSATA_EDMA_READ_4(mvport, SATA_FISIM)); 487 1.29 jakllsch } 488 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_IEC, ~cause); 489 1.1 kiyohara 490 1.36 jdolecek DPRINTF(DEBUG_INTR, ("%s:%d:%d:" 491 1.1 kiyohara " mvsata_error: cause=0x%08x, mask=0x%08x, status=0x%08x\n", 492 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), mvport->port_hc->hc, 493 1.1 kiyohara mvport->port, cause, MVSATA_EDMA_READ_4(mvport, EDMA_IEM), 494 1.1 kiyohara MVSATA_EDMA_READ_4(mvport, EDMA_S))); 495 1.1 kiyohara 496 1.1 kiyohara cause &= MVSATA_EDMA_READ_4(mvport, EDMA_IEM); 497 1.1 kiyohara if (!cause) 498 1.1 kiyohara return 0; 499 1.1 kiyohara 500 1.29 jakllsch if (cause & EDMA_IE_EDEVDIS) { 501 1.1 kiyohara aprint_normal("%s:%d:%d: device disconnect\n", 502 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), 503 1.1 kiyohara mvport->port_hc->hc, mvport->port); 504 1.29 jakllsch } 505 1.1 kiyohara if (cause & EDMA_IE_EDEVCON) { 506 1.1 kiyohara if (sc->sc_gen == gen1) 507 1.1 kiyohara mvsata_devconn_gen1(mvport); 508 1.1 kiyohara 509 1.36 jdolecek DPRINTF(DEBUG_INTR, (" device connected\n")); 510 1.1 kiyohara } 511 1.36 jdolecek 512 1.1 kiyohara #ifndef MVSATA_WITHOUTDMA 513 1.1 kiyohara if ((sc->sc_gen == gen1 && cause & EDMA_IE_ETRANSINT) || 514 1.1 kiyohara (sc->sc_gen != gen1 && cause & EDMA_IE_ESELFDIS)) { 515 1.36 jdolecek switch (mvport->port_edmamode_curr) { 516 1.1 kiyohara case dma: 517 1.1 kiyohara case queued: 518 1.1 kiyohara case ncq: 519 1.1 kiyohara mvsata_edma_reset_qptr(mvport); 520 1.1 kiyohara mvsata_edma_enable(mvport); 521 1.1 kiyohara if (cause & EDMA_IE_EDEVERR) 522 1.1 kiyohara break; 523 1.1 kiyohara 524 1.1 kiyohara /* FALLTHROUGH */ 525 1.1 kiyohara 526 1.1 kiyohara case nodma: 527 1.1 kiyohara default: 528 1.51 jdolecek DPRINTF(DEBUG_INTR, 529 1.51 jdolecek ("%s:%d:%d: EDMA self disable happen 0x%x\n", 530 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), 531 1.51 jdolecek mvport->port_hc->hc, mvport->port, cause)); 532 1.1 kiyohara break; 533 1.1 kiyohara } 534 1.1 kiyohara } 535 1.1 kiyohara #endif 536 1.1 kiyohara if (cause & EDMA_IE_ETRANSINT) { 537 1.1 kiyohara /* hot plug the Port Multiplier */ 538 1.1 kiyohara aprint_normal("%s:%d:%d: detect Port Multiplier?\n", 539 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), 540 1.1 kiyohara mvport->port_hc->hc, mvport->port); 541 1.1 kiyohara } 542 1.36 jdolecek if (cause & EDMA_IE_EDEVERR) { 543 1.43 jdolecek struct ata_channel *chp = &mvport->port_ata_channel; 544 1.43 jdolecek 545 1.36 jdolecek aprint_error("%s:%d:%d: device error, recovering\n", 546 1.36 jdolecek device_xname(MVSATA_DEV2(mvport)), 547 1.36 jdolecek mvport->port_hc->hc, mvport->port); 548 1.36 jdolecek 549 1.43 jdolecek ata_channel_lock(chp); 550 1.43 jdolecek ata_thread_run(chp, 0, ATACH_TH_RECOVERY, 551 1.43 jdolecek ATACH_ERR_ST(0, WDCS_ERR)); 552 1.43 jdolecek ata_channel_unlock(chp); 553 1.36 jdolecek } 554 1.1 kiyohara 555 1.29 jakllsch return 1; 556 1.1 kiyohara } 557 1.1 kiyohara 558 1.43 jdolecek #ifndef MVSATA_WITHOUTDMA 559 1.36 jdolecek static void 560 1.43 jdolecek mvsata_channel_recover(struct ata_channel *chp, int flags, uint32_t tfd) 561 1.36 jdolecek { 562 1.43 jdolecek struct mvsata_port * const mvport = (struct mvsata_port *)chp; 563 1.43 jdolecek int drive; 564 1.36 jdolecek 565 1.43 jdolecek ata_channel_lock_owned(chp); 566 1.36 jdolecek 567 1.36 jdolecek if (chp->ch_ndrives > PMP_PORT_CTL) { 568 1.36 jdolecek /* Get PM port number for the device in error. This device 569 1.36 jdolecek * doesn't seem to have dedicated register for this, so just 570 1.36 jdolecek * assume last selected port was the one. */ 571 1.36 jdolecek /* XXX FIS-based switching */ 572 1.36 jdolecek drive = MVSATA_EDMA_READ_4(mvport, SATA_SATAICTL) & 0xf; 573 1.36 jdolecek } else 574 1.36 jdolecek drive = 0; 575 1.36 jdolecek 576 1.36 jdolecek /* 577 1.36 jdolecek * Controller doesn't need any special action. Simply execute 578 1.36 jdolecek * READ LOG EXT for NCQ to unblock device processing, then continue 579 1.36 jdolecek * as if nothing happened. 580 1.36 jdolecek */ 581 1.36 jdolecek 582 1.43 jdolecek ata_recovery_resume(chp, drive, tfd, AT_POLL); 583 1.36 jdolecek 584 1.36 jdolecek /* Drive unblocked, back to normal operation */ 585 1.43 jdolecek return; 586 1.36 jdolecek } 587 1.43 jdolecek #endif /* !MVSATA_WITHOUTDMA */ 588 1.1 kiyohara 589 1.1 kiyohara /* 590 1.1 kiyohara * ATA callback entry points 591 1.1 kiyohara */ 592 1.1 kiyohara 593 1.29 jakllsch static void 594 1.29 jakllsch mvsata_probe_drive(struct ata_channel *chp) 595 1.29 jakllsch { 596 1.29 jakllsch struct mvsata_port * const mvport = (struct mvsata_port *)chp; 597 1.29 jakllsch uint32_t sstat, sig; 598 1.29 jakllsch 599 1.36 jdolecek ata_channel_lock(chp); 600 1.36 jdolecek 601 1.29 jakllsch sstat = sata_reset_interface(chp, mvport->port_iot, 602 1.30 bouyer mvport->port_sata_scontrol, mvport->port_sata_sstatus, AT_WAIT); 603 1.29 jakllsch switch (sstat) { 604 1.29 jakllsch case SStatus_DET_DEV: 605 1.29 jakllsch mvsata_pmp_select(mvport, PMP_PORT_CTL); 606 1.29 jakllsch sig = mvsata_softreset(mvport, AT_WAIT); 607 1.29 jakllsch sata_interpret_sig(chp, 0, sig); 608 1.29 jakllsch break; 609 1.29 jakllsch default: 610 1.29 jakllsch break; 611 1.29 jakllsch } 612 1.36 jdolecek 613 1.36 jdolecek ata_channel_unlock(chp); 614 1.29 jakllsch } 615 1.29 jakllsch 616 1.1 kiyohara #ifndef MVSATA_WITHOUTDMA 617 1.1 kiyohara static void 618 1.24 bouyer mvsata_reset_drive(struct ata_drive_datas *drvp, int flags, uint32_t *sigp) 619 1.1 kiyohara { 620 1.1 kiyohara struct ata_channel *chp = drvp->chnl_softc; 621 1.1 kiyohara struct mvsata_port *mvport = (struct mvsata_port *)chp; 622 1.1 kiyohara uint32_t edma_c; 623 1.29 jakllsch uint32_t sig; 624 1.24 bouyer 625 1.43 jdolecek ata_channel_lock_owned(chp); 626 1.36 jdolecek 627 1.1 kiyohara edma_c = MVSATA_EDMA_READ_4(mvport, EDMA_CMD); 628 1.1 kiyohara 629 1.36 jdolecek DPRINTF(DEBUG_FUNCS, 630 1.36 jdolecek ("%s:%d: mvsata_reset_drive: drive=%d (EDMA %sactive)\n", 631 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), chp->ch_channel, drvp->drive, 632 1.1 kiyohara (edma_c & EDMA_CMD_EENEDMA) ? "" : "not ")); 633 1.1 kiyohara 634 1.1 kiyohara if (edma_c & EDMA_CMD_EENEDMA) 635 1.36 jdolecek mvsata_edma_disable(mvport, 10000, flags); 636 1.1 kiyohara 637 1.29 jakllsch mvsata_pmp_select(mvport, drvp->drive); 638 1.29 jakllsch 639 1.36 jdolecek sig = mvsata_softreset(mvport, flags); 640 1.29 jakllsch 641 1.29 jakllsch if (sigp) 642 1.29 jakllsch *sigp = sig; 643 1.1 kiyohara 644 1.1 kiyohara if (edma_c & EDMA_CMD_EENEDMA) { 645 1.1 kiyohara mvsata_edma_reset_qptr(mvport); 646 1.1 kiyohara mvsata_edma_enable(mvport); 647 1.1 kiyohara } 648 1.1 kiyohara } 649 1.1 kiyohara 650 1.1 kiyohara static void 651 1.1 kiyohara mvsata_reset_channel(struct ata_channel *chp, int flags) 652 1.1 kiyohara { 653 1.1 kiyohara struct mvsata_port *mvport = (struct mvsata_port *)chp; 654 1.1 kiyohara struct mvsata_softc *sc = device_private(MVSATA_DEV2(mvport)); 655 1.1 kiyohara uint32_t sstat, ctrl; 656 1.1 kiyohara 657 1.36 jdolecek DPRINTF(DEBUG_FUNCS, ("%s: mvsata_reset_channel: channel=%d\n", 658 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), chp->ch_channel)); 659 1.1 kiyohara 660 1.43 jdolecek ata_channel_lock_owned(chp); 661 1.36 jdolecek 662 1.1 kiyohara mvsata_hreset_port(mvport); 663 1.1 kiyohara sstat = sata_reset_interface(chp, mvport->port_iot, 664 1.30 bouyer mvport->port_sata_scontrol, mvport->port_sata_sstatus, flags); 665 1.1 kiyohara 666 1.1 kiyohara if (flags & AT_WAIT && sstat == SStatus_DET_DEV_NE && 667 1.1 kiyohara sc->sc_gen != gen1) { 668 1.1 kiyohara /* Downgrade to GenI */ 669 1.1 kiyohara const uint32_t val = SControl_IPM_NONE | SControl_SPD_ANY | 670 1.1 kiyohara SControl_DET_DISABLE; 671 1.1 kiyohara 672 1.54 macallan bus_space_write_4(mvport->port_iot, 673 1.54 macallan mvport->port_sata_scontrol, 0, val); 674 1.1 kiyohara 675 1.1 kiyohara ctrl = MVSATA_EDMA_READ_4(mvport, SATA_SATAICFG); 676 1.1 kiyohara ctrl &= ~(1 << 17); /* Disable GenII */ 677 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, SATA_SATAICFG, ctrl); 678 1.1 kiyohara 679 1.1 kiyohara mvsata_hreset_port(mvport); 680 1.1 kiyohara sata_reset_interface(chp, mvport->port_iot, 681 1.30 bouyer mvport->port_sata_scontrol, mvport->port_sata_sstatus, 682 1.30 bouyer flags); 683 1.1 kiyohara } 684 1.1 kiyohara 685 1.36 jdolecek ata_kill_active(chp, KILL_RESET, flags); 686 1.1 kiyohara 687 1.36 jdolecek mvsata_edma_config(mvport, mvport->port_edmamode_curr); 688 1.1 kiyohara mvsata_edma_reset_qptr(mvport); 689 1.1 kiyohara mvsata_edma_enable(mvport); 690 1.1 kiyohara } 691 1.1 kiyohara 692 1.1 kiyohara static int 693 1.1 kiyohara mvsata_addref(struct ata_drive_datas *drvp) 694 1.1 kiyohara { 695 1.1 kiyohara 696 1.1 kiyohara return 0; 697 1.1 kiyohara } 698 1.1 kiyohara 699 1.1 kiyohara static void 700 1.1 kiyohara mvsata_delref(struct ata_drive_datas *drvp) 701 1.1 kiyohara { 702 1.1 kiyohara 703 1.1 kiyohara return; 704 1.1 kiyohara } 705 1.1 kiyohara 706 1.1 kiyohara static void 707 1.1 kiyohara mvsata_killpending(struct ata_drive_datas *drvp) 708 1.1 kiyohara { 709 1.1 kiyohara 710 1.1 kiyohara return; 711 1.1 kiyohara } 712 1.1 kiyohara 713 1.1 kiyohara #if NATAPIBUS > 0 714 1.1 kiyohara static void 715 1.1 kiyohara mvsata_atapibus_attach(struct atabus_softc *ata_sc) 716 1.1 kiyohara { 717 1.1 kiyohara struct ata_channel *chp = ata_sc->sc_chan; 718 1.1 kiyohara struct atac_softc *atac = chp->ch_atac; 719 1.1 kiyohara struct scsipi_adapter *adapt = &atac->atac_atapi_adapter._generic; 720 1.1 kiyohara struct scsipi_channel *chan = &chp->ch_atapi_channel; 721 1.1 kiyohara 722 1.1 kiyohara /* 723 1.1 kiyohara * Fill in the scsipi_adapter. 724 1.1 kiyohara */ 725 1.1 kiyohara adapt->adapt_dev = atac->atac_dev; 726 1.1 kiyohara adapt->adapt_nchannels = atac->atac_nchannels; 727 1.1 kiyohara adapt->adapt_request = mvsata_atapi_scsipi_request; 728 1.1 kiyohara adapt->adapt_minphys = mvsata_atapi_minphys; 729 1.1 kiyohara atac->atac_atapi_adapter.atapi_probe_device = mvsata_atapi_probe_device; 730 1.1 kiyohara 731 1.1 kiyohara /* 732 1.1 kiyohara * Fill in the scsipi_channel. 733 1.1 kiyohara */ 734 1.1 kiyohara memset(chan, 0, sizeof(*chan)); 735 1.1 kiyohara chan->chan_adapter = adapt; 736 1.1 kiyohara chan->chan_bustype = &mvsata_atapi_bustype; 737 1.1 kiyohara chan->chan_channel = chp->ch_channel; 738 1.1 kiyohara chan->chan_flags = SCSIPI_CHAN_OPENINGS; 739 1.1 kiyohara chan->chan_openings = 1; 740 1.1 kiyohara chan->chan_max_periph = 1; 741 1.1 kiyohara chan->chan_ntargets = 1; 742 1.1 kiyohara chan->chan_nluns = 1; 743 1.1 kiyohara 744 1.59 thorpej chp->atapibus = config_found(ata_sc->sc_dev, chan, atapiprint, 745 1.60 thorpej CFARGS(.iattr = "atapi")); 746 1.1 kiyohara } 747 1.1 kiyohara 748 1.1 kiyohara static void 749 1.1 kiyohara mvsata_atapi_minphys(struct buf *bp) 750 1.1 kiyohara { 751 1.1 kiyohara 752 1.1 kiyohara if (bp->b_bcount > MAXPHYS) 753 1.1 kiyohara bp->b_bcount = MAXPHYS; 754 1.1 kiyohara minphys(bp); 755 1.1 kiyohara } 756 1.1 kiyohara 757 1.1 kiyohara static void 758 1.1 kiyohara mvsata_atapi_probe_device(struct atapibus_softc *sc, int target) 759 1.1 kiyohara { 760 1.1 kiyohara struct scsipi_channel *chan = sc->sc_channel; 761 1.1 kiyohara struct scsipi_periph *periph; 762 1.1 kiyohara struct ataparams ids; 763 1.1 kiyohara struct ataparams *id = &ids; 764 1.1 kiyohara struct mvsata_softc *mvc = 765 1.1 kiyohara device_private(chan->chan_adapter->adapt_dev); 766 1.1 kiyohara struct atac_softc *atac = &mvc->sc_wdcdev.sc_atac; 767 1.1 kiyohara struct ata_channel *chp = atac->atac_channels[chan->chan_channel]; 768 1.1 kiyohara struct ata_drive_datas *drvp = &chp->ch_drive[target]; 769 1.1 kiyohara struct scsipibus_attach_args sa; 770 1.1 kiyohara char serial_number[21], model[41], firmware_revision[9]; 771 1.1 kiyohara int s; 772 1.1 kiyohara 773 1.1 kiyohara /* skip if already attached */ 774 1.1 kiyohara if (scsipi_lookup_periph(chan, target, 0) != NULL) 775 1.1 kiyohara return; 776 1.1 kiyohara 777 1.1 kiyohara /* if no ATAPI device detected at attach time, skip */ 778 1.24 bouyer if (drvp->drive_type != ATA_DRIVET_ATAPI) { 779 1.36 jdolecek DPRINTF(DEBUG_PROBE, ("%s:%d: mvsata_atapi_probe_device:" 780 1.1 kiyohara " drive %d not present\n", 781 1.1 kiyohara device_xname(atac->atac_dev), chp->ch_channel, target)); 782 1.1 kiyohara return; 783 1.1 kiyohara } 784 1.1 kiyohara 785 1.1 kiyohara /* Some ATAPI devices need a bit more time after software reset. */ 786 1.1 kiyohara delay(5000); 787 1.1 kiyohara if (ata_get_params(drvp, AT_WAIT, id) == 0) { 788 1.1 kiyohara #ifdef ATAPI_DEBUG_PROBE 789 1.38 jdolecek printf("%s drive %d: cmdsz 0x%x drqtype 0x%x\n", 790 1.38 jdolecek device_xname(sc->sc_dev), target, 791 1.1 kiyohara id->atap_config & ATAPI_CFG_CMD_MASK, 792 1.1 kiyohara id->atap_config & ATAPI_CFG_DRQ_MASK); 793 1.1 kiyohara #endif 794 1.49 chs periph = scsipi_alloc_periph(M_WAITOK); 795 1.1 kiyohara periph->periph_dev = NULL; 796 1.1 kiyohara periph->periph_channel = chan; 797 1.1 kiyohara periph->periph_switch = &atapi_probe_periphsw; 798 1.1 kiyohara periph->periph_target = target; 799 1.1 kiyohara periph->periph_lun = 0; 800 1.1 kiyohara periph->periph_quirks = PQUIRK_ONLYBIG; 801 1.1 kiyohara 802 1.1 kiyohara #ifdef SCSIPI_DEBUG 803 1.1 kiyohara if (SCSIPI_DEBUG_TYPE == SCSIPI_BUSTYPE_ATAPI && 804 1.1 kiyohara SCSIPI_DEBUG_TARGET == target) 805 1.1 kiyohara periph->periph_dbflags |= SCSIPI_DEBUG_FLAGS; 806 1.1 kiyohara #endif 807 1.1 kiyohara periph->periph_type = ATAPI_CFG_TYPE(id->atap_config); 808 1.1 kiyohara if (id->atap_config & ATAPI_CFG_REMOV) 809 1.1 kiyohara periph->periph_flags |= PERIPH_REMOVABLE; 810 1.1 kiyohara if (periph->periph_type == T_SEQUENTIAL) { 811 1.1 kiyohara s = splbio(); 812 1.24 bouyer drvp->drive_flags |= ATA_DRIVE_ATAPIDSCW; 813 1.1 kiyohara splx(s); 814 1.1 kiyohara } 815 1.1 kiyohara 816 1.1 kiyohara sa.sa_periph = periph; 817 1.1 kiyohara sa.sa_inqbuf.type = ATAPI_CFG_TYPE(id->atap_config); 818 1.1 kiyohara sa.sa_inqbuf.removable = id->atap_config & ATAPI_CFG_REMOV ? 819 1.1 kiyohara T_REMOV : T_FIXED; 820 1.35 christos strnvisx(model, sizeof(model), id->atap_model, 40, 821 1.35 christos VIS_TRIM|VIS_SAFE|VIS_OCTAL); 822 1.35 christos strnvisx(serial_number, sizeof(serial_number), id->atap_serial, 823 1.35 christos 20, VIS_TRIM|VIS_SAFE|VIS_OCTAL); 824 1.35 christos strnvisx(firmware_revision, sizeof(firmware_revision), 825 1.35 christos id->atap_revision, 8, VIS_TRIM|VIS_SAFE|VIS_OCTAL); 826 1.1 kiyohara sa.sa_inqbuf.vendor = model; 827 1.1 kiyohara sa.sa_inqbuf.product = serial_number; 828 1.1 kiyohara sa.sa_inqbuf.revision = firmware_revision; 829 1.1 kiyohara 830 1.1 kiyohara /* 831 1.1 kiyohara * Determine the operating mode capabilities of the device. 832 1.1 kiyohara */ 833 1.1 kiyohara if ((id->atap_config & ATAPI_CFG_CMD_MASK) == ATAPI_CFG_CMD_16) 834 1.1 kiyohara periph->periph_cap |= PERIPH_CAP_CMD16; 835 1.1 kiyohara /* XXX This is gross. */ 836 1.1 kiyohara periph->periph_cap |= (id->atap_config & ATAPI_CFG_DRQ_MASK); 837 1.1 kiyohara 838 1.1 kiyohara drvp->drv_softc = atapi_probe_device(sc, target, periph, &sa); 839 1.1 kiyohara 840 1.1 kiyohara if (drvp->drv_softc) 841 1.1 kiyohara ata_probe_caps(drvp); 842 1.1 kiyohara else { 843 1.1 kiyohara s = splbio(); 844 1.24 bouyer drvp->drive_type = ATA_DRIVET_NONE; 845 1.1 kiyohara splx(s); 846 1.1 kiyohara } 847 1.1 kiyohara } else { 848 1.36 jdolecek DPRINTF(DEBUG_PROBE, ("%s:%d: mvsata_atapi_probe_device:" 849 1.36 jdolecek " ATAPI_IDENTIFY_DEVICE failed for drive %d: error\n", 850 1.36 jdolecek device_xname(atac->atac_dev), chp->ch_channel, target)); 851 1.1 kiyohara s = splbio(); 852 1.24 bouyer drvp->drive_type = ATA_DRIVET_NONE; 853 1.1 kiyohara splx(s); 854 1.1 kiyohara } 855 1.1 kiyohara } 856 1.1 kiyohara 857 1.1 kiyohara /* 858 1.1 kiyohara * Kill off all pending xfers for a periph. 859 1.1 kiyohara * 860 1.1 kiyohara * Must be called at splbio(). 861 1.1 kiyohara */ 862 1.1 kiyohara static void 863 1.1 kiyohara mvsata_atapi_kill_pending(struct scsipi_periph *periph) 864 1.1 kiyohara { 865 1.1 kiyohara struct atac_softc *atac = 866 1.1 kiyohara device_private(periph->periph_channel->chan_adapter->adapt_dev); 867 1.1 kiyohara struct ata_channel *chp = 868 1.1 kiyohara atac->atac_channels[periph->periph_channel->chan_channel]; 869 1.1 kiyohara 870 1.1 kiyohara ata_kill_pending(&chp->ch_drive[periph->periph_target]); 871 1.1 kiyohara } 872 1.1 kiyohara #endif /* NATAPIBUS > 0 */ 873 1.1 kiyohara #endif /* MVSATA_WITHOUTDMA */ 874 1.1 kiyohara 875 1.1 kiyohara 876 1.1 kiyohara /* 877 1.1 kiyohara * mvsata_setup_channel() 878 1.1 kiyohara * Setup EDMA registers and prepare/purge DMA resources. 879 1.1 kiyohara * We assuming already stopped the EDMA. 880 1.1 kiyohara */ 881 1.1 kiyohara static void 882 1.1 kiyohara mvsata_setup_channel(struct ata_channel *chp) 883 1.1 kiyohara { 884 1.43 jdolecek #ifndef MVSATA_WITHOUTDMA 885 1.1 kiyohara struct mvsata_port *mvport = (struct mvsata_port *)chp; 886 1.1 kiyohara struct ata_drive_datas *drvp; 887 1.1 kiyohara int drive, s; 888 1.43 jdolecek uint32_t edma_mode = nodma; 889 1.1 kiyohara int i; 890 1.1 kiyohara const int crqb_size = sizeof(union mvsata_crqb) * MVSATA_EDMAQ_LEN; 891 1.1 kiyohara const int crpb_size = sizeof(struct crpb) * MVSATA_EDMAQ_LEN; 892 1.1 kiyohara const int eprd_buf_size = MVSATA_EPRD_MAX_SIZE * MVSATA_EDMAQ_LEN; 893 1.1 kiyohara 894 1.36 jdolecek DPRINTF(DEBUG_FUNCS, ("%s:%d: mvsata_setup_channel: ", 895 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), chp->ch_channel)); 896 1.1 kiyohara 897 1.24 bouyer for (drive = 0; drive < chp->ch_ndrives; drive++) { 898 1.1 kiyohara drvp = &chp->ch_drive[drive]; 899 1.1 kiyohara 900 1.1 kiyohara /* If no drive, skip */ 901 1.24 bouyer if (drvp->drive_type == ATA_DRIVET_NONE) 902 1.1 kiyohara continue; 903 1.1 kiyohara 904 1.24 bouyer if (drvp->drive_flags & ATA_DRIVE_UDMA) { 905 1.1 kiyohara /* use Ultra/DMA */ 906 1.1 kiyohara s = splbio(); 907 1.24 bouyer drvp->drive_flags &= ~ATA_DRIVE_DMA; 908 1.1 kiyohara splx(s); 909 1.1 kiyohara } 910 1.1 kiyohara 911 1.36 jdolecek if (drvp->drive_flags & (ATA_DRIVE_UDMA | ATA_DRIVE_DMA)) { 912 1.36 jdolecek if (drvp->drive_flags & ATA_DRIVE_NCQ) 913 1.36 jdolecek edma_mode = ncq; 914 1.36 jdolecek else if (drvp->drive_type == ATA_DRIVET_ATA) 915 1.1 kiyohara edma_mode = dma; 916 1.36 jdolecek } 917 1.1 kiyohara } 918 1.1 kiyohara 919 1.36 jdolecek DPRINTF(DEBUG_FUNCS, 920 1.36 jdolecek ("EDMA %sactive mode\n", (edma_mode == nodma) ? "not " : "")); 921 1.1 kiyohara 922 1.1 kiyohara if (edma_mode == nodma) { 923 1.1 kiyohara no_edma: 924 1.1 kiyohara if (mvport->port_crqb != NULL) 925 1.1 kiyohara mvsata_edma_resource_purge(mvport, mvport->port_dmat, 926 1.1 kiyohara mvport->port_crqb_dmamap, mvport->port_crqb); 927 1.1 kiyohara if (mvport->port_crpb != NULL) 928 1.1 kiyohara mvsata_edma_resource_purge(mvport, mvport->port_dmat, 929 1.1 kiyohara mvport->port_crpb_dmamap, mvport->port_crpb); 930 1.1 kiyohara if (mvport->port_eprd != NULL) 931 1.1 kiyohara mvsata_edma_resource_purge(mvport, mvport->port_dmat, 932 1.1 kiyohara mvport->port_eprd_dmamap, mvport->port_eprd); 933 1.1 kiyohara 934 1.1 kiyohara return; 935 1.1 kiyohara } 936 1.1 kiyohara 937 1.1 kiyohara if (mvport->port_crqb == NULL) 938 1.1 kiyohara mvport->port_crqb = mvsata_edma_resource_prepare(mvport, 939 1.1 kiyohara mvport->port_dmat, &mvport->port_crqb_dmamap, crqb_size, 1); 940 1.1 kiyohara if (mvport->port_crpb == NULL) 941 1.1 kiyohara mvport->port_crpb = mvsata_edma_resource_prepare(mvport, 942 1.1 kiyohara mvport->port_dmat, &mvport->port_crpb_dmamap, crpb_size, 0); 943 1.1 kiyohara if (mvport->port_eprd == NULL) { 944 1.1 kiyohara mvport->port_eprd = mvsata_edma_resource_prepare(mvport, 945 1.1 kiyohara mvport->port_dmat, &mvport->port_eprd_dmamap, eprd_buf_size, 946 1.1 kiyohara 1); 947 1.1 kiyohara for (i = 0; i < MVSATA_EDMAQ_LEN; i++) { 948 1.1 kiyohara mvport->port_reqtbl[i].eprd_offset = 949 1.1 kiyohara i * MVSATA_EPRD_MAX_SIZE; 950 1.1 kiyohara mvport->port_reqtbl[i].eprd = mvport->port_eprd + 951 1.1 kiyohara i * MVSATA_EPRD_MAX_SIZE / sizeof(struct eprd); 952 1.1 kiyohara } 953 1.1 kiyohara } 954 1.1 kiyohara 955 1.1 kiyohara if (mvport->port_crqb == NULL || mvport->port_crpb == NULL || 956 1.1 kiyohara mvport->port_eprd == NULL) { 957 1.1 kiyohara aprint_error_dev(MVSATA_DEV2(mvport), 958 1.1 kiyohara "channel %d: can't use EDMA\n", chp->ch_channel); 959 1.1 kiyohara s = splbio(); 960 1.24 bouyer for (drive = 0; drive < chp->ch_ndrives; drive++) { 961 1.1 kiyohara drvp = &chp->ch_drive[drive]; 962 1.1 kiyohara 963 1.1 kiyohara /* If no drive, skip */ 964 1.24 bouyer if (drvp->drive_type == ATA_DRIVET_NONE) 965 1.1 kiyohara continue; 966 1.1 kiyohara 967 1.24 bouyer drvp->drive_flags &= ~(ATA_DRIVE_UDMA | ATA_DRIVE_DMA); 968 1.1 kiyohara } 969 1.1 kiyohara splx(s); 970 1.1 kiyohara goto no_edma; 971 1.1 kiyohara } 972 1.1 kiyohara 973 1.1 kiyohara mvsata_edma_config(mvport, edma_mode); 974 1.1 kiyohara mvsata_edma_reset_qptr(mvport); 975 1.1 kiyohara mvsata_edma_enable(mvport); 976 1.1 kiyohara #endif 977 1.1 kiyohara } 978 1.1 kiyohara 979 1.1 kiyohara #ifndef MVSATA_WITHOUTDMA 980 1.43 jdolecek static const struct ata_xfer_ops mvsata_bio_xfer_ops = { 981 1.43 jdolecek .c_start = mvsata_bio_start, 982 1.43 jdolecek .c_intr = mvsata_bio_intr, 983 1.43 jdolecek .c_poll = mvsata_bio_poll, 984 1.43 jdolecek .c_abort = mvsata_bio_done, 985 1.43 jdolecek .c_kill_xfer = mvsata_bio_kill_xfer, 986 1.43 jdolecek }; 987 1.43 jdolecek 988 1.56 jdolecek static void 989 1.36 jdolecek mvsata_bio(struct ata_drive_datas *drvp, struct ata_xfer *xfer) 990 1.36 jdolecek { 991 1.36 jdolecek struct ata_channel *chp = drvp->chnl_softc; 992 1.36 jdolecek struct atac_softc *atac = chp->ch_atac; 993 1.36 jdolecek struct ata_bio *ata_bio = &xfer->c_bio; 994 1.36 jdolecek 995 1.36 jdolecek DPRINTF(DEBUG_FUNCS|DEBUG_XFERS, 996 1.36 jdolecek ("%s:%d: mvsata_bio: drive=%d, blkno=%" PRId64 997 1.36 jdolecek ", bcount=%ld\n", device_xname(atac->atac_dev), chp->ch_channel, 998 1.36 jdolecek drvp->drive, ata_bio->blkno, ata_bio->bcount)); 999 1.36 jdolecek 1000 1.36 jdolecek if (atac->atac_cap & ATAC_CAP_NOIRQ) 1001 1.36 jdolecek ata_bio->flags |= ATA_POLL; 1002 1.36 jdolecek if (ata_bio->flags & ATA_POLL) 1003 1.36 jdolecek xfer->c_flags |= C_POLL; 1004 1.36 jdolecek if ((drvp->drive_flags & (ATA_DRIVE_DMA | ATA_DRIVE_UDMA)) && 1005 1.36 jdolecek (ata_bio->flags & ATA_SINGLE) == 0) 1006 1.36 jdolecek xfer->c_flags |= C_DMA; 1007 1.36 jdolecek xfer->c_drive = drvp->drive; 1008 1.36 jdolecek xfer->c_databuf = ata_bio->databuf; 1009 1.36 jdolecek xfer->c_bcount = ata_bio->bcount; 1010 1.43 jdolecek xfer->ops = &mvsata_bio_xfer_ops; 1011 1.36 jdolecek ata_exec_xfer(chp, xfer); 1012 1.36 jdolecek } 1013 1.36 jdolecek 1014 1.36 jdolecek static int 1015 1.1 kiyohara mvsata_bio_start(struct ata_channel *chp, struct ata_xfer *xfer) 1016 1.1 kiyohara { 1017 1.1 kiyohara struct mvsata_port *mvport = (struct mvsata_port *)chp; 1018 1.1 kiyohara struct mvsata_softc *sc = device_private(MVSATA_DEV2(mvport)); 1019 1.1 kiyohara struct atac_softc *atac = chp->ch_atac; 1020 1.1 kiyohara struct wdc_softc *wdc = CHAN_TO_WDC(chp); 1021 1.36 jdolecek struct ata_bio *ata_bio = &xfer->c_bio; 1022 1.1 kiyohara struct ata_drive_datas *drvp = &chp->ch_drive[xfer->c_drive]; 1023 1.1 kiyohara int wait_flags = (xfer->c_flags & C_POLL) ? AT_POLL : 0; 1024 1.1 kiyohara u_int16_t cyl; 1025 1.1 kiyohara u_int8_t head, sect, cmd = 0; 1026 1.36 jdolecek int nblks, error, tfd; 1027 1.1 kiyohara 1028 1.36 jdolecek DPRINTF(DEBUG_FUNCS|DEBUG_XFERS, ("%s:%d: mvsata_bio_start: drive=%d\n", 1029 1.1 kiyohara device_xname(atac->atac_dev), chp->ch_channel, xfer->c_drive)); 1030 1.1 kiyohara 1031 1.36 jdolecek ata_channel_lock_owned(chp); 1032 1.36 jdolecek 1033 1.1 kiyohara if (xfer->c_flags & C_DMA) 1034 1.1 kiyohara if (drvp->n_xfers <= NXFER) 1035 1.1 kiyohara drvp->n_xfers++; 1036 1.1 kiyohara 1037 1.1 kiyohara /* 1038 1.1 kiyohara * 1039 1.1 kiyohara * When starting a multi-sector transfer, or doing single-sector 1040 1.1 kiyohara * transfers... 1041 1.1 kiyohara */ 1042 1.1 kiyohara if (xfer->c_skip == 0 || (ata_bio->flags & ATA_SINGLE) != 0) { 1043 1.1 kiyohara if (ata_bio->flags & ATA_SINGLE) 1044 1.1 kiyohara nblks = 1; 1045 1.1 kiyohara else 1046 1.36 jdolecek nblks = xfer->c_bcount / drvp->lp->d_secsize; 1047 1.1 kiyohara /* Check for bad sectors and adjust transfer, if necessary. */ 1048 1.36 jdolecek if ((drvp->lp->d_flags & D_BADSECT) != 0) { 1049 1.1 kiyohara long blkdiff; 1050 1.1 kiyohara int i; 1051 1.1 kiyohara 1052 1.36 jdolecek for (i = 0; (blkdiff = drvp->badsect[i]) != -1; 1053 1.1 kiyohara i++) { 1054 1.1 kiyohara blkdiff -= ata_bio->blkno; 1055 1.1 kiyohara if (blkdiff < 0) 1056 1.1 kiyohara continue; 1057 1.1 kiyohara if (blkdiff == 0) 1058 1.1 kiyohara /* Replace current block of transfer. */ 1059 1.1 kiyohara ata_bio->blkno = 1060 1.36 jdolecek drvp->lp->d_secperunit - 1061 1.36 jdolecek drvp->lp->d_nsectors - i - 1; 1062 1.1 kiyohara if (blkdiff < nblks) { 1063 1.1 kiyohara /* Bad block inside transfer. */ 1064 1.1 kiyohara ata_bio->flags |= ATA_SINGLE; 1065 1.1 kiyohara nblks = 1; 1066 1.1 kiyohara } 1067 1.1 kiyohara break; 1068 1.1 kiyohara } 1069 1.1 kiyohara /* Transfer is okay now. */ 1070 1.1 kiyohara } 1071 1.1 kiyohara if (xfer->c_flags & C_DMA) { 1072 1.36 jdolecek enum mvsata_edmamode dmamode; 1073 1.36 jdolecek 1074 1.1 kiyohara ata_bio->nblks = nblks; 1075 1.1 kiyohara ata_bio->nbytes = xfer->c_bcount; 1076 1.1 kiyohara 1077 1.36 jdolecek /* switch to appropriate dma mode if necessary */ 1078 1.36 jdolecek dmamode = (xfer->c_flags & C_NCQ) ? ncq : dma; 1079 1.36 jdolecek if (mvport->port_edmamode_curr != dmamode) 1080 1.36 jdolecek mvsata_edma_config(mvport, dmamode); 1081 1.36 jdolecek 1082 1.1 kiyohara if (xfer->c_flags & C_POLL) 1083 1.1 kiyohara sc->sc_enable_intr(mvport, 0 /*off*/); 1084 1.36 jdolecek error = mvsata_edma_enqueue(mvport, xfer); 1085 1.1 kiyohara if (error) { 1086 1.1 kiyohara if (error == EINVAL) { 1087 1.1 kiyohara /* 1088 1.1 kiyohara * We can't do DMA on this transfer 1089 1.1 kiyohara * for some reason. Fall back to 1090 1.1 kiyohara * PIO. 1091 1.1 kiyohara */ 1092 1.1 kiyohara xfer->c_flags &= ~C_DMA; 1093 1.1 kiyohara error = 0; 1094 1.1 kiyohara goto do_pio; 1095 1.1 kiyohara } 1096 1.1 kiyohara if (error == EBUSY) { 1097 1.1 kiyohara aprint_error_dev(atac->atac_dev, 1098 1.1 kiyohara "channel %d: EDMA Queue full\n", 1099 1.1 kiyohara chp->ch_channel); 1100 1.1 kiyohara /* 1101 1.36 jdolecek * XXX: Perhaps, after it waits for 1102 1.1 kiyohara * a while, it is necessary to call 1103 1.1 kiyohara * bio_start again. 1104 1.1 kiyohara */ 1105 1.1 kiyohara } 1106 1.1 kiyohara ata_bio->error = ERR_DMA; 1107 1.1 kiyohara ata_bio->r_error = 0; 1108 1.36 jdolecek return ATASTART_ABORT; 1109 1.1 kiyohara } 1110 1.1 kiyohara chp->ch_flags |= ATACH_DMA_WAIT; 1111 1.1 kiyohara /* wait for irq */ 1112 1.1 kiyohara goto intr; 1113 1.1 kiyohara } /* else not DMA */ 1114 1.1 kiyohara do_pio: 1115 1.1 kiyohara if (ata_bio->flags & ATA_LBA48) { 1116 1.1 kiyohara sect = 0; 1117 1.1 kiyohara cyl = 0; 1118 1.1 kiyohara head = 0; 1119 1.1 kiyohara } else if (ata_bio->flags & ATA_LBA) { 1120 1.1 kiyohara sect = (ata_bio->blkno >> 0) & 0xff; 1121 1.1 kiyohara cyl = (ata_bio->blkno >> 8) & 0xffff; 1122 1.1 kiyohara head = (ata_bio->blkno >> 24) & 0x0f; 1123 1.1 kiyohara head |= WDSD_LBA; 1124 1.1 kiyohara } else { 1125 1.1 kiyohara int blkno = ata_bio->blkno; 1126 1.36 jdolecek sect = blkno % drvp->lp->d_nsectors; 1127 1.1 kiyohara sect++; /* Sectors begin with 1, not 0. */ 1128 1.36 jdolecek blkno /= drvp->lp->d_nsectors; 1129 1.36 jdolecek head = blkno % drvp->lp->d_ntracks; 1130 1.36 jdolecek blkno /= drvp->lp->d_ntracks; 1131 1.1 kiyohara cyl = blkno; 1132 1.1 kiyohara head |= WDSD_CHS; 1133 1.1 kiyohara } 1134 1.42 riastrad ata_bio->nblks = uimin(nblks, drvp->multi); 1135 1.36 jdolecek ata_bio->nbytes = ata_bio->nblks * drvp->lp->d_secsize; 1136 1.1 kiyohara KASSERT(nblks == 1 || (ata_bio->flags & ATA_SINGLE) == 0); 1137 1.1 kiyohara if (ata_bio->nblks > 1) 1138 1.1 kiyohara cmd = (ata_bio->flags & ATA_READ) ? 1139 1.1 kiyohara WDCC_READMULTI : WDCC_WRITEMULTI; 1140 1.1 kiyohara else 1141 1.1 kiyohara cmd = (ata_bio->flags & ATA_READ) ? 1142 1.1 kiyohara WDCC_READ : WDCC_WRITE; 1143 1.1 kiyohara 1144 1.1 kiyohara /* EDMA disable, if enabled this channel. */ 1145 1.36 jdolecek KASSERT((chp->ch_flags & ATACH_NCQ) == 0); 1146 1.36 jdolecek if (mvport->port_edmamode_curr != nodma) 1147 1.1 kiyohara mvsata_edma_disable(mvport, 10 /* ms */, wait_flags); 1148 1.1 kiyohara 1149 1.29 jakllsch mvsata_pmp_select(mvport, xfer->c_drive); 1150 1.29 jakllsch 1151 1.1 kiyohara /* Do control operations specially. */ 1152 1.1 kiyohara if (__predict_false(drvp->state < READY)) { 1153 1.1 kiyohara /* 1154 1.1 kiyohara * Actually, we want to be careful not to mess with 1155 1.1 kiyohara * the control state if the device is currently busy, 1156 1.1 kiyohara * but we can assume that we never get to this point 1157 1.1 kiyohara * if that's the case. 1158 1.1 kiyohara */ 1159 1.1 kiyohara /* 1160 1.1 kiyohara * If it's not a polled command, we need the kernel 1161 1.1 kiyohara * thread 1162 1.1 kiyohara */ 1163 1.55 jdolecek if ((xfer->c_flags & C_POLL) == 0 1164 1.55 jdolecek && !ata_is_thread_run(chp)) 1165 1.36 jdolecek return ATASTART_TH; 1166 1.55 jdolecek 1167 1.1 kiyohara if (mvsata_bio_ready(mvport, ata_bio, xfer->c_drive, 1168 1.1 kiyohara (xfer->c_flags & C_POLL) ? AT_POLL : 0) != 0) { 1169 1.36 jdolecek return ATASTART_ABORT; 1170 1.1 kiyohara } 1171 1.1 kiyohara } 1172 1.1 kiyohara 1173 1.1 kiyohara /* Initiate command! */ 1174 1.1 kiyohara MVSATA_WDC_WRITE_1(mvport, SRB_H, WDSD_IBM); 1175 1.36 jdolecek switch(wdc_wait_for_ready(chp, ATA_DELAY, wait_flags, &tfd)) { 1176 1.1 kiyohara case WDCWAIT_OK: 1177 1.1 kiyohara break; 1178 1.1 kiyohara case WDCWAIT_TOUT: 1179 1.1 kiyohara goto timeout; 1180 1.1 kiyohara case WDCWAIT_THR: 1181 1.36 jdolecek return ATASTART_TH; 1182 1.1 kiyohara } 1183 1.1 kiyohara if (ata_bio->flags & ATA_LBA48) 1184 1.29 jakllsch wdccommandext(chp, 0, atacmd_to48(cmd), 1185 1.25 jakllsch ata_bio->blkno, nblks, 0, WDSD_LBA); 1186 1.1 kiyohara else 1187 1.29 jakllsch wdccommand(chp, 0, cmd, cyl, 1188 1.1 kiyohara head, sect, nblks, 1189 1.36 jdolecek (drvp->lp->d_type == DKTYPE_ST506) ? 1190 1.36 jdolecek drvp->lp->d_precompcyl / 4 : 0); 1191 1.1 kiyohara } else if (ata_bio->nblks > 1) { 1192 1.1 kiyohara /* The number of blocks in the last stretch may be smaller. */ 1193 1.36 jdolecek nblks = xfer->c_bcount / drvp->lp->d_secsize; 1194 1.1 kiyohara if (ata_bio->nblks > nblks) { 1195 1.1 kiyohara ata_bio->nblks = nblks; 1196 1.1 kiyohara ata_bio->nbytes = xfer->c_bcount; 1197 1.1 kiyohara } 1198 1.1 kiyohara } 1199 1.1 kiyohara /* If this was a write and not using DMA, push the data. */ 1200 1.1 kiyohara if ((ata_bio->flags & ATA_READ) == 0) { 1201 1.1 kiyohara /* 1202 1.1 kiyohara * we have to busy-wait here, we can't rely on running in 1203 1.1 kiyohara * thread context. 1204 1.1 kiyohara */ 1205 1.36 jdolecek if (wdc_wait_for_drq(chp, ATA_DELAY, AT_POLL, &tfd) != 0) { 1206 1.1 kiyohara aprint_error_dev(atac->atac_dev, 1207 1.1 kiyohara "channel %d: drive %d timeout waiting for DRQ," 1208 1.1 kiyohara " st=0x%02x, err=0x%02x\n", 1209 1.36 jdolecek chp->ch_channel, xfer->c_drive, ATACH_ST(tfd), 1210 1.36 jdolecek ATACH_ERR(tfd)); 1211 1.1 kiyohara ata_bio->error = TIMEOUT; 1212 1.36 jdolecek return ATASTART_ABORT; 1213 1.1 kiyohara } 1214 1.36 jdolecek if (ATACH_ST(tfd) & WDCS_ERR) { 1215 1.1 kiyohara ata_bio->error = ERROR; 1216 1.36 jdolecek ata_bio->r_error = ATACH_ERR(tfd); 1217 1.1 kiyohara mvsata_bio_done(chp, xfer); 1218 1.36 jdolecek return ATASTART_ABORT; 1219 1.1 kiyohara } 1220 1.1 kiyohara 1221 1.1 kiyohara wdc->dataout_pio(chp, drvp->drive_flags, 1222 1.1 kiyohara (char *)xfer->c_databuf + xfer->c_skip, ata_bio->nbytes); 1223 1.1 kiyohara } 1224 1.1 kiyohara 1225 1.1 kiyohara intr: 1226 1.43 jdolecek KASSERTMSG(((xfer->c_flags & C_DMA) != 0) 1227 1.43 jdolecek == (mvport->port_edmamode_curr != nodma), 1228 1.43 jdolecek "DMA mode mismatch: flags %x vs edmamode %d != %d", 1229 1.43 jdolecek xfer->c_flags, mvport->port_edmamode_curr, nodma); 1230 1.43 jdolecek 1231 1.1 kiyohara /* Wait for IRQ (either real or polled) */ 1232 1.57 jdolecek if ((ata_bio->flags & ATA_POLL) != 0) { 1233 1.57 jdolecek /* start timeout machinery */ 1234 1.57 jdolecek callout_reset(&chp->c_timo_callout, 1235 1.57 jdolecek mstohz(ATA_DELAY), wdctimeout, chp); 1236 1.36 jdolecek return ATASTART_POLL; 1237 1.57 jdolecek } else 1238 1.36 jdolecek return ATASTART_STARTED; 1239 1.1 kiyohara 1240 1.1 kiyohara timeout: 1241 1.1 kiyohara aprint_error_dev(atac->atac_dev, 1242 1.1 kiyohara "channel %d: drive %d not ready, st=0x%02x, err=0x%02x\n", 1243 1.36 jdolecek chp->ch_channel, xfer->c_drive, ATACH_ST(tfd), ATACH_ERR(tfd)); 1244 1.1 kiyohara ata_bio->error = TIMEOUT; 1245 1.36 jdolecek return ATASTART_ABORT; 1246 1.36 jdolecek } 1247 1.36 jdolecek 1248 1.61 rin static int 1249 1.36 jdolecek mvsata_bio_poll(struct ata_channel *chp, struct ata_xfer *xfer) 1250 1.36 jdolecek { 1251 1.36 jdolecek struct mvsata_port *mvport = (struct mvsata_port *)chp; 1252 1.36 jdolecek struct mvsata_softc *sc = device_private(MVSATA_DEV2(mvport)); 1253 1.36 jdolecek 1254 1.36 jdolecek /* Wait for at last 400ns for status bit to be valid */ 1255 1.36 jdolecek delay(1); 1256 1.36 jdolecek if (chp->ch_flags & ATACH_DMA_WAIT) { 1257 1.36 jdolecek mvsata_edma_wait(mvport, xfer, ATA_DELAY); 1258 1.36 jdolecek sc->sc_enable_intr(mvport, 1 /*on*/); 1259 1.36 jdolecek chp->ch_flags &= ~ATACH_DMA_WAIT; 1260 1.36 jdolecek } 1261 1.36 jdolecek 1262 1.61 rin mvsata_bio_intr(chp, xfer, 0); 1263 1.61 rin 1264 1.61 rin return (xfer->c_bio.flags & ATA_ITSDONE) ? ATAPOLL_DONE : ATAPOLL_AGAIN; 1265 1.1 kiyohara } 1266 1.1 kiyohara 1267 1.1 kiyohara static int 1268 1.43 jdolecek mvsata_bio_intr(struct ata_channel *chp, struct ata_xfer *xfer, int intr_arg) 1269 1.1 kiyohara { 1270 1.1 kiyohara struct atac_softc *atac = chp->ch_atac; 1271 1.1 kiyohara struct wdc_softc *wdc = CHAN_TO_WDC(chp); 1272 1.36 jdolecek struct ata_bio *ata_bio = &xfer->c_bio; 1273 1.1 kiyohara struct ata_drive_datas *drvp = &chp->ch_drive[xfer->c_drive]; 1274 1.43 jdolecek int irq = ISSET(xfer->c_flags, (C_POLL|C_TIMEOU)) ? 0 : 1; 1275 1.43 jdolecek int tfd = 0; 1276 1.43 jdolecek 1277 1.43 jdolecek if (ISSET(xfer->c_flags, C_DMA|C_RECOVERED) && irq) { 1278 1.43 jdolecek /* Invoked via mvsata_edma_handle() or recovery */ 1279 1.43 jdolecek tfd = intr_arg; 1280 1.43 jdolecek 1281 1.43 jdolecek if (tfd > 0 && ata_bio->error == NOERROR) { 1282 1.43 jdolecek if (ATACH_ST(tfd) & WDCS_ERR) 1283 1.43 jdolecek ata_bio->error = ERROR; 1284 1.43 jdolecek if (ATACH_ST(tfd) & WDCS_BSY) 1285 1.43 jdolecek ata_bio->error = TIMEOUT; 1286 1.43 jdolecek ata_bio->r_error = ATACH_ERR(tfd); 1287 1.43 jdolecek } 1288 1.43 jdolecek } 1289 1.1 kiyohara 1290 1.36 jdolecek DPRINTF(DEBUG_FUNCS|DEBUG_XFERS, ("%s:%d: %s: drive=%d\n", 1291 1.36 jdolecek device_xname(atac->atac_dev), chp->ch_channel, __func__, 1292 1.36 jdolecek xfer->c_drive)); 1293 1.36 jdolecek 1294 1.43 jdolecek /* Cleanup EDMA if invoked from wdctimeout()/ata_timeout() */ 1295 1.43 jdolecek if (ISSET(xfer->c_flags, C_TIMEOU) && ISSET(xfer->c_flags, C_DMA) 1296 1.43 jdolecek && !ISSET(xfer->c_flags, C_POLL)) { 1297 1.43 jdolecek mvsata_edma_rqq_remove((struct mvsata_port *)chp, xfer); 1298 1.43 jdolecek } 1299 1.43 jdolecek 1300 1.36 jdolecek ata_channel_lock(chp); 1301 1.1 kiyohara 1302 1.36 jdolecek chp->ch_flags &= ~(ATACH_DMA_WAIT); 1303 1.10 jakllsch 1304 1.1 kiyohara /* 1305 1.10 jakllsch * If we missed an interrupt transfer, reset and restart. 1306 1.1 kiyohara * Don't try to continue transfer, we may have missed cycles. 1307 1.1 kiyohara */ 1308 1.1 kiyohara if (xfer->c_flags & C_TIMEOU) { 1309 1.1 kiyohara ata_bio->error = TIMEOUT; 1310 1.36 jdolecek ata_channel_unlock(chp); 1311 1.1 kiyohara mvsata_bio_done(chp, xfer); 1312 1.1 kiyohara return 1; 1313 1.1 kiyohara } 1314 1.1 kiyohara 1315 1.28 jakllsch /* Is it not a transfer, but a control operation? */ 1316 1.28 jakllsch if (!(xfer->c_flags & C_DMA) && drvp->state < READY) { 1317 1.28 jakllsch aprint_error_dev(atac->atac_dev, 1318 1.36 jdolecek "channel %d: drive %d bad state %d in %s\n", 1319 1.36 jdolecek chp->ch_channel, xfer->c_drive, drvp->state, __func__); 1320 1.36 jdolecek panic("%s: bad state", __func__); 1321 1.28 jakllsch } 1322 1.28 jakllsch 1323 1.1 kiyohara /* Ack interrupt done by wdc_wait_for_unbusy */ 1324 1.1 kiyohara if (!(xfer->c_flags & C_DMA) && 1325 1.36 jdolecek (wdc_wait_for_unbusy(chp, (irq == 0) ? ATA_DELAY : 0, AT_POLL, &tfd) 1326 1.1 kiyohara == WDCWAIT_TOUT)) { 1327 1.36 jdolecek if (irq && (xfer->c_flags & C_TIMEOU) == 0) { 1328 1.36 jdolecek ata_channel_unlock(chp); 1329 1.1 kiyohara return 0; /* IRQ was not for us */ 1330 1.36 jdolecek } 1331 1.1 kiyohara aprint_error_dev(atac->atac_dev, 1332 1.1 kiyohara "channel %d: drive %d timeout, c_bcount=%d, c_skip%d\n", 1333 1.1 kiyohara chp->ch_channel, xfer->c_drive, xfer->c_bcount, 1334 1.1 kiyohara xfer->c_skip); 1335 1.1 kiyohara ata_bio->error = TIMEOUT; 1336 1.36 jdolecek ata_channel_unlock(chp); 1337 1.1 kiyohara mvsata_bio_done(chp, xfer); 1338 1.1 kiyohara return 1; 1339 1.1 kiyohara } 1340 1.1 kiyohara 1341 1.1 kiyohara if (xfer->c_flags & C_DMA) { 1342 1.1 kiyohara if (ata_bio->error == NOERROR) 1343 1.1 kiyohara goto end; 1344 1.36 jdolecek if (ata_bio->error == ERR_DMA) { 1345 1.1 kiyohara ata_dmaerr(drvp, 1346 1.1 kiyohara (xfer->c_flags & C_POLL) ? AT_POLL : 0); 1347 1.45 jdolecek ata_channel_unlock(chp); 1348 1.36 jdolecek goto err; 1349 1.36 jdolecek } 1350 1.1 kiyohara } 1351 1.1 kiyohara 1352 1.1 kiyohara /* if we had an error, end */ 1353 1.1 kiyohara if (ata_bio->error != NOERROR) { 1354 1.36 jdolecek ata_channel_unlock(chp); 1355 1.36 jdolecek err: 1356 1.1 kiyohara mvsata_bio_done(chp, xfer); 1357 1.1 kiyohara return 1; 1358 1.1 kiyohara } 1359 1.1 kiyohara 1360 1.1 kiyohara /* If this was a read and not using DMA, fetch the data. */ 1361 1.1 kiyohara if ((ata_bio->flags & ATA_READ) != 0) { 1362 1.36 jdolecek if ((ATACH_ST(tfd) & WDCS_DRQ) != WDCS_DRQ) { 1363 1.1 kiyohara aprint_error_dev(atac->atac_dev, 1364 1.1 kiyohara "channel %d: drive %d read intr before drq\n", 1365 1.1 kiyohara chp->ch_channel, xfer->c_drive); 1366 1.1 kiyohara ata_bio->error = TIMEOUT; 1367 1.36 jdolecek ata_channel_unlock(chp); 1368 1.1 kiyohara mvsata_bio_done(chp, xfer); 1369 1.1 kiyohara return 1; 1370 1.1 kiyohara } 1371 1.1 kiyohara wdc->datain_pio(chp, drvp->drive_flags, 1372 1.1 kiyohara (char *)xfer->c_databuf + xfer->c_skip, ata_bio->nbytes); 1373 1.1 kiyohara } 1374 1.1 kiyohara 1375 1.1 kiyohara end: 1376 1.1 kiyohara ata_bio->blkno += ata_bio->nblks; 1377 1.1 kiyohara ata_bio->blkdone += ata_bio->nblks; 1378 1.1 kiyohara xfer->c_skip += ata_bio->nbytes; 1379 1.1 kiyohara xfer->c_bcount -= ata_bio->nbytes; 1380 1.36 jdolecek 1381 1.1 kiyohara /* See if this transfer is complete. */ 1382 1.1 kiyohara if (xfer->c_bcount > 0) { 1383 1.36 jdolecek if ((ata_bio->flags & ATA_POLL) == 0) { 1384 1.1 kiyohara /* Start the next operation */ 1385 1.36 jdolecek ata_xfer_start(xfer); 1386 1.36 jdolecek } else { 1387 1.61 rin /* 1388 1.61 rin * Let ata_xfer_start() do the loop; 1389 1.61 rin * see mvsata_bio_poll(). 1390 1.61 rin */ 1391 1.36 jdolecek } 1392 1.36 jdolecek ata_channel_unlock(chp); 1393 1.1 kiyohara } else { /* Done with this transfer */ 1394 1.1 kiyohara ata_bio->error = NOERROR; 1395 1.36 jdolecek ata_channel_unlock(chp); 1396 1.1 kiyohara mvsata_bio_done(chp, xfer); 1397 1.1 kiyohara } 1398 1.1 kiyohara return 1; 1399 1.1 kiyohara } 1400 1.1 kiyohara 1401 1.1 kiyohara static void 1402 1.1 kiyohara mvsata_bio_kill_xfer(struct ata_channel *chp, struct ata_xfer *xfer, int reason) 1403 1.1 kiyohara { 1404 1.1 kiyohara struct mvsata_port *mvport = (struct mvsata_port *)chp; 1405 1.1 kiyohara struct atac_softc *atac = chp->ch_atac; 1406 1.36 jdolecek struct ata_bio *ata_bio = &xfer->c_bio; 1407 1.1 kiyohara int drive = xfer->c_drive; 1408 1.36 jdolecek bool deactivate = true; 1409 1.1 kiyohara 1410 1.36 jdolecek DPRINTF(DEBUG_FUNCS|DEBUG_XFERS, 1411 1.36 jdolecek ("%s:%d: mvsata_bio_kill_xfer: drive=%d\n", 1412 1.1 kiyohara device_xname(atac->atac_dev), chp->ch_channel, xfer->c_drive)); 1413 1.1 kiyohara 1414 1.1 kiyohara /* EDMA restart, if enabled */ 1415 1.36 jdolecek if (!(xfer->c_flags & C_DMA) && mvport->port_edmamode_curr != nodma) { 1416 1.1 kiyohara mvsata_edma_reset_qptr(mvport); 1417 1.1 kiyohara mvsata_edma_enable(mvport); 1418 1.1 kiyohara } 1419 1.1 kiyohara 1420 1.1 kiyohara ata_bio->flags |= ATA_ITSDONE; 1421 1.1 kiyohara switch (reason) { 1422 1.36 jdolecek case KILL_GONE_INACTIVE: 1423 1.36 jdolecek deactivate = false; 1424 1.36 jdolecek /* FALLTHROUGH */ 1425 1.1 kiyohara case KILL_GONE: 1426 1.1 kiyohara ata_bio->error = ERR_NODEV; 1427 1.1 kiyohara break; 1428 1.1 kiyohara case KILL_RESET: 1429 1.1 kiyohara ata_bio->error = ERR_RESET; 1430 1.1 kiyohara break; 1431 1.36 jdolecek case KILL_REQUEUE: 1432 1.36 jdolecek ata_bio->error = REQUEUE; 1433 1.36 jdolecek break; 1434 1.1 kiyohara default: 1435 1.1 kiyohara aprint_error_dev(atac->atac_dev, 1436 1.1 kiyohara "mvsata_bio_kill_xfer: unknown reason %d\n", reason); 1437 1.1 kiyohara panic("mvsata_bio_kill_xfer"); 1438 1.1 kiyohara } 1439 1.1 kiyohara ata_bio->r_error = WDCE_ABRT; 1440 1.36 jdolecek 1441 1.43 jdolecek if (deactivate) 1442 1.36 jdolecek ata_deactivate_xfer(chp, xfer); 1443 1.36 jdolecek 1444 1.36 jdolecek (*chp->ch_drive[drive].drv_done)(chp->ch_drive[drive].drv_softc, xfer); 1445 1.1 kiyohara } 1446 1.1 kiyohara 1447 1.1 kiyohara static void 1448 1.1 kiyohara mvsata_bio_done(struct ata_channel *chp, struct ata_xfer *xfer) 1449 1.1 kiyohara { 1450 1.1 kiyohara struct mvsata_port *mvport = (struct mvsata_port *)chp; 1451 1.36 jdolecek struct ata_bio *ata_bio = &xfer->c_bio; 1452 1.1 kiyohara int drive = xfer->c_drive; 1453 1.36 jdolecek bool iserror = (ata_bio->error != NOERROR); 1454 1.1 kiyohara 1455 1.36 jdolecek DPRINTF(DEBUG_FUNCS|DEBUG_XFERS, 1456 1.36 jdolecek ("%s:%d: mvsata_bio_done: drive=%d, flags=0x%x\n", 1457 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), chp->ch_channel, xfer->c_drive, 1458 1.1 kiyohara (u_int)xfer->c_flags)); 1459 1.1 kiyohara 1460 1.1 kiyohara /* EDMA restart, if enabled */ 1461 1.36 jdolecek if (!(xfer->c_flags & C_DMA) && mvport->port_edmamode_curr != nodma) { 1462 1.1 kiyohara mvsata_edma_reset_qptr(mvport); 1463 1.1 kiyohara mvsata_edma_enable(mvport); 1464 1.1 kiyohara } 1465 1.1 kiyohara 1466 1.36 jdolecek if (ata_waitdrain_xfer_check(chp, xfer)) 1467 1.36 jdolecek return; 1468 1.36 jdolecek 1469 1.1 kiyohara /* feed back residual bcount to our caller */ 1470 1.1 kiyohara ata_bio->bcount = xfer->c_bcount; 1471 1.1 kiyohara 1472 1.1 kiyohara /* mark controller inactive and free xfer */ 1473 1.36 jdolecek ata_deactivate_xfer(chp, xfer); 1474 1.1 kiyohara 1475 1.1 kiyohara ata_bio->flags |= ATA_ITSDONE; 1476 1.36 jdolecek (*chp->ch_drive[drive].drv_done)(chp->ch_drive[drive].drv_softc, xfer); 1477 1.36 jdolecek if (!iserror) 1478 1.36 jdolecek atastart(chp); 1479 1.1 kiyohara } 1480 1.1 kiyohara 1481 1.1 kiyohara static int 1482 1.1 kiyohara mvsata_bio_ready(struct mvsata_port *mvport, struct ata_bio *ata_bio, int drive, 1483 1.1 kiyohara int flags) 1484 1.1 kiyohara { 1485 1.1 kiyohara struct ata_channel *chp = &mvport->port_ata_channel; 1486 1.1 kiyohara struct atac_softc *atac = chp->ch_atac; 1487 1.1 kiyohara struct ata_drive_datas *drvp = &chp->ch_drive[drive]; 1488 1.1 kiyohara const char *errstring; 1489 1.36 jdolecek int tfd; 1490 1.1 kiyohara 1491 1.31 jakllsch flags |= AT_POLL; /* XXX */ 1492 1.31 jakllsch 1493 1.36 jdolecek ata_channel_lock_owned(chp); 1494 1.36 jdolecek 1495 1.1 kiyohara /* 1496 1.1 kiyohara * disable interrupts, all commands here should be quick 1497 1.4 snj * enough to be able to poll, and we don't go here that often 1498 1.1 kiyohara */ 1499 1.1 kiyohara MVSATA_WDC_WRITE_1(mvport, SRB_CAS, WDCTL_4BIT | WDCTL_IDS); 1500 1.1 kiyohara MVSATA_WDC_WRITE_1(mvport, SRB_H, WDSD_IBM); 1501 1.1 kiyohara DELAY(10); 1502 1.1 kiyohara errstring = "wait"; 1503 1.36 jdolecek if (wdcwait(chp, WDCS_DRDY, WDCS_DRDY, ATA_DELAY, flags, &tfd)) 1504 1.1 kiyohara goto ctrltimeout; 1505 1.29 jakllsch wdccommandshort(chp, 0, WDCC_RECAL); 1506 1.29 jakllsch /* Wait for at least 400ns for status bit to be valid */ 1507 1.1 kiyohara DELAY(1); 1508 1.1 kiyohara errstring = "recal"; 1509 1.36 jdolecek if (wdcwait(chp, WDCS_DRDY, WDCS_DRDY, ATA_DELAY, flags, &tfd)) 1510 1.1 kiyohara goto ctrltimeout; 1511 1.36 jdolecek if (ATACH_ST(tfd) & (WDCS_ERR | WDCS_DWF)) 1512 1.1 kiyohara goto ctrlerror; 1513 1.1 kiyohara /* Don't try to set modes if controller can't be adjusted */ 1514 1.1 kiyohara if (atac->atac_set_modes == NULL) 1515 1.1 kiyohara goto geometry; 1516 1.1 kiyohara /* Also don't try if the drive didn't report its mode */ 1517 1.24 bouyer if ((drvp->drive_flags & ATA_DRIVE_MODE) == 0) 1518 1.1 kiyohara goto geometry; 1519 1.29 jakllsch wdccommand(chp, 0, SET_FEATURES, 0, 0, 0, 1520 1.1 kiyohara 0x08 | drvp->PIO_mode, WDSF_SET_MODE); 1521 1.36 jdolecek errstring = "piomode-bio"; 1522 1.36 jdolecek if (wdcwait(chp, WDCS_DRDY, WDCS_DRDY, ATA_DELAY, flags, &tfd)) 1523 1.1 kiyohara goto ctrltimeout; 1524 1.36 jdolecek if (ATACH_ST(tfd) & (WDCS_ERR | WDCS_DWF)) 1525 1.1 kiyohara goto ctrlerror; 1526 1.24 bouyer if (drvp->drive_flags & ATA_DRIVE_UDMA) 1527 1.29 jakllsch wdccommand(chp, 0, SET_FEATURES, 0, 0, 0, 1528 1.1 kiyohara 0x40 | drvp->UDMA_mode, WDSF_SET_MODE); 1529 1.24 bouyer else if (drvp->drive_flags & ATA_DRIVE_DMA) 1530 1.29 jakllsch wdccommand(chp, 0, SET_FEATURES, 0, 0, 0, 1531 1.1 kiyohara 0x20 | drvp->DMA_mode, WDSF_SET_MODE); 1532 1.1 kiyohara else 1533 1.1 kiyohara goto geometry; 1534 1.36 jdolecek errstring = "dmamode-bio"; 1535 1.36 jdolecek if (wdcwait(chp, WDCS_DRDY, WDCS_DRDY, ATA_DELAY, flags, &tfd)) 1536 1.1 kiyohara goto ctrltimeout; 1537 1.36 jdolecek if (ATACH_ST(tfd) & (WDCS_ERR | WDCS_DWF)) 1538 1.1 kiyohara goto ctrlerror; 1539 1.1 kiyohara geometry: 1540 1.1 kiyohara if (ata_bio->flags & ATA_LBA) 1541 1.1 kiyohara goto multimode; 1542 1.36 jdolecek wdccommand(chp, 0, WDCC_IDP, drvp->lp->d_ncylinders, 1543 1.36 jdolecek drvp->lp->d_ntracks - 1, 0, drvp->lp->d_nsectors, 1544 1.36 jdolecek (drvp->lp->d_type == DKTYPE_ST506) ? 1545 1.36 jdolecek drvp->lp->d_precompcyl / 4 : 0); 1546 1.1 kiyohara errstring = "geometry"; 1547 1.36 jdolecek if (wdcwait(chp, WDCS_DRDY, WDCS_DRDY, ATA_DELAY, flags, &tfd)) 1548 1.1 kiyohara goto ctrltimeout; 1549 1.36 jdolecek if (ATACH_ST(tfd) & (WDCS_ERR | WDCS_DWF)) 1550 1.1 kiyohara goto ctrlerror; 1551 1.1 kiyohara multimode: 1552 1.36 jdolecek if (drvp->multi == 1) 1553 1.1 kiyohara goto ready; 1554 1.36 jdolecek wdccommand(chp, 0, WDCC_SETMULTI, 0, 0, 0, drvp->multi, 0); 1555 1.1 kiyohara errstring = "setmulti"; 1556 1.36 jdolecek if (wdcwait(chp, WDCS_DRDY, WDCS_DRDY, ATA_DELAY, flags, &tfd)) 1557 1.1 kiyohara goto ctrltimeout; 1558 1.36 jdolecek if (ATACH_ST(tfd) & (WDCS_ERR | WDCS_DWF)) 1559 1.1 kiyohara goto ctrlerror; 1560 1.1 kiyohara ready: 1561 1.1 kiyohara drvp->state = READY; 1562 1.1 kiyohara /* 1563 1.1 kiyohara * The drive is usable now 1564 1.1 kiyohara */ 1565 1.1 kiyohara MVSATA_WDC_WRITE_1(mvport, SRB_CAS, WDCTL_4BIT); 1566 1.1 kiyohara delay(10); /* some drives need a little delay here */ 1567 1.1 kiyohara return 0; 1568 1.1 kiyohara 1569 1.1 kiyohara ctrltimeout: 1570 1.1 kiyohara aprint_error_dev(atac->atac_dev, "channel %d: drive %d %s timed out\n", 1571 1.1 kiyohara chp->ch_channel, drive, errstring); 1572 1.1 kiyohara ata_bio->error = TIMEOUT; 1573 1.1 kiyohara goto ctrldone; 1574 1.1 kiyohara ctrlerror: 1575 1.1 kiyohara aprint_error_dev(atac->atac_dev, "channel %d: drive %d %s ", 1576 1.1 kiyohara chp->ch_channel, drive, errstring); 1577 1.36 jdolecek if (ATACH_ST(tfd) & WDCS_DWF) { 1578 1.1 kiyohara aprint_error("drive fault\n"); 1579 1.1 kiyohara ata_bio->error = ERR_DF; 1580 1.1 kiyohara } else { 1581 1.36 jdolecek ata_bio->r_error = ATACH_ERR(tfd); 1582 1.1 kiyohara ata_bio->error = ERROR; 1583 1.36 jdolecek aprint_error("error (%x)\n", ata_bio->r_error); 1584 1.1 kiyohara } 1585 1.1 kiyohara ctrldone: 1586 1.1 kiyohara drvp->state = 0; 1587 1.1 kiyohara MVSATA_WDC_WRITE_1(mvport, SRB_CAS, WDCTL_4BIT); 1588 1.1 kiyohara return -1; 1589 1.1 kiyohara } 1590 1.1 kiyohara 1591 1.43 jdolecek static const struct ata_xfer_ops mvsata_wdc_cmd_xfer_ops = { 1592 1.43 jdolecek .c_start = mvsata_wdc_cmd_start, 1593 1.43 jdolecek .c_intr = mvsata_wdc_cmd_intr, 1594 1.43 jdolecek .c_poll = mvsata_wdc_cmd_poll, 1595 1.43 jdolecek .c_abort = mvsata_wdc_cmd_done, 1596 1.43 jdolecek .c_kill_xfer = mvsata_wdc_cmd_kill_xfer, 1597 1.43 jdolecek }; 1598 1.43 jdolecek 1599 1.56 jdolecek static void 1600 1.36 jdolecek mvsata_exec_command(struct ata_drive_datas *drvp, struct ata_xfer *xfer) 1601 1.36 jdolecek { 1602 1.36 jdolecek struct ata_channel *chp = drvp->chnl_softc; 1603 1.36 jdolecek struct ata_command *ata_c = &xfer->c_ata_c; 1604 1.36 jdolecek 1605 1.36 jdolecek DPRINTF(DEBUG_FUNCS|DEBUG_XFERS, 1606 1.36 jdolecek ("%s:%d: mvsata_exec_command: drive=%d, bcount=%d," 1607 1.36 jdolecek " r_lba=0x%012"PRIx64", r_count=0x%04x, r_features=0x%04x," 1608 1.36 jdolecek " r_device=0x%02x, r_command=0x%02x\n", 1609 1.36 jdolecek device_xname(MVSATA_DEV2((struct mvsata_port *)chp)), 1610 1.36 jdolecek chp->ch_channel, 1611 1.36 jdolecek drvp->drive, ata_c->bcount, ata_c->r_lba, ata_c->r_count, 1612 1.36 jdolecek ata_c->r_features, ata_c->r_device, ata_c->r_command)); 1613 1.36 jdolecek 1614 1.36 jdolecek if (ata_c->flags & AT_POLL) 1615 1.36 jdolecek xfer->c_flags |= C_POLL; 1616 1.36 jdolecek if (ata_c->flags & AT_WAIT) 1617 1.36 jdolecek xfer->c_flags |= C_WAIT; 1618 1.36 jdolecek xfer->c_drive = drvp->drive; 1619 1.36 jdolecek xfer->c_databuf = ata_c->data; 1620 1.36 jdolecek xfer->c_bcount = ata_c->bcount; 1621 1.43 jdolecek xfer->ops = &mvsata_wdc_cmd_xfer_ops; 1622 1.56 jdolecek 1623 1.36 jdolecek ata_exec_xfer(chp, xfer); 1624 1.36 jdolecek } 1625 1.36 jdolecek 1626 1.36 jdolecek static int 1627 1.1 kiyohara mvsata_wdc_cmd_start(struct ata_channel *chp, struct ata_xfer *xfer) 1628 1.1 kiyohara { 1629 1.1 kiyohara struct mvsata_port *mvport = (struct mvsata_port *)chp; 1630 1.1 kiyohara int drive = xfer->c_drive; 1631 1.1 kiyohara int wait_flags = (xfer->c_flags & C_POLL) ? AT_POLL : 0; 1632 1.36 jdolecek struct ata_command *ata_c = &xfer->c_ata_c; 1633 1.36 jdolecek int tfd; 1634 1.1 kiyohara 1635 1.36 jdolecek DPRINTF(DEBUG_FUNCS|DEBUG_XFERS, 1636 1.36 jdolecek ("%s:%d: mvsata_cmd_start: drive=%d\n", 1637 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), chp->ch_channel, drive)); 1638 1.1 kiyohara 1639 1.36 jdolecek ata_channel_lock_owned(chp); 1640 1.36 jdolecek 1641 1.1 kiyohara /* First, EDMA disable, if enabled this channel. */ 1642 1.36 jdolecek KASSERT((chp->ch_flags & ATACH_NCQ) == 0); 1643 1.36 jdolecek if (mvport->port_edmamode_curr != nodma) 1644 1.1 kiyohara mvsata_edma_disable(mvport, 10 /* ms */, wait_flags); 1645 1.1 kiyohara 1646 1.29 jakllsch mvsata_pmp_select(mvport, drive); 1647 1.29 jakllsch 1648 1.1 kiyohara MVSATA_WDC_WRITE_1(mvport, SRB_H, WDSD_IBM); 1649 1.1 kiyohara switch(wdcwait(chp, ata_c->r_st_bmask | WDCS_DRQ, 1650 1.36 jdolecek ata_c->r_st_bmask, ata_c->timeout, wait_flags, &tfd)) { 1651 1.1 kiyohara case WDCWAIT_OK: 1652 1.1 kiyohara break; 1653 1.1 kiyohara case WDCWAIT_TOUT: 1654 1.1 kiyohara ata_c->flags |= AT_TIMEOU; 1655 1.36 jdolecek return ATASTART_ABORT; 1656 1.1 kiyohara case WDCWAIT_THR: 1657 1.36 jdolecek return ATASTART_TH; 1658 1.1 kiyohara } 1659 1.1 kiyohara if (ata_c->flags & AT_POLL) 1660 1.1 kiyohara /* polled command, disable interrupts */ 1661 1.1 kiyohara MVSATA_WDC_WRITE_1(mvport, SRB_CAS, WDCTL_4BIT | WDCTL_IDS); 1662 1.15 jakllsch if ((ata_c->flags & AT_LBA48) != 0) { 1663 1.29 jakllsch wdccommandext(chp, 0, ata_c->r_command, 1664 1.25 jakllsch ata_c->r_lba, ata_c->r_count, ata_c->r_features, 1665 1.25 jakllsch ata_c->r_device & ~0x10); 1666 1.15 jakllsch } else { 1667 1.29 jakllsch wdccommand(chp, 0, ata_c->r_command, 1668 1.15 jakllsch (ata_c->r_lba >> 8) & 0xffff, 1669 1.15 jakllsch (((ata_c->flags & AT_LBA) != 0) ? WDSD_LBA : 0) | 1670 1.15 jakllsch ((ata_c->r_lba >> 24) & 0x0f), 1671 1.15 jakllsch ata_c->r_lba & 0xff, 1672 1.15 jakllsch ata_c->r_count & 0xff, 1673 1.15 jakllsch ata_c->r_features & 0xff); 1674 1.15 jakllsch } 1675 1.1 kiyohara 1676 1.1 kiyohara if ((ata_c->flags & AT_POLL) == 0) { 1677 1.43 jdolecek callout_reset(&chp->c_timo_callout, ata_c->timeout / 1000 * hz, 1678 1.43 jdolecek wdctimeout, chp); 1679 1.36 jdolecek return ATASTART_STARTED; 1680 1.1 kiyohara } 1681 1.36 jdolecek 1682 1.36 jdolecek return ATASTART_POLL; 1683 1.36 jdolecek } 1684 1.36 jdolecek 1685 1.61 rin static int 1686 1.36 jdolecek mvsata_wdc_cmd_poll(struct ata_channel *chp, struct ata_xfer *xfer) 1687 1.36 jdolecek { 1688 1.1 kiyohara /* 1689 1.1 kiyohara * Polled command. Wait for drive ready or drq. Done in intr(). 1690 1.1 kiyohara * Wait for at last 400ns for status bit to be valid. 1691 1.1 kiyohara */ 1692 1.1 kiyohara delay(10); /* 400ns delay */ 1693 1.1 kiyohara mvsata_wdc_cmd_intr(chp, xfer, 0); 1694 1.61 rin return ATAPOLL_DONE; 1695 1.1 kiyohara } 1696 1.1 kiyohara 1697 1.1 kiyohara static int 1698 1.1 kiyohara mvsata_wdc_cmd_intr(struct ata_channel *chp, struct ata_xfer *xfer, int irq) 1699 1.1 kiyohara { 1700 1.1 kiyohara struct mvsata_port *mvport = (struct mvsata_port *)chp; 1701 1.1 kiyohara struct wdc_softc *wdc = CHAN_TO_WDC(chp); 1702 1.36 jdolecek struct ata_command *ata_c = &xfer->c_ata_c; 1703 1.1 kiyohara int bcount = ata_c->bcount; 1704 1.1 kiyohara char *data = ata_c->data; 1705 1.1 kiyohara int wflags; 1706 1.1 kiyohara int drive_flags; 1707 1.36 jdolecek int tfd; 1708 1.36 jdolecek 1709 1.36 jdolecek ata_channel_lock(chp); 1710 1.1 kiyohara 1711 1.1 kiyohara if (ata_c->r_command == WDCC_IDENTIFY || 1712 1.1 kiyohara ata_c->r_command == ATAPI_IDENTIFY_DEVICE) 1713 1.1 kiyohara /* 1714 1.1 kiyohara * The IDENTIFY data has been designed as an array of 1715 1.1 kiyohara * u_int16_t, so we can byteswap it on the fly. 1716 1.1 kiyohara * Historically it's what we have always done so keeping it 1717 1.1 kiyohara * here ensure binary backward compatibility. 1718 1.1 kiyohara */ 1719 1.24 bouyer drive_flags = ATA_DRIVE_NOSTREAM | 1720 1.1 kiyohara chp->ch_drive[xfer->c_drive].drive_flags; 1721 1.1 kiyohara else 1722 1.1 kiyohara /* 1723 1.52 msaitoh * Other data structure are opaque and should be transferred 1724 1.1 kiyohara * as is. 1725 1.1 kiyohara */ 1726 1.1 kiyohara drive_flags = chp->ch_drive[xfer->c_drive].drive_flags; 1727 1.1 kiyohara 1728 1.1 kiyohara if ((ata_c->flags & (AT_WAIT | AT_POLL)) == (AT_WAIT | AT_POLL)) 1729 1.36 jdolecek /* both wait and poll, we can kpause here */ 1730 1.1 kiyohara wflags = AT_WAIT | AT_POLL; 1731 1.1 kiyohara else 1732 1.1 kiyohara wflags = AT_POLL; 1733 1.1 kiyohara 1734 1.1 kiyohara again: 1735 1.36 jdolecek DPRINTF(DEBUG_FUNCS|DEBUG_XFERS, ("%s:%d: %s: drive=%d\n", 1736 1.36 jdolecek device_xname(MVSATA_DEV2(mvport)), chp->ch_channel, 1737 1.36 jdolecek __func__, xfer->c_drive)); 1738 1.1 kiyohara 1739 1.1 kiyohara /* 1740 1.1 kiyohara * after a ATAPI_SOFT_RESET, the device will have released the bus. 1741 1.1 kiyohara * Reselect again, it doesn't hurt for others commands, and the time 1742 1.13 jakllsch * penalty for the extra register write is acceptable, 1743 1.13 jakllsch * wdc_exec_command() isn't called often (mostly for autoconfig) 1744 1.1 kiyohara */ 1745 1.15 jakllsch if ((xfer->c_flags & C_ATAPI) != 0) { 1746 1.15 jakllsch MVSATA_WDC_WRITE_1(mvport, SRB_H, WDSD_IBM); 1747 1.15 jakllsch } 1748 1.1 kiyohara if ((ata_c->flags & AT_XFDONE) != 0) { 1749 1.1 kiyohara /* 1750 1.1 kiyohara * We have completed a data xfer. The drive should now be 1751 1.1 kiyohara * in its initial state 1752 1.1 kiyohara */ 1753 1.1 kiyohara if (wdcwait(chp, ata_c->r_st_bmask | WDCS_DRQ, 1754 1.36 jdolecek ata_c->r_st_bmask, (irq == 0) ? ata_c->timeout : 0, 1755 1.36 jdolecek wflags, &tfd) == WDCWAIT_TOUT) { 1756 1.36 jdolecek if (irq && (xfer->c_flags & C_TIMEOU) == 0) { 1757 1.36 jdolecek ata_channel_unlock(chp); 1758 1.1 kiyohara return 0; /* IRQ was not for us */ 1759 1.36 jdolecek } 1760 1.1 kiyohara ata_c->flags |= AT_TIMEOU; 1761 1.1 kiyohara } 1762 1.1 kiyohara goto out; 1763 1.1 kiyohara } 1764 1.1 kiyohara if (wdcwait(chp, ata_c->r_st_pmask, ata_c->r_st_pmask, 1765 1.36 jdolecek (irq == 0) ? ata_c->timeout : 0, wflags, &tfd) == WDCWAIT_TOUT) { 1766 1.36 jdolecek if (irq && (xfer->c_flags & C_TIMEOU) == 0) { 1767 1.36 jdolecek ata_channel_unlock(chp); 1768 1.36 jdolecek return 0; /* IRQ was not for us */ 1769 1.36 jdolecek } 1770 1.1 kiyohara ata_c->flags |= AT_TIMEOU; 1771 1.1 kiyohara goto out; 1772 1.1 kiyohara } 1773 1.33 kiyohara delay(20); /* XXXXX: Delay more times. */ 1774 1.1 kiyohara if (ata_c->flags & AT_READ) { 1775 1.36 jdolecek if ((ATACH_ST(tfd) & WDCS_DRQ) == 0) { 1776 1.1 kiyohara ata_c->flags |= AT_TIMEOU; 1777 1.1 kiyohara goto out; 1778 1.1 kiyohara } 1779 1.1 kiyohara wdc->datain_pio(chp, drive_flags, data, bcount); 1780 1.1 kiyohara /* at this point the drive should be in its initial state */ 1781 1.1 kiyohara ata_c->flags |= AT_XFDONE; 1782 1.1 kiyohara /* 1783 1.1 kiyohara * XXX checking the status register again here cause some 1784 1.1 kiyohara * hardware to timeout. 1785 1.1 kiyohara */ 1786 1.1 kiyohara } else if (ata_c->flags & AT_WRITE) { 1787 1.36 jdolecek if ((ATACH_ST(tfd) & WDCS_DRQ) == 0) { 1788 1.1 kiyohara ata_c->flags |= AT_TIMEOU; 1789 1.1 kiyohara goto out; 1790 1.1 kiyohara } 1791 1.1 kiyohara wdc->dataout_pio(chp, drive_flags, data, bcount); 1792 1.1 kiyohara ata_c->flags |= AT_XFDONE; 1793 1.1 kiyohara if ((ata_c->flags & AT_POLL) == 0) { 1794 1.43 jdolecek callout_reset(&chp->c_timo_callout, 1795 1.43 jdolecek mstohz(ata_c->timeout), wdctimeout, chp); 1796 1.36 jdolecek ata_channel_unlock(chp); 1797 1.1 kiyohara return 1; 1798 1.1 kiyohara } else 1799 1.1 kiyohara goto again; 1800 1.1 kiyohara } 1801 1.1 kiyohara out: 1802 1.36 jdolecek if (ATACH_ST(tfd) & WDCS_DWF) 1803 1.36 jdolecek ata_c->flags |= AT_DF; 1804 1.36 jdolecek if (ATACH_ST(tfd) & WDCS_ERR) { 1805 1.36 jdolecek ata_c->flags |= AT_ERROR; 1806 1.36 jdolecek ata_c->r_error = ATACH_ERR(tfd); 1807 1.36 jdolecek } 1808 1.36 jdolecek ata_channel_unlock(chp); 1809 1.1 kiyohara mvsata_wdc_cmd_done(chp, xfer); 1810 1.36 jdolecek 1811 1.36 jdolecek if ((ATACH_ST(tfd) & WDCS_ERR) == 0) 1812 1.36 jdolecek atastart(chp); 1813 1.36 jdolecek 1814 1.1 kiyohara return 1; 1815 1.1 kiyohara } 1816 1.1 kiyohara 1817 1.1 kiyohara static void 1818 1.1 kiyohara mvsata_wdc_cmd_kill_xfer(struct ata_channel *chp, struct ata_xfer *xfer, 1819 1.1 kiyohara int reason) 1820 1.1 kiyohara { 1821 1.1 kiyohara struct mvsata_port *mvport = (struct mvsata_port *)chp; 1822 1.36 jdolecek struct ata_command *ata_c = &xfer->c_ata_c; 1823 1.36 jdolecek bool deactivate = true; 1824 1.1 kiyohara 1825 1.36 jdolecek DPRINTF(DEBUG_FUNCS|DEBUG_XFERS, 1826 1.36 jdolecek ("%s:%d: mvsata_cmd_kill_xfer: drive=%d\n", 1827 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), chp->ch_channel, xfer->c_drive)); 1828 1.1 kiyohara 1829 1.1 kiyohara switch (reason) { 1830 1.36 jdolecek case KILL_GONE_INACTIVE: 1831 1.36 jdolecek deactivate = false; 1832 1.36 jdolecek /* FALLTHROUGH */ 1833 1.1 kiyohara case KILL_GONE: 1834 1.1 kiyohara ata_c->flags |= AT_GONE; 1835 1.1 kiyohara break; 1836 1.1 kiyohara case KILL_RESET: 1837 1.1 kiyohara ata_c->flags |= AT_RESET; 1838 1.1 kiyohara break; 1839 1.36 jdolecek case KILL_REQUEUE: 1840 1.36 jdolecek panic("%s: not supposed to be requeued\n", __func__); 1841 1.36 jdolecek break; 1842 1.1 kiyohara default: 1843 1.1 kiyohara aprint_error_dev(MVSATA_DEV2(mvport), 1844 1.1 kiyohara "mvsata_cmd_kill_xfer: unknown reason %d\n", reason); 1845 1.1 kiyohara panic("mvsata_cmd_kill_xfer"); 1846 1.1 kiyohara } 1847 1.36 jdolecek 1848 1.43 jdolecek mvsata_wdc_cmd_done_end(chp, xfer); 1849 1.43 jdolecek 1850 1.43 jdolecek if (deactivate) 1851 1.36 jdolecek ata_deactivate_xfer(chp, xfer); 1852 1.1 kiyohara } 1853 1.1 kiyohara 1854 1.1 kiyohara static void 1855 1.1 kiyohara mvsata_wdc_cmd_done(struct ata_channel *chp, struct ata_xfer *xfer) 1856 1.1 kiyohara { 1857 1.1 kiyohara struct mvsata_port *mvport = (struct mvsata_port *)chp; 1858 1.1 kiyohara struct atac_softc *atac = chp->ch_atac; 1859 1.36 jdolecek struct ata_command *ata_c = &xfer->c_ata_c; 1860 1.1 kiyohara 1861 1.36 jdolecek DPRINTF(DEBUG_FUNCS|DEBUG_XFERS, 1862 1.36 jdolecek ("%s:%d: mvsata_cmd_done: drive=%d, flags=0x%x\n", 1863 1.1 kiyohara device_xname(atac->atac_dev), chp->ch_channel, xfer->c_drive, 1864 1.1 kiyohara ata_c->flags)); 1865 1.1 kiyohara 1866 1.36 jdolecek if (ata_waitdrain_xfer_check(chp, xfer)) 1867 1.36 jdolecek return; 1868 1.36 jdolecek 1869 1.1 kiyohara if ((ata_c->flags & AT_READREG) != 0 && 1870 1.1 kiyohara device_is_active(atac->atac_dev) && 1871 1.1 kiyohara (ata_c->flags & (AT_ERROR | AT_DF)) == 0) { 1872 1.15 jakllsch ata_c->r_status = MVSATA_WDC_READ_1(mvport, SRB_CS); 1873 1.15 jakllsch ata_c->r_error = MVSATA_WDC_READ_1(mvport, SRB_FE); 1874 1.1 kiyohara ata_c->r_count = MVSATA_WDC_READ_1(mvport, SRB_SC); 1875 1.15 jakllsch ata_c->r_lba = 1876 1.15 jakllsch (uint64_t)MVSATA_WDC_READ_1(mvport, SRB_LBAL) << 0; 1877 1.15 jakllsch ata_c->r_lba |= 1878 1.15 jakllsch (uint64_t)MVSATA_WDC_READ_1(mvport, SRB_LBAM) << 8; 1879 1.15 jakllsch ata_c->r_lba |= 1880 1.15 jakllsch (uint64_t)MVSATA_WDC_READ_1(mvport, SRB_LBAH) << 16; 1881 1.15 jakllsch ata_c->r_device = MVSATA_WDC_READ_1(mvport, SRB_H); 1882 1.15 jakllsch if ((ata_c->flags & AT_LBA48) != 0) { 1883 1.15 jakllsch if ((ata_c->flags & AT_POLL) != 0) { 1884 1.15 jakllsch MVSATA_WDC_WRITE_1(mvport, SRB_CAS, 1885 1.15 jakllsch WDCTL_HOB|WDCTL_4BIT|WDCTL_IDS); 1886 1.15 jakllsch } else { 1887 1.15 jakllsch MVSATA_WDC_WRITE_1(mvport, SRB_CAS, 1888 1.15 jakllsch WDCTL_HOB|WDCTL_4BIT); 1889 1.15 jakllsch } 1890 1.15 jakllsch ata_c->r_count |= 1891 1.15 jakllsch MVSATA_WDC_READ_1(mvport, SRB_SC) << 8; 1892 1.24 bouyer ata_c->r_lba |= 1893 1.15 jakllsch (uint64_t)MVSATA_WDC_READ_1(mvport, SRB_LBAL) << 24; 1894 1.15 jakllsch ata_c->r_lba |= 1895 1.15 jakllsch (uint64_t)MVSATA_WDC_READ_1(mvport, SRB_LBAM) << 32; 1896 1.15 jakllsch ata_c->r_lba |= 1897 1.15 jakllsch (uint64_t)MVSATA_WDC_READ_1(mvport, SRB_LBAH) << 40; 1898 1.15 jakllsch if ((ata_c->flags & AT_POLL) != 0) { 1899 1.15 jakllsch MVSATA_WDC_WRITE_1(mvport, SRB_CAS, 1900 1.15 jakllsch WDCTL_4BIT|WDCTL_IDS); 1901 1.15 jakllsch } else { 1902 1.15 jakllsch MVSATA_WDC_WRITE_1(mvport, SRB_CAS, 1903 1.15 jakllsch WDCTL_4BIT); 1904 1.15 jakllsch } 1905 1.15 jakllsch } else { 1906 1.15 jakllsch ata_c->r_lba |= 1907 1.15 jakllsch (uint64_t)(ata_c->r_device & 0x0f) << 24; 1908 1.15 jakllsch } 1909 1.1 kiyohara } 1910 1.36 jdolecek 1911 1.1 kiyohara if (ata_c->flags & AT_POLL) { 1912 1.1 kiyohara /* enable interrupts */ 1913 1.1 kiyohara MVSATA_WDC_WRITE_1(mvport, SRB_CAS, WDCTL_4BIT); 1914 1.1 kiyohara delay(10); /* some drives need a little delay here */ 1915 1.1 kiyohara } 1916 1.36 jdolecek 1917 1.36 jdolecek mvsata_wdc_cmd_done_end(chp, xfer); 1918 1.43 jdolecek 1919 1.43 jdolecek ata_deactivate_xfer(chp, xfer); 1920 1.1 kiyohara } 1921 1.1 kiyohara 1922 1.1 kiyohara static void 1923 1.1 kiyohara mvsata_wdc_cmd_done_end(struct ata_channel *chp, struct ata_xfer *xfer) 1924 1.1 kiyohara { 1925 1.1 kiyohara struct mvsata_port *mvport = (struct mvsata_port *)chp; 1926 1.36 jdolecek struct ata_command *ata_c = &xfer->c_ata_c; 1927 1.1 kiyohara 1928 1.1 kiyohara /* EDMA restart, if enabled */ 1929 1.36 jdolecek if (mvport->port_edmamode_curr != nodma) { 1930 1.1 kiyohara mvsata_edma_reset_qptr(mvport); 1931 1.1 kiyohara mvsata_edma_enable(mvport); 1932 1.1 kiyohara } 1933 1.1 kiyohara 1934 1.1 kiyohara ata_c->flags |= AT_DONE; 1935 1.1 kiyohara } 1936 1.1 kiyohara 1937 1.1 kiyohara #if NATAPIBUS > 0 1938 1.43 jdolecek static const struct ata_xfer_ops mvsata_atapi_xfer_ops = { 1939 1.43 jdolecek .c_start = mvsata_atapi_start, 1940 1.43 jdolecek .c_intr = mvsata_atapi_intr, 1941 1.43 jdolecek .c_poll = mvsata_atapi_poll, 1942 1.43 jdolecek .c_abort = mvsata_atapi_reset, 1943 1.43 jdolecek .c_kill_xfer = mvsata_atapi_kill_xfer, 1944 1.43 jdolecek }; 1945 1.43 jdolecek 1946 1.1 kiyohara static void 1947 1.36 jdolecek mvsata_atapi_scsipi_request(struct scsipi_channel *chan, 1948 1.36 jdolecek scsipi_adapter_req_t req, void *arg) 1949 1.36 jdolecek { 1950 1.36 jdolecek struct scsipi_adapter *adapt = chan->chan_adapter; 1951 1.36 jdolecek struct scsipi_periph *periph; 1952 1.36 jdolecek struct scsipi_xfer *sc_xfer; 1953 1.36 jdolecek struct mvsata_softc *sc = device_private(adapt->adapt_dev); 1954 1.36 jdolecek struct atac_softc *atac = &sc->sc_wdcdev.sc_atac; 1955 1.36 jdolecek struct ata_channel *chp = atac->atac_channels[chan->chan_channel]; 1956 1.36 jdolecek struct ata_xfer *xfer; 1957 1.36 jdolecek int drive, s; 1958 1.36 jdolecek 1959 1.36 jdolecek switch (req) { 1960 1.36 jdolecek case ADAPTER_REQ_RUN_XFER: 1961 1.36 jdolecek sc_xfer = arg; 1962 1.36 jdolecek periph = sc_xfer->xs_periph; 1963 1.36 jdolecek drive = periph->periph_target; 1964 1.36 jdolecek 1965 1.36 jdolecek if (!device_is_active(atac->atac_dev)) { 1966 1.36 jdolecek sc_xfer->error = XS_DRIVER_STUFFUP; 1967 1.36 jdolecek scsipi_done(sc_xfer); 1968 1.36 jdolecek return; 1969 1.36 jdolecek } 1970 1.43 jdolecek xfer = ata_get_xfer(chp, false); 1971 1.36 jdolecek if (xfer == NULL) { 1972 1.36 jdolecek sc_xfer->error = XS_RESOURCE_SHORTAGE; 1973 1.36 jdolecek scsipi_done(sc_xfer); 1974 1.36 jdolecek return; 1975 1.36 jdolecek } 1976 1.36 jdolecek 1977 1.36 jdolecek if (sc_xfer->xs_control & XS_CTL_POLL) 1978 1.36 jdolecek xfer->c_flags |= C_POLL; 1979 1.36 jdolecek xfer->c_drive = drive; 1980 1.36 jdolecek xfer->c_flags |= C_ATAPI; 1981 1.36 jdolecek xfer->c_databuf = sc_xfer->data; 1982 1.36 jdolecek xfer->c_bcount = sc_xfer->datalen; 1983 1.43 jdolecek xfer->ops = &mvsata_atapi_xfer_ops; 1984 1.43 jdolecek xfer->c_scsipi = sc_xfer; 1985 1.43 jdolecek xfer->c_atapi.c_dscpoll = 0; 1986 1.36 jdolecek s = splbio(); 1987 1.36 jdolecek ata_exec_xfer(chp, xfer); 1988 1.36 jdolecek #ifdef DIAGNOSTIC 1989 1.36 jdolecek if ((sc_xfer->xs_control & XS_CTL_POLL) != 0 && 1990 1.36 jdolecek (sc_xfer->xs_status & XS_STS_DONE) == 0) 1991 1.36 jdolecek panic("mvsata_atapi_scsipi_request:" 1992 1.36 jdolecek " polled command not done"); 1993 1.36 jdolecek #endif 1994 1.36 jdolecek splx(s); 1995 1.36 jdolecek return; 1996 1.36 jdolecek 1997 1.36 jdolecek default: 1998 1.36 jdolecek /* Not supported, nothing to do. */ 1999 1.36 jdolecek ; 2000 1.36 jdolecek } 2001 1.36 jdolecek } 2002 1.36 jdolecek 2003 1.36 jdolecek static int 2004 1.1 kiyohara mvsata_atapi_start(struct ata_channel *chp, struct ata_xfer *xfer) 2005 1.1 kiyohara { 2006 1.1 kiyohara struct mvsata_softc *sc = (struct mvsata_softc *)chp->ch_atac; 2007 1.1 kiyohara struct mvsata_port *mvport = (struct mvsata_port *)chp; 2008 1.1 kiyohara struct atac_softc *atac = &sc->sc_wdcdev.sc_atac; 2009 1.36 jdolecek struct scsipi_xfer *sc_xfer = xfer->c_scsipi; 2010 1.1 kiyohara struct ata_drive_datas *drvp = &chp->ch_drive[xfer->c_drive]; 2011 1.1 kiyohara const int wait_flags = (xfer->c_flags & C_POLL) ? AT_POLL : 0; 2012 1.1 kiyohara const char *errstring; 2013 1.36 jdolecek int tfd; 2014 1.1 kiyohara 2015 1.36 jdolecek DPRINTF(DEBUG_FUNCS|DEBUG_XFERS, 2016 1.36 jdolecek ("%s:%d:%d: mvsata_atapi_start: scsi flags 0x%x\n", 2017 1.1 kiyohara device_xname(chp->ch_atac->atac_dev), chp->ch_channel, 2018 1.1 kiyohara xfer->c_drive, sc_xfer->xs_control)); 2019 1.1 kiyohara 2020 1.36 jdolecek ata_channel_lock_owned(chp); 2021 1.36 jdolecek 2022 1.36 jdolecek KASSERT((chp->ch_flags & ATACH_NCQ) == 0); 2023 1.36 jdolecek if (mvport->port_edmamode_curr != nodma) 2024 1.1 kiyohara mvsata_edma_disable(mvport, 10 /* ms */, wait_flags); 2025 1.1 kiyohara 2026 1.29 jakllsch mvsata_pmp_select(mvport, xfer->c_drive); 2027 1.29 jakllsch 2028 1.1 kiyohara if ((xfer->c_flags & C_DMA) && (drvp->n_xfers <= NXFER)) 2029 1.1 kiyohara drvp->n_xfers++; 2030 1.1 kiyohara 2031 1.1 kiyohara /* Do control operations specially. */ 2032 1.1 kiyohara if (__predict_false(drvp->state < READY)) { 2033 1.1 kiyohara /* If it's not a polled command, we need the kernel thread */ 2034 1.55 jdolecek if ((sc_xfer->xs_control & XS_CTL_POLL) == 0 2035 1.55 jdolecek && !ata_is_thread_run(chp)) 2036 1.36 jdolecek return ATASTART_TH; 2037 1.55 jdolecek 2038 1.1 kiyohara /* 2039 1.1 kiyohara * disable interrupts, all commands here should be quick 2040 1.4 snj * enough to be able to poll, and we don't go here that often 2041 1.1 kiyohara */ 2042 1.1 kiyohara MVSATA_WDC_WRITE_1(mvport, SRB_CAS, WDCTL_4BIT | WDCTL_IDS); 2043 1.1 kiyohara 2044 1.1 kiyohara MVSATA_WDC_WRITE_1(mvport, SRB_H, WDSD_IBM); 2045 1.1 kiyohara /* Don't try to set mode if controller can't be adjusted */ 2046 1.1 kiyohara if (atac->atac_set_modes == NULL) 2047 1.1 kiyohara goto ready; 2048 1.1 kiyohara /* Also don't try if the drive didn't report its mode */ 2049 1.24 bouyer if ((drvp->drive_flags & ATA_DRIVE_MODE) == 0) 2050 1.1 kiyohara goto ready; 2051 1.1 kiyohara errstring = "unbusy"; 2052 1.36 jdolecek if (wdc_wait_for_unbusy(chp, ATAPI_DELAY, wait_flags, &tfd)) 2053 1.1 kiyohara goto timeout; 2054 1.29 jakllsch wdccommand(chp, 0, SET_FEATURES, 0, 0, 0, 2055 1.1 kiyohara 0x08 | drvp->PIO_mode, WDSF_SET_MODE); 2056 1.36 jdolecek errstring = "piomode-atapi"; 2057 1.36 jdolecek if (wdc_wait_for_unbusy(chp, ATAPI_MODE_DELAY, wait_flags, 2058 1.36 jdolecek &tfd)) 2059 1.1 kiyohara goto timeout; 2060 1.36 jdolecek if (ATACH_ST(tfd) & WDCS_ERR) { 2061 1.36 jdolecek if (ATACH_ERR(tfd) == WDCE_ABRT) { 2062 1.1 kiyohara /* 2063 1.1 kiyohara * Some ATAPI drives reject PIO settings. 2064 1.1 kiyohara * Fall back to PIO mode 3 since that's the 2065 1.1 kiyohara * minimum for ATAPI. 2066 1.1 kiyohara */ 2067 1.1 kiyohara aprint_error_dev(atac->atac_dev, 2068 1.1 kiyohara "channel %d drive %d: PIO mode %d rejected," 2069 1.1 kiyohara " falling back to PIO mode 3\n", 2070 1.1 kiyohara chp->ch_channel, xfer->c_drive, 2071 1.1 kiyohara drvp->PIO_mode); 2072 1.1 kiyohara if (drvp->PIO_mode > 3) 2073 1.1 kiyohara drvp->PIO_mode = 3; 2074 1.1 kiyohara } else 2075 1.1 kiyohara goto error; 2076 1.1 kiyohara } 2077 1.24 bouyer if (drvp->drive_flags & ATA_DRIVE_UDMA) 2078 1.29 jakllsch wdccommand(chp, 0, SET_FEATURES, 0, 0, 0, 2079 1.1 kiyohara 0x40 | drvp->UDMA_mode, WDSF_SET_MODE); 2080 1.1 kiyohara else 2081 1.24 bouyer if (drvp->drive_flags & ATA_DRIVE_DMA) 2082 1.29 jakllsch wdccommand(chp, 0, SET_FEATURES, 0, 0, 0, 2083 1.1 kiyohara 0x20 | drvp->DMA_mode, WDSF_SET_MODE); 2084 1.1 kiyohara else 2085 1.1 kiyohara goto ready; 2086 1.36 jdolecek errstring = "dmamode-atapi"; 2087 1.36 jdolecek if (wdc_wait_for_unbusy(chp, ATAPI_MODE_DELAY, wait_flags, 2088 1.36 jdolecek &tfd)) 2089 1.1 kiyohara goto timeout; 2090 1.36 jdolecek if (ATACH_ST(tfd) & WDCS_ERR) { 2091 1.36 jdolecek if (ATACH_ERR(tfd) == WDCE_ABRT) { 2092 1.24 bouyer if (drvp->drive_flags & ATA_DRIVE_UDMA) 2093 1.1 kiyohara goto error; 2094 1.1 kiyohara else { 2095 1.1 kiyohara /* 2096 1.1 kiyohara * The drive rejected our DMA setting. 2097 1.1 kiyohara * Fall back to mode 1. 2098 1.1 kiyohara */ 2099 1.1 kiyohara aprint_error_dev(atac->atac_dev, 2100 1.1 kiyohara "channel %d drive %d:" 2101 1.1 kiyohara " DMA mode %d rejected," 2102 1.1 kiyohara " falling back to DMA mode 0\n", 2103 1.1 kiyohara chp->ch_channel, xfer->c_drive, 2104 1.1 kiyohara drvp->DMA_mode); 2105 1.1 kiyohara if (drvp->DMA_mode > 0) 2106 1.1 kiyohara drvp->DMA_mode = 0; 2107 1.1 kiyohara } 2108 1.1 kiyohara } else 2109 1.1 kiyohara goto error; 2110 1.1 kiyohara } 2111 1.1 kiyohara ready: 2112 1.1 kiyohara drvp->state = READY; 2113 1.1 kiyohara MVSATA_WDC_WRITE_1(mvport, SRB_CAS, WDCTL_4BIT); 2114 1.1 kiyohara delay(10); /* some drives need a little delay here */ 2115 1.1 kiyohara } 2116 1.1 kiyohara MVSATA_WDC_WRITE_1(mvport, SRB_H, WDSD_IBM); 2117 1.36 jdolecek if (wdc_wait_for_unbusy(chp, ATAPI_DELAY, wait_flags, &tfd) != 0) { 2118 1.1 kiyohara aprint_error_dev(atac->atac_dev, "not ready, st = %02x\n", 2119 1.36 jdolecek ATACH_ST(tfd)); 2120 1.1 kiyohara sc_xfer->error = XS_TIMEOUT; 2121 1.36 jdolecek return ATASTART_ABORT; 2122 1.1 kiyohara } 2123 1.1 kiyohara 2124 1.57 jdolecek /* start timeout machinery */ 2125 1.57 jdolecek if ((sc_xfer->xs_control & XS_CTL_POLL) == 0) 2126 1.57 jdolecek callout_reset(&chp->c_timo_callout, mstohz(sc_xfer->timeout), 2127 1.57 jdolecek wdctimeout, chp); 2128 1.57 jdolecek 2129 1.1 kiyohara /* 2130 1.1 kiyohara * Even with WDCS_ERR, the device should accept a command packet 2131 1.1 kiyohara * Limit length to what can be stuffed into the cylinder register 2132 1.1 kiyohara * (16 bits). Some CD-ROMs seem to interpret '0' as 65536, 2133 1.1 kiyohara * but not all devices do that and it's not obvious from the 2134 1.1 kiyohara * ATAPI spec that that behaviour should be expected. If more 2135 1.1 kiyohara * data is necessary, multiple data transfer phases will be done. 2136 1.1 kiyohara */ 2137 1.1 kiyohara 2138 1.29 jakllsch wdccommand(chp, 0, ATAPI_PKT_CMD, 2139 1.1 kiyohara xfer->c_bcount <= 0xffff ? xfer->c_bcount : 0xffff, 0, 0, 0, 2140 1.1 kiyohara (xfer->c_flags & C_DMA) ? ATAPI_PKT_CMD_FTRE_DMA : 0); 2141 1.1 kiyohara 2142 1.1 kiyohara /* 2143 1.1 kiyohara * If there is no interrupt for CMD input, busy-wait for it (done in 2144 1.36 jdolecek * the interrupt routine. Poll routine will exit early in this case. 2145 1.1 kiyohara */ 2146 1.1 kiyohara if ((sc_xfer->xs_periph->periph_cap & ATAPI_CFG_DRQ_MASK) != 2147 1.36 jdolecek ATAPI_CFG_IRQ_DRQ || (sc_xfer->xs_control & XS_CTL_POLL)) 2148 1.36 jdolecek return ATASTART_POLL; 2149 1.36 jdolecek else 2150 1.36 jdolecek return ATASTART_STARTED; 2151 1.1 kiyohara 2152 1.1 kiyohara timeout: 2153 1.1 kiyohara aprint_error_dev(atac->atac_dev, "channel %d drive %d: %s timed out\n", 2154 1.1 kiyohara chp->ch_channel, xfer->c_drive, errstring); 2155 1.1 kiyohara sc_xfer->error = XS_TIMEOUT; 2156 1.1 kiyohara MVSATA_WDC_WRITE_1(mvport, SRB_CAS, WDCTL_4BIT); 2157 1.1 kiyohara delay(10); /* some drives need a little delay here */ 2158 1.36 jdolecek return ATASTART_ABORT; 2159 1.1 kiyohara 2160 1.1 kiyohara error: 2161 1.1 kiyohara aprint_error_dev(atac->atac_dev, 2162 1.1 kiyohara "channel %d drive %d: %s error (0x%x)\n", 2163 1.36 jdolecek chp->ch_channel, xfer->c_drive, errstring, ATACH_ERR(tfd)); 2164 1.1 kiyohara sc_xfer->error = XS_SHORTSENSE; 2165 1.36 jdolecek sc_xfer->sense.atapi_sense = ATACH_ERR(tfd); 2166 1.1 kiyohara MVSATA_WDC_WRITE_1(mvport, SRB_CAS, WDCTL_4BIT); 2167 1.1 kiyohara delay(10); /* some drives need a little delay here */ 2168 1.36 jdolecek return ATASTART_ABORT; 2169 1.36 jdolecek } 2170 1.36 jdolecek 2171 1.61 rin static int 2172 1.36 jdolecek mvsata_atapi_poll(struct ata_channel *chp, struct ata_xfer *xfer) 2173 1.36 jdolecek { 2174 1.36 jdolecek /* 2175 1.36 jdolecek * If there is no interrupt for CMD input, busy-wait for it (done in 2176 1.36 jdolecek * the interrupt routine. If it is a polled command, call the interrupt 2177 1.36 jdolecek * routine until command is done. 2178 1.36 jdolecek */ 2179 1.36 jdolecek const bool poll = ((xfer->c_scsipi->xs_control & XS_CTL_POLL) != 0); 2180 1.36 jdolecek 2181 1.36 jdolecek /* Wait for at last 400ns for status bit to be valid */ 2182 1.36 jdolecek DELAY(1); 2183 1.36 jdolecek mvsata_atapi_intr(chp, xfer, 0); 2184 1.36 jdolecek 2185 1.36 jdolecek if (!poll) 2186 1.61 rin return ATAPOLL_DONE; 2187 1.36 jdolecek 2188 1.36 jdolecek if (chp->ch_flags & ATACH_DMA_WAIT) { 2189 1.36 jdolecek wdc_dmawait(chp, xfer, xfer->c_scsipi->timeout); 2190 1.36 jdolecek chp->ch_flags &= ~ATACH_DMA_WAIT; 2191 1.36 jdolecek } 2192 1.36 jdolecek 2193 1.36 jdolecek while ((xfer->c_scsipi->xs_status & XS_STS_DONE) == 0) { 2194 1.36 jdolecek /* Wait for at last 400ns for status bit to be valid */ 2195 1.36 jdolecek DELAY(1); 2196 1.36 jdolecek mvsata_atapi_intr(chp, xfer, 0); 2197 1.36 jdolecek } 2198 1.61 rin 2199 1.61 rin return ATAPOLL_DONE; 2200 1.1 kiyohara } 2201 1.1 kiyohara 2202 1.1 kiyohara static int 2203 1.1 kiyohara mvsata_atapi_intr(struct ata_channel *chp, struct ata_xfer *xfer, int irq) 2204 1.1 kiyohara { 2205 1.1 kiyohara struct mvsata_port *mvport = (struct mvsata_port *)chp; 2206 1.1 kiyohara struct atac_softc *atac = chp->ch_atac; 2207 1.1 kiyohara struct wdc_softc *wdc = CHAN_TO_WDC(chp); 2208 1.36 jdolecek struct scsipi_xfer *sc_xfer = xfer->c_scsipi; 2209 1.1 kiyohara struct ata_drive_datas *drvp = &chp->ch_drive[xfer->c_drive]; 2210 1.1 kiyohara int len, phase, ire, error, retries=0, i; 2211 1.36 jdolecek int tfd; 2212 1.1 kiyohara void *cmd; 2213 1.1 kiyohara 2214 1.36 jdolecek ata_channel_lock(chp); 2215 1.36 jdolecek 2216 1.36 jdolecek DPRINTF(DEBUG_FUNCS|DEBUG_XFERS, 2217 1.36 jdolecek ("%s:%d:%d: mvsata_atapi_intr\n", 2218 1.1 kiyohara device_xname(atac->atac_dev), chp->ch_channel, xfer->c_drive)); 2219 1.1 kiyohara 2220 1.1 kiyohara /* Is it not a transfer, but a control operation? */ 2221 1.1 kiyohara if (drvp->state < READY) { 2222 1.1 kiyohara aprint_error_dev(atac->atac_dev, 2223 1.1 kiyohara "channel %d drive %d: bad state %d\n", 2224 1.1 kiyohara chp->ch_channel, xfer->c_drive, drvp->state); 2225 1.1 kiyohara panic("mvsata_atapi_intr: bad state"); 2226 1.1 kiyohara } 2227 1.1 kiyohara /* 2228 1.1 kiyohara * If we missed an interrupt in a PIO transfer, reset and restart. 2229 1.1 kiyohara * Don't try to continue transfer, we may have missed cycles. 2230 1.1 kiyohara */ 2231 1.1 kiyohara if ((xfer->c_flags & (C_TIMEOU | C_DMA)) == C_TIMEOU) { 2232 1.36 jdolecek ata_channel_unlock(chp); 2233 1.1 kiyohara sc_xfer->error = XS_TIMEOUT; 2234 1.1 kiyohara mvsata_atapi_reset(chp, xfer); 2235 1.1 kiyohara return 1; 2236 1.1 kiyohara } 2237 1.1 kiyohara 2238 1.1 kiyohara /* Ack interrupt done in wdc_wait_for_unbusy */ 2239 1.1 kiyohara MVSATA_WDC_WRITE_1(mvport, SRB_H, WDSD_IBM); 2240 1.1 kiyohara if (wdc_wait_for_unbusy(chp, 2241 1.36 jdolecek (irq == 0) ? sc_xfer->timeout : 0, AT_POLL, &tfd) == WDCWAIT_TOUT) { 2242 1.36 jdolecek if (irq && (xfer->c_flags & C_TIMEOU) == 0) { 2243 1.36 jdolecek ata_channel_unlock(chp); 2244 1.1 kiyohara return 0; /* IRQ was not for us */ 2245 1.36 jdolecek } 2246 1.1 kiyohara aprint_error_dev(atac->atac_dev, 2247 1.1 kiyohara "channel %d: device timeout, c_bcount=%d, c_skip=%d\n", 2248 1.1 kiyohara chp->ch_channel, xfer->c_bcount, xfer->c_skip); 2249 1.1 kiyohara if (xfer->c_flags & C_DMA) 2250 1.1 kiyohara ata_dmaerr(drvp, 2251 1.1 kiyohara (xfer->c_flags & C_POLL) ? AT_POLL : 0); 2252 1.1 kiyohara sc_xfer->error = XS_TIMEOUT; 2253 1.45 jdolecek ata_channel_unlock(chp); 2254 1.1 kiyohara mvsata_atapi_reset(chp, xfer); 2255 1.1 kiyohara return 1; 2256 1.1 kiyohara } 2257 1.1 kiyohara 2258 1.1 kiyohara /* 2259 1.1 kiyohara * If we missed an IRQ and were using DMA, flag it as a DMA error 2260 1.1 kiyohara * and reset device. 2261 1.1 kiyohara */ 2262 1.1 kiyohara if ((xfer->c_flags & C_TIMEOU) && (xfer->c_flags & C_DMA)) { 2263 1.1 kiyohara ata_dmaerr(drvp, (xfer->c_flags & C_POLL) ? AT_POLL : 0); 2264 1.1 kiyohara sc_xfer->error = XS_RESET; 2265 1.45 jdolecek ata_channel_unlock(chp); 2266 1.1 kiyohara mvsata_atapi_reset(chp, xfer); 2267 1.1 kiyohara return (1); 2268 1.1 kiyohara } 2269 1.1 kiyohara /* 2270 1.1 kiyohara * if the request sense command was aborted, report the short sense 2271 1.1 kiyohara * previously recorded, else continue normal processing 2272 1.1 kiyohara */ 2273 1.1 kiyohara 2274 1.1 kiyohara again: 2275 1.1 kiyohara len = MVSATA_WDC_READ_1(mvport, SRB_LBAM) + 2276 1.1 kiyohara 256 * MVSATA_WDC_READ_1(mvport, SRB_LBAH); 2277 1.1 kiyohara ire = MVSATA_WDC_READ_1(mvport, SRB_SC); 2278 1.36 jdolecek phase = (ire & (WDCI_CMD | WDCI_IN)) | (ATACH_ST(tfd) & WDCS_DRQ); 2279 1.36 jdolecek DPRINTF(DEBUG_FUNCS|DEBUG_XFERS, ( 2280 1.1 kiyohara "mvsata_atapi_intr: c_bcount %d len %d st 0x%x err 0x%x ire 0x%x :", 2281 1.36 jdolecek xfer->c_bcount, len, ATACH_ST(tfd), ATACH_ERR(tfd), ire)); 2282 1.1 kiyohara 2283 1.1 kiyohara switch (phase) { 2284 1.1 kiyohara case PHASE_CMDOUT: 2285 1.1 kiyohara cmd = sc_xfer->cmd; 2286 1.36 jdolecek DPRINTF(DEBUG_FUNCS|DEBUG_XFERS, ("PHASE_CMDOUT\n")); 2287 1.1 kiyohara /* Init the DMA channel if necessary */ 2288 1.1 kiyohara if (xfer->c_flags & C_DMA) { 2289 1.36 jdolecek error = mvsata_bdma_init(mvport, xfer); 2290 1.1 kiyohara if (error) { 2291 1.1 kiyohara if (error == EINVAL) { 2292 1.1 kiyohara /* 2293 1.1 kiyohara * We can't do DMA on this transfer 2294 1.1 kiyohara * for some reason. Fall back to PIO. 2295 1.1 kiyohara */ 2296 1.1 kiyohara xfer->c_flags &= ~C_DMA; 2297 1.1 kiyohara error = 0; 2298 1.1 kiyohara } else { 2299 1.1 kiyohara sc_xfer->error = XS_DRIVER_STUFFUP; 2300 1.1 kiyohara break; 2301 1.1 kiyohara } 2302 1.1 kiyohara } 2303 1.1 kiyohara } 2304 1.1 kiyohara 2305 1.1 kiyohara /* send packet command */ 2306 1.1 kiyohara /* Commands are 12 or 16 bytes long. It's 32-bit aligned */ 2307 1.1 kiyohara wdc->dataout_pio(chp, drvp->drive_flags, cmd, sc_xfer->cmdlen); 2308 1.1 kiyohara 2309 1.1 kiyohara /* Start the DMA channel if necessary */ 2310 1.1 kiyohara if (xfer->c_flags & C_DMA) { 2311 1.1 kiyohara mvsata_bdma_start(mvport); 2312 1.1 kiyohara chp->ch_flags |= ATACH_DMA_WAIT; 2313 1.1 kiyohara } 2314 1.36 jdolecek ata_channel_unlock(chp); 2315 1.1 kiyohara return 1; 2316 1.1 kiyohara 2317 1.1 kiyohara case PHASE_DATAOUT: 2318 1.1 kiyohara /* write data */ 2319 1.36 jdolecek DPRINTF(DEBUG_XFERS, ("PHASE_DATAOUT\n")); 2320 1.1 kiyohara if ((sc_xfer->xs_control & XS_CTL_DATA_OUT) == 0 || 2321 1.1 kiyohara (xfer->c_flags & C_DMA) != 0) { 2322 1.1 kiyohara aprint_error_dev(atac->atac_dev, 2323 1.1 kiyohara "channel %d drive %d: bad data phase DATAOUT\n", 2324 1.1 kiyohara chp->ch_channel, xfer->c_drive); 2325 1.1 kiyohara if (xfer->c_flags & C_DMA) 2326 1.1 kiyohara ata_dmaerr(drvp, 2327 1.1 kiyohara (xfer->c_flags & C_POLL) ? AT_POLL : 0); 2328 1.1 kiyohara sc_xfer->error = XS_TIMEOUT; 2329 1.45 jdolecek ata_channel_unlock(chp); 2330 1.1 kiyohara mvsata_atapi_reset(chp, xfer); 2331 1.1 kiyohara return 1; 2332 1.1 kiyohara } 2333 1.43 jdolecek xfer->c_atapi.c_lenoff = len - xfer->c_bcount; 2334 1.1 kiyohara if (xfer->c_bcount < len) { 2335 1.1 kiyohara aprint_error_dev(atac->atac_dev, "channel %d drive %d:" 2336 1.1 kiyohara " warning: write only %d of %d requested bytes\n", 2337 1.1 kiyohara chp->ch_channel, xfer->c_drive, xfer->c_bcount, 2338 1.1 kiyohara len); 2339 1.1 kiyohara len = xfer->c_bcount; 2340 1.1 kiyohara } 2341 1.1 kiyohara 2342 1.1 kiyohara wdc->dataout_pio(chp, drvp->drive_flags, 2343 1.1 kiyohara (char *)xfer->c_databuf + xfer->c_skip, len); 2344 1.1 kiyohara 2345 1.43 jdolecek for (i = xfer->c_atapi.c_lenoff; i > 0; i -= 2) 2346 1.1 kiyohara MVSATA_WDC_WRITE_2(mvport, SRB_PIOD, 0); 2347 1.1 kiyohara 2348 1.1 kiyohara xfer->c_skip += len; 2349 1.1 kiyohara xfer->c_bcount -= len; 2350 1.36 jdolecek ata_channel_unlock(chp); 2351 1.1 kiyohara return 1; 2352 1.1 kiyohara 2353 1.1 kiyohara case PHASE_DATAIN: 2354 1.1 kiyohara /* Read data */ 2355 1.36 jdolecek DPRINTF(DEBUG_XFERS, ("PHASE_DATAIN\n")); 2356 1.1 kiyohara if ((sc_xfer->xs_control & XS_CTL_DATA_IN) == 0 || 2357 1.1 kiyohara (xfer->c_flags & C_DMA) != 0) { 2358 1.1 kiyohara aprint_error_dev(atac->atac_dev, 2359 1.1 kiyohara "channel %d drive %d: bad data phase DATAIN\n", 2360 1.1 kiyohara chp->ch_channel, xfer->c_drive); 2361 1.1 kiyohara if (xfer->c_flags & C_DMA) 2362 1.1 kiyohara ata_dmaerr(drvp, 2363 1.1 kiyohara (xfer->c_flags & C_POLL) ? AT_POLL : 0); 2364 1.45 jdolecek ata_channel_unlock(chp); 2365 1.1 kiyohara sc_xfer->error = XS_TIMEOUT; 2366 1.1 kiyohara mvsata_atapi_reset(chp, xfer); 2367 1.1 kiyohara return 1; 2368 1.1 kiyohara } 2369 1.43 jdolecek xfer->c_atapi.c_lenoff = len - xfer->c_bcount; 2370 1.1 kiyohara if (xfer->c_bcount < len) { 2371 1.1 kiyohara aprint_error_dev(atac->atac_dev, "channel %d drive %d:" 2372 1.1 kiyohara " warning: reading only %d of %d bytes\n", 2373 1.1 kiyohara chp->ch_channel, xfer->c_drive, xfer->c_bcount, 2374 1.1 kiyohara len); 2375 1.1 kiyohara len = xfer->c_bcount; 2376 1.1 kiyohara } 2377 1.1 kiyohara 2378 1.1 kiyohara wdc->datain_pio(chp, drvp->drive_flags, 2379 1.1 kiyohara (char *)xfer->c_databuf + xfer->c_skip, len); 2380 1.1 kiyohara 2381 1.43 jdolecek if (xfer->c_atapi.c_lenoff > 0) 2382 1.1 kiyohara wdcbit_bucket(chp, len - xfer->c_bcount); 2383 1.1 kiyohara 2384 1.1 kiyohara xfer->c_skip += len; 2385 1.1 kiyohara xfer->c_bcount -= len; 2386 1.36 jdolecek ata_channel_unlock(chp); 2387 1.1 kiyohara return 1; 2388 1.1 kiyohara 2389 1.1 kiyohara case PHASE_ABORTED: 2390 1.1 kiyohara case PHASE_COMPLETED: 2391 1.36 jdolecek DPRINTF(DEBUG_XFERS, ("PHASE_COMPLETED\n")); 2392 1.1 kiyohara if (xfer->c_flags & C_DMA) 2393 1.1 kiyohara xfer->c_bcount -= sc_xfer->datalen; 2394 1.1 kiyohara sc_xfer->resid = xfer->c_bcount; 2395 1.36 jdolecek /* this will unlock channel lock too */ 2396 1.46 jdolecek mvsata_atapi_phase_complete(xfer, tfd); 2397 1.1 kiyohara return 1; 2398 1.1 kiyohara 2399 1.1 kiyohara default: 2400 1.1 kiyohara if (++retries<500) { 2401 1.1 kiyohara DELAY(100); 2402 1.36 jdolecek tfd = ATACH_ERR_ST( 2403 1.36 jdolecek MVSATA_WDC_READ_1(mvport, SRB_FE), 2404 1.36 jdolecek MVSATA_WDC_READ_1(mvport, SRB_CS) 2405 1.36 jdolecek ); 2406 1.1 kiyohara goto again; 2407 1.1 kiyohara } 2408 1.1 kiyohara aprint_error_dev(atac->atac_dev, 2409 1.1 kiyohara "channel %d drive %d: unknown phase 0x%x\n", 2410 1.1 kiyohara chp->ch_channel, xfer->c_drive, phase); 2411 1.36 jdolecek if (ATACH_ST(tfd) & WDCS_ERR) { 2412 1.1 kiyohara sc_xfer->error = XS_SHORTSENSE; 2413 1.36 jdolecek sc_xfer->sense.atapi_sense = ATACH_ERR(tfd); 2414 1.1 kiyohara } else { 2415 1.1 kiyohara if (xfer->c_flags & C_DMA) 2416 1.1 kiyohara ata_dmaerr(drvp, 2417 1.1 kiyohara (xfer->c_flags & C_POLL) ? AT_POLL : 0); 2418 1.1 kiyohara sc_xfer->error = XS_RESET; 2419 1.45 jdolecek ata_channel_unlock(chp); 2420 1.1 kiyohara mvsata_atapi_reset(chp, xfer); 2421 1.1 kiyohara return (1); 2422 1.1 kiyohara } 2423 1.1 kiyohara } 2424 1.36 jdolecek DPRINTF(DEBUG_FUNCS|DEBUG_XFERS, 2425 1.36 jdolecek ("mvsata_atapi_intr: %s (end), error 0x%x " 2426 1.36 jdolecek "sense 0x%x\n", __func__, 2427 1.36 jdolecek sc_xfer->error, sc_xfer->sense.atapi_sense)); 2428 1.36 jdolecek ata_channel_unlock(chp); 2429 1.1 kiyohara mvsata_atapi_done(chp, xfer); 2430 1.1 kiyohara return 1; 2431 1.1 kiyohara } 2432 1.1 kiyohara 2433 1.1 kiyohara static void 2434 1.1 kiyohara mvsata_atapi_kill_xfer(struct ata_channel *chp, struct ata_xfer *xfer, 2435 1.1 kiyohara int reason) 2436 1.1 kiyohara { 2437 1.1 kiyohara struct mvsata_port *mvport = (struct mvsata_port *)chp; 2438 1.36 jdolecek struct scsipi_xfer *sc_xfer = xfer->c_scsipi; 2439 1.36 jdolecek bool deactivate = true; 2440 1.1 kiyohara 2441 1.1 kiyohara /* remove this command from xfer queue */ 2442 1.1 kiyohara switch (reason) { 2443 1.36 jdolecek case KILL_GONE_INACTIVE: 2444 1.36 jdolecek deactivate = false; 2445 1.36 jdolecek /* FALLTHROUGH */ 2446 1.1 kiyohara case KILL_GONE: 2447 1.1 kiyohara sc_xfer->error = XS_DRIVER_STUFFUP; 2448 1.1 kiyohara break; 2449 1.1 kiyohara case KILL_RESET: 2450 1.1 kiyohara sc_xfer->error = XS_RESET; 2451 1.1 kiyohara break; 2452 1.36 jdolecek case KILL_REQUEUE: 2453 1.36 jdolecek sc_xfer->error = XS_REQUEUE; 2454 1.36 jdolecek break; 2455 1.1 kiyohara default: 2456 1.1 kiyohara aprint_error_dev(MVSATA_DEV2(mvport), 2457 1.1 kiyohara "mvsata_atapi_kill_xfer: unknown reason %d\n", reason); 2458 1.1 kiyohara panic("mvsata_atapi_kill_xfer"); 2459 1.1 kiyohara } 2460 1.36 jdolecek 2461 1.43 jdolecek if (deactivate) 2462 1.36 jdolecek ata_deactivate_xfer(chp, xfer); 2463 1.36 jdolecek 2464 1.1 kiyohara ata_free_xfer(chp, xfer); 2465 1.1 kiyohara scsipi_done(sc_xfer); 2466 1.1 kiyohara } 2467 1.1 kiyohara 2468 1.1 kiyohara static void 2469 1.1 kiyohara mvsata_atapi_reset(struct ata_channel *chp, struct ata_xfer *xfer) 2470 1.1 kiyohara { 2471 1.36 jdolecek struct mvsata_port *mvport = (struct mvsata_port *)chp; 2472 1.1 kiyohara struct atac_softc *atac = chp->ch_atac; 2473 1.1 kiyohara struct ata_drive_datas *drvp = &chp->ch_drive[xfer->c_drive]; 2474 1.36 jdolecek struct scsipi_xfer *sc_xfer = xfer->c_scsipi; 2475 1.36 jdolecek int tfd; 2476 1.36 jdolecek 2477 1.36 jdolecek ata_channel_lock(chp); 2478 1.1 kiyohara 2479 1.29 jakllsch mvsata_pmp_select(mvport, xfer->c_drive); 2480 1.29 jakllsch 2481 1.29 jakllsch wdccommandshort(chp, 0, ATAPI_SOFT_RESET); 2482 1.1 kiyohara drvp->state = 0; 2483 1.36 jdolecek if (wdc_wait_for_unbusy(chp, WDC_RESET_WAIT, AT_POLL, &tfd) != 0) { 2484 1.1 kiyohara printf("%s:%d:%d: reset failed\n", device_xname(atac->atac_dev), 2485 1.1 kiyohara chp->ch_channel, xfer->c_drive); 2486 1.1 kiyohara sc_xfer->error = XS_SELTIMEOUT; 2487 1.1 kiyohara } 2488 1.36 jdolecek 2489 1.36 jdolecek ata_channel_unlock(chp); 2490 1.36 jdolecek 2491 1.1 kiyohara mvsata_atapi_done(chp, xfer); 2492 1.1 kiyohara return; 2493 1.1 kiyohara } 2494 1.1 kiyohara 2495 1.1 kiyohara static void 2496 1.46 jdolecek mvsata_atapi_phase_complete(struct ata_xfer *xfer, int tfd) 2497 1.1 kiyohara { 2498 1.1 kiyohara struct ata_channel *chp = xfer->c_chp; 2499 1.1 kiyohara struct atac_softc *atac = chp->ch_atac; 2500 1.1 kiyohara struct wdc_softc *wdc = CHAN_TO_WDC(chp); 2501 1.36 jdolecek struct scsipi_xfer *sc_xfer = xfer->c_scsipi; 2502 1.1 kiyohara struct ata_drive_datas *drvp = &chp->ch_drive[xfer->c_drive]; 2503 1.36 jdolecek 2504 1.36 jdolecek ata_channel_lock_owned(chp); 2505 1.1 kiyohara 2506 1.1 kiyohara /* wait for DSC if needed */ 2507 1.24 bouyer if (drvp->drive_flags & ATA_DRIVE_ATAPIDSCW) { 2508 1.36 jdolecek DPRINTF(DEBUG_XFERS, 2509 1.1 kiyohara ("%s:%d:%d: mvsata_atapi_phase_complete: polldsc %d\n", 2510 1.1 kiyohara device_xname(atac->atac_dev), chp->ch_channel, 2511 1.43 jdolecek xfer->c_drive, xfer->c_atapi.c_dscpoll)); 2512 1.1 kiyohara if (cold) 2513 1.1 kiyohara panic("mvsata_atapi_phase_complete: cold"); 2514 1.1 kiyohara 2515 1.36 jdolecek if (wdcwait(chp, WDCS_DSC, WDCS_DSC, 10, AT_POLL, &tfd) == 2516 1.1 kiyohara WDCWAIT_TOUT) { 2517 1.1 kiyohara /* 10ms not enough, try again in 1 tick */ 2518 1.43 jdolecek if (xfer->c_atapi.c_dscpoll++ > 2519 1.43 jdolecek mstohz(sc_xfer->timeout)) { 2520 1.1 kiyohara aprint_error_dev(atac->atac_dev, 2521 1.1 kiyohara "channel %d: wait_for_dsc failed\n", 2522 1.1 kiyohara chp->ch_channel); 2523 1.36 jdolecek ata_channel_unlock(chp); 2524 1.1 kiyohara sc_xfer->error = XS_TIMEOUT; 2525 1.1 kiyohara mvsata_atapi_reset(chp, xfer); 2526 1.36 jdolecek } else { 2527 1.43 jdolecek callout_reset(&chp->c_timo_callout, 1, 2528 1.43 jdolecek mvsata_atapi_polldsc, chp); 2529 1.36 jdolecek ata_channel_unlock(chp); 2530 1.36 jdolecek } 2531 1.1 kiyohara return; 2532 1.1 kiyohara } 2533 1.1 kiyohara } 2534 1.1 kiyohara 2535 1.1 kiyohara /* 2536 1.1 kiyohara * Some drive occasionally set WDCS_ERR with 2537 1.1 kiyohara * "ATA illegal length indication" in the error 2538 1.1 kiyohara * register. If we read some data the sense is valid 2539 1.1 kiyohara * anyway, so don't report the error. 2540 1.1 kiyohara */ 2541 1.36 jdolecek if (ATACH_ST(tfd) & WDCS_ERR && 2542 1.1 kiyohara ((sc_xfer->xs_control & XS_CTL_REQSENSE) == 0 || 2543 1.1 kiyohara sc_xfer->resid == sc_xfer->datalen)) { 2544 1.1 kiyohara /* save the short sense */ 2545 1.1 kiyohara sc_xfer->error = XS_SHORTSENSE; 2546 1.36 jdolecek sc_xfer->sense.atapi_sense = ATACH_ERR(tfd); 2547 1.1 kiyohara if ((sc_xfer->xs_periph->periph_quirks & PQUIRK_NOSENSE) == 0) { 2548 1.1 kiyohara /* ask scsipi to send a REQUEST_SENSE */ 2549 1.1 kiyohara sc_xfer->error = XS_BUSY; 2550 1.1 kiyohara sc_xfer->status = SCSI_CHECK; 2551 1.1 kiyohara } else 2552 1.1 kiyohara if (wdc->dma_status & (WDC_DMAST_NOIRQ | WDC_DMAST_ERR)) { 2553 1.1 kiyohara ata_dmaerr(drvp, 2554 1.1 kiyohara (xfer->c_flags & C_POLL) ? AT_POLL : 0); 2555 1.1 kiyohara sc_xfer->error = XS_RESET; 2556 1.45 jdolecek ata_channel_unlock(chp); 2557 1.1 kiyohara mvsata_atapi_reset(chp, xfer); 2558 1.1 kiyohara return; 2559 1.1 kiyohara } 2560 1.1 kiyohara } 2561 1.36 jdolecek if (xfer->c_bcount != 0) { 2562 1.36 jdolecek DPRINTF(DEBUG_XFERS, ("%s:%d:%d: mvsata_atapi_intr:" 2563 1.1 kiyohara " bcount value is %d after io\n", 2564 1.1 kiyohara device_xname(atac->atac_dev), chp->ch_channel, 2565 1.1 kiyohara xfer->c_drive, xfer->c_bcount)); 2566 1.36 jdolecek } 2567 1.1 kiyohara #ifdef DIAGNOSTIC 2568 1.36 jdolecek if (xfer->c_bcount < 0) { 2569 1.1 kiyohara aprint_error_dev(atac->atac_dev, 2570 1.1 kiyohara "channel %d drive %d: mvsata_atapi_intr:" 2571 1.1 kiyohara " warning: bcount value is %d after io\n", 2572 1.1 kiyohara chp->ch_channel, xfer->c_drive, xfer->c_bcount); 2573 1.36 jdolecek } 2574 1.1 kiyohara #endif 2575 1.1 kiyohara 2576 1.36 jdolecek DPRINTF(DEBUG_XFERS, 2577 1.36 jdolecek ("%s:%d:%d: mvsata_atapi_phase_complete:" 2578 1.1 kiyohara " mvsata_atapi_done(), error 0x%x sense 0x%x\n", 2579 1.1 kiyohara device_xname(atac->atac_dev), chp->ch_channel, xfer->c_drive, 2580 1.1 kiyohara sc_xfer->error, sc_xfer->sense.atapi_sense)); 2581 1.36 jdolecek ata_channel_unlock(chp); 2582 1.1 kiyohara mvsata_atapi_done(chp, xfer); 2583 1.1 kiyohara } 2584 1.1 kiyohara 2585 1.1 kiyohara static void 2586 1.1 kiyohara mvsata_atapi_done(struct ata_channel *chp, struct ata_xfer *xfer) 2587 1.14 jakllsch { 2588 1.36 jdolecek struct scsipi_xfer *sc_xfer = xfer->c_scsipi; 2589 1.36 jdolecek bool iserror = (sc_xfer->error != XS_NOERROR); 2590 1.36 jdolecek 2591 1.36 jdolecek DPRINTF(DEBUG_FUNCS|DEBUG_XFERS, 2592 1.36 jdolecek ("%s:%d:%d: mvsata_atapi_done: flags 0x%x\n", 2593 1.36 jdolecek device_xname(chp->ch_atac->atac_dev), chp->ch_channel, 2594 1.36 jdolecek xfer->c_drive, (u_int)xfer->c_flags)); 2595 1.36 jdolecek 2596 1.36 jdolecek if (ata_waitdrain_xfer_check(chp, xfer)) 2597 1.36 jdolecek return; 2598 1.1 kiyohara 2599 1.1 kiyohara /* mark controller inactive and free the command */ 2600 1.36 jdolecek ata_deactivate_xfer(chp, xfer); 2601 1.36 jdolecek 2602 1.1 kiyohara ata_free_xfer(chp, xfer); 2603 1.1 kiyohara 2604 1.36 jdolecek DPRINTF(DEBUG_FUNCS|DEBUG_XFERS, 2605 1.36 jdolecek ("%s:%d: mvsata_atapi_done: scsipi_done\n", 2606 1.36 jdolecek device_xname(chp->ch_atac->atac_dev), chp->ch_channel)); 2607 1.1 kiyohara scsipi_done(sc_xfer); 2608 1.36 jdolecek DPRINTF(DEBUG_FUNCS, 2609 1.36 jdolecek ("%s:%d: atastart from wdc_atapi_done, flags 0x%x\n", 2610 1.36 jdolecek device_xname(chp->ch_atac->atac_dev), chp->ch_channel, 2611 1.36 jdolecek chp->ch_flags)); 2612 1.36 jdolecek if (!iserror) 2613 1.36 jdolecek atastart(chp); 2614 1.1 kiyohara } 2615 1.1 kiyohara 2616 1.1 kiyohara static void 2617 1.1 kiyohara mvsata_atapi_polldsc(void *arg) 2618 1.1 kiyohara { 2619 1.43 jdolecek struct ata_channel *chp = arg; 2620 1.43 jdolecek struct ata_xfer *xfer = ata_queue_get_active_xfer(chp); 2621 1.43 jdolecek 2622 1.43 jdolecek KASSERT(xfer != NULL); 2623 1.1 kiyohara 2624 1.36 jdolecek ata_channel_lock(chp); 2625 1.36 jdolecek 2626 1.36 jdolecek /* this will unlock channel lock too */ 2627 1.46 jdolecek mvsata_atapi_phase_complete(xfer, 0); 2628 1.1 kiyohara } 2629 1.1 kiyohara #endif /* NATAPIBUS > 0 */ 2630 1.1 kiyohara 2631 1.1 kiyohara 2632 1.1 kiyohara /* 2633 1.9 jakllsch * XXXX: Shall we need lock for race condition in mvsata_edma_enqueue{,_gen2}(), 2634 1.1 kiyohara * if supported queuing command by atabus? The race condition will not happen 2635 1.1 kiyohara * if this is called only to the thread of atabus. 2636 1.1 kiyohara */ 2637 1.1 kiyohara static int 2638 1.36 jdolecek mvsata_edma_enqueue(struct mvsata_port *mvport, struct ata_xfer *xfer) 2639 1.1 kiyohara { 2640 1.1 kiyohara struct mvsata_softc *sc = device_private(MVSATA_DEV2(mvport)); 2641 1.36 jdolecek struct ata_bio *ata_bio = &xfer->c_bio; 2642 1.36 jdolecek void *databuf = (uint8_t *)xfer->c_databuf + xfer->c_skip; 2643 1.1 kiyohara struct eprd *eprd; 2644 1.1 kiyohara bus_addr_t crqb_base_addr; 2645 1.1 kiyohara bus_dmamap_t data_dmamap; 2646 1.1 kiyohara uint32_t reg; 2647 1.36 jdolecek int erqqip, erqqop, next, rv, i; 2648 1.1 kiyohara 2649 1.36 jdolecek DPRINTF(DEBUG_FUNCS|DEBUG_XFERS, ("%s:%d:%d: mvsata_edma_enqueue:" 2650 1.7 riz " blkno=0x%" PRIx64 ", nbytes=%d, flags=0x%x\n", 2651 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), mvport->port_hc->hc, 2652 1.1 kiyohara mvport->port, ata_bio->blkno, ata_bio->nbytes, ata_bio->flags)); 2653 1.1 kiyohara 2654 1.1 kiyohara reg = MVSATA_EDMA_READ_4(mvport, EDMA_REQQOP); 2655 1.1 kiyohara erqqop = (reg & EDMA_REQQP_ERQQP_MASK) >> EDMA_REQQP_ERQQP_SHIFT; 2656 1.1 kiyohara reg = MVSATA_EDMA_READ_4(mvport, EDMA_REQQIP); 2657 1.1 kiyohara erqqip = (reg & EDMA_REQQP_ERQQP_MASK) >> EDMA_REQQP_ERQQP_SHIFT; 2658 1.1 kiyohara next = erqqip; 2659 1.1 kiyohara MVSATA_EDMAQ_INC(next); 2660 1.36 jdolecek if (next == erqqop) { 2661 1.1 kiyohara /* queue full */ 2662 1.1 kiyohara return EBUSY; 2663 1.36 jdolecek } 2664 1.36 jdolecek DPRINTF(DEBUG_XFERS, 2665 1.36 jdolecek (" erqqip=%d, quetag=%d\n", erqqip, xfer->c_slot)); 2666 1.1 kiyohara 2667 1.36 jdolecek rv = mvsata_dma_bufload(mvport, xfer->c_slot, databuf, ata_bio->nbytes, 2668 1.1 kiyohara ata_bio->flags); 2669 1.1 kiyohara if (rv != 0) 2670 1.1 kiyohara return rv; 2671 1.1 kiyohara 2672 1.1 kiyohara /* setup EDMA Physical Region Descriptors (ePRD) Table Data */ 2673 1.36 jdolecek data_dmamap = mvport->port_reqtbl[xfer->c_slot].data_dmamap; 2674 1.36 jdolecek eprd = mvport->port_reqtbl[xfer->c_slot].eprd; 2675 1.1 kiyohara for (i = 0; i < data_dmamap->dm_nsegs; i++) { 2676 1.1 kiyohara bus_addr_t ds_addr = data_dmamap->dm_segs[i].ds_addr; 2677 1.1 kiyohara bus_size_t ds_len = data_dmamap->dm_segs[i].ds_len; 2678 1.1 kiyohara 2679 1.1 kiyohara eprd->prdbal = htole32(ds_addr & EPRD_PRDBAL_MASK); 2680 1.1 kiyohara eprd->bytecount = htole32(EPRD_BYTECOUNT(ds_len)); 2681 1.1 kiyohara eprd->eot = htole16(0); 2682 1.1 kiyohara eprd->prdbah = htole32((ds_addr >> 16) >> 16); 2683 1.1 kiyohara eprd++; 2684 1.1 kiyohara } 2685 1.1 kiyohara (eprd - 1)->eot |= htole16(EPRD_EOT); 2686 1.1 kiyohara #ifdef MVSATA_DEBUG 2687 1.1 kiyohara if (mvsata_debug >= 3) 2688 1.36 jdolecek mvsata_print_eprd(mvport, xfer->c_slot); 2689 1.1 kiyohara #endif 2690 1.1 kiyohara bus_dmamap_sync(mvport->port_dmat, mvport->port_eprd_dmamap, 2691 1.36 jdolecek mvport->port_reqtbl[xfer->c_slot].eprd_offset, MVSATA_EPRD_MAX_SIZE, 2692 1.1 kiyohara BUS_DMASYNC_PREWRITE); 2693 1.1 kiyohara 2694 1.1 kiyohara /* setup EDMA Command Request Block (CRQB) Data */ 2695 1.36 jdolecek sc->sc_edma_setup_crqb(mvport, erqqip, xfer); 2696 1.1 kiyohara #ifdef MVSATA_DEBUG 2697 1.1 kiyohara if (mvsata_debug >= 3) 2698 1.1 kiyohara mvsata_print_crqb(mvport, erqqip); 2699 1.1 kiyohara #endif 2700 1.1 kiyohara bus_dmamap_sync(mvport->port_dmat, mvport->port_crqb_dmamap, 2701 1.1 kiyohara erqqip * sizeof(union mvsata_crqb), 2702 1.1 kiyohara sizeof(union mvsata_crqb), BUS_DMASYNC_PREWRITE); 2703 1.1 kiyohara 2704 1.1 kiyohara MVSATA_EDMAQ_INC(erqqip); 2705 1.1 kiyohara 2706 1.1 kiyohara crqb_base_addr = mvport->port_crqb_dmamap->dm_segs[0].ds_addr & 2707 1.1 kiyohara (EDMA_REQQP_ERQQBAP_MASK | EDMA_REQQP_ERQQBA_MASK); 2708 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_REQQBAH, (crqb_base_addr >> 16) >> 16); 2709 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_REQQIP, 2710 1.1 kiyohara crqb_base_addr | (erqqip << EDMA_REQQP_ERQQP_SHIFT)); 2711 1.1 kiyohara 2712 1.1 kiyohara return 0; 2713 1.1 kiyohara } 2714 1.1 kiyohara 2715 1.1 kiyohara static int 2716 1.1 kiyohara mvsata_edma_handle(struct mvsata_port *mvport, struct ata_xfer *xfer1) 2717 1.1 kiyohara { 2718 1.1 kiyohara struct ata_channel *chp = &mvport->port_ata_channel; 2719 1.1 kiyohara struct crpb *crpb; 2720 1.1 kiyohara struct ata_bio *ata_bio; 2721 1.1 kiyohara struct ata_xfer *xfer; 2722 1.1 kiyohara uint32_t reg; 2723 1.39 jdolecek int erqqop, erpqip, erpqop, prev_erpqop, quetag, handled = 0, n; 2724 1.36 jdolecek int st, dmaerr; 2725 1.1 kiyohara 2726 1.1 kiyohara /* First, Sync for Request Queue buffer */ 2727 1.1 kiyohara reg = MVSATA_EDMA_READ_4(mvport, EDMA_REQQOP); 2728 1.1 kiyohara erqqop = (reg & EDMA_REQQP_ERQQP_MASK) >> EDMA_REQQP_ERQQP_SHIFT; 2729 1.1 kiyohara if (mvport->port_prev_erqqop != erqqop) { 2730 1.1 kiyohara const int s = sizeof(union mvsata_crqb); 2731 1.1 kiyohara 2732 1.1 kiyohara if (mvport->port_prev_erqqop < erqqop) 2733 1.1 kiyohara n = erqqop - mvport->port_prev_erqqop; 2734 1.1 kiyohara else { 2735 1.1 kiyohara if (erqqop > 0) 2736 1.1 kiyohara bus_dmamap_sync(mvport->port_dmat, 2737 1.1 kiyohara mvport->port_crqb_dmamap, 0, erqqop * s, 2738 1.1 kiyohara BUS_DMASYNC_POSTWRITE); 2739 1.1 kiyohara n = MVSATA_EDMAQ_LEN - mvport->port_prev_erqqop; 2740 1.1 kiyohara } 2741 1.1 kiyohara if (n > 0) 2742 1.1 kiyohara bus_dmamap_sync(mvport->port_dmat, 2743 1.1 kiyohara mvport->port_crqb_dmamap, 2744 1.1 kiyohara mvport->port_prev_erqqop * s, n * s, 2745 1.1 kiyohara BUS_DMASYNC_POSTWRITE); 2746 1.1 kiyohara mvport->port_prev_erqqop = erqqop; 2747 1.1 kiyohara } 2748 1.1 kiyohara 2749 1.1 kiyohara reg = MVSATA_EDMA_READ_4(mvport, EDMA_RESQIP); 2750 1.1 kiyohara erpqip = (reg & EDMA_RESQP_ERPQP_MASK) >> EDMA_RESQP_ERPQP_SHIFT; 2751 1.1 kiyohara reg = MVSATA_EDMA_READ_4(mvport, EDMA_RESQOP); 2752 1.1 kiyohara erpqop = (reg & EDMA_RESQP_ERPQP_MASK) >> EDMA_RESQP_ERPQP_SHIFT; 2753 1.1 kiyohara 2754 1.36 jdolecek DPRINTF(DEBUG_XFERS, 2755 1.36 jdolecek ("%s:%d:%d: mvsata_edma_handle: erpqip=%d, erpqop=%d\n", 2756 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), mvport->port_hc->hc, 2757 1.1 kiyohara mvport->port, erpqip, erpqop)); 2758 1.1 kiyohara 2759 1.1 kiyohara if (erpqop == erpqip) 2760 1.1 kiyohara return 0; 2761 1.1 kiyohara 2762 1.1 kiyohara if (erpqop < erpqip) 2763 1.1 kiyohara n = erpqip - erpqop; 2764 1.1 kiyohara else { 2765 1.1 kiyohara if (erpqip > 0) 2766 1.1 kiyohara bus_dmamap_sync(mvport->port_dmat, 2767 1.1 kiyohara mvport->port_crpb_dmamap, 2768 1.1 kiyohara 0, erpqip * sizeof(struct crpb), 2769 1.1 kiyohara BUS_DMASYNC_POSTREAD); 2770 1.1 kiyohara n = MVSATA_EDMAQ_LEN - erpqop; 2771 1.1 kiyohara } 2772 1.1 kiyohara if (n > 0) 2773 1.1 kiyohara bus_dmamap_sync(mvport->port_dmat, mvport->port_crpb_dmamap, 2774 1.1 kiyohara erpqop * sizeof(struct crpb), 2775 1.1 kiyohara n * sizeof(struct crpb), BUS_DMASYNC_POSTREAD); 2776 1.1 kiyohara 2777 1.43 jdolecek uint32_t aslots = ata_queue_active(chp); 2778 1.43 jdolecek 2779 1.1 kiyohara prev_erpqop = erpqop; 2780 1.1 kiyohara while (erpqop != erpqip) { 2781 1.1 kiyohara #ifdef MVSATA_DEBUG 2782 1.1 kiyohara if (mvsata_debug >= 3) 2783 1.1 kiyohara mvsata_print_crpb(mvport, erpqop); 2784 1.1 kiyohara #endif 2785 1.1 kiyohara crpb = mvport->port_crpb + erpqop; 2786 1.36 jdolecek MVSATA_EDMAQ_INC(erpqop); 2787 1.36 jdolecek 2788 1.1 kiyohara quetag = CRPB_CHOSTQUETAG(le16toh(crpb->id)); 2789 1.36 jdolecek 2790 1.43 jdolecek if ((aslots & __BIT(quetag)) == 0) { 2791 1.36 jdolecek /* not actually executing */ 2792 1.36 jdolecek continue; 2793 1.36 jdolecek } 2794 1.36 jdolecek 2795 1.36 jdolecek xfer = ata_queue_hwslot_to_xfer(chp, quetag); 2796 1.1 kiyohara 2797 1.1 kiyohara bus_dmamap_sync(mvport->port_dmat, mvport->port_eprd_dmamap, 2798 1.36 jdolecek mvport->port_reqtbl[xfer->c_slot].eprd_offset, 2799 1.1 kiyohara MVSATA_EPRD_MAX_SIZE, BUS_DMASYNC_POSTWRITE); 2800 1.1 kiyohara 2801 1.36 jdolecek st = CRPB_CDEVSTS(le16toh(crpb->rspflg)); 2802 1.36 jdolecek dmaerr = CRPB_CEDMASTS(le16toh(crpb->rspflg)); 2803 1.36 jdolecek 2804 1.36 jdolecek ata_bio = &xfer->c_bio; 2805 1.1 kiyohara ata_bio->error = NOERROR; 2806 1.36 jdolecek if (dmaerr != 0) 2807 1.1 kiyohara ata_bio->error = ERR_DMA; 2808 1.1 kiyohara 2809 1.1 kiyohara mvsata_dma_bufunload(mvport, quetag, ata_bio->flags); 2810 1.1 kiyohara 2811 1.43 jdolecek KASSERT(xfer->c_flags & C_DMA); 2812 1.43 jdolecek mvsata_bio_intr(chp, xfer, ATACH_ERR_ST(0, st)); 2813 1.43 jdolecek 2814 1.1 kiyohara if (xfer1 == NULL) 2815 1.1 kiyohara handled++; 2816 1.1 kiyohara else if (xfer == xfer1) { 2817 1.1 kiyohara handled = 1; 2818 1.1 kiyohara break; 2819 1.1 kiyohara } 2820 1.1 kiyohara } 2821 1.1 kiyohara if (prev_erpqop < erpqop) 2822 1.1 kiyohara n = erpqop - prev_erpqop; 2823 1.1 kiyohara else { 2824 1.1 kiyohara if (erpqop > 0) 2825 1.1 kiyohara bus_dmamap_sync(mvport->port_dmat, 2826 1.1 kiyohara mvport->port_crpb_dmamap, 0, 2827 1.1 kiyohara erpqop * sizeof(struct crpb), BUS_DMASYNC_PREREAD); 2828 1.1 kiyohara n = MVSATA_EDMAQ_LEN - prev_erpqop; 2829 1.1 kiyohara } 2830 1.1 kiyohara if (n > 0) 2831 1.1 kiyohara bus_dmamap_sync(mvport->port_dmat, mvport->port_crpb_dmamap, 2832 1.1 kiyohara prev_erpqop * sizeof(struct crpb), 2833 1.1 kiyohara n * sizeof(struct crpb), BUS_DMASYNC_PREREAD); 2834 1.1 kiyohara 2835 1.1 kiyohara reg &= ~EDMA_RESQP_ERPQP_MASK; 2836 1.1 kiyohara reg |= (erpqop << EDMA_RESQP_ERPQP_SHIFT); 2837 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_RESQOP, reg); 2838 1.1 kiyohara 2839 1.1 kiyohara return handled; 2840 1.1 kiyohara } 2841 1.1 kiyohara 2842 1.1 kiyohara static int 2843 1.1 kiyohara mvsata_edma_wait(struct mvsata_port *mvport, struct ata_xfer *xfer, int timeout) 2844 1.1 kiyohara { 2845 1.1 kiyohara int xtime; 2846 1.1 kiyohara 2847 1.36 jdolecek for (xtime = 0; xtime < timeout * 10; xtime++) { 2848 1.1 kiyohara if (mvsata_edma_handle(mvport, xfer)) 2849 1.1 kiyohara return 0; 2850 1.36 jdolecek DELAY(100); 2851 1.1 kiyohara } 2852 1.1 kiyohara 2853 1.36 jdolecek DPRINTF(DEBUG_FUNCS, ("%s: timeout: %p\n", __func__, xfer)); 2854 1.1 kiyohara mvsata_edma_rqq_remove(mvport, xfer); 2855 1.1 kiyohara xfer->c_flags |= C_TIMEOU; 2856 1.1 kiyohara return 1; 2857 1.1 kiyohara } 2858 1.1 kiyohara 2859 1.1 kiyohara static void 2860 1.1 kiyohara mvsata_edma_rqq_remove(struct mvsata_port *mvport, struct ata_xfer *xfer) 2861 1.1 kiyohara { 2862 1.36 jdolecek struct ata_channel *chp = &mvport->port_ata_channel; 2863 1.1 kiyohara struct mvsata_softc *sc = device_private(MVSATA_DEV2(mvport)); 2864 1.1 kiyohara bus_addr_t crqb_base_addr; 2865 1.1 kiyohara int erqqip, i; 2866 1.1 kiyohara 2867 1.1 kiyohara /* First, hardware reset, stop EDMA */ 2868 1.1 kiyohara mvsata_hreset_port(mvport); 2869 1.1 kiyohara 2870 1.1 kiyohara /* cleanup completed EDMA safely */ 2871 1.1 kiyohara mvsata_edma_handle(mvport, NULL); 2872 1.1 kiyohara 2873 1.1 kiyohara bus_dmamap_sync(mvport->port_dmat, mvport->port_crqb_dmamap, 0, 2874 1.1 kiyohara sizeof(union mvsata_crqb) * MVSATA_EDMAQ_LEN, BUS_DMASYNC_PREWRITE); 2875 1.36 jdolecek 2876 1.43 jdolecek uint32_t aslots = ata_queue_active(chp); 2877 1.43 jdolecek 2878 1.1 kiyohara for (i = 0, erqqip = 0; i < MVSATA_EDMAQ_LEN; i++) { 2879 1.36 jdolecek struct ata_xfer *rqxfer; 2880 1.36 jdolecek 2881 1.43 jdolecek if ((aslots & __BIT(i)) == 0) 2882 1.1 kiyohara continue; 2883 1.1 kiyohara 2884 1.36 jdolecek if (i == xfer->c_slot) { 2885 1.1 kiyohara /* remove xfer from EDMA request queue */ 2886 1.1 kiyohara bus_dmamap_sync(mvport->port_dmat, 2887 1.1 kiyohara mvport->port_eprd_dmamap, 2888 1.1 kiyohara mvport->port_reqtbl[i].eprd_offset, 2889 1.1 kiyohara MVSATA_EPRD_MAX_SIZE, BUS_DMASYNC_POSTWRITE); 2890 1.36 jdolecek mvsata_dma_bufunload(mvport, i, xfer->c_bio.flags); 2891 1.36 jdolecek /* quetag freed by caller later */ 2892 1.1 kiyohara continue; 2893 1.1 kiyohara } 2894 1.1 kiyohara 2895 1.36 jdolecek rqxfer = ata_queue_hwslot_to_xfer(chp, i); 2896 1.36 jdolecek sc->sc_edma_setup_crqb(mvport, erqqip, rqxfer); 2897 1.1 kiyohara erqqip++; 2898 1.1 kiyohara } 2899 1.1 kiyohara bus_dmamap_sync(mvport->port_dmat, mvport->port_crqb_dmamap, 0, 2900 1.1 kiyohara sizeof(union mvsata_crqb) * MVSATA_EDMAQ_LEN, 2901 1.1 kiyohara BUS_DMASYNC_POSTWRITE); 2902 1.1 kiyohara 2903 1.36 jdolecek mvsata_edma_config(mvport, mvport->port_edmamode_curr); 2904 1.1 kiyohara mvsata_edma_reset_qptr(mvport); 2905 1.1 kiyohara mvsata_edma_enable(mvport); 2906 1.1 kiyohara 2907 1.1 kiyohara crqb_base_addr = mvport->port_crqb_dmamap->dm_segs[0].ds_addr & 2908 1.1 kiyohara (EDMA_REQQP_ERQQBAP_MASK | EDMA_REQQP_ERQQBA_MASK); 2909 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_REQQBAH, (crqb_base_addr >> 16) >> 16); 2910 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_REQQIP, 2911 1.1 kiyohara crqb_base_addr | (erqqip << EDMA_REQQP_ERQQP_SHIFT)); 2912 1.1 kiyohara } 2913 1.1 kiyohara 2914 1.1 kiyohara #if NATAPIBUS > 0 2915 1.1 kiyohara static int 2916 1.36 jdolecek mvsata_bdma_init(struct mvsata_port *mvport, struct ata_xfer *xfer) 2917 1.1 kiyohara { 2918 1.36 jdolecek struct scsipi_xfer *sc_xfer = xfer->c_scsipi; 2919 1.1 kiyohara struct eprd *eprd; 2920 1.1 kiyohara bus_dmamap_t data_dmamap; 2921 1.1 kiyohara bus_addr_t eprd_addr; 2922 1.36 jdolecek int i, rv; 2923 1.36 jdolecek void *databuf = (uint8_t *)xfer->c_databuf + xfer->c_skip; 2924 1.1 kiyohara 2925 1.36 jdolecek DPRINTF(DEBUG_FUNCS|DEBUG_XFERS, 2926 1.1 kiyohara ("%s:%d:%d: mvsata_bdma_init: datalen=%d, xs_control=0x%x\n", 2927 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), mvport->port_hc->hc, 2928 1.1 kiyohara mvport->port, sc_xfer->datalen, sc_xfer->xs_control)); 2929 1.1 kiyohara 2930 1.36 jdolecek rv = mvsata_dma_bufload(mvport, xfer->c_slot, databuf, 2931 1.36 jdolecek sc_xfer->datalen, 2932 1.1 kiyohara sc_xfer->xs_control & XS_CTL_DATA_IN ? ATA_READ : 0); 2933 1.1 kiyohara if (rv != 0) 2934 1.1 kiyohara return rv; 2935 1.1 kiyohara 2936 1.1 kiyohara /* setup EDMA Physical Region Descriptors (ePRD) Table Data */ 2937 1.36 jdolecek data_dmamap = mvport->port_reqtbl[xfer->c_slot].data_dmamap; 2938 1.36 jdolecek eprd = mvport->port_reqtbl[xfer->c_slot].eprd; 2939 1.1 kiyohara for (i = 0; i < data_dmamap->dm_nsegs; i++) { 2940 1.1 kiyohara bus_addr_t ds_addr = data_dmamap->dm_segs[i].ds_addr; 2941 1.1 kiyohara bus_size_t ds_len = data_dmamap->dm_segs[i].ds_len; 2942 1.1 kiyohara 2943 1.1 kiyohara eprd->prdbal = htole32(ds_addr & EPRD_PRDBAL_MASK); 2944 1.1 kiyohara eprd->bytecount = htole32(EPRD_BYTECOUNT(ds_len)); 2945 1.1 kiyohara eprd->eot = htole16(0); 2946 1.1 kiyohara eprd->prdbah = htole32((ds_addr >> 16) >> 16); 2947 1.1 kiyohara eprd++; 2948 1.1 kiyohara } 2949 1.1 kiyohara (eprd - 1)->eot |= htole16(EPRD_EOT); 2950 1.1 kiyohara #ifdef MVSATA_DEBUG 2951 1.1 kiyohara if (mvsata_debug >= 3) 2952 1.36 jdolecek mvsata_print_eprd(mvport, xfer->c_slot); 2953 1.1 kiyohara #endif 2954 1.1 kiyohara bus_dmamap_sync(mvport->port_dmat, mvport->port_eprd_dmamap, 2955 1.36 jdolecek mvport->port_reqtbl[xfer->c_slot].eprd_offset, 2956 1.36 jdolecek MVSATA_EPRD_MAX_SIZE, BUS_DMASYNC_PREWRITE); 2957 1.1 kiyohara eprd_addr = mvport->port_eprd_dmamap->dm_segs[0].ds_addr + 2958 1.36 jdolecek mvport->port_reqtbl[xfer->c_slot].eprd_offset; 2959 1.1 kiyohara 2960 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, DMA_DTLBA, eprd_addr & DMA_DTLBA_MASK); 2961 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, DMA_DTHBA, (eprd_addr >> 16) >> 16); 2962 1.1 kiyohara 2963 1.1 kiyohara if (sc_xfer->xs_control & XS_CTL_DATA_IN) 2964 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, DMA_C, DMA_C_READ); 2965 1.1 kiyohara else 2966 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, DMA_C, 0); 2967 1.1 kiyohara 2968 1.1 kiyohara return 0; 2969 1.1 kiyohara } 2970 1.1 kiyohara 2971 1.1 kiyohara static void 2972 1.1 kiyohara mvsata_bdma_start(struct mvsata_port *mvport) 2973 1.1 kiyohara { 2974 1.1 kiyohara 2975 1.1 kiyohara #ifdef MVSATA_DEBUG 2976 1.1 kiyohara if (mvsata_debug >= 3) 2977 1.1 kiyohara mvsata_print_eprd(mvport, 0); 2978 1.1 kiyohara #endif 2979 1.1 kiyohara 2980 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, DMA_C, 2981 1.1 kiyohara MVSATA_EDMA_READ_4(mvport, DMA_C) | DMA_C_START); 2982 1.1 kiyohara } 2983 1.1 kiyohara #endif 2984 1.1 kiyohara #endif 2985 1.1 kiyohara 2986 1.1 kiyohara 2987 1.1 kiyohara static int 2988 1.1 kiyohara mvsata_port_init(struct mvsata_hc *mvhc, int port) 2989 1.1 kiyohara { 2990 1.1 kiyohara struct mvsata_softc *sc = mvhc->hc_sc; 2991 1.1 kiyohara struct mvsata_port *mvport; 2992 1.1 kiyohara struct ata_channel *chp; 2993 1.1 kiyohara int channel, rv, i; 2994 1.1 kiyohara const int crqbq_size = sizeof(union mvsata_crqb) * MVSATA_EDMAQ_LEN; 2995 1.1 kiyohara const int crpbq_size = sizeof(struct crpb) * MVSATA_EDMAQ_LEN; 2996 1.1 kiyohara const int eprd_buf_size = MVSATA_EPRD_MAX_SIZE * MVSATA_EDMAQ_LEN; 2997 1.1 kiyohara 2998 1.1 kiyohara mvport = malloc(sizeof(struct mvsata_port), M_DEVBUF, 2999 1.49 chs M_ZERO | M_WAITOK); 3000 1.1 kiyohara mvport->port = port; 3001 1.1 kiyohara mvport->port_hc = mvhc; 3002 1.36 jdolecek mvport->port_edmamode_negotiated = nodma; 3003 1.1 kiyohara 3004 1.1 kiyohara rv = bus_space_subregion(mvhc->hc_iot, mvhc->hc_ioh, 3005 1.1 kiyohara EDMA_REGISTERS_OFFSET + port * EDMA_REGISTERS_SIZE, 3006 1.1 kiyohara EDMA_REGISTERS_SIZE, &mvport->port_ioh); 3007 1.1 kiyohara if (rv != 0) { 3008 1.1 kiyohara aprint_error("%s:%d: can't subregion EDMA %d registers\n", 3009 1.1 kiyohara device_xname(MVSATA_DEV(sc)), mvhc->hc, port); 3010 1.1 kiyohara goto fail0; 3011 1.1 kiyohara } 3012 1.1 kiyohara mvport->port_iot = mvhc->hc_iot; 3013 1.1 kiyohara rv = bus_space_subregion(mvport->port_iot, mvport->port_ioh, SATA_SS, 4, 3014 1.1 kiyohara &mvport->port_sata_sstatus); 3015 1.1 kiyohara if (rv != 0) { 3016 1.1 kiyohara aprint_error("%s:%d:%d: couldn't subregion sstatus regs\n", 3017 1.1 kiyohara device_xname(MVSATA_DEV(sc)), mvhc->hc, port); 3018 1.1 kiyohara goto fail0; 3019 1.1 kiyohara } 3020 1.1 kiyohara rv = bus_space_subregion(mvport->port_iot, mvport->port_ioh, SATA_SE, 4, 3021 1.1 kiyohara &mvport->port_sata_serror); 3022 1.1 kiyohara if (rv != 0) { 3023 1.1 kiyohara aprint_error("%s:%d:%d: couldn't subregion serror regs\n", 3024 1.1 kiyohara device_xname(MVSATA_DEV(sc)), mvhc->hc, port); 3025 1.1 kiyohara goto fail0; 3026 1.1 kiyohara } 3027 1.1 kiyohara if (sc->sc_rev == gen1) 3028 1.1 kiyohara rv = bus_space_subregion(mvhc->hc_iot, mvhc->hc_ioh, 3029 1.1 kiyohara SATAHC_I_R02(port), 4, &mvport->port_sata_scontrol); 3030 1.1 kiyohara else 3031 1.1 kiyohara rv = bus_space_subregion(mvport->port_iot, mvport->port_ioh, 3032 1.1 kiyohara SATA_SC, 4, &mvport->port_sata_scontrol); 3033 1.1 kiyohara if (rv != 0) { 3034 1.1 kiyohara aprint_error("%s:%d:%d: couldn't subregion scontrol regs\n", 3035 1.1 kiyohara device_xname(MVSATA_DEV(sc)), mvhc->hc, port); 3036 1.1 kiyohara goto fail0; 3037 1.1 kiyohara } 3038 1.1 kiyohara mvport->port_dmat = sc->sc_dmat; 3039 1.1 kiyohara mvhc->hc_ports[port] = mvport; 3040 1.1 kiyohara 3041 1.1 kiyohara channel = mvhc->hc * sc->sc_port + port; 3042 1.1 kiyohara chp = &mvport->port_ata_channel; 3043 1.1 kiyohara chp->ch_channel = channel; 3044 1.1 kiyohara chp->ch_atac = &sc->sc_wdcdev.sc_atac; 3045 1.36 jdolecek chp->ch_queue = ata_queue_alloc(MVSATA_EDMAQ_LEN); 3046 1.1 kiyohara sc->sc_ata_channels[channel] = chp; 3047 1.1 kiyohara 3048 1.1 kiyohara rv = mvsata_wdc_reg_init(mvport, sc->sc_wdcdev.regs + channel); 3049 1.1 kiyohara if (rv != 0) 3050 1.1 kiyohara goto fail0; 3051 1.1 kiyohara 3052 1.1 kiyohara rv = bus_dmamap_create(mvport->port_dmat, crqbq_size, 1, crqbq_size, 0, 3053 1.1 kiyohara BUS_DMA_NOWAIT, &mvport->port_crqb_dmamap); 3054 1.1 kiyohara if (rv != 0) { 3055 1.1 kiyohara aprint_error( 3056 1.1 kiyohara "%s:%d:%d: EDMA CRQB map create failed: error=%d\n", 3057 1.1 kiyohara device_xname(MVSATA_DEV(sc)), mvhc->hc, port, rv); 3058 1.1 kiyohara goto fail0; 3059 1.1 kiyohara } 3060 1.1 kiyohara rv = bus_dmamap_create(mvport->port_dmat, crpbq_size, 1, crpbq_size, 0, 3061 1.1 kiyohara BUS_DMA_NOWAIT, &mvport->port_crpb_dmamap); 3062 1.1 kiyohara if (rv != 0) { 3063 1.1 kiyohara aprint_error( 3064 1.1 kiyohara "%s:%d:%d: EDMA CRPB map create failed: error=%d\n", 3065 1.1 kiyohara device_xname(MVSATA_DEV(sc)), mvhc->hc, port, rv); 3066 1.1 kiyohara goto fail1; 3067 1.1 kiyohara } 3068 1.1 kiyohara rv = bus_dmamap_create(mvport->port_dmat, eprd_buf_size, 1, 3069 1.1 kiyohara eprd_buf_size, 0, BUS_DMA_NOWAIT, &mvport->port_eprd_dmamap); 3070 1.1 kiyohara if (rv != 0) { 3071 1.1 kiyohara aprint_error( 3072 1.1 kiyohara "%s:%d:%d: EDMA ePRD buffer map create failed: error=%d\n", 3073 1.1 kiyohara device_xname(MVSATA_DEV(sc)), mvhc->hc, port, rv); 3074 1.1 kiyohara goto fail2; 3075 1.1 kiyohara } 3076 1.1 kiyohara for (i = 0; i < MVSATA_EDMAQ_LEN; i++) { 3077 1.1 kiyohara rv = bus_dmamap_create(mvport->port_dmat, MAXPHYS, 3078 1.47 tsutsui MVSATA_MAX_SEGS, MAXPHYS, 0, BUS_DMA_NOWAIT, 3079 1.1 kiyohara &mvport->port_reqtbl[i].data_dmamap); 3080 1.1 kiyohara if (rv != 0) { 3081 1.1 kiyohara aprint_error("%s:%d:%d:" 3082 1.1 kiyohara " EDMA data map(%d) create failed: error=%d\n", 3083 1.1 kiyohara device_xname(MVSATA_DEV(sc)), mvhc->hc, port, i, 3084 1.1 kiyohara rv); 3085 1.1 kiyohara goto fail3; 3086 1.1 kiyohara } 3087 1.1 kiyohara } 3088 1.1 kiyohara 3089 1.1 kiyohara return 0; 3090 1.1 kiyohara 3091 1.1 kiyohara fail3: 3092 1.1 kiyohara for (i--; i >= 0; i--) 3093 1.1 kiyohara bus_dmamap_destroy(mvport->port_dmat, 3094 1.1 kiyohara mvport->port_reqtbl[i].data_dmamap); 3095 1.1 kiyohara bus_dmamap_destroy(mvport->port_dmat, mvport->port_eprd_dmamap); 3096 1.1 kiyohara fail2: 3097 1.1 kiyohara bus_dmamap_destroy(mvport->port_dmat, mvport->port_crpb_dmamap); 3098 1.1 kiyohara fail1: 3099 1.1 kiyohara bus_dmamap_destroy(mvport->port_dmat, mvport->port_crqb_dmamap); 3100 1.1 kiyohara fail0: 3101 1.1 kiyohara return rv; 3102 1.1 kiyohara } 3103 1.1 kiyohara 3104 1.1 kiyohara static int 3105 1.1 kiyohara mvsata_wdc_reg_init(struct mvsata_port *mvport, struct wdc_regs *wdr) 3106 1.1 kiyohara { 3107 1.1 kiyohara int hc, port, rv, i; 3108 1.1 kiyohara 3109 1.1 kiyohara hc = mvport->port_hc->hc; 3110 1.1 kiyohara port = mvport->port; 3111 1.1 kiyohara 3112 1.1 kiyohara /* Create subregion for Shadow Registers Map */ 3113 1.1 kiyohara rv = bus_space_subregion(mvport->port_iot, mvport->port_ioh, 3114 1.1 kiyohara SHADOW_REG_BLOCK_OFFSET, SHADOW_REG_BLOCK_SIZE, &wdr->cmd_baseioh); 3115 1.1 kiyohara if (rv != 0) { 3116 1.1 kiyohara aprint_error("%s:%d:%d: couldn't subregion shadow block regs\n", 3117 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), hc, port); 3118 1.1 kiyohara return rv; 3119 1.1 kiyohara } 3120 1.1 kiyohara wdr->cmd_iot = mvport->port_iot; 3121 1.1 kiyohara 3122 1.1 kiyohara /* Once create subregion for each command registers */ 3123 1.1 kiyohara for (i = 0; i < WDC_NREG; i++) { 3124 1.1 kiyohara rv = bus_space_subregion(wdr->cmd_iot, wdr->cmd_baseioh, 3125 1.1 kiyohara i * 4, sizeof(uint32_t), &wdr->cmd_iohs[i]); 3126 1.1 kiyohara if (rv != 0) { 3127 1.1 kiyohara aprint_error("%s:%d:%d: couldn't subregion cmd regs\n", 3128 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), hc, port); 3129 1.1 kiyohara return rv; 3130 1.1 kiyohara } 3131 1.1 kiyohara } 3132 1.1 kiyohara /* Create subregion for Alternate Status register */ 3133 1.1 kiyohara rv = bus_space_subregion(wdr->cmd_iot, wdr->cmd_baseioh, 3134 1.1 kiyohara i * 4, sizeof(uint32_t), &wdr->ctl_ioh); 3135 1.1 kiyohara if (rv != 0) { 3136 1.1 kiyohara aprint_error("%s:%d:%d: couldn't subregion cmd regs\n", 3137 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), hc, port); 3138 1.1 kiyohara return rv; 3139 1.1 kiyohara } 3140 1.1 kiyohara wdr->ctl_iot = mvport->port_iot; 3141 1.1 kiyohara 3142 1.36 jdolecek wdc_init_shadow_regs(wdr); 3143 1.1 kiyohara 3144 1.1 kiyohara rv = bus_space_subregion(mvport->port_iot, mvport->port_ioh, 3145 1.1 kiyohara SATA_SS, sizeof(uint32_t) * 3, &wdr->sata_baseioh); 3146 1.1 kiyohara if (rv != 0) { 3147 1.1 kiyohara aprint_error("%s:%d:%d: couldn't subregion SATA regs\n", 3148 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), hc, port); 3149 1.1 kiyohara return rv; 3150 1.1 kiyohara } 3151 1.1 kiyohara wdr->sata_iot = mvport->port_iot; 3152 1.1 kiyohara rv = bus_space_subregion(mvport->port_iot, mvport->port_ioh, 3153 1.1 kiyohara SATA_SC, sizeof(uint32_t), &wdr->sata_control); 3154 1.1 kiyohara if (rv != 0) { 3155 1.1 kiyohara aprint_error("%s:%d:%d: couldn't subregion SControl\n", 3156 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), hc, port); 3157 1.1 kiyohara return rv; 3158 1.1 kiyohara } 3159 1.1 kiyohara rv = bus_space_subregion(mvport->port_iot, mvport->port_ioh, 3160 1.1 kiyohara SATA_SS, sizeof(uint32_t), &wdr->sata_status); 3161 1.1 kiyohara if (rv != 0) { 3162 1.1 kiyohara aprint_error("%s:%d:%d: couldn't subregion SStatus\n", 3163 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), hc, port); 3164 1.1 kiyohara return rv; 3165 1.1 kiyohara } 3166 1.1 kiyohara rv = bus_space_subregion(mvport->port_iot, mvport->port_ioh, 3167 1.1 kiyohara SATA_SE, sizeof(uint32_t), &wdr->sata_error); 3168 1.1 kiyohara if (rv != 0) { 3169 1.1 kiyohara aprint_error("%s:%d:%d: couldn't subregion SError\n", 3170 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), hc, port); 3171 1.1 kiyohara return rv; 3172 1.1 kiyohara } 3173 1.1 kiyohara 3174 1.1 kiyohara return 0; 3175 1.1 kiyohara } 3176 1.1 kiyohara 3177 1.1 kiyohara 3178 1.1 kiyohara #ifndef MVSATA_WITHOUTDMA 3179 1.1 kiyohara static void * 3180 1.1 kiyohara mvsata_edma_resource_prepare(struct mvsata_port *mvport, bus_dma_tag_t dmat, 3181 1.1 kiyohara bus_dmamap_t *dmamap, size_t size, int write) 3182 1.1 kiyohara { 3183 1.1 kiyohara bus_dma_segment_t seg; 3184 1.1 kiyohara int nseg, rv; 3185 1.1 kiyohara void *kva; 3186 1.1 kiyohara 3187 1.1 kiyohara rv = bus_dmamem_alloc(dmat, size, PAGE_SIZE, 0, &seg, 1, &nseg, 3188 1.1 kiyohara BUS_DMA_NOWAIT); 3189 1.1 kiyohara if (rv != 0) { 3190 1.1 kiyohara aprint_error("%s:%d:%d: DMA memory alloc failed: error=%d\n", 3191 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), 3192 1.1 kiyohara mvport->port_hc->hc, mvport->port, rv); 3193 1.1 kiyohara goto fail; 3194 1.1 kiyohara } 3195 1.1 kiyohara 3196 1.1 kiyohara rv = bus_dmamem_map(dmat, &seg, nseg, size, &kva, BUS_DMA_NOWAIT); 3197 1.1 kiyohara if (rv != 0) { 3198 1.1 kiyohara aprint_error("%s:%d:%d: DMA memory map failed: error=%d\n", 3199 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), 3200 1.1 kiyohara mvport->port_hc->hc, mvport->port, rv); 3201 1.1 kiyohara goto free; 3202 1.1 kiyohara } 3203 1.1 kiyohara 3204 1.1 kiyohara rv = bus_dmamap_load(dmat, *dmamap, kva, size, NULL, 3205 1.1 kiyohara BUS_DMA_NOWAIT | (write ? BUS_DMA_WRITE : BUS_DMA_READ)); 3206 1.1 kiyohara if (rv != 0) { 3207 1.1 kiyohara aprint_error("%s:%d:%d: DMA map load failed: error=%d\n", 3208 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), 3209 1.1 kiyohara mvport->port_hc->hc, mvport->port, rv); 3210 1.1 kiyohara goto unmap; 3211 1.1 kiyohara } 3212 1.1 kiyohara 3213 1.1 kiyohara if (!write) 3214 1.1 kiyohara bus_dmamap_sync(dmat, *dmamap, 0, size, BUS_DMASYNC_PREREAD); 3215 1.1 kiyohara 3216 1.1 kiyohara return kva; 3217 1.1 kiyohara 3218 1.1 kiyohara unmap: 3219 1.1 kiyohara bus_dmamem_unmap(dmat, kva, size); 3220 1.1 kiyohara free: 3221 1.1 kiyohara bus_dmamem_free(dmat, &seg, nseg); 3222 1.1 kiyohara fail: 3223 1.1 kiyohara return NULL; 3224 1.1 kiyohara } 3225 1.1 kiyohara 3226 1.1 kiyohara /* ARGSUSED */ 3227 1.1 kiyohara static void 3228 1.1 kiyohara mvsata_edma_resource_purge(struct mvsata_port *mvport, bus_dma_tag_t dmat, 3229 1.1 kiyohara bus_dmamap_t dmamap, void *kva) 3230 1.1 kiyohara { 3231 1.1 kiyohara 3232 1.1 kiyohara bus_dmamap_unload(dmat, dmamap); 3233 1.1 kiyohara bus_dmamem_unmap(dmat, kva, dmamap->dm_mapsize); 3234 1.1 kiyohara bus_dmamem_free(dmat, dmamap->dm_segs, dmamap->dm_nsegs); 3235 1.1 kiyohara } 3236 1.1 kiyohara 3237 1.1 kiyohara static int 3238 1.1 kiyohara mvsata_dma_bufload(struct mvsata_port *mvport, int index, void *databuf, 3239 1.1 kiyohara size_t datalen, int flags) 3240 1.1 kiyohara { 3241 1.1 kiyohara int rv, lop, sop; 3242 1.1 kiyohara bus_dmamap_t data_dmamap = mvport->port_reqtbl[index].data_dmamap; 3243 1.1 kiyohara 3244 1.1 kiyohara lop = (flags & ATA_READ) ? BUS_DMA_READ : BUS_DMA_WRITE; 3245 1.1 kiyohara sop = (flags & ATA_READ) ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE; 3246 1.1 kiyohara 3247 1.1 kiyohara rv = bus_dmamap_load(mvport->port_dmat, data_dmamap, databuf, datalen, 3248 1.1 kiyohara NULL, BUS_DMA_NOWAIT | lop); 3249 1.1 kiyohara if (rv) { 3250 1.48 tsutsui aprint_error("%s:%d:%d: buffer load failed: error=%d\n", 3251 1.1 kiyohara device_xname(MVSATA_DEV2(mvport)), mvport->port_hc->hc, 3252 1.1 kiyohara mvport->port, rv); 3253 1.1 kiyohara return rv; 3254 1.1 kiyohara } 3255 1.1 kiyohara bus_dmamap_sync(mvport->port_dmat, data_dmamap, 0, 3256 1.1 kiyohara data_dmamap->dm_mapsize, sop); 3257 1.1 kiyohara 3258 1.1 kiyohara return 0; 3259 1.1 kiyohara } 3260 1.1 kiyohara 3261 1.1 kiyohara static inline void 3262 1.1 kiyohara mvsata_dma_bufunload(struct mvsata_port *mvport, int index, int flags) 3263 1.1 kiyohara { 3264 1.1 kiyohara bus_dmamap_t data_dmamap = mvport->port_reqtbl[index].data_dmamap; 3265 1.1 kiyohara 3266 1.1 kiyohara bus_dmamap_sync(mvport->port_dmat, data_dmamap, 0, 3267 1.1 kiyohara data_dmamap->dm_mapsize, 3268 1.1 kiyohara (flags & ATA_READ) ? BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE); 3269 1.1 kiyohara bus_dmamap_unload(mvport->port_dmat, data_dmamap); 3270 1.1 kiyohara } 3271 1.1 kiyohara #endif 3272 1.1 kiyohara 3273 1.1 kiyohara static void 3274 1.1 kiyohara mvsata_hreset_port(struct mvsata_port *mvport) 3275 1.1 kiyohara { 3276 1.1 kiyohara struct mvsata_softc *sc = device_private(MVSATA_DEV2(mvport)); 3277 1.1 kiyohara 3278 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_CMD, EDMA_CMD_EATARST); 3279 1.1 kiyohara 3280 1.1 kiyohara delay(25); /* allow reset propagation */ 3281 1.1 kiyohara 3282 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_CMD, 0); 3283 1.1 kiyohara 3284 1.1 kiyohara mvport->_fix_phy_param._fix_phy(mvport); 3285 1.1 kiyohara 3286 1.1 kiyohara if (sc->sc_gen == gen1) 3287 1.1 kiyohara delay(1000); 3288 1.1 kiyohara } 3289 1.1 kiyohara 3290 1.1 kiyohara static void 3291 1.1 kiyohara mvsata_reset_port(struct mvsata_port *mvport) 3292 1.1 kiyohara { 3293 1.1 kiyohara device_t parent = device_parent(MVSATA_DEV2(mvport)); 3294 1.1 kiyohara 3295 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_CMD, EDMA_CMD_EDSEDMA); 3296 1.1 kiyohara 3297 1.1 kiyohara mvsata_hreset_port(mvport); 3298 1.1 kiyohara 3299 1.1 kiyohara if (device_is_a(parent, "pci")) 3300 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_CFG, 3301 1.1 kiyohara EDMA_CFG_RESERVED | EDMA_CFG_ERDBSZ); 3302 1.1 kiyohara else /* SoC */ 3303 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_CFG, 3304 1.1 kiyohara EDMA_CFG_RESERVED | EDMA_CFG_RESERVED2); 3305 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_T, 0); 3306 1.29 jakllsch MVSATA_EDMA_WRITE_4(mvport, SATA_SEIM, 0x019c0000); 3307 1.29 jakllsch MVSATA_EDMA_WRITE_4(mvport, SATA_SE, ~0); 3308 1.29 jakllsch MVSATA_EDMA_WRITE_4(mvport, SATA_FISIC, 0); 3309 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_IEC, 0); 3310 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_IEM, 0); 3311 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_REQQBAH, 0); 3312 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_REQQIP, 0); 3313 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_REQQOP, 0); 3314 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_RESQBAH, 0); 3315 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_RESQIP, 0); 3316 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_RESQOP, 0); 3317 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_CMD, 0); 3318 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_TC, 0); 3319 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_IORT, 0xbc); 3320 1.1 kiyohara } 3321 1.1 kiyohara 3322 1.1 kiyohara static void 3323 1.1 kiyohara mvsata_reset_hc(struct mvsata_hc *mvhc) 3324 1.1 kiyohara { 3325 1.1 kiyohara #if 0 3326 1.1 kiyohara uint32_t val; 3327 1.1 kiyohara #endif 3328 1.1 kiyohara 3329 1.1 kiyohara MVSATA_HC_WRITE_4(mvhc, SATAHC_ICT, 0); 3330 1.1 kiyohara MVSATA_HC_WRITE_4(mvhc, SATAHC_ITT, 0); 3331 1.1 kiyohara MVSATA_HC_WRITE_4(mvhc, SATAHC_IC, 0); 3332 1.1 kiyohara 3333 1.1 kiyohara #if 0 /* XXXX needs? */ 3334 1.1 kiyohara MVSATA_HC_WRITE_4(mvhc, 0x01c, 0); 3335 1.1 kiyohara 3336 1.1 kiyohara /* 3337 1.1 kiyohara * Keep the SS during power on and the reference clock bits (reset 3338 1.1 kiyohara * sample) 3339 1.1 kiyohara */ 3340 1.1 kiyohara val = MVSATA_HC_READ_4(mvhc, 0x020); 3341 1.1 kiyohara val &= 0x1c1c1c1c; 3342 1.1 kiyohara val |= 0x03030303; 3343 1.1 kiyohara MVSATA_HC_READ_4(mvhc, 0x020, 0); 3344 1.1 kiyohara #endif 3345 1.1 kiyohara } 3346 1.1 kiyohara 3347 1.29 jakllsch static uint32_t 3348 1.36 jdolecek mvsata_softreset(struct mvsata_port *mvport, int flags) 3349 1.1 kiyohara { 3350 1.36 jdolecek struct ata_channel *chp = &mvport->port_ata_channel; 3351 1.29 jakllsch uint32_t sig0 = ~0; 3352 1.36 jdolecek int timeout; 3353 1.29 jakllsch uint8_t st0; 3354 1.1 kiyohara 3355 1.36 jdolecek ata_channel_lock_owned(chp); 3356 1.36 jdolecek 3357 1.29 jakllsch MVSATA_WDC_WRITE_1(mvport, SRB_CAS, WDCTL_RST | WDCTL_IDS | WDCTL_4BIT); 3358 1.29 jakllsch delay(10); 3359 1.29 jakllsch (void) MVSATA_WDC_READ_1(mvport, SRB_FE); 3360 1.29 jakllsch MVSATA_WDC_WRITE_1(mvport, SRB_CAS, WDCTL_IDS | WDCTL_4BIT); 3361 1.1 kiyohara delay(10); 3362 1.1 kiyohara 3363 1.29 jakllsch /* wait for BSY to deassert */ 3364 1.36 jdolecek for (timeout = 0; timeout < WDC_RESET_WAIT / 10; timeout++) { 3365 1.29 jakllsch st0 = MVSATA_WDC_READ_1(mvport, SRB_CS); 3366 1.29 jakllsch 3367 1.29 jakllsch if ((st0 & WDCS_BSY) == 0) { 3368 1.29 jakllsch sig0 = MVSATA_WDC_READ_1(mvport, SRB_SC) << 0; 3369 1.29 jakllsch sig0 |= MVSATA_WDC_READ_1(mvport, SRB_LBAL) << 8; 3370 1.29 jakllsch sig0 |= MVSATA_WDC_READ_1(mvport, SRB_LBAM) << 16; 3371 1.29 jakllsch sig0 |= MVSATA_WDC_READ_1(mvport, SRB_LBAH) << 24; 3372 1.29 jakllsch goto out; 3373 1.1 kiyohara } 3374 1.36 jdolecek ata_delay(chp, 10, "atarst", flags); 3375 1.1 kiyohara } 3376 1.36 jdolecek 3377 1.36 jdolecek aprint_error("%s:%d:%d: %s: timeout\n", 3378 1.36 jdolecek device_xname(MVSATA_DEV2(mvport)), 3379 1.36 jdolecek mvport->port_hc->hc, mvport->port, __func__); 3380 1.36 jdolecek 3381 1.29 jakllsch out: 3382 1.29 jakllsch MVSATA_WDC_WRITE_1(mvport, SRB_CAS, WDCTL_4BIT); 3383 1.29 jakllsch return sig0; 3384 1.1 kiyohara } 3385 1.1 kiyohara 3386 1.29 jakllsch #ifndef MVSATA_WITHOUTDMA 3387 1.1 kiyohara static void 3388 1.1 kiyohara mvsata_edma_reset_qptr(struct mvsata_port *mvport) 3389 1.1 kiyohara { 3390 1.1 kiyohara const bus_addr_t crpb_addr = 3391 1.1 kiyohara mvport->port_crpb_dmamap->dm_segs[0].ds_addr; 3392 1.1 kiyohara const uint32_t crpb_addr_mask = 3393 1.1 kiyohara EDMA_RESQP_ERPQBAP_MASK | EDMA_RESQP_ERPQBA_MASK; 3394 1.1 kiyohara 3395 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_REQQBAH, 0); 3396 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_REQQIP, 0); 3397 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_REQQOP, 0); 3398 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_RESQBAH, (crpb_addr >> 16) >> 16); 3399 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_RESQIP, 0); 3400 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_RESQOP, (crpb_addr & crpb_addr_mask)); 3401 1.1 kiyohara } 3402 1.1 kiyohara 3403 1.1 kiyohara static inline void 3404 1.1 kiyohara mvsata_edma_enable(struct mvsata_port *mvport) 3405 1.1 kiyohara { 3406 1.1 kiyohara 3407 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_CMD, EDMA_CMD_EENEDMA); 3408 1.1 kiyohara } 3409 1.1 kiyohara 3410 1.50 jdolecek static void 3411 1.36 jdolecek mvsata_edma_disable(struct mvsata_port *mvport, int timeout, int wflags) 3412 1.1 kiyohara { 3413 1.36 jdolecek struct ata_channel *chp = &mvport->port_ata_channel; 3414 1.50 jdolecek uint32_t command; 3415 1.40 mlelstv int t; 3416 1.1 kiyohara 3417 1.43 jdolecek ata_channel_lock_owned(chp); 3418 1.43 jdolecek 3419 1.50 jdolecek /* The disable bit (eDsEDMA) is self negated. */ 3420 1.50 jdolecek MVSATA_EDMA_WRITE_4(mvport, EDMA_CMD, EDMA_CMD_EDSEDMA); 3421 1.40 mlelstv 3422 1.50 jdolecek timeout = mstohz(timeout + hztoms(1) - 1); 3423 1.40 mlelstv 3424 1.50 jdolecek for (t = 0; ; ++t) { 3425 1.50 jdolecek command = MVSATA_EDMA_READ_4(mvport, EDMA_CMD); 3426 1.50 jdolecek if (!(command & EDMA_CMD_EENEDMA)) 3427 1.50 jdolecek return; 3428 1.50 jdolecek if (t >= timeout) 3429 1.50 jdolecek break; 3430 1.50 jdolecek ata_delay(chp, hztoms(1), "mvsata_edma2", wflags); 3431 1.50 jdolecek } 3432 1.1 kiyohara 3433 1.50 jdolecek aprint_error("%s:%d:%d: unable to disable EDMA\n", 3434 1.50 jdolecek device_xname(MVSATA_DEV2(mvport)), 3435 1.50 jdolecek mvport->port_hc->hc, mvport->port); 3436 1.1 kiyohara } 3437 1.1 kiyohara 3438 1.1 kiyohara /* 3439 1.1 kiyohara * Set EDMA registers according to mode. 3440 1.1 kiyohara * ex. NCQ/TCQ(queued)/non queued. 3441 1.1 kiyohara */ 3442 1.1 kiyohara static void 3443 1.36 jdolecek mvsata_edma_config(struct mvsata_port *mvport, enum mvsata_edmamode mode) 3444 1.1 kiyohara { 3445 1.1 kiyohara struct mvsata_softc *sc = device_private(MVSATA_DEV2(mvport)); 3446 1.1 kiyohara uint32_t reg; 3447 1.1 kiyohara 3448 1.1 kiyohara reg = MVSATA_EDMA_READ_4(mvport, EDMA_CFG); 3449 1.1 kiyohara reg |= EDMA_CFG_RESERVED; 3450 1.1 kiyohara 3451 1.1 kiyohara if (mode == ncq) { 3452 1.1 kiyohara if (sc->sc_gen == gen1) { 3453 1.1 kiyohara aprint_error_dev(MVSATA_DEV2(mvport), 3454 1.1 kiyohara "GenI not support NCQ\n"); 3455 1.1 kiyohara return; 3456 1.1 kiyohara } else if (sc->sc_gen == gen2) 3457 1.1 kiyohara reg |= EDMA_CFG_EDEVERR; 3458 1.1 kiyohara reg |= EDMA_CFG_ESATANATVCMDQUE; 3459 1.1 kiyohara } else if (mode == queued) { 3460 1.1 kiyohara reg &= ~EDMA_CFG_ESATANATVCMDQUE; 3461 1.1 kiyohara reg |= EDMA_CFG_EQUE; 3462 1.1 kiyohara } else 3463 1.1 kiyohara reg &= ~(EDMA_CFG_ESATANATVCMDQUE | EDMA_CFG_EQUE); 3464 1.1 kiyohara 3465 1.1 kiyohara if (sc->sc_gen == gen1) 3466 1.1 kiyohara reg |= EDMA_CFG_ERDBSZ; 3467 1.1 kiyohara else if (sc->sc_gen == gen2) 3468 1.1 kiyohara reg |= (EDMA_CFG_ERDBSZEXT | EDMA_CFG_EWRBUFFERLEN); 3469 1.1 kiyohara else if (sc->sc_gen == gen2e) { 3470 1.1 kiyohara device_t parent = device_parent(MVSATA_DEV(sc)); 3471 1.1 kiyohara 3472 1.1 kiyohara reg |= (EDMA_CFG_EMASKRXPM | EDMA_CFG_EHOSTQUEUECACHEEN); 3473 1.1 kiyohara reg &= ~(EDMA_CFG_EEDMAFBS | EDMA_CFG_EEDMAQUELEN); 3474 1.1 kiyohara 3475 1.1 kiyohara if (device_is_a(parent, "pci")) 3476 1.1 kiyohara reg |= ( 3477 1.1 kiyohara #if NATAPIBUS > 0 3478 1.1 kiyohara EDMA_CFG_EEARLYCOMPLETIONEN | 3479 1.1 kiyohara #endif 3480 1.1 kiyohara EDMA_CFG_ECUTTHROUGHEN | 3481 1.1 kiyohara EDMA_CFG_EWRBUFFERLEN | 3482 1.1 kiyohara EDMA_CFG_ERDBSZEXT); 3483 1.1 kiyohara } 3484 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_CFG, reg); 3485 1.1 kiyohara 3486 1.1 kiyohara reg = ( 3487 1.1 kiyohara EDMA_IE_EIORDYERR | 3488 1.1 kiyohara EDMA_IE_ETRANSINT | 3489 1.1 kiyohara EDMA_IE_EDEVCON | 3490 1.1 kiyohara EDMA_IE_EDEVDIS); 3491 1.1 kiyohara if (sc->sc_gen != gen1) 3492 1.1 kiyohara reg |= ( 3493 1.1 kiyohara EDMA_IE_TRANSPROTERR | 3494 1.1 kiyohara EDMA_IE_LINKDATATXERR(EDMA_IE_LINKTXERR_FISTXABORTED) | 3495 1.1 kiyohara EDMA_IE_LINKDATATXERR(EDMA_IE_LINKXERR_OTHERERRORS) | 3496 1.1 kiyohara EDMA_IE_LINKDATATXERR(EDMA_IE_LINKXERR_LINKLAYERRESET) | 3497 1.1 kiyohara EDMA_IE_LINKDATATXERR(EDMA_IE_LINKXERR_INTERNALFIFO) | 3498 1.1 kiyohara EDMA_IE_LINKDATATXERR(EDMA_IE_LINKXERR_SATACRC) | 3499 1.1 kiyohara EDMA_IE_LINKCTLTXERR(EDMA_IE_LINKXERR_OTHERERRORS) | 3500 1.1 kiyohara EDMA_IE_LINKCTLTXERR(EDMA_IE_LINKXERR_LINKLAYERRESET) | 3501 1.1 kiyohara EDMA_IE_LINKCTLTXERR(EDMA_IE_LINKXERR_INTERNALFIFO) | 3502 1.1 kiyohara EDMA_IE_LINKDATARXERR(EDMA_IE_LINKXERR_OTHERERRORS) | 3503 1.1 kiyohara EDMA_IE_LINKDATARXERR(EDMA_IE_LINKXERR_LINKLAYERRESET) | 3504 1.1 kiyohara EDMA_IE_LINKDATARXERR(EDMA_IE_LINKXERR_INTERNALFIFO) | 3505 1.1 kiyohara EDMA_IE_LINKDATARXERR(EDMA_IE_LINKXERR_SATACRC) | 3506 1.1 kiyohara EDMA_IE_LINKCTLRXERR(EDMA_IE_LINKXERR_OTHERERRORS) | 3507 1.1 kiyohara EDMA_IE_LINKCTLRXERR(EDMA_IE_LINKXERR_LINKLAYERRESET) | 3508 1.1 kiyohara EDMA_IE_LINKCTLRXERR(EDMA_IE_LINKXERR_INTERNALFIFO) | 3509 1.1 kiyohara EDMA_IE_LINKCTLRXERR(EDMA_IE_LINKXERR_SATACRC) | 3510 1.1 kiyohara EDMA_IE_ESELFDIS); 3511 1.1 kiyohara 3512 1.1 kiyohara if (mode == ncq) 3513 1.1 kiyohara reg |= EDMA_IE_EDEVERR; 3514 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_IEM, reg); 3515 1.1 kiyohara reg = MVSATA_EDMA_READ_4(mvport, EDMA_HC); 3516 1.1 kiyohara reg &= ~EDMA_IE_EDEVERR; 3517 1.1 kiyohara if (mode != ncq) 3518 1.1 kiyohara reg |= EDMA_IE_EDEVERR; 3519 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, EDMA_HC, reg); 3520 1.1 kiyohara if (sc->sc_gen == gen2e) { 3521 1.1 kiyohara /* 3522 1.1 kiyohara * Clear FISWait4HostRdyEn[0] and [2]. 3523 1.1 kiyohara * [0]: Device to Host FIS with <ERR> or <DF> bit set to 1. 3524 1.1 kiyohara * [2]: SDB FIS is received with <ERR> bit set to 1. 3525 1.1 kiyohara */ 3526 1.1 kiyohara reg = MVSATA_EDMA_READ_4(mvport, SATA_FISC); 3527 1.1 kiyohara reg &= ~(SATA_FISC_FISWAIT4HOSTRDYEN_B0 | 3528 1.1 kiyohara SATA_FISC_FISWAIT4HOSTRDYEN_B2); 3529 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, SATA_FISC, reg); 3530 1.1 kiyohara } 3531 1.1 kiyohara 3532 1.36 jdolecek mvport->port_edmamode_curr = mode; 3533 1.1 kiyohara } 3534 1.1 kiyohara 3535 1.1 kiyohara 3536 1.1 kiyohara /* 3537 1.1 kiyohara * Generation dependent functions 3538 1.1 kiyohara */ 3539 1.1 kiyohara 3540 1.1 kiyohara static void 3541 1.36 jdolecek mvsata_edma_setup_crqb(struct mvsata_port *mvport, int erqqip, 3542 1.36 jdolecek struct ata_xfer *xfer) 3543 1.1 kiyohara { 3544 1.1 kiyohara struct crqb *crqb; 3545 1.1 kiyohara bus_addr_t eprd_addr; 3546 1.1 kiyohara daddr_t blkno; 3547 1.1 kiyohara uint32_t rw; 3548 1.1 kiyohara uint8_t cmd, head; 3549 1.1 kiyohara int i; 3550 1.36 jdolecek struct ata_bio *ata_bio = &xfer->c_bio; 3551 1.1 kiyohara 3552 1.1 kiyohara eprd_addr = mvport->port_eprd_dmamap->dm_segs[0].ds_addr + 3553 1.36 jdolecek mvport->port_reqtbl[xfer->c_slot].eprd_offset; 3554 1.1 kiyohara rw = (ata_bio->flags & ATA_READ) ? CRQB_CDIR_READ : CRQB_CDIR_WRITE; 3555 1.1 kiyohara cmd = (ata_bio->flags & ATA_READ) ? WDCC_READDMA : WDCC_WRITEDMA; 3556 1.26 jakllsch if (ata_bio->flags & (ATA_LBA|ATA_LBA48)) { 3557 1.26 jakllsch head = WDSD_LBA; 3558 1.26 jakllsch } else { 3559 1.26 jakllsch head = 0; 3560 1.26 jakllsch } 3561 1.1 kiyohara blkno = ata_bio->blkno; 3562 1.1 kiyohara if (ata_bio->flags & ATA_LBA48) 3563 1.1 kiyohara cmd = atacmd_to48(cmd); 3564 1.1 kiyohara else { 3565 1.1 kiyohara head |= ((ata_bio->blkno >> 24) & 0xf); 3566 1.1 kiyohara blkno &= 0xffffff; 3567 1.1 kiyohara } 3568 1.1 kiyohara crqb = &mvport->port_crqb->crqb + erqqip; 3569 1.1 kiyohara crqb->cprdbl = htole32(eprd_addr & CRQB_CRQBL_EPRD_MASK); 3570 1.1 kiyohara crqb->cprdbh = htole32((eprd_addr >> 16) >> 16); 3571 1.1 kiyohara crqb->ctrlflg = 3572 1.36 jdolecek htole16(rw | CRQB_CHOSTQUETAG(xfer->c_slot) | 3573 1.36 jdolecek CRQB_CPMPORT(xfer->c_drive)); 3574 1.1 kiyohara i = 0; 3575 1.36 jdolecek if (mvport->port_edmamode_curr == dma) { 3576 1.1 kiyohara if (ata_bio->flags & ATA_LBA48) 3577 1.1 kiyohara crqb->atacommand[i++] = htole16(CRQB_ATACOMMAND( 3578 1.1 kiyohara CRQB_ATACOMMAND_SECTORCOUNT, ata_bio->nblks >> 8)); 3579 1.1 kiyohara crqb->atacommand[i++] = htole16(CRQB_ATACOMMAND( 3580 1.1 kiyohara CRQB_ATACOMMAND_SECTORCOUNT, ata_bio->nblks)); 3581 1.1 kiyohara } else { /* ncq/queued */ 3582 1.1 kiyohara 3583 1.1 kiyohara /* 3584 1.1 kiyohara * XXXX: Oops, ata command is not correct. And, atabus layer 3585 1.1 kiyohara * has not been supported yet now. 3586 1.1 kiyohara * Queued DMA read/write. 3587 1.1 kiyohara * read/write FPDMAQueued. 3588 1.1 kiyohara */ 3589 1.1 kiyohara 3590 1.1 kiyohara if (ata_bio->flags & ATA_LBA48) 3591 1.1 kiyohara crqb->atacommand[i++] = htole16(CRQB_ATACOMMAND( 3592 1.1 kiyohara CRQB_ATACOMMAND_FEATURES, ata_bio->nblks >> 8)); 3593 1.1 kiyohara crqb->atacommand[i++] = htole16(CRQB_ATACOMMAND( 3594 1.1 kiyohara CRQB_ATACOMMAND_FEATURES, ata_bio->nblks)); 3595 1.1 kiyohara crqb->atacommand[i++] = htole16(CRQB_ATACOMMAND( 3596 1.36 jdolecek CRQB_ATACOMMAND_SECTORCOUNT, xfer->c_slot << 3)); 3597 1.1 kiyohara } 3598 1.1 kiyohara if (ata_bio->flags & ATA_LBA48) { 3599 1.1 kiyohara crqb->atacommand[i++] = htole16(CRQB_ATACOMMAND( 3600 1.1 kiyohara CRQB_ATACOMMAND_LBALOW, blkno >> 24)); 3601 1.1 kiyohara crqb->atacommand[i++] = htole16(CRQB_ATACOMMAND( 3602 1.1 kiyohara CRQB_ATACOMMAND_LBAMID, blkno >> 32)); 3603 1.1 kiyohara crqb->atacommand[i++] = htole16(CRQB_ATACOMMAND( 3604 1.1 kiyohara CRQB_ATACOMMAND_LBAHIGH, blkno >> 40)); 3605 1.1 kiyohara } 3606 1.1 kiyohara crqb->atacommand[i++] = 3607 1.1 kiyohara htole16(CRQB_ATACOMMAND(CRQB_ATACOMMAND_LBALOW, blkno)); 3608 1.1 kiyohara crqb->atacommand[i++] = 3609 1.1 kiyohara htole16(CRQB_ATACOMMAND(CRQB_ATACOMMAND_LBAMID, blkno >> 8)); 3610 1.1 kiyohara crqb->atacommand[i++] = 3611 1.1 kiyohara htole16(CRQB_ATACOMMAND(CRQB_ATACOMMAND_LBAHIGH, blkno >> 16)); 3612 1.1 kiyohara crqb->atacommand[i++] = 3613 1.1 kiyohara htole16(CRQB_ATACOMMAND(CRQB_ATACOMMAND_DEVICE, head)); 3614 1.1 kiyohara crqb->atacommand[i++] = htole16( 3615 1.1 kiyohara CRQB_ATACOMMAND(CRQB_ATACOMMAND_COMMAND, cmd) | 3616 1.1 kiyohara CRQB_ATACOMMAND_LAST); 3617 1.1 kiyohara } 3618 1.1 kiyohara #endif 3619 1.1 kiyohara 3620 1.1 kiyohara static uint32_t 3621 1.1 kiyohara mvsata_read_preamps_gen1(struct mvsata_port *mvport) 3622 1.1 kiyohara { 3623 1.1 kiyohara struct mvsata_hc *hc = mvport->port_hc; 3624 1.1 kiyohara uint32_t reg; 3625 1.1 kiyohara 3626 1.1 kiyohara reg = MVSATA_HC_READ_4(hc, SATAHC_I_PHYMODE(mvport->port)); 3627 1.1 kiyohara /* 3628 1.1 kiyohara * [12:11] : pre 3629 1.1 kiyohara * [7:5] : amps 3630 1.1 kiyohara */ 3631 1.1 kiyohara return reg & 0x000018e0; 3632 1.1 kiyohara } 3633 1.1 kiyohara 3634 1.1 kiyohara static void 3635 1.1 kiyohara mvsata_fix_phy_gen1(struct mvsata_port *mvport) 3636 1.1 kiyohara { 3637 1.1 kiyohara struct mvsata_softc *sc = device_private(MVSATA_DEV2(mvport)); 3638 1.1 kiyohara struct mvsata_hc *mvhc = mvport->port_hc; 3639 1.1 kiyohara uint32_t reg; 3640 1.1 kiyohara int port = mvport->port, fix_apm_sq = 0; 3641 1.1 kiyohara 3642 1.1 kiyohara if (sc->sc_model == PCI_PRODUCT_MARVELL_88SX5080) { 3643 1.1 kiyohara if (sc->sc_rev == 0x01) 3644 1.1 kiyohara fix_apm_sq = 1; 3645 1.1 kiyohara } else { 3646 1.1 kiyohara if (sc->sc_rev == 0x00) 3647 1.1 kiyohara fix_apm_sq = 1; 3648 1.1 kiyohara } 3649 1.1 kiyohara 3650 1.1 kiyohara if (fix_apm_sq) { 3651 1.1 kiyohara /* 3652 1.1 kiyohara * Disable auto-power management 3653 1.1 kiyohara * 88SX50xx FEr SATA#12 3654 1.1 kiyohara */ 3655 1.1 kiyohara reg = MVSATA_HC_READ_4(mvhc, SATAHC_I_LTMODE(port)); 3656 1.1 kiyohara reg |= (1 << 19); 3657 1.1 kiyohara MVSATA_HC_WRITE_4(mvhc, SATAHC_I_LTMODE(port), reg); 3658 1.1 kiyohara 3659 1.1 kiyohara /* 3660 1.1 kiyohara * Fix squelch threshold 3661 1.1 kiyohara * 88SX50xx FEr SATA#9 3662 1.1 kiyohara */ 3663 1.1 kiyohara reg = MVSATA_HC_READ_4(mvhc, SATAHC_I_PHYCONTROL(port)); 3664 1.1 kiyohara reg &= ~0x3; 3665 1.1 kiyohara reg |= 0x1; 3666 1.1 kiyohara MVSATA_HC_WRITE_4(mvhc, SATAHC_I_PHYCONTROL(port), reg); 3667 1.1 kiyohara } 3668 1.1 kiyohara 3669 1.1 kiyohara /* Revert values of pre-emphasis and signal amps to the saved ones */ 3670 1.1 kiyohara reg = MVSATA_HC_READ_4(mvhc, SATAHC_I_PHYMODE(port)); 3671 1.1 kiyohara reg &= ~0x000018e0; /* pre and amps mask */ 3672 1.1 kiyohara reg |= mvport->_fix_phy_param.pre_amps; 3673 1.1 kiyohara MVSATA_HC_WRITE_4(mvhc, SATAHC_I_PHYMODE(port), reg); 3674 1.1 kiyohara } 3675 1.1 kiyohara 3676 1.1 kiyohara static void 3677 1.1 kiyohara mvsata_devconn_gen1(struct mvsata_port *mvport) 3678 1.1 kiyohara { 3679 1.1 kiyohara struct mvsata_softc *sc = device_private(MVSATA_DEV2(mvport)); 3680 1.1 kiyohara 3681 1.1 kiyohara /* Fix for 88SX50xx FEr SATA#2 */ 3682 1.1 kiyohara mvport->_fix_phy_param._fix_phy(mvport); 3683 1.1 kiyohara 3684 1.1 kiyohara /* If disk is connected, then enable the activity LED */ 3685 1.1 kiyohara if (sc->sc_rev == 0x03) { 3686 1.1 kiyohara /* XXXXX */ 3687 1.1 kiyohara } 3688 1.1 kiyohara } 3689 1.1 kiyohara 3690 1.1 kiyohara static uint32_t 3691 1.1 kiyohara mvsata_read_preamps_gen2(struct mvsata_port *mvport) 3692 1.1 kiyohara { 3693 1.1 kiyohara uint32_t reg; 3694 1.1 kiyohara 3695 1.1 kiyohara reg = MVSATA_EDMA_READ_4(mvport, SATA_PHYM2); 3696 1.1 kiyohara /* 3697 1.1 kiyohara * [10:8] : amps 3698 1.1 kiyohara * [7:5] : pre 3699 1.1 kiyohara */ 3700 1.1 kiyohara return reg & 0x000007e0; 3701 1.1 kiyohara } 3702 1.1 kiyohara 3703 1.1 kiyohara static void 3704 1.1 kiyohara mvsata_fix_phy_gen2(struct mvsata_port *mvport) 3705 1.1 kiyohara { 3706 1.1 kiyohara struct mvsata_softc *sc = device_private(MVSATA_DEV2(mvport)); 3707 1.1 kiyohara uint32_t reg; 3708 1.1 kiyohara 3709 1.1 kiyohara if ((sc->sc_gen == gen2 && sc->sc_rev == 0x07) || 3710 1.1 kiyohara sc->sc_gen == gen2e) { 3711 1.1 kiyohara /* 3712 1.1 kiyohara * Fix for 3713 1.1 kiyohara * 88SX60X1 FEr SATA #23 3714 1.1 kiyohara * 88SX6042/88SX7042 FEr SATA #23 3715 1.1 kiyohara * 88F5182 FEr #SATA-S13 3716 1.1 kiyohara * 88F5082 FEr #SATA-S13 3717 1.1 kiyohara */ 3718 1.1 kiyohara reg = MVSATA_EDMA_READ_4(mvport, SATA_PHYM2); 3719 1.1 kiyohara reg &= ~(1 << 16); 3720 1.1 kiyohara reg |= (1 << 31); 3721 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, SATA_PHYM2, reg); 3722 1.1 kiyohara 3723 1.1 kiyohara delay(200); 3724 1.1 kiyohara 3725 1.1 kiyohara reg = MVSATA_EDMA_READ_4(mvport, SATA_PHYM2); 3726 1.1 kiyohara reg &= ~((1 << 16) | (1 << 31)); 3727 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, SATA_PHYM2, reg); 3728 1.1 kiyohara 3729 1.1 kiyohara delay(200); 3730 1.1 kiyohara } 3731 1.1 kiyohara 3732 1.1 kiyohara /* Fix values in PHY Mode 3 Register.*/ 3733 1.1 kiyohara reg = MVSATA_EDMA_READ_4(mvport, SATA_PHYM3); 3734 1.1 kiyohara reg &= ~0x7F900000; 3735 1.1 kiyohara reg |= 0x2A800000; 3736 1.1 kiyohara /* Implement Guidline 88F5182, 88F5082, 88F6082 (GL# SATA-S11) */ 3737 1.1 kiyohara if (sc->sc_model == PCI_PRODUCT_MARVELL_88F5082 || 3738 1.1 kiyohara sc->sc_model == PCI_PRODUCT_MARVELL_88F5182 || 3739 1.1 kiyohara sc->sc_model == PCI_PRODUCT_MARVELL_88F6082) 3740 1.1 kiyohara reg &= ~0x0000001c; 3741 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, SATA_PHYM3, reg); 3742 1.1 kiyohara 3743 1.1 kiyohara /* 3744 1.1 kiyohara * Fix values in PHY Mode 4 Register. 3745 1.1 kiyohara * 88SX60x1 FEr SATA#10 3746 1.1 kiyohara * 88F5182 GL #SATA-S10 3747 1.1 kiyohara * 88F5082 GL #SATA-S10 3748 1.1 kiyohara */ 3749 1.1 kiyohara if ((sc->sc_gen == gen2 && sc->sc_rev == 0x07) || 3750 1.1 kiyohara sc->sc_gen == gen2e) { 3751 1.1 kiyohara uint32_t tmp = 0; 3752 1.1 kiyohara 3753 1.1 kiyohara /* 88SX60x1 FEr SATA #13 */ 3754 1.1 kiyohara if (sc->sc_gen == 2 && sc->sc_rev == 0x07) 3755 1.1 kiyohara tmp = MVSATA_EDMA_READ_4(mvport, SATA_PHYM3); 3756 1.1 kiyohara 3757 1.1 kiyohara reg = MVSATA_EDMA_READ_4(mvport, SATA_PHYM4); 3758 1.1 kiyohara reg |= (1 << 0); 3759 1.1 kiyohara reg &= ~(1 << 1); 3760 1.1 kiyohara /* PHY Mode 4 Register of Gen IIE has some restriction */ 3761 1.1 kiyohara if (sc->sc_gen == gen2e) { 3762 1.1 kiyohara reg &= ~0x5de3fffc; 3763 1.1 kiyohara reg |= (1 << 2); 3764 1.1 kiyohara } 3765 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, SATA_PHYM4, reg); 3766 1.1 kiyohara 3767 1.1 kiyohara /* 88SX60x1 FEr SATA #13 */ 3768 1.1 kiyohara if (sc->sc_gen == 2 && sc->sc_rev == 0x07) 3769 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, SATA_PHYM3, tmp); 3770 1.1 kiyohara } 3771 1.1 kiyohara 3772 1.1 kiyohara /* Revert values of pre-emphasis and signal amps to the saved ones */ 3773 1.1 kiyohara reg = MVSATA_EDMA_READ_4(mvport, SATA_PHYM2); 3774 1.1 kiyohara reg &= ~0x000007e0; /* pre and amps mask */ 3775 1.1 kiyohara reg |= mvport->_fix_phy_param.pre_amps; 3776 1.1 kiyohara reg &= ~(1 << 16); 3777 1.1 kiyohara if (sc->sc_gen == gen2e) { 3778 1.1 kiyohara /* 3779 1.1 kiyohara * according to mvSata 3.6.1, some IIE values are fixed. 3780 1.1 kiyohara * some reserved fields must be written with fixed values. 3781 1.1 kiyohara */ 3782 1.1 kiyohara reg &= ~0xC30FF01F; 3783 1.1 kiyohara reg |= 0x0000900F; 3784 1.1 kiyohara } 3785 1.1 kiyohara MVSATA_EDMA_WRITE_4(mvport, SATA_PHYM2, reg); 3786 1.1 kiyohara } 3787 1.1 kiyohara 3788 1.1 kiyohara #ifndef MVSATA_WITHOUTDMA 3789 1.1 kiyohara static void 3790 1.36 jdolecek mvsata_edma_setup_crqb_gen2e(struct mvsata_port *mvport, int erqqip, 3791 1.36 jdolecek struct ata_xfer *xfer) 3792 1.1 kiyohara { 3793 1.1 kiyohara struct crqb_gen2e *crqb; 3794 1.1 kiyohara bus_addr_t eprd_addr; 3795 1.1 kiyohara uint32_t ctrlflg, rw; 3796 1.36 jdolecek uint8_t fis[RHD_FISLEN]; 3797 1.1 kiyohara 3798 1.1 kiyohara eprd_addr = mvport->port_eprd_dmamap->dm_segs[0].ds_addr + 3799 1.36 jdolecek mvport->port_reqtbl[xfer->c_slot].eprd_offset; 3800 1.36 jdolecek rw = (xfer->c_bio.flags & ATA_READ) ? CRQB_CDIR_READ : CRQB_CDIR_WRITE; 3801 1.36 jdolecek ctrlflg = (rw | CRQB_CDEVICEQUETAG(xfer->c_slot) | 3802 1.36 jdolecek CRQB_CPMPORT(xfer->c_drive) | 3803 1.36 jdolecek CRQB_CPRDMODE_EPRD | CRQB_CHOSTQUETAG_GEN2(xfer->c_slot)); 3804 1.36 jdolecek 3805 1.1 kiyohara crqb = &mvport->port_crqb->crqb_gen2e + erqqip; 3806 1.1 kiyohara crqb->cprdbl = htole32(eprd_addr & CRQB_CRQBL_EPRD_MASK); 3807 1.1 kiyohara crqb->cprdbh = htole32((eprd_addr >> 16) >> 16); 3808 1.1 kiyohara crqb->ctrlflg = htole32(ctrlflg); 3809 1.1 kiyohara 3810 1.36 jdolecek satafis_rhd_construct_bio(xfer, fis); 3811 1.1 kiyohara 3812 1.36 jdolecek crqb->atacommand[0] = 0; 3813 1.36 jdolecek crqb->atacommand[1] = 0; 3814 1.36 jdolecek /* copy over the ATA command part of the fis */ 3815 1.36 jdolecek memcpy(&crqb->atacommand[2], &fis[rhd_command], 3816 1.36 jdolecek MIN(sizeof(crqb->atacommand) - 2, RHD_FISLEN - rhd_command)); 3817 1.1 kiyohara } 3818 1.1 kiyohara 3819 1.1 kiyohara #ifdef MVSATA_DEBUG 3820 1.1 kiyohara #define MVSATA_DEBUG_PRINT(type, size, n, p) \ 3821 1.1 kiyohara do { \ 3822 1.1 kiyohara int _i; \ 3823 1.1 kiyohara u_char *_p = (p); \ 3824 1.1 kiyohara \ 3825 1.1 kiyohara printf(#type "(%d)", (n)); \ 3826 1.1 kiyohara for (_i = 0; _i < (size); _i++, _p++) { \ 3827 1.1 kiyohara if (_i % 16 == 0) \ 3828 1.1 kiyohara printf("\n "); \ 3829 1.1 kiyohara printf(" %02x", *_p); \ 3830 1.1 kiyohara } \ 3831 1.1 kiyohara printf("\n"); \ 3832 1.1 kiyohara } while (0 /* CONSTCOND */) 3833 1.1 kiyohara 3834 1.1 kiyohara static void 3835 1.1 kiyohara mvsata_print_crqb(struct mvsata_port *mvport, int n) 3836 1.1 kiyohara { 3837 1.1 kiyohara 3838 1.1 kiyohara MVSATA_DEBUG_PRINT(crqb, sizeof(union mvsata_crqb), 3839 1.1 kiyohara n, (u_char *)(mvport->port_crqb + n)); 3840 1.1 kiyohara } 3841 1.1 kiyohara 3842 1.1 kiyohara static void 3843 1.1 kiyohara mvsata_print_crpb(struct mvsata_port *mvport, int n) 3844 1.1 kiyohara { 3845 1.1 kiyohara 3846 1.1 kiyohara MVSATA_DEBUG_PRINT(crpb, sizeof(struct crpb), 3847 1.1 kiyohara n, (u_char *)(mvport->port_crpb + n)); 3848 1.1 kiyohara } 3849 1.1 kiyohara 3850 1.1 kiyohara static void 3851 1.1 kiyohara mvsata_print_eprd(struct mvsata_port *mvport, int n) 3852 1.1 kiyohara { 3853 1.1 kiyohara struct eprd *eprd; 3854 1.1 kiyohara int i = 0; 3855 1.1 kiyohara 3856 1.1 kiyohara eprd = mvport->port_reqtbl[n].eprd; 3857 1.1 kiyohara while (1 /*CONSTCOND*/) { 3858 1.1 kiyohara MVSATA_DEBUG_PRINT(eprd, sizeof(struct eprd), 3859 1.1 kiyohara i, (u_char *)eprd); 3860 1.1 kiyohara if (eprd->eot & EPRD_EOT) 3861 1.1 kiyohara break; 3862 1.1 kiyohara eprd++; 3863 1.1 kiyohara i++; 3864 1.1 kiyohara } 3865 1.1 kiyohara } 3866 1.1 kiyohara #endif 3867 1.1 kiyohara #endif 3868