xref: /OK3568_Linux_fs/kernel/drivers/scsi/dpt/osd_util.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*	BSDI osd_util.h,v 1.8 1998/06/03 19:14:58 karels Exp	*/
2*4882a593Smuzhiyun 
3*4882a593Smuzhiyun /*
4*4882a593Smuzhiyun  * Copyright (c) 1996-1999 Distributed Processing Technology Corporation
5*4882a593Smuzhiyun  * All rights reserved.
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Redistribution and use in source form, with or without modification, are
8*4882a593Smuzhiyun  * permitted provided that redistributions of source code must retain the
9*4882a593Smuzhiyun  * above copyright notice, this list of conditions and the following disclaimer.
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * This software is provided `as is' by Distributed Processing Technology and
12*4882a593Smuzhiyun  * any express or implied warranties, including, but not limited to, the
13*4882a593Smuzhiyun  * implied warranties of merchantability and fitness for a particular purpose,
14*4882a593Smuzhiyun  * are disclaimed. In no event shall Distributed Processing Technology be
15*4882a593Smuzhiyun  * liable for any direct, indirect, incidental, special, exemplary or
16*4882a593Smuzhiyun  * consequential damages (including, but not limited to, procurement of
17*4882a593Smuzhiyun  * substitute goods or services; loss of use, data, or profits; or business
18*4882a593Smuzhiyun  * interruptions) however caused and on any theory of liability, whether in
19*4882a593Smuzhiyun  * contract, strict liability, or tort (including negligence or otherwise)
20*4882a593Smuzhiyun  * arising in any way out of the use of this driver software, even if advised
21*4882a593Smuzhiyun  * of the possibility of such damage.
22*4882a593Smuzhiyun  *
23*4882a593Smuzhiyun  */
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #ifndef         __OSD_UTIL_H
26*4882a593Smuzhiyun #define         __OSD_UTIL_H
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun /*File - OSD_UTIL.H
29*4882a593Smuzhiyun  ****************************************************************************
30*4882a593Smuzhiyun  *
31*4882a593Smuzhiyun  *Description:
32*4882a593Smuzhiyun  *
33*4882a593Smuzhiyun  *      This file contains defines and function prototypes that are
34*4882a593Smuzhiyun  *operating system dependent.  The resources defined in this file
35*4882a593Smuzhiyun  *are not specific to any particular application.
36*4882a593Smuzhiyun  *
37*4882a593Smuzhiyun  *Copyright Distributed Processing Technology, Corp.
38*4882a593Smuzhiyun  *        140 Candace Dr.
39*4882a593Smuzhiyun  *        Maitland, Fl. 32751   USA
40*4882a593Smuzhiyun  *        Phone: (407) 830-5522  Fax: (407) 260-5366
41*4882a593Smuzhiyun  *        All Rights Reserved
42*4882a593Smuzhiyun  *
43*4882a593Smuzhiyun  *Author:       Doug Anderson
44*4882a593Smuzhiyun  *Date:         1/7/94
45*4882a593Smuzhiyun  *
46*4882a593Smuzhiyun  *Editors:
47*4882a593Smuzhiyun  *
48*4882a593Smuzhiyun  *Remarks:
49*4882a593Smuzhiyun  *
50*4882a593Smuzhiyun  *
51*4882a593Smuzhiyun  *****************************************************************************/
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun /*Definitions - Defines & Constants ----------------------------------------- */
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun /*----------------------------- */
57*4882a593Smuzhiyun /* Operating system selections: */
58*4882a593Smuzhiyun /*----------------------------- */
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun /*#define               _DPT_MSDOS      */
61*4882a593Smuzhiyun /*#define               _DPT_WIN_3X     */
62*4882a593Smuzhiyun /*#define               _DPT_WIN_4X     */
63*4882a593Smuzhiyun /*#define               _DPT_WIN_NT     */
64*4882a593Smuzhiyun /*#define               _DPT_NETWARE    */
65*4882a593Smuzhiyun /*#define               _DPT_OS2        */
66*4882a593Smuzhiyun /*#define               _DPT_SCO        */
67*4882a593Smuzhiyun /*#define               _DPT_UNIXWARE   */
68*4882a593Smuzhiyun /*#define               _DPT_SOLARIS    */
69*4882a593Smuzhiyun /*#define               _DPT_NEXTSTEP   */
70*4882a593Smuzhiyun /*#define               _DPT_BANYAN     */
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun /*-------------------------------- */
73*4882a593Smuzhiyun /* Include the OS specific defines */
74*4882a593Smuzhiyun /*-------------------------------- */
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun /*#define       OS_SELECTION    From Above List */
77*4882a593Smuzhiyun /*#define       SEMAPHORE_T     ??? */
78*4882a593Smuzhiyun /*#define       DLL_HANDLE_T    ??? */
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun #if (defined(KERNEL) && (defined(__FreeBSD__) || defined(__bsdi__)))
81*4882a593Smuzhiyun # include        "i386/isa/dpt_osd_defs.h"
82*4882a593Smuzhiyun #else
83*4882a593Smuzhiyun # include        "osd_defs.h"
84*4882a593Smuzhiyun #endif
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun #ifndef DPT_UNALIGNED
87*4882a593Smuzhiyun    #define      DPT_UNALIGNED
88*4882a593Smuzhiyun #endif
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun #ifndef DPT_EXPORT
91*4882a593Smuzhiyun    #define      DPT_EXPORT
92*4882a593Smuzhiyun #endif
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun #ifndef DPT_IMPORT
95*4882a593Smuzhiyun    #define      DPT_IMPORT
96*4882a593Smuzhiyun #endif
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun #ifndef DPT_RUNTIME_IMPORT
99*4882a593Smuzhiyun    #define      DPT_RUNTIME_IMPORT  DPT_IMPORT
100*4882a593Smuzhiyun #endif
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun /*--------------------- */
103*4882a593Smuzhiyun /* OS dependent defines */
104*4882a593Smuzhiyun /*--------------------- */
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun #if defined (_DPT_MSDOS) || defined (_DPT_WIN_3X)
107*4882a593Smuzhiyun    #define      _DPT_16_BIT
108*4882a593Smuzhiyun #else
109*4882a593Smuzhiyun    #define      _DPT_32_BIT
110*4882a593Smuzhiyun #endif
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun #if defined (_DPT_SCO) || defined (_DPT_UNIXWARE) || defined (_DPT_SOLARIS) || defined (_DPT_AIX) || defined (SNI_MIPS) || defined (_DPT_BSDI) || defined (_DPT_FREE_BSD) || defined(_DPT_LINUX)
113*4882a593Smuzhiyun    #define      _DPT_UNIX
114*4882a593Smuzhiyun #endif
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun #if defined (_DPT_WIN_3x) || defined (_DPT_WIN_4X) || defined (_DPT_WIN_NT) \
117*4882a593Smuzhiyun 	    || defined (_DPT_OS2)
118*4882a593Smuzhiyun    #define      _DPT_DLL_SUPPORT
119*4882a593Smuzhiyun #endif
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun #if !defined (_DPT_MSDOS) && !defined (_DPT_WIN_3X) && !defined (_DPT_NETWARE)
122*4882a593Smuzhiyun    #define      _DPT_PREEMPTIVE
123*4882a593Smuzhiyun #endif
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun #if !defined (_DPT_MSDOS) && !defined (_DPT_WIN_3X)
126*4882a593Smuzhiyun    #define      _DPT_MULTI_THREADED
127*4882a593Smuzhiyun #endif
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun #if !defined (_DPT_MSDOS)
130*4882a593Smuzhiyun    #define      _DPT_MULTI_TASKING
131*4882a593Smuzhiyun #endif
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun   /* These exist for platforms that   */
134*4882a593Smuzhiyun   /* chunk when accessing mis-aligned */
135*4882a593Smuzhiyun   /* data                             */
136*4882a593Smuzhiyun #if defined (SNI_MIPS) || defined (_DPT_SOLARIS)
137*4882a593Smuzhiyun    #if defined (_DPT_BIG_ENDIAN)
138*4882a593Smuzhiyun 	#if !defined (_DPT_STRICT_ALIGN)
139*4882a593Smuzhiyun             #define _DPT_STRICT_ALIGN
140*4882a593Smuzhiyun 	#endif
141*4882a593Smuzhiyun    #endif
142*4882a593Smuzhiyun #endif
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun   /* Determine if in C or C++ mode */
145*4882a593Smuzhiyun #ifdef  __cplusplus
146*4882a593Smuzhiyun    #define      _DPT_CPP
147*4882a593Smuzhiyun #else
148*4882a593Smuzhiyun    #define      _DPT_C
149*4882a593Smuzhiyun #endif
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun /*-------------------------------------------------------------------*/
152*4882a593Smuzhiyun /* Under Solaris the compiler refuses to accept code like:           */
153*4882a593Smuzhiyun /*   { {"DPT"}, 0, NULL .... },                                      */
154*4882a593Smuzhiyun /* and complains about the {"DPT"} part by saying "cannot use { }    */
155*4882a593Smuzhiyun /* to initialize char*".                                             */
156*4882a593Smuzhiyun /*                                                                   */
157*4882a593Smuzhiyun /* By defining these ugly macros we can get around this and also     */
158*4882a593Smuzhiyun /* not have to copy and #ifdef large sections of code.  I know that  */
159*4882a593Smuzhiyun /* these macros are *really* ugly, but they should help reduce       */
160*4882a593Smuzhiyun /* maintenance in the long run.                                      */
161*4882a593Smuzhiyun /*                                                                   */
162*4882a593Smuzhiyun /*-------------------------------------------------------------------*/
163*4882a593Smuzhiyun #if !defined (DPTSQO)
164*4882a593Smuzhiyun    #if defined (_DPT_SOLARIS)
165*4882a593Smuzhiyun       #define DPTSQO
166*4882a593Smuzhiyun       #define DPTSQC
167*4882a593Smuzhiyun    #else
168*4882a593Smuzhiyun       #define DPTSQO {
169*4882a593Smuzhiyun       #define DPTSQC }
170*4882a593Smuzhiyun    #endif  /* solaris */
171*4882a593Smuzhiyun #endif  /* DPTSQO */
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun /*---------------------- */
175*4882a593Smuzhiyun /* OS dependent typedefs */
176*4882a593Smuzhiyun /*---------------------- */
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun #if defined (_DPT_MSDOS) || defined (_DPT_SCO)
179*4882a593Smuzhiyun    #define BYTE unsigned char
180*4882a593Smuzhiyun    #define WORD unsigned short
181*4882a593Smuzhiyun #endif
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun #ifndef _DPT_TYPEDEFS
184*4882a593Smuzhiyun    #define _DPT_TYPEDEFS
185*4882a593Smuzhiyun    typedef unsigned char   uCHAR;
186*4882a593Smuzhiyun    typedef unsigned short  uSHORT;
187*4882a593Smuzhiyun    typedef unsigned int    uINT;
188*4882a593Smuzhiyun    typedef unsigned long   uLONG;
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun    typedef union {
191*4882a593Smuzhiyun 	 uCHAR        u8[4];
192*4882a593Smuzhiyun 	 uSHORT       u16[2];
193*4882a593Smuzhiyun 	 uLONG        u32;
194*4882a593Smuzhiyun    } access_U;
195*4882a593Smuzhiyun #endif
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun #if !defined (NULL)
198*4882a593Smuzhiyun    #define      NULL    0
199*4882a593Smuzhiyun #endif
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun /*Prototypes - function ----------------------------------------------------- */
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun #ifdef  __cplusplus
205*4882a593Smuzhiyun    extern "C" {         /* Declare all these functions as "C" functions */
206*4882a593Smuzhiyun #endif
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun /*------------------------ */
209*4882a593Smuzhiyun /* Byte reversal functions */
210*4882a593Smuzhiyun /*------------------------ */
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun   /* Reverses the byte ordering of a 2 byte variable */
213*4882a593Smuzhiyun #if (!defined(osdSwap2))
214*4882a593Smuzhiyun  uSHORT       osdSwap2(DPT_UNALIGNED uSHORT *);
215*4882a593Smuzhiyun #endif  // !osdSwap2
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun   /* Reverses the byte ordering of a 4 byte variable and shifts left 8 bits */
218*4882a593Smuzhiyun #if (!defined(osdSwap3))
219*4882a593Smuzhiyun  uLONG        osdSwap3(DPT_UNALIGNED uLONG *);
220*4882a593Smuzhiyun #endif  // !osdSwap3
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun #ifdef  _DPT_NETWARE
224*4882a593Smuzhiyun    #include "novpass.h" /* For DPT_Bswapl() prototype */
225*4882a593Smuzhiyun 	/* Inline the byte swap */
226*4882a593Smuzhiyun    #ifdef __cplusplus
osdSwap4(uLONG * inLong)227*4882a593Smuzhiyun 	 inline uLONG osdSwap4(uLONG *inLong) {
228*4882a593Smuzhiyun 	 return *inLong = DPT_Bswapl(*inLong);
229*4882a593Smuzhiyun 	 }
230*4882a593Smuzhiyun    #else
231*4882a593Smuzhiyun 	 #define osdSwap4(inLong)       DPT_Bswapl(inLong)
232*4882a593Smuzhiyun    #endif  // cplusplus
233*4882a593Smuzhiyun #else
234*4882a593Smuzhiyun 	/* Reverses the byte ordering of a 4 byte variable */
235*4882a593Smuzhiyun # if (!defined(osdSwap4))
236*4882a593Smuzhiyun    uLONG        osdSwap4(DPT_UNALIGNED uLONG *);
237*4882a593Smuzhiyun # endif  // !osdSwap4
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun   /* The following functions ALWAYS swap regardless of the *
240*4882a593Smuzhiyun    * presence of DPT_BIG_ENDIAN                            */
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun    uSHORT       trueSwap2(DPT_UNALIGNED uSHORT *);
243*4882a593Smuzhiyun    uLONG        trueSwap4(DPT_UNALIGNED uLONG *);
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun #endif  // netware
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun /*-------------------------------------*
249*4882a593Smuzhiyun  * Network order swap functions        *
250*4882a593Smuzhiyun  *                                     *
251*4882a593Smuzhiyun  * These functions/macros will be used *
252*4882a593Smuzhiyun  * by the structure insert()/extract() *
253*4882a593Smuzhiyun  * functions.                          *
254*4882a593Smuzhiyun  *
255*4882a593Smuzhiyun  * We will enclose all structure       *
256*4882a593Smuzhiyun  * portability modifications inside    *
257*4882a593Smuzhiyun  * #ifdefs.  When we are ready, we     *
258*4882a593Smuzhiyun  * will #define DPT_PORTABLE to begin  *
259*4882a593Smuzhiyun  * using the modifications.            *
260*4882a593Smuzhiyun  *-------------------------------------*/
261*4882a593Smuzhiyun uLONG	netSwap4(uLONG val);
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun #if defined (_DPT_BIG_ENDIAN)
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun // for big-endian we need to swap
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun #ifndef NET_SWAP_2
268*4882a593Smuzhiyun #define NET_SWAP_2(x) (((x) >> 8) | ((x) << 8))
269*4882a593Smuzhiyun #endif  // NET_SWAP_2
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun #ifndef NET_SWAP_4
272*4882a593Smuzhiyun #define NET_SWAP_4(x) netSwap4((x))
273*4882a593Smuzhiyun #endif  // NET_SWAP_4
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun #else
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun // for little-endian we don't need to do anything
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun #ifndef NET_SWAP_2
280*4882a593Smuzhiyun #define NET_SWAP_2(x) (x)
281*4882a593Smuzhiyun #endif  // NET_SWAP_2
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun #ifndef NET_SWAP_4
284*4882a593Smuzhiyun #define NET_SWAP_4(x) (x)
285*4882a593Smuzhiyun #endif  // NET_SWAP_4
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun #endif  // big endian
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun /*----------------------------------- */
292*4882a593Smuzhiyun /* Run-time loadable module functions */
293*4882a593Smuzhiyun /*----------------------------------- */
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun   /* Loads the specified run-time loadable DLL */
296*4882a593Smuzhiyun DLL_HANDLE_T    osdLoadModule(uCHAR *);
297*4882a593Smuzhiyun   /* Unloads the specified run-time loadable DLL */
298*4882a593Smuzhiyun uSHORT          osdUnloadModule(DLL_HANDLE_T);
299*4882a593Smuzhiyun   /* Returns a pointer to a function inside a run-time loadable DLL */
300*4882a593Smuzhiyun void *          osdGetFnAddr(DLL_HANDLE_T,uCHAR *);
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun /*--------------------------------------- */
303*4882a593Smuzhiyun /* Mutually exclusive semaphore functions */
304*4882a593Smuzhiyun /*--------------------------------------- */
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun   /* Create a named semaphore */
307*4882a593Smuzhiyun SEMAPHORE_T     osdCreateNamedSemaphore(char *);
308*4882a593Smuzhiyun   /* Create a mutually exlusive semaphore */
309*4882a593Smuzhiyun SEMAPHORE_T     osdCreateSemaphore(void);
310*4882a593Smuzhiyun 	/* create an event semaphore */
311*4882a593Smuzhiyun SEMAPHORE_T              osdCreateEventSemaphore(void);
312*4882a593Smuzhiyun 	/* create a named event semaphore */
313*4882a593Smuzhiyun SEMAPHORE_T             osdCreateNamedEventSemaphore(char *);
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun   /* Destroy the specified mutually exclusive semaphore object */
316*4882a593Smuzhiyun uSHORT          osdDestroySemaphore(SEMAPHORE_T);
317*4882a593Smuzhiyun   /* Request access to the specified mutually exclusive semaphore */
318*4882a593Smuzhiyun uLONG           osdRequestSemaphore(SEMAPHORE_T,uLONG);
319*4882a593Smuzhiyun   /* Release access to the specified mutually exclusive semaphore */
320*4882a593Smuzhiyun uSHORT          osdReleaseSemaphore(SEMAPHORE_T);
321*4882a593Smuzhiyun 	/* wait for a event to happen */
322*4882a593Smuzhiyun uLONG                            osdWaitForEventSemaphore(SEMAPHORE_T, uLONG);
323*4882a593Smuzhiyun 	/* signal an event */
324*4882a593Smuzhiyun uLONG                            osdSignalEventSemaphore(SEMAPHORE_T);
325*4882a593Smuzhiyun 	/* reset the event */
326*4882a593Smuzhiyun uLONG                            osdResetEventSemaphore(SEMAPHORE_T);
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun /*----------------- */
329*4882a593Smuzhiyun /* Thread functions */
330*4882a593Smuzhiyun /*----------------- */
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun   /* Releases control to the task switcher in non-preemptive */
333*4882a593Smuzhiyun   /* multitasking operating systems. */
334*4882a593Smuzhiyun void            osdSwitchThreads(void);
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun   /* Starts a thread function */
337*4882a593Smuzhiyun uLONG   osdStartThread(void *,void *);
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun /* what is my thread id */
340*4882a593Smuzhiyun uLONG osdGetThreadID(void);
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun /* wakes up the specifed thread */
343*4882a593Smuzhiyun void osdWakeThread(uLONG);
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun /* osd sleep for x milliseconds */
346*4882a593Smuzhiyun void osdSleep(uLONG);
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun #define DPT_THREAD_PRIORITY_LOWEST 0x00
349*4882a593Smuzhiyun #define DPT_THREAD_PRIORITY_NORMAL 0x01
350*4882a593Smuzhiyun #define DPT_THREAD_PRIORITY_HIGHEST 0x02
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun uCHAR osdSetThreadPriority(uLONG tid, uCHAR priority);
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun #ifdef __cplusplus
355*4882a593Smuzhiyun    }    /* end the xtern "C" declaration */
356*4882a593Smuzhiyun #endif
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun #endif  /* osd_util_h */
359