35
35
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
36
36
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
37
37
* Copyright(c) 2016 - 2017 Intel Deutschland GmbH
38
+ * Copyright(c) 2018 Intel Corporation
38
39
* All rights reserved.
39
40
*
40
41
* Redistribution and use in source and binary forms, with or without
@@ -85,6 +86,8 @@ enum iwl_mvm_traffic_load {
85
86
#define IWL_SCAN_DWELL_PASSIVE 110
86
87
#define IWL_SCAN_DWELL_FRAGMENTED 44
87
88
#define IWL_SCAN_DWELL_EXTENDED 90
89
+ #define IWL_SCAN_NUM_OF_FRAGS 3
90
+
88
91
89
92
/* adaptive dwell max budget time [TU] for full scan */
90
93
#define IWL_SCAN_ADWELL_MAX_BUDGET_FULL_SCAN 300
@@ -143,6 +146,9 @@ static inline void *iwl_mvm_get_scan_req_umac_data(struct iwl_mvm *mvm)
143
146
{
144
147
struct iwl_scan_req_umac * cmd = mvm -> scan_cmd ;
145
148
149
+ if (iwl_mvm_is_adaptive_dwell_v2_supported (mvm ))
150
+ return (void * )& cmd -> v8 .data ;
151
+
146
152
if (iwl_mvm_is_adaptive_dwell_supported (mvm ))
147
153
return (void * )& cmd -> v7 .data ;
148
154
@@ -152,6 +158,23 @@ static inline void *iwl_mvm_get_scan_req_umac_data(struct iwl_mvm *mvm)
152
158
return (void * )& cmd -> v1 .data ;
153
159
}
154
160
161
+ static inline struct iwl_scan_umac_chan_param *
162
+ iwl_mvm_get_scan_req_umac_channel (struct iwl_mvm * mvm )
163
+ {
164
+ struct iwl_scan_req_umac * cmd = mvm -> scan_cmd ;
165
+
166
+ if (iwl_mvm_is_adaptive_dwell_v2_supported (mvm ))
167
+ return & cmd -> v8 .channel ;
168
+
169
+ if (iwl_mvm_is_adaptive_dwell_supported (mvm ))
170
+ return & cmd -> v7 .channel ;
171
+
172
+ if (iwl_mvm_has_new_tx_api (mvm ))
173
+ return & cmd -> v6 .channel ;
174
+
175
+ return & cmd -> v1 .channel ;
176
+ }
177
+
155
178
static u8 iwl_mvm_scan_rx_ant (struct iwl_mvm * mvm )
156
179
{
157
180
if (mvm -> scan_rx_ant != ANT_NONE )
@@ -1122,17 +1145,16 @@ static void iwl_mvm_scan_umac_dwell(struct iwl_mvm *mvm,
1122
1145
struct iwl_scan_req_umac * cmd ,
1123
1146
struct iwl_mvm_scan_params * params )
1124
1147
{
1125
- struct iwl_mvm_scan_timing_params * timing = & scan_timing [params -> type ];
1148
+ struct iwl_mvm_scan_timing_params * timing , * hb_timing ;
1149
+ u8 active_dwell , passive_dwell ;
1150
+
1151
+ timing = & scan_timing [params -> type ];
1152
+ active_dwell = params -> measurement_dwell ?
1153
+ params -> measurement_dwell : IWL_SCAN_DWELL_ACTIVE ;
1154
+ passive_dwell = params -> measurement_dwell ?
1155
+ params -> measurement_dwell : IWL_SCAN_DWELL_PASSIVE ;
1126
1156
1127
1157
if (iwl_mvm_is_adaptive_dwell_supported (mvm )) {
1128
- if (params -> measurement_dwell ) {
1129
- cmd -> v7 .active_dwell = params -> measurement_dwell ;
1130
- cmd -> v7 .passive_dwell = params -> measurement_dwell ;
1131
- } else {
1132
- cmd -> v7 .active_dwell = IWL_SCAN_DWELL_ACTIVE ;
1133
- cmd -> v7 .passive_dwell = IWL_SCAN_DWELL_PASSIVE ;
1134
- }
1135
- cmd -> v7 .fragmented_dwell = IWL_SCAN_DWELL_FRAGMENTED ;
1136
1158
cmd -> v7 .adwell_default_n_aps_social =
1137
1159
IWL_SCAN_ADWELL_DEFAULT_N_APS_SOCIAL ;
1138
1160
cmd -> v7 .adwell_default_n_aps =
@@ -1154,26 +1176,39 @@ static void iwl_mvm_scan_umac_dwell(struct iwl_mvm *mvm,
1154
1176
cpu_to_le32 (timing -> max_out_time );
1155
1177
cmd -> v7 .suspend_time [SCAN_LB_LMAC_IDX ] =
1156
1178
cpu_to_le32 (timing -> suspend_time );
1179
+
1157
1180
if (iwl_mvm_is_cdb_supported (mvm )) {
1158
- cmd -> v6 .max_out_time [SCAN_HB_LMAC_IDX ] =
1159
- cpu_to_le32 (timing -> max_out_time );
1160
- cmd -> v6 .suspend_time [SCAN_HB_LMAC_IDX ] =
1161
- cpu_to_le32 (timing -> suspend_time );
1181
+ hb_timing = & scan_timing [params -> type ];
1182
+
1183
+ cmd -> v7 .max_out_time [SCAN_HB_LMAC_IDX ] =
1184
+ cpu_to_le32 (hb_timing -> max_out_time );
1185
+ cmd -> v7 .suspend_time [SCAN_HB_LMAC_IDX ] =
1186
+ cpu_to_le32 (hb_timing -> suspend_time );
1162
1187
}
1163
- } else {
1164
- if (params -> measurement_dwell ) {
1165
- cmd -> v1 .active_dwell = params -> measurement_dwell ;
1166
- cmd -> v1 .passive_dwell = params -> measurement_dwell ;
1167
- cmd -> v1 . extended_dwell = params -> measurement_dwell ;
1188
+
1189
+ if (! iwl_mvm_is_adaptive_dwell_v2_supported ( mvm ) ) {
1190
+ cmd -> v7 .active_dwell = active_dwell ;
1191
+ cmd -> v7 .passive_dwell = passive_dwell ;
1192
+ cmd -> v7 . fragmented_dwell = IWL_SCAN_DWELL_FRAGMENTED ;
1168
1193
} else {
1169
- cmd -> v1 .active_dwell = IWL_SCAN_DWELL_ACTIVE ;
1170
- cmd -> v1 .passive_dwell = IWL_SCAN_DWELL_PASSIVE ;
1171
- cmd -> v1 .extended_dwell = IWL_SCAN_DWELL_EXTENDED ;
1194
+ cmd -> v8 .active_dwell [SCAN_LB_LMAC_IDX ] = active_dwell ;
1195
+ cmd -> v8 .passive_dwell [SCAN_LB_LMAC_IDX ] = passive_dwell ;
1196
+ if (iwl_mvm_is_cdb_supported (mvm )) {
1197
+ cmd -> v8 .active_dwell [SCAN_HB_LMAC_IDX ] =
1198
+ active_dwell ;
1199
+ cmd -> v8 .passive_dwell [SCAN_HB_LMAC_IDX ] =
1200
+ passive_dwell ;
1201
+ }
1172
1202
}
1203
+ } else {
1204
+ cmd -> v1 .extended_dwell = params -> measurement_dwell ?
1205
+ params -> measurement_dwell : IWL_SCAN_DWELL_EXTENDED ;
1206
+ cmd -> v1 .active_dwell = active_dwell ;
1207
+ cmd -> v1 .passive_dwell = passive_dwell ;
1173
1208
cmd -> v1 .fragmented_dwell = IWL_SCAN_DWELL_FRAGMENTED ;
1209
+
1174
1210
if (iwl_mvm_is_cdb_supported (mvm )) {
1175
- struct iwl_mvm_scan_timing_params * hb_timing =
1176
- & scan_timing [params -> type ];
1211
+ hb_timing = & scan_timing [params -> type ];
1177
1212
1178
1213
cmd -> v6 .max_out_time [SCAN_HB_LMAC_IDX ] =
1179
1214
cpu_to_le32 (hb_timing -> max_out_time );
@@ -1298,15 +1333,19 @@ static int iwl_mvm_scan_umac(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1298
1333
int type )
1299
1334
{
1300
1335
struct iwl_scan_req_umac * cmd = mvm -> scan_cmd ;
1336
+ struct iwl_scan_umac_chan_param * chan_param ;
1301
1337
void * cmd_data = iwl_mvm_get_scan_req_umac_data (mvm );
1302
1338
struct iwl_scan_req_umac_tail * sec_part = cmd_data +
1303
1339
sizeof (struct iwl_scan_channel_cfg_umac ) *
1304
1340
mvm -> fw -> ucode_capa .n_scan_channels ;
1305
1341
int uid , i ;
1306
1342
u32 ssid_bitmap = 0 ;
1307
1343
u8 channel_flags = 0 ;
1344
+ u16 gen_flags ;
1308
1345
struct iwl_mvm_vif * scan_vif = iwl_mvm_vif_from_mac80211 (vif );
1309
1346
1347
+ chan_param = iwl_mvm_get_scan_req_umac_channel (mvm );
1348
+
1310
1349
lockdep_assert_held (& mvm -> mutex );
1311
1350
1312
1351
if (WARN_ON (params -> n_scan_plans > IWL_MAX_SCHED_SCAN_PLANS ))
@@ -1323,8 +1362,17 @@ static int iwl_mvm_scan_umac(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1323
1362
mvm -> scan_uid_status [uid ] = type ;
1324
1363
1325
1364
cmd -> uid = cpu_to_le32 (uid );
1326
- cmd -> general_flags = cpu_to_le16 (iwl_mvm_scan_umac_flags (mvm , params ,
1327
- vif ));
1365
+ gen_flags = iwl_mvm_scan_umac_flags (mvm , params , vif );
1366
+ cmd -> general_flags = cpu_to_le16 (gen_flags );
1367
+ if (iwl_mvm_is_adaptive_dwell_v2_supported (mvm )) {
1368
+ if (gen_flags & IWL_UMAC_SCAN_GEN_FLAGS_FRAGMENTED )
1369
+ cmd -> v8 .num_of_fragments [SCAN_LB_LMAC_IDX ] =
1370
+ IWL_SCAN_NUM_OF_FRAGS ;
1371
+ if (gen_flags & IWL_UMAC_SCAN_GEN_FLAGS_LMAC2_FRAGMENTED )
1372
+ cmd -> v8 .num_of_fragments [SCAN_HB_LMAC_IDX ] =
1373
+ IWL_SCAN_NUM_OF_FRAGS ;
1374
+ }
1375
+
1328
1376
cmd -> scan_start_mac_id = scan_vif -> id ;
1329
1377
1330
1378
if (type == IWL_MVM_SCAN_SCHED || type == IWL_MVM_SCAN_NETDETECT )
@@ -1335,16 +1383,8 @@ static int iwl_mvm_scan_umac(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1335
1383
IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE |
1336
1384
IWL_SCAN_CHANNEL_FLAG_CACHE_ADD ;
1337
1385
1338
- if (iwl_mvm_is_adaptive_dwell_supported (mvm )) {
1339
- cmd -> v7 .channel_flags = channel_flags ;
1340
- cmd -> v7 .n_channels = params -> n_channels ;
1341
- } else if (iwl_mvm_has_new_tx_api (mvm )) {
1342
- cmd -> v6 .channel_flags = channel_flags ;
1343
- cmd -> v6 .n_channels = params -> n_channels ;
1344
- } else {
1345
- cmd -> v1 .channel_flags = channel_flags ;
1346
- cmd -> v1 .n_channels = params -> n_channels ;
1347
- }
1386
+ chan_param -> flags = channel_flags ;
1387
+ chan_param -> count = params -> n_channels ;
1348
1388
1349
1389
iwl_scan_build_ssids (params , sec_part -> direct_scan , & ssid_bitmap );
1350
1390
@@ -1783,7 +1823,9 @@ int iwl_mvm_scan_size(struct iwl_mvm *mvm)
1783
1823
{
1784
1824
int base_size = IWL_SCAN_REQ_UMAC_SIZE_V1 ;
1785
1825
1786
- if (iwl_mvm_is_adaptive_dwell_supported (mvm ))
1826
+ if (iwl_mvm_is_adaptive_dwell_v2_supported (mvm ))
1827
+ base_size = IWL_SCAN_REQ_UMAC_SIZE_V8 ;
1828
+ else if (iwl_mvm_is_adaptive_dwell_supported (mvm ))
1787
1829
base_size = IWL_SCAN_REQ_UMAC_SIZE_V7 ;
1788
1830
else if (iwl_mvm_has_new_tx_api (mvm ))
1789
1831
base_size = IWL_SCAN_REQ_UMAC_SIZE_V6 ;
0 commit comments