aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUrsula Braun <braunu@de.ibm.com>2006-12-15 11:18:14 -0500
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2006-12-15 11:18:14 -0500
commit028cf917b258b11286437a1b96e64030f94fd46d (patch)
tree20036cfc27424fe5287335764226ecb807852d04
parent86b22470f68528c68cb25dbd58886040e1917494 (diff)
[S390] Hipersocket multicast queue: make sure outbound handler is called
A HiperSocket multicast queue works asynchronously. When sending buffers, the buffer state change from PRIMED to EMPTY may happen delayed. Reschedule the checking for changes in the outbound queue, if there are still PRIMED buffers. Signed-off-by: Ursula Braun <braunu@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
-rw-r--r--drivers/s390/cio/qdio.c13
-rw-r--r--include/asm-s390/qdio.h1
2 files changed, 9 insertions, 5 deletions
diff --git a/drivers/s390/cio/qdio.c b/drivers/s390/cio/qdio.c
index 9d4ea449a608..6fd1940842eb 100644
--- a/drivers/s390/cio/qdio.c
+++ b/drivers/s390/cio/qdio.c
@@ -979,12 +979,11 @@ __qdio_outbound_processing(struct qdio_q *q)
979 979
980 if (q->is_iqdio_q) { 980 if (q->is_iqdio_q) {
981 /* 981 /*
982 * for asynchronous queues, we better check, if the fill 982 * for asynchronous queues, we better check, if the sent
983 * level is too high. for synchronous queues, the fill 983 * buffer is already switched from PRIMED to EMPTY.
984 * level will never be that high.
985 */ 984 */
986 if (atomic_read(&q->number_of_buffers_used)> 985 if ((q->queue_type == QDIO_IQDIO_QFMT_ASYNCH) &&
987 IQDIO_FILL_LEVEL_TO_POLL) 986 !qdio_is_outbound_q_done(q))
988 qdio_mark_q(q); 987 qdio_mark_q(q);
989 988
990 } else if (!q->hydra_gives_outbound_pcis) 989 } else if (!q->hydra_gives_outbound_pcis)
@@ -1825,6 +1824,10 @@ qdio_fill_qs(struct qdio_irq *irq_ptr, struct ccw_device *cdev,
1825 q->sbal[j]=*(outbound_sbals_array++); 1824 q->sbal[j]=*(outbound_sbals_array++);
1826 1825
1827 q->queue_type=q_format; 1826 q->queue_type=q_format;
1827 if ((q->queue_type == QDIO_IQDIO_QFMT) &&
1828 (no_output_qs > 1) &&
1829 (i == no_output_qs-1))
1830 q->queue_type = QDIO_IQDIO_QFMT_ASYNCH;
1828 q->int_parm=int_parm; 1831 q->int_parm=int_parm;
1829 q->is_input_q=0; 1832 q->is_input_q=0;
1830 q->schid = irq_ptr->schid; 1833 q->schid = irq_ptr->schid;
diff --git a/include/asm-s390/qdio.h b/include/asm-s390/qdio.h
index 7189c79bc673..127f72e77419 100644
--- a/include/asm-s390/qdio.h
+++ b/include/asm-s390/qdio.h
@@ -34,6 +34,7 @@
34#define QDIO_QETH_QFMT 0 34#define QDIO_QETH_QFMT 0
35#define QDIO_ZFCP_QFMT 1 35#define QDIO_ZFCP_QFMT 1
36#define QDIO_IQDIO_QFMT 2 36#define QDIO_IQDIO_QFMT 2
37#define QDIO_IQDIO_QFMT_ASYNCH 3
37 38
38struct qdio_buffer_element{ 39struct qdio_buffer_element{
39 unsigned int flags; 40 unsigned int flags;