@@ -27,7 +27,14 @@
#include <linux/if_vlan.h>
#include <linux/pci.h>
-#include "fm10k_type.h"
+#include "fm10k_common.h"
+
+struct fm10k_intfc {
+ struct pci_dev *pdev;
+
+ struct fm10k_hw hw;
+ u32 __iomem *uc_addr;
+};
/* main */
extern char fm10k_driver_name[];
similarity index 55%
copy from drivers/net/ethernet/intel/fm10k/fm10k.h
copy to drivers/net/ethernet/intel/fm10k/fm10k_common.h
@@ -18,22 +18,27 @@
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*/
-#ifndef _FM10K_H_
-#define _FM10K_H_
-
-#include <linux/types.h>
-#include <linux/etherdevice.h>
-#include <linux/rtnetlink.h>
-#include <linux/if_vlan.h>
-#include <linux/pci.h>
+#ifndef _FM10K_COMMON_H_
+#define _FM10K_COMMON_H_
#include "fm10k_type.h"
-/* main */
-extern char fm10k_driver_name[];
-extern const char fm10k_driver_version[];
+#define FM10K_REMOVED(hw_addr) unlikely(!(hw_addr))
+
+/* PCI configuration read */
+u16 fm10k_read_pci_cfg_word(struct fm10k_hw *hw, u32 reg);
+
+/* read operations, indexed using DWORDS */
+u32 fm10k_read_reg(struct fm10k_hw *hw, int reg);
+
+/* write operations, indexed using DWORDS */
+#define fm10k_write_reg(hw, reg, val) \
+do { \
+ u32 __iomem *hw_addr = ACCESS_ONCE((hw)->hw_addr); \
+ if (!FM10K_REMOVED(hw_addr)) \
+ writel((val), &hw_addr[(reg)]); \
+} while (0)
-/* PCI */
-int fm10k_register_pci_driver(void);
-void fm10k_unregister_pci_driver(void);
-#endif /* _FM10K_H_ */
+/* read ctrl register which has no clear on read fields as PCIe flush */
+#define fm10k_write_flush(hw) fm10k_read_reg((hw), FM10K_CTRL)
+#endif /* _FM10K_COMMON_H_ */
@@ -38,6 +38,36 @@ static const struct pci_device_id fm10k_pci_tbl[] = {
};
MODULE_DEVICE_TABLE(pci, fm10k_pci_tbl);
+u16 fm10k_read_pci_cfg_word(struct fm10k_hw *hw, u32 reg)
+{
+ struct fm10k_intfc *interface = hw->back;
+ u16 value = 0;
+
+ if (FM10K_REMOVED(hw->hw_addr))
+ return ~value;
+
+ pci_read_config_word(interface->pdev, reg, &value);
+ if (value == 0xFFFF)
+ fm10k_write_flush(hw);
+
+ return value;
+}
+
+u32 fm10k_read_reg(struct fm10k_hw *hw, int reg)
+{
+ u32 __iomem *hw_addr = ACCESS_ONCE(hw->hw_addr);
+ u32 value = 0;
+
+ if (FM10K_REMOVED(hw_addr))
+ return ~value;
+
+ value = readl(&hw_addr[reg]);
+ if (!(~value) && (!reg || !(~readl(hw_addr))))
+ hw->hw_addr = NULL;
+
+ return value;
+}
+
/**
* fm10k_probe - Device Initialization Routine
* @pdev: PCI device information struct