[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <5e7fa480-b8a0-1178-04c2-36244221fd7e@molgen.mpg.de>
Date: Wed, 16 Mar 2022 18:24:38 +0100
From: Paul Menzel <pmenzel@...gen.mpg.de>
To: Manish Chopra <manishc@...vell.com>
Cc: buczek@...gen.mpg.de, kuba@...nel.org, netdev@...r.kernel.org,
aelior@...vell.com, it+netdev@...gen.mpg.de,
regressions@...ts.linux.dev
Subject: Re: [RFC net] bnx2x: fix built-in kernel driver load failure
Dear Manish,
Am 16.03.22 um 18:09 schrieb Paul Menzel:
> Thank you for the patch.
>
> Am 16.03.22 um 12:18 schrieb Manish Chopra:
>> commit b7a49f73059f ("bnx2x: Utilize firmware 7.13.21.0")
>> added request_firmware() logic in probe() which caused
>> built-in kernel driver load failure as access to firmware
>> file is not feasible during the probe time.
>
> … for example, when the initrd does not provide the firmware files.
>
> Please also paste one example error message.
>
>> This patch fixes this issue by -
>>
>> 1. Removing request_firmware() logic from the probe() such
>> that open() handle it as it used to handle it earlier
>>
>> 2. Relaxing a bit FW version comparisons against the loaded FW
>> (to allow many close/compatible FWs to run together now)
>
> I’d prefer if you also pasted one error message, and even split this out
> into a separate commit with elaborate problem description.
>
> Style note: For the commit message, it’d be great if you used 75
> characters per line.
>
>> Reported-by: Paul Menzel <pmenzel@...gen.mpg.de>
>> Fixes: b7a49f73059f ("bnx2x: Utilize firmware 7.13.21.0")
>
> The regzbot also asks to add the tag below [1].
>
> Link:
> https://lore.kernel.org/r/46f2d9d9-ae7f-b332-ddeb-b59802be2bab@molgen.mpg.de
>
>
>> Signed-off-by: Manish Chopra <manishc@...vell.com>
>> Signed-off-by: Ariel Elior <aelior@...vell.com>
>> ---
>>
>> Note that this patch is just for test and get feedback
>> from Paul Menzel about the issue reported by him on built-in
>> driver probe failure due to firmware files not found
>
> Tested-by: Paul Menzel <pmenzel@...gen.mpg.de>
>
> Dell PowerEdge R910/0KYD3D, BIOS 2.10.0 08/29/2013 with patch on top of
> Linux 5.10.103 with 7.13.15.0 on the root partition:
>
> $ lspci -nn -s 45:00.1
> 45:00.1 Ethernet controller [0200]: Broadcom Inc. and subsidiaries
> NetXtreme II BCM57711 10-Gigabit PCIe [14e4:164f]
> $ ethtool -i net05
> driver: bnx2x
> version: 5.10.103.mx64.429-00016-g597b02
> firmware-version: 7.8.16 bc 6.2.26 phy aa0.406
> expansion-rom-version:
> bus-info: 0000:45:00.1
> supports-statistics: yes
> supports-test: yes
> supports-eeprom-access: yes
> supports-register-dump: yes
> supports-priv-flags: yes
> ```
>
>> drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | 2 --
>> .../net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 28 +++++++++++--------
>> .../net/ethernet/broadcom/bnx2x/bnx2x_main.c | 15 ++--------
>> 3 files changed, 19 insertions(+), 26 deletions(-)
>>
>> diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
>> b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
>> index a19dd6797070..2209d99b3404 100644
>> --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
>> +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
>> @@ -2533,6 +2533,4 @@ void bnx2x_register_phc(struct bnx2x *bp);
>> * Meant for implicit re-load flows.
>> */
>> int bnx2x_vlan_reconfigure_vid(struct bnx2x *bp);
>> -int bnx2x_init_firmware(struct bnx2x *bp);
>> -void bnx2x_release_firmware(struct bnx2x *bp);
>> #endif /* bnx2x.h */
>> diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
>> b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
>> index 8d36ebbf08e1..5729a5ab059d 100644
>> --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
>> +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
>> @@ -2364,24 +2364,30 @@ int bnx2x_compare_fw_ver(struct bnx2x *bp, u32
>> load_code, bool print_err)
>> /* is another pf loaded on this engine? */
>> if (load_code != FW_MSG_CODE_DRV_LOAD_COMMON_CHIP &&
>> load_code != FW_MSG_CODE_DRV_LOAD_COMMON) {
>> - /* build my FW version dword */
>> - u32 my_fw = (bp->fw_major) + (bp->fw_minor << 8) +
>> - (bp->fw_rev << 16) + (bp->fw_eng << 24);
>> + u8 loaded_fw_major, loaded_fw_minor, loaded_fw_rev, loaded_fw_eng;
>> + u32 loaded_fw;
>>
>> /* read loaded FW from chip */
>> - u32 loaded_fw = REG_RD(bp, XSEM_REG_PRAM);
>> + loaded_fw = REG_RD(bp, XSEM_REG_PRAM);
>>
>> - DP(BNX2X_MSG_SP, "loaded fw %x, my fw %x\n",
>> - loaded_fw, my_fw);
>> + loaded_fw_major = loaded_fw & 0xff;
>> + loaded_fw_minor = (loaded_fw >> 8) & 0xff;
>> + loaded_fw_rev = (loaded_fw >> 16) & 0xff;
>> + loaded_fw_eng = (loaded_fw >> 24) & 0xff;
>> +
>> + DP(BNX2X_MSG_SP, "loaded fw 0x%x major 0x%x minor 0x%x rev 0x%x eng 0x%x\n",
>> + loaded_fw, loaded_fw_major, loaded_fw_minor, loaded_fw_rev, loaded_fw_eng);
>
> Hmm, with `CONFIG_BNX2X=y` and `bnx2x.debug=0x0100000`, bringing up
> net05 (.1) and then net04 (.0), I only see:
>
> [ 3333.883697] bnx2x: [bnx2x_compare_fw_ver:2378(net04)]loaded fw f0d07 major 7 minor d rev f eng 0
>
> For another patch, but the currently loaded firmware, and when loading
> new firmware, the version of it, should also be logged by Linux (by
> default, and not with debug level).
>
> Also copying the 7.13.21.0 firmware on the running system, bringing the
> interfaces down and up again, the newer firmware is not loaded, but it
> stays with the 7.13.15.0:
>
> [ 3533.374046] bnx2x: [bnx2x_compare_fw_ver:2378(net04)]loaded fw f0d07 major 7 minor d rev f eng 0
Starting the system with 7.13.21.0 in `/lib/firmware` bringing up the
partner port(?) of a device this message confirms that the newer
firmware is loaded:
[ 919.466778] bnx2x: [bnx2x_compare_fw_ver:2378(net05)]loaded fw
120d07 major 7 minor d rev 12 eng 0
>> /* abort nic load if version mismatch */
>> - if (my_fw != loaded_fw) {
>> + if (loaded_fw_major != BCM_5710_FW_MAJOR_VERSION ||
>> + loaded_fw_minor != BCM_5710_FW_MINOR_VERSION ||
>> + loaded_fw_eng != BCM_5710_FW_ENGINEERING_VERSION ||
>> + loaded_fw_rev < BCM_5710_FW_REVISION_VERSION_V15) {
>> if (print_err)
>> - BNX2X_ERR("bnx2x with FW %x was already loaded which mismatches my %x FW. Aborting\n",
>> - loaded_fw, my_fw);
>> + BNX2X_ERR("loaded FW incompatible. Aborting\n");
>> else
>> - BNX2X_DEV_INFO("bnx2x with FW %x was already loaded which mismatches my %x FW, possibly due to MF UNDI\n",
>> - loaded_fw, my_fw);
>> + BNX2X_DEV_INFO("loaded FW incompatible, possibly due to MF UNDI\n");
>> +
>> return -EBUSY;
>> }
>> }
>> diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
>> b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
>> index eedb48d945ed..c19b072f3a23 100644
>> --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
>> +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
>> @@ -12319,15 +12319,6 @@ static int bnx2x_init_bp(struct bnx2x *bp)
>>
>> bnx2x_read_fwinfo(bp);
>>
>> - if (IS_PF(bp)) {
>> - rc = bnx2x_init_firmware(bp);
>> -
>> - if (rc) {
>> - bnx2x_free_mem_bp(bp);
>> - return rc;
>> - }
>> - }
>> -
>> func = BP_FUNC(bp);
>>
>> /* need to reset chip if undi was active */
>> @@ -12340,7 +12331,6 @@ static int bnx2x_init_bp(struct bnx2x *bp)
>>
>> rc = bnx2x_prev_unload(bp);
>> if (rc) {
>> - bnx2x_release_firmware(bp);
>> bnx2x_free_mem_bp(bp);
>> return rc;
>> }
>> @@ -13409,7 +13399,7 @@ do { \
>> (u8 *)bp->arr, len); \
>> } while (0)
>>
>> -int bnx2x_init_firmware(struct bnx2x *bp)
>> +static int bnx2x_init_firmware(struct bnx2x *bp)
>> {
>> const char *fw_file_name, *fw_file_name_v15;
>> struct bnx2x_fw_file_hdr *fw_hdr;
>> @@ -13509,7 +13499,7 @@ int bnx2x_init_firmware(struct bnx2x *bp)
>> return rc;
>> }
>>
>> -void bnx2x_release_firmware(struct bnx2x *bp)
>> +static void bnx2x_release_firmware(struct bnx2x *bp)
>> {
>> kfree(bp->init_ops_offsets);
>> kfree(bp->init_ops);
>> @@ -14026,7 +14016,6 @@ static int bnx2x_init_one(struct pci_dev *pdev,
>> return 0;
>>
>> init_one_freemem:
>> - bnx2x_release_firmware(bp);
>> bnx2x_free_mem_bp(bp);
>>
>> init_one_exit:
>> --
>> 2.35.1.273.ge6ebfd0
>
> So why was the earlier firmware version comparison needed in commit
> b7a49f73059f ("bnx2x: Utilize firmware 7.13.21.0")?
>
> I let the maintainers decide how to best go forward.
Kind regards,
Paul
> [1]: https://linux-regtracking.leemhuis.info/regzbot/mainline/
> (click on the array to expand the information)
Powered by blists - more mailing lists