1 // SPDX-License-Identifier: GPL-2.0-only 2 3 #include "wcn36xx.h" 4 #include "firmware.h" 5 6 #define DEFINE(s)[s] = #s 7 8 static 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 DEFINE 73 74 const 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 81 void 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 96 int 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 112 void 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