GNU Linux-libre 6.8.9-gnu
[releases.git] / drivers / s390 / crypto / ap_queue.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright IBM Corp. 2016, 2023
4  * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
5  *
6  * Adjunct processor bus, queue related code.
7  */
8
9 #define KMSG_COMPONENT "ap"
10 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
11
12 #include <linux/init.h>
13 #include <linux/slab.h>
14 #include <asm/facility.h>
15
16 #include "ap_bus.h"
17 #include "ap_debug.h"
18
19 static void __ap_flush_queue(struct ap_queue *aq);
20
21 /*
22  * some AP queue helper functions
23  */
24
25 static inline bool ap_q_supports_bind(struct ap_queue *aq)
26 {
27         return aq->card->hwinfo.ep11 || aq->card->hwinfo.accel;
28 }
29
30 static inline bool ap_q_supports_assoc(struct ap_queue *aq)
31 {
32         return aq->card->hwinfo.ep11;
33 }
34
35 static inline bool ap_q_needs_bind(struct ap_queue *aq)
36 {
37         return ap_q_supports_bind(aq) && ap_sb_available();
38 }
39
40 /**
41  * ap_queue_enable_irq(): Enable interrupt support on this AP queue.
42  * @aq: The AP queue
43  * @ind: the notification indicator byte
44  *
45  * Enables interruption on AP queue via ap_aqic(). Based on the return
46  * value it waits a while and tests the AP queue if interrupts
47  * have been switched on using ap_test_queue().
48  */
49 static int ap_queue_enable_irq(struct ap_queue *aq, void *ind)
50 {
51         union ap_qirq_ctrl qirqctrl = { .value = 0 };
52         struct ap_queue_status status;
53
54         qirqctrl.ir = 1;
55         qirqctrl.isc = AP_ISC;
56         status = ap_aqic(aq->qid, qirqctrl, virt_to_phys(ind));
57         if (status.async)
58                 return -EPERM;
59         switch (status.response_code) {
60         case AP_RESPONSE_NORMAL:
61         case AP_RESPONSE_OTHERWISE_CHANGED:
62                 return 0;
63         case AP_RESPONSE_Q_NOT_AVAIL:
64         case AP_RESPONSE_DECONFIGURED:
65         case AP_RESPONSE_CHECKSTOPPED:
66         case AP_RESPONSE_INVALID_ADDRESS:
67                 pr_err("Registering adapter interrupts for AP device %02x.%04x failed\n",
68                        AP_QID_CARD(aq->qid),
69                        AP_QID_QUEUE(aq->qid));
70                 return -EOPNOTSUPP;
71         case AP_RESPONSE_RESET_IN_PROGRESS:
72         case AP_RESPONSE_BUSY:
73         default:
74                 return -EBUSY;
75         }
76 }
77
78 /**
79  * __ap_send(): Send message to adjunct processor queue.
80  * @qid: The AP queue number
81  * @psmid: The program supplied message identifier
82  * @msg: The message text
83  * @msglen: The message length
84  * @special: Special Bit
85  *
86  * Returns AP queue status structure.
87  * Condition code 1 on NQAP can't happen because the L bit is 1.
88  * Condition code 2 on NQAP also means the send is incomplete,
89  * because a segment boundary was reached. The NQAP is repeated.
90  */
91 static inline struct ap_queue_status
92 __ap_send(ap_qid_t qid, unsigned long psmid, void *msg, size_t msglen,
93           int special)
94 {
95         if (special)
96                 qid |= 0x400000UL;
97         return ap_nqap(qid, psmid, msg, msglen);
98 }
99
100 /* State machine definitions and helpers */
101
102 static enum ap_sm_wait ap_sm_nop(struct ap_queue *aq)
103 {
104         return AP_SM_WAIT_NONE;
105 }
106
107 /**
108  * ap_sm_recv(): Receive pending reply messages from an AP queue but do
109  *      not change the state of the device.
110  * @aq: pointer to the AP queue
111  *
112  * Returns AP_SM_WAIT_NONE, AP_SM_WAIT_AGAIN, or AP_SM_WAIT_INTERRUPT
113  */
114 static struct ap_queue_status ap_sm_recv(struct ap_queue *aq)
115 {
116         struct ap_queue_status status;
117         struct ap_message *ap_msg;
118         bool found = false;
119         size_t reslen;
120         unsigned long resgr0 = 0;
121         int parts = 0;
122
123         /*
124          * DQAP loop until response code and resgr0 indicate that
125          * the msg is totally received. As we use the very same buffer
126          * the msg is overwritten with each invocation. That's intended
127          * and the receiver of the msg is informed with a msg rc code
128          * of EMSGSIZE in such a case.
129          */
130         do {
131                 status = ap_dqap(aq->qid, &aq->reply->psmid,
132                                  aq->reply->msg, aq->reply->bufsize,
133                                  &aq->reply->len, &reslen, &resgr0);
134                 parts++;
135         } while (status.response_code == 0xFF && resgr0 != 0);
136
137         switch (status.response_code) {
138         case AP_RESPONSE_NORMAL:
139                 aq->queue_count = max_t(int, 0, aq->queue_count - 1);
140                 if (!status.queue_empty && !aq->queue_count)
141                         aq->queue_count++;
142                 if (aq->queue_count > 0)
143                         mod_timer(&aq->timeout,
144                                   jiffies + aq->request_timeout);
145                 list_for_each_entry(ap_msg, &aq->pendingq, list) {
146                         if (ap_msg->psmid != aq->reply->psmid)
147                                 continue;
148                         list_del_init(&ap_msg->list);
149                         aq->pendingq_count--;
150                         if (parts > 1) {
151                                 ap_msg->rc = -EMSGSIZE;
152                                 ap_msg->receive(aq, ap_msg, NULL);
153                         } else {
154                                 ap_msg->receive(aq, ap_msg, aq->reply);
155                         }
156                         found = true;
157                         break;
158                 }
159                 if (!found) {
160                         AP_DBF_WARN("%s unassociated reply psmid=0x%016lx on 0x%02x.%04x\n",
161                                     __func__, aq->reply->psmid,
162                                     AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
163                 }
164                 fallthrough;
165         case AP_RESPONSE_NO_PENDING_REPLY:
166                 if (!status.queue_empty || aq->queue_count <= 0)
167                         break;
168                 /* The card shouldn't forget requests but who knows. */
169                 aq->queue_count = 0;
170                 list_splice_init(&aq->pendingq, &aq->requestq);
171                 aq->requestq_count += aq->pendingq_count;
172                 aq->pendingq_count = 0;
173                 break;
174         default:
175                 break;
176         }
177         return status;
178 }
179
180 /**
181  * ap_sm_read(): Receive pending reply messages from an AP queue.
182  * @aq: pointer to the AP queue
183  *
184  * Returns AP_SM_WAIT_NONE, AP_SM_WAIT_AGAIN, or AP_SM_WAIT_INTERRUPT
185  */
186 static enum ap_sm_wait ap_sm_read(struct ap_queue *aq)
187 {
188         struct ap_queue_status status;
189
190         if (!aq->reply)
191                 return AP_SM_WAIT_NONE;
192         status = ap_sm_recv(aq);
193         if (status.async)
194                 return AP_SM_WAIT_NONE;
195         switch (status.response_code) {
196         case AP_RESPONSE_NORMAL:
197                 if (aq->queue_count > 0) {
198                         aq->sm_state = AP_SM_STATE_WORKING;
199                         return AP_SM_WAIT_AGAIN;
200                 }
201                 aq->sm_state = AP_SM_STATE_IDLE;
202                 break;
203         case AP_RESPONSE_NO_PENDING_REPLY:
204                 if (aq->queue_count > 0)
205                         return status.irq_enabled ?
206                                 AP_SM_WAIT_INTERRUPT : AP_SM_WAIT_HIGH_TIMEOUT;
207                 aq->sm_state = AP_SM_STATE_IDLE;
208                 break;
209         default:
210                 aq->dev_state = AP_DEV_STATE_ERROR;
211                 aq->last_err_rc = status.response_code;
212                 AP_DBF_WARN("%s RC 0x%02x on 0x%02x.%04x -> AP_DEV_STATE_ERROR\n",
213                             __func__, status.response_code,
214                             AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
215                 return AP_SM_WAIT_NONE;
216         }
217         /* Check and maybe enable irq support (again) on this queue */
218         if (!status.irq_enabled && status.queue_empty) {
219                 void *lsi_ptr = ap_airq_ptr();
220
221                 if (lsi_ptr && ap_queue_enable_irq(aq, lsi_ptr) == 0) {
222                         aq->sm_state = AP_SM_STATE_SETIRQ_WAIT;
223                         return AP_SM_WAIT_AGAIN;
224                 }
225         }
226         return AP_SM_WAIT_NONE;
227 }
228
229 /**
230  * ap_sm_write(): Send messages from the request queue to an AP queue.
231  * @aq: pointer to the AP queue
232  *
233  * Returns AP_SM_WAIT_NONE, AP_SM_WAIT_AGAIN, or AP_SM_WAIT_INTERRUPT
234  */
235 static enum ap_sm_wait ap_sm_write(struct ap_queue *aq)
236 {
237         struct ap_queue_status status;
238         struct ap_message *ap_msg;
239         ap_qid_t qid = aq->qid;
240
241         if (aq->requestq_count <= 0)
242                 return AP_SM_WAIT_NONE;
243
244         /* Start the next request on the queue. */
245         ap_msg = list_entry(aq->requestq.next, struct ap_message, list);
246         status = __ap_send(qid, ap_msg->psmid,
247                            ap_msg->msg, ap_msg->len,
248                            ap_msg->flags & AP_MSG_FLAG_SPECIAL);
249         if (status.async)
250                 return AP_SM_WAIT_NONE;
251         switch (status.response_code) {
252         case AP_RESPONSE_NORMAL:
253                 aq->queue_count = max_t(int, 1, aq->queue_count + 1);
254                 if (aq->queue_count == 1)
255                         mod_timer(&aq->timeout, jiffies + aq->request_timeout);
256                 list_move_tail(&ap_msg->list, &aq->pendingq);
257                 aq->requestq_count--;
258                 aq->pendingq_count++;
259                 if (aq->queue_count < aq->card->hwinfo.qd) {
260                         aq->sm_state = AP_SM_STATE_WORKING;
261                         return AP_SM_WAIT_AGAIN;
262                 }
263                 fallthrough;
264         case AP_RESPONSE_Q_FULL:
265                 aq->sm_state = AP_SM_STATE_QUEUE_FULL;
266                 return status.irq_enabled ?
267                         AP_SM_WAIT_INTERRUPT : AP_SM_WAIT_HIGH_TIMEOUT;
268         case AP_RESPONSE_RESET_IN_PROGRESS:
269                 aq->sm_state = AP_SM_STATE_RESET_WAIT;
270                 return AP_SM_WAIT_LOW_TIMEOUT;
271         case AP_RESPONSE_INVALID_DOMAIN:
272                 AP_DBF_WARN("%s RESPONSE_INVALID_DOMAIN on NQAP\n", __func__);
273                 fallthrough;
274         case AP_RESPONSE_MESSAGE_TOO_BIG:
275         case AP_RESPONSE_REQ_FAC_NOT_INST:
276                 list_del_init(&ap_msg->list);
277                 aq->requestq_count--;
278                 ap_msg->rc = -EINVAL;
279                 ap_msg->receive(aq, ap_msg, NULL);
280                 return AP_SM_WAIT_AGAIN;
281         default:
282                 aq->dev_state = AP_DEV_STATE_ERROR;
283                 aq->last_err_rc = status.response_code;
284                 AP_DBF_WARN("%s RC 0x%02x on 0x%02x.%04x -> AP_DEV_STATE_ERROR\n",
285                             __func__, status.response_code,
286                             AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
287                 return AP_SM_WAIT_NONE;
288         }
289 }
290
291 /**
292  * ap_sm_read_write(): Send and receive messages to/from an AP queue.
293  * @aq: pointer to the AP queue
294  *
295  * Returns AP_SM_WAIT_NONE, AP_SM_WAIT_AGAIN, or AP_SM_WAIT_INTERRUPT
296  */
297 static enum ap_sm_wait ap_sm_read_write(struct ap_queue *aq)
298 {
299         return min(ap_sm_read(aq), ap_sm_write(aq));
300 }
301
302 /**
303  * ap_sm_reset(): Reset an AP queue.
304  * @aq: The AP queue
305  *
306  * Submit the Reset command to an AP queue.
307  */
308 static enum ap_sm_wait ap_sm_reset(struct ap_queue *aq)
309 {
310         struct ap_queue_status status;
311
312         status = ap_rapq(aq->qid, aq->rapq_fbit);
313         if (status.async)
314                 return AP_SM_WAIT_NONE;
315         switch (status.response_code) {
316         case AP_RESPONSE_NORMAL:
317         case AP_RESPONSE_RESET_IN_PROGRESS:
318                 aq->sm_state = AP_SM_STATE_RESET_WAIT;
319                 aq->rapq_fbit = 0;
320                 return AP_SM_WAIT_LOW_TIMEOUT;
321         default:
322                 aq->dev_state = AP_DEV_STATE_ERROR;
323                 aq->last_err_rc = status.response_code;
324                 AP_DBF_WARN("%s RC 0x%02x on 0x%02x.%04x -> AP_DEV_STATE_ERROR\n",
325                             __func__, status.response_code,
326                             AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
327                 return AP_SM_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_sm_wait ap_sm_reset_wait(struct ap_queue *aq)
338 {
339         struct ap_queue_status status;
340         struct ap_tapq_hwinfo hwinfo;
341         void *lsi_ptr;
342
343         /* Get the status with TAPQ */
344         status = ap_test_queue(aq->qid, 1, &hwinfo);
345
346         switch (status.response_code) {
347         case AP_RESPONSE_NORMAL:
348                 aq->se_bstate = hwinfo.bs;
349                 lsi_ptr = ap_airq_ptr();
350                 if (lsi_ptr && ap_queue_enable_irq(aq, lsi_ptr) == 0)
351                         aq->sm_state = AP_SM_STATE_SETIRQ_WAIT;
352                 else
353                         aq->sm_state = (aq->queue_count > 0) ?
354                                 AP_SM_STATE_WORKING : AP_SM_STATE_IDLE;
355                 return AP_SM_WAIT_AGAIN;
356         case AP_RESPONSE_BUSY:
357         case AP_RESPONSE_RESET_IN_PROGRESS:
358                 return AP_SM_WAIT_LOW_TIMEOUT;
359         case AP_RESPONSE_Q_NOT_AVAIL:
360         case AP_RESPONSE_DECONFIGURED:
361         case AP_RESPONSE_CHECKSTOPPED:
362         default:
363                 aq->dev_state = AP_DEV_STATE_ERROR;
364                 aq->last_err_rc = status.response_code;
365                 AP_DBF_WARN("%s RC 0x%02x on 0x%02x.%04x -> AP_DEV_STATE_ERROR\n",
366                             __func__, status.response_code,
367                             AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
368                 return AP_SM_WAIT_NONE;
369         }
370 }
371
372 /**
373  * ap_sm_setirq_wait(): Test queue for completion of the irq enablement
374  * @aq: pointer to the AP queue
375  *
376  * Returns AP_POLL_IMMEDIATELY, AP_POLL_AFTER_TIMEROUT or 0.
377  */
378 static enum ap_sm_wait ap_sm_setirq_wait(struct ap_queue *aq)
379 {
380         struct ap_queue_status status;
381
382         if (aq->queue_count > 0 && aq->reply)
383                 /* Try to read a completed message and get the status */
384                 status = ap_sm_recv(aq);
385         else
386                 /* Get the status with TAPQ */
387                 status = ap_tapq(aq->qid, NULL);
388
389         if (status.irq_enabled == 1) {
390                 /* Irqs are now enabled */
391                 aq->sm_state = (aq->queue_count > 0) ?
392                         AP_SM_STATE_WORKING : AP_SM_STATE_IDLE;
393         }
394
395         switch (status.response_code) {
396         case AP_RESPONSE_NORMAL:
397                 if (aq->queue_count > 0)
398                         return AP_SM_WAIT_AGAIN;
399                 fallthrough;
400         case AP_RESPONSE_NO_PENDING_REPLY:
401                 return AP_SM_WAIT_LOW_TIMEOUT;
402         default:
403                 aq->dev_state = AP_DEV_STATE_ERROR;
404                 aq->last_err_rc = status.response_code;
405                 AP_DBF_WARN("%s RC 0x%02x on 0x%02x.%04x -> AP_DEV_STATE_ERROR\n",
406                             __func__, status.response_code,
407                             AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
408                 return AP_SM_WAIT_NONE;
409         }
410 }
411
412 /**
413  * ap_sm_assoc_wait(): Test queue for completion of a pending
414  *                     association request.
415  * @aq: pointer to the AP queue
416  */
417 static enum ap_sm_wait ap_sm_assoc_wait(struct ap_queue *aq)
418 {
419         struct ap_queue_status status;
420         struct ap_tapq_hwinfo hwinfo;
421
422         status = ap_test_queue(aq->qid, 1, &hwinfo);
423         /* handle asynchronous error on this queue */
424         if (status.async && status.response_code) {
425                 aq->dev_state = AP_DEV_STATE_ERROR;
426                 aq->last_err_rc = status.response_code;
427                 AP_DBF_WARN("%s asynch RC 0x%02x on 0x%02x.%04x -> AP_DEV_STATE_ERROR\n",
428                             __func__, status.response_code,
429                             AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
430                 return AP_SM_WAIT_NONE;
431         }
432         if (status.response_code > AP_RESPONSE_BUSY) {
433                 aq->dev_state = AP_DEV_STATE_ERROR;
434                 aq->last_err_rc = status.response_code;
435                 AP_DBF_WARN("%s RC 0x%02x on 0x%02x.%04x -> AP_DEV_STATE_ERROR\n",
436                             __func__, status.response_code,
437                             AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
438                 return AP_SM_WAIT_NONE;
439         }
440
441         /* update queue's SE bind state */
442         aq->se_bstate = hwinfo.bs;
443
444         /* check bs bits */
445         switch (hwinfo.bs) {
446         case AP_BS_Q_USABLE:
447                 /* association is through */
448                 aq->sm_state = AP_SM_STATE_IDLE;
449                 AP_DBF_DBG("%s queue 0x%02x.%04x associated with %u\n",
450                            __func__, AP_QID_CARD(aq->qid),
451                            AP_QID_QUEUE(aq->qid), aq->assoc_idx);
452                 return AP_SM_WAIT_NONE;
453         case AP_BS_Q_USABLE_NO_SECURE_KEY:
454                 /* association still pending */
455                 return AP_SM_WAIT_LOW_TIMEOUT;
456         default:
457                 /* reset from 'outside' happened or no idea at all */
458                 aq->assoc_idx = ASSOC_IDX_INVALID;
459                 aq->dev_state = AP_DEV_STATE_ERROR;
460                 aq->last_err_rc = status.response_code;
461                 AP_DBF_WARN("%s bs 0x%02x on 0x%02x.%04x -> AP_DEV_STATE_ERROR\n",
462                             __func__, hwinfo.bs,
463                             AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
464                 return AP_SM_WAIT_NONE;
465         }
466 }
467
468 /*
469  * AP state machine jump table
470  */
471 static ap_func_t *ap_jumptable[NR_AP_SM_STATES][NR_AP_SM_EVENTS] = {
472         [AP_SM_STATE_RESET_START] = {
473                 [AP_SM_EVENT_POLL] = ap_sm_reset,
474                 [AP_SM_EVENT_TIMEOUT] = ap_sm_nop,
475         },
476         [AP_SM_STATE_RESET_WAIT] = {
477                 [AP_SM_EVENT_POLL] = ap_sm_reset_wait,
478                 [AP_SM_EVENT_TIMEOUT] = ap_sm_nop,
479         },
480         [AP_SM_STATE_SETIRQ_WAIT] = {
481                 [AP_SM_EVENT_POLL] = ap_sm_setirq_wait,
482                 [AP_SM_EVENT_TIMEOUT] = ap_sm_nop,
483         },
484         [AP_SM_STATE_IDLE] = {
485                 [AP_SM_EVENT_POLL] = ap_sm_write,
486                 [AP_SM_EVENT_TIMEOUT] = ap_sm_nop,
487         },
488         [AP_SM_STATE_WORKING] = {
489                 [AP_SM_EVENT_POLL] = ap_sm_read_write,
490                 [AP_SM_EVENT_TIMEOUT] = ap_sm_reset,
491         },
492         [AP_SM_STATE_QUEUE_FULL] = {
493                 [AP_SM_EVENT_POLL] = ap_sm_read,
494                 [AP_SM_EVENT_TIMEOUT] = ap_sm_reset,
495         },
496         [AP_SM_STATE_ASSOC_WAIT] = {
497                 [AP_SM_EVENT_POLL] = ap_sm_assoc_wait,
498                 [AP_SM_EVENT_TIMEOUT] = ap_sm_reset,
499         },
500 };
501
502 enum ap_sm_wait ap_sm_event(struct ap_queue *aq, enum ap_sm_event event)
503 {
504         if (aq->config && !aq->chkstop &&
505             aq->dev_state > AP_DEV_STATE_UNINITIATED)
506                 return ap_jumptable[aq->sm_state][event](aq);
507         else
508                 return AP_SM_WAIT_NONE;
509 }
510
511 enum ap_sm_wait ap_sm_event_loop(struct ap_queue *aq, enum ap_sm_event event)
512 {
513         enum ap_sm_wait wait;
514
515         while ((wait = ap_sm_event(aq, event)) == AP_SM_WAIT_AGAIN)
516                 ;
517         return wait;
518 }
519
520 /*
521  * AP queue related attributes.
522  */
523 static ssize_t request_count_show(struct device *dev,
524                                   struct device_attribute *attr,
525                                   char *buf)
526 {
527         struct ap_queue *aq = to_ap_queue(dev);
528         bool valid = false;
529         u64 req_cnt;
530
531         spin_lock_bh(&aq->lock);
532         if (aq->dev_state > AP_DEV_STATE_UNINITIATED) {
533                 req_cnt = aq->total_request_count;
534                 valid = true;
535         }
536         spin_unlock_bh(&aq->lock);
537
538         if (valid)
539                 return sysfs_emit(buf, "%llu\n", req_cnt);
540         else
541                 return sysfs_emit(buf, "-\n");
542 }
543
544 static ssize_t request_count_store(struct device *dev,
545                                    struct device_attribute *attr,
546                                    const char *buf, size_t count)
547 {
548         struct ap_queue *aq = to_ap_queue(dev);
549
550         spin_lock_bh(&aq->lock);
551         aq->total_request_count = 0;
552         spin_unlock_bh(&aq->lock);
553
554         return count;
555 }
556
557 static DEVICE_ATTR_RW(request_count);
558
559 static ssize_t requestq_count_show(struct device *dev,
560                                    struct device_attribute *attr, char *buf)
561 {
562         struct ap_queue *aq = to_ap_queue(dev);
563         unsigned int reqq_cnt = 0;
564
565         spin_lock_bh(&aq->lock);
566         if (aq->dev_state > AP_DEV_STATE_UNINITIATED)
567                 reqq_cnt = aq->requestq_count;
568         spin_unlock_bh(&aq->lock);
569         return sysfs_emit(buf, "%d\n", reqq_cnt);
570 }
571
572 static DEVICE_ATTR_RO(requestq_count);
573
574 static ssize_t pendingq_count_show(struct device *dev,
575                                    struct device_attribute *attr, char *buf)
576 {
577         struct ap_queue *aq = to_ap_queue(dev);
578         unsigned int penq_cnt = 0;
579
580         spin_lock_bh(&aq->lock);
581         if (aq->dev_state > AP_DEV_STATE_UNINITIATED)
582                 penq_cnt = aq->pendingq_count;
583         spin_unlock_bh(&aq->lock);
584         return sysfs_emit(buf, "%d\n", penq_cnt);
585 }
586
587 static DEVICE_ATTR_RO(pendingq_count);
588
589 static ssize_t reset_show(struct device *dev,
590                           struct device_attribute *attr, char *buf)
591 {
592         struct ap_queue *aq = to_ap_queue(dev);
593         int rc = 0;
594
595         spin_lock_bh(&aq->lock);
596         switch (aq->sm_state) {
597         case AP_SM_STATE_RESET_START:
598         case AP_SM_STATE_RESET_WAIT:
599                 rc = sysfs_emit(buf, "Reset in progress.\n");
600                 break;
601         case AP_SM_STATE_WORKING:
602         case AP_SM_STATE_QUEUE_FULL:
603                 rc = sysfs_emit(buf, "Reset Timer armed.\n");
604                 break;
605         default:
606                 rc = sysfs_emit(buf, "No Reset Timer set.\n");
607         }
608         spin_unlock_bh(&aq->lock);
609         return rc;
610 }
611
612 static ssize_t reset_store(struct device *dev,
613                            struct device_attribute *attr,
614                            const char *buf, size_t count)
615 {
616         struct ap_queue *aq = to_ap_queue(dev);
617
618         spin_lock_bh(&aq->lock);
619         __ap_flush_queue(aq);
620         aq->sm_state = AP_SM_STATE_RESET_START;
621         ap_wait(ap_sm_event(aq, AP_SM_EVENT_POLL));
622         spin_unlock_bh(&aq->lock);
623
624         AP_DBF_INFO("%s reset queue=%02x.%04x triggered by user\n",
625                     __func__, AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
626
627         return count;
628 }
629
630 static DEVICE_ATTR_RW(reset);
631
632 static ssize_t interrupt_show(struct device *dev,
633                               struct device_attribute *attr, char *buf)
634 {
635         struct ap_queue *aq = to_ap_queue(dev);
636         struct ap_queue_status status;
637         int rc = 0;
638
639         spin_lock_bh(&aq->lock);
640         if (aq->sm_state == AP_SM_STATE_SETIRQ_WAIT) {
641                 rc = sysfs_emit(buf, "Enable Interrupt pending.\n");
642         } else {
643                 status = ap_tapq(aq->qid, NULL);
644                 if (status.irq_enabled)
645                         rc = sysfs_emit(buf, "Interrupts enabled.\n");
646                 else
647                         rc = sysfs_emit(buf, "Interrupts disabled.\n");
648         }
649         spin_unlock_bh(&aq->lock);
650
651         return rc;
652 }
653
654 static DEVICE_ATTR_RO(interrupt);
655
656 static ssize_t config_show(struct device *dev,
657                            struct device_attribute *attr, char *buf)
658 {
659         struct ap_queue *aq = to_ap_queue(dev);
660         int rc;
661
662         spin_lock_bh(&aq->lock);
663         rc = sysfs_emit(buf, "%d\n", aq->config ? 1 : 0);
664         spin_unlock_bh(&aq->lock);
665         return rc;
666 }
667
668 static DEVICE_ATTR_RO(config);
669
670 static ssize_t chkstop_show(struct device *dev,
671                             struct device_attribute *attr, char *buf)
672 {
673         struct ap_queue *aq = to_ap_queue(dev);
674         int rc;
675
676         spin_lock_bh(&aq->lock);
677         rc = sysfs_emit(buf, "%d\n", aq->chkstop ? 1 : 0);
678         spin_unlock_bh(&aq->lock);
679         return rc;
680 }
681
682 static DEVICE_ATTR_RO(chkstop);
683
684 static ssize_t ap_functions_show(struct device *dev,
685                                  struct device_attribute *attr, char *buf)
686 {
687         struct ap_queue *aq = to_ap_queue(dev);
688         struct ap_queue_status status;
689         struct ap_tapq_hwinfo hwinfo;
690
691         status = ap_test_queue(aq->qid, 1, &hwinfo);
692         if (status.response_code > AP_RESPONSE_BUSY) {
693                 AP_DBF_DBG("%s RC 0x%02x on tapq(0x%02x.%04x)\n",
694                            __func__, status.response_code,
695                            AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
696                 return -EIO;
697         }
698
699         return sysfs_emit(buf, "0x%08X\n", hwinfo.fac);
700 }
701
702 static DEVICE_ATTR_RO(ap_functions);
703
704 #ifdef CONFIG_ZCRYPT_DEBUG
705 static ssize_t states_show(struct device *dev,
706                            struct device_attribute *attr, char *buf)
707 {
708         struct ap_queue *aq = to_ap_queue(dev);
709         int rc = 0;
710
711         spin_lock_bh(&aq->lock);
712         /* queue device state */
713         switch (aq->dev_state) {
714         case AP_DEV_STATE_UNINITIATED:
715                 rc = sysfs_emit(buf, "UNINITIATED\n");
716                 break;
717         case AP_DEV_STATE_OPERATING:
718                 rc = sysfs_emit(buf, "OPERATING");
719                 break;
720         case AP_DEV_STATE_SHUTDOWN:
721                 rc = sysfs_emit(buf, "SHUTDOWN");
722                 break;
723         case AP_DEV_STATE_ERROR:
724                 rc = sysfs_emit(buf, "ERROR");
725                 break;
726         default:
727                 rc = sysfs_emit(buf, "UNKNOWN");
728         }
729         /* state machine state */
730         if (aq->dev_state) {
731                 switch (aq->sm_state) {
732                 case AP_SM_STATE_RESET_START:
733                         rc += sysfs_emit_at(buf, rc, " [RESET_START]\n");
734                         break;
735                 case AP_SM_STATE_RESET_WAIT:
736                         rc += sysfs_emit_at(buf, rc, " [RESET_WAIT]\n");
737                         break;
738                 case AP_SM_STATE_SETIRQ_WAIT:
739                         rc += sysfs_emit_at(buf, rc, " [SETIRQ_WAIT]\n");
740                         break;
741                 case AP_SM_STATE_IDLE:
742                         rc += sysfs_emit_at(buf, rc, " [IDLE]\n");
743                         break;
744                 case AP_SM_STATE_WORKING:
745                         rc += sysfs_emit_at(buf, rc, " [WORKING]\n");
746                         break;
747                 case AP_SM_STATE_QUEUE_FULL:
748                         rc += sysfs_emit_at(buf, rc, " [FULL]\n");
749                         break;
750                 case AP_SM_STATE_ASSOC_WAIT:
751                         rc += sysfs_emit_at(buf, rc, " [ASSOC_WAIT]\n");
752                         break;
753                 default:
754                         rc += sysfs_emit_at(buf, rc, " [UNKNOWN]\n");
755                 }
756         }
757         spin_unlock_bh(&aq->lock);
758
759         return rc;
760 }
761 static DEVICE_ATTR_RO(states);
762
763 static ssize_t last_err_rc_show(struct device *dev,
764                                 struct device_attribute *attr, char *buf)
765 {
766         struct ap_queue *aq = to_ap_queue(dev);
767         int rc;
768
769         spin_lock_bh(&aq->lock);
770         rc = aq->last_err_rc;
771         spin_unlock_bh(&aq->lock);
772
773         switch (rc) {
774         case AP_RESPONSE_NORMAL:
775                 return sysfs_emit(buf, "NORMAL\n");
776         case AP_RESPONSE_Q_NOT_AVAIL:
777                 return sysfs_emit(buf, "Q_NOT_AVAIL\n");
778         case AP_RESPONSE_RESET_IN_PROGRESS:
779                 return sysfs_emit(buf, "RESET_IN_PROGRESS\n");
780         case AP_RESPONSE_DECONFIGURED:
781                 return sysfs_emit(buf, "DECONFIGURED\n");
782         case AP_RESPONSE_CHECKSTOPPED:
783                 return sysfs_emit(buf, "CHECKSTOPPED\n");
784         case AP_RESPONSE_BUSY:
785                 return sysfs_emit(buf, "BUSY\n");
786         case AP_RESPONSE_INVALID_ADDRESS:
787                 return sysfs_emit(buf, "INVALID_ADDRESS\n");
788         case AP_RESPONSE_OTHERWISE_CHANGED:
789                 return sysfs_emit(buf, "OTHERWISE_CHANGED\n");
790         case AP_RESPONSE_Q_FULL:
791                 return sysfs_emit(buf, "Q_FULL/NO_PENDING_REPLY\n");
792         case AP_RESPONSE_INDEX_TOO_BIG:
793                 return sysfs_emit(buf, "INDEX_TOO_BIG\n");
794         case AP_RESPONSE_NO_FIRST_PART:
795                 return sysfs_emit(buf, "NO_FIRST_PART\n");
796         case AP_RESPONSE_MESSAGE_TOO_BIG:
797                 return sysfs_emit(buf, "MESSAGE_TOO_BIG\n");
798         case AP_RESPONSE_REQ_FAC_NOT_INST:
799                 return sysfs_emit(buf, "REQ_FAC_NOT_INST\n");
800         default:
801                 return sysfs_emit(buf, "response code %d\n", rc);
802         }
803 }
804 static DEVICE_ATTR_RO(last_err_rc);
805 #endif
806
807 static struct attribute *ap_queue_dev_attrs[] = {
808         &dev_attr_request_count.attr,
809         &dev_attr_requestq_count.attr,
810         &dev_attr_pendingq_count.attr,
811         &dev_attr_reset.attr,
812         &dev_attr_interrupt.attr,
813         &dev_attr_config.attr,
814         &dev_attr_chkstop.attr,
815         &dev_attr_ap_functions.attr,
816 #ifdef CONFIG_ZCRYPT_DEBUG
817         &dev_attr_states.attr,
818         &dev_attr_last_err_rc.attr,
819 #endif
820         NULL
821 };
822
823 static struct attribute_group ap_queue_dev_attr_group = {
824         .attrs = ap_queue_dev_attrs
825 };
826
827 static const struct attribute_group *ap_queue_dev_attr_groups[] = {
828         &ap_queue_dev_attr_group,
829         NULL
830 };
831
832 static struct device_type ap_queue_type = {
833         .name = "ap_queue",
834         .groups = ap_queue_dev_attr_groups,
835 };
836
837 static ssize_t se_bind_show(struct device *dev,
838                             struct device_attribute *attr, char *buf)
839 {
840         struct ap_queue *aq = to_ap_queue(dev);
841         struct ap_queue_status status;
842         struct ap_tapq_hwinfo hwinfo;
843
844         if (!ap_q_supports_bind(aq))
845                 return sysfs_emit(buf, "-\n");
846
847         status = ap_test_queue(aq->qid, 1, &hwinfo);
848         if (status.response_code > AP_RESPONSE_BUSY) {
849                 AP_DBF_DBG("%s RC 0x%02x on tapq(0x%02x.%04x)\n",
850                            __func__, status.response_code,
851                            AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
852                 return -EIO;
853         }
854
855         /* update queue's SE bind state */
856         spin_lock_bh(&aq->lock);
857         aq->se_bstate = hwinfo.bs;
858         spin_unlock_bh(&aq->lock);
859
860         switch (hwinfo.bs) {
861         case AP_BS_Q_USABLE:
862         case AP_BS_Q_USABLE_NO_SECURE_KEY:
863                 return sysfs_emit(buf, "bound\n");
864         default:
865                 return sysfs_emit(buf, "unbound\n");
866         }
867 }
868
869 static ssize_t se_bind_store(struct device *dev,
870                              struct device_attribute *attr,
871                              const char *buf, size_t count)
872 {
873         struct ap_queue *aq = to_ap_queue(dev);
874         struct ap_queue_status status;
875         struct ap_tapq_hwinfo hwinfo;
876         bool value;
877         int rc;
878
879         if (!ap_q_supports_bind(aq))
880                 return -EINVAL;
881
882         /* only 0 (unbind) and 1 (bind) allowed */
883         rc = kstrtobool(buf, &value);
884         if (rc)
885                 return rc;
886
887         if (!value) {
888                 /* Unbind. Set F bit arg and trigger RAPQ */
889                 spin_lock_bh(&aq->lock);
890                 __ap_flush_queue(aq);
891                 aq->rapq_fbit = 1;
892                 _ap_queue_init_state(aq);
893                 rc = count;
894                 goto out;
895         }
896
897         /* Bind. Check current SE bind state */
898         status = ap_test_queue(aq->qid, 1, &hwinfo);
899         if (status.response_code) {
900                 AP_DBF_WARN("%s RC 0x%02x on tapq(0x%02x.%04x)\n",
901                             __func__, status.response_code,
902                             AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
903                 return -EIO;
904         }
905
906         /* Update BS state */
907         spin_lock_bh(&aq->lock);
908         aq->se_bstate = hwinfo.bs;
909         if (hwinfo.bs != AP_BS_Q_AVAIL_FOR_BINDING) {
910                 AP_DBF_WARN("%s bind attempt with bs %d on queue 0x%02x.%04x\n",
911                             __func__, hwinfo.bs,
912                             AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
913                 rc = -EINVAL;
914                 goto out;
915         }
916
917         /* Check SM state */
918         if (aq->sm_state < AP_SM_STATE_IDLE) {
919                 rc = -EBUSY;
920                 goto out;
921         }
922
923         /* invoke BAPQ */
924         status = ap_bapq(aq->qid);
925         if (status.response_code) {
926                 AP_DBF_WARN("%s RC 0x%02x on bapq(0x%02x.%04x)\n",
927                             __func__, status.response_code,
928                             AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
929                 rc = -EIO;
930                 goto out;
931         }
932         aq->assoc_idx = ASSOC_IDX_INVALID;
933
934         /* verify SE bind state */
935         status = ap_test_queue(aq->qid, 1, &hwinfo);
936         if (status.response_code) {
937                 AP_DBF_WARN("%s RC 0x%02x on tapq(0x%02x.%04x)\n",
938                             __func__, status.response_code,
939                             AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
940                 rc = -EIO;
941                 goto out;
942         }
943         aq->se_bstate = hwinfo.bs;
944         if (!(hwinfo.bs == AP_BS_Q_USABLE ||
945               hwinfo.bs == AP_BS_Q_USABLE_NO_SECURE_KEY)) {
946                 AP_DBF_WARN("%s BAPQ success, but bs shows %d on queue 0x%02x.%04x\n",
947                             __func__, hwinfo.bs,
948                             AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
949                 rc = -EIO;
950                 goto out;
951         }
952
953         /* SE bind was successful */
954         AP_DBF_INFO("%s bapq(0x%02x.%04x) success\n", __func__,
955                     AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
956         rc = count;
957
958 out:
959         spin_unlock_bh(&aq->lock);
960         return rc;
961 }
962
963 static DEVICE_ATTR_RW(se_bind);
964
965 static ssize_t se_associate_show(struct device *dev,
966                                  struct device_attribute *attr, char *buf)
967 {
968         struct ap_queue *aq = to_ap_queue(dev);
969         struct ap_queue_status status;
970         struct ap_tapq_hwinfo hwinfo;
971
972         if (!ap_q_supports_assoc(aq))
973                 return sysfs_emit(buf, "-\n");
974
975         status = ap_test_queue(aq->qid, 1, &hwinfo);
976         if (status.response_code > AP_RESPONSE_BUSY) {
977                 AP_DBF_DBG("%s RC 0x%02x on tapq(0x%02x.%04x)\n",
978                            __func__, status.response_code,
979                            AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
980                 return -EIO;
981         }
982
983         /* update queue's SE bind state */
984         spin_lock_bh(&aq->lock);
985         aq->se_bstate = hwinfo.bs;
986         spin_unlock_bh(&aq->lock);
987
988         switch (hwinfo.bs) {
989         case AP_BS_Q_USABLE:
990                 if (aq->assoc_idx == ASSOC_IDX_INVALID) {
991                         AP_DBF_WARN("%s AP_BS_Q_USABLE but invalid assoc_idx\n", __func__);
992                         return -EIO;
993                 }
994                 return sysfs_emit(buf, "associated %u\n", aq->assoc_idx);
995         case AP_BS_Q_USABLE_NO_SECURE_KEY:
996                 if (aq->assoc_idx != ASSOC_IDX_INVALID)
997                         return sysfs_emit(buf, "association pending\n");
998                 fallthrough;
999         default:
1000                 return sysfs_emit(buf, "unassociated\n");
1001         }
1002 }
1003
1004 static ssize_t se_associate_store(struct device *dev,
1005                                   struct device_attribute *attr,
1006                                   const char *buf, size_t count)
1007 {
1008         struct ap_queue *aq = to_ap_queue(dev);
1009         struct ap_queue_status status;
1010         struct ap_tapq_hwinfo hwinfo;
1011         unsigned int value;
1012         int rc;
1013
1014         if (!ap_q_supports_assoc(aq))
1015                 return -EINVAL;
1016
1017         /* association index needs to be >= 0 */
1018         rc = kstrtouint(buf, 0, &value);
1019         if (rc)
1020                 return rc;
1021         if (value >= ASSOC_IDX_INVALID)
1022                 return -EINVAL;
1023
1024         /* check current SE bind state */
1025         status = ap_test_queue(aq->qid, 1, &hwinfo);
1026         if (status.response_code) {
1027                 AP_DBF_WARN("%s RC 0x%02x on tapq(0x%02x.%04x)\n",
1028                             __func__, status.response_code,
1029                             AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
1030                 return -EIO;
1031         }
1032         spin_lock_bh(&aq->lock);
1033         aq->se_bstate = hwinfo.bs;
1034         if (hwinfo.bs != AP_BS_Q_USABLE_NO_SECURE_KEY) {
1035                 AP_DBF_WARN("%s association attempt with bs %d on queue 0x%02x.%04x\n",
1036                             __func__, hwinfo.bs,
1037                             AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
1038                 rc = -EINVAL;
1039                 goto out;
1040         }
1041
1042         /* check SM state */
1043         if (aq->sm_state != AP_SM_STATE_IDLE) {
1044                 rc = -EBUSY;
1045                 goto out;
1046         }
1047
1048         /* trigger the asynchronous association request */
1049         status = ap_aapq(aq->qid, value);
1050         switch (status.response_code) {
1051         case AP_RESPONSE_NORMAL:
1052         case AP_RESPONSE_STATE_CHANGE_IN_PROGRESS:
1053                 aq->sm_state = AP_SM_STATE_ASSOC_WAIT;
1054                 aq->assoc_idx = value;
1055                 ap_wait(ap_sm_event(aq, AP_SM_EVENT_POLL));
1056                 break;
1057         default:
1058                 AP_DBF_WARN("%s RC 0x%02x on aapq(0x%02x.%04x)\n",
1059                             __func__, status.response_code,
1060                             AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid));
1061                 rc = -EIO;
1062                 goto out;
1063         }
1064
1065         rc = count;
1066
1067 out:
1068         spin_unlock_bh(&aq->lock);
1069         return rc;
1070 }
1071
1072 static DEVICE_ATTR_RW(se_associate);
1073
1074 static struct attribute *ap_queue_dev_sb_attrs[] = {
1075         &dev_attr_se_bind.attr,
1076         &dev_attr_se_associate.attr,
1077         NULL
1078 };
1079
1080 static struct attribute_group ap_queue_dev_sb_attr_group = {
1081         .attrs = ap_queue_dev_sb_attrs
1082 };
1083
1084 static const struct attribute_group *ap_queue_dev_sb_attr_groups[] = {
1085         &ap_queue_dev_sb_attr_group,
1086         NULL
1087 };
1088
1089 static void ap_queue_device_release(struct device *dev)
1090 {
1091         struct ap_queue *aq = to_ap_queue(dev);
1092
1093         spin_lock_bh(&ap_queues_lock);
1094         hash_del(&aq->hnode);
1095         spin_unlock_bh(&ap_queues_lock);
1096
1097         kfree(aq);
1098 }
1099
1100 struct ap_queue *ap_queue_create(ap_qid_t qid, int device_type)
1101 {
1102         struct ap_queue *aq;
1103
1104         aq = kzalloc(sizeof(*aq), GFP_KERNEL);
1105         if (!aq)
1106                 return NULL;
1107         aq->ap_dev.device.release = ap_queue_device_release;
1108         aq->ap_dev.device.type = &ap_queue_type;
1109         aq->ap_dev.device_type = device_type;
1110         // add optional SE secure binding attributes group
1111         if (ap_sb_available() && is_prot_virt_guest())
1112                 aq->ap_dev.device.groups = ap_queue_dev_sb_attr_groups;
1113         aq->qid = qid;
1114         spin_lock_init(&aq->lock);
1115         INIT_LIST_HEAD(&aq->pendingq);
1116         INIT_LIST_HEAD(&aq->requestq);
1117         timer_setup(&aq->timeout, ap_request_timeout, 0);
1118
1119         return aq;
1120 }
1121
1122 void ap_queue_init_reply(struct ap_queue *aq, struct ap_message *reply)
1123 {
1124         aq->reply = reply;
1125
1126         spin_lock_bh(&aq->lock);
1127         ap_wait(ap_sm_event(aq, AP_SM_EVENT_POLL));
1128         spin_unlock_bh(&aq->lock);
1129 }
1130 EXPORT_SYMBOL(ap_queue_init_reply);
1131
1132 /**
1133  * ap_queue_message(): Queue a request to an AP device.
1134  * @aq: The AP device to queue the message to
1135  * @ap_msg: The message that is to be added
1136  */
1137 int ap_queue_message(struct ap_queue *aq, struct ap_message *ap_msg)
1138 {
1139         int rc = 0;
1140
1141         /* msg needs to have a valid receive-callback */
1142         BUG_ON(!ap_msg->receive);
1143
1144         spin_lock_bh(&aq->lock);
1145
1146         /* only allow to queue new messages if device state is ok */
1147         if (aq->dev_state == AP_DEV_STATE_OPERATING) {
1148                 list_add_tail(&ap_msg->list, &aq->requestq);
1149                 aq->requestq_count++;
1150                 aq->total_request_count++;
1151                 atomic64_inc(&aq->card->total_request_count);
1152         } else {
1153                 rc = -ENODEV;
1154         }
1155
1156         /* Send/receive as many request from the queue as possible. */
1157         ap_wait(ap_sm_event_loop(aq, AP_SM_EVENT_POLL));
1158
1159         spin_unlock_bh(&aq->lock);
1160
1161         return rc;
1162 }
1163 EXPORT_SYMBOL(ap_queue_message);
1164
1165 /**
1166  * ap_queue_usable(): Check if queue is usable just now.
1167  * @aq: The AP queue device to test for usability.
1168  * This function is intended for the scheduler to query if it makes
1169  * sense to enqueue a message into this AP queue device by calling
1170  * ap_queue_message(). The perspective is very short-term as the
1171  * state machine and device state(s) may change at any time.
1172  */
1173 bool ap_queue_usable(struct ap_queue *aq)
1174 {
1175         bool rc = true;
1176
1177         spin_lock_bh(&aq->lock);
1178
1179         /* check for not configured or checkstopped */
1180         if (!aq->config || aq->chkstop) {
1181                 rc = false;
1182                 goto unlock_and_out;
1183         }
1184
1185         /* device state needs to be ok */
1186         if (aq->dev_state != AP_DEV_STATE_OPERATING) {
1187                 rc = false;
1188                 goto unlock_and_out;
1189         }
1190
1191         /* SE guest's queues additionally need to be bound */
1192         if (ap_q_needs_bind(aq) &&
1193             !(aq->se_bstate == AP_BS_Q_USABLE ||
1194               aq->se_bstate == AP_BS_Q_USABLE_NO_SECURE_KEY))
1195                 rc = false;
1196
1197 unlock_and_out:
1198         spin_unlock_bh(&aq->lock);
1199         return rc;
1200 }
1201 EXPORT_SYMBOL(ap_queue_usable);
1202
1203 /**
1204  * ap_cancel_message(): Cancel a crypto request.
1205  * @aq: The AP device that has the message queued
1206  * @ap_msg: The message that is to be removed
1207  *
1208  * Cancel a crypto request. This is done by removing the request
1209  * from the device pending or request queue. Note that the
1210  * request stays on the AP queue. When it finishes the message
1211  * reply will be discarded because the psmid can't be found.
1212  */
1213 void ap_cancel_message(struct ap_queue *aq, struct ap_message *ap_msg)
1214 {
1215         struct ap_message *tmp;
1216
1217         spin_lock_bh(&aq->lock);
1218         if (!list_empty(&ap_msg->list)) {
1219                 list_for_each_entry(tmp, &aq->pendingq, list)
1220                         if (tmp->psmid == ap_msg->psmid) {
1221                                 aq->pendingq_count--;
1222                                 goto found;
1223                         }
1224                 aq->requestq_count--;
1225 found:
1226                 list_del_init(&ap_msg->list);
1227         }
1228         spin_unlock_bh(&aq->lock);
1229 }
1230 EXPORT_SYMBOL(ap_cancel_message);
1231
1232 /**
1233  * __ap_flush_queue(): Flush requests.
1234  * @aq: Pointer to the AP queue
1235  *
1236  * Flush all requests from the request/pending queue of an AP device.
1237  */
1238 static void __ap_flush_queue(struct ap_queue *aq)
1239 {
1240         struct ap_message *ap_msg, *next;
1241
1242         list_for_each_entry_safe(ap_msg, next, &aq->pendingq, list) {
1243                 list_del_init(&ap_msg->list);
1244                 aq->pendingq_count--;
1245                 ap_msg->rc = -EAGAIN;
1246                 ap_msg->receive(aq, ap_msg, NULL);
1247         }
1248         list_for_each_entry_safe(ap_msg, next, &aq->requestq, list) {
1249                 list_del_init(&ap_msg->list);
1250                 aq->requestq_count--;
1251                 ap_msg->rc = -EAGAIN;
1252                 ap_msg->receive(aq, ap_msg, NULL);
1253         }
1254         aq->queue_count = 0;
1255 }
1256
1257 void ap_flush_queue(struct ap_queue *aq)
1258 {
1259         spin_lock_bh(&aq->lock);
1260         __ap_flush_queue(aq);
1261         spin_unlock_bh(&aq->lock);
1262 }
1263 EXPORT_SYMBOL(ap_flush_queue);
1264
1265 void ap_queue_prepare_remove(struct ap_queue *aq)
1266 {
1267         spin_lock_bh(&aq->lock);
1268         /* flush queue */
1269         __ap_flush_queue(aq);
1270         /* move queue device state to SHUTDOWN in progress */
1271         aq->dev_state = AP_DEV_STATE_SHUTDOWN;
1272         spin_unlock_bh(&aq->lock);
1273         del_timer_sync(&aq->timeout);
1274 }
1275
1276 void ap_queue_remove(struct ap_queue *aq)
1277 {
1278         /*
1279          * all messages have been flushed and the device state
1280          * is SHUTDOWN. Now reset with zero which also clears
1281          * the irq registration and move the device state
1282          * to the initial value AP_DEV_STATE_UNINITIATED.
1283          */
1284         spin_lock_bh(&aq->lock);
1285         ap_zapq(aq->qid, 0);
1286         aq->dev_state = AP_DEV_STATE_UNINITIATED;
1287         spin_unlock_bh(&aq->lock);
1288 }
1289
1290 void _ap_queue_init_state(struct ap_queue *aq)
1291 {
1292         aq->dev_state = AP_DEV_STATE_OPERATING;
1293         aq->sm_state = AP_SM_STATE_RESET_START;
1294         aq->last_err_rc = 0;
1295         aq->assoc_idx = ASSOC_IDX_INVALID;
1296         ap_wait(ap_sm_event(aq, AP_SM_EVENT_POLL));
1297 }
1298
1299 void ap_queue_init_state(struct ap_queue *aq)
1300 {
1301         spin_lock_bh(&aq->lock);
1302         _ap_queue_init_state(aq);
1303         spin_unlock_bh(&aq->lock);
1304 }
1305 EXPORT_SYMBOL(ap_queue_init_state);