aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/igb/igb_main.c
diff options
context:
space:
mode:
authorFujinaka, Todd <todd.fujinaka@intel.com>2014-03-13 04:29:01 +0000
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2014-03-21 03:00:49 -0700
commit22a8b2915998a5f35f659c1d419bd4bcbb1b6f41 (patch)
tree4a6f743aef13954e41acfada8bdf07e9cb6c4762 /drivers/net/ethernet/intel/igb/igb_main.c
parentigb: implement SIOCGHWTSTAMP ioctl (diff)
downloadlinux-dev-22a8b2915998a5f35f659c1d419bd4bcbb1b6f41.tar.xz
linux-dev-22a8b2915998a5f35f659c1d419bd4bcbb1b6f41.zip
igb: add register rd/wr for surprise removal
Add initial register rd/wr for surprise removal (LER). Signed-off-by: Todd Fujinaka <todd.fujinaka@intel.com> Tested-by: Aaron Brown <aaron.f.brown@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to '')
-rw-r--r--drivers/net/ethernet/intel/igb/igb_main.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index f623e6ce28c9..e8b4f7b3f03f 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -751,6 +751,28 @@ static void igb_cache_ring_register(struct igb_adapter *adapter)
}
}
+u32 igb_rd32(struct e1000_hw *hw, u32 reg)
+{
+ struct igb_adapter *igb = container_of(hw, struct igb_adapter, hw);
+ u8 __iomem *hw_addr = ACCESS_ONCE(hw->hw_addr);
+ u32 value = 0;
+
+ if (E1000_REMOVED(hw_addr))
+ return ~value;
+
+ value = readl(&hw_addr[reg]);
+
+ /* reads should not return all F's */
+ if (!(~value) && (!reg || !(~readl(hw_addr)))) {
+ struct net_device *netdev = igb->netdev;
+ hw->hw_addr = NULL;
+ netif_device_detach(netdev);
+ netdev_err(netdev, "PCIe link lost, device now detached\n");
+ }
+
+ return value;
+}
+
/**
* igb_write_ivar - configure ivar for given MSI-X vector
* @hw: pointer to the HW structure