Commit 2324de6f authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 's390-5.5-5' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux

Pull s390 fixes from Vasily Gorbik:

 - Fix printing misleading Secure-IPL enabled message when it is not.

 - Fix a race condition between host ap bus and guest ap bus doing
   device reset in crypto code.

 - Fix sanity check in CCA cipher key function (CCA AES cipher key
   support), which fails otherwise.

* tag 's390-5.5-5' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
  s390/setup: Fix secure ipl message
  s390/zcrypt: move ap device reset from bus to driver code
  s390/zcrypt: Fix CCA cipher key gen with clear key value function
parents 8965de70 40260b01
...@@ -1052,7 +1052,7 @@ static void __init log_component_list(void) ...@@ -1052,7 +1052,7 @@ static void __init log_component_list(void)
if (!early_ipl_comp_list_addr) if (!early_ipl_comp_list_addr)
return; return;
if (ipl_block.hdr.flags & IPL_PL_FLAG_IPLSR) if (ipl_block.hdr.flags & IPL_PL_FLAG_SIPL)
pr_info("Linux is running with Secure-IPL enabled\n"); pr_info("Linux is running with Secure-IPL enabled\n");
else else
pr_info("Linux is running with Secure-IPL disabled\n"); pr_info("Linux is running with Secure-IPL disabled\n");
......
...@@ -793,8 +793,6 @@ static int ap_device_probe(struct device *dev) ...@@ -793,8 +793,6 @@ static int ap_device_probe(struct device *dev)
drvres = ap_drv->flags & AP_DRIVER_FLAG_DEFAULT; drvres = ap_drv->flags & AP_DRIVER_FLAG_DEFAULT;
if (!!devres != !!drvres) if (!!devres != !!drvres)
return -ENODEV; return -ENODEV;
/* (re-)init queue's state machine */
ap_queue_reinit_state(to_ap_queue(dev));
} }
/* Add queue/card to list of active queues/cards */ /* Add queue/card to list of active queues/cards */
......
...@@ -261,7 +261,7 @@ void ap_queue_prepare_remove(struct ap_queue *aq); ...@@ -261,7 +261,7 @@ void ap_queue_prepare_remove(struct ap_queue *aq);
void ap_queue_remove(struct ap_queue *aq); void ap_queue_remove(struct ap_queue *aq);
void ap_queue_suspend(struct ap_device *ap_dev); void ap_queue_suspend(struct ap_device *ap_dev);
void ap_queue_resume(struct ap_device *ap_dev); void ap_queue_resume(struct ap_device *ap_dev);
void ap_queue_reinit_state(struct ap_queue *aq); void ap_queue_init_state(struct ap_queue *aq);
struct ap_card *ap_card_create(int id, int queue_depth, int raw_device_type, struct ap_card *ap_card_create(int id, int queue_depth, int raw_device_type,
int comp_device_type, unsigned int functions); int comp_device_type, unsigned int functions);
......
...@@ -638,7 +638,7 @@ struct ap_queue *ap_queue_create(ap_qid_t qid, int device_type) ...@@ -638,7 +638,7 @@ struct ap_queue *ap_queue_create(ap_qid_t qid, int device_type)
aq->ap_dev.device.type = &ap_queue_type; aq->ap_dev.device.type = &ap_queue_type;
aq->ap_dev.device_type = device_type; aq->ap_dev.device_type = device_type;
aq->qid = qid; aq->qid = qid;
aq->state = AP_STATE_RESET_START; aq->state = AP_STATE_UNBOUND;
aq->interrupt = AP_INTR_DISABLED; aq->interrupt = AP_INTR_DISABLED;
spin_lock_init(&aq->lock); spin_lock_init(&aq->lock);
INIT_LIST_HEAD(&aq->list); INIT_LIST_HEAD(&aq->list);
...@@ -771,10 +771,11 @@ void ap_queue_remove(struct ap_queue *aq) ...@@ -771,10 +771,11 @@ void ap_queue_remove(struct ap_queue *aq)
spin_unlock_bh(&aq->lock); spin_unlock_bh(&aq->lock);
} }
void ap_queue_reinit_state(struct ap_queue *aq) void ap_queue_init_state(struct ap_queue *aq)
{ {
spin_lock_bh(&aq->lock); spin_lock_bh(&aq->lock);
aq->state = AP_STATE_RESET_START; aq->state = AP_STATE_RESET_START;
ap_wait(ap_sm_event(aq, AP_EVENT_POLL)); ap_wait(ap_sm_event(aq, AP_EVENT_POLL));
spin_unlock_bh(&aq->lock); spin_unlock_bh(&aq->lock);
} }
EXPORT_SYMBOL(ap_queue_init_state);
...@@ -1037,8 +1037,8 @@ static int _ip_cprb_helper(u16 cardnr, u16 domain, ...@@ -1037,8 +1037,8 @@ static int _ip_cprb_helper(u16 cardnr, u16 domain,
prepparm = (struct iprepparm *) prepcblk->rpl_parmb; prepparm = (struct iprepparm *) prepcblk->rpl_parmb;
/* do some plausibility checks on the key block */ /* do some plausibility checks on the key block */
if (prepparm->kb.len < 120 + 5 * sizeof(uint16_t) || if (prepparm->kb.len < 120 + 3 * sizeof(uint16_t) ||
prepparm->kb.len > 136 + 5 * sizeof(uint16_t)) { prepparm->kb.len > 136 + 3 * sizeof(uint16_t)) {
DEBUG_ERR("%s reply with invalid or unknown key block\n", DEBUG_ERR("%s reply with invalid or unknown key block\n",
__func__); __func__);
rc = -EIO; rc = -EIO;
......
...@@ -175,6 +175,7 @@ static int zcrypt_cex2a_queue_probe(struct ap_device *ap_dev) ...@@ -175,6 +175,7 @@ static int zcrypt_cex2a_queue_probe(struct ap_device *ap_dev)
zq->queue = aq; zq->queue = aq;
zq->online = 1; zq->online = 1;
atomic_set(&zq->load, 0); atomic_set(&zq->load, 0);
ap_queue_init_state(aq);
ap_queue_init_reply(aq, &zq->reply); ap_queue_init_reply(aq, &zq->reply);
aq->request_timeout = CEX2A_CLEANUP_TIME, aq->request_timeout = CEX2A_CLEANUP_TIME,
aq->private = zq; aq->private = zq;
......
...@@ -220,6 +220,7 @@ static int zcrypt_cex2c_queue_probe(struct ap_device *ap_dev) ...@@ -220,6 +220,7 @@ static int zcrypt_cex2c_queue_probe(struct ap_device *ap_dev)
zq->queue = aq; zq->queue = aq;
zq->online = 1; zq->online = 1;
atomic_set(&zq->load, 0); atomic_set(&zq->load, 0);
ap_rapq(aq->qid);
rc = zcrypt_cex2c_rng_supported(aq); rc = zcrypt_cex2c_rng_supported(aq);
if (rc < 0) { if (rc < 0) {
zcrypt_queue_free(zq); zcrypt_queue_free(zq);
...@@ -231,6 +232,7 @@ static int zcrypt_cex2c_queue_probe(struct ap_device *ap_dev) ...@@ -231,6 +232,7 @@ static int zcrypt_cex2c_queue_probe(struct ap_device *ap_dev)
else else
zq->ops = zcrypt_msgtype(MSGTYPE06_NAME, zq->ops = zcrypt_msgtype(MSGTYPE06_NAME,
MSGTYPE06_VARIANT_NORNG); MSGTYPE06_VARIANT_NORNG);
ap_queue_init_state(aq);
ap_queue_init_reply(aq, &zq->reply); ap_queue_init_reply(aq, &zq->reply);
aq->request_timeout = CEX2C_CLEANUP_TIME; aq->request_timeout = CEX2C_CLEANUP_TIME;
aq->private = zq; aq->private = zq;
......
...@@ -381,6 +381,7 @@ static int zcrypt_cex4_queue_probe(struct ap_device *ap_dev) ...@@ -381,6 +381,7 @@ static int zcrypt_cex4_queue_probe(struct ap_device *ap_dev)
zq->queue = aq; zq->queue = aq;
zq->online = 1; zq->online = 1;
atomic_set(&zq->load, 0); atomic_set(&zq->load, 0);
ap_queue_init_state(aq);
ap_queue_init_reply(aq, &zq->reply); ap_queue_init_reply(aq, &zq->reply);
aq->request_timeout = CEX4_CLEANUP_TIME, aq->request_timeout = CEX4_CLEANUP_TIME,
aq->private = zq; aq->private = zq;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment