• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*************************************************/
2 /* here we define sanei_inb/sanei_outb based on  */
3 /* OS dependent inb/outb definitions             */
4 /* SANE_INB is defined whenever a valid inb/outb */
5 /* definition has been found                     */
6 /*************************************************/
7 
8 #include "../include/sane/config.h"
9 
10 #include <errno.h>
11 #include <stdlib.h>
12 #include <string.h>
13 
14 #include <sys/types.h>
15 
16 #include "../include/sane/sane.h"
17 #include "../include/sane/sanei.h"
18 #include "../include/sane/sanei_directio.h"
19 
20 #ifdef ENABLE_PARPORT_DIRECTIO
21 
22 #define TEST_SANE_INB(val) ( SANE_INB == val )
23 
24 #if ( TEST_SANE_INB(1) )	/* OS/2 EMX case */
25 int
sanei_ioperm(int start,int length,int enable)26 sanei_ioperm (int start, int length, int enable)
27 {
28   if (enable)
29     return _portaccess (port, port + length - 1);
30   return 0;
31 }
32 
33 unsigned char
sanei_inb(unsigned int port)34 sanei_inb (unsigned int port)
35 {
36   return _inp8 (port) & 0xFF;
37 }
38 
39 void
sanei_outb(unsigned int port,unsigned char value)40 sanei_outb (unsigned int port, unsigned char value)
41 {
42   _outp8 (port, value);
43 }
44 
45 void
sanei_insb(unsigned int port,unsigned char * addr,unsigned long count)46 sanei_insb (unsigned int port, unsigned char *addr, unsigned long count)
47 {
48   _inps8 (port, (unsigned char *) addr, count);
49 }
50 
51 void
sanei_insl(unsigned int port,unsigned char * addr,unsigned long count)52 sanei_insl (unsigned int port, unsigned char *addr, unsigned long count)
53 {
54   _inps32 (port, (unsigned long *) addr, count);
55 }
56 
57 void
sanei_outsb(unsigned int port,const unsigned char * addr,unsigned long count)58 sanei_outsb (unsigned int port, const unsigned char *addr,
59 	     unsigned long count)
60 {
61   _outps8 (port, (unsigned char *) addr, count);
62 }
63 
64 void
sanei_outsl(unsigned int port,const unsigned char * addr,unsigned long count)65 sanei_outsl (unsigned int port, const unsigned char *addr,
66 	     unsigned long count)
67 {
68   _outps32 (port, (unsigned long *) addr, count);
69 }
70 #endif /* OS/2 EMX case */
71 
72 
73 
74 #if ( TEST_SANE_INB(2) )	/* FreeBSD case */
75 int
sanei_ioperm(int start,int length,int enable)76 sanei_ioperm (int start, int length, int enable)
77 {
78 #ifdef HAVE_I386_SET_IOPERM
79   return i386_set_ioperm (start, length, enable);
80 #else
81   int fd = 0;
82 
83   /* makes compilers happy */
84   start = length + enable;
85   fd = open ("/dev/io", O_RDONLY);
86   if (fd > 0)
87     return 0;
88   return -1;
89 #endif
90 }
91 
92 unsigned char
sanei_inb(unsigned int port)93 sanei_inb (unsigned int port)
94 {
95   return inb (port);
96 }
97 
98 void
sanei_outb(unsigned int port,unsigned char value)99 sanei_outb (unsigned int port, unsigned char value)
100 {
101   outb (port, value);
102 }
103 
104 void
sanei_insb(unsigned int port,unsigned char * addr,unsigned long count)105 sanei_insb (unsigned int port, unsigned char *addr, unsigned long count)
106 {
107   insb (port, addr, count);
108 }
109 
110 void
sanei_insl(unsigned int port,unsigned char * addr,unsigned long count)111 sanei_insl (unsigned int port, unsigned char *addr, unsigned long count)
112 {
113   insl (port, addr, count);
114 }
115 
116 void
sanei_outsb(unsigned int port,const unsigned char * addr,unsigned long count)117 sanei_outsb (unsigned int port, const unsigned char *addr,
118 	     unsigned long count)
119 {
120   outsb (port, addr, count);
121 }
122 
123 void
sanei_outsl(unsigned int port,const unsigned char * addr,unsigned long count)124 sanei_outsl (unsigned int port, const unsigned char *addr,
125 	     unsigned long count)
126 {
127   outsl (port, addr, count);
128 }
129 #endif /* FreeBSD case */
130 
131 
132 /* linux GCC on i386 */
133 #if ( TEST_SANE_INB(3) )	/* FreeBSD case */
134 
135 int
sanei_ioperm(int start,int length,int enable)136 sanei_ioperm (int start, int length, int enable)
137 {
138 #ifdef HAVE_IOPERM
139   return ioperm (start, length, enable);
140 #else
141   /* linux without ioperm ? hum ... */
142   /* makes compilers happy */
143   start = length + enable;
144   return 0;
145 #endif
146 }
147 
148 unsigned char
sanei_inb(unsigned int port)149 sanei_inb (unsigned int port)
150 {
151   return inb (port);
152 }
153 
154 void
sanei_outb(unsigned int port,unsigned char value)155 sanei_outb (unsigned int port, unsigned char value)
156 {
157   outb (value, port);
158 }
159 
160 void
sanei_insb(unsigned int port,unsigned char * addr,unsigned long count)161 sanei_insb (unsigned int port, unsigned char *addr, unsigned long count)
162 {
163   insb (port, addr, count);
164 }
165 
166 void
sanei_insl(unsigned int port,unsigned char * addr,unsigned long count)167 sanei_insl (unsigned int port, unsigned char *addr, unsigned long count)
168 {
169   insl (port, addr, count);
170 }
171 
172 void
sanei_outsb(unsigned int port,const unsigned char * addr,unsigned long count)173 sanei_outsb (unsigned int port, const unsigned char *addr,
174 	     unsigned long count)
175 {
176   outsb (port, addr, count);
177 }
178 
179 void
sanei_outsl(unsigned int port,const unsigned char * addr,unsigned long count)180 sanei_outsl (unsigned int port, const unsigned char *addr,
181 	     unsigned long count)
182 {
183   /* oddly, 32 bit I/O are done with outsw instead of the expected outsl */
184   outsw (port, addr, count);
185 }
186 #endif /* linux GCC on i386 */
187 
188 
189 /* linux GCC non i386 */
190 #if ( TEST_SANE_INB(4) )
191 int
sanei_ioperm(int start,int length,int enable)192 sanei_ioperm (int start, int length, int enable)
193 {
194 #ifdef HAVE_IOPERM
195   return ioperm (start, length, enable);
196 #else
197   /* linux without ioperm ? hum ... */
198   /* makes compilers happy */
199   start = length + enable;
200   return 0;
201 #endif
202 }
203 
204 unsigned char
sanei_inb(unsigned int port)205 sanei_inb (unsigned int port)
206 {
207   return inb (port);
208 }
209 
210 void
sanei_outb(unsigned int port,unsigned char value)211 sanei_outb (unsigned int port, unsigned char value)
212 {
213   outb (value, port);
214 }
215 
216 void
sanei_insb(unsigned int port,unsigned char * addr,unsigned long count)217 sanei_insb (unsigned int port, unsigned char *addr, unsigned long count)
218 {
219   unsigned int i;
220 
221   for (i = 0; i < count; i++)
222     addr[i] = sanei_inb (port);
223 }
224 
225 void
sanei_insl(unsigned int port,unsigned char * addr,unsigned long count)226 sanei_insl (unsigned int port, unsigned char *addr, unsigned long count)
227 {
228   unsigned int i;
229 
230   for (i = 0; i < count * 4; i++)
231     addr[i] = sanei_inb (port);
232 }
233 
234 void
sanei_outsb(unsigned int port,const unsigned char * addr,unsigned long count)235 sanei_outsb (unsigned int port, const unsigned char *addr,
236 	     unsigned long count)
237 {
238   unsigned int i;
239 
240   for (i = 0; i < count; i++)
241     sanei_outb (port, addr[i]);
242 }
243 
244 void
sanei_outsl(unsigned int port,const unsigned char * addr,unsigned long count)245 sanei_outsl (unsigned int port, const unsigned char *addr,
246 	     unsigned long count)
247 {
248   unsigned int i;
249 
250   for (i = 0; i < count * 4; i++)
251     sanei_outb (port, addr[i]);
252 }
253 #endif /* linux GCC non i386 */
254 
255 
256 /* ICC on i386 */
257 #if ( TEST_SANE_INB(5) )
258 int
sanei_ioperm(int start,int length,int enable)259 sanei_ioperm (int start, int length, int enable)
260 {
261 #ifdef HAVE_IOPERM
262   return ioperm (start, length, enable);
263 #else
264   /* ICC without ioperm() ... */
265   /* makes compilers happy */
266   start = length + enable;
267   return 0;
268 #endif
269 }
270 unsigned char
sanei_inb(unsigned int port)271 sanei_inb (unsigned int port)
272 {
273   unsigned char ret;
274 
275   __asm__ __volatile__ ("inb %%dx,%%al":"=a" (ret):"d" ((u_int) port));
276   return ret;
277 }
278 
279 void
sanei_outb(unsigned int port,unsigned char value)280 sanei_outb (unsigned int port, unsigned char value)
281 {
282   __asm__ __volatile__ ("outb %%al,%%dx"::"a" (value), "d" ((u_int) port));
283 }
284 
285 void
sanei_insb(unsigned int port,void * addr,unsigned long count)286 sanei_insb (unsigned int port, void *addr, unsigned long count)
287 {
288   __asm__ __volatile__ ("rep ; insb":"=D" (addr), "=c" (count):"d" (port),
289 			"0" (addr), "1" (count));
290 }
291 
292 void
sanei_insl(unsigned int port,void * addr,unsigned long count)293 sanei_insl (unsigned int port, void *addr, unsigned long count)
294 {
295   __asm__ __volatile__ ("rep ; insl":"=D" (addr), "=c" (count):"d" (port),
296 			"0" (addr), "1" (count));
297 }
298 
299 void
sanei_outsb(unsigned int port,const void * addr,unsigned long count)300 sanei_outsb (unsigned int port, const void *addr, unsigned long count)
301 {
302   __asm__ __volatile__ ("rep ; outsb":"=S" (addr), "=c" (count):"d" (port),
303 			"0" (addr), "1" (count));
304 }
305 
306 void
sanei_outsl(unsigned int port,const void * addr,unsigned long count)307 sanei_outsl (unsigned int port, const void *addr, unsigned long count)
308 {
309   __asm__ __volatile__ ("rep ; outsl":"=S" (addr), "=c" (count):"d" (port),
310 			"0" (addr), "1" (count));
311 }
312 
313 #endif /* ICC on i386 */
314 
315 #endif /* ENABLE_PARPORT_DIRECTIO */
316 /*
317  * no inb/outb without --enable-parport-directio *
318  */
319 #ifndef ENABLE_PARPORT_DIRECTIO
320 int
sanei_ioperm(__sane_unused__ int start,__sane_unused__ int length,__sane_unused__ int enable)321 sanei_ioperm (__sane_unused__ int start, __sane_unused__ int length,
322               __sane_unused__ int enable)
323 {
324   /* returns failure */
325   return -1;
326 }
327 
328 unsigned char
sanei_inb(__sane_unused__ unsigned int port)329 sanei_inb (__sane_unused__ unsigned int port)
330 {
331   return 255;
332 }
333 
334 void
sanei_outb(__sane_unused__ unsigned int port,__sane_unused__ unsigned char value)335 sanei_outb (__sane_unused__ unsigned int port,
336             __sane_unused__ unsigned char value)
337 {
338 }
339 
340 void
sanei_insb(__sane_unused__ unsigned int port,__sane_unused__ unsigned char * addr,__sane_unused__ unsigned long count)341 sanei_insb (__sane_unused__ unsigned int port,
342             __sane_unused__ unsigned char *addr,
343             __sane_unused__ unsigned long count)
344 {
345 }
346 
347 void
sanei_insl(__sane_unused__ unsigned int port,__sane_unused__ unsigned char * addr,__sane_unused__ unsigned long count)348 sanei_insl (__sane_unused__ unsigned int port,
349             __sane_unused__ unsigned char *addr,
350             __sane_unused__ unsigned long count)
351 {
352 }
353 
354 void
sanei_outsb(__sane_unused__ unsigned int port,__sane_unused__ const unsigned char * addr,__sane_unused__ unsigned long count)355 sanei_outsb (__sane_unused__ unsigned int port,
356              __sane_unused__ const unsigned char *addr,
357 	     __sane_unused__ unsigned long count)
358 {
359 }
360 
361 void
sanei_outsl(__sane_unused__ unsigned int port,__sane_unused__ const unsigned char * addr,__sane_unused__ unsigned long count)362 sanei_outsl (__sane_unused__ unsigned int port,
363              __sane_unused__ const unsigned char *addr,
364 	     __sane_unused__ unsigned long count)
365 {
366 }
367 #endif /* ENABLE_PARPORT_DIRECTIO is not defined */
368