diff options
-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); |