Commit d6e51503 authored by Julian Wiedmann's avatar Julian Wiedmann Committed by Jakub Kicinski

s390/qeth: don't fake a TX completion interrupt after TX error

When do_qdio() returns with an unexpected error, qeth_flush_buffers()
kicks off a recovery action.

In such a case there's no point in starting TX completion processing,
the device gets torn down anyway. So take a closer look at do_qdio()'s
return value, and skip the TX completion processing accordingly.
Signed-off-by: default avatarJulian Wiedmann <jwi@linux.ibm.com>
Acked-by: default avatarWillem de Bruijn <willemb@google.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent a667fee1
...@@ -3692,24 +3692,27 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index, ...@@ -3692,24 +3692,27 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index,
rc = do_QDIO(CARD_DDEV(queue->card), qdio_flags, rc = do_QDIO(CARD_DDEV(queue->card), qdio_flags,
queue->queue_no, index, count); queue->queue_no, index, count);
/* Fake the TX completion interrupt: */ switch (rc) {
if (IS_IQD(card)) { case 0:
unsigned int frames = READ_ONCE(queue->max_coalesced_frames); case -ENOBUFS:
unsigned int usecs = READ_ONCE(queue->coalesce_usecs); /* ignore temporary SIGA errors without busy condition */
if (frames && queue->coalesced_frames >= frames) { /* Fake the TX completion interrupt: */
napi_schedule(&queue->napi); if (IS_IQD(card)) {
queue->coalesced_frames = 0; unsigned int frames = READ_ONCE(queue->max_coalesced_frames);
QETH_TXQ_STAT_INC(queue, coal_frames); unsigned int usecs = READ_ONCE(queue->coalesce_usecs);
} else if (usecs) {
qeth_tx_arm_timer(queue, usecs); if (frames && queue->coalesced_frames >= frames) {
napi_schedule(&queue->napi);
queue->coalesced_frames = 0;
QETH_TXQ_STAT_INC(queue, coal_frames);
} else if (usecs) {
qeth_tx_arm_timer(queue, usecs);
}
} }
}
if (rc) { break;
/* ignore temporary SIGA errors without busy condition */ default:
if (rc == -ENOBUFS)
return;
QETH_CARD_TEXT(queue->card, 2, "flushbuf"); QETH_CARD_TEXT(queue->card, 2, "flushbuf");
QETH_CARD_TEXT_(queue->card, 2, " q%d", queue->queue_no); QETH_CARD_TEXT_(queue->card, 2, " q%d", queue->queue_no);
QETH_CARD_TEXT_(queue->card, 2, " idx%d", index); QETH_CARD_TEXT_(queue->card, 2, " idx%d", index);
...@@ -3719,7 +3722,6 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index, ...@@ -3719,7 +3722,6 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index,
/* this must not happen under normal circumstances. if it /* this must not happen under normal circumstances. if it
* happens something is really wrong -> recover */ * happens something is really wrong -> recover */
qeth_schedule_recovery(queue->card); qeth_schedule_recovery(queue->card);
return;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment