126 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2 3#include "wcn36xx.h"4#include "firmware.h"5 6#define DEFINE(s)[s] = #s7 8static const char * const wcn36xx_firmware_caps_names[] = {9 DEFINE(MCC),10 DEFINE(P2P),11 DEFINE(DOT11AC),12 DEFINE(SLM_SESSIONIZATION),13 DEFINE(DOT11AC_OPMODE),14 DEFINE(SAP32STA),15 DEFINE(TDLS),16 DEFINE(P2P_GO_NOA_DECOUPLE_INIT_SCAN),17 DEFINE(WLANACTIVE_OFFLOAD),18 DEFINE(BEACON_OFFLOAD),19 DEFINE(SCAN_OFFLOAD),20 DEFINE(ROAM_OFFLOAD),21 DEFINE(BCN_MISS_OFFLOAD),22 DEFINE(STA_POWERSAVE),23 DEFINE(STA_ADVANCED_PWRSAVE),24 DEFINE(AP_UAPSD),25 DEFINE(AP_DFS),26 DEFINE(BLOCKACK),27 DEFINE(PHY_ERR),28 DEFINE(BCN_FILTER),29 DEFINE(RTT),30 DEFINE(RATECTRL),31 DEFINE(WOW),32 DEFINE(WLAN_ROAM_SCAN_OFFLOAD),33 DEFINE(SPECULATIVE_PS_POLL),34 DEFINE(SCAN_SCH),35 DEFINE(IBSS_HEARTBEAT_OFFLOAD),36 DEFINE(WLAN_SCAN_OFFLOAD),37 DEFINE(WLAN_PERIODIC_TX_PTRN),38 DEFINE(ADVANCE_TDLS),39 DEFINE(BATCH_SCAN),40 DEFINE(FW_IN_TX_PATH),41 DEFINE(EXTENDED_NSOFFLOAD_SLOT),42 DEFINE(CH_SWITCH_V1),43 DEFINE(HT40_OBSS_SCAN),44 DEFINE(UPDATE_CHANNEL_LIST),45 DEFINE(WLAN_MCADDR_FLT),46 DEFINE(WLAN_CH144),47 DEFINE(NAN),48 DEFINE(TDLS_SCAN_COEXISTENCE),49 DEFINE(LINK_LAYER_STATS_MEAS),50 DEFINE(MU_MIMO),51 DEFINE(EXTENDED_SCAN),52 DEFINE(DYNAMIC_WMM_PS),53 DEFINE(MAC_SPOOFED_SCAN),54 DEFINE(BMU_ERROR_GENERIC_RECOVERY),55 DEFINE(DISA),56 DEFINE(FW_STATS),57 DEFINE(WPS_PRBRSP_TMPL),58 DEFINE(BCN_IE_FLT_DELTA),59 DEFINE(TDLS_OFF_CHANNEL),60 DEFINE(RTT3),61 DEFINE(MGMT_FRAME_LOGGING),62 DEFINE(ENHANCED_TXBD_COMPLETION),63 DEFINE(LOGGING_ENHANCEMENT),64 DEFINE(EXT_SCAN_ENHANCED),65 DEFINE(MEMORY_DUMP_SUPPORTED),66 DEFINE(PER_PKT_STATS_SUPPORTED),67 DEFINE(EXT_LL_STAT),68 DEFINE(WIFI_CONFIG),69 DEFINE(ANTENNA_DIVERSITY_SELECTION),70};71 72#undef DEFINE73 74const char *wcn36xx_firmware_get_cap_name(enum wcn36xx_firmware_feat_caps x)75{76 if (x >= ARRAY_SIZE(wcn36xx_firmware_caps_names))77 return "UNKNOWN";78 return wcn36xx_firmware_caps_names[x];79}80 81void wcn36xx_firmware_set_feat_caps(u32 *bitmap,82 enum wcn36xx_firmware_feat_caps cap)83{84 int arr_idx, bit_idx;85 86 if (cap < 0 || cap > 127) {87 wcn36xx_warn("error cap idx %d\n", cap);88 return;89 }90 91 arr_idx = cap / 32;92 bit_idx = cap % 32;93 bitmap[arr_idx] |= (1 << bit_idx);94}95 96int wcn36xx_firmware_get_feat_caps(u32 *bitmap,97 enum wcn36xx_firmware_feat_caps cap)98{99 int arr_idx, bit_idx;100 101 if (cap < 0 || cap > 127) {102 wcn36xx_warn("error cap idx %d\n", cap);103 return -EINVAL;104 }105 106 arr_idx = cap / 32;107 bit_idx = cap % 32;108 109 return (bitmap[arr_idx] & (1 << bit_idx)) ? 1 : 0;110}111 112void wcn36xx_firmware_clear_feat_caps(u32 *bitmap,113 enum wcn36xx_firmware_feat_caps cap)114{115 int arr_idx, bit_idx;116 117 if (cap < 0 || cap > 127) {118 wcn36xx_warn("error cap idx %d\n", cap);119 return;120 }121 122 arr_idx = cap / 32;123 bit_idx = cap % 32;124 bitmap[arr_idx] &= ~(1 << bit_idx);125}126