// SPDX-License-Identifier: GPL-2.0-only #include "wcn36xx.h" #include "firmware.h" #define DEFINE(s)[s] = #s static const char * const wcn36xx_firmware_caps_names[] = { DEFINE(MCC), DEFINE(P2P), DEFINE(DOT11AC), DEFINE(SLM_SESSIONIZATION), DEFINE(DOT11AC_OPMODE), DEFINE(SAP32STA), DEFINE(TDLS), DEFINE(P2P_GO_NOA_DECOUPLE_INIT_SCAN), DEFINE(WLANACTIVE_OFFLOAD), DEFINE(BEACON_OFFLOAD), DEFINE(SCAN_OFFLOAD), DEFINE(ROAM_OFFLOAD), DEFINE(BCN_MISS_OFFLOAD), DEFINE(STA_POWERSAVE), DEFINE(STA_ADVANCED_PWRSAVE), DEFINE(AP_UAPSD), DEFINE(AP_DFS), DEFINE(BLOCKACK), DEFINE(PHY_ERR), DEFINE(BCN_FILTER), DEFINE(RTT), DEFINE(RATECTRL), DEFINE(WOW), DEFINE(WLAN_ROAM_SCAN_OFFLOAD), DEFINE(SPECULATIVE_PS_POLL), DEFINE(SCAN_SCH), DEFINE(IBSS_HEARTBEAT_OFFLOAD), DEFINE(WLAN_SCAN_OFFLOAD), DEFINE(WLAN_PERIODIC_TX_PTRN), DEFINE(ADVANCE_TDLS), DEFINE(BATCH_SCAN), DEFINE(FW_IN_TX_PATH), DEFINE(EXTENDED_NSOFFLOAD_SLOT), DEFINE(CH_SWITCH_V1), DEFINE(HT40_OBSS_SCAN), DEFINE(UPDATE_CHANNEL_LIST), DEFINE(WLAN_MCADDR_FLT), DEFINE(WLAN_CH144), DEFINE(NAN), DEFINE(TDLS_SCAN_COEXISTENCE), DEFINE(LINK_LAYER_STATS_MEAS), DEFINE(MU_MIMO), DEFINE(EXTENDED_SCAN), DEFINE(DYNAMIC_WMM_PS), DEFINE(MAC_SPOOFED_SCAN), DEFINE(BMU_ERROR_GENERIC_RECOVERY), DEFINE(DISA), DEFINE(FW_STATS), DEFINE(WPS_PRBRSP_TMPL), DEFINE(BCN_IE_FLT_DELTA), DEFINE(TDLS_OFF_CHANNEL), DEFINE(RTT3), DEFINE(MGMT_FRAME_LOGGING), DEFINE(ENHANCED_TXBD_COMPLETION), DEFINE(LOGGING_ENHANCEMENT), DEFINE(EXT_SCAN_ENHANCED), DEFINE(MEMORY_DUMP_SUPPORTED), DEFINE(PER_PKT_STATS_SUPPORTED), DEFINE(EXT_LL_STAT), DEFINE(WIFI_CONFIG), DEFINE(ANTENNA_DIVERSITY_SELECTION), }; #undef DEFINE const char *wcn36xx_firmware_get_cap_name(enum wcn36xx_firmware_feat_caps x) { if (x >= ARRAY_SIZE(wcn36xx_firmware_caps_names)) return "UNKNOWN"; return wcn36xx_firmware_caps_names[x]; } void wcn36xx_firmware_set_feat_caps(u32 *bitmap, enum wcn36xx_firmware_feat_caps cap) { int arr_idx, bit_idx; if (cap < 0 || cap > 127) { wcn36xx_warn("error cap idx %d\n", cap); return; } arr_idx = cap / 32; bit_idx = cap % 32; bitmap[arr_idx] |= (1 << bit_idx); } int wcn36xx_firmware_get_feat_caps(u32 *bitmap, enum wcn36xx_firmware_feat_caps cap) { int arr_idx, bit_idx; if (cap < 0 || cap > 127) { wcn36xx_warn("error cap idx %d\n", cap); return -EINVAL; } arr_idx = cap / 32; bit_idx = cap % 32; return (bitmap[arr_idx] & (1 << bit_idx)) ? 1 : 0; } void wcn36xx_firmware_clear_feat_caps(u32 *bitmap, enum wcn36xx_firmware_feat_caps cap) { int arr_idx, bit_idx; if (cap < 0 || cap > 127) { wcn36xx_warn("error cap idx %d\n", cap); return; } arr_idx = cap / 32; bit_idx = cap % 32; bitmap[arr_idx] &= ~(1 << bit_idx); }