rt2x00: Hardcode TX ack timeout and consume time
authorIvo van Doorn <ivdoorn@gmail.com>
Sun, 6 Sep 2009 13:14:23 +0000 (15:14 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 9 Sep 2009 15:18:14 +0000 (11:18 -0400)
The calculated values for the ACK timeout and ACK
consume time are different then the values as
used by the Legacy drivers.

After testing from James Ledwith it appeared that
the calculated values caused a high amount of TX
failures, and the values from the Legacy drivers
were the most optimal to prevent TX failure due to
excessive retries.

The symptoms of this problem:
 - Rate control module always falls back to 1Mbs
 - Low throughput when bitrate was fixed

Possible side-effects (not confirmed but highly likely)
 - Problems with DHCP
 - Broken connections due to lack of probe response

This should fix at least:
Kernel bugzilla reports: [13362], [13009], [9273]
Fedora bugzilla reports: [443203]
but possible some additional bugs as well.

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/rt2x00/rt2400pci.c
drivers/net/wireless/rt2x00/rt2500pci.c
drivers/net/wireless/rt2x00/rt2500usb.c
drivers/net/wireless/rt2x00/rt2800usb.c
drivers/net/wireless/rt2x00/rt2x00.h
drivers/net/wireless/rt2x00/rt2x00config.c
drivers/net/wireless/rt2x00/rt61pci.c
drivers/net/wireless/rt2x00/rt73usb.c

index 164df93..798f625 100644 (file)
@@ -331,9 +331,8 @@ static void rt2400pci_config_erp(struct rt2x00_dev *rt2x00dev,
        preamble_mask = erp->short_preamble << 3;
 
        rt2x00pci_register_read(rt2x00dev, TXCSR1, &reg);
-       rt2x00_set_field32(&reg, TXCSR1_ACK_TIMEOUT, erp->ack_timeout);
-       rt2x00_set_field32(&reg, TXCSR1_ACK_CONSUME_TIME,
-                          erp->ack_consume_time);
+       rt2x00_set_field32(&reg, TXCSR1_ACK_TIMEOUT, 0x1ff);
+       rt2x00_set_field32(&reg, TXCSR1_ACK_CONSUME_TIME, 0x13a);
        rt2x00_set_field32(&reg, TXCSR1_TSF_OFFSET, IEEE80211_HEADER);
        rt2x00_set_field32(&reg, TXCSR1_AUTORESPONDER, 1);
        rt2x00pci_register_write(rt2x00dev, TXCSR1, reg);
index 4186582..2e872ac 100644 (file)
@@ -337,9 +337,8 @@ static void rt2500pci_config_erp(struct rt2x00_dev *rt2x00dev,
        preamble_mask = erp->short_preamble << 3;
 
        rt2x00pci_register_read(rt2x00dev, TXCSR1, &reg);
-       rt2x00_set_field32(&reg, TXCSR1_ACK_TIMEOUT, erp->ack_timeout);
-       rt2x00_set_field32(&reg, TXCSR1_ACK_CONSUME_TIME,
-                          erp->ack_consume_time);
+       rt2x00_set_field32(&reg, TXCSR1_ACK_TIMEOUT, 0x162);
+       rt2x00_set_field32(&reg, TXCSR1_ACK_CONSUME_TIME, 0xa2);
        rt2x00_set_field32(&reg, TXCSR1_TSF_OFFSET, IEEE80211_HEADER);
        rt2x00_set_field32(&reg, TXCSR1_AUTORESPONDER, 1);
        rt2x00pci_register_write(rt2x00dev, TXCSR1, reg);
index b04f59b..22dd6d9 100644 (file)
@@ -488,10 +488,6 @@ static void rt2500usb_config_erp(struct rt2x00_dev *rt2x00dev,
 {
        u16 reg;
 
-       rt2500usb_register_read(rt2x00dev, TXRX_CSR1, &reg);
-       rt2x00_set_field16(&reg, TXRX_CSR1_ACK_TIMEOUT, erp->ack_timeout);
-       rt2500usb_register_write(rt2x00dev, TXRX_CSR1, reg);
-
        rt2500usb_register_read(rt2x00dev, TXRX_CSR10, &reg);
        rt2x00_set_field16(&reg, TXRX_CSR10_AUTORESPOND_PREAMBLE,
                           !!erp->short_preamble);
index 639dc6c..a084077 100644 (file)
@@ -580,8 +580,7 @@ static void rt2800usb_config_erp(struct rt2x00_dev *rt2x00dev,
        u32 reg;
 
        rt2x00usb_register_read(rt2x00dev, TX_TIMEOUT_CFG, &reg);
-       rt2x00_set_field32(&reg, TX_TIMEOUT_CFG_RX_ACK_TIMEOUT,
-                          DIV_ROUND_UP(erp->ack_timeout, erp->slot_time));
+       rt2x00_set_field32(&reg, TX_TIMEOUT_CFG_RX_ACK_TIMEOUT, 0x20);
        rt2x00usb_register_write(rt2x00dev, TX_TIMEOUT_CFG, reg);
 
        rt2x00usb_register_read(rt2x00dev, AUTO_RSP_CFG, &reg);
index 555a777..27bc6b7 100644 (file)
@@ -417,9 +417,6 @@ struct rt2x00lib_erp {
        int short_preamble;
        int cts_protection;
 
-       int ack_timeout;
-       int ack_consume_time;
-
        u32 basic_rates;
 
        int slot_time;
index 3501788..40a201e 100644 (file)
@@ -94,17 +94,6 @@ void rt2x00lib_config_erp(struct rt2x00_dev *rt2x00dev,
        erp.difs = bss_conf->use_short_slot ? SHORT_DIFS : DIFS;
        erp.eifs = bss_conf->use_short_slot ? SHORT_EIFS : EIFS;
 
-       erp.ack_timeout = PLCP + erp.difs + GET_DURATION(ACK_SIZE, 10);
-       erp.ack_consume_time = SIFS + PLCP + GET_DURATION(ACK_SIZE, 10);
-
-       if (bss_conf->use_short_preamble) {
-               erp.ack_timeout += SHORT_PREAMBLE;
-               erp.ack_consume_time += SHORT_PREAMBLE;
-       } else {
-               erp.ack_timeout += PREAMBLE;
-               erp.ack_consume_time += PREAMBLE;
-       }
-
        erp.basic_rates = bss_conf->basic_rates;
        erp.beacon_int = bss_conf->beacon_int;
 
index f4b4b86..b20e3ea 100644 (file)
@@ -598,7 +598,7 @@ static void rt61pci_config_erp(struct rt2x00_dev *rt2x00dev,
        u32 reg;
 
        rt2x00pci_register_read(rt2x00dev, TXRX_CSR0, &reg);
-       rt2x00_set_field32(&reg, TXRX_CSR0_RX_ACK_TIMEOUT, erp->ack_timeout);
+       rt2x00_set_field32(&reg, TXRX_CSR0_RX_ACK_TIMEOUT, 0x32);
        rt2x00_set_field32(&reg, TXRX_CSR0_TSF_OFFSET, IEEE80211_HEADER);
        rt2x00pci_register_write(rt2x00dev, TXRX_CSR0, reg);
 
index 90e1172..1cbd9b4 100644 (file)
@@ -561,7 +561,7 @@ static void rt73usb_config_erp(struct rt2x00_dev *rt2x00dev,
        u32 reg;
 
        rt2x00usb_register_read(rt2x00dev, TXRX_CSR0, &reg);
-       rt2x00_set_field32(&reg, TXRX_CSR0_RX_ACK_TIMEOUT, erp->ack_timeout);
+       rt2x00_set_field32(&reg, TXRX_CSR0_RX_ACK_TIMEOUT, 0x32);
        rt2x00_set_field32(&reg, TXRX_CSR0_TSF_OFFSET, IEEE80211_HEADER);
        rt2x00usb_register_write(rt2x00dev, TXRX_CSR0, reg);