a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * CDDL HEADER START
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz *
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * The contents of this file are subject to the terms of the
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Common Development and Distribution License (the "License").
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * You may not use this file except in compliance with the License.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz *
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * or http://www.opensolaris.org/os/licensing.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * See the License for the specific language governing permissions
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * and limitations under the License.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz *
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * When distributing Covered Code, include this CDDL HEADER in each
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * If applicable, add the following below this CDDL HEADER, with the
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * fields enclosed by brackets "[]" replaced with your own identifying
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * information: Portions Copyright [yyyy] [name of copyright owner]
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz *
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * CDDL HEADER END
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
cd210bb4840e6add5921c775aa07cebd6891f738Chris Horne * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Use is subject to license terms.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#ifndef _SYS_DADA_TARGETS_DADDF_H
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define _SYS_DADA_TARGETS_DADDF_H
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#include <sys/note.h>
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#include <sys/cmlb.h>
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#ifdef __cplusplus
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutzextern "C" {
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#endif
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Defines for SCSI direct access devices
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define FIXEDFIRMWARE /* fixed firmware for volume control */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#if defined(_KERNEL) || defined(_KMEMUSER)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Local definitions, for clarity of code
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_DCD_DEVP (un->un_dcd)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_DEVINFO (DCD_DCD_DEVP->dcd_dev)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_IDENTIFY (DCD_DCD_DEVP->dcd_ident)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_MUTEX (&DCD_DCD_DEVP->dcd_mutex)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define ROUTE (DCD_DCD_DEVP->dcd_address)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define SECDIV (un->un_secdiv)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define SECSIZE (un->un_secsize)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define SCBP(pkt) ((struct dcd_status *)(pkt)->pkt_scbp)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define SCBP_C(pkt) ((*(pkt)->pkt_scbp) & STATUS_ATA_MASK)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define CDBP(pkt) ((union scsi_cdb *)(pkt)->pkt_cdbp)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define NO_PKT_ALLOCATED ((struct buf *)0)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define ALLOCATING_PKT ((struct buf *)-1)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define BP_PKT(bp) ((struct dcd_pkt *)bp->av_back)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define BP_HAS_NO_PKT(bp) (bp->av_back == NO_PKT_ALLOCATED)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define MAX_ATA_XFER_SIZE (256*DEV_BSIZE)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define STATUS_SCBP_C(statusp) (*(uchar_t *)(statusp) & STATUS_ATA_MASK)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
cd210bb4840e6add5921c775aa07cebd6891f738Chris Horne#define Tgt(devp) (devp->dcd_address->da_target)
cd210bb4840e6add5921c775aa07cebd6891f738Chris Horne#define Lun(devp) (devp->dcd_address->da_lun)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define New_state(un, s) \
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz (un)->un_last_state = (un)->un_state, (un)->un_state = (s)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define Restore_state(un) \
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz { uchar_t tmp = (un)->un_last_state; New_state((un), tmp); }
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define CTYPE_DISK 2
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Structure for recording whether a device is fully open or closed.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Assumptions:
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz *
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * + There are only 8 partitions possible.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * + BLK, MNT, CHR, SWP don't change in some future release!
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz *
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCDUNIT_SHIFT 3
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCDPART_MASK 7
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCDUNIT(dev) (getminor((dev))>>DCDUNIT_SHIFT)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCDPART(dev) (getminor((dev)) & DCDPART_MASK)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutzstruct ocinfo {
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz /*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Types BLK, MNT, CHR, SWP,
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * assumed to be types 0-3.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz ulong_t lyr_open[NDKMAP];
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz uchar_t reg_open[OTYPCNT - 1];
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz};
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define OCSIZE sizeof (struct ocinfo)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutzunion ocmap {
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz uchar_t chkd[OCSIZE];
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz struct ocinfo rinfo;
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz};
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define lyropen rinfo.lyr_open
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define regopen rinfo.reg_open
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Private info for dcd disks.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz *
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Pointed to by the un_private pointer
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * of one of the dcd_device structures.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutzstruct dcd_disk {
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz struct dcd_device *un_dcd; /* back pointer to dcd_device */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz struct dcd_drivetype *un_dp; /* drive type table */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz struct buf *un_sbufp; /* for use in special io */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz char *un_srqbufp; /* sense buffer for special io */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz kcondvar_t un_sbuf_cv; /* Conditional Variable on sbufp */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz kcondvar_t un_state_cv; /* Conditional variable for state */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz union ocmap un_ocmap; /* open partition map, block && char */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz uchar_t un_last_pkt_reason; /* used for suppressing multiple msgs */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz struct diskhd un_utab; /* for queuing */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz struct kstat *un_stats; /* for statistics */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz struct kstat *un_pstats[NDKMAP]; /* for partition statistics */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz ksema_t un_semoclose; /* lock for serializing opens/closes */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz uint_t un_err_blkno; /* disk block where error occurred */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz int un_diskcapacity; /* capacity as returned by drive */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz int un_lbasize; /* logical (i.e. device) block size */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz int un_lbadiv; /* log2 of lbasize */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz int un_blknoshift; /* log2 of multiple of DEV_BSIZE */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz /* blocks making up a logical block */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz int un_secsize; /* sector size (allow request on */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz /* this boundry) */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz int un_secdiv; /* log2 of secsize */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz uchar_t un_exclopen; /* exclusive open bits */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz uchar_t un_mediastate; /* Is it really needed XXX */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz uchar_t un_state; /* current state */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz uchar_t un_last_state; /* last state */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz uchar_t un_format_in_progress; /* disk is formatting currently */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz uchar_t un_flush_not_supported; /* disk doesn't support flush cmd */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz uchar_t un_write_cache_enabled; /* disk has write caching enabled */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz clock_t un_timestamp; /* Time of last device access */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz short un_ncmds; /* number of cmds in transport */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz short un_throttle; /* This is used for throttling if */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz /* HBA has queuing */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz short un_sbuf_busy; /* Busy wait flag for the sbuf */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz int un_cmd_flags; /* cache some frequently used values */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz int un_cmd_stat_size; /* in make_sd_cmd */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz int un_dcvb_timeid; /* timeout id for dlyd cv broadcast */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz void *un_devid; /* device id */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz uint_t un_max_xfer_size; /* max transfer size */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz uchar_t un_bus_master; /* Indicates that the HBA enables */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz /* Bus master capability */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz timeout_id_t un_reissued_timeid;
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz /* This is used in busy handler */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz kstat_t *un_errstats; /* For Error statsistics */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz kcondvar_t un_suspend_cv; /* Cond Var on power management */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz kcondvar_t un_disk_busy_cv; /* Cond var to wait for IO */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz short un_power_level; /* Power Level */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz short un_save_state; /* Save the state for suspend/resume */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz cmlb_handle_t un_dklbhandle; /* Handle for disk label */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz tg_attribute_t un_tgattribute;
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz};
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * device error statistics
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutzstruct dcd_errstats {
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz struct kstat_named dcd_softerrs; /* Collecting Softerrs */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz struct kstat_named dcd_harderrs; /* Collecting harderrs */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz struct kstat_named dcd_transerrs; /* Collecting Transfer errs */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz struct kstat_named dcd_model; /* model # of the disk */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz struct kstat_named dcd_revision; /* The disk revision */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz struct kstat_named dcd_serial; /* The disk serial number */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz struct kstat_named dcd_capacity; /* Capacity of the disk */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz struct kstat_named dcd_rq_media_err; /* Any media err seen */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz struct kstat_named dcd_rq_ntrdy_err; /* Not ready errs */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz struct kstat_named dcd_rq_nodev_err; /* No device errs */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz struct kstat_named dcd_rq_recov_err; /* Recovered errs */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz struct kstat_named dcd_rq_illrq_err; /* Illegal requests */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz};
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_MAX_XFER_SIZE (1 * 512)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz_NOTE(MUTEX_PROTECTS_DATA(dcd_device::dcd_mutex, dcd_disk))
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz_NOTE(READ_ONLY_DATA(dcd_disk::un_dcd))
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz_NOTE(READ_ONLY_DATA(dcd_disk::un_cmd_stat_size))
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz_NOTE(SCHEME_PROTECTS_DATA("Save Sharing",
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz dcd_disk::un_state
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz dcd_disk::un_dklbhandle
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz dcd_disk::un_format_in_progress))
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz_NOTE(SCHEME_PROTECTS_DATA("stable data",
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz dcd_disk::un_max_xfer_size
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz dcd_disk::un_secdiv
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz dcd_disk::un_secsize
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz dcd_disk::un_cmd_flags
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz dcd_disk::un_cmd_stat_size))
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz_NOTE(SCHEME_PROTECTS_DATA("cv",
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz dcd_disk::un_sbufp
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz dcd_disk::un_srqbufp
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz dcd_disk::un_sbuf_busy))
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz_NOTE(SCHEME_PROTECTS_DATA("Unshared data",
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz dk_cinfo
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz uio
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz buf
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz dcd_pkt
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz udcd_cmd
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz dcd_capacity
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz dcd_cmd
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz dk_label
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz dk_map32))
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz_NOTE(SCHEME_PROTECTS_DATA("stable data", dcd_device))
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz_NOTE(SCHEME_PROTECTS_DATA("unique per pkt", dcd_cmd))
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#endif /* defined(_KERNEL) || defined(_KMEMUSER) */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Disk driver states
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_STATE_NORMAL 0
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_STATE_OFFLINE 1
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_STATE_RWAIT 2
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_STATE_DUMPING 3
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_STATE_SUSPENDED 4
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_STATE_FATAL 5
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_STATE_PM_SUSPENDED 6
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Disk power levels.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_DEVICE_ACTIVE 0x2
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_DEVICE_IDLE 0x1
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_DEVICE_STANDBY 0x0
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Macros used in obtaining the device ID for the disk.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_SERIAL_NUMBER_LENGTH 20
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_MODEL_NUMBER_LENGTH 40
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * The table is to be interpreted as follows: The rows lists all the states
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * and each column is a state that a state in each row *can* reach. The entries
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * in the table list the event that cause that transition to take place.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * For e.g.: To go from state RWAIT to SUSPENDED, event (d)-- which is the
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * invocation of DDI_SUSPEND-- has to take place. Note the same event could
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * cause the transition from one state to two different states. e.g., from
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * state SUSPENDED, when we get a DDI_RESUME, we just go back to the *last
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * state* whatever that might be. (NORMAL or OFFLINE).
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz *
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz *
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * State Transition Table:
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz *
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * NORMAL OFFLINE RWAIT DUMPING SUSPENDED
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz *
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * NORMAL - (a) (b) (c) (d)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz *
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * OFFLINE (e) - (e) (c) (d)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz *
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * RWAIT (f) NP - (c) (d)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz *
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * DUMPING NP NP NP - NP
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz *
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * SUSPENDED (g) (g) (b) NP* -
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz *
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz *
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * NP: Not Possible.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * (a): Disk does not respond.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * (b): Packet Allocation Fails
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * (c): Panic - Crash dump
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * (d): DDI_SUSPEND is called.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * (e): Disk has a successful I/O completed.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * (f): sdrunout() calls sdstart() which sets it NORMAL
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * (g): DDI_RESUME is called.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * * : When suspended, we dont change state during panic dump
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Error levels
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCDERR_ALL 0
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCDERR_UNKNOWN 1
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCDERR_INFORMATIONAL 2
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCDERR_RECOVERED 3
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCDERR_RETRYABLE 4
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCDERR_FATAL 5
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Parameters
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * 60 seconds is a *very* reasonable amount of time for most slow CD
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * operations.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_IO_TIME 60
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Timeout value for ATA_FLUSH_CACHE used in DKIOCFLUSHWRITECACHE
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_FLUSH_TIME 60
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * 2 hours is an excessively reasonable amount of time for format operations.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_FMT_TIME 120*60
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * 5 seconds is what we'll wait if we get a Busy Status back
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_BSY_TIMEOUT (drv_usectohz(5 * 1000000))
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Number of times we'll retry a normal operation.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz *
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * This includes retries due to transport failure
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * (need to distinguish between Target and Transport failure)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_RETRY_COUNT 5
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Maximum number of units we can support
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * (controlled by room in minor device byte)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * XXX: this is out of date!
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_MAXUNIT 32
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * 30 seconds is what we will wait for the IO to finish
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * before we fail the DDI_SUSPEND
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_WAIT_CMDS_COMPLETE 30
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * dcdintr action codes
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define COMMAND_DONE 0
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define COMMAND_DONE_ERROR 1
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define QUE_COMMAND 2
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define QUE_SENSE 3
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define JUST_RETURN 4
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Indicator for Soft and hard errors
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define COMMAND_SOFT_ERROR 1
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define COMMAND_HARD_ERROR 2
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Drive Types (and characteristics)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define VIDMAX 8
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define PIDMAX 16
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutzstruct dcd_drivetype {
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz char *name; /* for debug purposes */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz char ctype; /* controller type */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz char options; /* drive options */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz ushort_t block_factor; /* Block mode factor */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz char pio_mode; /* This the Pio mode number */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz char dma_mode; /* Multi word dma mode */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz};
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * The options values
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DMA_SUPPORTTED 0x01
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define BLOCK_MODE 0x02
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#ifndef LOG_EMERG
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define LOG_WARNING CE_NOTE
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define LOG_NOTICE CE_NOTE
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define LOG_CRIT CE_WARN
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define LOG_ERR CE_WARN
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define LOG_INFO CE_NOTE
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define log cmn_err
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#endif
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Some internal error codes for driver functions.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_EACCES 1
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz/*
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Error returns from sd_validate_geometry()
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_BAD_LABEL -1
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define DCD_NO_MEM_FOR_LABEL -2
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#ifdef __cplusplus
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz}
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#endif
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#endif /* _SYS_DADA_TARGETS_DADDF_H */