|
@@ -353,6 +353,7 @@ void sta_set_rate_info_tx(struct sta_info *sta,
|
|
|
static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
|
|
|
{
|
|
|
struct ieee80211_sub_if_data *sdata = sta->sdata;
|
|
|
+ struct ieee80211_local *local = sdata->local;
|
|
|
struct timespec uptime;
|
|
|
|
|
|
sinfo->generation = sdata->local->sta_generation;
|
|
@@ -388,7 +389,9 @@ static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
|
|
|
if ((sta->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) ||
|
|
|
(sta->local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)) {
|
|
|
sinfo->filled |= STATION_INFO_SIGNAL | STATION_INFO_SIGNAL_AVG;
|
|
|
- sinfo->signal = (s8)sta->last_signal;
|
|
|
+ if (!local->ops->get_rssi ||
|
|
|
+ drv_get_rssi(local, sdata, &sta->sta, &sinfo->signal))
|
|
|
+ sinfo->signal = (s8)sta->last_signal;
|
|
|
sinfo->signal_avg = (s8) -ewma_read(&sta->avg_signal);
|
|
|
}
|
|
|
|
|
@@ -517,7 +520,7 @@ static void ieee80211_get_et_stats(struct wiphy *wiphy,
|
|
|
* network device.
|
|
|
*/
|
|
|
|
|
|
- rcu_read_lock();
|
|
|
+ mutex_lock(&local->sta_mtx);
|
|
|
|
|
|
if (sdata->vif.type == NL80211_IFTYPE_STATION) {
|
|
|
sta = sta_info_get_bss(sdata, sdata->u.mgd.bssid);
|
|
@@ -546,7 +549,7 @@ static void ieee80211_get_et_stats(struct wiphy *wiphy,
|
|
|
data[i] = (u8)sinfo.signal_avg;
|
|
|
i++;
|
|
|
} else {
|
|
|
- list_for_each_entry_rcu(sta, &local->sta_list, list) {
|
|
|
+ list_for_each_entry(sta, &local->sta_list, list) {
|
|
|
/* Make sure this station belongs to the proper dev */
|
|
|
if (sta->sdata->dev != dev)
|
|
|
continue;
|
|
@@ -603,7 +606,7 @@ do_survey:
|
|
|
else
|
|
|
data[i++] = -1LL;
|
|
|
|
|
|
- rcu_read_unlock();
|
|
|
+ mutex_unlock(&local->sta_mtx);
|
|
|
|
|
|
if (WARN_ON(i != STA_STATS_LEN))
|
|
|
return;
|
|
@@ -629,10 +632,11 @@ static int ieee80211_dump_station(struct wiphy *wiphy, struct net_device *dev,
|
|
|
int idx, u8 *mac, struct station_info *sinfo)
|
|
|
{
|
|
|
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
|
|
+ struct ieee80211_local *local = sdata->local;
|
|
|
struct sta_info *sta;
|
|
|
int ret = -ENOENT;
|
|
|
|
|
|
- rcu_read_lock();
|
|
|
+ mutex_lock(&local->sta_mtx);
|
|
|
|
|
|
sta = sta_info_get_by_idx(sdata, idx);
|
|
|
if (sta) {
|
|
@@ -641,7 +645,7 @@ static int ieee80211_dump_station(struct wiphy *wiphy, struct net_device *dev,
|
|
|
sta_set_sinfo(sta, sinfo);
|
|
|
}
|
|
|
|
|
|
- rcu_read_unlock();
|
|
|
+ mutex_unlock(&local->sta_mtx);
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
@@ -658,10 +662,11 @@ static int ieee80211_get_station(struct wiphy *wiphy, struct net_device *dev,
|
|
|
u8 *mac, struct station_info *sinfo)
|
|
|
{
|
|
|
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
|
|
+ struct ieee80211_local *local = sdata->local;
|
|
|
struct sta_info *sta;
|
|
|
int ret = -ENOENT;
|
|
|
|
|
|
- rcu_read_lock();
|
|
|
+ mutex_lock(&local->sta_mtx);
|
|
|
|
|
|
sta = sta_info_get_bss(sdata, mac);
|
|
|
if (sta) {
|
|
@@ -669,7 +674,7 @@ static int ieee80211_get_station(struct wiphy *wiphy, struct net_device *dev,
|
|
|
sta_set_sinfo(sta, sinfo);
|
|
|
}
|
|
|
|
|
|
- rcu_read_unlock();
|
|
|
+ mutex_unlock(&local->sta_mtx);
|
|
|
|
|
|
return ret;
|
|
|
}
|