Merge branch 'master' into for-davem
Conflicts: drivers/net/wireless/ath/ath9k/phy.c drivers/net/wireless/iwlwifi/iwl-6000.c drivers/net/wireless/iwlwifi/iwl-debugfs.c
This commit is contained in:
@@ -19,8 +19,9 @@
|
||||
#include "ieee80211_i.h"
|
||||
#include "driver-ops.h"
|
||||
|
||||
void __ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,
|
||||
u16 initiator, u16 reason)
|
||||
static void ___ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,
|
||||
u16 initiator, u16 reason,
|
||||
bool from_timer)
|
||||
{
|
||||
struct ieee80211_local *local = sta->local;
|
||||
struct tid_ampdu_rx *tid_rx;
|
||||
@@ -70,10 +71,17 @@ void __ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,
|
||||
|
||||
spin_unlock_bh(&sta->lock);
|
||||
|
||||
del_timer_sync(&tid_rx->session_timer);
|
||||
if (!from_timer)
|
||||
del_timer_sync(&tid_rx->session_timer);
|
||||
kfree(tid_rx);
|
||||
}
|
||||
|
||||
void __ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,
|
||||
u16 initiator, u16 reason)
|
||||
{
|
||||
___ieee80211_stop_rx_ba_session(sta, tid, initiator, reason, false);
|
||||
}
|
||||
|
||||
/*
|
||||
* After accepting the AddBA Request we activated a timer,
|
||||
* resetting it after each frame that arrives from the originator.
|
||||
@@ -92,8 +100,8 @@ static void sta_rx_agg_session_timer_expired(unsigned long data)
|
||||
#ifdef CONFIG_MAC80211_HT_DEBUG
|
||||
printk(KERN_DEBUG "rx session timer expired on tid %d\n", (u16)*ptid);
|
||||
#endif
|
||||
__ieee80211_stop_rx_ba_session(sta, *ptid, WLAN_BACK_RECIPIENT,
|
||||
WLAN_REASON_QSTA_TIMEOUT);
|
||||
___ieee80211_stop_rx_ba_session(sta, *ptid, WLAN_BACK_RECIPIENT,
|
||||
WLAN_REASON_QSTA_TIMEOUT, true);
|
||||
}
|
||||
|
||||
static void ieee80211_send_addba_resp(struct ieee80211_sub_if_data *sdata, u8 *da, u16 tid,
|
||||
|
||||
@@ -186,7 +186,7 @@ static void sta_addba_resp_timer_expired(unsigned long data)
|
||||
spin_unlock_bh(&sta->lock);
|
||||
#ifdef CONFIG_MAC80211_HT_DEBUG
|
||||
printk(KERN_DEBUG "timer expired on tid %d but we are not "
|
||||
"(or no longer) expecting addBA response there",
|
||||
"(or no longer) expecting addBA response there\n",
|
||||
tid);
|
||||
#endif
|
||||
return;
|
||||
|
||||
@@ -411,6 +411,17 @@ static int ieee80211_dump_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ieee80211_dump_survey(struct wiphy *wiphy, struct net_device *dev,
|
||||
int idx, struct survey_info *survey)
|
||||
{
|
||||
struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
|
||||
|
||||
if (!local->ops->get_survey)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return drv_get_survey(local, idx, survey);
|
||||
}
|
||||
|
||||
static int ieee80211_get_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
u8 *mac, struct station_info *sinfo)
|
||||
{
|
||||
@@ -1508,6 +1519,7 @@ struct cfg80211_ops mac80211_config_ops = {
|
||||
.change_station = ieee80211_change_station,
|
||||
.get_station = ieee80211_get_station,
|
||||
.dump_station = ieee80211_dump_station,
|
||||
.dump_survey = ieee80211_dump_survey,
|
||||
#ifdef CONFIG_MAC80211_MESH
|
||||
.add_mpath = ieee80211_add_mpath,
|
||||
.del_mpath = ieee80211_del_mpath,
|
||||
|
||||
@@ -344,6 +344,15 @@ static inline int drv_ampdu_action(struct ieee80211_local *local,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int drv_get_survey(struct ieee80211_local *local, int idx,
|
||||
struct survey_info *survey)
|
||||
{
|
||||
int ret = -EOPNOTSUPP;
|
||||
if (local->ops->conf_tx)
|
||||
ret = local->ops->get_survey(&local->hw, idx, survey);
|
||||
/* trace_drv_get_survey(local, idx, survey, ret); */
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline void drv_rfkill_poll(struct ieee80211_local *local)
|
||||
{
|
||||
|
||||
@@ -140,6 +140,7 @@ static void ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
|
||||
struct ieee80211_sub_if_data,
|
||||
u.ap);
|
||||
|
||||
key->conf.ap_addr = sdata->dev->dev_addr;
|
||||
ret = drv_set_key(key->local, SET_KEY, sdata, sta, &key->conf);
|
||||
|
||||
if (!ret) {
|
||||
|
||||
@@ -1333,12 +1333,17 @@ static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata,
|
||||
mutex_lock(&sdata->local->iflist_mtx);
|
||||
ieee80211_recalc_ps(sdata->local, -1);
|
||||
mutex_unlock(&sdata->local->iflist_mtx);
|
||||
|
||||
if (sdata->local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR)
|
||||
return;
|
||||
|
||||
/*
|
||||
* We've received a probe response, but are not sure whether
|
||||
* we have or will be receiving any beacons or data, so let's
|
||||
* schedule the timers again, just in case.
|
||||
*/
|
||||
mod_beacon_timer(sdata);
|
||||
|
||||
mod_timer(&ifmgd->conn_mon_timer,
|
||||
round_jiffies_up(jiffies +
|
||||
IEEE80211_CONNECTION_IDLE_TIME));
|
||||
|
||||
@@ -575,7 +575,7 @@ static int sta_info_buffer_expired(struct sta_info *sta,
|
||||
}
|
||||
|
||||
|
||||
static void sta_info_cleanup_expire_buffered(struct ieee80211_local *local,
|
||||
static bool sta_info_cleanup_expire_buffered(struct ieee80211_local *local,
|
||||
struct sta_info *sta)
|
||||
{
|
||||
unsigned long flags;
|
||||
@@ -583,7 +583,7 @@ static void sta_info_cleanup_expire_buffered(struct ieee80211_local *local,
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
|
||||
if (skb_queue_empty(&sta->ps_tx_buf))
|
||||
return;
|
||||
return false;
|
||||
|
||||
for (;;) {
|
||||
spin_lock_irqsave(&sta->ps_tx_buf.lock, flags);
|
||||
@@ -608,6 +608,8 @@ static void sta_info_cleanup_expire_buffered(struct ieee80211_local *local,
|
||||
if (skb_queue_empty(&sta->ps_tx_buf))
|
||||
sta_info_clear_tim_bit(sta);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int __must_check __sta_info_destroy(struct sta_info *sta)
|
||||
@@ -755,15 +757,20 @@ static void sta_info_cleanup(unsigned long data)
|
||||
{
|
||||
struct ieee80211_local *local = (struct ieee80211_local *) data;
|
||||
struct sta_info *sta;
|
||||
bool timer_needed = false;
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(sta, &local->sta_list, list)
|
||||
sta_info_cleanup_expire_buffered(local, sta);
|
||||
if (sta_info_cleanup_expire_buffered(local, sta))
|
||||
timer_needed = true;
|
||||
rcu_read_unlock();
|
||||
|
||||
if (local->quiescing)
|
||||
return;
|
||||
|
||||
if (!timer_needed)
|
||||
return;
|
||||
|
||||
local->sta_cleanup.expires =
|
||||
round_jiffies(jiffies + STA_INFO_CLEANUP_INTERVAL);
|
||||
add_timer(&local->sta_cleanup);
|
||||
|
||||
@@ -429,6 +429,7 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx)
|
||||
struct sta_info *sta = tx->sta;
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
|
||||
struct ieee80211_local *local = tx->local;
|
||||
u32 staflags;
|
||||
|
||||
if (unlikely(!sta ||
|
||||
@@ -476,6 +477,12 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx)
|
||||
info->control.vif = &tx->sdata->vif;
|
||||
info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
|
||||
skb_queue_tail(&sta->ps_tx_buf, tx->skb);
|
||||
|
||||
if (!timer_pending(&local->sta_cleanup))
|
||||
mod_timer(&local->sta_cleanup,
|
||||
round_jiffies(jiffies +
|
||||
STA_INFO_CLEANUP_INTERVAL));
|
||||
|
||||
return TX_QUEUED;
|
||||
}
|
||||
#ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG
|
||||
|
||||
Reference in New Issue
Block a user