Annotation of sys/dev/ic/mpivar.h, Revision 1.1
1.1 ! nbrk 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 *);
CVSweb