diff options
author | Holger Dengler <hd@linux.vnet.ibm.com> | 2011-11-14 05:19:04 -0500 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2011-11-14 05:19:09 -0500 |
commit | bc615deaf35ab06e7fe5672b0efb3c7a0b2dcf1a (patch) | |
tree | 6cd9c934c22361eeb628de2a54ed9f85705f5212 /drivers/s390 | |
parent | 96603b505cb6c54782a27599afef65cc108ef5f2 (diff) |
[S390] ap: Setup processing for messages in request queue.
Setup timer for processing messages in request queue, if sending an AP
message returns with reason code AP_RESPONSE_RESET_IN_PROGRESS.
Signed-off-by: Holger Dengler <hd@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/crypto/ap_bus.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c index b77ae519d79c..ec94f049e995 100644 --- a/drivers/s390/crypto/ap_bus.c +++ b/drivers/s390/crypto/ap_bus.c | |||
@@ -1271,18 +1271,16 @@ ap_config_timeout(unsigned long ptr) | |||
1271 | } | 1271 | } |
1272 | 1272 | ||
1273 | /** | 1273 | /** |
1274 | * ap_schedule_poll_timer(): Schedule poll timer. | 1274 | * __ap_schedule_poll_timer(): Schedule poll timer. |
1275 | * | 1275 | * |
1276 | * Set up the timer to run the poll tasklet | 1276 | * Set up the timer to run the poll tasklet |
1277 | */ | 1277 | */ |
1278 | static inline void ap_schedule_poll_timer(void) | 1278 | static inline void __ap_schedule_poll_timer(void) |
1279 | { | 1279 | { |
1280 | ktime_t hr_time; | 1280 | ktime_t hr_time; |
1281 | 1281 | ||
1282 | spin_lock_bh(&ap_poll_timer_lock); | 1282 | spin_lock_bh(&ap_poll_timer_lock); |
1283 | if (ap_using_interrupts() || ap_suspend_flag) | 1283 | if (hrtimer_is_queued(&ap_poll_timer) || ap_suspend_flag) |
1284 | goto out; | ||
1285 | if (hrtimer_is_queued(&ap_poll_timer)) | ||
1286 | goto out; | 1284 | goto out; |
1287 | if (ktime_to_ns(hrtimer_expires_remaining(&ap_poll_timer)) <= 0) { | 1285 | if (ktime_to_ns(hrtimer_expires_remaining(&ap_poll_timer)) <= 0) { |
1288 | hr_time = ktime_set(0, poll_timeout); | 1286 | hr_time = ktime_set(0, poll_timeout); |
@@ -1294,6 +1292,18 @@ out: | |||
1294 | } | 1292 | } |
1295 | 1293 | ||
1296 | /** | 1294 | /** |
1295 | * ap_schedule_poll_timer(): Schedule poll timer. | ||
1296 | * | ||
1297 | * Set up the timer to run the poll tasklet | ||
1298 | */ | ||
1299 | static inline void ap_schedule_poll_timer(void) | ||
1300 | { | ||
1301 | if (ap_using_interrupts()) | ||
1302 | return; | ||
1303 | __ap_schedule_poll_timer(); | ||
1304 | } | ||
1305 | |||
1306 | /** | ||
1297 | * ap_poll_read(): Receive pending reply messages from an AP device. | 1307 | * ap_poll_read(): Receive pending reply messages from an AP device. |
1298 | * @ap_dev: pointer to the AP device | 1308 | * @ap_dev: pointer to the AP device |
1299 | * @flags: pointer to control flags, bit 2^0 is set if another poll is | 1309 | * @flags: pointer to control flags, bit 2^0 is set if another poll is |
@@ -1374,8 +1384,9 @@ static int ap_poll_write(struct ap_device *ap_dev, unsigned long *flags) | |||
1374 | *flags |= 1; | 1384 | *flags |= 1; |
1375 | *flags |= 2; | 1385 | *flags |= 2; |
1376 | break; | 1386 | break; |
1377 | case AP_RESPONSE_Q_FULL: | ||
1378 | case AP_RESPONSE_RESET_IN_PROGRESS: | 1387 | case AP_RESPONSE_RESET_IN_PROGRESS: |
1388 | __ap_schedule_poll_timer(); | ||
1389 | case AP_RESPONSE_Q_FULL: | ||
1379 | *flags |= 2; | 1390 | *flags |= 2; |
1380 | break; | 1391 | break; |
1381 | case AP_RESPONSE_MESSAGE_TOO_BIG: | 1392 | case AP_RESPONSE_MESSAGE_TOO_BIG: |