1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 #ifndef _SYS_DADA_TARGETS_DADDF_H
  26 #define _SYS_DADA_TARGETS_DADDF_H
  27 
  28 #include <sys/note.h>
  29 #include <sys/cmlb.h>
  30 
  31 #ifdef  __cplusplus
  32 extern "C" {
  33 #endif
  34 
  35 /*
  36  * Defines for SCSI direct access devices
  37  */
  38 
  39 #define FIXEDFIRMWARE   /* fixed firmware for volume control */
  40 
  41 #if     defined(_KERNEL) || defined(_KMEMUSER)
  42 
  43 
  44 /*
  45  * Local definitions, for clarity of code
  46  */
  47 #define DCD_DCD_DEVP    (un->un_dcd)
  48 #define DCD_DEVINFO     (DCD_DCD_DEVP->dcd_dev)
  49 #define DCD_IDENTIFY    (DCD_DCD_DEVP->dcd_ident)
  50 #define DCD_MUTEX       (&DCD_DCD_DEVP->dcd_mutex)
  51 #define ROUTE           (DCD_DCD_DEVP->dcd_address)
  52 #define SECDIV          (un->un_secdiv)
  53 #define SECSIZE         (un->un_secsize)
  54 #define SCBP(pkt)       ((struct dcd_status *)(pkt)->pkt_scbp)
  55 #define SCBP_C(pkt)     ((*(pkt)->pkt_scbp) & STATUS_ATA_MASK)
  56 #define CDBP(pkt)       ((union scsi_cdb *)(pkt)->pkt_cdbp)
  57 #define NO_PKT_ALLOCATED ((struct buf *)0)
  58 #define ALLOCATING_PKT  ((struct buf *)-1)
  59 #define BP_PKT(bp)      ((struct dcd_pkt *)bp->av_back)
  60 #define BP_HAS_NO_PKT(bp) (bp->av_back == NO_PKT_ALLOCATED)
  61 #define MAX_ATA_XFER_SIZE (256*DEV_BSIZE)
  62 
  63 #define STATUS_SCBP_C(statusp)  (*(uchar_t *)(statusp) & STATUS_ATA_MASK)
  64 
  65 #define Tgt(devp)       (devp->dcd_address->da_target)
  66 #define Lun(devp)       (devp->dcd_address->da_lun)
  67 
  68 #define New_state(un, s)        \
  69         (un)->un_last_state = (un)->un_state,  (un)->un_state = (s)
  70 #define Restore_state(un)       \
  71         { uchar_t tmp = (un)->un_last_state; New_state((un), tmp); }
  72 
  73 
  74 #define CTYPE_DISK       2
  75 /*
  76  * Structure for recording whether a device is fully open or closed.
  77  * Assumptions:
  78  *
  79  *      + There are only 8 partitions possible.
  80  *      + BLK, MNT, CHR, SWP don't change in some future release!
  81  *
  82  */
  83 
  84 #define DCDUNIT_SHIFT   3
  85 #define DCDPART_MASK    7
  86 #define DCDUNIT(dev)    (getminor((dev))>>DCDUNIT_SHIFT)
  87 #define DCDPART(dev)    (getminor((dev)) & DCDPART_MASK)
  88 
  89 struct ocinfo {
  90         /*
  91          * Types BLK, MNT, CHR, SWP,
  92          * assumed to be types 0-3.
  93          */
  94         ulong_t  lyr_open[NDKMAP];
  95         uchar_t  reg_open[OTYPCNT - 1];
  96 };
  97 #define OCSIZE  sizeof (struct ocinfo)
  98 union ocmap {
  99         uchar_t chkd[OCSIZE];
 100         struct ocinfo rinfo;
 101 };
 102 #define lyropen rinfo.lyr_open
 103 #define regopen rinfo.reg_open
 104 
 105 /*
 106  * Private info for dcd disks.
 107  *
 108  * Pointed to by the un_private pointer
 109  * of one of the dcd_device structures.
 110  */
 111 
 112 struct dcd_disk {
 113         struct dcd_device *un_dcd;      /* back pointer to dcd_device */
 114         struct dcd_drivetype *un_dp;    /* drive type table */
 115         struct  buf *un_sbufp;          /* for use in special io */
 116         char            *un_srqbufp;    /* sense buffer for special io */
 117         kcondvar_t      un_sbuf_cv;     /* Conditional Variable on sbufp */
 118         kcondvar_t      un_state_cv;    /* Conditional variable for state */
 119         union   ocmap un_ocmap;         /* open partition map, block && char */
 120         uchar_t un_last_pkt_reason;     /* used for suppressing multiple msgs */
 121         struct  diskhd un_utab;         /* for queuing */
 122         struct  kstat *un_stats;        /* for statistics */
 123         struct  kstat *un_pstats[NDKMAP]; /* for partition statistics */
 124         ksema_t un_semoclose;           /* lock for serializing opens/closes */
 125         uint_t  un_err_blkno;           /* disk block where error occurred */
 126         int     un_diskcapacity;        /* capacity as returned by drive */
 127         int     un_lbasize;             /* logical (i.e. device) block size */
 128         int     un_lbadiv;              /* log2 of lbasize */
 129         int     un_blknoshift;          /* log2 of multiple of DEV_BSIZE */
 130                                         /* blocks making up a logical block */
 131         int     un_secsize;             /* sector size (allow request on */
 132                                         /* this boundry) */
 133         int     un_secdiv;              /* log2 of secsize */
 134         uchar_t un_exclopen;            /* exclusive open bits */
 135         uchar_t un_mediastate;          /* Is it really needed  XXX */
 136         uchar_t un_state;               /* current state */
 137         uchar_t un_last_state;          /* last state */
 138         uchar_t un_format_in_progress;  /* disk is formatting currently */
 139         uchar_t un_flush_not_supported; /* disk doesn't support flush cmd */
 140         uchar_t un_write_cache_enabled; /* disk has write caching enabled */
 141         clock_t un_timestamp;           /* Time of last device access */
 142         short   un_ncmds;               /* number of cmds in transport */
 143         short   un_throttle;            /* This is used for throttling if */
 144                                         /* HBA has queuing                */
 145         short   un_sbuf_busy;           /* Busy wait flag for the sbuf */
 146         int     un_cmd_flags;           /* cache some frequently used values */
 147         int     un_cmd_stat_size;       /* in make_sd_cmd */
 148         int     un_dcvb_timeid;         /* timeout id for dlyd cv broadcast */
 149         void    *un_devid;              /* device id */
 150         uint_t  un_max_xfer_size;       /* max transfer size */
 151         uchar_t un_bus_master;          /* Indicates that the HBA  enables  */
 152                                         /* Bus master capability */
 153         timeout_id_t    un_reissued_timeid;
 154                                         /* This is used in busy handler */
 155         kstat_t *un_errstats;           /* For Error statsistics */
 156         kcondvar_t      un_suspend_cv;  /* Cond Var on power management */
 157         kcondvar_t      un_disk_busy_cv; /* Cond var to wait for IO */
 158         short   un_power_level;         /* Power Level */
 159         short   un_save_state;          /* Save the state for suspend/resume */
 160         cmlb_handle_t   un_dklbhandle;  /* Handle for disk label */
 161         tg_attribute_t un_tgattribute;
 162 };
 163 
 164 /*
 165  * device error statistics
 166  */
 167 struct dcd_errstats {
 168         struct kstat_named      dcd_softerrs;   /* Collecting Softerrs */
 169         struct kstat_named      dcd_harderrs;   /* Collecting harderrs */
 170         struct kstat_named      dcd_transerrs;  /* Collecting Transfer errs */
 171         struct kstat_named      dcd_model;      /* model # of the disk */
 172         struct kstat_named      dcd_revision;   /* The disk revision */
 173         struct kstat_named      dcd_serial;     /* The disk serial number */
 174         struct kstat_named      dcd_capacity;   /* Capacity of the disk */
 175         struct kstat_named      dcd_rq_media_err; /* Any media err seen */
 176         struct kstat_named      dcd_rq_ntrdy_err; /* Not ready errs */
 177         struct kstat_named      dcd_rq_nodev_err; /* No device errs */
 178         struct kstat_named      dcd_rq_recov_err; /* Recovered errs */
 179         struct kstat_named      dcd_rq_illrq_err; /* Illegal requests */
 180 };
 181 #define DCD_MAX_XFER_SIZE       (1 * 512)
 182 
 183 _NOTE(MUTEX_PROTECTS_DATA(dcd_device::dcd_mutex, dcd_disk))
 184 _NOTE(READ_ONLY_DATA(dcd_disk::un_dcd))
 185 _NOTE(READ_ONLY_DATA(dcd_disk::un_cmd_stat_size))
 186 _NOTE(SCHEME_PROTECTS_DATA("Save Sharing",
 187         dcd_disk::un_state
 188         dcd_disk::un_dklbhandle
 189         dcd_disk::un_format_in_progress))
 190 
 191 _NOTE(SCHEME_PROTECTS_DATA("stable data",
 192         dcd_disk::un_max_xfer_size
 193         dcd_disk::un_secdiv
 194         dcd_disk::un_secsize
 195         dcd_disk::un_cmd_flags
 196         dcd_disk::un_cmd_stat_size))
 197 
 198 _NOTE(SCHEME_PROTECTS_DATA("cv",
 199         dcd_disk::un_sbufp
 200         dcd_disk::un_srqbufp
 201         dcd_disk::un_sbuf_busy))
 202 
 203 _NOTE(SCHEME_PROTECTS_DATA("Unshared data",
 204         dk_cinfo
 205         uio
 206         buf
 207         dcd_pkt
 208         udcd_cmd
 209         dcd_capacity
 210         dcd_cmd
 211         dk_label
 212         dk_map32))
 213 
 214 _NOTE(SCHEME_PROTECTS_DATA("stable data", dcd_device))
 215 _NOTE(SCHEME_PROTECTS_DATA("unique per pkt", dcd_cmd))
 216 
 217 #endif  /* defined(_KERNEL) || defined(_KMEMUSER) */
 218 
 219 
 220 /*
 221  * Disk driver states
 222  */
 223 
 224 #define DCD_STATE_NORMAL        0
 225 #define DCD_STATE_OFFLINE       1
 226 #define DCD_STATE_RWAIT         2
 227 #define DCD_STATE_DUMPING       3
 228 #define DCD_STATE_SUSPENDED     4
 229 #define DCD_STATE_FATAL         5
 230 #define DCD_STATE_PM_SUSPENDED  6
 231 
 232 /*
 233  * Disk power levels.
 234  */
 235 #define DCD_DEVICE_ACTIVE       0x2
 236 #define DCD_DEVICE_IDLE         0x1
 237 #define DCD_DEVICE_STANDBY      0x0
 238 
 239 /*
 240  * Macros used in obtaining the device ID for the disk.
 241  */
 242 #define DCD_SERIAL_NUMBER_LENGTH        20
 243 #define DCD_MODEL_NUMBER_LENGTH         40
 244 
 245 /*
 246  * The table is to be interpreted as follows: The rows lists all the states
 247  * and each column is a state that a state in each row *can* reach. The entries
 248  * in the table list the event that cause that transition to take place.
 249  * For e.g.: To go from state RWAIT to SUSPENDED, event (d)-- which is the
 250  * invocation of DDI_SUSPEND-- has to take place. Note the same event could
 251  * cause the transition from one state to two different states. e.g., from
 252  * state SUSPENDED, when we get a DDI_RESUME, we just go back to the *last
 253  * state* whatever that might be. (NORMAL or OFFLINE).
 254  *
 255  *
 256  * State Transition Table:
 257  *
 258  *                      NORMAL  OFFLINE  RWAIT  DUMPING  SUSPENDED
 259  *
 260  *      NORMAL          -       (a)     (b)     (c)     (d)
 261  *
 262  *      OFFLINE         (e)     -       (e)     (c)     (d)
 263  *
 264  *      RWAIT           (f)     NP      -       (c)     (d)
 265  *
 266  *      DUMPING         NP      NP      NP      -       NP
 267  *
 268  *      SUSPENDED       (g)     (g)     (b)     NP*     -
 269  *
 270  *
 271  *      NP:     Not Possible.
 272  *      (a):    Disk does not respond.
 273  *      (b):    Packet Allocation Fails
 274  *      (c):    Panic - Crash dump
 275  *      (d):    DDI_SUSPEND is called.
 276  *      (e):    Disk has a successful I/O completed.
 277  *      (f):    sdrunout() calls sdstart() which sets it NORMAL
 278  *      (g):    DDI_RESUME is called.
 279  *      * :     When suspended, we dont change state during panic dump
 280  */
 281 
 282 
 283 /*
 284  * Error levels
 285  */
 286 
 287 #define DCDERR_ALL              0
 288 #define DCDERR_UNKNOWN          1
 289 #define DCDERR_INFORMATIONAL    2
 290 #define DCDERR_RECOVERED        3
 291 #define DCDERR_RETRYABLE        4
 292 #define DCDERR_FATAL            5
 293 
 294 /*
 295  * Parameters
 296  */
 297 
 298 /*
 299  * 60 seconds is a *very* reasonable amount of time for most slow CD
 300  * operations.
 301  */
 302 
 303 #define DCD_IO_TIME     60
 304 
 305 /*
 306  * Timeout value for ATA_FLUSH_CACHE used in DKIOCFLUSHWRITECACHE
 307  */
 308 #define DCD_FLUSH_TIME  60
 309 
 310 /*
 311  * 2 hours is an excessively reasonable amount of time for format operations.
 312  */
 313 
 314 #define DCD_FMT_TIME    120*60
 315 
 316 /*
 317  * 5 seconds is what we'll wait if we get a Busy Status back
 318  */
 319 
 320 #define DCD_BSY_TIMEOUT         drv_sectohz(5)
 321 
 322 /*
 323  * Number of times we'll retry a normal operation.
 324  *
 325  * This includes retries due to transport failure
 326  * (need to distinguish between Target and Transport failure)
 327  */
 328 
 329 #define DCD_RETRY_COUNT         5
 330 
 331 
 332 /*
 333  * Maximum number of units we can support
 334  * (controlled by room in minor device byte)
 335  * XXX: this is out of date!
 336  */
 337 #define DCD_MAXUNIT             32
 338 
 339 /*
 340  * 30 seconds is what we will wait for the IO to finish
 341  * before we fail the DDI_SUSPEND
 342  */
 343 #define DCD_WAIT_CMDS_COMPLETE  30
 344 
 345 /*
 346  * dcdintr action codes
 347  */
 348 
 349 #define COMMAND_DONE            0
 350 #define COMMAND_DONE_ERROR      1
 351 #define QUE_COMMAND             2
 352 #define QUE_SENSE               3
 353 #define JUST_RETURN             4
 354 
 355 /*
 356  * Indicator for Soft and hard errors
 357  */
 358 #define COMMAND_SOFT_ERROR      1
 359 #define COMMAND_HARD_ERROR      2
 360 
 361 /*
 362  * Drive Types (and characteristics)
 363  */
 364 #define VIDMAX 8
 365 #define PIDMAX 16
 366 
 367 struct dcd_drivetype {
 368         char    *name;          /* for debug purposes */
 369         char    ctype;          /* controller type */
 370         char    options;        /* drive options */
 371         ushort_t block_factor;  /* Block mode factor */
 372         char    pio_mode;       /* This the Pio mode number */
 373         char    dma_mode;       /* Multi word dma mode */
 374 };
 375 
 376 /*
 377  * The options values
 378  */
 379 #define DMA_SUPPORTTED  0x01
 380 #define BLOCK_MODE      0x02
 381 
 382 #ifndef LOG_EMERG
 383 #define LOG_WARNING     CE_NOTE
 384 #define LOG_NOTICE      CE_NOTE
 385 #define LOG_CRIT        CE_WARN
 386 #define LOG_ERR         CE_WARN
 387 #define LOG_INFO        CE_NOTE
 388 #define log     cmn_err
 389 #endif
 390 
 391 /*
 392  * Some internal error codes for driver functions.
 393  */
 394 #define DCD_EACCES      1
 395 
 396 /*
 397  * Error returns from sd_validate_geometry()
 398  */
 399 #define DCD_BAD_LABEL           -1
 400 #define DCD_NO_MEM_FOR_LABEL    -2
 401 
 402 #ifdef  __cplusplus
 403 }
 404 #endif
 405 
 406 #endif  /* _SYS_DADA_TARGETS_DADDF_H */