aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw
diff options
context:
space:
mode:
authorFaisal Latif <faisal.latif@intel.com>2010-05-21 17:54:57 -0400
committerRoland Dreier <rolandd@cisco.com>2010-05-25 00:12:54 -0400
commit39942a028c559e39495ae7b29a8dd9b0c3c03003 (patch)
treeb01fa02fec4f4f8d82e174623a784084dc4043e3 /drivers/infiniband/hw
parenta0fe3cc5d36a5f5b4f60abfe1a4b1caf4a5cce5a (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/infiniband/hw')
-rw-r--r--drivers/infiniband/hw/nes/nes_nic.c72
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 9f4cadf9f85..242f42d8c1c 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
1005static const char nes_ethtool_stringset[][ETH_GSTRING_LEN] = { 1006static 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
1124static void nes_netdev_get_ethtool_stats(struct net_device *netdev, 1124static 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 */