From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mail-wm0-f41.google.com ([74.125.82.41]:32919 "EHLO mail-wm0-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753890AbcLYUPn (ORCPT ); Sun, 25 Dec 2016 15:15:43 -0500 Received: by mail-wm0-f41.google.com with SMTP id m1so12738743wme.0 for ; Sun, 25 Dec 2016 12:15:43 -0800 (PST) Subject: Re: [PATCH 2/6] wl1251: Use request_firmware_prefer_user() for loading NVS calibration data To: =?UTF-8?Q?Pali_Roh=c3=a1r?= , Ming Lei , "Luis R. Rodriguez" , Greg Kroah-Hartman , Kalle Valo , David Gnedt , Michal Kazior , Daniel Wagner , Tony Lindgren , Sebastian Reichel , Pavel Machek , Ivaylo Dimitrov , Aaro Koskinen , Grazvydas Ignotas References: <1482598381-16513-1-git-send-email-pali.rohar@gmail.com> <1482598381-16513-3-git-send-email-pali.rohar@gmail.com> Cc: linux-kernel@vger.kernel.org, linux-wireless@vger.kernel.org, netdev@vger.kernel.org From: Arend Van Spriel Message-ID: (sfid-20161225_211608_516225_43D5EE4D) Date: Sun, 25 Dec 2016 21:15:40 +0100 MIME-Version: 1.0 In-Reply-To: <1482598381-16513-3-git-send-email-pali.rohar@gmail.com> Content-Type: text/plain; charset=utf-8 Sender: linux-wireless-owner@vger.kernel.org List-ID: On 24-12-2016 17:52, Pali Rohár wrote: > NVS calibration data for wl1251 are model specific. Every one device with > wl1251 chip has different and calibrated in factory. > > Not all wl1251 chips have own EEPROM where are calibration data stored. And > in that case there is no "standard" place. Every device has stored them on > different place (some in rootfs file, some in dedicated nand partition, > some in another proprietary structure). > > Kernel wl1251 driver cannot support every one different storage decided by > device manufacture so it will use request_firmware_prefer_user() call for > loading NVS calibration data and userspace helper will be responsible to > prepare correct data. Responding to this patch as it provides a lot of context to discuss. As you might have gathered from earlier discussions I am not a fan of using user-space helper. I can agree that the kernel driver, wl1251 in this case, should be agnostic to platform specific details regarding storage solutions and the firmware api should hide that. However, it seems your only solution is adding user-space to the mix and changing the api towards that. Can we solve it without user-space help? The firmware_class already supports a number of path prefixes it traverses looking for the requested firmware. So I was thinking about adding a hashtable in which a platform driver can add firmware which are stored in the hashtable using the hashed firmware name. Upon a firmware request from the driver we could check the hashtable before traversing the path prefixes on VFS. The obvious problem is that the request may come before the firmware is added to the hashtable. Just wanted to pitch the idea first and hear what others think about it and maybe someone has a nice solution for this problem. Fingers crossed :-p > In case userspace helper fails request_firmware_prefer_user() still try to > load data file directly from VFS as fallback mechanism. > > On Nokia N900 device which has wl1251 chip, NVS calibration data are stored > in CAL nand partition. CAL is proprietary Nokia key/value format for nand > devices. With the firmware hashtable api on N900 a platform driver could interpret the CAL data in the nand partition and provide it through the firmware_class. > With this patch it is finally possible to load correct model specific NVS > calibration data for Nokia N900. But on other devices that use wl1251, but for instance have no userspace helper the request to userspace will fail (after 60 sec?) and try VFS after that. Maybe not so nice. You should consider other device configurations. Not just N900. Regards, Arend > Signed-off-by: Pali Rohár > --- > drivers/net/wireless/ti/wl1251/Kconfig | 1 + > drivers/net/wireless/ti/wl1251/main.c | 2 +- > 2 files changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/wireless/ti/wl1251/Kconfig b/drivers/net/wireless/ti/wl1251/Kconfig > index 7142ccf..affe154 100644 > --- a/drivers/net/wireless/ti/wl1251/Kconfig > +++ b/drivers/net/wireless/ti/wl1251/Kconfig > @@ -2,6 +2,7 @@ config WL1251 > tristate "TI wl1251 driver support" > depends on MAC80211 > select FW_LOADER > + select FW_LOADER_USER_HELPER > select CRC7 > ---help--- > This will enable TI wl1251 driver support. The drivers make > diff --git a/drivers/net/wireless/ti/wl1251/main.c b/drivers/net/wireless/ti/wl1251/main.c > index 208f062..24f8866 100644 > --- a/drivers/net/wireless/ti/wl1251/main.c > +++ b/drivers/net/wireless/ti/wl1251/main.c > @@ -110,7 +110,7 @@ static int wl1251_fetch_nvs(struct wl1251 *wl) > struct device *dev = wiphy_dev(wl->hw->wiphy); > int ret; > > - ret = request_firmware(&fw, WL1251_NVS_NAME, dev); > + ret = request_firmware_prefer_user(&fw, WL1251_NVS_NAME, dev); > > if (ret < 0) { > wl1251_error("could not get nvs file: %d", ret); >