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/dev/scsipi/scsipiconf.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 /*      $NetBSD: scsipiconf.h,v 1.130 2019/03/28 10:44:29 kardel Exp $  */
    2 
    3 /*-
    4  * Copyright (c) 1998, 1999, 2000, 2004 The NetBSD Foundation, Inc.
    5  * All rights reserved.
    6  *
    7  * This code is derived from software contributed to The NetBSD Foundation
    8  * by Charles M. Hannum; by Jason R. Thorpe of the Numerical Aerospace
    9  * Simulation Facility, NASA Ames Research Center.
   10  *
   11  * Redistribution and use in source and binary forms, with or without
   12  * modification, are permitted provided that the following conditions
   13  * are met:
   14  * 1. Redistributions of source code must retain the above copyright
   15  *    notice, this list of conditions and the following disclaimer.
   16  * 2. Redistributions in binary form must reproduce the above copyright
   17  *    notice, this list of conditions and the following disclaimer in the
   18  *    documentation and/or other materials provided with the distribution.
   19  *
   20  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   21  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   22  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   24  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   30  * 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 _DEV_SCSIPI_SCSIPICONF_H_
   51 #define _DEV_SCSIPI_SCSIPICONF_H_
   52 
   53 typedef int     boolean;
   54 
   55 #include <sys/callout.h>
   56 #include <sys/queue.h>
   57 #include <sys/condvar.h>
   58 #include <dev/scsipi/scsi_spc.h>
   59 #include <dev/scsipi/scsipi_debug.h>
   60 
   61 struct buf;
   62 struct proc;
   63 struct device;
   64 struct scsipi_channel;
   65 struct scsipi_periph;
   66 struct scsipi_xfer;
   67 
   68 /*
   69  * The following defines the scsipi_xfer queue.
   70  */
   71 TAILQ_HEAD(scsipi_xfer_queue, scsipi_xfer);
   72 
   73 struct scsipi_generic {
   74         u_int8_t opcode;
   75         u_int8_t bytes[15];
   76 };
   77 
   78 
   79 /*
   80  * scsipi_async_event_t:
   81  *
   82  *      Asynchronous events from the adapter to the mid-layer and
   83  *      peripheral.
   84  *
   85  *      Arguments:
   86  *
   87  *      ASYNC_EVENT_MAX_OPENINGS        scsipi_max_openings * -- max
   88  *                                      openings, device specified in
   89  *                                      parameters
   90  *
   91  *      ASYNC_EVENT_XFER_MODE           scsipi_xfer_mode * -- xfer mode
   92  *                                      parameters changed for I_T Nexus
   93  *      ASYNC_EVENT_RESET               NULL - channel has been reset
   94  */
   95 typedef enum {
   96         ASYNC_EVENT_MAX_OPENINGS,       /* set max openings on periph */
   97         ASYNC_EVENT_XFER_MODE,          /* xfer mode update for I_T */
   98         ASYNC_EVENT_RESET               /* channel reset */
   99 } scsipi_async_event_t;
  100 
  101 /*
  102  * scsipi_max_openings:
  103  *
  104  *      Argument for an ASYNC_EVENT_MAX_OPENINGS event.
  105  */
  106 struct scsipi_max_openings {
  107         int     mo_target;              /* openings are for this target... */
  108         int     mo_lun;                 /* ...and this lun */
  109         int     mo_openings;            /* openings value */
  110 };
  111 
  112 /*
  113  * scsipi_xfer_mode:
  114  *
  115  *      Argument for an ASYNC_EVENT_XFER_MODE event.
  116  */
  117 struct scsipi_xfer_mode {
  118         int     xm_target;              /* target, for I_T Nexus */
  119         int     xm_mode;                /* PERIPH_CAP* bits */
  120         int     xm_period;              /* sync period */
  121         int     xm_offset;              /* sync offset */
  122 };
  123 
  124 
  125 /*
  126  * scsipi_adapter_req_t:
  127  *
  128  *      Requests that can be made of an adapter.
  129  *
  130  *      Arguments:
  131  *
  132  *      ADAPTER_REQ_RUN_XFER            scsipi_xfer * -- the xfer which
  133  *                                      is to be run
  134  *
  135  *      ADAPTER_REQ_GROW_RESOURCES      no argument
  136  *
  137  *      ADAPTER_REQ_SET_XFER_MODE       scsipi_xfer_mode * -- set the xfer
  138  *                                      mode for the I_T Nexus according to
  139  *                                      this
  140  */
  141 typedef enum {
  142         ADAPTER_REQ_RUN_XFER,           /* run a scsipi_xfer */
  143         ADAPTER_REQ_GROW_RESOURCES,     /* grow xfer execution resources */
  144         ADAPTER_REQ_SET_XFER_MODE       /* set xfer mode */
  145 } scsipi_adapter_req_t;
  146 
  147 #ifdef _KERNEL
  148 /*
  149  * scsipi_periphsw:
  150  *
  151  *      Callbacks into periph driver from midlayer.
  152  *
  153  *      psw_error       Called by the bustype's interpret-sense routine
  154  *                      to do periph-specific sense handling.
  155  *
  156  *      psw_start       Called by midlayer to restart a device once
  157  *                      more command openings become available.
  158  *
  159  *      psw_async       Called by midlayer when an asynchronous event
  160  *                      from the adapter occurs.
  161  *
  162  *      psw_done        Called by the midlayer when an xfer has completed.
  163  */
  164 struct scsipi_periphsw {
  165         int     (*psw_error)(struct scsipi_xfer *);
  166         void    (*psw_start)(struct scsipi_periph *);
  167         int     (*psw_async)(struct scsipi_periph *,
  168                     scsipi_async_event_t, void *);
  169         void    (*psw_done)(struct scsipi_xfer *, int);
  170 };
  171 
  172 struct disk_parms;
  173 struct scsipi_inquiry_pattern;
  174 
  175 /*
  176  * scsipi_adapter:
  177  *
  178  *      This structure describes an instance of a SCSIPI adapter.
  179  *
  180  *      Note that `adapt_openings' is used by (the common case of) adapters
  181  *      which have per-adapter resources.  If an adapter's command resources
  182  *      are associated with a channel, then the `chan_openings' below will
  183  *      be used instead.
  184  *
  185  *      Note that all adapter entry points take a pointer to a channel,
  186  *      as an adapter may have more than one channel, and the channel
  187  *      structure contains the channel number.
  188  */
  189 struct scsipi_adapter {
  190         device_t adapt_dev;     /* pointer to adapter's device */
  191         int     adapt_nchannels;        /* number of adapter channels */
  192         volatile int    adapt_refcnt;           /* adapter's reference count */
  193         int     adapt_openings;         /* total # of command openings */
  194         int     adapt_max_periph;       /* max openings per periph */
  195         int     adapt_flags;
  196 
  197         void    (*adapt_request)(struct scsipi_channel *,
  198                     scsipi_adapter_req_t, void *);
  199         void    (*adapt_minphys)(struct buf *);
  200         int     (*adapt_ioctl)(struct scsipi_channel *, u_long,
  201                     void *, int, struct proc *);
  202         int     (*adapt_enable)(device_t, int);
  203         int     (*adapt_getgeom)(struct scsipi_periph *,
  204                         struct disk_parms *, u_long);
  205         int     (*adapt_accesschk)(struct scsipi_periph *,
  206                         struct scsipi_inquiry_pattern *);
  207 
  208         kmutex_t adapt_mtx;
  209         volatile int    adapt_running;  /* how many users of mutex */
  210 };
  211 
  212 /* adapt_flags */
  213 #define SCSIPI_ADAPT_POLL_ONLY  0x01 /* Adaptor can't do interrupts. */
  214 #define SCSIPI_ADAPT_MPSAFE     0x02 /* Adaptor doesn't need kernel lock */
  215 
  216 void scsipi_adapter_minphys(struct scsipi_channel *, struct buf *);
  217 void scsipi_adapter_request(struct scsipi_channel *,
  218         scsipi_adapter_req_t, void *);
  219 int scsipi_adapter_ioctl(struct scsipi_channel *, u_long,
  220         void *, int, struct proc *);
  221 int scsipi_adapter_enable(struct scsipi_adapter *, int);
  222 #endif
  223 
  224 
  225 /*
  226  * scsipi_bustype:
  227  *
  228  *      This structure describes a SCSIPI bus type.
  229  *      The bustype_type member is shared with struct ata_bustype
  230  *      (because we can ata, atapi or scsi busses to the same controller)
  231  */
  232 struct scsipi_bustype {
  233         int     bustype_type;           /* symbolic name of type */
  234 
  235         void    (*bustype_cmd)(struct scsipi_xfer *);
  236         int     (*bustype_interpret_sense)(struct scsipi_xfer *);
  237         void    (*bustype_printaddr)(struct scsipi_periph *);
  238         void    (*bustype_kill_pending)(struct scsipi_periph *);
  239         void    (*bustype_async_event_xfer_mode)(struct scsipi_channel *,
  240                     void *);
  241 };
  242 
  243 /* bustype_type */
  244 /* type is stored in the first byte */
  245 #define SCSIPI_BUSTYPE_TYPE_SHIFT 0
  246 #define SCSIPI_BUSTYPE_TYPE(x) (((x) >> SCSIPI_BUSTYPE_TYPE_SHIFT) & 0xff)
  247 #define SCSIPI_BUSTYPE_SCSI     0 /* parallel SCSI */
  248 #define SCSIPI_BUSTYPE_ATAPI    1
  249 /* #define SCSIPI_BUSTYPE_ATA   2 */
  250 /* subtype is stored in the second byte */
  251 #define SCSIPI_BUSTYPE_SUBTYPE_SHIFT 8
  252 #define SCSIPI_BUSTYPE_SUBTYPE(x) (((x) >> SCSIPI_BUSTYPE_SUBTYPE_SHIFT) & 0xff)
  253 
  254 #define SCSIPI_BUSTYPE_BUSTYPE(t, s) \
  255     ((t) << SCSIPI_BUSTYPE_TYPE_SHIFT | (s) << SCSIPI_BUSTYPE_SUBTYPE_SHIFT)
  256 /* subtypes are defined in each bus type headers */
  257 
  258 /*
  259  * scsipi_channel:
  260  *
  261  *      This structure describes a single channel of a SCSIPI adapter.
  262  *      An adapter may have one or more channels.  See the comment above
  263  *      regarding the resource counter.
  264  *      Note: chan_bustype has to be first member, as its bustype_type member
  265  *      is shared with the aa_bustype member of struct ata_atapi_attach.
  266  */
  267 
  268 #define SCSIPI_CHAN_PERIPH_BUCKETS      16
  269 #define SCSIPI_CHAN_PERIPH_HASHMASK     (SCSIPI_CHAN_PERIPH_BUCKETS - 1)
  270 
  271 #ifdef _KERNEL
  272 struct scsipi_channel {
  273         const struct scsipi_bustype *chan_bustype; /* channel's bus type */
  274         const char *chan_name;  /* this channel's name */
  275 
  276         struct scsipi_adapter *chan_adapter; /* pointer to our adapter */
  277 
  278         /* Periphs for this channel. */
  279         LIST_HEAD(, scsipi_periph) chan_periphtab[SCSIPI_CHAN_PERIPH_BUCKETS];
  280 
  281         int     chan_channel;           /* channel number */
  282         int     chan_flags;             /* channel flags */
  283         int     chan_openings;          /* number of command openings */
  284         int     chan_max_periph;        /* max openings per periph */
  285 
  286         int     chan_ntargets;          /* number of targets */
  287         int     chan_nluns;             /* number of luns */
  288         int     chan_id;                /* adapter's ID for this channel */
  289 
  290         int     chan_defquirks;         /* default device's quirks */
  291 
  292         struct lwp *chan_dthread;       /* discovery thread */
  293         struct lwp *chan_thread;        /* completion thread */
  294         int     chan_tflags;            /* flags for the completion thread */
  295 
  296         int     chan_qfreeze;           /* freeze count for queue */
  297 
  298         /* Job queue for this channel. */
  299         struct scsipi_xfer_queue chan_queue;
  300 
  301         /* Completed (async) jobs. */
  302         struct scsipi_xfer_queue chan_complete;
  303 
  304         /* callback we may have to call from completion thread */
  305         void (*chan_callback)(struct scsipi_channel *, void *);
  306         void *chan_callback_arg;
  307 
  308         /* callback we may have to call after forking the kthread */
  309         void (*chan_init_cb)(struct scsipi_channel *, void *);
  310         void *chan_init_cb_arg;
  311 
  312         kcondvar_t chan_cv_comp;
  313         kcondvar_t chan_cv_thr;
  314         kcondvar_t chan_cv_xs;
  315 
  316 #define chan_cv_complete(ch) (&(ch)->chan_cv_comp)
  317 #define chan_cv_thread(ch) (&(ch)->chan_cv_thr)
  318 };
  319 
  320 #define chan_running(ch) ((ch)->chan_adapter->adapt_running)
  321 #define chan_mtx(ch) (&(ch)->chan_adapter->adapt_mtx)
  322 #endif
  323 
  324 /* chan_flags */
  325 #define SCSIPI_CHAN_OPENINGS    0x01    /* use chan_openings */
  326 #define SCSIPI_CHAN_CANGROW     0x02    /* channel can grow resources */
  327 #define SCSIPI_CHAN_NOSETTLE    0x04    /* don't wait for devices to settle */
  328 #define SCSIPI_CHAN_TACTIVE     0x08    /* completion thread is active */
  329 
  330 /* chan thread flags (chan_tflags) */
  331 #define SCSIPI_CHANT_SHUTDOWN   0x01    /* channel is shutting down */
  332 #define SCSIPI_CHANT_CALLBACK   0x02    /* has to call chan_callback() */
  333 #define SCSIPI_CHANT_KICK       0x04    /* need to run queues */
  334 #define SCSIPI_CHANT_GROWRES    0x08    /* call ADAPTER_REQ_GROW_RESOURCES */
  335 
  336 #define SCSIPI_CHAN_MAX_PERIPH(chan)                                    \
  337         (((chan)->chan_flags & SCSIPI_CHAN_OPENINGS) ?                  \
  338          (chan)->chan_max_periph : (chan)->chan_adapter->adapt_max_periph)
  339 
  340 
  341 #define scsipi_printaddr(periph)                                        \
  342         (*(periph)->periph_channel->chan_bustype->bustype_printaddr)((periph))
  343 
  344 #define scsipi_periph_bustype(periph)                                   \
  345         (periph)->periph_channel->chan_bustype->bustype_type
  346 
  347 
  348 /*
  349  * Number of tag words in a periph structure:
  350  *
  351  *      n_tag_words = ((256 / NBBY) / sizeof(u_int32_t))
  352  */
  353 #define PERIPH_NTAGWORDS        ((256 / 8) / sizeof(u_int32_t))
  354 
  355 #ifdef _KERNEL
  356 /*
  357  * scsipi_opcodes:
  358  *      This optionally allocated structure documents
  359  *      valid opcodes and timeout values for the respective
  360  *      opcodes overriding the requested timeouts.
  361  *      It is created when SCSI_MAINTENANCE_IN/
  362  *      RSOC_REPORT_SUPPORTED_OPCODES can provide information
  363  *      at attach time.
  364  */
  365 struct scsipi_opcodes 
  366 {
  367         struct scsipi_opinfo
  368         {
  369                 long          ti_timeout;       /* timeout in seconds (> 0 => VALID) */
  370                 unsigned long ti_flags;
  371 #define SCSIPI_TI_VALID  0x0001         /* valid op code */
  372 #define SCSIPI_TI_LOGGED 0x8000         /* override logged during debug */
  373         } opcode_info[0x100];
  374 };
  375 
  376 /*
  377  * scsipi_periph:
  378  *
  379  *      This structure describes the path between a peripheral device
  380  *      and an adapter.  It contains a pointer to the adapter channel
  381  *      which in turn contains a pointer to the adapter.
  382  *
  383  * XXX Given the way NetBSD's autoconfiguration works, this is ...
  384  * XXX nasty.
  385  *
  386  *      Well, it's a lot nicer than it used to be, but there could
  387  *      still be an improvement.
  388  */
  389 struct scsipi_periph {
  390         device_t periph_dev;    /* pointer to peripheral's device */
  391         struct scsipi_channel *periph_channel; /* channel we're connected to */
  392 
  393                                         /* link in channel's table of periphs */
  394         LIST_ENTRY(scsipi_periph) periph_hash;
  395 
  396         const struct scsipi_periphsw *periph_switch; /* peripheral's entry
  397                                                         points */
  398         int     periph_openings;        /* max # of outstanding commands */
  399         int     periph_active;          /* current # of outstanding commands */
  400         int     periph_sent;            /* current # of commands sent to adapt*/
  401 
  402         int     periph_mode;            /* operation modes, CAP bits */
  403         int     periph_period;          /* sync period (factor) */
  404         int     periph_offset;          /* sync offset */
  405 
  406         /*
  407          * Information gleaned from the inquiry data.
  408          */
  409         u_int8_t periph_type;           /* basic device type */
  410         int     periph_cap;             /* capabilities */
  411         int     periph_quirks;          /* device's quirks */
  412 
  413         int     periph_flags;           /* misc. flags */
  414         int     periph_dbflags;         /* debugging flags */
  415 
  416         int     periph_target;          /* target ID (drive # on ATAPI) */
  417         int     periph_lun;             /* LUN (not used on ATAPI) */
  418 
  419         int     periph_version;         /* ANSI SCSI version */
  420 
  421         int     periph_qfreeze;         /* queue freeze count */
  422 
  423         /* available opcodes and timeout information */
  424         struct scsipi_opcodes *periph_opcs;
  425         
  426         /* Bitmap of free command tags. */
  427         u_int32_t periph_freetags[PERIPH_NTAGWORDS];
  428 
  429         /* Pending scsipi_xfers on this peripheral. */
  430         struct scsipi_xfer_queue periph_xferq;
  431 
  432         callout_t periph_callout;
  433 
  434         /* xfer which has a pending CHECK_CONDITION */
  435         struct scsipi_xfer *periph_xscheck;
  436 
  437         kcondvar_t periph_cv;
  438 #define periph_cv_periph(p) (&(p)->periph_cv)
  439 #define periph_cv_active(p) (&(p)->periph_cv)
  440 };
  441 #endif
  442 
  443 /*
  444  * Macro to return the current xfer mode of a periph.
  445  */
  446 #define PERIPH_XFER_MODE(periph)                                        \
  447         (((periph)->periph_flags & PERIPH_MODE_VALID) ?                 \
  448          (periph)->periph_mode : 0)
  449 
  450 /* periph_cap */
  451 #define PERIPH_CAP_ANEC         0x0001  /* async event notification */
  452 #define PERIPH_CAP_TERMIOP      0x0002  /* terminate i/o proc. messages */
  453 #define PERIPH_CAP_RELADR       0x0004  /* relative addressing */
  454 #define PERIPH_CAP_WIDE32       0x0008  /* wide-32 transfers */
  455 #define PERIPH_CAP_WIDE16       0x0010  /* wide-16 transfers */
  456                 /*      XXX     0x0020     reserved for ATAPI_CFG_DRQ_MASK */
  457                 /*      XXX     0x0040     reserved for ATAPI_CFG_DRQ_MASK */
  458 #define PERIPH_CAP_SYNC         0x0080  /* synchronous transfers */
  459 #define PERIPH_CAP_LINKCMDS     0x0100  /* linked commands */
  460 #define PERIPH_CAP_TQING        0x0200  /* tagged queueing */
  461 #define PERIPH_CAP_SFTRESET     0x0400  /* soft RESET condition response */
  462 #define PERIPH_CAP_CMD16        0x0800  /* 16 byte commands (ATAPI) */
  463 #define PERIPH_CAP_DT           0x1000  /* supports DT clock */
  464 #define PERIPH_CAP_QAS          0x2000  /* supports quick arbit. and select. */
  465 #define PERIPH_CAP_IUS          0x4000  /* supports information unit xfers */
  466 
  467 /* periph_flags */
  468 #define PERIPH_REMOVABLE        0x0001  /* media is removable */
  469 #define PERIPH_MEDIA_LOADED     0x0002  /* media is loaded */
  470 #define PERIPH_WAITING          0x0004  /* process waiting for opening */
  471 #define PERIPH_OPEN             0x0008  /* device is open */
  472 #define PERIPH_WAITDRAIN        0x0010  /* waiting for pending xfers to drain */
  473 #define PERIPH_GROW_OPENINGS    0x0020  /* allow openings to grow */
  474 #define PERIPH_MODE_VALID       0x0040  /* periph_mode is valid */
  475 #define PERIPH_RECOVERING       0x0080  /* periph is recovering */
  476 #define PERIPH_RECOVERY_ACTIVE  0x0100  /* a recovery command is active */
  477 #define PERIPH_KEEP_LABEL       0x0200  /* retain label after 'full' close */
  478 #define PERIPH_SENSE            0x0400  /* periph has sense pending */
  479 #define PERIPH_UNTAG            0x0800  /* untagged command running */
  480 
  481 /* periph_quirks */
  482 #define PQUIRK_AUTOSAVE         0x00000001      /* do implicit SAVE POINTERS */
  483 #define PQUIRK_NOSYNC           0x00000002      /* does not grok SDTR */
  484 #define PQUIRK_NOWIDE           0x00000004      /* does not grok WDTR */
  485 #define PQUIRK_NOTAG            0x00000008      /* does not grok tagged cmds */
  486 #define PQUIRK_NOLUNS           0x00000010      /* DTWT with LUNs */
  487 #define PQUIRK_FORCELUNS        0x00000020      /* prehistoric device groks
  488                                                    LUNs */
  489 #define PQUIRK_NOMODESENSE      0x00000040      /* device doesn't do MODE SENSE
  490                                                    properly */
  491 #define PQUIRK_NOSYNCCACHE      0x00000100      /* do not issue SYNC CACHE */
  492 #define PQUIRK_LITTLETOC        0x00000400      /* audio TOC is little-endian */
  493 #define PQUIRK_NOCAPACITY       0x00000800      /* no READ CD CAPACITY */
  494 #define PQUIRK_NOTUR            0x00001000      /* no TEST UNIT READY */
  495 #define PQUIRK_NODOORLOCK       0x00002000      /* can't lock door */
  496 #define PQUIRK_NOSENSE          0x00004000      /* can't REQUEST SENSE */
  497 #define PQUIRK_ONLYBIG          0x00008000      /* only use SCSI_{R,W}_BIG */
  498 #define PQUIRK_NOBIGMODESENSE   0x00040000      /* has no big mode-sense op */
  499 #define PQUIRK_CAP_SYNC         0x00080000      /* SCSI device with ST sync op*/
  500 #define PQUIRK_CAP_WIDE16       0x00100000      /* SCSI device with ST wide op*/
  501 #define PQUIRK_CAP_NODT         0x00200000      /* signals DT, but can't. */
  502 #define PQUIRK_START            0x00400000      /* needs start before tur */
  503 #define PQUIRK_NOFUA            0x00800000      /* does not grok FUA */
  504 #define PQUIRK_NOREPSUPPOPC     0x01000000      /* does not grok
  505                                                    REPORT SUPPORTED OPCODES
  506                                                    to fetch device timeouts */
  507 /*
  508  * Error values an adapter driver may return
  509  */
  510 typedef enum {
  511         XS_NOERROR,             /* there is no error, (sense is invalid)  */
  512         XS_SENSE,               /* Check the returned sense for the error */
  513         XS_SHORTSENSE,          /* Check the ATAPI sense for the error    */
  514         XS_DRIVER_STUFFUP,      /* Driver failed to perform operation     */
  515         XS_RESOURCE_SHORTAGE,   /* adapter resource shortage              */
  516         XS_SELTIMEOUT,          /* The device timed out.. turned off?     */
  517         XS_TIMEOUT,             /* The Timeout reported was caught by SW  */
  518         XS_BUSY,                /* The device busy, try again later?      */
  519         XS_RESET,               /* bus was reset; possible retry command  */
  520         XS_REQUEUE              /* requeue this command */
  521 } scsipi_xfer_result_t;
  522 
  523 #ifdef _KERNEL
  524 /*
  525  * Each scsipi transaction is fully described by one of these structures
  526  * It includes information about the source of the command and also the
  527  * device and adapter for which the command is destined.
  528  *
  529  * Before the HBA is given this transaction, channel_q is the linkage on
  530  * the related channel's chan_queue.
  531  *
  532  * When the this transaction is taken off the channel's chan_queue and
  533  * the HBA's request entry point is called with this transaction, the
  534  * HBA can use the channel_q tag for whatever it likes until it calls
  535  * scsipi_done for this transaction, at which time it has to stop
  536  * using channel_q.
  537  *
  538  * After scsipi_done is called with this transaction and if there was an
  539  * error on it, channel_q then becomes the linkage on the related channel's
  540  * chan_complete cqueue.
  541  *
  542  * The device_q member is maintained by the scsipi middle layer.  When
  543  * a device issues a command, the xfer is placed on that device's
  544  * pending commands queue.  When an xfer is done and freed, it is taken
  545  * off the device's queue.  This allows for a device to wait for all of
  546  * its pending commands to complete.
  547  */
  548 struct scsipi_xfer {
  549         TAILQ_ENTRY(scsipi_xfer) channel_q; /* entry on channel queue */
  550         TAILQ_ENTRY(scsipi_xfer) device_q;  /* device's pending xfers */
  551         callout_t xs_callout;           /* callout for adapter use */
  552         int     xs_control;             /* control flags */
  553         volatile int xs_status;         /* status flags */
  554         struct scsipi_periph *xs_periph;/* peripheral doing the xfer */
  555         int     xs_retries;             /* the number of times to retry */
  556         int     xs_requeuecnt;          /* number of requeues */
  557         int     timeout;                /* in milliseconds */
  558         struct  scsipi_generic *cmd;    /* The scsipi command to execute */
  559         int     cmdlen;                 /* how long it is */
  560         u_char  *data;                  /* DMA address OR a uio address */
  561         int     datalen;                /* data len (blank if uio) */
  562         int     resid;                  /* how much buffer was not touched */
  563         scsipi_xfer_result_t error;     /* an error value */
  564         struct  buf *bp;                /* If we need to associate with */
  565                                         /* a buf */
  566         union {
  567                 struct  scsi_sense_data scsi_sense; /* 32 bytes */
  568                 u_int32_t atapi_sense;
  569         } sense;
  570 
  571         struct scsipi_xfer *xs_sensefor;/* we are requesting sense for this */
  572                                         /* xfer */
  573 
  574         u_int8_t status;                /* SCSI status */
  575 
  576         /*
  577          * Info for tagged command queueing.  This may or may not
  578          * be used by a given adapter driver.  These are the same
  579          * as the bytes in the tag message.
  580          */
  581         u_int8_t xs_tag_type;           /* tag type */
  582         u_int8_t xs_tag_id;             /* tag ID */
  583 
  584         struct  scsipi_generic cmdstore
  585             __aligned(4);               /* stash the command in here */
  586 
  587 #define xs_cv(xs) (&(xs)->xs_periph->periph_channel->chan_cv_xs)
  588 };
  589 #endif
  590 
  591 /*
  592  * scsipi_xfer control flags
  593  *
  594  * To do:
  595  *
  596  *      - figure out what to do with XS_CTL_ESCAPE
  597  *
  598  *      - replace XS_CTL_URGENT with an `xs_priority' field?
  599  */
  600 #define XS_CTL_NOSLEEP          0x00000001      /* don't sleep */
  601 #define XS_CTL_POLL             0x00000002      /* poll for completion */
  602 #define XS_CTL_DISCOVERY        0x00000004      /* doing device discovery */
  603 #define XS_CTL_ASYNC            0x00000008      /* command completes
  604                                                    asynchronously */
  605 #define XS_CTL_USERCMD          0x00000010      /* user issued command */
  606 #define XS_CTL_SILENT           0x00000020      /* don't print sense info */
  607 #define XS_CTL_IGNORE_NOT_READY 0x00000040      /* ignore NOT READY */
  608 #define XS_CTL_IGNORE_MEDIA_CHANGE                                      \
  609                                 0x00000080      /* ignore media change */
  610 #define XS_CTL_IGNORE_ILLEGAL_REQUEST                                   \
  611                                 0x00000100      /* ignore ILLEGAL REQUEST */
  612 #define XS_CTL_SILENT_NODEV     0x00000200      /* don't print sense info
  613                                                    if sense info is nodev */
  614 #define XS_CTL_RESET            0x00000400      /* reset the device */
  615 #define XS_CTL_DATA_UIO         0x00000800      /* xs_data points to uio */
  616 #define XS_CTL_DATA_IN          0x00001000      /* data coming into memory */
  617 #define XS_CTL_DATA_OUT         0x00002000      /* data going out of memory */
  618 #define XS_CTL_TARGET           0x00004000      /* target mode operation */
  619 #define XS_CTL_ESCAPE           0x00008000      /* escape operation */
  620 #define XS_CTL_URGENT           0x00010000      /* urgent (recovery)
  621                                                    operation */
  622 #define XS_CTL_SIMPLE_TAG       0x00020000      /* use a Simple Tag */
  623 #define XS_CTL_ORDERED_TAG      0x00040000      /* use an Ordered Tag */
  624 #define XS_CTL_HEAD_TAG         0x00080000      /* use a Head of Queue Tag */
  625 #define XS_CTL_THAW_PERIPH      0x00100000      /* thaw periph once enqueued */
  626 #define XS_CTL_FREEZE_PERIPH    0x00200000      /* freeze periph when done */
  627 #define XS_CTL_REQSENSE         0x00800000      /* xfer is a request sense */
  628 
  629 #define XS_CTL_TAGMASK  (XS_CTL_SIMPLE_TAG|XS_CTL_ORDERED_TAG|XS_CTL_HEAD_TAG)
  630 
  631 #define XS_CTL_TAGTYPE(xs)      ((xs)->xs_control & XS_CTL_TAGMASK)
  632 
  633 /*
  634  * scsipi_xfer status flags
  635  */
  636 #define XS_STS_DONE             0x00000001      /* scsipi_xfer is done */
  637 #define XS_STS_PRIVATE          0xf0000000      /* reserved for HBA's use */
  638 
  639 /*
  640  * This describes matching information for scsipi_inqmatch().  The more things
  641  * match, the higher the configuration priority.
  642  */
  643 struct scsipi_inquiry_pattern {
  644         u_int8_t type;
  645         boolean removable;
  646         const char *vendor;
  647         const char *product;
  648         const char *revision;
  649 };
  650 
  651 /*
  652  * This is used to pass information from the high-level configuration code
  653  * to the device-specific drivers.
  654  */
  655 struct scsipibus_attach_args {
  656         struct scsipi_periph *sa_periph;
  657         struct scsipi_inquiry_pattern sa_inqbuf;
  658         struct scsipi_inquiry_data *sa_inqptr;
  659         union {                         /* bus-type specific infos */
  660                 u_int8_t scsi_version;  /* SCSI version */
  661         } scsipi_info;
  662 };
  663 
  664 /*
  665  * this describes a quirk entry
  666  */
  667 struct scsi_quirk_inquiry_pattern {
  668         struct scsipi_inquiry_pattern pattern;
  669         int quirks;
  670 };
  671 
  672 /*
  673  * Default number of retries, used for generic routines.
  674  */
  675 #define SCSIPIRETRIES 4
  676 
  677 
  678 #ifdef _KERNEL
  679 void    scsipi_init(void);
  680 void    scsipi_ioctl_init(void);
  681 void    scsipi_load_verbose(void);
  682 int     scsipi_command(struct scsipi_periph *, struct scsipi_generic *, int,
  683             u_char *, int, int, int, struct buf *, int);
  684 void    scsipi_create_completion_thread(void *);
  685 const void *scsipi_inqmatch(struct scsipi_inquiry_pattern *, const void *,
  686             size_t, size_t, int *);
  687 const char *scsipi_dtype(int);
  688 int     scsipi_execute_xs(struct scsipi_xfer *);
  689 int     scsipi_test_unit_ready(struct scsipi_periph *, int);
  690 int     scsipi_prevent(struct scsipi_periph *, int, int);
  691 int     scsipi_inquire(struct scsipi_periph *,
  692             struct scsipi_inquiry_data *, int);
  693 int     scsipi_mode_select(struct scsipi_periph *, int,
  694             struct scsi_mode_parameter_header_6 *, int, int, int, int);
  695 int     scsipi_mode_select_big(struct scsipi_periph *, int,
  696             struct scsi_mode_parameter_header_10 *, int, int, int, int);
  697 int     scsipi_mode_sense(struct scsipi_periph *, int, int,
  698             struct scsi_mode_parameter_header_6 *, int, int, int, int);
  699 int     scsipi_mode_sense_big(struct scsipi_periph *, int, int,
  700             struct scsi_mode_parameter_header_10 *, int, int, int, int);
  701 int     scsipi_start(struct scsipi_periph *, int, int);
  702 void    scsipi_done(struct scsipi_xfer *);
  703 void    scsipi_user_done(struct scsipi_xfer *);
  704 int     scsipi_interpret_sense(struct scsipi_xfer *);
  705 void    scsipi_wait_drain(struct scsipi_periph *);
  706 void    scsipi_kill_pending(struct scsipi_periph *);
  707 void    scsipi_get_opcodeinfo(struct scsipi_periph *periph);
  708 void    scsipi_free_opcodeinfo(struct scsipi_periph *periph);
  709 struct scsipi_periph *scsipi_alloc_periph(int);
  710 void    scsipi_free_periph(struct scsipi_periph *);
  711 
  712 /* Function pointers for scsiverbose module */
  713 extern int      (*scsipi_print_sense)(struct scsipi_xfer *, int);
  714 extern void     (*scsipi_print_sense_data)(struct scsi_sense_data *, int);
  715 
  716 int     scsipi_print_sense_stub(struct scsipi_xfer *, int);
  717 void    scsipi_print_sense_data_stub(struct scsi_sense_data *, int);
  718 
  719 extern int      scsi_verbose_loaded;
  720 
  721 void    scsipi_print_cdb(struct scsipi_generic *cmd);
  722 int     scsipi_thread_call_callback(struct scsipi_channel *,
  723             void (*callback)(struct scsipi_channel *, void *),
  724             void *);
  725 void    scsipi_async_event(struct scsipi_channel *,
  726             scsipi_async_event_t, void *);
  727 int     scsipi_do_ioctl(struct scsipi_periph *, dev_t, u_long, void *,
  728             int, struct lwp *);
  729 
  730 void    scsipi_set_xfer_mode(struct scsipi_channel *, int, int);
  731 
  732 int     scsipi_channel_init(struct scsipi_channel *);
  733 void    scsipi_channel_shutdown(struct scsipi_channel *);
  734 
  735 void    scsipi_insert_periph(struct scsipi_channel *,
  736             struct scsipi_periph *);
  737 void    scsipi_remove_periph(struct scsipi_channel *,
  738             struct scsipi_periph *);
  739 struct scsipi_periph *scsipi_lookup_periph(struct scsipi_channel *,
  740             int, int);
  741 struct scsipi_periph *scsipi_lookup_periph_locked(struct scsipi_channel *,
  742             int, int);
  743 int     scsipi_target_detach(struct scsipi_channel *, int, int, int);
  744 
  745 int     scsipi_adapter_addref(struct scsipi_adapter *);
  746 void    scsipi_adapter_delref(struct scsipi_adapter *);
  747 
  748 void    scsipi_channel_freeze(struct scsipi_channel *, int);
  749 void    scsipi_channel_thaw(struct scsipi_channel *, int);
  750 void    scsipi_channel_timed_thaw(void *);
  751 
  752 void    scsipi_periph_freeze(struct scsipi_periph *, int);
  753 void    scsipi_periph_thaw(struct scsipi_periph *, int);
  754 void    scsipi_periph_timed_thaw(void *);
  755 
  756 void    scsipi_periph_freeze_locked(struct scsipi_periph *, int);
  757 void    scsipi_periph_thaw_locked(struct scsipi_periph *, int);
  758 
  759 int     scsipi_sync_period_to_factor(int);
  760 int     scsipi_sync_factor_to_period(int);
  761 int     scsipi_sync_factor_to_freq(int);
  762 
  763 void    show_scsipi_xs(struct scsipi_xfer *);
  764 void    show_scsipi_cmd(struct scsipi_xfer *);
  765 void    show_mem(u_char *, int);
  766 #endif /* _KERNEL */
  767 
  768 static __inline void
  769 _lto2b(u_int32_t val, u_int8_t *bytes)
  770 {
  771 
  772         bytes[0] = (val >> 8) & 0xff;
  773         bytes[1] = val & 0xff;
  774 }
  775 
  776 static __inline void
  777 _lto3b(u_int32_t val, u_int8_t *bytes)
  778 {
  779 
  780         bytes[0] = (val >> 16) & 0xff;
  781         bytes[1] = (val >> 8) & 0xff;
  782         bytes[2] = val & 0xff;
  783 }
  784 
  785 static __inline void
  786 _lto4b(u_int32_t val, u_int8_t *bytes)
  787 {
  788 
  789         bytes[0] = (val >> 24) & 0xff;
  790         bytes[1] = (val >> 16) & 0xff;
  791         bytes[2] = (val >> 8) & 0xff;
  792         bytes[3] = val & 0xff;
  793 }
  794 
  795 static __inline void
  796 _lto8b(u_int64_t val, u_int8_t *bytes)
  797 {
  798 
  799         bytes[0] = (val >> 56) & 0xff;
  800         bytes[1] = (val >> 48) & 0xff;
  801         bytes[2] = (val >> 40) & 0xff;
  802         bytes[3] = (val >> 32) & 0xff;
  803         bytes[4] = (val >> 24) & 0xff;
  804         bytes[5] = (val >> 16) & 0xff;
  805         bytes[6] = (val >> 8)  & 0xff;
  806         bytes[7] = val         & 0xff;
  807 }
  808 
  809 static __inline u_int32_t
  810 _2btol(const u_int8_t *bytes)
  811 {
  812         u_int32_t rv;
  813 
  814         rv = (bytes[0] << 8) |
  815              bytes[1];
  816         return (rv);
  817 }
  818 
  819 static __inline u_int32_t
  820 _3btol(const u_int8_t *bytes)
  821 {
  822         u_int32_t rv;
  823 
  824         rv = (bytes[0] << 16) |
  825              (bytes[1] << 8) |
  826              bytes[2];
  827         return (rv);
  828 }
  829 
  830 static __inline u_int32_t
  831 _4btol(const u_int8_t *bytes)
  832 {
  833         u_int32_t rv;
  834 
  835         rv = ((u_int32_t)bytes[0] << 24) |
  836              ((u_int32_t)bytes[1] << 16) |
  837              ((u_int32_t)bytes[2] << 8) |
  838              (u_int32_t)bytes[3];
  839         return (rv);
  840 }
  841 
  842 static __inline u_int64_t
  843 _5btol(const u_int8_t *bytes)
  844 {
  845         u_int64_t rv;
  846 
  847         rv = ((u_int64_t)bytes[0] << 32) |
  848              ((u_int64_t)bytes[1] << 24) |
  849              ((u_int64_t)bytes[2] << 16) |
  850              ((u_int64_t)bytes[3] << 8) |
  851              (u_int64_t)bytes[4];
  852         return (rv);
  853 }
  854 
  855 static __inline u_int64_t
  856 _8btol(const u_int8_t *bytes)
  857 {
  858         u_int64_t rv;
  859 
  860         rv = ((u_int64_t)bytes[0] << 56) |
  861              ((u_int64_t)bytes[1] << 48) |
  862              ((u_int64_t)bytes[2] << 40) |
  863              ((u_int64_t)bytes[3] << 32) |
  864              ((u_int64_t)bytes[4] << 24) |
  865              ((u_int64_t)bytes[5] << 16) |
  866              ((u_int64_t)bytes[6] << 8) |
  867              (u_int64_t)bytes[7];
  868         return (rv);
  869 }
  870 
  871 static __inline void
  872 _lto2l(u_int32_t val, u_int8_t *bytes)
  873 {
  874 
  875         bytes[0] = val & 0xff;
  876         bytes[1] = (val >> 8) & 0xff;
  877 }
  878 
  879 static __inline void
  880 _lto3l(u_int32_t val, u_int8_t *bytes)
  881 {
  882 
  883         bytes[0] = val & 0xff;
  884         bytes[1] = (val >> 8) & 0xff;
  885         bytes[2] = (val >> 16) & 0xff;
  886 }
  887 
  888 static __inline void
  889 _lto4l(u_int32_t val, u_int8_t *bytes)
  890 {
  891 
  892         bytes[0] = val & 0xff;
  893         bytes[1] = (val >> 8) & 0xff;
  894         bytes[2] = (val >> 16) & 0xff;
  895         bytes[3] = (val >> 24) & 0xff;
  896 }
  897 
  898 static __inline u_int32_t
  899 _2ltol(const u_int8_t *bytes)
  900 {
  901         u_int32_t rv;
  902 
  903         rv = bytes[0] |
  904              (bytes[1] << 8);
  905         return (rv);
  906 }
  907 
  908 static __inline u_int32_t
  909 _3ltol(const u_int8_t *bytes)
  910 {
  911         u_int32_t rv;
  912 
  913         rv = bytes[0] |
  914              (bytes[1] << 8) |
  915              (bytes[2] << 16);
  916         return (rv);
  917 }
  918 
  919 static __inline u_int32_t
  920 _4ltol(const u_int8_t *bytes)
  921 {
  922         u_int32_t rv;
  923 
  924         rv = (u_int32_t)bytes[0] |
  925              ((u_int32_t)bytes[1] << 8) |
  926              ((u_int32_t)bytes[2] << 16) |
  927              ((u_int32_t)bytes[3] << 24);
  928         return (rv);
  929 }
  930 
  931 #endif /* _DEV_SCSIPI_SCSIPICONF_H_ */

Cache object: acb5ed91d66a4415a782ed7e1ba6e697


[ 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.