Merge branch 'master' of git://git.theshell.com/dragonfly
[dragonfly.git] / sys / dev / raid / tws / tws.h
1 /*
2  * Copyright (c) 2010, LSI Corp.
3  * All rights reserved.
4  * Author : Manjunath Ranganathaiah
5  * Support: freebsdraid@lsi.com
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in
15  *    the documentation and/or other materials provided with the
16  *    distribution.
17  * 3. Neither the name of the <ORGANIZATION> nor the names of its
18  *    contributors may be used to endorse or promote products derived
19  *    from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * $FreeBSD: src/sys/dev/tws/tws.h,v 1.3 2007/05/09 04:16:32 mrangana Exp $
35  */
36
37 #include <sys/param.h>        /* defines used in kernel.h */
38 #include <sys/module.h>
39 #include <sys/systm.h>
40 #include <sys/proc.h>
41 #include <sys/errno.h>
42 #include <sys/kernel.h>       /* types used in module initialization */
43 #include <sys/conf.h>         /* cdevsw struct */
44 #include <sys/uio.h>          /* uio struct */
45 #include <sys/malloc.h>
46 #include <sys/bus.h>          /* structs, prototypes for pci bus stuff */
47
48 #include <sys/rman.h>
49 #include <sys/device.h>
50 #include <machine/clock.h>
51
52 #include <bus/pci/pcivar.h>   /* For pci_get macros! */
53 #include <bus/pci/pcireg.h>
54
55 #include <sys/types.h>
56 #include <sys/sysctl.h>
57 #include <sys/stat.h>
58
59
60 #define TWS_PULL_MODE_ENABLE 1
61
62 MALLOC_DECLARE(M_TWS);
63 /* externs */
64 extern int tws_queue_depth;
65
66
67 #define TWS_DRIVER_VERSION_STRING "10.80.00.001"
68 #define TWS_MAX_NUM_UNITS             65
69 #define TWS_MAX_NUM_LUNS              16
70 #define TWS_MAX_IRQS                  2
71 #define TWS_SCSI_INITIATOR_ID         66
72 #define TWS_MAX_IO_SIZE               0x20000 /* 128kB */
73 #define TWS_SECTOR_SIZE               0x200
74 #define TWS_POLL_TIMEOUT              60
75 #define TWS_IO_TIMEOUT                60
76 #define TWS_RESET_TIMEOUT             60
77
78 #define TWS_PCI_BAR0                  0x10
79 #define TWS_PCI_BAR1                  0x14
80 #define TWS_PCI_BAR2                  0x1C
81
82 #define TWS_VENDOR_ID                 0x13C1
83 #define TWS_DEVICE_ID                 0x1010
84
85 #define TWS_INVALID_REQID             0xFFFF
86
87 /* bus tag related */
88 #define TWS_ALIGNMENT                 4
89 #define TWS_IN_MF_ALIGNMENT           16
90 #define TWS_OUT_MF_ALIGNMENT          4
91
92 #define TWS_MAX_32BIT_SG_ELEMENTS     93     /* max 32-bit sg elements */
93 #define TWS_MAX_64BIT_SG_ELEMENTS     46     /* max 64-bit sg elements */
94
95 #define TWS_MAX_QS                    4
96 #define TWS_MAX_REQS                  256
97 #define TWS_RESERVED_REQS             4
98
99 /* Request states */
100 #define TWS_REQ_STATE_TRAN            0
101 #define TWS_REQ_STATE_FREE            1
102 #define TWS_REQ_STATE_PENDING         2
103 #define TWS_REQ_STATE_BUSY            3
104 #define TWS_REQ_STATE_COMPLETE        4
105
106 /* Request types */
107 #define TWS_INTERNAL_CMD_REQ          0x0
108 #define TWS_AEN_FETCH_REQ             0x1
109 #define TWS_PASSTHRU_REQ              0x2
110 #define TWS_GETSET_PARAM_REQ          0x3
111 #define TWS_SCSI_IO_REQ               0x4
112
113 /* Driver states */
114
115 enum tws_states {
116     TWS_INIT=50,
117     TWS_UNINIT,
118     TWS_OFFLINE,
119     TWS_ONLINE,
120     TWS_RESET,
121 };
122
123 /* events */
124
125 enum tws_events {
126     TWS_INIT_START=100,
127     TWS_INIT_COMPLETE,
128     TWS_UNINIT_START,
129     TWS_RESET_START,
130     TWS_RESET_COMPLETE,
131     TWS_SCAN_FAILURE,
132 };
133
134 enum tws_req_flags {
135     TWS_DIR_UNKNOWN = 0x1,
136     TWS_DIR_IN = 0x2,
137     TWS_DIR_OUT = 0x4,
138     TWS_DIR_NONE = 0x8,
139 };
140
141 enum tws_intrs {
142      TWS_INTx,
143      TWS_MSI,
144      TWS_MSIX,
145 };
146
147 struct tws_msix_info {
148     int tbl_res_id;
149     bus_space_tag_t tbl_tag;
150     bus_space_handle_t tbl_handle;
151     struct resource *tbl_res;
152 };
153
154 struct tws_ioctl_lock {
155     u_int32_t       lock;
156     time_t          timeout;
157 };
158
159
160 #define TWS_TRACE_FNAME_LEN  10
161 #define TWS_TRACE_FUNC_LEN   15
162 #define TWS_TRACE_DESC_LEN   10
163 struct tws_trace_rec {
164     struct timespec ts;
165     char fname[TWS_TRACE_FNAME_LEN];
166     char func[TWS_TRACE_FUNC_LEN];
167     int linenum;
168     char desc[TWS_TRACE_DESC_LEN];
169     u_int64_t val1;
170     u_int64_t val2;
171 };
172
173 struct tws_circular_q {
174     volatile int16_t head;
175     volatile int16_t tail;
176     u_int16_t depth;
177     u_int8_t  overflow;
178     void *    q;
179 };
180
181
182
183 struct tws_stats {
184     u_int64_t reqs_in;
185     u_int64_t reqs_out;
186     u_int64_t reqs_errored;
187     u_int64_t spurios_intrs;
188     u_int64_t num_intrs;
189     u_int64_t num_aens;
190     u_int64_t ioctls;
191     u_int64_t scsi_ios;
192 };
193
194 struct tws_init_connect_info {
195     u_int16_t     working_srl;
196     u_int16_t     working_branch;
197     u_int16_t     working_build;
198     u_int16_t     fw_on_ctlr_srl;
199     u_int16_t     fw_on_ctlr_branch;
200     u_int16_t     fw_on_ctlr_build;
201
202 };
203
204
205 /* ------------ boolean types ------------------- */
206
207 /* typedef enum _boolean { false, true } boolean; */
208 #define boolean _Bool
209 enum err { SUCCESS, FAILURE };
210
211 /* ----------- per instance data ---------------- */
212
213 /* The softc holds our per-instance data. */
214 struct tws_softc {
215     device_t    tws_dev;                  /* bus device */
216     struct cdev *tws_cdev;                /* controller device */
217     u_int32_t   device_id;                /* device id */
218     u_int32_t   subvendor_id;             /* device id */
219     u_int32_t   subdevice_id;             /* device id */
220     u_int8_t    tws_state;                /* driver state */
221     u_int8_t    tws_prev_state;           /* driver prev state */
222     struct sysctl_ctx_list tws_clist;     /* sysctl context */
223     struct sysctl_oid *tws_oidp;          /* sysctl context */
224     struct resource *reg_res;             /* register interface window */
225     struct resource *mfa_res;             /* mfa interface window */
226     int reg_res_id;                       /* register resource id */
227     int mfa_res_id;                       /* register resource id */
228     bus_space_handle_t bus_handle;        /* bus space handle */
229     bus_space_handle_t bus_mfa_handle;     /* bus space handle */
230     bus_space_tag_t bus_tag;              /* bus space tag */
231     bus_space_tag_t bus_mfa_tag;          /* bus space tag for mfa's */
232     u_int64_t mfa_base;                   /* mfa base address */
233     struct resource *irq_res[TWS_MAX_IRQS];/* interrupt resource */
234     int irq_res_id[TWS_MAX_IRQS];         /* intr resource id */
235     void *intr_handle[TWS_MAX_IRQS];      /* interrupt handle */
236     int irqs;                             /* intrs used */
237     struct tws_msix_info msix;            /* msix info */
238     struct cam_sim *sim;                  /* sim for this controller */
239     struct cam_path *path;                /* Ctlr path to CAM */
240     struct lock q_lock;                   /* queue lock */
241     struct lock sim_lock;                 /* sim lock */
242     struct lock gen_lock;                 /* general driver  lock */
243     struct lock io_lock;                  /* IO  lock */
244     struct tws_ioctl_lock ioctl_lock;     /* ioctl lock */
245     u_int32_t seq_id;                     /* Sequence id */
246     int chan;                             /* wait channel */
247     struct tws_circular_q aen_q;          /* aen q */
248     struct tws_circular_q trace_q;        /* trace q */
249     struct tws_stats stats;               /* I/O stats */
250     struct tws_init_connect_info cinfo;   /* compatibility info */
251     boolean is64bit;                      /* True - 64bit else 32bit */
252     u_int8_t intr_type;                   /* Interrupt type used */
253     bus_dma_tag_t parent_tag;             /* parent DMA tag */
254     bus_dma_tag_t cmd_tag;                /* command DMA tag */
255     bus_dmamap_t cmd_map;                 /* command map */
256     void *dma_mem;                        /* pointer to dmable memory */
257     u_int64_t dma_mem_phys;               /* phy addr */
258     bus_dma_tag_t data_tag;               /* data DMA tag */
259     struct tws_request *reqs;             /* pointer to requests */
260     struct tws_sense *sense_bufs;         /* pointer to sense buffers */
261     boolean obfl_q_overrun;               /* OBFL overrun flag  */
262     union ccb *scan_ccb;                  /* pointer to a ccb */
263     struct tws_request *q_head[TWS_MAX_QS]; /* head pointers to q's */
264     struct tws_request *q_tail[TWS_MAX_QS]; /* tail pointers to q's */
265
266     struct callout print_stats_handle;
267     struct callout reset_cb_handle;
268     struct callout reinit_handle;
269 };