diff options
author | Faisal Latif <faisal.latif@intel.com> | 2010-05-21 17:54:57 -0400 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2010-05-25 00:12:54 -0400 |
commit | 39942a028c559e39495ae7b29a8dd9b0c3c03003 (patch) | |
tree | b01fa02fec4f4f8d82e174623a784084dc4043e3 /drivers | |
parent | a0fe3cc5d36a5f5b4f60abfe1a4b1caf4a5cce5a (diff) |
RDMA/nes: Have ethtool read hardware registers for rx/tx stats
Enhance ethtool to read hardware registers for rcv/tx error stats.
Also add support for free pbl resources. Remove cq depth stats, which
are not used.
Signed-off-by: Faisal Latif <faisal.latif@intel.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/infiniband/hw/nes/nes_nic.c | 72 |
1 files changed, 55 insertions, 17 deletions
diff --git a/drivers/infiniband/hw/nes/nes_nic.c b/drivers/infiniband/hw/nes/nes_nic.c index 9f4cadf9f851..242f42d8c1c6 100644 --- a/drivers/infiniband/hw/nes/nes_nic.c +++ b/drivers/infiniband/hw/nes/nes_nic.c | |||
@@ -1002,6 +1002,7 @@ static int nes_netdev_change_mtu(struct net_device *netdev, int new_mtu) | |||
1002 | return ret; | 1002 | return ret; |
1003 | } | 1003 | } |
1004 | 1004 | ||
1005 | |||
1005 | static const char nes_ethtool_stringset[][ETH_GSTRING_LEN] = { | 1006 | static const char nes_ethtool_stringset[][ETH_GSTRING_LEN] = { |
1006 | "Link Change Interrupts", | 1007 | "Link Change Interrupts", |
1007 | "Linearized SKBs", | 1008 | "Linearized SKBs", |
@@ -1016,11 +1017,15 @@ static const char nes_ethtool_stringset[][ETH_GSTRING_LEN] = { | |||
1016 | "Rx Jabber Errors", | 1017 | "Rx Jabber Errors", |
1017 | "Rx Oversized Frames", | 1018 | "Rx Oversized Frames", |
1018 | "Rx Short Frames", | 1019 | "Rx Short Frames", |
1020 | "Rx Length Errors", | ||
1021 | "Rx CRC Errors", | ||
1022 | "Rx Port Discard", | ||
1019 | "Endnode Rx Discards", | 1023 | "Endnode Rx Discards", |
1020 | "Endnode Rx Octets", | 1024 | "Endnode Rx Octets", |
1021 | "Endnode Rx Frames", | 1025 | "Endnode Rx Frames", |
1022 | "Endnode Tx Octets", | 1026 | "Endnode Tx Octets", |
1023 | "Endnode Tx Frames", | 1027 | "Endnode Tx Frames", |
1028 | "Tx Errors", | ||
1024 | "mh detected", | 1029 | "mh detected", |
1025 | "mh pauses", | 1030 | "mh pauses", |
1026 | "Retransmission Count", | 1031 | "Retransmission Count", |
@@ -1049,19 +1054,13 @@ static const char nes_ethtool_stringset[][ETH_GSTRING_LEN] = { | |||
1049 | "CM Nodes Destroyed", | 1054 | "CM Nodes Destroyed", |
1050 | "CM Accel Drops", | 1055 | "CM Accel Drops", |
1051 | "CM Resets Received", | 1056 | "CM Resets Received", |
1057 | "Free 4Kpbls", | ||
1058 | "Free 256pbls", | ||
1052 | "Timer Inits", | 1059 | "Timer Inits", |
1053 | "CQ Depth 1", | ||
1054 | "CQ Depth 4", | ||
1055 | "CQ Depth 16", | ||
1056 | "CQ Depth 24", | ||
1057 | "CQ Depth 32", | ||
1058 | "CQ Depth 128", | ||
1059 | "CQ Depth 256", | ||
1060 | "LRO aggregated", | 1060 | "LRO aggregated", |
1061 | "LRO flushed", | 1061 | "LRO flushed", |
1062 | "LRO no_desc", | 1062 | "LRO no_desc", |
1063 | }; | 1063 | }; |
1064 | |||
1065 | #define NES_ETHTOOL_STAT_COUNT ARRAY_SIZE(nes_ethtool_stringset) | 1064 | #define NES_ETHTOOL_STAT_COUNT ARRAY_SIZE(nes_ethtool_stringset) |
1066 | 1065 | ||
1067 | /** | 1066 | /** |
@@ -1121,12 +1120,14 @@ static void nes_netdev_get_strings(struct net_device *netdev, u32 stringset, | |||
1121 | /** | 1120 | /** |
1122 | * nes_netdev_get_ethtool_stats | 1121 | * nes_netdev_get_ethtool_stats |
1123 | */ | 1122 | */ |
1123 | |||
1124 | static void nes_netdev_get_ethtool_stats(struct net_device *netdev, | 1124 | static void nes_netdev_get_ethtool_stats(struct net_device *netdev, |
1125 | struct ethtool_stats *target_ethtool_stats, u64 *target_stat_values) | 1125 | struct ethtool_stats *target_ethtool_stats, u64 *target_stat_values) |
1126 | { | 1126 | { |
1127 | u64 u64temp; | 1127 | u64 u64temp; |
1128 | struct nes_vnic *nesvnic = netdev_priv(netdev); | 1128 | struct nes_vnic *nesvnic = netdev_priv(netdev); |
1129 | struct nes_device *nesdev = nesvnic->nesdev; | 1129 | struct nes_device *nesdev = nesvnic->nesdev; |
1130 | struct nes_adapter *nesadapter = nesdev->nesadapter; | ||
1130 | u32 nic_count; | 1131 | u32 nic_count; |
1131 | u32 u32temp; | 1132 | u32 u32temp; |
1132 | u32 index = 0; | 1133 | u32 index = 0; |
@@ -1155,6 +1156,46 @@ static void nes_netdev_get_ethtool_stats(struct net_device *netdev, | |||
1155 | nesvnic->nesdev->port_tx_discards += u32temp; | 1156 | nesvnic->nesdev->port_tx_discards += u32temp; |
1156 | nesvnic->netstats.tx_dropped += u32temp; | 1157 | nesvnic->netstats.tx_dropped += u32temp; |
1157 | 1158 | ||
1159 | u32temp = nes_read_indexed(nesdev, | ||
1160 | NES_IDX_MAC_RX_SHORT_FRAMES + (nesvnic->nesdev->mac_index*0x200)); | ||
1161 | nesvnic->netstats.rx_dropped += u32temp; | ||
1162 | nesvnic->nesdev->mac_rx_errors += u32temp; | ||
1163 | nesvnic->nesdev->mac_rx_short_frames += u32temp; | ||
1164 | |||
1165 | u32temp = nes_read_indexed(nesdev, | ||
1166 | NES_IDX_MAC_RX_OVERSIZED_FRAMES + (nesvnic->nesdev->mac_index*0x200)); | ||
1167 | nesvnic->netstats.rx_dropped += u32temp; | ||
1168 | nesvnic->nesdev->mac_rx_errors += u32temp; | ||
1169 | nesvnic->nesdev->mac_rx_oversized_frames += u32temp; | ||
1170 | |||
1171 | u32temp = nes_read_indexed(nesdev, | ||
1172 | NES_IDX_MAC_RX_JABBER_FRAMES + (nesvnic->nesdev->mac_index*0x200)); | ||
1173 | nesvnic->netstats.rx_dropped += u32temp; | ||
1174 | nesvnic->nesdev->mac_rx_errors += u32temp; | ||
1175 | nesvnic->nesdev->mac_rx_jabber_frames += u32temp; | ||
1176 | |||
1177 | u32temp = nes_read_indexed(nesdev, | ||
1178 | NES_IDX_MAC_RX_SYMBOL_ERR_FRAMES + (nesvnic->nesdev->mac_index*0x200)); | ||
1179 | nesvnic->netstats.rx_dropped += u32temp; | ||
1180 | nesvnic->nesdev->mac_rx_errors += u32temp; | ||
1181 | nesvnic->nesdev->mac_rx_symbol_err_frames += u32temp; | ||
1182 | |||
1183 | u32temp = nes_read_indexed(nesdev, | ||
1184 | NES_IDX_MAC_RX_LENGTH_ERR_FRAMES + (nesvnic->nesdev->mac_index*0x200)); | ||
1185 | nesvnic->netstats.rx_length_errors += u32temp; | ||
1186 | nesvnic->nesdev->mac_rx_errors += u32temp; | ||
1187 | |||
1188 | u32temp = nes_read_indexed(nesdev, | ||
1189 | NES_IDX_MAC_RX_CRC_ERR_FRAMES + (nesvnic->nesdev->mac_index*0x200)); | ||
1190 | nesvnic->nesdev->mac_rx_errors += u32temp; | ||
1191 | nesvnic->nesdev->mac_rx_crc_errors += u32temp; | ||
1192 | nesvnic->netstats.rx_crc_errors += u32temp; | ||
1193 | |||
1194 | u32temp = nes_read_indexed(nesdev, | ||
1195 | NES_IDX_MAC_TX_ERRORS + (nesvnic->nesdev->mac_index*0x200)); | ||
1196 | nesvnic->nesdev->mac_tx_errors += u32temp; | ||
1197 | nesvnic->netstats.tx_errors += u32temp; | ||
1198 | |||
1158 | for (nic_count = 0; nic_count < NES_MAX_PORT_COUNT; nic_count++) { | 1199 | for (nic_count = 0; nic_count < NES_MAX_PORT_COUNT; nic_count++) { |
1159 | if (nesvnic->qp_nic_index[nic_count] == 0xf) | 1200 | if (nesvnic->qp_nic_index[nic_count] == 0xf) |
1160 | break; | 1201 | break; |
@@ -1219,11 +1260,15 @@ static void nes_netdev_get_ethtool_stats(struct net_device *netdev, | |||
1219 | target_stat_values[++index] = nesvnic->nesdev->mac_rx_jabber_frames; | 1260 | target_stat_values[++index] = nesvnic->nesdev->mac_rx_jabber_frames; |
1220 | target_stat_values[++index] = nesvnic->nesdev->mac_rx_oversized_frames; | 1261 | target_stat_values[++index] = nesvnic->nesdev->mac_rx_oversized_frames; |
1221 | target_stat_values[++index] = nesvnic->nesdev->mac_rx_short_frames; | 1262 | target_stat_values[++index] = nesvnic->nesdev->mac_rx_short_frames; |
1263 | target_stat_values[++index] = nesvnic->netstats.rx_length_errors; | ||
1264 | target_stat_values[++index] = nesvnic->nesdev->mac_rx_crc_errors; | ||
1265 | target_stat_values[++index] = nesvnic->nesdev->port_rx_discards; | ||
1222 | target_stat_values[++index] = nesvnic->endnode_nstat_rx_discard; | 1266 | target_stat_values[++index] = nesvnic->endnode_nstat_rx_discard; |
1223 | target_stat_values[++index] = nesvnic->endnode_nstat_rx_octets; | 1267 | target_stat_values[++index] = nesvnic->endnode_nstat_rx_octets; |
1224 | target_stat_values[++index] = nesvnic->endnode_nstat_rx_frames; | 1268 | target_stat_values[++index] = nesvnic->endnode_nstat_rx_frames; |
1225 | target_stat_values[++index] = nesvnic->endnode_nstat_tx_octets; | 1269 | target_stat_values[++index] = nesvnic->endnode_nstat_tx_octets; |
1226 | target_stat_values[++index] = nesvnic->endnode_nstat_tx_frames; | 1270 | target_stat_values[++index] = nesvnic->endnode_nstat_tx_frames; |
1271 | target_stat_values[++index] = nesvnic->nesdev->mac_tx_errors; | ||
1227 | target_stat_values[++index] = mh_detected; | 1272 | target_stat_values[++index] = mh_detected; |
1228 | target_stat_values[++index] = mh_pauses_sent; | 1273 | target_stat_values[++index] = mh_pauses_sent; |
1229 | target_stat_values[++index] = nesvnic->endnode_ipv4_tcp_retransmits; | 1274 | target_stat_values[++index] = nesvnic->endnode_ipv4_tcp_retransmits; |
@@ -1252,21 +1297,14 @@ static void nes_netdev_get_ethtool_stats(struct net_device *netdev, | |||
1252 | target_stat_values[++index] = atomic_read(&cm_nodes_destroyed); | 1297 | target_stat_values[++index] = atomic_read(&cm_nodes_destroyed); |
1253 | target_stat_values[++index] = atomic_read(&cm_accel_dropped_pkts); | 1298 | target_stat_values[++index] = atomic_read(&cm_accel_dropped_pkts); |
1254 | target_stat_values[++index] = atomic_read(&cm_resets_recvd); | 1299 | target_stat_values[++index] = atomic_read(&cm_resets_recvd); |
1300 | target_stat_values[++index] = nesadapter->free_4kpbl; | ||
1301 | target_stat_values[++index] = nesadapter->free_256pbl; | ||
1255 | target_stat_values[++index] = int_mod_timer_init; | 1302 | target_stat_values[++index] = int_mod_timer_init; |
1256 | target_stat_values[++index] = int_mod_cq_depth_1; | ||
1257 | target_stat_values[++index] = int_mod_cq_depth_4; | ||
1258 | target_stat_values[++index] = int_mod_cq_depth_16; | ||
1259 | target_stat_values[++index] = int_mod_cq_depth_24; | ||
1260 | target_stat_values[++index] = int_mod_cq_depth_32; | ||
1261 | target_stat_values[++index] = int_mod_cq_depth_128; | ||
1262 | target_stat_values[++index] = int_mod_cq_depth_256; | ||
1263 | target_stat_values[++index] = nesvnic->lro_mgr.stats.aggregated; | 1303 | target_stat_values[++index] = nesvnic->lro_mgr.stats.aggregated; |
1264 | target_stat_values[++index] = nesvnic->lro_mgr.stats.flushed; | 1304 | target_stat_values[++index] = nesvnic->lro_mgr.stats.flushed; |
1265 | target_stat_values[++index] = nesvnic->lro_mgr.stats.no_desc; | 1305 | target_stat_values[++index] = nesvnic->lro_mgr.stats.no_desc; |
1266 | |||
1267 | } | 1306 | } |
1268 | 1307 | ||
1269 | |||
1270 | /** | 1308 | /** |
1271 | * nes_netdev_get_drvinfo | 1309 | * nes_netdev_get_drvinfo |
1272 | */ | 1310 | */ |