aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/s390/include/asm/qdio.h1
-rw-r--r--drivers/s390/cio/qdio.h2
-rw-r--r--drivers/s390/cio/qdio_main.c8
-rw-r--r--drivers/s390/cio/qdio_setup.c1
-rw-r--r--drivers/s390/net/qeth_core_main.c2
-rw-r--r--drivers/s390/scsi/zfcp_qdio.c2
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
1494out: 1494out:
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/**