Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp590585ybt; Fri, 19 Jun 2020 08:51:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyN8TF0c4x7zcOQgiMuPRa8zjdGMnaLSQSPlzSl8opxlViL9ZaD0ZOfa3WEhuZk0OsVnRvK X-Received: by 2002:a17:906:cc58:: with SMTP id mm24mr4543453ejb.134.1592581916851; Fri, 19 Jun 2020 08:51:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1592581916; cv=none; d=google.com; s=arc-20160816; b=FkE6H73NsQ1+bVzcytDUqNmsmS4Cm1UyHrTeXy7FpiA3drjPBBHZDb0eBwtTyFtN2d AJ7LjGuzB8k8lRTaePAnCTtJqiKoJo+nocO2r1IIjeGX5dxgRKANz8MDZx/+4O2kCkRj UDqqYhIHtN51fURaezE2fV5pLwkHONA0OlWT2XEwjCXANXr4IHy0JJoMT52j0JB4Lx4Q /edbBB0GDKdh3fizLRtXdcTHWL5xhfZWkARwxKIb2QFdDvW6pN8mOUI2feVfieDoCaiz 4bB8Ssq4Jp2tI5HYQu7iui7/+1dOVfcR/2GndVHanFMKU0E8Z24mGvJC5e040mmOxY+6 PkMw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=V6VsaM1Gxm0E5AnQQ/9henwWepv/uAsp0RhTHP/0uLI=; b=Dms+JXOvutoJc7cYNPkUzWxRCKMrrJRYZC2xF4Mz87NOWIGPkXgCpQgJxOA0mitQzp mV5KdZuqZlztXsA801WHf3g6z5GTIMptuEE+jDtt0K98KlGEuApKkI+mE0WzcZeMXF+F ncvOndijBsbIaj+LE5FpqSr8tmuyaS+i7KtfXGmbBis5VqxAx3YIbWwP6pRPX2xqCXsj cOzePY7s4x0v+Tl43UC+nniO06xZiOfQEDRDvXXMswblsohcZ5VQcdxycPfrRRWdqkRK wXd7HkULF7cGAFA1Flua6bQbofMWDuQO9whFX2i+8UCvhk2zw5Lzf663vamnDLGUtAdu 29/A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=smi4g954; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f6si4020591edy.252.2020.06.19.08.51.34; Fri, 19 Jun 2020 08:51:56 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=smi4g954; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2405332AbgFSPsN (ORCPT + 99 others); Fri, 19 Jun 2020 11:48:13 -0400 Received: from mail.kernel.org ([198.145.29.99]:57322 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2393434AbgFSPZe (ORCPT ); Fri, 19 Jun 2020 11:25:34 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 73A1D217A0; Fri, 19 Jun 2020 15:25:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1592580333; bh=7McYIa9P3Rh28JO6FRRv8eTfuuEGvhSv6QQoypGjkZ4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=smi4g954Rgayf18pqQgbEDALgq7+eQbGslJjkaRxorLaHxaY9rvJ4pld4CqqekACj m2rlEQQIJZlVJqqf3VRwUJuvaQgdr5u4g38L3jTFBVR58lRalMYfHR6gLOLwt5jpA+ SDX+lL7Ru2J4endizjBeJeMU3ghxjdbq6y6napOQ= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Nicolas Toromanoff , Herbert Xu , Sasha Levin Subject: [PATCH 5.7 208/376] crypto: stm32/crc32 - fix multi-instance Date: Fri, 19 Jun 2020 16:32:06 +0200 Message-Id: <20200619141720.181167428@linuxfoundation.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200619141710.350494719@linuxfoundation.org> References: <20200619141710.350494719@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Nicolas Toromanoff [ Upstream commit 10b89c43a64eb0d236903b79a3bc9d8f6cbfd9c7 ] Ensure CRC algorithm is registered only once in crypto framework when there are several instances of CRC devices. Update the CRC device list management to avoid that only the first CRC instance is used. Fixes: b51dbe90912a ("crypto: stm32 - Support for STM32 CRC32 crypto module") Signed-off-by: Nicolas Toromanoff Signed-off-by: Herbert Xu Signed-off-by: Sasha Levin --- drivers/crypto/stm32/stm32-crc32.c | 48 ++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/drivers/crypto/stm32/stm32-crc32.c b/drivers/crypto/stm32/stm32-crc32.c index 1c3e411b7acb..10304511f9b4 100644 --- a/drivers/crypto/stm32/stm32-crc32.c +++ b/drivers/crypto/stm32/stm32-crc32.c @@ -91,16 +91,29 @@ static int stm32_crc_setkey(struct crypto_shash *tfm, const u8 *key, return 0; } -static int stm32_crc_init(struct shash_desc *desc) +static struct stm32_crc *stm32_crc_get_next_crc(void) { - struct stm32_crc_desc_ctx *ctx = shash_desc_ctx(desc); - struct stm32_crc_ctx *mctx = crypto_shash_ctx(desc->tfm); struct stm32_crc *crc; spin_lock_bh(&crc_list.lock); crc = list_first_entry(&crc_list.dev_list, struct stm32_crc, list); + if (crc) + list_move_tail(&crc->list, &crc_list.dev_list); spin_unlock_bh(&crc_list.lock); + return crc; +} + +static int stm32_crc_init(struct shash_desc *desc) +{ + struct stm32_crc_desc_ctx *ctx = shash_desc_ctx(desc); + struct stm32_crc_ctx *mctx = crypto_shash_ctx(desc->tfm); + struct stm32_crc *crc; + + crc = stm32_crc_get_next_crc(); + if (!crc) + return -ENODEV; + pm_runtime_get_sync(crc->dev); /* Reset, set key, poly and configure in bit reverse mode */ @@ -125,9 +138,9 @@ static int stm32_crc_update(struct shash_desc *desc, const u8 *d8, struct stm32_crc_ctx *mctx = crypto_shash_ctx(desc->tfm); struct stm32_crc *crc; - spin_lock_bh(&crc_list.lock); - crc = list_first_entry(&crc_list.dev_list, struct stm32_crc, list); - spin_unlock_bh(&crc_list.lock); + crc = stm32_crc_get_next_crc(); + if (!crc) + return -ENODEV; pm_runtime_get_sync(crc->dev); @@ -200,6 +213,8 @@ static int stm32_crc_digest(struct shash_desc *desc, const u8 *data, return stm32_crc_init(desc) ?: stm32_crc_finup(desc, data, length, out); } +static unsigned int refcnt; +static DEFINE_MUTEX(refcnt_lock); static struct shash_alg algs[] = { /* CRC-32 */ { @@ -290,12 +305,18 @@ static int stm32_crc_probe(struct platform_device *pdev) list_add(&crc->list, &crc_list.dev_list); spin_unlock(&crc_list.lock); - ret = crypto_register_shashes(algs, ARRAY_SIZE(algs)); - if (ret) { - dev_err(dev, "Failed to register\n"); - clk_disable_unprepare(crc->clk); - return ret; + mutex_lock(&refcnt_lock); + if (!refcnt) { + ret = crypto_register_shashes(algs, ARRAY_SIZE(algs)); + if (ret) { + mutex_unlock(&refcnt_lock); + dev_err(dev, "Failed to register\n"); + clk_disable_unprepare(crc->clk); + return ret; + } } + refcnt++; + mutex_unlock(&refcnt_lock); dev_info(dev, "Initialized\n"); @@ -316,7 +337,10 @@ static int stm32_crc_remove(struct platform_device *pdev) list_del(&crc->list); spin_unlock(&crc_list.lock); - crypto_unregister_shashes(algs, ARRAY_SIZE(algs)); + mutex_lock(&refcnt_lock); + if (!--refcnt) + crypto_unregister_shashes(algs, ARRAY_SIZE(algs)); + mutex_unlock(&refcnt_lock); pm_runtime_disable(crc->dev); pm_runtime_put_noidle(crc->dev); -- 2.25.1