@@ -1213,6 +1213,16 @@ int nrf_wifi_if_set_config_zep(const struct device *dev,
1213
1213
struct net_stats_eth * nrf_wifi_eth_stats_get (const struct device * dev )
1214
1214
{
1215
1215
struct nrf_wifi_vif_ctx_zep * vif_ctx_zep = NULL ;
1216
+ #ifdef CONFIG_NET_STATISTICS_ETHERNET_VENDOR
1217
+ struct nrf_wifi_ctx_zep * rpu_ctx_zep = NULL ;
1218
+ struct rpu_sys_op_stats stats ;
1219
+ enum nrf_wifi_status status ;
1220
+ size_t fw_stats_size ;
1221
+ size_t num_uint32 ;
1222
+ const uint8_t * fw_stats_bytes ;
1223
+ size_t i ;
1224
+ int vendor_idx = 0 ;
1225
+ #endif /* CONFIG_NET_STATISTICS_ETHERNET_VENDOR */
1216
1226
1217
1227
if (!dev ) {
1218
1228
LOG_ERR ("%s Device not found" , __func__ );
@@ -1225,6 +1235,69 @@ struct net_stats_eth *nrf_wifi_eth_stats_get(const struct device *dev)
1225
1235
goto out ;
1226
1236
}
1227
1237
1238
+ #ifdef CONFIG_NET_STATISTICS_ETHERNET_VENDOR
1239
+ rpu_ctx_zep = vif_ctx_zep -> rpu_ctx_zep ;
1240
+ if (!rpu_ctx_zep || !rpu_ctx_zep -> rpu_ctx ) {
1241
+ LOG_ERR ("%s: rpu_ctx_zep or rpu_ctx is NULL" , __func__ );
1242
+ goto out ;
1243
+ }
1244
+
1245
+ memset (& stats , 0 , sizeof (stats ));
1246
+ status = nrf_wifi_sys_fmac_stats_get (rpu_ctx_zep -> rpu_ctx ,
1247
+ RPU_STATS_TYPE_ALL ,
1248
+ & stats );
1249
+ if (status != NRF_WIFI_STATUS_SUCCESS ) {
1250
+ LOG_ERR ("%s: Failed to get RPU stats" , __func__ );
1251
+ goto ret ;
1252
+ }
1253
+
1254
+ /* Treat stats.fw as a blob and divide into uint32_t chunks */
1255
+ fw_stats_size = sizeof (stats .fw );
1256
+ num_uint32 = fw_stats_size / sizeof (uint32_t );
1257
+ fw_stats_bytes = (const uint8_t * )& stats .fw ;
1258
+
1259
+ vendor_idx = 0 ;
1260
+
1261
+ for (i = 0 ; i < num_uint32 && vendor_idx < MAX_VENDOR_STATS - 1 ; i ++ ) {
1262
+ uint32_t val ;
1263
+ const char * * key_ptr ;
1264
+ uint32_t * val_ptr ;
1265
+
1266
+ /* Extract uint32_t value from blob */
1267
+ memcpy (& val , fw_stats_bytes + i * sizeof (uint32_t ), sizeof (uint32_t ));
1268
+
1269
+ /* Create key name */
1270
+ snprintk (vif_ctx_zep -> vendor_key_strings [vendor_idx ], 16 , "fw_%zu" , i );
1271
+
1272
+ /* Assign key */
1273
+ key_ptr = (const char * * )
1274
+ & vif_ctx_zep -> eth_stats_vendor_data [vendor_idx ].key ;
1275
+ * key_ptr = vif_ctx_zep -> vendor_key_strings [vendor_idx ];
1276
+
1277
+ /* Assign value */
1278
+ val_ptr = (uint32_t * )
1279
+ & vif_ctx_zep -> eth_stats_vendor_data [vendor_idx ].value ;
1280
+ * val_ptr = val ;
1281
+
1282
+ vendor_idx ++ ;
1283
+ }
1284
+
1285
+ /* Null terminator entry */
1286
+ {
1287
+ const char * * key_ptr = (const char * * )
1288
+ & vif_ctx_zep -> eth_stats_vendor_data [vendor_idx ].key ;
1289
+ uint32_t * val_ptr = (uint32_t * )
1290
+ & vif_ctx_zep -> eth_stats_vendor_data [vendor_idx ].value ;
1291
+
1292
+ * key_ptr = NULL ;
1293
+ * val_ptr = 0 ;
1294
+ }
1295
+
1296
+ /* Point to the static vendor data */
1297
+ vif_ctx_zep -> eth_stats .vendor = vif_ctx_zep -> eth_stats_vendor_data ;
1298
+
1299
+ ret :
1300
+ #endif /* CONFIG_NET_STATISTICS_ETHERNET_VENDOR */
1228
1301
return & vif_ctx_zep -> eth_stats ;
1229
1302
out :
1230
1303
return NULL ;
0 commit comments