aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/s390/include/asm/qdio.h8
-rw-r--r--drivers/s390/cio/qdio.h3
-rw-r--r--drivers/s390/cio/qdio_main.c24
3 files changed, 29 insertions, 6 deletions
diff --git a/arch/s390/include/asm/qdio.h b/arch/s390/include/asm/qdio.h
index 6813772171f2..4734c3f05354 100644
--- a/arch/s390/include/asm/qdio.h
+++ b/arch/s390/include/asm/qdio.h
@@ -299,7 +299,13 @@ struct qdio_ssqd_desc {
299 u8 mbccnt; 299 u8 mbccnt;
300 u16 qdioac2; 300 u16 qdioac2;
301 u64 sch_token; 301 u64 sch_token;
302 u64:64; 302 u8 mro;
303 u8 mri;
304 u8:8;
305 u8 sbalic;
306 u16:16;
307 u8:8;
308 u8 mmwc;
303} __attribute__ ((packed)); 309} __attribute__ ((packed));
304 310
305/* params are: ccw_device, qdio_error, queue_number, 311/* params are: ccw_device, qdio_error, queue_number,
diff --git a/drivers/s390/cio/qdio.h b/drivers/s390/cio/qdio.h
index af867731a5f4..e3ea1d5f2810 100644
--- a/drivers/s390/cio/qdio.h
+++ b/drivers/s390/cio/qdio.h
@@ -203,6 +203,9 @@ struct qdio_output_q {
203 /* PCIs are enabled for the queue */ 203 /* PCIs are enabled for the queue */
204 int pci_out_enabled; 204 int pci_out_enabled;
205 205
206 /* IQDIO: output multiple buffers (enhanced SIGA) */
207 int use_enh_siga;
208
206 /* timer to check for more outbound work */ 209 /* timer to check for more outbound work */
207 struct timer_list timer; 210 struct timer_list timer;
208}; 211};
diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c
index 719066ec0c01..a50682d2a0fa 100644
--- a/drivers/s390/cio/qdio_main.c
+++ b/drivers/s390/cio/qdio_main.c
@@ -316,6 +316,9 @@ static inline int qdio_do_siga_output(struct qdio_q *q, unsigned int *busy_bit)
316 unsigned int fc = 0; 316 unsigned int fc = 0;
317 unsigned long schid; 317 unsigned long schid;
318 318
319 if (q->u.out.use_enh_siga) {
320 fc = 3;
321 }
319 if (!is_qebsm(q)) 322 if (!is_qebsm(q))
320 schid = *((u32 *)&q->irq_ptr->schid); 323 schid = *((u32 *)&q->irq_ptr->schid);
321 else { 324 else {
@@ -1449,6 +1452,8 @@ int qdio_establish(struct qdio_initialize *init_data)
1449 } 1452 }
1450 1453
1451 qdio_setup_ssqd_info(irq_ptr); 1454 qdio_setup_ssqd_info(irq_ptr);
1455 sprintf(dbf_text, "qDmmwc%2x", irq_ptr->ssqd_desc.mmwc);
1456 QDIO_DBF_TEXT2(0, setup, dbf_text);
1452 sprintf(dbf_text, "qib ac%2x", irq_ptr->qib.ac); 1457 sprintf(dbf_text, "qib ac%2x", irq_ptr->qib.ac);
1453 QDIO_DBF_TEXT2(0, setup, dbf_text); 1458 QDIO_DBF_TEXT2(0, setup, dbf_text);
1454 1459
@@ -1621,12 +1626,21 @@ static void handle_outbound(struct qdio_q *q, unsigned int callflags,
1621 if (multicast_outbound(q)) 1626 if (multicast_outbound(q))
1622 qdio_kick_outbound_q(q); 1627 qdio_kick_outbound_q(q);
1623 else 1628 else
1624 /* 1629 if ((q->irq_ptr->ssqd_desc.mmwc > 1) &&
1625 * One siga-w per buffer required for unicast 1630 (count > 1) &&
1626 * HiperSockets. 1631 (count <= q->irq_ptr->ssqd_desc.mmwc)) {
1627 */ 1632 /* exploit enhanced SIGA */
1628 while (count--) 1633 q->u.out.use_enh_siga = 1;
1629 qdio_kick_outbound_q(q); 1634 qdio_kick_outbound_q(q);
1635 } else {
1636 /*
1637 * One siga-w per buffer required for unicast
1638 * HiperSockets.
1639 */
1640 q->u.out.use_enh_siga = 0;
1641 while (count--)
1642 qdio_kick_outbound_q(q);
1643 }
1630 goto out; 1644 goto out;
1631 } 1645 }
1632 1646