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$
35 */
36
37
38/* #define TWS_DEBUG on */
39
40void tws_trace(const char *file, const char *fun, int linenum,
41         struct tws_softc *sc,  char *desc, u_int64_t val1, u_int64_t val2);
42void tws_log(struct tws_softc *sc, int index);
43u_int32_t tws_read_reg(struct tws_softc *sc,
44                  int offset, int size);
45void tws_write_reg(struct tws_softc *sc, int offset,
46                  u_int32_t value, int size);
47
48u_int16_t tws_swap16(u_int16_t val);
49u_int32_t tws_swap32(u_int32_t val);
50u_int64_t tws_swap64(u_int64_t val);
51
52void tws_init_qs(struct tws_softc *sc);
53
54
55
56/* ----------------- trace ----------------- */
57
58#define TWS_TRACE_ON on /* Alawys on - use wisely to trace errors */
59
60#ifdef TWS_DEBUG
61    #define TWS_TRACE_DEBUG_ON on
62#endif
63
64#ifdef TWS_TRACE_DEBUG_ON
65    #define TWS_TRACE_DEBUG(sc, desc, val1, val2) \
66            tws_trace(__FILE__, __func__, __LINE__, sc, desc, \
67                                   (u_int64_t)val1, (u_int64_t)val2)
68#else
69    #define TWS_TRACE_DEBUG(sc, desc, val1, val2)
70#endif
71
72#ifdef TWS_TRACE_ON
73    #define TWS_TRACE(sc, desc, val1, val2) \
74            tws_trace(__FILE__, __func__, __LINE__, sc, desc, \
75                                   (u_int64_t)val1, (u_int64_t)val2)
76#else
77    #define TWS_TRACE(sc, desc, val1, val2)
78#endif
79
80/* ---------------- logging ---------------- */
81
82
83/* ---------------- logging ---------------- */
84enum error_index {
85    SYSCTL_TREE_NODE_ADD,
86    PCI_COMMAND_READ,
87    ALLOC_MEMORY_RES,
88    ALLOC_IRQ_RES,
89    SETUP_INTR_RES,
90    TWS_CAM_ATTACH,
91    CAM_SIMQ_ALLOC,
92    CAM_SIM_ALLOC,
93    TWS_XPT_BUS_REGISTER,
94    TWS_XPT_CREATE_PATH,
95    TWS_BUS_SCAN_REQ,
96    TWS_INIT_FAILURE,
97    TWS_CTLR_INIT_FAILURE,
98};
99
100enum severity {
101    ERROR = 1,
102    WARNING,
103    INFO,
104#if 0
105    DEBUG,
106#endif
107};
108
109struct error_desc {
110    char desc[256];
111    u_int32_t error_code;
112    int severity_level;
113    char *fmt;
114    char *error_str;
115};
116
117/* ----------- q services ------------- */
118
119#define TWS_FREE_Q        0
120#define TWS_PENDING_Q     1
121#define TWS_BUSY_Q        2
122#define TWS_COMPLETE_Q    3
123
124/* req return codes */
125#define TWS_REQ_RET_SUBMIT_SUCCESS 0
126#define TWS_REQ_RET_PEND_NOMFA     1
127#define TWS_REQ_RET_RESET          2
128#define TWS_REQ_RET_INVALID   0xdead
129
130
131/* ------------------------ */
132#if (__FreeBSD_version >= 700000)
133#include <sys/clock.h>
134#define TWS_LOCAL_TIME (time_second - utc_offset())
135#else
136#include <machine/clock.h>
137#define TWS_LOCAL_TIME (time_second - (tz_minuteswest * 60) -   \
138                  (wall_cmos_clock ? adjkerntz : 0))
139#endif
140
141