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/aic7xxx/aic79xx_osm.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  * FreeBSD platform specific driver option settings, data structures,
    3  * function declarations and includes.
    4  *
    5  * Copyright (c) 1994-2001 Justin T. Gibbs.
    6  * Copyright (c) 2001-2002 Adaptec Inc.
    7  * All rights reserved.
    8  *
    9  * Redistribution and use in source and binary forms, with or without
   10  * modification, are permitted provided that the following conditions
   11  * are met:
   12  * 1. Redistributions of source code must retain the above copyright
   13  *    notice, this list of conditions, and the following disclaimer,
   14  *    without modification.
   15  * 2. The name of the author may not be used to endorse or promote products
   16  *    derived from this software without specific prior written permission.
   17  *
   18  * Alternatively, this software may be distributed under the terms of the
   19  * GNU Public License ("GPL").
   20  *
   21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   24  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
   25  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   31  * SUCH DAMAGE.
   32  *
   33  * $Id: //depot/aic7xxx/freebsd/dev/aic7xxx/aic79xx_osm.h#23 $
   34  *
   35  * $FreeBSD: releng/11.2/sys/dev/aic7xxx/aic79xx_osm.h 218909 2011-02-21 09:01:34Z brucec $
   36  */
   37 
   38 #ifndef _AIC79XX_FREEBSD_H_
   39 #define _AIC79XX_FREEBSD_H_
   40 
   41 #include <opt_aic79xx.h>        /* for config options */
   42 
   43 #include <sys/param.h>
   44 #include <sys/systm.h>
   45 #include <sys/bus.h>            /* For device_t */
   46 #if __FreeBSD_version >= 500000
   47 #include <sys/endian.h>
   48 #endif
   49 #include <sys/eventhandler.h>
   50 #include <sys/kernel.h>
   51 #include <sys/malloc.h>
   52 #include <sys/module.h>
   53 #include <sys/queue.h>
   54 #include <sys/sysctl.h>
   55 
   56 #define AIC_PCI_CONFIG 1
   57 #include <machine/bus.h>
   58 #include <machine/endian.h>
   59 #include <machine/resource.h>
   60 
   61 #include <sys/rman.h>
   62 
   63 #if __FreeBSD_version >= 500000
   64 #include <dev/pci/pcireg.h>
   65 #include <dev/pci/pcivar.h>
   66 #else
   67 #include <pci/pcireg.h>
   68 #include <pci/pcivar.h>
   69 #endif
   70 
   71 #include <cam/cam.h>
   72 #include <cam/cam_ccb.h>
   73 #include <cam/cam_debug.h>
   74 #include <cam/cam_sim.h>
   75 #include <cam/cam_xpt_sim.h>
   76 
   77 #include <cam/scsi/scsi_all.h>
   78 #include <cam/scsi/scsi_message.h>
   79 #include <cam/scsi/scsi_iu.h>
   80 
   81 /****************************** Platform Macros *******************************/
   82 #define SIM_IS_SCSIBUS_B(ahd, sim)      \
   83         (0)
   84 #define SIM_CHANNEL(ahd, sim)   \
   85         ('A')
   86 #define SIM_SCSI_ID(ahd, sim)   \
   87         (ahd->our_id)
   88 #define SIM_PATH(ahd, sim)      \
   89         (ahd->platform_data->path)
   90 #define BUILD_SCSIID(ahd, sim, target_id, our_id) \
   91         ((((target_id) << TID_SHIFT) & TID) | (our_id))
   92         
   93 
   94 #define SCB_GET_SIM(ahd, scb) \
   95         ((ahd)->platform_data->sim)
   96 
   97 #ifndef offsetof
   98 #define offsetof(type, member)  ((size_t)(&((type *)0)->member))
   99 #endif
  100 
  101 /************************ Tunable Driver Parameters  **************************/
  102 /*
  103  * The number of dma segments supported.  The sequencer can handle any number
  104  * of physically contiguous S/G entrys.  To reduce the driver's memory
  105  * consumption, we limit the number supported to be sufficient to handle
  106  * the largest mapping supported by the legacy kernel MAXPHYS setting of
  107  * 128K.  This can be increased once some testing is done.  Assuming the
  108  * transfer is as fragmented as possible and unaligned, this turns out to
  109  * be the number of paged sized transfers in MAXPHYS plus an extra element
  110  * to handle any unaligned residual.  The sequencer fetches SG elements
  111  * in cacheline sized chucks, so make the number per-transaction an even
  112  * multiple of 16 which should align us on even the largest of cacheline
  113  * boundaries. 
  114  */
  115 #define AHD_MAXPHYS (128 * 1024)
  116 #define AHD_NSEG (roundup(btoc(AHD_MAXPHYS) + 1, 16))
  117 
  118 /* This driver supports target mode */
  119 #ifdef NOT_YET
  120 #define AHD_TARGET_MODE 1
  121 #endif
  122 
  123 /************************** Softc/SCB Platform Data ***************************/
  124 struct ahd_platform_data {
  125         /*
  126          * Hooks into the XPT.
  127          */
  128         struct  cam_sim         *sim;
  129         struct  cam_path        *path;
  130 
  131         int                      regs_res_type[2];
  132         int                      regs_res_id[2];
  133         int                      irq_res_type;
  134         struct resource         *regs[2];
  135         struct resource         *irq;
  136         void                    *ih;
  137         eventhandler_tag         eh;
  138         struct proc             *recovery_thread;
  139         struct mtx              mtx;
  140 };
  141 
  142 struct scb_platform_data {
  143 };
  144 
  145 /***************************** Core Includes **********************************/
  146 #ifdef AHD_REG_PRETTY_PRINT
  147 #define AIC_DEBUG_REGISTERS 1
  148 #else
  149 #define AIC_DEBUG_REGISTERS 0
  150 #endif
  151 #define AIC_CORE_INCLUDE <dev/aic7xxx/aic79xx.h>
  152 #define AIC_LIB_PREFIX ahd
  153 #define AIC_CONST_PREFIX AHD
  154 #include <dev/aic7xxx/aic_osm_lib.h>
  155 
  156 /*************************** Device Access ************************************/
  157 #define ahd_inb(ahd, port)                                      \
  158         bus_space_read_1((ahd)->tags[(port) >> 8],              \
  159                          (ahd)->bshs[(port) >> 8], (port) & 0xFF)
  160 
  161 #define ahd_outb(ahd, port, value)                              \
  162         bus_space_write_1((ahd)->tags[(port) >> 8],             \
  163                           (ahd)->bshs[(port) >> 8], (port) & 0xFF, value)
  164 
  165 #define ahd_inw_atomic(ahd, port)                               \
  166         aic_le16toh(bus_space_read_2((ahd)->tags[(port) >> 8],  \
  167                                      (ahd)->bshs[(port) >> 8], (port) & 0xFF))
  168 
  169 #define ahd_outw_atomic(ahd, port, value)                       \
  170         bus_space_write_2((ahd)->tags[(port) >> 8],             \
  171                           (ahd)->bshs[(port) >> 8],             \
  172                           (port & 0xFF), aic_htole16(value))
  173 
  174 #define ahd_outsb(ahd, port, valp, count)                       \
  175         bus_space_write_multi_1((ahd)->tags[(port) >> 8],       \
  176                                 (ahd)->bshs[(port) >> 8],       \
  177                                 (port & 0xFF), valp, count)
  178 
  179 #define ahd_insb(ahd, port, valp, count)                        \
  180         bus_space_read_multi_1((ahd)->tags[(port) >> 8],        \
  181                                (ahd)->bshs[(port) >> 8],        \
  182                                (port & 0xFF), valp, count)
  183 
  184 static __inline void ahd_flush_device_writes(struct ahd_softc *);
  185 
  186 static __inline void
  187 ahd_flush_device_writes(struct ahd_softc *ahd)
  188 {
  189         /* XXX Is this sufficient for all architectures??? */
  190         ahd_inb(ahd, INTSTAT);
  191 }
  192 
  193 /**************************** Locking Primitives ******************************/
  194 /* Lock protecting internal data structures */
  195 static __inline void ahd_lockinit(struct ahd_softc *);
  196 static __inline void ahd_lock(struct ahd_softc *);
  197 static __inline void ahd_unlock(struct ahd_softc *);
  198 
  199 static __inline void
  200 ahd_lockinit(struct ahd_softc *ahd)
  201 {
  202         mtx_init(&ahd->platform_data->mtx, "ahd_lock", NULL, MTX_DEF);
  203 }
  204 
  205 static __inline void
  206 ahd_lock(struct ahd_softc *ahd)
  207 {
  208         mtx_lock(&ahd->platform_data->mtx);
  209 }
  210 
  211 static __inline void
  212 ahd_unlock(struct ahd_softc *ahd)
  213 {
  214         mtx_unlock(&ahd->platform_data->mtx);
  215 }
  216 
  217 /********************************** PCI ***************************************/
  218 int ahd_pci_map_registers(struct ahd_softc *ahd);
  219 int ahd_pci_map_int(struct ahd_softc *ahd);
  220 
  221 /************************** Transaction Operations ****************************/
  222 static __inline void aic_freeze_simq(struct aic_softc*);
  223 static __inline void aic_release_simq(struct aic_softc*);
  224 
  225 static __inline void
  226 aic_freeze_simq(struct aic_softc *aic)
  227 {
  228         xpt_freeze_simq(aic->platform_data->sim, /*count*/1);
  229 }
  230 
  231 static __inline void
  232 aic_release_simq(struct aic_softc *aic)
  233 {
  234         xpt_release_simq(aic->platform_data->sim, /*run queue*/TRUE);
  235 }
  236 /********************************* Debug **************************************/
  237 static __inline void    ahd_print_path(struct ahd_softc *, struct scb *);
  238 static __inline void    ahd_platform_dump_card_state(struct ahd_softc *ahd);
  239 
  240 static __inline void
  241 ahd_print_path(struct ahd_softc *ahd, struct scb *scb)
  242 {
  243         xpt_print_path(scb->io_ctx->ccb_h.path);
  244 }
  245 
  246 static __inline void
  247 ahd_platform_dump_card_state(struct ahd_softc *ahd)
  248 {
  249         /* Nothing to do here for FreeBSD */
  250 }
  251 /**************************** Transfer Settings *******************************/
  252 void      ahd_notify_xfer_settings_change(struct ahd_softc *,
  253                                           struct ahd_devinfo *);
  254 void      ahd_platform_set_tags(struct ahd_softc *, struct ahd_devinfo *,
  255                                 int /*enable*/);
  256 
  257 /************************* Initialization/Teardown ****************************/
  258 int       ahd_platform_alloc(struct ahd_softc *ahd, void *platform_arg);
  259 void      ahd_platform_free(struct ahd_softc *ahd);
  260 int       ahd_map_int(struct ahd_softc *ahd);
  261 int       ahd_attach(struct ahd_softc *);
  262 int       ahd_softc_comp(struct ahd_softc *lahd, struct ahd_softc *rahd);
  263 void      ahd_sysctl(struct ahd_softc *ahd);
  264 int       ahd_detach(device_t);
  265 #define ahd_platform_init(arg)
  266 
  267 
  268 /****************************** Interrupts ************************************/
  269 void                    ahd_platform_intr(void *);
  270 static __inline void    ahd_platform_flushwork(struct ahd_softc *ahd);
  271 static __inline void
  272 ahd_platform_flushwork(struct ahd_softc *ahd)
  273 {
  274 }
  275 
  276 /************************ Misc Function Declarations **************************/
  277 void      ahd_done(struct ahd_softc *ahd, struct scb *scb);
  278 void      ahd_send_async(struct ahd_softc *, char /*channel*/,
  279                          u_int /*target*/, u_int /*lun*/, ac_code, void *arg);
  280 #endif  /* _AIC79XX_FREEBSD_H_ */

Cache object: ebaaa67e93aeeb925be8613ab347f986


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