Merge branch 'master' into for-next
This commit is contained in:
@@ -20,7 +20,7 @@ config MAC80211_HAS_RC
|
||||
def_bool n
|
||||
|
||||
config MAC80211_RC_PID
|
||||
bool "PID controller based rate control algorithm" if EMBEDDED
|
||||
bool "PID controller based rate control algorithm" if EXPERT
|
||||
select MAC80211_HAS_RC
|
||||
---help---
|
||||
This option enables a TX rate control algorithm for
|
||||
@@ -28,14 +28,14 @@ config MAC80211_RC_PID
|
||||
rate.
|
||||
|
||||
config MAC80211_RC_MINSTREL
|
||||
bool "Minstrel" if EMBEDDED
|
||||
bool "Minstrel" if EXPERT
|
||||
select MAC80211_HAS_RC
|
||||
default y
|
||||
---help---
|
||||
This option enables the 'minstrel' TX rate control algorithm
|
||||
|
||||
config MAC80211_RC_MINSTREL_HT
|
||||
bool "Minstrel 802.11n support" if EMBEDDED
|
||||
bool "Minstrel 802.11n support" if EXPERT
|
||||
depends on MAC80211_RC_MINSTREL
|
||||
default y
|
||||
---help---
|
||||
|
@@ -185,8 +185,6 @@ void ieee80211_process_addba_request(struct ieee80211_local *local,
|
||||
struct ieee80211_mgmt *mgmt,
|
||||
size_t len)
|
||||
{
|
||||
struct ieee80211_hw *hw = &local->hw;
|
||||
struct ieee80211_conf *conf = &hw->conf;
|
||||
struct tid_ampdu_rx *tid_agg_rx;
|
||||
u16 capab, tid, timeout, ba_policy, buf_size, start_seq_num, status;
|
||||
u8 dialog_token;
|
||||
@@ -231,13 +229,8 @@ void ieee80211_process_addba_request(struct ieee80211_local *local,
|
||||
goto end_no_lock;
|
||||
}
|
||||
/* determine default buffer size */
|
||||
if (buf_size == 0) {
|
||||
struct ieee80211_supported_band *sband;
|
||||
|
||||
sband = local->hw.wiphy->bands[conf->channel->band];
|
||||
buf_size = IEEE80211_MIN_AMPDU_BUF;
|
||||
buf_size = buf_size << sband->ht_cap.ampdu_factor;
|
||||
}
|
||||
if (buf_size == 0)
|
||||
buf_size = IEEE80211_MAX_AMPDU_BUF;
|
||||
|
||||
|
||||
/* examine state machine */
|
||||
|
@@ -1822,6 +1822,7 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
|
||||
*cookie ^= 2;
|
||||
IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_TX_OFFCHAN;
|
||||
local->hw_roc_skb = skb;
|
||||
local->hw_roc_skb_for_status = skb;
|
||||
mutex_unlock(&local->mtx);
|
||||
|
||||
return 0;
|
||||
@@ -1875,6 +1876,7 @@ static int ieee80211_mgmt_tx_cancel_wait(struct wiphy *wiphy,
|
||||
if (ret == 0) {
|
||||
kfree_skb(local->hw_roc_skb);
|
||||
local->hw_roc_skb = NULL;
|
||||
local->hw_roc_skb_for_status = NULL;
|
||||
}
|
||||
|
||||
mutex_unlock(&local->mtx);
|
||||
|
@@ -953,7 +953,7 @@ struct ieee80211_local {
|
||||
|
||||
struct ieee80211_channel *hw_roc_channel;
|
||||
struct net_device *hw_roc_dev;
|
||||
struct sk_buff *hw_roc_skb;
|
||||
struct sk_buff *hw_roc_skb, *hw_roc_skb_for_status;
|
||||
struct work_struct hw_roc_start, hw_roc_done;
|
||||
enum nl80211_channel_type hw_roc_channel_type;
|
||||
unsigned int hw_roc_duration;
|
||||
|
@@ -39,6 +39,8 @@ module_param(ieee80211_disable_40mhz_24ghz, bool, 0644);
|
||||
MODULE_PARM_DESC(ieee80211_disable_40mhz_24ghz,
|
||||
"Disable 40MHz support in the 2.4GHz band");
|
||||
|
||||
static struct lock_class_key ieee80211_rx_skb_queue_class;
|
||||
|
||||
void ieee80211_configure_filter(struct ieee80211_local *local)
|
||||
{
|
||||
u64 mc;
|
||||
@@ -569,7 +571,15 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,
|
||||
spin_lock_init(&local->filter_lock);
|
||||
spin_lock_init(&local->queue_stop_reason_lock);
|
||||
|
||||
skb_queue_head_init(&local->rx_skb_queue);
|
||||
/*
|
||||
* The rx_skb_queue is only accessed from tasklets,
|
||||
* but other SKB queues are used from within IRQ
|
||||
* context. Therefore, this one needs a different
|
||||
* locking class so our direct, non-irq-safe use of
|
||||
* the queue's lock doesn't throw lockdep warnings.
|
||||
*/
|
||||
skb_queue_head_init_class(&local->rx_skb_queue,
|
||||
&ieee80211_rx_skb_queue_class);
|
||||
|
||||
INIT_DELAYED_WORK(&local->scan_work, ieee80211_scan_work);
|
||||
|
||||
|
@@ -323,6 +323,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
|
||||
|
||||
if (info->flags & IEEE80211_TX_INTFL_NL80211_FRAME_TX) {
|
||||
struct ieee80211_work *wk;
|
||||
u64 cookie = (unsigned long)skb;
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(wk, &local->work_list, list) {
|
||||
@@ -334,8 +335,12 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
|
||||
break;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
if (local->hw_roc_skb_for_status == skb) {
|
||||
cookie = local->hw_roc_cookie ^ 2;
|
||||
local->hw_roc_skb_for_status = NULL;
|
||||
}
|
||||
cfg80211_mgmt_tx_status(
|
||||
skb->dev, (unsigned long) skb, skb->data, skb->len,
|
||||
skb->dev, cookie, skb->data, skb->len,
|
||||
!!(info->flags & IEEE80211_TX_STAT_ACK), GFP_ATOMIC);
|
||||
}
|
||||
|
||||
|
@@ -1547,7 +1547,7 @@ static int ieee80211_skb_resize(struct ieee80211_local *local,
|
||||
skb_orphan(skb);
|
||||
}
|
||||
|
||||
if (skb_header_cloned(skb))
|
||||
if (skb_cloned(skb))
|
||||
I802_DEBUG_INC(local->tx_expand_skb_head_cloned);
|
||||
else if (head_need || tail_need)
|
||||
I802_DEBUG_INC(local->tx_expand_skb_head);
|
||||
@@ -2230,6 +2230,9 @@ struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw,
|
||||
|
||||
sdata = vif_to_sdata(vif);
|
||||
|
||||
if (!ieee80211_sdata_running(sdata))
|
||||
goto out;
|
||||
|
||||
if (tim_offset)
|
||||
*tim_offset = 0;
|
||||
if (tim_length)
|
||||
|
Reference in New Issue
Block a user