|
@@ -1655,7 +1655,7 @@ EXPORT_SYMBOL_GPL(rt2800_link_tuner);
|
|
/*
|
|
/*
|
|
* Initialization functions.
|
|
* Initialization functions.
|
|
*/
|
|
*/
|
|
-int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
|
|
|
|
|
|
+static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
|
|
{
|
|
{
|
|
u32 reg;
|
|
u32 reg;
|
|
u16 eeprom;
|
|
u16 eeprom;
|
|
@@ -2025,7 +2025,6 @@ int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
-EXPORT_SYMBOL_GPL(rt2800_init_registers);
|
|
|
|
|
|
|
|
static int rt2800_wait_bbp_rf_ready(struct rt2x00_dev *rt2x00dev)
|
|
static int rt2800_wait_bbp_rf_ready(struct rt2x00_dev *rt2x00dev)
|
|
{
|
|
{
|
|
@@ -2068,7 +2067,7 @@ static int rt2800_wait_bbp_ready(struct rt2x00_dev *rt2x00dev)
|
|
return -EACCES;
|
|
return -EACCES;
|
|
}
|
|
}
|
|
|
|
|
|
-int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
|
|
|
|
|
|
+static int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
|
|
{
|
|
{
|
|
unsigned int i;
|
|
unsigned int i;
|
|
u16 eeprom;
|
|
u16 eeprom;
|
|
@@ -2163,7 +2162,6 @@ int rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
-EXPORT_SYMBOL_GPL(rt2800_init_bbp);
|
|
|
|
|
|
|
|
static u8 rt2800_init_rx_filter(struct rt2x00_dev *rt2x00dev,
|
|
static u8 rt2800_init_rx_filter(struct rt2x00_dev *rt2x00dev,
|
|
bool bw40, u8 rfcsr24, u8 filter_target)
|
|
bool bw40, u8 rfcsr24, u8 filter_target)
|
|
@@ -2225,7 +2223,7 @@ static u8 rt2800_init_rx_filter(struct rt2x00_dev *rt2x00dev,
|
|
return rfcsr24;
|
|
return rfcsr24;
|
|
}
|
|
}
|
|
|
|
|
|
-int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
|
|
|
|
|
|
+static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
|
|
{
|
|
{
|
|
u8 rfcsr;
|
|
u8 rfcsr;
|
|
u8 bbp;
|
|
u8 bbp;
|
|
@@ -2479,7 +2477,100 @@ int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
-EXPORT_SYMBOL_GPL(rt2800_init_rfcsr);
|
|
|
|
|
|
+
|
|
|
|
+int rt2800_enable_radio(struct rt2x00_dev *rt2x00dev)
|
|
|
|
+{
|
|
|
|
+ u32 reg;
|
|
|
|
+ u16 word;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Initialize all registers.
|
|
|
|
+ */
|
|
|
|
+ if (unlikely(rt2800_wait_wpdma_ready(rt2x00dev) ||
|
|
|
|
+ rt2800_init_registers(rt2x00dev) ||
|
|
|
|
+ rt2800_init_bbp(rt2x00dev) ||
|
|
|
|
+ rt2800_init_rfcsr(rt2x00dev)))
|
|
|
|
+ return -EIO;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Send signal to firmware during boot time.
|
|
|
|
+ */
|
|
|
|
+ rt2800_mcu_request(rt2x00dev, MCU_BOOT_SIGNAL, 0, 0, 0);
|
|
|
|
+
|
|
|
|
+ if (rt2x00_is_usb(rt2x00dev) &&
|
|
|
|
+ (rt2x00_rt(rt2x00dev, RT3070) ||
|
|
|
|
+ rt2x00_rt(rt2x00dev, RT3071) ||
|
|
|
|
+ rt2x00_rt(rt2x00dev, RT3572))) {
|
|
|
|
+ udelay(200);
|
|
|
|
+ rt2800_mcu_request(rt2x00dev, MCU_CURRENT, 0, 0, 0);
|
|
|
|
+ udelay(10);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Enable RX.
|
|
|
|
+ */
|
|
|
|
+ rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, ®);
|
|
|
|
+ rt2x00_set_field32(®, MAC_SYS_CTRL_ENABLE_TX, 1);
|
|
|
|
+ rt2x00_set_field32(®, MAC_SYS_CTRL_ENABLE_RX, 0);
|
|
|
|
+ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
|
|
|
|
+
|
|
|
|
+ udelay(50);
|
|
|
|
+
|
|
|
|
+ rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, ®);
|
|
|
|
+ rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_TX_DMA, 1);
|
|
|
|
+ rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_RX_DMA, 1);
|
|
|
|
+ rt2x00_set_field32(®, WPDMA_GLO_CFG_WP_DMA_BURST_SIZE, 2);
|
|
|
|
+ rt2x00_set_field32(®, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1);
|
|
|
|
+ rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
|
|
|
|
+
|
|
|
|
+ rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, ®);
|
|
|
|
+ rt2x00_set_field32(®, MAC_SYS_CTRL_ENABLE_TX, 1);
|
|
|
|
+ rt2x00_set_field32(®, MAC_SYS_CTRL_ENABLE_RX, 1);
|
|
|
|
+ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Initialize LED control
|
|
|
|
+ */
|
|
|
|
+ rt2x00_eeprom_read(rt2x00dev, EEPROM_LED1, &word);
|
|
|
|
+ rt2800_mcu_request(rt2x00dev, MCU_LED_1, 0xff,
|
|
|
|
+ word & 0xff, (word >> 8) & 0xff);
|
|
|
|
+
|
|
|
|
+ rt2x00_eeprom_read(rt2x00dev, EEPROM_LED2, &word);
|
|
|
|
+ rt2800_mcu_request(rt2x00dev, MCU_LED_2, 0xff,
|
|
|
|
+ word & 0xff, (word >> 8) & 0xff);
|
|
|
|
+
|
|
|
|
+ rt2x00_eeprom_read(rt2x00dev, EEPROM_LED3, &word);
|
|
|
|
+ rt2800_mcu_request(rt2x00dev, MCU_LED_3, 0xff,
|
|
|
|
+ word & 0xff, (word >> 8) & 0xff);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL_GPL(rt2800_enable_radio);
|
|
|
|
+
|
|
|
|
+void rt2800_disable_radio(struct rt2x00_dev *rt2x00dev)
|
|
|
|
+{
|
|
|
|
+ u32 reg;
|
|
|
|
+
|
|
|
|
+ rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, ®);
|
|
|
|
+ rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
|
|
|
|
+ rt2x00_set_field32(®, WPDMA_GLO_CFG_TX_DMA_BUSY, 0);
|
|
|
|
+ rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0);
|
|
|
|
+ rt2x00_set_field32(®, WPDMA_GLO_CFG_RX_DMA_BUSY, 0);
|
|
|
|
+ rt2x00_set_field32(®, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1);
|
|
|
|
+ rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
|
|
|
|
+
|
|
|
|
+ /* Wait for DMA, ignore error */
|
|
|
|
+ rt2800_wait_wpdma_ready(rt2x00dev);
|
|
|
|
+
|
|
|
|
+ rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, ®);
|
|
|
|
+ rt2x00_set_field32(®, MAC_SYS_CTRL_ENABLE_TX, 0);
|
|
|
|
+ rt2x00_set_field32(®, MAC_SYS_CTRL_ENABLE_RX, 0);
|
|
|
|
+ rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
|
|
|
|
+
|
|
|
|
+ rt2800_register_write(rt2x00dev, PWR_PIN_CFG, 0);
|
|
|
|
+ rt2800_register_write(rt2x00dev, TX_PIN_CFG, 0);
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL_GPL(rt2800_disable_radio);
|
|
|
|
|
|
int rt2800_efuse_detect(struct rt2x00_dev *rt2x00dev)
|
|
int rt2800_efuse_detect(struct rt2x00_dev *rt2x00dev)
|
|
{
|
|
{
|