The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/openzfs/lib/libspl/include/sys/dkio.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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 https://opensource.org/licenses/CDDL-1.0.
   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 2007 Sun Microsystems, Inc.  All rights reserved.
   23  * Use is subject to license terms.
   24  */
   25 
   26 #ifndef _SYS_DKIO_H
   27 #define _SYS_DKIO_H
   28 
   29 
   30 
   31 #include <sys/dklabel.h>        /* Needed for NDKMAP define */
   32 
   33 #ifdef  __cplusplus
   34 extern "C" {
   35 #endif
   36 
   37 /*
   38  * Structures and definitions for disk io control commands
   39  */
   40 
   41 /*
   42  * Structures used as data by ioctl calls.
   43  */
   44 
   45 #define DK_DEVLEN       16              /* device name max length, including */
   46                                         /* unit # & NULL (ie - "xyc1") */
   47 
   48 /*
   49  * Used for controller info
   50  */
   51 struct dk_cinfo {
   52         char    dki_cname[DK_DEVLEN];   /* controller name (no unit #) */
   53         ushort_t dki_ctype;             /* controller type */
   54         ushort_t dki_flags;             /* flags */
   55         ushort_t dki_cnum;              /* controller number */
   56         uint_t  dki_addr;               /* controller address */
   57         uint_t  dki_space;              /* controller bus type */
   58         uint_t  dki_prio;               /* interrupt priority */
   59         uint_t  dki_vec;                /* interrupt vector */
   60         char    dki_dname[DK_DEVLEN];   /* drive name (no unit #) */
   61         uint_t  dki_unit;               /* unit number */
   62         ushort_t dki_partition;         /* partition number */
   63         ushort_t dki_maxtransfer;       /* max. transfer size in DEV_BSIZE */
   64 };
   65 
   66 /*
   67  * Controller types
   68  */
   69 #define DKC_UNKNOWN     0
   70 #define DKC_CDROM       1       /* CD-ROM, SCSI or otherwise */
   71 #define DKC_WDC2880     2
   72 #define DKC_XXX_0       3       /* unassigned */
   73 #define DKC_XXX_1       4       /* unassigned */
   74 #define DKC_DSD5215     5
   75 #define DKC_ACB4000     7
   76 #define DKC_MD21        8
   77 #define DKC_XXX_2       9       /* unassigned */
   78 #define DKC_NCRFLOPPY   10
   79 #define DKC_SMSFLOPPY   12
   80 #define DKC_SCSI_CCS    13      /* SCSI CCS compatible */
   81 #define DKC_INTEL82072  14      /* native floppy chip */
   82 #define DKC_MD          16      /* meta-disk (virtual-disk) driver */
   83 #define DKC_INTEL82077  19      /* 82077 floppy disk controller */
   84 #define DKC_DIRECT      20      /* Intel direct attached device i.e. IDE */
   85 #define DKC_PCMCIA_MEM  21      /* PCMCIA memory disk-like type */
   86 #define DKC_PCMCIA_ATA  22      /* PCMCIA AT Attached type */
   87 #define DKC_VBD         23      /* virtual block device */
   88 
   89 /*
   90  * Sun reserves up through 1023
   91  */
   92 
   93 #define DKC_CUSTOMER_BASE       1024
   94 
   95 /*
   96  * Flags
   97  */
   98 #define DKI_BAD144      0x01    /* use DEC std 144 bad sector fwding */
   99 #define DKI_MAPTRK      0x02    /* controller does track mapping */
  100 #define DKI_FMTTRK      0x04    /* formats only full track at a time */
  101 #define DKI_FMTVOL      0x08    /* formats only full volume at a time */
  102 #define DKI_FMTCYL      0x10    /* formats only full cylinders at a time */
  103 #define DKI_HEXUNIT     0x20    /* unit number is printed as 3 hex digits */
  104 #define DKI_PCMCIA_PFD  0x40    /* PCMCIA pseudo-floppy memory card */
  105 
  106 /*
  107  * Used for all partitions
  108  */
  109 struct dk_allmap {
  110         struct dk_map   dka_map[NDKMAP];
  111 };
  112 
  113 #if defined(_SYSCALL32)
  114 struct dk_allmap32 {
  115         struct dk_map32 dka_map[NDKMAP];
  116 };
  117 #endif /* _SYSCALL32 */
  118 
  119 /*
  120  * Definition of a disk's geometry
  121  */
  122 struct dk_geom {
  123         unsigned short  dkg_ncyl;       /* # of data cylinders */
  124         unsigned short  dkg_acyl;       /* # of alternate cylinders */
  125         unsigned short  dkg_bcyl;       /* cyl offset (for fixed head area) */
  126         unsigned short  dkg_nhead;      /* # of heads */
  127         unsigned short  dkg_obs1;       /* obsolete */
  128         unsigned short  dkg_nsect;      /* # of data sectors per track */
  129         unsigned short  dkg_intrlv;     /* interleave factor */
  130         unsigned short  dkg_obs2;       /* obsolete */
  131         unsigned short  dkg_obs3;       /* obsolete */
  132         unsigned short  dkg_apc;        /* alternates per cyl (SCSI only) */
  133         unsigned short  dkg_rpm;        /* revolutions per minute */
  134         unsigned short  dkg_pcyl;       /* # of physical cylinders */
  135         unsigned short  dkg_write_reinstruct;   /* # sectors to skip, writes */
  136         unsigned short  dkg_read_reinstruct;    /* # sectors to skip, reads */
  137         unsigned short  dkg_extra[7];   /* for compatible expansion */
  138 };
  139 
  140 /*
  141  * These defines are for historic compatibility with old drivers.
  142  */
  143 #define dkg_bhead       dkg_obs1        /* used to be head offset */
  144 #define dkg_gap1        dkg_obs2        /* used to be gap1 */
  145 #define dkg_gap2        dkg_obs3        /* used to be gap2 */
  146 
  147 /*
  148  * Disk io control commands
  149  * Warning: some other ioctls with the DIOC prefix exist elsewhere.
  150  * The Generic DKIOC numbers are from   0   -  50.
  151  *      The Floppy Driver uses          51  - 100.
  152  *      The Hard Disk (except SCSI)     101 - 106.      (these are obsolete)
  153  *      The CDROM Driver                151 - 200.
  154  *      The USCSI ioctl                 201 - 250.
  155  */
  156 #define DKIOC           (0x04 << 8)
  157 
  158 /*
  159  * The following ioctls are generic in nature and need to be
  160  * supported as appropriate by all disk drivers
  161  */
  162 #define DKIOCGGEOM      (DKIOC|1)               /* Get geometry */
  163 #define DKIOCINFO       (DKIOC|3)               /* Get info */
  164 #define DKIOCEJECT      (DKIOC|6)               /* Generic 'eject' */
  165 #define DKIOCGVTOC      (DKIOC|11)              /* Get VTOC */
  166 #define DKIOCSVTOC      (DKIOC|12)              /* Set VTOC & Write to Disk */
  167 
  168 /*
  169  * Disk Cache Controls.  These ioctls should be supported by
  170  * all disk drivers.
  171  *
  172  * DKIOCFLUSHWRITECACHE when used from user-mode ignores the ioctl
  173  * argument, but it should be passed as NULL to allow for future
  174  * reinterpretation.  From user-mode, this ioctl request is synchronous.
  175  *
  176  * When invoked from within the kernel, the arg can be NULL to indicate
  177  * a synchronous request or can be the address of a struct dk_callback
  178  * to request an asynchronous callback when the flush request is complete.
  179  * In this case, the flag to the ioctl must include FKIOCTL and the
  180  * dkc_callback field of the pointed to struct must be non-null or the
  181  * request is made synchronously.
  182  *
  183  * In the callback case: if the ioctl returns 0, a callback WILL be performed.
  184  * If the ioctl returns non-zero, a callback will NOT be performed.
  185  * NOTE: In some cases, the callback may be done BEFORE the ioctl call
  186  * returns.  The caller's locking strategy should be prepared for this case.
  187  */
  188 #define DKIOCFLUSHWRITECACHE    (DKIOC|34)      /* flush cache to phys medium */
  189 
  190 struct dk_callback {
  191         void (*dkc_callback)(void *dkc_cookie, int error);
  192         void *dkc_cookie;
  193         int dkc_flag;
  194 };
  195 
  196 /* bit flag definitions for dkc_flag */
  197 #define FLUSH_VOLATILE          0x1     /* Bit 0: if set, only flush */
  198                                         /* volatile cache; otherwise, flush */
  199                                         /* volatile and non-volatile cache */
  200 
  201 #define DKIOCGETWCE             (DKIOC|36)      /* Get current write cache */
  202                                                 /* enablement status */
  203 #define DKIOCSETWCE             (DKIOC|37)      /* Enable/Disable write cache */
  204 
  205 /*
  206  * The following ioctls are used by Sun drivers to communicate
  207  * with their associated format routines. Support of these ioctls
  208  * is not required of foreign drivers
  209  */
  210 #define DKIOCSGEOM      (DKIOC|2)               /* Set geometry */
  211 #define DKIOCSAPART     (DKIOC|4)               /* Set all partitions */
  212 #define DKIOCGAPART     (DKIOC|5)               /* Get all partitions */
  213 #define DKIOCG_PHYGEOM  (DKIOC|32)              /* get physical geometry */
  214 #define DKIOCG_VIRTGEOM (DKIOC|33)              /* get virtual geometry */
  215 
  216 /*
  217  * The following ioctl's are removable media support
  218  */
  219 #define DKIOCLOCK       (DKIOC|7)       /* Generic 'lock' */
  220 #define DKIOCUNLOCK     (DKIOC|8)       /* Generic 'unlock' */
  221 #define DKIOCSTATE      (DKIOC|13)      /* Inquire insert/eject state */
  222 #define DKIOCREMOVABLE  (DKIOC|16)      /* is media removable */
  223 
  224 
  225 /*
  226  * ioctl for hotpluggable devices
  227  */
  228 #define DKIOCHOTPLUGGABLE       (DKIOC|35)      /* is hotpluggable */
  229 
  230 /*
  231  * Ioctl to force driver to re-read the alternate partition and rebuild
  232  * the internal defect map.
  233  */
  234 #define DKIOCADDBAD     (DKIOC|20)      /* Re-read the alternate map (IDE) */
  235 #define DKIOCGETDEF     (DKIOC|21)      /* read defect list (IDE)          */
  236 
  237 /*
  238  * Used by applications to get disk defect information from IDE
  239  * drives.
  240  */
  241 #ifdef _SYSCALL32
  242 struct defect_header32 {
  243         int             head;
  244         caddr32_t       buffer;
  245 };
  246 #endif /* _SYSCALL32 */
  247 
  248 struct defect_header {
  249         int             head;
  250         caddr_t         buffer;
  251 };
  252 
  253 #define DKIOCPARTINFO   (DKIOC|22)      /* Get partition or slice parameters */
  254 
  255 /*
  256  * Used by applications to get partition or slice information
  257  */
  258 #ifdef _SYSCALL32
  259 struct part_info32 {
  260         uint32_t        p_start;
  261         int             p_length;
  262 };
  263 #endif /* _SYSCALL32 */
  264 
  265 struct part_info {
  266         uint64_t        p_start;
  267         int             p_length;
  268 };
  269 
  270 /* The following ioctls are for Optical Memory Device */
  271 #define DKIOC_EBP_ENABLE  (DKIOC|40)    /* enable by pass erase on write */
  272 #define DKIOC_EBP_DISABLE (DKIOC|41)    /* disable by pass erase on write */
  273 
  274 /*
  275  * This state enum is the argument passed to the DKIOCSTATE ioctl.
  276  */
  277 enum dkio_state { DKIO_NONE, DKIO_EJECTED, DKIO_INSERTED, DKIO_DEV_GONE };
  278 
  279 #define DKIOCGMEDIAINFO (DKIOC|42)      /* get information about the media */
  280 
  281 /*
  282  * ioctls to read/write mboot info.
  283  */
  284 #define DKIOCGMBOOT     (DKIOC|43)      /* get mboot info */
  285 #define DKIOCSMBOOT     (DKIOC|44)      /* set mboot info */
  286 
  287 /*
  288  * ioctl to get the device temperature.
  289  */
  290 #define DKIOCGTEMPERATURE       (DKIOC|45)      /* get temperature */
  291 
  292 /*
  293  * Used for providing the temperature.
  294  */
  295 
  296 struct  dk_temperature  {
  297         uint_t          dkt_flags;      /* Flags */
  298         short           dkt_cur_temp;   /* Current disk temperature */
  299         short           dkt_ref_temp;   /* reference disk temperature */
  300 };
  301 
  302 #define DKT_BYPASS_PM           0x1
  303 #define DKT_INVALID_TEMP        0xFFFF
  304 
  305 
  306 /*
  307  * Used for Media info or the current profile info
  308  */
  309 struct dk_minfo {
  310         uint_t          dki_media_type; /* Media type or profile info */
  311         uint_t          dki_lbsize;     /* Logical blocksize of media */
  312         diskaddr_t      dki_capacity;   /* Capacity as # of dki_lbsize blks */
  313 };
  314 
  315 /*
  316  * Media types or profiles known
  317  */
  318 #define DK_UNKNOWN              0x00    /* Media inserted - type unknown */
  319 
  320 
  321 /*
  322  * SFF 8090 Specification Version 3, media types 0x01 - 0xfffe are retained to
  323  * maintain compatibility with SFF8090.  The following define the
  324  * optical media type.
  325  */
  326 #define DK_REMOVABLE_DISK       0x02 /* Removable Disk */
  327 #define DK_MO_ERASABLE          0x03 /* MO Erasable */
  328 #define DK_MO_WRITEONCE         0x04 /* MO Write once */
  329 #define DK_AS_MO                0x05 /* AS MO */
  330 #define DK_CDROM                0x08 /* CDROM */
  331 #define DK_CDR                  0x09 /* CD-R */
  332 #define DK_CDRW                 0x0A /* CD-RW */
  333 #define DK_DVDROM               0x10 /* DVD-ROM */
  334 #define DK_DVDR                 0x11 /* DVD-R */
  335 #define DK_DVDRAM               0x12 /* DVD_RAM or DVD-RW */
  336 
  337 /*
  338  * Media types for other rewritable magnetic media
  339  */
  340 #define DK_FIXED_DISK           0x10001 /* Fixed disk SCSI or otherwise */
  341 #define DK_FLOPPY               0x10002 /* Floppy media */
  342 #define DK_ZIP                  0x10003 /* IOMEGA ZIP media */
  343 #define DK_JAZ                  0x10004 /* IOMEGA JAZ media */
  344 
  345 #define DKIOCSETEFI     (DKIOC|17)              /* Set EFI info */
  346 #define DKIOCGETEFI     (DKIOC|18)              /* Get EFI info */
  347 
  348 #define DKIOCPARTITION  (DKIOC|9)               /* Get partition info */
  349 
  350 /*
  351  * Ioctls to get/set volume capabilities related to Logical Volume Managers.
  352  * They include the ability to get/set capabilities and to issue a read to a
  353  * specific underlying device of a replicated device.
  354  */
  355 
  356 #define DKIOCGETVOLCAP  (DKIOC | 25)    /* Get volume capabilities */
  357 #define DKIOCSETVOLCAP  (DKIOC | 26)    /* Set volume capabilities */
  358 #define DKIOCDMR        (DKIOC | 27)    /* Issue a directed read */
  359 
  360 typedef uint_t volcapinfo_t;
  361 
  362 typedef uint_t volcapset_t;
  363 
  364 #define DKV_ABR_CAP 0x00000001          /* Support Appl.Based Recovery */
  365 #define DKV_DMR_CAP 0x00000002          /* Support Directed  Mirror Read */
  366 
  367 typedef struct volcap {
  368         volcapinfo_t vc_info;   /* Capabilities available */
  369         volcapset_t vc_set;     /* Capabilities set */
  370 } volcap_t;
  371 
  372 #define VOL_SIDENAME 256
  373 
  374 typedef struct vol_directed_rd {
  375         int             vdr_flags;
  376         offset_t        vdr_offset;
  377         size_t          vdr_nbytes;
  378         size_t          vdr_bytesread;
  379         void            *vdr_data;
  380         int             vdr_side;
  381         char            vdr_side_name[VOL_SIDENAME];
  382 } vol_directed_rd_t;
  383 
  384 #define DKV_SIDE_INIT           (-1)
  385 #define DKV_DMR_NEXT_SIDE       0x00000001
  386 #define DKV_DMR_DONE            0x00000002
  387 #define DKV_DMR_ERROR           0x00000004
  388 #define DKV_DMR_SUCCESS         0x00000008
  389 #define DKV_DMR_SHORT           0x00000010
  390 
  391 #ifdef _MULTI_DATAMODEL
  392 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
  393 #pragma pack(4)
  394 #endif
  395 typedef struct vol_directed_rd32 {
  396         int32_t         vdr_flags;
  397         offset_t        vdr_offset;     /* 64-bit element on 32-bit alignment */
  398         size32_t        vdr_nbytes;
  399         size32_t        vdr_bytesread;
  400         caddr32_t       vdr_data;
  401         int32_t         vdr_side;
  402         char            vdr_side_name[VOL_SIDENAME];
  403 } vol_directed_rd32_t;
  404 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
  405 #pragma pack()
  406 #endif
  407 #endif  /* _MULTI_DATAMODEL */
  408 
  409 /*
  410  * The ioctl is used to fetch disk's device type, vendor ID,
  411  * model number/product ID, firmware revision and serial number together.
  412  *
  413  * Currently there are two device types - DKD_ATA_TYPE which means the
  414  * disk is driven by cmdk/ata or dad/uata driver, and DKD_SCSI_TYPE
  415  * which means the disk is driven by sd/scsi hba driver.
  416  */
  417 #define DKIOC_GETDISKID (DKIOC|46)
  418 
  419 /* These two labels are for dkd_dtype of dk_disk_id_t */
  420 #define DKD_ATA_TYPE    0x01 /* ATA disk or legacy mode SATA disk */
  421 #define DKD_SCSI_TYPE   0x02 /* SCSI disk or native mode SATA disk */
  422 
  423 #define DKD_ATA_MODEL   40      /* model number length */
  424 #define DKD_ATA_FWVER   8       /* firmware revision length */
  425 #define DKD_ATA_SERIAL  20      /* serial number length */
  426 
  427 #define DKD_SCSI_VENDOR 8       /* vendor ID length */
  428 #define DKD_SCSI_PRODUCT 16     /* product ID length */
  429 #define DKD_SCSI_REVLEVEL 4     /* revision level length */
  430 #define DKD_SCSI_SERIAL 12      /* serial number length */
  431 
  432 /*
  433  * The argument type for DKIOC_GETDISKID ioctl.
  434  */
  435 typedef struct dk_disk_id {
  436         uint_t  dkd_dtype;
  437         union {
  438                 struct {
  439                         char dkd_amodel[DKD_ATA_MODEL];         /* 40 bytes */
  440                         char dkd_afwver[DKD_ATA_FWVER];         /* 8 bytes */
  441                         char dkd_aserial[DKD_ATA_SERIAL];       /* 20 bytes */
  442                 } ata_disk_id;
  443                 struct {
  444                         char dkd_svendor[DKD_SCSI_VENDOR];      /* 8 bytes */
  445                         char dkd_sproduct[DKD_SCSI_PRODUCT];    /* 16 bytes */
  446                         char dkd_sfwver[DKD_SCSI_REVLEVEL];     /* 4 bytes */
  447                         char dkd_sserial[DKD_SCSI_SERIAL];      /* 12 bytes */
  448                 } scsi_disk_id;
  449         } disk_id;
  450 } dk_disk_id_t;
  451 
  452 /*
  453  * The ioctl is used to update the firmware of device.
  454  */
  455 #define DKIOC_UPDATEFW          (DKIOC|47)
  456 
  457 /* The argument type for DKIOC_UPDATEFW ioctl */
  458 typedef struct dk_updatefw {
  459         caddr_t         dku_ptrbuf;     /* pointer to firmware buf */
  460         uint_t          dku_size;       /* firmware buf length */
  461         uint8_t         dku_type;       /* firmware update type */
  462 } dk_updatefw_t;
  463 
  464 #ifdef _SYSCALL32
  465 typedef struct dk_updatefw_32 {
  466         caddr32_t       dku_ptrbuf;     /* pointer to firmware buf */
  467         uint_t          dku_size;       /* firmware buf length */
  468         uint8_t         dku_type;       /* firmware update type */
  469 } dk_updatefw_32_t;
  470 #endif /* _SYSCALL32 */
  471 
  472 /*
  473  * firmware update type - temporary or permanent use
  474  */
  475 #define FW_TYPE_TEMP    0x0             /* temporary use */
  476 #define FW_TYPE_PERM    0x1             /* permanent use */
  477 
  478 
  479 #ifdef  __cplusplus
  480 }
  481 #endif
  482 
  483 #endif /* _SYS_DKIO_H */

Cache object: 19fed18f5d9034c6a9183717b2d67e69


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.