diff options
| author | Johannes Berg <johannes@sipsolutions.net> | 2008-05-15 12:55:29 +0200 | 
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2008-05-21 21:48:11 -0400 | 
| commit | e039fa4a4195ac4ee895e6f3d1334beed63256fe (patch) | |
| tree | cfd0762d73df96b73052378be7b157c4ac6e7035 /drivers/net/wireless/b43/xmit.c | |
| parent | e24549485f859be6518929bb1c9c0257d79f033d (diff) | |
mac80211: move TX info into skb->cb
This patch converts mac80211 and all drivers to have transmit
information and status in skb->cb rather than allocating extra
memory for it and copying all the data around. To make it fit,
a union is used where only data that is necessary for all steps
is kept outside of the union.
A number of fixes were done by Ivo, as well as the rt2x00 part
of this patch.
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Acked-by: David S. Miller <davem@davemloft.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/b43/xmit.c')
| -rw-r--r-- | drivers/net/wireless/b43/xmit.c | 58 | 
1 files changed, 28 insertions, 30 deletions
| diff --git a/drivers/net/wireless/b43/xmit.c b/drivers/net/wireless/b43/xmit.c index 9b682a3cf5e4..f9e1cff2aecb 100644 --- a/drivers/net/wireless/b43/xmit.c +++ b/drivers/net/wireless/b43/xmit.c @@ -185,14 +185,14 @@ int b43_generate_txhdr(struct b43_wldev *dev,  		       u8 *_txhdr,  		       const unsigned char *fragment_data,  		       unsigned int fragment_len, -		       const struct ieee80211_tx_control *txctl, +		       const struct ieee80211_tx_info *info,  		       u16 cookie)  {  	struct b43_txhdr *txhdr = (struct b43_txhdr *)_txhdr;  	const struct b43_phy *phy = &dev->phy;  	const struct ieee80211_hdr *wlhdr =  	    (const struct ieee80211_hdr *)fragment_data; -	int use_encryption = (!(txctl->flags & IEEE80211_TXCTL_DO_NOT_ENCRYPT)); +	int use_encryption = (!(info->flags & IEEE80211_TX_CTL_DO_NOT_ENCRYPT));  	u16 fctl = le16_to_cpu(wlhdr->frame_control);  	struct ieee80211_rate *fbrate;  	u8 rate, rate_fb; @@ -205,10 +205,10 @@ int b43_generate_txhdr(struct b43_wldev *dev,  	memset(txhdr, 0, sizeof(*txhdr)); -	txrate = ieee80211_get_tx_rate(dev->wl->hw, txctl); +	txrate = ieee80211_get_tx_rate(dev->wl->hw, info);  	rate = txrate ? txrate->hw_value : B43_CCK_RATE_1MB;  	rate_ofdm = b43_is_ofdm_rate(rate); -	fbrate = ieee80211_get_alt_retry_rate(dev->wl->hw, txctl) ? : txrate; +	fbrate = ieee80211_get_alt_retry_rate(dev->wl->hw, info) ? : txrate;  	rate_fb = fbrate->hw_value;  	rate_fb_ofdm = b43_is_ofdm_rate(rate_fb); @@ -228,15 +228,13 @@ int b43_generate_txhdr(struct b43_wldev *dev,  		 * use the original dur_id field. */  		txhdr->dur_fb = wlhdr->duration_id;  	} else { -		txhdr->dur_fb = ieee80211_generic_frame_duration(dev->wl->hw, -								 txctl->vif, -								 fragment_len, -								 fbrate); +		txhdr->dur_fb = ieee80211_generic_frame_duration( +			dev->wl->hw, info->control.vif, fragment_len, fbrate);  	}  	plcp_fragment_len = fragment_len + FCS_LEN;  	if (use_encryption) { -		u8 key_idx = txctl->hw_key->hw_key_idx; +		u8 key_idx = info->control.hw_key->hw_key_idx;  		struct b43_key *key;  		int wlhdr_len;  		size_t iv_len; @@ -254,7 +252,7 @@ int b43_generate_txhdr(struct b43_wldev *dev,  		}  		/* Hardware appends ICV. */ -		plcp_fragment_len += txctl->icv_len; +		plcp_fragment_len += info->control.icv_len;  		key_idx = b43_kidx_to_fw(dev, key_idx);  		mac_ctl |= (key_idx << B43_TXH_MAC_KEYIDX_SHIFT) & @@ -262,7 +260,7 @@ int b43_generate_txhdr(struct b43_wldev *dev,  		mac_ctl |= (key->algorithm << B43_TXH_MAC_KEYALG_SHIFT) &  			   B43_TXH_MAC_KEYALG;  		wlhdr_len = ieee80211_get_hdrlen(fctl); -		iv_len = min((size_t) txctl->iv_len, +		iv_len = min((size_t) info->control.iv_len,  			     ARRAY_SIZE(txhdr->iv));  		memcpy(txhdr->iv, ((u8 *) wlhdr) + wlhdr_len, iv_len);  	} @@ -293,10 +291,10 @@ int b43_generate_txhdr(struct b43_wldev *dev,  		phy_ctl |= B43_TXH_PHY_ENC_OFDM;  	else  		phy_ctl |= B43_TXH_PHY_ENC_CCK; -	if (txctl->flags & IEEE80211_TXCTL_SHORT_PREAMBLE) +	if (info->flags & IEEE80211_TX_CTL_SHORT_PREAMBLE)  		phy_ctl |= B43_TXH_PHY_SHORTPRMBL; -	switch (b43_ieee80211_antenna_sanitize(dev, txctl->antenna_sel_tx)) { +	switch (b43_ieee80211_antenna_sanitize(dev, info->antenna_sel_tx)) {  	case 0: /* Default */  		phy_ctl |= B43_TXH_PHY_ANT01AUTO;  		break; @@ -317,21 +315,21 @@ int b43_generate_txhdr(struct b43_wldev *dev,  	}  	/* MAC control */ -	if (!(txctl->flags & IEEE80211_TXCTL_NO_ACK)) +	if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))  		mac_ctl |= B43_TXH_MAC_ACK;  	if (!(((fctl & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) &&  	      ((fctl & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PSPOLL)))  		mac_ctl |= B43_TXH_MAC_HWSEQ; -	if (txctl->flags & IEEE80211_TXCTL_FIRST_FRAGMENT) +	if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)  		mac_ctl |= B43_TXH_MAC_STMSDU;  	if (phy->type == B43_PHYTYPE_A)  		mac_ctl |= B43_TXH_MAC_5GHZ; -	if (txctl->flags & IEEE80211_TXCTL_LONG_RETRY_LIMIT) +	if (info->flags & IEEE80211_TX_CTL_LONG_RETRY_LIMIT)  		mac_ctl |= B43_TXH_MAC_LONGFRAME;  	/* Generate the RTS or CTS-to-self frame */ -	if ((txctl->flags & IEEE80211_TXCTL_USE_RTS_CTS) || -	    (txctl->flags & IEEE80211_TXCTL_USE_CTS_PROTECT)) { +	if ((info->flags & IEEE80211_TX_CTL_USE_RTS_CTS) || +	    (info->flags & IEEE80211_TX_CTL_USE_CTS_PROTECT)) {  		unsigned int len;  		struct ieee80211_hdr *hdr;  		int rts_rate, rts_rate_fb; @@ -339,14 +337,14 @@ int b43_generate_txhdr(struct b43_wldev *dev,  		struct b43_plcp_hdr6 *plcp;  		struct ieee80211_rate *rts_cts_rate; -		rts_cts_rate = ieee80211_get_rts_cts_rate(dev->wl->hw, txctl); +		rts_cts_rate = ieee80211_get_rts_cts_rate(dev->wl->hw, info);  		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_fb = b43_calc_fallback_rate(rts_rate);  		rts_rate_fb_ofdm = b43_is_ofdm_rate(rts_rate_fb); -		if (txctl->flags & IEEE80211_TXCTL_USE_CTS_PROTECT) { +		if (info->flags & IEEE80211_TX_CTL_USE_CTS_PROTECT) {  			struct ieee80211_cts *cts;  			if (b43_is_old_txhdr_format(dev)) { @@ -356,9 +354,9 @@ int b43_generate_txhdr(struct b43_wldev *dev,  				cts = (struct ieee80211_cts *)  					(txhdr->new_format.rts_frame);  			} -			ieee80211_ctstoself_get(dev->wl->hw, txctl->vif, +			ieee80211_ctstoself_get(dev->wl->hw, info->control.vif,  						fragment_data, fragment_len, -						txctl, cts); +						info, cts);  			mac_ctl |= B43_TXH_MAC_SENDCTS;  			len = sizeof(struct ieee80211_cts);  		} else { @@ -371,9 +369,9 @@ int b43_generate_txhdr(struct b43_wldev *dev,  				rts = (struct ieee80211_rts *)  					(txhdr->new_format.rts_frame);  			} -			ieee80211_rts_get(dev->wl->hw, txctl->vif, +			ieee80211_rts_get(dev->wl->hw, info->control.vif,  					  fragment_data, fragment_len, -					  txctl, rts); +					  info, rts);  			mac_ctl |= B43_TXH_MAC_SENDRTS;  			len = sizeof(struct ieee80211_rts);  		} @@ -687,27 +685,27 @@ void b43_handle_txstatus(struct b43_wldev *dev,  /* Fill out the mac80211 TXstatus report based on the b43-specific   * txstatus report data. This returns a boolean whether the frame was   * successfully transmitted. */ -bool b43_fill_txstatus_report(struct ieee80211_tx_status *report, +bool b43_fill_txstatus_report(struct ieee80211_tx_info *report,  			      const struct b43_txstatus *status)  {  	bool frame_success = 1;  	if (status->acked) {  		/* The frame was ACKed. */ -		report->flags |= IEEE80211_TX_STATUS_ACK; +		report->flags |= IEEE80211_TX_STAT_ACK;  	} else {  		/* The frame was not ACKed... */ -		if (!(report->control.flags & IEEE80211_TXCTL_NO_ACK)) { +		if (!(report->flags & IEEE80211_TX_CTL_NO_ACK)) {  			/* ...but we expected an ACK. */  			frame_success = 0; -			report->excessive_retries = 1; +			report->status.excessive_retries = 1;  		}  	}  	if (status->frame_count == 0) {  		/* The frame was not transmitted at all. */ -		report->retry_count = 0; +		report->status.retry_count = 0;  	} else -		report->retry_count = status->frame_count - 1; +		report->status.retry_count = status->frame_count - 1;  	return frame_success;  } | 
