Changeset 44872


Ignore:
Timestamp:
2015-03-17T18:14:43+01:00 (3 years ago)
Author:
nbd
Message:

mac80211: add some improvements to the software queueing code

Signed-off-by: Felix Fietkau <nbd@…>

Location:
trunk/package/kernel/mac80211/patches
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/kernel/mac80211/patches/300-mac80211-add-an-intermediate-software-queue-implemen.patch

    r44748 r44872  
    2020--- a/include/net/mac80211.h 
    2121+++ b/include/net/mac80211.h 
    22 @@ -1257,6 +1257,8 @@ struct ieee80211_vif { 
     22@@ -84,6 +84,34 @@ 
     23  * 
     24  */ 
     25  
     26+/** 
     27+ * DOC: mac80211 software tx queueing 
     28+ * 
     29+ * mac80211 provides an optional intermediate queueing implementation designed 
     30+ * to allow the driver to keep hardware queues short and provide some fairness 
     31+ * between different stations/interfaces. 
     32+ * In this model, the driver pulls data frames from the mac80211 queue instead 
     33+ * of letting mac80211 push them via drv_tx(). 
     34+ * Other frames (e.g. control or management) are still pushed using drv_tx(). 
     35+ * 
     36+ * Intermediate queues (struct ieee80211_txq) are kept per-sta per-tid, with a 
     37+ * single per-vif queue for multicast data frames. 
     38+ * 
     39+ * The driver is expected to initialize its private per-queue data for stations 
     40+ * and interfaces in the .add_interface and .sta_add ops. 
     41+ * 
     42+ * The driver can not access the queue directly. To dequeue a frame, it calls 
     43+ * ieee80211_tx_dequeue(). Whenever mac80211 adds a new frame to a queue, it 
     44+ * calls the .wake_tx_queue driver op. 
     45+ * 
     46+ * For AP powersave TIM handling, the driver only needs to indicate if it has 
     47+ * buffered packets in the driver specific data structures by calling 
     48+ * ieee80211_sta_set_buffered(). For frames buffered in the ieee80211_txq 
     49+ * struct, mac80211 sets TIM and calls .release_buffered_frames(). 
     50+ * The driver is expected to release its own buffered frames and also call 
     51+ * ieee80211_tx_dequeue() within that callback. 
     52+ */ 
     53+ 
     54 struct device; 
     55  
     56 /** 
     57@@ -1257,6 +1285,8 @@ struct ieee80211_vif { 
    2358        u8 cab_queue; 
    2459        u8 hw_queue[IEEE80211_NUM_ACS]; 
     
    2964  
    3065        u32 driver_flags; 
    31 @@ -1519,6 +1521,8 @@ struct ieee80211_sta { 
     66@@ -1519,6 +1549,8 @@ struct ieee80211_sta { 
    3267        bool tdls_initiator; 
    3368        bool mfp; 
     
    3873        u8 drv_priv[0] __aligned(sizeof(void *)); 
    3974 }; 
    40 @@ -1547,6 +1551,27 @@ struct ieee80211_tx_control { 
     75@@ -1547,6 +1579,27 @@ struct ieee80211_tx_control { 
    4176 }; 
    4277  
     
    4681+ * @vif: &struct ieee80211_vif pointer from the add_interface callback. 
    4782+ * @sta: station table entry, may be NULL for per-vif queue 
    48 + * @tid: the TID for this queue (unset for per-vif queue) 
     83+ * @tid: the TID for this queue (unused for per-vif queue) 
    4984+ * @ac: the AC for this queue 
    5085+ * 
     
    66101  * 
    67102  * These flags are used to indicate hardware capabilities to 
    68 @@ -1770,6 +1795,8 @@ enum ieee80211_hw_flags { 
     103@@ -1770,6 +1823,8 @@ enum ieee80211_hw_flags { 
    69104  *     within &struct ieee80211_sta. 
    70105  * @chanctx_data_size: size (in bytes) of the drv_priv data area 
     
    75110  * @max_rates: maximum number of alternate rate retry stages the hw 
    76111  *     can handle. 
    77 @@ -1818,6 +1845,9 @@ enum ieee80211_hw_flags { 
     112@@ -1818,6 +1873,9 @@ enum ieee80211_hw_flags { 
    78113  * @n_cipher_schemes: a size of an array of cipher schemes definitions. 
    79114  * @cipher_schemes: a pointer to an array of cipher scheme definitions 
     
    85120 struct ieee80211_hw { 
    86121        struct ieee80211_conf conf; 
    87 @@ -1830,6 +1860,7 @@ struct ieee80211_hw { 
     122@@ -1830,6 +1888,7 @@ struct ieee80211_hw { 
    88123        int vif_data_size; 
    89124        int sta_data_size; 
     
    93128        u16 max_listen_interval; 
    94129        s8 max_signal; 
    95 @@ -1846,6 +1877,7 @@ struct ieee80211_hw { 
     130@@ -1846,6 +1905,7 @@ struct ieee80211_hw { 
    96131        u8 uapsd_max_sp_len; 
    97132        u8 n_cipher_schemes; 
     
    101136  
    102137 /** 
    103 @@ -3007,6 +3039,8 @@ enum ieee80211_reconfig_type { 
     138@@ -3007,6 +3067,8 @@ enum ieee80211_reconfig_type { 
    104139  *     response template is provided, together with the location of the 
    105140  *     switch-timing IE within the template. The skb can only be used within 
     
    110145 struct ieee80211_ops { 
    111146        void (*tx)(struct ieee80211_hw *hw, 
    112 @@ -3238,6 +3272,9 @@ struct ieee80211_ops { 
     147@@ -3238,6 +3300,9 @@ struct ieee80211_ops { 
    113148        void (*tdls_recv_channel_switch)(struct ieee80211_hw *hw, 
    114149                                         struct ieee80211_vif *vif, 
     
    120155  
    121156 /** 
    122 @@ -5249,4 +5286,17 @@ void ieee80211_unreserve_tid(struct ieee 
     157@@ -5249,4 +5314,17 @@ void ieee80211_unreserve_tid(struct ieee 
    123158  */ 
    124159 size_t ieee80211_ie_split(const u8 *ies, size_t ielen, 
     
    131166+ * @txq: pointer obtained from .add_tx_queue() call 
    132167+ * 
    133 + * Returns the sjb if successful, ERR_PTR(-EAGAIN) if no frame was available. 
     168+ * Returns the skb if successful, NULL if no frame was available. 
    134169+ */ 
    135170+struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw, 
     
    140175--- a/net/mac80211/driver-ops.h 
    141176+++ b/net/mac80211/driver-ops.h 
    142 @@ -1367,4 +1367,21 @@ drv_tdls_recv_channel_switch(struct ieee 
     177@@ -1367,4 +1367,16 @@ drv_tdls_recv_channel_switch(struct ieee 
    143178        trace_drv_return_void(local); 
    144179 } 
     
    152187+               return; 
    153188+ 
    154 +       if (txq->txq.sta) 
    155 +               trace_drv_wake_sta_tx_queue(local, sdata, txq->txq.sta, 
    156 +                                           txq->txq.tid); 
    157 +       else 
    158 +               trace_drv_wake_vif_tx_queue(local, sdata); 
    159 + 
     189+       trace_drv_wake_tx_queue(local, sdata, txq->txq.sta, txq->txq.tid); 
    160190+       local->ops->wake_tx_queue(&local->hw, &txq->txq); 
    161191+} 
     
    164194--- a/net/mac80211/ieee80211_i.h 
    165195+++ b/net/mac80211/ieee80211_i.h 
    166 @@ -809,6 +809,13 @@ struct mac80211_qos_map { 
     196@@ -809,6 +809,19 @@ struct mac80211_qos_map { 
    167197        struct rcu_head rcu_head; 
    168198 }; 
    169199  
     200+enum txq_info_flags { 
     201+       IEEE80211_TXQ_STOP, 
     202+       IEEE80211_TXQ_AMPDU, 
     203+}; 
     204+ 
    170205+struct txq_info { 
    171206+       struct sk_buff_head queue; 
     207+       unsigned long flags; 
    172208+ 
    173209+       /* keep last! */ 
     
    178214        struct list_head list; 
    179215  
    180 @@ -853,6 +860,7 @@ struct ieee80211_sub_if_data { 
     216@@ -853,6 +866,7 @@ struct ieee80211_sub_if_data { 
    181217        bool control_port_no_encrypt; 
    182218        int encrypt_headroom; 
     
    186222        struct mac80211_qos_map __rcu *qos_map; 
    187223  
    188 @@ -1905,6 +1913,12 @@ static inline bool ieee80211_can_run_wor 
     224@@ -1453,6 +1467,10 @@ static inline struct ieee80211_local *hw 
     225        return container_of(hw, struct ieee80211_local, hw); 
     226 } 
     227  
     228+static inline struct txq_info *to_txq_info(struct ieee80211_txq *txq) 
     229+{ 
     230+       return container_of(txq, struct txq_info, txq); 
     231+} 
     232  
     233 static inline int ieee80211_bssid_match(const u8 *raddr, const u8 *addr) 
     234 { 
     235@@ -1905,6 +1923,12 @@ static inline bool ieee80211_can_run_wor 
    189236        return true; 
    190237 } 
     
    235282                        return ret; 
    236283                } 
    237 @@ -1802,6 +1815,7 @@ int ieee80211_if_add(struct ieee80211_lo 
    238   
    239  void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata) 
    240  { 
    241 +       struct txq_info *txqi; 
    242         ASSERT_RTNL(); 
    243   
    244         mutex_lock(&sdata->local->iflist_mtx); 
    245 @@ -1810,6 +1824,11 @@ void ieee80211_if_remove(struct ieee8021 
     284@@ -1810,6 +1823,9 @@ void ieee80211_if_remove(struct ieee8021 
    246285  
    247286        synchronize_rcu(); 
    248287  
    249 +       if (sdata->vif.txq) { 
    250 +               txqi = container_of(sdata->vif.txq, struct txq_info, txq); 
    251 +               kfree(txqi); 
    252 +       } 
     288+       if (sdata->vif.txq) 
     289+               kfree(to_txq_info(sdata->vif.txq)); 
    253290+ 
    254291        if (sdata->dev) { 
    255292                unregister_netdevice(sdata->dev); 
    256293        } else { 
    257 @@ -1833,6 +1852,7 @@ void ieee80211_sdata_stop(struct ieee802 
    258  void ieee80211_remove_interfaces(struct ieee80211_local *local) 
    259  { 
    260         struct ieee80211_sub_if_data *sdata, *tmp; 
    261 +       struct txq_info *txqi; 
    262         LIST_HEAD(unreg_list); 
    263         LIST_HEAD(wdev_list); 
    264   
    265 @@ -1851,6 +1871,12 @@ void ieee80211_remove_interfaces(struct  
     294@@ -1851,6 +1867,9 @@ void ieee80211_remove_interfaces(struct  
    266295        list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) { 
    267296                list_del(&sdata->list); 
    268297  
    269 +               if (sdata->vif.txq) { 
    270 +                       txqi = container_of(sdata->vif.txq, struct txq_info, 
    271 +                                          txq); 
    272 +                       kfree(txqi); 
    273 +               } 
     298+               if (sdata->vif.txq) 
     299+                       kfree(to_txq_info(sdata->vif.txq)); 
    274300+ 
    275301                if (sdata->dev) 
     
    294320        } 
    295321  
    296 +       if (sta->txqi) { 
    297 +               for (i = 0; i < IEEE80211_NUM_TIDS; i++) 
     322+       if (sta->sta.txq[0]) { 
     323+               for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) 
    298324+                       ieee80211_flush_tx_queue(local, sta->sta.txq[i]); 
    299325+       } 
     
    302328                local->total_ps_buffered -= skb_queue_len(&sta->ps_tx_buf[ac]); 
    303329                ieee80211_purge_tx_queue(&local->hw, &sta->ps_tx_buf[ac]); 
    304 @@ -234,6 +239,7 @@ void sta_info_free(struct ieee80211_loca 
     330@@ -234,6 +239,8 @@ void sta_info_free(struct ieee80211_loca 
    305331  
    306332        sta_dbg(sta->sdata, "Destroyed STA %pM\n", sta->sta.addr); 
    307333  
    308 +       kfree(sta->txqi); 
     334+       if (sta->sta.txq[0]) 
     335+               kfree(to_txq_info(sta->sta.txq[0])); 
    309336        kfree(rcu_dereference_raw(sta->sta.rates)); 
    310337        kfree(sta); 
    311338 } 
    312 @@ -285,11 +291,12 @@ struct sta_info *sta_info_alloc(struct i 
     339@@ -285,11 +292,12 @@ struct sta_info *sta_info_alloc(struct i 
    313340                                const u8 *addr, gfp_t gfp) 
    314341 { 
     
    324351                return NULL; 
    325352  
    326 @@ -321,11 +328,25 @@ struct sta_info *sta_info_alloc(struct i 
     353@@ -321,11 +329,24 @@ struct sta_info *sta_info_alloc(struct i 
    327354        for (i = 0; i < ARRAY_SIZE(sta->chain_signal_avg); i++) 
    328355                ewma_init(&sta->chain_signal_avg[i], 1024, 8); 
     
    336363+                          ALIGN(hw->txq_data_size, sizeof(void *)); 
    337364+ 
    338 +               txq_data = kcalloc(IEEE80211_NUM_TIDS, size, gfp); 
     365+               txq_data = kcalloc(ARRAY_SIZE(sta->sta.txq), size, gfp); 
    339366+               if (!txq_data) 
    340367+                       goto free; 
    341368+ 
    342 +               sta->txqi = txq_data; 
    343 +               for (i = 0; i < IEEE80211_NUM_TIDS; i++) { 
     369+               for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) { 
    344370+                       struct txq_info *txq = txq_data + i * size; 
    345371+                       ieee80211_init_tx_queue(sdata, sta, txq, i); 
     
    362388                                IEEE80211_HT_CAP_SM_PS_SHIFT; 
    363389                /* 
    364 @@ -371,6 +392,12 @@ struct sta_info *sta_info_alloc(struct i 
     390@@ -371,6 +392,13 @@ struct sta_info *sta_info_alloc(struct i 
    365391        sta_dbg(sdata, "Allocated STA %pM\n", sta->sta.addr); 
    366392  
     
    368394+ 
    369395+free_txq: 
    370 +       kfree(sta->txqi); 
     396+       if (sta->sta.txq[0]) 
     397+               kfree(to_txq_info(sta->sta.txq[0])); 
    371398+free: 
    372399+       kfree(sta); 
     
    375402  
    376403 static int sta_info_insert_check(struct sta_info *sta) 
    377 @@ -640,6 +667,8 @@ static void __sta_info_recalc_tim(struct 
     404@@ -640,6 +668,8 @@ static void __sta_info_recalc_tim(struct 
    378405  
    379406                indicate_tim |= 
     
    384411  
    385412  done: 
    386 @@ -1071,7 +1100,7 @@ void ieee80211_sta_ps_deliver_wakeup(str 
     413@@ -1071,7 +1101,7 @@ void ieee80211_sta_ps_deliver_wakeup(str 
    387414        struct ieee80211_sub_if_data *sdata = sta->sdata; 
    388415        struct ieee80211_local *local = sdata->local; 
     
    393420        struct ps_data *ps; 
    394421  
    395 @@ -1090,10 +1119,25 @@ void ieee80211_sta_ps_deliver_wakeup(str 
     422@@ -1090,10 +1120,22 @@ void ieee80211_sta_ps_deliver_wakeup(str 
    396423  
    397424        BUILD_BUG_ON(BITS_TO_LONGS(IEEE80211_NUM_TIDS) > 1); 
     
    402429                drv_sta_notify(local, sdata, STA_NOTIFY_AWAKE, &sta->sta); 
    403430  
    404 +       if (sta->txqi) { 
     431+       if (sta->sta.txq[0]) { 
    405432+               for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) { 
    406 +                       struct txq_info *txqi; 
    407 + 
    408 +                       txqi = container_of(sta->sta.txq[i], struct txq_info, 
    409 +                                           txq); 
     433+                       struct txq_info *txqi = to_txq_info(sta->sta.txq[i]); 
    410434+ 
    411435+                       if (!skb_queue_len(&txqi->queue)) 
     
    419443  
    420444        /* sync with ieee80211_tx_h_unicast_ps_buf */ 
    421 @@ -1254,7 +1298,7 @@ ieee80211_sta_ps_deliver_response(struct 
     445@@ -1254,7 +1296,7 @@ ieee80211_sta_ps_deliver_response(struct 
    422446        struct ieee80211_sub_if_data *sdata = sta->sdata; 
    423447        struct ieee80211_local *local = sdata->local; 
     
    428452        struct sk_buff_head frames; 
    429453  
    430 @@ -1275,8 +1319,10 @@ ieee80211_sta_ps_deliver_response(struct 
     454@@ -1275,8 +1317,10 @@ ieee80211_sta_ps_deliver_response(struct 
    431455                /* if we already have frames from software, then we can't also 
    432456                 * release from hardware queues 
     
    440464                if (driver_release_tids) { 
    441465                        /* If the driver has data on more than one TID then 
    442 @@ -1447,6 +1493,8 @@ ieee80211_sta_ps_deliver_response(struct 
     466@@ -1447,6 +1491,8 @@ ieee80211_sta_ps_deliver_response(struct 
    443467  
    444468                sta_info_recalc_tim(sta); 
     
    449473                 * We need to release a frame that is buffered somewhere in the 
    450474                 * driver ... it'll have to handle that. 
    451 @@ -1466,8 +1514,25 @@ ieee80211_sta_ps_deliver_response(struct 
     475@@ -1466,8 +1512,22 @@ ieee80211_sta_ps_deliver_response(struct 
    452476                 * that the TID(s) became empty before returning here from the 
    453477                 * release function. 
     
    458482                 */ 
    459483+ 
    460 +               if (!sta->txqi) 
     484+               if (!sta->sta.txq[0]) 
    461485+                       return; 
    462486+ 
    463 +               for (tid = 0; tid < IEEE80211_NUM_TIDS; tid++) { 
    464 +                       struct txq_info *txqi; 
    465 + 
    466 +                       txqi = container_of(sta->sta.txq[tid], struct txq_info, 
    467 +                                           txq); 
     487+               for (tid = 0; tid < ARRAY_SIZE(sta->sta.txq); tid++) { 
     488+                       struct txq_info *txqi = to_txq_info(sta->sta.txq[tid]); 
    468489+ 
    469490+                       if (!(tids & BIT(tid)) || skb_queue_len(&txqi->queue)) 
     
    486507  * @rx_bytes: Number of bytes received from this STA 
    487508  * @last_rx: time (in jiffies) when last frame was received from this STA 
    488 @@ -368,6 +369,8 @@ struct sta_info { 
     509@@ -368,6 +369,7 @@ struct sta_info { 
    489510        struct sk_buff_head ps_tx_buf[IEEE80211_NUM_ACS]; 
    490511        struct sk_buff_head tx_filtered[IEEE80211_NUM_ACS]; 
    491512        unsigned long driver_buffered_tids; 
    492513+       unsigned long txq_buffered_tids; 
    493 +       struct txq_info *txqi; 
    494514  
    495515        /* Updated from RX path only, no locking requirements */ 
     
    497517--- a/net/mac80211/trace.h 
    498518+++ b/net/mac80211/trace.h 
    499 @@ -2312,6 +2312,40 @@ TRACE_EVENT(drv_tdls_recv_channel_switch 
     519@@ -2312,6 +2312,34 @@ TRACE_EVENT(drv_tdls_recv_channel_switch 
    500520        ) 
    501521 ); 
    502522  
    503 +DEFINE_EVENT(local_sdata_evt, drv_wake_vif_tx_queue, 
    504 +       TP_PROTO(struct ieee80211_local *local, 
    505 +                struct ieee80211_sub_if_data *sdata), 
    506 +       TP_ARGS(local, sdata) 
    507 +); 
    508 + 
    509 +TRACE_EVENT(drv_wake_sta_tx_queue, 
     523+TRACE_EVENT(drv_wake_tx_queue, 
    510524+       TP_PROTO(struct ieee80211_local *local, 
    511525+                struct ieee80211_sub_if_data *sdata, 
     
    540554--- a/net/mac80211/tx.c 
    541555+++ b/net/mac80211/tx.c 
    542 @@ -1201,13 +1201,80 @@ ieee80211_tx_prepare(struct ieee80211_su 
     556@@ -776,12 +776,23 @@ ieee80211_tx_h_rate_ctrl(struct ieee8021 
     557        return TX_CONTINUE; 
     558 } 
     559  
     560+static u16 
     561+ieee80211_tx_next_seq(struct sta_info *sta, int tid) 
     562+{ 
     563+       u16 *seq = &sta->tid_seq[tid]; 
     564+       u16 ret = cpu_to_le16(*seq); 
     565+ 
     566+       /* Increase the sequence number. */ 
     567+       *seq = (*seq + 0x10) & IEEE80211_SCTL_SEQ; 
     568+ 
     569+       return ret; 
     570+} 
     571+ 
     572 static ieee80211_tx_result debug_noinline 
     573 ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx) 
     574 { 
     575        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); 
     576        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data; 
     577-       u16 *seq; 
     578        u8 *qc; 
     579        int tid; 
     580  
     581@@ -832,13 +843,10 @@ ieee80211_tx_h_sequence(struct ieee80211 
     582  
     583        qc = ieee80211_get_qos_ctl(hdr); 
     584        tid = *qc & IEEE80211_QOS_CTL_TID_MASK; 
     585-       seq = &tx->sta->tid_seq[tid]; 
     586        tx->sta->tx_msdu[tid]++; 
     587  
     588-       hdr->seq_ctrl = cpu_to_le16(*seq); 
     589- 
     590-       /* Increase the sequence number. */ 
     591-       *seq = (*seq + 0x10) & IEEE80211_SCTL_SEQ; 
     592+       if (!tx->sta->sta.txq[0]) 
     593+               hdr->seq_ctrl = ieee80211_tx_next_seq(tx->sta, tid); 
     594  
     595        return TX_CONTINUE; 
     596 } 
     597@@ -1067,7 +1075,7 @@ static bool ieee80211_tx_prep_agg(struct 
     598                 * nothing -- this aggregation session is being started 
     599                 * but that might still fail with the driver 
     600                 */ 
     601-       } else { 
     602+       } else if (!tx->sta->sta.txq[tid]) { 
     603                spin_lock(&tx->sta->lock); 
     604                /* 
     605                 * Need to re-check now, because we may get here 
     606@@ -1201,13 +1209,101 @@ ieee80211_tx_prepare(struct ieee80211_su 
    543607        return TX_CONTINUE; 
    544608 } 
     
    562626+               goto tx_normal; 
    563627+ 
    564 +       if (ieee80211_is_mgmt(hdr->frame_control) || 
    565 +           ieee80211_is_ctl(hdr->frame_control)) 
     628+       if (!ieee80211_is_data(hdr->frame_control)) 
    566629+               goto tx_normal; 
    567630+ 
     
    597660+       struct ieee80211_sub_if_data *sdata = vif_to_sdata(txq->vif); 
    598661+       struct txq_info *txqi = container_of(txq, struct txq_info, txq); 
    599 +       struct sk_buff *skb; 
     662+       struct ieee80211_hdr *hdr; 
     663+       struct sk_buff *skb = NULL; 
    600664+       u8 ac = txq->ac; 
    601665+ 
    602 +       skb = skb_dequeue(&txqi->queue); 
     666+       spin_lock_bh(&txqi->queue.lock); 
     667+ 
     668+       if (test_bit(IEEE80211_TXQ_STOP, &txqi->flags)) 
     669+               goto out; 
     670+ 
     671+       skb = __skb_dequeue(&txqi->queue); 
    603672+       if (!skb) 
    604 +               return ERR_PTR(-EAGAIN); 
     673+               goto out; 
    605674+ 
    606675+       atomic_dec(&sdata->txqs_len[ac]); 
    607676+       if (__netif_subqueue_stopped(sdata->dev, ac)) 
    608677+               ieee80211_propagate_queue_wake(local, sdata->vif.hw_queue[ac]); 
     678+ 
     679+       hdr = (struct ieee80211_hdr *)skb->data; 
     680+       if (txq->sta && ieee80211_is_data_qos(hdr->frame_control)) { 
     681+               struct sta_info *sta = container_of(txq->sta, struct sta_info, 
     682+                                                   sta); 
     683+               struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 
     684+ 
     685+               hdr->seq_ctrl = ieee80211_tx_next_seq(sta, txq->tid); 
     686+               if (test_bit(IEEE80211_TXQ_AMPDU, &txqi->flags)) 
     687+                       info->flags |= IEEE80211_TX_CTL_AMPDU; 
     688+               else 
     689+                       info->flags &= ~IEEE80211_TX_CTL_AMPDU; 
     690+       } 
     691+ 
     692+out: 
     693+       spin_unlock_bh(&txqi->queue.lock); 
    609694+ 
    610695+       return skb; 
     
    622707        unsigned long flags; 
    623708  
    624 @@ -1265,10 +1332,9 @@ static bool ieee80211_tx_frags(struct ie 
     709@@ -1265,10 +1361,9 @@ static bool ieee80211_tx_frags(struct ie 
    625710                spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); 
    626711  
     
    695780        if (sta->sdata->vif.type == NL80211_IFTYPE_AP || 
    696781            sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) 
    697 @@ -1189,6 +1190,20 @@ static void sta_ps_start(struct sta_info 
     782@@ -1189,6 +1190,18 @@ static void sta_ps_start(struct sta_info 
    698783                drv_sta_notify(local, sdata, STA_NOTIFY_SLEEP, &sta->sta); 
    699784        ps_dbg(sdata, "STA %pM aid %d enters power save mode\n", 
    700785               sta->sta.addr, sta->sta.aid); 
    701786+ 
    702 +       if (!sta->txqi) 
     787+       if (!sta->sta.txq[0]) 
    703788+               return; 
    704789+ 
    705 +       for (tid = 0; tid < IEEE80211_NUM_TIDS; tid++) { 
    706 +               struct txq_info *txqi; 
    707 + 
    708 +               txqi = container_of(sta->sta.txq[tid], struct txq_info, txq); 
     790+       for (tid = 0; tid < ARRAY_SIZE(sta->sta.txq); tid++) { 
     791+               struct txq_info *txqi = to_txq_info(sta->sta.txq[tid]); 
    709792+ 
    710793+               if (!skb_queue_len(&txqi->queue)) 
     
    716799  
    717800 static void sta_ps_end(struct sta_info *sta) 
     801--- a/net/mac80211/agg-tx.c 
     802+++ b/net/mac80211/agg-tx.c 
     803@@ -188,6 +188,41 @@ ieee80211_wake_queue_agg(struct ieee8021 
     804        __release(agg_queue); 
     805 } 
     806  
     807+static void 
     808+ieee80211_agg_stop_txq(struct sta_info *sta, int tid) 
     809+{ 
     810+       struct ieee80211_txq *txq = sta->sta.txq[tid]; 
     811+       struct txq_info *txqi; 
     812+ 
     813+       if (!txq) 
     814+               return; 
     815+ 
     816+       txqi = to_txq_info(txq); 
     817+       spin_lock_bh(&txqi->queue.lock); 
     818+       set_bit(IEEE80211_TXQ_STOP, &txqi->flags); 
     819+       spin_unlock_bh(&txqi->queue.lock); 
     820+} 
     821+ 
     822+static void 
     823+ieee80211_agg_start_txq(struct sta_info *sta, int tid, bool enable) 
     824+{ 
     825+       struct ieee80211_txq *txq = sta->sta.txq[tid]; 
     826+       struct txq_info *txqi; 
     827+ 
     828+       if (!txq) 
     829+               return; 
     830+ 
     831+       txqi = to_txq_info(txq); 
     832+ 
     833+       if (enable) 
     834+               set_bit(IEEE80211_TXQ_AMPDU, &txqi->flags); 
     835+       else 
     836+               clear_bit(IEEE80211_TXQ_AMPDU, &txqi->flags); 
     837+ 
     838+       clear_bit(IEEE80211_TXQ_STOP, &txqi->flags); 
     839+       drv_wake_tx_queue(sta->sdata->local, txqi); 
     840+} 
     841+ 
     842 /* 
     843  * splice packets from the STA's pending to the local pending, 
     844  * requires a call to ieee80211_agg_splice_finish later 
     845@@ -247,6 +282,7 @@ static void ieee80211_remove_tid_tx(stru 
     846        ieee80211_assign_tid_tx(sta, tid, NULL); 
     847  
     848        ieee80211_agg_splice_finish(sta->sdata, tid); 
     849+       ieee80211_agg_start_txq(sta, tid, false); 
     850  
     851        kfree_rcu(tid_tx, rcu_head); 
     852 } 
     853@@ -418,6 +454,8 @@ void ieee80211_tx_ba_session_handle_star 
     854         */ 
     855        clear_bit(HT_AGG_STATE_WANT_START, &tid_tx->state); 
     856  
     857+       ieee80211_agg_stop_txq(sta, tid); 
     858+ 
     859        /* 
     860         * Make sure no packets are being processed. This ensures that 
     861         * we have a valid starting sequence number and that in-flight 
     862@@ -440,6 +478,8 @@ void ieee80211_tx_ba_session_handle_star 
     863                ieee80211_agg_splice_finish(sdata, tid); 
     864                spin_unlock_bh(&sta->lock); 
     865  
     866+               ieee80211_agg_start_txq(sta, tid, false); 
     867+ 
     868                kfree_rcu(tid_tx, rcu_head); 
     869                return; 
     870        } 
     871@@ -666,6 +706,8 @@ static void ieee80211_agg_tx_operational 
     872        ieee80211_agg_splice_finish(sta->sdata, tid); 
     873  
     874        spin_unlock_bh(&sta->lock); 
     875+ 
     876+       ieee80211_agg_start_txq(sta, tid, true); 
     877 } 
     878  
     879 void ieee80211_start_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u16 tid) 
  • trunk/package/kernel/mac80211/patches/301-mac80211-lock-rate-control.patch

    r44748 r44872  
    105105--- a/net/mac80211/sta_info.c 
    106106+++ b/net/mac80211/sta_info.c 
    107 @@ -280,7 +280,7 @@ static int sta_prepare_rate_control(stru 
     107@@ -281,7 +281,7 @@ static int sta_prepare_rate_control(stru 
    108108  
    109109        sta->rate_ctrl = local->rate_ctrl; 
  • trunk/package/kernel/mac80211/patches/402-ath_regd_optional.patch

    r44655 r44872  
    4848--- a/drivers/net/wireless/ath/Kconfig 
    4949+++ b/drivers/net/wireless/ath/Kconfig 
    50 @@ -21,6 +21,9 @@ menuconfig ATH_CARDS 
     50@@ -22,6 +22,9 @@ menuconfig ATH_CARDS 
    5151  
    5252 if ATH_CARDS 
  • trunk/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch

    r44655 r44872  
    1919--- a/include/net/mac80211.h 
    2020+++ b/include/net/mac80211.h 
    21 @@ -1138,6 +1138,7 @@ enum ieee80211_smps_mode { 
     21@@ -1166,6 +1166,7 @@ enum ieee80211_smps_mode { 
    2222  * 
    2323  * @power_level: requested transmit power (in dBm), backward compatibility 
     
    2727  * @chandef: the channel definition to tune to 
    2828  * @radar_enabled: whether radar detection is enabled 
    29 @@ -1159,6 +1160,7 @@ struct ieee80211_conf { 
     29@@ -1187,6 +1188,7 @@ struct ieee80211_conf { 
    3030        u32 flags; 
    3131        int power_level, dynamic_ps_timeout; 
     
    8888--- a/net/mac80211/ieee80211_i.h 
    8989+++ b/net/mac80211/ieee80211_i.h 
    90 @@ -1330,6 +1330,7 @@ struct ieee80211_local { 
     90@@ -1336,6 +1336,7 @@ struct ieee80211_local { 
    9191        int dynamic_ps_forced_timeout; 
    9292  
Note: See TracChangeset for help on using the changeset viewer.