Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 61117f01 authored by Felix Fietkau's avatar Felix Fietkau Committed by John W. Linville
Browse files

ath9k: remove the tx info padding byte abuse

parent f0c255a0
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -229,6 +229,7 @@ struct ath_buf_state {
	unsigned long bfs_paprd_timestamp;
	u32 bfs_keyix;
	enum ath9k_key_type bfs_keytype;
	enum ath9k_internal_frame_type bfs_ftype;
};

struct ath_buf {
@@ -711,7 +712,7 @@ void ath9k_ps_restore(struct ath_softc *sc);
void ath9k_set_bssid_mask(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
int ath9k_wiphy_add(struct ath_softc *sc);
int ath9k_wiphy_del(struct ath_wiphy *aphy);
void ath9k_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb);
void ath9k_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb, int ftype);
int ath9k_wiphy_pause(struct ath_wiphy *aphy);
int ath9k_wiphy_unpause(struct ath_wiphy *aphy);
int ath9k_wiphy_select(struct ath_wiphy *aphy);
+0 −3
Original line number Diff line number Diff line
@@ -224,9 +224,6 @@ struct ath_rate_priv {
	struct ath_rc_stats rcstats[RATE_TABLE_SIZE];
};

#define ATH_TX_INFO_FRAME_TYPE_INTERNAL	(1 << 0)
#define ATH_TX_INFO_FRAME_TYPE_PAUSE	(1 << 1)

enum ath9k_internal_frame_type {
	ATH9K_IFT_NOT_INTERNAL,
	ATH9K_IFT_PAUSE,
+2 −3
Original line number Diff line number Diff line
@@ -305,13 +305,12 @@ void ath9k_wiphy_chan_work(struct work_struct *work)
 * ath9k version of ieee80211_tx_status() for TX frames that are generated
 * internally in the driver.
 */
void ath9k_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
void ath9k_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb, int ftype)
{
	struct ath_wiphy *aphy = hw->priv;
	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);

	if ((tx_info->pad[0] & ATH_TX_INFO_FRAME_TYPE_PAUSE) &&
	    aphy->state == ATH_WIPHY_PAUSING) {
	if (ftype == ATH9K_IFT_PAUSE && aphy->state == ATH_WIPHY_PAUSING) {
		if (!(tx_info->flags & IEEE80211_TX_STAT_ACK)) {
			printk(KERN_DEBUG "ath9k: %s: no ACK for pause "
			       "frame\n", wiphy_name(hw->wiphy));
+6 −15
Original line number Diff line number Diff line
@@ -1580,17 +1580,6 @@ static int ath_tx_setup_buffer(struct ieee80211_hw *hw, struct ath_buf *bf,
	int padpos, padsize;
	bool use_ldpc = false;

	tx_info->pad[0] = 0;
	switch (txctl->frame_type) {
	case ATH9K_IFT_NOT_INTERNAL:
		break;
	case ATH9K_IFT_PAUSE:
		tx_info->pad[0] |= ATH_TX_INFO_FRAME_TYPE_PAUSE;
		/* fall through */
	case ATH9K_IFT_UNPAUSE:
		tx_info->pad[0] |= ATH_TX_INFO_FRAME_TYPE_INTERNAL;
		break;
	}
	hdrlen = ieee80211_get_hdrlen_from_skb(skb);
	fc = hdr->frame_control;

@@ -1711,6 +1700,7 @@ static void ath_tx_start_dma(struct ath_softc *sc, struct ath_buf *bf,
					      tid, &bf_head);
		}
	} else {
		bf->bf_state.bfs_ftype = txctl->frame_type;
		ath_tx_send_normal(sc, txctl->txq, &bf_head);
	}

@@ -1828,7 +1818,7 @@ void ath_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb)
/*****************/

static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
			    struct ath_wiphy *aphy, int tx_flags,
			    struct ath_wiphy *aphy, int tx_flags, int ftype,
			    struct ath_txq *txq)
{
	struct ieee80211_hw *hw = sc->hw;
@@ -1872,8 +1862,8 @@ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
					PS_WAIT_FOR_TX_ACK));
	}

	if (unlikely(tx_info->pad[0] & ATH_TX_INFO_FRAME_TYPE_INTERNAL))
		ath9k_tx_status(hw, skb);
	if (unlikely(ftype))
		ath9k_tx_status(hw, skb, ftype);
	else {
		q = skb_get_queue_mapping(skb);
		if (txq == sc->tx.txq_map[q]) {
@@ -1917,7 +1907,8 @@ static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf,
			complete(&sc->paprd_complete);
	} else {
		ath_debug_stat_tx(sc, bf, ts);
		ath_tx_complete(sc, skb, bf->aphy, tx_flags, txq);
		ath_tx_complete(sc, skb, bf->aphy, tx_flags,
				bf->bf_state.bfs_ftype, txq);
	}
	/* At this point, skb (bf->bf_mpdu) is consumed...make sure we don't
	 * accidentally reference it later.