aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJan Glauber <jang@linux.vnet.ibm.com>2011-01-05 06:47:53 -0500
committerMartin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com>2011-01-05 06:47:28 -0500
commit110da31709023de61735f2d8a3e52c20c23bb570 (patch)
tree8e3c643ff03bdc10ca04015990963f096878379b /drivers
parent958c0ba403cb6a693b54be2389f9ef53377fa259 (diff)
[S390] qdio: remove enhanced SIGA
HiperSocket devices only use one SBAL per qdio call without the enhanced SIGA feature. Since that feature is currently not used remove it from the qdio code so the compiler can generate better code for the HiperSocket outbound path. While at it mark the SIGA error conditions as unlikely. Signed-off-by: Jan Glauber <jang@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/s390/cio/qdio.h2
-rw-r--r--drivers/s390/cio/qdio_main.c57
2 files changed, 15 insertions, 44 deletions
diff --git a/drivers/s390/cio/qdio.h b/drivers/s390/cio/qdio.h
index 0a42da4beafa..1b40a92fec14 100644
--- a/drivers/s390/cio/qdio.h
+++ b/drivers/s390/cio/qdio.h
@@ -252,8 +252,6 @@ struct qdio_input_q {
252struct qdio_output_q { 252struct qdio_output_q {
253 /* PCIs are enabled for the queue */ 253 /* PCIs are enabled for the queue */
254 int pci_out_enabled; 254 int pci_out_enabled;
255 /* IQDIO: output multiple buffers (enhanced SIGA) */
256 int use_enh_siga;
257 /* timer to check for more outbound work */ 255 /* timer to check for more outbound work */
258 struct timer_list timer; 256 struct timer_list timer;
259 /* used SBALs before tasklet schedule */ 257 /* used SBALs before tasklet schedule */
diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c
index 99823477d57e..8a722f208325 100644
--- a/drivers/s390/cio/qdio_main.c
+++ b/drivers/s390/cio/qdio_main.c
@@ -298,7 +298,7 @@ static inline int qdio_siga_sync(struct qdio_q *q, unsigned int output,
298 } 298 }
299 299
300 cc = do_siga_sync(schid, output, input, fc); 300 cc = do_siga_sync(schid, output, input, fc);
301 if (cc) 301 if (unlikely(cc))
302 DBF_ERROR("%4x SIGA-S:%2d", SCH_NO(q), cc); 302 DBF_ERROR("%4x SIGA-S:%2d", SCH_NO(q), cc);
303 return cc; 303 return cc;
304} 304}
@@ -328,9 +328,6 @@ static int qdio_siga_output(struct qdio_q *q, unsigned int *busy_bit)
328 u64 start_time = 0; 328 u64 start_time = 0;
329 int cc; 329 int cc;
330 330
331 if (q->u.out.use_enh_siga)
332 fc = 3;
333
334 if (is_qebsm(q)) { 331 if (is_qebsm(q)) {
335 schid = q->irq_ptr->sch_token; 332 schid = q->irq_ptr->sch_token;
336 fc |= QDIO_SIGA_QEBSM_FLAG; 333 fc |= QDIO_SIGA_QEBSM_FLAG;
@@ -339,7 +336,7 @@ again:
339 cc = do_siga_output(schid, q->mask, busy_bit, fc); 336 cc = do_siga_output(schid, q->mask, busy_bit, fc);
340 337
341 /* hipersocket busy condition */ 338 /* hipersocket busy condition */
342 if (*busy_bit) { 339 if (unlikely(*busy_bit)) {
343 WARN_ON(queue_type(q) != QDIO_IQDIO_QFMT || cc != 2); 340 WARN_ON(queue_type(q) != QDIO_IQDIO_QFMT || cc != 2);
344 341
345 if (!start_time) { 342 if (!start_time) {
@@ -367,7 +364,7 @@ static inline int qdio_siga_input(struct qdio_q *q)
367 } 364 }
368 365
369 cc = do_siga_input(schid, q->mask, fc); 366 cc = do_siga_input(schid, q->mask, fc);
370 if (cc) 367 if (unlikely(cc))
371 DBF_ERROR("%4x SIGA-R:%2d", SCH_NO(q), cc); 368 DBF_ERROR("%4x SIGA-R:%2d", SCH_NO(q), cc);
372 return cc; 369 return cc;
373} 370}
@@ -1288,7 +1285,6 @@ int qdio_establish(struct qdio_initialize *init_data)
1288 } 1285 }
1289 1286
1290 qdio_setup_ssqd_info(irq_ptr); 1287 qdio_setup_ssqd_info(irq_ptr);
1291 DBF_EVENT("qDmmwc:%2x", irq_ptr->ssqd_desc.mmwc);
1292 DBF_EVENT("qib ac:%4x", irq_ptr->qib.ac); 1288 DBF_EVENT("qib ac:%4x", irq_ptr->qib.ac);
1293 1289
1294 /* qebsm is now setup if available, initialize buffer states */ 1290 /* qebsm is now setup if available, initialize buffer states */
@@ -1466,48 +1462,25 @@ static int handle_outbound(struct qdio_q *q, unsigned int callflags,
1466 if (callflags & QDIO_FLAG_PCI_OUT) { 1462 if (callflags & QDIO_FLAG_PCI_OUT) {
1467 q->u.out.pci_out_enabled = 1; 1463 q->u.out.pci_out_enabled = 1;
1468 qperf_inc(q, pci_request_int); 1464 qperf_inc(q, pci_request_int);
1469 } 1465 } else
1470 else
1471 q->u.out.pci_out_enabled = 0; 1466 q->u.out.pci_out_enabled = 0;
1472 1467
1473 if (queue_type(q) == QDIO_IQDIO_QFMT) { 1468 if (queue_type(q) == QDIO_IQDIO_QFMT) {
1474 if (multicast_outbound(q)) 1469 /* One SIGA-W per buffer required for unicast HiperSockets. */
1470 WARN_ON_ONCE(count > 1 && !multicast_outbound(q));
1471
1472 rc = qdio_kick_outbound_q(q);
1473 } else if (unlikely(need_siga_sync(q))) {
1474 rc = qdio_siga_sync_q(q);
1475 } else {
1476 /* try to fast requeue buffers */
1477 get_buf_state(q, prev_buf(bufnr), &state, 0);
1478 if (state != SLSB_CU_OUTPUT_PRIMED)
1475 rc = qdio_kick_outbound_q(q); 1479 rc = qdio_kick_outbound_q(q);
1476 else 1480 else
1477 if ((q->irq_ptr->ssqd_desc.mmwc > 1) && 1481 qperf_inc(q, fast_requeue);
1478 (count > 1) &&
1479 (count <= q->irq_ptr->ssqd_desc.mmwc)) {
1480 /* exploit enhanced SIGA */
1481 q->u.out.use_enh_siga = 1;
1482 rc = qdio_kick_outbound_q(q);
1483 } else {
1484 /*
1485 * One siga-w per buffer required for unicast
1486 * HiperSockets.
1487 */
1488 q->u.out.use_enh_siga = 0;
1489 while (count--) {
1490 rc = qdio_kick_outbound_q(q);
1491 if (rc)
1492 goto out;
1493 }
1494 }
1495 goto out;
1496 } 1482 }
1497 1483
1498 if (need_siga_sync(q)) {
1499 qdio_siga_sync_q(q);
1500 goto out;
1501 }
1502
1503 /* try to fast requeue buffers */
1504 get_buf_state(q, prev_buf(bufnr), &state, 0);
1505 if (state != SLSB_CU_OUTPUT_PRIMED)
1506 rc = qdio_kick_outbound_q(q);
1507 else
1508 qperf_inc(q, fast_requeue);
1509
1510out:
1511 /* in case of SIGA errors we must process the error immediately */ 1484 /* in case of SIGA errors we must process the error immediately */
1512 if (used >= q->u.out.scan_threshold || rc) 1485 if (used >= q->u.out.scan_threshold || rc)
1513 tasklet_schedule(&q->tasklet); 1486 tasklet_schedule(&q->tasklet);