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/6.2/sys/dev/aic7xxx/aic79xx_osm.h 146734 2005-05-29 04:42:30Z nyan $
   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 
   55 #define AIC_PCI_CONFIG 1
   56 #include <machine/bus.h>
   57 #include <machine/endian.h>
   58 #include <machine/clock.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 #ifdef CAM_NEW_TRAN_CODE
   82 #define AHD_NEW_TRAN_SETTINGS
   83 #endif /* CAM_NEW_TRAN_CODE */
   84 
   85 /****************************** Platform Macros *******************************/
   86 #define SIM_IS_SCSIBUS_B(ahd, sim)      \
   87         (0)
   88 #define SIM_CHANNEL(ahd, sim)   \
   89         ('A')
   90 #define SIM_SCSI_ID(ahd, sim)   \
   91         (ahd->our_id)
   92 #define SIM_PATH(ahd, sim)      \
   93         (ahd->platform_data->path)
   94 #define BUILD_SCSIID(ahd, sim, target_id, our_id) \
   95         ((((target_id) << TID_SHIFT) & TID) | (our_id))
   96         
   97 
   98 #define SCB_GET_SIM(ahd, scb) \
   99         ((ahd)->platform_data->sim)
  100 
  101 #ifndef offsetof
  102 #define offsetof(type, member)  ((size_t)(&((type *)0)->member))
  103 #endif
  104 
  105 /************************ Tunable Driver Parameters  **************************/
  106 /*
  107  * The number of dma segments supported.  The sequencer can handle any number
  108  * of physically contiguous S/G entrys.  To reduce the driver's memory
  109  * consumption, we limit the number supported to be sufficient to handle
  110  * the largest mapping supported by the kernel, MAXPHYS.  Assuming the
  111  * transfer is as fragmented as possible and unaligned, this turns out to
  112  * be the number of paged sized transfers in MAXPHYS plus an extra element
  113  * to handle any unaligned residual.  The sequencer fetches SG elements
  114  * in cacheline sized chucks, so make the number per-transaction an even
  115  * multiple of 16 which should align us on even the largest of cacheline
  116  * boundaries. 
  117  */
  118 #define AHD_NSEG (roundup(btoc(MAXPHYS) + 1, 16))
  119 
  120 /* This driver supports target mode */
  121 #if NOT_YET
  122 #define AHD_TARGET_MODE 1
  123 #endif
  124 
  125 /************************** Softc/SCB Platform Data ***************************/
  126 struct ahd_platform_data {
  127         /*
  128          * Hooks into the XPT.
  129          */
  130         struct  cam_sim         *sim;
  131         struct  cam_path        *path;
  132 
  133         int                      regs_res_type[2];
  134         int                      regs_res_id[2];
  135         int                      irq_res_type;
  136         struct resource         *regs[2];
  137         struct resource         *irq;
  138         void                    *ih;
  139         eventhandler_tag         eh;
  140         struct proc             *recovery_thread;
  141 };
  142 
  143 struct scb_platform_data {
  144 };
  145 
  146 /***************************** Core Includes **********************************/
  147 #if AHD_REG_PRETTY_PRINT
  148 #define AIC_DEBUG_REGISTERS 1
  149 #else
  150 #define AIC_DEBUG_REGISTERS 0
  151 #endif
  152 #define AIC_CORE_INCLUDE <dev/aic7xxx/aic79xx.h>
  153 #define AIC_LIB_PREFIX ahd
  154 #define AIC_CONST_PREFIX AHD
  155 #include <dev/aic7xxx/aic_osm_lib.h>
  156 
  157 /*************************** Device Access ************************************/
  158 #define ahd_inb(ahd, port)                                      \
  159         bus_space_read_1((ahd)->tags[(port) >> 8],              \
  160                          (ahd)->bshs[(port) >> 8], (port) & 0xFF)
  161 
  162 #define ahd_outb(ahd, port, value)                              \
  163         bus_space_write_1((ahd)->tags[(port) >> 8],             \
  164                           (ahd)->bshs[(port) >> 8], (port) & 0xFF, value)
  165 
  166 #define ahd_inw_atomic(ahd, port)                               \
  167         aic_le16toh(bus_space_read_2((ahd)->tags[(port) >> 8],  \
  168                                      (ahd)->bshs[(port) >> 8], (port) & 0xFF))
  169 
  170 #define ahd_outw_atomic(ahd, port, value)                       \
  171         bus_space_write_2((ahd)->tags[(port) >> 8],             \
  172                           (ahd)->bshs[(port) >> 8],             \
  173                           (port & 0xFF), aic_htole16(value))
  174 
  175 #define ahd_outsb(ahd, port, valp, count)                       \
  176         bus_space_write_multi_1((ahd)->tags[(port) >> 8],       \
  177                                 (ahd)->bshs[(port) >> 8],       \
  178                                 (port & 0xFF), valp, count)
  179 
  180 #define ahd_insb(ahd, port, valp, count)                        \
  181         bus_space_read_multi_1((ahd)->tags[(port) >> 8],        \
  182                                (ahd)->bshs[(port) >> 8],        \
  183                                (port & 0xFF), valp, count)
  184 
  185 static __inline void ahd_flush_device_writes(struct ahd_softc *);
  186 
  187 static __inline void
  188 ahd_flush_device_writes(struct ahd_softc *ahd)
  189 {
  190         /* XXX Is this sufficient for all architectures??? */
  191         ahd_inb(ahd, INTSTAT);
  192 }
  193 
  194 /**************************** Locking Primitives ******************************/
  195 /* Lock protecting internal data structures */
  196 static __inline void ahd_lockinit(struct ahd_softc *);
  197 static __inline void ahd_lock(struct ahd_softc *, unsigned long *flags);
  198 static __inline void ahd_unlock(struct ahd_softc *, unsigned long *flags);
  199 
  200 /* Lock held during command compeletion to the upper layer */
  201 static __inline void ahd_done_lockinit(struct ahd_softc *);
  202 static __inline void ahd_done_lock(struct ahd_softc *, unsigned long *flags);
  203 static __inline void ahd_done_unlock(struct ahd_softc *, unsigned long *flags);
  204 
  205 /* Lock held during ahd_list manipulation and ahd softc frees */
  206 static __inline void ahd_list_lockinit(void);
  207 static __inline void ahd_list_lock(unsigned long *flags);
  208 static __inline void ahd_list_unlock(unsigned long *flags);
  209 
  210 static __inline void
  211 ahd_lockinit(struct ahd_softc *ahd)
  212 {
  213 }
  214 
  215 static __inline void
  216 ahd_lock(struct ahd_softc *ahd, unsigned long *flags)
  217 {
  218         *flags = splcam();
  219 }
  220 
  221 static __inline void
  222 ahd_unlock(struct ahd_softc *ahd, unsigned long *flags)
  223 {
  224         splx(*flags);
  225 }
  226 
  227 /* Lock held during command compeletion to the upper layer */
  228 static __inline void
  229 ahd_done_lockinit(struct ahd_softc *ahd)
  230 {
  231 }
  232 
  233 static __inline void
  234 ahd_done_lock(struct ahd_softc *ahd, unsigned long *flags)
  235 {
  236 }
  237 
  238 static __inline void
  239 ahd_done_unlock(struct ahd_softc *ahd, unsigned long *flags)
  240 {
  241 }
  242 
  243 /* Lock held during ahd_list manipulation and ahd softc frees */
  244 static __inline void
  245 ahd_list_lockinit(void)
  246 {
  247 }
  248 
  249 static __inline void
  250 ahd_list_lock(unsigned long *flags)
  251 {
  252 }
  253 
  254 static __inline void
  255 ahd_list_unlock(unsigned long *flags)
  256 {
  257 }
  258 
  259 /********************************** PCI ***************************************/
  260 int ahd_pci_map_registers(struct ahd_softc *ahd);
  261 int ahd_pci_map_int(struct ahd_softc *ahd);
  262 
  263 /************************** Transaction Operations ****************************/
  264 static __inline void aic_freeze_simq(struct aic_softc*);
  265 static __inline void aic_release_simq(struct aic_softc*);
  266 
  267 static __inline void
  268 aic_freeze_simq(struct aic_softc *aic)
  269 {
  270         xpt_freeze_simq(aic->platform_data->sim, /*count*/1);
  271 }
  272 
  273 static __inline void
  274 aic_release_simq(struct aic_softc *aic)
  275 {
  276         xpt_release_simq(aic->platform_data->sim, /*run queue*/TRUE);
  277 }
  278 /********************************* Debug **************************************/
  279 static __inline void    ahd_print_path(struct ahd_softc *, struct scb *);
  280 static __inline void    ahd_platform_dump_card_state(struct ahd_softc *ahd);
  281 
  282 static __inline void
  283 ahd_print_path(struct ahd_softc *ahd, struct scb *scb)
  284 {
  285         xpt_print_path(scb->io_ctx->ccb_h.path);
  286 }
  287 
  288 static __inline void
  289 ahd_platform_dump_card_state(struct ahd_softc *ahd)
  290 {
  291         /* Nothing to do here for FreeBSD */
  292 }
  293 /**************************** Transfer Settings *******************************/
  294 void      ahd_notify_xfer_settings_change(struct ahd_softc *,
  295                                           struct ahd_devinfo *);
  296 void      ahd_platform_set_tags(struct ahd_softc *, struct ahd_devinfo *,
  297                                 int /*enable*/);
  298 
  299 /************************* Initialization/Teardown ****************************/
  300 int       ahd_platform_alloc(struct ahd_softc *ahd, void *platform_arg);
  301 void      ahd_platform_free(struct ahd_softc *ahd);
  302 int       ahd_map_int(struct ahd_softc *ahd);
  303 int       ahd_attach(struct ahd_softc *);
  304 int       ahd_softc_comp(struct ahd_softc *lahd, struct ahd_softc *rahd);
  305 int       ahd_detach(device_t);
  306 #define ahd_platform_init(arg)
  307 
  308 
  309 /****************************** Interrupts ************************************/
  310 void                    ahd_platform_intr(void *);
  311 static __inline void    ahd_platform_flushwork(struct ahd_softc *ahd);
  312 static __inline void
  313 ahd_platform_flushwork(struct ahd_softc *ahd)
  314 {
  315 }
  316 
  317 /************************ Misc Function Declarations **************************/
  318 void      ahd_done(struct ahd_softc *ahd, struct scb *scb);
  319 void      ahd_send_async(struct ahd_softc *, char /*channel*/,
  320                          u_int /*target*/, u_int /*lun*/, ac_code, void *arg);
  321 #endif  /* _AIC79XX_FREEBSD_H_ */

Cache object: 73349054e6d25b68aea45957c5df8093


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