]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blob - drivers/s390/cio/qdio.h
[PATCH] s390: cleanup Kconfig
[mirror_ubuntu-zesty-kernel.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