a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * See the License for the specific language governing permissions
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * and limitations under the License.
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 * CDDL HEADER END
cd210bb4840e6add5921c775aa07cebd6891f738Chris Horne * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Use is subject to license terms.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutzextern "C" {
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Defines for SCSI direct access devices
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define FIXEDFIRMWARE /* fixed firmware for volume control */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Local definitions, for clarity of code
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define SCBP(pkt) ((struct dcd_status *)(pkt)->pkt_scbp)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define SCBP_C(pkt) ((*(pkt)->pkt_scbp) & STATUS_ATA_MASK)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define BP_HAS_NO_PKT(bp) (bp->av_back == NO_PKT_ALLOCATED)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#define STATUS_SCBP_C(statusp) (*(uchar_t *)(statusp) & STATUS_ATA_MASK)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz (un)->un_last_state = (un)->un_state, (un)->un_state = (s)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz { uchar_t tmp = (un)->un_last_state; New_state((un), tmp); }
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Structure for recording whether a device is fully open or closed.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Assumptions:
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * + There are only 8 partitions possible.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * + BLK, MNT, CHR, SWP don't change in some future release!
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Types BLK, MNT, CHR, SWP,
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * assumed to be types 0-3.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Private info for dcd disks.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Pointed to by the un_private pointer
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * of one of the dcd_device structures.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz struct dcd_device *un_dcd; /* back pointer to dcd_device */
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 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_blknoshift; /* log2 of multiple of DEV_BSIZE */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz /* blocks making up a logical block */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz /* this boundry) */
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_throttle; /* This is used for throttling if */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz /* HBA has queuing */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz int un_cmd_flags; /* cache some frequently used values */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz int un_dcvb_timeid; /* timeout id for dlyd cv broadcast */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz uchar_t un_bus_master; /* Indicates that the HBA enables */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz /* Bus master capability */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz /* This is used in busy handler */
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_save_state; /* Save the state for suspend/resume */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz cmlb_handle_t un_dklbhandle; /* Handle for disk label */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * device error statistics
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_NOTE(MUTEX_PROTECTS_DATA(dcd_device::dcd_mutex, dcd_disk))
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#endif /* defined(_KERNEL) || defined(_KMEMUSER) */
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Disk driver states
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Disk power levels.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Macros used in obtaining the device ID for the disk.
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 * State Transition Table:
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * NORMAL OFFLINE RWAIT DUMPING SUSPENDED
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * NORMAL - (a) (b) (c) (d)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * OFFLINE (e) - (e) (c) (d)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * RWAIT (f) NP - (c) (d)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * DUMPING NP NP NP - NP
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * SUSPENDED (g) (g) (b) NP* -
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 * Error levels
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Parameters
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * 60 seconds is a *very* reasonable amount of time for most slow CD
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * operations.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Timeout value for ATA_FLUSH_CACHE used in DKIOCFLUSHWRITECACHE
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * 2 hours is an excessively reasonable amount of time for format operations.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * 5 seconds is what we'll wait if we get a Busy Status back
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Number of times we'll retry a normal operation.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * This includes retries due to transport failure
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * (need to distinguish between Target and Transport failure)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Maximum number of units we can support
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * (controlled by room in minor device byte)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * XXX: this is out of date!
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * 30 seconds is what we will wait for the IO to finish
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * before we fail the DDI_SUSPEND
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * dcdintr action codes
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Indicator for Soft and hard errors
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Drive Types (and characteristics)
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * The options values
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Some internal error codes for driver functions.
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz * Error returns from sd_validate_geometry()
a4aa671e336d5c717aff15808ab91a6bee5e6e41arutz#endif /* _SYS_DADA_TARGETS_DADDF_H */