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

Commit 8b537686 authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by John W. Linville
Browse files

ath9k: add TPC capability to TX descriptor path



Add TPC capability to TX descriptor path. Cap per-packet TX power according to
TX power per-rate tables. Currently TPC is supported just by AR9003 based chips

Signed-off-by: default avatarLorenzo Bianconi <lorenzo.bianconi83@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 23f53dd3
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -281,7 +281,7 @@ ar9002_set_txdesc(struct ath_hw *ah, void *ds, struct ath_tx_info *i)

	ACCESS_ONCE(ads->ds_ctl0) = (i->pkt_len & AR_FrameLen)
		| (i->flags & ATH9K_TXDESC_VMF ? AR_VirtMoreFrag : 0)
		| SM(i->txpower, AR_XmitPower0)
		| SM(i->txpower[0], AR_XmitPower0)
		| (i->flags & ATH9K_TXDESC_VEOL ? AR_VEOL : 0)
		| (i->flags & ATH9K_TXDESC_INTREQ ? AR_TxIntrReq : 0)
		| (i->keyix != ATH9K_TXKEYIX_INVALID ? AR_DestIdxValid : 0)
@@ -307,9 +307,9 @@ ar9002_set_txdesc(struct ath_hw *ah, void *ds, struct ath_tx_info *i)
		| set11nRateFlags(i->rates, 3)
		| SM(i->rtscts_rate, AR_RTSCTSRate);

	ACCESS_ONCE(ads->ds_ctl9) = SM(i->txpower, AR_XmitPower1);
	ACCESS_ONCE(ads->ds_ctl10) = SM(i->txpower, AR_XmitPower2);
	ACCESS_ONCE(ads->ds_ctl11) = SM(i->txpower, AR_XmitPower3);
	ACCESS_ONCE(ads->ds_ctl9) = SM(i->txpower[1], AR_XmitPower1);
	ACCESS_ONCE(ads->ds_ctl10) = SM(i->txpower[2], AR_XmitPower2);
	ACCESS_ONCE(ads->ds_ctl11) = SM(i->txpower[3], AR_XmitPower3);
}

static int ar9002_hw_proc_txdesc(struct ath_hw *ah, void *ds,
+4 −4
Original line number Diff line number Diff line
@@ -101,7 +101,7 @@ ar9003_set_txdesc(struct ath_hw *ah, void *ds, struct ath_tx_info *i)

	ACCESS_ONCE(ads->ctl11) = (i->pkt_len & AR_FrameLen)
		| (i->flags & ATH9K_TXDESC_VMF ? AR_VirtMoreFrag : 0)
		| SM(i->txpower, AR_XmitPower0)
		| SM(i->txpower[0], AR_XmitPower0)
		| (i->flags & ATH9K_TXDESC_VEOL ? AR_VEOL : 0)
		| (i->keyix != ATH9K_TXKEYIX_INVALID ? AR_DestIdxValid : 0)
		| (i->flags & ATH9K_TXDESC_LOWRXCHAIN ? AR_LowRxChain : 0)
@@ -152,9 +152,9 @@ ar9003_set_txdesc(struct ath_hw *ah, void *ds, struct ath_tx_info *i)

	ACCESS_ONCE(ads->ctl19) = AR_Not_Sounding;

	ACCESS_ONCE(ads->ctl20) = SM(i->txpower, AR_XmitPower1);
	ACCESS_ONCE(ads->ctl21) = SM(i->txpower, AR_XmitPower2);
	ACCESS_ONCE(ads->ctl22) = SM(i->txpower, AR_XmitPower3);
	ACCESS_ONCE(ads->ctl20) = SM(i->txpower[1], AR_XmitPower1);
	ACCESS_ONCE(ads->ctl21) = SM(i->txpower[2], AR_XmitPower2);
	ACCESS_ONCE(ads->ctl22) = SM(i->txpower[3], AR_XmitPower3);
}

static u16 ar9003_calc_ptr_chksum(struct ar9003_txc *ads)
+1 −0
Original line number Diff line number Diff line
@@ -189,6 +189,7 @@ struct ath_frame_info {
	u8 rtscts_rate;
	u8 retries : 7;
	u8 baw_tracked : 1;
	u8 tx_power;
};

struct ath_rxbuf {
+3 −2
Original line number Diff line number Diff line
@@ -78,7 +78,7 @@ static void ath9k_beacon_setup(struct ath_softc *sc, struct ieee80211_vif *vif,
	struct ath_tx_info info;
	struct ieee80211_supported_band *sband;
	u8 chainmask = ah->txchainmask;
	u8 rate = 0;
	u8 i, rate = 0;

	sband = &common->sbands[sc->cur_chandef.chan->band];
	rate = sband->bitrates[rateidx].hw_value;
@@ -88,7 +88,8 @@ static void ath9k_beacon_setup(struct ath_softc *sc, struct ieee80211_vif *vif,
	memset(&info, 0, sizeof(info));
	info.pkt_len = skb->len + FCS_LEN;
	info.type = ATH9K_PKT_TYPE_BEACON;
	info.txpower = MAX_RATE_POWER;
	for (i = 0; i < 4; i++)
		info.txpower[i] = MAX_RATE_POWER;
	info.keyix = ATH9K_TXKEYIX_INVALID;
	info.keytype = ATH9K_KEY_TYPE_CLEAR;
	info.flags = ATH9K_TXDESC_NOACK | ATH9K_TXDESC_CLRDMASK;
+1 −1
Original line number Diff line number Diff line
@@ -704,7 +704,7 @@ struct ath_tx_info {
	enum ath9k_pkt_type type;
	enum ath9k_key_type keytype;
	u8 keyix;
	u8 txpower;
	u8 txpower[4];
};

struct ath_hw;
Loading