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
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 DEFINE
73
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