sata_hba.h revision b5fc475bca6525d8da80728128eefb7100aaf66b
1N/A/*
1N/A * CDDL HEADER START
1N/A *
1N/A * The contents of this file are subject to the terms of the
1N/A * Common Development and Distribution License (the "License").
1N/A * You may not use this file except in compliance with the License.
1N/A *
1N/A * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1N/A * or http://www.opensolaris.org/os/licensing.
1N/A * See the License for the specific language governing permissions
1N/A * and limitations under the License.
1N/A *
1N/A * When distributing Covered Code, include this CDDL HEADER in each
1N/A * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1N/A * If applicable, add the following below this CDDL HEADER, with the
1N/A * fields enclosed by brackets "[]" replaced with your own identifying
1N/A * information: Portions Copyright [yyyy] [name of copyright owner]
1N/A *
1N/A * CDDL HEADER END
1N/A */
1N/A
1N/A/*
1N/A * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
1N/A * Use is subject to license terms.
1N/A */
1N/A
1N/A#ifndef _SATA_HBA_H
1N/A#define _SATA_HBA_H
1N/A
1N/A#pragma ident "%Z%%M% %I% %E% SMI"
1N/A
1N/A#ifdef __cplusplus
1N/Aextern "C" {
1N/A#endif
1N/A
1N/A#include <sys/sata/sata_defs.h>
1N/A
1N/A/*
1N/A * SATA Host Bus Adapter (HBA) driver transport definitions
1N/A */
1N/A
1N/A#include <sys/types.h>
1N/A
1N/A#ifndef TRUE
1N/A#define TRUE 1
1N/A#define FALSE 0
1N/A#endif
1N/A
1N/A#define SATA_SUCCESS 0
1N/A#define SATA_RETRY 1
1N/A#define SATA_FAILURE -1
1N/A
1N/A
1N/A/* SATA Framework definitions */
1N/A
1N/A#define SATA_MAX_CPORTS 32 /* Max number of controller ports */
1N/A
1N/A /* Multiplier (PMult) */
1N/A#define SATA_MAX_PMPORTS 16 /* Maximum number of ports on PMult */
1N/A#define SATA_PMULT_HOSTPORT 0xf /* Port Multiplier host port number */
1N/A
1N/A
1N/A/*
1N/A * SATA device address
1N/A * Address qualifier flags are used to specify what is addressed (device
1N/A * or port) and where (controller or port multiplier data port).
1N/A */
1N/Astruct sata_address {
1N/A uint8_t cport; /* Controller's SATA port number */
1N/A uint8_t pmport; /* Port Multiplier SATA port number */
1N/A uint8_t qual; /* Address Qualifier flags */
1N/A uint8_t pad; /* Reserved */
1N/A};
1N/A
1N/Atypedef struct sata_address sata_address_t;
1N/A
1N/A/*
1N/A * SATA address Qualifier flags (in qual field of sata_address struct).
1N/A * They are mutually exclusive.
1N/A */
1N/A
1N/A#define SATA_ADDR_NULL 0x00 /* No address */
1N/A#define SATA_ADDR_DCPORT 0x01 /* Device attched to controller port */
1N/A#define SATA_ADDR_DPMPORT 0x02 /* Device attched to PM device port */
1N/A#define SATA_ADDR_CPORT 0x04 /* Controller's device port */
1N/A#define SATA_ADDR_PMPORT 0x08 /* Port Multiplier's device port */
1N/A#define SATA_ADDR_CNTRL 0x10 /* Controller */
1N/A#define SATA_ADDR_PMULT 0x20 /* Port Multiplier */
1N/A
1N/A/*
1N/A * SATA port status and control register block.
1N/A * The sstatus, serror, scontrol, sactive and snotific
1N/A * are the copies of the SATA port status and control registers.
1N/A * (Port SStatus, SError, SControl, SActive and SNotification are
1N/A * defined by Serial ATA r1.0a sepc and Serial ATA II spec.
1N/A */
1N/A
1N/Astruct sata_port_scr
1N/A{
1N/A uint32_t sstatus; /* Port SStatus register */
1N/A uint32_t serror; /* Port SError register */
1N/A uint32_t scontrol; /* Port SControl register */
1N/A uint32_t sactive; /* Port SActive register */
1N/A uint32_t snotific; /* Port SNotification register */
1N/A};
1N/A
1N/Atypedef struct sata_port_scr sata_port_scr_t;
1N/A
1N/A/*
1N/A * SATA Device Structure (rev 1)
1N/A * Used to request/return state of the controller, port, port multiplier
1N/A * or an attached drive:
1N/A * The satadev_addr.cport, satadev_addr.pmport and satadev_addr.qual
1N/A * fields are used to specify SATA address (see sata_address structure
1N/A * description).
1N/A * The satadev_scr structure is used to pass the content of a port
1N/A * status and control registers.
1N/A * The satadev_add_info field is used by SATA HBA driver to return an
1N/A * additional information, which type depends on the function using
1N/A * sata_device as argument. For example:
1N/A * - in case of sata_tran_probe_port() this field should contain
1N/A * a number of available Port Multiplier device ports;
1N/A * - in case of sata_hba_event_notify() this field may contain
1N/A * a value specific for a reported event.
1N/A */
1N/A#define SATA_DEVICE_REV_1 1
1N/A#define SATA_DEVICE_REV SATA_DEVICE_REV_1
1N/A
1N/Astruct sata_device
1N/A{
1N/A int satadev_rev; /* structure version */
1N/A struct sata_address satadev_addr; /* sata port/device address */
1N/A uint32_t satadev_state; /* Port or device state */
1N/A uint32_t satadev_type; /* Attached device type */
1N/A struct sata_port_scr satadev_scr; /* Port status and ctrl regs */
1N/A uint32_t satadev_add_info; /* additional information, */
1N/A /* function specific */
1N/A};
1N/A
1N/Atypedef struct sata_device sata_device_t;
1N/A
1N/A_NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_device))
1N/A
1N/A
1N/A/*
1N/A * satadev_state field of sata_device structure.
1N/A * Common flags specifying current state of a port or an attached drive.
1N/A * These states are mutually exclusive, obviously
1N/A */
1N/A#define SATA_STATE_UNKNOWN 0x000000
1N/A#define SATA_STATE_READY 0x000010
1N/A
1N/A/*
1N/A * Attached drive specific states (satadev_state field of the sata_device
1N/A * structure).
1N/A * SATA_DSTATE_PWR_ACTIVE, SATA_DSTATE_PWR_IDLE and SATA_DSTATE_PWR_STANDBY
1N/A * are mutually exclusive. All other states may be combined with each other
1N/A * and with one of the power states.
1N/A * These flags may be used only if the address qualifier (satadev_addr.qual) is
1N/A * set to SATA_ADDR_DCPORT or SATA_ADDR_DPMPORT value.
1N/A */
1N/A
1N/A#define SATA_DSTATE_PWR_ACTIVE 0x000100
1N/A#define SATA_DSTATE_PWR_IDLE 0x000200
1N/A#define SATA_DSTATE_PWR_STANDBY 0x000400
1N/A#define SATA_DSTATE_RESET 0x001000
1N/A#define SATA_DSTATE_FAILED 0x008000
1N/A
1N/A/* Mask for drive power states */
1N/A#define SATA_DSTATE_PWR (SATA_DSTATE_PWR_ACTIVE | \
1N/A SATA_DSTATE_PWR_IDLE | \
1N/A SATA_DSTATE_PWR_STANDBY)
1N/A/*
1N/A * SATA Port specific states (satadev_state field of sata_device structure).
1N/A * SATA_PSTATE_PWRON and SATA_PSTATE_PWROFF are mutually exclusive.
1N/A * All other states may be combined with each other and with one of the power
1N/A * level state.
1N/A * These flags may be used only if the address qualifier (satadev_addr.qual) is
1N/A * set to SATA_ADDR_CPORT or SATA_ADDR_PMPORT value.
1N/A */
1N/A
1N/A#define SATA_PSTATE_PWRON 0x010000
1N/A#define SATA_PSTATE_PWROFF 0X020000
1N/A#define SATA_PSTATE_SHUTDOWN 0x040000
1N/A#define SATA_PSTATE_FAILED 0x080000
1N/A
1N/A/* Mask for the valid port-specific state flags */
1N/A#define SATA_PSTATE_VALID (SATA_PSTATE_PWRON | \
1N/A SATA_PSTATE_PWROFF | \
1N/A SATA_PSTATE_SHUTDOWN | \
1N/A SATA_PSTATE_FAILED)
1N/A
1N/A/* Mask for a port power states */
1N/A#define SATA_PSTATE_PWR (SATA_PSTATE_PWRON | \
1N/A SATA_PSTATE_PWROFF)
1N/A/*
1N/A * Device type (in satadev_type field of sata_device structure).
1N/A * More device types may be added in the future.
1N/A */
1N/A
1N/A#define SATA_DTYPE_NONE 0x00 /* No device attached */
1N/A#define SATA_DTYPE_ATADISK 0x01 /* ATA Disk */
1N/A#define SATA_DTYPE_ATAPICD 0x02 /* Atapi CD/DVD device */
1N/A#define SATA_DTYPE_ATAPINONCD 0x03 /* Atapi non-CD/DVD device */
1N/A#define SATA_DTYPE_PMULT 0x10 /* Port Multiplier */
1N/A#define SATA_DTYPE_UNKNOWN 0x20 /* Device attached, unkown */
1N/A
1N/A
1N/A/*
1N/A * SATA cmd structure (rev 1)
1N/A *
1N/A * SATA HBA framework always sets all fields except status_reg and error_reg.
1N/A * SATA HBA driver action depends on the addressing type specified by
1N/A * addr_type field:
1N/A * If LBA48 addressing is indicated, SATA HBA driver has to load values from
1N/A * satacmd_sec_count_msb_reg, satacmd_lba_low_msb_reg,
1N/A * satacmd_lba_mid_msb_reg and satacmd_lba_hi_msb_reg
1N/A * to appropriate registers prior to loading other registers.
1N/A * For other addressing modes, SATA HBA driver should skip loading values
1N/A * from satacmd_sec_count_msb_reg, satacmd_lba_low_msb_reg,
1N/A * satacmd_lba_mid_msb_reg and satacmd_lba_hi_msb_reg
1N/A * fields and load only remaining field values to corresponding registers.
1N/A *
1N/A * satacmd_sec_count_msb and satamcd_sec_count_lsb values are loaded into
1N/A * sec_count register, satacmd_sec_count_msb loaded first (if LBA48
1N/A * addressing is used).
1N/A * satacmd_lba_low_msb and satacmd_lba_low_lsb values are loaded into the
1N/A * lba_low register, satacmd_lba_low_msb loaded first (if LBA48 addressing
1N/A * is used). The lba_low register is the newer name for the old
1N/A * sector_number register.
1N/A * satacmd_lba_mid_msb and satacmd_lba_mid_lsb values are loaded into lba_mid
1N/A * register, satacmd_lba_mid_msb loaded first (if LBA48 addressing is used).
1N/A * The lba_mid register is the newer name for the old cylinder_low register.
1N/A * satacmd_lba_high_msb and satacmd_lba_high_lsb values are loaded into
1N/A * the lba_high regster, satacmd_lba_high_msb loaded first (if LBA48
1N/A * addressing is used). The lba_high register is a newer name for the old
1N/A * cylinder_high register.
1N/A *
1N/A * No addressing mode is selected when an ata command does not involve actual
1N/A * reading/writing data from/to the media (for example IDENTIFY DEVICE or
1N/A * SET FEATURE command), or the ATAPI PACKET command is sent.
1N/A * If ATAPI PACKET command is sent and tagged commands are used,
1N/A * SATA HBA driver has to provide and manage a tag value and
1N/A * set it into the sector_count register.
1N/A *
1N/A * Device Control register is not specified in sata_cmd structure - SATA HBA
1N/A * driver shall set it accordingly to current mode of operation (interrupt
1N/A * enable/disable).
1N/A *
1N/A * Buffer structure's b_flags should be used to determine the
1N/A * address type of b_un.b_addr. However, there is no need to allocate DMA
1N/A * resources for the buffer in SATA HBA driver.
1N/A * DMA resources for a buffer structure are allocated by the SATA HBA
1N/A * framework. Scatter/gather list is to be used only for DMA transfers
1N/A * and it should be based on the DMA cookies list.
1N/A *
1N/A * Upon completion of a command, SATA HBA driver has to update
1N/A * satacmd_status_reg and satacmd_error_reg to reflect the contents of
1N/A * the corresponding device status and error registers.
1N/A * If the command completed successfully, satacmd_flags.sata_copy_xxx flags
1N/A * specify what register fields should be updated in sata_cmd structure.
1N/A * If the command completed with error, SATA HBA driver has to update
1N/A * satacmd_sec_count_msb, satacmd_sec_count_lsb, satacmd_lba_low_msb,
1N/A * satacmd_lba_low_lsb, satacmd_lba_mid_msb, satacmd_lba_mid_lsb,
1N/A * satacmd_lba_high_msb and satacmd_lba_high_lsb to values read from the
1N/A * corresponding device registers.
1N/A * If an operation could not complete because of the port error, the
1N/A * sata_pkt.satapkt_device.satadev_scr structure has to be updated.
1N/A *
1N/A * If ATAPI PACKET command was sent and command completed with error,
1N/A * rqsense structure has to be filed by SATA HBA driver. The satacmd_arq_cdb
1N/A * points to pre-set request sense cdb that may be used for issuing request
1N/A * sense data from the device.
1N/A *
1N/A * The sata_max_queue_depth field specifies the maximum allowable queue depth
1N/A * minus one, i.e. for maximum queue depth of 32, sata_max_queue_depth would
1N/A * be set to value 0x1f.
1N/A * If FPDMA-type command was sent and command completed with error, the HBA
1N/A * driver may use pre-set command READ LOG EXTENDED command pointed to
1N/A * by satacmd_rle_sata_cmd field to retrieve error data from a device.
1N/A * Only ATA register fields of the sata_cmd are set-up for that purpose.
1N/A *
1N/A * If the READ MULTIPLIER command was specified in cmd_reg (command directed
1N/A * to a port multiplier host port rather then to an attached device),
1N/A * upon the command completion SATA HBA driver has to update_sector count
1N/A * and lba fields of the sata_cmd structure to values returned via
1N/A * command block registers (task file registers).
1N/A */
1N/A#define SATA_CMD_REV_1 1
1N/A#define SATA_CMD_REV_2 2
1N/A#define SATA_CMD_REV_3 3
1N/A#define SATA_CMD_REV SATA_CMD_REV_3
1N/A
1N/A#define SATA_ATAPI_MAX_CDB_LEN 16 /* Covers both 12 and 16 byte cdbs */
1N/A#define SATA_ATAPI_RQSENSE_LEN 24 /* Allocated Request Sense data */
1N/A#define SATA_ATAPI_MIN_RQSENSE_LEN 18 /* Min Fixed size Request Sense data */
1N/A#define SATA_ATAPI_RQSENSE_CDB_LEN 6 /* Request Sense CDB length */
1N/A
1N/A#define SATA_MAX_QUEUE_DEPTH 32 /* Default max queue depth */
1N/A
1N/Astruct sata_cmd {
1N/A int satacmd_rev; /* version */
1N/A struct buf *satacmd_bp; /* ptr to buffer structure */
1N/A struct sata_cmd_flags {
1N/A uint32_t sata_data_direction : 3; /* 0-2 */
1N/A uint32_t : 1; /* reserved */ /* 3 */
1N/A uint32_t sata_queue_stag : 1; /* 4 */
1N/A uint32_t sata_queue_otag : 1; /* 5 */
1N/A uint32_t : 2; /* reserved */ /* 6-7 */
1N/A uint32_t sata_queued : 1; /* 8 */
1N/A uint32_t : 3; /* reserved */ /* 9-11 */
1N/A uint32_t sata_ignore_dev_reset : 1; /* 12 */
1N/A uint32_t sata_clear_dev_reset : 1; /* 13 */
1N/A uint32_t : 2; /* reserved */ /* 14-15 */
1N/A uint32_t sata_special_regs : 1; /* 16 */
1N/A uint32_t sata_copy_out_sec_count_msb : 1; /* 17 */
1N/A uint32_t sata_copy_out_lba_low_msb : 1; /* 18 */
1N/A uint32_t sata_copy_out_lba_mid_msb : 1; /* 19 */
1N/A uint32_t sata_copy_out_lba_high_msb : 1; /* 20 */
1N/A uint32_t sata_copy_out_sec_count_lsb : 1; /* 21 */
1N/A uint32_t sata_copy_out_lba_low_lsb : 1; /* 22 */
1N/A uint32_t sata_copy_out_lba_mid_lsb : 1; /* 23 */
1N/A uint32_t sata_copy_out_lba_high_lsb : 1; /* 24 */
1N/A uint32_t sata_copy_out_device_reg : 1; /* 25 */
1N/A uint32_t sata_copy_out_error_reg : 1; /* 26 */
1N/A uint32_t sata_max_queue_depth: 5; /* 27-31 */
1N/A } satacmd_flags;
1N/A uint8_t satacmd_addr_type; /* addr type: LBA28, LBA48 */
1N/A uint8_t satacmd_features_reg_ext; /* features reg extended */
1N/A uint8_t satacmd_sec_count_msb; /* sector count MSB (LBA48) */
1N/A uint8_t satacmd_lba_low_msb; /* LBA Low MSB (LBA48) */
1N/A uint8_t satacmd_lba_mid_msb; /* LBA Mid MSB (LBA48) */
1N/A uint8_t satacmd_lba_high_msb; /* LBA High MSB (LBA48) */
1N/A uint8_t satacmd_sec_count_lsb; /* sector count LSB */
1N/A uint8_t satacmd_lba_low_lsb; /* LBA Low LSB */
1N/A uint8_t satacmd_lba_mid_lsb; /* LBA Mid LSB */
1N/A uint8_t satacmd_lba_high_lsb; /* LBA High LSB */
1N/A uint8_t satacmd_device_reg; /* ATA dev reg & LBA28 MSB */
1N/A uint8_t satacmd_cmd_reg; /* ata command code */
1N/A uint8_t satacmd_features_reg; /* ATA features register */
1N/A uint8_t satacmd_status_reg; /* ATA status register */
1N/A uint8_t satacmd_error_reg; /* ATA error register */
1N/A uint8_t satacmd_acdb_len; /* ATAPI cdb length */
1N/A uint8_t satacmd_acdb[SATA_ATAPI_MAX_CDB_LEN]; /* ATAPI cdb */
1N/A
1N/A /* kept for binary compat. */
1N/A uint8_t *pad1; /* unused */
1N/A
1N/A uint8_t satacmd_rqsense[SATA_ATAPI_RQSENSE_LEN];
1N/A /*
1N/A * Error retrieval buffer
1N/A * dma handle pointer
1N/A * (for buffer DMA syncing)
1N/A * Valid only in error
1N/A * retrieval packet!
1N/A */
1N/A ddi_dma_handle_t *satacmd_err_ret_buf_handle;
1N/A
1N/A int satacmd_num_dma_cookies; /* number of dma cookies */
1N/A /* ptr to dma cookie list */
1N/A ddi_dma_cookie_t *satacmd_dma_cookie_list;
1N/A};
1N/A
1N/Atypedef struct sata_cmd sata_cmd_t;
1N/A
1N/A_NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_cmd))
1N/A
1N/A
1N/A/* ATA address type (in satacmd_addr_type field */
1N/A#define ATA_ADDR_LBA 0x1
1N/A#define ATA_ADDR_LBA28 0x2
1N/A#define ATA_ADDR_LBA48 0x4
1N/A
1N/A/*
1N/A * satacmd_flags : contain data transfer direction flags,
1N/A * tagged queuing type flags, queued command flag, and reset state handling
1N/A * flag.
1N/A */
1N/A
1N/A/*
1N/A * Data transfer direction flags (satacmd_flags.sata_data_direction)
1N/A * Direction flags are mutually exclusive.
1N/A */
1N/A#define SATA_DIR_NODATA_XFER 0x0001 /* No data transfer */
1N/A#define SATA_DIR_READ 0x0002 /* Reading data from a device */
1N/A#define SATA_DIR_WRITE 0x0004 /* Writing data to a device */
1N/A
1N/A/*
1N/A * Tagged Queuing type flags
1N/A * satacmd_flags.sata_queue_stag
1N/A * satacmd_flags.sata_queue_otag
1N/A *
1N/A * These flags indicate how the SATA command should be queued.
1N/A *
1N/A * sata_queue_stag
1N/A * Simple-queue-tagged command. It may be executed out-of-order in respect
1N/A * to other queued commands.
1N/A * sata_queue_otag
1N/A * Ordered-queue-tagged command. It cannot be executed out-of-order in
1N/A * respect to other commands, i.e. it should be executed in the order of
1N/A * being transported to the HBA.
1N/A *
1N/A * Translated head-of-queue-tagged scsi commands and commands that are
1N/A * to be put at the head of the queue are treated as sata_queue_otag
1N/A * tagged commands.
1N/A */
1N/A
1N/A
1N/A/*
1N/A * Queuing command set-up flag (satacmd_flags.sata_queued).
1N/A * This flag indicates that sata_cmd was set-up for DMA Queued command
1N/A * (either READ_DMA_QUEUED, READ_DMA_QUEUED_EXT, WRITE_DMA_QUEUED or
1N/A * WRITE_DMA_QUEUED_EXT command) or one of the Native Command Queuing commands
1N/A * (either READ_FPDMA_QUEUED or WRITE_FPDMA_QUEUED).
1N/A * This flag will be used only if sata_tran_hba_flags indicates controller
1N/A * support for queuing and the device for which sata_cmd is prepared supports
1N/A * either legacy queuing (indicated by Device Identify data word 83 bit 2)
1N/A * or NCQ (indicated by word 76 of Device Identify data).
1N/A */
1N/A
1N/A/*
1N/A * Reset state handling
1N/A * satacmd_flags.sata_ignore_dev_reset
1N/A * satacmd_flags.sata_clear_dev_reset
1N/A *
1N/A * SATA HBA device enters reset state if the device was subjected to
1N/A * the Device Reset (may also enter this state if the device was reset
1N/A * as a side effect of port reset). SATA HBA driver sets this state.
1N/A * Device stays in this condition until explicit request from SATA HBA
1N/A * framework to clear the state.
1N/A */
1N/A
1N/A/*
1N/A * SATA Packet structure (rev 1)
1N/A * hba_driver_private is for a private use of the SATA HBA driver;
1N/A * satapkt_framework_private is used only by SATA HBA framework;
1N/A * satapkt_comp is a callback function to be called when packet
1N/A * execution is completed (for any reason) if mode of operation is not
1N/A * synchronous (SATA_OPMODE_SYNCH);
1N/A * satapkt_reason specifies why the packet operation was completed
1N/A *
1N/A * NOTE: after the packet completion callback SATA HBA driver should not
1N/A * attempt to access any sata_pkt fields because sata_pkt is not valid anymore
1N/A * (it could have been destroyed).
1N/A * Since satapkt_hba_driver_private field cannot be retrieved, any hba private
1N/A * data respources allocated per packet and accessed via this pointer should
1N/A * either be freed before the completion callback is done, or the pointer has
1N/A * to be saved by the HBA driver before the completion callback.
1N/A */
1N/A#define SATA_PKT_REV_1 1
1N/A#define SATA_PKT_REV SATA_PKT_REV_1
1N/A
1N/Astruct sata_pkt {
1N/A int satapkt_rev; /* version */
1N/A struct sata_device satapkt_device; /* Device address/type */
1N/A
1N/A /* HBA driver private data */
1N/A void *satapkt_hba_driver_private;
1N/A
1N/A /* SATA framework priv data */
1N/A void *satapkt_framework_private;
1N/A
1N/A /* Rqsted mode of operation */
1N/A uint32_t satapkt_op_mode;
1N/A
1N/A struct sata_cmd satapkt_cmd; /* composite sata command */
1N/A int satapkt_time; /* time allotted to command */
1N/A void (*satapkt_comp)(struct sata_pkt *); /* callback */
1N/A int satapkt_reason; /* completion reason */
1N/A};
1N/A
1N/Atypedef struct sata_pkt sata_pkt_t;
1N/A
1N/A_NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_pkt))
1N/A
1N/A
1N/A/*
1N/A * Operation mode flags (in satapkt_op_mode field of sata_pkt structure).
1N/A * Use to specify what should be a mode of operation for specified command.
1N/A * Default (000b) means use Interrupt and Asynchronous mode to
1N/A * perform an operation.
1N/A * Synchronous operation menas that the packet operation has to be completed
1N/A * before the function called to initiate the operation returns.
1N/A */
1N/A#define SATA_OPMODE_INTERRUPTS 0 /* Use interrupts (hint) */
1N/A#define SATA_OPMODE_POLLING 1 /* Use polling instead of interrupts */
1N/A#define SATA_OPMODE_ASYNCH 0 /* Return immediately after accepting pkt */
1N/A#define SATA_OPMODE_SYNCH 4 /* Perform synchronous operation */
1N/A
1N/A/*
1N/A * satapkt_reason values:
1N/A *
1N/A * SATA_PKT_QUEUE_FULL - cmd not sent because of queue full (detected
1N/A * by the controller). If a device reject command for this reason, it
1N/A * should be reported as SATA_PKT_DEV_ERROR
1N/A *
1N/A * SATA_PKT_CMD_NOT_SUPPORTED - command not supported by a controller
1N/A * Controller is unable to send such command to a device.
1N/A * If device rejects a command, it should be reported as
1N/A * SATA_PKT_DEV_ERROR.
1N/A *
1N/A * SATA_PKT_DEV_ERROR - cmd failed because of device reported an error.
1N/A * The content of status_reg (ERROR bit has to be set) and error_reg
1N/A * fields of the sata_cmd structure have to be set and will be used
1N/A * by SATA HBA Framework to determine the error cause.
1N/A *
1N/A * SATA_PKT_PORT_ERROR - cmd failed because of a link or a port error.
1N/A * Link failed / no communication with a device / communication error
1N/A * or other port related error was detected by a controller.
1N/A * sata_pkt.satapkt_device.satadev_scr.sXXXXXXX words have to be set.
1N/A *
1N/A * SATA_PKT_ABORTED - cmd execution was aborted by the request from the
1N/A * framework. Abort mechanism is HBA driver specific.
1N/A *
1N/A * SATA_PKT_TIMEOUT - cmd execution has timed-out. Timeout specified by
1N/A * pkt_time was exceeded. The command was terminated by the SATA HBA
1N/A * driver.
1N/A *
1N/A * SATA_PKT_COMPLETED - this is a value returned when an operation
1N/A * completes without errors.
1N/A *
1N/A * SATA_PKT_BUSY - packet was not accepted for execution because the
1N/A * driver was busy performing some other operation(s).
1N/A *
1N/A * SATA_PKT_RESET - packet execution was aborted because of device
1N/A * reset originated by either the HBA driver or the SATA framework.
1N/A *
1N/A */
1N/A
1N/A#define SATA_PKT_BUSY -1 /* Not completed, busy */
1N/A#define SATA_PKT_COMPLETED 0 /* No error */
1N/A#define SATA_PKT_DEV_ERROR 1 /* Device reported error */
1N/A#define SATA_PKT_QUEUE_FULL 2 /* Not accepted, queue full */
1N/A#define SATA_PKT_PORT_ERROR 3 /* Not completed, port error */
1N/A#define SATA_PKT_CMD_UNSUPPORTED 4 /* Cmd unsupported */
1N/A#define SATA_PKT_ABORTED 5 /* Aborted by request */
1N/A#define SATA_PKT_TIMEOUT 6 /* Operation timeut */
1N/A#define SATA_PKT_RESET 7 /* Aborted by reset request */
1N/A
1N/A/*
1N/A * Error retrieval sata packet types
1N/A */
1N/A#define SATA_ERR_RETR_PKT_TYPE_NCQ 1
1N/A#define SATA_ERR_RETR_PKT_TYPE_ATAPI 2
1N/A
1N/A/*
1N/A * Hoplug functions vector structure (rev 1)
1N/A */
1N/A#define SATA_TRAN_HOTPLUG_OPS_REV_1 1
1N/A
1N/Astruct sata_tran_hotplug_ops {
1N/A int sata_tran_hotplug_ops_rev; /* version */
1N/A int (*sata_tran_port_activate)(dev_info_t *, sata_device_t *);
1N/A int (*sata_tran_port_deactivate)(dev_info_t *, sata_device_t *);
1N/A};
1N/A
1N/Atypedef struct sata_tran_hotplug_ops sata_tran_hotplug_ops_t;
1N/A
1N/A
1N/A/*
1N/A * Power management functions vector structure (rev 1)
1N/A * The embedded function returns information about the controller's
1N/A * power level.
1N/A * Additional functions may be added in the future without changes to
1N/A * sata_tran structure.
1N/A */
1N/A#define SATA_TRAN_PWRMGT_OPS_REV_1 1
1N/A
1N/Astruct sata_tran_pwrmgt_ops {
1N/A int sata_tran_pwrmgt_ops_rev; /* version */
1N/A int (*sata_tran_get_pwr_level)(dev_info_t *, sata_device_t *);
1N/A};
1N/A
1N/Atypedef struct sata_tran_pwrmgt_ops sata_tran_pwrmgt_ops_t;
1N/A
1N/A
1N/A/*
1N/A * SATA port PHY Power Level
1N/A * These states correspond to the interface power management state as defined
1N/A * in Serial ATA spec.
1N/A */
1N/A#define SATA_TRAN_PORTPWR_LEVEL1 1 /* Interface in active PM state */
1N/A#define SATA_TRAN_PORTPWR_LEVEL2 2 /* Interface in PARTIAL PM state */
1N/A#define SATA_TRAN_PORTPWR_LEVEL3 3 /* Interface in SLUMBER PM state */
1N/A
1N/A/*
1N/A * SATA HBA Tran structure (rev 1)
1N/A * Registered with SATA Framework
1N/A *
1N/A * dma_attr is a pointer to data (buffer) dma attibutes of the controller
1N/A * DMA engine.
1N/A *
1N/A * The qdepth field specifies number of commands that may be accepted by
1N/A * the controller. Value range 1-32. A value greater than 1 indicates that
1N/A * the controller supports queuing. Support for Native Command Queuing
1N/A * indicated by SATA_CTLF_NCQ flag also requires qdepth set to a value
1N/A * greater then 1.
1N/A *
1N/A */
1N/A#define SATA_TRAN_HBA_REV_1 1
1N/A#define SATA_TRAN_HBA_REV_2 2
1N/A#define SATA_TRAN_HBA_REV SATA_TRAN_HBA_REV_2
1N/A
1N/Astruct sata_hba_tran {
1N/A int sata_tran_hba_rev; /* version */
1N/A dev_info_t *sata_tran_hba_dip; /* Controler dev info */
1N/A ddi_dma_attr_t *sata_tran_hba_dma_attr; /* DMA attributes */
1N/A int sata_tran_hba_num_cports; /* Num of HBA device ports */
1N/A uint16_t sata_tran_hba_features_support; /* HBA features */
1N/A uint16_t sata_tran_hba_qdepth; /* HBA-supported queue depth */
1N/A
1N/A int (*sata_tran_probe_port)(dev_info_t *, sata_device_t *);
1N/A int (*sata_tran_start)(dev_info_t *, sata_pkt_t *);
1N/A int (*sata_tran_abort)(dev_info_t *, sata_pkt_t *, int);
1N/A int (*sata_tran_reset_dport)(dev_info_t *,
1N/A sata_device_t *);
1N/A int (*sata_tran_selftest)(dev_info_t *, sata_device_t *);
1N/A
1N/A /* Hotplug vector */
1N/A struct sata_tran_hotplug_ops *sata_tran_hotplug_ops;
1N/A
1N/A /* Power mgt vector */
1N/A struct sata_tran_pwrmgt_ops *sata_tran_pwrmgt_ops;
1N/A
1N/A int (*sata_tran_ioctl)(dev_info_t *, int, intptr_t);
1N/A};
1N/A
1N/Atypedef struct sata_hba_tran sata_hba_tran_t;
1N/A
1N/A
1N/A/*
1N/A * Controller's features support flags (sata_tran_hba_features_support).
1N/A * Note: SATA_CTLF_NCQ indicates that SATA controller supports NCQ in addition
1N/A * to legacy queuing commands, indicated by SATA_CTLF_QCMD flag.
1N/A */
1N/A
1N/A#define SATA_CTLF_ATAPI 0x001 /* ATAPI support */
1N/A#define SATA_CTLF_PORT_MULTIPLIER 0x010 /* Port Multiplier suport */
1N/A#define SATA_CTLF_HOTPLUG 0x020 /* Hotplug support */
1N/A#define SATA_CTLF_ASN 0x040 /* Asynchronous Event Support */
1N/A#define SATA_CTLF_QCMD 0x080 /* Queued commands support */
1N/A#define SATA_CTLF_NCQ 0x100 /* NCQ support */
1N/A
1N/A/*
1N/A * sata_tran_start() return values.
1N/A * When pkt is not accepted, the satapkt_reason has to be updated
1N/A * before function returns - it should reflect the same reason for not being
1N/A * executed as the return status of above functions.
1N/A * If pkt was accepted and executed synchronously,
1N/A * satapk_reason should indicate a completion status.
1N/A */
1N/A#define SATA_TRAN_ACCEPTED 0 /* accepted */
1N/A#define SATA_TRAN_QUEUE_FULL 1 /* not accepted, queue full */
1N/A#define SATA_TRAN_PORT_ERROR 2 /* not accepted, port error */
1N/A#define SATA_TRAN_CMD_UNSUPPORTED 3 /* not accepted, cmd not supported */
1N/A#define SATA_TRAN_BUSY 4 /* not accepted, busy */
1N/A
1N/A
1N/A/*
1N/A * sata_tran_abort() abort type flag
1N/A */
1N/A#define SATA_ABORT_PACKET 0
1N/A#define SATA_ABORT_ALL_PACKETS 1
1N/A
1N/A
1N/A/*
1N/A * Events handled by SATA HBA Framework
1N/A * More then one event may be reported at the same time
1N/A *
1N/A * SATA_EVNT__DEVICE_ATTACHED
1N/A * HBA detected the presence of a device ( electrical connection with
1N/A * a device was detected ).
1N/A *
1N/A * SATA_EVNT_DEVICE_DETACHED
1N/A * HBA detected the detachment of a device (electrical connection with
1N/A * a device was broken)
1N/A *
1N/A * SATA_EVNT_LINK_LOST
1N/A * HBA lost link with an attached device
1N/A *
1N/A * SATA_EVNT_LINK_ESTABLISHED
1N/A * HBA established a link with an attached device
1N/A *
1N/A * SATA_EVNT_PORT_FAILED
1N/A * HBA has determined that the port failed and is unuseable
1N/A *
1N/A * SATA_EVENT_DEVICE_RESET
1N/A * SATA device was reset, causing loss of the device setting
1N/A *
1N/A * SATA_EVNT_PWR_LEVEL_CHANGED
1N/A * A port or entire SATA controller power level has changed
1N/A *
1N/A */
1N/A#define SATA_EVNT_DEVICE_ATTACHED 0x01
1N/A#define SATA_EVNT_DEVICE_DETACHED 0x02
1N/A#define SATA_EVNT_LINK_LOST 0x04
1N/A#define SATA_EVNT_LINK_ESTABLISHED 0x08
1N/A#define SATA_EVNT_PORT_FAILED 0x10
1N/A#define SATA_EVNT_DEVICE_RESET 0x20
1N/A#define SATA_EVNT_PWR_LEVEL_CHANGED 0x40
1N/A
1N/A/*
1N/A * SATA Framework interface entry points
1N/A */
1N/Aint sata_hba_init(struct modlinkage *);
1N/Aint sata_hba_attach(dev_info_t *, sata_hba_tran_t *, ddi_attach_cmd_t);
1N/Aint sata_hba_detach(dev_info_t *, ddi_detach_cmd_t);
1N/Avoid sata_hba_fini(struct modlinkage *);
1N/Avoid sata_hba_event_notify(dev_info_t *, sata_device_t *, int);
1N/Asata_pkt_t *sata_get_error_retrieval_pkt(dev_info_t *, sata_device_t *, int);
1N/Avoid sata_free_error_retrieval_pkt(sata_pkt_t *);
1N/Avoid sata_free_dma_resources(sata_pkt_t *);
1N/A
1N/A
1N/A#ifdef __cplusplus
1N/A}
1N/A#endif
1N/A
1N/A#endif /* _SATA_HBA_H */
1N/A