summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNoe Rubinstein <nrubinstein@avencall.com>2012-04-13 11:15:18 +0200
committerNoe Rubinstein <nrubinstein@avencall.com>2012-04-24 17:49:40 +0200
commitce946f1a84773ca4e1fa92d4ac5cae3d91cfa44f (patch)
tree7bc2472a11598a168017d2ba3ae47e906b1b5e8c
parenteca9a4602ba3e50cb9df41194a7d55fd4433bb3a (diff)
e1000: Add hack-ish register access debug mechanism
-rw-r--r--src/drivers/net/e1000/e1000_hw.h3
-rw-r--r--src/drivers/net/e1000/e1000_main.c2
-rw-r--r--src/drivers/net/e1000/e1000_osdep.h109
-rw-r--r--src/drivers/net/e1000/e1000_osdep_early.h21
4 files changed, 99 insertions, 36 deletions
diff --git a/src/drivers/net/e1000/e1000_hw.h b/src/drivers/net/e1000/e1000_hw.h
index 753f75e7..64a80fae 100644
--- a/src/drivers/net/e1000/e1000_hw.h
+++ b/src/drivers/net/e1000/e1000_hw.h
@@ -31,7 +31,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#ifndef _E1000_HW_H_
#define _E1000_HW_H_
-#include "e1000_osdep.h"
+#include "e1000_osdep_early.h" // XXX fix header dependancies -- see at bottom
#include "e1000_regs.h"
#include "e1000_defines.h"
@@ -725,4 +725,5 @@ s32 e1000_read_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value);
void e1000_read_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value);
void e1000_write_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value);
+#include "e1000_osdep.h" // XXX fix header dependancies
#endif
diff --git a/src/drivers/net/e1000/e1000_main.c b/src/drivers/net/e1000/e1000_main.c
index d8f9fb8d..c2355256 100644
--- a/src/drivers/net/e1000/e1000_main.c
+++ b/src/drivers/net/e1000/e1000_main.c
@@ -33,6 +33,8 @@ FILE_LICENCE ( GPL2_ONLY );
#include "e1000.h"
+int e1000_dbg_reg_access = 1;
+
/**
* e1000_irq_disable - Disable interrupt generation
*
diff --git a/src/drivers/net/e1000/e1000_osdep.h b/src/drivers/net/e1000/e1000_osdep.h
index 5cd8e391..fd301032 100644
--- a/src/drivers/net/e1000/e1000_osdep.h
+++ b/src/drivers/net/e1000/e1000_osdep.h
@@ -35,43 +35,35 @@ FILE_LICENCE ( GPL2_OR_LATER );
#ifndef _E1000_OSDEP_H_
#define _E1000_OSDEP_H_
-#define u8 unsigned char
-#define bool boolean_t
-#define dma_addr_t unsigned long
-#define __le16 uint16_t
-#define __le32 uint32_t
-#define __le64 uint64_t
+#include "e1000_osdep_early.h"
-#define __iomem
-
-#define ETH_FCS_LEN 4
-
-typedef int spinlock_t;
-typedef enum {
- false = 0,
- true = 1
-} boolean_t;
+u32 e1000_translate_register_82542(u32 reg);
+#define E1000_REGISTER(a, reg) (((a)->mac.type >= e1000_82543) \
+ ? reg \
+ : e1000_translate_register_82542(reg))
-#define usec_delay(x) udelay(x)
-#define msec_delay(x) mdelay(x)
-#define msec_delay_irq(x) mdelay(x)
+#define E1000_WRITE_FLUSH(a) E1000_READ_REG(a, E1000_STATUS)
-#define PCI_COMMAND_REGISTER PCI_COMMAND
-#define CMD_MEM_WRT_INVALIDATE PCI_COMMAND_INVALIDATE
-#define ETH_ADDR_LEN ETH_ALEN
+#define DBGF DEBUGFUNC(__func__)
+#define DEBUGFUNC(F) DBG("%s\n", F)
-#define DEBUGFUNC(F) DBG(F "\n")
+#undef DEBUG_REGS
-#define DEBUGOUT(S) DBG(S)
-#define DEBUGOUT1(S, A...) DBG(S, A)
+#define E1000_DUMP_CNTR(a, reg) e1000_dump_cntr(a, reg, #reg)
+static inline u32 e1000_dump_cntr(struct e1000_hw *a, u32 reg, char *regname)
+{
+ u32 res = readl((a)->hw_addr + E1000_REGISTER(a, reg));
+#ifdef DEBUG_REGS
+ if (res)
+ dbg_printf("NON-ZERO ERROR COUNTER: %s -> 0x%08x\n", regname, res);
+#else
+ (void) regname;
+#endif
+ return res;
+}
+#ifndef DEBUG_REGS
-#define DEBUGOUT2 DEBUGOUT1
-#define DEBUGOUT3 DEBUGOUT2
-#define DEBUGOUT7 DEBUGOUT3
-
-#define E1000_REGISTER(a, reg) (((a)->mac.type >= e1000_82543) \
- ? reg \
- : e1000_translate_register_82542(reg))
+#define SILENT
#define E1000_WRITE_REG(a, reg, value) \
writel((value), ((a)->hw_addr + E1000_REGISTER(a, reg)))
@@ -99,11 +91,9 @@ typedef enum {
#define E1000_READ_REG_ARRAY_BYTE(a, reg, offset) ( \
readb((a)->hw_addr + E1000_REGISTER(a, reg) + (offset)))
-#define E1000_WRITE_REG_IO(a, reg, offset) do { \
+#define E1000_WRITE_REG_IO(a, reg, value) do { \
outl(reg, ((a)->io_base)); \
- outl(offset, ((a)->io_base + 4)); } while(0)
-
-#define E1000_WRITE_FLUSH(a) E1000_READ_REG(a, E1000_STATUS)
+ outl(value, ((a)->io_base + 4)); } while(0)
#define E1000_WRITE_FLASH_REG(a, reg, value) ( \
writel((value), ((a)->flash_address + reg)))
@@ -115,4 +105,53 @@ typedef enum {
#define E1000_READ_FLASH_REG16(a, reg) (readw((a)->flash_address + reg))
+#else
+
+extern int e1000_dbg_reg_access;
+
+#define SILENT for(e1000_dbg_reg_access = 0; \
+ !e1000_dbg_reg_access; \
+ e1000_dbg_reg_access = 1)
+
+static inline void e1000_write_reg(struct e1000_hw *a, u32 reg, u32 value, char *regname)
+{
+ if (e1000_dbg_reg_access) dbg_printf("%s <- 0x%08x\n", regname, value);
+ writel((value), ((a)->hw_addr + E1000_REGISTER(a, reg)));
+}
+
+static inline u32 e1000_read_reg(struct e1000_hw *a, u32 reg, char *regname)
+{
+ u32 res = readl((a)->hw_addr + E1000_REGISTER(a, reg));
+ if (e1000_dbg_reg_access) dbg_printf("%s -> 0x%08x\n", regname, res);
+ return res;
+}
+
+static inline void e1000_write_reg_array(struct e1000_hw *a, u32 reg, int offset, u32 value, char *regname)
+{
+ if (e1000_dbg_reg_access) dbg_printf("%s[%d] <- 0x%08x\n", regname, offset, value);
+ writel((value), ((a)->hw_addr + E1000_REGISTER(a, reg) + ((offset) << 2)));
+}
+
+static inline u32 e1000_read_reg_array(struct e1000_hw *a, u32 reg, int offset, char *regname)
+{
+ u32 res = readl((a)->hw_addr + E1000_REGISTER(a, reg) + ((offset) << 2));
+ if (e1000_dbg_reg_access) dbg_printf("%s[%d] -> 0x%08x\n", regname, offset, res);
+ return res;
+}
+
+static inline void e1000_write_reg_io(struct e1000_hw *a, u32 reg, u32 value, char *regname)
+{
+ if (e1000_dbg_reg_access) dbg_printf("%s <--IO-- 0x%08x\n", regname, value);
+ outl(reg, ((a)->io_base));
+ outl(value, ((a)->io_base + 4));
+}
+
+#define E1000_WRITE_REG(a, reg, value) e1000_write_reg(a, reg, value, #reg)
+#define E1000_READ_REG(a, reg) e1000_read_reg(a, reg, #reg)
+#define E1000_WRITE_REG_ARRAY(a, reg, offset, value) e1000_write_reg_array(a, reg, offset, value, #reg)
+#define E1000_READ_REG_ARRAY(a, reg, offset) e1000_read_reg_array(a, reg, offset, #reg)
+#define E1000_WRITE_REG_IO(a, reg, value) e1000_write_reg_io(a, reg, value, #reg)
+
+#endif
+
#endif /* _E1000_OSDEP_H_ */
diff --git a/src/drivers/net/e1000/e1000_osdep_early.h b/src/drivers/net/e1000/e1000_osdep_early.h
new file mode 100644
index 00000000..3545c848
--- /dev/null
+++ b/src/drivers/net/e1000/e1000_osdep_early.h
@@ -0,0 +1,21 @@
+// XXX fix header dependancies
+
+#ifndef _E1000_OSDEP_EARLY_H_
+#define _E1000_OSDEP_EARLY_H_
+
+#define bool boolean_t
+#define dma_addr_t unsigned long
+#define __le16 u16
+#define __le32 u32
+#define __le64 u64
+
+#define __iomem
+
+#define ETH_FCS_LEN 4
+
+typedef enum {
+ false = 0,
+ true = 1
+} boolean_t;
+
+#endif