sata.h revision 918304a3bd962ac065ad520336a044d94b40ad16
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER START
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The contents of this file are subject to the terms of the
f65e61c04bc28ffd6bda04619c84330b420450b5ahrens * Common Development and Distribution License (the "License").
f65e61c04bc28ffd6bda04619c84330b420450b5ahrens * You may not use this file except in compliance with the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * See the License for the specific language governing permissions
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and limitations under the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * When distributing Covered Code, include this CDDL HEADER in each
fa9e4066f08beec538e775443c5be79dd423fcabahrens * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If applicable, add the following below this CDDL HEADER, with the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * fields enclosed by brackets "[]" replaced with your own identifying
fa9e4066f08beec538e775443c5be79dd423fcabahrens * information: Portions Copyright [yyyy] [name of copyright owner]
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER END
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Use is subject to license terms.
fa9e4066f08beec538e775443c5be79dd423fcabahrensextern "C" {
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Generic SATA Host Adapter Implementation
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* Common flags specifying current state of a port or an attached drive. */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock/* Statistics counters */
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA HBA instance info structure
fa9e4066f08beec538e775443c5be79dd423fcabahrens dev_info_t *satahba_dip; /* this HBA instance devinfo */
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct sata_hba_inst *satahba_next; /* ptr to next sata_hba_inst */
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct sata_hba_inst *satahba_prev; /* ptr to prev sata_hba_inst */
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct scsi_hba_tran *satahba_scsi_tran; /* scsi_hba_tran */
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct sata_hba_tran *satahba_tran; /* sata_hba_tran */
455d5089097abbf7ee4538a03c4df823497b6e68ahrens struct taskq *satahba_taskq; /* cmd completion task queue */
f65e61c04bc28ffd6bda04619c84330b420450b5ahrens * HBA event flags:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_EVNT_MAIN
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_EVNT_PWR_LEVEL_CHANGED
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_EVNT_SKIP
f65e61c04bc28ffd6bda04619c84330b420450b5ahrens struct sata_cport_info *satahba_dev_port[SATA_MAX_CPORTS];
fa9e4066f08beec538e775443c5be79dd423fcabahrens * DEVCTL open flag:
f65e61c04bc28ffd6bda04619c84330b420450b5ahrens * SATA_DEVCTL_SOPENED
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_DEVCTL_EXOPENED
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct sata_ctrl_stats satahba_stats; /* HBA cntrl statistics */
f65e61c04bc28ffd6bda04619c84330b420450b5ahrens /* 0 - not completed */
f65e61c04bc28ffd6bda04619c84330b420450b5ahrens /* 1 - completed */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * SATA controller's device port info and state.
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * This structure is pointed to by the sata_hba_inst.satahba_dev_port[x]
fa9e4066f08beec538e775443c5be79dd423fcabahrens * where x is a device port number.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * cport_state holds port state flags, defined in sata_hba.h file.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * cport_event_flags holds SATA_EVNT_* flags defined in this file and in
fa9e4066f08beec538e775443c5be79dd423fcabahrens * cport_dev_type holds SATA_DTYPE_* types defined in sata_hba.h file.
fa9e4066f08beec538e775443c5be79dd423fcabahrens sata_address_t cport_addr; /* this port SATA address */
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Port state flags
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_STATE_UNKNOWN
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_STATE_PROBING
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_STATE_PROBED
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_STATE_READY
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_PSTATE_PWRON
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_PSTATE_PWROFF
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_PSTATE_SHUTDOWN
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_PSTATE_FAILED
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Port event flags:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_EVNT_DEVICE_ATTACHED
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_EVNT_DEVICE_DETACHED
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_EVNT_LINK_LOST
66328dd3ff7c6b3566c06478698593e061733076ahrens * SATA_EVNT_LINK_ESTABLISHED
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_EVNT_PORT_FAILED
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_EVNT_PWR_LEVEL_CHANGED
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct sata_port_scr cport_scr; /* Port status and ctrl regs */
f65e61c04bc28ffd6bda04619c84330b420450b5ahrens * Attached device type:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_DTYPE_NONE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_DTYPE_ATADISK
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_DTYPE_ATAPICD
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_DTYPE_ATAPITAPE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_DTYPE_ATAPIDISK
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_DTYPE_PMULT
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_DTYPE_UNKNOWN
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct sata_drive_info *cport_sata_drive; /* Attached drive info */
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct sata_pmult_info *cport_sata_pmult; /* Attached Port Mult */
f65e61c04bc28ffd6bda04619c84330b420450b5ahrens /* lbolt value at link lost */
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* lbolt value @ dev attached */
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct sata_port_stats cport_stats; /* Port statistics */
fa9e4066f08beec538e775443c5be79dd423fcabahrens boolean_t cport_tgtnode_clean; /* Target node usable */
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Attached SATA drive info and state.
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * This structure is pointed to by sata_cport_info's cport_sata_drive field
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * when a drive is attached directly to a controller device port.
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock sata_address_t satadrv_addr; /* this drive SATA address */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Drive state flags
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * SATA_STATE_UNKNOWN
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_STATE_PROBING
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_STATE_PROBED
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_STATE_READY
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * SATA_DSTATE_PWR_ACTIVE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_DSTATE_PWR_IDLE
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * SATA_DSTATE_RESET
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_DSTATE_FAILED
fa9e4066f08beec538e775443c5be79dd423fcabahrens * drive event flags:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_EVNT_DRIVE_RESET
fa9e4066f08beec538e775443c5be79dd423fcabahrens * lbolt value @ start of
fa9e4066f08beec538e775443c5be79dd423fcabahrens * device reset processing
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Attached device type:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_DTYPE_ATADISK
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_DTYPE_ATAPICD
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_DTYPE_ATAPITAPE
66328dd3ff7c6b3566c06478698593e061733076ahrens * SATA_DTYPE_ATAPIDISK
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock uint32_t satadrv_status_reg; /* drive status reg */
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint16_t satadrv_features_support; /* drive features support */
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint16_t satadrv_queue_depth; /* drive queue depth */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock uint16_t satadrv_atapi_cdb_len; /* atapi supported cdb length */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock uint16_t satadrv_atapi_trans_ver; /* atapi transport version */
f65e61c04bc28ffd6bda04619c84330b420450b5ahrens uint16_t satadrv_settings; /* drive settings flags */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock uint16_t satadrv_features_enabled; /* drive features enabled */
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t satadrv_max_queue_depth; /* maximum queue depth */
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct sata_drive_stats satadrv_stats; /* drive statistics */
f65e61c04bc28ffd6bda04619c84330b420450b5ahrens * saved standby timer
f65e61c04bc28ffd6bda04619c84330b420450b5ahrens * [0] - [3] = high - low
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock uint8_t satadrv_power_level; /* saved power level */
fa9e4066f08beec538e775443c5be79dd423fcabahrens_NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_drive_info))
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock/* Port Multiplier & host port info and state */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock sata_address_t pmult_addr; /* this PMult SATA Address */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * PMult state flags
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * SATA_STATE_UNKNOWN
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * SATA_STATE_PROBING
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * SATA_STATE_PROBED
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * SATA_STATE_READY
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * SATA_PSTATE_FAILED
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock uint32_t pmult_event_flags; /* Undefined for now */
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct sata_pmult_gscr pmult_gscr; /* PMult GSCR block */
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint32_t pmult_num_dev_ports; /* Number of data ports */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock struct sata_pmport_info *pmult_dev_port[SATA_MAX_PMPORTS - 1];
fa9e4066f08beec538e775443c5be79dd423fcabahrens_NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_pmult_info))
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock_NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock/* Port Multiplier's device port info & state */
fa9e4066f08beec538e775443c5be79dd423fcabahrens sata_address_t pmport_addr; /* this SATA port address */
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Port state flags
f65e61c04bc28ffd6bda04619c84330b420450b5ahrens * SATA_STATE_UNKNOWN
f65e61c04bc28ffd6bda04619c84330b420450b5ahrens * SATA_STATE_PROBING
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_STATE_PROBED
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * SATA_STATE_READY
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * SATA_PSTATE_PWRON
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * SATA_PSTATE_PWROFF
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * SATA_PSTATE_SHUTDOWN
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * SATA_PSTATE_FAILED
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Port event flags:
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * SATA_EVNT_DEVICE_ATTACHED
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * SATA_EVNT_DEVICE_DETACHED
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * SATA_EVNT_LINK_LOST
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * SATA_EVNT_LINK_ESTABLISHED
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * SATA_EVNT_PORT_FAILED
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * SATA_EVNT_PWR_LEVEL_CHANGED
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock struct sata_port_scr pmport_scr; /* PMult device port scr */
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Attached device type:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_DTYPE_NONE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_DTYPE_ATADISK
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_DTYPE_ATAPICD
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_DTYPE_ATAPITAPE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_DTYPE_ATAPIDISK
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_DTYPE_UNKNOWN
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct sata_drive_info *pmport_sata_drive; /* Attached drive info */
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* lbolt value at link lost */
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* lbolt value @ dev attached */
fa9e4066f08beec538e775443c5be79dd423fcabahrens struct sata_port_stats pmport_stats; /* Port statistics */
66328dd3ff7c6b3566c06478698593e061733076ahrens boolean_t pmport_tgtnode_clean; /* Target node usable */
f65e61c04bc28ffd6bda04619c84330b420450b5ahrens * sata drive's power level
f65e61c04bc28ffd6bda04619c84330b420450b5ahrens * default value is active
fa9e4066f08beec538e775443c5be79dd423fcabahrens * pm-capable value definition according to PSARC 2009/310
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Port SSTATUS register (sata_port_scr sport_sstatus field).
f65e61c04bc28ffd6bda04619c84330b420450b5ahrens * Link bits are valid only in port active state.
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock#define SATA_PORT_DEVLINK_UP 0x00000103 /* Link with dev established */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define SATA_PORT_DEVLINK_UP_MASK 0x0000010F /* Mask for link bits */
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Port state clear mask (cport_state and pmport_state fields).
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_PSTATE_SHUTDOWN and power state are preserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define SATA_PORT_STATE_CLEAR_MASK (~(SATA_PSTATE_SHUTDOWN))
66328dd3ff7c6b3566c06478698593e061733076ahrens * Valid i.e.supported device types mask (cport_dev_type, satadrv_type,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * pmult_dev_type fields).
66328dd3ff7c6b3566c06478698593e061733076ahrens * ATA disks and ATAPI CD/DVD now.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Device feature_support (satadrv_features_support)
66328dd3ff7c6b3566c06478698593e061733076ahrens#define SATA_DEV_F_TCQ 0x40 /* Non NCQ tagged queuing */
66328dd3ff7c6b3566c06478698593e061733076ahrens * Device features enabled (satadrv_features_enabled)
66328dd3ff7c6b3566c06478698593e061733076ahrens#define SATA_DEV_F_E_TAGGED_QING 0x01 /* Tagged queuing enabled */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define SATA_DEV_F_E_UNTAGGED_QING 0x02 /* Untagged queuing enabled */
66328dd3ff7c6b3566c06478698593e061733076ahrens * Drive settings flags (satdrv_settings)
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define SATA_DEV_READ_AHEAD 0x0001 /* Read Ahead enabled */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define SATA_DEV_WRITE_CACHE 0x0002 /* Write cache ON */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define SATA_DEV_SERIAL_FEATURES 0x8000 /* Serial ATA feat. enabled */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define SATA_DEV_ASYNCH_NOTIFY 0x2000 /* Asynch-event enabled */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define SATA_DEV_RMSN 0x0100 /* Rem Media Stat Notfc enbl */
66328dd3ff7c6b3566c06478698593e061733076ahrens * Internal event and flags.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * These flags are set in the *_event_flags fields of various structures.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Events and lock flags defined below are used internally by the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA framework (they are not reported by SATA HBA drivers).
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Lock flags - used to serialize configuration operations
66328dd3ff7c6b3566c06478698593e061733076ahrens * on ports and devices.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_EVNT_LOCK_PORT_BUSY is set by event daemon to prevent
fa9e4066f08beec538e775443c5be79dd423fcabahrens * simultaneous cfgadm operations.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_APCTL_LOCK_PORT_BUSY is set by cfgadm ioctls to prevent
fa9e4066f08beec538e775443c5be79dd423fcabahrens * simultaneous event processing.
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* Mask for port events */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define SATA_EVNT_PORT_EVENTS (SATA_EVNT_DEVICE_ATTACHED | \
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* Mask for drive events */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define SATA_EVNT_DRIVE_EVENTS (SATA_EVNT_DEVICE_RESET | \
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock#define SATA_EVNT_CONTROLLER_EVENTS SATA_EVNT_PWR_LEVEL_CHANGED
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* Delays and timeout duration definitions */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define SATA_EVNT_DAEMON_TERM_TIMEOUT 100000 /* 100 ms */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define SATA_EVNT_DAEMON_TERM_WAIT 60000000 /* 60 s */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define SATA_DEV_IDENTIFY_TIMEOUT 60000000 /* 60 s, device enumeration */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define SATA_DEV_REPROBE_TIMEOUT 30000000 /* 30 s, dev resp after rst */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* DEVICE IDENTIFY and device initialization retry delay */
fa9e4066f08beec538e775443c5be79dd423fcabahrens * sata_scsi's hba_open_flag: field indicating open devctl instance.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * 0 = closed, 1 = shared open, 2 = exclusive open.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * sata_pkt_txlate structure contains info about resources allocated
fa9e4066f08beec538e775443c5be79dd423fcabahrens * for the packet
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Address of this structure is stored in scsi_pkt.pkt_ha_private and
fa9e4066f08beec538e775443c5be79dd423fcabahrens * in sata_pkt.sata_hba_private fields, so all three strucures are
fa9e4066f08beec538e775443c5be79dd423fcabahrens * cross-linked, with sata_pkt_txlate as a centerpiece.
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct sata_pkt_txlate {
66328dd3ff7c6b3566c06478698593e061733076ahrens /* cookies in the current DMA window */
f65e61c04bc28ffd6bda04619c84330b420450b5ahrens /* processed dma cookies in current DMA win */
f65e61c04bc28ffd6bda04619c84330b420450b5ahrens ddi_dma_cookie_t txlt_dma_cookie; /* default dma cookie */
f65e61c04bc28ffd6bda04619c84330b420450b5ahrens ddi_dma_cookie_t *txlt_dma_cookie_list; /* dma cookie list */
f65e61c04bc28ffd6bda04619c84330b420450b5ahrens /* temporary buffer access handle */
f65e61c04bc28ffd6bda04619c84330b420450b5ahrens_NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_pkt_txlate))
fa9e4066f08beec538e775443c5be79dd423fcabahrens_NOTE(SCHEME_PROTECTS_DATA("unshared data", scsi_pkt))
66328dd3ff7c6b3566c06478698593e061733076ahrens * Additional scsi sense code definitions.
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * These definition should eventually be moved to scsi header file
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock#define SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST 0x26
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock#define SD_SCSI_ASC_SAVING_PARAMS_NOT_SUPPORTED 0x39
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* SCSI defs missing from scsi headers */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* Missing from sys/scsi/generic/commands.h */
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Missing from sys/scsi/impl/mode.h, although defined
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define MODEPAGE_RW_ERRRECOV 0x01 /* read/write recovery */
fa9e4066f08beec538e775443c5be79dd423fcabahrens * medium access command
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((cmd) == SCMD_READ_G1) || ((cmd) == SCMD_WRITE_G1) || \
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((cmd) == SCMD_READ_G4) || ((cmd) == SCMD_WRITE_G4) || \
66328dd3ff7c6b3566c06478698593e061733076ahrens ((cmd) == SCMD_READ_G5) || ((cmd) == SCMD_WRITE_G5) || \
66328dd3ff7c6b3566c06478698593e061733076ahrens ((cmd) == SCMD_VERIFY) || ((cmd) == SCMD_VERIFY_G4) || \
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((cmd) == SCMD_VERIFY_G5) || ((cmd) == 0x7f) /* VERIFY(32) */|| \
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock ((cmd) == SCMD_SYNCHRONIZE_CACHE) || ((cmd) == SCMD_SPACE_G4) || \
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock ((cmd) == SCMD_READ_LONG) || ((cmd) == SCMD_SVC_ACTION_IN_G4) || \
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((cmd) == SCMD_WRITE_LONG) || ((cmd) == SCMD_SVC_ACTION_OUT_G4) || \
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((cmd) == 0x41) || ((cmd) == 0x93) || /* WRITE SAME */ \
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((cmd) == 0x52) || ((cmd) == 0x50) || /* XDREAD & XDWRITE */ \
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((cmd) == 0x53) || ((cmd) == 0x51) || /* XDWRITEREAD & XPWRITE */ \
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Macros for accessing various structure fields
fa9e4066f08beec538e775443c5be79dd423fcabahrens sata_hba_inst->satahba_tran->sata_tran_hba_num_cports
fa9e4066f08beec538e775443c5be79dd423fcabahrens sata_hba_inst->satahba_tran->sata_tran_hba_features_support
fa9e4066f08beec538e775443c5be79dd423fcabahrens (sata_hba_inst->satahba_tran->sata_tran_hotplug_ops == NULL ? \
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock sata_hba_inst->satahba_tran->sata_tran_hotplug_ops->\
66328dd3ff7c6b3566c06478698593e061733076ahrens (sata_hba_inst->satahba_tran->sata_tran_hotplug_ops == NULL ? \
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock sata_hba_inst->satahba_tran->sata_tran_hotplug_ops->\
66328dd3ff7c6b3566c06478698593e061733076ahrens#define SATA_CPORT_EVENT_FLAGS(sata_hba_inst, cport) \
66328dd3ff7c6b3566c06478698593e061733076ahrens sata_hba_inst->satahba_dev_port[cport]->cport_event_flags
fa9e4066f08beec538e775443c5be79dd423fcabahrens sata_hba_inst->satahba_dev_port[cport]->cport_dev_type
66328dd3ff7c6b3566c06478698593e061733076ahrens sata_hba_inst->satahba_dev_port[cport]->cport_devp.cport_sata_drive
66328dd3ff7c6b3566c06478698593e061733076ahrens sata_hba_inst->satahba_dev_port[cport]->cport_devp.cport_sata_pmult
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock#define SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport) \
fa9e4066f08beec538e775443c5be79dd423fcabahrens cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_mutex
66328dd3ff7c6b3566c06478698593e061733076ahrens#define SATA_PMPORT_INFO(sata_hba_inst, cport, pmport) \
66328dd3ff7c6b3566c06478698593e061733076ahrens#define SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport) \
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->\
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock#define SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) \
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_state
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock#define SATA_PMPORT_SCR(sata_hba_inst, cport, pmport) \
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_scr
66328dd3ff7c6b3566c06478698593e061733076ahrens#define SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport, pmport) \
66328dd3ff7c6b3566c06478698593e061733076ahrens cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_dev_type
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock#define SATA_PMPORT_EVENT_FLAGS(sata_hba_inst, cport, pmport) \
fa9e4066f08beec538e775443c5be79dd423fcabahrens cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->\
fa9e4066f08beec538e775443c5be79dd423fcabahrens spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport
fa9e4066f08beec538e775443c5be79dd423fcabahrens spx->txlt_sata_pkt->satapkt_device.satadev_addr.pmport
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Minor number construction for devctl and attachment point nodes.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * All necessary information has to be encoded in NBITSMINOR32 bits.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Devctl node minor number:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | SATA_DEVCTL_NODE)
66328dd3ff7c6b3566c06478698593e061733076ahrens * Attachment point node minor number has to include controller
66328dd3ff7c6b3566c06478698593e061733076ahrens * instance (7 bits), controller port number (5 bits) and port multiplier
fa9e4066f08beec538e775443c5be79dd423fcabahrens * device port number (4 bits) and port multiplier device port
fa9e4066f08beec538e775443c5be79dd423fcabahrens * indicator (1 bit). Additionally, a single bit is used to
66328dd3ff7c6b3566c06478698593e061733076ahrens * differentiate between attachment point node and device control node.
66328dd3ff7c6b3566c06478698593e061733076ahrens * Attachment point minor number:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | SATA_AP_NODE |
fa9e4066f08beec538e775443c5be79dd423fcabahrens * [(port_multiplier_device_port << SATA_PMULT_PORT_SHIFT) | SATA_PMULT_AP] |
fa9e4066f08beec538e775443c5be79dd423fcabahrens * (controller_port))
fa9e4066f08beec538e775443c5be79dd423fcabahrens * 17 bits are used (if 64 instances of controllers are expected)
66328dd3ff7c6b3566c06478698593e061733076ahrens * bit 18 is reserved for future use.
66328dd3ff7c6b3566c06478698593e061733076ahrens * --------------------------------------------------------
66328dd3ff7c6b3566c06478698593e061733076ahrens * |17|16|15|14|13|12|11|10 |09|08|07|06|05|04|03|02|01|00|
66328dd3ff7c6b3566c06478698593e061733076ahrens * --------------------------------------------------------
fa9e4066f08beec538e775443c5be79dd423fcabahrens * | R| c| c| c| c| c| c|a/d|pm|pp|pp|pp|pp|cp|cp|cp|cp|cp|
fa9e4066f08beec538e775443c5be79dd423fcabahrens * --------------------------------------------------------
fa9e4066f08beec538e775443c5be79dd423fcabahrens * cp - device port number on the HBA SATA controller
fa9e4066f08beec538e775443c5be79dd423fcabahrens * pp - device port number on the port multiplier
fa9e4066f08beec538e775443c5be79dd423fcabahrens * pm - 0 - target attached to controller device port
fa9e4066f08beec538e775443c5be79dd423fcabahrens * 1 - target attached to port multiplier's device port
fa9e4066f08beec538e775443c5be79dd423fcabahrens * a/d - 0 - devctl node
fa9e4066f08beec538e775443c5be79dd423fcabahrens * 1 - attachment point node
fa9e4066f08beec538e775443c5be79dd423fcabahrens * c - controller number
fa9e4066f08beec538e775443c5be79dd423fcabahrens * R - reserved bit
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define SATA_AP_NODE 0x400 /* Attachment Point node */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define SATA_PMULT_AP 0x200 /* device on PMult port */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define SATA_PMULT_PORT_MASK 0xf /* 15 device ports */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define SATA_CNTRL_INSTANCE_MASK 0x03F /* 64 controllers */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* Macro for creating devctl node minor number */
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | \
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* Macro for creating an attachment point node minor number */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define SATA_MAKE_AP_MINOR(cntrl_instance, cport, pmport, qual) \
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock/* Macro retrieving controller number from a minor number */
66328dd3ff7c6b3566c06478698593e061733076ahrens ((minor >> SATA_CNTRL_INSTANCE_SHIFT) & SATA_CNTRL_INSTANCE_MASK)
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Macro for creating an attachment point number from sata address.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Address qualifier has to be one of:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SATA_ADDR_DCPORT, SATA_ADDR_DPMPORT, SATA_ADDR_CPORT or SATA_ADDR_PMPORT
fa9e4066f08beec538e775443c5be79dd423fcabahrens (SATA_PMULT_AP | (pmport << SATA_PMULT_PORT_SHIFT) | cport) : \
fa9e4066f08beec538e775443c5be79dd423fcabahrens * SCSI target number format
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -------------------------------
fa9e4066f08beec538e775443c5be79dd423fcabahrens * | 9| 8| 7| 6| 5| 4| 3| 2| 1| 0| Bit number
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -------------------------------
fa9e4066f08beec538e775443c5be79dd423fcabahrens * |pm|pp|pp|pp|pp|cp|cp|cp|cp|cp|
66328dd3ff7c6b3566c06478698593e061733076ahrens * -------------------------------
fa9e4066f08beec538e775443c5be79dd423fcabahrens * cp - device port number on the HBA SATA controller
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * pp - device port number on the port multiplier
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * pm - 0 - target attached to controller device port
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * 1 - target attached to port multiplier's device port
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* SATA ports to SCSI target number translation */
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock (cport | (pmport << SATA_PMULT_PORT_SHIFT) | SATA_PMULT_AP))
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* SCSI target number to SATA cntrl/pmport/cport translations */
fa9e4066f08beec538e775443c5be79dd423fcabahrens ((scsi_target >> SATA_PMULT_PORT_SHIFT) & SATA_PMULT_PORT_MASK)
66328dd3ff7c6b3566c06478698593e061733076ahrens ((scsi_target & SATA_PMULT_AP) ? SATA_ADDR_DPMPORT : \
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* Debug flags */
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct sata_atapi_cmd {
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* Debug macros */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define SATADBG3(flag, sata, format, arg1, arg2, arg3) \
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* sata_rev_tag 1.46 */
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif /* _SATA_H */