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

Commit 2e92e6f2 authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville
Browse files

mac80211: use rate index in TX control



This patch modifies struct ieee80211_tx_control to give band
info and the rate index (instead of rate pointers) to drivers.
This mostly serves to reduce the TX control structure size to
make it fit into skb->cb so that the fragmentation code can
put it there and we can think about passing it to drivers that
way in the future.

The rt2x00 driver update was done by Ivo, thanks.

Signed-off-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
Signed-off-by: default avatarJohannes Berg <johannes@sipsolutions.net>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 36d6825b
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -1693,10 +1693,10 @@ static int adm8211_tx(struct ieee80211_hw *dev, struct sk_buff *skb,
	size_t payload_len, hdrlen;
	size_t payload_len, hdrlen;
	int plcp, dur, len, plcp_signal, short_preamble;
	int plcp, dur, len, plcp_signal, short_preamble;
	struct ieee80211_hdr *hdr;
	struct ieee80211_hdr *hdr;
	struct ieee80211_rate *txrate = ieee80211_get_tx_rate(dev, control);


	short_preamble = !!(control->tx_rate->flags &
	short_preamble = !!(txrate->flags & IEEE80211_TXCTL_SHORT_PREAMBLE);
					IEEE80211_TXCTL_SHORT_PREAMBLE);
	plcp_signal = txrate->bitrate;
	plcp_signal = control->tx_rate->bitrate;


	hdr = (struct ieee80211_hdr *)skb->data;
	hdr = (struct ieee80211_hdr *)skb->data;
	fc = le16_to_cpu(hdr->frame_control) & ~IEEE80211_FCTL_PROTECTED;
	fc = le16_to_cpu(hdr->frame_control) & ~IEEE80211_FCTL_PROTECTED;
+5 −3
Original line number Original line Diff line number Diff line
@@ -1323,7 +1323,8 @@ ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf,


	ret = ah->ah_setup_tx_desc(ah, ds, pktlen,
	ret = ah->ah_setup_tx_desc(ah, ds, pktlen,
		ieee80211_get_hdrlen_from_skb(skb), AR5K_PKT_TYPE_NORMAL,
		ieee80211_get_hdrlen_from_skb(skb), AR5K_PKT_TYPE_NORMAL,
		(sc->power_level * 2), ctl->tx_rate->hw_value,
		(sc->power_level * 2),
		ieee80211_get_tx_rate(sc->hw, ctl)->hw_value,
		ctl->retry_limit, keyidx, 0, flags, 0, 0);
		ctl->retry_limit, keyidx, 0, flags, 0, 0);
	if (ret)
	if (ret)
		goto err_unmap;
		goto err_unmap;
@@ -2046,7 +2047,8 @@ ath5k_beacon_setup(struct ath5k_softc *sc, struct ath5k_buf *bf,
	ret = ah->ah_setup_tx_desc(ah, ds, skb->len,
	ret = ah->ah_setup_tx_desc(ah, ds, skb->len,
			ieee80211_get_hdrlen_from_skb(skb),
			ieee80211_get_hdrlen_from_skb(skb),
			AR5K_PKT_TYPE_BEACON, (sc->power_level * 2),
			AR5K_PKT_TYPE_BEACON, (sc->power_level * 2),
			ctl->tx_rate->hw_value, 1, AR5K_TXKEYIX_INVALID,
			ieee80211_get_tx_rate(sc->hw, ctl)->hw_value,
			1, AR5K_TXKEYIX_INVALID,
			antenna, flags, 0, 0);
			antenna, flags, 0, 0);
	if (ret)
	if (ret)
		goto err_unmap;
		goto err_unmap;
@@ -2654,7 +2656,7 @@ ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb,
		memmove(skb->data, skb->data+pad, hdrlen);
		memmove(skb->data, skb->data+pad, hdrlen);
	}
	}


	sc->led_txrate = ctl->tx_rate->hw_value;
	sc->led_txrate = ieee80211_get_tx_rate(hw, ctl)->hw_value;


	spin_lock_irqsave(&sc->txbuflock, flags);
	spin_lock_irqsave(&sc->txbuflock, flags);
	if (list_empty(&sc->txbuf)) {
	if (list_empty(&sc->txbuf)) {
+1 −1
Original line number Original line Diff line number Diff line
@@ -1372,7 +1372,7 @@ static void b43_write_beacon_template(struct b43_wldev *dev,
	bcn = (const struct ieee80211_mgmt *)(dev->wl->current_beacon->data);
	bcn = (const struct ieee80211_mgmt *)(dev->wl->current_beacon->data);
	len = min((size_t) dev->wl->current_beacon->len,
	len = min((size_t) dev->wl->current_beacon->len,
		  0x200 - sizeof(struct b43_plcp_hdr6));
		  0x200 - sizeof(struct b43_plcp_hdr6));
	rate = dev->wl->beacon_txctl.tx_rate->hw_value;
	rate = ieee80211_get_tx_rate(dev->wl->hw, &dev->wl->beacon_txctl)->hw_value;


	b43_write_template_common(dev, (const u8 *)bcn,
	b43_write_template_common(dev, (const u8 *)bcn,
				  len, ram_offset, shm_size_offset, rate);
				  len, ram_offset, shm_size_offset, rate);
+8 −5
Original line number Original line Diff line number Diff line
@@ -201,13 +201,14 @@ int b43_generate_txhdr(struct b43_wldev *dev,
	u32 mac_ctl = 0;
	u32 mac_ctl = 0;
	u16 phy_ctl = 0;
	u16 phy_ctl = 0;
	u8 extra_ft = 0;
	u8 extra_ft = 0;
	struct ieee80211_rate *txrate;


	memset(txhdr, 0, sizeof(*txhdr));
	memset(txhdr, 0, sizeof(*txhdr));


	WARN_ON(!txctl->tx_rate);
	txrate = ieee80211_get_tx_rate(dev->wl->hw, txctl);
	rate = txctl->tx_rate ? txctl->tx_rate->hw_value : B43_CCK_RATE_1MB;
	rate = txrate ? txrate->hw_value : B43_CCK_RATE_1MB;
	rate_ofdm = b43_is_ofdm_rate(rate);
	rate_ofdm = b43_is_ofdm_rate(rate);
	fbrate = txctl->alt_retry_rate ? : txctl->tx_rate;
	fbrate = ieee80211_get_alt_retry_rate(dev->wl->hw, txctl) ? : txrate;
	rate_fb = fbrate->hw_value;
	rate_fb = fbrate->hw_value;
	rate_fb_ofdm = b43_is_ofdm_rate(rate_fb);
	rate_fb_ofdm = b43_is_ofdm_rate(rate_fb);


@@ -336,9 +337,11 @@ int b43_generate_txhdr(struct b43_wldev *dev,
		int rts_rate, rts_rate_fb;
		int rts_rate, rts_rate_fb;
		int rts_rate_ofdm, rts_rate_fb_ofdm;
		int rts_rate_ofdm, rts_rate_fb_ofdm;
		struct b43_plcp_hdr6 *plcp;
		struct b43_plcp_hdr6 *plcp;
		struct ieee80211_rate *rts_cts_rate;


		WARN_ON(!txctl->rts_cts_rate);
		rts_cts_rate = ieee80211_get_rts_cts_rate(dev->wl->hw, txctl);
		rts_rate = txctl->rts_cts_rate ? txctl->rts_cts_rate->hw_value : B43_CCK_RATE_1MB;

		rts_rate = rts_cts_rate ? rts_cts_rate->hw_value : B43_CCK_RATE_1MB;
		rts_rate_ofdm = b43_is_ofdm_rate(rts_rate);
		rts_rate_ofdm = b43_is_ofdm_rate(rts_rate);
		rts_rate_fb = b43_calc_fallback_rate(rts_rate);
		rts_rate_fb = b43_calc_fallback_rate(rts_rate);
		rts_rate_fb_ofdm = b43_is_ofdm_rate(rts_rate_fb);
		rts_rate_fb_ofdm = b43_is_ofdm_rate(rts_rate_fb);
+6 −3
Original line number Original line Diff line number Diff line
@@ -201,15 +201,18 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev,
	unsigned int plcp_fragment_len;
	unsigned int plcp_fragment_len;
	u32 mac_ctl = 0;
	u32 mac_ctl = 0;
	u16 phy_ctl = 0;
	u16 phy_ctl = 0;
	struct ieee80211_rate *tx_rate;


	wlhdr = (const struct ieee80211_hdr *)fragment_data;
	wlhdr = (const struct ieee80211_hdr *)fragment_data;
	fctl = le16_to_cpu(wlhdr->frame_control);
	fctl = le16_to_cpu(wlhdr->frame_control);


	memset(txhdr, 0, sizeof(*txhdr));
	memset(txhdr, 0, sizeof(*txhdr));


	rate = txctl->tx_rate->hw_value;
	tx_rate = ieee80211_get_tx_rate(dev->wl->hw, txctl);

	rate = tx_rate->hw_value;
	rate_ofdm = b43legacy_is_ofdm_rate(rate);
	rate_ofdm = b43legacy_is_ofdm_rate(rate);
	rate_fb = txctl->alt_retry_rate ? : txctl->tx_rate;
	rate_fb = ieee80211_get_alt_retry_rate(dev->wl->hw, txctl) ? : tx_rate;
	rate_fb_ofdm = b43legacy_is_ofdm_rate(rate_fb->hw_value);
	rate_fb_ofdm = b43legacy_is_ofdm_rate(rate_fb->hw_value);


	txhdr->mac_frame_ctl = wlhdr->frame_control;
	txhdr->mac_frame_ctl = wlhdr->frame_control;
@@ -312,7 +315,7 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev,
		int rts_rate_ofdm;
		int rts_rate_ofdm;
		int rts_rate_fb_ofdm;
		int rts_rate_fb_ofdm;


		rts_rate = txctl->rts_cts_rate->hw_value;
		rts_rate = ieee80211_get_rts_cts_rate(dev->wl->hw, txctl)->hw_value;
		rts_rate_ofdm = b43legacy_is_ofdm_rate(rts_rate);
		rts_rate_ofdm = b43legacy_is_ofdm_rate(rts_rate);
		rts_rate_fb = b43legacy_calc_fallback_rate(rts_rate);
		rts_rate_fb = b43legacy_calc_fallback_rate(rts_rate);
		rts_rate_fb_ofdm = b43legacy_is_ofdm_rate(rts_rate_fb);
		rts_rate_fb_ofdm = b43legacy_is_ofdm_rate(rts_rate_fb);
Loading