Send users mailing list submissions to
[email protected]
To subscribe or unsubscribe via the World Wide Web, visit
http://rt2x00.serialmonkey.com/mailman/listinfo/users_rt2x00.serialmonkey.com
or, via email, send a message with subject or body 'help' to
[email protected]
You can reach the person managing the list at
[email protected]
When replying, please edit your Subject line so it is more specific
than "Re: Contents of users digest..."
Today's Topics:
1. Re: regression: Error - Dropping frame due to full tx queue
(Stanislaw Gruszka)
2. Re: regression: Error - Dropping frame due to full tx queue
(Alexey Kuznetsov)
3. Re: regression: Error - Dropping frame due to full tx queue
(Gertjan van Wingerde)
4. Re: regression: Error - Dropping frame due to full tx queue
(Stanislaw Gruszka)
5. Re: regression: Error - Dropping frame due to full tx queue
(Alexey Kuznetsov)
6. [RFC/RFT v2] rt2x00: change queues mapping (Stanislaw Gruszka)
----------------------------------------------------------------------
Message: 1
Date: Tue, 1 Oct 2013 09:40:24 +0200
From: Stanislaw Gruszka <[email protected]>
To: Alexey Kuznetsov <[email protected]>
Cc: rt2x00 Users List <[email protected]>
Subject: Re: [rt2x00-users] regression: Error - Dropping frame due to
full tx queue
Message-ID: <[email protected]>
Content-Type: text/plain; charset=us-ascii
On Mon, Sep 30, 2013 at 11:58:39PM +0400, Alexey Kuznetsov wrote:
> It is been fixed here:
>
> http://rt2x00.serialmonkey.com/pipermail/users_rt2x00.serialmonkey.com/2011-June/003932.html
>
> Can't tell kernel version though.
This patch was included in 3.1 . I don't really think that you are
using such old kernel i.e. older than 3.1, but rather hit different
problem on current kernels that manifest itself similarly. But if
you have such ancient kernel, just update it.
Stanislaw
------------------------------
Message: 2
Date: Tue, 1 Oct 2013 11:43:09 +0400
From: Alexey Kuznetsov <[email protected]>
To: Stanislaw Gruszka <[email protected]>
Cc: rt2x00 Users List <[email protected]>
Subject: Re: [rt2x00-users] regression: Error - Dropping frame due to
full tx queue
Message-ID:
<CAO1Zr+pxiJ2gT4Gs3pYw5Ch4vkZtbsD1k=O=vw5vtivrdyk...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"
As you can see here
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/855239 reporter
describes exactly the same behaviour which has been fixed and been
discovered again by me in 3.10 kernel. So that is why I called it
regression (same issue come back later)
-- AK
On 1 October 2013 11:40, Stanislaw Gruszka <[email protected]> wrote:
> On Mon, Sep 30, 2013 at 11:58:39PM +0400, Alexey Kuznetsov wrote:
> > It is been fixed here:
> >
> >
> http://rt2x00.serialmonkey.com/pipermail/users_rt2x00.serialmonkey.com/2011-June/003932.html
> >
> > Can't tell kernel version though.
>
> This patch was included in 3.1 . I don't really think that you are
> using such old kernel i.e. older than 3.1, but rather hit different
> problem on current kernels that manifest itself similarly. But if
> you have such ancient kernel, just update it.
>
> Stanislaw
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://rt2x00.serialmonkey.com/pipermail/users_rt2x00.serialmonkey.com/attachments/20131001/835c7629/attachment-0001.html>
------------------------------
Message: 3
Date: Tue, 1 Oct 2013 09:58:36 +0200
From: Gertjan van Wingerde <[email protected]>
To: Alexey Kuznetsov <[email protected]>
Cc: rt2x00 Users List <[email protected]>
Subject: Re: [rt2x00-users] regression: Error - Dropping frame due to
full tx queue
Message-ID:
<CAL1gcdNP3pPkOP2sFaUFgT7ET8kT+HnLW+aYnt0dA=2wqcq...@mail.gmail.com>
Content-Type: text/plain; charset=ISO-8859-1
On Tue, Oct 1, 2013 at 9:43 AM, Alexey Kuznetsov
<[email protected]> wrote:
> On 1 October 2013 11:40, Stanislaw Gruszka <[email protected]> wrote:
>>
>> On Mon, Sep 30, 2013 at 11:58:39PM +0400, Alexey Kuznetsov wrote:
>> > It is been fixed here:
>> >
>> >
>> > http://rt2x00.serialmonkey.com/pipermail/users_rt2x00.serialmonkey.com/2011-June/003932.html
>> >
>> > Can't tell kernel version though.
>>
>> This patch was included in 3.1 . I don't really think that you are
>> using such old kernel i.e. older than 3.1, but rather hit different
>> problem on current kernels that manifest itself similarly. But if
>> you have such ancient kernel, just update it.
>
> As you can see here
> https://bugs.launchpad.net/ubuntu/+source/linux/+bug/855239 reporter
> describes exactly the same behaviour which has been fixed and been
> discovered again by me in 3.10 kernel. So that is why I called it regression
> (same issue come back later)
>
Alexey,
Unfortunately the symptom that you repot can happen for more reasons
than just the
one that my patch of over 2 years ago fixes. So, it is entirely
possible that there
is a completely different cause here than the locking issue that was
fixed by the patch
you mention.
---
Gertjan
------------------------------
Message: 4
Date: Tue, 1 Oct 2013 10:00:52 +0200
From: Stanislaw Gruszka <[email protected]>
To: Alexey Kuznetsov <[email protected]>
Cc: rt2x00 Users List <[email protected]>
Subject: Re: [rt2x00-users] regression: Error - Dropping frame due to
full tx queue
Message-ID: <[email protected]>
Content-Type: text/plain; charset=us-ascii
A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?
A: Top-posting.
Q: What is the most annoying thing in e-mail?
On Tue, Oct 01, 2013 at 11:43:09AM +0400, Alexey Kuznetsov wrote:
> As you can see here
> https://bugs.launchpad.net/ubuntu/+source/linux/+bug/855239 reporter
> describes exactly the same behaviour which has been fixed and been
> discovered again by me in 3.10 kernel. So that is why I called it
> regression (same issue come back later)
Ok. I think you hit different problem. Can I assume that 3.9 worked
well for you and things start to broke on 3.10 ?
I think queue stuck happen, because some change cause we stop get TX
statuses from hardware. Would be good to bisect that, but at least
providing regression window will be well hint for trace this down.
Stanislaw
------------------------------
Message: 5
Date: Tue, 1 Oct 2013 12:23:15 +0400
From: Alexey Kuznetsov <[email protected]>
To: Stanislaw Gruszka <[email protected]>
Cc: rt2x00 Users List <[email protected]>
Subject: Re: [rt2x00-users] regression: Error - Dropping frame due to
full tx queue
Message-ID:
<cao1zr+o_rhyastanbnckduoj9c0sy0sekvxn-de7h9edjg4...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"
On 1 October 2013 12:00, Stanislaw Gruszka <[email protected]> wrote:
> A: Because it messes up the order in which people normally read text.
> Q: Why is top-posting such a bad thing?
> A: Top-posting.
> Q: What is the most annoying thing in e-mail?
>
Ok. Got it. Sorry. That is what google does.
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://rt2x00.serialmonkey.com/pipermail/users_rt2x00.serialmonkey.com/attachments/20131001/35cf3480/attachment-0001.html>
------------------------------
Message: 6
Date: Tue, 1 Oct 2013 16:39:49 +0200
From: Stanislaw Gruszka <[email protected]>
To: [email protected]
Subject: [rt2x00-users] [RFC/RFT v2] rt2x00: change queues mapping
Message-ID: <[email protected]>
Content-Type: text/plain; charset=us-ascii
Vendor driver use different numbers for AC (access categories) than we
do. Using different numbers by us should be fine as long those numbers
are not somehow hardcoded in the hardware or firmware. This patch change
mapping between mac IEEE80211_AC_* and QID_AC_*, using vif->hw_queue[ac]
facility, to make QID_AC_* numbers match vendor driver. Perhaps this
helps somehow to make driver perform better, at worse patch should not
make visible changes in driver work.
I tested with below script on RT3070 & RT5390. Did not test on older
devices.
#!/bin/bash
ping -c 100001 -f -Q 244 192.168.1.1 &
ping -c 100000 -f 192.168.1.1 &
Results are as follow:
* RT3070, USB, PS disabled
With patch:
100001 packets transmitted, 99997 received, 0% packet loss, time 85750ms
rtt min/avg/max/mdev = 0.436/0.827/240.091/2.808 ms., pipe 17, ipg/ewma
0.857/0.860 ms
100000 packets transmitted, 100000 received, 0% packet loss, time 87844ms
rtt min/avg/max/mdev = 0.446/0.875/279.422/3.886 ms, pipe 19, ipg/ewma
0.878/0.610 ms
Without patch:
100001 packets transmitted, 99999 received, 0% packet loss, time 103160ms
rtt min/avg/max/mdev = 0.447/1.061/435.770/5.931 ms, pipe 29, ipg/ewma
1.031/0.818 ms
100000 packets transmitted, 99991 received, 0% packet loss, time 106810ms
rtt min/avg/max/mdev = 0.452/1.098/424.383/5.485 ms, pipe 29, ipg/ewma
1.068/0.971 ms
* RT5390, PCIe
With patch:
100001 packets transmitted, 99997 received, 0% packet loss, time 89928ms
rtt min/avg/max/mdev = 0.456/0.818/20.098/0.420 ms, pipe 2, ipg/ewma
0.899/0.819 ms
100000 packets transmitted, 100000 received, 0% packet loss, time 96841ms
rtt min/avg/max/mdev = 0.461/0.887/21.310/0.539 ms, pipe 2, ipg/ewma
0.968/0.597 ms
Without patch:
100001 packets transmitted, 100001 received, 0% packet loss, time 93869ms
rtt min/avg/max/mdev = 0.471/0.854/43.963/0.464 ms, pipe 3, ipg/ewma
0.938/0.936 ms
100000 packets transmitted, 99999 received, 0% packet loss, time 96085ms
rtt min/avg/max/mdev = 0.468/0.875/46.858/0.555 ms, pipe 4, ipg/ewma
0.960/0.567 ms
Timings are better with patch, but also there is some packet loss on
VO queue. Without patch, packet loss are on BE queue. So seems there are
still some bugs on configuring channel access times.
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c
b/drivers/net/wireless/rt2x00/rt2400pci.c
index 3d53a09..69b9d8e 100644
--- a/drivers/net/wireless/rt2x00/rt2400pci.c
+++ b/drivers/net/wireless/rt2x00/rt2400pci.c
@@ -664,12 +664,12 @@ static void rt2400pci_kick_queue(struct data_queue *queue)
u32 reg;
switch (queue->qid) {
- case QID_AC_VO:
+ case QID_AC_BE:
rt2x00mmio_register_read(rt2x00dev, TXCSR0, ®);
rt2x00_set_field32(®, TXCSR0_KICK_PRIO, 1);
rt2x00mmio_register_write(rt2x00dev, TXCSR0, reg);
break;
- case QID_AC_VI:
+ case QID_AC_BK:
rt2x00mmio_register_read(rt2x00dev, TXCSR0, ®);
rt2x00_set_field32(®, TXCSR0_KICK_TX, 1);
rt2x00mmio_register_write(rt2x00dev, TXCSR0, reg);
@@ -690,8 +690,8 @@ static void rt2400pci_stop_queue(struct data_queue *queue)
u32 reg;
switch (queue->qid) {
- case QID_AC_VO:
- case QID_AC_VI:
+ case QID_AC_BE:
+ case QID_AC_BK:
case QID_ATIM:
rt2x00mmio_register_read(rt2x00dev, TXCSR0, ®);
rt2x00_set_field32(®, TXCSR0_ABORT, 1);
@@ -1339,8 +1339,8 @@ static void rt2400pci_txstatus_tasklet(unsigned long data)
* Handle all tx queues.
*/
rt2400pci_txdone(rt2x00dev, QID_ATIM);
- rt2400pci_txdone(rt2x00dev, QID_AC_VO);
- rt2400pci_txdone(rt2x00dev, QID_AC_VI);
+ rt2400pci_txdone(rt2x00dev, QID_AC_BE);
+ rt2400pci_txdone(rt2x00dev, QID_AC_BK);
/*
* Enable all TXDONE interrupts again.
@@ -1579,11 +1579,14 @@ static int rt2400pci_probe_hw_mode(struct rt2x00_dev
*rt2x00dev)
/*
* Initialize all hw fields.
*/
- rt2x00dev->hw->flags = IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
+ rt2x00dev->hw->flags = IEEE80211_HW_QUEUE_CONTROL |
+ IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
IEEE80211_HW_SIGNAL_DBM |
IEEE80211_HW_SUPPORTS_PS |
IEEE80211_HW_PS_NULLFUNC_STACK;
+ rt2x00dev->hw->offchannel_tx_hw_queue = QID_AC_BE;
+
SET_IEEE80211_DEV(rt2x00dev->hw, rt2x00dev->dev);
SET_IEEE80211_PERM_ADDR(rt2x00dev->hw,
rt2x00_eeprom_addr(rt2x00dev,
@@ -1777,8 +1780,6 @@ static void rt2400pci_queue_init(struct data_queue *queue)
queue->priv_size = sizeof(struct queue_entry_priv_mmio);
break;
- case QID_AC_VO:
- case QID_AC_VI:
case QID_AC_BE:
case QID_AC_BK:
queue->limit = 24;
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c
b/drivers/net/wireless/rt2x00/rt2500pci.c
index 0ac5c58..9d899e6 100644
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
@@ -753,12 +753,12 @@ static void rt2500pci_kick_queue(struct data_queue *queue)
u32 reg;
switch (queue->qid) {
- case QID_AC_VO:
+ case QID_AC_BE:
rt2x00mmio_register_read(rt2x00dev, TXCSR0, ®);
rt2x00_set_field32(®, TXCSR0_KICK_PRIO, 1);
rt2x00mmio_register_write(rt2x00dev, TXCSR0, reg);
break;
- case QID_AC_VI:
+ case QID_AC_BK:
rt2x00mmio_register_read(rt2x00dev, TXCSR0, ®);
rt2x00_set_field32(®, TXCSR0_KICK_TX, 1);
rt2x00mmio_register_write(rt2x00dev, TXCSR0, reg);
@@ -779,8 +779,8 @@ static void rt2500pci_stop_queue(struct data_queue *queue)
u32 reg;
switch (queue->qid) {
- case QID_AC_VO:
- case QID_AC_VI:
+ case QID_AC_BE:
+ case QID_AC_BK:
case QID_ATIM:
rt2x00mmio_register_read(rt2x00dev, TXCSR0, ®);
rt2x00_set_field32(®, TXCSR0_ABORT, 1);
@@ -1467,8 +1467,8 @@ static void rt2500pci_txstatus_tasklet(unsigned long data)
* Handle all tx queues.
*/
rt2500pci_txdone(rt2x00dev, QID_ATIM);
- rt2500pci_txdone(rt2x00dev, QID_AC_VO);
- rt2500pci_txdone(rt2x00dev, QID_AC_VI);
+ rt2500pci_txdone(rt2x00dev, QID_AC_BE);
+ rt2500pci_txdone(rt2x00dev, QID_AC_BK);
/*
* Enable all TXDONE interrupts again.
@@ -1869,11 +1869,14 @@ static int rt2500pci_probe_hw_mode(struct rt2x00_dev
*rt2x00dev)
/*
* Initialize all hw fields.
*/
- rt2x00dev->hw->flags = IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
+ rt2x00dev->hw->flags = IEEE80211_HW_QUEUE_CONTROL |
+ IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
IEEE80211_HW_SIGNAL_DBM |
IEEE80211_HW_SUPPORTS_PS |
IEEE80211_HW_PS_NULLFUNC_STACK;
+ rt2x00dev->hw->offchannel_tx_hw_queue = QID_AC_BE;
+
SET_IEEE80211_DEV(rt2x00dev->hw, rt2x00dev->dev);
SET_IEEE80211_PERM_ADDR(rt2x00dev->hw,
rt2x00_eeprom_addr(rt2x00dev,
@@ -2066,8 +2069,6 @@ static void rt2500pci_queue_init(struct data_queue *queue)
queue->priv_size = sizeof(struct queue_entry_priv_mmio);
break;
- case QID_AC_VO:
- case QID_AC_VI:
case QID_AC_BE:
case QID_AC_BK:
queue->limit = 32;
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c
b/drivers/net/wireless/rt2x00/rt2500usb.c
index 85acc79..6ab0a15 100644
--- a/drivers/net/wireless/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/rt2x00/rt2500usb.c
@@ -1704,11 +1704,14 @@ static int rt2500usb_probe_hw_mode(struct rt2x00_dev
*rt2x00dev)
* infinitly and thus dropping it after some time.
*/
rt2x00dev->hw->flags =
+ IEEE80211_HW_QUEUE_CONTROL |
IEEE80211_HW_RX_INCLUDES_FCS |
IEEE80211_HW_SIGNAL_DBM |
IEEE80211_HW_SUPPORTS_PS |
IEEE80211_HW_PS_NULLFUNC_STACK;
+ rt2x00dev->hw->offchannel_tx_hw_queue = QID_AC_BE;
+
SET_IEEE80211_DEV(rt2x00dev->hw, rt2x00dev->dev);
SET_IEEE80211_PERM_ADDR(rt2x00dev->hw,
rt2x00_eeprom_addr(rt2x00dev,
diff --git a/drivers/net/wireless/rt2x00/rt2800.h
b/drivers/net/wireless/rt2x00/rt2800.h
index fa33b5e..78b379b 100644
--- a/drivers/net/wireless/rt2x00/rt2800.h
+++ b/drivers/net/wireless/rt2x00/rt2800.h
@@ -383,10 +383,10 @@
/*
* WMM_AIFSN_CFG: Aifsn for each EDCA AC
- * AIFSN0: AC_VO
- * AIFSN1: AC_VI
- * AIFSN2: AC_BE
- * AIFSN3: AC_BK
+ * AIFSN0: AC_BE
+ * AIFSN1: AC_BK
+ * AIFSN2: AC_VI
+ * AIFSN3: AC_VO
*/
#define WMM_AIFSN_CFG 0x0214
#define WMM_AIFSN_CFG_AIFSN0 FIELD32(0x0000000f)
@@ -396,10 +396,10 @@
/*
* WMM_CWMIN_CSR: CWmin for each EDCA AC
- * CWMIN0: AC_VO
- * CWMIN1: AC_VI
- * CWMIN2: AC_BE
- * CWMIN3: AC_BK
+ * CWMIN0: AC_BE
+ * CWMIN1: AC_BK
+ * CWMIN2: AC_VI
+ * CWMIN3: AC_VO
*/
#define WMM_CWMIN_CFG 0x0218
#define WMM_CWMIN_CFG_CWMIN0 FIELD32(0x0000000f)
@@ -409,10 +409,10 @@
/*
* WMM_CWMAX_CSR: CWmax for each EDCA AC
- * CWMAX0: AC_VO
- * CWMAX1: AC_VI
- * CWMAX2: AC_BE
- * CWMAX3: AC_BK
+ * CWMAX0: AC_BE
+ * CWMAX1: AC_BK
+ * CWMAX2: AC_VI
+ * CWMAX3: AC_VO
*/
#define WMM_CWMAX_CFG 0x021c
#define WMM_CWMAX_CFG_CWMAX0 FIELD32(0x0000000f)
@@ -421,18 +421,18 @@
#define WMM_CWMAX_CFG_CWMAX3 FIELD32(0x0000f000)
/*
- * AC_TXOP0: AC_VO/AC_VI TXOP register
- * AC0TXOP: AC_VO in unit of 32us
- * AC1TXOP: AC_VI in unit of 32us
+ * AC_TXOP0: AC_BE/AC_BK TXOP register
+ * AC0TXOP: AC_BE in unit of 32us
+ * AC1TXOP: AC_BK in unit of 32us
*/
#define WMM_TXOP0_CFG 0x0220
#define WMM_TXOP0_CFG_AC0TXOP FIELD32(0x0000ffff)
#define WMM_TXOP0_CFG_AC1TXOP FIELD32(0xffff0000)
/*
- * AC_TXOP1: AC_BE/AC_BK TXOP register
- * AC2TXOP: AC_BE in unit of 32us
- * AC3TXOP: AC_BK in unit of 32us
+ * AC_TXOP1: AC_VI/AC_VO TXOP register
+ * AC2TXOP: AC_VI in unit of 32us
+ * AC3TXOP: AC_VO in unit of 32us
*/
#define WMM_TXOP1_CFG 0x0224
#define WMM_TXOP1_CFG_AC2TXOP FIELD32(0x0000ffff)
@@ -473,7 +473,7 @@
#define MCU_CMD_CFG 0x022c
/*
- * AC_VO register offsets
+ * AC_BE register offsets
*/
#define TX_BASE_PTR0 0x0230
#define TX_MAX_CNT0 0x0234
@@ -481,7 +481,7 @@
#define TX_DTX_IDX0 0x023c
/*
- * AC_VI register offsets
+ * AC_BK register offsets
*/
#define TX_BASE_PTR1 0x0240
#define TX_MAX_CNT1 0x0244
@@ -489,7 +489,7 @@
#define TX_DTX_IDX1 0x024c
/*
- * AC_BE register offsets
+ * AC_VI register offsets
*/
#define TX_BASE_PTR2 0x0250
#define TX_MAX_CNT2 0x0254
@@ -497,7 +497,7 @@
#define TX_DTX_IDX2 0x025c
/*
- * AC_BK register offsets
+ * AC_VO register offsets
*/
#define TX_BASE_PTR3 0x0260
#define TX_MAX_CNT3 0x0264
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c
b/drivers/net/wireless/rt2x00/rt2800lib.c
index f414978..90e0658 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -7503,6 +7503,7 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev
*rt2x00dev)
* Initialize all hw fields.
*/
rt2x00dev->hw->flags =
+ IEEE80211_HW_QUEUE_CONTROL |
IEEE80211_HW_SIGNAL_DBM |
IEEE80211_HW_SUPPORTS_PS |
IEEE80211_HW_PS_NULLFUNC_STACK |
@@ -7510,6 +7511,8 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev
*rt2x00dev)
IEEE80211_HW_REPORTS_TX_ACK_STATUS |
IEEE80211_HW_SUPPORTS_HT_CCK_RATES;
+ rt2x00dev->hw->offchannel_tx_hw_queue = QID_AC_BE;
+
/*
* Don't set IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING for USB devices
* unless we are capable of sending the buffered frames out after the
@@ -7870,10 +7873,11 @@ int rt2800_set_rts_threshold(struct ieee80211_hw *hw,
u32 value)
EXPORT_SYMBOL_GPL(rt2800_set_rts_threshold);
int rt2800_conf_tx(struct ieee80211_hw *hw,
- struct ieee80211_vif *vif, u16 queue_idx,
+ struct ieee80211_vif *vif, u16 ac,
const struct ieee80211_tx_queue_params *params)
{
struct rt2x00_dev *rt2x00dev = hw->priv;
+ u16 queue_idx = rt2x00queue_ac_to_qid(ac);
struct data_queue *queue;
struct rt2x00_field32 field;
int retval;
@@ -7886,7 +7890,7 @@ int rt2800_conf_tx(struct ieee80211_hw *hw,
* we are free to update the registers based on the value
* in the queue parameter.
*/
- retval = rt2x00mac_conf_tx(hw, vif, queue_idx, params);
+ retval = rt2x00mac_conf_tx(hw, vif, ac, params);
if (retval)
return retval;
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c
b/drivers/net/wireless/rt2x00/rt2800pci.c
index f8f2abb..42e4fec 100644
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
@@ -236,10 +236,10 @@ static void rt2800pci_kick_queue(struct data_queue *queue)
struct queue_entry *entry;
switch (queue->qid) {
- case QID_AC_VO:
- case QID_AC_VI:
case QID_AC_BE:
case QID_AC_BK:
+ case QID_AC_VI:
+ case QID_AC_VO:
entry = rt2x00queue_get_entry(queue, Q_INDEX);
rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX(queue->qid),
entry->entry_idx);
@@ -1207,10 +1207,10 @@ static void rt2800pci_queue_init(struct data_queue
*queue)
queue->priv_size = sizeof(struct queue_entry_priv_mmio);
break;
- case QID_AC_VO:
- case QID_AC_VI:
case QID_AC_BE:
case QID_AC_BK:
+ case QID_AC_VI:
+ case QID_AC_VO:
queue->limit = 64;
queue->data_size = AGGREGATION_SIZE;
queue->desc_size = TXD_DESC_SIZE;
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c
b/drivers/net/wireless/rt2x00/rt2800usb.c
index 96961b9..dcea8d7 100644
--- a/drivers/net/wireless/rt2x00/rt2800usb.c
+++ b/drivers/net/wireless/rt2x00/rt2800usb.c
@@ -865,10 +865,10 @@ static void rt2800usb_queue_init(struct data_queue *queue)
queue->priv_size = sizeof(struct queue_entry_priv_usb);
break;
- case QID_AC_VO:
- case QID_AC_VI:
case QID_AC_BE:
case QID_AC_BK:
+ case QID_AC_VI:
+ case QID_AC_VO:
queue->limit = 16;
queue->data_size = AGGREGATION_SIZE;
queue->desc_size = TXINFO_DESC_SIZE;
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c
b/drivers/net/wireless/rt2x00/rt2x00mac.c
index f883802..884bf91 100644
--- a/drivers/net/wireless/rt2x00/rt2x00mac.c
+++ b/drivers/net/wireless/rt2x00/rt2x00mac.c
@@ -105,8 +105,8 @@ void rt2x00mac_tx(struct ieee80211_hw *hw,
{
struct rt2x00_dev *rt2x00dev = hw->priv;
struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
- enum data_queue_qid qid = skb_get_queue_mapping(skb);
- struct data_queue *queue = NULL;
+ enum data_queue_qid qid = tx_info->hw_queue;
+ struct data_queue *queue;
/*
* Mac80211 might be calling this function while we are trying
@@ -204,7 +204,7 @@ int rt2x00mac_add_interface(struct ieee80211_hw *hw,
struct rt2x00_intf *intf = vif_to_intf(vif);
struct data_queue *queue = rt2x00dev->bcn;
struct queue_entry *entry = NULL;
- unsigned int i;
+ unsigned int i, ac;
/*
* Don't allow interfaces to be added
@@ -261,6 +261,31 @@ int rt2x00mac_add_interface(struct ieee80211_hw *hw,
*/
rt2x00dev->packet_filter = 0;
+ /*
+ * We do not map mac80211 Access Categories to queues linearly, as AC
+ * on hardware are numbered differently than on mac80211, see
+ * QID_AC_{VO,VI,BE,BK} and IEEE80211_AC_{VO,VI,BE,BK} defines.
+ */
+
+ switch (rt2x00dev->ops->tx_queues) {
+ case 4:
+ /* modern devices with 802.11e support */
+ for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
+ vif->hw_queue[ac] = rt2x00queue_ac_to_qid(ac);
+ vif->cab_queue = QID_AC_VO;
+ break;
+ case 2:
+ /* old devices */
+ for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
+ vif->hw_queue[ac] = QID_AC_BE;
+ vif->hw_queue[IEEE80211_AC_BK] = QID_AC_BK;
+ vif->cab_queue = QID_AC_BE;
+ break;
+ default:
+ WARN_ON(1);
+ return -ENODEV;
+ }
+
return 0;
}
EXPORT_SYMBOL_GPL(rt2x00mac_add_interface);
@@ -704,10 +729,11 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw,
EXPORT_SYMBOL_GPL(rt2x00mac_bss_info_changed);
int rt2x00mac_conf_tx(struct ieee80211_hw *hw,
- struct ieee80211_vif *vif, u16 queue_idx,
+ struct ieee80211_vif *vif, u16 ac,
const struct ieee80211_tx_queue_params *params)
{
struct rt2x00_dev *rt2x00dev = hw->priv;
+ u16 queue_idx = rt2x00queue_ac_to_qid(ac);
struct data_queue *queue;
queue = rt2x00queue_get_tx_queue(rt2x00dev, queue_idx);
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c
b/drivers/net/wireless/rt2x00/rt2x00queue.c
index 6c8a33b..ff2afe4 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
@@ -939,10 +939,10 @@ void rt2x00queue_index_inc(struct queue_entry *entry,
enum queue_index index)
static void rt2x00queue_pause_queue_nocheck(struct data_queue *queue)
{
switch (queue->qid) {
- case QID_AC_VO:
- case QID_AC_VI:
case QID_AC_BE:
case QID_AC_BK:
+ case QID_AC_VI:
+ case QID_AC_VO:
/*
* For TX queues, we have to disable the queue
* inside mac80211.
@@ -972,10 +972,10 @@ void rt2x00queue_unpause_queue(struct data_queue *queue)
return;
switch (queue->qid) {
- case QID_AC_VO:
- case QID_AC_VI:
case QID_AC_BE:
case QID_AC_BK:
+ case QID_AC_VO:
+ case QID_AC_VI:
/*
* For TX queues, we have to enable the queue
* inside mac80211.
@@ -1035,10 +1035,10 @@ void rt2x00queue_flush_queue(struct data_queue *queue,
bool drop)
{
bool started;
bool tx_queue =
- (queue->qid == QID_AC_VO) ||
- (queue->qid == QID_AC_VI) ||
(queue->qid == QID_AC_BE) ||
- (queue->qid == QID_AC_BK);
+ (queue->qid == QID_AC_BK) ||
+ (queue->qid == QID_AC_VI) ||
+ (queue->qid == QID_AC_VO);
mutex_lock(&queue->status_lock);
@@ -1332,7 +1332,7 @@ int rt2x00queue_allocate(struct rt2x00_dev *rt2x00dev)
/*
* Initialize queue parameters.
* RX: qid = QID_RX
- * TX: qid = QID_AC_VO + index
+ * TX: qid = QID_AC_BE=0 .. QID_AC_VO=3
* TX: cw_min: 2^5 = 32.
* TX: cw_max: 2^10 = 1024.
* BCN: qid = QID_BEACON
@@ -1340,7 +1340,7 @@ int rt2x00queue_allocate(struct rt2x00_dev *rt2x00dev)
*/
rt2x00queue_init(rt2x00dev, rt2x00dev->rx, QID_RX);
- qid = QID_AC_VO;
+ qid = 0;
tx_queue_for_each(rt2x00dev, queue)
rt2x00queue_init(rt2x00dev, queue, qid++);
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.h
b/drivers/net/wireless/rt2x00/rt2x00queue.h
index ebe1172..7ddc9a6 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.h
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.h
@@ -45,10 +45,10 @@
/**
* enum data_queue_qid: Queue identification
*
- * @QID_AC_VO: AC VO queue
- * @QID_AC_VI: AC VI queue
* @QID_AC_BE: AC BE queue
* @QID_AC_BK: AC BK queue
+ * @QID_AC_VI: AC VI queue
+ * @QID_AC_VO: AC VO queue
* @QID_HCCA: HCCA queue
* @QID_MGMT: MGMT queue (prio queue)
* @QID_RX: RX queue
@@ -57,10 +57,10 @@
* @QID_ATIM: Atim queue (value unspecified, don't send it to device)
*/
enum data_queue_qid {
- QID_AC_VO = 0,
- QID_AC_VI = 1,
- QID_AC_BE = 2,
- QID_AC_BK = 3,
+ QID_AC_BE = 0,
+ QID_AC_BK = 1,
+ QID_AC_VI = 2,
+ QID_AC_VO = 3,
QID_HCCA = 4,
QID_MGMT = 13,
QID_RX = 14,
@@ -69,6 +69,23 @@ enum data_queue_qid {
QID_ATIM,
};
+static inline int rt2x00queue_ac_to_qid(int ac)
+{
+ switch (ac) {
+ case IEEE80211_AC_VO:
+ return QID_AC_VO;
+ case IEEE80211_AC_VI:
+ return QID_AC_VI;
+ case IEEE80211_AC_BE:
+ return QID_AC_BE;
+ case IEEE80211_AC_BK:
+ return QID_AC_BK;
+ default:
+ WARN_ONCE(1, "Wrong AC number\n");
+ return QID_AC_BE;
+ }
+}
+
/**
* enum skb_frame_desc_flags: Flags for &struct skb_frame_desc
*
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c
b/drivers/net/wireless/rt2x00/rt2x00usb.c
index 8828987..8365885 100644
--- a/drivers/net/wireless/rt2x00/rt2x00usb.c
+++ b/drivers/net/wireless/rt2x00/rt2x00usb.c
@@ -422,10 +422,10 @@ static bool rt2x00usb_kick_rx_entry(struct queue_entry
*entry, void *data)
void rt2x00usb_kick_queue(struct data_queue *queue)
{
switch (queue->qid) {
- case QID_AC_VO:
- case QID_AC_VI:
case QID_AC_BE:
case QID_AC_BK:
+ case QID_AC_VI:
+ case QID_AC_VO:
if (!rt2x00queue_empty(queue))
rt2x00queue_for_each_entry(queue,
Q_INDEX_DONE,
@@ -481,10 +481,10 @@ void rt2x00usb_flush_queue(struct data_queue *queue, bool
drop)
* Obtain the queue completion handler
*/
switch (queue->qid) {
- case QID_AC_VO:
- case QID_AC_VI:
case QID_AC_BE:
case QID_AC_BK:
+ case QID_AC_VI:
+ case QID_AC_VO:
completion = &queue->rt2x00dev->txdone_work;
break;
case QID_RX:
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c
b/drivers/net/wireless/rt2x00/rt61pci.c
index 54d3ddf..b9fa61c 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -1163,22 +1163,22 @@ static void rt61pci_kick_queue(struct data_queue *queue)
u32 reg;
switch (queue->qid) {
- case QID_AC_VO:
+ case QID_AC_BE:
rt2x00mmio_register_read(rt2x00dev, TX_CNTL_CSR, ®);
rt2x00_set_field32(®, TX_CNTL_CSR_KICK_TX_AC0, 1);
rt2x00mmio_register_write(rt2x00dev, TX_CNTL_CSR, reg);
break;
- case QID_AC_VI:
+ case QID_AC_BK:
rt2x00mmio_register_read(rt2x00dev, TX_CNTL_CSR, ®);
rt2x00_set_field32(®, TX_CNTL_CSR_KICK_TX_AC1, 1);
rt2x00mmio_register_write(rt2x00dev, TX_CNTL_CSR, reg);
break;
- case QID_AC_BE:
+ case QID_AC_VI:
rt2x00mmio_register_read(rt2x00dev, TX_CNTL_CSR, ®);
rt2x00_set_field32(®, TX_CNTL_CSR_KICK_TX_AC2, 1);
rt2x00mmio_register_write(rt2x00dev, TX_CNTL_CSR, reg);
break;
- case QID_AC_BK:
+ case QID_AC_VO:
rt2x00mmio_register_read(rt2x00dev, TX_CNTL_CSR, ®);
rt2x00_set_field32(®, TX_CNTL_CSR_KICK_TX_AC3, 1);
rt2x00mmio_register_write(rt2x00dev, TX_CNTL_CSR, reg);
@@ -1194,22 +1194,22 @@ static void rt61pci_stop_queue(struct data_queue *queue)
u32 reg;
switch (queue->qid) {
- case QID_AC_VO:
+ case QID_AC_BE:
rt2x00mmio_register_read(rt2x00dev, TX_CNTL_CSR, ®);
rt2x00_set_field32(®, TX_CNTL_CSR_ABORT_TX_AC0, 1);
rt2x00mmio_register_write(rt2x00dev, TX_CNTL_CSR, reg);
break;
- case QID_AC_VI:
+ case QID_AC_BK:
rt2x00mmio_register_read(rt2x00dev, TX_CNTL_CSR, ®);
rt2x00_set_field32(®, TX_CNTL_CSR_ABORT_TX_AC1, 1);
rt2x00mmio_register_write(rt2x00dev, TX_CNTL_CSR, reg);
break;
- case QID_AC_BE:
+ case QID_AC_VI:
rt2x00mmio_register_read(rt2x00dev, TX_CNTL_CSR, ®);
rt2x00_set_field32(®, TX_CNTL_CSR_ABORT_TX_AC2, 1);
rt2x00mmio_register_write(rt2x00dev, TX_CNTL_CSR, reg);
break;
- case QID_AC_BK:
+ case QID_AC_VO:
rt2x00mmio_register_read(rt2x00dev, TX_CNTL_CSR, ®);
rt2x00_set_field32(®, TX_CNTL_CSR_ABORT_TX_AC3, 1);
rt2x00mmio_register_write(rt2x00dev, TX_CNTL_CSR, reg);
@@ -2764,11 +2764,14 @@ static int rt61pci_probe_hw_mode(struct rt2x00_dev
*rt2x00dev)
* Initialize all hw fields.
*/
rt2x00dev->hw->flags =
+ IEEE80211_HW_QUEUE_CONTROL |
IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
IEEE80211_HW_SIGNAL_DBM |
IEEE80211_HW_SUPPORTS_PS |
IEEE80211_HW_PS_NULLFUNC_STACK;
+ rt2x00dev->hw->offchannel_tx_hw_queue = QID_AC_BE;
+
SET_IEEE80211_DEV(rt2x00dev->hw, rt2x00dev->dev);
SET_IEEE80211_PERM_ADDR(rt2x00dev->hw,
rt2x00_eeprom_addr(rt2x00dev,
@@ -2896,10 +2899,11 @@ static int rt61pci_probe_hw(struct rt2x00_dev
*rt2x00dev)
* IEEE80211 stack callback functions.
*/
static int rt61pci_conf_tx(struct ieee80211_hw *hw,
- struct ieee80211_vif *vif, u16 queue_idx,
+ struct ieee80211_vif *vif, u16 ac,
const struct ieee80211_tx_queue_params *params)
{
struct rt2x00_dev *rt2x00dev = hw->priv;
+ u16 queue_idx = rt2x00queue_ac_to_qid(ac);
struct data_queue *queue;
struct rt2x00_field32 field;
int retval;
@@ -2912,7 +2916,7 @@ static int rt61pci_conf_tx(struct ieee80211_hw *hw,
* we are free to update the registers based on the value
* in the queue parameter.
*/
- retval = rt2x00mac_conf_tx(hw, vif, queue_idx, params);
+ retval = rt2x00mac_conf_tx(hw, vif, ac, params);
if (retval)
return retval;
@@ -3036,10 +3040,10 @@ static void rt61pci_queue_init(struct data_queue *queue)
queue->priv_size = sizeof(struct queue_entry_priv_mmio);
break;
- case QID_AC_VO:
- case QID_AC_VI:
case QID_AC_BE:
case QID_AC_BK:
+ case QID_AC_VI:
+ case QID_AC_VO:
queue->limit = 32;
queue->data_size = DATA_FRAME_SIZE;
queue->desc_size = TXD_DESC_SIZE;
diff --git a/drivers/net/wireless/rt2x00/rt61pci.h
b/drivers/net/wireless/rt2x00/rt61pci.h
index 9bc6b60..16d4809 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.h
+++ b/drivers/net/wireless/rt2x00/rt61pci.h
@@ -785,25 +785,25 @@ struct hw_pairwise_ta_entry {
*/
/*
- * AC0_BASE_CSR: AC_VO base address.
+ * AC0_BASE_CSR: AC_BE base address.
*/
#define AC0_BASE_CSR 0x3400
#define AC0_BASE_CSR_RING_REGISTER FIELD32(0xffffffff)
/*
- * AC1_BASE_CSR: AC_VI base address.
+ * AC1_BASE_CSR: AC_BK base address.
*/
#define AC1_BASE_CSR 0x3404
#define AC1_BASE_CSR_RING_REGISTER FIELD32(0xffffffff)
/*
- * AC2_BASE_CSR: AC_BE base address.
+ * AC2_BASE_CSR: AC_VI base address.
*/
#define AC2_BASE_CSR 0x3408
#define AC2_BASE_CSR_RING_REGISTER FIELD32(0xffffffff)
/*
- * AC3_BASE_CSR: AC_BK base address.
+ * AC3_BASE_CSR: AC_VO base address.
*/
#define AC3_BASE_CSR 0x340c
#define AC3_BASE_CSR_RING_REGISTER FIELD32(0xffffffff)
@@ -815,7 +815,7 @@ struct hw_pairwise_ta_entry {
#define MGMT_BASE_CSR_RING_REGISTER FIELD32(0xffffffff)
/*
- * TX_RING_CSR0: TX Ring size for AC_VO, AC_VI, AC_BE, AC_BK.
+ * TX_RING_CSR0: TX Ring size for AC_BE, AC_BK, AC_VI, AC_VO.
*/
#define TX_RING_CSR0 0x3418
#define TX_RING_CSR0_AC0_RING_SIZE FIELD32(0x000000ff)
@@ -834,10 +834,10 @@ struct hw_pairwise_ta_entry {
/*
* AIFSN_CSR: AIFSN for each EDCA AC.
- * AIFSN0: For AC_VO.
- * AIFSN1: For AC_VI.
- * AIFSN2: For AC_BE.
- * AIFSN3: For AC_BK.
+ * AIFSN0: For AC_BE.
+ * AIFSN1: For AC_BK.
+ * AIFSN2: For AC_VI.
+ * AIFSN3: For AC_VO.
*/
#define AIFSN_CSR 0x3420
#define AIFSN_CSR_AIFSN0 FIELD32(0x0000000f)
@@ -847,10 +847,10 @@ struct hw_pairwise_ta_entry {
/*
* CWMIN_CSR: CWmin for each EDCA AC.
- * CWMIN0: For AC_VO.
- * CWMIN1: For AC_VI.
- * CWMIN2: For AC_BE.
- * CWMIN3: For AC_BK.
+ * CWMIN0: For AC_BE.
+ * CWMIN1: For AC_BK.
+ * CWMIN2: For AC_VI.
+ * CWMIN3: For AC_VO.
*/
#define CWMIN_CSR 0x3424
#define CWMIN_CSR_CWMIN0 FIELD32(0x0000000f)
@@ -860,10 +860,10 @@ struct hw_pairwise_ta_entry {
/*
* CWMAX_CSR: CWmax for each EDCA AC.
- * CWMAX0: For AC_VO.
- * CWMAX1: For AC_VI.
- * CWMAX2: For AC_BE.
- * CWMAX3: For AC_BK.
+ * CWMAX0: For AC_BE.
+ * CWMAX1: For AC_BK.
+ * CWMAX2: For AC_VI.
+ * CWMAX3: For AC_VO.
*/
#define CWMAX_CSR 0x3428
#define CWMAX_CSR_CWMAX0 FIELD32(0x0000000f)
@@ -884,14 +884,14 @@ struct hw_pairwise_ta_entry {
/*
* TX_CNTL_CSR: KICK/Abort TX.
- * KICK_TX_AC0: For AC_VO.
- * KICK_TX_AC1: For AC_VI.
- * KICK_TX_AC2: For AC_BE.
- * KICK_TX_AC3: For AC_BK.
- * ABORT_TX_AC0: For AC_VO.
- * ABORT_TX_AC1: For AC_VI.
- * ABORT_TX_AC2: For AC_BE.
- * ABORT_TX_AC3: For AC_BK.
+ * KICK_TX_AC0: For AC_BE.
+ * KICK_TX_AC1: For AC_BK.
+ * KICK_TX_AC2: For AC_VI.
+ * KICK_TX_AC3: For AC_VO.
+ * ABORT_TX_AC0: For AC_BE.
+ * ABORT_TX_AC1: For AC_BK.
+ * ABORT_TX_AC2: For AC_VI.
+ * ABORT_TX_AC3: For AC_VO.
*/
#define TX_CNTL_CSR 0x3430
#define TX_CNTL_CSR_KICK_TX_AC0 FIELD32(0x00000001)
@@ -1011,18 +1011,18 @@ struct hw_pairwise_ta_entry {
#define E2PROM_CSR_LOAD_STATUS FIELD32(0x00000040)
/*
- * AC_TXOP_CSR0: AC_VO/AC_VI TXOP register.
- * AC0_TX_OP: For AC_VO, in unit of 32us.
- * AC1_TX_OP: For AC_VI, in unit of 32us.
+ * AC_TXOP_CSR0: AC_BE/AC_BK TXOP register.
+ * AC0_TX_OP: For AC_BE, in unit of 32us.
+ * AC1_TX_OP: For AC_BE, in unit of 32us.
*/
#define AC_TXOP_CSR0 0x3474
#define AC_TXOP_CSR0_AC0_TX_OP FIELD32(0x0000ffff)
#define AC_TXOP_CSR0_AC1_TX_OP FIELD32(0xffff0000)
/*
- * AC_TXOP_CSR1: AC_BE/AC_BK TXOP register.
- * AC2_TX_OP: For AC_BE, in unit of 32us.
- * AC3_TX_OP: For AC_BK, in unit of 32us.
+ * AC_TXOP_CSR1: AC_VI/AC_VO TXOP register.
+ * AC2_TX_OP: For AC_VI, in unit of 32us.
+ * AC3_TX_OP: For AC_VO, in unit of 32us.
*/
#define AC_TXOP_CSR1 0x3478
#define AC_TXOP_CSR1_AC2_TX_OP FIELD32(0x0000ffff)
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c
b/drivers/net/wireless/rt2x00/rt73usb.c
index 1d3880e..8f56747 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
@@ -2117,10 +2117,13 @@ static int rt73usb_probe_hw_mode(struct rt2x00_dev
*rt2x00dev)
* infinitly and thus dropping it after some time.
*/
rt2x00dev->hw->flags =
+ IEEE80211_HW_QUEUE_CONTROL |
IEEE80211_HW_SIGNAL_DBM |
IEEE80211_HW_SUPPORTS_PS |
IEEE80211_HW_PS_NULLFUNC_STACK;
+ rt2x00dev->hw->offchannel_tx_hw_queue = QID_AC_BE;
+
SET_IEEE80211_DEV(rt2x00dev->hw, rt2x00dev->dev);
SET_IEEE80211_PERM_ADDR(rt2x00dev->hw,
rt2x00_eeprom_addr(rt2x00dev,
@@ -2233,10 +2236,11 @@ static int rt73usb_probe_hw(struct rt2x00_dev
*rt2x00dev)
* IEEE80211 stack callback functions.
*/
static int rt73usb_conf_tx(struct ieee80211_hw *hw,
- struct ieee80211_vif *vif, u16 queue_idx,
+ struct ieee80211_vif *vif, u16 ac,
const struct ieee80211_tx_queue_params *params)
{
struct rt2x00_dev *rt2x00dev = hw->priv;
+ u16 queue_idx = rt2x00queue_ac_to_qid(ac);
struct data_queue *queue;
struct rt2x00_field32 field;
int retval;
@@ -2249,7 +2253,7 @@ static int rt73usb_conf_tx(struct ieee80211_hw *hw,
* we are free to update the registers based on the value
* in the queue parameter.
*/
- retval = rt2x00mac_conf_tx(hw, vif, queue_idx, params);
+ retval = rt2x00mac_conf_tx(hw, vif, ac, params);
if (retval)
return retval;
@@ -2370,10 +2374,10 @@ static void rt73usb_queue_init(struct data_queue *queue)
queue->priv_size = sizeof(struct queue_entry_priv_usb);
break;
- case QID_AC_VO:
- case QID_AC_VI:
case QID_AC_BE:
case QID_AC_BK:
+ case QID_AC_VI:
+ case QID_AC_VO:
queue->limit = 32;
queue->data_size = DATA_FRAME_SIZE;
queue->desc_size = TXD_DESC_SIZE;
diff --git a/drivers/net/wireless/rt2x00/rt73usb.h
b/drivers/net/wireless/rt2x00/rt73usb.h
index 7577e0b..38463a2 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.h
+++ b/drivers/net/wireless/rt2x00/rt73usb.h
@@ -694,10 +694,10 @@ struct hw_pairwise_ta_entry {
/*
* AIFSN_CSR: AIFSN for each EDCA AC.
- * AIFSN0: For AC_VO.
- * AIFSN1: For AC_VI.
- * AIFSN2: For AC_BE.
- * AIFSN3: For AC_BK.
+ * AIFSN0: For AC_BE.
+ * AIFSN1: For AC_BK.
+ * AIFSN2: For AC_VI.
+ * AIFSN3: For AC_VO.
*/
#define AIFSN_CSR 0x0400
#define AIFSN_CSR_AIFSN0 FIELD32(0x0000000f)
@@ -707,10 +707,10 @@ struct hw_pairwise_ta_entry {
/*
* CWMIN_CSR: CWmin for each EDCA AC.
- * CWMIN0: For AC_VO.
- * CWMIN1: For AC_VI.
- * CWMIN2: For AC_BE.
- * CWMIN3: For AC_BK.
+ * CWMIN0: For AC_BE.
+ * CWMIN1: For AC_BK.
+ * CWMIN2: For AC_VI.
+ * CWMIN3: For AC_VO.
*/
#define CWMIN_CSR 0x0404
#define CWMIN_CSR_CWMIN0 FIELD32(0x0000000f)
@@ -720,10 +720,10 @@ struct hw_pairwise_ta_entry {
/*
* CWMAX_CSR: CWmax for each EDCA AC.
- * CWMAX0: For AC_VO.
- * CWMAX1: For AC_VI.
- * CWMAX2: For AC_BE.
- * CWMAX3: For AC_BK.
+ * CWMAX0: For AC_BE.
+ * CWMAX1: For AC_BK.
+ * CWMAX2: For AC_VI.
+ * CWMAX3: For AC_VO.
*/
#define CWMAX_CSR 0x0408
#define CWMAX_CSR_CWMAX0 FIELD32(0x0000000f)
@@ -732,18 +732,18 @@ struct hw_pairwise_ta_entry {
#define CWMAX_CSR_CWMAX3 FIELD32(0x0000f000)
/*
- * AC_TXOP_CSR0: AC_VO/AC_VI TXOP register.
- * AC0_TX_OP: For AC_VO, in unit of 32us.
- * AC1_TX_OP: For AC_VI, in unit of 32us.
+ * AC_TXOP_CSR0: AC_BE/AC_BK TXOP register.
+ * AC0_TX_OP: For AC_BE, in unit of 32us.
+ * AC1_TX_OP: For AC_BK, in unit of 32us.
*/
#define AC_TXOP_CSR0 0x040c
#define AC_TXOP_CSR0_AC0_TX_OP FIELD32(0x0000ffff)
#define AC_TXOP_CSR0_AC1_TX_OP FIELD32(0xffff0000)
/*
- * AC_TXOP_CSR1: AC_BE/AC_BK TXOP register.
- * AC2_TX_OP: For AC_BE, in unit of 32us.
- * AC3_TX_OP: For AC_BK, in unit of 32us.
+ * AC_TXOP_CSR1: AC_VI/AC_VO TXOP register.
+ * AC2_TX_OP: For AC_VI, in unit of 32us.
+ * AC3_TX_OP: For AC_VO, in unit of 32us.
*/
#define AC_TXOP_CSR1 0x0410
#define AC_TXOP_CSR1_AC2_TX_OP FIELD32(0x0000ffff)
------------------------------
Subject: Digest Footer
_______________________________________________
users mailing list
[email protected]
http://rt2x00.serialmonkey.com/mailman/listinfo/users_rt2x00.serialmonkey.com
------------------------------
End of users Digest, Vol 56, Issue 3
************************************