|
@@ -1179,6 +1179,8 @@ ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
|
|
struct ieee80211_rate *rate;
|
|
struct ieee80211_rate *rate;
|
|
unsigned int mrr_rate[3], mrr_tries[3];
|
|
unsigned int mrr_rate[3], mrr_tries[3];
|
|
int i, ret;
|
|
int i, ret;
|
|
|
|
+ u16 hw_rate;
|
|
|
|
+ u8 rc_flags;
|
|
|
|
|
|
flags = AR5K_TXDESC_INTREQ | AR5K_TXDESC_CLRDMASK;
|
|
flags = AR5K_TXDESC_INTREQ | AR5K_TXDESC_CLRDMASK;
|
|
|
|
|
|
@@ -1186,9 +1188,15 @@ ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
|
|
bf->skbaddr = pci_map_single(sc->pdev, skb->data, skb->len,
|
|
bf->skbaddr = pci_map_single(sc->pdev, skb->data, skb->len,
|
|
PCI_DMA_TODEVICE);
|
|
PCI_DMA_TODEVICE);
|
|
|
|
|
|
|
|
+ rate = ieee80211_get_tx_rate(sc->hw, info);
|
|
|
|
+
|
|
if (info->flags & IEEE80211_TX_CTL_NO_ACK)
|
|
if (info->flags & IEEE80211_TX_CTL_NO_ACK)
|
|
flags |= AR5K_TXDESC_NOACK;
|
|
flags |= AR5K_TXDESC_NOACK;
|
|
|
|
|
|
|
|
+ rc_flags = info->control.rates[0].flags;
|
|
|
|
+ hw_rate = (rc_flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE) ?
|
|
|
|
+ rate->hw_value_short : rate->hw_value;
|
|
|
|
+
|
|
pktlen = skb->len;
|
|
pktlen = skb->len;
|
|
|
|
|
|
if (info->control.hw_key) {
|
|
if (info->control.hw_key) {
|
|
@@ -1198,7 +1206,7 @@ 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),
|
|
(sc->power_level * 2),
|
|
- ieee80211_get_tx_rate(sc->hw, info)->hw_value,
|
|
|
|
|
|
+ hw_rate,
|
|
info->control.rates[0].count, keyidx, 0, flags, 0, 0);
|
|
info->control.rates[0].count, keyidx, 0, flags, 0, 0);
|
|
if (ret)
|
|
if (ret)
|
|
goto err_unmap;
|
|
goto err_unmap;
|