aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--drivers/net/wireless/ath/ath10k/debug.c127
-rw-r--r--drivers/net/wireless/ath/ath10k/debug.h5
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi.c165
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi.h24
4 files changed, 180 insertions, 141 deletions
diff --git a/drivers/net/wireless/ath/ath10k/debug.c b/drivers/net/wireless/ath/ath10k/debug.c
index 5d44a4320ad0..906319f49ca2 100644
--- a/drivers/net/wireless/ath/ath10k/debug.c
+++ b/drivers/net/wireless/ath/ath10k/debug.c
@@ -239,133 +239,22 @@ static const struct file_operations fops_wmi_services = {
239 .llseek = default_llseek, 239 .llseek = default_llseek,
240}; 240};
241 241
242void ath10k_debug_read_target_stats(struct ath10k *ar, 242void ath10k_debug_read_target_stats(struct ath10k *ar, struct sk_buff *skb)
243 struct wmi_stats_event *ev)
244{ 243{
245 u8 *tmp = ev->data; 244 int ret;
246 struct ath10k_target_stats *stats;
247 int num_pdev_stats, num_vdev_stats, num_peer_stats;
248 struct wmi_pdev_stats_10x *ps;
249 int i;
250 245
251 spin_lock_bh(&ar->data_lock); 246 spin_lock_bh(&ar->data_lock);
252 247
253 stats = &ar->debug.target_stats; 248 ret = ath10k_wmi_pull_fw_stats(ar, skb, &ar->debug.target_stats);
254 249 if (ret) {
255 num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats); /* 0 or 1 */ 250 ath10k_warn(ar, "failed to pull fw stats: %d\n", ret);
256 num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats); /* 0 or max vdevs */ 251 goto unlock;
257 num_peer_stats = __le32_to_cpu(ev->num_peer_stats); /* 0 or max peers */
258
259 if (num_pdev_stats) {
260 ps = (struct wmi_pdev_stats_10x *)tmp;
261
262 stats->ch_noise_floor = __le32_to_cpu(ps->chan_nf);
263 stats->tx_frame_count = __le32_to_cpu(ps->tx_frame_count);
264 stats->rx_frame_count = __le32_to_cpu(ps->rx_frame_count);
265 stats->rx_clear_count = __le32_to_cpu(ps->rx_clear_count);
266 stats->cycle_count = __le32_to_cpu(ps->cycle_count);
267 stats->phy_err_count = __le32_to_cpu(ps->phy_err_count);
268 stats->chan_tx_power = __le32_to_cpu(ps->chan_tx_pwr);
269
270 stats->comp_queued = __le32_to_cpu(ps->wal.tx.comp_queued);
271 stats->comp_delivered =
272 __le32_to_cpu(ps->wal.tx.comp_delivered);
273 stats->msdu_enqued = __le32_to_cpu(ps->wal.tx.msdu_enqued);
274 stats->mpdu_enqued = __le32_to_cpu(ps->wal.tx.mpdu_enqued);
275 stats->wmm_drop = __le32_to_cpu(ps->wal.tx.wmm_drop);
276 stats->local_enqued = __le32_to_cpu(ps->wal.tx.local_enqued);
277 stats->local_freed = __le32_to_cpu(ps->wal.tx.local_freed);
278 stats->hw_queued = __le32_to_cpu(ps->wal.tx.hw_queued);
279 stats->hw_reaped = __le32_to_cpu(ps->wal.tx.hw_reaped);
280 stats->underrun = __le32_to_cpu(ps->wal.tx.underrun);
281 stats->tx_abort = __le32_to_cpu(ps->wal.tx.tx_abort);
282 stats->mpdus_requed = __le32_to_cpu(ps->wal.tx.mpdus_requed);
283 stats->tx_ko = __le32_to_cpu(ps->wal.tx.tx_ko);
284 stats->data_rc = __le32_to_cpu(ps->wal.tx.data_rc);
285 stats->self_triggers = __le32_to_cpu(ps->wal.tx.self_triggers);
286 stats->sw_retry_failure =
287 __le32_to_cpu(ps->wal.tx.sw_retry_failure);
288 stats->illgl_rate_phy_err =
289 __le32_to_cpu(ps->wal.tx.illgl_rate_phy_err);
290 stats->pdev_cont_xretry =
291 __le32_to_cpu(ps->wal.tx.pdev_cont_xretry);
292 stats->pdev_tx_timeout =
293 __le32_to_cpu(ps->wal.tx.pdev_tx_timeout);
294 stats->pdev_resets = __le32_to_cpu(ps->wal.tx.pdev_resets);
295 stats->phy_underrun = __le32_to_cpu(ps->wal.tx.phy_underrun);
296 stats->txop_ovf = __le32_to_cpu(ps->wal.tx.txop_ovf);
297
298 stats->mid_ppdu_route_change =
299 __le32_to_cpu(ps->wal.rx.mid_ppdu_route_change);
300 stats->status_rcvd = __le32_to_cpu(ps->wal.rx.status_rcvd);
301 stats->r0_frags = __le32_to_cpu(ps->wal.rx.r0_frags);
302 stats->r1_frags = __le32_to_cpu(ps->wal.rx.r1_frags);
303 stats->r2_frags = __le32_to_cpu(ps->wal.rx.r2_frags);
304 stats->r3_frags = __le32_to_cpu(ps->wal.rx.r3_frags);
305 stats->htt_msdus = __le32_to_cpu(ps->wal.rx.htt_msdus);
306 stats->htt_mpdus = __le32_to_cpu(ps->wal.rx.htt_mpdus);
307 stats->loc_msdus = __le32_to_cpu(ps->wal.rx.loc_msdus);
308 stats->loc_mpdus = __le32_to_cpu(ps->wal.rx.loc_mpdus);
309 stats->oversize_amsdu =
310 __le32_to_cpu(ps->wal.rx.oversize_amsdu);
311 stats->phy_errs = __le32_to_cpu(ps->wal.rx.phy_errs);
312 stats->phy_err_drop = __le32_to_cpu(ps->wal.rx.phy_err_drop);
313 stats->mpdu_errs = __le32_to_cpu(ps->wal.rx.mpdu_errs);
314
315 if (test_bit(ATH10K_FW_FEATURE_WMI_10X,
316 ar->fw_features)) {
317 stats->ack_rx_bad = __le32_to_cpu(ps->ack_rx_bad);
318 stats->rts_bad = __le32_to_cpu(ps->rts_bad);
319 stats->rts_good = __le32_to_cpu(ps->rts_good);
320 stats->fcs_bad = __le32_to_cpu(ps->fcs_bad);
321 stats->no_beacons = __le32_to_cpu(ps->no_beacons);
322 stats->mib_int_count = __le32_to_cpu(ps->mib_int_count);
323 tmp += sizeof(struct wmi_pdev_stats_10x);
324 } else {
325 tmp += sizeof(struct wmi_pdev_stats_old);
326 }
327 }
328
329 /* 0 or max vdevs */
330 /* Currently firmware does not support VDEV stats */
331 if (num_vdev_stats) {
332 struct wmi_vdev_stats *vdev_stats;
333
334 for (i = 0; i < num_vdev_stats; i++) {
335 vdev_stats = (struct wmi_vdev_stats *)tmp;
336 tmp += sizeof(struct wmi_vdev_stats);
337 }
338 } 252 }
339 253
340 if (num_peer_stats) { 254 complete(&ar->debug.event_stats_compl);
341 struct wmi_peer_stats_10x *peer_stats;
342 struct ath10k_peer_stat *s;
343
344 stats->peers = num_peer_stats;
345
346 for (i = 0; i < num_peer_stats; i++) {
347 peer_stats = (struct wmi_peer_stats_10x *)tmp;
348 s = &stats->peer_stat[i];
349
350 memcpy(s->peer_macaddr, &peer_stats->peer_macaddr.addr,
351 ETH_ALEN);
352 s->peer_rssi = __le32_to_cpu(peer_stats->peer_rssi);
353 s->peer_tx_rate =
354 __le32_to_cpu(peer_stats->peer_tx_rate);
355 if (test_bit(ATH10K_FW_FEATURE_WMI_10X,
356 ar->fw_features)) {
357 s->peer_rx_rate =
358 __le32_to_cpu(peer_stats->peer_rx_rate);
359 tmp += sizeof(struct wmi_peer_stats_10x);
360
361 } else {
362 tmp += sizeof(struct wmi_peer_stats_old);
363 }
364 }
365 }
366 255
256unlock:
367 spin_unlock_bh(&ar->data_lock); 257 spin_unlock_bh(&ar->data_lock);
368 complete(&ar->debug.event_stats_compl);
369} 258}
370 259
371static ssize_t ath10k_read_fw_stats(struct file *file, char __user *user_buf, 260static ssize_t ath10k_read_fw_stats(struct file *file, char __user *user_buf,
diff --git a/drivers/net/wireless/ath/ath10k/debug.h b/drivers/net/wireless/ath/ath10k/debug.h
index 4ae0d8030dce..8d8b68eb04e6 100644
--- a/drivers/net/wireless/ath/ath10k/debug.h
+++ b/drivers/net/wireless/ath/ath10k/debug.h
@@ -55,8 +55,7 @@ void ath10k_debug_unregister(struct ath10k *ar);
55void ath10k_debug_read_service_map(struct ath10k *ar, 55void ath10k_debug_read_service_map(struct ath10k *ar,
56 const void *service_map, 56 const void *service_map,
57 size_t map_size); 57 size_t map_size);
58void ath10k_debug_read_target_stats(struct ath10k *ar, 58void ath10k_debug_read_target_stats(struct ath10k *ar, struct sk_buff *skb);
59 struct wmi_stats_event *ev);
60struct ath10k_fw_crash_data * 59struct ath10k_fw_crash_data *
61ath10k_debug_get_new_fw_crash_data(struct ath10k *ar); 60ath10k_debug_get_new_fw_crash_data(struct ath10k *ar);
62 61
@@ -99,7 +98,7 @@ static inline void ath10k_debug_read_service_map(struct ath10k *ar,
99} 98}
100 99
101static inline void ath10k_debug_read_target_stats(struct ath10k *ar, 100static inline void ath10k_debug_read_target_stats(struct ath10k *ar,
102 struct wmi_stats_event *ev) 101 struct sk_buff *skb)
103{ 102{
104} 103}
105 104
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,
diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h
index 55d8317ce1a5..4ce8e3c9ca81 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.h
+++ b/drivers/net/wireless/ath/ath10k/wmi.h
@@ -3021,7 +3021,7 @@ struct wmi_stats_event {
3021 * PDEV statistics 3021 * PDEV statistics
3022 * TODO: add all PDEV stats here 3022 * TODO: add all PDEV stats here
3023 */ 3023 */
3024struct wmi_pdev_stats_old { 3024struct wmi_pdev_stats {
3025 __le32 chan_nf; /* Channel noise floor */ 3025 __le32 chan_nf; /* Channel noise floor */
3026 __le32 tx_frame_count; /* TX frame count */ 3026 __le32 tx_frame_count; /* TX frame count */
3027 __le32 rx_frame_count; /* RX frame count */ 3027 __le32 rx_frame_count; /* RX frame count */
@@ -3032,15 +3032,8 @@ struct wmi_pdev_stats_old {
3032 struct wal_dbg_stats wal; /* WAL dbg stats */ 3032 struct wal_dbg_stats wal; /* WAL dbg stats */
3033} __packed; 3033} __packed;
3034 3034
3035struct wmi_pdev_stats_10x { 3035struct wmi_10x_pdev_stats {
3036 __le32 chan_nf; /* Channel noise floor */ 3036 struct wmi_pdev_stats old;
3037 __le32 tx_frame_count; /* TX frame count */
3038 __le32 rx_frame_count; /* RX frame count */
3039 __le32 rx_clear_count; /* rx clear count */
3040 __le32 cycle_count; /* cycle count */
3041 __le32 phy_err_count; /* Phy error count */
3042 __le32 chan_tx_pwr; /* channel tx power */
3043 struct wal_dbg_stats wal; /* WAL dbg stats */
3044 __le32 ack_rx_bad; 3037 __le32 ack_rx_bad;
3045 __le32 rts_bad; 3038 __le32 rts_bad;
3046 __le32 rts_good; 3039 __le32 rts_good;
@@ -3061,16 +3054,14 @@ struct wmi_vdev_stats {
3061 * peer statistics. 3054 * peer statistics.
3062 * TODO: add more stats 3055 * TODO: add more stats
3063 */ 3056 */
3064struct wmi_peer_stats_old { 3057struct wmi_peer_stats {
3065 struct wmi_mac_addr peer_macaddr; 3058 struct wmi_mac_addr peer_macaddr;
3066 __le32 peer_rssi; 3059 __le32 peer_rssi;
3067 __le32 peer_tx_rate; 3060 __le32 peer_tx_rate;
3068} __packed; 3061} __packed;
3069 3062
3070struct wmi_peer_stats_10x { 3063struct wmi_10x_peer_stats {
3071 struct wmi_mac_addr peer_macaddr; 3064 struct wmi_peer_stats old;
3072 __le32 peer_rssi;
3073 __le32 peer_tx_rate;
3074 __le32 peer_rx_rate; 3065 __le32 peer_rx_rate;
3075} __packed; 3066} __packed;
3076 3067
@@ -4582,6 +4573,7 @@ struct wmi_svc_rdy_ev_arg {
4582 4573
4583struct ath10k; 4574struct ath10k;
4584struct ath10k_vif; 4575struct ath10k_vif;
4576struct ath10k_target_stats;
4585 4577
4586int ath10k_wmi_attach(struct ath10k *ar); 4578int ath10k_wmi_attach(struct ath10k *ar);
4587void ath10k_wmi_detach(struct ath10k *ar); 4579void ath10k_wmi_detach(struct ath10k *ar);
@@ -4653,5 +4645,7 @@ int ath10k_wmi_force_fw_hang(struct ath10k *ar,
4653 enum wmi_force_fw_hang_type type, u32 delay_ms); 4645 enum wmi_force_fw_hang_type type, u32 delay_ms);
4654int ath10k_wmi_mgmt_tx(struct ath10k *ar, struct sk_buff *skb); 4646int ath10k_wmi_mgmt_tx(struct ath10k *ar, struct sk_buff *skb);
4655int ath10k_wmi_dbglog_cfg(struct ath10k *ar, u32 module_enable); 4647int ath10k_wmi_dbglog_cfg(struct ath10k *ar, u32 module_enable);
4648int ath10k_wmi_pull_fw_stats(struct ath10k *ar, struct sk_buff *skb,
4649 struct ath10k_target_stats *stats);
4656 4650
4657#endif /* _WMI_H_ */ 4651#endif /* _WMI_H_ */