root/dev/ic/mpivar.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


    1 /*      $OpenBSD: mpivar.h,v 1.22 2007/03/17 10:25:39 dlg Exp $ */
    2 
    3 /*
    4  * Copyright (c) 2005 David Gwynne <dlg@openbsd.org>
    5  * Copyright (c) 2005 Marco Peereboom <marco@openbsd.org>
    6  *
    7  * Permission to use, copy, modify, and distribute this software for any
    8  * purpose with or without fee is hereby granted, provided that the above
    9  * copyright notice and this permission notice appear in all copies.
   10  *
   11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
   14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   18  */
   19 
   20 
   21 /* #define MPI_DEBUG */
   22 #ifdef MPI_DEBUG
   23 extern uint32_t                 mpi_debug;
   24 #define DPRINTF(x...)           do { if (mpi_debug) printf(x); } while(0)
   25 #define DNPRINTF(n,x...)        do { if (mpi_debug & (n)) printf(x); } while(0)
   26 #define MPI_D_CMD               0x0001
   27 #define MPI_D_INTR              0x0002
   28 #define MPI_D_MISC              0x0004
   29 #define MPI_D_DMA               0x0008
   30 #define MPI_D_IOCTL             0x0010
   31 #define MPI_D_RW                0x0020
   32 #define MPI_D_MEM               0x0040
   33 #define MPI_D_CCB               0x0080
   34 #define MPI_D_PPR               0x0100
   35 #define MPI_D_RAID              0x0200
   36 #define MPI_D_EVT               0x0400
   37 #else
   38 #define DPRINTF(x...)
   39 #define DNPRINTF(n,x...)
   40 #endif
   41 
   42 #define MPI_REQUEST_SIZE        512
   43 #define MPI_REPLY_SIZE          128
   44 #define MPI_REPLY_COUNT         (PAGE_SIZE / MPI_REPLY_SIZE)
   45 
   46 /*
   47  * this is the max number of sge's we can stuff in a request frame:
   48  * sizeof(scsi_io) + sizeof(sense) + sizeof(sge) * 32 = MPI_REQUEST_SIZE
   49  */
   50 #define MPI_MAX_SGL             36
   51 
   52 struct mpi_dmamem {
   53         bus_dmamap_t            mdm_map;
   54         bus_dma_segment_t       mdm_seg;
   55         size_t                  mdm_size;
   56         caddr_t                 mdm_kva;
   57 };
   58 #define MPI_DMA_MAP(_mdm)       ((_mdm)->mdm_map)
   59 #define MPI_DMA_DVA(_mdm)       ((_mdm)->mdm_map->dm_segs[0].ds_addr)
   60 #define MPI_DMA_KVA(_mdm)       ((void *)(_mdm)->mdm_kva)
   61 
   62 struct mpi_ccb_bundle {
   63         struct mpi_msg_scsi_io  mcb_io; /* sgl must follow */
   64         struct mpi_sge          mcb_sgl[MPI_MAX_SGL];
   65         struct scsi_sense_data  mcb_sense;
   66 } __packed;
   67 
   68 struct mpi_softc;
   69 
   70 struct mpi_rcb {
   71         void                    *rcb_reply;
   72         u_int32_t               rcb_reply_dva;
   73 };
   74 
   75 struct mpi_ccb {
   76         struct mpi_softc        *ccb_sc;
   77         int                     ccb_id;
   78 
   79         struct scsi_xfer        *ccb_xs;
   80         bus_dmamap_t            ccb_dmamap;
   81 
   82         bus_addr_t              ccb_offset;
   83         void                    *ccb_cmd;
   84         bus_addr_t              ccb_cmd_dva;
   85 
   86         volatile enum {
   87                 MPI_CCB_FREE,
   88                 MPI_CCB_READY,
   89                 MPI_CCB_QUEUED
   90         }                       ccb_state;
   91         void                    (*ccb_done)(struct mpi_ccb *);
   92         struct mpi_rcb          *ccb_rcb;
   93 
   94         TAILQ_ENTRY(mpi_ccb)    ccb_link;
   95 };
   96 
   97 TAILQ_HEAD(mpi_ccb_list, mpi_ccb);
   98 
   99 struct mpi_softc {
  100         struct device           sc_dev;
  101         struct scsi_link        sc_link;
  102 
  103         int                     sc_flags;
  104 #define MPI_F_SPI                       (1<<0)
  105 #define MPI_F_RAID                      (1<<1)
  106 
  107         struct scsibus_softc    *sc_scsibus;
  108 
  109         bus_space_tag_t         sc_iot;
  110         bus_space_handle_t      sc_ioh;
  111         bus_size_t              sc_ios;
  112         bus_dma_tag_t           sc_dmat;
  113 
  114         u_int8_t                sc_porttype;
  115         int                     sc_maxcmds;
  116         int                     sc_maxchdepth;
  117         int                     sc_first_sgl_len;
  118         int                     sc_chain_len;
  119         int                     sc_max_sgl_len;
  120 
  121         int                     sc_buswidth;
  122         int                     sc_target;
  123         int                     sc_ioc_number;
  124 
  125         struct mpi_dmamem       *sc_requests;
  126         struct mpi_ccb          *sc_ccbs;
  127         struct mpi_ccb_list     sc_ccb_free;
  128 
  129         struct mpi_dmamem       *sc_replies;
  130         struct mpi_rcb          *sc_rcbs;
  131 
  132         size_t                  sc_fw_len;
  133         struct mpi_dmamem       *sc_fw;
  134 };
  135 
  136 int     mpi_attach(struct mpi_softc *);
  137 void    mpi_detach(struct mpi_softc *);
  138 
  139 int     mpi_intr(void *);

/* [<][>][^][v][top][bottom][index][help] */