Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1519796 > unrolled thread
| Started by | Baoquan He <bhe@redhat.com> |
|---|---|
| First post | 2016-11-11 14:50 +0100 |
| Last post | 2016-11-13 06:00 +0100 |
| Articles | 4 — 2 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
[PATCH 2/2] bnx2: Hard reset bnx2 chip at probe stage Baoquan He <bhe@redhat.com> - 2016-11-11 14:50 +0100
[PATCH v2 2/2] bnx2: Wait for in-flight DMA to complete at probe stage Baoquan He <bhe@redhat.com> - 2016-11-13 05:20 +0100
Re: [PATCH v2 2/2] bnx2: Wait for in-flight DMA to complete at probe stage David Miller <davem@davemloft.net> - 2016-11-13 05:50 +0100
Re: [PATCH v2 2/2] bnx2: Wait for in-flight DMA to complete at probe stage Baoquan He <bhe@redhat.com> - 2016-11-13 06:00 +0100
| From | Baoquan He <bhe@redhat.com> |
|---|---|
| Date | 2016-11-11 14:50 +0100 |
| Subject | [PATCH 2/2] bnx2: Hard reset bnx2 chip at probe stage |
| Message-ID | <sCkno-4Wl-11@gated-at.bofh.it> |
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
[toc] | [next] | [standalone]
| From | Baoquan He <bhe@redhat.com> |
|---|---|
| Date | 2016-11-13 05:20 +0100 |
| Subject | [PATCH v2 2/2] bnx2: Wait for in-flight DMA to complete at probe stage |
| Message-ID | <sCUqR-3BB-11@gated-at.bofh.it> |
| In reply to | #1519796 |
In-flight DMA from 1st kernel could continue going in kdump kernel.
New io-page table has been created before bnx2 does reset at open stage.
We have to wait for the in-flight DMA to complete to avoid it look up
into the newly created io-page table at probe stage.
Suggested-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: Baoquan He <bhe@redhat.com>
---
v1->v2:
Michael suggested to wait for the in-flight DMA to complete at probe
stage. So give up the old method of trying to reset chip at probe
stage, take the new way accordingly.
drivers/net/ethernet/broadcom/bnx2.c | 38 ++++++++++++++++++++++++++++++------
1 file changed, 32 insertions(+), 6 deletions(-)
diff --git a/drivers/net/ethernet/broadcom/bnx2.c b/drivers/net/ethernet/broadcom/bnx2.c
index c557972..1f7034d 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
@@ -4764,15 +4765,16 @@ bnx2_setup_msix_tbl(struct bnx2 *bp)
BNX2_WR(bp, BNX2_PCI_GRC_WINDOW3_ADDR, BNX2_MSIX_PBA_ADDR);
}
-static int
-bnx2_reset_chip(struct bnx2 *bp, u32 reset_code)
+static void
+bnx2_wait_dma_complete(struct bnx2 *bp)
{
u32 val;
- int i, rc = 0;
- u8 old_port;
+ int i;
- /* Wait for the current PCI transaction to complete before
- * issuing a reset. */
+ /*
+ * Wait for the current PCI transaction to complete before
+ * issuing a reset.
+ */
if ((BNX2_CHIP(bp) == BNX2_CHIP_5706) ||
(BNX2_CHIP(bp) == BNX2_CHIP_5708)) {
BNX2_WR(bp, BNX2_MISC_ENABLE_CLR_BITS,
@@ -4796,6 +4798,21 @@ bnx2_reset_chip(struct bnx2 *bp, u32 reset_code)
}
}
+ return;
+}
+
+
+static int
+bnx2_reset_chip(struct bnx2 *bp, u32 reset_code)
+{
+ u32 val;
+ int i, rc = 0;
+ u8 old_port;
+
+ /* Wait for the current PCI transaction to complete before
+ * issuing a reset. */
+ bnx2_wait_dma_complete(bp);
+
/* Wait for the firmware to tell us it is ok to issue a reset. */
bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT0 | reset_code, 1, 1);
@@ -8580,6 +8597,15 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
pci_set_drvdata(pdev, dev);
+ /*
+ * In-flight DMA from 1st kernel could continue going in kdump kernel.
+ * New io-page table has been created before bnx2 does reset at open stage.
+ * We have to wait for the in-flight DMA to complete to avoid it look up
+ * into the newly created io-page table.
+ */
+ if (is_kdump_kernel())
+ bnx2_wait_dma_complete(bp);
+
memcpy(dev->dev_addr, bp->mac_addr, ETH_ALEN);
dev->hw_features = NETIF_F_IP_CSUM | NETIF_F_SG |
--
2.5.5
[toc] | [prev] | [next] | [standalone]
| From | David Miller <davem@davemloft.net> |
|---|---|
| Date | 2016-11-13 05:50 +0100 |
| Subject | Re: [PATCH v2 2/2] bnx2: Wait for in-flight DMA to complete at probe stage |
| Message-ID | <sCUTU-3LN-17@gated-at.bofh.it> |
| In reply to | #1520461 |
From: Baoquan He <bhe@redhat.com> Date: Sun, 13 Nov 2016 12:15:24 +0800 > In-flight DMA from 1st kernel could continue going in kdump kernel. > New io-page table has been created before bnx2 does reset at open stage. > We have to wait for the in-flight DMA to complete to avoid it look up > into the newly created io-page table at probe stage. > > Suggested-by: Michael Chan <michael.chan@broadcom.com> > Signed-off-by: Baoquan He <bhe@redhat.com> > --- > v1->v2: > Michael suggested to wait for the in-flight DMA to complete at probe > stage. So give up the old method of trying to reset chip at probe > stage, take the new way accordingly. Patch updates don't work this way. When you update a patch that is part of a patch series, you must resubmit the entire series anew. Thank you.
[toc] | [prev] | [next] | [standalone]
| From | Baoquan He <bhe@redhat.com> |
|---|---|
| Date | 2016-11-13 06:00 +0100 |
| Subject | Re: [PATCH v2 2/2] bnx2: Wait for in-flight DMA to complete at probe stage |
| Message-ID | <sCV3z-3Pe-13@gated-at.bofh.it> |
| In reply to | #1520470 |
On 11/12/16 at 11:40pm, David Miller wrote: > From: Baoquan He <bhe@redhat.com> > Date: Sun, 13 Nov 2016 12:15:24 +0800 > > > In-flight DMA from 1st kernel could continue going in kdump kernel. > > New io-page table has been created before bnx2 does reset at open stage. > > We have to wait for the in-flight DMA to complete to avoid it look up > > into the newly created io-page table at probe stage. > > > > Suggested-by: Michael Chan <michael.chan@broadcom.com> > > Signed-off-by: Baoquan He <bhe@redhat.com> > > --- > > v1->v2: > > Michael suggested to wait for the in-flight DMA to complete at probe > > stage. So give up the old method of trying to reset chip at probe > > stage, take the new way accordingly. > > Patch updates don't work this way. > > When you update a patch that is part of a patch series, you must > resubmit the entire series anew. Thanks for telling, David! Learned it. I am not very sure if this is what Michael is suggesting. Will resubmit the entire patch series. Thanks Baoquan
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web