linux/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2010-2011 Atheros Communications Inc.
   3 *
   4 * Permission to use, copy, modify, and/or distribute this software for any
   5 * purpose with or without fee is hereby granted, provided that the above
   6 * copyright notice and this permission notice appear in all copies.
   7 *
   8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15 */
  16
  17#include "htc.h"
  18
  19/******/
  20/* TX */
  21/******/
  22
  23static const int subtype_txq_to_hwq[] = {
  24        [WME_AC_BE] = ATH_TXQ_AC_BE,
  25        [WME_AC_BK] = ATH_TXQ_AC_BK,
  26        [WME_AC_VI] = ATH_TXQ_AC_VI,
  27        [WME_AC_VO] = ATH_TXQ_AC_VO,
  28};
  29
  30#define ATH9K_HTC_INIT_TXQ(subtype) do {                        \
  31                qi.tqi_subtype = subtype_txq_to_hwq[subtype];   \
  32                qi.tqi_aifs = ATH9K_TXQ_USEDEFAULT;             \
  33                qi.tqi_cwmin = ATH9K_TXQ_USEDEFAULT;            \
  34                qi.tqi_cwmax = ATH9K_TXQ_USEDEFAULT;            \
  35                qi.tqi_physCompBuf = 0;                         \
  36                qi.tqi_qflags = TXQ_FLAG_TXEOLINT_ENABLE |      \
  37                        TXQ_FLAG_TXDESCINT_ENABLE;              \
  38        } while (0)
  39
  40int get_hw_qnum(u16 queue, int *hwq_map)
  41{
  42        switch (queue) {
  43        case 0:
  44                return hwq_map[WME_AC_VO];
  45        case 1:
  46                return hwq_map[WME_AC_VI];
  47        case 2:
  48                return hwq_map[WME_AC_BE];
  49        case 3:
  50                return hwq_map[WME_AC_BK];
  51        default:
  52                return hwq_map[WME_AC_BE];
  53        }
  54}
  55
  56void ath9k_htc_check_stop_queues(struct ath9k_htc_priv *priv)
  57{
  58        spin_lock_bh(&priv->tx.tx_lock);
  59        priv->tx.queued_cnt++;
  60        if ((priv->tx.queued_cnt >= ATH9K_HTC_TX_THRESHOLD) &&
  61            !(priv->tx.flags & ATH9K_HTC_OP_TX_QUEUES_STOP)) {
  62                priv->tx.flags |= ATH9K_HTC_OP_TX_QUEUES_STOP;
  63                ieee80211_stop_queues(priv->hw);
  64        }
  65        spin_unlock_bh(&priv->tx.tx_lock);
  66}
  67
  68void ath9k_htc_check_wake_queues(struct ath9k_htc_priv *priv)
  69{
  70        spin_lock_bh(&priv->tx.tx_lock);
  71        if ((priv->tx.queued_cnt < ATH9K_HTC_TX_THRESHOLD) &&
  72            (priv->tx.flags & ATH9K_HTC_OP_TX_QUEUES_STOP)) {
  73                priv->tx.flags &= ~ATH9K_HTC_OP_TX_QUEUES_STOP;
  74                ieee80211_wake_queues(priv->hw);
  75        }
  76        spin_unlock_bh(&priv->tx.tx_lock);
  77}
  78
  79int ath9k_htc_tx_get_slot(struct ath9k_htc_priv *priv)
  80{
  81        int slot;
  82
  83        spin_lock_bh(&priv->tx.tx_lock);
  84        slot = find_first_zero_bit(priv->tx.tx_slot, MAX_TX_BUF_NUM);
  85        if (slot >= MAX_TX_BUF_NUM) {
  86                spin_unlock_bh(&priv->tx.tx_lock);
  87                return -ENOBUFS;
  88        }
  89        __set_bit(slot, priv->tx.tx_slot);
  90        spin_unlock_bh(&priv->tx.tx_lock);
  91
  92        return slot;
  93}
  94
  95void ath9k_htc_tx_clear_slot(struct ath9k_htc_priv *priv, int slot)
  96{
  97        spin_lock_bh(&priv->tx.tx_lock);
  98        __clear_bit(slot, priv->tx.tx_slot);
  99        spin_unlock_bh(&priv->tx.tx_lock);
 100}
 101
 102static inline enum htc_endpoint_id get_htc_epid(struct ath9k_htc_priv *priv,
 103                                                u16 qnum)
 104{
 105        enum htc_endpoint_id epid;
 106
 107        switch (qnum) {
 108        case 0:
 109                TX_QSTAT_INC(WME_AC_VO);
 110                epid = priv->data_vo_ep;
 111                break;
 112        case 1:
 113                TX_QSTAT_INC(WME_AC_VI);
 114                epid = priv->data_vi_ep;
 115                break;
 116        case 2:
 117                TX_QSTAT_INC(WME_AC_BE);
 118                epid = priv->data_be_ep;
 119                break;
 120        case 3:
 121        default:
 122                TX_QSTAT_INC(WME_AC_BK);
 123                epid = priv->data_bk_ep;
 124                break;
 125        }
 126
 127        return epid;
 128}
 129
 130static inline struct sk_buff_head*
 131get_htc_epid_queue(struct ath9k_htc_priv *priv, u8 epid)
 132{
 133        struct ath_common *common = ath9k_hw_common(priv->ah);
 134        struct sk_buff_head *epid_queue = NULL;
 135
 136        if (epid == priv->mgmt_ep)
 137                epid_queue = &priv->tx.mgmt_ep_queue;
 138        else if (epid == priv->cab_ep)
 139                epid_queue = &priv->tx.cab_ep_queue;
 140        else if (epid == priv->data_be_ep)
 141                epid_queue = &priv->tx.data_be_queue;
 142        else if (epid == priv->data_bk_ep)
 143                epid_queue = &priv->tx.data_bk_queue;
 144        else if (epid == priv->data_vi_ep)
 145                epid_queue = &priv->tx.data_vi_queue;
 146        else if (epid == priv->data_vo_ep)
 147                epid_queue = &priv->tx.data_vo_queue;
 148        else
 149                ath_err(common, "Invalid EPID: %d\n", epid);
 150
 151        return epid_queue;
 152}
 153
 154/*
 155 * Removes the driver header and returns the TX slot number
 156 */
 157static inline int strip_drv_header(struct ath9k_htc_priv *priv,
 158                                   struct sk_buff *skb)
 159{
 160        struct ath_common *common = ath9k_hw_common(priv->ah);
 161        struct ath9k_htc_tx_ctl *tx_ctl;
 162        int slot;
 163
 164        tx_ctl = HTC_SKB_CB(skb);
 165
 166        if (tx_ctl->epid == priv->mgmt_ep) {
 167                struct tx_mgmt_hdr *tx_mhdr =
 168                        (struct tx_mgmt_hdr *)skb->data;
 169                slot = tx_mhdr->cookie;
 170                skb_pull(skb, sizeof(struct tx_mgmt_hdr));
 171        } else if ((tx_ctl->epid == priv->data_bk_ep) ||
 172                   (tx_ctl->epid == priv->data_be_ep) ||
 173                   (tx_ctl->epid == priv->data_vi_ep) ||
 174                   (tx_ctl->epid == priv->data_vo_ep) ||
 175                   (tx_ctl->epid == priv->cab_ep)) {
 176                struct tx_frame_hdr *tx_fhdr =
 177                        (struct tx_frame_hdr *)skb->data;
 178                slot = tx_fhdr->cookie;
 179                skb_pull(skb, sizeof(struct tx_frame_hdr));
 180        } else {
 181                ath_err(common, "Unsupported EPID: %d\n", tx_ctl->epid);
 182                slot = -EINVAL;
 183        }
 184
 185        return slot;
 186}
 187
 188int ath_htc_txq_update(struct ath9k_htc_priv *priv, int qnum,
 189                       struct ath9k_tx_queue_info *qinfo)
 190{
 191        struct ath_hw *ah = priv->ah;
 192        int error = 0;
 193        struct ath9k_tx_queue_info qi;
 194
 195        ath9k_hw_get_txq_props(ah, qnum, &qi);
 196
 197        qi.tqi_aifs = qinfo->tqi_aifs;
 198        qi.tqi_cwmin = qinfo->tqi_cwmin / 2; /* XXX */
 199        qi.tqi_cwmax = qinfo->tqi_cwmax;
 200        qi.tqi_burstTime = qinfo->tqi_burstTime;
 201        qi.tqi_readyTime = qinfo->tqi_readyTime;
 202
 203        if (!ath9k_hw_set_txq_props(ah, qnum, &qi)) {
 204                ath_err(ath9k_hw_common(ah),
 205                        "Unable to update hardware queue %u!\n", qnum);
 206                error = -EIO;
 207        } else {
 208                ath9k_hw_resettxqueue(ah, qnum);
 209        }
 210
 211        return error;
 212}
 213
 214static void ath9k_htc_tx_mgmt(struct ath9k_htc_priv *priv,
 215                              struct ath9k_htc_vif *avp,
 216                              struct sk_buff *skb,
 217                              u8 sta_idx, u8 vif_idx, u8 slot)
 218{
 219        struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
 220        struct ieee80211_mgmt *mgmt;
 221        struct ieee80211_hdr *hdr;
 222        struct tx_mgmt_hdr mgmt_hdr;
 223        struct ath9k_htc_tx_ctl *tx_ctl;
 224        u8 *tx_fhdr;
 225
 226        tx_ctl = HTC_SKB_CB(skb);
 227        hdr = (struct ieee80211_hdr *) skb->data;
 228
 229        memset(tx_ctl, 0, sizeof(*tx_ctl));
 230        memset(&mgmt_hdr, 0, sizeof(struct tx_mgmt_hdr));
 231
 232        /*
 233         * Set the TSF adjust value for probe response
 234         * frame also.
 235         */
 236        if (avp && unlikely(ieee80211_is_probe_resp(hdr->frame_control))) {
 237                mgmt = (struct ieee80211_mgmt *)skb->data;
 238                mgmt->u.probe_resp.timestamp = avp->tsfadjust;
 239        }
 240
 241        tx_ctl->type = ATH9K_HTC_MGMT;
 242
 243        mgmt_hdr.node_idx = sta_idx;
 244        mgmt_hdr.vif_idx = vif_idx;
 245        mgmt_hdr.tidno = 0;
 246        mgmt_hdr.flags = 0;
 247        mgmt_hdr.cookie = slot;
 248
 249        mgmt_hdr.key_type = ath9k_cmn_get_hw_crypto_keytype(skb);
 250        if (mgmt_hdr.key_type == ATH9K_KEY_TYPE_CLEAR)
 251                mgmt_hdr.keyix = (u8) ATH9K_TXKEYIX_INVALID;
 252        else
 253                mgmt_hdr.keyix = tx_info->control.hw_key->hw_key_idx;
 254
 255        tx_fhdr = skb_push(skb, sizeof(mgmt_hdr));
 256        memcpy(tx_fhdr, (u8 *) &mgmt_hdr, sizeof(mgmt_hdr));
 257        tx_ctl->epid = priv->mgmt_ep;
 258}
 259
 260static void ath9k_htc_tx_data(struct ath9k_htc_priv *priv,
 261                              struct ieee80211_vif *vif,
 262                              struct sk_buff *skb,
 263                              u8 sta_idx, u8 vif_idx, u8 slot,
 264                              bool is_cab)
 265{
 266        struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
 267        struct ieee80211_hdr *hdr;
 268        struct ath9k_htc_tx_ctl *tx_ctl;
 269        struct tx_frame_hdr tx_hdr;
 270        u32 flags = 0;
 271        u8 *qc, *tx_fhdr;
 272        u16 qnum;
 273
 274        tx_ctl = HTC_SKB_CB(skb);
 275        hdr = (struct ieee80211_hdr *) skb->data;
 276
 277        memset(tx_ctl, 0, sizeof(*tx_ctl));
 278        memset(&tx_hdr, 0, sizeof(struct tx_frame_hdr));
 279
 280        tx_hdr.node_idx = sta_idx;
 281        tx_hdr.vif_idx = vif_idx;
 282        tx_hdr.cookie = slot;
 283
 284        /*
 285         * This is a bit redundant but it helps to get
 286         * the per-packet index quickly when draining the
 287         * TX queue in the HIF layer. Otherwise we would
 288         * have to parse the packet contents ...
 289         */
 290        tx_ctl->sta_idx = sta_idx;
 291
 292        if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) {
 293                tx_ctl->type = ATH9K_HTC_AMPDU;
 294                tx_hdr.data_type = ATH9K_HTC_AMPDU;
 295        } else {
 296                tx_ctl->type = ATH9K_HTC_NORMAL;
 297                tx_hdr.data_type = ATH9K_HTC_NORMAL;
 298        }
 299
 300        if (ieee80211_is_data_qos(hdr->frame_control)) {
 301                qc = ieee80211_get_qos_ctl(hdr);
 302                tx_hdr.tidno = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
 303        }
 304
 305        /* Check for RTS protection */
 306        if (priv->hw->wiphy->rts_threshold != (u32) -1)
 307                if (skb->len > priv->hw->wiphy->rts_threshold)
 308                        flags |= ATH9K_HTC_TX_RTSCTS;
 309
 310        /* CTS-to-self */
 311        if (!(flags & ATH9K_HTC_TX_RTSCTS) &&
 312            (vif && vif->bss_conf.use_cts_prot))
 313                flags |= ATH9K_HTC_TX_CTSONLY;
 314
 315        tx_hdr.flags = cpu_to_be32(flags);
 316        tx_hdr.key_type = ath9k_cmn_get_hw_crypto_keytype(skb);
 317        if (tx_hdr.key_type == ATH9K_KEY_TYPE_CLEAR)
 318                tx_hdr.keyix = (u8) ATH9K_TXKEYIX_INVALID;
 319        else
 320                tx_hdr.keyix = tx_info->control.hw_key->hw_key_idx;
 321
 322        tx_fhdr = skb_push(skb, sizeof(tx_hdr));
 323        memcpy(tx_fhdr, (u8 *) &tx_hdr, sizeof(tx_hdr));
 324
 325        if (is_cab) {
 326                CAB_STAT_INC;
 327                tx_ctl->epid = priv->cab_ep;
 328                return;
 329        }
 330
 331        qnum = skb_get_queue_mapping(skb);
 332        tx_ctl->epid = get_htc_epid(priv, qnum);
 333}
 334
 335int ath9k_htc_tx_start(struct ath9k_htc_priv *priv,
 336                       struct sk_buff *skb,
 337                       u8 slot, bool is_cab)
 338{
 339        struct ieee80211_hdr *hdr;
 340        struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
 341        struct ieee80211_sta *sta = tx_info->control.sta;
 342        struct ieee80211_vif *vif = tx_info->control.vif;
 343        struct ath9k_htc_sta *ista;
 344        struct ath9k_htc_vif *avp = NULL;
 345        u8 sta_idx, vif_idx;
 346
 347        hdr = (struct ieee80211_hdr *) skb->data;
 348
 349        /*
 350         * Find out on which interface this packet has to be
 351         * sent out.
 352         */
 353        if (vif) {
 354                avp = (struct ath9k_htc_vif *) vif->drv_priv;
 355                vif_idx = avp->index;
 356        } else {
 357                if (!priv->ah->is_monitoring) {
 358                        ath_dbg(ath9k_hw_common(priv->ah), ATH_DBG_XMIT,
 359                                "VIF is null, but no monitor interface !\n");
 360                        return -EINVAL;
 361                }
 362
 363                vif_idx = priv->mon_vif_idx;
 364        }
 365
 366        /*
 367         * Find out which station this packet is destined for.
 368         */
 369        if (sta) {
 370                ista = (struct ath9k_htc_sta *) sta->drv_priv;
 371                sta_idx = ista->index;
 372        } else {
 373                sta_idx = priv->vif_sta_pos[vif_idx];
 374        }
 375
 376        if (ieee80211_is_data(hdr->frame_control))
 377                ath9k_htc_tx_data(priv, vif, skb,
 378                                  sta_idx, vif_idx, slot, is_cab);
 379        else
 380                ath9k_htc_tx_mgmt(priv, avp, skb,
 381                                  sta_idx, vif_idx, slot);
 382
 383
 384        return htc_send(priv->htc, skb);
 385}
 386
 387static inline bool __ath9k_htc_check_tx_aggr(struct ath9k_htc_priv *priv,
 388                                             struct ath9k_htc_sta *ista, u8 tid)
 389{
 390        bool ret = false;
 391
 392        spin_lock_bh(&priv->tx.tx_lock);
 393        if ((tid < ATH9K_HTC_MAX_TID) && (ista->tid_state[tid] == AGGR_STOP))
 394                ret = true;
 395        spin_unlock_bh(&priv->tx.tx_lock);
 396
 397        return ret;
 398}
 399
 400static void ath9k_htc_check_tx_aggr(struct ath9k_htc_priv *priv,
 401                                    struct ieee80211_vif *vif,
 402                                    struct sk_buff *skb)
 403{
 404        struct ieee80211_sta *sta;
 405        struct ieee80211_hdr *hdr;
 406        __le16 fc;
 407
 408        hdr = (struct ieee80211_hdr *) skb->data;
 409        fc = hdr->frame_control;
 410
 411        rcu_read_lock();
 412
 413        sta = ieee80211_find_sta(vif, hdr->addr1);
 414        if (!sta) {
 415                rcu_read_unlock();
 416                return;
 417        }
 418
 419        if (sta && conf_is_ht(&priv->hw->conf) &&
 420            !(skb->protocol == cpu_to_be16(ETH_P_PAE))) {
 421                if (ieee80211_is_data_qos(fc)) {
 422                        u8 *qc, tid;
 423                        struct ath9k_htc_sta *ista;
 424
 425                        qc = ieee80211_get_qos_ctl(hdr);
 426                        tid = qc[0] & 0xf;
 427                        ista = (struct ath9k_htc_sta *)sta->drv_priv;
 428                        if (__ath9k_htc_check_tx_aggr(priv, ista, tid)) {
 429                                ieee80211_start_tx_ba_session(sta, tid, 0);
 430                                spin_lock_bh(&priv->tx.tx_lock);
 431                                ista->tid_state[tid] = AGGR_PROGRESS;
 432                                spin_unlock_bh(&priv->tx.tx_lock);
 433                        }
 434                }
 435        }
 436
 437        rcu_read_unlock();
 438}
 439
 440static void ath9k_htc_tx_process(struct ath9k_htc_priv *priv,
 441                                 struct sk_buff *skb,
 442                                 struct __wmi_event_txstatus *txs)
 443{
 444        struct ieee80211_vif *vif;
 445        struct ath9k_htc_tx_ctl *tx_ctl;
 446        struct ieee80211_tx_info *tx_info;
 447        struct ieee80211_tx_rate *rate;
 448        struct ieee80211_conf *cur_conf = &priv->hw->conf;
 449        bool txok;
 450        int slot;
 451
 452        slot = strip_drv_header(priv, skb);
 453        if (slot < 0) {
 454                dev_kfree_skb_any(skb);
 455                return;
 456        }
 457
 458        tx_ctl = HTC_SKB_CB(skb);
 459        txok = tx_ctl->txok;
 460        tx_info = IEEE80211_SKB_CB(skb);
 461        vif = tx_info->control.vif;
 462        rate = &tx_info->status.rates[0];
 463
 464        memset(&tx_info->status, 0, sizeof(tx_info->status));
 465
 466        /*
 467         * URB submission failed for this frame, it never reached
 468         * the target.
 469         */
 470        if (!txok || !vif || !txs)
 471                goto send_mac80211;
 472
 473        if (txs->ts_flags & ATH9K_HTC_TXSTAT_ACK)
 474                tx_info->flags |= IEEE80211_TX_STAT_ACK;
 475
 476        if (txs->ts_flags & ATH9K_HTC_TXSTAT_FILT)
 477                tx_info->flags |= IEEE80211_TX_STAT_TX_FILTERED;
 478
 479        if (txs->ts_flags & ATH9K_HTC_TXSTAT_RTC_CTS)
 480                rate->flags |= IEEE80211_TX_RC_USE_RTS_CTS;
 481
 482        rate->count = 1;
 483        rate->idx = MS(txs->ts_rate, ATH9K_HTC_TXSTAT_RATE);
 484
 485        if (txs->ts_flags & ATH9K_HTC_TXSTAT_MCS) {
 486                rate->flags |= IEEE80211_TX_RC_MCS;
 487
 488                if (txs->ts_flags & ATH9K_HTC_TXSTAT_CW40)
 489                        rate->flags |= IEEE80211_TX_RC_40_MHZ_WIDTH;
 490                if (txs->ts_flags & ATH9K_HTC_TXSTAT_SGI)
 491                        rate->flags |= IEEE80211_TX_RC_SHORT_GI;
 492        } else {
 493                if (cur_conf->channel->band == IEEE80211_BAND_5GHZ)
 494                        rate->idx += 4; /* No CCK rates */
 495        }
 496
 497        ath9k_htc_check_tx_aggr(priv, vif, skb);
 498
 499send_mac80211:
 500        spin_lock_bh(&priv->tx.tx_lock);
 501        if (WARN_ON(--priv->tx.queued_cnt < 0))
 502                priv->tx.queued_cnt = 0;
 503        spin_unlock_bh(&priv->tx.tx_lock);
 504
 505        ath9k_htc_tx_clear_slot(priv, slot);
 506
 507        /* Send status to mac80211 */
 508        ieee80211_tx_status(priv->hw, skb);
 509}
 510
 511static inline void ath9k_htc_tx_drainq(struct ath9k_htc_priv *priv,
 512                                       struct sk_buff_head *queue)
 513{
 514        struct sk_buff *skb;
 515
 516        while ((skb = skb_dequeue(queue)) != NULL) {
 517                ath9k_htc_tx_process(priv, skb, NULL);
 518        }
 519}
 520
 521void ath9k_htc_tx_drain(struct ath9k_htc_priv *priv)
 522{
 523        struct ath9k_htc_tx_event *event, *tmp;
 524
 525        spin_lock_bh(&priv->tx.tx_lock);
 526        priv->tx.flags |= ATH9K_HTC_OP_TX_DRAIN;
 527        spin_unlock_bh(&priv->tx.tx_lock);
 528
 529        /*
 530         * Ensure that all pending TX frames are flushed,
 531         * and that the TX completion/failed tasklets is killed.
 532         */
 533        htc_stop(priv->htc);
 534        tasklet_kill(&priv->wmi->wmi_event_tasklet);
 535        tasklet_kill(&priv->tx_failed_tasklet);
 536
 537        ath9k_htc_tx_drainq(priv, &priv->tx.mgmt_ep_queue);
 538        ath9k_htc_tx_drainq(priv, &priv->tx.cab_ep_queue);
 539        ath9k_htc_tx_drainq(priv, &priv->tx.data_be_queue);
 540        ath9k_htc_tx_drainq(priv, &priv->tx.data_bk_queue);
 541        ath9k_htc_tx_drainq(priv, &priv->tx.data_vi_queue);
 542        ath9k_htc_tx_drainq(priv, &priv->tx.data_vo_queue);
 543        ath9k_htc_tx_drainq(priv, &priv->tx.tx_failed);
 544
 545        /*
 546         * The TX cleanup timer has already been killed.
 547         */
 548        spin_lock_bh(&priv->wmi->event_lock);
 549        list_for_each_entry_safe(event, tmp, &priv->wmi->pending_tx_events, list) {
 550                list_del(&event->list);
 551                kfree(event);
 552        }
 553        spin_unlock_bh(&priv->wmi->event_lock);
 554
 555        spin_lock_bh(&priv->tx.tx_lock);
 556        priv->tx.flags &= ~ATH9K_HTC_OP_TX_DRAIN;
 557        spin_unlock_bh(&priv->tx.tx_lock);
 558}
 559
 560void ath9k_tx_failed_tasklet(unsigned long data)
 561{
 562        struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *)data;
 563
 564        spin_lock_bh(&priv->tx.tx_lock);
 565        if (priv->tx.flags & ATH9K_HTC_OP_TX_DRAIN) {
 566                spin_unlock_bh(&priv->tx.tx_lock);
 567                return;
 568        }
 569        spin_unlock_bh(&priv->tx.tx_lock);
 570
 571        ath9k_htc_tx_drainq(priv, &priv->tx.tx_failed);
 572}
 573
 574static inline bool check_cookie(struct ath9k_htc_priv *priv,
 575                                struct sk_buff *skb,
 576                                u8 cookie, u8 epid)
 577{
 578        u8 fcookie = 0;
 579
 580        if (epid == priv->mgmt_ep) {
 581                struct tx_mgmt_hdr *hdr;
 582                hdr = (struct tx_mgmt_hdr *) skb->data;
 583                fcookie = hdr->cookie;
 584        } else if ((epid == priv->data_bk_ep) ||
 585                   (epid == priv->data_be_ep) ||
 586                   (epid == priv->data_vi_ep) ||
 587                   (epid == priv->data_vo_ep) ||
 588                   (epid == priv->cab_ep)) {
 589                struct tx_frame_hdr *hdr;
 590                hdr = (struct tx_frame_hdr *) skb->data;
 591                fcookie = hdr->cookie;
 592        }
 593
 594        if (fcookie == cookie)
 595                return true;
 596
 597        return false;
 598}
 599
 600static struct sk_buff* ath9k_htc_tx_get_packet(struct ath9k_htc_priv *priv,
 601                                               struct __wmi_event_txstatus *txs)
 602{
 603        struct ath_common *common = ath9k_hw_common(priv->ah);
 604        struct sk_buff_head *epid_queue;
 605        struct sk_buff *skb, *tmp;
 606        unsigned long flags;
 607        u8 epid = MS(txs->ts_rate, ATH9K_HTC_TXSTAT_EPID);
 608
 609        epid_queue = get_htc_epid_queue(priv, epid);
 610        if (!epid_queue)
 611                return NULL;
 612
 613        spin_lock_irqsave(&epid_queue->lock, flags);
 614        skb_queue_walk_safe(epid_queue, skb, tmp) {
 615                if (check_cookie(priv, skb, txs->cookie, epid)) {
 616                        __skb_unlink(skb, epid_queue);
 617                        spin_unlock_irqrestore(&epid_queue->lock, flags);
 618                        return skb;
 619                }
 620        }
 621        spin_unlock_irqrestore(&epid_queue->lock, flags);
 622
 623        ath_dbg(common, ATH_DBG_XMIT,
 624                "No matching packet for cookie: %d, epid: %d\n",
 625                txs->cookie, epid);
 626
 627        return NULL;
 628}
 629
 630void ath9k_htc_txstatus(struct ath9k_htc_priv *priv, void *wmi_event)
 631{
 632        struct wmi_event_txstatus *txs = (struct wmi_event_txstatus *)wmi_event;
 633        struct __wmi_event_txstatus *__txs;
 634        struct sk_buff *skb;
 635        struct ath9k_htc_tx_event *tx_pend;
 636        int i;
 637
 638        for (i = 0; i < txs->cnt; i++) {
 639                WARN_ON(txs->cnt > HTC_MAX_TX_STATUS);
 640
 641                __txs = &txs->txstatus[i];
 642
 643                skb = ath9k_htc_tx_get_packet(priv, __txs);
 644                if (!skb) {
 645                        /*
 646                         * Store this event, so that the TX cleanup
 647                         * routine can check later for the needed packet.
 648                         */
 649                        tx_pend = kzalloc(sizeof(struct ath9k_htc_tx_event),
 650                                          GFP_ATOMIC);
 651                        if (!tx_pend)
 652                                continue;
 653
 654                        memcpy(&tx_pend->txs, __txs,
 655                               sizeof(struct __wmi_event_txstatus));
 656
 657                        spin_lock(&priv->wmi->event_lock);
 658                        list_add_tail(&tx_pend->list,
 659                                      &priv->wmi->pending_tx_events);
 660                        spin_unlock(&priv->wmi->event_lock);
 661
 662                        continue;
 663                }
 664
 665                ath9k_htc_tx_process(priv, skb, __txs);
 666        }
 667
 668        /* Wake TX queues if needed */
 669        ath9k_htc_check_wake_queues(priv);
 670}
 671
 672void ath9k_htc_txep(void *drv_priv, struct sk_buff *skb,
 673                    enum htc_endpoint_id ep_id, bool txok)
 674{
 675        struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) drv_priv;
 676        struct ath9k_htc_tx_ctl *tx_ctl;
 677        struct sk_buff_head *epid_queue;
 678
 679        tx_ctl = HTC_SKB_CB(skb);
 680        tx_ctl->txok = txok;
 681        tx_ctl->timestamp = jiffies;
 682
 683        if (!txok) {
 684                skb_queue_tail(&priv->tx.tx_failed, skb);
 685                tasklet_schedule(&priv->tx_failed_tasklet);
 686                return;
 687        }
 688
 689        epid_queue = get_htc_epid_queue(priv, ep_id);
 690        if (!epid_queue) {
 691                dev_kfree_skb_any(skb);
 692                return;
 693        }
 694
 695        skb_queue_tail(epid_queue, skb);
 696}
 697
 698static inline bool check_packet(struct ath9k_htc_priv *priv, struct sk_buff *skb)
 699{
 700        struct ath_common *common = ath9k_hw_common(priv->ah);
 701        struct ath9k_htc_tx_ctl *tx_ctl;
 702
 703        tx_ctl = HTC_SKB_CB(skb);
 704
 705        if (time_after(jiffies,
 706                       tx_ctl->timestamp +
 707                       msecs_to_jiffies(ATH9K_HTC_TX_TIMEOUT_INTERVAL))) {
 708                ath_dbg(common, ATH_DBG_XMIT,
 709                        "Dropping a packet due to TX timeout\n");
 710                return true;
 711        }
 712
 713        return false;
 714}
 715
 716static void ath9k_htc_tx_cleanup_queue(struct ath9k_htc_priv *priv,
 717                                       struct sk_buff_head *epid_queue)
 718{
 719        bool process = false;
 720        unsigned long flags;
 721        struct sk_buff *skb, *tmp;
 722        struct sk_buff_head queue;
 723
 724        skb_queue_head_init(&queue);
 725
 726        spin_lock_irqsave(&epid_queue->lock, flags);
 727        skb_queue_walk_safe(epid_queue, skb, tmp) {
 728                if (check_packet(priv, skb)) {
 729                        __skb_unlink(skb, epid_queue);
 730                        __skb_queue_tail(&queue, skb);
 731                        process = true;
 732                }
 733        }
 734        spin_unlock_irqrestore(&epid_queue->lock, flags);
 735
 736        if (process) {
 737                skb_queue_walk_safe(&queue, skb, tmp) {
 738                        __skb_unlink(skb, &queue);
 739                        ath9k_htc_tx_process(priv, skb, NULL);
 740                }
 741        }
 742}
 743
 744void ath9k_htc_tx_cleanup_timer(unsigned long data)
 745{
 746        struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) data;
 747        struct ath_common *common = ath9k_hw_common(priv->ah);
 748        struct ath9k_htc_tx_event *event, *tmp;
 749        struct sk_buff *skb;
 750
 751        spin_lock(&priv->wmi->event_lock);
 752        list_for_each_entry_safe(event, tmp, &priv->wmi->pending_tx_events, list) {
 753
 754                skb = ath9k_htc_tx_get_packet(priv, &event->txs);
 755                if (skb) {
 756                        ath_dbg(common, ATH_DBG_XMIT,
 757                                "Found packet for cookie: %d, epid: %d\n",
 758                                event->txs.cookie,
 759                                MS(event->txs.ts_rate, ATH9K_HTC_TXSTAT_EPID));
 760
 761                        ath9k_htc_tx_process(priv, skb, &event->txs);
 762                        list_del(&event->list);
 763                        kfree(event);
 764                        continue;
 765                }
 766
 767                if (++event->count >= ATH9K_HTC_TX_TIMEOUT_COUNT) {
 768                        list_del(&event->list);
 769                        kfree(event);
 770                }
 771        }
 772        spin_unlock(&priv->wmi->event_lock);
 773
 774        /*
 775         * Check if status-pending packets have to be cleaned up.
 776         */
 777        ath9k_htc_tx_cleanup_queue(priv, &priv->tx.mgmt_ep_queue);
 778        ath9k_htc_tx_cleanup_queue(priv, &priv->tx.cab_ep_queue);
 779        ath9k_htc_tx_cleanup_queue(priv, &priv->tx.data_be_queue);
 780        ath9k_htc_tx_cleanup_queue(priv, &priv->tx.data_bk_queue);
 781        ath9k_htc_tx_cleanup_queue(priv, &priv->tx.data_vi_queue);
 782        ath9k_htc_tx_cleanup_queue(priv, &priv->tx.data_vo_queue);
 783
 784        /* Wake TX queues if needed */
 785        ath9k_htc_check_wake_queues(priv);
 786
 787        mod_timer(&priv->tx.cleanup_timer,
 788                  jiffies + msecs_to_jiffies(ATH9K_HTC_TX_CLEANUP_INTERVAL));
 789}
 790
 791int ath9k_tx_init(struct ath9k_htc_priv *priv)
 792{
 793        skb_queue_head_init(&priv->tx.mgmt_ep_queue);
 794        skb_queue_head_init(&priv->tx.cab_ep_queue);
 795        skb_queue_head_init(&priv->tx.data_be_queue);
 796        skb_queue_head_init(&priv->tx.data_bk_queue);
 797        skb_queue_head_init(&priv->tx.data_vi_queue);
 798        skb_queue_head_init(&priv->tx.data_vo_queue);
 799        skb_queue_head_init(&priv->tx.tx_failed);
 800        return 0;
 801}
 802
 803void ath9k_tx_cleanup(struct ath9k_htc_priv *priv)
 804{
 805
 806}
 807
 808bool ath9k_htc_txq_setup(struct ath9k_htc_priv *priv, int subtype)
 809{
 810        struct ath_hw *ah = priv->ah;
 811        struct ath_common *common = ath9k_hw_common(ah);
 812        struct ath9k_tx_queue_info qi;
 813        int qnum;
 814
 815        memset(&qi, 0, sizeof(qi));
 816        ATH9K_HTC_INIT_TXQ(subtype);
 817
 818        qnum = ath9k_hw_setuptxqueue(priv->ah, ATH9K_TX_QUEUE_DATA, &qi);
 819        if (qnum == -1)
 820                return false;
 821
 822        if (qnum >= ARRAY_SIZE(priv->hwq_map)) {
 823                ath_err(common, "qnum %u out of range, max %zu!\n",
 824                        qnum, ARRAY_SIZE(priv->hwq_map));
 825                ath9k_hw_releasetxqueue(ah, qnum);
 826                return false;
 827        }
 828
 829        priv->hwq_map[subtype] = qnum;
 830        return true;
 831}
 832
 833int ath9k_htc_cabq_setup(struct ath9k_htc_priv *priv)
 834{
 835        struct ath9k_tx_queue_info qi;
 836
 837        memset(&qi, 0, sizeof(qi));
 838        ATH9K_HTC_INIT_TXQ(0);
 839
 840        return ath9k_hw_setuptxqueue(priv->ah, ATH9K_TX_QUEUE_CAB, &qi);
 841}
 842
 843/******/
 844/* RX */
 845/******/
 846
 847/*
 848 * Calculate the RX filter to be set in the HW.
 849 */
 850u32 ath9k_htc_calcrxfilter(struct ath9k_htc_priv *priv)
 851{
 852#define RX_FILTER_PRESERVE (ATH9K_RX_FILTER_PHYERR | ATH9K_RX_FILTER_PHYRADAR)
 853
 854        struct ath_hw *ah = priv->ah;
 855        u32 rfilt;
 856
 857        rfilt = (ath9k_hw_getrxfilter(ah) & RX_FILTER_PRESERVE)
 858                | ATH9K_RX_FILTER_UCAST | ATH9K_RX_FILTER_BCAST
 859                | ATH9K_RX_FILTER_MCAST;
 860
 861        if (priv->rxfilter & FIF_PROBE_REQ)
 862                rfilt |= ATH9K_RX_FILTER_PROBEREQ;
 863
 864        /*
 865         * Set promiscuous mode when FIF_PROMISC_IN_BSS is enabled for station
 866         * mode interface or when in monitor mode. AP mode does not need this
 867         * since it receives all in-BSS frames anyway.
 868         */
 869        if (((ah->opmode != NL80211_IFTYPE_AP) &&
 870             (priv->rxfilter & FIF_PROMISC_IN_BSS)) ||
 871            ah->is_monitoring)
 872                rfilt |= ATH9K_RX_FILTER_PROM;
 873
 874        if (priv->rxfilter & FIF_CONTROL)
 875                rfilt |= ATH9K_RX_FILTER_CONTROL;
 876
 877        if ((ah->opmode == NL80211_IFTYPE_STATION) &&
 878            (priv->nvifs <= 1) &&
 879            !(priv->rxfilter & FIF_BCN_PRBRESP_PROMISC))
 880                rfilt |= ATH9K_RX_FILTER_MYBEACON;
 881        else
 882                rfilt |= ATH9K_RX_FILTER_BEACON;
 883
 884        if (conf_is_ht(&priv->hw->conf)) {
 885                rfilt |= ATH9K_RX_FILTER_COMP_BAR;
 886                rfilt |= ATH9K_RX_FILTER_UNCOMP_BA_BAR;
 887        }
 888
 889        if (priv->rxfilter & FIF_PSPOLL)
 890                rfilt |= ATH9K_RX_FILTER_PSPOLL;
 891
 892        if (priv->nvifs > 1)
 893                rfilt |= ATH9K_RX_FILTER_MCAST_BCAST_ALL;
 894
 895        return rfilt;
 896
 897#undef RX_FILTER_PRESERVE
 898}
 899
 900/*
 901 * Recv initialization for opmode change.
 902 */
 903static void ath9k_htc_opmode_init(struct ath9k_htc_priv *priv)
 904{
 905        struct ath_hw *ah = priv->ah;
 906        u32 rfilt, mfilt[2];
 907
 908        /* configure rx filter */
 909        rfilt = ath9k_htc_calcrxfilter(priv);
 910        ath9k_hw_setrxfilter(ah, rfilt);
 911
 912        /* calculate and install multicast filter */
 913        mfilt[0] = mfilt[1] = ~0;
 914        ath9k_hw_setmcastfilter(ah, mfilt[0], mfilt[1]);
 915}
 916
 917void ath9k_host_rx_init(struct ath9k_htc_priv *priv)
 918{
 919        ath9k_hw_rxena(priv->ah);
 920        ath9k_htc_opmode_init(priv);
 921        ath9k_hw_startpcureceive(priv->ah, (priv->op_flags & OP_SCANNING));
 922        priv->rx.last_rssi = ATH_RSSI_DUMMY_MARKER;
 923}
 924
 925static void ath9k_process_rate(struct ieee80211_hw *hw,
 926                               struct ieee80211_rx_status *rxs,
 927                               u8 rx_rate, u8 rs_flags)
 928{
 929        struct ieee80211_supported_band *sband;
 930        enum ieee80211_band band;
 931        unsigned int i = 0;
 932
 933        if (rx_rate & 0x80) {
 934                /* HT rate */
 935                rxs->flag |= RX_FLAG_HT;
 936                if (rs_flags & ATH9K_RX_2040)
 937                        rxs->flag |= RX_FLAG_40MHZ;
 938                if (rs_flags & ATH9K_RX_GI)
 939                        rxs->flag |= RX_FLAG_SHORT_GI;
 940                rxs->rate_idx = rx_rate & 0x7f;
 941                return;
 942        }
 943
 944        band = hw->conf.channel->band;
 945        sband = hw->wiphy->bands[band];
 946
 947        for (i = 0; i < sband->n_bitrates; i++) {
 948                if (sband->bitrates[i].hw_value == rx_rate) {
 949                        rxs->rate_idx = i;
 950                        return;
 951                }
 952                if (sband->bitrates[i].hw_value_short == rx_rate) {
 953                        rxs->rate_idx = i;
 954                        rxs->flag |= RX_FLAG_SHORTPRE;
 955                        return;
 956                }
 957        }
 958
 959}
 960
 961static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv,
 962                             struct ath9k_htc_rxbuf *rxbuf,
 963                             struct ieee80211_rx_status *rx_status)
 964
 965{
 966        struct ieee80211_hdr *hdr;
 967        struct ieee80211_hw *hw = priv->hw;
 968        struct sk_buff *skb = rxbuf->skb;
 969        struct ath_common *common = ath9k_hw_common(priv->ah);
 970        struct ath_htc_rx_status *rxstatus;
 971        int hdrlen, padpos, padsize;
 972        int last_rssi = ATH_RSSI_DUMMY_MARKER;
 973        __le16 fc;
 974
 975        if (skb->len < HTC_RX_FRAME_HEADER_SIZE) {
 976                ath_err(common, "Corrupted RX frame, dropping (len: %d)\n",
 977                        skb->len);
 978                goto rx_next;
 979        }
 980
 981        rxstatus = (struct ath_htc_rx_status *)skb->data;
 982
 983        if (be16_to_cpu(rxstatus->rs_datalen) -
 984            (skb->len - HTC_RX_FRAME_HEADER_SIZE) != 0) {
 985                ath_err(common,
 986                        "Corrupted RX data len, dropping (dlen: %d, skblen: %d)\n",
 987                        rxstatus->rs_datalen, skb->len);
 988                goto rx_next;
 989        }
 990
 991        ath9k_htc_err_stat_rx(priv, rxstatus);
 992
 993        /* Get the RX status information */
 994        memcpy(&rxbuf->rxstatus, rxstatus, HTC_RX_FRAME_HEADER_SIZE);
 995        skb_pull(skb, HTC_RX_FRAME_HEADER_SIZE);
 996
 997        hdr = (struct ieee80211_hdr *)skb->data;
 998        fc = hdr->frame_control;
 999        hdrlen = ieee80211_get_hdrlen_from_skb(skb);
1000
1001        padpos = ath9k_cmn_padpos(fc);
1002
1003        padsize = padpos & 3;
1004        if (padsize && skb->len >= padpos+padsize+FCS_LEN) {
1005                memmove(skb->data + padsize, skb->data, padpos);
1006                skb_pull(skb, padsize);
1007        }
1008
1009        memset(rx_status, 0, sizeof(struct ieee80211_rx_status));
1010
1011        if (rxbuf->rxstatus.rs_status != 0) {
1012                if (rxbuf->rxstatus.rs_status & ATH9K_RXERR_CRC)
1013                        rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
1014                if (rxbuf->rxstatus.rs_status & ATH9K_RXERR_PHY)
1015                        goto rx_next;
1016
1017                if (rxbuf->rxstatus.rs_status & ATH9K_RXERR_DECRYPT) {
1018                        /* FIXME */
1019                } else if (rxbuf->rxstatus.rs_status & ATH9K_RXERR_MIC) {
1020                        if (ieee80211_is_ctl(fc))
1021                                /*
1022                                 * Sometimes, we get invalid
1023                                 * MIC failures on valid control frames.
1024                                 * Remove these mic errors.
1025                                 */
1026                                rxbuf->rxstatus.rs_status &= ~ATH9K_RXERR_MIC;
1027                        else
1028                                rx_status->flag |= RX_FLAG_MMIC_ERROR;
1029                }
1030
1031                /*
1032                 * Reject error frames with the exception of
1033                 * decryption and MIC failures. For monitor mode,
1034                 * we also ignore the CRC error.
1035                 */
1036                if (priv->ah->opmode == NL80211_IFTYPE_MONITOR) {
1037                        if (rxbuf->rxstatus.rs_status &
1038                            ~(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC |
1039                              ATH9K_RXERR_CRC))
1040                                goto rx_next;
1041                } else {
1042                        if (rxbuf->rxstatus.rs_status &
1043                            ~(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC)) {
1044                                goto rx_next;
1045                        }
1046                }
1047        }
1048
1049        if (!(rxbuf->rxstatus.rs_status & ATH9K_RXERR_DECRYPT)) {
1050                u8 keyix;
1051                keyix = rxbuf->rxstatus.rs_keyix;
1052                if (keyix != ATH9K_RXKEYIX_INVALID) {
1053                        rx_status->flag |= RX_FLAG_DECRYPTED;
1054                } else if (ieee80211_has_protected(fc) &&
1055                           skb->len >= hdrlen + 4) {
1056                        keyix = skb->data[hdrlen + 3] >> 6;
1057                        if (test_bit(keyix, common->keymap))
1058                                rx_status->flag |= RX_FLAG_DECRYPTED;
1059                }
1060        }
1061
1062        ath9k_process_rate(hw, rx_status, rxbuf->rxstatus.rs_rate,
1063                           rxbuf->rxstatus.rs_flags);
1064
1065        if (rxbuf->rxstatus.rs_rssi != ATH9K_RSSI_BAD &&
1066            !rxbuf->rxstatus.rs_moreaggr)
1067                ATH_RSSI_LPF(priv->rx.last_rssi,
1068                             rxbuf->rxstatus.rs_rssi);
1069
1070        last_rssi = priv->rx.last_rssi;
1071
1072        if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER))
1073                rxbuf->rxstatus.rs_rssi = ATH_EP_RND(last_rssi,
1074                                                     ATH_RSSI_EP_MULTIPLIER);
1075
1076        if (rxbuf->rxstatus.rs_rssi < 0)
1077                rxbuf->rxstatus.rs_rssi = 0;
1078
1079        if (ieee80211_is_beacon(fc))
1080                priv->ah->stats.avgbrssi = rxbuf->rxstatus.rs_rssi;
1081
1082        rx_status->mactime = be64_to_cpu(rxbuf->rxstatus.rs_tstamp);
1083        rx_status->band = hw->conf.channel->band;
1084        rx_status->freq = hw->conf.channel->center_freq;
1085        rx_status->signal =  rxbuf->rxstatus.rs_rssi + ATH_DEFAULT_NOISE_FLOOR;
1086        rx_status->antenna = rxbuf->rxstatus.rs_antenna;
1087        rx_status->flag |= RX_FLAG_MACTIME_MPDU;
1088
1089        return true;
1090
1091rx_next:
1092        return false;
1093}
1094
1095/*
1096 * FIXME: Handle FLUSH later on.
1097 */
1098void ath9k_rx_tasklet(unsigned long data)
1099{
1100        struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *)data;
1101        struct ath9k_htc_rxbuf *rxbuf = NULL, *tmp_buf = NULL;
1102        struct ieee80211_rx_status rx_status;
1103        struct sk_buff *skb;
1104        unsigned long flags;
1105        struct ieee80211_hdr *hdr;
1106
1107        do {
1108                spin_lock_irqsave(&priv->rx.rxbuflock, flags);
1109                list_for_each_entry(tmp_buf, &priv->rx.rxbuf, list) {
1110                        if (tmp_buf->in_process) {
1111                                rxbuf = tmp_buf;
1112                                break;
1113                        }
1114                }
1115
1116                if (rxbuf == NULL) {
1117                        spin_unlock_irqrestore(&priv->rx.rxbuflock, flags);
1118                        break;
1119                }
1120
1121                if (!rxbuf->skb)
1122                        goto requeue;
1123
1124                if (!ath9k_rx_prepare(priv, rxbuf, &rx_status)) {
1125                        dev_kfree_skb_any(rxbuf->skb);
1126                        goto requeue;
1127                }
1128
1129                memcpy(IEEE80211_SKB_RXCB(rxbuf->skb), &rx_status,
1130                       sizeof(struct ieee80211_rx_status));
1131                skb = rxbuf->skb;
1132                hdr = (struct ieee80211_hdr *) skb->data;
1133
1134                if (ieee80211_is_beacon(hdr->frame_control) && priv->ps_enabled)
1135                                ieee80211_queue_work(priv->hw, &priv->ps_work);
1136
1137                spin_unlock_irqrestore(&priv->rx.rxbuflock, flags);
1138
1139                ieee80211_rx(priv->hw, skb);
1140
1141                spin_lock_irqsave(&priv->rx.rxbuflock, flags);
1142requeue:
1143                rxbuf->in_process = false;
1144                rxbuf->skb = NULL;
1145                list_move_tail(&rxbuf->list, &priv->rx.rxbuf);
1146                rxbuf = NULL;
1147                spin_unlock_irqrestore(&priv->rx.rxbuflock, flags);
1148        } while (1);
1149
1150}
1151
1152void ath9k_htc_rxep(void *drv_priv, struct sk_buff *skb,
1153                    enum htc_endpoint_id ep_id)
1154{
1155        struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *)drv_priv;
1156        struct ath_hw *ah = priv->ah;
1157        struct ath_common *common = ath9k_hw_common(ah);
1158        struct ath9k_htc_rxbuf *rxbuf = NULL, *tmp_buf = NULL;
1159
1160        spin_lock(&priv->rx.rxbuflock);
1161        list_for_each_entry(tmp_buf, &priv->rx.rxbuf, list) {
1162                if (!tmp_buf->in_process) {
1163                        rxbuf = tmp_buf;
1164                        break;
1165                }
1166        }
1167        spin_unlock(&priv->rx.rxbuflock);
1168
1169        if (rxbuf == NULL) {
1170                ath_dbg(common, ATH_DBG_ANY,
1171                        "No free RX buffer\n");
1172                goto err;
1173        }
1174
1175        spin_lock(&priv->rx.rxbuflock);
1176        rxbuf->skb = skb;
1177        rxbuf->in_process = true;
1178        spin_unlock(&priv->rx.rxbuflock);
1179
1180        tasklet_schedule(&priv->rx_tasklet);
1181        return;
1182err:
1183        dev_kfree_skb_any(skb);
1184}
1185
1186/* FIXME: Locking for cleanup/init */
1187
1188void ath9k_rx_cleanup(struct ath9k_htc_priv *priv)
1189{
1190        struct ath9k_htc_rxbuf *rxbuf, *tbuf;
1191
1192        list_for_each_entry_safe(rxbuf, tbuf, &priv->rx.rxbuf, list) {
1193                list_del(&rxbuf->list);
1194                if (rxbuf->skb)
1195                        dev_kfree_skb_any(rxbuf->skb);
1196                kfree(rxbuf);
1197        }
1198}
1199
1200int ath9k_rx_init(struct ath9k_htc_priv *priv)
1201{
1202        struct ath_hw *ah = priv->ah;
1203        struct ath_common *common = ath9k_hw_common(ah);
1204        struct ath9k_htc_rxbuf *rxbuf;
1205        int i = 0;
1206
1207        INIT_LIST_HEAD(&priv->rx.rxbuf);
1208        spin_lock_init(&priv->rx.rxbuflock);
1209
1210        for (i = 0; i < ATH9K_HTC_RXBUF; i++) {
1211                rxbuf = kzalloc(sizeof(struct ath9k_htc_rxbuf), GFP_KERNEL);
1212                if (rxbuf == NULL) {
1213                        ath_err(common, "Unable to allocate RX buffers\n");
1214                        goto err;
1215                }
1216                list_add_tail(&rxbuf->list, &priv->rx.rxbuf);
1217        }
1218
1219        return 0;
1220
1221err:
1222        ath9k_rx_cleanup(priv);
1223        return -ENOMEM;
1224}
1225