diff options
Diffstat (limited to 'drivers/s390/cio/qdio.h')
| -rw-r--r-- | drivers/s390/cio/qdio.h | 33 |
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 | ||
| 113 | static inline int do_eqbs(u64 token, unsigned char *state, int queue, | 113 | static 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, | |||
| 133 | static inline int do_sqbs(u64 token, unsigned char state, int queue, | 133 | static 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; } |
| 135 | static inline int do_eqbs(u64 token, unsigned char *state, int queue, | 135 | static 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 | ||
| 139 | struct qdio_irq; | 139 | struct 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 | ||
| 196 | struct qdio_output_q { | 196 | struct 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 */ |
| 353 | void qdio_sync_after_thinint(struct qdio_q *q); | 352 | void qdio_sync_after_thinint(struct qdio_q *q); |
| 354 | int get_buf_state(struct qdio_q *q, unsigned int bufnr, unsigned char *state); | 353 | int get_buf_state(struct qdio_q *q, unsigned int bufnr, unsigned char *state, |
| 354 | int auto_ack); | ||
| 355 | void qdio_check_outbound_after_thinint(struct qdio_q *q); | 355 | void qdio_check_outbound_after_thinint(struct qdio_q *q); |
| 356 | int qdio_inbound_q_moved(struct qdio_q *q); | 356 | int qdio_inbound_q_moved(struct qdio_q *q); |
| 357 | void qdio_kick_inbound_handler(struct qdio_q *q); | 357 | void qdio_kick_inbound_handler(struct qdio_q *q); |
| @@ -378,10 +378,15 @@ void qdio_int_handler(struct ccw_device *cdev, unsigned long intparm, | |||
| 378 | int qdio_allocate_qs(struct qdio_irq *irq_ptr, int nr_input_qs, | 378 | int qdio_allocate_qs(struct qdio_irq *irq_ptr, int nr_input_qs, |
| 379 | int nr_output_qs); | 379 | int nr_output_qs); |
| 380 | void qdio_setup_ssqd_info(struct qdio_irq *irq_ptr); | 380 | void qdio_setup_ssqd_info(struct qdio_irq *irq_ptr); |
| 381 | int qdio_setup_get_ssqd(struct qdio_irq *irq_ptr, | ||
| 382 | struct subchannel_id *schid, | ||
| 383 | struct qdio_ssqd_desc *data); | ||
| 381 | int qdio_setup_irq(struct qdio_initialize *init_data); | 384 | int qdio_setup_irq(struct qdio_initialize *init_data); |
| 382 | void qdio_print_subchannel_info(struct qdio_irq *irq_ptr, | 385 | void qdio_print_subchannel_info(struct qdio_irq *irq_ptr, |
| 383 | struct ccw_device *cdev); | 386 | struct ccw_device *cdev); |
| 384 | void qdio_release_memory(struct qdio_irq *irq_ptr); | 387 | void qdio_release_memory(struct qdio_irq *irq_ptr); |
| 388 | int qdio_setup_create_sysfs(struct ccw_device *cdev); | ||
| 389 | void qdio_setup_destroy_sysfs(struct ccw_device *cdev); | ||
| 385 | int qdio_setup_init(void); | 390 | int qdio_setup_init(void); |
| 386 | void qdio_setup_exit(void); | 391 | void qdio_setup_exit(void); |
| 387 | 392 | ||
