From: Baoquan He <bhe@redhat.com>
To: netdev@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, Dept-GELinuxNICDev@cavium.com,
rasesh.mody@cavium.com, harish.patil@cavium.com,
frank@undermydesk.org, jsr@dex.edzone.net, pmenzel@molgen.mpg.de,
jroedel@suse.de, dyoung@redhat.com, Baoquan He <bhe@redhat.com>
Subject: [PATCH 2/2] bnx2: Hard reset bnx2 chip at probe stage
Date: Fri, 11 Nov 2016 21:46:35 +0800 [thread overview]
Message-ID: <1478871995-29652-3-git-send-email-bhe@redhat.com> (raw)
In-Reply-To: <1478871995-29652-1-git-send-email-bhe@redhat.com>
In commit 3e1be7a ("bnx2: Reset device during driver initialization"),
firmware requesting code was moved to driver probe stage, into function
bnx2_init_one. But if bnx2 driver is build into kernel, it will fail
to request firmware because firmware is contained in initramfs, but
initramfs has not been uncommpressed and mounted yet when do_initcalls
called.
So in order to reset the device at probe stage, have to hard reset bnx2
chip wihtout involving firmware handling. So in this patch add function
bnx2_hard_reset_chip which only trys to hard reset bnx2 chip and only
will be called in kdump kernel.
Signed-off-by: Baoquan He <bhe@redhat.com>
---
drivers/net/ethernet/broadcom/bnx2.c | 62 ++++++++++++++++++++++++++++++++++++
1 file changed, 62 insertions(+)
diff --git a/drivers/net/ethernet/broadcom/bnx2.c b/drivers/net/ethernet/broadcom/bnx2.c
index c557972..84e3f12 100644
--- a/drivers/net/ethernet/broadcom/bnx2.c
+++ b/drivers/net/ethernet/broadcom/bnx2.c
@@ -49,6 +49,7 @@
#include <linux/firmware.h>
#include <linux/log2.h>
#include <linux/aer.h>
+#include <linux/crash_dump.h>
#if IS_ENABLED(CONFIG_CNIC)
#define BCM_CNIC 1
@@ -4765,6 +4766,58 @@ bnx2_setup_msix_tbl(struct bnx2 *bp)
}
static int
+bnx2_hard_reset_chip(struct bnx2 *bp)
+{
+ u32 val;
+ int i, rc = 0;
+
+ if (BNX2_CHIP(bp) == BNX2_CHIP_5709) {
+ BNX2_WR(bp, BNX2_MISC_COMMAND, BNX2_MISC_COMMAND_HD_RESET);
+ BNX2_RD(bp, BNX2_MISC_COMMAND);
+ udelay(5);
+
+ val = BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA |
+ BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP;
+
+ BNX2_WR(bp, BNX2_PCICFG_MISC_CONFIG, val);
+
+ } else {
+ val = BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ |
+ BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA |
+ BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP;
+
+ /* Chip reset. */
+ BNX2_WR(bp, BNX2_PCICFG_MISC_CONFIG, val);
+
+ /* Reading back any register after chip reset will hang the
+ * bus on 5706 A0 and A1. The msleep below provides plenty
+ * of margin for write posting.
+ */
+ if ((BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A0) ||
+ (BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A1))
+ msleep(20);
+
+ /* Reset takes approximate 30 usec */
+ for (i = 0; i < 10; i++) {
+ val = BNX2_RD(bp, BNX2_PCICFG_MISC_CONFIG);
+ if ((val & (BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ |
+ BNX2_PCICFG_MISC_CONFIG_CORE_RST_BSY)) == 0)
+ break;
+ udelay(10);
+ }
+
+ if (val & (BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ |
+ BNX2_PCICFG_MISC_CONFIG_CORE_RST_BSY)) {
+ pr_err("Chip reset did not complete\n");
+ return -EBUSY;
+ }
+ }
+
+ return rc;
+}
+
+
+static int
bnx2_reset_chip(struct bnx2 *bp, u32 reset_code)
{
u32 val;
@@ -8580,6 +8633,15 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
pci_set_drvdata(pdev, dev);
+
+ /*
+ * Kdump kernel need reset device at probe stage if hardware iommu
+ * is deployed. Otherwise in-flight DMA will continue going until
+ * reset is done in open stage.
+ */
+ if (is_kdump_kernel())
+ bnx2_hard_reset_chip(bp);
+
memcpy(dev->dev_addr, bp->mac_addr, ETH_ALEN);
dev->hw_features = NETIF_F_IP_CSUM | NETIF_F_SG |
--
2.5.5
next prev parent reply other threads:[~2016-11-11 13:46 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-11 13:46 [PATCH 0/2] bnx2: Hard reset bnx2 chip at probe stage Baoquan He
2016-11-11 13:46 ` [PATCH 1/2] Revert "bnx2: Reset device during driver initialization" Baoquan He
2016-11-11 13:51 ` Paul Menzel
2016-11-11 13:46 ` Baoquan He [this message]
2016-11-13 4:15 ` [PATCH v2 2/2] bnx2: Wait for in-flight DMA to complete at probe stage Baoquan He
2016-11-13 4:40 ` David Miller
2016-11-13 4:54 ` Baoquan He
2016-11-11 14:02 ` [PATCH 0/2] bnx2: Hard reset bnx2 chip " Baoquan He
2016-11-11 17:37 ` Michael Chan
2016-11-13 4:10 ` Baoquan He
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1478871995-29652-3-git-send-email-bhe@redhat.com \
--to=bhe@redhat.com \
--cc=Dept-GELinuxNICDev@cavium.com \
--cc=dyoung@redhat.com \
--cc=frank@undermydesk.org \
--cc=harish.patil@cavium.com \
--cc=jroedel@suse.de \
--cc=jsr@dex.edzone.net \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pmenzel@molgen.mpg.de \
--cc=rasesh.mody@cavium.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).