2012-04-03 01:41:01

by Jakub Kicinski

[permalink] [raw]
Subject: [PATCH v2 0/4] rt2800: fix initialization after legacy driver

Hi,

the main purpose of this set is to make it possible to switch between
rt2800pci and legacy driver w/o rebooting or suspending whole machine.
Today rt2800pci will fail to bring the interface up if it was earlier
operated by legacy drv. I'm sure it happens with rt3090, rt2860 seems
to work fine.

First two patches bring back disabling DMA before loading firmware,
third and fourth actually fix the take over issue.

Jakub Kicinski (4):
rt2800: introduce wpdma_disable function
rt2800: add disabling of DMA before loading firmware
rt2800: initialize queues before giving up due to DMA error
rt2800: zero registers of unused TX rings

drivers/net/wireless/rt2x00/rt2800lib.c | 36 +++++++++++++++++-------------
drivers/net/wireless/rt2x00/rt2800lib.h | 1 +
drivers/net/wireless/rt2x00/rt2800pci.c | 26 +++++++++++++---------
3 files changed, 36 insertions(+), 27 deletions(-)

--
1.7.7.6



2012-04-05 10:06:06

by Stanislaw Gruszka

[permalink] [raw]
Subject: Re: [PATCH v2 4/4] rt2800: zero registers of unused TX rings

On Tue, Apr 03, 2012 at 03:40:50AM +0200, Jakub Kicinski wrote:
> This is needed if we take over after drivers which use those.
>
> Signed-off-by: Jakub Kicinski <[email protected]>
> Acked-by: Gertjan van Wingerde <[email protected]>
Reviewed-by: Stanislaw Gruszka <[email protected]>

2012-04-05 10:05:55

by Stanislaw Gruszka

[permalink] [raw]
Subject: Re: [PATCH v2 3/4] rt2800: initialize queues before giving up due to DMA error

On Tue, Apr 03, 2012 at 03:40:49AM +0200, Jakub Kicinski wrote:
> Don't immediately abort .start if DMA is busy before we
> initialize the queues. Some drivers do not deinitialize
> queues properly and we would fail to take over after them.
>
> This behaviour is consistent with legacy driver.
>
> Signed-off-by: Jakub Kicinski <[email protected]>
> Acked-by: Gertjan van Wingerde <[email protected]>
Reviewed-by: Stanislaw Gruszka <[email protected]>

2012-04-03 01:41:05

by Jakub Kicinski

[permalink] [raw]
Subject: [PATCH v2 3/4] rt2800: initialize queues before giving up due to DMA error

Don't immediately abort .start if DMA is busy before we
initialize the queues. Some drivers do not deinitialize
queues properly and we would fail to take over after them.

This behaviour is consistent with legacy driver.

Signed-off-by: Jakub Kicinski <[email protected]>
Acked-by: Gertjan van Wingerde <[email protected]>
---
2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO
common/rtmp_init.c:2007
---
drivers/net/wireless/rt2x00/rt2800lib.c | 2 +-
drivers/net/wireless/rt2x00/rt2800pci.c | 6 ++++--
2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index cc6ca18..bd19802 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -290,7 +290,7 @@ int rt2800_wait_wpdma_ready(struct rt2x00_dev *rt2x00dev)
msleep(10);
}

- ERROR(rt2x00dev, "WPDMA TX/RX busy, aborting.\n");
+ ERROR(rt2x00dev, "WPDMA TX/RX busy [0x%08x].\n", reg);
return -EACCES;
}
EXPORT_SYMBOL_GPL(rt2800_wait_wpdma_ready);
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
index e499389..4366c23 100644
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
@@ -496,8 +496,10 @@ static int rt2800pci_enable_radio(struct rt2x00_dev *rt2x00dev)
{
int retval;

- if (unlikely(rt2800_wait_wpdma_ready(rt2x00dev) ||
- rt2800pci_init_queues(rt2x00dev)))
+ /* Wait for DMA, ignore error until we initialize queues. */
+ rt2800_wait_wpdma_ready(rt2x00dev);
+
+ if (unlikely(rt2800pci_init_queues(rt2x00dev)))
return -EIO;

retval = rt2800_enable_radio(rt2x00dev);
--
1.7.7.6


2012-04-03 01:41:03

by Jakub Kicinski

[permalink] [raw]
Subject: [PATCH v2 2/4] rt2800: add disabling of DMA before loading firmware

Legacy driver disables DMA before loading firmware.

Signed-off-by: Jakub Kicinski <[email protected]>
Reviewed-by: Stanislaw Gruszka <[email protected]>
---
2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO
rtmp_init_inf.c:186
---
drivers/net/wireless/rt2x00/rt2800lib.c | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index 8aee6d4..cc6ca18 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -426,6 +426,8 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
rt2800_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000002);
}

