[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, ®)) {
+ rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_STATUS, ~0);
+ rt2x00pci_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
rt2x00_set_field32(®, H2M_MAILBOX_CSR_OWNER, 1);
rt2x00_set_field32(®, H2M_MAILBOX_CSR_CMD_TOKEN, token);
rt2x00_set_field32(®, 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(®, INT_MASK_CSR_AC1_DMA_DONE, mask);
rt2x00_set_field32(®, INT_MASK_CSR_AC2_DMA_DONE, mask);
rt2x00_set_field32(®, INT_MASK_CSR_AC3_DMA_DONE, mask);
- rt2x00_set_field32(®, INT_MASK_CSR_HCCA_DMA_DONE, mask);
- rt2x00_set_field32(®, INT_MASK_CSR_MGMT_DMA_DONE, mask);
+ rt2x00_set_field32(®, INT_MASK_CSR_HCCA_DMA_DONE, 0);
+ rt2x00_set_field32(®, INT_MASK_CSR_MGMT_DMA_DONE, 0);
rt2x00_set_field32(®, INT_MASK_CSR_MCU_COMMAND, mask);
rt2x00_set_field32(®, INT_MASK_CSR_RXTX_COHERENT, mask);
rt2x00_set_field32(®, 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, ®);
@@ -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