aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2016-11-14 16:20:54 -0500
committerDavid S. Miller <davem@davemloft.net>2016-11-14 16:20:54 -0500
commit193f5122878c5d4d30dbfc9128affe58bdd18206 (patch)
tree31491c40f00c8b5a9f0fe2d7fc2a1bbcf878578f
parent7020637bdf59589a403e01aca128bef643404317 (diff)
parent6df77862f63f389df3b1ad879738e04440d7385d (diff)
Merge branch 'bnx2-kdump-fix'
Baoquan He says: ==================== bnx2: Wait for in-flight DMA to complete at probe stage This is v2 post. In commit 3e1be7a ("bnx2: Reset device during driver initialization"), firmware requesting code was moved from open stage to probe stage. The reason is in kdump kernel hardware iommu need device be reset in driver probe stage, otherwise those in-flight DMA from 1st kernel will continue going and look up into the newly created io-page tables. However bnx2 chip resetting involves firmware requesting issue, that need be done in open stage. Michale Chan suggested we can just wait for the old in-flight DMA to complete at probe stage, then though without device resetting, we don't need to worry the old in-flight DMA could continue looking up the newly created io-page tables. 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. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/broadcom/bnx2.c48
1 files changed, 36 insertions, 12 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2.c b/drivers/net/ethernet/broadcom/bnx2.c
index b3791b394715..1f7034d739b0 100644
--- a/drivers/net/ethernet/broadcom/bnx2.c
+++ b/drivers/net/ethernet/broadcom/bnx2.c
@@ -49,6 +49,7 @@
49#include <linux/firmware.h> 49#include <linux/firmware.h>
50#include <linux/log2.h> 50#include <linux/log2.h>
51#include <linux/aer.h> 51#include <linux/aer.h>
52#include <linux/crash_dump.h>
52 53
53#if IS_ENABLED(CONFIG_CNIC) 54#if IS_ENABLED(CONFIG_CNIC)
54#define BCM_CNIC 1 55#define BCM_CNIC 1
@@ -4764,15 +4765,16 @@ bnx2_setup_msix_tbl(struct bnx2 *bp)
4764 BNX2_WR(bp, BNX2_PCI_GRC_WINDOW3_ADDR, BNX2_MSIX_PBA_ADDR); 4765 BNX2_WR(bp, BNX2_PCI_GRC_WINDOW3_ADDR, BNX2_MSIX_PBA_ADDR);
4765} 4766}
4766 4767
4767static int 4768static void
4768bnx2_reset_chip(struct bnx2 *bp, u32 reset_code) 4769bnx2_wait_dma_complete(struct bnx2 *bp)
4769{ 4770{
4770 u32 val; 4771 u32 val;
4771 int i, rc = 0; 4772 int i;
4772 u8 old_port;
4773 4773
4774 /* Wait for the current PCI transaction to complete before 4774 /*
4775 * issuing a reset. */ 4775 * Wait for the current PCI transaction to complete before
4776 * issuing a reset.
4777 */
4776 if ((BNX2_CHIP(bp) == BNX2_CHIP_5706) || 4778 if ((BNX2_CHIP(bp) == BNX2_CHIP_5706) ||
4777 (BNX2_CHIP(bp) == BNX2_CHIP_5708)) { 4779 (BNX2_CHIP(bp) == BNX2_CHIP_5708)) {
4778 BNX2_WR(bp, BNX2_MISC_ENABLE_CLR_BITS, 4780 BNX2_WR(bp, BNX2_MISC_ENABLE_CLR_BITS,
@@ -4796,6 +4798,21 @@ bnx2_reset_chip(struct bnx2 *bp, u32 reset_code)
4796 } 4798 }
4797 } 4799 }
4798 4800
4801 return;
4802}
4803
4804
4805static int
4806bnx2_reset_chip(struct bnx2 *bp, u32 reset_code)
4807{
4808 u32 val;
4809 int i, rc = 0;
4810 u8 old_port;
4811
4812 /* Wait for the current PCI transaction to complete before
4813 * issuing a reset. */
4814 bnx2_wait_dma_complete(bp);
4815
4799 /* Wait for the firmware to tell us it is ok to issue a reset. */ 4816 /* Wait for the firmware to tell us it is ok to issue a reset. */
4800 bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT0 | reset_code, 1, 1); 4817 bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT0 | reset_code, 1, 1);
4801 4818
@@ -6361,6 +6378,10 @@ bnx2_open(struct net_device *dev)
6361 struct bnx2 *bp = netdev_priv(dev); 6378 struct bnx2 *bp = netdev_priv(dev);
6362 int rc; 6379 int rc;
6363 6380
6381 rc = bnx2_request_firmware(bp);
6382 if (rc < 0)
6383 goto out;
6384
6364 netif_carrier_off(dev); 6385 netif_carrier_off(dev);
6365 6386
6366 bnx2_disable_int(bp); 6387 bnx2_disable_int(bp);
@@ -6429,6 +6450,7 @@ open_err:
6429 bnx2_free_irq(bp); 6450 bnx2_free_irq(bp);
6430 bnx2_free_mem(bp); 6451 bnx2_free_mem(bp);
6431 bnx2_del_napi(bp); 6452 bnx2_del_napi(bp);
6453 bnx2_release_firmware(bp);
6432 goto out; 6454 goto out;
6433} 6455}
6434 6456
@@ -8575,12 +8597,15 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
8575 8597
8576 pci_set_drvdata(pdev, dev); 8598 pci_set_drvdata(pdev, dev);
8577 8599
8578 rc = bnx2_request_firmware(bp); 8600 /*
8579 if (rc < 0) 8601 * In-flight DMA from 1st kernel could continue going in kdump kernel.
8580 goto error; 8602 * New io-page table has been created before bnx2 does reset at open stage.
8581 8603 * We have to wait for the in-flight DMA to complete to avoid it look up
8604 * into the newly created io-page table.
8605 */
8606 if (is_kdump_kernel())
8607 bnx2_wait_dma_complete(bp);
8582 8608
8583 bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_RESET);
8584 memcpy(dev->dev_addr, bp->mac_addr, ETH_ALEN); 8609 memcpy(dev->dev_addr, bp->mac_addr, ETH_ALEN);
8585 8610
8586 dev->hw_features = NETIF_F_IP_CSUM | NETIF_F_SG | 8611 dev->hw_features = NETIF_F_IP_CSUM | NETIF_F_SG |
@@ -8613,7 +8638,6 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
8613 return 0; 8638 return 0;
8614 8639
8615error: 8640error:
8616 bnx2_release_firmware(bp);
8617 pci_iounmap(pdev, bp->regview); 8641 pci_iounmap(pdev, bp->regview);
8618 pci_release_regions(pdev); 8642 pci_release_regions(pdev);
8619 pci_disable_device(pdev); 8643 pci_disable_device(pdev);