linux/drivers/net/wireless/ti/wlcore/tx.c
<<
>>
Prefs
   1/*
   2 * This file is part of wl1271
   3 *
   4 * Copyright (C) 2009 Nokia Corporation
   5 *
   6 * Contact: Luciano Coelho <luciano.coelho@nokia.com>
   7 *
   8 * This program is free software; you can redistribute it and/or
   9 * modify it under the terms of the GNU General Public License
  10 * version 2 as published by the Free Software Foundation.
  11 *
  12 * This program is distributed in the hope that it will be useful, but
  13 * WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15 * General Public License for more details.
  16 *
  17 * You should have received a copy of the GNU General Public License
  18 * along with this program; if not, write to the Free Software
  19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  20 * 02110-1301 USA
  21 *
  22 */
  23
  24#include <linux/kernel.h>
  25#include <linux/module.h>
  26#include <linux/etherdevice.h>
  27#include <linux/spinlock.h>
  28
  29#include "wlcore.h"
  30#include "debug.h"
  31#include "io.h"
  32#include "ps.h"
  33#include "tx.h"
  34#include "event.h"
  35#include "hw_ops.h"
  36
  37/*
  38 * TODO: this is here just for now, it must be removed when the data
  39 * operations are in place.
  40 */
  41#include "../wl12xx/reg.h"
  42
  43static int wl1271_set_default_wep_key(struct wl1271 *wl,
  44                                      struct wl12xx_vif *wlvif, u8 id)
  45{
  46        int ret;
  47        bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
  48
  49        if (is_ap)
  50                ret = wl12xx_cmd_set_default_wep_key(wl, id,
  51                                                     wlvif->ap.bcast_hlid);
  52        else
  53                ret = wl12xx_cmd_set_default_wep_key(wl, id, wlvif->sta.hlid);
  54
  55        if (ret < 0)
  56                return ret;
  57
  58        wl1271_debug(DEBUG_CRYPT, "default wep key idx: %d", (int)id);
  59        return 0;
  60}
  61
  62static int wl1271_alloc_tx_id(struct wl1271 *wl, struct sk_buff *skb)
  63{
  64        int id;
  65
  66        id = find_first_zero_bit(wl->tx_frames_map, wl->num_tx_desc);
  67        if (id >= wl->num_tx_desc)
  68                return -EBUSY;
  69
  70        __set_bit(id, wl->tx_frames_map);
  71        wl->tx_frames[id] = skb;
  72        wl->tx_frames_cnt++;
  73        return id;
  74}
  75
  76void wl1271_free_tx_id(struct wl1271 *wl, int id)
  77{
  78        if (__test_and_clear_bit(id, wl->tx_frames_map)) {
  79                if (unlikely(wl->tx_frames_cnt == wl->num_tx_desc))
  80                        clear_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
  81
  82                wl->tx_frames[id] = NULL;
  83                wl->tx_frames_cnt--;
  84        }
  85}
  86EXPORT_SYMBOL(wl1271_free_tx_id);
  87
  88static void wl1271_tx_ap_update_inconnection_sta(struct wl1271 *wl,
  89                                                 struct sk_buff *skb)
  90{
  91        struct ieee80211_hdr *hdr;
  92
  93        /*
  94         * add the station to the known list before transmitting the
  95         * authentication response. this way it won't get de-authed by FW
  96         * when transmitting too soon.
  97         */
  98        hdr = (struct ieee80211_hdr *)(skb->data +
  99                                       sizeof(struct wl1271_tx_hw_descr));
 100        if (ieee80211_is_auth(hdr->frame_control))
 101                wl1271_acx_set_inconnection_sta(wl, hdr->addr1);
 102}
 103
 104static void wl1271_tx_regulate_link(struct wl1271 *wl,
 105                                    struct wl12xx_vif *wlvif,
 106                                    u8 hlid)
 107{
 108        bool fw_ps;
 109        u8 tx_pkts;
 110
 111        if (WARN_ON(!test_bit(hlid, wlvif->links_map)))
 112                return;
 113
 114        fw_ps = test_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map);
 115        tx_pkts = wl->links[hlid].allocated_pkts;
 116
 117        /*
 118         * if in FW PS and there is enough data in FW we can put the link
 119         * into high-level PS and clean out its TX queues.
 120         * Make an exception if this is the only connected link. In this
 121         * case FW-memory congestion is less of a problem.
 122         * Note that a single connected STA means 3 active links, since we must
 123         * account for the global and broadcast AP links. The "fw_ps" check
 124         * assures us the third link is a STA connected to the AP. Otherwise
 125         * the FW would not set the PSM bit.
 126         */
 127        if (wl->active_link_count > 3 && fw_ps &&
 128            tx_pkts >= WL1271_PS_STA_MAX_PACKETS)
 129                wl12xx_ps_link_start(wl, wlvif, hlid, true);
 130}
 131
 132bool wl12xx_is_dummy_packet(struct wl1271 *wl, struct sk_buff *skb)
 133{
 134        return wl->dummy_packet == skb;
 135}
 136EXPORT_SYMBOL(wl12xx_is_dummy_packet);
 137
 138static u8 wl12xx_tx_get_hlid_ap(struct wl1271 *wl, struct wl12xx_vif *wlvif,
 139                                struct sk_buff *skb, struct ieee80211_sta *sta)
 140{
 141        if (sta) {
 142                struct wl1271_station *wl_sta;
 143
 144                wl_sta = (struct wl1271_station *)sta->drv_priv;
 145                return wl_sta->hlid;
 146        } else {
 147                struct ieee80211_hdr *hdr;
 148
 149                if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags))
 150                        return wl->system_hlid;
 151
 152                hdr = (struct ieee80211_hdr *)skb->data;
 153                if (is_multicast_ether_addr(ieee80211_get_DA(hdr)))
 154                        return wlvif->ap.bcast_hlid;
 155                else
 156                        return wlvif->ap.global_hlid;
 157        }
 158}
 159
 160u8 wl12xx_tx_get_hlid(struct wl1271 *wl, struct wl12xx_vif *wlvif,
 161                      struct sk_buff *skb, struct ieee80211_sta *sta)
 162{
 163        struct ieee80211_tx_info *control;
 164
 165        if (wlvif->bss_type == BSS_TYPE_AP_BSS)
 166                return wl12xx_tx_get_hlid_ap(wl, wlvif, skb, sta);
 167
 168        control = IEEE80211_SKB_CB(skb);
 169        if (control->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
 170                wl1271_debug(DEBUG_TX, "tx offchannel");
 171                return wlvif->dev_hlid;
 172        }
 173
 174        return wlvif->sta.hlid;
 175}
 176
 177unsigned int wlcore_calc_packet_alignment(struct wl1271 *wl,
 178                                          unsigned int packet_length)
 179{
 180        if ((wl->quirks & WLCORE_QUIRK_TX_PAD_LAST_FRAME) ||
 181            !(wl->quirks & WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN))
 182                return ALIGN(packet_length, WL1271_TX_ALIGN_TO);
 183        else
 184                return ALIGN(packet_length, WL12XX_BUS_BLOCK_SIZE);
 185}
 186EXPORT_SYMBOL(wlcore_calc_packet_alignment);
 187
 188static int wl1271_tx_allocate(struct wl1271 *wl, struct wl12xx_vif *wlvif,
 189                              struct sk_buff *skb, u32 extra, u32 buf_offset,
 190                              u8 hlid, bool is_gem)
 191{
 192        struct wl1271_tx_hw_descr *desc;
 193        u32 total_len = skb->len + sizeof(struct wl1271_tx_hw_descr) + extra;
 194        u32 total_blocks;
 195        int id, ret = -EBUSY, ac;
 196        u32 spare_blocks;
 197
 198        if (buf_offset + total_len > wl->aggr_buf_size)
 199                return -EAGAIN;
 200
 201        spare_blocks = wlcore_hw_get_spare_blocks(wl, is_gem);
 202
 203        /* allocate free identifier for the packet */
 204        id = wl1271_alloc_tx_id(wl, skb);
 205        if (id < 0)
 206                return id;
 207
 208        total_blocks = wlcore_hw_calc_tx_blocks(wl, total_len, spare_blocks);
 209
 210        if (total_blocks <= wl->tx_blocks_available) {
 211                desc = (struct wl1271_tx_hw_descr *)skb_push(
 212                        skb, total_len - skb->len);
 213
 214                wlcore_hw_set_tx_desc_blocks(wl, desc, total_blocks,
 215                                             spare_blocks);
 216
 217                desc->id = id;
 218
 219                wl->tx_blocks_available -= total_blocks;
 220                wl->tx_allocated_blocks += total_blocks;
 221
 222                /* If the FW was empty before, arm the Tx watchdog */
 223                if (wl->tx_allocated_blocks == total_blocks)
 224                        wl12xx_rearm_tx_watchdog_locked(wl);
 225
 226                ac = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
 227                wl->tx_allocated_pkts[ac]++;
 228
 229                if (test_bit(hlid, wl->links_map))
 230                        wl->links[hlid].allocated_pkts++;
 231
 232                ret = 0;
 233
 234                wl1271_debug(DEBUG_TX,
 235                             "tx_allocate: size: %d, blocks: %d, id: %d",
 236                             total_len, total_blocks, id);
 237        } else {
 238                wl1271_free_tx_id(wl, id);
 239        }
 240
 241        return ret;
 242}
 243
 244static void wl1271_tx_fill_hdr(struct wl1271 *wl, struct wl12xx_vif *wlvif,
 245                               struct sk_buff *skb, u32 extra,
 246                               struct ieee80211_tx_info *control, u8 hlid)
 247{
 248        struct timespec ts;
 249        struct wl1271_tx_hw_descr *desc;
 250        int ac, rate_idx;
 251        s64 hosttime;
 252        u16 tx_attr = 0;
 253        __le16 frame_control;
 254        struct ieee80211_hdr *hdr;
 255        u8 *frame_start;
 256        bool is_dummy;
 257
 258        desc = (struct wl1271_tx_hw_descr *) skb->data;
 259        frame_start = (u8 *)(desc + 1);
 260        hdr = (struct ieee80211_hdr *)(frame_start + extra);
 261        frame_control = hdr->frame_control;
 262
 263        /* relocate space for security header */
 264        if (extra) {
 265                int hdrlen = ieee80211_hdrlen(frame_control);
 266                memmove(frame_start, hdr, hdrlen);
 267                skb_set_network_header(skb, skb_network_offset(skb) + extra);
 268        }
 269
 270        /* configure packet life time */
 271        getnstimeofday(&ts);
 272        hosttime = (timespec_to_ns(&ts) >> 10);
 273        desc->start_time = cpu_to_le32(hosttime - wl->time_offset);
 274
 275        is_dummy = wl12xx_is_dummy_packet(wl, skb);
 276        if (is_dummy || !wlvif || wlvif->bss_type != BSS_TYPE_AP_BSS)
 277                desc->life_time = cpu_to_le16(TX_HW_MGMT_PKT_LIFETIME_TU);
 278        else
 279                desc->life_time = cpu_to_le16(TX_HW_AP_MODE_PKT_LIFETIME_TU);
 280
 281        /* queue */
 282        ac = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
 283        desc->tid = skb->priority;
 284
 285        if (is_dummy) {
 286                /*
 287                 * FW expects the dummy packet to have an invalid session id -
 288                 * any session id that is different than the one set in the join
 289                 */
 290                tx_attr = (SESSION_COUNTER_INVALID <<
 291                           TX_HW_ATTR_OFST_SESSION_COUNTER) &
 292                           TX_HW_ATTR_SESSION_COUNTER;
 293
 294                tx_attr |= TX_HW_ATTR_TX_DUMMY_REQ;
 295        } else if (wlvif) {
 296                u8 session_id = wl->session_ids[hlid];
 297
 298                if ((wl->quirks & WLCORE_QUIRK_AP_ZERO_SESSION_ID) &&
 299                    (wlvif->bss_type == BSS_TYPE_AP_BSS))
 300                        session_id = 0;
 301
 302                /* configure the tx attributes */
 303                tx_attr = session_id << TX_HW_ATTR_OFST_SESSION_COUNTER;
 304        }
 305
 306        desc->hlid = hlid;
 307        if (is_dummy || !wlvif)
 308                rate_idx = 0;
 309        else if (wlvif->bss_type != BSS_TYPE_AP_BSS) {
 310                /*
 311                 * if the packets are data packets
 312                 * send them with AP rate policies (EAPOLs are an exception),
 313                 * otherwise use default basic rates
 314                 */
 315                if (skb->protocol == cpu_to_be16(ETH_P_PAE))
 316                        rate_idx = wlvif->sta.basic_rate_idx;
 317                else if (control->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
 318                        rate_idx = wlvif->sta.p2p_rate_idx;
 319                else if (ieee80211_is_data(frame_control))
 320                        rate_idx = wlvif->sta.ap_rate_idx;
 321                else
 322                        rate_idx = wlvif->sta.basic_rate_idx;
 323        } else {
 324                if (hlid == wlvif->ap.global_hlid)
 325                        rate_idx = wlvif->ap.mgmt_rate_idx;
 326                else if (hlid == wlvif->ap.bcast_hlid ||
 327                         skb->protocol == cpu_to_be16(ETH_P_PAE) ||
 328                         !ieee80211_is_data(frame_control))
 329                        /*
 330                         * send non-data, bcast and EAPOLs using the
 331                         * min basic rate
 332                         */
 333                        rate_idx = wlvif->ap.bcast_rate_idx;
 334                else
 335                        rate_idx = wlvif->ap.ucast_rate_idx[ac];
 336        }
 337
 338        tx_attr |= rate_idx << TX_HW_ATTR_OFST_RATE_POLICY;
 339
 340        /* for WEP shared auth - no fw encryption is needed */
 341        if (ieee80211_is_auth(frame_control) &&
 342            ieee80211_has_protected(frame_control))
 343                tx_attr |= TX_HW_ATTR_HOST_ENCRYPT;
 344
 345        desc->tx_attr = cpu_to_le16(tx_attr);
 346
 347        wlcore_hw_set_tx_desc_csum(wl, desc, skb);
 348        wlcore_hw_set_tx_desc_data_len(wl, desc, skb);
 349}
 350
 351/* caller must hold wl->mutex */
 352static int wl1271_prepare_tx_frame(struct wl1271 *wl, struct wl12xx_vif *wlvif,
 353                                   struct sk_buff *skb, u32 buf_offset, u8 hlid)
 354{
 355        struct ieee80211_tx_info *info;
 356        u32 extra = 0;
 357        int ret = 0;
 358        u32 total_len;
 359        bool is_dummy;
 360        bool is_gem = false;
 361
 362        if (!skb) {
 363                wl1271_error("discarding null skb");
 364                return -EINVAL;
 365        }
 366
 367        if (hlid == WL12XX_INVALID_LINK_ID) {
 368                wl1271_error("invalid hlid. dropping skb 0x%p", skb);
 369                return -EINVAL;
 370        }
 371
 372        info = IEEE80211_SKB_CB(skb);
 373
 374        is_dummy = wl12xx_is_dummy_packet(wl, skb);
 375
 376        if ((wl->quirks & WLCORE_QUIRK_TKIP_HEADER_SPACE) &&
 377            info->control.hw_key &&
 378            info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP)
 379                extra = WL1271_EXTRA_SPACE_TKIP;
 380
 381        if (info->control.hw_key) {
 382                bool is_wep;
 383                u8 idx = info->control.hw_key->hw_key_idx;
 384                u32 cipher = info->control.hw_key->cipher;
 385
 386                is_wep = (cipher == WLAN_CIPHER_SUITE_WEP40) ||
 387                         (cipher == WLAN_CIPHER_SUITE_WEP104);
 388
 389                if (WARN_ON(is_wep && wlvif->default_key != idx)) {
 390                        ret = wl1271_set_default_wep_key(wl, wlvif, idx);
 391                        if (ret < 0)
 392                                return ret;
 393                        wlvif->default_key = idx;
 394                }
 395
 396                is_gem = (cipher == WL1271_CIPHER_SUITE_GEM);
 397        }
 398
 399        ret = wl1271_tx_allocate(wl, wlvif, skb, extra, buf_offset, hlid,
 400                                 is_gem);
 401        if (ret < 0)
 402                return ret;
 403
 404        wl1271_tx_fill_hdr(wl, wlvif, skb, extra, info, hlid);
 405
 406        if (!is_dummy && wlvif && wlvif->bss_type == BSS_TYPE_AP_BSS) {
 407                wl1271_tx_ap_update_inconnection_sta(wl, skb);
 408                wl1271_tx_regulate_link(wl, wlvif, hlid);
 409        }
 410
 411        /*
 412         * The length of each packet is stored in terms of
 413         * words. Thus, we must pad the skb data to make sure its
 414         * length is aligned.  The number of padding bytes is computed
 415         * and set in wl1271_tx_fill_hdr.
 416         * In special cases, we want to align to a specific block size
 417         * (eg. for wl128x with SDIO we align to 256).
 418         */
 419        total_len = wlcore_calc_packet_alignment(wl, skb->len);
 420
 421        memcpy(wl->aggr_buf + buf_offset, skb->data, skb->len);
 422        memset(wl->aggr_buf + buf_offset + skb->len, 0, total_len - skb->len);
 423
 424        /* Revert side effects in the dummy packet skb, so it can be reused */
 425        if (is_dummy)
 426                skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));
 427
 428        return total_len;
 429}
 430
 431u32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set,
 432                                enum ieee80211_band rate_band)
 433{
 434        struct ieee80211_supported_band *band;
 435        u32 enabled_rates = 0;
 436        int bit;
 437
 438        band = wl->hw->wiphy->bands[rate_band];
 439        for (bit = 0; bit < band->n_bitrates; bit++) {
 440                if (rate_set & 0x1)
 441                        enabled_rates |= band->bitrates[bit].hw_value;
 442                rate_set >>= 1;
 443        }
 444
 445        /* MCS rates indication are on bits 16 - 31 */
 446        rate_set >>= HW_HT_RATES_OFFSET - band->n_bitrates;
 447
 448        for (bit = 0; bit < 16; bit++) {
 449                if (rate_set & 0x1)
 450                        enabled_rates |= (CONF_HW_BIT_RATE_MCS_0 << bit);
 451                rate_set >>= 1;
 452        }
 453
 454        return enabled_rates;
 455}
 456
 457void wl1271_handle_tx_low_watermark(struct wl1271 *wl)
 458{
 459        int i;
 460        struct wl12xx_vif *wlvif;
 461
 462        wl12xx_for_each_wlvif(wl, wlvif) {
 463                for (i = 0; i < NUM_TX_QUEUES; i++) {
 464                        if (wlcore_is_queue_stopped_by_reason(wl, wlvif, i,
 465                                        WLCORE_QUEUE_STOP_REASON_WATERMARK) &&
 466                            wlvif->tx_queue_count[i] <=
 467                                        WL1271_TX_QUEUE_LOW_WATERMARK)
 468                                /* firmware buffer has space, restart queues */
 469                                wlcore_wake_queue(wl, wlvif, i,
 470                                        WLCORE_QUEUE_STOP_REASON_WATERMARK);
 471                }
 472        }
 473}
 474
 475static int wlcore_select_ac(struct wl1271 *wl)
 476{
 477        int i, q = -1, ac;
 478        u32 min_pkts = 0xffffffff;
 479
 480        /*
 481         * Find a non-empty ac where:
 482         * 1. There are packets to transmit
 483         * 2. The FW has the least allocated blocks
 484         *
 485         * We prioritize the ACs according to VO>VI>BE>BK
 486         */
 487        for (i = 0; i < NUM_TX_QUEUES; i++) {
 488                ac = wl1271_tx_get_queue(i);
 489                if (wl->tx_queue_count[ac] &&
 490                    wl->tx_allocated_pkts[ac] < min_pkts) {
 491                        q = ac;
 492                        min_pkts = wl->tx_allocated_pkts[q];
 493                }
 494        }
 495
 496        return q;
 497}
 498
 499static struct sk_buff *wlcore_lnk_dequeue(struct wl1271 *wl,
 500                                          struct wl1271_link *lnk, u8 q)
 501{
 502        struct sk_buff *skb;
 503        unsigned long flags;
 504
 505        skb = skb_dequeue(&lnk->tx_queue[q]);
 506        if (skb) {
 507                spin_lock_irqsave(&wl->wl_lock, flags);
 508                WARN_ON_ONCE(wl->tx_queue_count[q] <= 0);
 509                wl->tx_queue_count[q]--;
 510                if (lnk->wlvif) {
 511                        WARN_ON_ONCE(lnk->wlvif->tx_queue_count[q] <= 0);
 512                        lnk->wlvif->tx_queue_count[q]--;
 513                }
 514                spin_unlock_irqrestore(&wl->wl_lock, flags);
 515        }
 516
 517        return skb;
 518}
 519
 520static struct sk_buff *wlcore_lnk_dequeue_high_prio(struct wl1271 *wl,
 521                                                    u8 hlid, u8 ac,
 522                                                    u8 *low_prio_hlid)
 523{
 524        struct wl1271_link *lnk = &wl->links[hlid];
 525
 526        if (!wlcore_hw_lnk_high_prio(wl, hlid, lnk)) {
 527                if (*low_prio_hlid == WL12XX_INVALID_LINK_ID &&
 528                    !skb_queue_empty(&lnk->tx_queue[ac]) &&
 529                    wlcore_hw_lnk_low_prio(wl, hlid, lnk))
 530                        /* we found the first non-empty low priority queue */
 531                        *low_prio_hlid = hlid;
 532
 533                return NULL;
 534        }
 535
 536        return wlcore_lnk_dequeue(wl, lnk, ac);
 537}
 538
 539static struct sk_buff *wlcore_vif_dequeue_high_prio(struct wl1271 *wl,
 540                                                    struct wl12xx_vif *wlvif,
 541                                                    u8 ac, u8 *hlid,
 542                                                    u8 *low_prio_hlid)
 543{
 544        struct sk_buff *skb = NULL;
 545        int i, h, start_hlid;
 546
 547        /* start from the link after the last one */
 548        start_hlid = (wlvif->last_tx_hlid + 1) % WL12XX_MAX_LINKS;
 549
 550        /* dequeue according to AC, round robin on each link */
 551        for (i = 0; i < WL12XX_MAX_LINKS; i++) {
 552                h = (start_hlid + i) % WL12XX_MAX_LINKS;
 553
 554                /* only consider connected stations */
 555                if (!test_bit(h, wlvif->links_map))
 556                        continue;
 557
 558                skb = wlcore_lnk_dequeue_high_prio(wl, h, ac,
 559                                                   low_prio_hlid);
 560                if (!skb)
 561                        continue;
 562
 563                wlvif->last_tx_hlid = h;
 564                break;
 565        }
 566
 567        if (!skb)
 568                wlvif->last_tx_hlid = 0;
 569
 570        *hlid = wlvif->last_tx_hlid;
 571        return skb;
 572}
 573
 574static struct sk_buff *wl1271_skb_dequeue(struct wl1271 *wl, u8 *hlid)
 575{
 576        unsigned long flags;
 577        struct wl12xx_vif *wlvif = wl->last_wlvif;
 578        struct sk_buff *skb = NULL;
 579        int ac;
 580        u8 low_prio_hlid = WL12XX_INVALID_LINK_ID;
 581
 582        ac = wlcore_select_ac(wl);
 583        if (ac < 0)
 584                goto out;
 585
 586        /* continue from last wlvif (round robin) */
 587        if (wlvif) {
 588                wl12xx_for_each_wlvif_continue(wl, wlvif) {
 589                        if (!wlvif->tx_queue_count[ac])
 590                                continue;
 591
 592                        skb = wlcore_vif_dequeue_high_prio(wl, wlvif, ac, hlid,
 593                                                           &low_prio_hlid);
 594                        if (!skb)
 595                                continue;
 596
 597                        wl->last_wlvif = wlvif;
 598                        break;
 599                }
 600        }
 601
 602        /* dequeue from the system HLID before the restarting wlvif list */
 603        if (!skb) {
 604                skb = wlcore_lnk_dequeue_high_prio(wl, wl->system_hlid,
 605                                                   ac, &low_prio_hlid);
 606                if (skb) {
 607                        *hlid = wl->system_hlid;
 608                        wl->last_wlvif = NULL;
 609                }
 610        }
 611
 612        /* Do a new pass over the wlvif list. But no need to continue
 613         * after last_wlvif. The previous pass should have found it. */
 614        if (!skb) {
 615                wl12xx_for_each_wlvif(wl, wlvif) {
 616                        if (!wlvif->tx_queue_count[ac])
 617                                goto next;
 618
 619                        skb = wlcore_vif_dequeue_high_prio(wl, wlvif, ac, hlid,
 620                                                           &low_prio_hlid);
 621                        if (skb) {
 622                                wl->last_wlvif = wlvif;
 623                                break;
 624                        }
 625
 626next:
 627                        if (wlvif == wl->last_wlvif)
 628                                break;
 629                }
 630        }
 631
 632        /* no high priority skbs found - but maybe a low priority one? */
 633        if (!skb && low_prio_hlid != WL12XX_INVALID_LINK_ID) {
 634                struct wl1271_link *lnk = &wl->links[low_prio_hlid];
 635                skb = wlcore_lnk_dequeue(wl, lnk, ac);
 636
 637                WARN_ON(!skb); /* we checked this before */
 638                *hlid = low_prio_hlid;
 639
 640                /* ensure proper round robin in the vif/link levels */
 641                wl->last_wlvif = lnk->wlvif;
 642                if (lnk->wlvif)
 643                        lnk->wlvif->last_tx_hlid = low_prio_hlid;
 644
 645        }
 646
 647out:
 648        if (!skb &&
 649            test_and_clear_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags)) {
 650                int q;
 651
 652                skb = wl->dummy_packet;
 653                *hlid = wl->system_hlid;
 654                q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
 655                spin_lock_irqsave(&wl->wl_lock, flags);
 656                WARN_ON_ONCE(wl->tx_queue_count[q] <= 0);
 657                wl->tx_queue_count[q]--;
 658                spin_unlock_irqrestore(&wl->wl_lock, flags);
 659        }
 660
 661        return skb;
 662}
 663
 664static void wl1271_skb_queue_head(struct wl1271 *wl, struct wl12xx_vif *wlvif,
 665                                  struct sk_buff *skb, u8 hlid)
 666{
 667        unsigned long flags;
 668        int q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
 669
 670        if (wl12xx_is_dummy_packet(wl, skb)) {
 671                set_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags);
 672        } else {
 673                skb_queue_head(&wl->links[hlid].tx_queue[q], skb);
 674
 675                /* make sure we dequeue the same packet next time */
 676                wlvif->last_tx_hlid = (hlid + WL12XX_MAX_LINKS - 1) %
 677                                      WL12XX_MAX_LINKS;
 678        }
 679
 680        spin_lock_irqsave(&wl->wl_lock, flags);
 681        wl->tx_queue_count[q]++;
 682        if (wlvif)
 683                wlvif->tx_queue_count[q]++;
 684        spin_unlock_irqrestore(&wl->wl_lock, flags);
 685}
 686
 687static bool wl1271_tx_is_data_present(struct sk_buff *skb)
 688{
 689        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data);
 690
 691        return ieee80211_is_data_present(hdr->frame_control);
 692}
 693
 694void wl12xx_rearm_rx_streaming(struct wl1271 *wl, unsigned long *active_hlids)
 695{
 696        struct wl12xx_vif *wlvif;
 697        u32 timeout;
 698        u8 hlid;
 699
 700        if (!wl->conf.rx_streaming.interval)
 701                return;
 702
 703        if (!wl->conf.rx_streaming.always &&
 704            !test_bit(WL1271_FLAG_SOFT_GEMINI, &wl->flags))
 705                return;
 706
 707        timeout = wl->conf.rx_streaming.duration;
 708        wl12xx_for_each_wlvif_sta(wl, wlvif) {
 709                bool found = false;
 710                for_each_set_bit(hlid, active_hlids, WL12XX_MAX_LINKS) {
 711                        if (test_bit(hlid, wlvif->links_map)) {
 712                                found  = true;
 713                                break;
 714                        }
 715                }
 716
 717                if (!found)
 718                        continue;
 719
 720                /* enable rx streaming */
 721                if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags))
 722                        ieee80211_queue_work(wl->hw,
 723                                             &wlvif->rx_streaming_enable_work);
 724
 725                mod_timer(&wlvif->rx_streaming_timer,
 726                          jiffies + msecs_to_jiffies(timeout));
 727        }
 728}
 729
 730/*
 731 * Returns failure values only in case of failed bus ops within this function.
 732 * wl1271_prepare_tx_frame retvals won't be returned in order to avoid
 733 * triggering recovery by higher layers when not necessary.
 734 * In case a FW command fails within wl1271_prepare_tx_frame fails a recovery
 735 * will be queued in wl1271_cmd_send. -EAGAIN/-EBUSY from prepare_tx_frame
 736 * can occur and are legitimate so don't propagate. -EINVAL will emit a WARNING
 737 * within prepare_tx_frame code but there's nothing we should do about those
 738 * as well.
 739 */
 740int wlcore_tx_work_locked(struct wl1271 *wl)
 741{
 742        struct wl12xx_vif *wlvif;
 743        struct sk_buff *skb;
 744        struct wl1271_tx_hw_descr *desc;
 745        u32 buf_offset = 0, last_len = 0;
 746        bool sent_packets = false;
 747        unsigned long active_hlids[BITS_TO_LONGS(WL12XX_MAX_LINKS)] = {0};
 748        int ret = 0;
 749        int bus_ret = 0;
 750        u8 hlid;
 751
 752        if (unlikely(wl->state != WLCORE_STATE_ON))
 753                return 0;
 754
 755        while ((skb = wl1271_skb_dequeue(wl, &hlid))) {
 756                struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 757                bool has_data = false;
 758
 759                wlvif = NULL;
 760                if (!wl12xx_is_dummy_packet(wl, skb))
 761                        wlvif = wl12xx_vif_to_data(info->control.vif);
 762                else
 763                        hlid = wl->system_hlid;
 764
 765                has_data = wlvif && wl1271_tx_is_data_present(skb);
 766                ret = wl1271_prepare_tx_frame(wl, wlvif, skb, buf_offset,
 767                                              hlid);
 768                if (ret == -EAGAIN) {
 769                        /*
 770                         * Aggregation buffer is full.
 771                         * Flush buffer and try again.
 772                         */
 773                        wl1271_skb_queue_head(wl, wlvif, skb, hlid);
 774
 775                        buf_offset = wlcore_hw_pre_pkt_send(wl, buf_offset,
 776                                                            last_len);
 777                        bus_ret = wlcore_write_data(wl, REG_SLV_MEM_DATA,
 778                                             wl->aggr_buf, buf_offset, true);
 779                        if (bus_ret < 0)
 780                                goto out;
 781
 782                        sent_packets = true;
 783                        buf_offset = 0;
 784                        continue;
 785                } else if (ret == -EBUSY) {
 786                        /*
 787                         * Firmware buffer is full.
 788                         * Queue back last skb, and stop aggregating.
 789                         */
 790                        wl1271_skb_queue_head(wl, wlvif, skb, hlid);
 791                        /* No work left, avoid scheduling redundant tx work */
 792                        set_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
 793                        goto out_ack;
 794                } else if (ret < 0) {
 795                        if (wl12xx_is_dummy_packet(wl, skb))
 796                                /*
 797                                 * fw still expects dummy packet,
 798                                 * so re-enqueue it
 799                                 */
 800                                wl1271_skb_queue_head(wl, wlvif, skb, hlid);
 801                        else
 802                                ieee80211_free_txskb(wl->hw, skb);
 803                        goto out_ack;
 804                }
 805                last_len = ret;
 806                buf_offset += last_len;
 807                wl->tx_packets_count++;
 808                if (has_data) {
 809                        desc = (struct wl1271_tx_hw_descr *) skb->data;
 810                        __set_bit(desc->hlid, active_hlids);
 811                }
 812        }
 813
 814out_ack:
 815        if (buf_offset) {
 816                buf_offset = wlcore_hw_pre_pkt_send(wl, buf_offset, last_len);
 817                bus_ret = wlcore_write_data(wl, REG_SLV_MEM_DATA, wl->aggr_buf,
 818                                             buf_offset, true);
 819                if (bus_ret < 0)
 820                        goto out;
 821
 822                sent_packets = true;
 823        }
 824        if (sent_packets) {
 825                /*
 826                 * Interrupt the firmware with the new packets. This is only
 827                 * required for older hardware revisions
 828                 */
 829                if (wl->quirks & WLCORE_QUIRK_END_OF_TRANSACTION) {
 830                        bus_ret = wlcore_write32(wl, WL12XX_HOST_WR_ACCESS,
 831                                             wl->tx_packets_count);
 832                        if (bus_ret < 0)
 833                                goto out;
 834                }
 835
 836                wl1271_handle_tx_low_watermark(wl);
 837        }
 838        wl12xx_rearm_rx_streaming(wl, active_hlids);
 839
 840out:
 841        return bus_ret;
 842}
 843
 844void wl1271_tx_work(struct work_struct *work)
 845{
 846        struct wl1271 *wl = container_of(work, struct wl1271, tx_work);
 847        int ret;
 848
 849        mutex_lock(&wl->mutex);
 850        ret = wl1271_ps_elp_wakeup(wl);
 851        if (ret < 0)
 852                goto out;
 853
 854        ret = wlcore_tx_work_locked(wl);
 855        if (ret < 0) {
 856                wl12xx_queue_recovery_work(wl);
 857                goto out;
 858        }
 859
 860        wl1271_ps_elp_sleep(wl);
 861out:
 862        mutex_unlock(&wl->mutex);
 863}
 864
 865static u8 wl1271_tx_get_rate_flags(u8 rate_class_index)
 866{
 867        u8 flags = 0;
 868
 869        /*
 870         * TODO: use wl12xx constants when this code is moved to wl12xx, as
 871         * only it uses Tx-completion.
 872         */
 873        if (rate_class_index <= 8)
 874                flags |= IEEE80211_TX_RC_MCS;
 875
 876        /*
 877         * TODO: use wl12xx constants when this code is moved to wl12xx, as
 878         * only it uses Tx-completion.
 879         */
 880        if (rate_class_index == 0)
 881                flags |= IEEE80211_TX_RC_SHORT_GI;
 882
 883        return flags;
 884}
 885
 886static void wl1271_tx_complete_packet(struct wl1271 *wl,
 887                                      struct wl1271_tx_hw_res_descr *result)
 888{
 889        struct ieee80211_tx_info *info;
 890        struct ieee80211_vif *vif;
 891        struct wl12xx_vif *wlvif;
 892        struct sk_buff *skb;
 893        int id = result->id;
 894        int rate = -1;
 895        u8 rate_flags = 0;
 896        u8 retries = 0;
 897
 898        /* check for id legality */
 899        if (unlikely(id >= wl->num_tx_desc || wl->tx_frames[id] == NULL)) {
 900                wl1271_warning("TX result illegal id: %d", id);
 901                return;
 902        }
 903
 904        skb = wl->tx_frames[id];
 905        info = IEEE80211_SKB_CB(skb);
 906
 907        if (wl12xx_is_dummy_packet(wl, skb)) {
 908                wl1271_free_tx_id(wl, id);
 909                return;
 910        }
 911
 912        /* info->control is valid as long as we don't update info->status */
 913        vif = info->control.vif;
 914        wlvif = wl12xx_vif_to_data(vif);
 915
 916        /* update the TX status info */
 917        if (result->status == TX_SUCCESS) {
 918                if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
 919                        info->flags |= IEEE80211_TX_STAT_ACK;
 920                rate = wlcore_rate_to_idx(wl, result->rate_class_index,
 921                                          wlvif->band);
 922                rate_flags = wl1271_tx_get_rate_flags(result->rate_class_index);
 923                retries = result->ack_failures;
 924        } else if (result->status == TX_RETRY_EXCEEDED) {
 925                wl->stats.excessive_retries++;
 926                retries = result->ack_failures;
 927        }
 928
 929        info->status.rates[0].idx = rate;
 930        info->status.rates[0].count = retries;
 931        info->status.rates[0].flags = rate_flags;
 932        info->status.ack_signal = -1;
 933
 934        wl->stats.retry_count += result->ack_failures;
 935
 936        /* remove private header from packet */
 937        skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));
 938
 939        /* remove TKIP header space if present */
 940        if ((wl->quirks & WLCORE_QUIRK_TKIP_HEADER_SPACE) &&
 941            info->control.hw_key &&
 942            info->control.hw_key->cipher == WLAN_CIPHER_SUITE_TKIP) {
 943                int hdrlen = ieee80211_get_hdrlen_from_skb(skb);
 944                memmove(skb->data + WL1271_EXTRA_SPACE_TKIP, skb->data,
 945                        hdrlen);
 946                skb_pull(skb, WL1271_EXTRA_SPACE_TKIP);
 947        }
 948
 949        wl1271_debug(DEBUG_TX, "tx status id %u skb 0x%p failures %u rate 0x%x"
 950                     " status 0x%x",
 951                     result->id, skb, result->ack_failures,
 952                     result->rate_class_index, result->status);
 953
 954        /* return the packet to the stack */
 955        skb_queue_tail(&wl->deferred_tx_queue, skb);
 956        queue_work(wl->freezable_wq, &wl->netstack_work);
 957        wl1271_free_tx_id(wl, result->id);
 958}
 959
 960/* Called upon reception of a TX complete interrupt */
 961int wlcore_tx_complete(struct wl1271 *wl)
 962{
 963        struct wl1271_acx_mem_map *memmap = wl->target_mem_map;
 964        u32 count, fw_counter;
 965        u32 i;
 966        int ret;
 967
 968        /* read the tx results from the chipset */
 969        ret = wlcore_read(wl, le32_to_cpu(memmap->tx_result),
 970                          wl->tx_res_if, sizeof(*wl->tx_res_if), false);
 971        if (ret < 0)
 972                goto out;
 973
 974        fw_counter = le32_to_cpu(wl->tx_res_if->tx_result_fw_counter);
 975
 976        /* write host counter to chipset (to ack) */
 977        ret = wlcore_write32(wl, le32_to_cpu(memmap->tx_result) +
 978                             offsetof(struct wl1271_tx_hw_res_if,
 979                                      tx_result_host_counter), fw_counter);
 980        if (ret < 0)
 981                goto out;
 982
 983        count = fw_counter - wl->tx_results_count;
 984        wl1271_debug(DEBUG_TX, "tx_complete received, packets: %d", count);
 985
 986        /* verify that the result buffer is not getting overrun */
 987        if (unlikely(count > TX_HW_RESULT_QUEUE_LEN))
 988                wl1271_warning("TX result overflow from chipset: %d", count);
 989
 990        /* process the results */
 991        for (i = 0; i < count; i++) {
 992                struct wl1271_tx_hw_res_descr *result;
 993                u8 offset = wl->tx_results_count & TX_HW_RESULT_QUEUE_LEN_MASK;
 994
 995                /* process the packet */
 996                result =  &(wl->tx_res_if->tx_results_queue[offset]);
 997                wl1271_tx_complete_packet(wl, result);
 998
 999                wl->tx_results_count++;
1000        }
1001
1002out:
1003        return ret;
1004}
1005EXPORT_SYMBOL(wlcore_tx_complete);
1006
1007void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid)
1008{
1009        struct sk_buff *skb;
1010        int i;
1011        unsigned long flags;
1012        struct ieee80211_tx_info *info;
1013        int total[NUM_TX_QUEUES];
1014        struct wl1271_link *lnk = &wl->links[hlid];
1015
1016        for (i = 0; i < NUM_TX_QUEUES; i++) {
1017                total[i] = 0;
1018                while ((skb = skb_dequeue(&lnk->tx_queue[i]))) {
1019                        wl1271_debug(DEBUG_TX, "link freeing skb 0x%p", skb);
1020
1021                        if (!wl12xx_is_dummy_packet(wl, skb)) {
1022                                info = IEEE80211_SKB_CB(skb);
1023                                info->status.rates[0].idx = -1;
1024                                info->status.rates[0].count = 0;
1025                                ieee80211_tx_status_ni(wl->hw, skb);
1026                        }
1027
1028                        total[i]++;
1029                }
1030        }
1031
1032        spin_lock_irqsave(&wl->wl_lock, flags);
1033        for (i = 0; i < NUM_TX_QUEUES; i++) {
1034                wl->tx_queue_count[i] -= total[i];
1035                if (lnk->wlvif)
1036                        lnk->wlvif->tx_queue_count[i] -= total[i];
1037        }
1038        spin_unlock_irqrestore(&wl->wl_lock, flags);
1039
1040        wl1271_handle_tx_low_watermark(wl);
1041}
1042
1043/* caller must hold wl->mutex and TX must be stopped */
1044void wl12xx_tx_reset_wlvif(struct wl1271 *wl, struct wl12xx_vif *wlvif)
1045{
1046        int i;
1047
1048        /* TX failure */
1049        for_each_set_bit(i, wlvif->links_map, WL12XX_MAX_LINKS) {
1050                if (wlvif->bss_type == BSS_TYPE_AP_BSS &&
1051                    i != wlvif->ap.bcast_hlid && i != wlvif->ap.global_hlid) {
1052                        /* this calls wl12xx_free_link */
1053                        wl1271_free_sta(wl, wlvif, i);
1054                } else {
1055                        u8 hlid = i;
1056                        wl12xx_free_link(wl, wlvif, &hlid);
1057                }
1058        }
1059        wlvif->last_tx_hlid = 0;
1060
1061        for (i = 0; i < NUM_TX_QUEUES; i++)
1062                wlvif->tx_queue_count[i] = 0;
1063}
1064/* caller must hold wl->mutex and TX must be stopped */
1065void wl12xx_tx_reset(struct wl1271 *wl)
1066{
1067        int i;
1068        struct sk_buff *skb;
1069        struct ieee80211_tx_info *info;
1070
1071        /* only reset the queues if something bad happened */
1072        if (wl1271_tx_total_queue_count(wl) != 0) {
1073                for (i = 0; i < WL12XX_MAX_LINKS; i++)
1074                        wl1271_tx_reset_link_queues(wl, i);
1075
1076                for (i = 0; i < NUM_TX_QUEUES; i++)
1077                        wl->tx_queue_count[i] = 0;
1078        }
1079
1080        /*
1081         * Make sure the driver is at a consistent state, in case this
1082         * function is called from a context other than interface removal.
1083         * This call will always wake the TX queues.
1084         */
1085        wl1271_handle_tx_low_watermark(wl);
1086
1087        for (i = 0; i < wl->num_tx_desc; i++) {
1088                if (wl->tx_frames[i] == NULL)
1089                        continue;
1090
1091                skb = wl->tx_frames[i];
1092                wl1271_free_tx_id(wl, i);
1093                wl1271_debug(DEBUG_TX, "freeing skb 0x%p", skb);
1094
1095                if (!wl12xx_is_dummy_packet(wl, skb)) {
1096                        /*
1097                         * Remove private headers before passing the skb to
1098                         * mac80211
1099                         */
1100                        info = IEEE80211_SKB_CB(skb);
1101                        skb_pull(skb, sizeof(struct wl1271_tx_hw_descr));
1102                        if ((wl->quirks & WLCORE_QUIRK_TKIP_HEADER_SPACE) &&
1103                            info->control.hw_key &&
1104                            info->control.hw_key->cipher ==
1105                            WLAN_CIPHER_SUITE_TKIP) {
1106                                int hdrlen = ieee80211_get_hdrlen_from_skb(skb);
1107                                memmove(skb->data + WL1271_EXTRA_SPACE_TKIP,
1108                                        skb->data, hdrlen);
1109                                skb_pull(skb, WL1271_EXTRA_SPACE_TKIP);
1110                        }
1111
1112                        info->status.rates[0].idx = -1;
1113                        info->status.rates[0].count = 0;
1114
1115                        ieee80211_tx_status_ni(wl->hw, skb);
1116                }
1117        }
1118}
1119
1120#define WL1271_TX_FLUSH_TIMEOUT 500000
1121
1122/* caller must *NOT* hold wl->mutex */
1123void wl1271_tx_flush(struct wl1271 *wl)
1124{
1125        unsigned long timeout, start_time;
1126        int i;
1127        start_time = jiffies;
1128        timeout = start_time + usecs_to_jiffies(WL1271_TX_FLUSH_TIMEOUT);
1129
1130        /* only one flush should be in progress, for consistent queue state */
1131        mutex_lock(&wl->flush_mutex);
1132
1133        mutex_lock(&wl->mutex);
1134        if (wl->tx_frames_cnt == 0 && wl1271_tx_total_queue_count(wl) == 0) {
1135                mutex_unlock(&wl->mutex);
1136                goto out;
1137        }
1138
1139        wlcore_stop_queues(wl, WLCORE_QUEUE_STOP_REASON_FLUSH);
1140
1141        while (!time_after(jiffies, timeout)) {
1142                wl1271_debug(DEBUG_MAC80211, "flushing tx buffer: %d %d",
1143                             wl->tx_frames_cnt,
1144                             wl1271_tx_total_queue_count(wl));
1145
1146                /* force Tx and give the driver some time to flush data */
1147                mutex_unlock(&wl->mutex);
1148                if (wl1271_tx_total_queue_count(wl))
1149                        wl1271_tx_work(&wl->tx_work);
1150                msleep(20);
1151                mutex_lock(&wl->mutex);
1152
1153                if ((wl->tx_frames_cnt == 0) &&
1154                    (wl1271_tx_total_queue_count(wl) == 0)) {
1155                        wl1271_debug(DEBUG_MAC80211, "tx flush took %d ms",
1156                                     jiffies_to_msecs(jiffies - start_time));
1157                        goto out_wake;
1158                }
1159        }
1160
1161        wl1271_warning("Unable to flush all TX buffers, "
1162                       "timed out (timeout %d ms",
1163                       WL1271_TX_FLUSH_TIMEOUT / 1000);
1164
1165        /* forcibly flush all Tx buffers on our queues */
1166        for (i = 0; i < WL12XX_MAX_LINKS; i++)
1167                wl1271_tx_reset_link_queues(wl, i);
1168
1169out_wake:
1170        wlcore_wake_queues(wl, WLCORE_QUEUE_STOP_REASON_FLUSH);
1171        mutex_unlock(&wl->mutex);
1172out:
1173        mutex_unlock(&wl->flush_mutex);
1174}
1175EXPORT_SYMBOL_GPL(wl1271_tx_flush);
1176
1177u32 wl1271_tx_min_rate_get(struct wl1271 *wl, u32 rate_set)
1178{
1179        if (WARN_ON(!rate_set))
1180                return 0;
1181
1182        return BIT(__ffs(rate_set));
1183}
1184EXPORT_SYMBOL_GPL(wl1271_tx_min_rate_get);
1185
1186void wlcore_stop_queue_locked(struct wl1271 *wl, struct wl12xx_vif *wlvif,
1187                              u8 queue, enum wlcore_queue_stop_reason reason)
1188{
1189        int hwq = wlcore_tx_get_mac80211_queue(wlvif, queue);
1190        bool stopped = !!wl->queue_stop_reasons[hwq];
1191
1192        /* queue should not be stopped for this reason */
1193        WARN_ON_ONCE(test_and_set_bit(reason, &wl->queue_stop_reasons[hwq]));
1194
1195        if (stopped)
1196                return;
1197
1198        ieee80211_stop_queue(wl->hw, hwq);
1199}
1200
1201void wlcore_stop_queue(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 queue,
1202                       enum wlcore_queue_stop_reason reason)
1203{
1204        unsigned long flags;
1205
1206        spin_lock_irqsave(&wl->wl_lock, flags);
1207        wlcore_stop_queue_locked(wl, wlvif, queue, reason);
1208        spin_unlock_irqrestore(&wl->wl_lock, flags);
1209}
1210
1211void wlcore_wake_queue(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 queue,
1212                       enum wlcore_queue_stop_reason reason)
1213{
1214        unsigned long flags;
1215        int hwq = wlcore_tx_get_mac80211_queue(wlvif, queue);
1216
1217        spin_lock_irqsave(&wl->wl_lock, flags);
1218
1219        /* queue should not be clear for this reason */
1220        WARN_ON_ONCE(!test_and_clear_bit(reason, &wl->queue_stop_reasons[hwq]));
1221
1222        if (wl->queue_stop_reasons[hwq])
1223                goto out;
1224
1225        ieee80211_wake_queue(wl->hw, hwq);
1226
1227out:
1228        spin_unlock_irqrestore(&wl->wl_lock, flags);
1229}
1230
1231void wlcore_stop_queues(struct wl1271 *wl,
1232                        enum wlcore_queue_stop_reason reason)
1233{
1234        int i;
1235        unsigned long flags;
1236
1237        spin_lock_irqsave(&wl->wl_lock, flags);
1238
1239        /* mark all possible queues as stopped */
1240        for (i = 0; i < WLCORE_NUM_MAC_ADDRESSES * NUM_TX_QUEUES; i++)
1241                WARN_ON_ONCE(test_and_set_bit(reason,
1242                                              &wl->queue_stop_reasons[i]));
1243
1244        /* use the global version to make sure all vifs in mac80211 we don't
1245         * know are stopped.
1246         */
1247        ieee80211_stop_queues(wl->hw);
1248
1249        spin_unlock_irqrestore(&wl->wl_lock, flags);
1250}
1251
1252void wlcore_wake_queues(struct wl1271 *wl,
1253                        enum wlcore_queue_stop_reason reason)
1254{
1255        int i;
1256        unsigned long flags;
1257
1258        spin_lock_irqsave(&wl->wl_lock, flags);
1259
1260        /* mark all possible queues as awake */
1261        for (i = 0; i < WLCORE_NUM_MAC_ADDRESSES * NUM_TX_QUEUES; i++)
1262                WARN_ON_ONCE(!test_and_clear_bit(reason,
1263                                                 &wl->queue_stop_reasons[i]));
1264
1265        /* use the global version to make sure all vifs in mac80211 we don't
1266         * know are woken up.
1267         */
1268        ieee80211_wake_queues(wl->hw);
1269
1270        spin_unlock_irqrestore(&wl->wl_lock, flags);
1271}
1272
1273bool wlcore_is_queue_stopped_by_reason(struct wl1271 *wl,
1274                                       struct wl12xx_vif *wlvif, u8 queue,
1275                                       enum wlcore_queue_stop_reason reason)
1276{
1277        unsigned long flags;
1278        bool stopped;
1279
1280        spin_lock_irqsave(&wl->wl_lock, flags);
1281        stopped = wlcore_is_queue_stopped_by_reason_locked(wl, wlvif, queue,
1282                                                           reason);
1283        spin_unlock_irqrestore(&wl->wl_lock, flags);
1284
1285        return stopped;
1286}
1287
1288bool wlcore_is_queue_stopped_by_reason_locked(struct wl1271 *wl,
1289                                       struct wl12xx_vif *wlvif, u8 queue,
1290                                       enum wlcore_queue_stop_reason reason)
1291{
1292        int hwq = wlcore_tx_get_mac80211_queue(wlvif, queue);
1293
1294        assert_spin_locked(&wl->wl_lock);
1295        return test_bit(reason, &wl->queue_stop_reasons[hwq]);
1296}
1297
1298bool wlcore_is_queue_stopped_locked(struct wl1271 *wl, struct wl12xx_vif *wlvif,
1299                                    u8 queue)
1300{
1301        int hwq = wlcore_tx_get_mac80211_queue(wlvif, queue);
1302
1303        assert_spin_locked(&wl->wl_lock);
1304        return !!wl->queue_stop_reasons[hwq];
1305}
1306