Merge branch 'post-2.6.15' of git://brick.kernel.dk/data/git/linux-2.6-block
[sfrench/cifs-2.6.git] / drivers / s390 / cio / qdio.h
1 #ifndef _CIO_QDIO_H
2 #define _CIO_QDIO_H
3
4 #include <asm/page.h>
5
6 #include "schid.h"
7
8 #define VERSION_CIO_QDIO_H "$Revision: 1.40 $"
9
10 #ifdef CONFIG_QDIO_DEBUG
11 #define QDIO_VERBOSE_LEVEL 9
12 #else /* CONFIG_QDIO_DEBUG */
13 #define QDIO_VERBOSE_LEVEL 5
14 #endif /* CONFIG_QDIO_DEBUG */
15 #define QDIO_USE_PROCESSING_STATE
16
17 #ifdef CONFIG_QDIO_PERF_STATS
18 #define QDIO_PERFORMANCE_STATS
19 #endif /* CONFIG_QDIO_PERF_STATS */
20
21 #define QDIO_MINIMAL_BH_RELIEF_TIME 16
22 #define QDIO_TIMER_POLL_VALUE 1
23 #define IQDIO_TIMER_POLL_VALUE 1
24
25 /*
26  * unfortunately this can't be (QDIO_MAX_BUFFERS_PER_Q*4/3) or so -- as
27  * we never know, whether we'll get initiative again, e.g. to give the
28  * transmit skb's back to the stack, however the stack may be waiting for
29  * them... therefore we define 4 as threshold to start polling (which
30  * will stop as soon as the asynchronous queue catches up)
31  * btw, this only applies to the asynchronous HiperSockets queue
32  */
33 #define IQDIO_FILL_LEVEL_TO_POLL 4
34
35 #define TIQDIO_THININT_ISC 3
36 #define TIQDIO_DELAY_TARGET 0
37 #define QDIO_BUSY_BIT_PATIENCE 100 /* in microsecs */
38 #define QDIO_BUSY_BIT_GIVE_UP 10000000 /* 10 seconds */
39 #define IQDIO_GLOBAL_LAPS 2 /* GLOBAL_LAPS are not used as we */
40 #define IQDIO_GLOBAL_LAPS_INT 1 /* don't global summary */
41 #define IQDIO_LOCAL_LAPS 4
42 #define IQDIO_LOCAL_LAPS_INT 1
43 #define IQDIO_GLOBAL_SUMMARY_CC_MASK 2
44 /*#define IQDIO_IQDC_INT_PARM 0x1234*/
45
46 #define QDIO_Q_LAPS 5
47
48 #define QDIO_STORAGE_KEY PAGE_DEFAULT_KEY
49
50 #define L2_CACHELINE_SIZE 256
51 #define INDICATORS_PER_CACHELINE (L2_CACHELINE_SIZE/sizeof(__u32))
52
53 #define QDIO_PERF "qdio_perf"
54
55 /* must be a power of 2 */
56 /*#define QDIO_STATS_NUMBER 4
57
58 #define QDIO_STATS_CLASSES 2
59 #define QDIO_STATS_COUNT_NEEDED 2*/
60
61 #define QDIO_NO_USE_COUNT_TIMEOUT (1*HZ) /* wait for 1 sec on each q before
62                                             exiting without having use_count
63                                             of the queue to 0 */
64
65 #define QDIO_ESTABLISH_TIMEOUT (1*HZ)
66 #define QDIO_ACTIVATE_TIMEOUT ((5*HZ)>>10)
67 #define QDIO_CLEANUP_CLEAR_TIMEOUT (20*HZ)
68 #define QDIO_CLEANUP_HALT_TIMEOUT (10*HZ)
69
70 enum qdio_irq_states {
71         QDIO_IRQ_STATE_INACTIVE,
72         QDIO_IRQ_STATE_ESTABLISHED,
73         QDIO_IRQ_STATE_ACTIVE,
74         QDIO_IRQ_STATE_STOPPED,
75         QDIO_IRQ_STATE_CLEANUP,
76         QDIO_IRQ_STATE_ERR,
77         NR_QDIO_IRQ_STATES,
78 };
79
80 /* used as intparm in do_IO: */
81 #define QDIO_DOING_SENSEID 0
82 #define QDIO_DOING_ESTABLISH 1
83 #define QDIO_DOING_ACTIVATE 2
84 #define QDIO_DOING_CLEANUP 3
85
86 /************************* DEBUG FACILITY STUFF *********************/
87
88 #define QDIO_DBF_HEX(ex,name,level,addr,len) \
89         do { \
90         if (ex) \
91                 debug_exception(qdio_dbf_##name,level,(void*)(addr),len); \
92         else \
93                 debug_event(qdio_dbf_##name,level,(void*)(addr),len); \
94         } while (0)
95 #define QDIO_DBF_TEXT(ex,name,level,text) \
96         do { \
97         if (ex) \
98                 debug_text_exception(qdio_dbf_##name,level,text); \
99         else \
100                 debug_text_event(qdio_dbf_##name,level,text); \
101         } while (0)
102
103
104 #define QDIO_DBF_HEX0(ex,name,addr,len) QDIO_DBF_HEX(ex,name,0,addr,len)
105 #define QDIO_DBF_HEX1(ex,name,addr,len) QDIO_DBF_HEX(ex,name,1,addr,len)
106 #define QDIO_DBF_HEX2(ex,name,addr,len) QDIO_DBF_HEX(ex,name,2,addr,len)
107 #ifdef CONFIG_QDIO_DEBUG
108 #define QDIO_DBF_HEX3(ex,name,addr,len) QDIO_DBF_HEX(ex,name,3,addr,len)
109 #define QDIO_DBF_HEX4(ex,name,addr,len) QDIO_DBF_HEX(ex,name,4,addr,len)
110 #define QDIO_DBF_HEX5(ex,name,addr,len) QDIO_DBF_HEX(ex,name,5,addr,len)
111 #define QDIO_DBF_HEX6(ex,name,addr,len) QDIO_DBF_HEX(ex,name,6,addr,len)
112 #else /* CONFIG_QDIO_DEBUG */
113 #define QDIO_DBF_HEX3(ex,name,addr,len) do {} while (0)
114 #define QDIO_DBF_HEX4(ex,name,addr,len) do {} while (0)
115 #define QDIO_DBF_HEX5(ex,name,addr,len) do {} while (0)
116 #define QDIO_DBF_HEX6(ex,name,addr,len) do {} while (0)
117 #endif /* CONFIG_QDIO_DEBUG */
118
119 #define QDIO_DBF_TEXT0(ex,name,text) QDIO_DBF_TEXT(ex,name,0,text)
120 #define QDIO_DBF_TEXT1(ex,name,text) QDIO_DBF_TEXT(ex,name,1,text)
121 #define QDIO_DBF_TEXT2(ex,name,text) QDIO_DBF_TEXT(ex,name,2,text)
122 #ifdef CONFIG_QDIO_DEBUG
123 #define QDIO_DBF_TEXT3(ex,name,text) QDIO_DBF_TEXT(ex,name,3,text)
124 #define QDIO_DBF_TEXT4(ex,name,text) QDIO_DBF_TEXT(ex,name,4,text)
125 #define QDIO_DBF_TEXT5(ex,name,text) QDIO_DBF_TEXT(ex,name,5,text)
126 #define QDIO_DBF_TEXT6(ex,name,text) QDIO_DBF_TEXT(ex,name,6,text)
127 #else /* CONFIG_QDIO_DEBUG */
128 #define QDIO_DBF_TEXT3(ex,name,text) do {} while (0)
129 #define QDIO_DBF_TEXT4(ex,name,text) do {} while (0)
130 #define QDIO_DBF_TEXT5(ex,name,text) do {} while (0)
131 #define QDIO_DBF_TEXT6(ex,name,text) do {} while (0)
132 #endif /* CONFIG_QDIO_DEBUG */
133
134 #define QDIO_DBF_SETUP_NAME "qdio_setup"
135 #define QDIO_DBF_SETUP_LEN 8
136 #define QDIO_DBF_SETUP_PAGES 4
137 #define QDIO_DBF_SETUP_NR_AREAS 1
138 #ifdef CONFIG_QDIO_DEBUG
139 #define QDIO_DBF_SETUP_LEVEL 6
140 #else /* CONFIG_QDIO_DEBUG */
141 #define QDIO_DBF_SETUP_LEVEL 2
142 #endif /* CONFIG_QDIO_DEBUG */
143
144 #define QDIO_DBF_SBAL_NAME "qdio_labs" /* sbal */
145 #define QDIO_DBF_SBAL_LEN 256
146 #define QDIO_DBF_SBAL_PAGES 4
147 #define QDIO_DBF_SBAL_NR_AREAS 2
148 #ifdef CONFIG_QDIO_DEBUG
149 #define QDIO_DBF_SBAL_LEVEL 6
150 #else /* CONFIG_QDIO_DEBUG */
151 #define QDIO_DBF_SBAL_LEVEL 2
152 #endif /* CONFIG_QDIO_DEBUG */
153
154 #define QDIO_DBF_TRACE_NAME "qdio_trace"
155 #define QDIO_DBF_TRACE_LEN 8
156 #define QDIO_DBF_TRACE_NR_AREAS 2
157 #ifdef CONFIG_QDIO_DEBUG
158 #define QDIO_DBF_TRACE_PAGES 16
159 #define QDIO_DBF_TRACE_LEVEL 4 /* -------- could be even more verbose here */
160 #else /* CONFIG_QDIO_DEBUG */
161 #define QDIO_DBF_TRACE_PAGES 4
162 #define QDIO_DBF_TRACE_LEVEL 2
163 #endif /* CONFIG_QDIO_DEBUG */
164
165 #define QDIO_DBF_SENSE_NAME "qdio_sense"
166 #define QDIO_DBF_SENSE_LEN 64
167 #define QDIO_DBF_SENSE_PAGES 2
168 #define QDIO_DBF_SENSE_NR_AREAS 1
169 #ifdef CONFIG_QDIO_DEBUG
170 #define QDIO_DBF_SENSE_LEVEL 6
171 #else /* CONFIG_QDIO_DEBUG */
172 #define QDIO_DBF_SENSE_LEVEL 2
173 #endif /* CONFIG_QDIO_DEBUG */
174
175 #ifdef CONFIG_QDIO_DEBUG
176 #define QDIO_TRACE_QTYPE QDIO_ZFCP_QFMT
177
178 #define QDIO_DBF_SLSB_OUT_NAME "qdio_slsb_out"
179 #define QDIO_DBF_SLSB_OUT_LEN QDIO_MAX_BUFFERS_PER_Q
180 #define QDIO_DBF_SLSB_OUT_PAGES 256
181 #define QDIO_DBF_SLSB_OUT_NR_AREAS 1
182 #define QDIO_DBF_SLSB_OUT_LEVEL 6
183
184 #define QDIO_DBF_SLSB_IN_NAME "qdio_slsb_in"
185 #define QDIO_DBF_SLSB_IN_LEN QDIO_MAX_BUFFERS_PER_Q
186 #define QDIO_DBF_SLSB_IN_PAGES 256
187 #define QDIO_DBF_SLSB_IN_NR_AREAS 1
188 #define QDIO_DBF_SLSB_IN_LEVEL 6
189 #endif /* CONFIG_QDIO_DEBUG */
190
191 #define QDIO_PRINTK_HEADER QDIO_NAME ": "
192
193 #if QDIO_VERBOSE_LEVEL>8
194 #define QDIO_PRINT_STUPID(x...) printk( KERN_DEBUG QDIO_PRINTK_HEADER x)
195 #else
196 #define QDIO_PRINT_STUPID(x...)
197 #endif
198
199 #if QDIO_VERBOSE_LEVEL>7
200 #define QDIO_PRINT_ALL(x...) printk( QDIO_PRINTK_HEADER x)
201 #else
202 #define QDIO_PRINT_ALL(x...)
203 #endif
204
205 #if QDIO_VERBOSE_LEVEL>6
206 #define QDIO_PRINT_INFO(x...) printk( QDIO_PRINTK_HEADER x)
207 #else
208 #define QDIO_PRINT_INFO(x...)
209 #endif
210
211 #if QDIO_VERBOSE_LEVEL>5
212 #define QDIO_PRINT_WARN(x...) printk( QDIO_PRINTK_HEADER x)
213 #else
214 #define QDIO_PRINT_WARN(x...)
215 #endif
216
217 #if QDIO_VERBOSE_LEVEL>4
218 #define QDIO_PRINT_ERR(x...) printk( QDIO_PRINTK_HEADER x)
219 #else
220 #define QDIO_PRINT_ERR(x...)
221 #endif
222
223 #if QDIO_VERBOSE_LEVEL>3
224 #define QDIO_PRINT_CRIT(x...) printk( QDIO_PRINTK_HEADER x)
225 #else
226 #define QDIO_PRINT_CRIT(x...)
227 #endif
228
229 #if QDIO_VERBOSE_LEVEL>2
230 #define QDIO_PRINT_ALERT(x...) printk( QDIO_PRINTK_HEADER x)
231 #else
232 #define QDIO_PRINT_ALERT(x...)
233 #endif
234
235 #if QDIO_VERBOSE_LEVEL>1
236 #define QDIO_PRINT_EMERG(x...) printk( QDIO_PRINTK_HEADER x)
237 #else
238 #define QDIO_PRINT_EMERG(x...)
239 #endif
240
241 #define HEXDUMP16(importance,header,ptr) \
242 QDIO_PRINT_##importance(header "%02x %02x %02x %02x  " \
243                         "%02x %02x %02x %02x  %02x %02x %02x %02x  " \
244                         "%02x %02x %02x %02x\n",*(((char*)ptr)), \
245                         *(((char*)ptr)+1),*(((char*)ptr)+2), \
246                         *(((char*)ptr)+3),*(((char*)ptr)+4), \
247                         *(((char*)ptr)+5),*(((char*)ptr)+6), \
248                         *(((char*)ptr)+7),*(((char*)ptr)+8), \
249                         *(((char*)ptr)+9),*(((char*)ptr)+10), \
250                         *(((char*)ptr)+11),*(((char*)ptr)+12), \
251                         *(((char*)ptr)+13),*(((char*)ptr)+14), \
252                         *(((char*)ptr)+15)); \
253 QDIO_PRINT_##importance(header "%02x %02x %02x %02x  %02x %02x %02x %02x  " \
254                         "%02x %02x %02x %02x  %02x %02x %02x %02x\n", \
255                         *(((char*)ptr)+16),*(((char*)ptr)+17), \
256                         *(((char*)ptr)+18),*(((char*)ptr)+19), \
257                         *(((char*)ptr)+20),*(((char*)ptr)+21), \
258                         *(((char*)ptr)+22),*(((char*)ptr)+23), \
259                         *(((char*)ptr)+24),*(((char*)ptr)+25), \
260                         *(((char*)ptr)+26),*(((char*)ptr)+27), \
261                         *(((char*)ptr)+28),*(((char*)ptr)+29), \
262                         *(((char*)ptr)+30),*(((char*)ptr)+31));
263
264 /****************** END OF DEBUG FACILITY STUFF *********************/
265
266 /*
267  * Some instructions as assembly
268  */
269
270 static inline int
271 do_sqbs(unsigned long sch, unsigned char state, int queue,
272        unsigned int *start, unsigned int *count)
273 {
274 #ifdef CONFIG_64BIT
275        register unsigned long _ccq asm ("0") = *count;
276        register unsigned long _sch asm ("1") = sch;
277        unsigned long _queuestart = ((unsigned long)queue << 32) | *start;
278
279        asm volatile (
280               " .insn rsy,0xeb000000008A,%1,0,0(%2)\n\t"
281               : "+d" (_ccq), "+d" (_queuestart)
282               : "d" ((unsigned long)state), "d" (_sch)
283               : "memory", "cc"
284        );
285        *count = _ccq & 0xff;
286        *start = _queuestart & 0xff;
287
288        return (_ccq >> 32) & 0xff;
289 #else
290        return 0;
291 #endif
292 }
293
294 static inline int
295 do_eqbs(unsigned long sch, unsigned char *state, int queue,
296         unsigned int *start, unsigned int *count)
297 {
298 #ifdef CONFIG_64BIT
299         register unsigned long _ccq asm ("0") = *count;
300         register unsigned long _sch asm ("1") = sch;
301         unsigned long _queuestart = ((unsigned long)queue << 32) | *start;
302         unsigned long _state = 0;
303
304         asm volatile (
305               " .insn rrf,0xB99c0000,%1,%2,0,0  \n\t"
306               : "+d" (_ccq), "+d" (_queuestart), "+d" (_state)
307               : "d" (_sch)
308               : "memory", "cc"
309         );
310         *count = _ccq & 0xff;
311         *start = _queuestart & 0xff;
312         *state = _state & 0xff;
313
314         return (_ccq >> 32) & 0xff;
315 #else
316         return 0;
317 #endif
318 }
319
320
321 static inline int
322 do_siga_sync(struct subchannel_id schid, unsigned int mask1, unsigned int mask2)
323 {
324         int cc;
325
326 #ifndef CONFIG_64BIT
327         asm volatile (
328                 "lhi    0,2     \n\t"
329                 "lr     1,%1    \n\t"
330                 "lr     2,%2    \n\t"
331                 "lr     3,%3    \n\t"
332                 "siga   0       \n\t"
333                 "ipm    %0      \n\t"
334                 "srl    %0,28   \n\t"
335                 : "=d" (cc)
336                 : "d" (schid), "d" (mask1), "d" (mask2)
337                 : "cc", "0", "1", "2", "3"
338                 );
339 #else /* CONFIG_64BIT */
340         asm volatile (
341                 "lghi   0,2     \n\t"
342                 "llgfr  1,%1    \n\t"
343                 "llgfr  2,%2    \n\t"
344                 "llgfr  3,%3    \n\t"
345                 "siga   0       \n\t"
346                 "ipm    %0      \n\t"
347                 "srl    %0,28   \n\t"
348                 : "=d" (cc)
349                 : "d" (schid), "d" (mask1), "d" (mask2)
350                 : "cc", "0", "1", "2", "3"
351                 );
352 #endif /* CONFIG_64BIT */
353         return cc;
354 }
355
356 static inline int
357 do_siga_input(struct subchannel_id schid, unsigned int mask)
358 {
359         int cc;
360
361 #ifndef CONFIG_64BIT
362         asm volatile (
363                 "lhi    0,1     \n\t"
364                 "lr     1,%1    \n\t"
365                 "lr     2,%2    \n\t"
366                 "siga   0       \n\t"
367                 "ipm    %0      \n\t"
368                 "srl    %0,28   \n\t"
369                 : "=d" (cc)
370                 : "d" (schid), "d" (mask)
371                 : "cc", "0", "1", "2", "memory"
372                 );
373 #else /* CONFIG_64BIT */
374         asm volatile (
375                 "lghi   0,1     \n\t"
376                 "llgfr  1,%1    \n\t"
377                 "llgfr  2,%2    \n\t"
378                 "siga   0       \n\t"
379                 "ipm    %0      \n\t"
380                 "srl    %0,28   \n\t"
381                 : "=d" (cc)
382                 : "d" (schid), "d" (mask)
383                 : "cc", "0", "1", "2", "memory"
384                 );
385 #endif /* CONFIG_64BIT */
386         
387         return cc;
388 }
389
390 static inline int
391 do_siga_output(unsigned long schid, unsigned long mask, __u32 *bb,
392                unsigned int fc)
393 {
394         int cc;
395         __u32 busy_bit;
396
397 #ifndef CONFIG_64BIT
398         asm volatile (
399                 "lhi    0,0     \n\t"
400                 "lr     1,%2    \n\t"
401                 "lr     2,%3    \n\t"
402                 "siga   0       \n\t"
403                 "0:"
404                 "ipm    %0      \n\t"
405                 "srl    %0,28   \n\t"
406                 "srl    0,31    \n\t"
407                 "lr     %1,0    \n\t"
408                 "1:     \n\t"
409                 ".section .fixup,\"ax\"\n\t"
410                 "2:     \n\t"
411                 "lhi    %0,%4   \n\t"
412                 "bras   1,3f    \n\t"
413                 ".long 1b       \n\t"
414                 "3:     \n\t"
415                 "l      1,0(1)  \n\t"
416                 "br     1       \n\t"
417                 ".previous      \n\t"
418                 ".section __ex_table,\"a\"\n\t"
419                 ".align 4       \n\t"
420                 ".long  0b,2b   \n\t"
421                 ".previous      \n\t"
422                 : "=d" (cc), "=d" (busy_bit)
423                 : "d" (schid), "d" (mask),
424                 "i" (QDIO_SIGA_ERROR_ACCESS_EXCEPTION)
425                 : "cc", "0", "1", "2", "memory"
426                 );
427 #else /* CONFIG_64BIT */
428         asm volatile (
429                 "llgfr  0,%5    \n\t"
430                 "lgr    1,%2    \n\t"
431                 "llgfr  2,%3    \n\t"
432                 "siga   0       \n\t"
433                 "0:"
434                 "ipm    %0      \n\t"
435                 "srl    %0,28   \n\t"
436                 "srl    0,31    \n\t"
437                 "llgfr  %1,0    \n\t"
438                 "1:     \n\t"
439                 ".section .fixup,\"ax\"\n\t"
440                 "lghi   %0,%4   \n\t"
441                 "jg     1b      \n\t"
442                 ".previous\n\t"
443                 ".section __ex_table,\"a\"\n\t"
444                 ".align 8       \n\t"
445                 ".quad  0b,1b   \n\t"
446                 ".previous      \n\t"
447                 : "=d" (cc), "=d" (busy_bit)
448                 : "d" (schid), "d" (mask),
449                 "i" (QDIO_SIGA_ERROR_ACCESS_EXCEPTION), "d" (fc)
450                 : "cc", "0", "1", "2", "memory"
451                 );
452 #endif /* CONFIG_64BIT */
453         
454         (*bb) = busy_bit;
455         return cc;
456 }
457
458 static inline unsigned long
459 do_clear_global_summary(void)
460 {
461
462         unsigned long time;
463
464 #ifndef CONFIG_64BIT
465         asm volatile (
466                 "lhi    1,3     \n\t"
467                 ".insn  rre,0xb2650000,2,0      \n\t"
468                 "lr     %0,3    \n\t"
469                 : "=d" (time) : : "cc", "1", "2", "3"
470                 );
471 #else /* CONFIG_64BIT */
472         asm volatile (
473                 "lghi   1,3     \n\t"
474                 ".insn  rre,0xb2650000,2,0      \n\t"
475                 "lgr    %0,3    \n\t"
476                 : "=d" (time) : : "cc", "1", "2", "3"
477                 );
478 #endif /* CONFIG_64BIT */
479         
480         return time;
481 }
482         
483 /*
484  * QDIO device commands returned by extended Sense-ID
485  */
486 #define DEFAULT_ESTABLISH_QS_CMD 0x1b
487 #define DEFAULT_ESTABLISH_QS_COUNT 0x1000
488 #define DEFAULT_ACTIVATE_QS_CMD 0x1f
489 #define DEFAULT_ACTIVATE_QS_COUNT 0
490
491 /*
492  * additional CIWs returned by extended Sense-ID
493  */
494 #define CIW_TYPE_EQUEUE 0x3       /* establish QDIO queues */
495 #define CIW_TYPE_AQUEUE 0x4       /* activate QDIO queues */
496
497 #define QDIO_CHSC_RESPONSE_CODE_OK 1
498 /* flags for st qdio sch data */
499 #define CHSC_FLAG_QDIO_CAPABILITY 0x80
500 #define CHSC_FLAG_VALIDITY 0x40
501
502 #define CHSC_FLAG_SIGA_INPUT_NECESSARY 0x40
503 #define CHSC_FLAG_SIGA_OUTPUT_NECESSARY 0x20
504 #define CHSC_FLAG_SIGA_SYNC_NECESSARY 0x10
505 #define CHSC_FLAG_SIGA_SYNC_DONE_ON_THININTS 0x08
506 #define CHSC_FLAG_SIGA_SYNC_DONE_ON_OUTB_PCIS 0x04
507
508 #ifdef QDIO_PERFORMANCE_STATS
509 struct qdio_perf_stats {
510         unsigned int tl_runs;
511
512         unsigned int siga_outs;
513         unsigned int siga_ins;
514         unsigned int siga_syncs;
515         unsigned int pcis;
516         unsigned int thinints;
517         unsigned int fast_reqs;
518
519         __u64 start_time_outbound;
520         unsigned int outbound_cnt;
521         unsigned int outbound_time;
522         __u64 start_time_inbound;
523         unsigned int inbound_cnt;
524         unsigned int inbound_time;
525 };
526 #endif /* QDIO_PERFORMANCE_STATS */
527
528 #define atomic_swap(a,b) xchg((int*)a.counter,b)
529
530 /* unlikely as the later the better */
531 #define SYNC_MEMORY if (unlikely(q->siga_sync)) qdio_siga_sync_q(q)
532 #define SYNC_MEMORY_ALL if (unlikely(q->siga_sync)) \
533         qdio_siga_sync(q,~0U,~0U)
534 #define SYNC_MEMORY_ALL_OUTB if (unlikely(q->siga_sync)) \
535         qdio_siga_sync(q,~0U,0)
536
537 #define NOW qdio_get_micros()
538 #define SAVE_TIMESTAMP(q) q->timing.last_transfer_time=NOW
539 #define GET_SAVED_TIMESTAMP(q) (q->timing.last_transfer_time)
540 #define SAVE_FRONTIER(q,val) q->last_move_ftc=val
541 #define GET_SAVED_FRONTIER(q) (q->last_move_ftc)
542
543 #define MY_MODULE_STRING(x) #x
544
545 #ifdef CONFIG_64BIT
546 #define QDIO_GET_ADDR(x) ((__u32)(unsigned long)x)
547 #else /* CONFIG_64BIT */
548 #define QDIO_GET_ADDR(x) ((__u32)(long)x)
549 #endif /* CONFIG_64BIT */
550
551 struct qdio_q {
552         volatile struct slsb slsb;
553
554         char unused[QDIO_MAX_BUFFERS_PER_Q];
555
556         __u32 * dev_st_chg_ind;
557
558         int is_input_q;
559         struct subchannel_id schid;
560         struct ccw_device *cdev;
561
562         unsigned int is_iqdio_q;
563         unsigned int is_thinint_q;
564
565         /* bit 0 means queue 0, bit 1 means queue 1, ... */
566         unsigned int mask;
567         unsigned int q_no;
568
569         qdio_handler_t (*handler);
570
571         /* points to the next buffer to be checked for having
572          * been processed by the card (outbound)
573          * or to the next buffer the program should check for (inbound) */
574         volatile int first_to_check;
575         /* and the last time it was: */
576         volatile int last_move_ftc;
577
578         atomic_t number_of_buffers_used;
579         atomic_t polling;
580
581         unsigned int siga_in;
582         unsigned int siga_out;
583         unsigned int siga_sync;
584         unsigned int siga_sync_done_on_thinints;
585         unsigned int siga_sync_done_on_outb_tis;
586         unsigned int hydra_gives_outbound_pcis;
587
588         /* used to save beginning position when calling dd_handlers */
589         int first_element_to_kick;
590
591         atomic_t use_count;
592         atomic_t is_in_shutdown;
593
594         void *irq_ptr;
595
596 #ifdef QDIO_USE_TIMERS_FOR_POLLING
597         struct timer_list timer;
598         atomic_t timer_already_set;
599         spinlock_t timer_lock;
600 #else /* QDIO_USE_TIMERS_FOR_POLLING */
601         struct tasklet_struct tasklet;
602 #endif /* QDIO_USE_TIMERS_FOR_POLLING */
603
604
605         enum qdio_irq_states state;
606
607         /* used to store the error condition during a data transfer */
608         unsigned int qdio_error;
609         unsigned int siga_error;
610         unsigned int error_status_flags;
611
612         /* list of interesting queues */
613         volatile struct qdio_q *list_next;
614         volatile struct qdio_q *list_prev;
615
616         struct sl *sl;
617         volatile struct sbal *sbal[QDIO_MAX_BUFFERS_PER_Q];
618
619         struct qdio_buffer *qdio_buffers[QDIO_MAX_BUFFERS_PER_Q];
620
621         unsigned long int_parm;
622
623         /*struct {
624                 int in_bh_check_limit;
625                 int threshold;
626         } threshold_classes[QDIO_STATS_CLASSES];*/
627
628         struct {
629                 /* inbound: the time to stop polling
630                    outbound: the time to kick peer */
631                 int threshold; /* the real value */
632
633                 /* outbound: last time of do_QDIO
634                    inbound: last time of noticing incoming data */
635                 /*__u64 last_transfer_times[QDIO_STATS_NUMBER];
636                 int last_transfer_index; */
637
638                 __u64 last_transfer_time;
639                 __u64 busy_start;
640         } timing;
641         atomic_t busy_siga_counter;
642         unsigned int queue_type;
643
644         /* leave this member at the end. won't be cleared in qdio_fill_qs */
645         struct slib *slib; /* a page is allocated under this pointer,
646                               sl points into this page, offset PAGE_SIZE/2
647                               (after slib) */
648 } __attribute__ ((aligned(256)));
649
650 struct qdio_irq {
651         __u32 * volatile dev_st_chg_ind;
652
653         unsigned long int_parm;
654         struct subchannel_id schid;
655
656         unsigned int is_iqdio_irq;
657         unsigned int is_thinint_irq;
658         unsigned int hydra_gives_outbound_pcis;
659         unsigned int sync_done_on_outb_pcis;
660
661         /* QEBSM facility */
662         unsigned int is_qebsm;
663         unsigned long sch_token;
664
665         enum qdio_irq_states state;
666
667         unsigned int no_input_qs;
668         unsigned int no_output_qs;
669
670         unsigned char qdioac;
671
672         struct ccw1 ccw;
673
674         struct ciw equeue;
675         struct ciw aqueue;
676
677         struct qib qib;
678         
679         void (*original_int_handler) (struct ccw_device *,
680                                       unsigned long, struct irb *);
681
682         /* leave these four members together at the end. won't be cleared in qdio_fill_irq */
683         struct qdr *qdr;
684         struct qdio_q *input_qs[QDIO_MAX_QUEUES_PER_IRQ];
685         struct qdio_q *output_qs[QDIO_MAX_QUEUES_PER_IRQ];
686         struct semaphore setting_up_sema;
687 };
688 #endif