1 /*
2  * $Id: sbecom_inline_linux.h,v 1.2 2007/08/15 22:51:35 rickd PMCC4_3_1B $
3  */
4 
5 #ifndef _INC_SBECOM_INLNX_H_
6 #define _INC_SBECOM_INLNX_H_
7 
8 /*-----------------------------------------------------------------------------
9  * sbecom_inline_linux.h - SBE common Linux inlined routines
10  *
11  * Copyright (C) 2007  One Stop Systems, Inc.
12  * Copyright (C) 2005  SBE, Inc.
13  *
14  *   This program is free software; you can redistribute it and/or modify
15  *   it under the terms of the GNU General Public License as published by
16  *   the Free Software Foundation; either version 2 of the License, or
17  *   (at your option) any later version.
18  *
19  *   This program is distributed in the hope that it will be useful,
20  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
21  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  *   GNU General Public License for more details.
23  *
24  * For further information, contact via email: support@onestopsystems.com
25  * One Stop Systems, Inc.  Escondido, California  U.S.A.
26  *-----------------------------------------------------------------------------
27  * RCS info:
28  * RCS revision: $Revision: 1.2 $
29  * Last changed on $Date: 2007/08/15 22:51:35 $
30  * Changed by $Author: rickd $
31  *-----------------------------------------------------------------------------
32  * $Log: sbecom_inline_linux.h,v $
33  * Revision 1.2  2007/08/15 22:51:35  rickd
34  * Remove duplicate version.h entry.
35  *
36  * Revision 1.1  2007/08/15 22:50:29  rickd
37  * Update linux/config for 2.6.18 and later.
38  *
39  * Revision 1.0  2005/09/28 00:10:09  rickd
40  * Initial revision
41  *
42  *-----------------------------------------------------------------------------
43  */
44 
45 
46 #if defined (__FreeBSD__) || defined (__NetBSD__)
47 #include <sys/types.h>
48 #else
49 #include <linux/types.h>
50 #include <linux/version.h>
51 #if defined(CONFIG_SMP) && ! defined(__SMP__)
52 #define __SMP__
53 #endif
54 #if defined(CONFIG_MODVERSIONS) && defined(MODULE) && ! defined(MODVERSIONS)
55 #define MODVERSIONS
56 #endif
57 
58 #ifdef MODULE
59 #ifdef MODVERSIONS
60 #include <config/modversions.h>
61 #endif
62 #include <linux/module.h>
63 #endif
64 #endif
65 
66 #include <linux/kernel.h>       /* resolves kmalloc references */
67 #include <linux/skbuff.h>       /* resolves skb references */
68 #include <linux/netdevice.h>    /* resolves dev_kree_skb_any */
69 #include <asm/byteorder.h>      /* resolves cpu_to_le32 */
70 
71 #if 0
72 
73 /*** PORT POINT WARNING
74  ***
75  *** Under Linux 2.6 it has been found that compiler is re-ordering
76  *** in-lined pci_write_32() functions to the detrement of correct
77  *** hardware setup.  Therefore, inlining of PCI accesses has been
78  *** de-implemented, and subroutine calls have been implemented.
79  ***/
80 
81 static inline u_int32_t
82 pci_read_32 (u_int32_t *p)
83 {
84 #ifdef FLOW_DEBUG
85     u_int32_t   v;
86 
87     FLUSH_PCI_READ ();
88     v = le32_to_cpu (*p);
89     if (cxt1e1_log_level >= LOG_DEBUG)
90         pr_info("pci_read : %x = %x\n", (u_int32_t) p, v);
91     return v;
92 #else
93                 FLUSH_PCI_READ ();      /* */
94     return le32_to_cpu (*p);
95 #endif
96 }
97 
98 static inline void
99 pci_write_32 (u_int32_t *p, u_int32_t v)
100 {
101 #ifdef FLOW_DEBUG
102     if (cxt1e1_log_level >= LOG_DEBUG)
103         pr_info("pci_write: %x = %x\n", (u_int32_t) p, v);
104 #endif
105     *p = cpu_to_le32 (v);
106     FLUSH_PCI_WRITE ();             /* This routine is called from routines
107                                      * which do multiple register writes
108                                      * which themselves need flushing between
109                                      * writes in order to guarantee write
110                                      * ordering.  It is less code-cumbersome
111                                      * to flush here-in then to investigate
112                                      * and code the many other register
113                                      * writing routines. */
114 }
115 #else
116 /* forward reference */
117 u_int32_t   pci_read_32 (u_int32_t *p);
118 void        pci_write_32 (u_int32_t *p, u_int32_t v);
119 
120 #endif
121 
122 
123 /*
124  * system dependent callbacks
125  */
126 
127 /**********/
128 /* malloc */
129 /**********/
130 
131 static inline void *
OS_kmalloc(size_t size)132 OS_kmalloc (size_t size)
133 {
134     char       *ptr = kmalloc (size, GFP_KERNEL | GFP_DMA);
135 
136     if (ptr)
137         memset (ptr, 0, size);
138     return ptr;
139 }
140 
141 static inline void
OS_kfree(void * x)142 OS_kfree (void *x)
143 {
144     kfree (x);
145 }
146 
147 
148 /****************/
149 /* memory token */
150 /****************/
151 
152 static inline void *
OS_mem_token_alloc(size_t size)153 OS_mem_token_alloc (size_t size)
154 {
155     struct sk_buff *skb;
156 
157     skb = dev_alloc_skb (size);
158     if (!skb)
159     {
160         //pr_warning("no mem in OS_mem_token_alloc !\n");
161         return 0;
162     }
163     return skb;
164 }
165 
166 
167 static inline void
OS_mem_token_free(void * token)168 OS_mem_token_free (void *token)
169 {
170     dev_kfree_skb_any (token);
171 }
172 
173 
174 static inline void
OS_mem_token_free_irq(void * token)175 OS_mem_token_free_irq (void *token)
176 {
177     dev_kfree_skb_irq (token);
178 }
179 
180 
181 static inline void *
OS_mem_token_data(void * token)182 OS_mem_token_data (void *token)
183 {
184     return ((struct sk_buff *) token)->data;
185 }
186 
187 
188 static inline void *
OS_mem_token_next(void * token)189 OS_mem_token_next (void *token)
190 {
191     return 0;
192 }
193 
194 
195 static inline int
OS_mem_token_len(void * token)196 OS_mem_token_len (void *token)
197 {
198     return ((struct sk_buff *) token)->len;
199 }
200 
201 
202 static inline int
OS_mem_token_tlen(void * token)203 OS_mem_token_tlen (void *token)
204 {
205     return ((struct sk_buff *) token)->len;
206 }
207 
208 
209 /***************************************/
210 /* virtual to physical addr conversion */
211 /***************************************/
212 
213 static inline u_long
OS_phystov(void * addr)214 OS_phystov (void *addr)
215 {
216     return (u_long) __va (addr);
217 }
218 
219 
220 static inline u_long
OS_vtophys(void * addr)221 OS_vtophys (void *addr)
222 {
223     return __pa (addr);
224 }
225 
226 
227 /**********/
228 /* semops */
229 /**********/
230 
231 void        OS_sem_init (void *, int);
232 
233 
234 static inline void
OS_sem_free(void * sem)235 OS_sem_free (void *sem)
236 {
237     /*
238      * NOOP - since semaphores structures predeclared w/in structures, no
239      * longer malloc'd
240      */
241 }
242 
243 #define SD_SEM_TAKE(sem,desc)  down(sem)
244 #define SD_SEM_GIVE(sem)       up(sem)
245 #define SEM_AVAILABLE     1
246 #define SEM_TAKEN         0
247 
248 
249 /**********************/
250 /* watchdog functions */
251 /**********************/
252 
253 struct watchdog
254 {
255     struct timer_list h;
256     struct work_struct work;
257     void       *softc;
258     void        (*func) (void *softc);
259     int         ticks;
260     int         init_tq;
261 };
262 
263 
264 static inline int
OS_start_watchdog(struct watchdog * wd)265 OS_start_watchdog (struct watchdog * wd)
266 {
267     wd->h.expires = jiffies + wd->ticks;
268     add_timer (&wd->h);
269     return 0;
270 }
271 
272 
273 static inline int
OS_stop_watchdog(struct watchdog * wd)274 OS_stop_watchdog (struct watchdog * wd)
275 {
276     del_timer_sync (&wd->h);
277     return 0;
278 }
279 
280 
281 static inline int
OS_free_watchdog(struct watchdog * wd)282 OS_free_watchdog (struct watchdog * wd)
283 {
284     OS_stop_watchdog (wd);
285     OS_kfree (wd);
286     return 0;
287 }
288 
289 
290 /* sleep in microseconds */
291 void        OS_uwait (int usec, char *description);
292 void        OS_uwait_dummy (void);
293 
294 
295 /* watchdog functions */
296 int OS_init_watchdog(struct watchdog *wdp, void (*f) (void *), void *ci, int usec);
297 
298 
299 #endif                          /*** _INC_SBECOM_INLNX_H_ ***/
300