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