1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 
  26 
  27 #ifndef _SD_IOB_H
  28 #define _SD_IOB_H
  29 
  30 #ifdef  __cplusplus
  31 extern "C" {
  32 #endif
  33 
  34 #define MAX_HOOK_LOCKS  32
  35 typedef int (*dcb_t)(struct buf *);     /* driver callback type */
  36 
  37 /*
  38  * order of end action calls:
  39  * driver callback (iob_drv_iodone) is stuffed in b_iodone and called by
  40  * the device driver when i/o completes.  It calls the hook end action
  41  * (iob_hook_iodone) which maintains the completion count (iob_hook.count)
  42  * and calls the clients end action (iob_hook.func) when the chain is complete.
  43  */
  44 typedef struct iob_hook {
  45                 struct iob_hook *next_hook;
  46                 struct buf      *chain; /* all the buffers for this iob */
  47                 struct buf      *tail;  /* tail of buffer chain */
  48                 int     count;          /* number of bufs on the chain */
  49                 nsc_off_t start_fba;    /* initial disk block for the xfer */
  50                 nsc_off_t last_fba;     /* last disk block for the xfer */
  51                 nsc_size_t size;        /* # bytes for entire transfer */
  52                 unsigned char *last_vaddr; /* ending addr of last i/o request */
  53                 sdbc_ea_fn_t func;      /* clients end action routine */
  54                 int     (* iob_hook_iodone)(struct buf *, struct iob_hook *);
  55                 dcb_t   iob_drv_iodone; /* driver call back */
  56                 blind_t param;          /* param for clnt end action routine */
  57                 int     flags;          /* flags for each buffer */
  58                 int     error;          /* any error */
  59                 int     skipped;        /* this iob used sd_add_mem */
  60                 kmutex_t *lockp;        /* mutex for releasing buffers */
  61                 kcondvar_t wait;        /* sync for sleeping on synch i/o */
  62 #ifdef _SD_BIO_STATS
  63                 int     PAGE_IO, NORM_IO, SKIP_IO;
  64                 int     PAGE_COMBINED;
  65                 nsc_size_t NORM_IO_SIZE;
  66 #endif /* _SD_BIO_STATS */
  67         } iob_hook_t;
  68 
  69 typedef struct _sd_buf_list {
  70         iob_hook_t      *hooks;         /* all of the iob hooks */
  71         iob_hook_t      *hook_head;     /* free iob hook */
  72         int             bl_init_count;  /* total count */
  73         int             bl_hooks_avail;  /* monitor available hook count */
  74         int             bl_hook_lowmark; /* record if ever run out of hooks */
  75         int             hook_waiters;   /* count of waiters */
  76         int             max_hook_waiters; /* record max ever waiters */
  77         kcondvar_t      hook_wait;      /* sync for sleeping on synch i/o */
  78         kmutex_t        hook_locks[MAX_HOOK_LOCKS];
  79 } _sd_buf_list_t;
  80 
  81 /*
  82  * NOTE: if you change this, then also make changes to the generation
  83  * of sd_iob_impl*.c in src/uts/common/Makefile.files and Makefile.rules!
  84  */
  85 #define _SD_DEFAULT_IOBUFS 4096
  86 
  87 /* define driver callback and driver callback function table */
  88 
  89 #define IOB_DCBP(i) (sd_iob_dcb ## i)
  90 
  91 #define IOB_DCB(i)      \
  92         int     \
  93         IOB_DCBP(i)(struct buf *bp)     \
  94         {               \
  95                 return ((*_sd_buflist.hooks[i].iob_hook_iodone) \
  96                                 (bp, &_sd_buflist.hooks[i]));       \
  97         }
  98 
  99 extern _sd_buf_list_t _sd_buflist;
 100 
 101 #ifdef  __cplusplus
 102 }
 103 #endif
 104 
 105 #endif  /* _SD_IOB_H */