diff options
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/cio/qdio.h | 8 | ||||
-rw-r--r-- | drivers/s390/cio/qdio_main.c | 6 |
2 files changed, 14 insertions, 0 deletions
diff --git a/drivers/s390/cio/qdio.h b/drivers/s390/cio/qdio.h index c1a70985abfa..af867731a5f4 100644 --- a/drivers/s390/cio/qdio.h +++ b/drivers/s390/cio/qdio.h | |||
@@ -16,6 +16,14 @@ | |||
16 | #define QDIO_BUSY_BIT_GIVE_UP 2000000 /* 2 seconds = eternity */ | 16 | #define QDIO_BUSY_BIT_GIVE_UP 2000000 /* 2 seconds = eternity */ |
17 | #define QDIO_INPUT_THRESHOLD 500 /* 500 microseconds */ | 17 | #define QDIO_INPUT_THRESHOLD 500 /* 500 microseconds */ |
18 | 18 | ||
19 | /* | ||
20 | * if an asynchronous HiperSockets queue runs full, the 10 seconds timer wait | ||
21 | * till next initiative to give transmitted skbs back to the stack is too long. | ||
22 | * Therefore polling is started in case of multicast queue is filled more | ||
23 | * than 50 percent. | ||
24 | */ | ||
25 | #define QDIO_IQDIO_POLL_LVL 65 /* HS multicast queue */ | ||
26 | |||
19 | enum qdio_irq_states { | 27 | enum qdio_irq_states { |
20 | QDIO_IRQ_STATE_INACTIVE, | 28 | QDIO_IRQ_STATE_INACTIVE, |
21 | QDIO_IRQ_STATE_ESTABLISHED, | 29 | QDIO_IRQ_STATE_ESTABLISHED, |
diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c index e6eabc853422..9307512132fe 100644 --- a/drivers/s390/cio/qdio_main.c +++ b/drivers/s390/cio/qdio_main.c | |||
@@ -851,6 +851,12 @@ static void __qdio_outbound_processing(struct qdio_q *q) | |||
851 | if (queue_type(q) == QDIO_IQDIO_QFMT && !multicast_outbound(q)) | 851 | if (queue_type(q) == QDIO_IQDIO_QFMT && !multicast_outbound(q)) |
852 | return; | 852 | return; |
853 | 853 | ||
854 | if ((queue_type(q) == QDIO_IQDIO_QFMT) && | ||
855 | (atomic_read(&q->nr_buf_used)) > QDIO_IQDIO_POLL_LVL) { | ||
856 | tasklet_schedule(&q->tasklet); | ||
857 | return; | ||
858 | } | ||
859 | |||
854 | if (q->u.out.pci_out_enabled) | 860 | if (q->u.out.pci_out_enabled) |
855 | return; | 861 | return; |
856 | 862 | ||