mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-11-01 17:08:10 +00:00
rt2x00: Hardcode TX ack timeout and consume time
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>
This commit is contained in:
parent
fd413da852
commit
4789666e13
8 changed files with 7 additions and 28 deletions
|
@ -331,9 +331,8 @@ static void rt2400pci_config_erp(struct rt2x00_dev *rt2x00dev,
|
|||
preamble_mask = erp->short_preamble << 3;
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR1, ®);
|
||||
rt2x00_set_field32(®, TXCSR1_ACK_TIMEOUT, erp->ack_timeout);
|
||||
rt2x00_set_field32(®, TXCSR1_ACK_CONSUME_TIME,
|
||||
erp->ack_consume_time);
|
||||
rt2x00_set_field32(®, TXCSR1_ACK_TIMEOUT, 0x1ff);
|
||||
rt2x00_set_field32(®, TXCSR1_ACK_CONSUME_TIME, 0x13a);
|
||||
rt2x00_set_field32(®, TXCSR1_TSF_OFFSET, IEEE80211_HEADER);
|
||||
rt2x00_set_field32(®, TXCSR1_AUTORESPONDER, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR1, reg);
|
||||
|
|
|
@ -337,9 +337,8 @@ static void rt2500pci_config_erp(struct rt2x00_dev *rt2x00dev,
|
|||
preamble_mask = erp->short_preamble << 3;
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, TXCSR1, ®);
|
||||
rt2x00_set_field32(®, TXCSR1_ACK_TIMEOUT, erp->ack_timeout);
|
||||
rt2x00_set_field32(®, TXCSR1_ACK_CONSUME_TIME,
|
||||
erp->ack_consume_time);
|
||||
rt2x00_set_field32(®, TXCSR1_ACK_TIMEOUT, 0x162);
|
||||
rt2x00_set_field32(®, TXCSR1_ACK_CONSUME_TIME, 0xa2);
|
||||
rt2x00_set_field32(®, TXCSR1_TSF_OFFSET, IEEE80211_HEADER);
|
||||
rt2x00_set_field32(®, TXCSR1_AUTORESPONDER, 1);
|
||||
rt2x00pci_register_write(rt2x00dev, TXCSR1, reg);
|
||||
|
|
|
@ -488,10 +488,6 @@ static void rt2500usb_config_erp(struct rt2x00_dev *rt2x00dev,
|
|||
{
|
||||
u16 reg;
|
||||
|
||||
rt2500usb_register_read(rt2x00dev, TXRX_CSR1, ®);
|
||||
rt2x00_set_field16(®, TXRX_CSR1_ACK_TIMEOUT, erp->ack_timeout);
|
||||
rt2500usb_register_write(rt2x00dev, TXRX_CSR1, reg);
|
||||
|
||||
rt2500usb_register_read(rt2x00dev, TXRX_CSR10, ®);
|
||||
rt2x00_set_field16(®, TXRX_CSR10_AUTORESPOND_PREAMBLE,
|
||||
!!erp->short_preamble);
|
||||
|
|
|
@ -580,8 +580,7 @@ static void rt2800usb_config_erp(struct rt2x00_dev *rt2x00dev,
|
|||
u32 reg;
|
||||
|
||||
rt2x00usb_register_read(rt2x00dev, TX_TIMEOUT_CFG, ®);
|
||||
rt2x00_set_field32(®, TX_TIMEOUT_CFG_RX_ACK_TIMEOUT,
|
||||
DIV_ROUND_UP(erp->ack_timeout, erp->slot_time));
|
||||
rt2x00_set_field32(®, TX_TIMEOUT_CFG_RX_ACK_TIMEOUT, 0x20);
|
||||
rt2x00usb_register_write(rt2x00dev, TX_TIMEOUT_CFG, reg);
|
||||
|
||||
rt2x00usb_register_read(rt2x00dev, AUTO_RSP_CFG, ®);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -598,7 +598,7 @@ static void rt61pci_config_erp(struct rt2x00_dev *rt2x00dev,
|
|||
u32 reg;
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, TXRX_CSR0, ®);
|
||||
rt2x00_set_field32(®, TXRX_CSR0_RX_ACK_TIMEOUT, erp->ack_timeout);
|
||||
rt2x00_set_field32(®, TXRX_CSR0_RX_ACK_TIMEOUT, 0x32);
|
||||
rt2x00_set_field32(®, TXRX_CSR0_TSF_OFFSET, IEEE80211_HEADER);
|
||||
rt2x00pci_register_write(rt2x00dev, TXRX_CSR0, reg);
|
||||
|
||||
|
|
|
@ -561,7 +561,7 @@ static void rt73usb_config_erp(struct rt2x00_dev *rt2x00dev,
|
|||
u32 reg;
|
||||
|
||||
rt2x00usb_register_read(rt2x00dev, TXRX_CSR0, ®);
|
||||
rt2x00_set_field32(®, TXRX_CSR0_RX_ACK_TIMEOUT, erp->ack_timeout);
|
||||
rt2x00_set_field32(®, TXRX_CSR0_RX_ACK_TIMEOUT, 0x32);
|
||||
rt2x00_set_field32(®, TXRX_CSR0_TSF_OFFSET, IEEE80211_HEADER);
|
||||
rt2x00usb_register_write(rt2x00dev, TXRX_CSR0, reg);
|
||||
|
||||
|
|
Loading…
Reference in a new issue