+ rt2800_disable_wpdma(rt2x00dev);
+
/*
* Write firmware to the device.
*/
--
1.7.7.6


2012-04-03 01:41:02

by Jakub Kicinski

[permalink] [raw]
Subject: [PATCH v2 1/4] rt2800: introduce wpdma_disable function

Introduce wpdma_disable function to simplify the code.

Signed-off-by: Jakub Kicinski <[email protected]>
Reviewed-by: Stanislaw Gruszka <[email protected]>
---
drivers/net/wireless/rt2x00/rt2800lib.c | 32 ++++++++++++++++--------------
drivers/net/wireless/rt2x00/rt2800lib.h | 1 +
drivers/net/wireless/rt2x00/rt2800pci.c | 10 +--------
3 files changed, 19 insertions(+), 24 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index 6c0a12e..8aee6d4 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -295,6 +295,20 @@ int rt2800_wait_wpdma_ready(struct rt2x00_dev *rt2x00dev)
}
EXPORT_SYMBOL_GPL(rt2800_wait_wpdma_ready);

+void rt2800_disable_wpdma(struct rt2x00_dev *rt2x00dev)
+{
+ u32 reg;
+
+ rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, &reg);
+ rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
+ rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_DMA_BUSY, 0);
+ rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0);
+ rt2x00_set_field32(&reg, WPDMA_GLO_CFG_RX_DMA_BUSY, 0);
+ rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1);
+ rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
+}
+EXPORT_SYMBOL_GPL(rt2800_disable_wpdma);
+
static bool rt2800_check_firmware_crc(const u8 *data, const size_t len)
{
u16 fw_crc;
@@ -436,10 +450,7 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
* Disable DMA, will be reenabled later when enabling
* the radio.
*/
- rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, &reg);
- rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
- rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0);
- rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
+ rt2800_disable_wpdma(rt2x00dev);

/*
* Initialize firmware.
@@ -2717,13 +2728,7 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
unsigned int i;
int ret;

- rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, &reg);
- rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
- rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_DMA_BUSY, 0);
- rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0);
- rt2x00_set_field32(&reg, WPDMA_GLO_CFG_RX_DMA_BUSY, 0);
- rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1);
- rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
+ rt2800_disable_wpdma(rt2x00dev);

ret = rt2800_drv_init_registers(rt2x00dev);
if (ret)
@@ -3997,10 +4002,7 @@ void rt2800_disable_radio(struct rt2x00_dev *rt2x00dev)
{
u32 reg;

- rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, &reg);
- rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
- rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0);
- rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
+ rt2800_disable_wpdma(rt2x00dev);

/* Wait for DMA, ignore error */
rt2800_wait_wpdma_ready(rt2x00dev);
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.h b/drivers/net/wireless/rt2x00/rt2800lib.h
index 419e36c..18a0b67 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.h
+++ b/drivers/net/wireless/rt2x00/rt2800lib.h
@@ -208,5 +208,6 @@ int rt2800_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
u8 buf_size);
int rt2800_get_survey(struct ieee80211_hw *hw, int idx,
struct survey_info *survey);
+void rt2800_disable_wpdma(struct rt2x00_dev *rt2x00dev);

#endif /* RT2800LIB_H */
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
index 0397bbf..e499389 100644
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
@@ -361,7 +361,6 @@ static void rt2800pci_clear_entry(struct queue_entry *entry)
static int rt2800pci_init_queues(struct rt2x00_dev *rt2x00dev)
{
struct queue_entry_priv_pci *entry_priv;
- u32 reg;

/*
* Initialize registers.
@@ -402,14 +401,7 @@ static int rt2800pci_init_queues(struct rt2x00_dev *rt2x00dev)
rt2x00dev->rx[0].limit - 1);
rt2x00pci_register_write(rt2x00dev, RX_DRX_IDX, 0);

- /*
- * Enable global DMA configuration
- */
- rt2x00pci_register_read(rt2x00dev, WPDMA_GLO_CFG, &reg);
- rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
- rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0);
- rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1);
- rt2x00pci_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
+ rt2800_disable_wpdma(rt2x00dev);

rt2x00pci_register_write(rt2x00dev, DELAY_INT_CFG, 0);

--
1.7.7.6


2012-04-03 06:08:09

by Gertjan van Wingerde

[permalink] [raw]
Subject: Re: [PATCH v2 2/4] rt2800: add disabling of DMA before loading firmware

