[BACK]Return to scsiconf.h CVS log [TXT][DIR] Up to [local] / sys / scsi

Annotation of sys/scsi/scsiconf.h, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: scsiconf.h,v 1.87 2007/06/23 19:19:49 krw Exp $       */
        !             2: /*     $NetBSD: scsiconf.h,v 1.35 1997/04/02 02:29:38 mycroft Exp $    */
        !             3:
        !             4: /*
        !             5:  * Copyright (c) 1993, 1994, 1995 Charles Hannum.  All rights reserved.
        !             6:  *
        !             7:  * Redistribution and use in source and binary forms, with or without
        !             8:  * modification, are permitted provided that the following conditions
        !             9:  * are met:
        !            10:  * 1. Redistributions of source code must retain the above copyright
        !            11:  *    notice, this list of conditions and the following disclaimer.
        !            12:  * 2. Redistributions in binary form must reproduce the above copyright
        !            13:  *    notice, this list of conditions and the following disclaimer in the
        !            14:  *    documentation and/or other materials provided with the distribution.
        !            15:  * 3. All advertising materials mentioning features or use of this software
        !            16:  *    must display the following acknowledgement:
        !            17:  *     This product includes software developed by Charles Hannum.
        !            18:  * 4. The name of the author may not be used to endorse or promote products
        !            19:  *    derived from this software without specific prior written permission.
        !            20:  *
        !            21:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            22:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
        !            23:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
        !            24:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
        !            25:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
        !            26:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        !            27:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        !            28:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        !            29:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
        !            30:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            31:  */
        !            32:
        !            33: /*
        !            34:  * Originally written by Julian Elischer (julian@tfs.com)
        !            35:  * for TRW Financial Systems for use under the MACH(2.5) operating system.
        !            36:  *
        !            37:  * TRW Financial Systems, in accordance with their agreement with Carnegie
        !            38:  * Mellon University, makes this software available to CMU to distribute
        !            39:  * or use in any manner that they see fit as long as this message is kept with
        !            40:  * the software. For this reason TFS also grants any other persons or
        !            41:  * organisations permission to use or modify this software.
        !            42:  *
        !            43:  * TFS supplies this software to be publicly redistributed
        !            44:  * on the understanding that TFS is not responsible for the correct
        !            45:  * functioning of this software in any circumstances.
        !            46:  *
        !            47:  * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
        !            48:  */
        !            49:
        !            50: #ifndef        SCSI_SCSICONF_H
        !            51: #define SCSI_SCSICONF_H 1
        !            52:
        !            53: #include <sys/queue.h>
        !            54: #include <sys/timeout.h>
        !            55: #include <sys/workq.h>
        !            56: #include <machine/cpu.h>
        !            57: #include <scsi/scsi_debug.h>
        !            58:
        !            59: /*
        !            60:  * The following documentation tries to describe the relationship between the
        !            61:  * various structures defined in this file:
        !            62:  *
        !            63:  * each adapter type has a scsi_adapter struct. This describes the adapter and
        !            64:  *    identifies routines that can be called to use the adapter.
        !            65:  * each device type has a scsi_device struct. This describes the device and
        !            66:  *    identifies routines that can be called to use the device.
        !            67:  * each existing device position (scsibus + target + lun)
        !            68:  *    can be described by a scsi_link struct.
        !            69:  *    Only scsi positions that actually have devices, have a scsi_link
        !            70:  *    structure assigned. so in effect each device has scsi_link struct.
        !            71:  *    The scsi_link structure contains information identifying both the
        !            72:  *    device driver and the adapter driver for that position on that scsi bus,
        !            73:  *    and can be said to 'link' the two.
        !            74:  * each individual scsi bus has an array that points to all the scsi_link
        !            75:  *    structs associated with that scsi bus. Slots with no device have
        !            76:  *    a NULL pointer.
        !            77:  * each individual device also knows the address of its own scsi_link
        !            78:  *    structure.
        !            79:  *
        !            80:  *                             -------------
        !            81:  *
        !            82:  * The key to all this is the scsi_link structure which associates all the
        !            83:  * other structures with each other in the correct configuration.  The
        !            84:  * scsi_link is the connecting information that allows each part of the
        !            85:  * scsi system to find the associated other parts.
        !            86:  */
        !            87:
        !            88: struct buf;
        !            89: struct scsi_xfer;
        !            90: struct scsi_link;
        !            91:
        !            92: /*
        !            93:  * Temporary hack
        !            94:  */
        !            95: extern int scsi_autoconf;
        !            96:
        !            97: /*
        !            98:  * These entrypoints are called by the high-end drivers to get services from
        !            99:  * whatever low-end drivers they are attached to.  Each adapter type has one
        !           100:  * of these statically allocated.
        !           101:  */
        !           102: struct scsi_adapter {
        !           103:        int             (*scsi_cmd)(struct scsi_xfer *);
        !           104:        void            (*scsi_minphys)(struct buf *);
        !           105:        int             (*open_target_lu)(void);
        !           106:        int             (*close_target_lu)(void);
        !           107:        int             (*ioctl)(struct scsi_link *, u_long, caddr_t, int,
        !           108:                            struct proc *);
        !           109: };
        !           110:
        !           111: /*
        !           112:  * return values for scsi_cmd()
        !           113:  */
        !           114: #define SUCCESSFULLY_QUEUED    0
        !           115: #define TRY_AGAIN_LATER                1
        !           116: #define        COMPLETE                2
        !           117: #define        ESCAPE_NOT_SUPPORTED    3
        !           118: #define NO_CCB                 4
        !           119:
        !           120: /*
        !           121:  * These entry points are called by the low-end drivers to get services from
        !           122:  * whatever high-end drivers they are attached to.  Each device type has one
        !           123:  * of these statically allocated.
        !           124:  */
        !           125: struct scsi_device {
        !           126:        int     (*err_handler)(struct scsi_xfer *);
        !           127:                        /* returns -1 to say err processing done */
        !           128:        void    (*start)(void *);
        !           129:
        !           130:        int     (*async)(void);
        !           131:        void    (*done)(struct scsi_xfer *);
        !           132: };
        !           133:
        !           134: /*
        !           135:  * This structure describes the connection between an adapter driver and
        !           136:  * a device driver, and is used by each to call services provided by
        !           137:  * the other, and to allow generic scsi glue code to call these services
        !           138:  * as well.
        !           139:  */
        !           140: struct scsi_link {
        !           141:        u_int8_t scsibus;               /* the Nth scsibus */
        !           142:        u_int8_t luns;
        !           143:        u_int16_t target;               /* targ of this dev */
        !           144:        u_int16_t lun;                  /* lun of this dev */
        !           145:        u_int16_t openings;             /* available operations */
        !           146:        u_int64_t port_wwn;             /* world wide name of port */
        !           147:        u_int64_t node_wwn;             /* world wide name of node */
        !           148:        u_int16_t adapter_target;       /* what are we on the scsi bus */
        !           149:        u_int16_t adapter_buswidth;     /* 8 (regular) or 16 (wide). (0 becomes 8) */
        !           150:        u_int16_t active;               /* operations in progress */
        !           151:        u_int16_t flags;                /* flags that all devices have */
        !           152: #define        SDEV_REMOVABLE          0x0001  /* media is removable */
        !           153: #define        SDEV_MEDIA_LOADED       0x0002  /* device figures are still valid */
        !           154: #define        SDEV_WAITING            0x0004  /* a process is waiting for this */
        !           155: #define        SDEV_OPEN               0x0008  /* at least 1 open session */
        !           156: #define        SDEV_DBX                0x00f0  /* debugging flags (scsi_debug.h) */
        !           157: #define        SDEV_EJECTING           0x0100  /* eject on device close */
        !           158: #define        SDEV_ATAPI              0x0200  /* device is ATAPI */
        !           159: #define        SDEV_2NDBUS             0x0400  /* device is a 'second' bus device */
        !           160: #define SDEV_UMASS             0x0800  /* device is UMASS SCSI */
        !           161: #define SDEV_VIRTUAL           0x1000  /* device is virtualised on the hba */
        !           162:        u_int16_t quirks;               /* per-device oddities */
        !           163: #define        SDEV_AUTOSAVE           0x0001  /* do implicit SAVEDATAPOINTER on disconnect */
        !           164: #define        SDEV_NOSYNC             0x0002  /* does not grok SDTR */
        !           165: #define        SDEV_NOWIDE             0x0004  /* does not grok WDTR */
        !           166: #define        SDEV_NOTAGS             0x0008  /* lies about having tagged queueing */
        !           167: #define        SDEV_NOSYNCCACHE        0x0100  /* no SYNCHRONIZE_CACHE */
        !           168: #define        ADEV_NOSENSE            0x0200  /* No request sense - ATAPI */
        !           169: #define        ADEV_LITTLETOC          0x0400  /* little-endian TOC - ATAPI */
        !           170: #define        ADEV_NOCAPACITY         0x0800  /* no READ CD CAPACITY */
        !           171: #define        ADEV_NOTUR              0x1000  /* No TEST UNIT READY */
        !           172: #define        ADEV_NODOORLOCK         0x2000  /* can't lock door */
        !           173: #define SDEV_ONLYBIG           0x4000  /* always use READ_BIG and WRITE_BIG */
        !           174:        struct  scsi_device *device;    /* device entry points etc. */
        !           175:        void    *device_softc;          /* needed for call to foo_start */
        !           176:        struct  scsi_adapter *adapter;  /* adapter entry points etc. */
        !           177:        void    *adapter_softc;         /* needed for call to foo_scsi_cmd */
        !           178:        struct  scsi_inquiry_data inqdata; /* copy of INQUIRY data from probe */
        !           179: };
        !           180:
        !           181: int    scsiprint(void *, const char *);
        !           182:
        !           183: /*
        !           184:  * This describes matching information for scsi_inqmatch().  The more things
        !           185:  * match, the higher the configuration priority.
        !           186:  */
        !           187: struct scsi_inquiry_pattern {
        !           188:        u_int8_t type;
        !           189:        int removable;
        !           190:        char *vendor;
        !           191:        char *product;
        !           192:        char *revision;
        !           193: };
        !           194:
        !           195: struct scsibus_attach_args {
        !           196:        struct scsi_link *saa_sc_link;
        !           197: };
        !           198:
        !           199: /*
        !           200:  * One of these is allocated and filled in for each scsi bus.
        !           201:  * It holds pointers to allow the scsi bus to get to the driver
        !           202:  * that is running each LUN on the bus.
        !           203:  * It also has a template entry which is the prototype struct
        !           204:  * supplied by the adapter driver.  This is used to initialise
        !           205:  * the others, before they have the rest of the fields filled in.
        !           206:  */
        !           207: struct scsibus_softc {
        !           208:        struct device sc_dev;
        !           209:        struct scsi_link *adapter_link; /* prototype supplied by adapter */
        !           210:        struct scsi_link ***sc_link;
        !           211:        u_int16_t sc_buswidth;
        !           212: };
        !           213:
        !           214: /*
        !           215:  * This is used to pass information from the high-level configuration code
        !           216:  * to the device-specific drivers.
        !           217:  */
        !           218: struct scsi_attach_args {
        !           219:        struct scsi_link *sa_sc_link;
        !           220:        struct scsi_inquiry_data *sa_inqbuf;
        !           221: };
        !           222:
        !           223: /*
        !           224:  * Each scsi transaction is fully described by one of these structures.
        !           225:  * It includes information about the source of the command and also the
        !           226:  * device and adapter for which the command is destined.
        !           227:  * (via the scsi_link structure)
        !           228:  */
        !           229: struct scsi_xfer {
        !           230:        LIST_ENTRY(scsi_xfer) free_list;
        !           231:        int     flags;
        !           232:        struct  scsi_link *sc_link;     /* all about our device and adapter */
        !           233:        int     retries;                /* the number of times to retry */
        !           234:        int     timeout;                /* in milliseconds */
        !           235:        struct  scsi_generic *cmd;      /* The scsi command to execute */
        !           236:        int     cmdlen;                 /* how long it is */
        !           237:        u_char  *data;                  /* dma address OR a uio address */
        !           238:        int     datalen;                /* data len (blank if uio)    */
        !           239:        size_t  resid;                  /* how much buffer was not touched */
        !           240:        int     error;                  /* an error value       */
        !           241:        struct  buf *bp;                /* If we need to associate with a buf */
        !           242:        struct  scsi_sense_data sense; /* 32 bytes*/
        !           243:        /*
        !           244:         * Believe it or not, Some targets fall on the ground with
        !           245:         * anything but a certain sense length.
        !           246:         */
        !           247:        int     req_sense_length;       /* Explicit request sense length */
        !           248:        u_int8_t status;                /* SCSI status */
        !           249:        struct  scsi_generic cmdstore;  /* stash the command in here */
        !           250:        /*
        !           251:         * timeout structure for hba's to use for a command
        !           252:         */
        !           253:        struct timeout stimeout;
        !           254: };
        !           255:
        !           256: /*
        !           257:  * Per-request Flag values
        !           258:  */
        !           259: #define        SCSI_NOSLEEP    0x00001 /* don't sleep */
        !           260: #define        SCSI_POLL       0x00002 /* poll for completion */
        !           261: #define        SCSI_AUTOCONF   0x00003 /* shorthand for SCSI_POLL | SCSI_NOSLEEP */
        !           262: #define        SCSI_USER       0x00004 /* Is a user cmd, call scsi_user_done   */
        !           263: #define        ITSDONE         0x00008 /* the transfer is as done as it gets   */
        !           264: #define        SCSI_SILENT     0x00020 /* don't announce NOT READY or MEDIA CHANGE */
        !           265: #define        SCSI_IGNORE_NOT_READY           0x00040 /* ignore NOT READY */
        !           266: #define        SCSI_IGNORE_MEDIA_CHANGE        0x00080 /* ignore MEDIA CHANGE */
        !           267: #define        SCSI_IGNORE_ILLEGAL_REQUEST     0x00100 /* ignore ILLEGAL REQUEST */
        !           268: #define        SCSI_RESET      0x00200 /* Reset the device in question         */
        !           269: #define        SCSI_DATA_UIO   0x00400 /* The data address refers to a UIO     */
        !           270: #define        SCSI_DATA_IN    0x00800 /* expect data to come INTO memory      */
        !           271: #define        SCSI_DATA_OUT   0x01000 /* expect data to flow OUT of memory    */
        !           272: #define        SCSI_TARGET     0x02000 /* This defines a TARGET mode op.       */
        !           273: #define        SCSI_ESCAPE     0x04000 /* Escape operation                     */
        !           274: #define SCSI_URGENT    0x08000 /* Urgent operation (e.g., HTAG)        */
        !           275: #define        SCSI_PRIVATE    0xf0000 /* private to each HBA flags */
        !           276:
        !           277: /*
        !           278:  * Escape op-codes.  This provides an extensible setup for operations
        !           279:  * that are not scsi commands.  They are intended for modal operations.
        !           280:  */
        !           281:
        !           282: #define SCSI_OP_TARGET 0x0001
        !           283: #define        SCSI_OP_RESET   0x0002
        !           284: #define        SCSI_OP_BDINFO  0x0003
        !           285:
        !           286: /*
        !           287:  * Error values an adapter driver may return
        !           288:  */
        !           289: #define XS_NOERROR     0       /* there is no error, (sense is invalid)  */
        !           290: #define XS_SENSE       1       /* Check the returned sense for the error */
        !           291: #define        XS_DRIVER_STUFFUP 2     /* Driver failed to perform operation     */
        !           292: #define XS_SELTIMEOUT  3       /* The device timed out.. turned off?     */
        !           293: #define XS_TIMEOUT     4       /* The Timeout reported was caught by SW  */
        !           294: #define XS_BUSY                5       /* The device busy, try again later?      */
        !           295: #define XS_SHORTSENSE   6      /* Check the ATAPI sense for the error */
        !           296: #define XS_RESET       8       /* bus was reset; possible retry command  */
        !           297:
        !           298: /*
        !           299:  * Possible retries numbers for scsi_test_unit_ready()
        !           300:  */
        !           301: #define TEST_READY_RETRIES     5
        !           302:
        !           303: const void *scsi_inqmatch(struct scsi_inquiry_data *, const void *, int,
        !           304:            int, int *);
        !           305:
        !           306: #define scsi_task(_f, _a1, _a2, _fl) \
        !           307:     workq_add_task(NULL, (_fl), (_f), (_a1), (_a2))
        !           308:
        !           309: void   scsi_init(void);
        !           310: void   scsi_deinit(void);
        !           311: struct scsi_xfer *
        !           312:        scsi_get_xs(struct scsi_link *, int);
        !           313: void   scsi_free_xs(struct scsi_xfer *, int);
        !           314: int    scsi_execute_xs(struct scsi_xfer *);
        !           315: daddr64_t scsi_size(struct scsi_link *, int, u_int32_t *);
        !           316: int    scsi_test_unit_ready(struct scsi_link *, int, int);
        !           317: int    scsi_inquire(struct scsi_link *, struct scsi_inquiry_data *, int);
        !           318: int    scsi_inquire_vpd(struct scsi_link *, void *, u_int, u_int8_t, int);
        !           319: int    scsi_prevent(struct scsi_link *, int, int);
        !           320: int    scsi_start(struct scsi_link *, int, int);
        !           321: int    scsi_mode_sense(struct scsi_link *, int, int, struct scsi_mode_header *,
        !           322:            size_t, int, int);
        !           323: int    scsi_mode_sense_big(struct scsi_link *, int, int,
        !           324:            struct scsi_mode_header_big *, size_t, int, int);
        !           325: void * scsi_mode_sense_page(struct scsi_mode_header *, int);
        !           326: void * scsi_mode_sense_big_page(struct scsi_mode_header_big *, int);
        !           327: int    scsi_do_mode_sense(struct scsi_link *, int,
        !           328:            union scsi_mode_sense_buf *, void **, u_int32_t *, u_int64_t *,
        !           329:            u_int32_t *, int, int, int *);
        !           330: int    scsi_mode_select(struct scsi_link *, int, struct scsi_mode_header *,
        !           331:            int, int);
        !           332: int    scsi_mode_select_big(struct scsi_link *, int,
        !           333:            struct scsi_mode_header_big *, int, int);
        !           334: void   scsi_done(struct scsi_xfer *);
        !           335: void   scsi_user_done(struct scsi_xfer *);
        !           336: int    scsi_scsi_cmd(struct scsi_link *, struct scsi_generic *,
        !           337:            int cmdlen, u_char *data_addr, int datalen, int retries,
        !           338:            int timeout, struct buf *bp, int flags);
        !           339: int    scsi_do_ioctl(struct scsi_link *, dev_t, u_long, caddr_t,
        !           340:            int, struct proc *);
        !           341: void   sc_print_addr(struct scsi_link *);
        !           342: int    scsi_report_luns(struct scsi_link *, int,
        !           343:            struct scsi_report_luns_data *, u_int32_t, int, int);
        !           344:
        !           345: void   show_scsi_xs(struct scsi_xfer *);
        !           346: void   scsi_print_sense(struct scsi_xfer *);
        !           347: void   show_scsi_cmd(struct scsi_xfer *);
        !           348: void   show_mem(u_char *, int);
        !           349: void   scsi_strvis(u_char *, u_char *, int);
        !           350: int    scsi_delay(struct scsi_xfer *, int);
        !           351:
        !           352: int    scsi_probe_bus(struct scsibus_softc *);
        !           353: int    scsi_probe_target(struct scsibus_softc *, int);
        !           354: int    scsi_probe_lun(struct scsibus_softc *, int, int);
        !           355:
        !           356: int    scsi_detach_bus(struct scsibus_softc *, int);
        !           357: int    scsi_detach_target(struct scsibus_softc *, int, int);
        !           358: int    scsi_detach_lun(struct scsibus_softc *, int, int, int);
        !           359:
        !           360: static __inline void _lto2b(u_int32_t val, u_int8_t *bytes);
        !           361: static __inline void _lto3b(u_int32_t val, u_int8_t *bytes);
        !           362: static __inline void _lto4b(u_int32_t val, u_int8_t *bytes);
        !           363: static __inline void _lto8b(u_int64_t val, u_int8_t *bytes);
        !           364: static __inline u_int32_t _2btol(u_int8_t *bytes);
        !           365: static __inline u_int32_t _3btol(u_int8_t *bytes);
        !           366: static __inline u_int32_t _4btol(u_int8_t *bytes);
        !           367: static __inline u_int64_t _5btol(u_int8_t *bytes);
        !           368: static __inline u_int64_t _8btol(u_int8_t *bytes);
        !           369:
        !           370: static __inline void _lto2l(u_int32_t val, u_int8_t *bytes);
        !           371: static __inline void _lto3l(u_int32_t val, u_int8_t *bytes);
        !           372: static __inline void _lto4l(u_int32_t val, u_int8_t *bytes);
        !           373: static __inline u_int32_t _2ltol(u_int8_t *bytes);
        !           374: static __inline u_int32_t _3ltol(u_int8_t *bytes);
        !           375: static __inline u_int32_t _4ltol(u_int8_t *bytes);
        !           376:
        !           377: static __inline void
        !           378: _lto2b(val, bytes)
        !           379:        u_int32_t val;
        !           380:        u_int8_t *bytes;
        !           381: {
        !           382:
        !           383:        bytes[0] = (val >> 8) & 0xff;
        !           384:        bytes[1] = val & 0xff;
        !           385: }
        !           386:
        !           387: static __inline void
        !           388: _lto3b(val, bytes)
        !           389:        u_int32_t val;
        !           390:        u_int8_t *bytes;
        !           391: {
        !           392:
        !           393:        bytes[0] = (val >> 16) & 0xff;
        !           394:        bytes[1] = (val >> 8) & 0xff;
        !           395:        bytes[2] = val & 0xff;
        !           396: }
        !           397:
        !           398: static __inline void
        !           399: _lto4b(val, bytes)
        !           400:        u_int32_t val;
        !           401:        u_int8_t *bytes;
        !           402: {
        !           403:
        !           404:        bytes[0] = (val >> 24) & 0xff;
        !           405:        bytes[1] = (val >> 16) & 0xff;
        !           406:        bytes[2] = (val >> 8) & 0xff;
        !           407:        bytes[3] = val & 0xff;
        !           408: }
        !           409:
        !           410: static __inline void
        !           411: _lto8b(val, bytes)
        !           412:        u_int64_t val;
        !           413:        u_int8_t *bytes;
        !           414: {
        !           415:
        !           416:        bytes[0] = (val >> 56) & 0xff;
        !           417:        bytes[1] = (val >> 48) & 0xff;
        !           418:        bytes[2] = (val >> 40) & 0xff;
        !           419:        bytes[3] = (val >> 32) & 0xff;
        !           420:        bytes[4] = (val >> 24) & 0xff;
        !           421:        bytes[5] = (val >> 16) & 0xff;
        !           422:        bytes[6] = (val >> 8) & 0xff;
        !           423:        bytes[7] = val & 0xff;
        !           424: }
        !           425:
        !           426: static __inline u_int32_t
        !           427: _2btol(bytes)
        !           428:        u_int8_t *bytes;
        !           429: {
        !           430:        u_int32_t rv;
        !           431:
        !           432:        rv = (bytes[0] << 8) | bytes[1];
        !           433:        return (rv);
        !           434: }
        !           435:
        !           436: static __inline u_int32_t
        !           437: _3btol(bytes)
        !           438:        u_int8_t *bytes;
        !           439: {
        !           440:        u_int32_t rv;
        !           441:
        !           442:        rv = (bytes[0] << 16) | (bytes[1] << 8) | bytes[2];
        !           443:        return (rv);
        !           444: }
        !           445:
        !           446: static __inline u_int32_t
        !           447: _4btol(bytes)
        !           448:        u_int8_t *bytes;
        !           449: {
        !           450:        u_int32_t rv;
        !           451:
        !           452:        rv = (bytes[0] << 24) | (bytes[1] << 16) |
        !           453:            (bytes[2] << 8) | bytes[3];
        !           454:        return (rv);
        !           455: }
        !           456:
        !           457: static __inline u_int64_t
        !           458: _5btol(bytes)
        !           459:        u_int8_t *bytes;
        !           460: {
        !           461:        u_int64_t rv;
        !           462:
        !           463:        rv = ((u_int64_t)bytes[0] << 32) |
        !           464:             ((u_int64_t)bytes[1] << 24) |
        !           465:             ((u_int64_t)bytes[2] << 16) |
        !           466:             ((u_int64_t)bytes[3] << 8) |
        !           467:             (u_int64_t)bytes[4];
        !           468:        return (rv);
        !           469: }
        !           470:
        !           471: static __inline u_int64_t
        !           472: _8btol(bytes)
        !           473:        u_int8_t *bytes;
        !           474: {
        !           475:        u_int64_t rv;
        !           476:
        !           477:        rv = (((u_int64_t)bytes[0]) << 56) |
        !           478:            (((u_int64_t)bytes[1]) << 48) |
        !           479:            (((u_int64_t)bytes[2]) << 40) |
        !           480:            (((u_int64_t)bytes[3]) << 32) |
        !           481:            (((u_int64_t)bytes[4]) << 24) |
        !           482:            (((u_int64_t)bytes[5]) << 16) |
        !           483:            (((u_int64_t)bytes[6]) << 8) |
        !           484:            ((u_int64_t)bytes[7]);
        !           485:        return (rv);
        !           486: }
        !           487:
        !           488: static __inline void
        !           489: _lto2l(val, bytes)
        !           490:        u_int32_t val;
        !           491:        u_int8_t *bytes;
        !           492: {
        !           493:
        !           494:        bytes[0] = val & 0xff;
        !           495:        bytes[1] = (val >> 8) & 0xff;
        !           496: }
        !           497:
        !           498: static __inline void
        !           499: _lto3l(val, bytes)
        !           500:        u_int32_t val;
        !           501:        u_int8_t *bytes;
        !           502: {
        !           503:
        !           504:        bytes[0] = val & 0xff;
        !           505:        bytes[1] = (val >> 8) & 0xff;
        !           506:        bytes[2] = (val >> 16) & 0xff;
        !           507: }
        !           508:
        !           509: static __inline void
        !           510: _lto4l(val, bytes)
        !           511:        u_int32_t val;
        !           512:        u_int8_t *bytes;
        !           513: {
        !           514:
        !           515:        bytes[0] = val & 0xff;
        !           516:        bytes[1] = (val >> 8) & 0xff;
        !           517:        bytes[2] = (val >> 16) & 0xff;
        !           518:        bytes[3] = (val >> 24) & 0xff;
        !           519: }
        !           520:
        !           521: static __inline u_int32_t
        !           522: _2ltol(bytes)
        !           523:        u_int8_t *bytes;
        !           524: {
        !           525:        u_int32_t rv;
        !           526:
        !           527:        rv = bytes[0] | (bytes[1] << 8);
        !           528:        return (rv);
        !           529: }
        !           530:
        !           531: static __inline u_int32_t
        !           532: _3ltol(bytes)
        !           533:        u_int8_t *bytes;
        !           534: {
        !           535:        u_int32_t rv;
        !           536:
        !           537:        rv = bytes[0] | (bytes[1] << 8) | (bytes[2] << 16);
        !           538:        return (rv);
        !           539: }
        !           540:
        !           541: static __inline u_int32_t
        !           542: _4ltol(bytes)
        !           543:        u_int8_t *bytes;
        !           544: {
        !           545:        u_int32_t rv;
        !           546:
        !           547:        rv = bytes[0] | (bytes[1] << 8) |
        !           548:            (bytes[2] << 16) | (bytes[3] << 24);
        !           549:        return (rv);
        !           550: }
        !           551:
        !           552: extern const u_int8_t version_to_spc [];
        !           553: #define SCSISPC(x)(version_to_spc[(x) & SID_ANSII])
        !           554:
        !           555: #endif /* SCSI_SCSICONF_H */

CVSweb