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 164df9347a2f9762367889495dacf1378bd8e95c..798f625e38f70a718a70c21027d9f9aab1ac36d5 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 4186582f2770df1cc6e1ee98a947973d169c3d7b..2e872ac6982673018733f66654afccb7cdf6bf69 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 b04f59bab3b06a2dd81f78f3dc84ff3af79ff2b4..22dd6d9e29812b60d4326ff5324e4e8dd1a2ffb7 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 639dc6cc04b98f0c038e99c88c8a79653e1e2498..a084077a1c6115942a27caa9c9cf8b261fbf4115 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 555a777db6df1ed6a795a790fb25edf822bd6f0a..27bc6b7fbfdeffb6d610f4c4a3a5a2de294f0c99 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 3501788ab4982915998e9cac8326d6e84d8c02f7..40a201e2e1510c125b62c36cb0258db38ecd8b43 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 f4b4b86da4da5b1e7f8935982b4731ac99bc1685..b20e3eac9d67da909c4ea59ecac586fa9af0974f 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 90e11726305128c60208306a1490c1b097685f0c..1cbd9b4a3efc9c560784280e7c76f6160be00161 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);