Skip to content

Commit 5601af3

Browse files
krish2718kartben
authored andcommitted
drivers: nrf_wifi: Rejig the statistics
Separate out host(local) and FW(remote) statistics and in case of a FW statistics timeout, return success with a magic value in the FW statistics, this way atleast host statistics would be handy for debugging instead of sending failure up. Signed-off-by: Chaitanya Tata <Chaitanya.Tata@nordicsemi.no>
1 parent a26fff8 commit 5601af3

File tree

1 file changed

+24
-12
lines changed

1 file changed

+24
-12
lines changed

drivers/wifi/nrf_wifi/src/net_if.c

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,9 +1208,7 @@ int nrf_wifi_stats_get(const struct device *dev, struct net_stats_wifi *zstats)
12081208
enum nrf_wifi_status status = NRF_WIFI_STATUS_FAIL;
12091209
struct nrf_wifi_ctx_zep *rpu_ctx_zep = NULL;
12101210
struct nrf_wifi_vif_ctx_zep *vif_ctx_zep = NULL;
1211-
#ifdef CONFIG_NRF70_RAW_DATA_TX
12121211
struct nrf_wifi_sys_fmac_dev_ctx *sys_dev_ctx = NULL;
1213-
#endif /* CONFIG_NRF70_RAW_DATA_TX */
12141212
struct rpu_sys_op_stats stats;
12151213
int ret = -1;
12161214

@@ -1241,19 +1239,38 @@ int nrf_wifi_stats_get(const struct device *dev, struct net_stats_wifi *zstats)
12411239
__func__);
12421240
goto unlock;
12431241
}
1244-
1245-
memset(&stats, 0, sizeof(struct rpu_sys_op_stats));
1246-
status = nrf_wifi_sys_fmac_stats_get(rpu_ctx_zep->rpu_ctx, 0, &stats);
1247-
if (status != NRF_WIFI_STATUS_SUCCESS) {
1248-
LOG_ERR("%s: nrf_wifi_fmac_stats_get failed", __func__);
1242+
sys_dev_ctx = wifi_dev_priv(rpu_ctx_zep->rpu_ctx);
1243+
if (!sys_dev_ctx) {
1244+
LOG_ERR("%s: sys_dev_ctx is NULL", __func__);
12491245
goto unlock;
12501246
}
12511247

1248+
memset(&stats, 0, sizeof(struct rpu_sys_op_stats));
1249+
/* Host statistics */
1250+
nrf_wifi_osal_mem_cpy(&stats.host,
1251+
&sys_dev_ctx->host_stats,
1252+
sizeof(sys_dev_ctx->host_stats));
12521253
zstats->pkts.tx = stats.host.total_tx_pkts;
12531254
zstats->pkts.rx = stats.host.total_rx_pkts;
12541255
zstats->errors.tx = stats.host.total_tx_drop_pkts;
12551256
zstats->errors.rx = stats.host.total_rx_drop_pkts +
12561257
stats.fw.umac.interface_data_stats.rx_checksum_error_count;
1258+
zstats->overrun_count = stats.host.total_tx_drop_pkts + stats.host.total_rx_drop_pkts;
1259+
#ifdef CONFIG_NRF70_RAW_DATA_TX
1260+
zstats->errors.tx += sys_dev_ctx->raw_pkt_stats.raw_pkt_send_failure;
1261+
#endif /* CONFIG_NRF70_RAW_DATA_TX */
1262+
1263+
/* FMAC statistics */
1264+
status = nrf_wifi_sys_fmac_stats_get(rpu_ctx_zep->rpu_ctx, 0, &stats);
1265+
if (status != NRF_WIFI_STATUS_SUCCESS) {
1266+
LOG_WRN("%s: nrf_wifi_fmac_stats_get failed", __func__);
1267+
/* Special value to indicate that
1268+
* statistics are not available.
1269+
*/
1270+
memset(&stats.fw.umac.interface_data_stats, 0xAA,
1271+
sizeof(stats.fw.umac.interface_data_stats));
1272+
}
1273+
12571274
zstats->bytes.received = stats.fw.umac.interface_data_stats.rx_bytes;
12581275
zstats->bytes.sent = stats.fw.umac.interface_data_stats.tx_bytes;
12591276
zstats->sta_mgmt.beacons_rx = stats.fw.umac.interface_data_stats.rx_beacon_success_count;
@@ -1264,12 +1281,7 @@ int nrf_wifi_stats_get(const struct device *dev, struct net_stats_wifi *zstats)
12641281
zstats->multicast.tx = stats.fw.umac.interface_data_stats.tx_multicast_pkt_count;
12651282
zstats->unicast.rx = stats.fw.umac.interface_data_stats.rx_unicast_pkt_count;
12661283
zstats->unicast.tx = stats.fw.umac.interface_data_stats.tx_unicast_pkt_count;
1267-
zstats->overrun_count = stats.host.total_tx_drop_pkts + stats.host.total_rx_drop_pkts;
12681284

1269-
#ifdef CONFIG_NRF70_RAW_DATA_TX
1270-
sys_dev_ctx = wifi_dev_priv(rpu_ctx_zep->rpu_ctx);
1271-
zstats->errors.tx += sys_dev_ctx->raw_pkt_stats.raw_pkt_send_failure;
1272-
#endif /* CONFIG_NRF70_RAW_DATA_TX */
12731285
ret = 0;
12741286
unlock:
12751287
k_mutex_unlock(&vif_ctx_zep->vif_lock);

0 commit comments

Comments
 (0)