diff options
Diffstat (limited to 'drivers/s390/cio')
-rw-r--r-- | drivers/s390/cio/device.c | 15 | ||||
-rw-r--r-- | drivers/s390/cio/qdio.c | 13 | ||||
-rw-r--r-- | drivers/s390/cio/qdio.h | 2 |
3 files changed, 16 insertions, 14 deletions
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index d35dc3f25d06..fec004f62bcf 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
@@ -32,7 +32,7 @@ | |||
32 | #include "io_sch.h" | 32 | #include "io_sch.h" |
33 | 33 | ||
34 | static struct timer_list recovery_timer; | 34 | static struct timer_list recovery_timer; |
35 | static spinlock_t recovery_lock; | 35 | static DEFINE_SPINLOCK(recovery_lock); |
36 | static int recovery_phase; | 36 | static int recovery_phase; |
37 | static const unsigned long recovery_delay[] = { 3, 30, 300 }; | 37 | static const unsigned long recovery_delay[] = { 3, 30, 300 }; |
38 | 38 | ||
@@ -1535,7 +1535,7 @@ static int recovery_check(struct device *dev, void *data) | |||
1535 | return 0; | 1535 | return 0; |
1536 | } | 1536 | } |
1537 | 1537 | ||
1538 | static void recovery_func(unsigned long data) | 1538 | static void recovery_work_func(struct work_struct *unused) |
1539 | { | 1539 | { |
1540 | int redo = 0; | 1540 | int redo = 0; |
1541 | 1541 | ||
@@ -1553,6 +1553,17 @@ static void recovery_func(unsigned long data) | |||
1553 | CIO_MSG_EVENT(2, "recovery: end\n"); | 1553 | CIO_MSG_EVENT(2, "recovery: end\n"); |
1554 | } | 1554 | } |
1555 | 1555 | ||
1556 | static DECLARE_WORK(recovery_work, recovery_work_func); | ||
1557 | |||
1558 | static void recovery_func(unsigned long data) | ||
1559 | { | ||
1560 | /* | ||
1561 | * We can't do our recovery in softirq context and it's not | ||
1562 | * performance critical, so we schedule it. | ||
1563 | */ | ||
1564 | schedule_work(&recovery_work); | ||
1565 | } | ||
1566 | |||
1556 | void ccw_device_schedule_recovery(void) | 1567 | void ccw_device_schedule_recovery(void) |
1557 | { | 1568 | { |
1558 | unsigned long flags; | 1569 | unsigned long flags; |
diff --git a/drivers/s390/cio/qdio.c b/drivers/s390/cio/qdio.c index 097fc0967e9d..2b5bfb7c69e5 100644 --- a/drivers/s390/cio/qdio.c +++ b/drivers/s390/cio/qdio.c | |||
@@ -32,7 +32,7 @@ | |||
32 | 32 | ||
33 | #include <linux/module.h> | 33 | #include <linux/module.h> |
34 | #include <linux/init.h> | 34 | #include <linux/init.h> |
35 | 35 | #include <linux/delay.h> | |
36 | #include <linux/slab.h> | 36 | #include <linux/slab.h> |
37 | #include <linux/kernel.h> | 37 | #include <linux/kernel.h> |
38 | #include <linux/proc_fs.h> | 38 | #include <linux/proc_fs.h> |
@@ -1215,9 +1215,6 @@ tiqdio_is_inbound_q_done(struct qdio_q *q) | |||
1215 | 1215 | ||
1216 | if (!no_used) | 1216 | if (!no_used) |
1217 | return 1; | 1217 | return 1; |
1218 | if (!q->siga_sync && !irq->is_qebsm) | ||
1219 | /* we'll check for more primed buffers in qeth_stop_polling */ | ||
1220 | return 0; | ||
1221 | if (irq->is_qebsm) { | 1218 | if (irq->is_qebsm) { |
1222 | count = 1; | 1219 | count = 1; |
1223 | start_buf = q->first_to_check; | 1220 | start_buf = q->first_to_check; |
@@ -3332,13 +3329,7 @@ qdio_activate(struct ccw_device *cdev, int flags) | |||
3332 | } | 3329 | } |
3333 | } | 3330 | } |
3334 | 3331 | ||
3335 | wait_event_interruptible_timeout(cdev->private->wait_q, | 3332 | msleep(QDIO_ACTIVATE_TIMEOUT); |
3336 | ((irq_ptr->state == | ||
3337 | QDIO_IRQ_STATE_STOPPED) || | ||
3338 | (irq_ptr->state == | ||
3339 | QDIO_IRQ_STATE_ERR)), | ||
3340 | QDIO_ACTIVATE_TIMEOUT); | ||
3341 | |||
3342 | switch (irq_ptr->state) { | 3333 | switch (irq_ptr->state) { |
3343 | case QDIO_IRQ_STATE_STOPPED: | 3334 | case QDIO_IRQ_STATE_STOPPED: |
3344 | case QDIO_IRQ_STATE_ERR: | 3335 | case QDIO_IRQ_STATE_ERR: |
diff --git a/drivers/s390/cio/qdio.h b/drivers/s390/cio/qdio.h index 37870e4e938e..da8a272fd75b 100644 --- a/drivers/s390/cio/qdio.h +++ b/drivers/s390/cio/qdio.h | |||
@@ -57,10 +57,10 @@ | |||
57 | of the queue to 0 */ | 57 | of the queue to 0 */ |
58 | 58 | ||
59 | #define QDIO_ESTABLISH_TIMEOUT (1*HZ) | 59 | #define QDIO_ESTABLISH_TIMEOUT (1*HZ) |
60 | #define QDIO_ACTIVATE_TIMEOUT (5*HZ) | ||
61 | #define QDIO_CLEANUP_CLEAR_TIMEOUT (20*HZ) | 60 | #define QDIO_CLEANUP_CLEAR_TIMEOUT (20*HZ) |
62 | #define QDIO_CLEANUP_HALT_TIMEOUT (10*HZ) | 61 | #define QDIO_CLEANUP_HALT_TIMEOUT (10*HZ) |
63 | #define QDIO_FORCE_CHECK_TIMEOUT (10*HZ) | 62 | #define QDIO_FORCE_CHECK_TIMEOUT (10*HZ) |
63 | #define QDIO_ACTIVATE_TIMEOUT (5) /* 5 ms */ | ||
64 | 64 | ||
65 | enum qdio_irq_states { | 65 | enum qdio_irq_states { |
66 | QDIO_IRQ_STATE_INACTIVE, | 66 | QDIO_IRQ_STATE_INACTIVE, |