Commit cd502a7f authored by Artem Bityutskiy's avatar Artem Bityutskiy Committed by Jeff Kirsher

igb: add RR2DCDELAY to ethtool registers dump

This patch adds the RR2DCDELAY register to the ethtool registers dump.
RR2DCDELAY exists on I210 and I211 Intel Gigabit Ethernet chips and it stands
for "Read Request To Data Completion Delay". Here is how this register is
described in the I210 datasheet:

"This field captures the maximum PCIe split time in 16 ns units, which is the
maximum delay between the read request to the first data completion. This is
giving an estimation of the PCIe round trip time."

In other words, whenever I210 reads from the host memory (e.g., fetches a
descriptor from the ring), the chip measures every PCI DMA read transaction and
captures the maximum value. So it ends up containing the longest DMA
transaction time.

This register is very useful for troubleshooting and research purposes. If you
are dealing with time-sensitive networks, this register can help you get
an idea of your "I210-to-ring" latency. This helps answering questions like
"should I have PCIe ASPM enabled?" or "should I enable deep C-states?" on
my system.

It is safe to read this register at any point, reading it has no effect on
the I210 chip functionality.
Signed-off-by: default avatarArtem Bityutskiy <artem.bityutskiy@linux.intel.com>
Tested-by: default avatarAaron Brown <aaron.f.brown@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 9379b399
...@@ -409,6 +409,8 @@ do { \ ...@@ -409,6 +409,8 @@ do { \
#define E1000_I210_TQAVCC(_n) (0x3004 + ((_n) * 0x40)) #define E1000_I210_TQAVCC(_n) (0x3004 + ((_n) * 0x40))
#define E1000_I210_TQAVHC(_n) (0x300C + ((_n) * 0x40)) #define E1000_I210_TQAVHC(_n) (0x300C + ((_n) * 0x40))
#define E1000_I210_RR2DCDELAY 0x5BF4
#define E1000_INVM_DATA_REG(_n) (0x12120 + 4*(_n)) #define E1000_INVM_DATA_REG(_n) (0x12120 + 4*(_n))
#define E1000_INVM_SIZE 64 /* Number of INVM Data Registers */ #define E1000_INVM_SIZE 64 /* Number of INVM Data Registers */
......
...@@ -448,7 +448,7 @@ static void igb_set_msglevel(struct net_device *netdev, u32 data) ...@@ -448,7 +448,7 @@ static void igb_set_msglevel(struct net_device *netdev, u32 data)
static int igb_get_regs_len(struct net_device *netdev) static int igb_get_regs_len(struct net_device *netdev)
{ {
#define IGB_REGS_LEN 739 #define IGB_REGS_LEN 740
return IGB_REGS_LEN * sizeof(u32); return IGB_REGS_LEN * sizeof(u32);
} }
...@@ -710,6 +710,9 @@ static void igb_get_regs(struct net_device *netdev, ...@@ -710,6 +710,9 @@ static void igb_get_regs(struct net_device *netdev,
for (i = 0; i < 12; i++) for (i = 0; i < 12; i++)
regs_buff[727 + i] = rd32(E1000_TDWBAH(i + 4)); regs_buff[727 + i] = rd32(E1000_TDWBAH(i + 4));
} }
if (hw->mac.type == e1000_i210 || hw->mac.type == e1000_i211)
regs_buff[739] = rd32(E1000_I210_RR2DCDELAY);
} }
static int igb_get_eeprom_len(struct net_device *netdev) static int igb_get_eeprom_len(struct net_device *netdev)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment