Search Linux Wireless

Re: [PATCH v5.18] ath9k: Properly clear TX status area before reporting to mac80211

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Toke,

On Wed, 30 Mar 2022 18:44:09 +0200, Toke Høiland-Jørgensen <toke@xxxxxxx> wrote:

> The ath9k driver was not properly clearing the status area in the
> ieee80211_tx_info struct before reporting TX status to mac80211. Instead,
> it was manually filling in fields, which meant that fields introduced later
> were left as-is.
> 
> Conveniently, mac80211 actually provides a helper to zero out the status
> area, so use that to make sure we zero everything.
> 
> The last commit touching the driver function writing the status information
> seems to have actually been fixing an issue that was also caused by the
> area being uninitialised; but it only added clearing of a single field
> instead of the whole struct. That is now redundant, though, so revert that
> commit and use it as a convenient Fixes tag.
> 
> Fixes: cc591d77aba1 ("ath9k: Make sure to zero status.tx_time before reporting TX status")
> Reported-by: Bagas Sanjaya <bagasdotme@xxxxxxxxx>
> Signed-off-by: Toke Høiland-Jørgensen <toke@xxxxxxx>
> ---
>  drivers/net/wireless/ath/ath9k/xmit.c | 5 ++---
>  1 file changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
> index d0caf1de2bde..cbcf96ac303e 100644
> --- a/drivers/net/wireless/ath/ath9k/xmit.c
> +++ b/drivers/net/wireless/ath/ath9k/xmit.c
> @@ -2553,6 +2553,8 @@ static void ath_tx_rc_status(struct ath_softc *sc, struct ath_buf *bf,
>  	struct ath_hw *ah = sc->sc_ah;
>  	u8 i, tx_rateindex;
>  
> +	ieee80211_tx_info_clear_status(tx_info);
> +

As this also clears the status.rates[].count, see include/net/mac80211.h:

1195 static inline void
1196 ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info)
1197 {
1198         int i;
1199         
1200         BUILD_BUG_ON(offsetof(struct ieee80211_tx_info, status.rates) !=
1201                      offsetof(struct ieee80211_tx_info, control.rates));
1202         BUILD_BUG_ON(offsetof(struct ieee80211_tx_info, status.rates) !=
1203                      offsetof(struct ieee80211_tx_info, driver_rates));
1204         BUILD_BUG_ON(offsetof(struct ieee80211_tx_info, status.rates) != 8)     ;       
1205         /* clear the rate counts */
1206         for (i = 0; i < IEEE80211_TX_MAX_RATES; i++)
1207                 info->status.rates[i].count = 0;
1208         memset_after(&info->status, 0, rates);
1209 }

I would have expected some lines added to restore the count (for the
rates with index < tx_rateindex), e.g. as done in
drivers/net/wireless/ath/ath5k/base.c:

1731         ieee80211_tx_info_clear_status(info);
1732 
1733         for (i = 0; i < ts->ts_final_idx; i++) {
1734                 struct ieee80211_tx_rate *r =
1735                         &info->status.rates[i];
1736 
1737                 r->count = tries[i];
1738         }

In drivers/net/wireless/ath/ath9k/xmit.c this is only done/changed for
the tx_rateindex index (which is often zero in case the first suggested rate
succeeds, but in noisy environment is sometimes > 0)...

>  	if (txok)
>  		tx_info->status.ack_signal = ts->ts_rssi;
>  
> @@ -2595,9 +2597,6 @@ static void ath_tx_rc_status(struct ath_softc *sc, struct ath_buf *bf,
>  	}
>  
>  	tx_info->status.rates[)].count = ts->ts_longretry + 1;
> -
> -	/* we report airtime in ath_tx_count_airtime(), don't report twice */
> -	tx_info->status.tx_time = 0;
>  }
>  
>  static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq)


And from drivers/net/wireless/ath/ath9k/xmit.c:

2592         for (i = tx_rateindex + 1; i < hw->max_rates; i++) {
2593                 tx_info->status.rates[i].count = 0;
2594                 tx_info->status.rates[i].idx = -1;
2595         }

Line 2593 can be deleted as status.rates[].count is already zeroed through the
ieee80211_tx_info_clear_status() call...

And it should be sufficient to do:

	if (tx_rateindex + 1 < hw->max_rates)
		tx_info->status.rates[tx_rateindex + 1].idx = -1;

Regards,
Peter




[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux