|
@@ -35,6 +35,7 @@ void rt2x00ht_create_tx_descriptor(struct queue_entry *entry,
|
|
|
{
|
|
|
struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(entry->skb);
|
|
|
struct ieee80211_tx_rate *txrate = &tx_info->control.rates[0];
|
|
|
+ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)entry->skb->data;
|
|
|
|
|
|
if (tx_info->control.sta)
|
|
|
txdesc->mpdu_density =
|
|
@@ -66,4 +67,20 @@ void rt2x00ht_create_tx_descriptor(struct queue_entry *entry,
|
|
|
__set_bit(ENTRY_TXD_HT_BW_40, &txdesc->flags);
|
|
|
if (txrate->flags & IEEE80211_TX_RC_SHORT_GI)
|
|
|
__set_bit(ENTRY_TXD_HT_SHORT_GI, &txdesc->flags);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Determine IFS values
|
|
|
+ * - Use TXOP_BACKOFF for management frames
|
|
|
+ * - Use TXOP_SIFS for fragment bursts
|
|
|
+ * - Use TXOP_HTTXOP for everything else
|
|
|
+ *
|
|
|
+ * Note: rt2800 devices won't use CTS protection (if used)
|
|
|
+ * for frames not transmitted with TXOP_HTTXOP
|
|
|
+ */
|
|
|
+ if (ieee80211_is_mgmt(hdr->frame_control))
|
|
|
+ txdesc->txop = TXOP_BACKOFF;
|
|
|
+ else if (!(tx_info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT))
|
|
|
+ txdesc->txop = TXOP_SIFS;
|
|
|
+ else
|
|
|
+ txdesc->txop = TXOP_HTTXOP;
|
|
|
}
|