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/aac/aacvar.h

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

    1 /*-
    2  * Copyright (c) 2000 Michael Smith
    3  * Copyright (c) 2001 Scott Long
    4  * Copyright (c) 2000 BSDi
    5  * Copyright (c) 2001 Adaptec, Inc.
    6  * All rights reserved.
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions
   10  * are met:
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice, this list of conditions and the following disclaimer.
   13  * 2. Redistributions in binary form must reproduce the above copyright
   14  *    notice, this list of conditions and the following disclaimer in the
   15  *    documentation and/or other materials provided with the distribution.
   16  *
   17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   27  * SUCH DAMAGE.
   28  *
   29  *      $FreeBSD$
   30  */
   31 
   32 #include <sys/bio.h>
   33 #include <sys/lock.h>
   34 #include <sys/mutex.h>
   35 #include <sys/taskqueue.h>
   36 #include <sys/selinfo.h>
   37 #include <geom/geom_disk.h>
   38 
   39 
   40 /*
   41  * Driver Parameter Definitions
   42  */
   43 
   44 /*
   45  * The firmware interface allows for a 16-bit s/g list length.  We limit 
   46  * ourselves to a reasonable maximum and ensure alignment.
   47  */
   48 #define AAC_MAXSGENTRIES        64      /* max S/G entries, limit 65535 */              
   49 
   50 /*
   51  * We allocate a small set of FIBs for the adapter to use to send us messages.
   52  */
   53 #define AAC_ADAPTER_FIBS        8
   54 
   55 /*
   56  * FIBs are allocated in page-size chunks and can grow up to the 512
   57  * limit imposed by the hardware.
   58  */
   59 #define AAC_FIB_COUNT           (PAGE_SIZE/sizeof(struct aac_fib))
   60 #define AAC_PREALLOCATE_FIBS    128
   61 #define AAC_MAX_FIBS            504
   62 
   63 /*
   64  * The controller reports status events in AIFs.  We hang on to a number of
   65  * these in order to pass them out to user-space management tools.
   66  */
   67 #define AAC_AIFQ_LENGTH         64
   68 
   69 /*
   70  * Firmware messages are passed in the printf buffer.
   71  */
   72 #define AAC_PRINTF_BUFSIZE      256
   73 
   74 /*
   75  * We wait this many seconds for the adapter to come ready if it is still 
   76  * booting
   77  */
   78 #define AAC_BOOT_TIMEOUT        (3 * 60)
   79 
   80 /*
   81  * Timeout for immediate commands.
   82  */
   83 #define AAC_IMMEDIATE_TIMEOUT   30              /* seconds */
   84 
   85 /*
   86  * Timeout for normal commands
   87  */
   88 #define AAC_CMD_TIMEOUT         30              /* seconds */
   89 
   90 /*
   91  * Rate at which we periodically check for timed out commands and kick the
   92  * controller.
   93  */
   94 #define AAC_PERIODIC_INTERVAL   20              /* seconds */
   95 
   96 /*
   97  * Per-container data structure
   98  */
   99 struct aac_container
  100 {
  101         struct aac_mntobj               co_mntobj;
  102         device_t                        co_disk;
  103         int                             co_found;
  104         TAILQ_ENTRY(aac_container)      co_link;
  105 };
  106 
  107 /*
  108  * Per-SIM data structure
  109  */
  110 struct aac_sim
  111 {
  112         device_t                sim_dev;
  113         int                     TargetsPerBus;
  114         int                     BusNumber;
  115         int                     InitiatorBusId;
  116         struct aac_softc        *aac_sc;
  117         TAILQ_ENTRY(aac_sim)    sim_link;
  118 };
  119 
  120 /*
  121  * Per-disk structure
  122  */
  123 struct aac_disk 
  124 {
  125         device_t                        ad_dev;
  126         struct aac_softc                *ad_controller;
  127         struct aac_container            *ad_container;
  128         struct disk                     *ad_disk;
  129         int                             ad_flags;
  130 #define AAC_DISK_OPEN   (1<<0)
  131         int                             ad_cylinders;
  132         int                             ad_heads;
  133         int                             ad_sectors;
  134         u_int32_t                       ad_size;
  135         int                             unit;
  136 };
  137 
  138 /*
  139  * Per-command control structure.
  140  */
  141 struct aac_command
  142 {
  143         TAILQ_ENTRY(aac_command) cm_link;       /* list linkage */
  144 
  145         struct aac_softc        *cm_sc;         /* controller that owns us */
  146 
  147         struct aac_fib          *cm_fib;        /* FIB associated with this
  148                                                  * command */
  149         u_int32_t               cm_fibphys;     /* bus address of the FIB */
  150         struct bio              *cm_data;       /* pointer to data in kernel
  151                                                  * space */
  152         u_int32_t               cm_datalen;     /* data length */
  153         bus_dmamap_t            cm_datamap;     /* DMA map for bio data */
  154         struct aac_sg_table     *cm_sgtable;    /* pointer to s/g table in
  155                                                  * command */
  156         int                     cm_flags;
  157 #define AAC_CMD_MAPPED          (1<<0)          /* command has had its data
  158                                                  * mapped */
  159 #define AAC_CMD_DATAIN          (1<<1)          /* command involves data moving
  160                                                  * from controller to host */
  161 #define AAC_CMD_DATAOUT         (1<<2)          /* command involves data moving
  162                                                  * from host to controller */
  163 #define AAC_CMD_COMPLETED       (1<<3)          /* command has been completed */
  164 #define AAC_CMD_TIMEDOUT        (1<<4)          /* command taken too long */
  165 #define AAC_ON_AACQ_FREE        (1<<5)
  166 #define AAC_ON_AACQ_READY       (1<<6)
  167 #define AAC_ON_AACQ_BUSY        (1<<7)
  168 #define AAC_ON_AACQ_MASK        ((1<<5)|(1<<6)|(1<<7))
  169 #define AAC_QUEUE_FRZN          (1<<9)          /* Freeze the processing of
  170                                                  * commands on the queue. */
  171 
  172         void                    (* cm_complete)(struct aac_command *cm);
  173         void                    *cm_private;
  174         time_t                  cm_timestamp;   /* command creation time */
  175         int                     cm_queue;
  176         int                     cm_index;
  177 };
  178 
  179 struct aac_fibmap {
  180         TAILQ_ENTRY(aac_fibmap) fm_link;        /* list linkage */
  181         struct aac_fib          *aac_fibs;
  182         bus_dmamap_t            aac_fibmap;
  183         struct aac_command      *aac_commands;
  184 };
  185 
  186 /*
  187  * We gather a number of adapter-visible items into a single structure.
  188  *
  189  * The ordering of this strucure may be important; we copy the Linux driver:
  190  *
  191  * Adapter FIBs
  192  * Init struct
  193  * Queue headers (Comm Area)
  194  * Printf buffer
  195  *
  196  * In addition, we add:
  197  * Sync Fib
  198  */
  199 struct aac_common {
  200         /* fibs for the controller to send us messages */
  201         struct aac_fib          ac_fibs[AAC_ADAPTER_FIBS];
  202 
  203         /* the init structure */
  204         struct aac_adapter_init ac_init;
  205 
  206         /* arena within which the queue structures are kept */
  207         u_int8_t                ac_qbuf[sizeof(struct aac_queue_table) +
  208                                 AAC_QUEUE_ALIGN];
  209 
  210         /* buffer for text messages from the controller */
  211         char                    ac_printf[AAC_PRINTF_BUFSIZE];
  212         
  213         /* fib for synchronous commands */
  214         struct aac_fib          ac_sync_fib;
  215 };
  216 
  217 /*
  218  * Interface operations
  219  */
  220 struct aac_interface 
  221 {
  222         int     (*aif_get_fwstatus)(struct aac_softc *sc);
  223         void    (*aif_qnotify)(struct aac_softc *sc, int qbit);
  224         int     (*aif_get_istatus)(struct aac_softc *sc);
  225         void    (*aif_clr_istatus)(struct aac_softc *sc, int mask);
  226         void    (*aif_set_mailbox)(struct aac_softc *sc, u_int32_t command,
  227                                    u_int32_t arg0, u_int32_t arg1,
  228                                    u_int32_t arg2, u_int32_t arg3);
  229         int     (*aif_get_mailbox)(struct aac_softc *sc, int mb);
  230         void    (*aif_set_interrupts)(struct aac_softc *sc, int enable);
  231 };
  232 extern struct aac_interface     aac_rx_interface;
  233 extern struct aac_interface     aac_sa_interface;
  234 extern struct aac_interface     aac_fa_interface;
  235 extern struct aac_interface     aac_rkt_interface;
  236 
  237 #define AAC_GET_FWSTATUS(sc)            ((sc)->aac_if.aif_get_fwstatus((sc)))
  238 #define AAC_QNOTIFY(sc, qbit)           ((sc)->aac_if.aif_qnotify((sc), (qbit)))
  239 #define AAC_GET_ISTATUS(sc)             ((sc)->aac_if.aif_get_istatus((sc)))
  240 #define AAC_CLEAR_ISTATUS(sc, mask)     ((sc)->aac_if.aif_clr_istatus((sc), \
  241                                         (mask)))
  242 #define AAC_SET_MAILBOX(sc, command, arg0, arg1, arg2, arg3) \
  243         ((sc)->aac_if.aif_set_mailbox((sc), (command), (arg0), (arg1), (arg2), \
  244         (arg3)))
  245 #define AAC_GET_MAILBOX(sc, mb)         ((sc)->aac_if.aif_get_mailbox((sc), \
  246                                         (mb)))
  247 #define AAC_MASK_INTERRUPTS(sc)         ((sc)->aac_if.aif_set_interrupts((sc), \
  248                                         0))
  249 #define AAC_UNMASK_INTERRUPTS(sc)       ((sc)->aac_if.aif_set_interrupts((sc), \
  250                                         1))
  251 
  252 #define AAC_SETREG4(sc, reg, val)       bus_space_write_4(sc->aac_btag, \
  253                                         sc->aac_bhandle, reg, val)
  254 #define AAC_GETREG4(sc, reg)            bus_space_read_4 (sc->aac_btag, \
  255                                         sc->aac_bhandle, reg)
  256 #define AAC_SETREG2(sc, reg, val)       bus_space_write_2(sc->aac_btag, \
  257                                         sc->aac_bhandle, reg, val)
  258 #define AAC_GETREG2(sc, reg)            bus_space_read_2 (sc->aac_btag, \
  259                                         sc->aac_bhandle, reg)
  260 #define AAC_SETREG1(sc, reg, val)       bus_space_write_1(sc->aac_btag, \
  261                                         sc->aac_bhandle, reg, val)
  262 #define AAC_GETREG1(sc, reg)            bus_space_read_1 (sc->aac_btag, \
  263                                         sc->aac_bhandle, reg)
  264 
  265 /*
  266  * Per-controller structure.
  267  */
  268 struct aac_softc 
  269 {
  270         /* bus connections */
  271         device_t                aac_dev;
  272         struct resource         *aac_regs_resource;     /* register interface
  273                                                          * window */
  274         int                     aac_regs_rid;           /* resource ID */
  275         bus_space_handle_t      aac_bhandle;            /* bus space handle */
  276         bus_space_tag_t         aac_btag;               /* bus space tag */
  277         bus_dma_tag_t           aac_parent_dmat;        /* parent DMA tag */
  278         bus_dma_tag_t           aac_buffer_dmat;        /* data buffer/command
  279                                                          * DMA tag */
  280         struct resource         *aac_irq;               /* interrupt */
  281         int                     aac_irq_rid;
  282         void                    *aac_intr;              /* interrupt handle */
  283         eventhandler_tag        eh;
  284 
  285         /* controller features, limits and status */
  286         int                     aac_state;
  287 #define AAC_STATE_SUSPEND       (1<<0)
  288 #define AAC_STATE_OPEN          (1<<1)
  289 #define AAC_STATE_INTERRUPTS_ON (1<<2)
  290 #define AAC_STATE_AIF_SLEEPER   (1<<3)
  291         struct FsaRevision              aac_revision;
  292 
  293         /* controller hardware interface */
  294         int                     aac_hwif;
  295 #define AAC_HWIF_I960RX         0
  296 #define AAC_HWIF_STRONGARM      1
  297 #define AAC_HWIF_FALCON         2
  298 #define AAC_HWIF_RKT            3
  299 #define AAC_HWIF_UNKNOWN        -1
  300         bus_dma_tag_t           aac_common_dmat;        /* common structure
  301                                                          * DMA tag */
  302         bus_dmamap_t            aac_common_dmamap;      /* common structure
  303                                                          * DMA map */
  304         struct aac_common       *aac_common;
  305         u_int32_t               aac_common_busaddr;
  306         struct aac_interface    aac_if;
  307 
  308         /* command/fib resources */
  309         bus_dma_tag_t           aac_fib_dmat;   /* DMA tag for allocing FIBs */
  310         TAILQ_HEAD(,aac_fibmap) aac_fibmap_tqh;
  311         u_int                   total_fibs;
  312         struct aac_command      *aac_commands;
  313 
  314         /* command management */
  315         TAILQ_HEAD(,aac_command) aac_free;      /* command structures 
  316                                                  * available for reuse */
  317         TAILQ_HEAD(,aac_command) aac_ready;     /* commands on hold for
  318                                                  * controller resources */
  319         TAILQ_HEAD(,aac_command) aac_busy;
  320         struct bio_queue_head   aac_bioq;
  321         struct aac_queue_table  *aac_queues;
  322         struct aac_queue_entry  *aac_qentries[AAC_QUEUE_COUNT];
  323 
  324         struct aac_qstat        aac_qstat[AACQ_COUNT];  /* queue statistics */
  325 
  326         /* connected containters */
  327         TAILQ_HEAD(,aac_container)      aac_container_tqh;
  328         struct mtx              aac_container_lock;
  329 
  330         /*
  331          * The general I/O lock.  This protects the sync fib, the lists, the
  332          * queues, and the registers.
  333          */
  334         struct mtx              aac_io_lock;
  335 
  336         /* delayed activity infrastructure */
  337         struct task             aac_task_complete;      /* deferred-completion
  338                                                          * task */
  339         struct intr_config_hook aac_ich;
  340 
  341         /* management interface */
  342         struct cdev *aac_dev_t;
  343         struct mtx              aac_aifq_lock;
  344         struct aac_aif_command  aac_aifq[AAC_AIFQ_LENGTH];
  345         int                     aac_aifq_head;
  346         int                     aac_aifq_tail;
  347         struct selinfo          rcv_select;
  348         struct proc             *aifthread;
  349         int                     aifflags;
  350 #define AAC_AIFFLAGS_RUNNING    (1 << 0)
  351 #define AAC_AIFFLAGS_AIF        (1 << 1)
  352 #define AAC_AIFFLAGS_EXIT       (1 << 2)
  353 #define AAC_AIFFLAGS_EXITED     (1 << 3)
  354 #define AAC_AIFFLAGS_PRINTF     (1 << 4)
  355 #define AAC_AIFFLAGS_ALLOCFIBS  (1 << 5)
  356 #define AAC_AIFFLAGS_PENDING    (AAC_AIFFLAGS_AIF | AAC_AIFFLAGS_PRINTF | \
  357                                  AAC_AIFFLAGS_ALLOCFIBS)
  358         u_int32_t               flags;
  359 #define AAC_FLAGS_PERC2QC       (1 << 0)
  360 #define AAC_FLAGS_ENABLE_CAM    (1 << 1)        /* No SCSI passthrough */
  361 #define AAC_FLAGS_CAM_NORESET   (1 << 2)        /* Fake SCSI resets */
  362 #define AAC_FLAGS_CAM_PASSONLY  (1 << 3)        /* Only create pass devices */
  363 #define AAC_FLAGS_SG_64BIT      (1 << 4)        /* Use 64-bit S/G addresses */
  364 #define AAC_FLAGS_4GB_WINDOW    (1 << 5)        /* Device can access host mem
  365                                                  * 2GB-4GB range */
  366 #define AAC_FLAGS_NO4GB         (1 << 6)        /* Can't access host mem >2GB */
  367 #define AAC_FLAGS_256FIBS       (1 << 7)        /* Can only do 256 commands */
  368 #define AAC_FLAGS_BROKEN_MEMMAP (1 << 8)        /* Broken HostPhysMemPages */
  369 
  370         u_int32_t               supported_options;
  371         int                     aac_max_fibs;
  372         u_int32_t               scsi_method_id;
  373         TAILQ_HEAD(,aac_sim)    aac_sim_tqh;
  374 };
  375 
  376 
  377 /*
  378  * Public functions
  379  */
  380 extern void             aac_free(struct aac_softc *sc);
  381 extern int              aac_attach(struct aac_softc *sc);
  382 extern int              aac_detach(device_t dev);
  383 extern int              aac_shutdown(device_t dev);
  384 extern int              aac_suspend(device_t dev); 
  385 extern int              aac_resume(device_t dev);
  386 extern void             aac_intr(void *arg);
  387 extern void             aac_submit_bio(struct bio *bp);
  388 extern void             aac_biodone(struct bio *bp);
  389 extern void             aac_startio(struct aac_softc *sc);
  390 extern int              aac_alloc_command(struct aac_softc *sc,
  391                                           struct aac_command **cmp);
  392 extern void             aac_release_command(struct aac_command *cm);
  393 extern int              aac_sync_fib(struct aac_softc *sc, u_int32_t command,
  394                                      u_int32_t xferstate, struct aac_fib *fib,
  395                                      u_int16_t datasize);
  396 
  397 /*
  398  * Debugging levels:
  399  *  0 - quiet, only emit warnings
  400  *  1 - noisy, emit major function points and things done
  401  *  2 - extremely noisy, emit trace items in loops, etc.
  402  */
  403 #ifdef AAC_DEBUG
  404 # define debug(level, fmt, args...)                                     \
  405         do {                                                            \
  406         if (level <=AAC_DEBUG) printf("%s: " fmt "\n", __func__ , ##args); \
  407         } while (0)
  408 # define debug_called(level)                                            \
  409         do {                                                            \
  410         if (level <= AAC_DEBUG) printf("%s: called\n", __func__);       \
  411         } while (0)
  412 
  413 extern void     aac_print_queues(struct aac_softc *sc);
  414 extern void     aac_panic(struct aac_softc *sc, char *reason);
  415 extern void     aac_print_fib(struct aac_softc *sc, struct aac_fib *fib,
  416                               const char *caller);
  417 extern void     aac_print_aif(struct aac_softc *sc,
  418                               struct aac_aif_command *aif);
  419 
  420 #define AAC_PRINT_FIB(sc, fib)  aac_print_fib(sc, fib, __func__)
  421 
  422 #else
  423 # define debug(level, fmt, args...)
  424 # define debug_called(level)
  425 
  426 # define aac_print_queues(sc)
  427 # define aac_panic(sc, reason)
  428 
  429 # define AAC_PRINT_FIB(sc, fib)
  430 # define aac_print_aif(sc, aac_aif_command)
  431 #endif
  432 
  433 struct aac_code_lookup {
  434         char    *string;
  435         u_int32_t       code;
  436 };
  437 
  438 /*
  439  * Queue primitives for driver queues.
  440  */
  441 #define AACQ_ADD(sc, qname)                                     \
  442         do {                                                    \
  443                 struct aac_qstat *qs;                           \
  444                                                                 \
  445                 qs = &(sc)->aac_qstat[qname];                   \
  446                                                                 \
  447                 qs->q_length++;                                 \
  448                 if (qs->q_length > qs->q_max)                   \
  449                         qs->q_max = qs->q_length;               \
  450         } while (0)
  451 
  452 #define AACQ_REMOVE(sc, qname)    (sc)->aac_qstat[qname].q_length--
  453 #define AACQ_INIT(sc, qname)                            \
  454         do {                                            \
  455                 sc->aac_qstat[qname].q_length = 0;      \
  456                 sc->aac_qstat[qname].q_max = 0;         \
  457         } while (0)
  458 
  459 
  460 #define AACQ_COMMAND_QUEUE(name, index)                                 \
  461 static __inline void                                                    \
  462 aac_initq_ ## name (struct aac_softc *sc)                               \
  463 {                                                                       \
  464         TAILQ_INIT(&sc->aac_ ## name);                                  \
  465         AACQ_INIT(sc, index);                                           \
  466 }                                                                       \
  467 static __inline void                                                    \
  468 aac_enqueue_ ## name (struct aac_command *cm)                           \
  469 {                                                                       \
  470         if ((cm->cm_flags & AAC_ON_AACQ_MASK) != 0) {                   \
  471                 printf("command %p is on another queue, flags = %#x\n", \
  472                        cm, cm->cm_flags);                               \
  473                 panic("command is on another queue");                   \
  474         }                                                               \
  475         TAILQ_INSERT_TAIL(&cm->cm_sc->aac_ ## name, cm, cm_link);       \
  476         cm->cm_flags |= AAC_ON_ ## index;                               \
  477         AACQ_ADD(cm->cm_sc, index);                                     \
  478 }                                                                       \
  479 static __inline void                                                    \
  480 aac_requeue_ ## name (struct aac_command *cm)                           \
  481 {                                                                       \
  482         if ((cm->cm_flags & AAC_ON_AACQ_MASK) != 0) {                   \
  483                 printf("command %p is on another queue, flags = %#x\n", \
  484                        cm, cm->cm_flags);                               \
  485                 panic("command is on another queue");                   \
  486         }                                                               \
  487         TAILQ_INSERT_HEAD(&cm->cm_sc->aac_ ## name, cm, cm_link);       \
  488         cm->cm_flags |= AAC_ON_ ## index;                               \
  489         AACQ_ADD(cm->cm_sc, index);                                     \
  490 }                                                                       \
  491 static __inline struct aac_command *                                    \
  492 aac_dequeue_ ## name (struct aac_softc *sc)                             \
  493 {                                                                       \
  494         struct aac_command *cm;                                         \
  495                                                                         \
  496         if ((cm = TAILQ_FIRST(&sc->aac_ ## name)) != NULL) {            \
  497                 if ((cm->cm_flags & AAC_ON_ ## index) == 0) {           \
  498                         printf("command %p not in queue, flags = %#x, " \
  499                                "bit = %#x\n", cm, cm->cm_flags,         \
  500                                AAC_ON_ ## index);                       \
  501                         panic("command not in queue");                  \
  502                 }                                                       \
  503                 TAILQ_REMOVE(&sc->aac_ ## name, cm, cm_link);           \
  504                 cm->cm_flags &= ~AAC_ON_ ## index;                      \
  505                 AACQ_REMOVE(sc, index);                                 \
  506         }                                                               \
  507         return(cm);                                                     \
  508 }                                                                       \
  509 static __inline void                                                    \
  510 aac_remove_ ## name (struct aac_command *cm)                            \
  511 {                                                                       \
  512         if ((cm->cm_flags & AAC_ON_ ## index) == 0) {                   \
  513                 printf("command %p not in queue, flags = %#x, "         \
  514                        "bit = %#x\n", cm, cm->cm_flags,                 \
  515                        AAC_ON_ ## index);                               \
  516                 panic("command not in queue");                          \
  517         }                                                               \
  518         TAILQ_REMOVE(&cm->cm_sc->aac_ ## name, cm, cm_link);            \
  519         cm->cm_flags &= ~AAC_ON_ ## index;                              \
  520         AACQ_REMOVE(cm->cm_sc, index);                                  \
  521 }                                                                       \
  522 struct hack
  523 
  524 AACQ_COMMAND_QUEUE(free, AACQ_FREE);
  525 AACQ_COMMAND_QUEUE(ready, AACQ_READY);
  526 AACQ_COMMAND_QUEUE(busy, AACQ_BUSY);
  527 
  528 /*
  529  * outstanding bio queue
  530  */
  531 static __inline void
  532 aac_initq_bio(struct aac_softc *sc)
  533 {
  534         bioq_init(&sc->aac_bioq);
  535         AACQ_INIT(sc, AACQ_BIO);
  536 }
  537 
  538 static __inline void
  539 aac_enqueue_bio(struct aac_softc *sc, struct bio *bp)
  540 {
  541         bioq_insert_tail(&sc->aac_bioq, bp);
  542         AACQ_ADD(sc, AACQ_BIO);
  543 }
  544 
  545 static __inline struct bio *
  546 aac_dequeue_bio(struct aac_softc *sc)
  547 {
  548         struct bio *bp;
  549 
  550         if ((bp = bioq_first(&sc->aac_bioq)) != NULL) {
  551                 bioq_remove(&sc->aac_bioq, bp);
  552                 AACQ_REMOVE(sc, AACQ_BIO);
  553         }
  554         return(bp);
  555 }
  556 
  557 static __inline void
  558 aac_print_printf(struct aac_softc *sc)
  559 {
  560         /*
  561          * XXX We have the ability to read the length of the printf string
  562          * from out of the mailboxes.
  563          */
  564         device_printf(sc->aac_dev, "**Monitor** %.*s", AAC_PRINTF_BUFSIZE,
  565                       sc->aac_common->ac_printf);
  566         sc->aac_common->ac_printf[0] = 0;
  567         AAC_QNOTIFY(sc, AAC_DB_PRINTF);
  568 }
  569 
  570 static __inline int
  571 aac_alloc_sync_fib(struct aac_softc *sc, struct aac_fib **fib)
  572 {
  573 
  574         mtx_lock(&sc->aac_io_lock);
  575         *fib = &sc->aac_common->ac_sync_fib;
  576         return (0);
  577 }
  578 
  579 static __inline void
  580 aac_release_sync_fib(struct aac_softc *sc)
  581 {
  582 
  583         mtx_unlock(&sc->aac_io_lock);
  584 }
  585 

Cache object: d751b6fbc5e6d6fe03f55f402a7b6457


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