@@ -68,6 +68,12 @@ struct iwl_mvm_pasn_sta {
68
68
u8 addr [ETH_ALEN ];
69
69
};
70
70
71
+ struct iwl_mvm_pasn_hltk_data {
72
+ u8 * addr ;
73
+ u8 cipher ;
74
+ u8 * hltk ;
75
+ };
76
+
71
77
static int iwl_mvm_ftm_responder_set_bw_v1 (struct cfg80211_chan_def * chandef ,
72
78
u8 * bw , u8 * ctrl_ch_position )
73
79
{
@@ -143,8 +149,7 @@ iwl_mvm_ftm_responder_cmd(struct iwl_mvm *mvm,
143
149
.sta_id = mvmvif -> bcast_sta .sta_id ,
144
150
};
145
151
u8 cmd_ver = iwl_fw_lookup_cmd_ver (mvm -> fw , LOCATION_GROUP ,
146
- TOF_RESPONDER_CONFIG_CMD ,
147
- IWL_FW_CMD_VER_UNKNOWN );
152
+ TOF_RESPONDER_CONFIG_CMD , 6 );
148
153
int err ;
149
154
150
155
lockdep_assert_held (& mvm -> mutex );
@@ -169,11 +174,11 @@ iwl_mvm_ftm_responder_cmd(struct iwl_mvm *mvm,
169
174
}
170
175
171
176
static int
172
- iwl_mvm_ftm_responder_dyn_cfg_cmd (struct iwl_mvm * mvm ,
173
- struct ieee80211_vif * vif ,
174
- struct ieee80211_ftm_responder_params * params )
177
+ iwl_mvm_ftm_responder_dyn_cfg_v2 (struct iwl_mvm * mvm ,
178
+ struct ieee80211_vif * vif ,
179
+ struct ieee80211_ftm_responder_params * params )
175
180
{
176
- struct iwl_tof_responder_dyn_config_cmd cmd = {
181
+ struct iwl_tof_responder_dyn_config_cmd_v2 cmd = {
177
182
.lci_len = cpu_to_le32 (params -> lci_len + 2 ),
178
183
.civic_len = cpu_to_le32 (params -> civicloc_len + 2 ),
179
184
};
@@ -214,6 +219,93 @@ iwl_mvm_ftm_responder_dyn_cfg_cmd(struct iwl_mvm *mvm,
214
219
return iwl_mvm_send_cmd (mvm , & hcmd );
215
220
}
216
221
222
+ static int
223
+ iwl_mvm_ftm_responder_dyn_cfg_v3 (struct iwl_mvm * mvm ,
224
+ struct ieee80211_vif * vif ,
225
+ struct ieee80211_ftm_responder_params * params ,
226
+ struct iwl_mvm_pasn_hltk_data * hltk_data )
227
+ {
228
+ struct iwl_tof_responder_dyn_config_cmd cmd ;
229
+ struct iwl_host_cmd hcmd = {
230
+ .id = iwl_cmd_id (TOF_RESPONDER_DYN_CONFIG_CMD ,
231
+ LOCATION_GROUP , 0 ),
232
+ .data [0 ] = & cmd ,
233
+ .len [0 ] = sizeof (cmd ),
234
+ /* may not be able to DMA from stack */
235
+ .dataflags [0 ] = IWL_HCMD_DFL_DUP ,
236
+ };
237
+
238
+ lockdep_assert_held (& mvm -> mutex );
239
+
240
+ cmd .valid_flags = 0 ;
241
+
242
+ if (params ) {
243
+ if (params -> lci_len + 2 > sizeof (cmd .lci_buf ) ||
244
+ params -> civicloc_len + 2 > sizeof (cmd .civic_buf )) {
245
+ IWL_ERR (mvm ,
246
+ "LCI/civic data too big (lci=%zd, civic=%zd)\n" ,
247
+ params -> lci_len , params -> civicloc_len );
248
+ return - ENOBUFS ;
249
+ }
250
+
251
+ cmd .lci_buf [0 ] = WLAN_EID_MEASURE_REPORT ;
252
+ cmd .lci_buf [1 ] = params -> lci_len ;
253
+ memcpy (cmd .lci_buf + 2 , params -> lci , params -> lci_len );
254
+ cmd .lci_len = params -> lci_len + 2 ;
255
+
256
+ cmd .civic_buf [0 ] = WLAN_EID_MEASURE_REPORT ;
257
+ cmd .civic_buf [1 ] = params -> civicloc_len ;
258
+ memcpy (cmd .civic_buf + 2 , params -> civicloc ,
259
+ params -> civicloc_len );
260
+ cmd .civic_len = params -> civicloc_len + 2 ;
261
+
262
+ cmd .valid_flags |= IWL_RESPONDER_DYN_CFG_VALID_LCI |
263
+ IWL_RESPONDER_DYN_CFG_VALID_CIVIC ;
264
+ }
265
+
266
+ if (hltk_data ) {
267
+ if (hltk_data -> cipher > IWL_LOCATION_CIPHER_GCMP_256 ) {
268
+ IWL_ERR (mvm , "invalid cipher: %u\n" ,
269
+ hltk_data -> cipher );
270
+ return - EINVAL ;
271
+ }
272
+
273
+ cmd .cipher = hltk_data -> cipher ;
274
+ memcpy (cmd .addr , hltk_data -> addr , sizeof (cmd .addr ));
275
+ memcpy (cmd .hltk_buf , hltk_data -> hltk , sizeof (cmd .hltk_buf ));
276
+ cmd .valid_flags |= IWL_RESPONDER_DYN_CFG_VALID_PASN_STA ;
277
+ }
278
+
279
+ return iwl_mvm_send_cmd (mvm , & hcmd );
280
+ }
281
+
282
+ static int
283
+ iwl_mvm_ftm_responder_dyn_cfg_cmd (struct iwl_mvm * mvm ,
284
+ struct ieee80211_vif * vif ,
285
+ struct ieee80211_ftm_responder_params * params )
286
+ {
287
+ int ret ;
288
+ u8 cmd_ver = iwl_fw_lookup_cmd_ver (mvm -> fw , LOCATION_GROUP ,
289
+ TOF_RESPONDER_DYN_CONFIG_CMD , 2 );
290
+
291
+ switch (cmd_ver ) {
292
+ case 2 :
293
+ ret = iwl_mvm_ftm_responder_dyn_cfg_v2 (mvm , vif ,
294
+ params );
295
+ break ;
296
+ case 3 :
297
+ ret = iwl_mvm_ftm_responder_dyn_cfg_v3 (mvm , vif ,
298
+ params , NULL );
299
+ break ;
300
+ default :
301
+ IWL_ERR (mvm , "Unsupported DYN_CONFIG_CMD version %u\n" ,
302
+ cmd_ver );
303
+ ret = - ENOTSUPP ;
304
+ }
305
+
306
+ return ret ;
307
+ }
308
+
217
309
int iwl_mvm_ftm_respoder_add_pasn_sta (struct iwl_mvm * mvm ,
218
310
struct ieee80211_vif * vif ,
219
311
u8 * addr , u32 cipher , u8 * tk , u32 tk_len ,
0 commit comments