On Tue, Apr 3, 2012 at 3:40 AM, Jakub Kicinski <[email protected]> wrote:
> Legacy driver disables DMA before loading firmware.
>
> Signed-off-by: Jakub Kicinski <[email protected]>
> Reviewed-by: Stanislaw Gruszka <[email protected]>

Acked-by: Gertjan van Wingerde <[email protected]>

> ---
> 2011_0406_RT5390_RT5392_Linux_STA_V2.5.0.3_DPO
> rtmp_init_inf.c:186
> ---
> ?drivers/net/wireless/rt2x00/rt2800lib.c | ? ?2 ++
> ?1 files changed, 2 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
> index 8aee6d4..cc6ca18 100644
> --- a/drivers/net/wireless/rt2x00/rt2800lib.c
> +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
> @@ -426,6 +426,8 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
> ? ? ? ? ? ? ? ?rt2800_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000002);
> ? ? ? ?}
>
> + ? ? ? rt2800_disable_wpdma(rt2x00dev);
> +
> ? ? ? ?/*
> ? ? ? ? * Write firmware to the device.
> ? ? ? ? */
> --
> 1.7.7.6
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to [email protected]
> More majordomo info at ?http://vger.kernel.org/majordomo-info.html



--
---
Gertjan

2012-04-03 06:07:39

by Gertjan van Wingerde

[permalink] [raw]
Subject: Re: [PATCH v2 1/4] rt2800: introduce wpdma_disable function

On Tue, Apr 3, 2012 at 3:40 AM, Jakub Kicinski <[email protected]> wrote:
> Introduce wpdma_disable function to simplify the code.
>
> Signed-off-by: Jakub Kicinski <[email protected]>
> Reviewed-by: Stanislaw Gruszka <[email protected]>

Acked-by: Gertjan van Wingerde <[email protected]>

> ---
> ?drivers/net/wireless/rt2x00/rt2800lib.c | ? 32 ++++++++++++++++--------------
> ?drivers/net/wireless/rt2x00/rt2800lib.h | ? ?1 +
> ?drivers/net/wireless/rt2x00/rt2800pci.c | ? 10 +--------
> ?3 files changed, 19 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
> index 6c0a12e..8aee6d4 100644
> --- a/drivers/net/wireless/rt2x00/rt2800lib.c
> +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
> @@ -295,6 +295,20 @@ int rt2800_wait_wpdma_ready(struct rt2x00_dev *rt2x00dev)
> ?}
> ?EXPORT_SYMBOL_GPL(rt2800_wait_wpdma_ready);
>
> +void rt2800_disable_wpdma(struct rt2x00_dev *rt2x00dev)
> +{
> + ? ? ? u32 reg;
> +
> + ? ? ? rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, &reg);
> + ? ? ? rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
> + ? ? ? rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_DMA_BUSY, 0);
> + ? ? ? rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0);
> + ? ? ? rt2x00_set_field32(&reg, WPDMA_GLO_CFG_RX_DMA_BUSY, 0);
> + ? ? ? rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1);
> + ? ? ? rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
> +}
> +EXPORT_SYMBOL_GPL(rt2800_disable_wpdma);
> +
> ?static bool rt2800_check_firmware_crc(const u8 *data, const size_t len)
> ?{
> ? ? ? ?u16 fw_crc;
> @@ -436,10 +450,7 @@ int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
> ? ? ? ? * Disable DMA, will be reenabled later when enabling
> ? ? ? ? * the radio.
> ? ? ? ? */
> - ? ? ? rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, &reg);
> - ? ? ? rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
> - ? ? ? rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0);
> - ? ? ? rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
> + ? ? ? rt2800_disable_wpdma(rt2x00dev);
>
> ? ? ? ?/*
> ? ? ? ? * Initialize firmware.
> @@ -2717,13 +2728,7 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
> ? ? ? ?unsigned int i;
> ? ? ? ?int ret;
>
> - ? ? ? rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, &reg);
> - ? ? ? rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
> - ? ? ? rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_DMA_BUSY, 0);
> - ? ? ? rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0);
> - ? ? ? rt2x00_set_field32(&reg, WPDMA_GLO_CFG_RX_DMA_BUSY, 0);
> - ? ? ? rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1);
> - ? ? ? rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
> + ? ? ? rt2800_disable_wpdma(rt2x00dev);
>
> ? ? ? ?ret = rt2800_drv_init_registers(rt2x00dev);
> ? ? ? ?if (ret)
> @@ -3997,10 +4002,7 @@ void rt2800_disable_radio(struct rt2x00_dev *rt2x00dev)
> ?{
> ? ? ? ?u32 reg;
>
> - ? ? ? rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, &reg);
> - ? ? ? rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
> - ? ? ? rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0);
> - ? ? ? rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
> + ? ? ? rt2800_disable_wpdma(rt2x00dev);
>
> ? ? ? ?/* Wait for DMA, ignore error */
> ? ? ? ?rt2800_wait_wpdma_ready(rt2x00dev);
> diff --git a/drivers/net/wireless/rt2x00/rt2800lib.h b/drivers/net/wireless/rt2x00/rt2800lib.h
> index 419e36c..18a0b67 100644
> --- a/drivers/net/wireless/rt2x00/rt2800lib.h
> +++ b/drivers/net/wireless/rt2x00/rt2800lib.h
> @@ -208,5 +208,6 @@ int rt2800_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
> ? ? ? ? ? ? ? ? ? ? ? ?u8 buf_size);
> ?int rt2800_get_survey(struct ieee80211_hw *hw, int idx,
> ? ? ? ? ? ? ? ? ? ? ?struct survey_info *survey);
> +void rt2800_disable_wpdma(struct rt2x00_dev *rt2x00dev);
>
> ?#endif /* RT2800LIB_H */
> diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
> index 0397bbf..e499389 100644
> --- a/drivers/net/wireless/rt2x00/rt2800pci.c
> +++ b/drivers/net/wireless/rt2x00/rt2800pci.c
> @@ -361,7 +361,6 @@ static void rt2800pci_clear_entry(struct queue_entry *entry)
> ?static int rt2800pci_init_queues(struct rt2x00_dev *rt2x00dev)
> ?{
> ? ? ? ?struct queue_entry_priv_pci *entry_priv;
> - ? ? ? u32 reg;
>
> ? ? ? ?/*
> ? ? ? ? * Initialize registers.
> @@ -402,14 +401,7 @@ static int rt2800pci_init_queues(struct rt2x00_dev *rt2x00dev)
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? rt2x00dev->rx[0].limit - 1);
> ? ? ? ?rt2x00pci_register_write(rt2x00dev, RX_DRX_IDX, 0);
>
> - ? ? ? /*
> - ? ? ? ?* Enable global DMA configuration
> - ? ? ? ?*/
> - ? ? ? rt2x00pci_register_read(rt2x00dev, WPDMA_GLO_CFG, &reg);
> - ? ? ? rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
> - ? ? ? rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0);
> - ? ? ? rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1);
> - ? ? ? rt2x00pci_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
> + ? ? ? rt2800_disable_wpdma(rt2x00dev);
>
> ? ? ? ?rt2x00pci_register_write(rt2x00dev, DELAY_INT_CFG, 0);
>
> --
> 1.7.7.6
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to [email protected]
> More majordomo info at ?http://vger.kernel.org/majordomo-info.html



