13786Sarutz /* 23786Sarutz * CDDL HEADER START 33786Sarutz * 43786Sarutz * The contents of this file are subject to the terms of the 53786Sarutz * Common Development and Distribution License (the "License"). 63786Sarutz * You may not use this file except in compliance with the License. 73786Sarutz * 83786Sarutz * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 93786Sarutz * or http://www.opensolaris.org/os/licensing. 103786Sarutz * See the License for the specific language governing permissions 113786Sarutz * and limitations under the License. 123786Sarutz * 133786Sarutz * When distributing Covered Code, include this CDDL HEADER in each 143786Sarutz * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 153786Sarutz * If applicable, add the following below this CDDL HEADER, with the 163786Sarutz * fields enclosed by brackets "[]" replaced with your own identifying 173786Sarutz * information: Portions Copyright [yyyy] [name of copyright owner] 183786Sarutz * 193786Sarutz * CDDL HEADER END 203786Sarutz */ 213786Sarutz /* 22*7875SChris.Horne@Sun.COM * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 233786Sarutz * Use is subject to license terms. 243786Sarutz */ 253786Sarutz #ifndef _SYS_DADA_TARGETS_DADDF_H 263786Sarutz #define _SYS_DADA_TARGETS_DADDF_H 273786Sarutz 283786Sarutz #include <sys/note.h> 293786Sarutz #include <sys/cmlb.h> 303786Sarutz 313786Sarutz #ifdef __cplusplus 323786Sarutz extern "C" { 333786Sarutz #endif 343786Sarutz 353786Sarutz /* 363786Sarutz * Defines for SCSI direct access devices 373786Sarutz */ 383786Sarutz 393786Sarutz #define FIXEDFIRMWARE /* fixed firmware for volume control */ 403786Sarutz 413786Sarutz #if defined(_KERNEL) || defined(_KMEMUSER) 423786Sarutz 433786Sarutz 443786Sarutz /* 453786Sarutz * Local definitions, for clarity of code 463786Sarutz */ 473786Sarutz #define DCD_DCD_DEVP (un->un_dcd) 483786Sarutz #define DCD_DEVINFO (DCD_DCD_DEVP->dcd_dev) 493786Sarutz #define DCD_IDENTIFY (DCD_DCD_DEVP->dcd_ident) 503786Sarutz #define DCD_MUTEX (&DCD_DCD_DEVP->dcd_mutex) 513786Sarutz #define ROUTE (DCD_DCD_DEVP->dcd_address) 523786Sarutz #define SECDIV (un->un_secdiv) 533786Sarutz #define SECSIZE (un->un_secsize) 543786Sarutz #define SCBP(pkt) ((struct dcd_status *)(pkt)->pkt_scbp) 553786Sarutz #define SCBP_C(pkt) ((*(pkt)->pkt_scbp) & STATUS_ATA_MASK) 563786Sarutz #define CDBP(pkt) ((union scsi_cdb *)(pkt)->pkt_cdbp) 573786Sarutz #define NO_PKT_ALLOCATED ((struct buf *)0) 583786Sarutz #define ALLOCATING_PKT ((struct buf *)-1) 593786Sarutz #define BP_PKT(bp) ((struct dcd_pkt *)bp->av_back) 603786Sarutz #define BP_HAS_NO_PKT(bp) (bp->av_back == NO_PKT_ALLOCATED) 613786Sarutz #define MAX_ATA_XFER_SIZE (256*DEV_BSIZE) 623786Sarutz 633786Sarutz #define STATUS_SCBP_C(statusp) (*(uchar_t *)(statusp) & STATUS_ATA_MASK) 643786Sarutz 65*7875SChris.Horne@Sun.COM #define Tgt(devp) (devp->dcd_address->da_target) 66*7875SChris.Horne@Sun.COM #define Lun(devp) (devp->dcd_address->da_lun) 673786Sarutz 683786Sarutz #define New_state(un, s) \ 693786Sarutz (un)->un_last_state = (un)->un_state, (un)->un_state = (s) 703786Sarutz #define Restore_state(un) \ 713786Sarutz { uchar_t tmp = (un)->un_last_state; New_state((un), tmp); } 723786Sarutz 733786Sarutz 743786Sarutz #define CTYPE_DISK 2 753786Sarutz /* 763786Sarutz * Structure for recording whether a device is fully open or closed. 773786Sarutz * Assumptions: 783786Sarutz * 793786Sarutz * + There are only 8 partitions possible. 803786Sarutz * + BLK, MNT, CHR, SWP don't change in some future release! 813786Sarutz * 823786Sarutz */ 833786Sarutz 843786Sarutz #define DCDUNIT_SHIFT 3 853786Sarutz #define DCDPART_MASK 7 863786Sarutz #define DCDUNIT(dev) (getminor((dev))>>DCDUNIT_SHIFT) 873786Sarutz #define DCDPART(dev) (getminor((dev)) & DCDPART_MASK) 883786Sarutz 893786Sarutz struct ocinfo { 903786Sarutz /* 913786Sarutz * Types BLK, MNT, CHR, SWP, 923786Sarutz * assumed to be types 0-3. 933786Sarutz */ 943786Sarutz ulong_t lyr_open[NDKMAP]; 953786Sarutz uchar_t reg_open[OTYPCNT - 1]; 963786Sarutz }; 973786Sarutz #define OCSIZE sizeof (struct ocinfo) 983786Sarutz union ocmap { 993786Sarutz uchar_t chkd[OCSIZE]; 1003786Sarutz struct ocinfo rinfo; 1013786Sarutz }; 1023786Sarutz #define lyropen rinfo.lyr_open 1033786Sarutz #define regopen rinfo.reg_open 1043786Sarutz 1053786Sarutz /* 1063786Sarutz * Private info for dcd disks. 1073786Sarutz * 1083786Sarutz * Pointed to by the un_private pointer 1093786Sarutz * of one of the dcd_device structures. 1103786Sarutz */ 1113786Sarutz 1123786Sarutz struct dcd_disk { 1133786Sarutz struct dcd_device *un_dcd; /* back pointer to dcd_device */ 1143786Sarutz struct dcd_drivetype *un_dp; /* drive type table */ 1153786Sarutz struct buf *un_sbufp; /* for use in special io */ 1163786Sarutz char *un_srqbufp; /* sense buffer for special io */ 1173786Sarutz kcondvar_t un_sbuf_cv; /* Conditional Variable on sbufp */ 1183786Sarutz kcondvar_t un_state_cv; /* Conditional variable for state */ 1193786Sarutz union ocmap un_ocmap; /* open partition map, block && char */ 1203786Sarutz uchar_t un_last_pkt_reason; /* used for suppressing multiple msgs */ 1213786Sarutz struct diskhd un_utab; /* for queuing */ 1223786Sarutz struct kstat *un_stats; /* for statistics */ 1233786Sarutz struct kstat *un_pstats[NDKMAP]; /* for partition statistics */ 1243786Sarutz ksema_t un_semoclose; /* lock for serializing opens/closes */ 1253786Sarutz uint_t un_err_blkno; /* disk block where error occurred */ 1263786Sarutz int un_diskcapacity; /* capacity as returned by drive */ 1273786Sarutz int un_lbasize; /* logical (i.e. device) block size */ 1283786Sarutz int un_lbadiv; /* log2 of lbasize */ 1293786Sarutz int un_blknoshift; /* log2 of multiple of DEV_BSIZE */ 1303786Sarutz /* blocks making up a logical block */ 1313786Sarutz int un_secsize; /* sector size (allow request on */ 1323786Sarutz /* this boundry) */ 1333786Sarutz int un_secdiv; /* log2 of secsize */ 1343786Sarutz uchar_t un_exclopen; /* exclusive open bits */ 1353786Sarutz uchar_t un_mediastate; /* Is it really needed XXX */ 1363786Sarutz uchar_t un_state; /* current state */ 1373786Sarutz uchar_t un_last_state; /* last state */ 1383786Sarutz uchar_t un_format_in_progress; /* disk is formatting currently */ 1393786Sarutz uchar_t un_flush_not_supported; /* disk doesn't support flush cmd */ 1403786Sarutz uchar_t un_write_cache_enabled; /* disk has write caching enabled */ 1413786Sarutz clock_t un_timestamp; /* Time of last device access */ 1423786Sarutz short un_ncmds; /* number of cmds in transport */ 1433786Sarutz short un_throttle; /* This is used for throttling if */ 1443786Sarutz /* HBA has queuing */ 1453786Sarutz short un_sbuf_busy; /* Busy wait flag for the sbuf */ 1463786Sarutz int un_cmd_flags; /* cache some frequently used values */ 1473786Sarutz int un_cmd_stat_size; /* in make_sd_cmd */ 1483786Sarutz int un_dcvb_timeid; /* timeout id for dlyd cv broadcast */ 1493786Sarutz void *un_devid; /* device id */ 1503786Sarutz uint_t un_max_xfer_size; /* max transfer size */ 1513786Sarutz uchar_t un_bus_master; /* Indicates that the HBA enables */ 1523786Sarutz /* Bus master capability */ 1533786Sarutz timeout_id_t un_reissued_timeid; 1543786Sarutz /* This is used in busy handler */ 1553786Sarutz kstat_t *un_errstats; /* For Error statsistics */ 1563786Sarutz kcondvar_t un_suspend_cv; /* Cond Var on power management */ 1573786Sarutz kcondvar_t un_disk_busy_cv; /* Cond var to wait for IO */ 1583786Sarutz short un_power_level; /* Power Level */ 1593786Sarutz short un_save_state; /* Save the state for suspend/resume */ 1603786Sarutz cmlb_handle_t un_dklbhandle; /* Handle for disk label */ 1613786Sarutz tg_attribute_t un_tgattribute; 1623786Sarutz }; 1633786Sarutz 1643786Sarutz /* 1653786Sarutz * device error statistics 1663786Sarutz */ 1673786Sarutz struct dcd_errstats { 1683786Sarutz struct kstat_named dcd_softerrs; /* Collecting Softerrs */ 1693786Sarutz struct kstat_named dcd_harderrs; /* Collecting harderrs */ 1703786Sarutz struct kstat_named dcd_transerrs; /* Collecting Transfer errs */ 1713786Sarutz struct kstat_named dcd_model; /* model # of the disk */ 1723786Sarutz struct kstat_named dcd_revision; /* The disk revision */ 1733786Sarutz struct kstat_named dcd_serial; /* The disk serial number */ 1743786Sarutz struct kstat_named dcd_capacity; /* Capacity of the disk */ 1753786Sarutz struct kstat_named dcd_rq_media_err; /* Any media err seen */ 1763786Sarutz struct kstat_named dcd_rq_ntrdy_err; /* Not ready errs */ 1773786Sarutz struct kstat_named dcd_rq_nodev_err; /* No device errs */ 1783786Sarutz struct kstat_named dcd_rq_recov_err; /* Recovered errs */ 1793786Sarutz struct kstat_named dcd_rq_illrq_err; /* Illegal requests */ 1803786Sarutz }; 1813786Sarutz #define DCD_MAX_XFER_SIZE (1 * 512) 1823786Sarutz 1833786Sarutz _NOTE(MUTEX_PROTECTS_DATA(dcd_device::dcd_mutex, dcd_disk)) 1843786Sarutz _NOTE(READ_ONLY_DATA(dcd_disk::un_dcd)) 1853786Sarutz _NOTE(READ_ONLY_DATA(dcd_disk::un_cmd_stat_size)) 1863786Sarutz _NOTE(SCHEME_PROTECTS_DATA("Save Sharing", 1873786Sarutz dcd_disk::un_state 1883786Sarutz dcd_disk::un_dklbhandle 1893786Sarutz dcd_disk::un_format_in_progress)) 1903786Sarutz 1913786Sarutz _NOTE(SCHEME_PROTECTS_DATA("stable data", 1923786Sarutz dcd_disk::un_max_xfer_size 1933786Sarutz dcd_disk::un_secdiv 1943786Sarutz dcd_disk::un_secsize 1953786Sarutz dcd_disk::un_cmd_flags 1963786Sarutz dcd_disk::un_cmd_stat_size)) 1973786Sarutz 1983786Sarutz _NOTE(SCHEME_PROTECTS_DATA("cv", 1993786Sarutz dcd_disk::un_sbufp 2003786Sarutz dcd_disk::un_srqbufp 2013786Sarutz dcd_disk::un_sbuf_busy)) 2023786Sarutz 2033786Sarutz _NOTE(SCHEME_PROTECTS_DATA("Unshared data", 2043786Sarutz dk_cinfo 2053786Sarutz uio 2063786Sarutz buf 2073786Sarutz dcd_pkt 2083786Sarutz udcd_cmd 2093786Sarutz dcd_capacity 2103786Sarutz dcd_cmd 2113786Sarutz dk_label 2123786Sarutz dk_map32)) 2133786Sarutz 2143786Sarutz _NOTE(SCHEME_PROTECTS_DATA("stable data", dcd_device)) 2153786Sarutz _NOTE(SCHEME_PROTECTS_DATA("unique per pkt", dcd_cmd)) 2163786Sarutz 2173786Sarutz #endif /* defined(_KERNEL) || defined(_KMEMUSER) */ 2183786Sarutz 2193786Sarutz 2203786Sarutz /* 2213786Sarutz * Disk driver states 2223786Sarutz */ 2233786Sarutz 2243786Sarutz #define DCD_STATE_NORMAL 0 2253786Sarutz #define DCD_STATE_OFFLINE 1 2263786Sarutz #define DCD_STATE_RWAIT 2 2273786Sarutz #define DCD_STATE_DUMPING 3 2283786Sarutz #define DCD_STATE_SUSPENDED 4 2293786Sarutz #define DCD_STATE_FATAL 5 2303786Sarutz #define DCD_STATE_PM_SUSPENDED 6 2313786Sarutz 2323786Sarutz /* 2333786Sarutz * Disk power levels. 2343786Sarutz */ 2353786Sarutz #define DCD_DEVICE_ACTIVE 0x2 2363786Sarutz #define DCD_DEVICE_IDLE 0x1 2373786Sarutz #define DCD_DEVICE_STANDBY 0x0 2383786Sarutz 2393786Sarutz /* 2403786Sarutz * Macros used in obtaining the device ID for the disk. 2413786Sarutz */ 2423786Sarutz #define DCD_SERIAL_NUMBER_LENGTH 20 2433786Sarutz #define DCD_MODEL_NUMBER_LENGTH 40 2443786Sarutz 2453786Sarutz /* 2463786Sarutz * The table is to be interpreted as follows: The rows lists all the states 2473786Sarutz * and each column is a state that a state in each row *can* reach. The entries 2483786Sarutz * in the table list the event that cause that transition to take place. 2493786Sarutz * For e.g.: To go from state RWAIT to SUSPENDED, event (d)-- which is the 2503786Sarutz * invocation of DDI_SUSPEND-- has to take place. Note the same event could 2513786Sarutz * cause the transition from one state to two different states. e.g., from 2523786Sarutz * state SUSPENDED, when we get a DDI_RESUME, we just go back to the *last 2533786Sarutz * state* whatever that might be. (NORMAL or OFFLINE). 2543786Sarutz * 2553786Sarutz * 2563786Sarutz * State Transition Table: 2573786Sarutz * 2583786Sarutz * NORMAL OFFLINE RWAIT DUMPING SUSPENDED 2593786Sarutz * 2603786Sarutz * NORMAL - (a) (b) (c) (d) 2613786Sarutz * 2623786Sarutz * OFFLINE (e) - (e) (c) (d) 2633786Sarutz * 2643786Sarutz * RWAIT (f) NP - (c) (d) 2653786Sarutz * 2663786Sarutz * DUMPING NP NP NP - NP 2673786Sarutz * 2683786Sarutz * SUSPENDED (g) (g) (b) NP* - 2693786Sarutz * 2703786Sarutz * 2713786Sarutz * NP: Not Possible. 2723786Sarutz * (a): Disk does not respond. 2733786Sarutz * (b): Packet Allocation Fails 2743786Sarutz * (c): Panic - Crash dump 2753786Sarutz * (d): DDI_SUSPEND is called. 2763786Sarutz * (e): Disk has a successful I/O completed. 2773786Sarutz * (f): sdrunout() calls sdstart() which sets it NORMAL 2783786Sarutz * (g): DDI_RESUME is called. 2793786Sarutz * * : When suspended, we dont change state during panic dump 2803786Sarutz */ 2813786Sarutz 2823786Sarutz 2833786Sarutz /* 2843786Sarutz * Error levels 2853786Sarutz */ 2863786Sarutz 2873786Sarutz #define DCDERR_ALL 0 2883786Sarutz #define DCDERR_UNKNOWN 1 2893786Sarutz #define DCDERR_INFORMATIONAL 2 2903786Sarutz #define DCDERR_RECOVERED 3 2913786Sarutz #define DCDERR_RETRYABLE 4 2923786Sarutz #define DCDERR_FATAL 5 2933786Sarutz 2943786Sarutz /* 2953786Sarutz * Parameters 2963786Sarutz */ 2973786Sarutz 2983786Sarutz /* 2993786Sarutz * 60 seconds is a *very* reasonable amount of time for most slow CD 3003786Sarutz * operations. 3013786Sarutz */ 3023786Sarutz 3033786Sarutz #define DCD_IO_TIME 60 3043786Sarutz 3053786Sarutz /* 3063786Sarutz * Timeout value for ATA_FLUSH_CACHE used in DKIOCFLUSHWRITECACHE 3073786Sarutz */ 3083786Sarutz #define DCD_FLUSH_TIME 60 3093786Sarutz 3103786Sarutz /* 3113786Sarutz * 2 hours is an excessively reasonable amount of time for format operations. 3123786Sarutz */ 3133786Sarutz 3143786Sarutz #define DCD_FMT_TIME 120*60 3153786Sarutz 3163786Sarutz /* 3173786Sarutz * 5 seconds is what we'll wait if we get a Busy Status back 3183786Sarutz */ 3193786Sarutz 3203786Sarutz #define DCD_BSY_TIMEOUT (drv_usectohz(5 * 1000000)) 3213786Sarutz 3223786Sarutz /* 3233786Sarutz * Number of times we'll retry a normal operation. 3243786Sarutz * 3253786Sarutz * This includes retries due to transport failure 3263786Sarutz * (need to distinguish between Target and Transport failure) 3273786Sarutz */ 3283786Sarutz 3293786Sarutz #define DCD_RETRY_COUNT 5 3303786Sarutz 3313786Sarutz 3323786Sarutz /* 3333786Sarutz * Maximum number of units we can support 3343786Sarutz * (controlled by room in minor device byte) 3353786Sarutz * XXX: this is out of date! 3363786Sarutz */ 3373786Sarutz #define DCD_MAXUNIT 32 3383786Sarutz 3393786Sarutz /* 3403786Sarutz * 30 seconds is what we will wait for the IO to finish 3413786Sarutz * before we fail the DDI_SUSPEND 3423786Sarutz */ 3433786Sarutz #define DCD_WAIT_CMDS_COMPLETE 30 3443786Sarutz 3453786Sarutz /* 3463786Sarutz * dcdintr action codes 3473786Sarutz */ 3483786Sarutz 3493786Sarutz #define COMMAND_DONE 0 3503786Sarutz #define COMMAND_DONE_ERROR 1 3513786Sarutz #define QUE_COMMAND 2 3523786Sarutz #define QUE_SENSE 3 3533786Sarutz #define JUST_RETURN 4 3543786Sarutz 3553786Sarutz /* 3563786Sarutz * Indicator for Soft and hard errors 3573786Sarutz */ 3583786Sarutz #define COMMAND_SOFT_ERROR 1 3593786Sarutz #define COMMAND_HARD_ERROR 2 3603786Sarutz 3613786Sarutz /* 3623786Sarutz * Drive Types (and characteristics) 3633786Sarutz */ 3643786Sarutz #define VIDMAX 8 3653786Sarutz #define PIDMAX 16 3663786Sarutz 3673786Sarutz struct dcd_drivetype { 3683786Sarutz char *name; /* for debug purposes */ 3693786Sarutz char ctype; /* controller type */ 3703786Sarutz char options; /* drive options */ 3713786Sarutz ushort_t block_factor; /* Block mode factor */ 3723786Sarutz char pio_mode; /* This the Pio mode number */ 3733786Sarutz char dma_mode; /* Multi word dma mode */ 3743786Sarutz }; 3753786Sarutz 3763786Sarutz /* 3773786Sarutz * The options values 3783786Sarutz */ 3793786Sarutz #define DMA_SUPPORTTED 0x01 3803786Sarutz #define BLOCK_MODE 0x02 3813786Sarutz 3823786Sarutz #ifndef LOG_EMERG 3833786Sarutz #define LOG_WARNING CE_NOTE 3843786Sarutz #define LOG_NOTICE CE_NOTE 3853786Sarutz #define LOG_CRIT CE_WARN 3863786Sarutz #define LOG_ERR CE_WARN 3873786Sarutz #define LOG_INFO CE_NOTE 3883786Sarutz #define log cmn_err 3893786Sarutz #endif 3903786Sarutz 3913786Sarutz /* 3923786Sarutz * Some internal error codes for driver functions. 3933786Sarutz */ 3943786Sarutz #define DCD_EACCES 1 3953786Sarutz 3963786Sarutz /* 3973786Sarutz * Error returns from sd_validate_geometry() 3983786Sarutz */ 3993786Sarutz #define DCD_BAD_LABEL -1 4003786Sarutz #define DCD_NO_MEM_FOR_LABEL -2 4013786Sarutz 4023786Sarutz #ifdef __cplusplus 4033786Sarutz } 4043786Sarutz #endif 4053786Sarutz 4063786Sarutz #endif /* _SYS_DADA_TARGETS_DADDF_H */ 407