diff options
Diffstat (limited to 'drivers/net/wireless/b43legacy/xmit.c')
-rw-r--r-- | drivers/net/wireless/b43legacy/xmit.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/drivers/net/wireless/b43legacy/xmit.c b/drivers/net/wireless/b43legacy/xmit.c index 65e833781608..12fca99f7578 100644 --- a/drivers/net/wireless/b43legacy/xmit.c +++ b/drivers/net/wireless/b43legacy/xmit.c | |||
@@ -188,7 +188,7 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev, | |||
188 | struct b43legacy_txhdr_fw3 *txhdr, | 188 | struct b43legacy_txhdr_fw3 *txhdr, |
189 | const unsigned char *fragment_data, | 189 | const unsigned char *fragment_data, |
190 | unsigned int fragment_len, | 190 | unsigned int fragment_len, |
191 | const struct ieee80211_tx_info *info, | 191 | struct ieee80211_tx_info *info, |
192 | u16 cookie) | 192 | u16 cookie) |
193 | { | 193 | { |
194 | const struct ieee80211_hdr *wlhdr; | 194 | const struct ieee80211_hdr *wlhdr; |
@@ -201,6 +201,7 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev, | |||
201 | u32 mac_ctl = 0; | 201 | u32 mac_ctl = 0; |
202 | u16 phy_ctl = 0; | 202 | u16 phy_ctl = 0; |
203 | struct ieee80211_rate *tx_rate; | 203 | struct ieee80211_rate *tx_rate; |
204 | struct ieee80211_tx_rate *rates; | ||
204 | 205 | ||
205 | wlhdr = (const struct ieee80211_hdr *)fragment_data; | 206 | wlhdr = (const struct ieee80211_hdr *)fragment_data; |
206 | 207 | ||
@@ -274,7 +275,7 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev, | |||
274 | /* PHY TX Control word */ | 275 | /* PHY TX Control word */ |
275 | if (rate_ofdm) | 276 | if (rate_ofdm) |
276 | phy_ctl |= B43legacy_TX4_PHY_OFDM; | 277 | phy_ctl |= B43legacy_TX4_PHY_OFDM; |
277 | if (dev->short_preamble) | 278 | if (info->control.rates[0].flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE) |
278 | phy_ctl |= B43legacy_TX4_PHY_SHORTPRMBL; | 279 | phy_ctl |= B43legacy_TX4_PHY_SHORTPRMBL; |
279 | switch (info->antenna_sel_tx) { | 280 | switch (info->antenna_sel_tx) { |
280 | case 0: | 281 | case 0: |
@@ -291,6 +292,7 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev, | |||
291 | } | 292 | } |
292 | 293 | ||
293 | /* MAC control */ | 294 | /* MAC control */ |
295 | rates = info->control.rates; | ||
294 | if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) | 296 | if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) |
295 | mac_ctl |= B43legacy_TX4_MAC_ACK; | 297 | mac_ctl |= B43legacy_TX4_MAC_ACK; |
296 | if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) | 298 | if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) |
@@ -299,12 +301,22 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev, | |||
299 | mac_ctl |= B43legacy_TX4_MAC_STMSDU; | 301 | mac_ctl |= B43legacy_TX4_MAC_STMSDU; |
300 | if (rate_fb_ofdm) | 302 | if (rate_fb_ofdm) |
301 | mac_ctl |= B43legacy_TX4_MAC_FALLBACKOFDM; | 303 | mac_ctl |= B43legacy_TX4_MAC_FALLBACKOFDM; |
302 | if (info->flags & IEEE80211_TX_CTL_LONG_RETRY_LIMIT) | 304 | |
305 | /* Overwrite rates[0].count to make the retry calculation | ||
306 | * in the tx status easier. need the actual retry limit to | ||
307 | * detect whether the fallback rate was used. | ||
308 | */ | ||
309 | if ((rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) || | ||
310 | (rates[0].count <= dev->wl->hw->conf.long_frame_max_tx_count)) { | ||
311 | rates[0].count = dev->wl->hw->conf.long_frame_max_tx_count; | ||
303 | mac_ctl |= B43legacy_TX4_MAC_LONGFRAME; | 312 | mac_ctl |= B43legacy_TX4_MAC_LONGFRAME; |
313 | } else { | ||
314 | rates[0].count = dev->wl->hw->conf.short_frame_max_tx_count; | ||
315 | } | ||
304 | 316 | ||
305 | /* Generate the RTS or CTS-to-self frame */ | 317 | /* Generate the RTS or CTS-to-self frame */ |
306 | if ((info->flags & IEEE80211_TX_CTL_USE_RTS_CTS) || | 318 | if ((rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) || |
307 | (info->flags & IEEE80211_TX_CTL_USE_CTS_PROTECT)) { | 319 | (rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT)) { |
308 | unsigned int len; | 320 | unsigned int len; |
309 | struct ieee80211_hdr *hdr; | 321 | struct ieee80211_hdr *hdr; |
310 | int rts_rate; | 322 | int rts_rate; |
@@ -319,7 +331,7 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev, | |||
319 | if (rts_rate_fb_ofdm) | 331 | if (rts_rate_fb_ofdm) |
320 | mac_ctl |= B43legacy_TX4_MAC_CTSFALLBACKOFDM; | 332 | mac_ctl |= B43legacy_TX4_MAC_CTSFALLBACKOFDM; |
321 | 333 | ||
322 | if (info->flags & IEEE80211_TX_CTL_USE_CTS_PROTECT) { | 334 | if (rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) { |
323 | ieee80211_ctstoself_get(dev->wl->hw, | 335 | ieee80211_ctstoself_get(dev->wl->hw, |
324 | info->control.vif, | 336 | info->control.vif, |
325 | fragment_data, | 337 | fragment_data, |
@@ -362,7 +374,7 @@ int b43legacy_generate_txhdr(struct b43legacy_wldev *dev, | |||
362 | u8 *txhdr, | 374 | u8 *txhdr, |
363 | const unsigned char *fragment_data, | 375 | const unsigned char *fragment_data, |
364 | unsigned int fragment_len, | 376 | unsigned int fragment_len, |
365 | const struct ieee80211_tx_info *info, | 377 | struct ieee80211_tx_info *info, |
366 | u16 cookie) | 378 | u16 cookie) |
367 | { | 379 | { |
368 | return generate_txhdr_fw3(dev, (struct b43legacy_txhdr_fw3 *)txhdr, | 380 | return generate_txhdr_fw3(dev, (struct b43legacy_txhdr_fw3 *)txhdr, |