Commit 6ee091ef authored by Julian Wiedmann's avatar Julian Wiedmann Committed by David S. Miller

s390/qeth: set TX IRQ marker on last buffer in a group

When qeth_flush_buffers() gets called for a group of TX buffers
(currently up to 2 for OSA-style devices), the code iterates over each
buffer for some final processing.

During this processing, it sets the TX IRQ marker on the leading buffer
rather than the last one. This can result in delayed TX completion of
the trailing buffers. So pull the IRQ marker code out of the loop, and
apply it to the final buffer.
Signed-off-by: default avatarJulian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a875fd16
...@@ -3617,11 +3617,11 @@ static int qeth_switch_to_nonpacking_if_needed(struct qeth_qdio_out_q *queue) ...@@ -3617,11 +3617,11 @@ static int qeth_switch_to_nonpacking_if_needed(struct qeth_qdio_out_q *queue)
static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index, static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index,
int count) int count)
{ {
struct qeth_qdio_out_buffer *buf = queue->bufs[index];
unsigned int qdio_flags = QDIO_FLAG_SYNC_OUTPUT;
struct qeth_card *card = queue->card; struct qeth_card *card = queue->card;
struct qeth_qdio_out_buffer *buf;
int rc; int rc;
int i; int i;
unsigned int qdio_flags;
for (i = index; i < index + count; ++i) { for (i = index; i < index + count; ++i) {
unsigned int bidx = QDIO_BUFNR(i); unsigned int bidx = QDIO_BUFNR(i);
...@@ -3638,9 +3638,10 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index, ...@@ -3638,9 +3638,10 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index,
if (IS_IQD(card)) { if (IS_IQD(card)) {
skb_queue_walk(&buf->skb_list, skb) skb_queue_walk(&buf->skb_list, skb)
skb_tx_timestamp(skb); skb_tx_timestamp(skb);
continue;
} }
}
if (!IS_IQD(card)) {
if (!queue->do_pack) { if (!queue->do_pack) {
if ((atomic_read(&queue->used_buffers) >= if ((atomic_read(&queue->used_buffers) >=
(QETH_HIGH_WATERMARK_PACK - (QETH_HIGH_WATERMARK_PACK -
...@@ -3665,12 +3666,12 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index, ...@@ -3665,12 +3666,12 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index,
buf->buffer->element[0].sflags |= SBAL_SFLAGS0_PCI_REQ; buf->buffer->element[0].sflags |= SBAL_SFLAGS0_PCI_REQ;
} }
} }
if (atomic_read(&queue->set_pci_flags_count))
qdio_flags |= QDIO_FLAG_PCI_OUT;
} }
QETH_TXQ_STAT_INC(queue, doorbell); QETH_TXQ_STAT_INC(queue, doorbell);
qdio_flags = QDIO_FLAG_SYNC_OUTPUT;
if (atomic_read(&queue->set_pci_flags_count))
qdio_flags |= QDIO_FLAG_PCI_OUT;
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);
......
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