66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CDDL HEADER START
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * The contents of this file are subject to the terms of the
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Common Development and Distribution License (the "License").
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * You may not use this file except in compliance with the License.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * or http://www.opensolaris.org/os/licensing.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * See the License for the specific language governing permissions
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * and limitations under the License.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * When distributing Covered Code, include this CDDL HEADER in each
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * If applicable, add the following below this CDDL HEADER, with the
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * fields enclosed by brackets "[]" replaced with your own identifying
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * information: Portions Copyright [yyyy] [name of copyright owner]
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * CDDL HEADER END
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
0bc523e585d34fb799f65e1c4fd7d163e401a501Alan Perry * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Use is subject to license terms.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
257c04ecb24858f6d68020a41589306f554ea434Marcel Telka/*
257c04ecb24858f6d68020a41589306f554ea434Marcel Telka * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
257c04ecb24858f6d68020a41589306f554ea434Marcel Telka */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#ifndef _SATA_H
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define _SATA_H
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#ifdef __cplusplus
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfextern "C" {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#endif
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Generic SATA Host Adapter Implementation
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#include <sys/types.h>
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#include <sys/scsi/scsi.h>
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#include <sys/scsi/impl/services.h>
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#include <sys/sata/sata_defs.h>
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#include <sys/sata/sata_hba.h>
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw/* Common flags specifying current state of a port or an attached drive. */
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw#define SATA_STATE_PROBING 0x000001
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw#define SATA_STATE_PROBED 0x000002
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/* Statistics counters */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstruct sata_port_stats {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint64_t link_lost; /* event counter */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint64_t link_established; /* event counter */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint64_t device_attached; /* event counter */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint64_t device_detached; /* event counter */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint64_t port_reset; /* event counter */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint64_t port_pwr_changed; /* event counter */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf};
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlftypedef struct sata_port_stats sata_port_stats_t;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstruct sata_drive_stats {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint64_t media_error; /* available ??? */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint64_t drive_reset; /* event counter */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf} sata_drv_stats_t;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlftypedef struct sata_drive_stats sata_drive_stats_t;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstruct sata_ctrl_stats {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint64_t ctrl_reset; /* event counter */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint64_t ctrl_pwr_change; /* event counter */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf};
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlftypedef struct sata_ctrl_stats sata_ctrl_stats_t;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA HBA instance info structure
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstruct sata_hba_inst {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf dev_info_t *satahba_dip; /* this HBA instance devinfo */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf struct sata_hba_inst *satahba_next; /* ptr to next sata_hba_inst */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf struct sata_hba_inst *satahba_prev; /* ptr to prev sata_hba_inst */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf struct scsi_hba_tran *satahba_scsi_tran; /* scsi_hba_tran */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf struct sata_hba_tran *satahba_tran; /* sata_hba_tran */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf kmutex_t satahba_mutex; /* sata hba cntrl mutex */
7a1efdfee8cbdecea34d3d866bbfb46e39b06e0apawelw struct taskq *satahba_taskq; /* cmd completion task queue */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * HBA event flags:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_EVNT_MAIN
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_EVNT_PWR_LEVEL_CHANGED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_EVNT_SKIP
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint_t satahba_event_flags;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf struct sata_cport_info *satahba_dev_port[SATA_MAX_CPORTS];
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * DEVCTL open flag:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_DEVCTL_SOPENED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_DEVCTL_EXOPENED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint_t satahba_open_flag; /* shared open flag */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf struct sata_ctrl_stats satahba_stats; /* HBA cntrl statistics */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint_t satahba_attached; /* HBA attaching: */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* 0 - not completed */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* 1 - completed */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf};
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlftypedef struct sata_hba_inst sata_hba_inst_t;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA controller's device port info and state.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * This structure is pointed to by the sata_hba_inst.satahba_dev_port[x]
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * where x is a device port number.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * cport_state holds port state flags, defined in sata_hba.h file.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * cport_event_flags holds SATA_EVNT_* flags defined in this file and in
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * sata_hba.h file.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * cport_dev_type holds SATA_DTYPE_* types defined in sata_hba.h file.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstruct sata_cport_info {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_address_t cport_addr; /* this port SATA address */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf kmutex_t cport_mutex; /* port mutex */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Port state flags
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_STATE_UNKNOWN
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_STATE_PROBING
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_STATE_PROBED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_STATE_READY
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_PSTATE_PWRON
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_PSTATE_PWROFF
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_PSTATE_SHUTDOWN
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_PSTATE_FAILED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint32_t cport_state;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Port event flags:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_EVNT_DEVICE_ATTACHED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_EVNT_DEVICE_DETACHED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_EVNT_LINK_LOST
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_EVNT_LINK_ESTABLISHED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_EVNT_PORT_FAILED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_EVNT_PWR_LEVEL_CHANGED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint32_t cport_event_flags;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf struct sata_port_scr cport_scr; /* Port status and ctrl regs */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Attached device type:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_DTYPE_NONE
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_DTYPE_ATADISK
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_DTYPE_ATAPICD
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China * SATA_DTYPE_ATAPITAPE
f8a673ad9145b262edb65a98fb3fb92027d23a05ying tian - Beijing China * SATA_DTYPE_ATAPIDISK
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_DTYPE_PMULT
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_DTYPE_UNKNOWN
257c04ecb24858f6d68020a41589306f554ea434Marcel Telka * SATA_DTYPE_ATAPIPROC
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint32_t cport_dev_type;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf union {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf struct sata_drive_info *cport_sata_drive; /* Attached drive info */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf struct sata_pmult_info *cport_sata_pmult; /* Attached Port Mult */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf } cport_devp;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* lbolt value at link lost */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf clock_t cport_link_lost_time;
6ed1276fb5fe78fb1cce38682748a830ef8bd157pawelw /* lbolt value @ dev attached */
6ed1276fb5fe78fb1cce38682748a830ef8bd157pawelw clock_t cport_dev_attach_time;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf struct sata_port_stats cport_stats; /* Port statistics */
4360436b3c604bc28d37be269ad152b4c38157c3pawelw
4360436b3c604bc28d37be269ad152b4c38157c3pawelw boolean_t cport_tgtnode_clean; /* Target node usable */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf};
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlftypedef struct sata_cport_info sata_cport_info_t;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Attached SATA drive info and state.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * This structure is pointed to by sata_cport_info's cport_sata_drive field
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * when a drive is attached directly to a controller device port.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstruct sata_drive_info {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_address_t satadrv_addr; /* this drive SATA address */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Drive state flags
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_STATE_UNKNOWN
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_STATE_PROBING
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_STATE_PROBED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_STATE_READY
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_DSTATE_PWR_ACTIVE
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_DSTATE_PWR_IDLE
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_DSTATE_RESET
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_DSTATE_FAILED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint32_t satadrv_state;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * drive event flags:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_EVNT_DRIVE_RESET
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint32_t satadrv_event_flags;
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw /*
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw * lbolt value @ start of
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw * device reset processing
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw */
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw clock_t satadrv_reset_time;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Attached device type:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_DTYPE_ATADISK
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_DTYPE_ATAPICD
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China * SATA_DTYPE_ATAPITAPE
f8a673ad9145b262edb65a98fb3fb92027d23a05ying tian - Beijing China * SATA_DTYPE_ATAPIDISK
257c04ecb24858f6d68020a41589306f554ea434Marcel Telka * SATA_DTYPE_ATAPIPROC
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint32_t satadrv_type;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint32_t satadrv_status_reg; /* drive status reg */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint32_t satadrv_error_reg; /* drive error reg */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint16_t satadrv_features_support; /* drive features support */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint16_t satadrv_queue_depth; /* drive queue depth */
2038334ab26baaa43c9083f35def041511c3cc1fUnknown uint16_t satadrv_atapi_cdb_len; /* atapi supported cdb length */
2038334ab26baaa43c9083f35def041511c3cc1fUnknown uint16_t satadrv_atapi_trans_ver; /* atapi transport version */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint16_t satadrv_settings; /* drive settings flags */
4e54023805e14cf984b9f0041df73c16334a7a88ls uint16_t satadrv_features_enabled; /* drive features enabled */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint64_t satadrv_capacity; /* drive capacity */
2038334ab26baaa43c9083f35def041511c3cc1fUnknown uint64_t satadrv_max_queue_depth; /* maximum queue depth */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_id_t satadrv_id; /* Device Identify Data */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf struct sata_drive_stats satadrv_stats; /* drive statistics */
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu /*
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu * saved standby timer
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu * [0] - [3] = high - low
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu */
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu uint8_t satadrv_standby_timer[4];
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu uint8_t satadrv_power_level; /* saved power level */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf};
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlftypedef struct sata_drive_info sata_drive_info_t;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf_NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_drive_info))
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/* Port Multiplier & host port info and state */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstruct sata_pmult_info {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_address_t pmult_addr; /* this PMult SATA Address */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * PMult state flags
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_STATE_UNKNOWN
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_STATE_PROBING
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_STATE_PROBED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_STATE_READY
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_PSTATE_FAILED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint32_t pmult_state;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint32_t pmult_event_flags; /* Undefined for now */
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang struct sata_pmult_gscr pmult_gscr; /* PMult GSCR block */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint32_t pmult_num_dev_ports; /* Number of data ports */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf struct sata_pmport_info *pmult_dev_port[SATA_MAX_PMPORTS - 1];
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf};
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlftypedef struct sata_pmult_info sata_pmult_info_t;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang_NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_pmult_info))
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang_NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang sata_pmult_info::pmult_dev_port))
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/* Port Multiplier's device port info & state */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlfstruct sata_pmport_info {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_address_t pmport_addr; /* this SATA port address */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf kmutex_t pmport_mutex; /* pmult device port mutex */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Port state flags
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_STATE_UNKNOWN
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_STATE_PROBING
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_STATE_PROBED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_STATE_READY
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_PSTATE_PWRON
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_PSTATE_PWROFF
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_PSTATE_SHUTDOWN
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_PSTATE_FAILED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint32_t pmport_state;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Port event flags:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_EVNT_DEVICE_ATTACHED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_EVNT_DEVICE_DETACHED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_EVNT_LINK_LOST
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_EVNT_LINK_ESTABLISHED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_EVNT_PORT_FAILED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_EVNT_PWR_LEVEL_CHANGED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint32_t pmport_event_flags;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf struct sata_port_scr pmport_scr; /* PMult device port scr */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Attached device type:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_DTYPE_NONE
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_DTYPE_ATADISK
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_DTYPE_ATAPICD
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China * SATA_DTYPE_ATAPITAPE
f8a673ad9145b262edb65a98fb3fb92027d23a05ying tian - Beijing China * SATA_DTYPE_ATAPIDISK
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_DTYPE_UNKNOWN
257c04ecb24858f6d68020a41589306f554ea434Marcel Telka * SATA_DTYPE_ATAPIPROC
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint32_t pmport_dev_type;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf struct sata_drive_info *pmport_sata_drive; /* Attached drive info */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* lbolt value at link lost */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf clock_t pmport_link_lost_time;
6ed1276fb5fe78fb1cce38682748a830ef8bd157pawelw /* lbolt value @ dev attached */
6ed1276fb5fe78fb1cce38682748a830ef8bd157pawelw clock_t pmport_dev_attach_time;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf struct sata_port_stats pmport_stats; /* Port statistics */
4360436b3c604bc28d37be269ad152b4c38157c3pawelw
4360436b3c604bc28d37be269ad152b4c38157c3pawelw boolean_t pmport_tgtnode_clean; /* Target node usable */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf};
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlftypedef struct sata_pmport_info sata_pmport_info_t;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu/*
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu * sata drive's power level
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu * default value is active
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu */
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu#define SATA_POWER_ACTIVE 0x00
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu#define SATA_POWER_IDLE 0x01
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu#define SATA_POWER_STANDBY 0x02
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu#define SATA_POWER_STOPPED 0x03
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu/*
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu * pm-capable value definition according to PSARC 2009/310
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu */
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu#define SATA_CAP_POWER_CONDITON PM_CAPABLE_SPC4
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu#define SATA_CAP_SMART_PAGE PM_CAPABLE_SMART_LOG
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu#define SATA_CAP_LOG_SENSE PM_CAPABLE_LOG_SUPPORTED
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Port SSTATUS register (sata_port_scr sport_sstatus field).
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Link bits are valid only in port active state.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_PORT_DEVLINK_UP 0x00000103 /* Link with dev established */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_PORT_DEVLINK_UP_MASK 0x0000010F /* Mask for link bits */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Port state clear mask (cport_state and pmport_state fields).
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_PSTATE_SHUTDOWN and power state are preserved.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_PORT_STATE_CLEAR_MASK (~(SATA_PSTATE_SHUTDOWN))
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Valid i.e.supported device types mask (cport_dev_type, satadrv_type,
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * pmult_dev_type fields).
2038334ab26baaa43c9083f35def041511c3cc1fUnknown * ATA disks and ATAPI CD/DVD now.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
2038334ab26baaa43c9083f35def041511c3cc1fUnknown#define SATA_VALID_DEV_TYPE (SATA_DTYPE_ATADISK | \
385470574fb49e32c324af06c01d697a16cc3c4bying tian - Beijing China SATA_DTYPE_ATAPICD | \
f8a673ad9145b262edb65a98fb3fb92027d23a05ying tian - Beijing China SATA_DTYPE_ATAPITAPE | \
f8a673ad9145b262edb65a98fb3fb92027d23a05ying tian - Beijing China SATA_DTYPE_ATAPIDISK)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Device feature_support (satadrv_features_support)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DEV_F_DMA 0x01
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DEV_F_LBA28 0x02
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DEV_F_LBA48 0x04
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DEV_F_NCQ 0x08
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DEV_F_SATA1 0x10
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DEV_F_SATA2 0x20
489f952b4388bd1ea1feff97164a4416e0c621eals#define SATA_DEV_F_TCQ 0x40 /* Non NCQ tagged queuing */
13c8743e4d3cc6d9653687512c0d48d2b653513dMarcel Telka#define SATA_DEV_F_SATA3 0x80
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
4e54023805e14cf984b9f0041df73c16334a7a88ls/*
4e54023805e14cf984b9f0041df73c16334a7a88ls * Device features enabled (satadrv_features_enabled)
4e54023805e14cf984b9f0041df73c16334a7a88ls */
4e54023805e14cf984b9f0041df73c16334a7a88ls#define SATA_DEV_F_E_TAGGED_QING 0x01 /* Tagged queuing enabled */
4e54023805e14cf984b9f0041df73c16334a7a88ls#define SATA_DEV_F_E_UNTAGGED_QING 0x02 /* Untagged queuing enabled */
4e54023805e14cf984b9f0041df73c16334a7a88ls
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Drive settings flags (satdrv_settings)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DEV_READ_AHEAD 0x0001 /* Read Ahead enabled */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DEV_WRITE_CACHE 0x0002 /* Write cache ON */
2038334ab26baaa43c9083f35def041511c3cc1fUnknown#define SATA_DEV_DMA 0x0004 /* DMA selected */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DEV_SERIAL_FEATURES 0x8000 /* Serial ATA feat. enabled */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DEV_ASYNCH_NOTIFY 0x2000 /* Asynch-event enabled */
2038334ab26baaa43c9083f35def041511c3cc1fUnknown#define SATA_DEV_RMSN 0x0100 /* Rem Media Stat Notfc enbl */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Internal event and flags.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * These flags are set in the *_event_flags fields of various structures.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Events and lock flags defined below are used internally by the
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA framework (they are not reported by SATA HBA drivers).
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_EVNT_MAIN 0x80000000
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_EVNT_SKIP 0x40000000
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_EVNT_INPROC_DEVICE_RESET 0x08000000
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_EVNT_CLEAR_DEVICE_RESET 0x04000000
4360436b3c604bc28d37be269ad152b4c38157c3pawelw#define SATA_EVNT_TARGET_NODE_CLEANUP 0x00000100
c75976d12071ddd21443266260066ba036671682pawelw#define SATA_EVNT_AUTOONLINE_DEVICE 0x00000200
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Lock flags - used to serialize configuration operations
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * on ports and devices.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_EVNT_LOCK_PORT_BUSY is set by event daemon to prevent
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * simultaneous cfgadm operations.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SATA_APCTL_LOCK_PORT_BUSY is set by cfgadm ioctls to prevent
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * simultaneous event processing.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_EVNT_LOCK_PORT_BUSY 0x00800000
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_APCTL_LOCK_PORT_BUSY 0x00400000
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/* Mask for port events */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_EVNT_PORT_EVENTS (SATA_EVNT_DEVICE_ATTACHED | \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf SATA_EVNT_DEVICE_DETACHED | \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf SATA_EVNT_LINK_LOST | \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf SATA_EVNT_LINK_ESTABLISHED | \
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang SATA_EVNT_PMULT_LINK_CHANGED | \
4360436b3c604bc28d37be269ad152b4c38157c3pawelw SATA_EVNT_PORT_FAILED | \
c75976d12071ddd21443266260066ba036671682pawelw SATA_EVNT_TARGET_NODE_CLEANUP | \
c75976d12071ddd21443266260066ba036671682pawelw SATA_EVNT_AUTOONLINE_DEVICE)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/* Mask for drive events */
4360436b3c604bc28d37be269ad152b4c38157c3pawelw#define SATA_EVNT_DRIVE_EVENTS (SATA_EVNT_DEVICE_RESET | \
4360436b3c604bc28d37be269ad152b4c38157c3pawelw SATA_EVNT_INPROC_DEVICE_RESET)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_EVNT_CONTROLLER_EVENTS SATA_EVNT_PWR_LEVEL_CHANGED
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
c75976d12071ddd21443266260066ba036671682pawelw/* Delays and timeout duration definitions */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_EVNT_DAEMON_SLEEP_TIME 50000 /* 50 ms */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_EVNT_DAEMON_TERM_TIMEOUT 100000 /* 100 ms */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_EVNT_DAEMON_TERM_WAIT 60000000 /* 60 s */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_EVNT_LINK_LOST_TIMEOUT 1000000 /* 1 s */
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw#define SATA_DEV_IDENTIFY_TIMEOUT 60000000 /* 60 s, device enumeration */
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw#define SATA_DEV_REPROBE_TIMEOUT 30000000 /* 30 s, dev resp after rst */
4372d277de71fc7c19cb9f41df9b8757b34e2cc5pawelw#define SATA_DEV_RETRY_DLY 10000 /* 10 ms */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
6ed1276fb5fe78fb1cce38682748a830ef8bd157pawelw/* DEVICE IDENTIFY and device initialization retry delay */
6ed1276fb5fe78fb1cce38682748a830ef8bd157pawelw#define SATA_DEV_IDENTIFY_RETRY 1
6ed1276fb5fe78fb1cce38682748a830ef8bd157pawelw#define SATA_DEV_IDENTIFY_NORETRY 0
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * sata_scsi's hba_open_flag: field indicating open devctl instance.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * 0 = closed, 1 = shared open, 2 = exclusive open.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DEVCTL_CLOSED 0
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DEVCTL_SOPENED 1
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DEVCTL_EXOPENED 2
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * sata_pkt_txlate structure contains info about resources allocated
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * for the packet
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Address of this structure is stored in scsi_pkt.pkt_ha_private and
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * in sata_pkt.sata_hba_private fields, so all three strucures are
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * cross-linked, with sata_pkt_txlate as a centerpiece.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlftypedef struct sata_pkt_txlate {
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf struct sata_hba_inst *txlt_sata_hba_inst;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf struct scsi_pkt *txlt_scsi_pkt;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf struct sata_pkt *txlt_sata_pkt;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ddi_dma_handle_t txlt_buf_dma_handle;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint_t txlt_flags; /* data-in / data-out */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint_t txlt_num_dma_win; /* number of DMA windows */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint_t txlt_cur_dma_win; /* current DMA window */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf /* cookies in the current DMA window */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint_t txlt_curwin_num_dma_cookies;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
4360436b3c604bc28d37be269ad152b4c38157c3pawelw /* processed dma cookies in current DMA win */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf uint_t txlt_curwin_processed_dma_cookies;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf size_t txlt_total_residue;
4360436b3c604bc28d37be269ad152b4c38157c3pawelw ddi_dma_cookie_t txlt_dma_cookie; /* default dma cookie */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf int txlt_dma_cookie_list_len; /* alloc list len */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ddi_dma_cookie_t *txlt_dma_cookie_list; /* dma cookie list */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf int txlt_num_dma_cookies; /* dma cookies in list */
7a70ede882eacbae00c8d5209afb443e7755684cpawelw
7a70ede882eacbae00c8d5209afb443e7755684cpawelw /* temporary buffer access handle */
7a70ede882eacbae00c8d5209afb443e7755684cpawelw ddi_acc_handle_t txlt_tmp_buf_handle;
7a70ede882eacbae00c8d5209afb443e7755684cpawelw caddr_t txlt_tmp_buf; /* temp buffer address */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf} sata_pkt_txlate_t;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf_NOTE(SCHEME_PROTECTS_DATA("unshared data", sata_pkt_txlate))
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf_NOTE(SCHEME_PROTECTS_DATA("unshared data", scsi_pkt))
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry/* Length of largest sense buffer used by sata */
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry#define SATA_MAX_SENSE_LEN MAX(sizeof (struct scsi_arq_status), \
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry sizeof (struct scsi_arq_status) - sizeof (struct scsi_extended_sense) + \
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry sizeof (struct scsi_descr_sense_hdr) + \
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry MAX(sizeof (struct scsi_cmd_specific_sense_descr), \
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry sizeof (struct scsi_ata_status_ret_sense_descr)))
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry/*
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry * Sense Data structure for ATA Pass Through
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry * This is the entire sense data block passed back up to scsi. It is
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry * effectively the scsi_arq_status structure for ATA Sense Return descriptor
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry * format sense data.
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry */
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perrystruct sata_apt_sense_data {
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry struct scsi_status apt_status;
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry struct scsi_status apt_rqpkt_status;
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry uchar_t apt_rqpkt_reason;
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry uchar_t apt_rqpkt_resid;
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry uint_t apt_rqpkt_state;
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry uint_t apt_rqpkt_statistics;
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry struct scsi_descr_sense_hdr apt_sd_hdr;
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry struct scsi_ata_status_ret_sense_descr apt_sd_sense;
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry};
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Additional scsi sense code definitions.
2038334ab26baaa43c9083f35def041511c3cc1fUnknown * These definition should eventually be moved to scsi header file
2038334ab26baaa43c9083f35def041511c3cc1fUnknown * usr/src/uts/common/sys/scsi/generic/sense.h
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
2038334ab26baaa43c9083f35def041511c3cc1fUnknown#define SD_SCSI_ASC_NO_ADD_SENSE 0x00
2acf01fd73874e9b92c066e8deb5270d92b083baYuri Pankov#define SD_SCSI_ASC_APT_INFO_AVAIL 0x00
2038334ab26baaa43c9083f35def041511c3cc1fUnknown#define SD_SCSI_ASC_LU_NOT_READY 0x04
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry#define SD_SCSI_ASC_LU_NOT_RESPONSE 0x05
c75976d12071ddd21443266260066ba036671682pawelw#define SD_SCSI_ASC_WRITE_ERR 0x0c
c75976d12071ddd21443266260066ba036671682pawelw#define SD_SCSI_ASC_UNREC_READ_ERR 0x11
2038334ab26baaa43c9083f35def041511c3cc1fUnknown#define SD_SCSI_ASC_INVALID_COMMAND_CODE 0x20
2038334ab26baaa43c9083f35def041511c3cc1fUnknown#define SD_SCSI_ASC_LBA_OUT_OF_RANGE 0x21
2038334ab26baaa43c9083f35def041511c3cc1fUnknown#define SD_SCSI_ASC_INVALID_FIELD_IN_CDB 0x24
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu#define SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST 0x26
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry#define SD_SCSI_ASC_WRITE_PROTECTED 0x27
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry#define SD_SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED 0x28
2038334ab26baaa43c9083f35def041511c3cc1fUnknown#define SD_SCSI_ASC_RESET 0x29
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu#define SD_SCSI_ASC_CMD_SEQUENCE_ERR 0x2c
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry#define SD_SCSI_ASC_MEDIUM_NOT_PRESENT 0x3a
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry#define SD_SCSI_ASC_SAVING_PARAMS_NOT_SUPPORTED 0x39
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry#define SD_SCSI_ASC_INTERNAL_TARGET_FAILURE 0x44
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry#define SD_SCSI_ASC_INFO_UNIT_IUCRC_ERR 0x47
63aa537723d4883425b44d96b6316b7ad14053fcAlan Perry#define SD_SCSI_ASC_OP_MEDIUM_REM_REQ 0x5a
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu#define SD_SCSI_ASC_LOW_POWER_CONDITION_ON 0x5e
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/* SCSI defs missing from scsi headers */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/* Missing from sys/scsi/generic/commands.h */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SCMD_SYNCHRONIZE_CACHE_G1 0x91
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Missing from sys/scsi/impl/mode.h, although defined
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * in sys/scsi/targets/sddefs.h as MODEPAGE_ERR_RECOV
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define MODEPAGE_RW_ERRRECOV 0x01 /* read/write recovery */
0bc523e585d34fb799f65e1c4fd7d163e401a501Alan Perry/* Missing from sys/scsi/impl/commands.h */
0bc523e585d34fb799f65e1c4fd7d163e401a501Alan Perry#define SCSI_READ_CAPACITY16_MAX_LBA 0xfffffffffffffffe
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu/*
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu * medium access command
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu */
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu#define SATA_IS_MEDIUM_ACCESS_CMD(cmd) \
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu (((cmd) == SCMD_READ) || ((cmd) == SCMD_WRITE) || \
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu ((cmd) == SCMD_READ_G1) || ((cmd) == SCMD_WRITE_G1) || \
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu ((cmd) == SCMD_READ_G4) || ((cmd) == SCMD_WRITE_G4) || \
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu ((cmd) == SCMD_READ_G5) || ((cmd) == SCMD_WRITE_G5) || \
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu ((cmd) == SCMD_VERIFY) || ((cmd) == SCMD_VERIFY_G4) || \
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu ((cmd) == SCMD_VERIFY_G5) || ((cmd) == 0x7f) /* VERIFY(32) */|| \
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu ((cmd) == SCMD_SYNCHRONIZE_CACHE) || ((cmd) == SCMD_SPACE_G4) || \
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu ((cmd) == SCMD_READ_POSITION) || \
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu ((cmd) == 0x90) /* PRE-FETCH(16) */ || \
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu ((cmd) == SCMD_READ_DEFECT_LIST) || \
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu ((cmd) == 0xb7) /* READ DEFECT DATA */ || \
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu ((cmd) == SCMD_READ_LONG) || ((cmd) == SCMD_SVC_ACTION_IN_G4) || \
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu ((cmd) == SCMD_WRITE_LONG) || ((cmd) == SCMD_SVC_ACTION_OUT_G4) || \
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu ((cmd) == 0x41) || ((cmd) == 0x93) || /* WRITE SAME */ \
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu ((cmd) == 0x52) || ((cmd) == 0x50) || /* XDREAD & XDWRITE */ \
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu ((cmd) == 0x53) || ((cmd) == 0x51) || /* XDWRITEREAD & XPWRITE */ \
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu ((cmd) == 0x7f))
2ee4dfc799525d35706ee64a901cd970a7080bb6Jane Chu
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Macros for accessing various structure fields
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_TRAN(sata_hba_inst) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_tran
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DIP(sata_hba_inst) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_dip
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_NUM_CPORTS(sata_hba_inst) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_tran->sata_tran_hba_num_cports
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_QDEPTH(sata_hba_inst) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_tran->sata_tran_hba_qdepth
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_FEATURES(sata_hba_inst) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_tran->sata_tran_hba_features_support
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DMA_ATTR(sata_hba_inst) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_tran->sata_tran_hba_dma_attr
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_START_FUNC(sata_hba_inst) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_tran->sata_tran_start
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_ABORT_FUNC(sata_hba_inst) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_tran->sata_tran_abort
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_RESET_DPORT_FUNC(sata_hba_inst) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_tran->sata_tran_reset_dport
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (sata_hba_inst->satahba_tran->sata_tran_hotplug_ops == NULL ? \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf NULL : \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_tran->sata_tran_hotplug_ops->\
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_tran_port_deactivate)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (sata_hba_inst->satahba_tran->sata_tran_hotplug_ops == NULL ? \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf NULL : \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_tran->sata_tran_hotplug_ops->\
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_tran_port_activate)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_PROBE_PORT_FUNC(sata_hba_inst) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_tran->sata_tran_probe_port
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_SELFTEST_FUNC(sata_hba_inst) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_tran->sata_tran_selftest
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_CPORT_MUTEX(sata_hba_inst, cport) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_dev_port[cport]->cport_mutex
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_CPORT_INFO(sata_hba_inst, cport) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_dev_port[cport]
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_CPORT_STATE(sata_hba_inst, cport) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_dev_port[cport]->cport_state
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
4360436b3c604bc28d37be269ad152b4c38157c3pawelw#define SATA_CPORT_EVENT_FLAGS(sata_hba_inst, cport) \
4360436b3c604bc28d37be269ad152b4c38157c3pawelw sata_hba_inst->satahba_dev_port[cport]->cport_event_flags
4360436b3c604bc28d37be269ad152b4c38157c3pawelw
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_CPORT_SCR(sata_hba_inst, cport) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_dev_port[cport]->cport_scr
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_dev_port[cport]->cport_dev_type
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_CPORT_DRV_INFO(sata_hba_inst, cport) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_dev_port[cport]->cport_devp.cport_sata_drive
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_CPORTINFO_DRV_TYPE(cportinfo) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cportinfo->cport_dev_type
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_CPORTINFO_DRV_INFO(cportinfo) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cportinfo->cport_devp.cport_sata_drive
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_CPORTINFO_PMULT_INFO(cportinfo) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cportinfo->cport_devp.cport_sata_pmult
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_PMULT_INFO(sata_hba_inst, cport) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_dev_port[cport]->cport_devp.cport_sata_pmult
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_NUM_PMPORTS(sata_hba_inst, cport) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_dev_port[cport]->\
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cport_devp.cport_sata_pmult->pmult_num_dev_ports
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang#define SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport) \
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang sata_hba_inst->satahba_dev_port[cport]->\
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_mutex
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_PMPORT_INFO(sata_hba_inst, cport, pmport) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_dev_port[cport]->\
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cport_devp.cport_sata_pmult->pmult_dev_port[pmport]
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_dev_port[cport]->\
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->\
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf pmport_sata_drive
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_dev_port[cport]->\
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_state
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_PMPORT_SCR(sata_hba_inst, cport, pmport) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_dev_port[cport]->\
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_scr
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport, pmport) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_hba_inst->satahba_dev_port[cport]->\
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->pmport_dev_type
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang#define SATA_PMPORT_EVENT_FLAGS(sata_hba_inst, cport, pmport) \
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang sata_hba_inst->satahba_dev_port[cport]->\
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang cport_devp.cport_sata_pmult->pmult_dev_port[pmport]->\
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang pmport_event_flags
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang
c75976d12071ddd21443266260066ba036671682pawelw#define SATA_PMPORTINFO_DRV_TYPE(pmportinfo) \
c75976d12071ddd21443266260066ba036671682pawelw pmportinfo->pmport_dev_type
c75976d12071ddd21443266260066ba036671682pawelw
c75976d12071ddd21443266260066ba036671682pawelw#define SATA_PMPORTINFO_DRV_INFO(pmportinfo) \
c75976d12071ddd21443266260066ba036671682pawelw pmportinfo->pmport_sata_drive
c75976d12071ddd21443266260066ba036671682pawelw
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_TXLT_HBA_INST(spx) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf spx->txlt_sata_hba_inst
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_TXLT_CPORT(spx) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang#define SATA_TXLT_PMPORT(spx) \
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang spx->txlt_sata_pkt->satapkt_device.satadev_addr.pmport
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang#define SATA_TXLT_QUAL(spx) \
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_TXLT_CPORT_MUTEX(spx) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf spx->txlt_sata_hba_inst->\
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf satahba_dev_port[spx->txlt_sata_pkt->\
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf satapkt_device.satadev_addr.cport]->cport_mutex
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
7a1efdfee8cbdecea34d3d866bbfb46e39b06e0apawelw#define SATA_TXLT_TASKQ(spx) \
7a1efdfee8cbdecea34d3d866bbfb46e39b06e0apawelw spx->txlt_sata_hba_inst->\
7a1efdfee8cbdecea34d3d866bbfb46e39b06e0apawelw satahba_taskq
7a1efdfee8cbdecea34d3d866bbfb46e39b06e0apawelw
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Minor number construction for devctl and attachment point nodes.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * All necessary information has to be encoded in NBITSMINOR32 bits.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Devctl node minor number:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * ((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | SATA_DEVCTL_NODE)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Attachment point node minor number has to include controller
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * instance (7 bits), controller port number (5 bits) and port multiplier
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * device port number (4 bits) and port multiplier device port
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * indicator (1 bit). Additionally, a single bit is used to
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * differentiate between attachment point node and device control node.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Attachment point minor number:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * ((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | SATA_AP_NODE |
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * [(port_multiplier_device_port << SATA_PMULT_PORT_SHIFT) | SATA_PMULT_AP] |
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * (controller_port))
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * 17 bits are used (if 64 instances of controllers are expected)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * bit 18 is reserved for future use.
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * --------------------------------------------------------
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * |17|16|15|14|13|12|11|10 |09|08|07|06|05|04|03|02|01|00|
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * --------------------------------------------------------
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * | R| c| c| c| c| c| c|a/d|pm|pp|pp|pp|pp|cp|cp|cp|cp|cp|
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * --------------------------------------------------------
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Where:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * cp - device port number on the HBA SATA controller
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * pp - device port number on the port multiplier
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * pm - 0 - target attached to controller device port
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * 1 - target attached to port multiplier's device port
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * a/d - 0 - devctl node
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * 1 - attachment point node
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * c - controller number
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * R - reserved bit
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_AP_NODE 0x400 /* Attachment Point node */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DEVCTL_NODE 0x000 /* DEVCTL node */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_PMULT_AP 0x200 /* device on PMult port */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_PMULT_PORT_SHIFT 5
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_CNTRL_INSTANCE_SHIFT 11
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_CPORT_MASK 0x1f /* 32 device ports */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_PMULT_PORT_MASK 0xf /* 15 device ports */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_CNTRL_INSTANCE_MASK 0x03F /* 64 controllers */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/* Macro for creating devctl node minor number */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_MAKE_DEVCTL_MINOR(controller_instance) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ((controller_instance << SATA_CNTRL_INSTANCE_SHIFT) | \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf SATA_DEVCTL_NODE)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/* Macro for creating an attachment point node minor number */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_MAKE_AP_MINOR(cntrl_instance, cport, pmport, qual) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (qual & (SATA_ADDR_PMPORT | SATA_ADDR_DPMPORT) ? \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (((cntrl_instance) << SATA_CNTRL_INSTANCE_SHIFT) | \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf SATA_AP_NODE | SATA_PMULT_AP | \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (pmport << SATA_PMULT_PORT_SHIFT) | cport) : \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (((cntrl_instance) << SATA_CNTRL_INSTANCE_SHIFT) | \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf SATA_AP_NODE | cport))
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/* Macro retrieving controller number from a minor number */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_MINOR2INSTANCE(minor) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ((minor >> SATA_CNTRL_INSTANCE_SHIFT) & SATA_CNTRL_INSTANCE_MASK)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
f76ee27a7c2e4dbe22aec6ce187c04e980f90349pawelw/*
f76ee27a7c2e4dbe22aec6ce187c04e980f90349pawelw * Macro for creating an attachment point number from sata address.
f76ee27a7c2e4dbe22aec6ce187c04e980f90349pawelw * Address qualifier has to be one of:
f76ee27a7c2e4dbe22aec6ce187c04e980f90349pawelw * SATA_ADDR_DCPORT, SATA_ADDR_DPMPORT, SATA_ADDR_CPORT or SATA_ADDR_PMPORT
f76ee27a7c2e4dbe22aec6ce187c04e980f90349pawelw */
f76ee27a7c2e4dbe22aec6ce187c04e980f90349pawelw#define SATA_MAKE_AP_NUMBER(cport, pmport, qual) \
f76ee27a7c2e4dbe22aec6ce187c04e980f90349pawelw ((qual & (SATA_ADDR_PMPORT | SATA_ADDR_DPMPORT)) ? \
f76ee27a7c2e4dbe22aec6ce187c04e980f90349pawelw (SATA_PMULT_AP | (pmport << SATA_PMULT_PORT_SHIFT) | cport) : \
f76ee27a7c2e4dbe22aec6ce187c04e980f90349pawelw (cport))
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/*
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * SCSI target number format
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf *
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * -------------------------------
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * | 9| 8| 7| 6| 5| 4| 3| 2| 1| 0| Bit number
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * -------------------------------
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * |pm|pp|pp|pp|pp|cp|cp|cp|cp|cp|
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * -------------------------------
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * Where:
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * cp - device port number on the HBA SATA controller
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * pp - device port number on the port multiplier
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * pm - 0 - target attached to controller device port
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf * 1 - target attached to port multiplier's device port
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/* SATA ports to SCSI target number translation */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_TO_SCSI_TARGET(cport, pmport, qual) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (qual == SATA_ADDR_DCPORT ? cport : \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (cport | (pmport << SATA_PMULT_PORT_SHIFT) | SATA_PMULT_AP))
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/* SCSI target number to SATA cntrl/pmport/cport translations */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SCSI_TO_SATA_CPORT(scsi_target) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf (scsi_target & SATA_CPORT_MASK)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SCSI_TO_SATA_PMPORT(scsi_target) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ((scsi_target >> SATA_PMULT_PORT_SHIFT) & SATA_PMULT_PORT_MASK)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SCSI_TO_SATA_ADDR_QUAL(scsi_target) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf ((scsi_target & SATA_PMULT_AP) ? SATA_ADDR_DPMPORT : \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf SATA_ADDR_DCPORT)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/* Debug flags */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#if DEBUG
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DEBUG
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DBG_SCSI_IF 1
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DBG_HBA_IF 2
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DBG_NODES 4
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DBG_IOCTL_IF 8
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DBG_EVENTS 0x10
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DBG_EVENTS_PROC 0x20
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DBG_EVENTS_PROCPST 0x40
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DBG_EVENTS_CNTRL 0x80
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DBG_EVENTS_DAEMON 0x100
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATA_DBG_DMA_SETUP 0x400
b73432889acd6e0776a9b3e58e911c13c7667a31pawelw#define SATA_DBG_DEV_SETTINGS 0x800
2038334ab26baaa43c9083f35def041511c3cc1fUnknown#define SATA_DBG_ATAPI 0x1000
2038334ab26baaa43c9083f35def041511c3cc1fUnknown#define SATA_DBG_ATAPI_PACKET 0x8000
3852f6739b148db36d43cd6e758a0855fd49f24cPawel Wojcik#define SATA_DBG_INTR_CTX 0x10000
8aa6aadbbfba50077655c6a46a5e269c880e4ab4Xiao-Yu Zhang#define SATA_DBG_PMULT 0x20000
2038334ab26baaa43c9083f35def041511c3cc1fUnknown
2038334ab26baaa43c9083f35def041511c3cc1fUnknowntypedef struct sata_atapi_cmd {
2038334ab26baaa43c9083f35def041511c3cc1fUnknown uint8_t acdb[SATA_ATAPI_MAX_CDB_LEN];
2038334ab26baaa43c9083f35def041511c3cc1fUnknown uint8_t arqs[SATA_ATAPI_RQSENSE_LEN];
2038334ab26baaa43c9083f35def041511c3cc1fUnknown uint_t sata_pkt_reason;
2038334ab26baaa43c9083f35def041511c3cc1fUnknown uint_t scsi_pkt_reason;
2038334ab26baaa43c9083f35def041511c3cc1fUnknown} sata_atapi_cmd_t;
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf/* Debug macros */
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATADBG1(flag, sata, format, arg1) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (sata_debug_flags & (flag)) { \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_log(sata, CE_CONT, format, arg1); \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATADBG2(flag, sata, format, arg1, arg2) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (sata_debug_flags & (flag)) { \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_log(sata, CE_CONT, format, arg1, arg2); \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATADBG3(flag, sata, format, arg1, arg2, arg3) \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf if (sata_debug_flags & (flag)) { \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf sata_log(sata, CE_CONT, format, arg1, arg2, arg3); \
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf }
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#else
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATADBG1(flag, dip, frmt, arg1)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATADBG2(flag, dip, frmt, arg1, arg2)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#define SATADBG3(flag, dip, frmt, arg1, arg2, arg3)
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#endif
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
918304a3bd962ac065ad520336a044d94b40ad16Xiao-Yu Zhang/* sata_rev_tag 1.46 */
3852f6739b148db36d43cd6e758a0855fd49f24cPawel Wojcik
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#ifdef __cplusplus
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf}
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#endif
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf
66f9d5cb3cc0652e2d9d1366fb950efbe4ca2f24mlf#endif /* _SATA_H */