mirror of https://gitee.com/openkylin/linux.git
rt2x00: rt2800: use correct txop value in tx descriptor
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>
This commit is contained in:
parent
cbd1ea87a1
commit
1affa09197
|
@ -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));
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue