* [net-next-2.6 PATCH 2/4] igb: Implement reading of reg RQDPC (Receive Queue Drop Packet Count)
2009-05-26 23:50 [net-next-2.6 PATCH 1/4] igb: add RQDPC (Receive Queue Drop Packet Count) register macro Jeff Kirsher
@ 2009-05-26 23:50 ` Jeff Kirsher
2009-05-27 3:36 ` David Miller
2009-05-26 23:50 ` [net-next-2.6 PATCH 3/4] igb: Record host memory receive overflow in net_stats Jeff Kirsher
` (2 subsequent siblings)
3 siblings, 1 reply; 8+ messages in thread
From: Jeff Kirsher @ 2009-05-26 23:50 UTC (permalink / raw)
To: davem; +Cc: netdev, Jeff Kirsher, Jesper Dangaard Brouer
From: Jesper Dangaard Brouer <hawk@comx.dk>
Based on the previous patches from Jesper Dangaard Brouer <hawk@comx.dk>
Implement reading the per queue drop stats register
RQDPC (Receive Queue Drop Packet Count). It counts the number of
packets dropped by a queue due to lack of descriptors available.
Notice RQDPC (Receive Queue Drop Packet Count) stats only gets
incremented, if the DROP_EN bit it set (in the SRRCTL register
for that queue). If DROP_EN bit is NOT set, then the some what
equivalent count is stored in RNBC (not per queue basis).
The RQDPC register is only 12 bit, thus the precision might
suffer due to overrun in-netween the watchdog polling interval.
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
CC: Jesper Dangaard Brouer <hawk@comx.dk>
---
drivers/net/igb/igb.h | 13 ++++++++++---
drivers/net/igb/igb_ethtool.c | 16 ++++++++++------
drivers/net/igb/igb_main.c | 19 ++++++++++++++++++-
3 files changed, 38 insertions(+), 10 deletions(-)
diff --git a/drivers/net/igb/igb.h b/drivers/net/igb/igb.h
index 154c5ac..b2c98de 100644
--- a/drivers/net/igb/igb.h
+++ b/drivers/net/igb/igb.h
@@ -137,11 +137,17 @@ struct igb_buffer {
};
};
-struct igb_queue_stats {
+struct igb_tx_queue_stats {
u64 packets;
u64 bytes;
};
+struct igb_rx_queue_stats {
+ u64 packets;
+ u64 bytes;
+ u64 drops;
+};
+
struct igb_ring {
struct igb_adapter *adapter; /* backlink */
void *desc; /* descriptor ring memory */
@@ -167,12 +173,13 @@ struct igb_ring {
union {
/* TX */
struct {
- struct igb_queue_stats tx_stats;
+ struct igb_tx_queue_stats tx_stats;
bool detect_tx_hung;
};
/* RX */
struct {
- struct igb_queue_stats rx_stats;
+ struct igb_rx_queue_stats rx_stats;
+ u64 rx_queue_drops;
struct napi_struct napi;
int set_itr;
struct igb_ring *buddy;
diff --git a/drivers/net/igb/igb_ethtool.c b/drivers/net/igb/igb_ethtool.c
index b8551a5..2ae98f9 100644
--- a/drivers/net/igb/igb_ethtool.c
+++ b/drivers/net/igb/igb_ethtool.c
@@ -96,9 +96,10 @@ static const struct igb_stats igb_gstrings_stats[] = {
};
#define IGB_QUEUE_STATS_LEN \
- ((((struct igb_adapter *)netdev_priv(netdev))->num_rx_queues + \
- ((struct igb_adapter *)netdev_priv(netdev))->num_tx_queues) * \
- (sizeof(struct igb_queue_stats) / sizeof(u64)))
+ (((((struct igb_adapter *)netdev_priv(netdev))->num_rx_queues)* \
+ (sizeof(struct igb_rx_queue_stats) / sizeof(u64))) + \
+ ((((struct igb_adapter *)netdev_priv(netdev))->num_tx_queues) * \
+ (sizeof(struct igb_tx_queue_stats) / sizeof(u64))))
#define IGB_GLOBAL_STATS_LEN \
sizeof(igb_gstrings_stats) / sizeof(struct igb_stats)
#define IGB_STATS_LEN (IGB_GLOBAL_STATS_LEN + IGB_QUEUE_STATS_LEN)
@@ -1960,7 +1961,8 @@ static void igb_get_ethtool_stats(struct net_device *netdev,
{
struct igb_adapter *adapter = netdev_priv(netdev);
u64 *queue_stat;
- int stat_count = sizeof(struct igb_queue_stats) / sizeof(u64);
+ int stat_count_tx = sizeof(struct igb_tx_queue_stats) / sizeof(u64);
+ int stat_count_rx = sizeof(struct igb_rx_queue_stats) / sizeof(u64);
int j;
int i;
@@ -1973,14 +1975,14 @@ static void igb_get_ethtool_stats(struct net_device *netdev,
for (j = 0; j < adapter->num_tx_queues; j++) {
int k;
queue_stat = (u64 *)&adapter->tx_ring[j].tx_stats;
- for (k = 0; k < stat_count; k++)
+ for (k = 0; k < stat_count_tx; k++)
data[i + k] = queue_stat[k];
i += k;
}
for (j = 0; j < adapter->num_rx_queues; j++) {
int k;
queue_stat = (u64 *)&adapter->rx_ring[j].rx_stats;
- for (k = 0; k < stat_count; k++)
+ for (k = 0; k < stat_count_rx; k++)
data[i + k] = queue_stat[k];
i += k;
}
@@ -2014,6 +2016,8 @@ static void igb_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
p += ETH_GSTRING_LEN;
sprintf(p, "rx_queue_%u_bytes", i);
p += ETH_GSTRING_LEN;
+ sprintf(p, "rx_queue_%u_drops", i);
+ p += ETH_GSTRING_LEN;
}
/* BUG_ON(p - data != IGB_STATS_LEN * ETH_GSTRING_LEN); */
break;
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c
index 2ec9809..4ae8133 100644
--- a/drivers/net/igb/igb_main.c
+++ b/drivers/net/igb/igb_main.c
@@ -3588,8 +3588,25 @@ void igb_update_stats(struct igb_adapter *adapter)
/* Rx Errors */
+ if (hw->mac.type != e1000_82575) {
+ u32 rqdpc_tmp;
+ int i;
+ /* Read out drops stats per RX queue. Notice RQDPC (Receive
+ * Queue Drop Packet Count) stats only gets incremented, if
+ * the DROP_EN but it set (in the SRRCTL register for that
+ * queue). If DROP_EN bit is NOT set, then the some what
+ * equivalent count is stored in RNBC (not per queue basis).
+ * Also note the drop count is due to lack of available
+ * descriptors.
+ */
+ for (i = 0; i < adapter->num_rx_queues; i++) {
+ rqdpc_tmp = rd32(E1000_RQDPC(i)) & 0xFFF;
+ adapter->rx_ring[i].rx_stats.drops += rqdpc_tmp;
+ }
+ }
+
/* RLEC on some newer hardware can be incorrect so build
- * our own version based on RUC and ROC */
+ * our own version based on RUC and ROC */
adapter->net_stats.rx_errors = adapter->stats.rxerrc +
adapter->stats.crcerrs + adapter->stats.algnerrc +
adapter->stats.ruc + adapter->stats.roc +
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [net-next-2.6 PATCH 2/4] igb: Implement reading of reg RQDPC (Receive Queue Drop Packet Count)
2009-05-26 23:50 ` [net-next-2.6 PATCH 2/4] igb: Implement reading of reg RQDPC (Receive Queue Drop Packet Count) Jeff Kirsher
@ 2009-05-27 3:36 ` David Miller
0 siblings, 0 replies; 8+ messages in thread
From: David Miller @ 2009-05-27 3:36 UTC (permalink / raw)
To: jeffrey.t.kirsher; +Cc: netdev, hawk
From: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Date: Tue, 26 May 2009 16:50:31 -0700
> Based on the previous patches from Jesper Dangaard Brouer <hawk@comx.dk>
>
> Implement reading the per queue drop stats register
> RQDPC (Receive Queue Drop Packet Count). It counts the number of
> packets dropped by a queue due to lack of descriptors available.
>
> Notice RQDPC (Receive Queue Drop Packet Count) stats only gets
> incremented, if the DROP_EN bit it set (in the SRRCTL register
> for that queue). If DROP_EN bit is NOT set, then the some what
> equivalent count is stored in RNBC (not per queue basis).
>
> The RQDPC register is only 12 bit, thus the precision might
> suffer due to overrun in-netween the watchdog polling interval.
>
> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Applied.
^ permalink raw reply [flat|nested] 8+ messages in thread
* [net-next-2.6 PATCH 3/4] igb: Record host memory receive overflow in net_stats
2009-05-26 23:50 [net-next-2.6 PATCH 1/4] igb: add RQDPC (Receive Queue Drop Packet Count) register macro Jeff Kirsher
2009-05-26 23:50 ` [net-next-2.6 PATCH 2/4] igb: Implement reading of reg RQDPC (Receive Queue Drop Packet Count) Jeff Kirsher
@ 2009-05-26 23:50 ` Jeff Kirsher
2009-05-27 3:36 ` David Miller
2009-05-26 23:51 ` [net-next-2.6 PATCH 4/4] igb/e1000e: update PSSR_MDIX value to reflect correct bit Jeff Kirsher
2009-05-27 3:36 ` [net-next-2.6 PATCH 1/4] igb: add RQDPC (Receive Queue Drop Packet Count) register macro David Miller
3 siblings, 1 reply; 8+ messages in thread
From: Jeff Kirsher @ 2009-05-26 23:50 UTC (permalink / raw)
To: davem; +Cc: netdev, Jeff Kirsher, Jesper Dangaard Brouer
From: Jesper Dangaard Brouer <hawk@comx.dk>
Based on previous patch from Jesper Dangaard Brouer.
The RNBC (Receive No Buffers Count) register for the 82576, indicate
that frames were received when there were no available buffers in host
memory to store those frames (receive descriptor head and tail
pointers were equal). The packet is still received by the NIC if
there is space in the FIFO on the NIC.
As the RNBC value is not a packet drop, the driver stores this value
in net_stats.rx_fifo_errors to indicate that there were no system
buffers available for the incoming packet. Actual dropped packets
are counted in the MPC value.
Saving the stats in dev->net_stats makes it visible via
/proc/net/dev as "fifo", and thus viewable to ifconfig
as "overruns" and 'netstat -i' as "RX-OVR".
The Receive No Buffers Count (RNBC) can already be queried by
ethtool -S as "rx_no_buffer_count".
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
CC: Jesper Dangaard Brouer <hawk@comx.dk>
---
drivers/net/igb/igb_ethtool.c | 1 +
drivers/net/igb/igb_main.c | 10 ++++++++++
2 files changed, 11 insertions(+), 0 deletions(-)
diff --git a/drivers/net/igb/igb_ethtool.c b/drivers/net/igb/igb_ethtool.c
index 2ae98f9..9598ac0 100644
--- a/drivers/net/igb/igb_ethtool.c
+++ b/drivers/net/igb/igb_ethtool.c
@@ -64,6 +64,7 @@ static const struct igb_stats igb_gstrings_stats[] = {
{ "rx_crc_errors", IGB_STAT(stats.crcerrs) },
{ "rx_frame_errors", IGB_STAT(net_stats.rx_frame_errors) },
{ "rx_no_buffer_count", IGB_STAT(stats.rnbc) },
+ { "rx_queue_drop_packet_count", IGB_STAT(net_stats.rx_fifo_errors) },
{ "rx_missed_errors", IGB_STAT(stats.mpc) },
{ "tx_aborted_errors", IGB_STAT(stats.ecol) },
{ "tx_carrier_errors", IGB_STAT(stats.tncrs) },
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c
index 4ae8133..8e93750 100644
--- a/drivers/net/igb/igb_main.c
+++ b/drivers/net/igb/igb_main.c
@@ -3590,6 +3590,7 @@ void igb_update_stats(struct igb_adapter *adapter)
if (hw->mac.type != e1000_82575) {
u32 rqdpc_tmp;
+ u64 rqdpc_total = 0;
int i;
/* Read out drops stats per RX queue. Notice RQDPC (Receive
* Queue Drop Packet Count) stats only gets incremented, if
@@ -3602,9 +3603,18 @@ void igb_update_stats(struct igb_adapter *adapter)
for (i = 0; i < adapter->num_rx_queues; i++) {
rqdpc_tmp = rd32(E1000_RQDPC(i)) & 0xFFF;
adapter->rx_ring[i].rx_stats.drops += rqdpc_tmp;
+ rqdpc_total += adapter->rx_ring[i].rx_stats.drops;
}
+ adapter->net_stats.rx_fifo_errors = rqdpc_total;
}
+ /* Note RNBC (Receive No Buffers Count) is an not an exact
+ * drop count as the hardware FIFO might save the day. Thats
+ * one of the reason for saving it in rx_fifo_errors, as its
+ * potentially not a true drop.
+ */
+ adapter->net_stats.rx_fifo_errors += adapter->stats.rnbc;
+
/* RLEC on some newer hardware can be incorrect so build
* our own version based on RUC and ROC */
adapter->net_stats.rx_errors = adapter->stats.rxerrc +
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [net-next-2.6 PATCH 3/4] igb: Record host memory receive overflow in net_stats
2009-05-26 23:50 ` [net-next-2.6 PATCH 3/4] igb: Record host memory receive overflow in net_stats Jeff Kirsher
@ 2009-05-27 3:36 ` David Miller
0 siblings, 0 replies; 8+ messages in thread
From: David Miller @ 2009-05-27 3:36 UTC (permalink / raw)
To: jeffrey.t.kirsher; +Cc: netdev, hawk
From: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Date: Tue, 26 May 2009 16:50:48 -0700
> Based on previous patch from Jesper Dangaard Brouer.
>
> The RNBC (Receive No Buffers Count) register for the 82576, indicate
> that frames were received when there were no available buffers in host
> memory to store those frames (receive descriptor head and tail
> pointers were equal). The packet is still received by the NIC if
> there is space in the FIFO on the NIC.
>
> As the RNBC value is not a packet drop, the driver stores this value
> in net_stats.rx_fifo_errors to indicate that there were no system
> buffers available for the incoming packet. Actual dropped packets
> are counted in the MPC value.
>
> Saving the stats in dev->net_stats makes it visible via
> /proc/net/dev as "fifo", and thus viewable to ifconfig
> as "overruns" and 'netstat -i' as "RX-OVR".
>
> The Receive No Buffers Count (RNBC) can already be queried by
> ethtool -S as "rx_no_buffer_count".
>
> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Applied.
^ permalink raw reply [flat|nested] 8+ messages in thread
* [net-next-2.6 PATCH 4/4] igb/e1000e: update PSSR_MDIX value to reflect correct bit
2009-05-26 23:50 [net-next-2.6 PATCH 1/4] igb: add RQDPC (Receive Queue Drop Packet Count) register macro Jeff Kirsher
2009-05-26 23:50 ` [net-next-2.6 PATCH 2/4] igb: Implement reading of reg RQDPC (Receive Queue Drop Packet Count) Jeff Kirsher
2009-05-26 23:50 ` [net-next-2.6 PATCH 3/4] igb: Record host memory receive overflow in net_stats Jeff Kirsher
@ 2009-05-26 23:51 ` Jeff Kirsher
2009-05-27 3:36 ` David Miller
2009-05-27 3:36 ` [net-next-2.6 PATCH 1/4] igb: add RQDPC (Receive Queue Drop Packet Count) register macro David Miller
3 siblings, 1 reply; 8+ messages in thread
From: Jeff Kirsher @ 2009-05-26 23:51 UTC (permalink / raw)
To: davem; +Cc: netdev, Alexander Duyck, Bruce Allan, Jeff Kirsher
From: Alexander Duyck <alexander.h.duyck@intel.com>
The phy port status register has the MDI-X status bit on bit 11, not bit 3
as is currently setup in the define. This patch corrects that so the
correct bit is checked on igp PHY types.
Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Acked-by: Bruce Allan <bruce.w.allan@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
---
drivers/net/e1000e/hw.h | 2 +-
drivers/net/igb/e1000_phy.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/e1000e/hw.h b/drivers/net/e1000e/hw.h
index d8b8229..6cdb703 100644
--- a/drivers/net/e1000e/hw.h
+++ b/drivers/net/e1000e/hw.h
@@ -253,7 +253,7 @@ enum e1e_registers {
#define IGP01E1000_PLHR_SS_DOWNGRADE 0x8000
#define IGP01E1000_PSSR_POLARITY_REVERSED 0x0002
-#define IGP01E1000_PSSR_MDIX 0x0008
+#define IGP01E1000_PSSR_MDIX 0x0800
#define IGP01E1000_PSSR_SPEED_MASK 0xC000
#define IGP01E1000_PSSR_SPEED_1000MBPS 0xC000
diff --git a/drivers/net/igb/e1000_phy.h b/drivers/net/igb/e1000_phy.h
index 3228a86..ebe4b61 100644
--- a/drivers/net/igb/e1000_phy.h
+++ b/drivers/net/igb/e1000_phy.h
@@ -80,7 +80,7 @@ s32 igb_phy_init_script_igp3(struct e1000_hw *hw);
#define IGP02E1000_PM_D3_LPLU 0x0004 /* For all other states */
#define IGP01E1000_PLHR_SS_DOWNGRADE 0x8000
#define IGP01E1000_PSSR_POLARITY_REVERSED 0x0002
-#define IGP01E1000_PSSR_MDIX 0x0008
+#define IGP01E1000_PSSR_MDIX 0x0800
#define IGP01E1000_PSSR_SPEED_MASK 0xC000
#define IGP01E1000_PSSR_SPEED_1000MBPS 0xC000
#define IGP02E1000_PHY_CHANNEL_NUM 4
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [net-next-2.6 PATCH 1/4] igb: add RQDPC (Receive Queue Drop Packet Count) register macro
2009-05-26 23:50 [net-next-2.6 PATCH 1/4] igb: add RQDPC (Receive Queue Drop Packet Count) register macro Jeff Kirsher
` (2 preceding siblings ...)
2009-05-26 23:51 ` [net-next-2.6 PATCH 4/4] igb/e1000e: update PSSR_MDIX value to reflect correct bit Jeff Kirsher
@ 2009-05-27 3:36 ` David Miller
3 siblings, 0 replies; 8+ messages in thread
From: David Miller @ 2009-05-27 3:36 UTC (permalink / raw)
To: jeffrey.t.kirsher; +Cc: netdev
From: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Date: Tue, 26 May 2009 16:50:15 -0700
> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Applied.
^ permalink raw reply [flat|nested] 8+ messages in thread