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