aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Kazior <michal.kazior@tieto.com>2014-08-04 02:18:33 -0400
committerKalle Valo <kvalo@qca.qualcomm.com>2014-08-12 03:42:24 -0400
commitcff990ce7ddd6a43f86757867399a8a64aa29af9 (patch)
tree35ad2395674acefba4e6822a0773a9219c1cf8af
parent17dc0b8068f9f01c56b0ade5c36b4c45a3339dda (diff)
ath10k: fix wmi service bitmap debug
The 10.x and main firmware branches have conflicting WMI service bitmap definitions. This also fixes WMI services parsing on big-endian hosts and changes debugfs output to be more human friendly. kvalo: remove braces and the last semicolon from SVCSTR() Signed-off-by: Michal Kazior <michal.kazior@tieto.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
-rw-r--r--drivers/net/wireless/ath/ath10k/core.h2
-rw-r--r--drivers/net/wireless/ath/ath10k/debug.c26
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi.c14
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi.h369
4 files changed, 292 insertions, 119 deletions
diff --git a/drivers/net/wireless/ath/ath10k/core.h b/drivers/net/wireless/ath/ath10k/core.h
index d5c95d46e841..94b1ff2082cf 100644
--- a/drivers/net/wireless/ath/ath10k/core.h
+++ b/drivers/net/wireless/ath/ath10k/core.h
@@ -282,7 +282,7 @@ struct ath10k_debug {
282 struct dentry *debugfs_phy; 282 struct dentry *debugfs_phy;
283 283
284 struct ath10k_target_stats target_stats; 284 struct ath10k_target_stats target_stats;
285 u32 wmi_service_bitmap[WMI_SERVICE_BM_SIZE]; 285 DECLARE_BITMAP(wmi_service_bitmap, WMI_SERVICE_BM_SIZE);
286 286
287 struct completion event_stats_compl; 287 struct completion event_stats_compl;
288 288
diff --git a/drivers/net/wireless/ath/ath10k/debug.c b/drivers/net/wireless/ath/ath10k/debug.c
index c9e35c87edfb..df1abe7f1fef 100644
--- a/drivers/net/wireless/ath/ath10k/debug.c
+++ b/drivers/net/wireless/ath/ath10k/debug.c
@@ -115,9 +115,10 @@ static ssize_t ath10k_read_wmi_services(struct file *file,
115{ 115{
116 struct ath10k *ar = file->private_data; 116 struct ath10k *ar = file->private_data;
117 char *buf; 117 char *buf;
118 unsigned int len = 0, buf_len = 1500; 118 unsigned int len = 0, buf_len = 4096;
119 const char *status; 119 const char *name;
120 ssize_t ret_cnt; 120 ssize_t ret_cnt;
121 bool enabled;
121 int i; 122 int i;
122 123
123 buf = kzalloc(buf_len, GFP_KERNEL); 124 buf = kzalloc(buf_len, GFP_KERNEL);
@@ -129,15 +130,22 @@ static ssize_t ath10k_read_wmi_services(struct file *file,
129 if (len > buf_len) 130 if (len > buf_len)
130 len = buf_len; 131 len = buf_len;
131 132
132 for (i = 0; i < WMI_SERVICE_LAST; i++) { 133 for (i = 0; i < WMI_MAX_SERVICE; i++) {
133 if (WMI_SERVICE_IS_ENABLED(ar->debug.wmi_service_bitmap, i)) 134 enabled = test_bit(i, ar->debug.wmi_service_bitmap);
134 status = "enabled"; 135 name = wmi_service_name(i);
135 else 136
136 status = "disabled"; 137 if (!name) {
138 if (enabled)
139 len += scnprintf(buf + len, buf_len - len,
140 "%-40s %s (bit %d)\n",
141 "unknown", "enabled", i);
142
143 continue;
144 }
137 145
138 len += scnprintf(buf + len, buf_len - len, 146 len += scnprintf(buf + len, buf_len - len,
139 "0x%02x - %20s - %s\n", 147 "%-40s %s\n",
140 i, wmi_service_name(i), status); 148 name, enabled ? "enabled" : "-");
141 } 149 }
142 150
143 ret_cnt = simple_read_from_buffer(user_buf, count, ppos, buf, len); 151 ret_cnt = simple_read_from_buffer(user_buf, count, ppos, buf, len);
diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
index fffb15b1b50b..a381006c8124 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -2080,6 +2080,7 @@ static void ath10k_wmi_service_ready_event_rx(struct ath10k *ar,
2080 struct sk_buff *skb) 2080 struct sk_buff *skb)
2081{ 2081{
2082 struct wmi_service_ready_event *ev = (void *)skb->data; 2082 struct wmi_service_ready_event *ev = (void *)skb->data;
2083 DECLARE_BITMAP(svc_bmap, WMI_SERVICE_BM_SIZE) = {};
2083 2084
2084 if (skb->len < sizeof(*ev)) { 2085 if (skb->len < sizeof(*ev)) {
2085 ath10k_warn("Service ready event was %d B but expected %zu B. Wrong firmware version?\n", 2086 ath10k_warn("Service ready event was %d B but expected %zu B. Wrong firmware version?\n",
@@ -2113,8 +2114,10 @@ static void ath10k_wmi_service_ready_event_rx(struct ath10k *ar,
2113 ar->ath_common.regulatory.current_rd = 2114 ar->ath_common.regulatory.current_rd =
2114 __le32_to_cpu(ev->hal_reg_capabilities.eeprom_rd); 2115 __le32_to_cpu(ev->hal_reg_capabilities.eeprom_rd);
2115 2116
2116 ath10k_debug_read_service_map(ar, ev->wmi_service_bitmap, 2117 wmi_10x_svc_map(ev->wmi_service_bitmap, svc_bmap);
2117 sizeof(ev->wmi_service_bitmap)); 2118 ath10k_debug_read_service_map(ar, svc_bmap, sizeof(svc_bmap));
2119 ath10k_dbg_dump(ATH10K_DBG_WMI, NULL, "ath10k: wmi svc: ",
2120 ev->wmi_service_bitmap, sizeof(ev->wmi_service_bitmap));
2118 2121
2119 if (strlen(ar->hw->wiphy->fw_version) == 0) { 2122 if (strlen(ar->hw->wiphy->fw_version) == 0) {
2120 snprintf(ar->hw->wiphy->fw_version, 2123 snprintf(ar->hw->wiphy->fw_version,
@@ -2154,6 +2157,7 @@ static void ath10k_wmi_10x_service_ready_event_rx(struct ath10k *ar,
2154 u32 num_units, req_id, unit_size, num_mem_reqs, num_unit_info, i; 2157 u32 num_units, req_id, unit_size, num_mem_reqs, num_unit_info, i;
2155 int ret; 2158 int ret;
2156 struct wmi_service_ready_event_10x *ev = (void *)skb->data; 2159 struct wmi_service_ready_event_10x *ev = (void *)skb->data;
2160 DECLARE_BITMAP(svc_bmap, WMI_SERVICE_BM_SIZE) = {};
2157 2161
2158 if (skb->len < sizeof(*ev)) { 2162 if (skb->len < sizeof(*ev)) {
2159 ath10k_warn("Service ready event was %d B but expected %zu B. Wrong firmware version?\n", 2163 ath10k_warn("Service ready event was %d B but expected %zu B. Wrong firmware version?\n",
@@ -2180,8 +2184,10 @@ static void ath10k_wmi_10x_service_ready_event_rx(struct ath10k *ar,
2180 ar->ath_common.regulatory.current_rd = 2184 ar->ath_common.regulatory.current_rd =
2181 __le32_to_cpu(ev->hal_reg_capabilities.eeprom_rd); 2185 __le32_to_cpu(ev->hal_reg_capabilities.eeprom_rd);
2182 2186
2183 ath10k_debug_read_service_map(ar, ev->wmi_service_bitmap, 2187 wmi_main_svc_map(ev->wmi_service_bitmap, svc_bmap);
2184 sizeof(ev->wmi_service_bitmap)); 2188 ath10k_debug_read_service_map(ar, svc_bmap, sizeof(svc_bmap));
2189 ath10k_dbg_dump(ATH10K_DBG_WMI, NULL, "ath10k: wmi svc: ",
2190 ev->wmi_service_bitmap, sizeof(ev->wmi_service_bitmap));
2185 2191
2186 if (strlen(ar->hw->wiphy->fw_version) == 0) { 2192 if (strlen(ar->hw->wiphy->fw_version) == 0) {
2187 snprintf(ar->hw->wiphy->fw_version, 2193 snprintf(ar->hw->wiphy->fw_version,
diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h
index 1d8dda3240a5..e70836586756 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.h
+++ b/drivers/net/wireless/ath/ath10k/wmi.h
@@ -73,116 +73,279 @@ struct wmi_cmd_hdr {
73#define HTC_PROTOCOL_VERSION 0x0002 73#define HTC_PROTOCOL_VERSION 0x0002
74#define WMI_PROTOCOL_VERSION 0x0002 74#define WMI_PROTOCOL_VERSION 0x0002
75 75
76enum wmi_service_id { 76enum wmi_service {
77 WMI_SERVICE_BEACON_OFFLOAD = 0, /* beacon offload */ 77 WMI_SERVICE_BEACON_OFFLOAD = 0,
78 WMI_SERVICE_SCAN_OFFLOAD, /* scan offload */ 78 WMI_SERVICE_SCAN_OFFLOAD,
79 WMI_SERVICE_ROAM_OFFLOAD, /* roam offload */ 79 WMI_SERVICE_ROAM_OFFLOAD,
80 WMI_SERVICE_BCN_MISS_OFFLOAD, /* beacon miss offload */ 80 WMI_SERVICE_BCN_MISS_OFFLOAD,
81 WMI_SERVICE_STA_PWRSAVE, /* fake sleep + basic power save */ 81 WMI_SERVICE_STA_PWRSAVE,
82 WMI_SERVICE_STA_ADVANCED_PWRSAVE, /* uapsd, pspoll, force sleep */ 82 WMI_SERVICE_STA_ADVANCED_PWRSAVE,
83 WMI_SERVICE_AP_UAPSD, /* uapsd on AP */ 83 WMI_SERVICE_AP_UAPSD,
84 WMI_SERVICE_AP_DFS, /* DFS on AP */ 84 WMI_SERVICE_AP_DFS,
85 WMI_SERVICE_11AC, /* supports 11ac */ 85 WMI_SERVICE_11AC,
86 WMI_SERVICE_BLOCKACK, /* Supports triggering ADDBA/DELBA from host*/ 86 WMI_SERVICE_BLOCKACK,
87 WMI_SERVICE_PHYERR, /* PHY error */ 87 WMI_SERVICE_PHYERR,
88 WMI_SERVICE_BCN_FILTER, /* Beacon filter support */ 88 WMI_SERVICE_BCN_FILTER,
89 WMI_SERVICE_RTT, /* RTT (round trip time) support */ 89 WMI_SERVICE_RTT,
90 WMI_SERVICE_RATECTRL, /* Rate-control */ 90 WMI_SERVICE_RATECTRL,
91 WMI_SERVICE_WOW, /* WOW Support */ 91 WMI_SERVICE_WOW,
92 WMI_SERVICE_RATECTRL_CACHE, /* Rate-control caching */ 92 WMI_SERVICE_RATECTRL_CACHE,
93 WMI_SERVICE_IRAM_TIDS, /* TIDs in IRAM */ 93 WMI_SERVICE_IRAM_TIDS,
94 WMI_SERVICE_ARPNS_OFFLOAD, /* ARP NS Offload support */ 94 WMI_SERVICE_ARPNS_OFFLOAD,
95 WMI_SERVICE_NLO, /* Network list offload service */ 95 WMI_SERVICE_NLO,
96 WMI_SERVICE_GTK_OFFLOAD, /* GTK offload */ 96 WMI_SERVICE_GTK_OFFLOAD,
97 WMI_SERVICE_SCAN_SCH, /* Scan Scheduler Service */ 97 WMI_SERVICE_SCAN_SCH,
98 WMI_SERVICE_CSA_OFFLOAD, /* CSA offload service */ 98 WMI_SERVICE_CSA_OFFLOAD,
99 WMI_SERVICE_CHATTER, /* Chatter service */ 99 WMI_SERVICE_CHATTER,
100 WMI_SERVICE_COEX_FREQAVOID, /* FW report freq range to avoid */ 100 WMI_SERVICE_COEX_FREQAVOID,
101 WMI_SERVICE_PACKET_POWER_SAVE, /* packet power save service */ 101 WMI_SERVICE_PACKET_POWER_SAVE,
102 WMI_SERVICE_FORCE_FW_HANG, /* To test fw recovery mechanism */ 102 WMI_SERVICE_FORCE_FW_HANG,
103 WMI_SERVICE_GPIO, /* GPIO service */ 103 WMI_SERVICE_GPIO,
104 WMI_SERVICE_STA_DTIM_PS_MODULATED_DTIM, /* Modulated DTIM support */ 104 WMI_SERVICE_STA_DTIM_PS_MODULATED_DTIM,
105 WMI_STA_UAPSD_BASIC_AUTO_TRIG, /* UAPSD AC Trigger Generation */ 105 WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG,
106 WMI_STA_UAPSD_VAR_AUTO_TRIG, /* -do- */ 106 WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG,
107 WMI_SERVICE_STA_KEEP_ALIVE, /* STA keep alive mechanism support */ 107 WMI_SERVICE_STA_KEEP_ALIVE,
108 WMI_SERVICE_TX_ENCAP, /* Packet type for TX encapsulation */ 108 WMI_SERVICE_TX_ENCAP,
109 109 WMI_SERVICE_BURST,
110 WMI_SERVICE_LAST, 110 WMI_SERVICE_SMART_ANTENNA_SW_SUPPORT,
111 WMI_MAX_SERVICE = 64 /* max service */ 111 WMI_SERVICE_SMART_ANTENNA_HW_SUPPORT,
112};
113
114enum wmi_10x_service {
115 WMI_10X_SERVICE_BEACON_OFFLOAD = 0,
116 WMI_10X_SERVICE_SCAN_OFFLOAD,
117 WMI_10X_SERVICE_ROAM_OFFLOAD,
118 WMI_10X_SERVICE_BCN_MISS_OFFLOAD,
119 WMI_10X_SERVICE_STA_PWRSAVE,
120 WMI_10X_SERVICE_STA_ADVANCED_PWRSAVE,
121 WMI_10X_SERVICE_AP_UAPSD,
122 WMI_10X_SERVICE_AP_DFS,
123 WMI_10X_SERVICE_11AC,
124 WMI_10X_SERVICE_BLOCKACK,
125 WMI_10X_SERVICE_PHYERR,
126 WMI_10X_SERVICE_BCN_FILTER,
127 WMI_10X_SERVICE_RTT,
128 WMI_10X_SERVICE_RATECTRL,
129 WMI_10X_SERVICE_WOW,
130 WMI_10X_SERVICE_RATECTRL_CACHE,
131 WMI_10X_SERVICE_IRAM_TIDS,
132 WMI_10X_SERVICE_BURST,
133
134 /* introduced in 10.2 */
135 WMI_10X_SERVICE_SMART_ANTENNA_SW_SUPPORT,
136 WMI_10X_SERVICE_FORCE_FW_HANG,
137 WMI_10X_SERVICE_SMART_ANTENNA_HW_SUPPORT,
138};
139
140enum wmi_main_service {
141 WMI_MAIN_SERVICE_BEACON_OFFLOAD = 0,
142 WMI_MAIN_SERVICE_SCAN_OFFLOAD,
143 WMI_MAIN_SERVICE_ROAM_OFFLOAD,
144 WMI_MAIN_SERVICE_BCN_MISS_OFFLOAD,
145 WMI_MAIN_SERVICE_STA_PWRSAVE,
146 WMI_MAIN_SERVICE_STA_ADVANCED_PWRSAVE,
147 WMI_MAIN_SERVICE_AP_UAPSD,
148 WMI_MAIN_SERVICE_AP_DFS,
149 WMI_MAIN_SERVICE_11AC,
150 WMI_MAIN_SERVICE_BLOCKACK,
151 WMI_MAIN_SERVICE_PHYERR,
152 WMI_MAIN_SERVICE_BCN_FILTER,
153 WMI_MAIN_SERVICE_RTT,
154 WMI_MAIN_SERVICE_RATECTRL,
155 WMI_MAIN_SERVICE_WOW,
156 WMI_MAIN_SERVICE_RATECTRL_CACHE,
157 WMI_MAIN_SERVICE_IRAM_TIDS,
158 WMI_MAIN_SERVICE_ARPNS_OFFLOAD,
159 WMI_MAIN_SERVICE_NLO,
160 WMI_MAIN_SERVICE_GTK_OFFLOAD,
161 WMI_MAIN_SERVICE_SCAN_SCH,
162 WMI_MAIN_SERVICE_CSA_OFFLOAD,
163 WMI_MAIN_SERVICE_CHATTER,
164 WMI_MAIN_SERVICE_COEX_FREQAVOID,
165 WMI_MAIN_SERVICE_PACKET_POWER_SAVE,
166 WMI_MAIN_SERVICE_FORCE_FW_HANG,
167 WMI_MAIN_SERVICE_GPIO,
168 WMI_MAIN_SERVICE_STA_DTIM_PS_MODULATED_DTIM,
169 WMI_MAIN_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG,
170 WMI_MAIN_SERVICE_STA_UAPSD_VAR_AUTO_TRIG,
171 WMI_MAIN_SERVICE_STA_KEEP_ALIVE,
172 WMI_MAIN_SERVICE_TX_ENCAP,
112}; 173};
113 174
114static inline char *wmi_service_name(int service_id) 175static inline char *wmi_service_name(int service_id)
115{ 176{
177#define SVCSTR(x) case x: return #x
178
116 switch (service_id) { 179 switch (service_id) {
117 case WMI_SERVICE_BEACON_OFFLOAD: 180 SVCSTR(WMI_SERVICE_BEACON_OFFLOAD);
118 return "BEACON_OFFLOAD"; 181 SVCSTR(WMI_SERVICE_SCAN_OFFLOAD);
119 case WMI_SERVICE_SCAN_OFFLOAD: 182 SVCSTR(WMI_SERVICE_ROAM_OFFLOAD);
120 return "SCAN_OFFLOAD"; 183 SVCSTR(WMI_SERVICE_BCN_MISS_OFFLOAD);
121 case WMI_SERVICE_ROAM_OFFLOAD: 184 SVCSTR(WMI_SERVICE_STA_PWRSAVE);
122 return "ROAM_OFFLOAD"; 185 SVCSTR(WMI_SERVICE_STA_ADVANCED_PWRSAVE);
123 case WMI_SERVICE_BCN_MISS_OFFLOAD: 186 SVCSTR(WMI_SERVICE_AP_UAPSD);
124 return "BCN_MISS_OFFLOAD"; 187 SVCSTR(WMI_SERVICE_AP_DFS);
125 case WMI_SERVICE_STA_PWRSAVE: 188 SVCSTR(WMI_SERVICE_11AC);
126 return "STA_PWRSAVE"; 189 SVCSTR(WMI_SERVICE_BLOCKACK);
127 case WMI_SERVICE_STA_ADVANCED_PWRSAVE: 190 SVCSTR(WMI_SERVICE_PHYERR);
128 return "STA_ADVANCED_PWRSAVE"; 191 SVCSTR(WMI_SERVICE_BCN_FILTER);
129 case WMI_SERVICE_AP_UAPSD: 192 SVCSTR(WMI_SERVICE_RTT);
130 return "AP_UAPSD"; 193 SVCSTR(WMI_SERVICE_RATECTRL);
131 case WMI_SERVICE_AP_DFS: 194 SVCSTR(WMI_SERVICE_WOW);
132 return "AP_DFS"; 195 SVCSTR(WMI_SERVICE_RATECTRL_CACHE);
133 case WMI_SERVICE_11AC: 196 SVCSTR(WMI_SERVICE_IRAM_TIDS);
134 return "11AC"; 197 SVCSTR(WMI_SERVICE_ARPNS_OFFLOAD);
135 case WMI_SERVICE_BLOCKACK: 198 SVCSTR(WMI_SERVICE_NLO);
136 return "BLOCKACK"; 199 SVCSTR(WMI_SERVICE_GTK_OFFLOAD);
137 case WMI_SERVICE_PHYERR: 200 SVCSTR(WMI_SERVICE_SCAN_SCH);
138 return "PHYERR"; 201 SVCSTR(WMI_SERVICE_CSA_OFFLOAD);
139 case WMI_SERVICE_BCN_FILTER: 202 SVCSTR(WMI_SERVICE_CHATTER);
140 return "BCN_FILTER"; 203 SVCSTR(WMI_SERVICE_COEX_FREQAVOID);
141 case WMI_SERVICE_RTT: 204 SVCSTR(WMI_SERVICE_PACKET_POWER_SAVE);
142 return "RTT"; 205 SVCSTR(WMI_SERVICE_FORCE_FW_HANG);
143 case WMI_SERVICE_RATECTRL: 206 SVCSTR(WMI_SERVICE_GPIO);
144 return "RATECTRL"; 207 SVCSTR(WMI_SERVICE_STA_DTIM_PS_MODULATED_DTIM);
145 case WMI_SERVICE_WOW: 208 SVCSTR(WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG);
146 return "WOW"; 209 SVCSTR(WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG);
147 case WMI_SERVICE_RATECTRL_CACHE: 210 SVCSTR(WMI_SERVICE_STA_KEEP_ALIVE);
148 return "RATECTRL CACHE"; 211 SVCSTR(WMI_SERVICE_TX_ENCAP);
149 case WMI_SERVICE_IRAM_TIDS: 212 SVCSTR(WMI_SERVICE_BURST);
150 return "IRAM TIDS"; 213 SVCSTR(WMI_SERVICE_SMART_ANTENNA_SW_SUPPORT);
151 case WMI_SERVICE_ARPNS_OFFLOAD: 214 SVCSTR(WMI_SERVICE_SMART_ANTENNA_HW_SUPPORT);
152 return "ARPNS_OFFLOAD";
153 case WMI_SERVICE_NLO:
154 return "NLO";
155 case WMI_SERVICE_GTK_OFFLOAD:
156 return "GTK_OFFLOAD";
157 case WMI_SERVICE_SCAN_SCH:
158 return "SCAN_SCH";
159 case WMI_SERVICE_CSA_OFFLOAD:
160 return "CSA_OFFLOAD";
161 case WMI_SERVICE_CHATTER:
162 return "CHATTER";
163 case WMI_SERVICE_COEX_FREQAVOID:
164 return "COEX_FREQAVOID";
165 case WMI_SERVICE_PACKET_POWER_SAVE:
166 return "PACKET_POWER_SAVE";
167 case WMI_SERVICE_FORCE_FW_HANG:
168 return "FORCE FW HANG";
169 case WMI_SERVICE_GPIO:
170 return "GPIO";
171 case WMI_SERVICE_STA_DTIM_PS_MODULATED_DTIM:
172 return "MODULATED DTIM";
173 case WMI_STA_UAPSD_BASIC_AUTO_TRIG:
174 return "BASIC UAPSD";
175 case WMI_STA_UAPSD_VAR_AUTO_TRIG:
176 return "VAR UAPSD";
177 case WMI_SERVICE_STA_KEEP_ALIVE:
178 return "STA KEEP ALIVE";
179 case WMI_SERVICE_TX_ENCAP:
180 return "TX ENCAP";
181 default: 215 default:
182 return "UNKNOWN SERVICE\n"; 216 return NULL;
183 } 217 }
218
219#undef SVCSTR
220}
221
222#define WMI_MAX_SERVICE 64
223
224#define WMI_SERVICE_IS_ENABLED(wmi_svc_bmap, svc_id) \
225 (__le32_to_cpu((wmi_svc_bmap)[(svc_id)/(sizeof(u32))]) & \
226 BIT((svc_id)%(sizeof(u32))))
227
228#define SVCMAP(x, y) \
229 do { \
230 if (WMI_SERVICE_IS_ENABLED((in), (x))) \
231 __set_bit(y, out); \
232 } while (0)
233
234static inline void wmi_10x_svc_map(const __le32 *in, unsigned long *out)
235{
236 SVCMAP(WMI_10X_SERVICE_BEACON_OFFLOAD,
237 WMI_SERVICE_BEACON_OFFLOAD);
238 SVCMAP(WMI_10X_SERVICE_SCAN_OFFLOAD,
239 WMI_SERVICE_SCAN_OFFLOAD);
240 SVCMAP(WMI_10X_SERVICE_ROAM_OFFLOAD,
241 WMI_SERVICE_ROAM_OFFLOAD);
242 SVCMAP(WMI_10X_SERVICE_BCN_MISS_OFFLOAD,
243 WMI_SERVICE_BCN_MISS_OFFLOAD);
244 SVCMAP(WMI_10X_SERVICE_STA_PWRSAVE,
245 WMI_SERVICE_STA_PWRSAVE);
246 SVCMAP(WMI_10X_SERVICE_STA_ADVANCED_PWRSAVE,
247 WMI_SERVICE_STA_ADVANCED_PWRSAVE);
248 SVCMAP(WMI_10X_SERVICE_AP_UAPSD,
249 WMI_SERVICE_AP_UAPSD);
250 SVCMAP(WMI_10X_SERVICE_AP_DFS,
251 WMI_SERVICE_AP_DFS);
252 SVCMAP(WMI_10X_SERVICE_11AC,
253 WMI_SERVICE_11AC);
254 SVCMAP(WMI_10X_SERVICE_BLOCKACK,
255 WMI_SERVICE_BLOCKACK);
256 SVCMAP(WMI_10X_SERVICE_PHYERR,
257 WMI_SERVICE_PHYERR);
258 SVCMAP(WMI_10X_SERVICE_BCN_FILTER,
259 WMI_SERVICE_BCN_FILTER);
260 SVCMAP(WMI_10X_SERVICE_RTT,
261 WMI_SERVICE_RTT);
262 SVCMAP(WMI_10X_SERVICE_RATECTRL,
263 WMI_SERVICE_RATECTRL);
264 SVCMAP(WMI_10X_SERVICE_WOW,
265 WMI_SERVICE_WOW);
266 SVCMAP(WMI_10X_SERVICE_RATECTRL_CACHE,
267 WMI_SERVICE_RATECTRL_CACHE);
268 SVCMAP(WMI_10X_SERVICE_IRAM_TIDS,
269 WMI_SERVICE_IRAM_TIDS);
270 SVCMAP(WMI_10X_SERVICE_BURST,
271 WMI_SERVICE_BURST);
272 SVCMAP(WMI_10X_SERVICE_SMART_ANTENNA_SW_SUPPORT,
273 WMI_SERVICE_SMART_ANTENNA_SW_SUPPORT);
274 SVCMAP(WMI_10X_SERVICE_FORCE_FW_HANG,
275 WMI_SERVICE_FORCE_FW_HANG);
276 SVCMAP(WMI_10X_SERVICE_SMART_ANTENNA_HW_SUPPORT,
277 WMI_SERVICE_SMART_ANTENNA_HW_SUPPORT);
184} 278}
185 279
280static inline void wmi_main_svc_map(const __le32 *in, unsigned long *out)
281{
282 SVCMAP(WMI_MAIN_SERVICE_BEACON_OFFLOAD,
283 WMI_SERVICE_BEACON_OFFLOAD);
284 SVCMAP(WMI_MAIN_SERVICE_SCAN_OFFLOAD,
285 WMI_SERVICE_SCAN_OFFLOAD);
286 SVCMAP(WMI_MAIN_SERVICE_ROAM_OFFLOAD,
287 WMI_SERVICE_ROAM_OFFLOAD);
288 SVCMAP(WMI_MAIN_SERVICE_BCN_MISS_OFFLOAD,
289 WMI_SERVICE_BCN_MISS_OFFLOAD);
290 SVCMAP(WMI_MAIN_SERVICE_STA_PWRSAVE,
291 WMI_SERVICE_STA_PWRSAVE);
292 SVCMAP(WMI_MAIN_SERVICE_STA_ADVANCED_PWRSAVE,
293 WMI_SERVICE_STA_ADVANCED_PWRSAVE);
294 SVCMAP(WMI_MAIN_SERVICE_AP_UAPSD,
295 WMI_SERVICE_AP_UAPSD);
296 SVCMAP(WMI_MAIN_SERVICE_AP_DFS,
297 WMI_SERVICE_AP_DFS);
298 SVCMAP(WMI_MAIN_SERVICE_11AC,
299 WMI_SERVICE_11AC);
300 SVCMAP(WMI_MAIN_SERVICE_BLOCKACK,
301 WMI_SERVICE_BLOCKACK);
302 SVCMAP(WMI_MAIN_SERVICE_PHYERR,
303 WMI_SERVICE_PHYERR);
304 SVCMAP(WMI_MAIN_SERVICE_BCN_FILTER,
305 WMI_SERVICE_BCN_FILTER);
306 SVCMAP(WMI_MAIN_SERVICE_RTT,
307 WMI_SERVICE_RTT);
308 SVCMAP(WMI_MAIN_SERVICE_RATECTRL,
309 WMI_SERVICE_RATECTRL);
310 SVCMAP(WMI_MAIN_SERVICE_WOW,
311 WMI_SERVICE_WOW);
312 SVCMAP(WMI_MAIN_SERVICE_RATECTRL_CACHE,
313 WMI_SERVICE_RATECTRL_CACHE);
314 SVCMAP(WMI_MAIN_SERVICE_IRAM_TIDS,
315 WMI_SERVICE_IRAM_TIDS);
316 SVCMAP(WMI_MAIN_SERVICE_ARPNS_OFFLOAD,
317 WMI_SERVICE_ARPNS_OFFLOAD);
318 SVCMAP(WMI_MAIN_SERVICE_NLO,
319 WMI_SERVICE_NLO);
320 SVCMAP(WMI_MAIN_SERVICE_GTK_OFFLOAD,
321 WMI_SERVICE_GTK_OFFLOAD);
322 SVCMAP(WMI_MAIN_SERVICE_SCAN_SCH,
323 WMI_SERVICE_SCAN_SCH);
324 SVCMAP(WMI_MAIN_SERVICE_CSA_OFFLOAD,
325 WMI_SERVICE_CSA_OFFLOAD);
326 SVCMAP(WMI_MAIN_SERVICE_CHATTER,
327 WMI_SERVICE_CHATTER);
328 SVCMAP(WMI_MAIN_SERVICE_COEX_FREQAVOID,
329 WMI_SERVICE_COEX_FREQAVOID);
330 SVCMAP(WMI_MAIN_SERVICE_PACKET_POWER_SAVE,
331 WMI_SERVICE_PACKET_POWER_SAVE);
332 SVCMAP(WMI_MAIN_SERVICE_FORCE_FW_HANG,
333 WMI_SERVICE_FORCE_FW_HANG);
334 SVCMAP(WMI_MAIN_SERVICE_GPIO,
335 WMI_SERVICE_GPIO);
336 SVCMAP(WMI_MAIN_SERVICE_STA_DTIM_PS_MODULATED_DTIM,
337 WMI_SERVICE_STA_DTIM_PS_MODULATED_DTIM);
338 SVCMAP(WMI_MAIN_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG,
339 WMI_SERVICE_STA_UAPSD_BASIC_AUTO_TRIG);
340 SVCMAP(WMI_MAIN_SERVICE_STA_UAPSD_VAR_AUTO_TRIG,
341 WMI_SERVICE_STA_UAPSD_VAR_AUTO_TRIG);
342 SVCMAP(WMI_MAIN_SERVICE_STA_KEEP_ALIVE,
343 WMI_SERVICE_STA_KEEP_ALIVE);
344 SVCMAP(WMI_MAIN_SERVICE_TX_ENCAP,
345 WMI_SERVICE_TX_ENCAP);
346}
347
348#undef SVCMAP
186 349
187#define WMI_SERVICE_BM_SIZE \ 350#define WMI_SERVICE_BM_SIZE \
188 ((WMI_MAX_SERVICE + sizeof(u32) - 1)/sizeof(u32)) 351 ((WMI_MAX_SERVICE + sizeof(u32) - 1)/sizeof(u32))
@@ -1229,10 +1392,6 @@ struct wlan_host_mem_req {
1229 __le32 num_units; 1392 __le32 num_units;
1230} __packed; 1393} __packed;
1231 1394
1232#define WMI_SERVICE_IS_ENABLED(wmi_svc_bmap, svc_id) \
1233 ((((wmi_svc_bmap)[(svc_id)/(sizeof(u32))]) & \
1234 (1 << ((svc_id)%(sizeof(u32))))) != 0)
1235
1236/* 1395/*
1237 * The following struct holds optional payload for 1396 * The following struct holds optional payload for
1238 * wmi_service_ready_event,e.g., 11ac pass some of the 1397 * wmi_service_ready_event,e.g., 11ac pass some of the