507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * CDDL HEADER START
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf *
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * The contents of this file are subject to the terms of the
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Common Development and Distribution License (the "License").
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * You may not use this file except in compliance with the License.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf *
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * or http://www.opensolaris.org/os/licensing.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * See the License for the specific language governing permissions
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * and limitations under the License.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf *
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * When distributing Covered Code, include this CDDL HEADER in each
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * If applicable, add the following below this CDDL HEADER, with the
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * fields enclosed by brackets "[]" replaced with your own identifying
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * information: Portions Copyright [yyyy] [name of copyright owner]
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf *
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * CDDL HEADER END
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
0f1b305ee9e700c825d9e9ad1ea1e4311d212eb2Seth Goldberg * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Use is subject to license terms.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#ifndef _ATA_COMMON_H
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define _ATA_COMMON_H
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#ifdef __cplusplus
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfextern "C" {
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#endif
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#include <sys/varargs.h>
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#include <sys/scsi/scsi.h>
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#include <sys/dktp/dadkio.h>
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#include <sys/dktp/dadev.h>
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#include <sys/dkio.h>
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#include <sys/dktp/tgdk.h>
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#include <sys/ddi.h>
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#include <sys/sunddi.h>
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#include "ghd.h"
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#include "pciide.h"
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#include "ata_cmd.h"
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#include "ata_fsm.h"
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#include "ata_debug.h"
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * device types
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATA_DEV_NONE 0
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATA_DEV_DISK 1
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATA_DEV_ATAPI 2
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Largest sector allowed in 28 bit mode
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define MAX_28BIT_CAPACITY 0xfffffff
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
0f2c99a46e005b1add7df43157ee8516e585157ayt/*
0f2c99a46e005b1add7df43157ee8516e585157ayt * Largest sector count allowed for device firmware file in one command.
0f2c99a46e005b1add7df43157ee8516e585157ayt */
0f2c99a46e005b1add7df43157ee8516e585157ayt#define MAX_FWFILE_SIZE_ONECMD 0xffff
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * ata-options property configuration bits
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATA_OPTIONS_DMA 0x01
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
0f2c99a46e005b1add7df43157ee8516e585157ayt#define ATAPRT(fmt) ghd_err fmt
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* ad_flags (per-drive) */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AD_ATAPI 0x01 /* is an ATAPI drive */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AD_DISK 0x02
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AD_MUTEX_INIT 0x04
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AD_NO_CDB_INTR 0x20
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AD_1SECTOR 0x40
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AD_INT13LBA 0x80 /* supports LBA at Int13 interface */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AD_NORVRT 0x100 /* block revert-to-defaults */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AD_EXT48 0x200 /* 48 bit (extended) LBA */
8c112d45d87338e20826001e18cb9e22e5187658Colin Yi#define AD_BLLBA48 0x400
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAPIDRV(X) ((X)->ad_flags & AD_ATAPI)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* max targets and luns */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATA_MAXTARG 2
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATA_MAXLUN 16
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * PCI-IDE Bus Mastering Scatter/Gather list size
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATA_DMA_NSEGS 17 /* enough for at least 64K */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Controller port address defaults
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATA_BASE0 0x1f0
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATA_BASE1 0x170
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * port offsets from base address ioaddr1
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AT_DATA 0x00 /* data register */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AT_ERROR 0x01 /* error register (read) */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AT_FEATURE 0x01 /* features (write) */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AT_COUNT 0x02 /* sector count */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AT_SECT 0x03 /* sector number */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AT_LCYL 0x04 /* cylinder low byte */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AT_HCYL 0x05 /* cylinder high byte */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AT_DRVHD 0x06 /* drive/head register */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AT_STATUS 0x07 /* status/command register */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AT_CMD 0x07 /* status/command register */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * port offsets from base address ioaddr2
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AT_ALTSTATUS 0x00 /* alternate status (read) */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AT_DEVCTL 0x00 /* device control (write) */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* Device control register */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATDC_NIEN 0x02 /* disable interrupts */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATDC_SRST 0x04 /* controller reset */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATDC_D3 0x08 /* Mysterious bit, must be set */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * ATA-6 spec
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * In 48-bit addressing, reading the LBA location and count
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * registers when the high-order bit is set reads the "previous
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * content" (LBA bits 47:24, count bits 15:8) instead of the
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * "most recent" values (LBA bits 23:0, count bits 7:0).
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATDC_HOB 0x80 /* High order bit */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Status bits from AT_STATUS register
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATS_BSY 0x80 /* controller busy */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATS_DRDY 0x40 /* drive ready */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATS_DF 0x20 /* device fault */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATS_DSC 0x10 /* seek operation complete */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATS_DRQ 0x08 /* data request */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATS_CORR 0x04 /* ECC correction applied */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATS_IDX 0x02 /* disk revolution index */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATS_ERR 0x01 /* error flag */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Status bits from AT_ERROR register
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATE_BBK_ICRC 0x80 /* bad block detected in ATA-1 */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* ICRC error in ATA-4 and newer */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATE_UNC 0x40 /* uncorrectable data error */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATE_MC 0x20 /* Media change */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATE_IDNF 0x10 /* ID not found */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATE_MCR 0x08 /* media change request */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATE_ABORT 0x04 /* aborted command */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATE_TKONF 0x02 /* track 0 not found */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATE_AMNF 0x01 /* address mark not found */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATE_NM 0x02 /* no media */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Drive selectors for AT_DRVHD register
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATDH_LBA 0x40 /* addressing in LBA mode not chs */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATDH_DRIVE0 0xa0 /* or into AT_DRVHD to select drive 0 */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATDH_DRIVE1 0xb0 /* or into AT_DRVHD to select drive 1 */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Feature register bits
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATF_ATAPI_DMA 0x01 /* ATAPI DMA enable bit */
c8531848467a8747b65b91ab83c4b57f4c000848yt#define ATF_XFRMOD_MDMA 0x20 /* Multi-Word DMA mode */
2df1fe9ca32bb227b9158c67f5c00b54c20b10fdrandyf#define ATF_XFRMOD_UDMA 0x40 /* Ultra DMA mode */
2df1fe9ca32bb227b9158c67f5c00b54c20b10fdrandyf#define ATACM_UDMA_SEL(id) (((id)->ai_ultradma >> 8) & 0x7f)
2df1fe9ca32bb227b9158c67f5c00b54c20b10fdrandyf
2df1fe9ca32bb227b9158c67f5c00b54c20b10fdrandyf/*
2df1fe9ca32bb227b9158c67f5c00b54c20b10fdrandyf * Set feature register definitions.
2df1fe9ca32bb227b9158c67f5c00b54c20b10fdrandyf */
2df1fe9ca32bb227b9158c67f5c00b54c20b10fdrandyf#define ATSF_SET_XFRMOD 0X03 /* Set transfer mode */
2df1fe9ca32bb227b9158c67f5c00b54c20b10fdrandyf#define ATSF_DIS_REVPOD 0x66 /* Disable reverting to power on defaults */
2df1fe9ca32bb227b9158c67f5c00b54c20b10fdrandyf#define ATSF_ENA_REVPOD 0xcc /* Enable reverting to power on defaults */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * common bits and options for set features (ATC_SET_FEAT)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define FC_WRITE_CACHE_ON 0x02
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define FC_WRITE_CACHE_OFF 0x82
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* Test which version of ATA is supported */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define IS_ATA_VERSION_SUPPORTED(idp, n) \
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ((idp->ai_majorversion != 0xffff) && \
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf (idp->ai_majorversion & (1<<n)))
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* Test if supported version >= ATA-n */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define IS_ATA_VERSION_GE(idp, n) \
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ((idp->ai_majorversion != 0xffff) && \
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf (idp->ai_majorversion != 0) && \
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf (idp->ai_majorversion >= (1<<n)))
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* Test whether a device is a CD drive */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define IS_CDROM(dp) \
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ((dp->ad_flags & AD_ATAPI) && \
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ((dp->ad_id.ai_config >> 8) & DTYPE_MASK) == \
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf DTYPE_RODIRECT)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
3a7782fe8269426104107f8b4144794a995733f0xun ni - Sun Microsystems - Beijing China/* Test whether the device support write cache */
3a7782fe8269426104107f8b4144794a995733f0xun ni - Sun Microsystems - Beijing China#define IS_WRITE_CACHE_SUPPORTED(x) \
3a7782fe8269426104107f8b4144794a995733f0xun ni - Sun Microsystems - Beijing China ((((x).ai_cmdset82) & 0x20) >> 5)
3a7782fe8269426104107f8b4144794a995733f0xun ni - Sun Microsystems - Beijing China
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* macros from old common hba code */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATA_INTPROP(devi, pname, pval, plen) \
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf (ddi_prop_op(DDI_DEV_T_ANY, (devi), PROP_LEN_AND_VAL_BUF, \
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf DDI_PROP_DONTPASS, (pname), (caddr_t)(pval), (plen)))
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATA_LONGPROP(devi, pname, pval, plen) \
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf (ddi_getlongprop(DDI_DEV_T_ANY, (devi), DDI_PROP_DONTPASS, \
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf (pname), (caddr_t)(pval), (plen)))
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf *
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * per-controller soft-state data structure
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf *
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define CTL2DRV(cp, t, l) (cp->ac_drvp[t][l])
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlftypedef struct ata_ctl {
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf dev_info_t *ac_dip;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uint_t ac_flags;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uint_t ac_timing_flags;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf struct ata_drv *ac_drvp[ATA_MAXTARG][ATA_MAXLUN];
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf int ac_max_transfer; /* max transfer in sectors */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uint_t ac_standby_time; /* timer value seconds */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ccc_t ac_ccc; /* for GHD module */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf struct ata_drv *ac_active_drvp; /* active drive, if any */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf struct ata_pkt *ac_active_pktp; /* active packet, if any */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ac_state;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf scsi_hba_tran_t *ac_atapi_tran; /* for atapi module */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * port addresses associated with ioaddr1
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ddi_acc_handle_t ac_iohandle1; /* DDI I/O handle */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf caddr_t ac_ioaddr1;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t *ac_data; /* data register */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t *ac_error; /* error register (read) */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t *ac_feature; /* features (write) */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t *ac_count; /* sector count */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t *ac_sect; /* sector number */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t *ac_lcyl; /* cylinder low byte */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t *ac_hcyl; /* cylinder high byte */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t *ac_drvhd; /* drive/head register */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t *ac_status; /* status/command register */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t *ac_cmd; /* status/command register */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * port addresses associated with ioaddr2
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ddi_acc_handle_t ac_iohandle2; /* DDI I/O handle */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf caddr_t ac_ioaddr2;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t *ac_altstatus; /* alternate status (read) */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t *ac_devctl; /* device control (write) */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * handle and port addresss for PCI-IDE Bus Master controller
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ddi_acc_handle_t ac_bmhandle; /* DDI I/O handle */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf caddr_t ac_bmaddr; /* base addr of Bus Master Regs */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ac_pciide; /* PCI-IDE device */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ac_pciide_bm; /* Bus Mastering PCI-IDE device */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Scatter/Gather list for PCI-IDE Bus Mastering controllers
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf caddr_t ac_sg_list; /* virtual addr of S/G list */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf paddr_t ac_sg_paddr; /* phys addr of S/G list */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ddi_acc_handle_t ac_sg_acc_handle;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ddi_dma_handle_t ac_sg_handle;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * data for managing ARQ on ATAPI devices
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf struct ata_pkt *ac_arq_pktp; /* pkt for performing ATAPI ARQ */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf struct ata_pkt *ac_fault_pktp; /* pkt that caused ARQ */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ac_arq_cdb[6];
2df1fe9ca32bb227b9158c67f5c00b54c20b10fdrandyf
2df1fe9ca32bb227b9158c67f5c00b54c20b10fdrandyf /*
2df1fe9ca32bb227b9158c67f5c00b54c20b10fdrandyf * Power Management
2df1fe9ca32bb227b9158c67f5c00b54c20b10fdrandyf */
2df1fe9ca32bb227b9158c67f5c00b54c20b10fdrandyf int ac_pm_support;
2df1fe9ca32bb227b9158c67f5c00b54c20b10fdrandyf int ac_pm_level;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf} ata_ctl_t;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* ac_flags (per-controller) */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AC_GHD_INIT 0x02
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AC_ATAPI_INIT 0x04
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AC_DISK_INIT 0x08
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AC_ATTACHED 0x10
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AC_SCSI_HBA_TRAN_ALLOC 0x1000
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AC_SCSI_HBA_ATTACH 0x2000
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AC_BMSTATREG_PIO_BROKEN 0x80000000
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Bug 1256489:
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf *
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * If AC_BSY_WAIT needs to be set for laptops that do
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * suspend/resume but do not correctly wait for the busy bit to
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * drop after a resume.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* ac_timing_flags (per-controller) */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AC_BSY_WAIT 0x1 /* tweak timing in ata_start & atapi_start */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* Identify drive data */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfstruct ata_id {
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* WORD */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* OFFSET COMMENT */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_config; /* 0 general configuration bits */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_fixcyls; /* 1 # of fixed cylinders */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_resv0; /* 2 # reserved */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_heads; /* 3 # of heads */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_trksiz; /* 4 # of unformatted bytes/track */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_secsiz; /* 5 # of unformatted bytes/sector */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_sectors; /* 6 # of sectors/track */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_resv1[3]; /* 7 "Vendor Unique" */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf char ai_drvser[20]; /* 10 Serial number */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_buftype; /* 20 Buffer type */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_bufsz; /* 21 Buffer size in 512 byte incr */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_ecc; /* 22 # of ecc bytes avail on rd/wr */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf char ai_fw[8]; /* 23 Firmware revision */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf char ai_model[40]; /* 27 Model # */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_mult1; /* 47 Multiple command flags */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_dwcap; /* 48 Doubleword capabilities */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_cap; /* 49 Capabilities */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_resv2; /* 50 Reserved */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_piomode; /* 51 PIO timing mode */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_dmamode; /* 52 DMA timing mode */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_validinfo; /* 53 bit0: wds 54-58, bit1: 64-70 */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_curcyls; /* 54 # of current cylinders */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_curheads; /* 55 # of current heads */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_cursectrk; /* 56 # of current sectors/track */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_cursccp[2]; /* 57 current sectors capacity */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_mult2; /* 59 multiple sectors info */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_addrsec[2]; /* 60 LBA only: no of addr secs */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_sworddma; /* 62 single word dma modes */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_dworddma; /* 63 double word dma modes */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_advpiomode; /* 64 advanced PIO modes supported */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_minmwdma; /* 65 min multi-word dma cycle info */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_recmwdma; /* 66 rec multi-word dma cycle info */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_minpio; /* 67 min PIO cycle info */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_minpioflow; /* 68 min PIO cycle info w/flow ctl */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_resv3[2]; /* 69,70 reserved */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_resv4[4]; /* 71-74 reserved */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_qdepth; /* 75 queue depth */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_resv5[4]; /* 76-79 reserved */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_majorversion; /* 80 major versions supported */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_minorversion; /* 81 minor version number supported */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_cmdset82; /* 82 command set supported */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_cmdset83; /* 83 more command sets supported */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_cmdset84; /* 84 more command sets supported */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_features85; /* 85 enabled features */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_features86; /* 86 enabled features */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_features87; /* 87 enabled features */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_ultradma; /* 88 Ultra DMA mode */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_erasetime; /* 89 security erase time */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_erasetimex; /* 90 enhanced security erase time */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_padding1[9]; /* pad through 99 */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_addrsecxt[4]; /* 100 extended max LBA sector */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_padding2[22]; /* pad to 126 */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_lastlun; /* 126 last LUN, as per SFF-8070i */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_resv6; /* 127 reserved */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_securestatus; /* 128 security status */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_vendor[31]; /* 129-159 vendor specific */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_padding3[16]; /* 160 pad to 176 */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_curmedser[30]; /* 176-205 current media serial number */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_padding4[49]; /* 206 pad to 255 */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ai_integrity; /* 255 integrity word */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf};
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* Identify Drive: general config bits - word 0 */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATA_ID_REM_DRV 0x80
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATA_ID_COMPACT_FLASH 0x848a
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATA_ID_CF_TO_ATA 0x040a
0f2c99a46e005b1add7df43157ee8516e585157ayt#define ATA_ID_INCMPT 0x0004
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* Identify Drive: common capability bits - word 49 */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_DMA_SUPPORT 0x0100
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_LBA_SUPPORT 0x0200
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_IORDY_DISABLE 0x0400
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_IORDY_SUPPORT 0x0800
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_RESERVED_IDPKT 0x1000 /* rsrvd for identify pkt dev */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_STANDBYTIMER 0x2000
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_ATA_TYPE_MASK 0x8001
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_ATA_TYPE 0x0000
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_ATAPI_TYPE_MASK 0xc000
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_ATAPI_TYPE 0x8000
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* Identify Driver ai_validinfo (word 53) */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_VALIDINFO_83 0x0004 /* word 83 supported fields valid */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_VALIDINFO_70_64 0x0002 /* word 70:64 sup. fields valid */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* Identify Drive: ai_dworddma (word 63) */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
c8531848467a8747b65b91ab83c4b57f4c000848yt#define ATAC_MDMA_SUP_MASK 0x0007 /* Multiword DMA supported */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_MDMA_SEL_MASK 0x0700 /* Multiword DMA selected */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_MDMA_2_SEL 0x0400 /* Multiword DMA mode 2 selected */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_MDMA_1_SEL 0x0200 /* Multiword DMA mode 1 selected */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_MDMA_0_SEL 0x0100 /* Multiword DMA mode 0 selected */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_MDMA_2_SUP 0x0004 /* Multiword DMA mode 2 supported */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_MDMA_1_SUP 0x0002 /* Multiword DMA mode 1 supported */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_MDMA_0_SUP 0x0001 /* Multiword DMA mode 0 supported */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* Identify Drive: ai_advpiomode (word 64) */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_ADVPIO_4_SUP 0x0002 /* PIO mode 4 supported */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_ADVPIO_3_SUP 0x0001 /* PIO mode 3 supported */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_ADVPIO_SERIAL 0x0003 /* Serial interface */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* Identify Drive: ai_majorversion (word 80) */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
0f2c99a46e005b1add7df43157ee8516e585157ayt#define ATAC_MAJVER_8 0x0100 /* ATA/ATAPI-8 version supported */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_MAJVER_6 0x0040 /* ATA/ATAPI-6 version supported */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_MAJVER_4 0x0010 /* ATA/ATAPI-4 version supported */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* Identify Drive: command set supported/enabled bits - words 83 and 86 */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATACS_EXT48 0x0400 /* 48 bit address feature */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* Identify Drive: ai_features85 (word 85) */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define ATAC_FEATURES85_WCE 0x0020 /* write cache enabled */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
c8531848467a8747b65b91ab83c4b57f4c000848yt/* Identify Drive: ai_ultradma (word 88) */
c8531848467a8747b65b91ab83c4b57f4c000848yt#define ATAC_UDMA_SUP_MASK 0x007f /* UDMA modes supported */
c8531848467a8747b65b91ab83c4b57f4c000848yt#define ATAC_UDMA_SEL_MASK 0x7f00 /* UDMA modes selected */
c8531848467a8747b65b91ab83c4b57f4c000848yt
c8531848467a8747b65b91ab83c4b57f4c000848yt
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* per-drive data struct */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlftypedef struct ata_drv {
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ata_ctl_t *ad_ctlp; /* pointer back to ctlr */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf struct ata_id ad_id; /* IDENTIFY DRIVE data */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uint_t ad_flags;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ad_pciide_dma; /* PCIIDE DMA supported */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ad_targ; /* target */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ad_lun; /* lun */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ad_drive_bits;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* Used by atapi side only */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ad_state; /* state of ATAPI FSM */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ad_cdb_len; /* Size of ATAPI CDBs */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ad_bogus_drq;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ad_nec_bad_status;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* Used by disk side only */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
602ca9ea8f9ce0933f0944601cc5d230e91a950dcth struct scsi_device *ad_device;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf struct scsi_inquiry ad_inquiry;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf struct ctl_obj ad_ctl_obj;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ad_rd_cmd;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ad_wr_cmd;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ad_acyl;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Geometry note: The following three values are the geometry
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * that the driver will use. They may differ from the
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * geometry reported by the controller and/or BIOS. See note
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * on ata_fix_large_disk_geometry in ata_disk.c for more
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * details.
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uint32_t ad_drvrcyl; /* number of cyls */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uint32_t ad_drvrhd; /* number of heads */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uint32_t ad_drvrsec; /* number of sectors */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ad_phhd; /* number of phys heads */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ad_phsec; /* number of phys sectors */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf short ad_block_factor;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf short ad_bytes_per_block;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * Support for 48-bit LBA (ATA-6)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uint64_t ad_capacity; /* Total sectors on disk */
8c97a06b88a7f040b7d72941ca32323bb75cfec7Ada
8c97a06b88a7f040b7d72941ca32323bb75cfec7Ada /*
8c97a06b88a7f040b7d72941ca32323bb75cfec7Ada * save/restore the DMA mode for suspend/resume
8c97a06b88a7f040b7d72941ca32323bb75cfec7Ada */
8c97a06b88a7f040b7d72941ca32323bb75cfec7Ada ushort_t ad_dma_cap;
8c97a06b88a7f040b7d72941ca32323bb75cfec7Ada ushort_t ad_dma_mode;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf} ata_drv_t;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
8c97a06b88a7f040b7d72941ca32323bb75cfec7Ada/* values for ad_dma_cap */
8c97a06b88a7f040b7d72941ca32323bb75cfec7Ada#define ATA_DMA_ULTRAMODE 0x1
8c97a06b88a7f040b7d72941ca32323bb75cfec7Ada#define ATA_DMA_MWORDMODE 0x2
8c97a06b88a7f040b7d72941ca32323bb75cfec7Ada
507c32411f3f101e90ca2120f042b5ee698ba1d5mlftypedef struct ata_tgt {
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ata_drv_t *at_drvp;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf int at_arq;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ulong_t at_total_sectors;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ddi_dma_attr_t at_dma_attr;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf} ata_tgt_t;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/* values for ad_pciide_dma */
5fb86bae323519d98a63f5829df4b849f1fe1598ml#define ATA_DMA_OFF 0x0
5fb86bae323519d98a63f5829df4b849f1fe1598ml#define ATA_DMA_ON 0x1
5fb86bae323519d98a63f5829df4b849f1fe1598ml#define ATA_DMA_UNINITIALIZED 0x2
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * (ata_pkt_t *) to (gcmd_t *)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define APKT2GCMD(apktp) (apktp->ap_gcmdp)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * (gcmd_t *) to (ata_pkt_t *)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define GCMD2APKT(gcmdp) ((ata_pkt_t *)gcmdp->cmd_private)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * (gtgt_t *) to (ata_ctl_t *)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define GTGTP2ATAP(gtgtp) ((ata_ctl_t *)GTGTP2HBA(gtgtp))
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * (gtgt_t *) to (ata_tgt_t *)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define GTGTP2ATATGTP(gtgtp) ((ata_tgt_t *)GTGTP2TARGET(gtgtp))
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * (gtgt_t *) to (ata_drv_t *)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define GTGTP2ATADRVP(gtgtp) (GTGTP2ATATGTP(gtgtp)->at_drvp)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * (gcmd_t *) to (ata_tgt_t *)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define GCMD2TGT(gcmdp) GTGTP2ATATGTP(GCMDP2GTGTP(gcmdp))
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * (gcmd_t *) to (ata_drv_t *)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define GCMD2DRV(gcmdp) GTGTP2ATADRVP(GCMDP2GTGTP(gcmdp))
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * (ata_pkt_t *) to (ata_drv_t *)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define APKT2DRV(apktp) GCMD2DRV(APKT2GCMD(apktp))
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * (struct hba_tran *) to (ata_ctl_t *)
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define TRAN2ATAP(tranp) ((ata_ctl_t *)TRAN2HBA(tranp))
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * ata common packet structure
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlftypedef struct ata_pkt {
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf gcmd_t *ap_gcmdp; /* GHD command struct */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uint_t ap_flags; /* packet flags */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf caddr_t ap_baddr; /* I/O buffer base address */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf size_t ap_boffset; /* current offset into I/O buffer */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf size_t ap_bcount; /* # bytes in this request */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf caddr_t ap_v_addr; /* I/O buffer address */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf size_t ap_resid; /* # bytes left to read/write */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ap_pciide_dma; /* This pkt uses DMA transfer mode */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf prde_t ap_sg_list[ATA_DMA_NSEGS]; /* Scatter/Gather list */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf int ap_sg_cnt; /* number of entries in S/G list */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* command, starting sector number, sector count */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf daddr_t ap_startsec; /* starting sector number */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ushort_t ap_count; /* sector count */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ap_sec;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ap_lwcyl;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ap_hicyl;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ap_hd;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ap_cmd;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* saved status and error registers for error case */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ap_status;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ap_error;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* disk/atapi callback routines */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf int (*ap_start)(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf struct ata_pkt *ata_pktp);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf int (*ap_intr)(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf struct ata_pkt *ata_pktp);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf void (*ap_complete)(ata_drv_t *ata_drvp,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf struct ata_pkt *ata_pktp, int do_callback);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* Used by disk side */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf char ap_cdb; /* disk command */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf char ap_scb; /* status after disk cmd */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uint_t ap_bytes_per_block; /* blk mode factor */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uint_t ap_wrt_count; /* size of last write */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf caddr_t ap_v_addr_sav; /* Original I/O buffer address. */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf size_t ap_resid_sav; /* Original # of bytes */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* left to read/write. */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf /* Used by atapi side */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t *ap_cdbp; /* ptr to SCSI CDB */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ap_cdb_len; /* length of SCSI CDB (in bytes) */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ap_cdb_pad; /* padding after SCSI CDB (in shorts) */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf struct scsi_arq_status *ap_scbp; /* ptr to SCSI status block */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t ap_statuslen; /* length of SCSI status block */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf} ata_pkt_t;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * defines for ap_flags
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AP_ATAPI 0x0001 /* device is atapi */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AP_ERROR 0x0002 /* normal error */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AP_TRAN_ERROR 0x0004 /* transport error */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AP_READ 0x0008 /* read data */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AP_WRITE 0x0010 /* write data */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AP_ABORT 0x0020 /* packet aborted */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AP_TIMEOUT 0x0040 /* packet timed out */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AP_BUS_RESET 0x0080 /* bus reset */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AP_DEV_RESET 0x0100 /* device reset */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AP_SENT_CMD 0x0200 /* atapi: cdb sent */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AP_XFERRED_DATA 0x0400 /* atapi: data transferred */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AP_GOT_STATUS 0x0800 /* atapi: status received */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AP_ARQ_ON_ERROR 0x1000 /* atapi: do ARQ on error */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AP_ARQ_OKAY 0x2000
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AP_ARQ_ERROR 0x4000
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#define AP_FREE 0x80000000u /* packet is free! */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * public function prototypes
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfint ata_check_drive_blacklist(struct ata_id *aidp, uint_t flags);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfint ata_command(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp, int expect_drdy,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf int silent, uint_t busy_wait, uchar_t cmd, uchar_t feature,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t count, uchar_t sector, uchar_t head, uchar_t cyl_low,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t cyl_hi);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfint ata_get_status_clear_intr(ata_ctl_t *ata_ctlp, ata_pkt_t *ata_pktp);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfint ata_id_common(uchar_t id_cmd, int drdy_expected,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ddi_acc_handle_t io_hdl1, caddr_t ioaddr1,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf ddi_acc_handle_t io_hdl2, caddr_t ioaddr2,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf struct ata_id *ata_idp);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfint ata_prop_create(dev_info_t *tgt_dip, ata_drv_t *ata_drvp, char *name);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfint ata_queue_cmd(int (*func)(ata_ctl_t *, ata_drv_t *, ata_pkt_t *),
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf void *arg, ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf gtgt_t *gtgtp);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfint ata_set_feature(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t feature, uchar_t value);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfint ata_wait(ddi_acc_handle_t io_hdl, caddr_t ioaddr, uchar_t onbits,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t offbits, uint_t timeout_usec);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfint ata_wait3(ddi_acc_handle_t io_hdl, caddr_t ioaddr, uchar_t onbits1,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t offbits1, uchar_t failure_onbits2,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t failure_offbits2, uchar_t failure_onbits3,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf uchar_t failure_offbits3, uint_t timeout_usec);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfint ata_test_lba_support(struct ata_id *aidp);
9f49ae270d37efd5c5270cb8046b4229b5380021mlfvoid ata_nsecwait(clock_t count);
c8531848467a8747b65b91ab83c4b57f4c000848ytint ata_set_dma_mode(ata_ctl_t *ata_ctlp, ata_drv_t *ata_drvp);
0f1b305ee9e700c825d9e9ad1ea1e4311d212eb2Seth Goldbergvoid ata_reset_dma_mode(ata_drv_t *ata_drvp);
fe072f421ec51952432306add7d50852ad1921b2Adavoid atapi_reset_dma_mode(ata_drv_t *ata_drvp, int need_wait);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf/*
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf * PCIIDE DMA (Bus Mastering) functions and data in ata_dma.c
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf */
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfextern ddi_dma_attr_t ata_pciide_dma_attr;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfextern int ata_dma_disabled;
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfint ata_pciide_alloc(dev_info_t *dip, ata_ctl_t *ata_ctlp);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfvoid ata_pciide_free(ata_ctl_t *ata_ctlp);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfvoid ata_pciide_dma_sg_func(gcmd_t *gcmdp, ddi_dma_cookie_t *dmackp,
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf int single_segment, int seg_index);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfvoid ata_pciide_dma_setup(ata_ctl_t *ata_ctlp, prde_t *srcp, int sg_cnt);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfvoid ata_pciide_dma_start(ata_ctl_t *ata_ctlp, uchar_t direction);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfvoid ata_pciide_dma_stop(ata_ctl_t *ata_ctlp);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfint ata_pciide_status_clear(ata_ctl_t *ata_ctlp);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfint ata_pciide_status_dmacheck_clear(ata_ctl_t *ata_ctlp);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlfint ata_pciide_status_pending(ata_ctl_t *ata_ctlp);
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#ifdef __cplusplus
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf}
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#endif
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf
507c32411f3f101e90ca2120f042b5ee698ba1d5mlf#endif /* _ATA_COMMON_H */