Loading...
Note: File does not exist in v3.1.
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
19static void __ap_flush_queue(struct ap_queue *aq);
20
21/*
22 * some AP queue helper functions
23 */
24
25static inline bool ap_q_supports_bind(struct ap_queue *aq)
26{
27 return aq->card->hwinfo.ep11 || aq->card->hwinfo.accel;
28}
29
30static inline bool ap_q_supports_assoc(struct ap_queue *aq)
31{
32 return aq->card->hwinfo.ep11;
33}
34
35static 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 */
49static 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 */
91static 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
102static 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 */
114static 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 */
186static 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 */
235static 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 */
297static 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 */
308static 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 */
337static 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 */
378static 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 */
417static 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 */
471static 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
502enum 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
511enum 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 */
523static 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
544static 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
557static DEVICE_ATTR_RW(request_count);
558
559static 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
572static DEVICE_ATTR_RO(requestq_count);
573
574static 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
587static DEVICE_ATTR_RO(pendingq_count);
588
589static 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
612static 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
630static DEVICE_ATTR_RW(reset);
631
632static 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
654static DEVICE_ATTR_RO(interrupt);
655
656static 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
668static DEVICE_ATTR_RO(config);
669
670static 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
682static DEVICE_ATTR_RO(chkstop);
683
684static 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
702static DEVICE_ATTR_RO(ap_functions);
703
704#ifdef CONFIG_ZCRYPT_DEBUG
705static 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}
761static DEVICE_ATTR_RO(states);
762
763static 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}
804static DEVICE_ATTR_RO(last_err_rc);
805#endif
806
807static 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
823static struct attribute_group ap_queue_dev_attr_group = {
824 .attrs = ap_queue_dev_attrs
825};
826
827static const struct attribute_group *ap_queue_dev_attr_groups[] = {
828 &ap_queue_dev_attr_group,
829 NULL
830};
831
832static struct device_type ap_queue_type = {
833 .name = "ap_queue",
834 .groups = ap_queue_dev_attr_groups,
835};
836
837static 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
869static 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
958out:
959 spin_unlock_bh(&aq->lock);
960 return rc;
961}
962
963static DEVICE_ATTR_RW(se_bind);
964
965static 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
1004static 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
1067out:
1068 spin_unlock_bh(&aq->lock);
1069 return rc;
1070}
1071
1072static DEVICE_ATTR_RW(se_associate);
1073
1074static struct attribute *ap_queue_dev_sb_attrs[] = {
1075 &dev_attr_se_bind.attr,
1076 &dev_attr_se_associate.attr,
1077 NULL
1078};
1079
1080static struct attribute_group ap_queue_dev_sb_attr_group = {
1081 .attrs = ap_queue_dev_sb_attrs
1082};
1083
1084static const struct attribute_group *ap_queue_dev_sb_attr_groups[] = {
1085 &ap_queue_dev_sb_attr_group,
1086 NULL
1087};
1088
1089static 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
1100struct 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
1122void 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}
1130EXPORT_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 */
1137int 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}
1163EXPORT_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 */
1173bool 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
1197unlock_and_out:
1198 spin_unlock_bh(&aq->lock);
1199 return rc;
1200}
1201EXPORT_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 */
1213void 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--;
1225found:
1226 list_del_init(&ap_msg->list);
1227 }
1228 spin_unlock_bh(&aq->lock);
1229}
1230EXPORT_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 */
1238static 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
1257void 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}
1263EXPORT_SYMBOL(ap_flush_queue);
1264
1265void 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
1276void 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
1290void _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
1299void 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}
1305EXPORT_SYMBOL(ap_queue_init_state);