diff options
author | Harald Freudenberger <freude@linux.vnet.ibm.com> | 2016-11-24 08:45:21 +0300 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2016-12-14 18:33:39 +0300 |
commit | cccd85bfb7bf6787302435c669ceec23b5a5301c (patch) | |
tree | c646f0474f1344372596c37adff268dbdb4f07c3 /drivers | |
parent | bf9f31190aa176c43c15cf58b60818d325e0f851 (diff) | |
download | linux-cccd85bfb7bf6787302435c669ceec23b5a5301c.tar.xz |
s390/zcrypt: Rework debug feature invocations.
Rework the debug feature calls and initialization. There
are now two debug feature entries used by the zcrypt code.
The first is 'ap' with all the AP bus related stuff and the
second is 'zcrypt' with all the zcrypt and devices and
driver related entries. However, there isn't much traffic on
both debug features. The ap bus code emits only some debug
info and for zcrypt devices on appearance and disappearance
there is an entry written.
The new dbf invocations use the sprintf buffer layout,
whereas the old implementation used the ascii dbf buffer.
There are now 5*8=40 bytes used for each entry, resulting in
5 parameters per call. As the sprintf buffer needs a format
string the first parameter provides this and so up to 4 more
parameters can be used. Alltogehter the new layout should be
much more human readable for customers and test.
Signed-off-by: Harald Freudenberger <freude@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/s390/crypto/ap_bus.c | 40 | ||||
-rw-r--r-- | drivers/s390/crypto/ap_debug.h | 28 | ||||
-rw-r--r-- | drivers/s390/crypto/zcrypt_api.c | 38 | ||||
-rw-r--r-- | drivers/s390/crypto/zcrypt_api.h | 8 | ||||
-rw-r--r-- | drivers/s390/crypto/zcrypt_card.c | 10 | ||||
-rw-r--r-- | drivers/s390/crypto/zcrypt_debug.h | 50 | ||||
-rw-r--r-- | drivers/s390/crypto/zcrypt_error.h | 35 | ||||
-rw-r--r-- | drivers/s390/crypto/zcrypt_msgtype50.c | 23 | ||||
-rw-r--r-- | drivers/s390/crypto/zcrypt_msgtype6.c | 80 | ||||
-rw-r--r-- | drivers/s390/crypto/zcrypt_queue.c | 21 |
10 files changed, 190 insertions, 143 deletions
diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c index 78c99ae42b1f..6d75984a3d85 100644 --- a/drivers/s390/crypto/ap_bus.c +++ b/drivers/s390/crypto/ap_bus.c @@ -47,9 +47,11 @@ #include <asm/facility.h> #include <linux/crypto.h> #include <linux/mod_devicetable.h> +#include <linux/debugfs.h> #include "ap_bus.h" #include "ap_asm.h" +#include "ap_debug.h" /* * Module description. @@ -82,6 +84,12 @@ static struct ap_config_info *ap_configuration; static bool initialised; /* + * AP bus related debug feature things. + */ +static struct dentry *ap_dbf_root; +debug_info_t *ap_dbf_info; + +/* * Workqueue timer for bus rescan. */ static struct timer_list ap_config_timer; @@ -568,6 +576,8 @@ static int ap_dev_resume(struct device *dev) static void ap_bus_suspend(void) { + AP_DBF(DBF_DEBUG, "ap_bus_suspend running\n"); + ap_suspend_flag = 1; /* * Disable scanning for devices, thus we do not want to scan @@ -603,6 +613,8 @@ static void ap_bus_resume(void) { int rc; + AP_DBF(DBF_DEBUG, "ap_bus_resume running\n"); + /* remove all queue devices */ bus_for_each_dev(&ap_bus_type, NULL, NULL, __ap_queue_devices_unregister); @@ -742,6 +754,9 @@ static ssize_t ap_domain_store(struct bus_type *bus, spin_lock_bh(&ap_domain_lock); ap_domain_index = domain; spin_unlock_bh(&ap_domain_lock); + + AP_DBF(DBF_DEBUG, "store new default domain=%d\n", domain); + return count; } @@ -964,6 +979,8 @@ static void ap_scan_bus(struct work_struct *unused) unsigned int functions = 0; int rc, id, dom, borked, domains; + AP_DBF(DBF_DEBUG, "ap_scan_bus running\n"); + ap_query_configuration(); if (ap_select_domain() != 0) goto out; @@ -1129,6 +1146,23 @@ static struct reset_call ap_reset_call = { .fn = ap_reset_all, }; +int __init ap_debug_init(void) +{ + ap_dbf_root = debugfs_create_dir("ap", NULL); + ap_dbf_info = debug_register("ap", 1, 1, + DBF_MAX_SPRINTF_ARGS * sizeof(long)); + debug_register_view(ap_dbf_info, &debug_sprintf_view); + debug_set_level(ap_dbf_info, DBF_ERR); + + return 0; +} + +void ap_debug_exit(void) +{ + debugfs_remove(ap_dbf_root); + debug_unregister(ap_dbf_info); +} + /** * ap_module_init(): The module initialization code. * @@ -1139,6 +1173,10 @@ int __init ap_module_init(void) int max_domain_id; int rc, i; + rc = ap_debug_init(); + if (rc) + return rc; + if (ap_instructions_available() != 0) { pr_warn("The hardware system does not support AP instructions\n"); return -ENODEV; @@ -1266,6 +1304,8 @@ void ap_module_exit(void) unregister_reset_call(&ap_reset_call); if (ap_using_interrupts()) unregister_adapter_interrupt(&ap_airq); + + ap_debug_exit(); } module_init(ap_module_init); diff --git a/drivers/s390/crypto/ap_debug.h b/drivers/s390/crypto/ap_debug.h new file mode 100644 index 000000000000..78dbff842dae --- /dev/null +++ b/drivers/s390/crypto/ap_debug.h @@ -0,0 +1,28 @@ +/* + * Copyright IBM Corp. 2016 + * Author(s): Harald Freudenberger <freude@de.ibm.com> + */ +#ifndef AP_DEBUG_H +#define AP_DEBUG_H + +#include <asm/debug.h> + +#define DBF_ERR 3 /* error conditions */ +#define DBF_WARN 4 /* warning conditions */ +#define DBF_INFO 5 /* informational */ +#define DBF_DEBUG 6 /* for debugging only */ + +#define RC2ERR(rc) ((rc) ? DBF_ERR : DBF_INFO) +#define RC2WARN(rc) ((rc) ? DBF_WARN : DBF_INFO) + +#define DBF_MAX_SPRINTF_ARGS 5 + +#define AP_DBF(...) \ + debug_sprintf_event(ap_dbf_info, ##__VA_ARGS__) + +extern debug_info_t *ap_dbf_info; + +int ap_debug_init(void); +void ap_debug_exit(void); + +#endif /* AP_DEBUG_H */ diff --git a/drivers/s390/crypto/zcrypt_api.c b/drivers/s390/crypto/zcrypt_api.c index 71e298fe339f..7ca25e77bd6a 100644 --- a/drivers/s390/crypto/zcrypt_api.c +++ b/drivers/s390/crypto/zcrypt_api.c @@ -41,8 +41,8 @@ #include <linux/debugfs.h> #include <asm/debug.h> -#include "zcrypt_debug.h" #include "zcrypt_api.h" +#include "zcrypt_debug.h" #include "zcrypt_msgtype6.h" #include "zcrypt_msgtype50.h" @@ -71,10 +71,9 @@ EXPORT_SYMBOL(zcrypt_rescan_req); static LIST_HEAD(zcrypt_ops_list); -static struct dentry *debugfs_root; -debug_info_t *zcrypt_dbf_common; -debug_info_t *zcrypt_dbf_devices; -debug_info_t *zcrypt_dbf_cards; +/* Zcrypt related debug feature stuff. */ +static struct dentry *zcrypt_dbf_root; +debug_info_t *zcrypt_dbf_info; /** * Process a rescan of the transport layer. @@ -87,8 +86,8 @@ static inline int zcrypt_process_rescan(void) atomic_set(&zcrypt_rescan_req, 0); atomic_inc(&zcrypt_rescan_count); ap_bus_force_rescan(); - ZCRYPT_DBF_COMMON(DBF_INFO, "rescan%07d", - atomic_inc_return(&zcrypt_rescan_count)); + ZCRYPT_DBF(DBF_INFO, "rescan count=%07d", + atomic_inc_return(&zcrypt_rescan_count)); return 1; } return 0; @@ -1363,28 +1362,19 @@ void zcrypt_rng_device_remove(void) int __init zcrypt_debug_init(void) { - debugfs_root = debugfs_create_dir("zcrypt", NULL); - - zcrypt_dbf_common = debug_register("zcrypt_common", 1, 1, 16); - debug_register_view(zcrypt_dbf_common, &debug_hex_ascii_view); - debug_set_level(zcrypt_dbf_common, DBF_ERR); - - zcrypt_dbf_devices = debug_register("zcrypt_devices", 1, 1, 16); - debug_register_view(zcrypt_dbf_devices, &debug_hex_ascii_view); - debug_set_level(zcrypt_dbf_devices, DBF_ERR); - - zcrypt_dbf_cards = debug_register("zcrypt_cards", 1, 1, 16); - debug_register_view(zcrypt_dbf_cards, &debug_hex_ascii_view); - debug_set_level(zcrypt_dbf_cards, DBF_ERR); + zcrypt_dbf_root = debugfs_create_dir("zcrypt", NULL); + zcrypt_dbf_info = debug_register("zcrypt", 1, 1, + DBF_MAX_SPRINTF_ARGS * sizeof(long)); + debug_register_view(zcrypt_dbf_info, &debug_sprintf_view); + debug_set_level(zcrypt_dbf_info, DBF_ERR); return 0; } void zcrypt_debug_exit(void) { - debugfs_remove(debugfs_root); - debug_unregister(zcrypt_dbf_common); - debug_unregister(zcrypt_dbf_devices); + debugfs_remove(zcrypt_dbf_root); + debug_unregister(zcrypt_dbf_info); } /** @@ -1434,9 +1424,9 @@ void __exit zcrypt_api_exit(void) { remove_proc_entry("driver/z90crypt", NULL); misc_deregister(&zcrypt_misc_device); - zcrypt_debug_exit(); zcrypt_msgtype6_exit(); zcrypt_msgtype50_exit(); + zcrypt_debug_exit(); } module_init(zcrypt_api_init); diff --git a/drivers/s390/crypto/zcrypt_api.h b/drivers/s390/crypto/zcrypt_api.h index 4fb892b99f41..274a59051534 100644 --- a/drivers/s390/crypto/zcrypt_api.h +++ b/drivers/s390/crypto/zcrypt_api.h @@ -132,8 +132,6 @@ struct zcrypt_card { atomic_t load; /* Utilization of the crypto device */ int request_count; /* # current requests. */ - - debug_info_t *dbf_area; /* debugging */ }; struct zcrypt_queue { @@ -149,8 +147,6 @@ struct zcrypt_queue { int request_count; /* # current requests. */ struct ap_message reply; /* Per-device reply structure. */ - - debug_info_t *dbf_area; /* debugging */ }; /* transport layer rescanning */ @@ -160,10 +156,6 @@ extern spinlock_t zcrypt_list_lock; extern int zcrypt_device_count; extern struct list_head zcrypt_card_list; -extern debug_info_t *zcrypt_dbf_common; -extern debug_info_t *zcrypt_dbf_devices; -extern debug_info_t *zcrypt_dbf_cards; - #define for_each_zcrypt_card(_zc) \ list_for_each_entry(_zc, &zcrypt_card_list, list) diff --git a/drivers/s390/crypto/zcrypt_card.c b/drivers/s390/crypto/zcrypt_card.c index 57873d775e95..53436ea52230 100644 --- a/drivers/s390/crypto/zcrypt_card.c +++ b/drivers/s390/crypto/zcrypt_card.c @@ -79,7 +79,9 @@ static ssize_t zcrypt_card_online_store(struct device *dev, zc->online = online; id = zc->card->id; - ZCRYPT_DBF_DEV(DBF_INFO, zc, "card%02xo%dman", id, online); + + ZCRYPT_DBF(DBF_INFO, "card=%02x online=%d\n", id, online); + spin_lock(&zcrypt_list_lock); list_for_each_entry(zq, &zc->zqueues, list) zcrypt_queue_force_online(zq, online); @@ -109,7 +111,6 @@ struct zcrypt_card *zcrypt_card_alloc(void) return NULL; INIT_LIST_HEAD(&zc->list); INIT_LIST_HEAD(&zc->zqueues); - zc->dbf_area = zcrypt_dbf_cards; kref_init(&zc->refcount); return zc; } @@ -160,6 +161,9 @@ int zcrypt_card_register(struct zcrypt_card *zc) spin_unlock(&zcrypt_list_lock); zc->online = 1; + + ZCRYPT_DBF(DBF_INFO, "card=%02x register online=1\n", zc->card->id); + return rc; } EXPORT_SYMBOL(zcrypt_card_register); @@ -172,6 +176,8 @@ EXPORT_SYMBOL(zcrypt_card_register); */ void zcrypt_card_unregister(struct zcrypt_card *zc) { + ZCRYPT_DBF(DBF_INFO, "card=%02x unregister\n", zc->card->id); + spin_lock(&zcrypt_list_lock); list_del_init(&zc->list); spin_unlock(&zcrypt_list_lock); diff --git a/drivers/s390/crypto/zcrypt_debug.h b/drivers/s390/crypto/zcrypt_debug.h index 28d9349de1ad..13e38defb6b8 100644 --- a/drivers/s390/crypto/zcrypt_debug.h +++ b/drivers/s390/crypto/zcrypt_debug.h @@ -1,51 +1,27 @@ /* - * Copyright IBM Corp. 2012 + * Copyright IBM Corp. 2016 * Author(s): Holger Dengler (hd@linux.vnet.ibm.com) + * Harald Freudenberger <freude@de.ibm.com> */ #ifndef ZCRYPT_DEBUG_H #define ZCRYPT_DEBUG_H #include <asm/debug.h> -#include "zcrypt_api.h" -/* that gives us 15 characters in the text event views */ -#define ZCRYPT_DBF_LEN 16 - -#define DBF_ERR 3 /* error conditions */ -#define DBF_WARN 4 /* warning conditions */ -#define DBF_INFO 6 /* informational */ +#define DBF_ERR 3 /* error conditions */ +#define DBF_WARN 4 /* warning conditions */ +#define DBF_INFO 5 /* informational */ +#define DBF_DEBUG 6 /* for debugging only */ +#define RC2ERR(rc) ((rc) ? DBF_ERR : DBF_INFO) #define RC2WARN(rc) ((rc) ? DBF_WARN : DBF_INFO) -#define ZCRYPT_DBF_COMMON(level, text...) \ - do { \ - if (debug_level_enabled(zcrypt_dbf_common, level)) { \ - char debug_buffer[ZCRYPT_DBF_LEN]; \ - snprintf(debug_buffer, ZCRYPT_DBF_LEN, text); \ - debug_text_event(zcrypt_dbf_common, level, \ - debug_buffer); \ - } \ - } while (0) - -#define ZCRYPT_DBF_DEVICES(level, text...) \ - do { \ - if (debug_level_enabled(zcrypt_dbf_devices, level)) { \ - char debug_buffer[ZCRYPT_DBF_LEN]; \ - snprintf(debug_buffer, ZCRYPT_DBF_LEN, text); \ - debug_text_event(zcrypt_dbf_devices, level, \ - debug_buffer); \ - } \ - } while (0) - -#define ZCRYPT_DBF_DEV(level, device, text...) \ - do { \ - if (debug_level_enabled(device->dbf_area, level)) { \ - char debug_buffer[ZCRYPT_DBF_LEN]; \ - snprintf(debug_buffer, ZCRYPT_DBF_LEN, text); \ - debug_text_event(device->dbf_area, level, \ - debug_buffer); \ - } \ - } while (0) +#define DBF_MAX_SPRINTF_ARGS 5 + +#define ZCRYPT_DBF(...) \ + debug_sprintf_event(zcrypt_dbf_info, ##__VA_ARGS__) + +extern debug_info_t *zcrypt_dbf_info; int zcrypt_debug_init(void); void zcrypt_debug_exit(void); diff --git a/drivers/s390/crypto/zcrypt_error.h b/drivers/s390/crypto/zcrypt_error.h index 865978879661..13df60209ed3 100644 --- a/drivers/s390/crypto/zcrypt_error.h +++ b/drivers/s390/crypto/zcrypt_error.h @@ -93,6 +93,8 @@ static inline int convert_error(struct zcrypt_queue *zq, struct ap_message *reply) { struct error_hdr *ehdr = reply->message; + int card = AP_QID_CARD(zq->queue->qid); + int queue = AP_QID_QUEUE(zq->queue->qid); switch (ehdr->reply_code) { case REP82_ERROR_OPERAND_INVALID: @@ -105,6 +107,9 @@ static inline int convert_error(struct zcrypt_queue *zq, // REP88_ERROR_OPERAND // '84' CEX2A // REP88_ERROR_OPERAND_EVEN_MOD // '85' CEX2A /* Invalid input data. */ + ZCRYPT_DBF(DBF_WARN, + "device=%02x.%04x reply=0x%02x => rc=EINVAL\n", + card, queue, ehdr->reply_code); return -EINVAL; case REP82_ERROR_MESSAGE_TYPE: // REP88_ERROR_MESSAGE_TYPE // '20' CEX2A @@ -116,12 +121,10 @@ static inline int convert_error(struct zcrypt_queue *zq, atomic_set(&zcrypt_rescan_req, 1); zq->online = 0; pr_err("Cryptographic device %02x.%04x failed and was set offline\n", - AP_QID_CARD(zq->queue->qid), - AP_QID_QUEUE(zq->queue->qid)); - ZCRYPT_DBF_DEV(DBF_ERR, zq, "dev%02x%04xo%drc%d", - AP_QID_CARD(zq->queue->qid), - AP_QID_QUEUE(zq->queue->qid), zq->online, - ehdr->reply_code); + card, queue); + ZCRYPT_DBF(DBF_ERR, + "device=%02x.%04x reply=0x%02x => online=0 rc=EAGAIN\n", + card, queue, ehdr->reply_code); return -EAGAIN; case REP82_ERROR_TRANSPORT_FAIL: case REP82_ERROR_MACHINE_FAILURE: @@ -130,22 +133,18 @@ static inline int convert_error(struct zcrypt_queue *zq, atomic_set(&zcrypt_rescan_req, 1); zq->online = 0; pr_err("Cryptographic device %02x.%04x failed and was set offline\n", - AP_QID_CARD(zq->queue->qid), - AP_QID_QUEUE(zq->queue->qid)); - ZCRYPT_DBF_DEV(DBF_ERR, zq, "dev%02x%04xo%drc%d", - AP_QID_CARD(zq->queue->qid), - AP_QID_QUEUE(zq->queue->qid), zq->online, - ehdr->reply_code); + card, queue); + ZCRYPT_DBF(DBF_ERR, + "device=%02x.%04x reply=0x%02x => online=0 rc=EAGAIN\n", + card, queue, ehdr->reply_code); return -EAGAIN; default: zq->online = 0; pr_err("Cryptographic device %02x.%04x failed and was set offline\n", - AP_QID_CARD(zq->queue->qid), - AP_QID_QUEUE(zq->queue->qid)); - ZCRYPT_DBF_DEV(DBF_ERR, zq, "dev%02x%04xo%drc%d", - AP_QID_CARD(zq->queue->qid), - AP_QID_QUEUE(zq->queue->qid), zq->online, - ehdr->reply_code); + card, queue); + ZCRYPT_DBF(DBF_ERR, + "device=%02x.%04x reply=0x%02x => online=0 rc=EAGAIN\n", + card, queue, ehdr->reply_code); return -EAGAIN; /* repeat the request on a different device. */ } } diff --git a/drivers/s390/crypto/zcrypt_msgtype50.c b/drivers/s390/crypto/zcrypt_msgtype50.c index a9873b436115..6dd5d7c58dd0 100644 --- a/drivers/s390/crypto/zcrypt_msgtype50.c +++ b/drivers/s390/crypto/zcrypt_msgtype50.c @@ -367,11 +367,11 @@ static int convert_type80(struct zcrypt_queue *zq, pr_err("Cryptographic device %02x.%04x failed and was set offline\n", AP_QID_CARD(zq->queue->qid), AP_QID_QUEUE(zq->queue->qid)); - ZCRYPT_DBF_DEV(DBF_ERR, zq, "dev%02x%04xo%drc%d", - AP_QID_CARD(zq->queue->qid), - AP_QID_QUEUE(zq->queue->qid), - zq->online, t80h->code); - + ZCRYPT_DBF(DBF_ERR, + "device=%02x.%04x code=0x%02x => online=0 rc=EAGAIN\n", + AP_QID_CARD(zq->queue->qid), + AP_QID_QUEUE(zq->queue->qid), + t80h->code); return -EAGAIN; /* repeat the request on a different device. */ } if (zq->zcard->user_space_type == ZCRYPT_CEX2A) @@ -390,7 +390,9 @@ static int convert_response(struct zcrypt_queue *zq, unsigned int outputdatalength) { /* Response type byte is the second byte in the response. */ - switch (((unsigned char *) reply->message)[1]) { + unsigned char rtype = ((unsigned char *) reply->message)[1]; + + switch (rtype) { case TYPE82_RSP_CODE: case TYPE88_RSP_CODE: return convert_error(zq, reply); @@ -402,10 +404,11 @@ static int convert_response(struct zcrypt_queue *zq, pr_err("Cryptographic device %02x.%04x failed and was set offline\n", AP_QID_CARD(zq->queue->qid), AP_QID_QUEUE(zq->queue->qid)); - ZCRYPT_DBF_DEV(DBF_ERR, zq, "dev%02x%04xo%dfail", - AP_QID_CARD(zq->queue->qid), - AP_QID_QUEUE(zq->queue->qid), - zq->online); + ZCRYPT_DBF(DBF_ERR, + "device=%02x.%04x rtype=0x%02x => online=0 rc=EAGAIN\n", + AP_QID_CARD(zq->queue->qid), + AP_QID_QUEUE(zq->queue->qid), + (unsigned int) rtype); return -EAGAIN; /* repeat the request on a different device. */ } } diff --git a/drivers/s390/crypto/zcrypt_msgtype6.c b/drivers/s390/crypto/zcrypt_msgtype6.c index c6cfb9acec19..e5563ffeb839 100644 --- a/drivers/s390/crypto/zcrypt_msgtype6.c +++ b/drivers/s390/crypto/zcrypt_msgtype6.c @@ -638,30 +638,37 @@ static int convert_type86_ica(struct zcrypt_queue *zq, service_rc = msg->cprbx.ccp_rtcode; if (unlikely(service_rc != 0)) { service_rs = msg->cprbx.ccp_rscode; - if (service_rc == 8 && service_rs == 66) - return -EINVAL; - if (service_rc == 8 && service_rs == 65) - return -EINVAL; - if (service_rc == 8 && service_rs == 770) + if ((service_rc == 8 && service_rs == 66) || + (service_rc == 8 && service_rs == 65) || + (service_rc == 8 && service_rs == 72) || + (service_rc == 8 && service_rs == 770) || + (service_rc == 12 && service_rs == 769)) { + ZCRYPT_DBF(DBF_DEBUG, + "device=%02x.%04x rc/rs=%d/%d => rc=EINVAL\n", + AP_QID_CARD(zq->queue->qid), + AP_QID_QUEUE(zq->queue->qid), + (int) service_rc, (int) service_rs); return -EINVAL; + } if (service_rc == 8 && service_rs == 783) { zq->zcard->min_mod_size = PCIXCC_MIN_MOD_SIZE_OLD; + ZCRYPT_DBF(DBF_DEBUG, + "device=%02x.%04x rc/rs=%d/%d => rc=EAGAIN\n", + AP_QID_CARD(zq->queue->qid), + AP_QID_QUEUE(zq->queue->qid), + (int) service_rc, (int) service_rs); return -EAGAIN; } - if (service_rc == 12 && service_rs == 769) - return -EINVAL; - if (service_rc == 8 && service_rs == 72) - return -EINVAL; zq->online = 0; pr_err("Cryptographic device %02x.%04x failed and was set offline\n", AP_QID_CARD(zq->queue->qid), AP_QID_QUEUE(zq->queue->qid)); - ZCRYPT_DBF_DEV(DBF_ERR, zq, "dev%02x%04xo%drc%d", - AP_QID_CARD(zq->queue->qid), - AP_QID_QUEUE(zq->queue->qid), - zq->online, - msg->hdr.reply_code); + ZCRYPT_DBF(DBF_ERR, + "device=%02x.%04x rc/rs=%d/%d => online=0 rc=EAGAIN\n", + AP_QID_CARD(zq->queue->qid), + AP_QID_QUEUE(zq->queue->qid), + (int) service_rc, (int) service_rs); return -EAGAIN; /* repeat the request on a different device. */ } data = msg->text; @@ -776,8 +783,7 @@ static int convert_response_ica(struct zcrypt_queue *zq, { struct type86x_reply *msg = reply->message; - /* Response type byte is the second byte in the response. */ - switch (((unsigned char *) reply->message)[1]) { + switch (msg->hdr.type) { case TYPE82_RSP_CODE: case TYPE88_RSP_CODE: return convert_error(zq, reply); @@ -803,10 +809,11 @@ static int convert_response_ica(struct zcrypt_queue *zq, pr_err("Cryptographic device %02x.%04x failed and was set offline\n", AP_QID_CARD(zq->queue->qid), AP_QID_QUEUE(zq->queue->qid)); - ZCRYPT_DBF_DEV(DBF_ERR, zq, "dev%02x%04xo%dfail", - AP_QID_CARD(zq->queue->qid), - AP_QID_QUEUE(zq->queue->qid), - zq->online); + ZCRYPT_DBF(DBF_ERR, + "device=%02x.%04x rtype=0x%02x => online=0 rc=EAGAIN\n", + AP_QID_CARD(zq->queue->qid), + AP_QID_QUEUE(zq->queue->qid), + (int) msg->hdr.type); return -EAGAIN; /* repeat the request on a different device. */ } } @@ -817,8 +824,7 @@ static int convert_response_xcrb(struct zcrypt_queue *zq, { struct type86x_reply *msg = reply->message; - /* Response type byte is the second byte in the response. */ - switch (((unsigned char *) reply->message)[1]) { + switch (msg->hdr.type) { case TYPE82_RSP_CODE: case TYPE88_RSP_CODE: xcRB->status = 0x0008044DL; /* HDD_InvalidParm */ @@ -838,10 +844,11 @@ static int convert_response_xcrb(struct zcrypt_queue *zq, pr_err("Cryptographic device %02x.%04x failed and was set offline\n", AP_QID_CARD(zq->queue->qid), AP_QID_QUEUE(zq->queue->qid)); - ZCRYPT_DBF_DEV(DBF_ERR, zq, "dev%02x%04xo%dfail", - AP_QID_CARD(zq->queue->qid), - AP_QID_QUEUE(zq->queue->qid), - zq->online); + ZCRYPT_DBF(DBF_ERR, + "device=%02x.%04x rtype=0x%02x => online=0 rc=EAGAIN\n", + AP_QID_CARD(zq->queue->qid), + AP_QID_QUEUE(zq->queue->qid), + (int) msg->hdr.type); return -EAGAIN; /* repeat the request on a different device. */ } } @@ -851,8 +858,7 @@ static int convert_response_ep11_xcrb(struct zcrypt_queue *zq, { struct type86_ep11_reply *msg = reply->message; - /* Response type byte is the second byte in the response. */ - switch (((unsigned char *)reply->message)[1]) { + switch (msg->hdr.type) { case TYPE82_RSP_CODE: case TYPE87_RSP_CODE: return convert_error(zq, reply); @@ -867,10 +873,11 @@ static int convert_response_ep11_xcrb(struct zcrypt_queue *zq, pr_err("Cryptographic device %02x.%04x failed and was set offline\n", AP_QID_CARD(zq->queue->qid), AP_QID_QUEUE(zq->queue->qid)); - ZCRYPT_DBF_DEV(DBF_ERR, zq, "dev%02x%04xo%dfail", - AP_QID_CARD(zq->queue->qid), - AP_QID_QUEUE(zq->queue->qid), - zq->online); + ZCRYPT_DBF(DBF_ERR, + "device=%02x.%04x rtype=0x%02x => online=0 rc=EAGAIN\n", + AP_QID_CARD(zq->queue->qid), + AP_QID_QUEUE(zq->queue->qid), + (int) msg->hdr.type); return -EAGAIN; /* repeat the request on a different device. */ } } @@ -897,10 +904,11 @@ static int convert_response_rng(struct zcrypt_queue *zq, pr_err("Cryptographic device %02x.%04x failed and was set offline\n", AP_QID_CARD(zq->queue->qid), AP_QID_QUEUE(zq->queue->qid)); - ZCRYPT_DBF_DEV(DBF_ERR, zq, "dev%02x%04xo%dfail", - AP_QID_CARD(zq->queue->qid), - AP_QID_QUEUE(zq->queue->qid), - zq->online); + ZCRYPT_DBF(DBF_ERR, + "device=%02x.%04x rtype=0x%02x => online=0 rc=EAGAIN\n", + AP_QID_CARD(zq->queue->qid), + AP_QID_QUEUE(zq->queue->qid), + (int) msg->hdr.type); return -EAGAIN; /* repeat the request on a different device. */ } } diff --git a/drivers/s390/crypto/zcrypt_queue.c b/drivers/s390/crypto/zcrypt_queue.c index c70b2528d9a3..a303f3b2c328 100644 --- a/drivers/s390/crypto/zcrypt_queue.c +++ b/drivers/s390/crypto/zcrypt_queue.c @@ -70,9 +70,12 @@ static ssize_t zcrypt_queue_online_store(struct device *dev, if (online && !zc->online) return -EINVAL; zq->online = online; - ZCRYPT_DBF_DEV(DBF_INFO, zq, "dev%02x%04xo%dman", - AP_QID_CARD(zq->queue->qid), - AP_QID_QUEUE(zq->queue->qid), online); + + ZCRYPT_DBF(DBF_INFO, "queue=%02x.%04x online=%d\n", + AP_QID_CARD(zq->queue->qid), + AP_QID_QUEUE(zq->queue->qid), + online); + if (!online) ap_flush_queue(zq->queue); return count; @@ -109,7 +112,6 @@ struct zcrypt_queue *zcrypt_queue_alloc(size_t max_response_size) goto out_free; zq->reply.length = max_response_size; INIT_LIST_HEAD(&zq->list); - zq->dbf_area = zcrypt_dbf_devices; kref_init(&zq->refcount); return zq; @@ -161,10 +163,10 @@ int zcrypt_queue_register(struct zcrypt_queue *zq) zcrypt_card_get(zc); zq->zcard = zc; zq->online = 1; /* New devices are online by default. */ - ZCRYPT_DBF_DEV(DBF_INFO, zq, "dev%02x%04xo%dreg", - AP_QID_CARD(zq->queue->qid), - AP_QID_QUEUE(zq->queue->qid), - zq->online); + + ZCRYPT_DBF(DBF_INFO, "queue=%02x.%04x register online=1\n", + AP_QID_CARD(zq->queue->qid), AP_QID_QUEUE(zq->queue->qid)); + list_add_tail(&zq->list, &zc->zqueues); zcrypt_device_count++; spin_unlock(&zcrypt_list_lock); @@ -205,6 +207,9 @@ void zcrypt_queue_unregister(struct zcrypt_queue *zq) { struct zcrypt_card *zc; + ZCRYPT_DBF(DBF_INFO, "queue=%02x.%04x unregister\n", + AP_QID_CARD(zq->queue->qid), AP_QID_QUEUE(zq->queue->qid)); + zc = zq->zcard; spin_lock(&zcrypt_list_lock); list_del_init(&zq->list); |