diff options
-rw-r--r-- | arch/s390/include/asm/qdio.h | 1 | ||||
-rw-r--r-- | drivers/s390/cio/qdio.h | 2 | ||||
-rw-r--r-- | drivers/s390/cio/qdio_main.c | 8 | ||||
-rw-r--r-- | drivers/s390/cio/qdio_setup.c | 1 | ||||
-rw-r--r-- | drivers/s390/net/qeth_core_main.c | 2 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_qdio.c | 2 |
6 files changed, 15 insertions, 1 deletions
diff --git a/arch/s390/include/asm/qdio.h b/arch/s390/include/asm/qdio.h index 46e96bc1f5a1..350e7ee5952d 100644 --- a/arch/s390/include/asm/qdio.h +++ b/arch/s390/include/asm/qdio.h | |||
@@ -361,6 +361,7 @@ struct qdio_initialize { | |||
361 | qdio_handler_t *input_handler; | 361 | qdio_handler_t *input_handler; |
362 | qdio_handler_t *output_handler; | 362 | qdio_handler_t *output_handler; |
363 | void (*queue_start_poll) (struct ccw_device *, int, unsigned long); | 363 | void (*queue_start_poll) (struct ccw_device *, int, unsigned long); |
364 | int scan_threshold; | ||
364 | unsigned long int_parm; | 365 | unsigned long int_parm; |
365 | void **input_sbal_addr_array; | 366 | void **input_sbal_addr_array; |
366 | void **output_sbal_addr_array; | 367 | void **output_sbal_addr_array; |
diff --git a/drivers/s390/cio/qdio.h b/drivers/s390/cio/qdio.h index 9b6ea3ca3ece..a77aa9109cfd 100644 --- a/drivers/s390/cio/qdio.h +++ b/drivers/s390/cio/qdio.h | |||
@@ -249,6 +249,8 @@ struct qdio_output_q { | |||
249 | int use_enh_siga; | 249 | int use_enh_siga; |
250 | /* timer to check for more outbound work */ | 250 | /* timer to check for more outbound work */ |
251 | struct timer_list timer; | 251 | struct timer_list timer; |
252 | /* used SBALs before tasklet schedule */ | ||
253 | int scan_threshold; | ||
252 | }; | 254 | }; |
253 | 255 | ||
254 | /* | 256 | /* |
diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c index 6621de94f3ad..4c0109900c74 100644 --- a/drivers/s390/cio/qdio_main.c +++ b/drivers/s390/cio/qdio_main.c | |||
@@ -1492,7 +1492,13 @@ static int handle_outbound(struct qdio_q *q, unsigned int callflags, | |||
1492 | qperf_inc(q, fast_requeue); | 1492 | qperf_inc(q, fast_requeue); |
1493 | 1493 | ||
1494 | out: | 1494 | out: |
1495 | tasklet_schedule(&q->tasklet); | 1495 | /* in case of SIGA errors we must process the error immediately */ |
1496 | if (used >= q->u.out.scan_threshold || rc) | ||
1497 | tasklet_schedule(&q->tasklet); | ||
1498 | else | ||
1499 | /* free the SBALs in case of no further traffic */ | ||
1500 | if (!timer_pending(&q->u.out.timer)) | ||
1501 | mod_timer(&q->u.out.timer, jiffies + HZ); | ||
1496 | return rc; | 1502 | return rc; |
1497 | } | 1503 | } |
1498 | 1504 | ||
diff --git a/drivers/s390/cio/qdio_setup.c b/drivers/s390/cio/qdio_setup.c index a13cf7ec64b2..635f35dc8466 100644 --- a/drivers/s390/cio/qdio_setup.c +++ b/drivers/s390/cio/qdio_setup.c | |||
@@ -178,6 +178,7 @@ static void setup_queues(struct qdio_irq *irq_ptr, | |||
178 | setup_queues_misc(q, irq_ptr, qdio_init->output_handler, i); | 178 | setup_queues_misc(q, irq_ptr, qdio_init->output_handler, i); |
179 | 179 | ||
180 | q->is_input_q = 0; | 180 | q->is_input_q = 0; |
181 | q->u.out.scan_threshold = qdio_init->scan_threshold; | ||
181 | setup_storage_lists(q, irq_ptr, output_sbal_array, i); | 182 | setup_storage_lists(q, irq_ptr, output_sbal_array, i); |
182 | output_sbal_array += QDIO_MAX_BUFFERS_PER_Q; | 183 | output_sbal_array += QDIO_MAX_BUFFERS_PER_Q; |
183 | 184 | ||
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c index e6b2df0e73f5..f65320babf71 100644 --- a/drivers/s390/net/qeth_core_main.c +++ b/drivers/s390/net/qeth_core_main.c | |||
@@ -3831,6 +3831,8 @@ static int qeth_qdio_establish(struct qeth_card *card) | |||
3831 | init_data.int_parm = (unsigned long) card; | 3831 | init_data.int_parm = (unsigned long) card; |
3832 | init_data.input_sbal_addr_array = (void **) in_sbal_ptrs; | 3832 | init_data.input_sbal_addr_array = (void **) in_sbal_ptrs; |
3833 | init_data.output_sbal_addr_array = (void **) out_sbal_ptrs; | 3833 | init_data.output_sbal_addr_array = (void **) out_sbal_ptrs; |
3834 | init_data.scan_threshold = | ||
3835 | (card->info.type == QETH_CARD_TYPE_IQD) ? 8 : 32; | ||
3834 | 3836 | ||
3835 | if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ALLOCATED, | 3837 | if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ALLOCATED, |
3836 | QETH_QDIO_ESTABLISHED) == QETH_QDIO_ALLOCATED) { | 3838 | QETH_QDIO_ESTABLISHED) == QETH_QDIO_ALLOCATED) { |
diff --git a/drivers/s390/scsi/zfcp_qdio.c b/drivers/s390/scsi/zfcp_qdio.c index a0554beb4179..5ae40ef586a8 100644 --- a/drivers/s390/scsi/zfcp_qdio.c +++ b/drivers/s390/scsi/zfcp_qdio.c | |||
@@ -292,6 +292,8 @@ static void zfcp_qdio_setup_init_data(struct qdio_initialize *id, | |||
292 | id->int_parm = (unsigned long) qdio; | 292 | id->int_parm = (unsigned long) qdio; |
293 | id->input_sbal_addr_array = (void **) (qdio->res_q); | 293 | id->input_sbal_addr_array = (void **) (qdio->res_q); |
294 | id->output_sbal_addr_array = (void **) (qdio->req_q); | 294 | id->output_sbal_addr_array = (void **) (qdio->req_q); |
295 | id->scan_threshold = | ||
296 | QDIO_MAX_BUFFERS_PER_Q - ZFCP_QDIO_MAX_SBALS_PER_REQ * 2; | ||
295 | } | 297 | } |
296 | 298 | ||
297 | /** | 299 | /** |