aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/cio
diff options
context:
space:
mode:
authorKlaus-Dieter Wacker <kdwacker@de.ibm.com>2008-10-10 15:33:18 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2008-10-10 15:33:55 -0400
commit7a0f475513fa573bc8e072021960313da32f0ee3 (patch)
tree397d3d7862d793261a08c7a742101672fd3d7980 /drivers/s390/cio
parentb1e766137fe2462fd110e2930f74ef5636adb436 (diff)
[S390] qdio enhanced SIGA (iqdio) support.
Add support for z10 HiperSockets multiwrite SBALs on output queues. This is used on LPAR with EDDP enabled devices. Signed-off-by: Klaus-Dieter Wacker <kdwacker@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390/cio')
-rw-r--r--drivers/s390/cio/qdio.h3
-rw-r--r--drivers/s390/cio/qdio_main.c24
2 files changed, 22 insertions, 5 deletions
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