Lines Matching refs:priv
56 void ath9k_htc_check_stop_queues(struct ath9k_htc_priv *priv) in ath9k_htc_check_stop_queues() argument
58 spin_lock_bh(&priv->tx.tx_lock); in ath9k_htc_check_stop_queues()
59 priv->tx.queued_cnt++; in ath9k_htc_check_stop_queues()
60 if ((priv->tx.queued_cnt >= ATH9K_HTC_TX_THRESHOLD) && in ath9k_htc_check_stop_queues()
61 !(priv->tx.flags & ATH9K_HTC_OP_TX_QUEUES_STOP)) { in ath9k_htc_check_stop_queues()
62 priv->tx.flags |= ATH9K_HTC_OP_TX_QUEUES_STOP; in ath9k_htc_check_stop_queues()
63 ieee80211_stop_queues(priv->hw); in ath9k_htc_check_stop_queues()
65 spin_unlock_bh(&priv->tx.tx_lock); in ath9k_htc_check_stop_queues()
68 void ath9k_htc_check_wake_queues(struct ath9k_htc_priv *priv) in ath9k_htc_check_wake_queues() argument
70 spin_lock_bh(&priv->tx.tx_lock); in ath9k_htc_check_wake_queues()
71 if ((priv->tx.queued_cnt < ATH9K_HTC_TX_THRESHOLD) && in ath9k_htc_check_wake_queues()
72 (priv->tx.flags & ATH9K_HTC_OP_TX_QUEUES_STOP)) { in ath9k_htc_check_wake_queues()
73 priv->tx.flags &= ~ATH9K_HTC_OP_TX_QUEUES_STOP; in ath9k_htc_check_wake_queues()
74 ieee80211_wake_queues(priv->hw); in ath9k_htc_check_wake_queues()
76 spin_unlock_bh(&priv->tx.tx_lock); in ath9k_htc_check_wake_queues()
79 int ath9k_htc_tx_get_slot(struct ath9k_htc_priv *priv) in ath9k_htc_tx_get_slot() argument
83 spin_lock_bh(&priv->tx.tx_lock); in ath9k_htc_tx_get_slot()
84 slot = find_first_zero_bit(priv->tx.tx_slot, MAX_TX_BUF_NUM); in ath9k_htc_tx_get_slot()
86 spin_unlock_bh(&priv->tx.tx_lock); in ath9k_htc_tx_get_slot()
89 __set_bit(slot, priv->tx.tx_slot); in ath9k_htc_tx_get_slot()
90 spin_unlock_bh(&priv->tx.tx_lock); in ath9k_htc_tx_get_slot()
95 void ath9k_htc_tx_clear_slot(struct ath9k_htc_priv *priv, int slot) in ath9k_htc_tx_clear_slot() argument
97 spin_lock_bh(&priv->tx.tx_lock); in ath9k_htc_tx_clear_slot()
98 __clear_bit(slot, priv->tx.tx_slot); in ath9k_htc_tx_clear_slot()
99 spin_unlock_bh(&priv->tx.tx_lock); in ath9k_htc_tx_clear_slot()
102 static inline enum htc_endpoint_id get_htc_epid(struct ath9k_htc_priv *priv, in get_htc_epid() argument
110 epid = priv->data_vo_ep; in get_htc_epid()
114 epid = priv->data_vi_ep; in get_htc_epid()
118 epid = priv->data_be_ep; in get_htc_epid()
123 epid = priv->data_bk_ep; in get_htc_epid()
131 get_htc_epid_queue(struct ath9k_htc_priv *priv, u8 epid) in get_htc_epid_queue() argument
133 struct ath_common *common = ath9k_hw_common(priv->ah); in get_htc_epid_queue()
136 if (epid == priv->mgmt_ep) in get_htc_epid_queue()
137 epid_queue = &priv->tx.mgmt_ep_queue; in get_htc_epid_queue()
138 else if (epid == priv->cab_ep) in get_htc_epid_queue()
139 epid_queue = &priv->tx.cab_ep_queue; in get_htc_epid_queue()
140 else if (epid == priv->data_be_ep) in get_htc_epid_queue()
141 epid_queue = &priv->tx.data_be_queue; in get_htc_epid_queue()
142 else if (epid == priv->data_bk_ep) in get_htc_epid_queue()
143 epid_queue = &priv->tx.data_bk_queue; in get_htc_epid_queue()
144 else if (epid == priv->data_vi_ep) in get_htc_epid_queue()
145 epid_queue = &priv->tx.data_vi_queue; in get_htc_epid_queue()
146 else if (epid == priv->data_vo_ep) in get_htc_epid_queue()
147 epid_queue = &priv->tx.data_vo_queue; in get_htc_epid_queue()
157 static inline int strip_drv_header(struct ath9k_htc_priv *priv, in strip_drv_header() argument
160 struct ath_common *common = ath9k_hw_common(priv->ah); in strip_drv_header()
166 if (tx_ctl->epid == priv->mgmt_ep) { in strip_drv_header()
171 } else if ((tx_ctl->epid == priv->data_bk_ep) || in strip_drv_header()
172 (tx_ctl->epid == priv->data_be_ep) || in strip_drv_header()
173 (tx_ctl->epid == priv->data_vi_ep) || in strip_drv_header()
174 (tx_ctl->epid == priv->data_vo_ep) || in strip_drv_header()
175 (tx_ctl->epid == priv->cab_ep)) { in strip_drv_header()
188 int ath_htc_txq_update(struct ath9k_htc_priv *priv, int qnum, in ath_htc_txq_update() argument
191 struct ath_hw *ah = priv->ah; in ath_htc_txq_update()
214 static void ath9k_htc_tx_mgmt(struct ath9k_htc_priv *priv, in ath9k_htc_tx_mgmt() argument
257 tx_ctl->epid = priv->mgmt_ep; in ath9k_htc_tx_mgmt()
260 static void ath9k_htc_tx_data(struct ath9k_htc_priv *priv, in ath9k_htc_tx_data() argument
306 if (priv->hw->wiphy->rts_threshold != (u32) -1) in ath9k_htc_tx_data()
307 if (skb->len > priv->hw->wiphy->rts_threshold) in ath9k_htc_tx_data()
327 tx_ctl->epid = priv->cab_ep; in ath9k_htc_tx_data()
332 tx_ctl->epid = get_htc_epid(priv, qnum); in ath9k_htc_tx_data()
335 int ath9k_htc_tx_start(struct ath9k_htc_priv *priv, in ath9k_htc_tx_start() argument
357 if (!priv->ah->is_monitoring) { in ath9k_htc_tx_start()
358 ath_dbg(ath9k_hw_common(priv->ah), XMIT, in ath9k_htc_tx_start()
363 vif_idx = priv->mon_vif_idx; in ath9k_htc_tx_start()
373 sta_idx = priv->vif_sta_pos[vif_idx]; in ath9k_htc_tx_start()
377 ath9k_htc_tx_data(priv, vif, skb, in ath9k_htc_tx_start()
380 ath9k_htc_tx_mgmt(priv, avp, skb, in ath9k_htc_tx_start()
384 return htc_send(priv->htc, skb); in ath9k_htc_tx_start()
387 static inline bool __ath9k_htc_check_tx_aggr(struct ath9k_htc_priv *priv, in __ath9k_htc_check_tx_aggr() argument
392 spin_lock_bh(&priv->tx.tx_lock); in __ath9k_htc_check_tx_aggr()
395 spin_unlock_bh(&priv->tx.tx_lock); in __ath9k_htc_check_tx_aggr()
400 static void ath9k_htc_check_tx_aggr(struct ath9k_htc_priv *priv, in ath9k_htc_check_tx_aggr() argument
419 if (sta && conf_is_ht(&priv->hw->conf) && in ath9k_htc_check_tx_aggr()
428 if (__ath9k_htc_check_tx_aggr(priv, ista, tid)) { in ath9k_htc_check_tx_aggr()
430 spin_lock_bh(&priv->tx.tx_lock); in ath9k_htc_check_tx_aggr()
432 spin_unlock_bh(&priv->tx.tx_lock); in ath9k_htc_check_tx_aggr()
440 static void ath9k_htc_tx_process(struct ath9k_htc_priv *priv, in ath9k_htc_tx_process() argument
448 struct ieee80211_conf *cur_conf = &priv->hw->conf; in ath9k_htc_tx_process()
453 slot = strip_drv_header(priv, skb); in ath9k_htc_tx_process()
501 ath9k_htc_check_tx_aggr(priv, vif, skb); in ath9k_htc_tx_process()
504 spin_lock_bh(&priv->tx.tx_lock); in ath9k_htc_tx_process()
505 if (WARN_ON(--priv->tx.queued_cnt < 0)) in ath9k_htc_tx_process()
506 priv->tx.queued_cnt = 0; in ath9k_htc_tx_process()
507 spin_unlock_bh(&priv->tx.tx_lock); in ath9k_htc_tx_process()
509 ath9k_htc_tx_clear_slot(priv, slot); in ath9k_htc_tx_process()
521 ieee80211_tx_status(priv->hw, skb); in ath9k_htc_tx_process()
524 static inline void ath9k_htc_tx_drainq(struct ath9k_htc_priv *priv, in ath9k_htc_tx_drainq() argument
530 ath9k_htc_tx_process(priv, skb, NULL); in ath9k_htc_tx_drainq()
534 void ath9k_htc_tx_drain(struct ath9k_htc_priv *priv) in ath9k_htc_tx_drain() argument
538 spin_lock_bh(&priv->tx.tx_lock); in ath9k_htc_tx_drain()
539 priv->tx.flags |= ATH9K_HTC_OP_TX_DRAIN; in ath9k_htc_tx_drain()
540 spin_unlock_bh(&priv->tx.tx_lock); in ath9k_htc_tx_drain()
546 htc_stop(priv->htc); in ath9k_htc_tx_drain()
547 tasklet_kill(&priv->wmi->wmi_event_tasklet); in ath9k_htc_tx_drain()
548 tasklet_kill(&priv->tx_failed_tasklet); in ath9k_htc_tx_drain()
550 ath9k_htc_tx_drainq(priv, &priv->tx.mgmt_ep_queue); in ath9k_htc_tx_drain()
551 ath9k_htc_tx_drainq(priv, &priv->tx.cab_ep_queue); in ath9k_htc_tx_drain()
552 ath9k_htc_tx_drainq(priv, &priv->tx.data_be_queue); in ath9k_htc_tx_drain()
553 ath9k_htc_tx_drainq(priv, &priv->tx.data_bk_queue); in ath9k_htc_tx_drain()
554 ath9k_htc_tx_drainq(priv, &priv->tx.data_vi_queue); in ath9k_htc_tx_drain()
555 ath9k_htc_tx_drainq(priv, &priv->tx.data_vo_queue); in ath9k_htc_tx_drain()
556 ath9k_htc_tx_drainq(priv, &priv->tx.tx_failed); in ath9k_htc_tx_drain()
561 spin_lock_bh(&priv->wmi->event_lock); in ath9k_htc_tx_drain()
562 list_for_each_entry_safe(event, tmp, &priv->wmi->pending_tx_events, list) { in ath9k_htc_tx_drain()
566 spin_unlock_bh(&priv->wmi->event_lock); in ath9k_htc_tx_drain()
568 spin_lock_bh(&priv->tx.tx_lock); in ath9k_htc_tx_drain()
569 priv->tx.flags &= ~ATH9K_HTC_OP_TX_DRAIN; in ath9k_htc_tx_drain()
570 spin_unlock_bh(&priv->tx.tx_lock); in ath9k_htc_tx_drain()
575 struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *)data; in ath9k_tx_failed_tasklet() local
577 spin_lock_bh(&priv->tx.tx_lock); in ath9k_tx_failed_tasklet()
578 if (priv->tx.flags & ATH9K_HTC_OP_TX_DRAIN) { in ath9k_tx_failed_tasklet()
579 spin_unlock_bh(&priv->tx.tx_lock); in ath9k_tx_failed_tasklet()
582 spin_unlock_bh(&priv->tx.tx_lock); in ath9k_tx_failed_tasklet()
584 ath9k_htc_tx_drainq(priv, &priv->tx.tx_failed); in ath9k_tx_failed_tasklet()
587 static inline bool check_cookie(struct ath9k_htc_priv *priv, in check_cookie() argument
593 if (epid == priv->mgmt_ep) { in check_cookie()
597 } else if ((epid == priv->data_bk_ep) || in check_cookie()
598 (epid == priv->data_be_ep) || in check_cookie()
599 (epid == priv->data_vi_ep) || in check_cookie()
600 (epid == priv->data_vo_ep) || in check_cookie()
601 (epid == priv->cab_ep)) { in check_cookie()
613 static struct sk_buff* ath9k_htc_tx_get_packet(struct ath9k_htc_priv *priv, in ath9k_htc_tx_get_packet() argument
616 struct ath_common *common = ath9k_hw_common(priv->ah); in ath9k_htc_tx_get_packet()
622 epid_queue = get_htc_epid_queue(priv, epid); in ath9k_htc_tx_get_packet()
628 if (check_cookie(priv, skb, txs->cookie, epid)) { in ath9k_htc_tx_get_packet()
642 void ath9k_htc_txstatus(struct ath9k_htc_priv *priv, void *wmi_event) in ath9k_htc_txstatus() argument
655 skb = ath9k_htc_tx_get_packet(priv, __txs); in ath9k_htc_txstatus()
669 spin_lock(&priv->wmi->event_lock); in ath9k_htc_txstatus()
671 &priv->wmi->pending_tx_events); in ath9k_htc_txstatus()
672 spin_unlock(&priv->wmi->event_lock); in ath9k_htc_txstatus()
677 ath9k_htc_tx_process(priv, skb, __txs); in ath9k_htc_txstatus()
681 ath9k_htc_check_wake_queues(priv); in ath9k_htc_txstatus()
687 struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) drv_priv; in ath9k_htc_txep() local
696 skb_queue_tail(&priv->tx.tx_failed, skb); in ath9k_htc_txep()
697 tasklet_schedule(&priv->tx_failed_tasklet); in ath9k_htc_txep()
701 epid_queue = get_htc_epid_queue(priv, ep_id); in ath9k_htc_txep()
710 static inline bool check_packet(struct ath9k_htc_priv *priv, struct sk_buff *skb) in check_packet() argument
712 struct ath_common *common = ath9k_hw_common(priv->ah); in check_packet()
727 static void ath9k_htc_tx_cleanup_queue(struct ath9k_htc_priv *priv, in ath9k_htc_tx_cleanup_queue() argument
739 if (check_packet(priv, skb)) { in ath9k_htc_tx_cleanup_queue()
750 ath9k_htc_tx_process(priv, skb, NULL); in ath9k_htc_tx_cleanup_queue()
757 struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) data; in ath9k_htc_tx_cleanup_timer() local
758 struct ath_common *common = ath9k_hw_common(priv->ah); in ath9k_htc_tx_cleanup_timer()
762 spin_lock(&priv->wmi->event_lock); in ath9k_htc_tx_cleanup_timer()
763 list_for_each_entry_safe(event, tmp, &priv->wmi->pending_tx_events, list) { in ath9k_htc_tx_cleanup_timer()
765 skb = ath9k_htc_tx_get_packet(priv, &event->txs); in ath9k_htc_tx_cleanup_timer()
772 ath9k_htc_tx_process(priv, skb, &event->txs); in ath9k_htc_tx_cleanup_timer()
783 spin_unlock(&priv->wmi->event_lock); in ath9k_htc_tx_cleanup_timer()
788 ath9k_htc_tx_cleanup_queue(priv, &priv->tx.mgmt_ep_queue); in ath9k_htc_tx_cleanup_timer()
789 ath9k_htc_tx_cleanup_queue(priv, &priv->tx.cab_ep_queue); in ath9k_htc_tx_cleanup_timer()
790 ath9k_htc_tx_cleanup_queue(priv, &priv->tx.data_be_queue); in ath9k_htc_tx_cleanup_timer()
791 ath9k_htc_tx_cleanup_queue(priv, &priv->tx.data_bk_queue); in ath9k_htc_tx_cleanup_timer()
792 ath9k_htc_tx_cleanup_queue(priv, &priv->tx.data_vi_queue); in ath9k_htc_tx_cleanup_timer()
793 ath9k_htc_tx_cleanup_queue(priv, &priv->tx.data_vo_queue); in ath9k_htc_tx_cleanup_timer()
796 ath9k_htc_check_wake_queues(priv); in ath9k_htc_tx_cleanup_timer()
798 mod_timer(&priv->tx.cleanup_timer, in ath9k_htc_tx_cleanup_timer()
802 int ath9k_tx_init(struct ath9k_htc_priv *priv) in ath9k_tx_init() argument
804 skb_queue_head_init(&priv->tx.mgmt_ep_queue); in ath9k_tx_init()
805 skb_queue_head_init(&priv->tx.cab_ep_queue); in ath9k_tx_init()
806 skb_queue_head_init(&priv->tx.data_be_queue); in ath9k_tx_init()
807 skb_queue_head_init(&priv->tx.data_bk_queue); in ath9k_tx_init()
808 skb_queue_head_init(&priv->tx.data_vi_queue); in ath9k_tx_init()
809 skb_queue_head_init(&priv->tx.data_vo_queue); in ath9k_tx_init()
810 skb_queue_head_init(&priv->tx.tx_failed); in ath9k_tx_init()
814 void ath9k_tx_cleanup(struct ath9k_htc_priv *priv) in ath9k_tx_cleanup() argument
819 bool ath9k_htc_txq_setup(struct ath9k_htc_priv *priv, int subtype) in ath9k_htc_txq_setup() argument
821 struct ath_hw *ah = priv->ah; in ath9k_htc_txq_setup()
829 qnum = ath9k_hw_setuptxqueue(priv->ah, ATH9K_TX_QUEUE_DATA, &qi); in ath9k_htc_txq_setup()
833 if (qnum >= ARRAY_SIZE(priv->hwq_map)) { in ath9k_htc_txq_setup()
835 qnum, ARRAY_SIZE(priv->hwq_map)); in ath9k_htc_txq_setup()
840 priv->hwq_map[subtype] = qnum; in ath9k_htc_txq_setup()
844 int ath9k_htc_cabq_setup(struct ath9k_htc_priv *priv) in ath9k_htc_cabq_setup() argument
851 return ath9k_hw_setuptxqueue(priv->ah, ATH9K_TX_QUEUE_CAB, &qi); in ath9k_htc_cabq_setup()
861 u32 ath9k_htc_calcrxfilter(struct ath9k_htc_priv *priv) in ath9k_htc_calcrxfilter() argument
865 struct ath_hw *ah = priv->ah; in ath9k_htc_calcrxfilter()
872 if (priv->rxfilter & FIF_PROBE_REQ) in ath9k_htc_calcrxfilter()
878 if (priv->rxfilter & FIF_CONTROL) in ath9k_htc_calcrxfilter()
882 (priv->nvifs <= 1) && in ath9k_htc_calcrxfilter()
883 !(priv->rxfilter & FIF_BCN_PRBRESP_PROMISC)) in ath9k_htc_calcrxfilter()
888 if (conf_is_ht(&priv->hw->conf)) { in ath9k_htc_calcrxfilter()
893 if (priv->rxfilter & FIF_PSPOLL) in ath9k_htc_calcrxfilter()
896 if (priv->nvifs > 1 || priv->rxfilter & FIF_OTHER_BSS) in ath9k_htc_calcrxfilter()
907 static void ath9k_htc_opmode_init(struct ath9k_htc_priv *priv) in ath9k_htc_opmode_init() argument
909 struct ath_hw *ah = priv->ah; in ath9k_htc_opmode_init()
913 rfilt = ath9k_htc_calcrxfilter(priv); in ath9k_htc_opmode_init()
921 void ath9k_host_rx_init(struct ath9k_htc_priv *priv) in ath9k_host_rx_init() argument
923 struct ath_common *common = ath9k_hw_common(priv->ah); in ath9k_host_rx_init()
924 ath9k_hw_rxena(priv->ah); in ath9k_host_rx_init()
925 ath9k_htc_opmode_init(priv); in ath9k_host_rx_init()
926 ath9k_hw_startpcureceive(priv->ah, test_bit(ATH_OP_SCANNING, &common->op_flags)); in ath9k_host_rx_init()
962 static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv, in ath9k_rx_prepare() argument
968 struct ieee80211_hw *hw = priv->hw; in ath9k_rx_prepare()
970 struct ath_common *common = ath9k_hw_common(priv->ah); in ath9k_rx_prepare()
999 ath9k_htc_err_stat_rx(priv, &rx_stats); in ath9k_rx_prepare()
1015 if (ath_cmn_process_fft(&priv->spec_priv, hdr, in ath9k_rx_prepare()
1023 &decrypt_error, priv->rxfilter)) in ath9k_rx_prepare()
1050 struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *)data; in ath9k_rx_tasklet() local
1058 spin_lock_irqsave(&priv->rx.rxbuflock, flags); in ath9k_rx_tasklet()
1059 list_for_each_entry(tmp_buf, &priv->rx.rxbuf, list) { in ath9k_rx_tasklet()
1067 spin_unlock_irqrestore(&priv->rx.rxbuflock, flags); in ath9k_rx_tasklet()
1074 if (!ath9k_rx_prepare(priv, rxbuf, &rx_status)) { in ath9k_rx_tasklet()
1084 if (ieee80211_is_beacon(hdr->frame_control) && priv->ps_enabled) in ath9k_rx_tasklet()
1085 ieee80211_queue_work(priv->hw, &priv->ps_work); in ath9k_rx_tasklet()
1087 spin_unlock_irqrestore(&priv->rx.rxbuflock, flags); in ath9k_rx_tasklet()
1089 ieee80211_rx(priv->hw, skb); in ath9k_rx_tasklet()
1091 spin_lock_irqsave(&priv->rx.rxbuflock, flags); in ath9k_rx_tasklet()
1095 list_move_tail(&rxbuf->list, &priv->rx.rxbuf); in ath9k_rx_tasklet()
1097 spin_unlock_irqrestore(&priv->rx.rxbuflock, flags); in ath9k_rx_tasklet()
1105 struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *)drv_priv; in ath9k_htc_rxep() local
1106 struct ath_hw *ah = priv->ah; in ath9k_htc_rxep()
1110 spin_lock(&priv->rx.rxbuflock); in ath9k_htc_rxep()
1111 list_for_each_entry(tmp_buf, &priv->rx.rxbuf, list) { in ath9k_htc_rxep()
1117 spin_unlock(&priv->rx.rxbuflock); in ath9k_htc_rxep()
1124 spin_lock(&priv->rx.rxbuflock); in ath9k_htc_rxep()
1127 spin_unlock(&priv->rx.rxbuflock); in ath9k_htc_rxep()
1129 tasklet_schedule(&priv->rx_tasklet); in ath9k_htc_rxep()
1137 void ath9k_rx_cleanup(struct ath9k_htc_priv *priv) in ath9k_rx_cleanup() argument
1141 list_for_each_entry_safe(rxbuf, tbuf, &priv->rx.rxbuf, list) { in ath9k_rx_cleanup()
1149 int ath9k_rx_init(struct ath9k_htc_priv *priv) in ath9k_rx_init() argument
1153 INIT_LIST_HEAD(&priv->rx.rxbuf); in ath9k_rx_init()
1154 spin_lock_init(&priv->rx.rxbuflock); in ath9k_rx_init()
1162 list_add_tail(&rxbuf->list, &priv->rx.rxbuf); in ath9k_rx_init()
1168 ath9k_rx_cleanup(priv); in ath9k_rx_init()