summaryrefslogtreecommitdiffstats
path: root/package/mac80211/patches/318-rt2x00-conf_tx-only-need-register-access-for-WMM.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/mac80211/patches/318-rt2x00-conf_tx-only-need-register-access-for-WMM.patch')
-rw-r--r--package/mac80211/patches/318-rt2x00-conf_tx-only-need-register-access-for-WMM.patch116
1 files changed, 116 insertions, 0 deletions
diff --git a/package/mac80211/patches/318-rt2x00-conf_tx-only-need-register-access-for-WMM.patch b/package/mac80211/patches/318-rt2x00-conf_tx-only-need-register-access-for-WMM.patch
new file mode 100644
index 000000000..c45416518
--- /dev/null
+++ b/package/mac80211/patches/318-rt2x00-conf_tx-only-need-register-access-for-WMM.patch
@@ -0,0 +1,116 @@
+From bbb27190d504b453625d1a663124b2b1cec0fe8b Mon Sep 17 00:00:00 2001
+From: Ivo van Doorn <IvDoorn@gmail.com>
+Date: Sat, 17 Jan 2009 20:25:27 +0100
+Subject: [PATCH] rt2x00: conf_tx() only need register access for WMM queues
+
+conf_tx() in rt61pci and rt73usb only have to check once
+if the queue_idx indicates a non-WMM queue and break of
+the function immediately if that is the case.
+
+Only the WMM queues need to have the TX configuration written
+to the registers.
+
+Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
+---
+ drivers/net/wireless/rt2x00/rt61pci.c | 30 +++++++++++++++---------------
+ drivers/net/wireless/rt2x00/rt73usb.c | 30 +++++++++++++++---------------
+ 2 files changed, 30 insertions(+), 30 deletions(-)
+
+--- a/drivers/net/wireless/rt2x00/rt61pci.c
++++ b/drivers/net/wireless/rt2x00/rt61pci.c
+@@ -2657,6 +2657,7 @@ static int rt61pci_conf_tx(struct ieee80
+ struct rt2x00_field32 field;
+ int retval;
+ u32 reg;
++ u32 offset;
+
+ /*
+ * First pass the configuration through rt2x00lib, that will
+@@ -2668,24 +2669,23 @@ static int rt61pci_conf_tx(struct ieee80
+ if (retval)
+ return retval;
+
++ /*
++ * We only need to perform additional register initialization
++ * for WMM queues/
++ */
++ if (queue_idx >= 4)
++ return 0;
++
+ queue = rt2x00queue_get_queue(rt2x00dev, queue_idx);
+
+ /* Update WMM TXOP register */
+- if (queue_idx < 2) {
+- field.bit_offset = queue_idx * 16;
+- field.bit_mask = 0xffff << field.bit_offset;
+-
+- rt2x00pci_register_read(rt2x00dev, AC_TXOP_CSR0, &reg);
+- rt2x00_set_field32(&reg, field, queue->txop);
+- rt2x00pci_register_write(rt2x00dev, AC_TXOP_CSR0, reg);
+- } else if (queue_idx < 4) {
+- field.bit_offset = (queue_idx - 2) * 16;
+- field.bit_mask = 0xffff << field.bit_offset;
+-
+- rt2x00pci_register_read(rt2x00dev, AC_TXOP_CSR1, &reg);
+- rt2x00_set_field32(&reg, field, queue->txop);
+- rt2x00pci_register_write(rt2x00dev, AC_TXOP_CSR1, reg);
+- }
++ offset = AC_TXOP_CSR0 + (sizeof(u32) * (!!(queue_idx & 2)));
++ field.bit_offset = (queue_idx & 1) * 16;
++ field.bit_mask = 0xffff << field.bit_offset;
++
++ rt2x00pci_register_read(rt2x00dev, offset, &reg);
++ rt2x00_set_field32(&reg, field, queue->txop);
++ rt2x00pci_register_write(rt2x00dev, offset, reg);
+
+ /* Update WMM registers */
+ field.bit_offset = queue_idx * 4;
+--- a/drivers/net/wireless/rt2x00/rt73usb.c
++++ b/drivers/net/wireless/rt2x00/rt73usb.c
+@@ -2180,6 +2180,7 @@ static int rt73usb_conf_tx(struct ieee80
+ struct rt2x00_field32 field;
+ int retval;
+ u32 reg;
++ u32 offset;
+
+ /*
+ * First pass the configuration through rt2x00lib, that will
+@@ -2191,24 +2192,23 @@ static int rt73usb_conf_tx(struct ieee80
+ if (retval)
+ return retval;
+
++ /*
++ * We only need to perform additional register initialization
++ * for WMM queues/
++ */
++ if (queue_idx >= 4)
++ return 0;
++
+ queue = rt2x00queue_get_queue(rt2x00dev, queue_idx);
+
+ /* Update WMM TXOP register */
+- if (queue_idx < 2) {
+- field.bit_offset = queue_idx * 16;
+- field.bit_mask = 0xffff << field.bit_offset;
+-
+- rt2x00usb_register_read(rt2x00dev, AC_TXOP_CSR0, &reg);
+- rt2x00_set_field32(&reg, field, queue->txop);
+- rt2x00usb_register_write(rt2x00dev, AC_TXOP_CSR0, reg);
+- } else if (queue_idx < 4) {
+- field.bit_offset = (queue_idx - 2) * 16;
+- field.bit_mask = 0xffff << field.bit_offset;
+-
+- rt2x00usb_register_read(rt2x00dev, AC_TXOP_CSR1, &reg);
+- rt2x00_set_field32(&reg, field, queue->txop);
+- rt2x00usb_register_write(rt2x00dev, AC_TXOP_CSR1, reg);
+- }
++ offset = AC_TXOP_CSR0 + (sizeof(u32) * (!!(queue_idx & 2)));
++ field.bit_offset = (queue_idx & 1) * 16;
++ field.bit_mask = 0xffff << field.bit_offset;
++
++ rt2x00usb_register_read(rt2x00dev, offset, &reg);
++ rt2x00_set_field32(&reg, field, queue->txop);
++ rt2x00usb_register_write(rt2x00dev, offset, reg);
+
+ /* Update WMM registers */
+ field.bit_offset = queue_idx * 4;