b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * CDDL HEADER START
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth *
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * The contents of this file are subject to the terms of the
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * Common Development and Distribution License, Version 1.0 only
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * (the "License"). You may not use this file except in compliance
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * with the License.
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth *
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * or http://www.opensolaris.org/os/licensing.
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * See the License for the specific language governing permissions
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * and limitations under the License.
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth *
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * When distributing Covered Code, include this CDDL HEADER in each
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * If applicable, add the following below this CDDL HEADER, with the
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * fields enclosed by brackets "[]" replaced with your own identifying
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * information: Portions Copyright [yyyy] [name of copyright owner]
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth *
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * CDDL HEADER END
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * Use is subject to license terms.
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#ifndef _SYS_SCSI_ADAPTERS_EMUL64VAR_H
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define _SYS_SCSI_ADAPTERS_EMUL64VAR_H
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#pragma ident "%Z%%M% %I% %E% SMI"
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#include <sys/avl.h>
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#include <sys/note.h>
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#include <sys/emul64.h>
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#ifdef __cplusplus
b1dd958f54f8bfa984d306bb8ca8264855761d7bcthextern "C" {
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#endif
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * Convenient short hand defines
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define TRUE 1
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define FALSE 0
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define UNDEFINED -1
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define CNUM(emul64) (ddi_get_instance(emul64->emul64_tran.tran_dev))
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_RETRY_DELAY 5
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_RETRIES 0 /* retry of selections */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_INITIAL_SOFT_SPACE 5 /* Used for the softstate_init func */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define MSW(x) (int16_t)(((int32_t)x >> 16) & 0xFFFF)
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define LSW(x) (int16_t)((int32_t)x & 0xFFFF)
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define TGT(sp) (CMD2PKT(sp)->pkt_address.a_target)
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define LUN(sp) (CMD2PKT(sp)->pkt_address.a_lun)
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define HW_REV(val) (((val) >>8) & 0xff)
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define FW_REV(val) ((val) & 0xff)
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * max number of LUNs per target
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_NLUNS_PER_TARGET 32
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * Default emul64 scsi-options
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_DEFAULT_SCSI_OPTIONS \
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth SCSI_OPTIONS_PARITY | \
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth SCSI_OPTIONS_DR | \
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth SCSI_OPTIONS_SYNC | \
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth SCSI_OPTIONS_TAG | \
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth SCSI_OPTIONS_FAST | \
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth SCSI_OPTIONS_WIDE
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * Tag reject
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define TAG_REJECT 28
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * Interrupt actions returned by emul64_i_flag_event()
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define ACTION_CONTINUE 0 /* Continue */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define ACTION_RETURN 1 /* Exit */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define ACTION_IGNORE 2 /* Ignore */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * Reset actions for emul64_i_reset_interface()
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_RESET_BUS_IF_BUSY 0x01 /* reset scsi bus if it is busy */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_FORCE_RESET_BUS 0x02 /* reset scsi bus on error reco */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * extracting period and offset from emul64_synch
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define PERIOD_MASK(val) ((val) & 0xff)
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define OFFSET_MASK(val) (((val) >>8) & 0xff)
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * timeout values
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_GRACE 10 /* Timeout margin (sec.) */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_TIMEOUT_DELAY(secs, delay) (secs * (1000000 / delay))
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * delay time for polling loops
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_NOINTR_POLL_DELAY_TIME 1000 /* usecs */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * busy wait delay time after chip reset
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_CHIP_RESET_BUSY_WAIT_TIME 100 /* usecs */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * timeout for EMUL64 coming out of reset
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_RESET_WAIT 1000 /* ms */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_SOFT_RESET_TIME 1 /* second */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * emul64_softstate flags for introducing hot plug
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_SS_OPEN 0x01
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_SS_DRAINING 0x02
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_SS_QUIESCED 0x04
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_SS_DRAIN_ERROR 0x08
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * ioctl command definitions
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#ifndef EMUL64_RESET_TARGET
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_RESET_TARGET (('i' << 8) | 0x03)
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#endif
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * Debugging macros
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_DEBUG if (emul64debug) emul64_i_log
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_DEBUG2 if (emul64debug > 1) emul64_i_log
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define REQ_TGT_LUN(tgt, lun) (((tgt) << 8) | (lun))
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define RESP_CQ_FLAGS(resp) ((resp->resp_header.cq_flags_seq) & 0xff)
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_NDATASEGS 4
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * translate scsi_pkt flags into EMUL64 request packet flags
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * It would be illegal if two flags are set; the driver does not
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * check for this. Setting NODISCON and a tag flag is harmless.
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_SET_PKT_FLAGS(scsa_flags, emul64_flags) { \
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth emul64_flags = (scsa_flags >> 11) & 0xe; /* tags */ \
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth emul64_flags |= (scsa_flags >> 1) & 0x1; /* no disconnect */ \
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth}
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * throttle values for EMUL64 request queue
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define SHUTDOWN_THROTTLE -1 /* do not submit any requests */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define CLEAR_THROTTLE (EMUL64_MAX_REQUESTS -1)
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_GET_PKT_STATE(state) ((uint32_t)(state >> 8))
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_GET_PKT_STATS(stats) ((uint32_t)(stats))
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_STAT_NEGOTIATE 0x0080
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_SET_REASON(sp, reason) { \
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth if ((sp) && CMD2PKT(sp)->pkt_reason == CMD_CMPLT) \
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth CMD2PKT(sp)->pkt_reason = (reason); \
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth}
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * mutex short hands
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_REQ_MUTEX(emul64) (&emul64->emul64_request_mutex)
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_RESP_MUTEX(emul64) (&emul64->emul64_response_mutex)
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_HOTPLUG_MUTEX(emul64) (&emul64->emul64_hotplug_mutex)
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_MUTEX_ENTER(emul64) mutex_enter(EMUL64_RESP_MUTEX(emul64)), \
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth mutex_enter(EMUL64_REQ_MUTEX(emul64))
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_MUTEX_EXIT(emul64) mutex_exit(EMUL64_RESP_MUTEX(emul64)), \
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth mutex_exit(EMUL64_REQ_MUTEX(emul64))
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define EMUL64_CV(emul64) (&(emul64)->emul64_cv)
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * HBA interface macros
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define SDEV2TRAN(sd) ((sd)->sd_address.a_hba_tran)
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define SDEV2ADDR(sd) (&((sd)->sd_address))
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define PKT2TRAN(pkt) ((pkt)->pkt_address.a_hba_tran)
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define ADDR2TRAN(ap) ((ap)->a_hba_tran)
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define TRAN2EMUL64(tran) ((struct emul64 *)(tran)->tran_hba_private)
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define SDEV2EMUL64(sd) (TRAN2EMUL64(SDEV2TRAN(sd)))
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define PKT2EMUL64(pkt) (TRAN2EMUL64(PKT2TRAN(pkt)))
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define ADDR2EMUL64(ap) (TRAN2EMUL64(ADDR2TRAN(ap)))
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define CMD2ADDR(cmd) (&CMD2PKT(cmd)->pkt_address)
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define CMD2TRAN(cmd) (CMD2PKT(cmd)->pkt_address.a_hba_tran)
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#define CMD2EMUL64(cmd) (TRAN2EMUL64(CMD2TRAN(cmd)))
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * Results of checking for range overlap.
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcthtypedef enum emul64_rng_overlap {
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth O_NONE, /* No overlap */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth O_SAME, /* Ranges are identical */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth O_SUBSET, /* Blocks are contained in range */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth O_OVERLAP /* Ranges overlap. */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth} emul64_rng_overlap_t;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * Rather than keep the entire image of the disk, we only keep
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * the blocks which have been written with non-zeros. As the
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * purpose of this driver is to exercise format and perhaps other
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * large-disk management tools, only recording the label for
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * i/o is sufficient
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcthtypedef struct blklist {
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth diskaddr_t bl_blkno; /* Disk address of the data */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth uchar_t *bl_data; /* Pointer to the data */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth avl_node_t bl_node; /* Our linkage in AVL tree */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth} blklist_t;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * Structure to track a range of blocks where writes are to be ignored.
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcthtypedef struct emul64_nowrite {
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth struct emul64_nowrite *emul64_nwnext; /* next item in list */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth emul64_range_t emul64_blocked; /* range to ignore writes */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth} emul64_nowrite_t;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcthtypedef struct emul64_tgt {
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth struct scsi_address emul64_tgt_saddr;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth struct emul64_tgt *emul64_tgt_next; /* Next tgt on ctlr */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth emul64_nowrite_t *emul64_tgt_nowrite; /* List of regions to */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth /* skip writes */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth diskaddr_t emul64_tgt_sectors; /* # sectors in dev */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth char emul64_tgt_inq[8+16];
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth uint_t emul64_tgt_dtype;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth uint_t emul64_tgt_ncyls; /* # cylinders in dev */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth uint_t emul64_tgt_nheads; /* # disk heads */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth uint_t emul64_tgt_nsect; /* # sectors */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth uint64_t emul64_list_length; /* # data blks */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth avl_tree_t emul64_tgt_data; /* Tree of data blks */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth kmutex_t emul64_tgt_blk_lock; /* Protect data blks */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth krwlock_t emul64_tgt_nw_lock; /* Guard tgt_nowrite */
cefe316e0be5ef06d07788f53ad6c498a0701d1dpd /* Fields for error injection */
cefe316e0be5ef06d07788f53ad6c498a0701d1dpd ushort_t emul64_einj_state;
cefe316e0be5ef06d07788f53ad6c498a0701d1dpd ushort_t emul64_einj_sense_length;
cefe316e0be5ef06d07788f53ad6c498a0701d1dpd uint_t emul64_einj_pkt_state;
cefe316e0be5ef06d07788f53ad6c498a0701d1dpd uint_t emul64_einj_pkt_reason;
cefe316e0be5ef06d07788f53ad6c498a0701d1dpd struct scsi_status emul64_einj_scsi_status;
cefe316e0be5ef06d07788f53ad6c498a0701d1dpd uint8_t *emul64_einj_sense_data;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth} emul64_tgt_t;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * emul64 softstate structure
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * deadline slot structure for timeout handling
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcthstruct emul64_slot {
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth struct emul64_cmd *slot_cmd;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth clock_t slot_deadline;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth};
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth/*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * Record the reset notification requests from target drivers.
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcthstruct emul64_reset_notify_entry {
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth struct scsi_address *ap;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth void (*callback)(caddr_t);
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth caddr_t arg;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth struct emul64_reset_notify_entry *next;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth};
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcthstruct emul64 {
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth /*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * Transport structure for this instance of the hba
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth scsi_hba_tran_t *emul64_tran;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth /*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * dev_info_t reference can be found in the transport structure
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth dev_info_t *emul64_dip;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth /*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * Interrupt block cookie
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth ddi_iblock_cookie_t emul64_iblock;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth /*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * Firmware revision number
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth uint16_t emul64_major_rev;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth uint16_t emul64_minor_rev;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth /*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * timeout id
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth timeout_id_t emul64_timeout_id;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth /*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * scsi options, scsi_tag_age_limit per emul64
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth int emul64_scsi_options;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth int emul64_target_scsi_options[NTARGETS_WIDE];
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth int emul64_scsi_tag_age_limit;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth /*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * scsi_reset_delay per emul64
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth clock_t emul64_scsi_reset_delay;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth /*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * current host ID
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth uint8_t emul64_initiator_id;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth /*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * suspended flag for power management
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth uint8_t emul64_suspended;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth /*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * Host adapter capabilities and offset/period values per target
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth uint16_t emul64_cap[NTARGETS_WIDE];
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth int16_t emul64_synch[NTARGETS_WIDE];
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth /*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * EMUL64 Hardware register pointer.
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth struct emul64regs *emul64_reg;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth kmutex_t emul64_request_mutex;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth kmutex_t emul64_response_mutex;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth /*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * for keeping track of the max LUNs per target on this bus
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth uchar_t emul64_max_lun[NTARGETS_WIDE];
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth /*
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth * for keeping track of each target/lun
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth int nt_total_sectors[NTARGETS_WIDE][EMUL64_NLUNS_PER_TARGET];
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth struct emul64_reset_notify_entry *emul64_reset_notify_listf;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth ushort_t emul64_backoff;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth uint_t emul64_softstate; /* flags for hotplug */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth int emul64_hotplug_waiting;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth kcondvar_t emul64_cv; /* cv for bus quiesce/unquiesce */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth kmutex_t emul64_hotplug_mutex; /* Mutex for hotplug */
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth taskq_t *emul64_taskq;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth emul64_tgt_t *emul64_tgt;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth};
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth_NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_request_mutex,
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth emul64::emul64_queue_space))
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth_NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_request_mutex,
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth emul64::emul64_request_in))
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth_NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_request_mutex,
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth emul64::emul64_request_out))
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth_NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_request_mutex,
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth emul64::emul64_request_ptr))
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth_NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_request_mutex,
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth emul64::emul64_mbox))
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth_NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_request_mutex,
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth emul64::emul64_slots))
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth_NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_response_mutex,
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth emul64::emul64_response_in))
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth_NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_response_mutex,
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth emul64::emul64_response_out))
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth_NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_response_mutex,
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth emul64::emul64_response_ptr))
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcthextern void emul64_bsd_init();
b1dd958f54f8bfa984d306bb8ca8264855761d7bcthextern void emul64_bsd_fini();
b1dd958f54f8bfa984d306bb8ca8264855761d7bcthextern void emul64_bsd_get_props(dev_info_t *);
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcthextern emul64_rng_overlap_t emul64_overlap(emul64_range_t *,
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth diskaddr_t, size_t);
b1dd958f54f8bfa984d306bb8ca8264855761d7bcthextern int emul64_bsd_blkcompare(const void *, const void *);
b1dd958f54f8bfa984d306bb8ca8264855761d7bcthextern int emul64debug;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcthextern long emul64_nowrite_count;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcthextern kmutex_t emul64_stats_mutex;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcthextern int emul64_collect_stats;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcthextern uint64_t emul64_taskq_max;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcthextern int emul64_max_task;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcthextern int emul64_task_nthreads;
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#ifdef __cplusplus
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth}
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#endif
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth
b1dd958f54f8bfa984d306bb8ca8264855761d7bcth#endif /* _SYS_SCSI_ADAPTERS_EMUL64VAR_H */