rt2x00: rt2800: use correct txop value in tx descriptor
authorHelmut Schaa <helmut.schaa@googlemail.com>
Fri, 7 May 2010 09:03:08 +0000 (11:03 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 7 May 2010 18:57:21 +0000 (14:57 -0400)
rt2800 devices use a different enumeration to specify what IFS values should
be used on frame transmission compared to the other rt2x00 devices. Hence,
create a new enum called txop that contains the valid values.

Furthermore use the appropriate txop values as found in the ralink drivers:
- TXOP_BACKOFF for management frames
- TXOP_SIFS for subsequent fragments in a burst
- TXOP_HTTXOP for all data frames

Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
Acked-by: Ivo van Doorn <IvDoorn@gmail.com>
Acked-by: Gertjan van Wingerde <gwingerde@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/rt2x00/rt2800pci.c
drivers/net/wireless/rt2x00/rt2800usb.c
drivers/net/wireless/rt2x00/rt2x00ht.c
drivers/net/wireless/rt2x00/rt2x00queue.h
drivers/net/wireless/rt2x00/rt2x00reg.h

index f08b6a37bf2d143556ab1a7ec2467100bb736049..df2c3fb8b4b69f7185762b5b4aa594f37e581364 100644 (file)
@@ -643,7 +643,7 @@ static int rt2800pci_write_tx_data(struct queue_entry* entry,
        rt2x00_set_field32(&word, TXWI_W0_AMPDU,
                           test_bit(ENTRY_TXD_HT_AMPDU, &txdesc->flags));
        rt2x00_set_field32(&word, TXWI_W0_MPDU_DENSITY, txdesc->mpdu_density);
-       rt2x00_set_field32(&word, TXWI_W0_TX_OP, txdesc->ifs);
+       rt2x00_set_field32(&word, TXWI_W0_TX_OP, txdesc->txop);
        rt2x00_set_field32(&word, TXWI_W0_MCS, txdesc->mcs);
        rt2x00_set_field32(&word, TXWI_W0_BW,
                           test_bit(ENTRY_TXD_HT_BW_40, &txdesc->flags));
index 67f8234f24d0612b560e30b03d68caaf745a77e8..94b68127811edbf1c1089010f9d13b41cfe6739f 100644 (file)
@@ -417,7 +417,7 @@ static void rt2800usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
        rt2x00_set_field32(&word, TXWI_W0_AMPDU,
                           test_bit(ENTRY_TXD_HT_AMPDU, &txdesc->flags));
        rt2x00_set_field32(&word, TXWI_W0_MPDU_DENSITY, txdesc->mpdu_density);
-       rt2x00_set_field32(&word, TXWI_W0_TX_OP, txdesc->ifs);
+       rt2x00_set_field32(&word, TXWI_W0_TX_OP, txdesc->txop);
        rt2x00_set_field32(&word, TXWI_W0_MCS, txdesc->mcs);
        rt2x00_set_field32(&word, TXWI_W0_BW,
                           test_bit(ENTRY_TXD_HT_BW_40, &txdesc->flags));
index 1056c92143a80dcc5a3e175efab36564d28517fa..5a407602ce3e2da54bae581765e89a7842fe8935 100644 (file)
@@ -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;
 }
index 94a48c174d6790e8000c5d4406efb3ffd9b0ea4e..36a957adc1f98fbe74609afd9328c3b594f9c095 100644 (file)
@@ -299,6 +299,7 @@ enum txentry_desc_flags {
  * @retry_limit: Max number of retries.
  * @aifs: AIFS value.
  * @ifs: IFS value.
+ * @txop: IFS value for 11n capable chips.
  * @cw_min: cwmin value.
  * @cw_max: cwmax value.
  * @cipher: Cipher type used for encryption.
@@ -328,6 +329,7 @@ struct txentry_desc {
        short retry_limit;
        short aifs;
        short ifs;
+       short txop;
        short cw_min;
        short cw_max;
 
index 603bfc0adaa3484012e8b0c1b63ad1840ee8d1b6..b9fe94873ee00ddee8389b9bbdb041104e43686b 100644 (file)
@@ -100,6 +100,16 @@ enum ifs {
        IFS_NONE = 3,
 };
 
+/*
+ * IFS backoff values for HT devices
+ */
+enum txop {
+       TXOP_HTTXOP = 0,
+       TXOP_PIFS = 1,
+       TXOP_SIFS = 2,
+       TXOP_BACKOFF = 3,
+};
+
 /*
  * Cipher types for hardware encryption
  */