Received: by 10.192.165.156 with SMTP id m28csp1167032imm; Mon, 16 Apr 2018 15:28:56 -0700 (PDT) X-Google-Smtp-Source: AIpwx49E3hA4JyHl/EDbKMMRdT+Orj8r4tqTdKZaWYBs88PLBXnVnmzo76O2juyVkbYfuOEZkY08 X-Received: by 2002:a17:902:b2c7:: with SMTP id x7-v6mr17092034plw.124.1523917736499; Mon, 16 Apr 2018 15:28:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523917736; cv=none; d=google.com; s=arc-20160816; b=ALVaRyoyqjYd6obD/OcsQ4GCJTqM+klSPPn7shke+XfEupqH7qwz6KFvZW5wQD8pkp eHeeSOookY5YgbrCHkXgOXr3EzNBpmVc/ds8AVK2/eLD9k9Qcg59K0AWlqgBY45PP+/2 6W4zAi3YPveNkjRM2lz3gOuKEVRLX91yCJeK9NXti3voFor3pdhfp32nPoj832fvaV+1 CURC31tXvVez4Rb4+F5n8IRWYCO0T/s8xs2zNz1Up8GeXPrP2OzDl2gBkQt6H5iTQyY+ 5C/1/C/5JYUwC/pMECtGSNi31i8qoINKlaNntPxpMoG6c2ofiyquZKmpC1lJiT26z1rh OTWw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=BDB39gni7NYB96wEPMGglZ+K36ylZrTWrPmUdfeoeGM=; b=PQhuXcbIviBki3wn3tGZLVlnVAkSLLulLf3yo69tc8iHGWfk6ZTDoFpDaRTJnwaH1m e8LJYDwHCI34UWZzHed8tI0fPF72haJbZero1dRJxQP4L5f67W5HsDbWAMoEYL74803Z 5mrpebSpjdJYkC5gYE/YjmbnqUv7LiKfUEcvlQUeL6sNr8uq+xvkdx/mfCLHS8DASgEa 7PfHCNuqChBiS7rI2wwfjyanG48T6zDG5+ldL4Tp9s0aYhm7zL1fKNbYF95/e1x23xzh Ri68TD0DrJmMB3XY/4Su6OMyXm0tNHndt/0quD2e4Vqkqs3zsj3/1BEQjtXJHfk8ZPr0 /TIg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=HGzZkOO5; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p5si9929711pgu.158.2018.04.16.15.28.42; Mon, 16 Apr 2018 15:28:56 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=HGzZkOO5; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753197AbeDPW0E (ORCPT + 99 others); Mon, 16 Apr 2018 18:26:04 -0400 Received: from mail-io0-f196.google.com ([209.85.223.196]:37648 "EHLO mail-io0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752096AbeDPWYt (ORCPT ); Mon, 16 Apr 2018 18:24:49 -0400 Received: by mail-io0-f196.google.com with SMTP id y128so19999305iod.4 for ; Mon, 16 Apr 2018 15:24:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=BDB39gni7NYB96wEPMGglZ+K36ylZrTWrPmUdfeoeGM=; b=HGzZkOO5KE7CZbikBHnOj4BQ7YQeJIKw+EIkKvcueEbrxah2UKxmN2ILldSjE3Bb8t kE69QrbiQiaiIuA/9UXWxGZK+f41bpvZnQhyAt8XzGx+uTLMSc91/ntS4FjZQvQykjH2 70TXK16HfUncIavYhwHlMEKWnB8BMt/WU4/OZfZ92ubrJ11HUa/0JHljvxBtaT4AQ4lD iUDo9+3rqqeziJ57mAmEIHMpdPWT2lxmve86QpnaTrODbpcPIHs/prgkSXx2dJiBVFnz e1eUvUF0x5ea7PfTuJgUiZm6GexPsw/8yY2t8lmC4U5o8BDlB8lZgmGYfRBbYLQL+KLV dM1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=BDB39gni7NYB96wEPMGglZ+K36ylZrTWrPmUdfeoeGM=; b=sX/HJwspj1kvSdTCPGlTcMdYVapFR9DBh5h8uN1MtQd2VIn9kufUrpTTlq2mxVVxhY EmDK+ILYgjpapGuT984u8vCY4nRiUoTaWQofjlXSYLR4y9IaqOL5u1Amun0sfgQMD4IT PvFlwdsDlbw3t/L47nX2vHcuv3YJx9rWVHZ8vaCV7B1TirfYwPBaSGifaEth94YNyY8r IP5SXY5AjjeuD4tO0dfdMmdT/n5PQOwOTL3DDo71vBh1bCpJQ+Hc1PhGh7wX75gHR4GP nEZ5HNykNLOWUBEpmoD360qO5371aTHOk2eDrcrDWu2TBu+ew5NlUh8KDZlYrygIjohY jAHQ== X-Gm-Message-State: ALQs6tDQbcjkjBv9ARx7roYGP3c737c/hrkaxAwgIRNTgD8JxkhFeBCU W8d1rodYuBAMnx8d9wArhvxfEove X-Received: by 10.107.12.90 with SMTP id w87mr9241709ioi.132.1523917488366; Mon, 16 Apr 2018 15:24:48 -0700 (PDT) Received: from localhost.localdomain (184-175-36-239.dsl.teksavvy.com. [184.175.36.239]) by smtp.gmail.com with ESMTPSA id x139-v6sm5095360itb.3.2018.04.16.15.24.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 16 Apr 2018 15:24:47 -0700 (PDT) From: Andres Rodriguez To: linux-kernel@vger.kernel.org Cc: andresx7@gmail.com, gregkh@linuxfoundation.org, mcgrof@kernel.org, alexdeucher@gmail.com, ckoenig.leichtzumerken@gmail.com, kvalo@codeaurora.org, arend.vanspriel@broadcom.com Subject: [PATCH 4/8] firmware: add functions to load firmware without warnings v3 Date: Mon, 16 Apr 2018 18:24:23 -0400 Message-Id: <20180416222427.29683-5-andresx7@gmail.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180416222427.29683-1-andresx7@gmail.com> References: <20180416222427.29683-1-andresx7@gmail.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently the firmware loader only exposes one silent path for querying optional firmware, and that is firmware_request_direct(). This function also disables the fallback path, which might not always be the desired behaviour. [0] This patch introduces variations of firmware_request() and firmware_request_nowait() that enable the caller to disable the undesired warning messages. This is equivalent to adding FW_OPT_NO_WARN, to the old behaviour. v2: add header prototype, use updated opt_flags v3: split debug message to separate patch added _nowait variant added documentation [0]: https://git.kernel.org/linus/c0cc00f250e1 Signed-off-by: Andres Rodriguez --- .../driver-api/firmware/request_firmware.rst | 13 ++++-- drivers/base/firmware_loader/main.c | 52 ++++++++++++++++++++-- include/linux/firmware.h | 6 +++ 3 files changed, 63 insertions(+), 8 deletions(-) diff --git a/Documentation/driver-api/firmware/request_firmware.rst b/Documentation/driver-api/firmware/request_firmware.rst index 7632f8807472..913e7d2e0cb7 100644 --- a/Documentation/driver-api/firmware/request_firmware.rst +++ b/Documentation/driver-api/firmware/request_firmware.rst @@ -20,6 +20,11 @@ firmware_request .. kernel-doc:: drivers/base/firmware_loader/main.c :functions: firmware_request +firmware_request_nowarn +----------------------- +.. kernel-doc:: drivers/base/firmware_loader/main.c + :functions: firmware_request_nowarn + firmware_request_direct ----------------------- .. kernel-doc:: drivers/base/firmware_loader/main.c @@ -36,13 +41,13 @@ Asynchronous firmware requests Asynchronous firmware requests allow driver code to not have to wait until the firmware or an error is returned. Function callbacks are provided so that when the firmware or an error is found the driver is -informed through the callback. firmware_request_nowait() cannot be called +informed through the callback. firmware_request_nowait2() cannot be called in atomic contexts. -firmware_request_nowait ------------------------ +firmware_request_nowait2 +------------------------ .. kernel-doc:: drivers/base/firmware_loader/main.c - :functions: firmware_request_nowait + :functions: firmware_request_nowait2 Special optimizations on reboot =============================== diff --git a/drivers/base/firmware_loader/main.c b/drivers/base/firmware_loader/main.c index 5baadad3012d..14ded1de84bf 100644 --- a/drivers/base/firmware_loader/main.c +++ b/drivers/base/firmware_loader/main.c @@ -631,6 +631,30 @@ firmware_request(const struct firmware **firmware_p, const char *name, } EXPORT_SYMBOL(firmware_request); +/** + * firmware_request_nowarn: - request for an optional fw module + * @firmware: pointer to firmware image + * @name: name of firmware file + * @device: device for which firmware is being loaded + * + * This function is similar in behaviour to firmware_request(), except + * it doesn't produce warning messages when the file is not found. + **/ +int +firmware_request_nowarn(const struct firmware **firmware, const char *name, + struct device *device) +{ + int ret; + + /* Need to pin this module until return */ + __module_get(THIS_MODULE); + ret = _firmware_request(firmware, name, device, NULL, 0, + FW_OPT_UEVENT | FW_OPT_NO_WARN); + module_put(THIS_MODULE); + return ret; +} +EXPORT_SYMBOL_GPL(firmware_request_nowarn); + /** * firmware_request_direct: - load firmware directly without usermode helper * @firmware_p: pointer to firmware image @@ -755,10 +779,11 @@ static void firmware_request_work_func(struct work_struct *work) } /** - * firmware_request_nowait - asynchronous version of firmware_request + * firmware_request_nowait2 - asynchronous version of firmware_request * @module: module requesting the firmware * @uevent: sends uevent to copy the firmware image if this flag * is non-zero else the firmware copy must be done manually. + * @warn: enable warnings * @name: name of firmware file * @device: device for which firmware is being loaded * @gfp: allocation flags @@ -778,8 +803,8 @@ static void firmware_request_work_func(struct work_struct *work) * - can't sleep at all if @gfp is GFP_ATOMIC. **/ int -firmware_request_nowait( - struct module *module, bool uevent, +firmware_request_nowait2( + struct module *module, bool uevent, bool warn, const char *name, struct device *device, gfp_t gfp, void *context, void (*cont)(const struct firmware *fw, void *context)) { @@ -799,7 +824,8 @@ firmware_request_nowait( fw_work->context = context; fw_work->cont = cont; fw_work->opt_flags = FW_OPT_NOWAIT | - (uevent ? FW_OPT_UEVENT : FW_OPT_USERHELPER); + (uevent ? FW_OPT_UEVENT : FW_OPT_USERHELPER) | + (warn ? 0 : FW_OPT_NO_WARN); if (!uevent && fw_cache_is_setup(device, name)) { kfree_const(fw_work->name); @@ -818,6 +844,24 @@ firmware_request_nowait( schedule_work(&fw_work->work); return 0; } +EXPORT_SYMBOL_GPL(firmware_request_nowait2); + +/** + * firmware_request_nowait - compatibility version of firmware_request_nowait2 + * + * This is equivalent to calling firmware_request_nowait2 with warnings enabled. + * + * Refer to firmware_request_nowait2 for further details. + **/ +int +firmware_request_nowait( + struct module *module, bool uevent, + const char *name, struct device *device, gfp_t gfp, void *context, + void (*cont)(const struct firmware *fw, void *context)) +{ + return firmware_request_nowait2(module, uevent, true, name, device, + gfp, context, cont); +} EXPORT_SYMBOL(firmware_request_nowait); #ifdef CONFIG_PM_SLEEP diff --git a/include/linux/firmware.h b/include/linux/firmware.h index db8351a42405..2623d3f853ba 100644 --- a/include/linux/firmware.h +++ b/include/linux/firmware.h @@ -42,6 +42,12 @@ struct builtin_fw { #if defined(CONFIG_FW_LOADER) || (defined(CONFIG_FW_LOADER_MODULE) && defined(MODULE)) int firmware_request(const struct firmware **fw, const char *name, struct device *device); +int firmware_request_nowarn(const struct firmware **fw, const char *name, + struct device *device); +int firmware_request_nowait2( + struct module *module, bool uevent, bool warn, + const char *name, struct device *device, gfp_t gfp, void *context, + void (*cont)(const struct firmware *fw, void *context)); int firmware_request_nowait( struct module *module, bool uevent, const char *name, struct device *device, gfp_t gfp, void *context, -- 2.14.1