]> git.proxmox.com Git - mirror_ubuntu-disco-kernel.git/blob - drivers/s390/crypto/ap_queue.c
Merge tag 'firmware_removal-4.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel...
[mirror_ubuntu-disco-kernel.git] / drivers / s390 / crypto / ap_queue.c
1 /*
2 * Copyright IBM Corp. 2016
3 * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
4 *
5 * Adjunct processor bus, queue related code.
6 */
7
8 #define KMSG_COMPONENT "ap"
9 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
10
11 #include <linux/init.h>
12 #include <linux/slab.h>
13 #include <asm/facility.h>
14
15 #include "ap_bus.h"
16 #include "ap_asm.h"
17
18 /**
19 * ap_queue_irq_ctrl(): Control interruption on a AP queue.
20 * @qirqctrl: struct ap_qirq_ctrl (64 bit value)
21 * @ind: The notification indicator byte
22 *
23 * Returns AP queue status.
24 *
25 * Control interruption on the given AP queue.
26 * Just a simple wrapper function for the low level PQAP(AQIC)
27 * instruction available for other kernel modules.
28 */
29 struct ap_queue_status ap_queue_irq_ctrl(ap_qid_t qid,
30 struct ap_qirq_ctrl qirqctrl,
31 void *ind)
32 {
33 return ap_aqic(qid, qirqctrl, ind);
34 }
35 EXPORT_SYMBOL(ap_queue_irq_ctrl);
36
37 /**
38 * ap_queue_enable_interruption(): Enable interruption on an AP queue.
39 * @qid: The AP queue number
40 * @ind: the notification indicator byte
41 *
42 * Enables interruption on AP queue via ap_aqic(). Based on the return
43 * value it waits a while and tests the AP queue if interrupts
44 * have been switched on using ap_test_queue().
45 */
46 static int ap_queue_enable_interruption(struct ap_queue *aq, void *ind)
47 {
48 struct ap_queue_status status;
49 struct ap_qirq_ctrl qirqctrl = { 0 };
50
51 qirqctrl.ir = 1;
52 qirqctrl.isc = AP_ISC;
53 status = ap_aqic(aq->qid, qirqctrl, ind);
54 switch (status.response_code) {
55 case AP_RESPONSE_NORMAL:
56 case AP_RESPONSE_OTHERWISE_CHANGED:
57 return 0;
58 case AP_RESPONSE_Q_NOT_AVAIL:
59 case AP_RESPONSE_DECONFIGURED:
60 case AP_RESPONSE_CHECKSTOPPED:
61 case AP_RESPONSE_INVALID_ADDRESS:
62 pr_err("Registering adapter interrupts for AP device %02x.%04x failed\n",
63 AP_QID_CARD(aq->qid),
64 AP_QID_QUEUE(aq->qid));
65 return -EOPNOTSUPP;
66 case AP_RESPONSE_RESET_IN_PROGRESS:
67 case AP_RESPONSE_BUSY:
68 default:
69 return -EBUSY;
70 }
71 }
72
73 /**
74 * __ap_send(): Send message to adjunct processor queue.
75 * @qid: The AP queue number
76 * @psmid: The program supplied message identifier
77 * @msg: The message text
78 * @length: The message length
79 * @special: Special Bit
80 *
81 * Returns AP queue status structure.
82 * Condition code 1 on NQAP can't happen because the L bit is 1.
83 * Condition code 2 on NQAP also means the send is incomplete,
84 * because a segment boundary was reached. The NQAP is repeated.
85 */
86 static inline struct ap_queue_status
87 __ap_send(ap_qid_t qid, unsigned long long psmid, void *msg, size_t length,
88 unsigned int special)
89 {
90 if (special == 1)
91 qid |= 0x400000UL;
92 return ap_nqap(qid, psmid, msg, length);
93 }
94
95 int ap_send(ap_qid_t qid, unsigned long long psmid, void *msg, size_t length)
96 {
97 struct ap_queue_status status;
98
99 status = __ap_send(qid, psmid, msg, length, 0);
100 switch (status.response_code) {
101 case AP_RESPONSE_NORMAL:
102 return 0;
103 case AP_RESPONSE_Q_FULL:
104 case AP_RESPONSE_RESET_IN_PROGRESS:
105 return -EBUSY;
106 case AP_RESPONSE_REQ_FAC_NOT_INST:
107 return -EINVAL;
108 default: /* Device is gone. */
109 return -ENODEV;
110 }
111 }
112 EXPORT_SYMBOL(ap_send);
113
114 int ap_recv(ap_qid_t qid, unsigned long long *psmid, void *msg, size_t length)
115 {
116 struct ap_queue_status status;
117
118 if (msg == NULL)
119 return -EINVAL;
120 status = ap_dqap(qid, psmid, msg, length);
121 switch (status.response_code) {
122 case AP_RESPONSE_NORMAL:
123 return 0;
124 case AP_RESPONSE_NO_PENDING_REPLY:
125 if (status.queue_empty)
126 return -ENOENT;
127 return -EBUSY;
128 case AP_RESPONSE_RESET_IN_PROGRESS:
129 return -EBUSY;
130 default:
131 return -ENODEV;
132 }
133 }
134 EXPORT_SYMBOL(ap_recv);
135
136 /* State machine definitions and helpers */
137
138 static enum ap_wait ap_sm_nop(struct ap_queue *aq)
139 {
140 return AP_WAIT_NONE;
141 }
142
143 /**
144 * ap_sm_recv(): Receive pending reply messages from an AP queue but do
145 * not change the state of the device.
146 * @aq: pointer to the AP queue
147 *
148 * Returns AP_WAIT_NONE, AP_WAIT_AGAIN, or AP_WAIT_INTERRUPT
149 */
150 static struct ap_queue_status ap_sm_recv(struct ap_queue *aq)
151 {
152 struct ap_queue_status status;
153 struct ap_message *ap_msg;
154
155 status = ap_dqap(aq->qid, &aq->reply->psmid,
156 aq->reply->message, aq->reply->length);
157 switch (status.response_code) {
158 case AP_RESPONSE_NORMAL:
159 aq->queue_count--;
160 if (aq->queue_count > 0)
161 mod_timer(&aq->timeout,
162 jiffies + aq->request_timeout);
163 list_for_each_entry(ap_msg, &aq->pendingq, list) {
164 if (ap_msg->psmid != aq->reply->psmid)
165 continue;
166 list_del_init(&ap_msg->list);
167 aq->pendingq_count--;
168 ap_msg->receive(aq, ap_msg, aq->reply);
169 break;
170 }
171 case AP_RESPONSE_NO_PENDING_REPLY:
172 if (!status.queue_empty || aq->queue_count <= 0)
173 break;
174 /* The card shouldn't forget requests but who knows. */
175 aq->queue_count = 0;
176 list_splice_init(&aq->pendingq, &aq->requestq);
177 aq->requestq_count += aq->pendingq_count;
178 aq->pendingq_count = 0;
179 break;
180 default:
181 break;
182 }
183 return status;
184 }
185
186 /**
187 * ap_sm_read(): Receive pending reply messages from an AP queue.
188 * @aq: pointer to the AP queue
189 *
190 * Returns AP_WAIT_NONE, AP_WAIT_AGAIN, or AP_WAIT_INTERRUPT
191 */
192 static enum ap_wait ap_sm_read(struct ap_queue *aq)
193 {
194 struct ap_queue_status status;
195
196 if (!aq->reply)
197 return AP_WAIT_NONE;
198 status = ap_sm_recv(aq);
199 switch (status.response_code) {
200 case AP_RESPONSE_NORMAL:
201 if (aq->queue_count > 0) {
202 aq->state = AP_STATE_WORKING;
203 return AP_WAIT_AGAIN;
204 }
205 aq->state = AP_STATE_IDLE;
206 return AP_WAIT_NONE;
207 case AP_RESPONSE_NO_PENDING_REPLY:
208 if (aq->queue_count > 0)
209 return AP_WAIT_INTERRUPT;
210 aq->state = AP_STATE_IDLE;
211 return AP_WAIT_NONE;
212 default:
213 aq->state = AP_STATE_BORKED;
214 return AP_WAIT_NONE;
215 }
216 }
217
218 /**
219 * ap_sm_suspend_read(): Receive pending reply messages from an AP queue
220 * without changing the device state in between. In suspend mode we don't
221 * allow sending new requests, therefore just fetch pending replies.
222 * @aq: pointer to the AP queue
223 *
224 * Returns AP_WAIT_NONE or AP_WAIT_AGAIN
225 */
226 static enum ap_wait ap_sm_suspend_read(struct ap_queue *aq)
227 {
228 struct ap_queue_status status;
229
230 if (!aq->reply)
231 return AP_WAIT_NONE;
232 status = ap_sm_recv(aq);
233 switch (status.response_code) {
234 case AP_RESPONSE_NORMAL:
235 if (aq->queue_count > 0)
236 return AP_WAIT_AGAIN;
237 /* fall through */
238 default:
239 return AP_WAIT_NONE;
240 }
241 }
242
243 /**
244 * ap_sm_write(): Send messages from the request queue to an AP queue.
245 * @aq: pointer to the AP queue
246 *
247 * Returns AP_WAIT_NONE, AP_WAIT_AGAIN, or AP_WAIT_INTERRUPT
248 */
249 static enum ap_wait ap_sm_write(struct ap_queue *aq)
250 {
251 struct ap_queue_status status;
252 struct ap_message *ap_msg;
253
254 if (aq->requestq_count <= 0)
255 return AP_WAIT_NONE;
256 /* Start the next request on the queue. */
257 ap_msg = list_entry(aq->requestq.next, struct ap_message, list);
258 status = __ap_send(aq->qid, ap_msg->psmid,
259 ap_msg->message, ap_msg->length, ap_msg->special);
260 switch (status.response_code) {
261 case AP_RESPONSE_NORMAL:
262 aq->queue_count++;
263 if (aq->queue_count == 1)
264 mod_timer(&aq->timeout, jiffies + aq->request_timeout);
265 list_move_tail(&ap_msg->list, &aq->pendingq);
266 aq->requestq_count--;
267 aq->pendingq_count++;
268 if (aq->queue_count < aq->card->queue_depth) {
269 aq->state = AP_STATE_WORKING;
270 return AP_WAIT_AGAIN;
271 }
272 /* fall through */
273 case AP_RESPONSE_Q_FULL:
274 aq->state = AP_STATE_QUEUE_FULL;
275 return AP_WAIT_INTERRUPT;
276 case AP_RESPONSE_RESET_IN_PROGRESS:
277 aq->state = AP_STATE_RESET_WAIT;
278 return AP_WAIT_TIMEOUT;
279 case AP_RESPONSE_MESSAGE_TOO_BIG:
280 case AP_RESPONSE_REQ_FAC_NOT_INST:
281 list_del_init(&ap_msg->list);
282 aq->requestq_count--;
283 ap_msg->rc = -EINVAL;
284 ap_msg->receive(aq, ap_msg, NULL);
285 return AP_WAIT_AGAIN;
286 default:
287 aq->state = AP_STATE_BORKED;
288 return AP_WAIT_NONE;
289 }
290 }
291
292 /**
293 * ap_sm_read_write(): Send and receive messages to/from an AP queue.
294 * @aq: pointer to the AP queue
295 *
296 * Returns AP_WAIT_NONE, AP_WAIT_AGAIN, or AP_WAIT_INTERRUPT
297 */
298 static enum ap_wait ap_sm_read_write(struct ap_queue *aq)
299 {
300 return min(ap_sm_read(aq), ap_sm_write(aq));
301 }
302
303 /**
304 * ap_sm_reset(): Reset an AP queue.
305 * @qid: The AP queue number
306 *
307 * Submit the Reset command to an AP queue.
308 */
309 static enum ap_wait ap_sm_reset(struct ap_queue *aq)
310 {
311 struct ap_queue_status status;
312
313 status = ap_rapq(aq->qid);
314 switch (status.response_code) {
315 case AP_RESPONSE_NORMAL:
316 case AP_RESPONSE_RESET_IN_PROGRESS:
317 aq->state = AP_STATE_RESET_WAIT;
318 aq->interrupt = AP_INTR_DISABLED;
319 return AP_WAIT_TIMEOUT;
320 case AP_RESPONSE_BUSY:
321 return AP_WAIT_TIMEOUT;
322 case AP_RESPONSE_Q_NOT_AVAIL:
323 case AP_RESPONSE_DECONFIGURED:
324 case AP_RESPONSE_CHECKSTOPPED:
325 default:
326 aq->state = AP_STATE_BORKED;
327 return AP_WAIT_NONE;
328 }
329 }
330
331 /**
332 * ap_sm_reset_wait(): Test queue for completion of the reset operation
333 * @aq: pointer to the AP queue
334 *
335 * Returns AP_POLL_IMMEDIATELY, AP_POLL_AFTER_TIMEROUT or 0.
336 */
337 static enum ap_wait ap_sm_reset_wait(struct ap_queue *aq)
338 {
339 struct ap_queue_status status;
340 void *lsi_ptr;
341
342 if (aq->queue_count > 0 && aq->reply)
343 /* Try to read a completed message and get the status */
344 status = ap_sm_recv(aq);
345 else
346 /* Get the status with TAPQ */
347 status = ap_tapq(aq->qid, NULL);
348
349 switch (status.response_code) {
350 case AP_RESPONSE_NORMAL:
351 lsi_ptr = ap_airq_ptr();
352 if (lsi_ptr && ap_queue_enable_interruption(aq, lsi_ptr) == 0)
353 aq->state = AP_STATE_SETIRQ_WAIT;
354 else
355 aq->state = (aq->queue_count > 0) ?
356 AP_STATE_WORKING : AP_STATE_IDLE;
357 return AP_WAIT_AGAIN;
358 case AP_RESPONSE_BUSY:
359 case AP_RESPONSE_RESET_IN_PROGRESS:
360 return AP_WAIT_TIMEOUT;
361 case AP_RESPONSE_Q_NOT_AVAIL:
362 case AP_RESPONSE_DECONFIGURED:
363 case AP_RESPONSE_CHECKSTOPPED:
364 default:
365 aq->state = AP_STATE_BORKED;
366 return AP_WAIT_NONE;
367 }
368 }
369
370 /**
371 * ap_sm_setirq_wait(): Test queue for completion of the irq enablement
372 * @aq: pointer to the AP queue
373 *
374 * Returns AP_POLL_IMMEDIATELY, AP_POLL_AFTER_TIMEROUT or 0.
375 */
376 static enum ap_wait ap_sm_setirq_wait(struct ap_queue *aq)
377 {
378 struct ap_queue_status status;
379
380 if (aq->queue_count > 0 && aq->reply)
381 /* Try to read a completed message and get the status */
382 status = ap_sm_recv(aq);
383 else
384 /* Get the status with TAPQ */
385 status = ap_tapq(aq->qid, NULL);
386
387 if (status.irq_enabled == 1) {
388 /* Irqs are now enabled */
389 aq->interrupt = AP_INTR_ENABLED;
390 aq->state = (aq->queue_count > 0) ?
391 AP_STATE_WORKING : AP_STATE_IDLE;
392 }
393
394 switch (status.response_code) {
395 case AP_RESPONSE_NORMAL:
396 if (aq->queue_count > 0)
397 return AP_WAIT_AGAIN;
398 /* fallthrough */
399 case AP_RESPONSE_NO_PENDING_REPLY:
400 return AP_WAIT_TIMEOUT;
401 default:
402 aq->state = AP_STATE_BORKED;
403 return AP_WAIT_NONE;
404 }
405 }
406
407 /*
408 * AP state machine jump table
409 */
410 static ap_func_t *ap_jumptable[NR_AP_STATES][NR_AP_EVENTS] = {
411 [AP_STATE_RESET_START] = {
412 [AP_EVENT_POLL] = ap_sm_reset,
413 [AP_EVENT_TIMEOUT] = ap_sm_nop,
414 },
415 [AP_STATE_RESET_WAIT] = {
416 [AP_EVENT_POLL] = ap_sm_reset_wait,
417 [AP_EVENT_TIMEOUT] = ap_sm_nop,
418 },
419 [AP_STATE_SETIRQ_WAIT] = {
420 [AP_EVENT_POLL] = ap_sm_setirq_wait,
421 [AP_EVENT_TIMEOUT] = ap_sm_nop,
422 },
423 [AP_STATE_IDLE] = {
424 [AP_EVENT_POLL] = ap_sm_write,
425 [AP_EVENT_TIMEOUT] = ap_sm_nop,
426 },
427 [AP_STATE_WORKING] = {
428 [AP_EVENT_POLL] = ap_sm_read_write,
429 [AP_EVENT_TIMEOUT] = ap_sm_reset,
430 },
431 [AP_STATE_QUEUE_FULL] = {
432 [AP_EVENT_POLL] = ap_sm_read,
433 [AP_EVENT_TIMEOUT] = ap_sm_reset,
434 },
435 [AP_STATE_SUSPEND_WAIT] = {
436 [AP_EVENT_POLL] = ap_sm_suspend_read,
437 [AP_EVENT_TIMEOUT] = ap_sm_nop,
438 },
439 [AP_STATE_BORKED] = {
440 [AP_EVENT_POLL] = ap_sm_nop,
441 [AP_EVENT_TIMEOUT] = ap_sm_nop,
442 },
443 };
444
445 enum ap_wait ap_sm_event(struct ap_queue *aq, enum ap_event event)
446 {
447 return ap_jumptable[aq->state][event](aq);
448 }
449
450 enum ap_wait ap_sm_event_loop(struct ap_queue *aq, enum ap_event event)
451 {
452 enum ap_wait wait;
453
454 while ((wait = ap_sm_event(aq, event)) == AP_WAIT_AGAIN)
455 ;
456 return wait;
457 }
458
459 /*
460 * Power management for queue devices
461 */
462 void ap_queue_suspend(struct ap_device *ap_dev)
463 {
464 struct ap_queue *aq = to_ap_queue(&ap_dev->device);
465
466 /* Poll on the device until all requests are finished. */
467 spin_lock_bh(&aq->lock);
468 aq->state = AP_STATE_SUSPEND_WAIT;
469 while (ap_sm_event(aq, AP_EVENT_POLL) != AP_WAIT_NONE)
470 ;
471 aq->state = AP_STATE_BORKED;
472 spin_unlock_bh(&aq->lock);
473 }
474 EXPORT_SYMBOL(ap_queue_suspend);
475
476 void ap_queue_resume(struct ap_device *ap_dev)
477 {
478 }
479 EXPORT_SYMBOL(ap_queue_resume);
480
481 /*
482 * AP queue related attributes.
483 */
484 static ssize_t ap_req_count_show(struct device *dev,
485 struct device_attribute *attr,
486 char *buf)
487 {
488 struct ap_queue *aq = to_ap_queue(dev);
489 unsigned int req_cnt;
490
491 spin_lock_bh(&aq->lock);
492 req_cnt = aq->total_request_count;
493 spin_unlock_bh(&aq->lock);
494 return snprintf(buf, PAGE_SIZE, "%d\n", req_cnt);
495 }
496
497 static ssize_t ap_req_count_store(struct device *dev,
498 struct device_attribute *attr,
499 const char *buf, size_t count)
500 {
501 struct ap_queue *aq = to_ap_queue(dev);
502
503 spin_lock_bh(&aq->lock);
504 aq->total_request_count = 0;
505 spin_unlock_bh(&aq->lock);
506
507 return count;
508 }
509
510 static DEVICE_ATTR(request_count, 0644, ap_req_count_show, ap_req_count_store);
511
512 static ssize_t ap_requestq_count_show(struct device *dev,
513 struct device_attribute *attr, char *buf)
514 {
515 struct ap_queue *aq = to_ap_queue(dev);
516 unsigned int reqq_cnt = 0;
517
518 spin_lock_bh(&aq->lock);
519 reqq_cnt = aq->requestq_count;
520 spin_unlock_bh(&aq->lock);
521 return snprintf(buf, PAGE_SIZE, "%d\n", reqq_cnt);
522 }
523
524 static DEVICE_ATTR(requestq_count, 0444, ap_requestq_count_show, NULL);
525
526 static ssize_t ap_pendingq_count_show(struct device *dev,
527 struct device_attribute *attr, char *buf)
528 {
529 struct ap_queue *aq = to_ap_queue(dev);
530 unsigned int penq_cnt = 0;
531
532 spin_lock_bh(&aq->lock);
533 penq_cnt = aq->pendingq_count;
534 spin_unlock_bh(&aq->lock);
535 return snprintf(buf, PAGE_SIZE, "%d\n", penq_cnt);
536 }
537
538 static DEVICE_ATTR(pendingq_count, 0444, ap_pendingq_count_show, NULL);
539
540 static ssize_t ap_reset_show(struct device *dev,
541 struct device_attribute *attr, char *buf)
542 {
543 struct ap_queue *aq = to_ap_queue(dev);
544 int rc = 0;
545
546 spin_lock_bh(&aq->lock);
547 switch (aq->state) {
548 case AP_STATE_RESET_START:
549 case AP_STATE_RESET_WAIT:
550 rc = snprintf(buf, PAGE_SIZE, "Reset in progress.\n");
551 break;
552 case AP_STATE_WORKING:
553 case AP_STATE_QUEUE_FULL:
554 rc = snprintf(buf, PAGE_SIZE, "Reset Timer armed.\n");
555 break;
556 default:
557 rc = snprintf(buf, PAGE_SIZE, "No Reset Timer set.\n");
558 }
559 spin_unlock_bh(&aq->lock);
560 return rc;
561 }
562
563 static DEVICE_ATTR(reset, 0444, ap_reset_show, NULL);
564
565 static ssize_t ap_interrupt_show(struct device *dev,
566 struct device_attribute *attr, char *buf)
567 {
568 struct ap_queue *aq = to_ap_queue(dev);
569 int rc = 0;
570
571 spin_lock_bh(&aq->lock);
572 if (aq->state == AP_STATE_SETIRQ_WAIT)
573 rc = snprintf(buf, PAGE_SIZE, "Enable Interrupt pending.\n");
574 else if (aq->interrupt == AP_INTR_ENABLED)
575 rc = snprintf(buf, PAGE_SIZE, "Interrupts enabled.\n");
576 else
577 rc = snprintf(buf, PAGE_SIZE, "Interrupts disabled.\n");
578 spin_unlock_bh(&aq->lock);
579 return rc;
580 }
581
582 static DEVICE_ATTR(interrupt, 0444, ap_interrupt_show, NULL);
583
584 static struct attribute *ap_queue_dev_attrs[] = {
585 &dev_attr_request_count.attr,
586 &dev_attr_requestq_count.attr,
587 &dev_attr_pendingq_count.attr,
588 &dev_attr_reset.attr,
589 &dev_attr_interrupt.attr,
590 NULL
591 };
592
593 static struct attribute_group ap_queue_dev_attr_group = {
594 .attrs = ap_queue_dev_attrs
595 };
596
597 static const struct attribute_group *ap_queue_dev_attr_groups[] = {
598 &ap_queue_dev_attr_group,
599 NULL
600 };
601
602 static struct device_type ap_queue_type = {
603 .name = "ap_queue",
604 .groups = ap_queue_dev_attr_groups,
605 };
606
607 static void ap_queue_device_release(struct device *dev)
608 {
609 struct ap_queue *aq = to_ap_queue(dev);
610
611 if (!list_empty(&aq->list)) {
612 spin_lock_bh(&ap_list_lock);
613 list_del_init(&aq->list);
614 spin_unlock_bh(&ap_list_lock);
615 }
616 kfree(aq);
617 }
618
619 struct ap_queue *ap_queue_create(ap_qid_t qid, int device_type)
620 {
621 struct ap_queue *aq;
622
623 aq = kzalloc(sizeof(*aq), GFP_KERNEL);
624 if (!aq)
625 return NULL;
626 aq->ap_dev.device.release = ap_queue_device_release;
627 aq->ap_dev.device.type = &ap_queue_type;
628 aq->ap_dev.device_type = device_type;
629 /* CEX6 toleration: map to CEX5 */
630 if (device_type == AP_DEVICE_TYPE_CEX6)
631 aq->ap_dev.device_type = AP_DEVICE_TYPE_CEX5;
632 aq->qid = qid;
633 aq->state = AP_STATE_RESET_START;
634 aq->interrupt = AP_INTR_DISABLED;
635 spin_lock_init(&aq->lock);
636 INIT_LIST_HEAD(&aq->pendingq);
637 INIT_LIST_HEAD(&aq->requestq);
638 setup_timer(&aq->timeout, ap_request_timeout, (unsigned long) aq);
639
640 return aq;
641 }
642
643 void ap_queue_init_reply(struct ap_queue *aq, struct ap_message *reply)
644 {
645 aq->reply = reply;
646
647 spin_lock_bh(&aq->lock);
648 ap_wait(ap_sm_event(aq, AP_EVENT_POLL));
649 spin_unlock_bh(&aq->lock);
650 }
651 EXPORT_SYMBOL(ap_queue_init_reply);
652
653 /**
654 * ap_queue_message(): Queue a request to an AP device.
655 * @aq: The AP device to queue the message to
656 * @ap_msg: The message that is to be added
657 */
658 void ap_queue_message(struct ap_queue *aq, struct ap_message *ap_msg)
659 {
660 /* For asynchronous message handling a valid receive-callback
661 * is required.
662 */
663 BUG_ON(!ap_msg->receive);
664
665 spin_lock_bh(&aq->lock);
666 /* Queue the message. */
667 list_add_tail(&ap_msg->list, &aq->requestq);
668 aq->requestq_count++;
669 aq->total_request_count++;
670 atomic_inc(&aq->card->total_request_count);
671 /* Send/receive as many request from the queue as possible. */
672 ap_wait(ap_sm_event_loop(aq, AP_EVENT_POLL));
673 spin_unlock_bh(&aq->lock);
674 }
675 EXPORT_SYMBOL(ap_queue_message);
676
677 /**
678 * ap_cancel_message(): Cancel a crypto request.
679 * @aq: The AP device that has the message queued
680 * @ap_msg: The message that is to be removed
681 *
682 * Cancel a crypto request. This is done by removing the request
683 * from the device pending or request queue. Note that the
684 * request stays on the AP queue. When it finishes the message
685 * reply will be discarded because the psmid can't be found.
686 */
687 void ap_cancel_message(struct ap_queue *aq, struct ap_message *ap_msg)
688 {
689 struct ap_message *tmp;
690
691 spin_lock_bh(&aq->lock);
692 if (!list_empty(&ap_msg->list)) {
693 list_for_each_entry(tmp, &aq->pendingq, list)
694 if (tmp->psmid == ap_msg->psmid) {
695 aq->pendingq_count--;
696 goto found;
697 }
698 aq->requestq_count--;
699 found:
700 list_del_init(&ap_msg->list);
701 }
702 spin_unlock_bh(&aq->lock);
703 }
704 EXPORT_SYMBOL(ap_cancel_message);
705
706 /**
707 * __ap_flush_queue(): Flush requests.
708 * @aq: Pointer to the AP queue
709 *
710 * Flush all requests from the request/pending queue of an AP device.
711 */
712 static void __ap_flush_queue(struct ap_queue *aq)
713 {
714 struct ap_message *ap_msg, *next;
715
716 list_for_each_entry_safe(ap_msg, next, &aq->pendingq, list) {
717 list_del_init(&ap_msg->list);
718 aq->pendingq_count--;
719 ap_msg->rc = -EAGAIN;
720 ap_msg->receive(aq, ap_msg, NULL);
721 }
722 list_for_each_entry_safe(ap_msg, next, &aq->requestq, list) {
723 list_del_init(&ap_msg->list);
724 aq->requestq_count--;
725 ap_msg->rc = -EAGAIN;
726 ap_msg->receive(aq, ap_msg, NULL);
727 }
728 }
729
730 void ap_flush_queue(struct ap_queue *aq)
731 {
732 spin_lock_bh(&aq->lock);
733 __ap_flush_queue(aq);
734 spin_unlock_bh(&aq->lock);
735 }
736 EXPORT_SYMBOL(ap_flush_queue);
737
738 void ap_queue_remove(struct ap_queue *aq)
739 {
740 ap_flush_queue(aq);
741 del_timer_sync(&aq->timeout);
742 }
743 EXPORT_SYMBOL(ap_queue_remove);