Dear Baoquan, Linux folks,
I am sorry for Thunderbird’s autowrapping messing up the message formatting.
On 10/25/16 16:33, Paul Menzel wrote:
A server with the Broadcom devices below, fails to load the drivers
because of missing firmware.
$ lspci -nn
[…]
01:00.0 Ethernet controller [0200]: Broadcom Corporation NetXtreme II
BCM5709 Gigabit Ethernet [14e4:1639] (rev 20)
01:00.1 Ethernet controller [0200]: Broadcom Corporation NetXtreme II
BCM5709 Gigabit Ethernet [14e4:1639] (rev 20)
02:00.0 Ethernet controller [0200]: Broadcom Corporation NetXtreme II
BCM5709 Gigabit Ethernet [14e4:1639] (rev 20)
02:00.1 Ethernet controller [0200]: Broadcom Corporation NetXtreme II
BCM5709 Gigabit Ethernet [14e4:1639] (rev 20)
[…]
Here are the error messages from Linux 4.8.4.
[ 10.365839] bnx2: QLogic bnx2 Gigabit Ethernet Driver v2.2.6
(January 29, 2014)
[ 10.366989] bnx2 0000:01:00.0: Direct firmware load for
bnx2/bnx2-mips-09-6.2.1b.fw failed with error -2
[ 10.367384] bnx2: Can't load firmware file
"bnx2/bnx2-mips-09-6.2.1b.fw"
[ 10.367719] bnx2: probe of 0000:01:00.0 failed with error -2
[ 10.368616] bnx2 0000:01:00.1: Direct firmware load for
bnx2/bnx2-mips-09-6.2.1b.fw failed with error -2
[ 10.369015] bnx2: Can't load firmware file
"bnx2/bnx2-mips-09-6.2.1b.fw"
[ 10.369292] bnx2: probe of 0000:01:00.1 failed with error -2
[ 10.370194] bnx2 0000:02:00.0: Direct firmware load for
bnx2/bnx2-mips-09-6.2.1b.fw failed with error -2
[ 10.374460] bnx2: Can't load firmware file
"bnx2/bnx2-mips-09-6.2.1b.fw"
[ 10.374743] bnx2: probe of 0000:02:00.0 failed with error -2
[ 10.375619] bnx2 0000:02:00.1: Direct firmware load for
bnx2/bnx2-mips-09-6.2.1b.fw failed with error -2
[ 10.376024] bnx2: Can't load firmware file
"bnx2/bnx2-mips-09-6.2.1b.fw"
[ 10.376303] bnx2: probe of 0000:02:00.1 failed with error -2
[ 10.376589] bnx2x: QLogic 5771x/578xx 10/20-Gigabit Ethernet Driver
bnx2x 1.712.30-0 (2014/02/10)
[ 10.509323] bnx2: QLogic bnx2 Gigabit Ethernet Driver v2.2.6
(January 29, 2014)
[ 10.510467] bnx2 0000:01:00.0: Direct firmware load for
bnx2/bnx2-mips-09-6.2.1b.fw failed with error -2
[ 10.510855] bnx2: Can't load firmware file
"bnx2/bnx2-mips-09-6.2.1b.fw"
[ 10.511188] bnx2: probe of 0000:01:00.0 failed with error -2
[ 10.512087] bnx2 0000:01:00.1: Direct firmware load for
bnx2/bnx2-mips-09-6.2.1b.fw failed with error -2
[ 10.512492] bnx2: Can't load firmware file
"bnx2/bnx2-mips-09-6.2.1b.fw"
[ 10.512773] bnx2: probe of 0000:01:00.1 failed with error -2
[ 10.513648] bnx2 0000:02:00.0: Direct firmware load for
bnx2/bnx2-mips-09-6.2.1b.fw failed with error -2
[ 10.517861] bnx2: Can't load firmware file
"bnx2/bnx2-mips-09-6.2.1b.fw"
[ 10.518182] bnx2: probe of 0000:02:00.0 failed with error -2
[ 10.519071] bnx2 0000:02:00.1: Direct firmware load for
bnx2/bnx2-mips-09-6.2.1b.fw failed with error -2
[ 10.519466] bnx2: Can't load firmware file
"bnx2/bnx2-mips-09-6.2.1b.fw"
[ 10.519740] bnx2: probe of 0000:02:00.1 failed with error -2
[ 10.520039] bnx2x: QLogic 5771x/578xx 10/20-Gigabit Ethernet Driver
bnx2x 1.712.30-0 (2014/02/10)
The system boots fine with the *same* initramfs and Linux 4.4.27, and
Linux 4.7.10.
$ dmesg | grep bnx # Linux 4.7.10
[ 9.875426] bnx2: QLogic bnx2 Gigabit Ethernet Driver v2.2.6
(January 29, 2014)
[ 9.876766] bnx2 0000:01:00.0 eth0: Broadcom NetXtreme II BCM5709
1000Base-T (C0) PCI Express found at mem e6000000, IRQ 43, node addr
14:fe:b5:c6:81:01
[ 9.878065] bnx2 0000:01:00.1 eth1: Broadcom NetXtreme II BCM5709
1000Base-T (C0) PCI Express found at mem e8000000, IRQ 44, node addr
14:fe:b5:c6:81:03
[ 9.879357] bnx2 0000:02:00.0 eth2: Broadcom NetXtreme II BCM5709
1000Base-T (C0) PCI Express found at mem ea000000, IRQ 45, node addr
14:fe:b5:c6:81:05
[ 9.880630] bnx2 0000:02:00.1 eth3: Broadcom NetXtreme II BCM5709
1000Base-T (C0) PCI Express found at mem ec000000, IRQ 46, node addr
14:fe:b5:c6:81:07
[ 9.881129] bnx2x: QLogic 5771x/578xx 10/20-Gigabit Ethernet Driver
bnx2x 1.712.30-0 (2014/02/10)
[ 27.692521] bnx2 0000:01:00.0 net00: renamed from eth0
[ 27.702703] bnx2 0000:01:00.1 net01: renamed from eth1
[ 27.719779] bnx2 0000:02:00.0 net02: renamed from eth2
[ 27.768563] bnx2 0000:02:00.1 net03: renamed from eth3
[ 28.146396] bnx2 0000:01:00.0 net00: using MSIX
[ 31.294206] bnx2 0000:01:00.0 net00: NIC Copper Link is Up, 1000
Mbps full duplex
There were not many commits between Linux 4.7 and Linux 4.8.
Could the commit below cause this regression?
$ git log --oneline v4.7...v4.8 -- drivers/net/ethernet/broadcom/bnx2.c
3e1be7a bnx2: Reset device during driver initialization
commit 3e1be7ad2d38c6bd6aeef96df9bd0a7822f4e51c
Author: Baoquan He <b...@redhat.com>
Date: Fri Sep 9 22:43:12 2016 +0800
bnx2: Reset device during driver initialization
When system enters into kdump kernel because of kernel panic, it
won't
shutdown devices. On-flight DMA will continue transferring data until
device driver initializes. All devices are supposed to reset during
driver initialization. And this property is used to fix the kdump
failure in system with intel iommu. Other systems with hardware iommu
should be similar. Please check commit 091d42e ("iommu/vt-d: Copy
translation tables from old kernel") and those commits around.
But bnx2 driver doesn't reset device during driver initialization.
The
device resetting is deferred to net device up stage. This will cause
hardware iommu handling failure on bnx2 device. And its resetting
relies
on firmware. So in this patch move the firmware requesting code to
earlier
bnx2_init_one(), then next call bnx2_reset_chip to reset device.
Signed-off-by: Baoquan He <b...@redhat.com>
Signed-off-by: David S. Miller <da...@davemloft.net>
diff --git a/drivers/net/ethernet/broadcom/bnx2.c
b/drivers/net/ethernet/broadcom/bnx2.c
index 8fc3f3c..505ceaf 100644
--- a/drivers/net/ethernet/broadcom/bnx2.c
+++ b/drivers/net/ethernet/broadcom/bnx2.c
@@ -6356,10 +6356,6 @@ bnx2_open(struct net_device *dev)
struct bnx2 *bp = netdev_priv(dev);
int rc;
- rc = bnx2_request_firmware(bp);
- if (rc < 0)
- goto out;
-
netif_carrier_off(dev);
bnx2_disable_int(bp);
@@ -6428,7 +6424,6 @@ bnx2_open(struct net_device *dev)
bnx2_free_irq(bp);
bnx2_free_mem(bp);
bnx2_del_napi(bp);
- bnx2_release_firmware(bp);
goto out;
}
@@ -8575,6 +8570,12 @@ bnx2_init_one(struct pci_dev *pdev, const
struct pci_device_id *ent)
pci_set_drvdata(pdev, dev);
+ rc = bnx2_request_firmware(bp);
+ if (rc < 0)
+ goto error;
+
+
+ bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_RESET);
memcpy(dev->dev_addr, bp->mac_addr, ETH_ALEN);
dev->hw_features = NETIF_F_IP_CSUM | NETIF_F_SG |
@@ -8607,6 +8608,7 @@ bnx2_init_one(struct pci_dev *pdev, const struct
pci_device_id *ent)
return 0;
error:
+ bnx2_release_firmware(bp);
pci_iounmap(pdev, bp->regview);
pci_release_regions(pdev);
pci_disable_device(pdev);
Baoquan, could you please fix this regression. My suggestion is, that
you add the old code back, but check if the firmware has been loaded. If
it hasn’t, load it again.
That way, people can update their Linux kernel, and it continues working
without changing the initramfs, or anything else.
Kind regards,
Paul