root/scsi/scsiconf.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. _lto2b
  2. _lto3b
  3. _lto4b
  4. _lto8b
  5. _2btol
  6. _3btol
  7. _4btol
  8. _5btol
  9. _8btol
  10. _lto2l
  11. _lto3l
  12. _lto4l
  13. _2ltol
  14. _3ltol
  15. _4ltol

    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 */

/* [<][>][^][v][top][bottom][index][help] */