diff options
Diffstat (limited to 'drivers/net/wireless/mac80211_hwsim.c')
-rw-r--r-- | drivers/net/wireless/mac80211_hwsim.c | 45 |
1 files changed, 41 insertions, 4 deletions
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c index 7cd5f56662fc..dfff02f5c86d 100644 --- a/drivers/net/wireless/mac80211_hwsim.c +++ b/drivers/net/wireless/mac80211_hwsim.c | |||
@@ -291,7 +291,8 @@ struct mac80211_hwsim_data { | |||
291 | struct ieee80211_channel *channel; | 291 | struct ieee80211_channel *channel; |
292 | unsigned long beacon_int; /* in jiffies unit */ | 292 | unsigned long beacon_int; /* in jiffies unit */ |
293 | unsigned int rx_filter; | 293 | unsigned int rx_filter; |
294 | bool started, idle; | 294 | bool started, idle, scanning; |
295 | struct mutex mutex; | ||
295 | struct timer_list beacon_timer; | 296 | struct timer_list beacon_timer; |
296 | enum ps_mode { | 297 | enum ps_mode { |
297 | PS_DISABLED, PS_ENABLED, PS_AUTO_POLL, PS_MANUAL_POLL | 298 | PS_DISABLED, PS_ENABLED, PS_AUTO_POLL, PS_MANUAL_POLL |
@@ -957,9 +958,9 @@ static int mac80211_hwsim_hw_scan(struct ieee80211_hw *hw, | |||
957 | hsd->hw = hw; | 958 | hsd->hw = hw; |
958 | INIT_DELAYED_WORK(&hsd->w, hw_scan_done); | 959 | INIT_DELAYED_WORK(&hsd->w, hw_scan_done); |
959 | 960 | ||
960 | printk(KERN_DEBUG "hwsim scan request\n"); | 961 | printk(KERN_DEBUG "hwsim hw_scan request\n"); |
961 | for (i = 0; i < req->n_channels; i++) | 962 | for (i = 0; i < req->n_channels; i++) |
962 | printk(KERN_DEBUG "hwsim scan freq %d\n", | 963 | printk(KERN_DEBUG "hwsim hw_scan freq %d\n", |
963 | req->channels[i]->center_freq); | 964 | req->channels[i]->center_freq); |
964 | 965 | ||
965 | ieee80211_queue_delayed_work(hw, &hsd->w, 2 * HZ); | 966 | ieee80211_queue_delayed_work(hw, &hsd->w, 2 * HZ); |
@@ -967,6 +968,36 @@ static int mac80211_hwsim_hw_scan(struct ieee80211_hw *hw, | |||
967 | return 0; | 968 | return 0; |
968 | } | 969 | } |
969 | 970 | ||
971 | static void mac80211_hwsim_sw_scan(struct ieee80211_hw *hw) | ||
972 | { | ||
973 | struct mac80211_hwsim_data *hwsim = hw->priv; | ||
974 | |||
975 | mutex_lock(&hwsim->mutex); | ||
976 | |||
977 | if (hwsim->scanning) { | ||
978 | printk(KERN_DEBUG "two hwsim sw_scans detected!\n"); | ||
979 | goto out; | ||
980 | } | ||
981 | |||
982 | printk(KERN_DEBUG "hwsim sw_scan request, prepping stuff\n"); | ||
983 | hwsim->scanning = true; | ||
984 | |||
985 | out: | ||
986 | mutex_unlock(&hwsim->mutex); | ||
987 | } | ||
988 | |||
989 | static void mac80211_hwsim_sw_scan_complete(struct ieee80211_hw *hw) | ||
990 | { | ||
991 | struct mac80211_hwsim_data *hwsim = hw->priv; | ||
992 | |||
993 | mutex_lock(&hwsim->mutex); | ||
994 | |||
995 | printk(KERN_DEBUG "hwsim sw_scan_complete\n"); | ||
996 | hwsim->scanning = true; | ||
997 | |||
998 | mutex_unlock(&hwsim->mutex); | ||
999 | } | ||
1000 | |||
970 | static struct ieee80211_ops mac80211_hwsim_ops = | 1001 | static struct ieee80211_ops mac80211_hwsim_ops = |
971 | { | 1002 | { |
972 | .tx = mac80211_hwsim_tx, | 1003 | .tx = mac80211_hwsim_tx, |
@@ -984,6 +1015,8 @@ static struct ieee80211_ops mac80211_hwsim_ops = | |||
984 | .conf_tx = mac80211_hwsim_conf_tx, | 1015 | .conf_tx = mac80211_hwsim_conf_tx, |
985 | CFG80211_TESTMODE_CMD(mac80211_hwsim_testmode_cmd) | 1016 | CFG80211_TESTMODE_CMD(mac80211_hwsim_testmode_cmd) |
986 | .ampdu_action = mac80211_hwsim_ampdu_action, | 1017 | .ampdu_action = mac80211_hwsim_ampdu_action, |
1018 | .sw_scan_start = mac80211_hwsim_sw_scan, | ||
1019 | .sw_scan_complete = mac80211_hwsim_sw_scan_complete, | ||
987 | .flush = mac80211_hwsim_flush, | 1020 | .flush = mac80211_hwsim_flush, |
988 | }; | 1021 | }; |
989 | 1022 | ||
@@ -1179,8 +1212,11 @@ static int __init init_mac80211_hwsim(void) | |||
1179 | if (radios < 1 || radios > 100) | 1212 | if (radios < 1 || radios > 100) |
1180 | return -EINVAL; | 1213 | return -EINVAL; |
1181 | 1214 | ||
1182 | if (fake_hw_scan) | 1215 | if (fake_hw_scan) { |
1183 | mac80211_hwsim_ops.hw_scan = mac80211_hwsim_hw_scan; | 1216 | mac80211_hwsim_ops.hw_scan = mac80211_hwsim_hw_scan; |
1217 | mac80211_hwsim_ops.sw_scan_start = NULL; | ||
1218 | mac80211_hwsim_ops.sw_scan_complete = NULL; | ||
1219 | } | ||
1184 | 1220 | ||
1185 | spin_lock_init(&hwsim_radio_lock); | 1221 | spin_lock_init(&hwsim_radio_lock); |
1186 | INIT_LIST_HEAD(&hwsim_radios); | 1222 | INIT_LIST_HEAD(&hwsim_radios); |
@@ -1285,6 +1321,7 @@ static int __init init_mac80211_hwsim(void) | |||
1285 | } | 1321 | } |
1286 | /* By default all radios are belonging to the first group */ | 1322 | /* By default all radios are belonging to the first group */ |
1287 | data->group = 1; | 1323 | data->group = 1; |
1324 | mutex_init(&data->mutex); | ||
1288 | 1325 | ||
1289 | /* Work to be done prior to ieee80211_register_hw() */ | 1326 | /* Work to be done prior to ieee80211_register_hw() */ |
1290 | switch (regtest) { | 1327 | switch (regtest) { |