[BACK]Return to ahci.c CVS log [TXT][DIR] Up to [local] / sys / dev / pci

Annotation of sys/dev/pci/ahci.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: ahci.c,v 1.128 2007/07/03 22:33:20 dlg Exp $ */
                      2:
                      3: /*
                      4:  * Copyright (c) 2006 David Gwynne <dlg@openbsd.org>
                      5:  *
                      6:  * Permission to use, copy, modify, and distribute this software for any
                      7:  * purpose with or without fee is hereby granted, provided that the above
                      8:  * copyright notice and this permission notice appear in all copies.
                      9:  *
                     10:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
                     11:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
                     12:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
                     13:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
                     14:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
                     15:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
                     16:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     17:  */
                     18:
                     19: #include <sys/param.h>
                     20: #include <sys/systm.h>
                     21: #include <sys/buf.h>
                     22: #include <sys/kernel.h>
                     23: #include <sys/malloc.h>
                     24: #include <sys/device.h>
                     25: #include <sys/proc.h>
                     26: #include <sys/queue.h>
                     27:
                     28: #include <machine/bus.h>
                     29:
                     30: #include <dev/pci/pcireg.h>
                     31: #include <dev/pci/pcivar.h>
                     32: #include <dev/pci/pcidevs.h>
                     33:
                     34: #include <dev/ata/atascsi.h>
                     35:
                     36: /* change to AHCI_DEBUG for dmesg spam */
                     37: #define NO_AHCI_DEBUG
                     38:
                     39: #ifdef AHCI_DEBUG
                     40: #define DPRINTF(m, f...) do { if ((ahcidebug & (m)) == (m)) printf(f); } \
                     41:     while (0)
                     42: #define AHCI_D_TIMEOUT         0x00
                     43: #define AHCI_D_VERBOSE         0x01
                     44: #define AHCI_D_INTR            0x02
                     45: #define AHCI_D_XFER            0x08
                     46: int ahcidebug = AHCI_D_VERBOSE;
                     47: #else
                     48: #define DPRINTF(m, f...)
                     49: #endif
                     50:
                     51: #define AHCI_PCI_BAR           0x24
                     52: #define AHCI_PCI_INTERFACE     0x01
                     53:
                     54: #define AHCI_REG_CAP           0x000 /* HBA Capabilities */
                     55: #define  AHCI_REG_CAP_NP(_r)           (((_r) & 0x1f)+1) /* Number of Ports */
                     56: #define  AHCI_REG_CAP_SXS              (1<<5) /* External SATA */
                     57: #define  AHCI_REG_CAP_EMS              (1<<6) /* Enclosure Mgmt */
                     58: #define  AHCI_REG_CAP_CCCS             (1<<7) /* Cmd Coalescing */
                     59: #define  AHCI_REG_CAP_NCS(_r)          ((((_r) & 0x1f00)>>8)+1) /* NCmds*/
                     60: #define  AHCI_REG_CAP_PSC              (1<<13) /* Partial State Capable */
                     61: #define  AHCI_REG_CAP_SSC              (1<<14) /* Slumber State Capable */
                     62: #define  AHCI_REG_CAP_PMD              (1<<15) /* PIO Multiple DRQ Block */
                     63: #define  AHCI_REG_CAP_FBSS             (1<<16) /* FIS-Based Switching */
                     64: #define  AHCI_REG_CAP_SPM              (1<<17) /* Port Multiplier */
                     65: #define  AHCI_REG_CAP_SAM              (1<<18) /* AHCI Only mode */
                     66: #define  AHCI_REG_CAP_SNZO             (1<<19) /* Non Zero DMA Offsets */
                     67: #define  AHCI_REG_CAP_ISS              (0xf<<20) /* Interface Speed Support */
                     68: #define  AHCI_REG_CAP_ISS_G1           (0x1<<20) /* Gen 1 (1.5 Gbps) */
                     69: #define  AHCI_REG_CAP_ISS_G1_2         (0x2<<20) /* Gen 1 and 2 (3 Gbps) */
                     70: #define  AHCI_REG_CAP_SCLO             (1<<24) /* Cmd List Override */
                     71: #define  AHCI_REG_CAP_SAL              (1<<25) /* Activity LED */
                     72: #define  AHCI_REG_CAP_SALP             (1<<26) /* Aggressive Link Pwr Mgmt */
                     73: #define  AHCI_REG_CAP_SSS              (1<<27) /* Staggered Spinup */
                     74: #define  AHCI_REG_CAP_SMPS             (1<<28) /* Mech Presence Switch */
                     75: #define  AHCI_REG_CAP_SSNTF            (1<<29) /* SNotification Register */
                     76: #define  AHCI_REG_CAP_SNCQ             (1<<30) /* Native Cmd Queuing */
                     77: #define  AHCI_REG_CAP_S64A             (1<<31) /* 64bit Addressing */
                     78: #define  AHCI_FMT_CAP          "\020" "\040S64A" "\037NCQ" "\036SSNTF" \
                     79:                                    "\035SMPS" "\034SSS" "\033SALP" "\032SAL" \
                     80:                                    "\031SCLO" "\024SNZO" "\023SAM" "\022SPM" \
                     81:                                    "\021FBSS" "\020PMD" "\017SSC" "\016PSC" \
                     82:                                    "\010CCCS" "\007EMS" "\006SXS"
                     83: #define AHCI_REG_GHC           0x004 /* Global HBA Control */
                     84: #define  AHCI_REG_GHC_HR               (1<<0) /* HBA Reset */
                     85: #define  AHCI_REG_GHC_IE               (1<<1) /* Interrupt Enable */
                     86: #define  AHCI_REG_GHC_MRSM             (1<<2) /* MSI Revert to Single Msg */
                     87: #define  AHCI_REG_GHC_AE               (1<<31) /* AHCI Enable */
                     88: #define AHCI_FMT_GHC           "\020" "\040AE" "\003MRSM" "\002IE" "\001HR"
                     89: #define AHCI_REG_IS            0x008 /* Interrupt Status */
                     90: #define AHCI_REG_PI            0x00c /* Ports Implemented */
                     91: #define AHCI_REG_VS            0x010 /* AHCI Version */
                     92: #define  AHCI_REG_VS_0_95              0x00000905 /* 0.95 */
                     93: #define  AHCI_REG_VS_1_0               0x00010000 /* 1.0 */
                     94: #define  AHCI_REG_VS_1_1               0x00010100 /* 1.1 */
                     95: #define AHCI_REG_CCC_CTL       0x014 /* Coalescing Control */
                     96: #define  AHCI_REG_CCC_CTL_INT(_r)      (((_r) & 0xf8) >> 3) /* CCC INT slot */
                     97: #define AHCI_REG_CCC_PORTS     0x018 /* Coalescing Ports */
                     98: #define AHCI_REG_EM_LOC                0x01c /* Enclosure Mgmt Location */
                     99: #define AHCI_REG_EM_CTL                0x020 /* Enclosure Mgmt Control */
                    100:
                    101: #define AHCI_PORT_REGION(_p)   (0x100 + ((_p) * 0x80))
                    102: #define AHCI_PORT_SIZE         0x80
                    103:
                    104: #define AHCI_PREG_CLB          0x00 /* Cmd List Base Addr */
                    105: #define AHCI_PREG_CLBU         0x04 /* Cmd List Base Hi Addr */
                    106: #define AHCI_PREG_FB           0x08 /* FIS Base Addr */
                    107: #define AHCI_PREG_FBU          0x0c /* FIS Base Hi Addr */
                    108: #define AHCI_PREG_IS           0x10 /* Interrupt Status */
                    109: #define  AHCI_PREG_IS_DHRS             (1<<0) /* Device to Host FIS */
                    110: #define  AHCI_PREG_IS_PSS              (1<<1) /* PIO Setup FIS */
                    111: #define  AHCI_PREG_IS_DSS              (1<<2) /* DMA Setup FIS */
                    112: #define  AHCI_PREG_IS_SDBS             (1<<3) /* Set Device Bits FIS */
                    113: #define  AHCI_PREG_IS_UFS              (1<<4) /* Unknown FIS */
                    114: #define  AHCI_PREG_IS_DPS              (1<<5) /* Descriptor Processed */
                    115: #define  AHCI_PREG_IS_PCS              (1<<6) /* Port Change */
                    116: #define  AHCI_PREG_IS_DMPS             (1<<7) /* Device Mechanical Presence */
                    117: #define  AHCI_PREG_IS_PRCS             (1<<22) /* PhyRdy Change */
                    118: #define  AHCI_PREG_IS_IPMS             (1<<23) /* Incorrect Port Multiplier */
                    119: #define  AHCI_PREG_IS_OFS              (1<<24) /* Overflow */
                    120: #define  AHCI_PREG_IS_INFS             (1<<26) /* Interface Non-fatal Error */
                    121: #define  AHCI_PREG_IS_IFS              (1<<27) /* Interface Fatal Error */
                    122: #define  AHCI_PREG_IS_HBDS             (1<<28) /* Host Bus Data Error */
                    123: #define  AHCI_PREG_IS_HBFS             (1<<29) /* Host Bus Fatal Error */
                    124: #define  AHCI_PREG_IS_TFES             (1<<30) /* Task File Error */
                    125: #define  AHCI_PREG_IS_CPDS             (1<<31) /* Cold Presence Detect */
                    126: #define AHCI_PFMT_IS           "\20" "\040CPDS" "\037TFES" "\036HBFS" \
                    127:                                    "\035HBDS" "\034IFS" "\033INFS" "\031OFS" \
                    128:                                    "\030IPMS" "\027PRCS" "\010DMPS" "\006DPS" \
                    129:                                    "\007PCS" "\005UFS" "\004SDBS" "\003DSS" \
                    130:                                    "\002PSS" "\001DHRS"
                    131: #define AHCI_PREG_IE           0x14 /* Interrupt Enable */
                    132: #define  AHCI_PREG_IE_DHRE             (1<<0) /* Device to Host FIS */
                    133: #define  AHCI_PREG_IE_PSE              (1<<1) /* PIO Setup FIS */
                    134: #define  AHCI_PREG_IE_DSE              (1<<2) /* DMA Setup FIS */
                    135: #define  AHCI_PREG_IE_SDBE             (1<<3) /* Set Device Bits FIS */
                    136: #define  AHCI_PREG_IE_UFE              (1<<4) /* Unknown FIS */
                    137: #define  AHCI_PREG_IE_DPE              (1<<5) /* Descriptor Processed */
                    138: #define  AHCI_PREG_IE_PCE              (1<<6) /* Port Change */
                    139: #define  AHCI_PREG_IE_DMPE             (1<<7) /* Device Mechanical Presence */
                    140: #define  AHCI_PREG_IE_PRCE             (1<<22) /* PhyRdy Change */
                    141: #define  AHCI_PREG_IE_IPME             (1<<23) /* Incorrect Port Multiplier */
                    142: #define  AHCI_PREG_IE_OFE              (1<<24) /* Overflow */
                    143: #define  AHCI_PREG_IE_INFE             (1<<26) /* Interface Non-fatal Error */
                    144: #define  AHCI_PREG_IE_IFE              (1<<27) /* Interface Fatal Error */
                    145: #define  AHCI_PREG_IE_HBDE             (1<<28) /* Host Bus Data Error */
                    146: #define  AHCI_PREG_IE_HBFE             (1<<29) /* Host Bus Fatal Error */
                    147: #define  AHCI_PREG_IE_TFEE             (1<<30) /* Task File Error */
                    148: #define  AHCI_PREG_IE_CPDE             (1<<31) /* Cold Presence Detect */
                    149: #define AHCI_PFMT_IE           "\20" "\040CPDE" "\037TFEE" "\036HBFE" \
                    150:                                    "\035HBDE" "\034IFE" "\033INFE" "\031OFE" \
                    151:                                    "\030IPME" "\027PRCE" "\010DMPE" "\007PCE" \
                    152:                                    "\006DPE" "\005UFE" "\004SDBE" "\003DSE" \
                    153:                                    "\002PSE" "\001DHRE"
                    154: #define AHCI_PREG_CMD          0x18 /* Command and Status */
                    155: #define  AHCI_PREG_CMD_ST              (1<<0) /* Start */
                    156: #define  AHCI_PREG_CMD_SUD             (1<<1) /* Spin Up Device */
                    157: #define  AHCI_PREG_CMD_POD             (1<<2) /* Power On Device */
                    158: #define  AHCI_PREG_CMD_CLO             (1<<3) /* Command List Override */
                    159: #define  AHCI_PREG_CMD_FRE             (1<<4) /* FIS Receive Enable */
                    160: #define  AHCI_PREG_CMD_CCS(_r)         (((_r) >> 8) & 0x1f) /* Curr CmdSlot# */
                    161: #define  AHCI_PREG_CMD_MPSS            (1<<13) /* Mech Presence State */
                    162: #define  AHCI_PREG_CMD_FR              (1<<14) /* FIS Receive Running */
                    163: #define  AHCI_PREG_CMD_CR              (1<<15) /* Command List Running */
                    164: #define  AHCI_PREG_CMD_CPS             (1<<16) /* Cold Presence State */
                    165: #define  AHCI_PREG_CMD_PMA             (1<<17) /* Port Multiplier Attached */
                    166: #define  AHCI_PREG_CMD_HPCP            (1<<18) /* Hot Plug Capable */
                    167: #define  AHCI_PREG_CMD_MPSP            (1<<19) /* Mech Presence Switch */
                    168: #define  AHCI_PREG_CMD_CPD             (1<<20) /* Cold Presence Detection */
                    169: #define  AHCI_PREG_CMD_ESP             (1<<21) /* External SATA Port */
                    170: #define  AHCI_PREG_CMD_ATAPI           (1<<24) /* Device is ATAPI */
                    171: #define  AHCI_PREG_CMD_DLAE            (1<<25) /* Drv LED on ATAPI Enable */
                    172: #define  AHCI_PREG_CMD_ALPE            (1<<26) /* Aggro Pwr Mgmt Enable */
                    173: #define  AHCI_PREG_CMD_ASP             (1<<27) /* Aggro Slumber/Partial */
                    174: #define  AHCI_PREG_CMD_ICC             0xf0000000 /* Interface Comm Ctrl */
                    175: #define  AHCI_PREG_CMD_ICC_SLUMBER     0x60000000
                    176: #define  AHCI_PREG_CMD_ICC_PARTIAL     0x20000000
                    177: #define  AHCI_PREG_CMD_ICC_ACTIVE      0x10000000
                    178: #define  AHCI_PREG_CMD_ICC_IDLE                0x00000000
                    179: #define  AHCI_PFMT_CMD         "\020" "\034ASP" "\033ALPE" "\032DLAE" \
                    180:                                    "\031ATAPI" "\026ESP" "\025CPD" "\024MPSP" \
                    181:                                    "\023HPCP" "\022PMA" "\021CPS" "\020CR" \
                    182:                                    "\017FR" "\016MPSS" "\005FRE" "\004CLO" \
                    183:                                    "\003POD" "\002SUD" "\001ST"
                    184: #define AHCI_PREG_TFD          0x20 /* Task File Data*/
                    185: #define  AHCI_PREG_TFD_STS             0xff
                    186: #define  AHCI_PREG_TFD_STS_ERR         (1<<0)
                    187: #define  AHCI_PREG_TFD_STS_DRQ         (1<<3)
                    188: #define  AHCI_PREG_TFD_STS_BSY         (1<<7)
                    189: #define  AHCI_PREG_TFD_ERR             0xff00
                    190: #define AHCI_PFMT_TFD_STS      "\20" "\010BSY" "\004DRQ" "\001ERR"
                    191: #define AHCI_PREG_SIG          0x24 /* Signature */
                    192: #define AHCI_PREG_SSTS         0x28 /* SATA Status */
                    193: #define  AHCI_PREG_SSTS_DET            0xf /* Device Detection */
                    194: #define  AHCI_PREG_SSTS_DET_NONE       0x0
                    195: #define  AHCI_PREG_SSTS_DET_DEV_NE     0x1
                    196: #define  AHCI_PREG_SSTS_DET_DEV                0x3
                    197: #define  AHCI_PREG_SSTS_DET_PHYOFFLINE 0x4
                    198: #define  AHCI_PREG_SSTS_SPD            0xf0 /* Current Interface Speed */
                    199: #define  AHCI_PREG_SSTS_SPD_NONE       0x00
                    200: #define  AHCI_PREG_SSTS_SPD_GEN1       0x10
                    201: #define  AHCI_PREG_SSTS_SPD_GEN2       0x20
                    202: #define  AHCI_PREG_SSTS_IPM            0xf00 /* Interface Power Management */
                    203: #define  AHCI_PREG_SSTS_IPM_NONE       0x000
                    204: #define  AHCI_PREG_SSTS_IPM_ACTIVE     0x100
                    205: #define  AHCI_PREG_SSTS_IPM_PARTIAL    0x200
                    206: #define  AHCI_PREG_SSTS_IPM_SLUMBER    0x600
                    207: #define AHCI_PREG_SCTL         0x2c /* SATA Control */
                    208: #define  AHCI_PREG_SCTL_DET            0xf /* Device Detection */
                    209: #define  AHCI_PREG_SCTL_DET_NONE       0x0
                    210: #define  AHCI_PREG_SCTL_DET_INIT       0x1
                    211: #define  AHCI_PREG_SCTL_DET_DISABLE    0x4
                    212: #define  AHCI_PREG_SCTL_SPD            0xf0 /* Speed Allowed */
                    213: #define  AHCI_PREG_SCTL_SPD_ANY                0x00
                    214: #define  AHCI_PREG_SCTL_SPD_GEN1       0x10
                    215: #define  AHCI_PREG_SCTL_SPD_GEN2       0x20
                    216: #define  AHCI_PREG_SCTL_IPM            0xf00 /* Interface Power Management */
                    217: #define  AHCI_PREG_SCTL_IPM_NONE       0x000
                    218: #define  AHCI_PREG_SCTL_IPM_NOPARTIAL  0x100
                    219: #define  AHCI_PREG_SCTL_IPM_NOSLUMBER  0x200
                    220: #define  AHCI_PREG_SCTL_IPM_DISABLED   0x300
                    221: #define AHCI_PREG_SERR         0x30 /* SATA Error */
                    222: #define  AHCI_PREG_SERR_ERR(_r)                ((_r) & 0xffff)
                    223: #define  AHCI_PREG_SERR_ERR_I          (1<<0) /* Recovered Data Integrity */
                    224: #define  AHCI_PREG_SERR_ERR_M          (1<<1) /* Recovered Communications */
                    225: #define  AHCI_PREG_SERR_ERR_T          (1<<8) /* Transient Data Integrity */
                    226: #define  AHCI_PREG_SERR_ERR_C          (1<<9) /* Persistent Comm/Data */
                    227: #define  AHCI_PREG_SERR_ERR_P          (1<<10) /* Protocol */
                    228: #define  AHCI_PREG_SERR_ERR_E          (1<<11) /* Internal */
                    229: #define  AHCI_PFMT_SERR_ERR    "\020" "\014E" "\013P" "\012C" "\011T" "\002M" \
                    230:                                    "\001I"
                    231: #define  AHCI_PREG_SERR_DIAG(_r)       (((_r) >> 16) & 0xffff)
                    232: #define  AHCI_PREG_SERR_DIAG_N         (1<<0) /* PhyRdy Change */
                    233: #define  AHCI_PREG_SERR_DIAG_I         (1<<1) /* Phy Internal Error */
                    234: #define  AHCI_PREG_SERR_DIAG_W         (1<<2) /* Comm Wake */
                    235: #define  AHCI_PREG_SERR_DIAG_B         (1<<3) /* 10B to 8B Decode Error */
                    236: #define  AHCI_PREG_SERR_DIAG_D         (1<<4) /* Disparity Error */
                    237: #define  AHCI_PREG_SERR_DIAG_C         (1<<5) /* CRC Error */
                    238: #define  AHCI_PREG_SERR_DIAG_H         (1<<6) /* Handshake Error */
                    239: #define  AHCI_PREG_SERR_DIAG_S         (1<<7) /* Link Sequence Error */
                    240: #define  AHCI_PREG_SERR_DIAG_T         (1<<8) /* Transport State Trans Err */
                    241: #define  AHCI_PREG_SERR_DIAG_F         (1<<9) /* Unknown FIS Type */
                    242: #define  AHCI_PREG_SERR_DIAG_X         (1<<10) /* Exchanged */
                    243: #define  AHCI_PFMT_SERR_DIAG   "\020" "\013X" "\012F" "\011T" "\010S" "\007H" \
                    244:                                    "\006C" "\005D" "\004B" "\003W" "\002I" \
                    245:                                    "\001N"
                    246: #define AHCI_PREG_SACT         0x34 /* SATA Active */
                    247: #define AHCI_PREG_CI           0x38 /* Command Issue */
                    248: #define  AHCI_PREG_CI_ALL_SLOTS        0xffffffff
                    249: #define AHCI_PREG_SNTF         0x3c /* SNotification */
                    250:
                    251: struct ahci_cmd_hdr {
                    252:        u_int16_t               flags;
                    253: #define AHCI_CMD_LIST_FLAG_CFL         0x001f /* Command FIS Length */
                    254: #define AHCI_CMD_LIST_FLAG_A           (1<<5) /* ATAPI */
                    255: #define AHCI_CMD_LIST_FLAG_W           (1<<6) /* Write */
                    256: #define AHCI_CMD_LIST_FLAG_P           (1<<7) /* Prefetchable */
                    257: #define AHCI_CMD_LIST_FLAG_R           (1<<8) /* Reset */
                    258: #define AHCI_CMD_LIST_FLAG_B           (1<<9) /* BIST */
                    259: #define AHCI_CMD_LIST_FLAG_C           (1<<10) /* Clear Busy upon R_OK */
                    260: #define AHCI_CMD_LIST_FLAG_PMP         0xf000 /* Port Multiplier Port */
                    261:        u_int16_t               prdtl; /* sgl len */
                    262:
                    263:        u_int32_t               prdbc; /* transferred byte count */
                    264:
                    265:        u_int32_t               ctba_lo;
                    266:        u_int32_t               ctba_hi;
                    267:
                    268:        u_int32_t               reserved[4];
                    269: } __packed;
                    270:
                    271: struct ahci_rfis {
                    272:        u_int8_t                dsfis[28];
                    273:        u_int8_t                reserved1[4];
                    274:        u_int8_t                psfis[24];
                    275:        u_int8_t                reserved2[8];
                    276:        u_int8_t                rfis[24];
                    277:        u_int8_t                reserved3[4];
                    278:        u_int8_t                sdbfis[4];
                    279:        u_int8_t                ufis[64];
                    280:        u_int8_t                reserved4[96];
                    281: } __packed;
                    282:
                    283: struct ahci_prdt {
                    284:        u_int32_t               dba_lo;
                    285:        u_int32_t               dba_hi;
                    286:        u_int32_t               reserved;
                    287:        u_int32_t               flags;
                    288: #define AHCI_PRDT_FLAG_INTR            (1<<31) /* interrupt on completion */
                    289: } __packed;
                    290:
                    291: /* this makes ahci_cmd_table 512 bytes, supporting 128-byte alignment */
                    292: #define AHCI_MAX_PRDT          24
                    293:
                    294: struct ahci_cmd_table {
                    295:        u_int8_t                cfis[64];       /* Command FIS */
                    296:        u_int8_t                acmd[16];       /* ATAPI Command */
                    297:        u_int8_t                reserved[48];
                    298:
                    299:        struct ahci_prdt        prdt[AHCI_MAX_PRDT];
                    300: } __packed;
                    301:
                    302: #define AHCI_MAX_PORTS         32
                    303:
                    304: struct ahci_dmamem {
                    305:        bus_dmamap_t            adm_map;
                    306:        bus_dma_segment_t       adm_seg;
                    307:        size_t                  adm_size;
                    308:        caddr_t                 adm_kva;
                    309: };
                    310: #define AHCI_DMA_MAP(_adm)     ((_adm)->adm_map)
                    311: #define AHCI_DMA_DVA(_adm)     ((_adm)->adm_map->dm_segs[0].ds_addr)
                    312: #define AHCI_DMA_KVA(_adm)     ((void *)(_adm)->adm_kva)
                    313:
                    314: struct ahci_softc;
                    315: struct ahci_port;
                    316:
                    317: struct ahci_ccb {
                    318:        /* ATA xfer associated with this CCB.  Must be 1st struct member. */
                    319:        struct ata_xfer         ccb_xa;
                    320:
                    321:        int                     ccb_slot;
                    322:        struct ahci_port        *ccb_port;
                    323:
                    324:        bus_dmamap_t            ccb_dmamap;
                    325:        struct ahci_cmd_hdr     *ccb_cmd_hdr;
                    326:        struct ahci_cmd_table   *ccb_cmd_table;
                    327:
                    328:        void                    (*ccb_done)(struct ahci_ccb *);
                    329:
                    330:        TAILQ_ENTRY(ahci_ccb)   ccb_entry;
                    331: };
                    332:
                    333: struct ahci_port {
                    334:        struct ahci_softc       *ap_sc;
                    335:        bus_space_handle_t      ap_ioh;
                    336:
                    337: #ifdef AHCI_COALESCE
                    338:        int                     ap_num;
                    339: #endif
                    340:
                    341:        struct ahci_rfis        *ap_rfis;
                    342:        struct ahci_dmamem      *ap_dmamem_rfis;
                    343:
                    344:        struct ahci_dmamem      *ap_dmamem_cmd_list;
                    345:        struct ahci_dmamem      *ap_dmamem_cmd_table;
                    346:
                    347:        volatile u_int32_t      ap_active;
                    348:        volatile u_int32_t      ap_active_cnt;
                    349:        volatile u_int32_t      ap_sactive;
                    350:        struct ahci_ccb         *ap_ccbs;
                    351:
                    352:        TAILQ_HEAD(, ahci_ccb)  ap_ccb_free;
                    353:        TAILQ_HEAD(, ahci_ccb)  ap_ccb_pending;
                    354:
                    355:        u_int32_t               ap_state;
                    356: #define AP_S_NORMAL                    0
                    357: #define AP_S_FATAL_ERROR               1
                    358:
                    359:        /* For error recovery. */
                    360: #ifdef DIAGNOSTIC
                    361:        int                     ap_err_busy;
                    362: #endif
                    363:        u_int32_t               ap_err_saved_sactive;
                    364:        u_int32_t               ap_err_saved_active;
                    365:        u_int32_t               ap_err_saved_active_cnt;
                    366:
                    367:        u_int8_t                ap_err_scratch[512];
                    368:
                    369: #ifdef AHCI_DEBUG
                    370:        char                    ap_name[16];
                    371: #define PORTNAME(_ap)  ((_ap)->ap_name)
                    372: #else
                    373: #define PORTNAME(_ap)  DEVNAME((_ap)->ap_sc)
                    374: #endif
                    375: };
                    376:
                    377: struct ahci_softc {
                    378:        struct device           sc_dev;
                    379:
                    380:        void                    *sc_ih;
                    381:
                    382:        bus_space_tag_t         sc_iot;
                    383:        bus_space_handle_t      sc_ioh;
                    384:        bus_size_t              sc_ios;
                    385:        bus_dma_tag_t           sc_dmat;
                    386:
                    387:        int                     sc_flags;
                    388: #define AHCI_F_NO_NCQ                  (1<<0)
                    389:
                    390:        u_int                   sc_ncmds;
                    391:
                    392:        struct ahci_port        *sc_ports[AHCI_MAX_PORTS];
                    393:
                    394:        struct atascsi          *sc_atascsi;
                    395:
                    396: #ifdef AHCI_COALESCE
                    397:        u_int32_t               sc_ccc_mask;
                    398:        u_int32_t               sc_ccc_ports;
                    399:        u_int32_t               sc_ccc_ports_cur;
                    400: #endif
                    401: };
                    402: #define DEVNAME(_s)            ((_s)->sc_dev.dv_xname)
                    403:
                    404: struct ahci_device {
                    405:        pci_vendor_id_t         ad_vendor;
                    406:        pci_product_id_t        ad_product;
                    407:        int                     (*ad_match)(struct pci_attach_args *);
                    408:        int                     (*ad_attach)(struct ahci_softc *,
                    409:                                    struct pci_attach_args *);
                    410: };
                    411:
                    412: const struct ahci_device *ahci_lookup_device(struct pci_attach_args *);
                    413:
                    414: int                    ahci_no_match(struct pci_attach_args *);
                    415: int                    ahci_vt8251_attach(struct ahci_softc *,
                    416:                            struct pci_attach_args *);
                    417:
                    418: static const struct ahci_device ahci_devices[] = {
                    419:        { PCI_VENDOR_VIATECH,   PCI_PRODUCT_VIATECH_VT8251_SATA,
                    420:            ahci_no_match,      ahci_vt8251_attach }
                    421: };
                    422:
                    423: int                    ahci_pci_match(struct device *, void *, void *);
                    424: void                   ahci_pci_attach(struct device *, struct device *,
                    425:                            void *);
                    426:
                    427: struct cfattach ahci_pci_ca = {
                    428:        sizeof(struct ahci_softc), ahci_pci_match, ahci_pci_attach
                    429: };
                    430:
                    431: struct cfattach ahci_jmb_ca = {
                    432:        sizeof(struct ahci_softc), ahci_pci_match, ahci_pci_attach
                    433: };
                    434:
                    435: struct cfdriver ahci_cd = {
                    436:        NULL, "ahci", DV_DULL
                    437: };
                    438:
                    439:
                    440: int                    ahci_map_regs(struct ahci_softc *,
                    441:                            struct pci_attach_args *);
                    442: void                   ahci_unmap_regs(struct ahci_softc *,
                    443:                            struct pci_attach_args *);
                    444: int                    ahci_map_intr(struct ahci_softc *,
                    445:                            struct pci_attach_args *, pci_intr_handle_t);
                    446: #ifdef notyet
                    447: void                   ahci_unmap_intr(struct ahci_softc *,
                    448:                            struct pci_attach_args *);
                    449: #endif
                    450:
                    451: int                    ahci_init(struct ahci_softc *);
                    452: int                    ahci_port_alloc(struct ahci_softc *, u_int);
                    453: void                   ahci_port_free(struct ahci_softc *, u_int);
                    454:
                    455: int                    ahci_port_start(struct ahci_port *, int);
                    456: int                    ahci_port_stop(struct ahci_port *, int);
                    457: int                    ahci_port_clo(struct ahci_port *);
                    458: int                    ahci_port_softreset(struct ahci_port *);
                    459: int                    ahci_port_portreset(struct ahci_port *);
                    460:
                    461: int                    ahci_load_prdt(struct ahci_ccb *);
                    462: void                   ahci_unload_prdt(struct ahci_ccb *);
                    463:
                    464: int                    ahci_poll(struct ahci_ccb *, int, void (*)(void *));
                    465: void                   ahci_start(struct ahci_ccb *);
                    466:
                    467: void                   ahci_issue_pending_ncq_commands(struct ahci_port *);
                    468: void                   ahci_issue_pending_commands(struct ahci_port *, int);
                    469:
                    470: int                    ahci_intr(void *);
                    471: u_int32_t              ahci_port_intr(struct ahci_port *, u_int32_t);
                    472:
                    473: struct ahci_ccb                *ahci_get_ccb(struct ahci_port *);
                    474: void                   ahci_put_ccb(struct ahci_ccb *);
                    475:
                    476: struct ahci_ccb                *ahci_get_err_ccb(struct ahci_port *);
                    477: void                   ahci_put_err_ccb(struct ahci_ccb *);
                    478:
                    479: int                    ahci_port_read_ncq_error(struct ahci_port *, int *);
                    480:
                    481: struct ahci_dmamem     *ahci_dmamem_alloc(struct ahci_softc *, size_t);
                    482: void                   ahci_dmamem_free(struct ahci_softc *,
                    483:                            struct ahci_dmamem *);
                    484:
                    485: u_int32_t              ahci_read(struct ahci_softc *, bus_size_t);
                    486: void                   ahci_write(struct ahci_softc *, bus_size_t, u_int32_t);
                    487: int                    ahci_wait_ne(struct ahci_softc *, bus_size_t,
                    488:                            u_int32_t, u_int32_t);
                    489:
                    490: u_int32_t              ahci_pread(struct ahci_port *, bus_size_t);
                    491: void                   ahci_pwrite(struct ahci_port *, bus_size_t, u_int32_t);
                    492: int                    ahci_pwait_eq(struct ahci_port *, bus_size_t,
                    493:                            u_int32_t, u_int32_t);
                    494:
                    495: /* Wait for all bits in _b to be cleared */
                    496: #define ahci_pwait_clr(_ap, _r, _b) ahci_pwait_eq((_ap), (_r), (_b), 0)
                    497:
                    498: /* Wait for all bits in _b to be set */
                    499: #define ahci_pwait_set(_ap, _r, _b) ahci_pwait_eq((_ap), (_r), (_b), (_b))
                    500:
                    501: /* provide methods for atascsi to call */
                    502: int                    ahci_ata_probe(void *, int);
                    503: struct ata_xfer *      ahci_ata_get_xfer(void *, int);
                    504: void                   ahci_ata_put_xfer(struct ata_xfer *);
                    505: int                    ahci_ata_cmd(struct ata_xfer *);
                    506:
                    507: struct atascsi_methods ahci_atascsi_methods = {
                    508:        ahci_ata_probe,
                    509:        ahci_ata_get_xfer,
                    510:        ahci_ata_cmd
                    511: };
                    512:
                    513: /* ccb completions */
                    514: void                   ahci_ata_cmd_done(struct ahci_ccb *);
                    515: void                   ahci_ata_cmd_timeout(void *);
                    516: void                   ahci_empty_done(struct ahci_ccb *);
                    517:
                    518: const struct ahci_device *
                    519: ahci_lookup_device(struct pci_attach_args *pa)
                    520: {
                    521:        int                             i;
                    522:        const struct ahci_device        *ad;
                    523:
                    524:        for (i = 0; i < (sizeof(ahci_devices) / sizeof(ahci_devices[0])); i++) {
                    525:                ad = &ahci_devices[i];
                    526:                if (ad->ad_vendor == PCI_VENDOR(pa->pa_id) &&
                    527:                    ad->ad_product == PCI_PRODUCT(pa->pa_id))
                    528:                        return (ad);
                    529:        }
                    530:
                    531:        return (NULL);
                    532: }
                    533:
                    534: int
                    535: ahci_no_match(struct pci_attach_args *pa)
                    536: {
                    537:        return (0);
                    538: }
                    539:
                    540: int
                    541: ahci_vt8251_attach(struct ahci_softc *sc, struct pci_attach_args *pa)
                    542: {
                    543:        sc->sc_flags |= AHCI_F_NO_NCQ;
                    544:
                    545:        return (0);
                    546: }
                    547:
                    548: int
                    549: ahci_pci_match(struct device *parent, void *match, void *aux)
                    550: {
                    551:        struct pci_attach_args          *pa = aux;
                    552:        const struct ahci_device        *ad;
                    553:
                    554:        ad = ahci_lookup_device(pa);
                    555:        if (ad != NULL) {
                    556:                /* the device may need special checks to see if it matches */
                    557:                if (ad->ad_match != NULL)
                    558:                        return (ad->ad_match(pa));
                    559:
                    560:                return (2); /* match higher than pciide */
                    561:        }
                    562:
                    563:        if (PCI_CLASS(pa->pa_class) == PCI_CLASS_MASS_STORAGE &&
                    564:            PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_SATA &&
                    565:            PCI_INTERFACE(pa->pa_class) == AHCI_PCI_INTERFACE)
                    566:                return (2);
                    567:
                    568:        return (0);
                    569: }
                    570:
                    571: void
                    572: ahci_pci_attach(struct device *parent, struct device *self, void *aux)
                    573: {
                    574:        struct ahci_softc               *sc = (struct ahci_softc *)self;
                    575:        struct pci_attach_args          *pa = aux;
                    576:        struct atascsi_attach_args      aaa;
                    577:        const struct ahci_device        *ad;
                    578:        pci_intr_handle_t               ih;
                    579:        u_int32_t                       cap, pi;
                    580:        int                             i;
                    581:
                    582:        ad = ahci_lookup_device(pa);
                    583:        if (ad != NULL && ad->ad_attach != NULL) {
                    584:                if (ad->ad_attach(sc, pa) != 0) {
                    585:                        /* error should be printed by ad_attach */
                    586:                        return;
                    587:                }
                    588:        }
                    589:
                    590:        if (pci_intr_map(pa, &ih) != 0) {
                    591:                printf(": unable to map interrupt\n");
                    592:                return;
                    593:        }
                    594:        printf(": %s,", pci_intr_string(pa->pa_pc, ih));
                    595:
                    596:        if (ahci_map_regs(sc, pa) != 0) {
                    597:                /* error already printed by ahci_map_regs */
                    598:                return;
                    599:        }
                    600:
                    601:        if (ahci_init(sc) != 0) {
                    602:                /* error already printed by ahci_init */
                    603:                goto unmap;
                    604:        }
                    605:
                    606:        if (ahci_map_intr(sc, pa, ih) != 0) {
                    607:                /* error already printed by ahci_map_intr */
                    608:                goto unmap;
                    609:        }
                    610:
                    611:        printf("\n");
                    612:
                    613:        sc->sc_dmat = pa->pa_dmat;
                    614:
                    615:        cap = ahci_read(sc, AHCI_REG_CAP);
                    616:        sc->sc_ncmds = AHCI_REG_CAP_NCS(cap);
                    617: #ifdef AHCI_DEBUG
                    618:        if (ahcidebug & AHCI_D_VERBOSE) {
                    619:                const char *gen;
                    620:
                    621:                switch (cap & AHCI_REG_CAP_ISS) {
                    622:                case AHCI_REG_CAP_ISS_G1:
                    623:                        gen = "1 (1.5Gbps)";
                    624:                        break;
                    625:                case AHCI_REG_CAP_ISS_G1_2:
                    626:                        gen = "1 (1.5Gbps) and 2 (3Gbps)";
                    627:                        break;
                    628:                default:
                    629:                        gen = "unknown";
                    630:                        break;
                    631:                }
                    632:
                    633:                printf("%s: capabilities 0x%b, %d ports, %d cmds, gen %s\n",
                    634:                    DEVNAME(sc), cap, AHCI_FMT_CAP,
                    635:                    AHCI_REG_CAP_NP(cap), sc->sc_ncmds, gen);
                    636:        }
                    637: #endif
                    638:
                    639:        pi = ahci_read(sc, AHCI_REG_PI);
                    640:        DPRINTF(AHCI_D_VERBOSE, "%s: ports implemented: 0x%08x\n",
                    641:            DEVNAME(sc), pi);
                    642:
                    643: #ifdef AHCI_COALESCE
                    644:        /* Naive coalescing support - enable for all ports. */
                    645:        if (cap & AHCI_REG_CAP_CCCS) {
                    646:                u_int16_t               ccc_timeout = 20;
                    647:                u_int8_t                ccc_numcomplete = 12;
                    648:                u_int32_t               ccc_ctl;
                    649:
                    650:                /* disable coalescing during reconfiguration. */
                    651:                ccc_ctl = ahci_read(sc, AHCI_REG_CCC_CTL);
                    652:                ccc_ctl &= ~0x00000001;
                    653:                ahci_write(sc, AHCI_REG_CCC_CTL, ccc_ctl);
                    654:
                    655:                sc->sc_ccc_mask = 1 << AHCI_REG_CCC_CTL_INT(ccc_ctl);
                    656:                if (pi & sc->sc_ccc_mask) {
                    657:                        /* A conflict with the implemented port list? */
                    658:                        printf("%s: coalescing interrupt/implemented port list "
                    659:                            "conflict, PI: %08x, ccc_mask: %08x\n",
                    660:                            DEVNAME(sc), pi, sc->sc_ccc_mask);
                    661:                        sc->sc_ccc_mask = 0;
                    662:                        goto noccc;
                    663:                }
                    664:
                    665:                /* ahci_port_start will enable each port when it starts. */
                    666:                sc->sc_ccc_ports = pi;
                    667:                sc->sc_ccc_ports_cur = 0;
                    668:
                    669:                /* program thresholds and enable overall coalescing. */
                    670:                ccc_ctl &= ~0xffffff00;
                    671:                ccc_ctl |= (ccc_timeout << 16) | (ccc_numcomplete << 8);
                    672:                ahci_write(sc, AHCI_REG_CCC_CTL, ccc_ctl);
                    673:                ahci_write(sc, AHCI_REG_CCC_PORTS, 0);
                    674:                ahci_write(sc, AHCI_REG_CCC_CTL, ccc_ctl | 1);
                    675:        }
                    676: noccc:
                    677: #endif
                    678:        for (i = 0; i < AHCI_MAX_PORTS; i++) {
                    679:                if (!ISSET(pi, 1 << i)) {
                    680:                        /* dont allocate stuff if the port isnt implemented */
                    681:                        continue;
                    682:                }
                    683:
                    684:                if (ahci_port_alloc(sc, i) == ENOMEM)
                    685:                        goto freeports;
                    686:        }
                    687:
                    688:        bzero(&aaa, sizeof(aaa));
                    689:        aaa.aaa_cookie = sc;
                    690:        aaa.aaa_methods = &ahci_atascsi_methods;
                    691:        aaa.aaa_minphys = minphys;
                    692:        aaa.aaa_nports = AHCI_MAX_PORTS;
                    693:        aaa.aaa_ncmds = sc->sc_ncmds;
                    694:        aaa.aaa_capability = ASAA_CAP_NEEDS_RESERVED;
                    695:        if (!(sc->sc_flags & AHCI_F_NO_NCQ) && (cap & AHCI_REG_CAP_SNCQ))
                    696:                aaa.aaa_capability |= ASAA_CAP_NCQ;
                    697:
                    698:        sc->sc_atascsi = atascsi_attach(&sc->sc_dev, &aaa);
                    699:
                    700:        /* Enable interrupts */
                    701:        ahci_write(sc, AHCI_REG_GHC, AHCI_REG_GHC_AE | AHCI_REG_GHC_IE);
                    702:
                    703:        return;
                    704:
                    705: freeports:
                    706:        for (i = 0; i < AHCI_MAX_PORTS; i++)
                    707:                if (sc->sc_ports[i] != NULL)
                    708:                        ahci_port_free(sc, i);
                    709: unmap:
                    710:        /* Disable controller */
                    711:        ahci_write(sc, AHCI_REG_GHC, 0);
                    712:        ahci_unmap_regs(sc, pa);
                    713:        return;
                    714: }
                    715:
                    716: int
                    717: ahci_map_regs(struct ahci_softc *sc, struct pci_attach_args *pa)
                    718: {
                    719:        pcireg_t                        maptype;
                    720:
                    721:        maptype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, AHCI_PCI_BAR);
                    722:        if (pci_mapreg_map(pa, AHCI_PCI_BAR, maptype, 0, &sc->sc_iot,
                    723:            &sc->sc_ioh, NULL, &sc->sc_ios, 0) != 0) {
                    724:                printf(" unable to map registers\n");
                    725:                return (1);
                    726:        }
                    727:
                    728:        return (0);
                    729: }
                    730:
                    731: void
                    732: ahci_unmap_regs(struct ahci_softc *sc, struct pci_attach_args *pa)
                    733: {
                    734:        bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios);
                    735:        sc->sc_ios = 0;
                    736: }
                    737:
                    738: int
                    739: ahci_map_intr(struct ahci_softc *sc, struct pci_attach_args *pa,
                    740:     pci_intr_handle_t ih)
                    741: {
                    742:        sc->sc_ih = pci_intr_establish(pa->pa_pc, ih, IPL_BIO,
                    743:            ahci_intr, sc, DEVNAME(sc));
                    744:        if (sc->sc_ih == NULL) {
                    745:                printf("%s: unable to map interrupt\n", DEVNAME(sc));
                    746:                return (1);
                    747:        }
                    748:
                    749:        return (0);
                    750: }
                    751:
                    752: #ifdef notyet
                    753: /* one day we'll have hotplug pci */
                    754: void
                    755: ahci_unmap_intr(struct ahci_softc *sc, struct pci_attach_args *pa)
                    756: {
                    757:        pci_intr_disestablish(pa->pa_pc, sc->sc_ih);
                    758: }
                    759: #endif
                    760:
                    761: int
                    762: ahci_init(struct ahci_softc *sc)
                    763: {
                    764:        u_int32_t                       reg, cap, pi;
                    765:        const char                      *revision;
                    766:
                    767:        DPRINTF(AHCI_D_VERBOSE, " GHC 0x%b", ahci_read(sc, AHCI_REG_GHC),
                    768:            AHCI_FMT_GHC);
                    769:
                    770:        /* save BIOS initialised parameters, enable staggered spin up */
                    771:        cap = ahci_read(sc, AHCI_REG_CAP);
                    772:        cap &= AHCI_REG_CAP_SMPS;
                    773:        cap |= AHCI_REG_CAP_SSS;
                    774:        pi = ahci_read(sc, AHCI_REG_PI);
                    775:
                    776:        if (ISSET(AHCI_REG_GHC_AE, ahci_read(sc, AHCI_REG_GHC))) {
                    777:                /* reset the controller */
                    778:                ahci_write(sc, AHCI_REG_GHC, AHCI_REG_GHC_HR);
                    779:                if (ahci_wait_ne(sc, AHCI_REG_GHC, AHCI_REG_GHC_HR,
                    780:                    AHCI_REG_GHC_HR) != 0) {
                    781:                        printf(" unable to reset controller\n");
                    782:                        return (1);
                    783:                }
                    784:        }
                    785:
                    786:        /* enable ahci (global interrupts disabled) */
                    787:        ahci_write(sc, AHCI_REG_GHC, AHCI_REG_GHC_AE);
                    788:
                    789:        /* restore parameters */
                    790:        ahci_write(sc, AHCI_REG_CAP, cap);
                    791:        ahci_write(sc, AHCI_REG_PI, pi);
                    792:
                    793:        /* check the revision */
                    794:        reg = ahci_read(sc, AHCI_REG_VS);
                    795:        switch (reg) {
                    796:        case AHCI_REG_VS_0_95:
                    797:                revision = "0.95";
                    798:                break;
                    799:        case AHCI_REG_VS_1_0:
                    800:                revision = "1.0";
                    801:                break;
                    802:        case AHCI_REG_VS_1_1:
                    803:                revision = "1.1";
                    804:                break;
                    805:
                    806:        default:
                    807:                printf(" unsupported AHCI revision 0x%08x\n", reg);
                    808:                return (1);
                    809:        }
                    810:
                    811:        printf(" AHCI %s", revision);
                    812:
                    813:        return (0);
                    814: }
                    815:
                    816: int
                    817: ahci_port_alloc(struct ahci_softc *sc, u_int port)
                    818: {
                    819:        struct ahci_port                *ap;
                    820:        struct ahci_ccb                 *ccb;
                    821:        u_int64_t                       dva;
                    822:        u_int32_t                       cmd;
                    823:        struct ahci_cmd_hdr             *hdr;
                    824:        struct ahci_cmd_table           *table;
                    825:        int                             i, rc = ENOMEM;
                    826:
                    827:        ap = malloc(sizeof(struct ahci_port), M_DEVBUF, M_NOWAIT);
                    828:        if (ap == NULL) {
                    829:                printf("%s: unable to allocate memory for port %d\n",
                    830:                    DEVNAME(sc), port);
                    831:                goto reterr;
                    832:        }
                    833:        bzero(ap, sizeof(struct ahci_port));
                    834:
                    835: #ifdef AHCI_DEBUG
                    836:        snprintf(ap->ap_name, sizeof(ap->ap_name), "%s.%d",
                    837:            DEVNAME(sc), port);
                    838: #endif
                    839:        sc->sc_ports[port] = ap;
                    840:
                    841:        if (bus_space_subregion(sc->sc_iot, sc->sc_ioh,
                    842:            AHCI_PORT_REGION(port), AHCI_PORT_SIZE, &ap->ap_ioh) != 0) {
                    843:                printf("%s: unable to create register window for port %d\n",
                    844:                    DEVNAME(sc), port);
                    845:                goto freeport;
                    846:        }
                    847:
                    848:        ap->ap_sc = sc;
                    849: #ifdef AHCI_COALESCE
                    850:        ap->ap_num = port;
                    851: #endif
                    852:        TAILQ_INIT(&ap->ap_ccb_free);
                    853:        TAILQ_INIT(&ap->ap_ccb_pending);
                    854:
                    855:        /* Disable port interrupts */
                    856:        ahci_pwrite(ap, AHCI_PREG_IE, 0);
                    857:
                    858:        /* Sec 10.1.2 - deinitialise port if it is already running */
                    859:        cmd = ahci_pread(ap, AHCI_PREG_CMD);
                    860:        if (ISSET(cmd, (AHCI_PREG_CMD_ST | AHCI_PREG_CMD_CR |
                    861:            AHCI_PREG_CMD_FRE | AHCI_PREG_CMD_FR)) ||
                    862:            ISSET(ahci_pread(ap, AHCI_PREG_SCTL), AHCI_PREG_SCTL_DET)) {
                    863:                int r;
                    864:
                    865:                r = ahci_port_stop(ap, 1);
                    866:                if (r) {
                    867:                        printf("%s: unable to disable %s, ignoring port %d\n",
                    868:                            DEVNAME(sc), r == 2 ? "CR" : "FR", port);
                    869:                        rc = ENXIO;
                    870:                        goto freeport;
                    871:                }
                    872:
                    873:                /* Write DET to zero */
                    874:                ahci_pwrite(ap, AHCI_PREG_SCTL, 0);
                    875:        }
                    876:
                    877:        /* Allocate RFIS */
                    878:        ap->ap_dmamem_rfis = ahci_dmamem_alloc(sc, sizeof(struct ahci_rfis));
                    879:        if (ap->ap_dmamem_rfis == NULL)
                    880:                goto nomem;
                    881:
                    882:        /* Setup RFIS base address */
                    883:        ap->ap_rfis = (struct ahci_rfis *) AHCI_DMA_KVA(ap->ap_dmamem_rfis);
                    884:        dva = AHCI_DMA_DVA(ap->ap_dmamem_rfis);
                    885:        ahci_pwrite(ap, AHCI_PREG_FBU, (u_int32_t)(dva >> 32));
                    886:        ahci_pwrite(ap, AHCI_PREG_FB, (u_int32_t)dva);
                    887:
                    888:        /* Enable FIS reception and activate port. */
                    889:        cmd = ahci_pread(ap, AHCI_PREG_CMD) & ~AHCI_PREG_CMD_ICC;
                    890:        cmd |= AHCI_PREG_CMD_FRE | AHCI_PREG_CMD_POD | AHCI_PREG_CMD_SUD;
                    891:        ahci_pwrite(ap, AHCI_PREG_CMD, cmd | AHCI_PREG_CMD_ICC_ACTIVE);
                    892:
                    893:        /* Check whether port activated.  Skip it if not. */
                    894:        cmd = ahci_pread(ap, AHCI_PREG_CMD) & ~AHCI_PREG_CMD_ICC;
                    895:        if (!ISSET(cmd, AHCI_PREG_CMD_FRE)) {
                    896:                rc = ENXIO;
                    897:                goto freeport;
                    898:        }
                    899:
                    900:        /* Allocate a CCB for each command slot */
                    901:        ap->ap_ccbs = malloc(sizeof(struct ahci_ccb) * sc->sc_ncmds, M_DEVBUF,
                    902:            M_NOWAIT);
                    903:        if (ap->ap_ccbs == NULL) {
                    904:                printf("%s: unable to allocate command list for port %d\n",
                    905:                    DEVNAME(sc), port);
                    906:                goto freeport;
                    907:        }
                    908:        bzero(ap->ap_ccbs, sizeof(struct ahci_ccb) * sc->sc_ncmds);
                    909:
                    910:        /* Command List Structures and Command Tables */
                    911:        ap->ap_dmamem_cmd_list = ahci_dmamem_alloc(sc,
                    912:            sc->sc_ncmds * sizeof(struct ahci_cmd_hdr));
                    913:        ap->ap_dmamem_cmd_table = ahci_dmamem_alloc(sc,
                    914:            sc->sc_ncmds * sizeof(struct ahci_cmd_table));
                    915:        if (ap->ap_dmamem_cmd_table == NULL || ap->ap_dmamem_cmd_list == NULL) {
                    916: nomem:
                    917:                printf("%s: unable to allocate DMA memory for port %d\n",
                    918:                    DEVNAME(sc), port);
                    919:                goto freeport;
                    920:        }
                    921:
                    922:        /* Setup command list base address */
                    923:        dva = AHCI_DMA_DVA(ap->ap_dmamem_cmd_list);
                    924:        ahci_pwrite(ap, AHCI_PREG_CLBU, (u_int32_t)(dva >> 32));
                    925:        ahci_pwrite(ap, AHCI_PREG_CLB, (u_int32_t)dva);
                    926:
                    927:        /* Split CCB allocation into CCBs and assign to command header/table */
                    928:        hdr = AHCI_DMA_KVA(ap->ap_dmamem_cmd_list);
                    929:        table = AHCI_DMA_KVA(ap->ap_dmamem_cmd_table);
                    930:        for (i = 0; i < sc->sc_ncmds; i++) {
                    931:                ccb = &ap->ap_ccbs[i];
                    932:
                    933:                if (bus_dmamap_create(sc->sc_dmat, MAXPHYS, AHCI_MAX_PRDT,
                    934:                    (4 * 1024 * 1024), 0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW,
                    935:                    &ccb->ccb_dmamap) != 0) {
                    936:                        printf("%s: unable to create dmamap for port %d "
                    937:                            "ccb %d\n", DEVNAME(sc), port, i);
                    938:                        goto freeport;
                    939:                }
                    940:
                    941:                ccb->ccb_slot = i;
                    942:                ccb->ccb_port = ap;
                    943:                ccb->ccb_cmd_hdr = &hdr[i];
                    944:                ccb->ccb_cmd_table = &table[i];
                    945:                dva = AHCI_DMA_DVA(ap->ap_dmamem_cmd_table) +
                    946:                    ccb->ccb_slot * sizeof(struct ahci_cmd_table);
                    947:                ccb->ccb_cmd_hdr->ctba_hi = htole32((u_int32_t)(dva >> 32));
                    948:                ccb->ccb_cmd_hdr->ctba_lo = htole32((u_int32_t)dva);
                    949:
                    950:                ccb->ccb_xa.fis =
                    951:                    (struct ata_fis_h2d *)ccb->ccb_cmd_table->cfis;
                    952:                ccb->ccb_xa.packetcmd = ccb->ccb_cmd_table->acmd;
                    953:                ccb->ccb_xa.tag = i;
                    954:
                    955:                ccb->ccb_xa.ata_put_xfer = ahci_ata_put_xfer;
                    956:
                    957:                ccb->ccb_xa.state = ATA_S_COMPLETE;
                    958:                ahci_put_ccb(ccb);
                    959:        }
                    960:
                    961:        /* Wait for ICC change to complete */
                    962:        ahci_pwait_clr(ap, AHCI_PREG_CMD, AHCI_PREG_CMD_ICC);
                    963:
                    964:        /* Reset port */
                    965:        rc = ahci_port_portreset(ap);
                    966:        switch (rc) {
                    967:        case ENODEV:
                    968:                switch (ahci_pread(ap, AHCI_PREG_SSTS) & AHCI_PREG_SSTS_DET) {
                    969:                case AHCI_PREG_SSTS_DET_DEV_NE:
                    970:                        printf("%s: device not communicating on port %d\n",
                    971:                            DEVNAME(sc), port);
                    972:                        break;
                    973:                case AHCI_PREG_SSTS_DET_PHYOFFLINE:
                    974:                        printf("%s: PHY offline on port %d\n", DEVNAME(sc),
                    975:                            port);
                    976:                        break;
                    977:                default:
                    978:                        DPRINTF(AHCI_D_VERBOSE, "%s: no device detected "
                    979:                            "on port %d\n", DEVNAME(sc), port);
                    980:                        break;
                    981:                }
                    982:                goto freeport;
                    983:
                    984:        case EBUSY:
                    985:                printf("%s: device on port %d didn't come ready, "
                    986:                    "TFD: 0x%b\n", DEVNAME(sc), port,
                    987:                    ahci_pread(ap, AHCI_PREG_TFD), AHCI_PFMT_TFD_STS);
                    988:
                    989:                /* Try a soft reset to clear busy */
                    990:                rc = ahci_port_softreset(ap);
                    991:                if (rc) {
                    992:                        printf("%s: unable to communicate "
                    993:                            "with device on port %d\n", DEVNAME(sc), port);
                    994:                        goto freeport;
                    995:                }
                    996:                break;
                    997:
                    998:        default:
                    999:                break;
                   1000:        }
                   1001:        DPRINTF(AHCI_D_VERBOSE, "%s: detected device on port %d\n",
                   1002:            DEVNAME(sc), port);
                   1003:
                   1004:        /* Enable command transfers on port */
                   1005:        if (ahci_port_start(ap, 0)) {
                   1006:                printf("%s: failed to start command DMA on port %d, "
                   1007:                    "disabling\n", DEVNAME(sc), port);
                   1008:                rc = ENXIO;     /* couldn't start port */
                   1009:        }
                   1010:
                   1011:        /* Flush interrupts for port */
                   1012:        ahci_pwrite(ap, AHCI_PREG_IS, ahci_pread(ap, AHCI_PREG_IS));
                   1013:        ahci_write(sc, AHCI_REG_IS, 1 << port);
                   1014:
                   1015:        /* Enable port interrupts */
                   1016:        ahci_pwrite(ap, AHCI_PREG_IE, AHCI_PREG_IE_TFEE | AHCI_PREG_IE_HBFE |
                   1017:            AHCI_PREG_IE_IFE | AHCI_PREG_IE_OFE | AHCI_PREG_IE_DPE |
                   1018:            AHCI_PREG_IE_UFE |
                   1019: #ifdef AHCI_COALESCE
                   1020:            ((sc->sc_ccc_ports & (1 << port)) ? 0 : (AHCI_PREG_IE_SDBE |
                   1021:            AHCI_PREG_IE_DHRE))
                   1022: #else
                   1023:            AHCI_PREG_IE_SDBE | AHCI_PREG_IE_DHRE
                   1024: #endif
                   1025:            );
                   1026:
                   1027: freeport:
                   1028:        if (rc != 0)
                   1029:                ahci_port_free(sc, port);
                   1030: reterr:
                   1031:        return (rc);
                   1032: }
                   1033:
                   1034: void
                   1035: ahci_port_free(struct ahci_softc *sc, u_int port)
                   1036: {
                   1037:        struct ahci_port                *ap = sc->sc_ports[port];
                   1038:        struct ahci_ccb                 *ccb;
                   1039:
                   1040:        /* Ensure port is disabled and its interrupts are flushed */
                   1041:        if (ap->ap_sc) {
                   1042:                ahci_pwrite(ap, AHCI_PREG_CMD, 0);
                   1043:                ahci_pwrite(ap, AHCI_PREG_IE, 0);
                   1044:                ahci_pwrite(ap, AHCI_PREG_IS, ahci_pread(ap, AHCI_PREG_IS));
                   1045:                ahci_write(sc, AHCI_REG_IS, 1 << port);
                   1046:        }
                   1047:
                   1048:        if (ap->ap_ccbs) {
                   1049:                while ((ccb = ahci_get_ccb(ap)) != NULL)
                   1050:                        bus_dmamap_destroy(sc->sc_dmat, ccb->ccb_dmamap);
                   1051:                free(ap->ap_ccbs, M_DEVBUF);
                   1052:        }
                   1053:
                   1054:        if (ap->ap_dmamem_cmd_list)
                   1055:                ahci_dmamem_free(sc, ap->ap_dmamem_cmd_list);
                   1056:        if (ap->ap_dmamem_rfis)
                   1057:                ahci_dmamem_free(sc, ap->ap_dmamem_rfis);
                   1058:        if (ap->ap_dmamem_cmd_table)
                   1059:                ahci_dmamem_free(sc, ap->ap_dmamem_cmd_table);
                   1060:
                   1061:        /* bus_space(9) says we dont free the subregions handle */
                   1062:
                   1063:        free(ap, M_DEVBUF);
                   1064:        sc->sc_ports[port] = NULL;
                   1065: }
                   1066:
                   1067: int
                   1068: ahci_port_start(struct ahci_port *ap, int fre_only)
                   1069: {
                   1070:        u_int32_t                       r;
                   1071:
                   1072:        /* Turn on FRE (and ST) */
                   1073:        r = ahci_pread(ap, AHCI_PREG_CMD) & ~AHCI_PREG_CMD_ICC;
                   1074:        r |= AHCI_PREG_CMD_FRE;
                   1075:        if (!fre_only)
                   1076:                r |= AHCI_PREG_CMD_ST;
                   1077:        ahci_pwrite(ap, AHCI_PREG_CMD, r);
                   1078:
                   1079: #ifdef AHCI_COALESCE
                   1080:        /* (Re-)enable coalescing on the port. */
                   1081:        if (ap->ap_sc->sc_ccc_ports & (1 << ap->ap_num)) {
                   1082:                ap->ap_sc->sc_ccc_ports_cur |= (1 << ap->ap_num);
                   1083:                ahci_write(ap->ap_sc, AHCI_REG_CCC_PORTS,
                   1084:                    ap->ap_sc->sc_ccc_ports_cur);
                   1085:        }
                   1086: #endif
                   1087:
                   1088:        /* Wait for FR to come on */
                   1089:        if (ahci_pwait_set(ap, AHCI_PREG_CMD, AHCI_PREG_CMD_FR))
                   1090:                return (2);
                   1091:
                   1092:        /* Wait for CR to come on */
                   1093:        if (!fre_only && ahci_pwait_set(ap, AHCI_PREG_CMD, AHCI_PREG_CMD_CR))
                   1094:                return (1);
                   1095:
                   1096:        return (0);
                   1097: }
                   1098:
                   1099: int
                   1100: ahci_port_stop(struct ahci_port *ap, int stop_fis_rx)
                   1101: {
                   1102:        u_int32_t                       r;
                   1103:
                   1104: #ifdef AHCI_COALESCE
                   1105:        /* Disable coalescing on the port while it is stopped. */
                   1106:        if (ap->ap_sc->sc_ccc_ports & (1 << ap->ap_num)) {
                   1107:                ap->ap_sc->sc_ccc_ports_cur &= ~(1 << ap->ap_num);
                   1108:                ahci_write(ap->ap_sc, AHCI_REG_CCC_PORTS,
                   1109:                    ap->ap_sc->sc_ccc_ports_cur);
                   1110:        }
                   1111: #endif
                   1112:
                   1113:        /* Turn off ST (and FRE) */
                   1114:        r = ahci_pread(ap, AHCI_PREG_CMD) & ~AHCI_PREG_CMD_ICC;
                   1115:        r &= ~AHCI_PREG_CMD_ST;
                   1116:        if (stop_fis_rx)
                   1117:                r &= ~AHCI_PREG_CMD_FRE;
                   1118:        ahci_pwrite(ap, AHCI_PREG_CMD, r);
                   1119:
                   1120:        /* Wait for CR to go off */
                   1121:        if (ahci_pwait_clr(ap, AHCI_PREG_CMD, AHCI_PREG_CMD_CR))
                   1122:                return (1);
                   1123:
                   1124:        /* Wait for FR to go off */
                   1125:        if (stop_fis_rx && ahci_pwait_clr(ap, AHCI_PREG_CMD, AHCI_PREG_CMD_FR))
                   1126:                return (2);
                   1127:
                   1128:        return (0);
                   1129: }
                   1130:
                   1131: /* AHCI command list override -> forcibly clear TFD.STS.{BSY,DRQ} */
                   1132: int
                   1133: ahci_port_clo(struct ahci_port *ap)
                   1134: {
                   1135:        struct ahci_softc               *sc = ap->ap_sc;
                   1136:        u_int32_t                       cmd;
                   1137:
                   1138:        /* Only attempt CLO if supported by controller */
                   1139:        if (!ISSET(ahci_read(sc, AHCI_REG_CAP), AHCI_REG_CAP_SCLO))
                   1140:                return (1);
                   1141:
                   1142:        /* Issue CLO */
                   1143:        cmd = ahci_pread(ap, AHCI_PREG_CMD) & ~AHCI_PREG_CMD_ICC;
                   1144: #ifdef DIAGNOSTIC
                   1145:        if (ISSET(cmd, AHCI_PREG_CMD_ST))
                   1146:                printf("%s: CLO requested while port running\n", PORTNAME(ap));
                   1147: #endif
                   1148:        ahci_pwrite(ap, AHCI_PREG_CMD, cmd | AHCI_PREG_CMD_CLO);
                   1149:
                   1150:        /* Wait for completion */
                   1151:        if (ahci_pwait_clr(ap, AHCI_PREG_CMD, AHCI_PREG_CMD_CLO)) {
                   1152:                printf("%s: CLO did not complete\n", PORTNAME(ap));
                   1153:                return (1);
                   1154:        }
                   1155:
                   1156:        return (0);
                   1157: }
                   1158:
                   1159: /* AHCI soft reset, Section 10.4.1 */
                   1160: int
                   1161: ahci_port_softreset(struct ahci_port *ap)
                   1162: {
                   1163:        struct ahci_ccb                 *ccb = NULL;
                   1164:        struct ahci_cmd_hdr             *cmd_slot;
                   1165:        u_int8_t                        *fis;
                   1166:        int                             s, rc = EIO;
                   1167:        u_int32_t                       cmd;
                   1168:
                   1169:        DPRINTF(AHCI_D_VERBOSE, "%s: soft reset\n", PORTNAME(ap));
                   1170:
                   1171:        s = splbio();
                   1172:
                   1173:        /* Save previous command register state */
                   1174:        cmd = ahci_pread(ap, AHCI_PREG_CMD) & ~AHCI_PREG_CMD_ICC;
                   1175:
                   1176:        /* Idle port */
                   1177:        if (ahci_port_stop(ap, 0)) {
                   1178:                printf("%s: failed to stop port, cannot softreset\n",
                   1179:                    PORTNAME(ap));
                   1180:                goto err;
                   1181:        }
                   1182:
                   1183:        /* Request CLO if device appears hung */
                   1184:        if (ISSET(ahci_pread(ap, AHCI_PREG_TFD), AHCI_PREG_TFD_STS_BSY |
                   1185:            AHCI_PREG_TFD_STS_DRQ))
                   1186:                ahci_port_clo(ap);
                   1187:
                   1188:        /* Clear port errors to permit TFD transfer */
                   1189:        ahci_pwrite(ap, AHCI_PREG_SERR, ahci_pread(ap, AHCI_PREG_SERR));
                   1190:
                   1191:        /* Restart port */
                   1192:        if (ahci_port_start(ap, 0)) {
                   1193:                printf("%s: failed to start port, cannot softreset\n",
                   1194:                    PORTNAME(ap));
                   1195:                goto err;
                   1196:        }
                   1197:
                   1198:        /* Check whether CLO worked */
                   1199:        if (ahci_pwait_clr(ap, AHCI_PREG_TFD,
                   1200:            AHCI_PREG_TFD_STS_BSY | AHCI_PREG_TFD_STS_DRQ)) {
                   1201:                printf("%s: CLO %s, need port reset\n", PORTNAME(ap),
                   1202:                    ISSET(ahci_read(ap->ap_sc, AHCI_REG_CAP), AHCI_REG_CAP_SCLO)
                   1203:                    ? "failed" : "unsupported");
                   1204:                rc = EBUSY;
                   1205:                goto err;
                   1206:        }
                   1207:
                   1208:        /* Prep first D2H command with SRST feature & clear busy/reset flags */
                   1209:        ccb = ahci_get_err_ccb(ap);
                   1210:        cmd_slot = ccb->ccb_cmd_hdr;
                   1211:        bzero(ccb->ccb_cmd_table, sizeof(struct ahci_cmd_table));
                   1212:
                   1213:        fis = ccb->ccb_cmd_table->cfis;
                   1214:        fis[0] = 0x27;  /* Host to device */
                   1215:        fis[15] = 0x04; /* SRST DEVCTL */
                   1216:
                   1217:        cmd_slot->prdtl = 0;
                   1218:        cmd_slot->flags = htole16(5);   /* FIS length: 5 DWORDS */
                   1219:        cmd_slot->flags |= htole16(AHCI_CMD_LIST_FLAG_C); /* Clear busy on OK */
                   1220:        cmd_slot->flags |= htole16(AHCI_CMD_LIST_FLAG_R); /* Reset */
                   1221:        cmd_slot->flags |= htole16(AHCI_CMD_LIST_FLAG_W); /* Write */
                   1222:
                   1223:        ccb->ccb_xa.state = ATA_S_PENDING;
                   1224:        if (ahci_poll(ccb, 1000, NULL) != 0)
                   1225:                goto err;
                   1226:
                   1227:        /* Prep second D2H command to read status and complete reset sequence */
                   1228:        fis[0] = 0x27;  /* Host to device */
                   1229:        fis[15] = 0;
                   1230:
                   1231:        cmd_slot->prdtl = 0;
                   1232:        cmd_slot->flags = htole16(5);   /* FIS length: 5 DWORDS */
                   1233:        cmd_slot->flags |= htole16(AHCI_CMD_LIST_FLAG_W);
                   1234:
                   1235:        ccb->ccb_xa.state = ATA_S_PENDING;
                   1236:        if (ahci_poll(ccb, 1000, NULL) != 0)
                   1237:                goto err;
                   1238:
                   1239:        if (ahci_pwait_clr(ap, AHCI_PREG_TFD, AHCI_PREG_TFD_STS_BSY |
                   1240:            AHCI_PREG_TFD_STS_DRQ | AHCI_PREG_TFD_STS_ERR)) {
                   1241:                printf("%s: device didn't come ready after reset, TFD: 0x%b\n",
                   1242:                    PORTNAME(ap), ahci_pread(ap, AHCI_PREG_TFD),
                   1243:                    AHCI_PFMT_TFD_STS);
                   1244:                rc = EBUSY;
                   1245:                goto err;
                   1246:        }
                   1247:
                   1248:        rc = 0;
                   1249: err:
                   1250:        if (ccb != NULL) {
                   1251:                /* Abort our command, if it failed, by stopping command DMA. */
                   1252:                if (rc != 0 && ISSET(ap->ap_active, 1 << ccb->ccb_slot)) {
                   1253:                        printf("%s: stopping the port, softreset slot %d was "
                   1254:                            "still active.\n", PORTNAME(ap), ccb->ccb_slot);
                   1255:                        ahci_port_stop(ap, 0);
                   1256:                }
                   1257:                ccb->ccb_xa.state = ATA_S_ERROR;
                   1258:                ahci_put_err_ccb(ccb);
                   1259:        }
                   1260:
                   1261:        /* Restore saved CMD register state */
                   1262:        ahci_pwrite(ap, AHCI_PREG_CMD, cmd);
                   1263:
                   1264:        splx(s);
                   1265:
                   1266:        return (rc);
                   1267: }
                   1268:
                   1269: /* AHCI port reset, Section 10.4.2 */
                   1270: int
                   1271: ahci_port_portreset(struct ahci_port *ap)
                   1272: {
                   1273:        u_int32_t                       cmd, r;
                   1274:        int                             rc;
                   1275:
                   1276:        DPRINTF(AHCI_D_VERBOSE, "%s: port reset\n", PORTNAME(ap));
                   1277:
                   1278:        /* Save previous command register state */
                   1279:        cmd = ahci_pread(ap, AHCI_PREG_CMD) & ~AHCI_PREG_CMD_ICC;
                   1280:
                   1281:        /* Clear ST, ignoring failure */
                   1282:        ahci_port_stop(ap, 0);
                   1283:
                   1284:        /* Perform device detection */
                   1285:        ahci_pwrite(ap, AHCI_PREG_SCTL, 0);
                   1286:        delay(10000);
                   1287:        r = AHCI_PREG_SCTL_IPM_DISABLED | AHCI_PREG_SCTL_SPD_ANY |
                   1288:            AHCI_PREG_SCTL_DET_INIT;
                   1289:        ahci_pwrite(ap, AHCI_PREG_SCTL, r);
                   1290:        delay(10000);   /* wait at least 1ms for COMRESET to be sent */
                   1291:        r &= ~AHCI_PREG_SCTL_DET_INIT;
                   1292:        r |= AHCI_PREG_SCTL_DET_NONE;
                   1293:        ahci_pwrite(ap, AHCI_PREG_SCTL, r);
                   1294:        delay(10000);
                   1295:
                   1296:        /* Wait for device to be detected and communications established */
                   1297:        if (ahci_pwait_eq(ap, AHCI_PREG_SSTS, AHCI_PREG_SSTS_DET,
                   1298:            AHCI_PREG_SSTS_DET_DEV)) {
                   1299:                rc = ENODEV;
                   1300:                goto err;
                   1301:        }
                   1302:
                   1303:        /* Clear SERR (incl X bit), so TFD can update */
                   1304:        ahci_pwrite(ap, AHCI_PREG_SERR, ahci_pread(ap, AHCI_PREG_SERR));
                   1305:
                   1306:        /* Wait for device to become ready */
                   1307:        /* XXX maybe more than the default wait is appropriate here? */
                   1308:        if (ahci_pwait_clr(ap, AHCI_PREG_TFD, AHCI_PREG_TFD_STS_BSY |
                   1309:            AHCI_PREG_TFD_STS_DRQ | AHCI_PREG_TFD_STS_ERR)) {
                   1310:                rc = EBUSY;
                   1311:                goto err;
                   1312:        }
                   1313:
                   1314:        rc = 0;
                   1315: err:
                   1316:        /* Restore preserved port state */
                   1317:        ahci_pwrite(ap, AHCI_PREG_CMD, cmd);
                   1318:
                   1319:        return (rc);
                   1320: }
                   1321:
                   1322: int
                   1323: ahci_load_prdt(struct ahci_ccb *ccb)
                   1324: {
                   1325:        struct ahci_port                *ap = ccb->ccb_port;
                   1326:        struct ahci_softc               *sc = ap->ap_sc;
                   1327:        struct ata_xfer                 *xa = &ccb->ccb_xa;
                   1328:        struct ahci_prdt                *prdt = ccb->ccb_cmd_table->prdt, *prd;
                   1329:        bus_dmamap_t                    dmap = ccb->ccb_dmamap;
                   1330:        struct ahci_cmd_hdr             *cmd_slot = ccb->ccb_cmd_hdr;
                   1331:        u_int64_t                       addr;
                   1332:        int                             i, error;
                   1333:
                   1334:        if (xa->datalen == 0) {
                   1335:                ccb->ccb_cmd_hdr->prdtl = 0;
                   1336:                return (0);
                   1337:        }
                   1338:
                   1339:        error = bus_dmamap_load(sc->sc_dmat, dmap, xa->data, xa->datalen, NULL,
                   1340:            (xa->flags & ATA_F_NOWAIT) ? BUS_DMA_NOWAIT : BUS_DMA_WAITOK);
                   1341:        if (error != 0) {
                   1342:                printf("%s: error %d loading dmamap\n", PORTNAME(ap), error);
                   1343:                return (1);
                   1344:        }
                   1345:
                   1346:        for (i = 0; i < dmap->dm_nsegs; i++) {
                   1347:                prd = &prdt[i];
                   1348:
                   1349:                addr = dmap->dm_segs[i].ds_addr;
                   1350:                prd->dba_hi = htole32((u_int32_t)(addr >> 32));
                   1351:                prd->dba_lo = htole32((u_int32_t)addr);
                   1352: #ifdef DIAGNOSTIC
                   1353:                if (addr & 1) {
                   1354:                        printf("%s: requested DMA at an odd address %llx\n",
                   1355:                            PORTNAME(ap), (unsigned long long)addr);
                   1356:                        return (1);
                   1357:                }
                   1358:                if (dmap->dm_segs[i].ds_len & 1) {
                   1359:                        printf("%s: requested DMA length %d is not even\n",
                   1360:                            PORTNAME(ap), (int)dmap->dm_segs[i].ds_len);
                   1361:                        return (1);
                   1362:                }
                   1363: #endif
                   1364:                prd->flags = htole32(dmap->dm_segs[i].ds_len - 1);
                   1365:        }
                   1366:        if (xa->flags & ATA_F_PIO)
                   1367:                prd->flags |= htole32(AHCI_PRDT_FLAG_INTR);
                   1368:
                   1369:        cmd_slot->prdtl = htole16(dmap->dm_nsegs);
                   1370:
                   1371:        bus_dmamap_sync(sc->sc_dmat, dmap, 0, dmap->dm_mapsize,
                   1372:            (xa->flags & ATA_F_READ) ? BUS_DMASYNC_PREREAD :
                   1373:            BUS_DMASYNC_PREWRITE);
                   1374:
                   1375:        return (0);
                   1376: }
                   1377:
                   1378: void
                   1379: ahci_unload_prdt(struct ahci_ccb *ccb)
                   1380: {
                   1381:        struct ahci_port                *ap = ccb->ccb_port;
                   1382:        struct ahci_softc               *sc = ap->ap_sc;
                   1383:        struct ata_xfer                 *xa = &ccb->ccb_xa;
                   1384:        bus_dmamap_t                    dmap = ccb->ccb_dmamap;
                   1385:
                   1386:        if (xa->datalen != 0) {
                   1387:                bus_dmamap_sync(sc->sc_dmat, dmap, 0, dmap->dm_mapsize,
                   1388:                    (xa->flags & ATA_F_READ) ? BUS_DMASYNC_POSTREAD :
                   1389:                    BUS_DMASYNC_POSTWRITE);
                   1390:
                   1391:                bus_dmamap_unload(sc->sc_dmat, dmap);
                   1392:
                   1393:                if (ccb->ccb_xa.flags & ATA_F_NCQ)
                   1394:                        xa->resid = 0;
                   1395:                else
                   1396:                        xa->resid = xa->datalen -
                   1397:                            letoh32(ccb->ccb_cmd_hdr->prdbc);
                   1398:        }
                   1399: }
                   1400:
                   1401: int
                   1402: ahci_poll(struct ahci_ccb *ccb, int timeout, void (*timeout_fn)(void *))
                   1403: {
                   1404:        struct ahci_port                *ap = ccb->ccb_port;
                   1405:        int                             s;
                   1406:
                   1407:        s = splbio();
                   1408:        ahci_start(ccb);
                   1409:        do {
                   1410:                if (ISSET(ahci_port_intr(ap, AHCI_PREG_CI_ALL_SLOTS),
                   1411:                    1 << ccb->ccb_slot)) {
                   1412:                        splx(s);
                   1413:                        return (0);
                   1414:                }
                   1415:
                   1416:                delay(1000);
                   1417:        } while (--timeout > 0);
                   1418:
                   1419:        /* Run timeout while at splbio, otherwise ahci_intr could interfere. */
                   1420:        if (timeout_fn != NULL)
                   1421:                timeout_fn(ccb);
                   1422:
                   1423:        splx(s);
                   1424:
                   1425:        return (1);
                   1426: }
                   1427:
                   1428: void
                   1429: ahci_start(struct ahci_ccb *ccb)
                   1430: {
                   1431:        struct ahci_port                *ap = ccb->ccb_port;
                   1432:        struct ahci_softc               *sc = ap->ap_sc;
                   1433:
                   1434:        KASSERT(ccb->ccb_xa.state == ATA_S_PENDING);
                   1435:
                   1436:        /* Zero transferred byte count before transfer */
                   1437:        ccb->ccb_cmd_hdr->prdbc = 0;
                   1438:
                   1439:        /* Sync command list entry and corresponding command table entry */
                   1440:        bus_dmamap_sync(sc->sc_dmat, AHCI_DMA_MAP(ap->ap_dmamem_cmd_list),
                   1441:            ccb->ccb_slot * sizeof(struct ahci_cmd_hdr),
                   1442:            sizeof(struct ahci_cmd_hdr), BUS_DMASYNC_PREWRITE);
                   1443:        bus_dmamap_sync(sc->sc_dmat, AHCI_DMA_MAP(ap->ap_dmamem_cmd_table),
                   1444:            ccb->ccb_slot * sizeof(struct ahci_cmd_table),
                   1445:            sizeof(struct ahci_cmd_table), BUS_DMASYNC_PREWRITE);
                   1446:
                   1447:        /* Prepare RFIS area for write by controller */
                   1448:        bus_dmamap_sync(sc->sc_dmat, AHCI_DMA_MAP(ap->ap_dmamem_rfis), 0,
                   1449:            sizeof(struct ahci_rfis), BUS_DMASYNC_PREREAD);
                   1450:
                   1451:        if (ccb->ccb_xa.flags & ATA_F_NCQ) {
                   1452:                /* Issue NCQ commands only when there are no outstanding
                   1453:                 * standard commands. */
                   1454:                if (ap->ap_active != 0 || !TAILQ_EMPTY(&ap->ap_ccb_pending))
                   1455:                        TAILQ_INSERT_TAIL(&ap->ap_ccb_pending, ccb, ccb_entry);
                   1456:                else {
                   1457:                        KASSERT(ap->ap_active_cnt == 0);
                   1458:                        ap->ap_sactive |= (1 << ccb->ccb_slot);
                   1459:                        ccb->ccb_xa.state = ATA_S_ONCHIP;
                   1460:                        ahci_pwrite(ap, AHCI_PREG_SACT, 1 << ccb->ccb_slot);
                   1461:                        ahci_pwrite(ap, AHCI_PREG_CI, 1 << ccb->ccb_slot);
                   1462:                }
                   1463:        } else {
                   1464:                /* Wait for all NCQ commands to finish before issuing standard
                   1465:                 * command. */
                   1466:                if (ap->ap_sactive != 0 || ap->ap_active_cnt == 2)
                   1467:                        TAILQ_INSERT_TAIL(&ap->ap_ccb_pending, ccb, ccb_entry);
                   1468:                else if (ap->ap_active_cnt < 2) {
                   1469:                        ap->ap_active |= 1 << ccb->ccb_slot;
                   1470:                        ccb->ccb_xa.state = ATA_S_ONCHIP;
                   1471:                        ahci_pwrite(ap, AHCI_PREG_CI, 1 << ccb->ccb_slot);
                   1472:                        ap->ap_active_cnt++;
                   1473:                }
                   1474:        }
                   1475: }
                   1476:
                   1477: void
                   1478: ahci_issue_pending_ncq_commands(struct ahci_port *ap)
                   1479: {
                   1480:        struct ahci_ccb                 *nextccb;
                   1481:        u_int32_t                       sact_change = 0;
                   1482:
                   1483:        KASSERT(ap->ap_active_cnt == 0);
                   1484:
                   1485:        nextccb = TAILQ_FIRST(&ap->ap_ccb_pending);
                   1486:        if (nextccb == NULL || !(nextccb->ccb_xa.flags & ATA_F_NCQ))
                   1487:                return;
                   1488:
                   1489:        /* Start all the NCQ commands at the head of the pending list. */
                   1490:        do {
                   1491:                TAILQ_REMOVE(&ap->ap_ccb_pending, nextccb, ccb_entry);
                   1492:                sact_change |= 1 << nextccb->ccb_slot;
                   1493:                nextccb->ccb_xa.state = ATA_S_ONCHIP;
                   1494:                nextccb = TAILQ_FIRST(&ap->ap_ccb_pending);
                   1495:        } while (nextccb && (nextccb->ccb_xa.flags & ATA_F_NCQ));
                   1496:
                   1497:        ap->ap_sactive |= sact_change;
                   1498:        ahci_pwrite(ap, AHCI_PREG_SACT, sact_change);
                   1499:        ahci_pwrite(ap, AHCI_PREG_CI, sact_change);
                   1500:
                   1501:        return;
                   1502: }
                   1503:
                   1504: void
                   1505: ahci_issue_pending_commands(struct ahci_port *ap, int last_was_ncq)
                   1506: {
                   1507:        struct ahci_ccb                 *nextccb;
                   1508:
                   1509:        nextccb = TAILQ_FIRST(&ap->ap_ccb_pending);
                   1510:        if (nextccb && (nextccb->ccb_xa.flags & ATA_F_NCQ)) {
                   1511:                KASSERT(last_was_ncq == 0);     /* otherwise it should have
                   1512:                                                 * been started already. */
                   1513:
                   1514:                /* Issue NCQ commands only when there are no outstanding
                   1515:                 * standard commands. */
                   1516:                ap->ap_active_cnt--;
                   1517:                if (ap->ap_active == 0)
                   1518:                        ahci_issue_pending_ncq_commands(ap);
                   1519:                else
                   1520:                        KASSERT(ap->ap_active_cnt == 1);
                   1521:        } else if (nextccb) {
                   1522:                if (ap->ap_sactive != 0 || last_was_ncq)
                   1523:                        KASSERT(ap->ap_active_cnt == 0);
                   1524:
                   1525:                /* Wait for all NCQ commands to finish before issuing standard
                   1526:                 * command. */
                   1527:                if (ap->ap_sactive != 0)
                   1528:                        return;
                   1529:
                   1530:                /* Keep up to 2 standard commands on-chip at a time. */
                   1531:                do {
                   1532:                        TAILQ_REMOVE(&ap->ap_ccb_pending, nextccb, ccb_entry);
                   1533:                        ap->ap_active |= 1 << nextccb->ccb_slot;
                   1534:                        nextccb->ccb_xa.state = ATA_S_ONCHIP;
                   1535:                        ahci_pwrite(ap, AHCI_PREG_CI, 1 << nextccb->ccb_slot);
                   1536:                        if (last_was_ncq)
                   1537:                                ap->ap_active_cnt++;
                   1538:                        if (ap->ap_active_cnt == 2)
                   1539:                                break;
                   1540:                        KASSERT(ap->ap_active_cnt == 1);
                   1541:                        nextccb = TAILQ_FIRST(&ap->ap_ccb_pending);
                   1542:                } while (nextccb && !(nextccb->ccb_xa.flags & ATA_F_NCQ));
                   1543:        } else if (!last_was_ncq) {
                   1544:                KASSERT(ap->ap_active_cnt == 1 || ap->ap_active_cnt == 2);
                   1545:
                   1546:                /* Standard command finished, none waiting to start. */
                   1547:                ap->ap_active_cnt--;
                   1548:        } else {
                   1549:                KASSERT(ap->ap_active_cnt == 0);
                   1550:
                   1551:                /* NCQ command finished. */
                   1552:        }
                   1553: }
                   1554:
                   1555: int
                   1556: ahci_intr(void *arg)
                   1557: {
                   1558:        struct ahci_softc               *sc = arg;
                   1559:        u_int32_t                       is, ack = 0;
                   1560:        int                             port;
                   1561:
                   1562:        /* Read global interrupt status */
                   1563:        is = ahci_read(sc, AHCI_REG_IS);
                   1564:        if (is == 0)
                   1565:                return (0);
                   1566:        ack = is;
                   1567:
                   1568: #ifdef AHCI_COALESCE
                   1569:        /* Check coalescing interrupt first */
                   1570:        if (is & sc->sc_ccc_mask) {
                   1571:                DPRINTF(AHCI_D_INTR, "%s: command coalescing interrupt\n",
                   1572:                    DEVNAME(sc));
                   1573:                is &= ~sc->sc_ccc_mask;
                   1574:                is |= sc->sc_ccc_ports_cur;
                   1575:        }
                   1576: #endif
                   1577:
                   1578:        /* Process interrupts for each port */
                   1579:        while (is) {
                   1580:                port = ffs(is) - 1;
                   1581:                if (sc->sc_ports[port])
                   1582:                        ahci_port_intr(sc->sc_ports[port],
                   1583:                            AHCI_PREG_CI_ALL_SLOTS);
                   1584:                is &= ~(1 << port);
                   1585:        }
                   1586:
                   1587:        /* Finally, acknowledge global interrupt */
                   1588:        ahci_write(sc, AHCI_REG_IS, ack);
                   1589:
                   1590:        return (1);
                   1591: }
                   1592:
                   1593: u_int32_t
                   1594: ahci_port_intr(struct ahci_port *ap, u_int32_t ci_mask)
                   1595: {
                   1596:        struct ahci_softc               *sc = ap->ap_sc;
                   1597:        u_int32_t                       is, ci_saved, ci_masked, processed = 0;
                   1598:        int                             slot, need_restart = 0;
                   1599:        struct ahci_ccb                 *ccb;
                   1600:        volatile u_int32_t              *active;
                   1601: #ifdef DIAGNOSTIC
                   1602:        u_int32_t                       tmp;
                   1603: #endif
                   1604:
                   1605:        is = ahci_pread(ap, AHCI_PREG_IS);
                   1606:
                   1607:        /* Ack port interrupt only if checking all command slots. */
                   1608:        if (ci_mask == AHCI_PREG_CI_ALL_SLOTS)
                   1609:                ahci_pwrite(ap, AHCI_PREG_IS, is);
                   1610:
                   1611:        if (is)
                   1612:                DPRINTF(AHCI_D_INTR, "%s: interrupt: %b\n", PORTNAME(ap),
                   1613:                    is, AHCI_PFMT_IS);
                   1614:
                   1615:        if (ap->ap_sactive) {
                   1616:                /* Active NCQ commands - use SActive instead of CI */
                   1617:                KASSERT(ap->ap_active == 0);
                   1618:                KASSERT(ap->ap_active_cnt == 0);
                   1619:                ci_saved = ahci_pread(ap, AHCI_PREG_SACT);
                   1620:                active = &ap->ap_sactive;
                   1621:        } else {
                   1622:                /* Save CI */
                   1623:                ci_saved = ahci_pread(ap, AHCI_PREG_CI);
                   1624:                active = &ap->ap_active;
                   1625:        }
                   1626:
                   1627:        /* Command failed.  See AHCI 1.1 spec 6.2.2.1 and 6.2.2.2. */
                   1628:        if (is & AHCI_PREG_IS_TFES) {
                   1629:                u_int32_t               tfd, serr;
                   1630:                int                     err_slot;
                   1631:
                   1632:                tfd = ahci_pread(ap, AHCI_PREG_TFD);
                   1633:                serr = ahci_pread(ap, AHCI_PREG_SERR);
                   1634:
                   1635:                if (ap->ap_sactive == 0) {
                   1636:                        /* Errored slot is easy to determine from CMD. */
                   1637:                        err_slot = AHCI_PREG_CMD_CCS(ahci_pread(ap,
                   1638:                            AHCI_PREG_CMD));
                   1639:                        ccb = &ap->ap_ccbs[err_slot];
                   1640:
                   1641:                        /* Preserve received taskfile data from the RFIS. */
                   1642:                        memcpy(&ccb->ccb_xa.rfis, ap->ap_rfis->rfis,
                   1643:                            sizeof(struct ata_fis_d2h));
                   1644:                } else
                   1645:                        err_slot = -1;  /* Must extract error from log page */
                   1646:
                   1647:                DPRINTF(AHCI_D_VERBOSE, "%s: errored slot %d, TFD: %b, SERR:"
                   1648:                    " %b, DIAG: %b\n", PORTNAME(ap), err_slot, tfd,
                   1649:                    AHCI_PFMT_TFD_STS, AHCI_PREG_SERR_ERR(serr),
                   1650:                    AHCI_PFMT_SERR_ERR, AHCI_PREG_SERR_DIAG(serr),
                   1651:                    AHCI_PFMT_SERR_DIAG);
                   1652:
                   1653:                /* Turn off ST to clear CI and SACT. */
                   1654:                ahci_port_stop(ap, 0);
                   1655:                need_restart = 1;
                   1656:
                   1657:                /* Clear SERR to enable capturing new errors. */
                   1658:                ahci_pwrite(ap, AHCI_PREG_SERR, serr);
                   1659:
                   1660:                /* Acknowledge the interrupts we can recover from. */
                   1661:                ahci_pwrite(ap, AHCI_PREG_IS, AHCI_PREG_IS_TFES |
                   1662:                    AHCI_PREG_IS_IFS);
                   1663:                is = ahci_pread(ap, AHCI_PREG_IS);
                   1664:
                   1665:                /* If device hasn't cleared its busy status, try to idle it. */
                   1666:                if (ISSET(tfd, AHCI_PREG_TFD_STS_BSY | AHCI_PREG_TFD_STS_DRQ)) {
                   1667:                        printf("%s: attempting to idle device\n", PORTNAME(ap));
                   1668:                        if (ahci_port_softreset(ap)) {
                   1669:                                printf("%s: failed to soft reset device\n",
                   1670:                                    PORTNAME(ap));
                   1671:                                if (ahci_port_portreset(ap)) {
                   1672:                                        printf("%s: failed to port reset "
                   1673:                                            "device, give up on it\n",
                   1674:                                            PORTNAME(ap));
                   1675:                                        goto fatal;
                   1676:                                }
                   1677:                        }
                   1678:
                   1679:                        /* Had to reset device, can't gather extended info. */
                   1680:                } else if (ap->ap_sactive) {
                   1681:                        /* Recover the NCQ error from log page 10h. */
                   1682:                        ahci_port_read_ncq_error(ap, &err_slot);
                   1683:                        if (err_slot < 0)
                   1684:                                goto failall;
                   1685:
                   1686:                        DPRINTF(AHCI_D_VERBOSE, "%s: NCQ errored slot %d\n",
                   1687:                                PORTNAME(ap), err_slot);
                   1688:
                   1689:                        ccb = &ap->ap_ccbs[err_slot];
                   1690:                } else {
                   1691:                        /* Didn't reset, could gather extended info from log. */
                   1692:                }
                   1693:
                   1694:                /*
                   1695:                 * If we couldn't determine the errored slot, reset the port
                   1696:                 * and fail all the active slots.
                   1697:                 */
                   1698:                if (err_slot == -1) {
                   1699:                        if (ahci_port_softreset(ap) != 0 &&
                   1700:                            ahci_port_portreset(ap) != 0) {
                   1701:                                printf("%s: couldn't reset after NCQ error, "
                   1702:                                    "disabling device.\n", PORTNAME(ap));
                   1703:                                goto fatal;
                   1704:                        }
                   1705:                        printf("%s: couldn't recover NCQ error, failing "
                   1706:                            "all outstanding commands.\n", PORTNAME(ap));
                   1707:                        goto failall;
                   1708:                }
                   1709:
                   1710:                /* Clear the failed command in saved CI so completion runs. */
                   1711:                ci_saved &= ~(1 << err_slot);
                   1712:
                   1713:                /* Note the error in the ata_xfer. */
                   1714:                KASSERT(ccb->ccb_xa.state == ATA_S_ONCHIP);
                   1715:                ccb->ccb_xa.state = ATA_S_ERROR;
                   1716:
                   1717: #ifdef DIAGNOSTIC
                   1718:                /* There may only be one outstanding standard command now. */
                   1719:                if (ap->ap_sactive == 0) {
                   1720:                        tmp = ci_saved;
                   1721:                        if (tmp) {
                   1722:                                slot = ffs(tmp) - 1;
                   1723:                                tmp &= ~(1 << slot);
                   1724:                                KASSERT(tmp == 0);
                   1725:                        }
                   1726:                }
                   1727: #endif
                   1728:        }
                   1729:
                   1730:        /* Check for remaining errors - they are fatal. */
                   1731:        if (is & (AHCI_PREG_IS_TFES | AHCI_PREG_IS_HBFS | AHCI_PREG_IS_IFS |
                   1732:            AHCI_PREG_IS_OFS | AHCI_PREG_IS_UFS)) {
                   1733:                printf("%s: unrecoverable errors (IS: %b), disabling port.\n",
                   1734:                    PORTNAME(ap), is, AHCI_PFMT_IS);
                   1735:
                   1736:                /* XXX try recovery first */
                   1737:                goto fatal;
                   1738:        }
                   1739:
                   1740:        /* Fail all outstanding commands if we know the port won't recover. */
                   1741:        if (ap->ap_state == AP_S_FATAL_ERROR) {
                   1742: fatal:
                   1743:                ap->ap_state = AP_S_FATAL_ERROR;
                   1744: failall:
                   1745:
                   1746:                /* Ensure port is shut down. */
                   1747:                ahci_port_stop(ap, 1);
                   1748:
                   1749:                /* Error all the active slots. */
                   1750:                ci_masked = ci_saved & *active;
                   1751:                while (ci_masked) {
                   1752:                        slot = ffs(ci_masked) - 1;
                   1753:                        ccb = &ap->ap_ccbs[slot];
                   1754:                        ci_masked &= ~(1 << slot);
                   1755:                        ccb->ccb_xa.state = ATA_S_ERROR;
                   1756:                }
                   1757:
                   1758:                /* Run completion for all active slots. */
                   1759:                ci_saved &= ~*active;
                   1760:
                   1761:                /* Don't restart the port if our problems were deemed fatal. */
                   1762:                if (ap->ap_state == AP_S_FATAL_ERROR)
                   1763:                        need_restart = 0;
                   1764:        }
                   1765:
                   1766:        /*
                   1767:         * CCB completion is detected by noticing its slot's bit in CI has
                   1768:         * changed to zero some time after we activated it.
                   1769:         * If we are polling, we may only be interested in particular slot(s).
                   1770:         */
                   1771:        ci_masked = ~ci_saved & *active & ci_mask;
                   1772:        while (ci_masked) {
                   1773:                slot = ffs(ci_masked) - 1;
                   1774:                ccb = &ap->ap_ccbs[slot];
                   1775:                ci_masked &= ~(1 << slot);
                   1776:
                   1777:                DPRINTF(AHCI_D_INTR, "%s: slot %d is complete%s\n",
                   1778:                    PORTNAME(ap), slot, ccb->ccb_xa.state == ATA_S_ERROR ?
                   1779:                    " (error)" : "");
                   1780:
                   1781:                bus_dmamap_sync(sc->sc_dmat,
                   1782:                    AHCI_DMA_MAP(ap->ap_dmamem_cmd_list),
                   1783:                    ccb->ccb_slot * sizeof(struct ahci_cmd_hdr),
                   1784:                    sizeof(struct ahci_cmd_hdr), BUS_DMASYNC_POSTWRITE);
                   1785:
                   1786:                bus_dmamap_sync(sc->sc_dmat,
                   1787:                    AHCI_DMA_MAP(ap->ap_dmamem_cmd_table),
                   1788:                    ccb->ccb_slot * sizeof(struct ahci_cmd_table),
                   1789:                    sizeof(struct ahci_cmd_table), BUS_DMASYNC_POSTWRITE);
                   1790:
                   1791:                bus_dmamap_sync(sc->sc_dmat,
                   1792:                    AHCI_DMA_MAP(ap->ap_dmamem_rfis), 0,
                   1793:                    sizeof(struct ahci_rfis), BUS_DMASYNC_POSTREAD);
                   1794:
                   1795:                *active &= ~(1 << ccb->ccb_slot);
                   1796:                ccb->ccb_done(ccb);
                   1797:
                   1798:                processed |= 1 << ccb->ccb_slot;
                   1799:        }
                   1800:
                   1801:        if (need_restart) {
                   1802:                /* Restart command DMA on the port */
                   1803:                ahci_port_start(ap, 0);
                   1804:
                   1805:                /* Re-enable outstanding commands on port. */
                   1806:                if (ci_saved) {
                   1807: #ifdef DIAGNOSTIC
                   1808:                        tmp = ci_saved;
                   1809:                        while (tmp) {
                   1810:                                slot = ffs(tmp) - 1;
                   1811:                                tmp &= ~(1 << slot);
                   1812:                                ccb = &ap->ap_ccbs[slot];
                   1813:                                KASSERT(ccb->ccb_xa.state == ATA_S_ONCHIP);
                   1814:                                KASSERT((!!(ccb->ccb_xa.flags & ATA_F_NCQ)) ==
                   1815:                                    (!!ap->ap_sactive));
                   1816:                        }
                   1817: #endif
                   1818:                        DPRINTF(AHCI_D_VERBOSE, "%s: ahci_port_intr "
                   1819:                            "re-enabling%s slots %08x\n", PORTNAME(ap),
                   1820:                            ap->ap_sactive ? " NCQ" : "", ci_saved);
                   1821:
                   1822:                        if (ap->ap_sactive)
                   1823:                                ahci_pwrite(ap, AHCI_PREG_SACT, ci_saved);
                   1824:                        ahci_pwrite(ap, AHCI_PREG_CI, ci_saved);
                   1825:                }
                   1826:        }
                   1827:
                   1828:        return (processed);
                   1829: }
                   1830:
                   1831: struct ahci_ccb *
                   1832: ahci_get_ccb(struct ahci_port *ap)
                   1833: {
                   1834:        struct ahci_ccb                 *ccb;
                   1835:
                   1836:        ccb = TAILQ_FIRST(&ap->ap_ccb_free);
                   1837:        if (ccb != NULL) {
                   1838:                KASSERT(ccb->ccb_xa.state == ATA_S_PUT);
                   1839:                TAILQ_REMOVE(&ap->ap_ccb_free, ccb, ccb_entry);
                   1840:                ccb->ccb_xa.state = ATA_S_SETUP;
                   1841:        }
                   1842:
                   1843:        return (ccb);
                   1844: }
                   1845:
                   1846: void
                   1847: ahci_put_ccb(struct ahci_ccb *ccb)
                   1848: {
                   1849:        struct ahci_port                *ap = ccb->ccb_port;
                   1850:
                   1851: #ifdef DIAGNOSTIC
                   1852:        if (ccb->ccb_xa.state != ATA_S_COMPLETE &&
                   1853:            ccb->ccb_xa.state != ATA_S_TIMEOUT &&
                   1854:            ccb->ccb_xa.state != ATA_S_ERROR) {
                   1855:                printf("%s: invalid ata_xfer state %02x in ahci_put_ccb, "
                   1856:                    "slot %d\n", PORTNAME(ccb->ccb_port), ccb->ccb_xa.state,
                   1857:                    ccb->ccb_slot);
                   1858:        }
                   1859: #endif
                   1860:
                   1861:        ccb->ccb_xa.state = ATA_S_PUT;
                   1862:        TAILQ_INSERT_TAIL(&ap->ap_ccb_free, ccb, ccb_entry);
                   1863: }
                   1864:
                   1865: struct ahci_ccb *
                   1866: ahci_get_err_ccb(struct ahci_port *ap)
                   1867: {
                   1868:        struct ahci_ccb *err_ccb;
                   1869:        u_int32_t sact;
                   1870:
                   1871:        splassert(IPL_BIO);
                   1872:
                   1873:        /* No commands may be active on the chip. */
                   1874:        sact = ahci_pread(ap, AHCI_PREG_SACT);
                   1875:        if (sact != 0)
                   1876:                printf("ahci_get_err_ccb but SACT %08x != 0?\n", sact);
                   1877:        KASSERT(ahci_pread(ap, AHCI_PREG_CI) == 0);
                   1878:
                   1879: #ifdef DIAGNOSTIC
                   1880:        KASSERT(ap->ap_err_busy == 0);
                   1881:        ap->ap_err_busy = 1;
                   1882: #endif
                   1883:        /* Save outstanding command state. */
                   1884:        ap->ap_err_saved_active = ap->ap_active;
                   1885:        ap->ap_err_saved_active_cnt = ap->ap_active_cnt;
                   1886:        ap->ap_err_saved_sactive = ap->ap_sactive;
                   1887:
                   1888:        /*
                   1889:         * Pretend we have no commands outstanding, so that completions won't
                   1890:         * run prematurely.
                   1891:         */
                   1892:        ap->ap_active = ap->ap_active_cnt = ap->ap_sactive = 0;
                   1893:
                   1894:        /*
                   1895:         * Grab a CCB to use for error recovery.  This should never fail, as
                   1896:         * we ask atascsi to reserve one for us at init time.
                   1897:         */
                   1898:        err_ccb = ahci_get_ccb(ap);
                   1899:        KASSERT(err_ccb != NULL);
                   1900:        err_ccb->ccb_xa.flags = 0;
                   1901:        err_ccb->ccb_done = ahci_empty_done;
                   1902:
                   1903:        return err_ccb;
                   1904: }
                   1905:
                   1906: void
                   1907: ahci_put_err_ccb(struct ahci_ccb *ccb)
                   1908: {
                   1909:        struct ahci_port *ap = ccb->ccb_port;
                   1910:        u_int32_t sact;
                   1911:
                   1912:        splassert(IPL_BIO);
                   1913:
                   1914: #ifdef DIAGNOSTIC
                   1915:        KASSERT(ap->ap_err_busy);
                   1916: #endif
                   1917:        /* No commands may be active on the chip */
                   1918:        sact = ahci_pread(ap, AHCI_PREG_SACT);
                   1919:        if (sact != 0)
                   1920:                printf("ahci_port_err_ccb_restore but SACT %08x != 0?\n", sact);
                   1921:        KASSERT(ahci_pread(ap, AHCI_PREG_CI) == 0);
                   1922:
                   1923:        /* Done with the CCB */
                   1924:        ahci_put_ccb(ccb);
                   1925:
                   1926:        /* Restore outstanding command state */
                   1927:        ap->ap_sactive = ap->ap_err_saved_sactive;
                   1928:        ap->ap_active_cnt = ap->ap_err_saved_active_cnt;
                   1929:        ap->ap_active = ap->ap_err_saved_active;
                   1930:
                   1931: #ifdef DIAGNOSTIC
                   1932:        ap->ap_err_busy = 0;
                   1933: #endif
                   1934: }
                   1935:
                   1936: int
                   1937: ahci_port_read_ncq_error(struct ahci_port *ap, int *err_slotp)
                   1938: {
                   1939:        struct ahci_ccb                 *ccb;
                   1940:        struct ahci_cmd_hdr             *cmd_slot;
                   1941:        u_int32_t                       cmd;
                   1942:        struct ata_fis_h2d              *fis;
                   1943:        int                             rc = EIO;
                   1944:
                   1945:        DPRINTF(AHCI_D_VERBOSE, "%s: read log page\n", PORTNAME(ap));
                   1946:
                   1947:        /* Save command register state. */
                   1948:        cmd = ahci_pread(ap, AHCI_PREG_CMD) & ~AHCI_PREG_CMD_ICC;
                   1949:
                   1950:        /* Port should have been idled already.  Start it. */
                   1951:        KASSERT((cmd & AHCI_PREG_CMD_CR) == 0);
                   1952:        ahci_port_start(ap, 0);
                   1953:
                   1954:        /* Prep error CCB for READ LOG EXT, page 10h, 1 sector. */
                   1955:        ccb = ahci_get_err_ccb(ap);
                   1956:        ccb->ccb_xa.flags = ATA_F_NOWAIT | ATA_F_READ | ATA_F_POLL;
                   1957:        ccb->ccb_xa.data = ap->ap_err_scratch;
                   1958:        ccb->ccb_xa.datalen = 512;
                   1959:        cmd_slot = ccb->ccb_cmd_hdr;
                   1960:        bzero(ccb->ccb_cmd_table, sizeof(struct ahci_cmd_table));
                   1961:
                   1962:        fis = (struct ata_fis_h2d *)ccb->ccb_cmd_table->cfis;
                   1963:        fis->type = ATA_FIS_TYPE_H2D;
                   1964:        fis->flags = ATA_H2D_FLAGS_CMD;
                   1965:        fis->command = ATA_C_READ_LOG_EXT;
                   1966:        fis->lba_low = 0x10;            /* queued error log page (10h) */
                   1967:        fis->sector_count = 1;          /* number of sectors (1) */
                   1968:        fis->sector_count_exp = 0;
                   1969:        fis->lba_mid = 0;               /* starting offset */
                   1970:        fis->lba_mid_exp = 0;
                   1971:        fis->device = 0;
                   1972:
                   1973:        cmd_slot->flags = htole16(5);   /* FIS length: 5 DWORDS */
                   1974:
                   1975:        if (ahci_load_prdt(ccb) != 0) {
                   1976:                rc = ENOMEM;    /* XXX caller must abort all commands */
                   1977:                goto err;
                   1978:        }
                   1979:
                   1980:        ccb->ccb_xa.state = ATA_S_PENDING;
                   1981:        if (ahci_poll(ccb, 1000, NULL) != 0)
                   1982:                goto err;
                   1983:
                   1984:        rc = 0;
                   1985: err:
                   1986:        /* Abort our command, if it failed, by stopping command DMA. */
                   1987:        if (rc != 0 && ISSET(ap->ap_active, 1 << ccb->ccb_slot)) {
                   1988:                printf("%s: log page read failed, slot %d was still active.\n",
                   1989:                    PORTNAME(ap), ccb->ccb_slot);
                   1990:                ahci_port_stop(ap, 0);
                   1991:        }
                   1992:
                   1993:        /* Done with the error CCB now. */
                   1994:        ahci_unload_prdt(ccb);
                   1995:        ahci_put_err_ccb(ccb);
                   1996:
                   1997:        /* Extract failed register set and tags from the scratch space. */
                   1998:        if (rc == 0) {
                   1999:                struct ata_log_page_10h         *log;
                   2000:                int                             err_slot;
                   2001:
                   2002:                log = (struct ata_log_page_10h *)ap->ap_err_scratch;
                   2003:                if (ISSET(log->err_regs.type, ATA_LOG_10H_TYPE_NOTQUEUED)) {
                   2004:                        /* Not queued bit was set - wasn't an NCQ error? */
                   2005:                        printf("%s: read NCQ error page, but not an NCQ "
                   2006:                            "error?\n", PORTNAME(ap));
                   2007:                        rc = ESRCH;
                   2008:                } else {
                   2009:                        /* Copy back the log record as a D2H register FIS. */
                   2010:                        *err_slotp = err_slot = log->err_regs.type &
                   2011:                            ATA_LOG_10H_TYPE_TAG_MASK;
                   2012:
                   2013:                        ccb = &ap->ap_ccbs[err_slot];
                   2014:                        memcpy(&ccb->ccb_xa.rfis, &log->err_regs,
                   2015:                            sizeof(struct ata_fis_d2h));
                   2016:                        ccb->ccb_xa.rfis.type = ATA_FIS_TYPE_D2H;
                   2017:                        ccb->ccb_xa.rfis.flags = 0;
                   2018:                }
                   2019:        }
                   2020:
                   2021:        /* Restore saved CMD register state */
                   2022:        ahci_pwrite(ap, AHCI_PREG_CMD, cmd);
                   2023:
                   2024:        return (rc);
                   2025: }
                   2026:
                   2027: struct ahci_dmamem *
                   2028: ahci_dmamem_alloc(struct ahci_softc *sc, size_t size)
                   2029: {
                   2030:        struct ahci_dmamem              *adm;
                   2031:        int                             nsegs;
                   2032:
                   2033:        adm = malloc(sizeof(struct ahci_dmamem), M_DEVBUF, M_NOWAIT);
                   2034:        if (adm == NULL)
                   2035:                return (NULL);
                   2036:
                   2037:        bzero(adm, sizeof(struct ahci_dmamem));
                   2038:        adm->adm_size = size;
                   2039:
                   2040:        if (bus_dmamap_create(sc->sc_dmat, size, 1, size, 0,
                   2041:            BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &adm->adm_map) != 0)
                   2042:                goto admfree;
                   2043:
                   2044:        if (bus_dmamem_alloc(sc->sc_dmat, size, PAGE_SIZE, 0, &adm->adm_seg,
                   2045:            1, &nsegs, BUS_DMA_NOWAIT) != 0)
                   2046:                goto destroy;
                   2047:
                   2048:        if (bus_dmamem_map(sc->sc_dmat, &adm->adm_seg, nsegs, size,
                   2049:            &adm->adm_kva, BUS_DMA_NOWAIT) != 0)
                   2050:                goto free;
                   2051:
                   2052:        if (bus_dmamap_load(sc->sc_dmat, adm->adm_map, adm->adm_kva, size,
                   2053:            NULL, BUS_DMA_NOWAIT) != 0)
                   2054:                goto unmap;
                   2055:
                   2056:        bzero(adm->adm_kva, size);
                   2057:
                   2058:        return (adm);
                   2059:
                   2060: unmap:
                   2061:        bus_dmamem_unmap(sc->sc_dmat, adm->adm_kva, size);
                   2062: free:
                   2063:        bus_dmamem_free(sc->sc_dmat, &adm->adm_seg, 1);
                   2064: destroy:
                   2065:        bus_dmamap_destroy(sc->sc_dmat, adm->adm_map);
                   2066: admfree:
                   2067:        free(adm, M_DEVBUF);
                   2068:
                   2069:        return (NULL);
                   2070: }
                   2071:
                   2072: void
                   2073: ahci_dmamem_free(struct ahci_softc *sc, struct ahci_dmamem *adm)
                   2074: {
                   2075:        bus_dmamap_unload(sc->sc_dmat, adm->adm_map);
                   2076:        bus_dmamem_unmap(sc->sc_dmat, adm->adm_kva, adm->adm_size);
                   2077:        bus_dmamem_free(sc->sc_dmat, &adm->adm_seg, 1);
                   2078:        bus_dmamap_destroy(sc->sc_dmat, adm->adm_map);
                   2079:        free(adm, M_DEVBUF);
                   2080: }
                   2081:
                   2082: u_int32_t
                   2083: ahci_read(struct ahci_softc *sc, bus_size_t r)
                   2084: {
                   2085:        bus_space_barrier(sc->sc_iot, sc->sc_ioh, r, 4,
                   2086:            BUS_SPACE_BARRIER_READ);
                   2087:        return (bus_space_read_4(sc->sc_iot, sc->sc_ioh, r));
                   2088: }
                   2089:
                   2090: void
                   2091: ahci_write(struct ahci_softc *sc, bus_size_t r, u_int32_t v)
                   2092: {
                   2093:        bus_space_write_4(sc->sc_iot, sc->sc_ioh, r, v);
                   2094:        bus_space_barrier(sc->sc_iot, sc->sc_ioh, r, 4,
                   2095:            BUS_SPACE_BARRIER_WRITE);
                   2096: }
                   2097:
                   2098: int
                   2099: ahci_wait_ne(struct ahci_softc *sc, bus_size_t r, u_int32_t mask,
                   2100:     u_int32_t target)
                   2101: {
                   2102:        int                             i;
                   2103:
                   2104:        for (i = 0; i < 1000; i++) {
                   2105:                if ((ahci_read(sc, r) & mask) != target)
                   2106:                        return (0);
                   2107:                delay(1000);
                   2108:        }
                   2109:
                   2110:        return (1);
                   2111: }
                   2112:
                   2113: u_int32_t
                   2114: ahci_pread(struct ahci_port *ap, bus_size_t r)
                   2115: {
                   2116:        bus_space_barrier(ap->ap_sc->sc_iot, ap->ap_ioh, r, 4,
                   2117:            BUS_SPACE_BARRIER_READ);
                   2118:        return (bus_space_read_4(ap->ap_sc->sc_iot, ap->ap_ioh, r));
                   2119: }
                   2120:
                   2121: void
                   2122: ahci_pwrite(struct ahci_port *ap, bus_size_t r, u_int32_t v)
                   2123: {
                   2124:        bus_space_write_4(ap->ap_sc->sc_iot, ap->ap_ioh, r, v);
                   2125:        bus_space_barrier(ap->ap_sc->sc_iot, ap->ap_ioh, r, 4,
                   2126:            BUS_SPACE_BARRIER_WRITE);
                   2127: }
                   2128:
                   2129: int
                   2130: ahci_pwait_eq(struct ahci_port *ap, bus_size_t r, u_int32_t mask,
                   2131:     u_int32_t target)
                   2132: {
                   2133:        int                             i;
                   2134:
                   2135:        for (i = 0; i < 1000; i++) {
                   2136:                if ((ahci_pread(ap, r) & mask) == target)
                   2137:                        return (0);
                   2138:                delay(1000);
                   2139:        }
                   2140:
                   2141:        return (1);
                   2142: }
                   2143:
                   2144: int
                   2145: ahci_ata_probe(void *xsc, int port)
                   2146: {
                   2147:        struct ahci_softc               *sc = xsc;
                   2148:        struct ahci_port                *ap = sc->sc_ports[port];
                   2149:        u_int32_t                       sig;
                   2150:
                   2151:        if (ap == NULL)
                   2152:                return (ATA_PORT_T_NONE);
                   2153:
                   2154:        sig = ahci_pread(ap, AHCI_PREG_SIG);
                   2155:        if ((sig & 0xffff0000) == (SATA_SIGNATURE_ATAPI & 0xffff0000))
                   2156:                return (ATA_PORT_T_ATAPI);
                   2157:        else
                   2158:                return (ATA_PORT_T_DISK);
                   2159: }
                   2160:
                   2161: struct ata_xfer *
                   2162: ahci_ata_get_xfer(void *aaa_cookie, int port)
                   2163: {
                   2164:        struct ahci_softc               *sc = aaa_cookie;
                   2165:        struct ahci_port                *ap = sc->sc_ports[port];
                   2166:        struct ahci_ccb                 *ccb;
                   2167:
                   2168:        splassert(IPL_BIO);
                   2169:
                   2170:        ccb = ahci_get_ccb(ap);
                   2171:        if (ccb == NULL) {
                   2172:                DPRINTF(AHCI_D_XFER, "%s: ahci_ata_get_xfer: NULL ccb\n",
                   2173:                    PORTNAME(ap));
                   2174:                return (NULL);
                   2175:        }
                   2176:
                   2177:        DPRINTF(AHCI_D_XFER, "%s: ahci_ata_get_xfer got slot %d\n",
                   2178:            PORTNAME(ap), ccb->ccb_slot);
                   2179:
                   2180:        return ((struct ata_xfer *)ccb);
                   2181: }
                   2182:
                   2183: void
                   2184: ahci_ata_put_xfer(struct ata_xfer *xa)
                   2185: {
                   2186:        struct ahci_ccb                 *ccb = (struct ahci_ccb *)xa;
                   2187:
                   2188:        splassert(IPL_BIO);
                   2189:
                   2190:        DPRINTF(AHCI_D_XFER, "ahci_ata_put_xfer slot %d\n", ccb->ccb_slot);
                   2191:
                   2192:        ahci_put_ccb(ccb);
                   2193: }
                   2194:
                   2195: int
                   2196: ahci_ata_cmd(struct ata_xfer *xa)
                   2197: {
                   2198:        struct ahci_ccb                 *ccb = (struct ahci_ccb *)xa;
                   2199:        struct ahci_cmd_hdr             *cmd_slot;
                   2200:        int                             s;
                   2201:
                   2202:        KASSERT(xa->state == ATA_S_SETUP);
                   2203:
                   2204:        if (ccb->ccb_port->ap_state == AP_S_FATAL_ERROR)
                   2205:                goto failcmd;
                   2206:
                   2207:        ccb->ccb_done = ahci_ata_cmd_done;
                   2208:
                   2209:        cmd_slot = ccb->ccb_cmd_hdr;
                   2210:        cmd_slot->flags = htole16(5); /* FIS length (in DWORDs) */
                   2211:
                   2212:        if (xa->flags & ATA_F_WRITE)
                   2213:                cmd_slot->flags |= htole16(AHCI_CMD_LIST_FLAG_W);
                   2214:
                   2215:        if (xa->flags & ATA_F_PACKET)
                   2216:                cmd_slot->flags |= htole16(AHCI_CMD_LIST_FLAG_A);
                   2217:
                   2218:        if (ahci_load_prdt(ccb) != 0)
                   2219:                goto failcmd;
                   2220:
                   2221:        timeout_set(&xa->stimeout, ahci_ata_cmd_timeout, ccb);
                   2222:
                   2223:        xa->state = ATA_S_PENDING;
                   2224:
                   2225:        if (xa->flags & ATA_F_POLL) {
                   2226:                ahci_poll(ccb, xa->timeout, ahci_ata_cmd_timeout);
                   2227:                return (ATA_COMPLETE);
                   2228:        }
                   2229:
                   2230:        timeout_add(&xa->stimeout, (xa->timeout * hz) / 1000);
                   2231:
                   2232:        s = splbio();
                   2233:        ahci_start(ccb);
                   2234:        splx(s);
                   2235:        return (ATA_QUEUED);
                   2236:
                   2237: failcmd:
                   2238:        s = splbio();
                   2239:        xa->state = ATA_S_ERROR;
                   2240:        xa->complete(xa);
                   2241:        splx(s);
                   2242:        return (ATA_ERROR);
                   2243: }
                   2244:
                   2245: void
                   2246: ahci_ata_cmd_done(struct ahci_ccb *ccb)
                   2247: {
                   2248:        struct ata_xfer                 *xa = &ccb->ccb_xa;
                   2249:
                   2250:        timeout_del(&xa->stimeout);
                   2251:
                   2252:        if (xa->state == ATA_S_ONCHIP || xa->state == ATA_S_ERROR)
                   2253:                ahci_issue_pending_commands(ccb->ccb_port,
                   2254:                    xa->flags & ATA_F_NCQ);
                   2255:
                   2256:        ahci_unload_prdt(ccb);
                   2257:
                   2258:        if (xa->state == ATA_S_ONCHIP)
                   2259:                xa->state = ATA_S_COMPLETE;
                   2260: #ifdef DIAGNOSTIC
                   2261:        else if (xa->state != ATA_S_ERROR && xa->state != ATA_S_TIMEOUT)
                   2262:                printf("%s: invalid ata_xfer state %02x in ahci_ata_cmd_done, "
                   2263:                    "slot %d\n", PORTNAME(ccb->ccb_port), xa->state,
                   2264:                    ccb->ccb_slot);
                   2265: #endif
                   2266:        if (xa->state != ATA_S_TIMEOUT)
                   2267:                xa->complete(xa);
                   2268: }
                   2269:
                   2270: void
                   2271: ahci_ata_cmd_timeout(void *arg)
                   2272: {
                   2273:        struct ahci_ccb                 *ccb = arg;
                   2274:        struct ata_xfer                 *xa = &ccb->ccb_xa;
                   2275:        struct ahci_port                *ap = ccb->ccb_port;
                   2276:        int                             s, ccb_was_started, ncq_cmd;
                   2277:        volatile u_int32_t              *active;
                   2278:
                   2279:        s = splbio();
                   2280:
                   2281:        ncq_cmd = (xa->flags & ATA_F_NCQ);
                   2282:        active = ncq_cmd ? &ap->ap_sactive : &ap->ap_active;
                   2283:
                   2284:        if (ccb->ccb_xa.state == ATA_S_PENDING) {
                   2285:                DPRINTF(AHCI_D_TIMEOUT, "%s: command for slot %d timed out "
                   2286:                    "before it got on chip\n", PORTNAME(ap), ccb->ccb_slot);
                   2287:                TAILQ_REMOVE(&ap->ap_ccb_pending, ccb, ccb_entry);
                   2288:                ccb_was_started = 0;
                   2289:        } else if (ccb->ccb_xa.state == ATA_S_ONCHIP && ahci_port_intr(ap,
                   2290:            1 << ccb->ccb_slot)) {
                   2291:                DPRINTF(AHCI_D_TIMEOUT, "%s: final poll of port completed "
                   2292:                    "command in slot %d\n", PORTNAME(ap), ccb->ccb_slot);
                   2293:                goto ret;
                   2294:        } else if (ccb->ccb_xa.state != ATA_S_ONCHIP) {
                   2295:                DPRINTF(AHCI_D_TIMEOUT, "%s: command slot %d already "
                   2296:                    "handled%s\n", PORTNAME(ap), ccb->ccb_slot,
                   2297:                    ISSET(*active, 1 << ccb->ccb_slot) ?
                   2298:                    " but slot is still active?" : ".");
                   2299:                goto ret;
                   2300:        } else if (!ISSET(ahci_pread(ap, ncq_cmd ? AHCI_PREG_SACT :
                   2301:            AHCI_PREG_CI), 1 << ccb->ccb_slot) && ISSET(*active,
                   2302:            1 << ccb->ccb_slot)) {
                   2303:                DPRINTF(AHCI_D_TIMEOUT, "%s: command slot %d completed but "
                   2304:                    "IRQ handler didn't detect it.  Why?\n", PORTNAME(ap),
                   2305:                    ccb->ccb_slot);
                   2306:                *active &= ~(1 << ccb->ccb_slot);
                   2307:                ccb->ccb_done(ccb);
                   2308:                goto ret;
                   2309:        } else {
                   2310:                ccb_was_started = 1;
                   2311:        }
                   2312:
                   2313:        /* Complete the slot with a timeout error. */
                   2314:        ccb->ccb_xa.state = ATA_S_TIMEOUT;
                   2315:        *active &= ~(1 << ccb->ccb_slot);
                   2316:        DPRINTF(AHCI_D_TIMEOUT, "%s: run completion (1)\n", PORTNAME(ap));
                   2317:        ccb->ccb_done(ccb);     /* This won't issue pending commands or run the
                   2318:                                   atascsi completion. */
                   2319:
                   2320:        /* Reset port to abort running command. */
                   2321:        if (ccb_was_started) {
                   2322:                DPRINTF(AHCI_D_TIMEOUT, "%s: resetting port to abort%s command "
                   2323:                    "in slot %d, active %08x\n", PORTNAME(ap), ncq_cmd ? " NCQ"
                   2324:                    : "", ccb->ccb_slot, *active);
                   2325:                if (ahci_port_softreset(ap) != 0 && ahci_port_portreset(ap)
                   2326:                    != 0) {
                   2327:                        printf("%s: failed to reset port during timeout "
                   2328:                            "handling, disabling it\n", PORTNAME(ap));
                   2329:                        ap->ap_state = AP_S_FATAL_ERROR;
                   2330:                }
                   2331:
                   2332:                /* Restart any other commands that were aborted by the reset. */
                   2333:                if (*active) {
                   2334:                        DPRINTF(AHCI_D_TIMEOUT, "%s: re-enabling%s slots "
                   2335:                            "%08x\n", PORTNAME(ap), ncq_cmd ? " NCQ" : "",
                   2336:                            *active);
                   2337:                        if (ncq_cmd)
                   2338:                                ahci_pwrite(ap, AHCI_PREG_SACT, *active);
                   2339:                        ahci_pwrite(ap, AHCI_PREG_CI, *active);
                   2340:                }
                   2341:        }
                   2342:
                   2343:        /* Issue any pending commands now. */
                   2344:        DPRINTF(AHCI_D_TIMEOUT, "%s: issue pending\n", PORTNAME(ap));
                   2345:        if (ccb_was_started)
                   2346:                ahci_issue_pending_commands(ap, ncq_cmd);
                   2347:        else if (ap->ap_active == 0)
                   2348:                ahci_issue_pending_ncq_commands(ap);
                   2349:
                   2350:        /* Complete the timed out ata_xfer I/O (may generate new I/O). */
                   2351:        DPRINTF(AHCI_D_TIMEOUT, "%s: run completion (2)\n", PORTNAME(ap));
                   2352:        xa->complete(xa);
                   2353:
                   2354:        DPRINTF(AHCI_D_TIMEOUT, "%s: splx\n", PORTNAME(ap));
                   2355: ret:
                   2356:        splx(s);
                   2357: }
                   2358:
                   2359: void
                   2360: ahci_empty_done(struct ahci_ccb *ccb)
                   2361: {
                   2362:        ccb->ccb_xa.state = ATA_S_COMPLETE;
                   2363: }

CVSweb