aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/cio/qdio.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/s390/cio/qdio.h')
-rw-r--r--drivers/s390/cio/qdio.h33
1 files changed, 19 insertions, 14 deletions
diff --git a/drivers/s390/cio/qdio.h b/drivers/s390/cio/qdio.h
index e3ea1d5f2810..42f2b09631b6 100644
--- a/drivers/s390/cio/qdio.h
+++ b/drivers/s390/cio/qdio.h
@@ -10,10 +10,10 @@
10 10
11#include <asm/page.h> 11#include <asm/page.h>
12#include <asm/schid.h> 12#include <asm/schid.h>
13#include <asm/debug.h>
13#include "chsc.h" 14#include "chsc.h"
14 15
15#define QDIO_BUSY_BIT_PATIENCE 100 /* 100 microseconds */ 16#define QDIO_BUSY_BIT_PATIENCE 100 /* 100 microseconds */
16#define QDIO_BUSY_BIT_GIVE_UP 2000000 /* 2 seconds = eternity */
17#define QDIO_INPUT_THRESHOLD 500 /* 500 microseconds */ 17#define QDIO_INPUT_THRESHOLD 500 /* 500 microseconds */
18 18
19/* 19/*
@@ -111,12 +111,12 @@ static inline int do_sqbs(u64 token, unsigned char state, int queue,
111} 111}
112 112
113static inline int do_eqbs(u64 token, unsigned char *state, int queue, 113static inline int do_eqbs(u64 token, unsigned char *state, int queue,
114 int *start, int *count) 114 int *start, int *count, int ack)
115{ 115{
116 register unsigned long _ccq asm ("0") = *count; 116 register unsigned long _ccq asm ("0") = *count;
117 register unsigned long _token asm ("1") = token; 117 register unsigned long _token asm ("1") = token;
118 unsigned long _queuestart = ((unsigned long)queue << 32) | *start; 118 unsigned long _queuestart = ((unsigned long)queue << 32) | *start;
119 unsigned long _state = 0; 119 unsigned long _state = (unsigned long)ack << 63;
120 120
121 asm volatile( 121 asm volatile(
122 " .insn rrf,0xB99c0000,%1,%2,0,0" 122 " .insn rrf,0xB99c0000,%1,%2,0,0"
@@ -133,7 +133,7 @@ static inline int do_eqbs(u64 token, unsigned char *state, int queue,
133static inline int do_sqbs(u64 token, unsigned char state, int queue, 133static inline int do_sqbs(u64 token, unsigned char state, int queue,
134 int *start, int *count) { return 0; } 134 int *start, int *count) { return 0; }
135static inline int do_eqbs(u64 token, unsigned char *state, int queue, 135static inline int do_eqbs(u64 token, unsigned char *state, int queue,
136 int *start, int *count) { return 0; } 136 int *start, int *count, int ack) { return 0; }
137#endif /* CONFIG_64BIT */ 137#endif /* CONFIG_64BIT */
138 138
139struct qdio_irq; 139struct qdio_irq;
@@ -186,20 +186,14 @@ struct qdio_input_q {
186 /* input buffer acknowledgement flag */ 186 /* input buffer acknowledgement flag */
187 int polling; 187 int polling;
188 188
189 /* how much sbals are acknowledged with qebsm */
190 int ack_count;
191
189 /* last time of noticing incoming data */ 192 /* last time of noticing incoming data */
190 u64 timestamp; 193 u64 timestamp;
191
192 /* lock for clearing the acknowledgement */
193 spinlock_t lock;
194}; 194};
195 195
196struct qdio_output_q { 196struct qdio_output_q {
197 /* failed siga-w attempts*/
198 atomic_t busy_siga_counter;
199
200 /* start time of busy condition */
201 u64 timestamp;
202
203 /* PCIs are enabled for the queue */ 197 /* PCIs are enabled for the queue */
204 int pci_out_enabled; 198 int pci_out_enabled;
205 199
@@ -250,6 +244,7 @@ struct qdio_q {
250 244
251 struct qdio_irq *irq_ptr; 245 struct qdio_irq *irq_ptr;
252 struct tasklet_struct tasklet; 246 struct tasklet_struct tasklet;
247 spinlock_t lock;
253 248
254 /* error condition during a data transfer */ 249 /* error condition during a data transfer */
255 unsigned int qdio_error; 250 unsigned int qdio_error;
@@ -300,11 +295,13 @@ struct qdio_irq {
300 struct qdio_q *input_qs[QDIO_MAX_QUEUES_PER_IRQ]; 295 struct qdio_q *input_qs[QDIO_MAX_QUEUES_PER_IRQ];
301 struct qdio_q *output_qs[QDIO_MAX_QUEUES_PER_IRQ]; 296 struct qdio_q *output_qs[QDIO_MAX_QUEUES_PER_IRQ];
302 297
298 debug_info_t *debug_area;
303 struct mutex setup_mutex; 299 struct mutex setup_mutex;
304}; 300};
305 301
306/* helper functions */ 302/* helper functions */
307#define queue_type(q) q->irq_ptr->qib.qfmt 303#define queue_type(q) q->irq_ptr->qib.qfmt
304#define SCH_NO(q) (q->irq_ptr->schid.sch_no)
308 305
309#define is_thinint_irq(irq) \ 306#define is_thinint_irq(irq) \
310 (irq->qib.qfmt == QDIO_IQDIO_QFMT || \ 307 (irq->qib.qfmt == QDIO_IQDIO_QFMT || \
@@ -348,10 +345,13 @@ static inline unsigned long long get_usecs(void)
348 ((bufnr + 1) & QDIO_MAX_BUFFERS_MASK) 345 ((bufnr + 1) & QDIO_MAX_BUFFERS_MASK)
349#define add_buf(bufnr, inc) \ 346#define add_buf(bufnr, inc) \
350 ((bufnr + inc) & QDIO_MAX_BUFFERS_MASK) 347 ((bufnr + inc) & QDIO_MAX_BUFFERS_MASK)
348#define sub_buf(bufnr, dec) \
349 ((bufnr - dec) & QDIO_MAX_BUFFERS_MASK)
351 350
352/* prototypes for thin interrupt */ 351/* prototypes for thin interrupt */
353void qdio_sync_after_thinint(struct qdio_q *q); 352void qdio_sync_after_thinint(struct qdio_q *q);
354int get_buf_state(struct qdio_q *q, unsigned int bufnr, unsigned char *state); 353int get_buf_state(struct qdio_q *q, unsigned int bufnr, unsigned char *state,
354 int auto_ack);
355void qdio_check_outbound_after_thinint(struct qdio_q *q); 355void qdio_check_outbound_after_thinint(struct qdio_q *q);
356int qdio_inbound_q_moved(struct qdio_q *q); 356int qdio_inbound_q_moved(struct qdio_q *q);
357void qdio_kick_inbound_handler(struct qdio_q *q); 357void qdio_kick_inbound_handler(struct qdio_q *q);
@@ -378,10 +378,15 @@ void qdio_int_handler(struct ccw_device *cdev, unsigned long intparm,
378int qdio_allocate_qs(struct qdio_irq *irq_ptr, int nr_input_qs, 378int qdio_allocate_qs(struct qdio_irq *irq_ptr, int nr_input_qs,
379 int nr_output_qs); 379 int nr_output_qs);
380void qdio_setup_ssqd_info(struct qdio_irq *irq_ptr); 380void qdio_setup_ssqd_info(struct qdio_irq *irq_ptr);
381int qdio_setup_get_ssqd(struct qdio_irq *irq_ptr,
382 struct subchannel_id *schid,
383 struct qdio_ssqd_desc *data);
381int qdio_setup_irq(struct qdio_initialize *init_data); 384int qdio_setup_irq(struct qdio_initialize *init_data);
382void qdio_print_subchannel_info(struct qdio_irq *irq_ptr, 385void qdio_print_subchannel_info(struct qdio_irq *irq_ptr,
383 struct ccw_device *cdev); 386 struct ccw_device *cdev);
384void qdio_release_memory(struct qdio_irq *irq_ptr); 387void qdio_release_memory(struct qdio_irq *irq_ptr);
388int qdio_setup_create_sysfs(struct ccw_device *cdev);
389void qdio_setup_destroy_sysfs(struct ccw_device *cdev);
385int qdio_setup_init(void); 390int qdio_setup_init(void);
386void qdio_setup_exit(void); 391void qdio_setup_exit(void);
387 392