diff options
-rw-r--r-- | arch/s390/include/asm/qdio.h | 8 | ||||
-rw-r--r-- | drivers/s390/cio/qdio.h | 3 | ||||
-rw-r--r-- | drivers/s390/cio/qdio_main.c | 24 |
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 | ||