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
wcn36xx_firmware_get_cap_name(enum wcn36xx_firmware_feat_caps x)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
wcn36xx_firmware_set_feat_caps(u32 * bitmap,enum wcn36xx_firmware_feat_caps cap)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
wcn36xx_firmware_get_feat_caps(u32 * bitmap,enum wcn36xx_firmware_feat_caps cap)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
wcn36xx_firmware_clear_feat_caps(u32 * bitmap,enum wcn36xx_firmware_feat_caps cap)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