[rt2x00-users] [PATCH] Rt2x00 : Second version for the mcu fix.

Alban Browaeys prahal at yahoo.com
Wed Apr 22 05:32:26 CDT 2009


This is the simplified (no duplicatoin any more) versiono of the mcu fix.
Needs another change in the rfkill from EV_SW to EV_KEY otherwise after
 input_register_polled_device the mcu becomes unresponsive.



Signed-off-by: Alban Browaeys <prahal at yahoo.com>
---
 drivers/net/wireless/rt2x00/rt2800pci.c |   46 
+++++++++++++-----------------
 1 files changed, 20 insertions(+), 26 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c 
b/drivers/net/wireless/rt2x00/rt2800pci.c
index 0eb66d5..252614c 100644
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
@@ -232,6 +232,8 @@ static void rt2800pci_mcu_request(struct rt2x00_dev 
*rt2x00dev,
      * can safely write the new data into the register.
      */
     if (WAIT_FOR_MCU(rt2x00dev, &reg)) {
+        rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_STATUS, ~0);
+        rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
         rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_OWNER, 1);
         rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_CMD_TOKEN, token);
         rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_ARG0, arg0);
@@ -1300,6 +1302,12 @@ static int rt2800pci_load_firmware(struct 
rt2x00_dev *rt2x00dev,
     rt2x00pci_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00001);
 
     /*
+     * Initialize BBP R/W access agent
+     */
+    rt2x00pci_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
+    rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
+
+     /*
      * Wait for device to stabilize.
      */
     for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
@@ -1314,17 +1322,6 @@ static int rt2800pci_load_firmware(struct 
rt2x00_dev *rt2x00dev,
         return -EBUSY;
     }
 
-    /*
-     * Disable interrupts
-     */
-    rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_RADIO_IRQ_OFF);
-
-    /*
-     * Initialize BBP R/W access agent
-     */
-    rt2x00pci_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
-    rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
-
     return 0;
 }
 
@@ -1708,14 +1705,6 @@ static int rt2800pci_wait_bbp_ready(struct 
rt2x00_dev *rt2x00dev)
     unsigned int i;
     u8 value;
 
-    /*
-     * BBP was enabled after firmware was loaded,
-     * but we need to reactivate it now.
-     */
-    rt2x00pci_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
-    rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
-    msleep(1);
-
     for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
         rt2800pci_bbp_read(rt2x00dev, 0, &value);
         if ((value != 0xff) && (value != 0x00))
@@ -1956,8 +1945,8 @@ static void rt2800pci_toggle_irq(struct rt2x00_dev 
*rt2x00dev,
     rt2x00_set_field32(&reg, INT_MASK_CSR_AC1_DMA_DONE, mask);
     rt2x00_set_field32(&reg, INT_MASK_CSR_AC2_DMA_DONE, mask);
     rt2x00_set_field32(&reg, INT_MASK_CSR_AC3_DMA_DONE, mask);
-    rt2x00_set_field32(&reg, INT_MASK_CSR_HCCA_DMA_DONE, mask);
-    rt2x00_set_field32(&reg, INT_MASK_CSR_MGMT_DMA_DONE, mask);
+    rt2x00_set_field32(&reg, INT_MASK_CSR_HCCA_DMA_DONE, 0);
+    rt2x00_set_field32(&reg, INT_MASK_CSR_MGMT_DMA_DONE, 0);
     rt2x00_set_field32(&reg, INT_MASK_CSR_MCU_COMMAND, mask);
     rt2x00_set_field32(&reg, INT_MASK_CSR_RXTX_COHERENT, mask);
     rt2x00_set_field32(&reg, INT_MASK_CSR_TBTT, mask);
@@ -2005,11 +1994,6 @@ static int rt2800pci_enable_radio(struct 
rt2x00_dev *rt2x00dev)
         return -EIO;
 
     /*
-     * Send signal to firmware during boot time.
-     */
-    rt2800pci_mcu_request(rt2x00dev, MCU_BOOT_SIGNAL, 0xff, 0, 0);
-
-    /*
      * Enable RX.
      */
     rt2x00pci_register_read(rt2x00dev, MAC_SYS_CTRL, &reg);
@@ -2044,6 +2028,11 @@ static int rt2800pci_enable_radio(struct 
rt2x00_dev *rt2x00dev)
     rt2800pci_mcu_request(rt2x00dev, MCU_LED_3, 0xff,
                   word & 0xff, (word >> 8) & 0xff);
 
+    /*
+     * Send signal to firmware during boot time.
+     */
+    rt2800pci_mcu_request(rt2x00dev, MCU_BOOT_SIGNAL, 0xff, 0, 0);
+
     return 0;
 }
 
@@ -2091,6 +2080,11 @@ static int rt2800pci_set_device_state(struct 
rt2x00_dev *rt2x00dev,
     switch (state) {
     case STATE_RADIO_ON:
         /*
+         * Disable interrupts
+         */
+        rt2x00dev->ops->lib->set_device_state(rt2x00dev, 
STATE_RADIO_IRQ_OFF);
+
+        /*
          * Before the radio can be enabled, the device first has
          * to be woken up. After that it needs a bit of time
          * to be fully awake and the radio can be enabled.
-- 
1.6.2.4





More information about the users mailing list