Merge tag 'xtensa-next-20141215' of git://github.com/czankel/xtensa-linux
[cascardo/linux.git] / net / mac80211 / sta_info.c
index de494df..a42f5b2 100644 (file)
@@ -351,6 +351,9 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
 
        sta->sta_state = IEEE80211_STA_NONE;
 
+       /* Mark TID as unreserved */
+       sta->reserved_tid = IEEE80211_TID_UNRESERVED;
+
        ktime_get_ts(&uptime);
        sta->last_connected = uptime.tv_sec;
        ewma_init(&sta->avg_signal, 1024, 8);
@@ -501,7 +504,7 @@ static int sta_info_insert_finish(struct sta_info *sta) __acquires(RCU)
        /* make the station visible */
        sta_info_hash_add(local, sta);
 
-       list_add_rcu(&sta->list, &local->sta_list);
+       list_add_tail_rcu(&sta->list, &local->sta_list);
 
        /* notify driver */
        err = sta_info_insert_drv_state(local, sdata, sta);
@@ -847,6 +850,15 @@ static int __must_check __sta_info_destroy_part1(struct sta_info *sta)
        if (WARN_ON(ret))
                return ret;
 
+       /*
+        * for TDLS peers, make sure to return to the base channel before
+        * removal.
+        */
+       if (test_sta_flag(sta, WLAN_STA_TDLS_OFF_CHANNEL)) {
+               drv_tdls_cancel_channel_switch(local, sdata, &sta->sta);
+               clear_sta_flag(sta, WLAN_STA_TDLS_OFF_CHANNEL);
+       }
+
        list_del_rcu(&sta->list);
 
        drv_sta_pre_rcu_remove(local, sta->sdata, sta);
@@ -1249,7 +1261,8 @@ static void ieee80211_send_null_response(struct ieee80211_sub_if_data *sdata,
                return;
        }
 
-       ieee80211_xmit(sdata, skb, chanctx_conf->def.chan->band);
+       info->band = chanctx_conf->def.chan->band;
+       ieee80211_xmit(sdata, skb);
        rcu_read_unlock();
 }
 
@@ -1531,7 +1544,7 @@ void ieee80211_sta_ps_deliver_uapsd(struct sta_info *sta)
                break;
        case 0:
                /* XXX: what is a good value? */
-               n_frames = 8;
+               n_frames = 128;
                break;
        }