1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
48
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;
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 *);