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$
   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 #include <sys/endian.h>
   46 #include <sys/eventhandler.h>
   47 #include <sys/kernel.h>
   48 #include <sys/malloc.h>
   49 #include <sys/module.h>
   50 #include <sys/queue.h>
   51 
   52 #define AIC_PCI_CONFIG 1
   53 #include <machine/bus.h>
   54 #include <machine/endian.h>
   55 #include <machine/resource.h>
   56 
   57 #include <sys/rman.h>
   58 
   59 #include <dev/pci/pcireg.h>
   60 #include <dev/pci/pcivar.h>
   61 
   62 #include <cam/cam.h>
   63 #include <cam/cam_ccb.h>
   64 #include <cam/cam_debug.h>
   65 #include <cam/cam_sim.h>
   66 #include <cam/cam_xpt_sim.h>
   67 
   68 #include <cam/scsi/scsi_all.h>
   69 #include <cam/scsi/scsi_message.h>
   70 
   71 /****************************** Platform Macros *******************************/
   72 #define SIM_IS_SCSIBUS_B(ahc, sim)      \
   73         ((sim) == ahc->platform_data->sim_b)
   74 #define SIM_CHANNEL(ahc, sim)   \
   75         (((sim) == ahc->platform_data->sim_b) ? 'B' : 'A')
   76 #define SIM_SCSI_ID(ahc, sim)   \
   77         (((sim) == ahc->platform_data->sim_b) ? ahc->our_id_b : ahc->our_id)
   78 #define SIM_PATH(ahc, sim)      \
   79         (((sim) == ahc->platform_data->sim_b) ? ahc->platform_data->path_b \
   80                                               : ahc->platform_data->path)
   81 #define BUILD_SCSIID(ahc, sim, target_id, our_id) \
   82         ((((target_id) << TID_SHIFT) & TID) | (our_id) \
   83         | (SIM_IS_SCSIBUS_B(ahc, sim) ? TWIN_CHNLB : 0))
   84 
   85 #define SCB_GET_SIM(ahc, scb) \
   86         (SCB_GET_CHANNEL(ahc, scb) == 'A' ? (ahc)->platform_data->sim \
   87                                           : (ahc)->platform_data->sim_b)
   88 
   89 #ifndef offsetof
   90 #define offsetof(type, member)  ((size_t)(&((type *)0)->member))
   91 #endif
   92 
   93 /************************ Tunable Driver Parameters  **************************/
   94 /*
   95  * The number of dma segments supported.  The sequencer can handle any number
   96  * of physically contiguous S/G entrys.  To reduce the driver's memory
   97  * consumption, we limit the number supported to be sufficient to handle
   98  * the largest mapping supported by the legacy kernel MAXPHYS setting of
   99  * 128K.  This can be increased once some testing is done.  Assuming the
  100  * be the number of paged sized transfers in MAXPHYS plus an extra element
  101  * to handle any unaligned residual.  The sequencer fetches SG elements
  102  * in cacheline sized chucks, so make the number per-transaction an even
  103  * multiple of 16 which should align us on even the largest of cacheline
  104  * boundaries. 
  105  */
  106 #define AHC_MAXPHYS (128 * 1024)
  107 #define AHC_NSEG (roundup(btoc(AHC_MAXPHYS) + 1, 16))
  108 
  109 /* This driver supports target mode */
  110 #define AHC_TARGET_MODE 1
  111 
  112 /************************** Softc/SCB Platform Data ***************************/
  113 struct ahc_platform_data {
  114         /*
  115          * Hooks into the XPT.
  116          */
  117         struct  cam_sim         *sim;
  118         struct  cam_sim         *sim_b;
  119         struct  cam_path        *path;
  120         struct  cam_path        *path_b;
  121 
  122         int                      regs_res_type;
  123         int                      regs_res_id;
  124         int                      irq_res_type;
  125         struct resource         *regs;
  126         struct resource         *irq;
  127         void                    *ih;
  128         eventhandler_tag         eh;
  129         struct proc             *recovery_thread;
  130         struct mtx              mtx;
  131 };
  132 
  133 struct scb_platform_data {
  134 };
  135 
  136 /***************************** Core Includes **********************************/
  137 #ifdef AHC_REG_PRETTY_PRINT
  138 #define AIC_DEBUG_REGISTERS 1
  139 #else
  140 #define AIC_DEBUG_REGISTERS 0
  141 #endif
  142 #define AIC_CORE_INCLUDE <dev/aic7xxx/aic7xxx.h>
  143 #define AIC_LIB_PREFIX ahc
  144 #define AIC_CONST_PREFIX AHC
  145 #include <dev/aic7xxx/aic_osm_lib.h>
  146 
  147 /*************************** Device Access ************************************/
  148 #define ahc_inb(ahc, port)                              \
  149         bus_space_read_1((ahc)->tag, (ahc)->bsh, port)
  150 
  151 #define ahc_outb(ahc, port, value)                      \
  152         bus_space_write_1((ahc)->tag, (ahc)->bsh, port, value)
  153 
  154 #define ahc_outsb(ahc, port, valp, count)               \
  155         bus_space_write_multi_1((ahc)->tag, (ahc)->bsh, port, valp, count)
  156 
  157 #define ahc_insb(ahc, port, valp, count)                \
  158         bus_space_read_multi_1((ahc)->tag, (ahc)->bsh, port, valp, count)
  159 
  160 static __inline void ahc_flush_device_writes(struct ahc_softc *);
  161 
  162 static __inline void
  163 ahc_flush_device_writes(struct ahc_softc *ahc)
  164 {
  165         /* XXX Is this sufficient for all architectures??? */
  166         ahc_inb(ahc, INTSTAT);
  167 }
  168 
  169 /**************************** Locking Primitives ******************************/
  170 /* Lock protecting internal data structures */
  171 static __inline void ahc_lockinit(struct ahc_softc *);
  172 static __inline void ahc_lock(struct ahc_softc *);
  173 static __inline void ahc_unlock(struct ahc_softc *);
  174 
  175 static __inline void
  176 ahc_lockinit(struct ahc_softc *ahc)
  177 {
  178         mtx_init(&ahc->platform_data->mtx, "ahc_lock", NULL, MTX_DEF);
  179 }
  180 
  181 static __inline void
  182 ahc_lock(struct ahc_softc *ahc)
  183 {
  184         mtx_lock(&ahc->platform_data->mtx);
  185 }
  186 
  187 static __inline void
  188 ahc_unlock(struct ahc_softc *ahc)
  189 {
  190         mtx_unlock(&ahc->platform_data->mtx);
  191 }
  192 
  193 /************************* Initialization/Teardown ****************************/
  194 int       ahc_platform_alloc(struct ahc_softc *ahc, void *platform_arg);
  195 void      ahc_platform_free(struct ahc_softc *ahc);
  196 int       ahc_map_int(struct ahc_softc *ahc);
  197 int       ahc_attach(struct ahc_softc *);
  198 int       ahc_softc_comp(struct ahc_softc *lahc, struct ahc_softc *rahc);
  199 int       ahc_detach(device_t);
  200 
  201 /********************************** PCI ***************************************/
  202 #ifdef AIC_PCI_CONFIG
  203 int ahc_pci_map_registers(struct ahc_softc *ahc);
  204 #define ahc_pci_map_int ahc_map_int
  205 #endif /*AIC_PCI_CONFIG*/
  206 
  207 /******************************** VL/EISA/ISA *********************************/
  208 int aic7770_map_registers(struct ahc_softc *ahc, u_int port);
  209 static __inline int aic7770_map_int(struct ahc_softc *, int);
  210 
  211 static __inline int
  212 aic7770_map_int(struct ahc_softc *ahc, int irq)
  213 {
  214         /*
  215          * The IRQ is unused in the FreeBSD
  216          * implementation since the ISA attachment
  217          * registers the IRQ with newbus before
  218          * the core is called.
  219          */
  220         return ahc_map_int(ahc);
  221 }
  222 
  223 /********************************* Debug **************************************/
  224 static __inline void    ahc_print_path(struct ahc_softc *, struct scb *);
  225 static __inline void    ahc_platform_dump_card_state(struct ahc_softc *ahc);
  226 
  227 static __inline void
  228 ahc_print_path(struct ahc_softc *ahc, struct scb *scb)
  229 {
  230         xpt_print_path(scb->io_ctx->ccb_h.path);
  231 }
  232 
  233 static __inline void
  234 ahc_platform_dump_card_state(struct ahc_softc *ahc)
  235 {
  236         /* Nothing to do here for FreeBSD */
  237 }
  238 /**************************** Transfer Settings *******************************/
  239 void      ahc_notify_xfer_settings_change(struct ahc_softc *,
  240                                           struct ahc_devinfo *);
  241 void      ahc_platform_set_tags(struct ahc_softc *, struct ahc_devinfo *,
  242                                 int /*enable*/);
  243 
  244 /****************************** Interrupts ************************************/
  245 void                    ahc_platform_intr(void *);
  246 static __inline void    ahc_platform_flushwork(struct ahc_softc *ahc);
  247 static __inline void
  248 ahc_platform_flushwork(struct ahc_softc *ahc)
  249 {
  250 }
  251 
  252 /************************ Misc Function Declarations **************************/
  253 void      ahc_done(struct ahc_softc *ahc, struct scb *scb);
  254 void      ahc_send_async(struct ahc_softc *, char /*channel*/,
  255                          u_int /*target*/, u_int /*lun*/, ac_code, void *arg);
  256 #endif  /* _AIC7XXX_FREEBSD_H_ */

Cache object: 2e75c1528c1062f1c3b652113fee3ad8


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