aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-3945.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-debugfs.c629
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-dev.h4
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-rx.c41
4 files changed, 447 insertions, 229 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c
index 314cae77364..cee03e7fc2d 100644
--- a/drivers/net/wireless/iwlwifi/iwl-3945.c
+++ b/drivers/net/wireless/iwlwifi/iwl-3945.c
@@ -361,8 +361,6 @@ void iwl3945_hw_rx_statistics(struct iwl_priv *priv,
361 memcpy(&priv->statistics_39, pkt->u.raw, sizeof(priv->statistics_39)); 361 memcpy(&priv->statistics_39, pkt->u.raw, sizeof(priv->statistics_39));
362 362
363 iwl_leds_background(priv); 363 iwl_leds_background(priv);
364
365 priv->last_statistics_time = jiffies;
366} 364}
367 365
368/****************************************************************************** 366/******************************************************************************
diff --git a/drivers/net/wireless/iwlwifi/iwl-debugfs.c b/drivers/net/wireless/iwlwifi/iwl-debugfs.c
index 028d4bf8dcd..2cd11ba9637 100644
--- a/drivers/net/wireless/iwlwifi/iwl-debugfs.c
+++ b/drivers/net/wireless/iwlwifi/iwl-debugfs.c
@@ -1079,10 +1079,10 @@ static ssize_t iwl_dbgfs_ucode_rx_stats_read(struct file *file,
1079 sizeof(struct statistics_rx_non_phy) * 20 + 1079 sizeof(struct statistics_rx_non_phy) * 20 +
1080 sizeof(struct statistics_rx_ht_phy) * 20 + 400; 1080 sizeof(struct statistics_rx_ht_phy) * 20 + 400;
1081 ssize_t ret; 1081 ssize_t ret;
1082 struct statistics_rx_phy *ofdm; 1082 struct statistics_rx_phy *ofdm, *accum_ofdm;
1083 struct statistics_rx_phy *cck; 1083 struct statistics_rx_phy *cck, *accum_cck;
1084 struct statistics_rx_non_phy *general; 1084 struct statistics_rx_non_phy *general, *accum_general;
1085 struct statistics_rx_ht_phy *ht; 1085 struct statistics_rx_ht_phy *ht, *accum_ht;
1086 1086
1087 if (!iwl_is_alive(priv)) 1087 if (!iwl_is_alive(priv))
1088 return -EAGAIN; 1088 return -EAGAIN;
@@ -1111,155 +1111,268 @@ static ssize_t iwl_dbgfs_ucode_rx_stats_read(struct file *file,
1111 cck = &priv->statistics.rx.cck; 1111 cck = &priv->statistics.rx.cck;
1112 general = &priv->statistics.rx.general; 1112 general = &priv->statistics.rx.general;
1113 ht = &priv->statistics.rx.ofdm_ht; 1113 ht = &priv->statistics.rx.ofdm_ht;
1114 accum_ofdm = &priv->accum_statistics.rx.ofdm;
1115 accum_cck = &priv->accum_statistics.rx.cck;
1116 accum_general = &priv->accum_statistics.rx.general;
1117 accum_ht = &priv->accum_statistics.rx.ofdm_ht;
1114 pos += iwl_dbgfs_statistics_flag(priv, buf, bufsz); 1118 pos += iwl_dbgfs_statistics_flag(priv, buf, bufsz);
1115 pos += scnprintf(buf + pos, bufsz - pos, "Statistics_Rx - OFDM:\n"); 1119 pos += scnprintf(buf + pos, bufsz - pos, "Statistics_Rx - OFDM:\n");
1116 pos += scnprintf(buf + pos, bufsz - pos, "ina_cnt: %u\n", 1120 pos += scnprintf(buf + pos, bufsz - pos,
1117 le32_to_cpu(ofdm->ina_cnt)); 1121 "\t\t\tcurrent\t\t\taccumulative\n");
1118 pos += scnprintf(buf + pos, bufsz - pos, "fina_cnt: %u\n", 1122 pos += scnprintf(buf + pos, bufsz - pos, "ina_cnt:\t\t%u\t\t\t%u\n",
1119 le32_to_cpu(ofdm->fina_cnt)); 1123 le32_to_cpu(ofdm->ina_cnt), accum_ofdm->ina_cnt);
1120 pos += scnprintf(buf + pos, bufsz - pos, "plcp_err: %u\n", 1124 pos += scnprintf(buf + pos, bufsz - pos, "fina_cnt:\t\t%u\t\t\t%u\n",
1121 le32_to_cpu(ofdm->plcp_err)); 1125 le32_to_cpu(ofdm->fina_cnt), accum_ofdm->fina_cnt);
1122 pos += scnprintf(buf + pos, bufsz - pos, "crc32_err: %u\n", 1126 pos += scnprintf(buf + pos, bufsz - pos, "plcp_err:\t\t%u\t\t\t%u\n",
1123 le32_to_cpu(ofdm->crc32_err)); 1127 le32_to_cpu(ofdm->plcp_err), accum_ofdm->plcp_err);
1124 pos += scnprintf(buf + pos, bufsz - pos, "overrun_err: %u\n", 1128 pos += scnprintf(buf + pos, bufsz - pos, "crc32_err:\t\t%u\t\t\t%u\n",
1125 le32_to_cpu(ofdm->overrun_err)); 1129 le32_to_cpu(ofdm->crc32_err), accum_ofdm->crc32_err);
1126 pos += scnprintf(buf + pos, bufsz - pos, "early_overrun_err: %u\n", 1130 pos += scnprintf(buf + pos, bufsz - pos,
1127 le32_to_cpu(ofdm->early_overrun_err)); 1131 "overrun_err:\t\t%u\t\t\t%u\n",
1128 pos += scnprintf(buf + pos, bufsz - pos, "crc32_good: %u\n", 1132 le32_to_cpu(ofdm->overrun_err),
1129 le32_to_cpu(ofdm->crc32_good)); 1133 accum_ofdm->overrun_err);
1130 pos += scnprintf(buf + pos, bufsz - pos, "false_alarm_cnt: %u\n", 1134 pos += scnprintf(buf + pos, bufsz - pos,
1131 le32_to_cpu(ofdm->false_alarm_cnt)); 1135 "early_overrun_err:\t%u\t\t\t%u\n",
1132 pos += scnprintf(buf + pos, bufsz - pos, "fina_sync_err_cnt: %u\n", 1136 le32_to_cpu(ofdm->early_overrun_err),
1133 le32_to_cpu(ofdm->fina_sync_err_cnt)); 1137 accum_ofdm->early_overrun_err);
1134 pos += scnprintf(buf + pos, bufsz - pos, "sfd_timeout: %u\n", 1138 pos += scnprintf(buf + pos, bufsz - pos, "crc32_good:\t\t%u\t\t\t%u\n",
1135 le32_to_cpu(ofdm->sfd_timeout)); 1139 le32_to_cpu(ofdm->crc32_good),
1136 pos += scnprintf(buf + pos, bufsz - pos, "fina_timeout: %u\n", 1140 accum_ofdm->crc32_good);
1137 le32_to_cpu(ofdm->fina_timeout)); 1141 pos += scnprintf(buf + pos, bufsz - pos,
1138 pos += scnprintf(buf + pos, bufsz - pos, "unresponded_rts: %u\n", 1142 "false_alarm_cnt:\t%u\t\t\t%u\n",
1139 le32_to_cpu(ofdm->unresponded_rts)); 1143 le32_to_cpu(ofdm->false_alarm_cnt),
1140 pos += scnprintf(buf + pos, bufsz - pos, 1144 accum_ofdm->false_alarm_cnt);
1141 "rxe_frame_limit_overrun: %u\n", 1145 pos += scnprintf(buf + pos, bufsz - pos,
1142 le32_to_cpu(ofdm->rxe_frame_limit_overrun)); 1146 "fina_sync_err_cnt:\t%u\t\t\t%u\n",
1143 pos += scnprintf(buf + pos, bufsz - pos, "sent_ack_cnt: %u\n", 1147 le32_to_cpu(ofdm->fina_sync_err_cnt),
1144 le32_to_cpu(ofdm->sent_ack_cnt)); 1148 accum_ofdm->fina_sync_err_cnt);
1145 pos += scnprintf(buf + pos, bufsz - pos, "sent_cts_cnt: %u\n", 1149 pos += scnprintf(buf + pos, bufsz - pos,
1146 le32_to_cpu(ofdm->sent_cts_cnt)); 1150 "sfd_timeout:\t\t%u\t\t\t%u\n",
1147 pos += scnprintf(buf + pos, bufsz - pos, "sent_ba_rsp_cnt: %u\n", 1151 le32_to_cpu(ofdm->sfd_timeout),
1148 le32_to_cpu(ofdm->sent_ba_rsp_cnt)); 1152 accum_ofdm->sfd_timeout);
1149 pos += scnprintf(buf + pos, bufsz - pos, "dsp_self_kill: %u\n", 1153 pos += scnprintf(buf + pos, bufsz - pos,
1150 le32_to_cpu(ofdm->dsp_self_kill)); 1154 "fina_timeout:\t\t%u\t\t\t%u\n",
1151 pos += scnprintf(buf + pos, bufsz - pos, "mh_format_err: %u\n", 1155 le32_to_cpu(ofdm->fina_timeout),
1152 le32_to_cpu(ofdm->mh_format_err)); 1156 accum_ofdm->fina_timeout);
1153 pos += scnprintf(buf + pos, bufsz - pos, "re_acq_main_rssi_sum: %u\n", 1157 pos += scnprintf(buf + pos, bufsz - pos,
1154 le32_to_cpu(ofdm->re_acq_main_rssi_sum)); 1158 "unresponded_rts:\t%u\t\t\t%u\n",
1159 le32_to_cpu(ofdm->unresponded_rts),
1160 accum_ofdm->unresponded_rts);
1161 pos += scnprintf(buf + pos, bufsz - pos,
1162 "rxe_frame_lmt_ovrun:\t%u\t\t\t%u\n",
1163 le32_to_cpu(ofdm->rxe_frame_limit_overrun),
1164 accum_ofdm->rxe_frame_limit_overrun);
1165 pos += scnprintf(buf + pos, bufsz - pos,
1166 "sent_ack_cnt:\t\t%u\t\t\t%u\n",
1167 le32_to_cpu(ofdm->sent_ack_cnt),
1168 accum_ofdm->sent_ack_cnt);
1169 pos += scnprintf(buf + pos, bufsz - pos,
1170 "sent_cts_cnt:\t\t%u\t\t\t%u\n",
1171 le32_to_cpu(ofdm->sent_cts_cnt),
1172 accum_ofdm->sent_cts_cnt);
1173 pos += scnprintf(buf + pos, bufsz - pos,
1174 "sent_ba_rsp_cnt:\t%u\t\t\t%u\n",
1175 le32_to_cpu(ofdm->sent_ba_rsp_cnt),
1176 accum_ofdm->sent_ba_rsp_cnt);
1177 pos += scnprintf(buf + pos, bufsz - pos,
1178 "dsp_self_kill:\t\t%u\t\t\t%u\n",
1179 le32_to_cpu(ofdm->dsp_self_kill),
1180 accum_ofdm->dsp_self_kill);
1181 pos += scnprintf(buf + pos, bufsz - pos,
1182 "mh_format_err:\t\t%u\t\t\t%u\n",
1183 le32_to_cpu(ofdm->mh_format_err),
1184 accum_ofdm->mh_format_err);
1185 pos += scnprintf(buf + pos, bufsz - pos,
1186 "re_acq_main_rssi_sum:\t%u\t\t\t%u\n",
1187 le32_to_cpu(ofdm->re_acq_main_rssi_sum),
1188 accum_ofdm->re_acq_main_rssi_sum);
1155 1189
1156 pos += scnprintf(buf + pos, bufsz - pos, "Statistics_Rx - CCK:\n"); 1190 pos += scnprintf(buf + pos, bufsz - pos, "Statistics_Rx - CCK:\n");
1157 pos += scnprintf(buf + pos, bufsz - pos, "ina_cnt: %u\n", 1191 pos += scnprintf(buf + pos, bufsz - pos,
1158 le32_to_cpu(cck->ina_cnt)); 1192 "\t\t\tcurrent\t\t\taccumulative\n");
1159 pos += scnprintf(buf + pos, bufsz - pos, "fina_cnt: %u\n", 1193 pos += scnprintf(buf + pos, bufsz - pos, "ina_cnt:\t\t%u\t\t\t%u\n",
1160 le32_to_cpu(cck->fina_cnt)); 1194 le32_to_cpu(cck->ina_cnt), accum_cck->ina_cnt);
1161 pos += scnprintf(buf + pos, bufsz - pos, "plcp_err: %u\n", 1195 pos += scnprintf(buf + pos, bufsz - pos, "fina_cnt:\t\t%u\t\t\t%u\n",
1162 le32_to_cpu(cck->plcp_err)); 1196 le32_to_cpu(cck->fina_cnt), accum_cck->fina_cnt);
1163 pos += scnprintf(buf + pos, bufsz - pos, "crc32_err: %u\n", 1197 pos += scnprintf(buf + pos, bufsz - pos, "plcp_err:\t\t%u\t\t\t%u\n",
1164 le32_to_cpu(cck->crc32_err)); 1198 le32_to_cpu(cck->plcp_err), accum_cck->plcp_err);
1165 pos += scnprintf(buf + pos, bufsz - pos, "overrun_err: %u\n", 1199 pos += scnprintf(buf + pos, bufsz - pos, "crc32_err:\t\t%u\t\t\t%u\n",
1166 le32_to_cpu(cck->overrun_err)); 1200 le32_to_cpu(cck->crc32_err), accum_cck->crc32_err);
1167 pos += scnprintf(buf + pos, bufsz - pos, "early_overrun_err: %u\n", 1201 pos += scnprintf(buf + pos, bufsz - pos,
1168 le32_to_cpu(cck->early_overrun_err)); 1202 "overrun_err:\t\t%u\t\t\t%u\n",
1169 pos += scnprintf(buf + pos, bufsz - pos, "crc32_good: %u\n", 1203 le32_to_cpu(cck->overrun_err),
1170 le32_to_cpu(cck->crc32_good)); 1204 accum_cck->overrun_err);
1171 pos += scnprintf(buf + pos, bufsz - pos, "false_alarm_cnt: %u\n", 1205 pos += scnprintf(buf + pos, bufsz - pos,
1172 le32_to_cpu(cck->false_alarm_cnt)); 1206 "early_overrun_err:\t%u\t\t\t%u\n",
1173 pos += scnprintf(buf + pos, bufsz - pos, "fina_sync_err_cnt: %u\n", 1207 le32_to_cpu(cck->early_overrun_err),
1174 le32_to_cpu(cck->fina_sync_err_cnt)); 1208 accum_cck->early_overrun_err);
1175 pos += scnprintf(buf + pos, bufsz - pos, "sfd_timeout: %u\n", 1209 pos += scnprintf(buf + pos, bufsz - pos, "crc32_good:\t\t%u\t\t\t%u\n",
1176 le32_to_cpu(cck->sfd_timeout)); 1210 le32_to_cpu(cck->crc32_good), accum_cck->crc32_good);
1177 pos += scnprintf(buf + pos, bufsz - pos, "fina_timeout: %u\n", 1211 pos += scnprintf(buf + pos, bufsz - pos,
1178 le32_to_cpu(cck->fina_timeout)); 1212 "false_alarm_cnt:\t%u\t\t\t%u\n",
1179 pos += scnprintf(buf + pos, bufsz - pos, "unresponded_rts: %u\n", 1213 le32_to_cpu(cck->false_alarm_cnt),
1180 le32_to_cpu(cck->unresponded_rts)); 1214 accum_cck->false_alarm_cnt);
1181 pos += scnprintf(buf + pos, bufsz - pos, 1215 pos += scnprintf(buf + pos, bufsz - pos,
1182 "rxe_frame_limit_overrun: %u\n", 1216 "fina_sync_err_cnt:\t%u\t\t\t%u\n",
1183 le32_to_cpu(cck->rxe_frame_limit_overrun)); 1217 le32_to_cpu(cck->fina_sync_err_cnt),
1184 pos += scnprintf(buf + pos, bufsz - pos, "sent_ack_cnt: %u\n", 1218 accum_cck->fina_sync_err_cnt);
1185 le32_to_cpu(cck->sent_ack_cnt)); 1219 pos += scnprintf(buf + pos, bufsz - pos,
1186 pos += scnprintf(buf + pos, bufsz - pos, "sent_cts_cnt: %u\n", 1220 "sfd_timeout:\t\t%u\t\t\t%u\n",
1187 le32_to_cpu(cck->sent_cts_cnt)); 1221 le32_to_cpu(cck->sfd_timeout),
1188 pos += scnprintf(buf + pos, bufsz - pos, "sent_ba_rsp_cnt: %u\n", 1222 accum_cck->sfd_timeout);
1189 le32_to_cpu(cck->sent_ba_rsp_cnt)); 1223 pos += scnprintf(buf + pos, bufsz - pos,
1190 pos += scnprintf(buf + pos, bufsz - pos, "dsp_self_kill: %u\n", 1224 "fina_timeout:\t\t%u\t\t\t%u\n",
1191 le32_to_cpu(cck->dsp_self_kill)); 1225 le32_to_cpu(cck->fina_timeout),
1192 pos += scnprintf(buf + pos, bufsz - pos, "mh_format_err: %u\n", 1226 accum_cck->fina_timeout);
1193 le32_to_cpu(cck->mh_format_err)); 1227 pos += scnprintf(buf + pos, bufsz - pos,
1194 pos += scnprintf(buf + pos, bufsz - pos, "re_acq_main_rssi_sum: %u\n", 1228 "unresponded_rts:\t%u\t\t\t%u\n",
1195 le32_to_cpu(cck->re_acq_main_rssi_sum)); 1229 le32_to_cpu(cck->unresponded_rts),
1230 accum_cck->unresponded_rts);
1231 pos += scnprintf(buf + pos, bufsz - pos,
1232 "rxe_frame_lmt_ovrun:\t%u\t\t\t%u\n",
1233 le32_to_cpu(cck->rxe_frame_limit_overrun),
1234 accum_cck->rxe_frame_limit_overrun);
1235 pos += scnprintf(buf + pos, bufsz - pos,
1236 "sent_ack_cnt:\t\t%u\t\t\t%u\n",
1237 le32_to_cpu(cck->sent_ack_cnt),
1238 accum_cck->sent_ack_cnt);
1239 pos += scnprintf(buf + pos, bufsz - pos,
1240 "sent_cts_cnt:\t\t%u\t\t\t%u\n",
1241 le32_to_cpu(cck->sent_cts_cnt),
1242 accum_cck->sent_cts_cnt);
1243 pos += scnprintf(buf + pos, bufsz - pos,
1244 "sent_ba_rsp_cnt:\t%u\t\t\t%u\n",
1245 le32_to_cpu(cck->sent_ba_rsp_cnt),
1246 accum_cck->sent_ba_rsp_cnt);
1247 pos += scnprintf(buf + pos, bufsz - pos,
1248 "dsp_self_kill:\t\t%u\t\t\t%u\n",
1249 le32_to_cpu(cck->dsp_self_kill),
1250 accum_cck->dsp_self_kill);
1251 pos += scnprintf(buf + pos, bufsz - pos,
1252 "mh_format_err:\t\t%u\t\t\t%u\n",
1253 le32_to_cpu(cck->mh_format_err),
1254 accum_cck->mh_format_err);
1255 pos += scnprintf(buf + pos, bufsz - pos,
1256 "re_acq_main_rssi_sum:\t%u\t\t\t%u\n",
1257 le32_to_cpu(cck->re_acq_main_rssi_sum),
1258 accum_cck->re_acq_main_rssi_sum);
1196 1259
1197 pos += scnprintf(buf + pos, bufsz - pos, "Statistics_Rx - GENERAL:\n"); 1260 pos += scnprintf(buf + pos, bufsz - pos, "Statistics_Rx - GENERAL:\n");
1198 pos += scnprintf(buf + pos, bufsz - pos, "bogus_cts: %u\n", 1261 pos += scnprintf(buf + pos, bufsz - pos,
1199 le32_to_cpu(general->bogus_cts)); 1262 "\t\t\tcurrent\t\t\taccumulative\n");
1200 pos += scnprintf(buf + pos, bufsz - pos, "bogus_ack: %u\n", 1263 pos += scnprintf(buf + pos, bufsz - pos, "bogus_cts:\t\t%u\t\t\t%u\n",
1201 le32_to_cpu(general->bogus_ack)); 1264 le32_to_cpu(general->bogus_cts),
1202 pos += scnprintf(buf + pos, bufsz - pos, "non_bssid_frames: %u\n", 1265 accum_general->bogus_cts);
1203 le32_to_cpu(general->non_bssid_frames)); 1266 pos += scnprintf(buf + pos, bufsz - pos, "bogus_ack:\t\t%u\t\t\t%u\n",
1204 pos += scnprintf(buf + pos, bufsz - pos, "filtered_frames: %u\n", 1267 le32_to_cpu(general->bogus_ack),
1205 le32_to_cpu(general->filtered_frames)); 1268 accum_general->bogus_ack);
1206 pos += scnprintf(buf + pos, bufsz - pos, "non_channel_beacons: %u\n", 1269 pos += scnprintf(buf + pos, bufsz - pos,
1207 le32_to_cpu(general->non_channel_beacons)); 1270 "non_bssid_frames:\t%u\t\t\t%u\n",
1208 pos += scnprintf(buf + pos, bufsz - pos, "channel_beacons: %u\n", 1271 le32_to_cpu(general->non_bssid_frames),
1209 le32_to_cpu(general->channel_beacons)); 1272 accum_general->non_bssid_frames);
1210 pos += scnprintf(buf + pos, bufsz - pos, "num_missed_bcon: %u\n", 1273 pos += scnprintf(buf + pos, bufsz - pos,
1211 le32_to_cpu(general->num_missed_bcon)); 1274 "filtered_frames:\t%u\t\t\t%u\n",
1212 pos += scnprintf(buf + pos, bufsz - pos, 1275 le32_to_cpu(general->filtered_frames),
1213 "adc_rx_saturation_time: %u\n", 1276 accum_general->filtered_frames);
1214 le32_to_cpu(general->adc_rx_saturation_time)); 1277 pos += scnprintf(buf + pos, bufsz - pos,
1215 pos += scnprintf(buf + pos, bufsz - pos, 1278 "non_channel_beacons:\t%u\t\t\t%u\n",
1216 "ina_detection_search_time: %u\n", 1279 le32_to_cpu(general->non_channel_beacons),
1217 le32_to_cpu(general->ina_detection_search_time)); 1280 accum_general->non_channel_beacons);
1218 pos += scnprintf(buf + pos, bufsz - pos, "beacon_silence_rssi_a: %u\n", 1281 pos += scnprintf(buf + pos, bufsz - pos,
1219 le32_to_cpu(general->beacon_silence_rssi_a)); 1282 "channel_beacons:\t%u\t\t\t%u\n",
1220 pos += scnprintf(buf + pos, bufsz - pos, "beacon_silence_rssi_b: %u\n", 1283 le32_to_cpu(general->channel_beacons),
1221 le32_to_cpu(general->beacon_silence_rssi_b)); 1284 accum_general->channel_beacons);
1222 pos += scnprintf(buf + pos, bufsz - pos, "beacon_silence_rssi_c: %u\n", 1285 pos += scnprintf(buf + pos, bufsz - pos,
1223 le32_to_cpu(general->beacon_silence_rssi_c)); 1286 "num_missed_bcon:\t%u\t\t\t%u\n",
1224 pos += scnprintf(buf + pos, bufsz - pos, 1287 le32_to_cpu(general->num_missed_bcon),
1225 "interference_data_flag: %u\n", 1288 accum_general->num_missed_bcon);
1226 le32_to_cpu(general->interference_data_flag)); 1289 pos += scnprintf(buf + pos, bufsz - pos,
1227 pos += scnprintf(buf + pos, bufsz - pos, "channel_load: %u\n", 1290 "adc_rx_saturation_time:\t%u\t\t\t%u\n",
1228 le32_to_cpu(general->channel_load)); 1291 le32_to_cpu(general->adc_rx_saturation_time),
1229 pos += scnprintf(buf + pos, bufsz - pos, "dsp_false_alarms: %u\n", 1292 accum_general->adc_rx_saturation_time);
1230 le32_to_cpu(general->dsp_false_alarms)); 1293 pos += scnprintf(buf + pos, bufsz - pos,
1231 pos += scnprintf(buf + pos, bufsz - pos, "beacon_rssi_a: %u\n", 1294 "ina_detect_search_tm:\t%u\t\t\t%u\n",
1232 le32_to_cpu(general->beacon_rssi_a)); 1295 le32_to_cpu(general->ina_detection_search_time),
1233 pos += scnprintf(buf + pos, bufsz - pos, "beacon_rssi_b: %u\n", 1296 accum_general->ina_detection_search_time);
1234 le32_to_cpu(general->beacon_rssi_b)); 1297 pos += scnprintf(buf + pos, bufsz - pos,
1235 pos += scnprintf(buf + pos, bufsz - pos, "beacon_rssi_c: %u\n", 1298 "beacon_silence_rssi_a:\t%u\t\t\t%u\n",
1236 le32_to_cpu(general->beacon_rssi_c)); 1299 le32_to_cpu(general->beacon_silence_rssi_a),
1237 pos += scnprintf(buf + pos, bufsz - pos, "beacon_energy_a: %u\n", 1300 accum_general->beacon_silence_rssi_a);
1238 le32_to_cpu(general->beacon_energy_a)); 1301 pos += scnprintf(buf + pos, bufsz - pos,
1239 pos += scnprintf(buf + pos, bufsz - pos, "beacon_energy_b: %u\n", 1302 "beacon_silence_rssi_b:\t%u\t\t\t%u\n",
1240 le32_to_cpu(general->beacon_energy_b)); 1303 le32_to_cpu(general->beacon_silence_rssi_b),
1241 pos += scnprintf(buf + pos, bufsz - pos, "beacon_energy_c: %u\n", 1304 accum_general->beacon_silence_rssi_b);
1242 le32_to_cpu(general->beacon_energy_c)); 1305 pos += scnprintf(buf + pos, bufsz - pos,
1306 "beacon_silence_rssi_c:\t%u\t\t\t%u\n",
1307 le32_to_cpu(general->beacon_silence_rssi_c),
1308 accum_general->beacon_silence_rssi_c);
1309 pos += scnprintf(buf + pos, bufsz - pos,
1310 "interference_data_flag:\t%u\t\t\t%u\n",
1311 le32_to_cpu(general->interference_data_flag),
1312 accum_general->interference_data_flag);
1313 pos += scnprintf(buf + pos, bufsz - pos,
1314 "channel_load:\t\t%u\t\t\t%u\n",
1315 le32_to_cpu(general->channel_load),
1316 accum_general->channel_load);
1317 pos += scnprintf(buf + pos, bufsz - pos,
1318 "dsp_false_alarms:\t%u\t\t\t%u\n",
1319 le32_to_cpu(general->dsp_false_alarms),
1320 accum_general->dsp_false_alarms);
1321 pos += scnprintf(buf + pos, bufsz - pos,
1322 "beacon_rssi_a:\t\t%u\t\t\t%u\n",
1323 le32_to_cpu(general->beacon_rssi_a),
1324 accum_general->beacon_rssi_a);
1325 pos += scnprintf(buf + pos, bufsz - pos,
1326 "beacon_rssi_b:\t\t%u\t\t\t%u\n",
1327 le32_to_cpu(general->beacon_rssi_b),
1328 accum_general->beacon_rssi_b);
1329 pos += scnprintf(buf + pos, bufsz - pos,
1330 "beacon_rssi_c:\t\t%u\t\t\t%u\n",
1331 le32_to_cpu(general->beacon_rssi_c),
1332 accum_general->beacon_rssi_c);
1333 pos += scnprintf(buf + pos, bufsz - pos,
1334 "beacon_energy_a:\t%u\t\t\t%u\n",
1335 le32_to_cpu(general->beacon_energy_a),
1336 accum_general->beacon_energy_a);
1337 pos += scnprintf(buf + pos, bufsz - pos,
1338 "beacon_energy_b:\t%u\t\t\t%u\n",
1339 le32_to_cpu(general->beacon_energy_b),
1340 accum_general->beacon_energy_b);
1341 pos += scnprintf(buf + pos, bufsz - pos,
1342 "beacon_energy_c:\t%u\t\t\t%u\n",
1343 le32_to_cpu(general->beacon_energy_c),
1344 accum_general->beacon_energy_c);
1243 1345
1244 pos += scnprintf(buf + pos, bufsz - pos, "Statistics_Rx - OFDM_HT:\n"); 1346 pos += scnprintf(buf + pos, bufsz - pos, "Statistics_Rx - OFDM_HT:\n");
1245 pos += scnprintf(buf + pos, bufsz - pos, "plcp_err: %u\n", 1347 pos += scnprintf(buf + pos, bufsz - pos,
1246 le32_to_cpu(ht->plcp_err)); 1348 "\t\t\tcurrent\t\t\taccumulative\n");
1247 pos += scnprintf(buf + pos, bufsz - pos, "overrun_err: %u\n", 1349 pos += scnprintf(buf + pos, bufsz - pos, "plcp_err:\t\t%u\t\t\t%u\n",
1248 le32_to_cpu(ht->overrun_err)); 1350 le32_to_cpu(ht->plcp_err), accum_ht->plcp_err);
1249 pos += scnprintf(buf + pos, bufsz - pos, "early_overrun_err: %u\n", 1351 pos += scnprintf(buf + pos, bufsz - pos,
1250 le32_to_cpu(ht->early_overrun_err)); 1352 "overrun_err:\t\t%u\t\t\t%u\n",
1251 pos += scnprintf(buf + pos, bufsz - pos, "crc32_good: %u\n", 1353 le32_to_cpu(ht->overrun_err), accum_ht->overrun_err);
1252 le32_to_cpu(ht->crc32_good)); 1354 pos += scnprintf(buf + pos, bufsz - pos,
1253 pos += scnprintf(buf + pos, bufsz - pos, "crc32_err: %u\n", 1355 "early_overrun_err:\t%u\t\t\t%u\n",
1254 le32_to_cpu(ht->crc32_err)); 1356 le32_to_cpu(ht->early_overrun_err),
1255 pos += scnprintf(buf + pos, bufsz - pos, "mh_format_err: %u\n", 1357 accum_ht->early_overrun_err);
1256 le32_to_cpu(ht->mh_format_err)); 1358 pos += scnprintf(buf + pos, bufsz - pos, "crc32_good:\t\t%u\t\t\t%u\n",
1257 pos += scnprintf(buf + pos, bufsz - pos, "agg_crc32_good: %u\n", 1359 le32_to_cpu(ht->crc32_good), accum_ht->crc32_good);
1258 le32_to_cpu(ht->agg_crc32_good)); 1360 pos += scnprintf(buf + pos, bufsz - pos, "crc32_err:\t\t%u\t\t\t%u\n",
1259 pos += scnprintf(buf + pos, bufsz - pos, "agg_mpdu_cnt: %u\n", 1361 le32_to_cpu(ht->crc32_err), accum_ht->crc32_err);
1260 le32_to_cpu(ht->agg_mpdu_cnt)); 1362 pos += scnprintf(buf + pos, bufsz - pos,
1261 pos += scnprintf(buf + pos, bufsz - pos, "agg_cnt: %u\n", 1363 "mh_format_err:\t\t%u\t\t\t%u\n",
1262 le32_to_cpu(ht->agg_cnt)); 1364 le32_to_cpu(ht->mh_format_err),
1365 accum_ht->mh_format_err);
1366 pos += scnprintf(buf + pos, bufsz - pos,
1367 "agg_crc32_good:\t\t%u\t\t\t%u\n",
1368 le32_to_cpu(ht->agg_crc32_good),
1369 accum_ht->agg_crc32_good);
1370 pos += scnprintf(buf + pos, bufsz - pos,
1371 "agg_mpdu_cnt:\t\t%u\t\t\t%u\n",
1372 le32_to_cpu(ht->agg_mpdu_cnt),
1373 accum_ht->agg_mpdu_cnt);
1374 pos += scnprintf(buf + pos, bufsz - pos, "agg_cnt:\t\t%u\t\t\t%u\n",
1375 le32_to_cpu(ht->agg_cnt), accum_ht->agg_cnt);
1263 1376
1264 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1377 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
1265 kfree(buf); 1378 kfree(buf);
@@ -1275,7 +1388,7 @@ static ssize_t iwl_dbgfs_ucode_tx_stats_read(struct file *file,
1275 char *buf; 1388 char *buf;
1276 int bufsz = (sizeof(struct statistics_tx) * 24) + 250; 1389 int bufsz = (sizeof(struct statistics_tx) * 24) + 250;
1277 ssize_t ret; 1390 ssize_t ret;
1278 struct statistics_tx *tx; 1391 struct statistics_tx *tx, *accum_tx;
1279 1392
1280 if (!iwl_is_alive(priv)) 1393 if (!iwl_is_alive(priv))
1281 return -EAGAIN; 1394 return -EAGAIN;
@@ -1301,62 +1414,107 @@ static ssize_t iwl_dbgfs_ucode_tx_stats_read(struct file *file,
1301 * might not reflect the current uCode activity 1414 * might not reflect the current uCode activity
1302 */ 1415 */
1303 tx = &priv->statistics.tx; 1416 tx = &priv->statistics.tx;
1417 accum_tx = &priv->accum_statistics.tx;
1304 pos += iwl_dbgfs_statistics_flag(priv, buf, bufsz); 1418 pos += iwl_dbgfs_statistics_flag(priv, buf, bufsz);
1305 pos += scnprintf(buf + pos, bufsz - pos, "Statistics_Tx:\n"); 1419 pos += scnprintf(buf + pos, bufsz - pos, "Statistics_Tx:\n");
1306 pos += scnprintf(buf + pos, bufsz - pos, "preamble: %u\n", 1420 pos += scnprintf(buf + pos, bufsz - pos,
1307 le32_to_cpu(tx->preamble_cnt)); 1421 "\t\t\tcurrent\t\t\taccumulative\n");
1308 pos += scnprintf(buf + pos, bufsz - pos, "rx_detected_cnt: %u\n", 1422 pos += scnprintf(buf + pos, bufsz - pos, "preamble:\t\t\t%u\t\t\t%u\n",
1309 le32_to_cpu(tx->rx_detected_cnt)); 1423 le32_to_cpu(tx->preamble_cnt),
1310 pos += scnprintf(buf + pos, bufsz - pos, "bt_prio_defer_cnt: %u\n", 1424 accum_tx->preamble_cnt);
1311 le32_to_cpu(tx->bt_prio_defer_cnt)); 1425 pos += scnprintf(buf + pos, bufsz - pos,
1312 pos += scnprintf(buf + pos, bufsz - pos, "bt_prio_kill_cnt: %u\n", 1426 "rx_detected_cnt:\t\t%u\t\t\t%u\n",
1313 le32_to_cpu(tx->bt_prio_kill_cnt)); 1427 le32_to_cpu(tx->rx_detected_cnt),
1314 pos += scnprintf(buf + pos, bufsz - pos, "few_bytes_cnt: %u\n", 1428 accum_tx->rx_detected_cnt);
1315 le32_to_cpu(tx->few_bytes_cnt)); 1429 pos += scnprintf(buf + pos, bufsz - pos,
1316 pos += scnprintf(buf + pos, bufsz - pos, "cts_timeout: %u\n", 1430 "bt_prio_defer_cnt:\t\t%u\t\t\t%u\n",
1317 le32_to_cpu(tx->cts_timeout)); 1431 le32_to_cpu(tx->bt_prio_defer_cnt),
1318 pos += scnprintf(buf + pos, bufsz - pos, "ack_timeout: %u\n", 1432 accum_tx->bt_prio_defer_cnt);
1319 le32_to_cpu(tx->ack_timeout)); 1433 pos += scnprintf(buf + pos, bufsz - pos,
1320 pos += scnprintf(buf + pos, bufsz - pos, "expected_ack_cnt: %u\n", 1434 "bt_prio_kill_cnt:\t\t%u\t\t\t%u\n",
1321 le32_to_cpu(tx->expected_ack_cnt)); 1435 le32_to_cpu(tx->bt_prio_kill_cnt),
1322 pos += scnprintf(buf + pos, bufsz - pos, "actual_ack_cnt: %u\n", 1436 accum_tx->bt_prio_kill_cnt);
1323 le32_to_cpu(tx->actual_ack_cnt)); 1437 pos += scnprintf(buf + pos, bufsz - pos,
1324 pos += scnprintf(buf + pos, bufsz - pos, "dump_msdu_cnt: %u\n", 1438 "few_bytes_cnt:\t\t\t%u\t\t\t%u\n",
1325 le32_to_cpu(tx->dump_msdu_cnt)); 1439 le32_to_cpu(tx->few_bytes_cnt),
1326 pos += scnprintf(buf + pos, bufsz - pos, 1440 accum_tx->few_bytes_cnt);
1327 "burst_abort_next_frame_mismatch_cnt: %u\n", 1441 pos += scnprintf(buf + pos, bufsz - pos,
1328 le32_to_cpu(tx->burst_abort_next_frame_mismatch_cnt)); 1442 "cts_timeout:\t\t\t%u\t\t\t%u\n",
1329 pos += scnprintf(buf + pos, bufsz - pos, 1443 le32_to_cpu(tx->cts_timeout), accum_tx->cts_timeout);
1330 "burst_abort_missing_next_frame_cnt: %u\n", 1444 pos += scnprintf(buf + pos, bufsz - pos,
1331 le32_to_cpu(tx->burst_abort_missing_next_frame_cnt)); 1445 "ack_timeout:\t\t\t%u\t\t\t%u\n",
1332 pos += scnprintf(buf + pos, bufsz - pos, "cts_timeout_collision: %u\n", 1446 le32_to_cpu(tx->ack_timeout),
1333 le32_to_cpu(tx->cts_timeout_collision)); 1447 accum_tx->ack_timeout);
1334 pos += scnprintf(buf + pos, bufsz - pos, 1448 pos += scnprintf(buf + pos, bufsz - pos,
1335 "ack_or_ba_timeout_collision: %u\n", 1449 "expected_ack_cnt:\t\t%u\t\t\t%u\n",
1336 le32_to_cpu(tx->ack_or_ba_timeout_collision)); 1450 le32_to_cpu(tx->expected_ack_cnt),
1337 pos += scnprintf(buf + pos, bufsz - pos, "agg ba_timeout: %u\n", 1451 accum_tx->expected_ack_cnt);
1338 le32_to_cpu(tx->agg.ba_timeout)); 1452 pos += scnprintf(buf + pos, bufsz - pos,
1339 pos += scnprintf(buf + pos, bufsz - pos, 1453 "actual_ack_cnt:\t\t\t%u\t\t\t%u\n",
1340 "agg ba_reschedule_frames: %u\n", 1454 le32_to_cpu(tx->actual_ack_cnt),
1341 le32_to_cpu(tx->agg.ba_reschedule_frames)); 1455 accum_tx->actual_ack_cnt);
1342 pos += scnprintf(buf + pos, bufsz - pos, 1456 pos += scnprintf(buf + pos, bufsz - pos,
1343 "agg scd_query_agg_frame_cnt: %u\n", 1457 "dump_msdu_cnt:\t\t\t%u\t\t\t%u\n",
1344 le32_to_cpu(tx->agg.scd_query_agg_frame_cnt)); 1458 le32_to_cpu(tx->dump_msdu_cnt),
1345 pos += scnprintf(buf + pos, bufsz - pos, "agg scd_query_no_agg: %u\n", 1459 accum_tx->dump_msdu_cnt);
1346 le32_to_cpu(tx->agg.scd_query_no_agg)); 1460 pos += scnprintf(buf + pos, bufsz - pos,
1347 pos += scnprintf(buf + pos, bufsz - pos, "agg scd_query_agg: %u\n", 1461 "abort_nxt_frame_mismatch:"
1348 le32_to_cpu(tx->agg.scd_query_agg)); 1462 "\t%u\t\t\t%u\n",
1349 pos += scnprintf(buf + pos, bufsz - pos, 1463 le32_to_cpu(tx->burst_abort_next_frame_mismatch_cnt),
1350 "agg scd_query_mismatch: %u\n", 1464 accum_tx->burst_abort_next_frame_mismatch_cnt);
1351 le32_to_cpu(tx->agg.scd_query_mismatch)); 1465 pos += scnprintf(buf + pos, bufsz - pos,
1352 pos += scnprintf(buf + pos, bufsz - pos, "agg frame_not_ready: %u\n", 1466 "abort_missing_nxt_frame:"
1353 le32_to_cpu(tx->agg.frame_not_ready)); 1467 "\t%u\t\t\t%u\n",
1354 pos += scnprintf(buf + pos, bufsz - pos, "agg underrun: %u\n", 1468 le32_to_cpu(tx->burst_abort_missing_next_frame_cnt),
1355 le32_to_cpu(tx->agg.underrun)); 1469 accum_tx->burst_abort_missing_next_frame_cnt);
1356 pos += scnprintf(buf + pos, bufsz - pos, "agg bt_prio_kill: %u\n", 1470 pos += scnprintf(buf + pos, bufsz - pos,
1357 le32_to_cpu(tx->agg.bt_prio_kill)); 1471 "cts_timeout_collision:\t\t%u\t\t\t%u\n",
1358 pos += scnprintf(buf + pos, bufsz - pos, "agg rx_ba_rsp_cnt: %u\n", 1472 le32_to_cpu(tx->cts_timeout_collision),
1359 le32_to_cpu(tx->agg.rx_ba_rsp_cnt)); 1473 accum_tx->cts_timeout_collision);
1474 pos += scnprintf(buf + pos, bufsz - pos,
1475 "ack_ba_timeout_collision:\t%u\t\t\t%u\n",
1476 le32_to_cpu(tx->ack_or_ba_timeout_collision),
1477 accum_tx->ack_or_ba_timeout_collision);
1478 pos += scnprintf(buf + pos, bufsz - pos,
1479 "agg ba_timeout:\t\t\t%u\t\t\t%u\n",
1480 le32_to_cpu(tx->agg.ba_timeout),
1481 accum_tx->agg.ba_timeout);
1482 pos += scnprintf(buf + pos, bufsz - pos,
1483 "agg ba_resched_frames:\t\t%u\t\t\t%u\n",
1484 le32_to_cpu(tx->agg.ba_reschedule_frames),
1485 accum_tx->agg.ba_reschedule_frames);
1486 pos += scnprintf(buf + pos, bufsz - pos,
1487 "agg scd_query_agg_frame:\t%u\t\t\t%u\n",
1488 le32_to_cpu(tx->agg.scd_query_agg_frame_cnt),
1489 accum_tx->agg.scd_query_agg_frame_cnt);
1490 pos += scnprintf(buf + pos, bufsz - pos,
1491 "agg scd_query_no_agg:\t\t%u\t\t\t%u\n",
1492 le32_to_cpu(tx->agg.scd_query_no_agg),
1493 accum_tx->agg.scd_query_no_agg);
1494 pos += scnprintf(buf + pos, bufsz - pos,
1495 "agg scd_query_agg:\t\t%u\t\t\t%u\n",
1496 le32_to_cpu(tx->agg.scd_query_agg),
1497 accum_tx->agg.scd_query_agg);
1498 pos += scnprintf(buf + pos, bufsz - pos,
1499 "agg scd_query_mismatch:\t\t%u\t\t\t%u\n",
1500 le32_to_cpu(tx->agg.scd_query_mismatch),
1501 accum_tx->agg.scd_query_mismatch);
1502 pos += scnprintf(buf + pos, bufsz - pos,
1503 "agg frame_not_ready:\t\t%u\t\t\t%u\n",
1504 le32_to_cpu(tx->agg.frame_not_ready),
1505 accum_tx->agg.frame_not_ready);
1506 pos += scnprintf(buf + pos, bufsz - pos,
1507 "agg underrun:\t\t\t%u\t\t\t%u\n",
1508 le32_to_cpu(tx->agg.underrun),
1509 accum_tx->agg.underrun);
1510 pos += scnprintf(buf + pos, bufsz - pos,
1511 "agg bt_prio_kill:\t\t%u\t\t\t%u\n",
1512 le32_to_cpu(tx->agg.bt_prio_kill),
1513 accum_tx->agg.bt_prio_kill);
1514 pos += scnprintf(buf + pos, bufsz - pos,
1515 "agg rx_ba_rsp_cnt:\t\t%u\t\t\t%u\n",
1516 le32_to_cpu(tx->agg.rx_ba_rsp_cnt),
1517 accum_tx->agg.rx_ba_rsp_cnt);
1360 1518
1361 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1519 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
1362 kfree(buf); 1520 kfree(buf);
@@ -1372,9 +1530,9 @@ static ssize_t iwl_dbgfs_ucode_general_stats_read(struct file *file,
1372 char *buf; 1530 char *buf;
1373 int bufsz = sizeof(struct statistics_general) * 4 + 250; 1531 int bufsz = sizeof(struct statistics_general) * 4 + 250;
1374 ssize_t ret; 1532 ssize_t ret;
1375 struct statistics_general *general; 1533 struct statistics_general *general, *accum_general;
1376 struct statistics_dbg *dbg; 1534 struct statistics_dbg *dbg, *accum_dbg;
1377 struct statistics_div *div; 1535 struct statistics_div *div, *accum_div;
1378 1536
1379 if (!iwl_is_alive(priv)) 1537 if (!iwl_is_alive(priv))
1380 return -EAGAIN; 1538 return -EAGAIN;
@@ -1402,34 +1560,53 @@ static ssize_t iwl_dbgfs_ucode_general_stats_read(struct file *file,
1402 general = &priv->statistics.general; 1560 general = &priv->statistics.general;
1403 dbg = &priv->statistics.general.dbg; 1561 dbg = &priv->statistics.general.dbg;
1404 div = &priv->statistics.general.div; 1562 div = &priv->statistics.general.div;
1563 accum_general = &priv->accum_statistics.general;
1564 accum_dbg = &priv->accum_statistics.general.dbg;
1565 accum_div = &priv->accum_statistics.general.div;
1405 pos += iwl_dbgfs_statistics_flag(priv, buf, bufsz); 1566 pos += iwl_dbgfs_statistics_flag(priv, buf, bufsz);
1406 pos += scnprintf(buf + pos, bufsz - pos, "Statistics_General:\n"); 1567 pos += scnprintf(buf + pos, bufsz - pos, "Statistics_General:\n");
1407 pos += scnprintf(buf + pos, bufsz - pos, "temperature: %u\n", 1568 pos += scnprintf(buf + pos, bufsz - pos,
1569 "\t\t\tcurrent\t\t\taccumulative\n");
1570 pos += scnprintf(buf + pos, bufsz - pos, "temperature:\t\t\t%u\n",
1408 le32_to_cpu(general->temperature)); 1571 le32_to_cpu(general->temperature));
1409 pos += scnprintf(buf + pos, bufsz - pos, "temperature_m: %u\n", 1572 pos += scnprintf(buf + pos, bufsz - pos, "temperature_m:\t\t\t%u\n",
1410 le32_to_cpu(general->temperature_m)); 1573 le32_to_cpu(general->temperature_m));
1411 pos += scnprintf(buf + pos, bufsz - pos, "burst_check: %u\n", 1574 pos += scnprintf(buf + pos, bufsz - pos,
1412 le32_to_cpu(dbg->burst_check)); 1575 "burst_check:\t\t\t%u\t\t\t%u\n",
1413 pos += scnprintf(buf + pos, bufsz - pos, "burst_count: %u\n", 1576 le32_to_cpu(dbg->burst_check),
1414 le32_to_cpu(dbg->burst_count)); 1577 accum_dbg->burst_check);
1415 pos += scnprintf(buf + pos, bufsz - pos, "sleep_time: %u\n", 1578 pos += scnprintf(buf + pos, bufsz - pos,
1416 le32_to_cpu(general->sleep_time)); 1579 "burst_count:\t\t\t%u\t\t\t%u\n",
1417 pos += scnprintf(buf + pos, bufsz - pos, "slots_out: %u\n", 1580 le32_to_cpu(dbg->burst_count),
1418 le32_to_cpu(general->slots_out)); 1581 accum_dbg->burst_count);
1419 pos += scnprintf(buf + pos, bufsz - pos, "slots_idle: %u\n", 1582 pos += scnprintf(buf + pos, bufsz - pos,
1420 le32_to_cpu(general->slots_idle)); 1583 "sleep_time:\t\t\t%u\t\t\t%u\n",
1421 pos += scnprintf(buf + pos, bufsz - pos, "ttl_timestamp: %u\n", 1584 le32_to_cpu(general->sleep_time),
1585 accum_general->sleep_time);
1586 pos += scnprintf(buf + pos, bufsz - pos,
1587 "slots_out:\t\t\t%u\t\t\t%u\n",
1588 le32_to_cpu(general->slots_out),
1589 accum_general->slots_out);
1590 pos += scnprintf(buf + pos, bufsz - pos,
1591 "slots_idle:\t\t\t%u\t\t\t%u\n",
1592 le32_to_cpu(general->slots_idle),
1593 accum_general->slots_idle);
1594 pos += scnprintf(buf + pos, bufsz - pos, "ttl_timestamp:\t\t\t%u\n",
1422 le32_to_cpu(general->ttl_timestamp)); 1595 le32_to_cpu(general->ttl_timestamp));
1423 pos += scnprintf(buf + pos, bufsz - pos, "tx_on_a: %u\n", 1596 pos += scnprintf(buf + pos, bufsz - pos, "tx_on_a:\t\t\t%u\t\t\t%u\n",
1424 le32_to_cpu(div->tx_on_a)); 1597 le32_to_cpu(div->tx_on_a), accum_div->tx_on_a);
1425 pos += scnprintf(buf + pos, bufsz - pos, "tx_on_b: %u\n", 1598 pos += scnprintf(buf + pos, bufsz - pos, "tx_on_b:\t\t\t%u\t\t\t%u\n",
1426 le32_to_cpu(div->tx_on_b)); 1599 le32_to_cpu(div->tx_on_b), accum_div->tx_on_b);
1427 pos += scnprintf(buf + pos, bufsz - pos, "exec_time: %u\n", 1600 pos += scnprintf(buf + pos, bufsz - pos,
1428 le32_to_cpu(div->exec_time)); 1601 "exec_time:\t\t\t%u\t\t\t%u\n",
1429 pos += scnprintf(buf + pos, bufsz - pos, "probe_time: %u\n", 1602 le32_to_cpu(div->exec_time), accum_div->exec_time);
1430 le32_to_cpu(div->probe_time)); 1603 pos += scnprintf(buf + pos, bufsz - pos,
1431 pos += scnprintf(buf + pos, bufsz - pos, "rx_enable_counter: %u\n", 1604 "probe_time:\t\t\t%u\t\t\t%u\n",
1432 le32_to_cpu(general->rx_enable_counter)); 1605 le32_to_cpu(div->probe_time), accum_div->probe_time);
1606 pos += scnprintf(buf + pos, bufsz - pos,
1607 "rx_enable_counter:\t\t%u\t\t\t%u\n",
1608 le32_to_cpu(general->rx_enable_counter),
1609 accum_general->rx_enable_counter);
1433 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1610 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
1434 kfree(buf); 1611 kfree(buf);
1435 return ret; 1612 return ret;
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
index 6d7c2350d8c..8d087f0455d 100644
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
@@ -1124,7 +1124,9 @@ struct iwl_priv {
1124 struct iwl_tt_mgmt thermal_throttle; 1124 struct iwl_tt_mgmt thermal_throttle;
1125 1125
1126 struct iwl_notif_statistics statistics; 1126 struct iwl_notif_statistics statistics;
1127 unsigned long last_statistics_time; 1127#ifdef CONFIG_IWLWIFI_DEBUG
1128 struct iwl_notif_statistics accum_statistics;
1129#endif
1128 1130
1129 /* context information */ 1131 /* context information */
1130 u16 rates_mask; 1132 u16 rates_mask;
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c
index 493626bcd3e..7ad327ef9cb 100644
--- a/drivers/net/wireless/iwlwifi/iwl-rx.c
+++ b/drivers/net/wireless/iwlwifi/iwl-rx.c
@@ -548,6 +548,44 @@ static void iwl_rx_calc_noise(struct iwl_priv *priv)
548 priv->last_rx_noise); 548 priv->last_rx_noise);
549} 549}
550 550
551#ifdef CONFIG_IWLWIFI_DEBUG
552/*
553 * based on the assumption of all statistics counter are in DWORD
554 * FIXME: This function is for debugging, do not deal with
555 * the case of counters roll-over.
556 */
557static void iwl_accumulative_statistics(struct iwl_priv *priv,
558 __le32 *stats)
559{
560 int i;
561 __le32 *prev_stats;
562 u32 *accum_stats;
563
564 prev_stats = (__le32 *)&priv->statistics;
565 accum_stats = (u32 *)&priv->accum_statistics;
566
567 for (i = sizeof(__le32); i < sizeof(struct iwl_notif_statistics);
568 i += sizeof(__le32), stats++, prev_stats++, accum_stats++)
569 if (le32_to_cpu(*stats) > le32_to_cpu(*prev_stats))
570 *accum_stats += (le32_to_cpu(*stats) -
571 le32_to_cpu(*prev_stats));
572
573 /* reset accumulative statistics for "no-counter" type statistics */
574 priv->accum_statistics.general.temperature =
575 priv->statistics.general.temperature;
576 priv->accum_statistics.general.temperature_m =
577 priv->statistics.general.temperature_m;
578 priv->accum_statistics.general.ttl_timestamp =
579 priv->statistics.general.ttl_timestamp;
580 priv->accum_statistics.tx.tx_power.ant_a =
581 priv->statistics.tx.tx_power.ant_a;
582 priv->accum_statistics.tx.tx_power.ant_b =
583 priv->statistics.tx.tx_power.ant_b;
584 priv->accum_statistics.tx.tx_power.ant_c =
585 priv->statistics.tx.tx_power.ant_c;
586}
587#endif
588
551#define REG_RECALIB_PERIOD (60) 589#define REG_RECALIB_PERIOD (60)
552 590
553void iwl_rx_statistics(struct iwl_priv *priv, 591void iwl_rx_statistics(struct iwl_priv *priv,
@@ -566,6 +604,9 @@ void iwl_rx_statistics(struct iwl_priv *priv,
566 STATISTICS_REPLY_FLG_HT40_MODE_MSK) != 604 STATISTICS_REPLY_FLG_HT40_MODE_MSK) !=
567 (pkt->u.stats.flag & STATISTICS_REPLY_FLG_HT40_MODE_MSK))); 605 (pkt->u.stats.flag & STATISTICS_REPLY_FLG_HT40_MODE_MSK)));
568 606
607#ifdef CONFIG_IWLWIFI_DEBUG
608 iwl_accumulative_statistics(priv, (__le32 *)&pkt->u.stats);
609#endif
569 memcpy(&priv->statistics, &pkt->u.stats, sizeof(priv->statistics)); 610 memcpy(&priv->statistics, &pkt->u.stats, sizeof(priv->statistics));
570 611
571 set_bit(STATUS_STATISTICS, &priv->status); 612 set_bit(STATUS_STATISTICS, &priv->status);