--
---
Gertjan

2012-04-03 01:41:06

by Jakub Kicinski

[permalink] [raw]
Subject: [PATCH v2 4/4] rt2800: zero registers of unused TX rings

This is needed if we take over after drivers which use those.

Signed-off-by: Jakub Kicinski <[email protected]>
Acked-by: Gertjan van Wingerde <[email protected]>
---
drivers/net/wireless/rt2x00/rt2800pci.c | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
index 4366c23..f9f36cf 100644
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
@@ -393,6 +393,16 @@ static int rt2800pci_init_queues(struct rt2x00_dev *rt2x00dev)
rt2x00pci_register_write(rt2x00dev, TX_CTX_IDX3, 0);
rt2x00pci_register_write(rt2x00dev, TX_DTX_IDX3, 0);

+ rt2x00pci_register_write(rt2x00dev, TX_BASE_PTR4, 0);
+ rt2x00pci_register_write(rt2x00dev, TX_MAX_CNT4, 0);
+ rt2x00pci_register_write(rt2x00dev, TX_CTX_IDX4, 0);
+ rt2x00pci_register_write(rt2x00dev, TX_DTX_IDX4, 0);
+
+ rt2x00pci_register_write(rt2x00dev, TX_BASE_PTR5, 0);
+ rt2x00pci_register_write(rt2x00dev, TX_MAX_CNT5, 0);
+ rt2x00pci_register_write(rt2x00dev, TX_CTX_IDX5, 0);
+ rt2x00pci_register_write(rt2x00dev, TX_DTX_IDX5, 0);
+
entry_priv = rt2x00dev->rx->entries[0].priv_data;
rt2x00pci_register_write(rt2x00dev, RX_BASE_PTR, entry_priv->desc_dma);
rt2x00pci_register_write(rt2x00dev, RX_MAX_CNT,
--
1.7.7.6