source: trunk/package/mac80211/patches/300-pending_work.patch @ 30758

Last change on this file since 30758 was 30758, checked in by nbd, 5 years ago

mac80211: fix ad-hoc mode performance regression

File size: 16.7 KB
  • drivers/net/wireless/ath/ath9k/ar9003_mac.c

    a b int ath9k_hw_process_rxdesc_edma(struct  
    510510                 */ 
    511511                if (rxsp->status11 & AR_CRCErr) 
    512512                        rxs->rs_status |= ATH9K_RXERR_CRC; 
    513                 else if (rxsp->status11 & AR_PHYErr) { 
     513                else if (rxsp->status11 & AR_DecryptCRCErr) 
     514                        rxs->rs_status |= ATH9K_RXERR_DECRYPT; 
     515                else if (rxsp->status11 & AR_MichaelErr) 
     516                        rxs->rs_status |= ATH9K_RXERR_MIC; 
     517                if (rxsp->status11 & AR_PHYErr) { 
    514518                        phyerr = MS(rxsp->status11, AR_PHYErrCode); 
    515519                        /* 
    516520                         * If we reach a point here where AR_PostDelimCRCErr is 
    int ath9k_hw_process_rxdesc_edma(struct  
    532536                                rxs->rs_status |= ATH9K_RXERR_PHY; 
    533537                                rxs->rs_phyerr = phyerr; 
    534538                        } 
    535  
    536                 } else if (rxsp->status11 & AR_DecryptCRCErr) 
    537                         rxs->rs_status |= ATH9K_RXERR_DECRYPT; 
    538                 else if (rxsp->status11 & AR_MichaelErr) 
    539                         rxs->rs_status |= ATH9K_RXERR_MIC; 
     539                }; 
    540540        } 
    541541 
    542542        if (rxsp->status11 & AR_KeyMiss) 
  • drivers/net/wireless/ath/carl9170/tx.c

    a b static bool carl9170_tx_ps_drop(struct a 
    12361236{ 
    12371237        struct ieee80211_sta *sta; 
    12381238        struct carl9170_sta_info *sta_info; 
     1239        struct ieee80211_tx_info *tx_info; 
    12391240 
    12401241        rcu_read_lock(); 
    12411242        sta = __carl9170_get_tx_sta(ar, skb); 
    static bool carl9170_tx_ps_drop(struct a 
    12431244                goto out_rcu; 
    12441245 
    12451246        sta_info = (void *) sta->drv_priv; 
    1246         if (unlikely(sta_info->sleeping)) { 
    1247                 struct ieee80211_tx_info *tx_info; 
     1247        tx_info = IEEE80211_SKB_CB(skb); 
    12481248 
     1249        if (unlikely(sta_info->sleeping) && 
     1250            !(tx_info->flags & (IEEE80211_TX_CTL_NO_PS_BUFFER | 
     1251                                IEEE80211_TX_CTL_CLEAR_PS_FILT))) { 
    12491252                rcu_read_unlock(); 
    12501253 
    1251                 tx_info = IEEE80211_SKB_CB(skb); 
    12521254                if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) 
    12531255                        atomic_dec(&ar->tx_ampdu_upload); 
    12541256 
  • drivers/net/wireless/iwlegacy/4965-mac.c

    a b il4965_tx_skb(struct il_priv *il, struct 
    16941694                sta_priv = (void *)sta->drv_priv; 
    16951695 
    16961696        if (sta_priv && sta_priv->asleep && 
    1697             (info->flags & IEEE80211_TX_CTL_POLL_RESPONSE)) { 
     1697            (info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER)) { 
    16981698                /* 
    16991699                 * This sends an asynchronous command to the device, 
    17001700                 * but we can rely on it being processed before the 
  • drivers/net/wireless/iwlwifi/iwl-agn-tx.c

    a b int iwlagn_tx_skb(struct iwl_priv *priv, 
    322322                sta_priv = (void *)info->control.sta->drv_priv; 
    323323 
    324324        if (sta_priv && sta_priv->asleep && 
    325             (info->flags & IEEE80211_TX_CTL_POLL_RESPONSE)) { 
     325            (info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER)) { 
    326326                /* 
    327327                 * This sends an asynchronous command to the device, 
    328328                 * but we can rely on it being processed before the 
    int iwlagn_tx_skb(struct iwl_priv *priv, 
    331331                 * counter. 
    332332                 * For now set the counter to just 1 since we do not 
    333333                 * support uAPSD yet. 
     334                 * 
     335                 * FIXME: If we get two non-bufferable frames one 
     336                 * after the other, we might only send out one of 
     337                 * them because this is racy. 
    334338                 */ 
    335339                iwl_sta_modify_sleep_tx_count(priv, sta_id, 1); 
    336340        } 
  • drivers/net/wireless/p54/txrx.c

    a b static void p54_tx_80211_header(struct p 
    690690        if (!(info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ)) 
    691691                *flags |= P54_HDR_FLAG_DATA_OUT_SEQNR; 
    692692 
    693         if (info->flags & IEEE80211_TX_CTL_POLL_RESPONSE) 
     693        if (info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER) 
    694694                *flags |= P54_HDR_FLAG_DATA_OUT_NOCANCEL; 
    695695 
    696696        if (info->flags & IEEE80211_TX_CTL_CLEAR_PS_FILT) 
  • include/net/mac80211.h

    a b struct ieee80211_bss_conf { 
    341341 *      used to indicate that a frame was already retried due to PS 
    342342 * @IEEE80211_TX_INTFL_DONT_ENCRYPT: completely internal to mac80211, 
    343343 *      used to indicate frame should not be encrypted 
    344  * @IEEE80211_TX_CTL_POLL_RESPONSE: This frame is a response to a poll 
    345  *      frame (PS-Poll or uAPSD) and should be sent although the station 
    346  *      is in powersave mode. 
     344 * @IEEE80211_TX_CTL_NO_PS_BUFFER: This frame is a response to a poll 
     345 *      frame (PS-Poll or uAPSD) or a non-bufferable MMPDU and must 
     346 *      be sent although the station is in powersave mode. 
    347347 * @IEEE80211_TX_CTL_MORE_FRAMES: More frames will be passed to the 
    348348 *      transmit function after the current frame, this can be used 
    349349 *      by drivers to kick the DMA queue only if unset or when the 
    enum mac80211_tx_control_flags { 
    399399        IEEE80211_TX_INTFL_NEED_TXPROCESSING    = BIT(14), 
    400400        IEEE80211_TX_INTFL_RETRIED              = BIT(15), 
    401401        IEEE80211_TX_INTFL_DONT_ENCRYPT         = BIT(16), 
    402         IEEE80211_TX_CTL_POLL_RESPONSE          = BIT(17), 
     402        IEEE80211_TX_CTL_NO_PS_BUFFER           = BIT(17), 
    403403        IEEE80211_TX_CTL_MORE_FRAMES            = BIT(18), 
    404404        IEEE80211_TX_INTFL_RETRANSMISSION       = BIT(19), 
    405405        /* hole at 20, use later */ 
    enum mac80211_tx_control_flags { 
    425425        IEEE80211_TX_CTL_SEND_AFTER_DTIM | IEEE80211_TX_CTL_AMPDU |           \ 
    426426        IEEE80211_TX_STAT_TX_FILTERED | IEEE80211_TX_STAT_ACK |               \ 
    427427        IEEE80211_TX_STAT_AMPDU | IEEE80211_TX_STAT_AMPDU_NO_BACK |           \ 
    428         IEEE80211_TX_CTL_RATE_CTRL_PROBE | IEEE80211_TX_CTL_POLL_RESPONSE |   \ 
     428        IEEE80211_TX_CTL_RATE_CTRL_PROBE | IEEE80211_TX_CTL_NO_PS_BUFFER |    \ 
    429429        IEEE80211_TX_CTL_MORE_FRAMES | IEEE80211_TX_CTL_LDPC |                \ 
    430430        IEEE80211_TX_CTL_STBC | IEEE80211_TX_STATUS_EOSP) 
    431431 
    void ieee80211_free_txskb(struct ieee802 
    16341634 * the station sends a PS-Poll or a uAPSD trigger frame, mac80211 
    16351635 * will inform the driver of this with the @allow_buffered_frames 
    16361636 * callback; this callback is optional. mac80211 will then transmit 
    1637  * the frames as usual and set the %IEEE80211_TX_CTL_POLL_RESPONSE 
     1637 * the frames as usual and set the %IEEE80211_TX_CTL_NO_PS_BUFFER 
    16381638 * on each frame. The last frame in the service period (or the only 
    16391639 * response to a PS-Poll) also has %IEEE80211_TX_STATUS_EOSP set to 
    16401640 * indicate that it ends the service period; as this frame must have 
    void ieee80211_free_txskb(struct ieee802 
    16421642 * When TX status is reported for this frame, the service period is 
    16431643 * marked has having ended and a new one can be started by the peer. 
    16441644 * 
     1645 * Additionally, non-bufferable MMPDUs can also be transmitted by 
     1646 * mac80211 with the %IEEE80211_TX_CTL_NO_PS_BUFFER set in them. 
     1647 * 
    16451648 * Another race condition can happen on some devices like iwlwifi 
    16461649 * when there are frames queued for the station and it wakes up 
    16471650 * or polls; the frames that are already queued could end up being 
    enum ieee80211_frame_release_type { 
    21402143 * @allow_buffered_frames: Prepare device to allow the given number of frames 
    21412144 *      to go out to the given station. The frames will be sent by mac80211 
    21422145 *      via the usual TX path after this call. The TX information for frames 
    2143  *      released will also have the %IEEE80211_TX_CTL_POLL_RESPONSE flag set 
     2146 *      released will also have the %IEEE80211_TX_CTL_NO_PS_BUFFER flag set 
    21442147 *      and the last one will also have %IEEE80211_TX_STATUS_EOSP set. In case 
    21452148 *      frames from multiple TIDs are released and the driver might reorder 
    21462149 *      them between the TIDs, it must set the %IEEE80211_TX_STATUS_EOSP flag 
  • net/mac80211/agg-rx.c

    a b static void ieee80211_send_addba_resp(st 
    187187                memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN); 
    188188        else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) 
    189189                memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN); 
     190        else if (sdata->vif.type == NL80211_IFTYPE_WDS) 
     191                memcpy(mgmt->bssid, da, ETH_ALEN); 
    190192 
    191193        mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | 
    192194                                          IEEE80211_STYPE_ACTION); 
  • net/mac80211/agg-tx.c

    a b static void ieee80211_send_addba_request 
    8181        memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN); 
    8282        if (sdata->vif.type == NL80211_IFTYPE_AP || 
    8383            sdata->vif.type == NL80211_IFTYPE_AP_VLAN || 
    84             sdata->vif.type == NL80211_IFTYPE_MESH_POINT) 
     84            sdata->vif.type == NL80211_IFTYPE_MESH_POINT || 
     85            sdata->vif.type == NL80211_IFTYPE_WDS) 
    8586                memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); 
    8687        else if (sdata->vif.type == NL80211_IFTYPE_STATION) 
    8788                memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN); 
    int ieee80211_start_tx_ba_session(struct 
    471472            sdata->vif.type != NL80211_IFTYPE_MESH_POINT && 
    472473            sdata->vif.type != NL80211_IFTYPE_AP_VLAN && 
    473474            sdata->vif.type != NL80211_IFTYPE_AP && 
     475            sdata->vif.type != NL80211_IFTYPE_WDS && 
    474476            sdata->vif.type != NL80211_IFTYPE_ADHOC) 
    475477                return -EINVAL; 
    476478 
  • net/mac80211/debugfs_sta.c

    a b static ssize_t sta_flags_read(struct fil 
    6363        test_sta_flag(sta, WLAN_STA_##flg) ? #flg "\n" : "" 
    6464 
    6565        int res = scnprintf(buf, sizeof(buf), 
    66                             "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", 
     66                            "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", 
    6767                            TEST(AUTH), TEST(ASSOC), TEST(PS_STA), 
    6868                            TEST(PS_DRIVER), TEST(AUTHORIZED), 
    6969                            TEST(SHORT_PREAMBLE), 
    70                             TEST(WME), TEST(WDS), TEST(CLEAR_PS_FILT), 
     70                            TEST(WME), TEST(CLEAR_PS_FILT), 
    7171                            TEST(MFP), TEST(BLOCK_BA), TEST(PSPOLL), 
    7272                            TEST(UAPSD), TEST(SP), TEST(TDLS_PEER), 
    7373                            TEST(TDLS_PEER_AUTH), TEST(4ADDR_EVENT), 
  • net/mac80211/iface.c

    a b static int ieee80211_do_open(struct net_ 
    178178{ 
    179179        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); 
    180180        struct ieee80211_local *local = sdata->local; 
    181         struct sta_info *sta; 
    182181        u32 changed = 0; 
    183182        int res; 
    184183        u32 hw_reconf_flags = 0; 
    static int ieee80211_do_open(struct net_ 
    309308 
    310309        set_bit(SDATA_STATE_RUNNING, &sdata->state); 
    311310 
    312         if (sdata->vif.type == NL80211_IFTYPE_WDS) { 
    313                 /* Create STA entry for the WDS peer */ 
    314                 sta = sta_info_alloc(sdata, sdata->u.wds.remote_addr, 
    315                                      GFP_KERNEL); 
    316                 if (!sta) { 
    317                         res = -ENOMEM; 
    318                         goto err_del_interface; 
    319                 } 
    320  
    321                 sta_info_pre_move_state(sta, IEEE80211_STA_AUTH); 
    322                 sta_info_pre_move_state(sta, IEEE80211_STA_ASSOC); 
    323                 sta_info_pre_move_state(sta, IEEE80211_STA_AUTHORIZED); 
    324  
    325                 res = sta_info_insert(sta); 
    326                 if (res) { 
    327                         /* STA has been freed */ 
    328                         goto err_del_interface; 
    329                 } 
    330  
    331                 rate_control_rate_init(sta); 
    332         } 
    333  
    334311        /* 
    335312         * set_multicast_list will be invoked by the networking core 
    336313         * which will check whether any increments here were done in 
    static int ieee80211_do_open(struct net_ 
    357334        netif_tx_start_all_queues(dev); 
    358335 
    359336        return 0; 
    360  err_del_interface: 
    361         drv_remove_interface(local, sdata); 
     337 
    362338 err_stop: 
    363339        if (!local->open_count) 
    364340                drv_stop(local); 
    static void ieee80211_if_setup(struct ne 
    722698        dev->destructor = free_netdev; 
    723699} 
    724700 
     701static void ieee80211_wds_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, 
     702                                         struct sk_buff *skb) 
     703{ 
     704        struct ieee80211_local *local = sdata->local; 
     705        struct ieee80211_rx_status *rx_status; 
     706        struct ieee802_11_elems elems; 
     707        struct ieee80211_mgmt *mgmt; 
     708        struct sta_info *sta; 
     709        size_t baselen; 
     710        u32 rates = 0; 
     711        u16 stype; 
     712        bool new = false; 
     713        enum ieee80211_band band = local->hw.conf.channel->band; 
     714        struct ieee80211_supported_band *sband = local->hw.wiphy->bands[band]; 
     715 
     716        rx_status = IEEE80211_SKB_RXCB(skb); 
     717        mgmt = (struct ieee80211_mgmt *) skb->data; 
     718        stype = le16_to_cpu(mgmt->frame_control) & IEEE80211_FCTL_STYPE; 
     719 
     720        if (stype != IEEE80211_STYPE_BEACON) 
     721                return; 
     722 
     723        baselen = (u8 *) mgmt->u.probe_resp.variable - (u8 *) mgmt; 
     724        if (baselen > skb->len) 
     725                return; 
     726 
     727        ieee802_11_parse_elems(mgmt->u.probe_resp.variable, 
     728                               skb->len - baselen, &elems); 
     729 
     730        rates = ieee80211_sta_get_rates(local, &elems, band); 
     731 
     732        rcu_read_lock(); 
     733 
     734        sta = sta_info_get(sdata, sdata->u.wds.remote_addr); 
     735 
     736        if (!sta) { 
     737                rcu_read_unlock(); 
     738                sta = sta_info_alloc(sdata, sdata->u.wds.remote_addr, 
     739                                     GFP_KERNEL); 
     740                if (!sta) 
     741                        return; 
     742 
     743                new = true; 
     744        } 
     745 
     746        sta->last_rx = jiffies; 
     747        sta->sta.supp_rates[local->hw.conf.channel->band] = rates; 
     748 
     749        if (elems.ht_cap_elem) 
     750                ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband, 
     751                                elems.ht_cap_elem, &sta->sta.ht_cap); 
     752 
     753        if (elems.wmm_param) 
     754                set_sta_flag(sta, WLAN_STA_WME); 
     755 
     756        if (new) { 
     757                set_sta_flag(sta, WLAN_STA_AUTHORIZED); 
     758                rate_control_rate_init(sta); 
     759                sta_info_insert_rcu(sta); 
     760        } 
     761 
     762        rcu_read_unlock(); 
     763} 
     764 
    725765static void ieee80211_iface_work(struct work_struct *work) 
    726766{ 
    727767        struct ieee80211_sub_if_data *sdata = 
    static void ieee80211_iface_work(struct  
    826866                                break; 
    827867                        ieee80211_mesh_rx_queued_mgmt(sdata, skb); 
    828868                        break; 
     869                case NL80211_IFTYPE_WDS: 
     870                        ieee80211_wds_rx_queued_mgmt(sdata, skb); 
     871                        break; 
    829872                default: 
    830873                        WARN(1, "frame for unexpected interface type"); 
    831874                        break; 
  • net/mac80211/rx.c

    a b ieee80211_rx_h_action(struct ieee80211_r 
    22822282                    sdata->vif.type != NL80211_IFTYPE_MESH_POINT && 
    22832283                    sdata->vif.type != NL80211_IFTYPE_AP_VLAN && 
    22842284                    sdata->vif.type != NL80211_IFTYPE_AP && 
     2285                    sdata->vif.type != NL80211_IFTYPE_WDS && 
    22852286                    sdata->vif.type != NL80211_IFTYPE_ADHOC) 
    22862287                        break; 
    22872288 
    ieee80211_rx_h_mgmt(struct ieee80211_rx_ 
    24922493 
    24932494        if (!ieee80211_vif_is_mesh(&sdata->vif) && 
    24942495            sdata->vif.type != NL80211_IFTYPE_ADHOC && 
    2495             sdata->vif.type != NL80211_IFTYPE_STATION) 
     2496            sdata->vif.type != NL80211_IFTYPE_STATION && 
     2497            sdata->vif.type != NL80211_IFTYPE_WDS) 
    24962498                return RX_DROP_MONITOR; 
    24972499 
    24982500        switch (stype) { 
    24992501        case cpu_to_le16(IEEE80211_STYPE_AUTH): 
    25002502        case cpu_to_le16(IEEE80211_STYPE_BEACON): 
    25012503        case cpu_to_le16(IEEE80211_STYPE_PROBE_RESP): 
    2502                 /* process for all: mesh, mlme, ibss */ 
     2504                /* process for all: mesh, mlme, ibss, wds */ 
    25032505                break; 
    25042506        case cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP): 
    25052507        case cpu_to_le16(IEEE80211_STYPE_REASSOC_RESP): 
    static int prepare_for_handlers(struct i 
    28532855                } 
    28542856                break; 
    28552857        case NL80211_IFTYPE_WDS: 
    2856                 if (bssid || !ieee80211_is_data(hdr->frame_control)) 
    2857                         return 0; 
    28582858                if (compare_ether_addr(sdata->u.wds.remote_addr, hdr->addr2)) 
    28592859                        return 0; 
     2860 
     2861                if (ieee80211_is_data(hdr->frame_control) || 
     2862                    ieee80211_is_action(hdr->frame_control)) { 
     2863                        if (compare_ether_addr(sdata->vif.addr, hdr->addr1)) 
     2864                                return 0; 
     2865                } else if (!ieee80211_is_beacon(hdr->frame_control)) 
     2866                        return 0; 
     2867 
    28602868                break; 
    28612869        default: 
    28622870                /* should never get here */ 
  • net/mac80211/sta_info.c

    a b static void ieee80211_send_null_response 
    10501050         * exchange. Also set EOSP to indicate this packet 
    10511051         * ends the poll/service period. 
    10521052         */ 
    1053         info->flags |= IEEE80211_TX_CTL_POLL_RESPONSE | 
     1053        info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER | 
    10541054                       IEEE80211_TX_STATUS_EOSP | 
    10551055                       IEEE80211_TX_CTL_REQ_TX_STATUS; 
    10561056 
    ieee80211_sta_ps_deliver_response(struct 
    11771177                         * STA may still remain is PS mode after this frame 
    11781178                         * exchange. 
    11791179                         */ 
    1180                         info->flags |= IEEE80211_TX_CTL_POLL_RESPONSE; 
     1180                        info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER; 
    11811181 
    11821182                        /* 
    11831183                         * Use MoreData flag to indicate whether there are 
  • net/mac80211/sta_info.h

    a b  
    3131 * @WLAN_STA_SHORT_PREAMBLE: Station is capable of receiving short-preamble 
    3232 *      frames. 
    3333 * @WLAN_STA_WME: Station is a QoS-STA. 
    34  * @WLAN_STA_WDS: Station is one of our WDS peers. 
    3534 * @WLAN_STA_CLEAR_PS_FILT: Clear PS filter in hardware (using the 
    3635 *      IEEE80211_TX_CTL_CLEAR_PS_FILT control flag) when the next 
    3736 *      frame to this station is transmitted. 
    enum ieee80211_sta_info_flags { 
    6261        WLAN_STA_AUTHORIZED, 
    6362        WLAN_STA_SHORT_PREAMBLE, 
    6463        WLAN_STA_WME, 
    65         WLAN_STA_WDS, 
    6664        WLAN_STA_CLEAR_PS_FILT, 
    6765        WLAN_STA_MFP, 
    6866        WLAN_STA_BLOCK_BA, 
  • net/mac80211/tx.c

    a b ieee80211_tx_h_unicast_ps_buf(struct iee 
    448448        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data; 
    449449        struct ieee80211_local *local = tx->local; 
    450450 
    451         if (unlikely(!sta || 
    452                      ieee80211_is_probe_resp(hdr->frame_control) || 
    453                      ieee80211_is_auth(hdr->frame_control) || 
    454                      ieee80211_is_assoc_resp(hdr->frame_control) || 
    455                      ieee80211_is_reassoc_resp(hdr->frame_control))) 
     451        if (unlikely(!sta)) 
    456452                return TX_CONTINUE; 
    457453 
    458454        if (unlikely((test_sta_flag(sta, WLAN_STA_PS_STA) || 
    459455                      test_sta_flag(sta, WLAN_STA_PS_DRIVER)) && 
    460                      !(info->flags & IEEE80211_TX_CTL_POLL_RESPONSE))) { 
     456                     !(info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER))) { 
    461457                int ac = skb_get_queue_mapping(tx->skb); 
    462458 
     459                /* only deauth, disassoc and action are bufferable MMPDUs */ 
     460                if (ieee80211_is_mgmt(hdr->frame_control) && 
     461                    !ieee80211_is_deauth(hdr->frame_control) && 
     462                    !ieee80211_is_disassoc(hdr->frame_control) && 
     463                    !ieee80211_is_action(hdr->frame_control)) { 
     464                        info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER; 
     465                        return TX_CONTINUE; 
     466                } 
     467 
    463468#ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG 
    464469                printk(KERN_DEBUG "STA %pM aid %d: PS buffer for AC %d\n", 
    465470                       sta->sta.addr, sta->sta.aid, ac); 
  • net/mac80211/ieee80211_i.h

    a b struct ieee80211_if_ibss { 
    480480 
    481481        bool control_port; 
    482482 
    483         u8 bssid[ETH_ALEN]; 
     483        u8 bssid[ETH_ALEN] __aligned(2); 
    484484        u8 ssid[IEEE80211_MAX_SSID_LEN]; 
    485485        u8 ssid_len, ie_len; 
    486486        u8 *ie; 
Note: See TracBrowser for help on using the repository browser.