Received: by 10.192.165.156 with SMTP id m28csp194738imm; Tue, 17 Apr 2018 08:38:31 -0700 (PDT) X-Google-Smtp-Source: AIpwx49e0SbDkoFdCEWG5ztSqWMuDpArDL7MEOq86j7vC0jRxKXDqz6NCEQxonWJRwMIV9iQZNfr X-Received: by 10.98.212.11 with SMTP id a11mr2437823pfh.238.1523979511178; Tue, 17 Apr 2018 08:38:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523979511; cv=none; d=google.com; s=arc-20160816; b=0r1D7hO7JFy9Im03ZYjsiL8Og6Xpq9KB+aRLGslMXK3wiRW6CnLvHnlNAk/Q1b0Ikd hguTMG8v6MN+7qPgut+2pUkgPC538CTrG4Qn5jm1TiMR8OrNHCK1mbUerMPGMSGD6stQ L1V8jL36lt8uX6sSoOcY37FzyotgQk4jC3158sZ9fTV4DuDj9unRq6145kKvriGoJ6YS i3CWD6LZVsM5lLSr2nswzxwyueH8UfwXxGDH9V59FH19zlj8f1U/ahViHhwjsfcFIset LQobCaEgtod9u2z9yB9JeHpI/oS7qV8ZHe6LCnTq2SIbreqqjzg6jT7cR70aM+Wz7pcb GZkA== 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=EOp+Rizsx0z01ttDCzMbbtRUQ8A9gR0CH2/cwHNKg/8=; b=G8dBDMgdeqsDIqLz5QPbvXUQGxQt0oF4h7tVy7wKw2szq5aFLekkY0WhFKX1addVzP KM8Jn+uKzrInbjT+97/wUai78G1xLBJEekEskwnWVAhq4bxNMq0OvaF09LbMoTSzykDd JhYhGOH3/ipyGopjCDXLbH0/Mf/QmMtGmTRjj0WZxZEkuelLuu+B6GxVNEEJv4wTYNP0 XNOM5oZb+b/EoNPKCiZS0MFTxHDXAoNB1cyupDax2KICyRih7/lqM+X+GyevDv4ibJpO VCybbF5Czv4GvqbiUxqcxHB/qXoEA02zTkmGAVT5MQiJlm6iOs8hujz+xdj79ObacK6y Z6Bw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=QZSGMIde; 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 r9si8851462pgn.244.2018.04.17.08.38.15; Tue, 17 Apr 2018 08:38:31 -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=QZSGMIde; 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 S1753262AbeDQPes (ORCPT + 99 others); Tue, 17 Apr 2018 11:34:48 -0400 Received: from mail-io0-f193.google.com ([209.85.223.193]:40224 "EHLO mail-io0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751187AbeDQPdW (ORCPT ); Tue, 17 Apr 2018 11:33:22 -0400 Received: by mail-io0-f193.google.com with SMTP id t123so15680075iof.7 for ; Tue, 17 Apr 2018 08:33:22 -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=EOp+Rizsx0z01ttDCzMbbtRUQ8A9gR0CH2/cwHNKg/8=; b=QZSGMIde50y4YUjaivtGqVI1+WpS4e8m9pOmLus5ylHzsAe+QptIFhh/lTANRx1rTm NtGy7gJOy7IPKp+u/bvC30WgQwK5P1SbD1XgkFLjyTcEfTrrXS+11DzXUa7zMQiMvc05 k+74CJOe2+Q1N5HbeJ2A8VP24eN9pBY5SFevEeODSY7X7GQzXjoxmkjO27IkHgnbN1LM c3B9htm8B402rEMOZpT0gvjrhmR+aWL1FjVX6Fgmh2DFX4sIIBe1teHTeu50cFTFd4p8 g0LJo7BOTXoH62JaV7qTAw6VsLWmYrPpuMTXXfyDYraMczIg+SQnUzgCDpeRXOj1sKq+ G5iw== 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=EOp+Rizsx0z01ttDCzMbbtRUQ8A9gR0CH2/cwHNKg/8=; b=W4TN6ruI5PzDcmdlaETwBWJPgExMgC3jkGvo0b0EMYfrq8xKCjcxLQ0zBXHjzuJQsh 9OPFoTzA1ggaPrjVc6mvO6jUSUtoCrN2tjeraq85GaWuMP/WKyN38L0u9wSO+LZit2/2 x96X5onTxZTVpBUVBUnrCuysccNeUiiuZYmDWZz9/ZWb+ZQS45NTYdOLN56mSjKdypDu NnwADYYR2wBCB7a0Yhfp6MuUYqNPhTeteaRcOSS57fisA8Jy0bD55B40MvUUy9v7LVpI 605jpzJv8tvfv5aMiyIXlIou1QXg8JHbJiyOAV+Qnb2ZynQANlZ1V1RwCDuTSG+o181p qGOw== X-Gm-Message-State: ALQs6tDJzAWL/wADbg5mr0g/+lnGHbcSvnFIyEfdX5/Vdms4x1ClGB59 9SjKq6UJ2uthBJ0/QDCS+pR99wHb X-Received: by 10.107.160.76 with SMTP id j73mr2454815ioe.207.1523979201506; Tue, 17 Apr 2018 08:33:21 -0700 (PDT) Received: from localhost.localdomain (184-175-36-239.dsl.teksavvy.com. [184.175.36.239]) by smtp.gmail.com with ESMTPSA id y20sm7474131ioy.27.2018.04.17.08.33.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 17 Apr 2018 08:33:21 -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 5/9] firmware: add functions to load firmware without warnings v4 Date: Tue, 17 Apr 2018 11:33:03 -0400 Message-Id: <20180417153307.3693-6-andresx7@gmail.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180417153307.3693-1-andresx7@gmail.com> References: <20180417153307.3693-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 v4: fix kernel-doc style [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 d028cd3257f7..e449ac990dc9 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