From 5765e132a070df19cdf1d3ac5d8ae9cccc62e764 Mon Sep 17 00:00:00 2001 From: Tianling Shen Date: Sun, 11 Sep 2022 13:43:57 +0800 Subject: [PATCH] kernel: igc: sync with upstream updates Signed-off-by: Tianling Shen --- .../drivers/net/ethernet/intel/igc/igc_main.c | 3 +++ .../drivers/net/ethernet/intel/igc/igc_ptp.c | 15 ++++++++++++++- .../drivers/net/ethernet/intel/igc/igc_regs.h | 5 ++++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/target/linux/x86/files-5.4/drivers/net/ethernet/intel/igc/igc_main.c b/target/linux/x86/files-5.4/drivers/net/ethernet/intel/igc/igc_main.c index f23bcefa96..f6679fc615 100644 --- a/target/linux/x86/files-5.4/drivers/net/ethernet/intel/igc/igc_main.c +++ b/target/linux/x86/files-5.4/drivers/net/ethernet/intel/igc/igc_main.c @@ -4942,6 +4942,9 @@ u32 igc_rd32(struct igc_hw *hw, u32 reg) u8 __iomem *hw_addr = READ_ONCE(hw->hw_addr); u32 value = 0; + if (IGC_REMOVED(hw_addr)) + return ~value; + value = readl(&hw_addr[reg]); /* reads should not return all F's */ diff --git a/target/linux/x86/files-5.4/drivers/net/ethernet/intel/igc/igc_ptp.c b/target/linux/x86/files-5.4/drivers/net/ethernet/intel/igc/igc_ptp.c index 4ab46eee3d..da92a2b49b 100644 --- a/target/linux/x86/files-5.4/drivers/net/ethernet/intel/igc/igc_ptp.c +++ b/target/linux/x86/files-5.4/drivers/net/ethernet/intel/igc/igc_ptp.c @@ -540,6 +540,17 @@ static void igc_ptp_time_restore(struct igc_adapter *adapter) igc_ptp_write_i225(adapter, &ts); } +static void igc_ptm_stop(struct igc_adapter *adapter) +{ + struct igc_hw *hw = &adapter->hw; + u32 ctrl; + + ctrl = rd32(IGC_PTM_CTRL); + ctrl &= ~IGC_PTM_CTRL_EN; + + wr32(IGC_PTM_CTRL, ctrl); +} + /** * igc_ptp_suspend - Disable PTP work items and prepare for suspend * @adapter: Board private structure @@ -557,8 +568,10 @@ void igc_ptp_suspend(struct igc_adapter *adapter) adapter->ptp_tx_skb = NULL; clear_bit_unlock(__IGC_PTP_TX_IN_PROGRESS, &adapter->state); - if (pci_device_is_present(adapter->pdev)) + if (pci_device_is_present(adapter->pdev)) { igc_ptp_time_save(adapter); + igc_ptm_stop(adapter); + } } /** diff --git a/target/linux/x86/files-5.4/drivers/net/ethernet/intel/igc/igc_regs.h b/target/linux/x86/files-5.4/drivers/net/ethernet/intel/igc/igc_regs.h index b52dd9d737..a273e1c33b 100644 --- a/target/linux/x86/files-5.4/drivers/net/ethernet/intel/igc/igc_regs.h +++ b/target/linux/x86/files-5.4/drivers/net/ethernet/intel/igc/igc_regs.h @@ -252,7 +252,8 @@ u32 igc_rd32(struct igc_hw *hw, u32 reg); #define wr32(reg, val) \ do { \ u8 __iomem *hw_addr = READ_ONCE((hw)->hw_addr); \ - writel((val), &hw_addr[(reg)]); \ + if (!IGC_REMOVED(hw_addr)) \ + writel((val), &hw_addr[(reg)]); \ } while (0) #define rd32(reg) (igc_rd32(hw, reg)) @@ -264,4 +265,6 @@ do { \ #define array_rd32(reg, offset) (igc_rd32(hw, (reg) + ((offset) << 2))) +#define IGC_REMOVED(h) unlikely(!(h)) + #endif