rtl8xxxu: Set the correct TX descriptor bits for agg and break on 8723b
authorJes Sorensen <Jes.Sorensen@redhat.com>
Mon, 29 Feb 2016 22:05:31 +0000 (17:05 -0500)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 10 Mar 2016 13:29:16 +0000 (15:29 +0200)
Fixup victim of the relocated bits for AGG_ENABLE/AGG_BREAK in the 40
byte TX descriptor

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c

index 4cff2c94c88fe2f905cb8ebdc34d353bf9a14ed0..dd9addf7badfaf020af41aca4b70cfa93568343c 100644 (file)
@@ -6953,6 +6953,7 @@ static void rtl8xxxu_tx(struct ieee80211_hw *hw,
        u16 rate_flag = tx_info->control.rates[0].flags;
        int tx_desc_size = priv->fops->tx_desc_size;
        int ret;
+       bool txdesc40, ampdu_enable;
 
        if (skb_headroom(skb) < tx_desc_size) {
                dev_warn(dev,
@@ -6980,6 +6981,7 @@ static void rtl8xxxu_tx(struct ieee80211_hw *hw,
        if (ieee80211_is_action(hdr->frame_control))
                rtl8xxxu_dump_action(dev, hdr);
 
+       txdesc40 = (tx_desc_size == 40);
        tx_info->rate_driver_data[0] = hw;
 
        if (control && control->sta)
@@ -7028,6 +7030,7 @@ static void rtl8xxxu_tx(struct ieee80211_hw *hw,
                tx_desc->txdw5 |= cpu_to_le32(0x0001ff00);
 
        /* (tx_info->flags & IEEE80211_TX_CTL_AMPDU) && */
+       ampdu_enable = false;
        if (ieee80211_is_data_qos(hdr->frame_control) && sta) {
                if (sta->ht_cap.ht_supported) {
                        u32 ampdu, val32;
@@ -7036,11 +7039,21 @@ static void rtl8xxxu_tx(struct ieee80211_hw *hw,
                        val32 = ampdu << TXDESC_AMPDU_DENSITY_SHIFT;
                        tx_desc->txdw2 |= cpu_to_le32(val32);
 
+                       ampdu_enable = true;
+               }
+       }
+
+       if (!txdesc40) {
+               if (ampdu_enable)
                        tx_desc->txdw1 |= cpu_to_le32(TXDESC_AGG_ENABLE_8723A);
-               else
+               else
                        tx_desc->txdw1 |= cpu_to_le32(TXDESC_AGG_BREAK_8723A);
-       } else
-               tx_desc->txdw1 |= cpu_to_le32(TXDESC_AGG_BREAK_8723A);
+       } else {
+               if (ampdu_enable)
+                       tx_desc->txdw2 |= cpu_to_le32(TXDESC_AGG_ENABLE_8723B);
+               else
+                       tx_desc->txdw2 |= cpu_to_le32(TXDESC_AGG_BREAK_8723B);
+       };
 
        if (ieee80211_is_data_qos(hdr->frame_control))
                tx_desc->txdw4 |= cpu_to_le32(TXDESC_QOS);