aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath10k/wmi.c
diff options
context:
space:
mode:
authorMichal Kazior <michal.kazior@tieto.com>2014-09-25 06:33:47 -0400
committerKalle Valo <kvalo@qca.qualcomm.com>2014-09-29 07:30:24 -0400
commitd15fb52006645f9ef1f62313ba19ef29d1a12bf9 (patch)
tree4e6c4cc9a42de49d3801bd6fa1904380b315f2e9 /drivers/net/wireless/ath/ath10k/wmi.c
parentbabcb3edd942927091ef5e5b284ffc657c652023 (diff)
ath10k: split wmi stats parsing
The parsing function was rather complex. Simplify by splitting it up into firmware branch specific implementations. While at it move the parsing code into wmi.c where it belongs. Signed-off-by: Michal Kazior <michal.kazior@tieto.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath10k/wmi.c')
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi.c165
1 files changed, 161 insertions, 4 deletions
diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
index bfc1fb3708c5..8e2d0217686d 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -1329,14 +1329,171 @@ static int ath10k_wmi_event_debug_mesg(struct ath10k *ar, struct sk_buff *skb)
1329 return 0; 1329 return 0;
1330} 1330}
1331 1331
1332static void ath10k_wmi_pull_pdev_stats(const struct wmi_pdev_stats *src,
1333 struct ath10k_target_stats *dst)
1334{
1335 const struct wal_dbg_tx_stats *tx = &src->wal.tx;
1336 const struct wal_dbg_rx_stats *rx = &src->wal.rx;
1337
1338 dst->ch_noise_floor = __le32_to_cpu(src->chan_nf);
1339 dst->tx_frame_count = __le32_to_cpu(src->tx_frame_count);
1340 dst->rx_frame_count = __le32_to_cpu(src->rx_frame_count);
1341 dst->rx_clear_count = __le32_to_cpu(src->rx_clear_count);
1342 dst->cycle_count = __le32_to_cpu(src->cycle_count);
1343 dst->phy_err_count = __le32_to_cpu(src->phy_err_count);
1344 dst->chan_tx_power = __le32_to_cpu(src->chan_tx_pwr);
1345
1346 dst->comp_queued = __le32_to_cpu(tx->comp_queued);
1347 dst->comp_delivered = __le32_to_cpu(tx->comp_delivered);
1348 dst->msdu_enqued = __le32_to_cpu(tx->msdu_enqued);
1349 dst->mpdu_enqued = __le32_to_cpu(tx->mpdu_enqued);
1350 dst->wmm_drop = __le32_to_cpu(tx->wmm_drop);
1351 dst->local_enqued = __le32_to_cpu(tx->local_enqued);
1352 dst->local_freed = __le32_to_cpu(tx->local_freed);
1353 dst->hw_queued = __le32_to_cpu(tx->hw_queued);
1354 dst->hw_reaped = __le32_to_cpu(tx->hw_reaped);
1355 dst->underrun = __le32_to_cpu(tx->underrun);
1356 dst->tx_abort = __le32_to_cpu(tx->tx_abort);
1357 dst->mpdus_requed = __le32_to_cpu(tx->mpdus_requed);
1358 dst->tx_ko = __le32_to_cpu(tx->tx_ko);
1359 dst->data_rc = __le32_to_cpu(tx->data_rc);
1360 dst->self_triggers = __le32_to_cpu(tx->self_triggers);
1361 dst->sw_retry_failure = __le32_to_cpu(tx->sw_retry_failure);
1362 dst->illgl_rate_phy_err = __le32_to_cpu(tx->illgl_rate_phy_err);
1363 dst->pdev_cont_xretry = __le32_to_cpu(tx->pdev_cont_xretry);
1364 dst->pdev_tx_timeout = __le32_to_cpu(tx->pdev_tx_timeout);
1365 dst->pdev_resets = __le32_to_cpu(tx->pdev_resets);
1366 dst->phy_underrun = __le32_to_cpu(tx->phy_underrun);
1367 dst->txop_ovf = __le32_to_cpu(tx->txop_ovf);
1368
1369 dst->mid_ppdu_route_change = __le32_to_cpu(rx->mid_ppdu_route_change);
1370 dst->status_rcvd = __le32_to_cpu(rx->status_rcvd);
1371 dst->r0_frags = __le32_to_cpu(rx->r0_frags);
1372 dst->r1_frags = __le32_to_cpu(rx->r1_frags);
1373 dst->r2_frags = __le32_to_cpu(rx->r2_frags);
1374 dst->r3_frags = __le32_to_cpu(rx->r3_frags);
1375 dst->htt_msdus = __le32_to_cpu(rx->htt_msdus);
1376 dst->htt_mpdus = __le32_to_cpu(rx->htt_mpdus);
1377 dst->loc_msdus = __le32_to_cpu(rx->loc_msdus);
1378 dst->loc_mpdus = __le32_to_cpu(rx->loc_mpdus);
1379 dst->oversize_amsdu = __le32_to_cpu(rx->oversize_amsdu);
1380 dst->phy_errs = __le32_to_cpu(rx->phy_errs);
1381 dst->phy_err_drop = __le32_to_cpu(rx->phy_err_drop);
1382 dst->mpdu_errs = __le32_to_cpu(rx->mpdu_errs);
1383}
1384
1385static void ath10k_wmi_pull_peer_stats(const struct wmi_peer_stats *src,
1386 struct ath10k_peer_stat *dst)
1387{
1388 ether_addr_copy(dst->peer_macaddr, src->peer_macaddr.addr);
1389 dst->peer_rssi = __le32_to_cpu(src->peer_rssi);
1390 dst->peer_tx_rate = __le32_to_cpu(src->peer_tx_rate);
1391}
1392
1393static int ath10k_wmi_main_pull_fw_stats(struct ath10k *ar,
1394 struct sk_buff *skb,
1395 struct ath10k_target_stats *stats)
1396{
1397 const struct wmi_stats_event *ev = (void *)skb->data;
1398 u32 num_pdev_stats, num_vdev_stats, num_peer_stats;
1399 int i;
1400
1401 if (!skb_pull(skb, sizeof(*ev)))
1402 return -EPROTO;
1403
1404 num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
1405 num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats);
1406 num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
1407
1408 if (num_pdev_stats) {
1409 const struct wmi_pdev_stats *src;
1410
1411 src = (void *)skb->data;
1412 if (!skb_pull(skb, sizeof(*src)))
1413 return -EPROTO;
1414
1415 ath10k_wmi_pull_pdev_stats(src, stats);
1416 }
1417
1418 /* fw doesn't implement vdev stats */
1419
1420 for (i = 0; i < num_peer_stats; i++) {
1421 const struct wmi_peer_stats *src;
1422
1423 src = (void *)skb->data;
1424 if (!skb_pull(skb, sizeof(*src)))
1425 return -EPROTO;
1426
1427 ath10k_wmi_pull_peer_stats(src, &stats->peer_stat[i]);
1428 }
1429
1430 return 0;
1431}
1432
1433static int ath10k_wmi_10x_pull_fw_stats(struct ath10k *ar,
1434 struct sk_buff *skb,
1435 struct ath10k_target_stats *stats)
1436{
1437 const struct wmi_stats_event *ev = (void *)skb->data;
1438 u32 num_pdev_stats, num_vdev_stats, num_peer_stats;
1439 int i;
1440
1441 if (!skb_pull(skb, sizeof(*ev)))
1442 return -EPROTO;
1443
1444 num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
1445 num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats);
1446 num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
1447
1448 if (num_pdev_stats) {
1449 const struct wmi_10x_pdev_stats *src;
1450
1451 src = (void *)skb->data;
1452 if (!skb_pull(skb, sizeof(*src)))
1453 return -EPROTO;
1454
1455 ath10k_wmi_pull_pdev_stats(&src->old, stats);
1456
1457 stats->ack_rx_bad = __le32_to_cpu(src->ack_rx_bad);
1458 stats->rts_bad = __le32_to_cpu(src->rts_bad);
1459 stats->rts_good = __le32_to_cpu(src->rts_good);
1460 stats->fcs_bad = __le32_to_cpu(src->fcs_bad);
1461 stats->no_beacons = __le32_to_cpu(src->no_beacons);
1462 stats->mib_int_count = __le32_to_cpu(src->mib_int_count);
1463 }
1464
1465 /* fw doesn't implement vdev stats */
1466
1467 for (i = 0; i < num_peer_stats; i++) {
1468 const struct wmi_10x_peer_stats *src;
1469
1470 src = (void *)skb->data;
1471 if (!skb_pull(skb, sizeof(*src)))
1472 return -EPROTO;
1473
1474 ath10k_wmi_pull_peer_stats(&src->old, &stats->peer_stat[i]);
1475
1476 stats->peer_stat[i].peer_rx_rate =
1477 __le32_to_cpu(src->peer_rx_rate);
1478 }
1479
1480 return 0;
1481}
1482
1483int ath10k_wmi_pull_fw_stats(struct ath10k *ar, struct sk_buff *skb,
1484 struct ath10k_target_stats *stats)
1485{
1486 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features))
1487 return ath10k_wmi_10x_pull_fw_stats(ar, skb, stats);
1488 else
1489 return ath10k_wmi_main_pull_fw_stats(ar, skb, stats);
1490}
1491
1332static void ath10k_wmi_event_update_stats(struct ath10k *ar, 1492static void ath10k_wmi_event_update_stats(struct ath10k *ar,
1333 struct sk_buff *skb) 1493 struct sk_buff *skb)
1334{ 1494{
1335 struct wmi_stats_event *ev = (struct wmi_stats_event *)skb->data;
1336
1337 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_UPDATE_STATS_EVENTID\n"); 1495 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_UPDATE_STATS_EVENTID\n");
1338 1496 ath10k_debug_read_target_stats(ar, skb);
1339 ath10k_debug_read_target_stats(ar, ev);
1340} 1497}
1341 1498
1342static void ath10k_wmi_event_vdev_start_resp(struct ath10k *ar, 1499static void ath10k_wmi_event_vdev_start_resp(struct ath10k *ar,