Message ID | 20210305230337.23047-2-pradeepc@codeaurora.org (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Kalle Valo |
Headers | show |
Series | ath11k: add HE radiotap header support | expand |
> --- a/drivers/net/wireless/ath/ath11k/dp_tx.c > +++ b/drivers/net/wireless/ath/ath11k/dp_tx.c > @@ -417,9 +417,12 @@ static void ath11k_dp_tx_complete_msdu(struct > ath11k *ar, > struct sk_buff *msdu, > struct hal_tx_status *ts) > { > + struct ieee80211_tx_status status = { 0 }; > struct ath11k_base *ab = ar->ab; > struct ieee80211_tx_info *info; > struct ath11k_skb_cb *skb_cb; > + struct ath11k_peer *peer; > + struct ath11k_sta *arsta; > > if (WARN_ON_ONCE(ts->buf_rel_source != HAL_WBM_REL_SRC_MODULE_TQM)) { > /* Must not happen */ > @@ -483,13 +486,22 @@ static void ath11k_dp_tx_complete_msdu(struct > ath11k *ar, > ath11k_dp_tx_cache_peer_stats(ar, msdu, ts); > } > > - /* NOTE: Tx rate status reporting. Tx completion status does not have > - * necessary information (for example nss) to build the tx rate. > - * Might end up reporting it out-of-band from HTT stats. > - */ > - > - ieee80211_tx_status(ar->hw, msdu); > - > + spin_lock_bh(&ab->base_lock); > + peer = ath11k_peer_find_by_id(ab, ts->peer_id); > + if (peer) { > + arsta = (struct ath11k_sta *)peer->sta->drv_priv; > + status.sta = peer->sta; > + status.skb = msdu; > + status.info = info; > + status.rate = &arsta->last_txrate; > + } > + rcu_read_unlock(); > + if (peer) > + ieee80211_tx_status_ext(ar->hw, &status); > + else > + dev_kfree_skb_any(msdu); > + spin_unlock_bh(&ab->base_lock); Why ieee80211_tx_status_ext() kept under spin_lock? Thanks, Karthikeyan P
>> + spin_lock_bh(&ab->base_lock); >> + peer = ath11k_peer_find_by_id(ab, ts->peer_id); >> + if (peer) { >> + arsta = (struct ath11k_sta *)peer->sta->drv_priv; >> + status.sta = peer->sta; >> + status.skb = msdu; >> + status.info = info; >> + status.rate = &arsta->last_txrate; >> + } >> + rcu_read_unlock(); >> + if (peer) >> + ieee80211_tx_status_ext(ar->hw, &status); >> + else >> + dev_kfree_skb_any(msdu); >> + spin_unlock_bh(&ab->base_lock); > > Why ieee80211_tx_status_ext() kept under spin_lock? > > Thanks, > Karthikeyan P Thanks Karthikeyan for the review..Yes, spin lock could be avoided for ieee80211_tx_status_ext(). I will address this in next revision. Thanks pradeep
diff --git a/drivers/net/wireless/ath/ath11k/dp_tx.c b/drivers/net/wireless/ath/ath11k/dp_tx.c index 8bba5234f81f..9b636b4e8521 100644 --- a/drivers/net/wireless/ath/ath11k/dp_tx.c +++ b/drivers/net/wireless/ath/ath11k/dp_tx.c @@ -417,9 +417,12 @@ static void ath11k_dp_tx_complete_msdu(struct ath11k *ar, struct sk_buff *msdu, struct hal_tx_status *ts) { + struct ieee80211_tx_status status = { 0 }; struct ath11k_base *ab = ar->ab; struct ieee80211_tx_info *info; struct ath11k_skb_cb *skb_cb; + struct ath11k_peer *peer; + struct ath11k_sta *arsta; if (WARN_ON_ONCE(ts->buf_rel_source != HAL_WBM_REL_SRC_MODULE_TQM)) { /* Must not happen */ @@ -483,13 +486,22 @@ static void ath11k_dp_tx_complete_msdu(struct ath11k *ar, ath11k_dp_tx_cache_peer_stats(ar, msdu, ts); } - /* NOTE: Tx rate status reporting. Tx completion status does not have - * necessary information (for example nss) to build the tx rate. - * Might end up reporting it out-of-band from HTT stats. - */ - - ieee80211_tx_status(ar->hw, msdu); - + spin_lock_bh(&ab->base_lock); + peer = ath11k_peer_find_by_id(ab, ts->peer_id); + if (peer) { + arsta = (struct ath11k_sta *)peer->sta->drv_priv; + status.sta = peer->sta; + status.skb = msdu; + status.info = info; + status.rate = &arsta->last_txrate; + } + rcu_read_unlock(); + if (peer) + ieee80211_tx_status_ext(ar->hw, &status); + else + dev_kfree_skb_any(msdu); + spin_unlock_bh(&ab->base_lock); + return; exit: rcu_read_unlock(); }