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/aic7xxx_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  * 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  *    without modification.
   14  * 2. The name of the author may not be used to endorse or promote products
   15  *    derived from this software without specific prior written permission.
   16  *
   17  * Alternatively, this software may be distributed under the terms of the
   18  * GNU Public License ("GPL").
   19  *
   20  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   23  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
   24  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   30  * SUCH DAMAGE.
   31  *
   32  * $Id: //depot/aic7xxx/freebsd/dev/aic7xxx/aic7xxx_osm.h#18 $
   33  *
   34  * $FreeBSD: releng/8.4/sys/dev/aic7xxx/aic7xxx_osm.h 218992 2011-02-24 10:23:22Z brucec $
   35  */
   36 
   37 #ifndef _AIC7XXX_FREEBSD_H_
   38 #define _AIC7XXX_FREEBSD_H_
   39 
   40 #include <opt_aic7xxx.h>        /* for config options */
   41 
   42 #include <sys/param.h>
   43 #include <sys/systm.h>
   44 #include <sys/bus.h>            /* For device_t */
   45 #if __FreeBSD_version >= 500000
   46 #include <sys/endian.h>
   47 #endif
   48 #include <sys/eventhandler.h>
   49 #include <sys/kernel.h>
   50 #include <sys/malloc.h>
   51 #include <sys/module.h>
   52 #include <sys/queue.h>
   53 
   54 #if __FreeBSD_version < 500000
   55 #include <pci.h>
   56 #else
   57 #define NPCI 1
   58 #endif
   59 
   60 #if NPCI > 0
   61 #define AIC_PCI_CONFIG 1
   62 #endif
   63 #include <machine/bus.h>
   64 #include <machine/endian.h>
   65 #include <machine/resource.h>
   66 
   67 #include <sys/rman.h>
   68 
   69 #if NPCI > 0
   70 #if __FreeBSD_version >= 500000
   71 #include <dev/pci/pcireg.h>
   72 #include <dev/pci/pcivar.h>
   73 #else
   74 #include <pci/pcireg.h>
   75 #include <pci/pcivar.h>
   76 #endif
   77 #endif
   78 
   79 #include <cam/cam.h>
   80 #include <cam/cam_ccb.h>
   81 #include <cam/cam_debug.h>
   82 #include <cam/cam_sim.h>
   83 #include <cam/cam_xpt_sim.h>
   84 
   85 #include <cam/scsi/scsi_all.h>
   86 #include <cam/scsi/scsi_message.h>
   87 
   88 /*************************** Attachment Bookkeeping ***************************/
   89 extern devclass_t ahc_devclass;
   90 
   91 /****************************** Platform Macros *******************************/
   92 #define SIM_IS_SCSIBUS_B(ahc, sim)      \
   93         ((sim) == ahc->platform_data->sim_b)
   94 #define SIM_CHANNEL(ahc, sim)   \
   95         (((sim) == ahc->platform_data->sim_b) ? 'B' : 'A')
   96 #define SIM_SCSI_ID(ahc, sim)   \
   97         (((sim) == ahc->platform_data->sim_b) ? ahc->our_id_b : ahc->our_id)
   98 #define SIM_PATH(ahc, sim)      \
   99         (((sim) == ahc->platform_data->sim_b) ? ahc->platform_data->path_b \
  100                                               : ahc->platform_data->path)
  101 #define BUILD_SCSIID(ahc, sim, target_id, our_id) \
  102         ((((target_id) << TID_SHIFT) & TID) | (our_id) \
  103         | (SIM_IS_SCSIBUS_B(ahc, sim) ? TWIN_CHNLB : 0))
  104 
  105 #define SCB_GET_SIM(ahc, scb) \
  106         (SCB_GET_CHANNEL(ahc, scb) == 'A' ? (ahc)->platform_data->sim \
  107                                           : (ahc)->platform_data->sim_b)
  108 
  109 #ifndef offsetof
  110 #define offsetof(type, member)  ((size_t)(&((type *)0)->member))
  111 #endif
  112 
  113 /************************ Tunable Driver Parameters  **************************/
  114 /*
  115  * The number of dma segments supported.  The sequencer can handle any number
  116  * of physically contiguous S/G entrys.  To reduce the driver's memory
  117  * consumption, we limit the number supported to be sufficient to handle
  118  * the largest mapping supported by the legacy kernel MAXPHYS setting of
  119  * 128K.  This can be increased once some testing is done.  Assuming the
  120  * be the number of paged sized transfers in MAXPHYS plus an extra element
  121  * to handle any unaligned residual.  The sequencer fetches SG elements
  122  * in cacheline sized chucks, so make the number per-transaction an even
  123  * multiple of 16 which should align us on even the largest of cacheline
  124  * boundaries. 
  125  */
  126 #define AHC_MAXPHYS (128 * 1024)
  127 #define AHC_NSEG (roundup(btoc(AHC_MAXPHYS) + 1, 16))
  128 
  129 /* This driver supports target mode */
  130 #define AHC_TARGET_MODE 1
  131 
  132 /************************** Softc/SCB Platform Data ***************************/
  133 struct ahc_platform_data {
  134         /*
  135          * Hooks into the XPT.
  136          */
  137         struct  cam_sim         *sim;
  138         struct  cam_sim         *sim_b;
  139         struct  cam_path        *path;
  140         struct  cam_path        *path_b;
  141 
  142         int                      regs_res_type;
  143         int                      regs_res_id;
  144         int                      irq_res_type;
  145         struct resource         *regs;
  146         struct resource         *irq;
  147         void                    *ih;
  148         eventhandler_tag         eh;
  149         struct proc             *recovery_thread;
  150         struct mtx              mtx;
  151 };
  152 
  153 struct scb_platform_data {
  154 };
  155 
  156 /***************************** Core Includes **********************************/
  157 #ifdef AHC_REG_PRETTY_PRINT
  158 #define AIC_DEBUG_REGISTERS 1
  159 #else
  160 #define AIC_DEBUG_REGISTERS 0
  161 #endif
  162 #define AIC_CORE_INCLUDE <dev/aic7xxx/aic7xxx.h>
  163 #define AIC_LIB_PREFIX ahc
  164 #define AIC_CONST_PREFIX AHC
  165 #include <dev/aic7xxx/aic_osm_lib.h>
  166 
  167 /*************************** Device Access ************************************/
  168 #define ahc_inb(ahc, port)                              \
  169         bus_space_read_1((ahc)->tag, (ahc)->bsh, port)
  170 
  171 #define ahc_outb(ahc, port, value)                      \
  172         bus_space_write_1((ahc)->tag, (ahc)->bsh, port, value)
  173 
  174 #define ahc_outsb(ahc, port, valp, count)               \
  175         bus_space_write_multi_1((ahc)->tag, (ahc)->bsh, port, valp, count)
  176 
  177 #define ahc_insb(ahc, port, valp, count)                \
  178         bus_space_read_multi_1((ahc)->tag, (ahc)->bsh, port, valp, count)
  179 
  180 static __inline void ahc_flush_device_writes(struct ahc_softc *);
  181 
  182 static __inline void
  183 ahc_flush_device_writes(struct ahc_softc *ahc)
  184 {
  185         /* XXX Is this sufficient for all architectures??? */
  186         ahc_inb(ahc, INTSTAT);
  187 }
  188 
  189 /**************************** Locking Primitives ******************************/
  190 /* Lock protecting internal data structures */
  191 static __inline void ahc_lockinit(struct ahc_softc *);
  192 static __inline void ahc_lock(struct ahc_softc *);
  193 static __inline void ahc_unlock(struct ahc_softc *);
  194 
  195 static __inline void
  196 ahc_lockinit(struct ahc_softc *ahc)
  197 {
  198         mtx_init(&ahc->platform_data->mtx, "ahc_lock", NULL, MTX_DEF);
  199 }
  200 
  201 static __inline void
  202 ahc_lock(struct ahc_softc *ahc)
  203 {
  204         mtx_lock(&ahc->platform_data->mtx);
  205 }
  206 
  207 static __inline void
  208 ahc_unlock(struct ahc_softc *ahc)
  209 {
  210         mtx_unlock(&ahc->platform_data->mtx);
  211 }
  212 
  213 /************************* Initialization/Teardown ****************************/
  214 int       ahc_platform_alloc(struct ahc_softc *ahc, void *platform_arg);
  215 void      ahc_platform_free(struct ahc_softc *ahc);
  216 int       ahc_map_int(struct ahc_softc *ahc);
  217 int       ahc_attach(struct ahc_softc *);
  218 int       ahc_softc_comp(struct ahc_softc *lahc, struct ahc_softc *rahc);
  219 int       ahc_detach(device_t);
  220 
  221 /********************************** PCI ***************************************/
  222 #ifdef AIC_PCI_CONFIG
  223 int ahc_pci_map_registers(struct ahc_softc *ahc);
  224 #define ahc_pci_map_int ahc_map_int
  225 #endif /*AIC_PCI_CONFIG*/
  226 
  227 /******************************** VL/EISA *************************************/
  228 int aic7770_map_registers(struct ahc_softc *ahc, u_int port);
  229 static __inline int aic7770_map_int(struct ahc_softc *, int);
  230 
  231 static __inline int
  232 aic7770_map_int(struct ahc_softc *ahc, int irq)
  233 {
  234         /*
  235          * The IRQ is unused in the FreeBSD
  236          * implementation since the EISA and
  237          * ISA attachments register the IRQ
  238          * with newbus before the core is called.
  239          */
  240         return ahc_map_int(ahc);
  241 }
  242 
  243 /********************************* Debug **************************************/
  244 static __inline void    ahc_print_path(struct ahc_softc *, struct scb *);
  245 static __inline void    ahc_platform_dump_card_state(struct ahc_softc *ahc);
  246 
  247 static __inline void
  248 ahc_print_path(struct ahc_softc *ahc, struct scb *scb)
  249 {
  250         xpt_print_path(scb->io_ctx->ccb_h.path);
  251 }
  252 
  253 static __inline void
  254 ahc_platform_dump_card_state(struct ahc_softc *ahc)
  255 {
  256         /* Nothing to do here for FreeBSD */
  257 }
  258 /**************************** Transfer Settings *******************************/
  259 void      ahc_notify_xfer_settings_change(struct ahc_softc *,
  260                                           struct ahc_devinfo *);
  261 void      ahc_platform_set_tags(struct ahc_softc *, struct ahc_devinfo *,
  262                                 int /*enable*/);
  263 
  264 /****************************** Interrupts ************************************/
  265 void                    ahc_platform_intr(void *);
  266 static __inline void    ahc_platform_flushwork(struct ahc_softc *ahc);
  267 static __inline void
  268 ahc_platform_flushwork(struct ahc_softc *ahc)
  269 {
  270 }
  271 
  272 /************************ Misc Function Declarations **************************/
  273 void      ahc_done(struct ahc_softc *ahc, struct scb *scb);
  274 void      ahc_send_async(struct ahc_softc *, char /*channel*/,
  275                          u_int /*target*/, u_int /*lun*/, ac_code, void *arg);
  276 #endif  /* _AIC7XXX_FREEBSD_H_ */

Cache object: 6ac493b2df46c19de4c14ff768e64d21


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