]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/dev/twa/tw_osl_inline.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / dev / twa / tw_osl_inline.h
1 /*
2  * Copyright (c) 2004-07 Applied Micro Circuits Corporation.
3  * Copyright (c) 2004-05 Vinod Kashyap.
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  *
27  *      $FreeBSD$
28  */
29
30 /*
31  * AMCC'S 3ware driver for 9000 series storage controllers.
32  *
33  * Author: Vinod Kashyap
34  * Modifications by: Adam Radford
35  */
36
37
38
39 #ifndef TW_OSL_INLINE_H
40
41 #define TW_OSL_INLINE_H
42
43
44 /*
45  * Inline functions shared between OSL and CL, and defined by OSL.
46  */
47
48
49 #include <dev/twa/tw_osl.h>
50
51
52
53 /*
54  * Function name:       tw_osl_init_lock
55  * Description:         Initializes a lock.
56  *
57  * Input:               ctlr_handle     -- ptr to controller handle
58  *                      lock_name       -- string indicating name of the lock
59  * Output:              lock            -- ptr to handle to the initialized lock
60  * Return value:        None
61  */
62 #define tw_osl_init_lock(ctlr_handle, lock_name, lock)  \
63         mtx_init(lock, lock_name, NULL, MTX_SPIN)
64
65
66
67 /*
68  * Function name:       tw_osl_destroy_lock
69  * Description:         Destroys a previously initialized lock.
70  *
71  * Input:               ctlr_handle     -- ptr to controller handle
72  *                      lock            -- ptr to handle to the lock to be
73  *                                              destroyed
74  * Output:              None
75  * Return value:        None
76  */
77 #define tw_osl_destroy_lock(ctlr_handle, lock)  \
78         mtx_destroy(lock)
79
80
81
82 /*
83  * Function name:       tw_osl_get_lock
84  * Description:         Acquires the specified lock.
85  *
86  * Input:               ctlr_handle     -- ptr to controller handle
87  *                      lock            -- ptr to handle to the lock to be
88  *                                              acquired
89  * Output:              None
90  * Return value:        None
91  */
92 #define tw_osl_get_lock(ctlr_handle, lock)      \
93         mtx_lock_spin(lock)
94
95
96
97 /*
98  * Function name:       tw_osl_free_lock
99  * Description:         Frees a previously acquired lock.
100  *
101  * Input:               ctlr_handle     -- ptr to controller handle
102  *                      lock            -- ptr to handle to the lock to be freed
103  * Output:              None
104  * Return value:        None
105  */
106 #define tw_osl_free_lock(ctlr_handle, lock)     \
107         mtx_unlock_spin(lock)
108
109
110
111 #ifdef TW_OSL_DEBUG
112
113 /*
114  * Function name:       tw_osl_dbg_printf
115  * Description:         Prints passed info (prefixed by ctlr name)to syslog
116  *
117  * Input:               ctlr_handle -- controller handle
118  *                      fmt -- format string for the arguments to follow
119  *                      ... -- variable number of arguments, to be printed
120  *                              based on the fmt string
121  * Output:              None
122  * Return value:        Number of bytes printed
123  */
124 #define tw_osl_dbg_printf(ctlr_handle, fmt, args...)                    \
125         twa_printf((ctlr_handle->osl_ctlr_ctxt), fmt, ##args)
126
127 #endif /* TW_OSL_DEBUG */
128
129
130
131 /*
132  * Function name:       tw_osl_notify_event
133  * Description:         Prints passed event info (prefixed by ctlr name)
134  *                      to syslog
135  *
136  * Input:               ctlr_handle -- controller handle
137  *                      event -- ptr to a packet describing the event/error
138  * Output:              None
139  * Return value:        None
140  */
141 #define tw_osl_notify_event(ctlr_handle, event)                         \
142         twa_printf((ctlr_handle->osl_ctlr_ctxt),                        \
143                 "%s: (0x%02X: 0x%04X): %s: %s\n",                       \
144                 event->severity_str,                                    \
145                 event->event_src,                                       \
146                 event->aen_code,                                        \
147                 event->parameter_data +                                 \
148                         strlen(event->parameter_data) + 1,              \
149                 event->parameter_data)
150
151
152
153 /*
154  * Function name:       tw_osl_read_reg
155  * Description:         Reads a register on the controller
156  *
157  * Input:               ctlr_handle -- controller handle
158  *                      offset -- offset from Base Address
159  *                      size -- # of bytes to read
160  * Output:              None
161  * Return value:        Value read
162  */
163 #define tw_osl_read_reg         tw_osl_read_reg_inline
164 static __inline TW_UINT32
165 tw_osl_read_reg_inline(struct tw_cl_ctlr_handle *ctlr_handle,
166         TW_INT32 offset, TW_INT32 size)
167 {
168         bus_space_tag_t         bus_tag =
169                 ((struct twa_softc *)(ctlr_handle->osl_ctlr_ctxt))->bus_tag;
170         bus_space_handle_t      bus_handle =
171                 ((struct twa_softc *)(ctlr_handle->osl_ctlr_ctxt))->bus_handle;
172
173         if (size == 4)
174                 return((TW_UINT32)bus_space_read_4(bus_tag, bus_handle,
175                         offset));
176         else if (size == 2)
177                 return((TW_UINT32)bus_space_read_2(bus_tag, bus_handle,
178                         offset));
179         else
180                 return((TW_UINT32)bus_space_read_1(bus_tag, bus_handle,
181                         offset));
182 }
183
184
185
186 /*
187  * Function name:       tw_osl_write_reg
188  * Description:         Writes to a register on the controller
189  *
190  * Input:               ctlr_handle -- controller handle
191  *                      offset -- offset from Base Address
192  *                      value -- value to write
193  *                      size -- # of bytes to write
194  * Output:              None
195  * Return value:        None
196  */
197 #define tw_osl_write_reg        tw_osl_write_reg_inline
198 static __inline TW_VOID
199 tw_osl_write_reg_inline(struct tw_cl_ctlr_handle *ctlr_handle,
200         TW_INT32 offset, TW_INT32 value, TW_INT32 size)
201 {
202         bus_space_tag_t         bus_tag =
203                 ((struct twa_softc *)(ctlr_handle->osl_ctlr_ctxt))->bus_tag;
204         bus_space_handle_t      bus_handle =
205                 ((struct twa_softc *)(ctlr_handle->osl_ctlr_ctxt))->bus_handle;
206
207         if (size == 4)
208                 bus_space_write_4(bus_tag, bus_handle, offset, value);
209         else if (size == 2)
210                 bus_space_write_2(bus_tag, bus_handle, offset, (TW_INT16)value);
211         else
212                 bus_space_write_1(bus_tag, bus_handle, offset, (TW_INT8)value);
213 }
214
215
216
217 #ifdef TW_OSL_PCI_CONFIG_ACCESSIBLE
218
219 /*
220  * Function name:       tw_osl_read_pci_config
221  * Description:         Reads from the PCI config space.
222  *
223  * Input:               sc      -- ptr to per ctlr structure
224  *                      offset  -- register offset
225  *                      size    -- # of bytes to be read
226  * Output:              None
227  * Return value:        Value read
228  */
229 #define tw_osl_read_pci_config(ctlr_handle, offset, size)               \
230         pci_read_config(                                                \
231                 ((struct twa_softc *)(ctlr_handle->osl_ctlr_ctxt))->bus_dev, \
232                 offset, size)
233
234
235
236 /*
237  * Function name:       tw_osl_write_pci_config
238  * Description:         Writes to the PCI config space.
239  *
240  * Input:               sc      -- ptr to per ctlr structure
241  *                      offset  -- register offset
242  *                      value   -- value to write
243  *                      size    -- # of bytes to be written
244  * Output:              None
245  * Return value:        None
246  */
247 #define tw_osl_write_pci_config(ctlr_handle, offset, value, size)       \
248         pci_write_config(                                               \
249                 ((struct twa_softc *)(ctlr_handle->osl_ctlr_ctxt))->bus_dev, \
250                 offset/*PCIR_STATUS*/, value, size)
251
252 #endif /* TW_OSL_PCI_CONFIG_ACCESSIBLE */
253
254
255
256 /*
257  * Function name:       tw_osl_get_local_time
258  * Description:         Gets the local time
259  *
260  * Input:               None
261  * Output:              None
262  * Return value:        local time
263  */
264 #define tw_osl_get_local_time()                                         \
265         (time_second - utc_offset())
266
267
268 /*
269  * Function name:       tw_osl_delay
270  * Description:         Spin for the specified time
271  *
272  * Input:               usecs -- micro-seconds to spin
273  * Output:              None
274  * Return value:        None
275  */
276 #define tw_osl_delay(usecs)     DELAY(usecs)
277
278
279
280 #ifdef TW_OSL_CAN_SLEEP
281
282 /*
283  * Function name:       tw_osl_sleep
284  * Description:         Sleep for the specified time, or until woken up
285  *
286  * Input:               ctlr_handle -- controller handle
287  *                      sleep_handle -- handle to sleep on
288  *                      timeout -- time period (in ms) to sleep
289  * Output:              None
290  * Return value:        0 -- successfully woken up
291  *                      EWOULDBLOCK -- time out
292  *                      ERESTART -- woken up by a signal
293  */
294 #define tw_osl_sleep(ctlr_handle, sleep_handle, timeout)                \
295         tsleep((TW_VOID *)sleep_handle, PRIBIO, NULL, timeout)
296
297
298
299 /*
300  * Function name:       tw_osl_wakeup
301  * Description:         Wake up a sleeping process
302  *
303  * Input:               ctlr_handle -- controller handle
304  *                      sleep_handle -- handle of sleeping process to be
305                                         woken up
306  * Output:              None
307  * Return value:        None
308  */
309 #define tw_osl_wakeup(ctlr_handle, sleep_handle)                        \
310         wakeup_one(sleep_handle)
311
312 #endif /* TW_OSL_CAN_SLEEP */
313
314
315
316 /* Allows setting breakpoints in the CL code for debugging purposes. */
317 #define tw_osl_breakpoint()             breakpoint()
318
319
320 /* Text name of current function. */
321 #define tw_osl_cur_func()               __func__
322
323
324 /* Copy 'size' bytes from 'src' to 'dest'. */
325 #define tw_osl_memcpy(dest, src, size)  bcopy(src, dest, size)
326
327
328 /* Zero 'size' bytes starting at 'addr'. */
329 #define tw_osl_memzero                  bzero
330
331
332 /* Standard sprintf. */
333 #define tw_osl_sprintf                  sprintf
334
335
336 /* Copy string 'src' to 'dest'. */
337 #define tw_osl_strcpy                   strcpy
338
339
340 /* Return length of string pointed at by 'str'. */
341 #define tw_osl_strlen                   strlen
342
343
344 /* Standard vsprintf. */
345 #define tw_osl_vsprintf                 vsprintf
346
347
348
349 #endif /* TW_OSL_INLINE_H */