void rtl8821au_firmware_selfreset(struct rtl_priv *rtlpriv) { struct rtl_hal *rtlhal = rtl_hal(rtlpriv); uint8_t u1bTmp, u1bTmp2; /* Reset MCU IO Wrapper- sugggest by SD1-Gimmy */ if (IS_HARDWARE_TYPE_8812(rtlhal)) { u1bTmp2 = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1); rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, u1bTmp2&(~BIT3)); } else if (IS_HARDWARE_TYPE_8821(rtlhal)) { u1bTmp2 = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1); rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, u1bTmp2&(~BIT0)); } u1bTmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1); rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, u1bTmp&(~BIT2)); /* Enable MCU IO Wrapper */ if (IS_HARDWARE_TYPE_8812(rtlhal)) { u1bTmp2 = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1); rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, u1bTmp2 | (BIT3)); } else if (IS_HARDWARE_TYPE_8821(rtlhal)) { u1bTmp2 = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1); rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, u1bTmp2 | (BIT0)); } rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, u1bTmp|(BIT2)); RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, " _8051Reset8812(): 8051 reset success .\n"); }
static bool _rtl92s_firmware_enable_cpu( struct ieee80211_hw *hw ) { struct rtl_priv *rtlpriv = rtl_priv( hw ); u32 ichecktime = 200; u16 tmpu2b; u8 tmpu1b, cpustatus = 0; _rtl92s_fw_set_rqpn( hw ); /* Enable CPU. */ tmpu1b = rtl_read_byte( rtlpriv, SYS_CLKR ); /* AFE source */ rtl_write_byte( rtlpriv, SYS_CLKR, ( tmpu1b | SYS_CPU_CLKSEL ) ); tmpu2b = rtl_read_word( rtlpriv, REG_SYS_FUNC_EN ); rtl_write_word( rtlpriv, REG_SYS_FUNC_EN, ( tmpu2b | FEN_CPUEN ) ); /* Polling IMEM Ready after CPU has refilled. */ do { cpustatus = rtl_read_byte( rtlpriv, TCR ); if ( cpustatus & IMEM_RDY ) { RT_TRACE( COMP_INIT, DBG_LOUD, ( "IMEM Ready after CPU has refilled.\n" ) ); break; } udelay( 100 ); } while ( ichecktime-- ); if ( !( cpustatus & IMEM_RDY ) ) return false; return true; }
static int _rtl92s_firmware_enable_cpu(struct ieee80211_hw *hw) { struct rtl_priv *rtlpriv = rtl_priv(hw); u32 ichecktime = 200; u16 tmpu2b; u8 tmpu1b, cpustatus = 0; /* select clock */ tmpu1b = rtl_read_byte(rtlpriv, REG_SYS_CLKR); rtl_write_byte(rtlpriv, REG_SYS_CLKR, (tmpu1b | SYS_CPU_CLKSEL)); /* Enable CPU. */ tmpu2b = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN); rtl_write_word(rtlpriv, REG_SYS_FUNC_EN, (tmpu2b | FEN_CPUEN)); /* Polling IMEM Ready after CPU has refilled. */ do { cpustatus = rtl_read_byte(rtlpriv, REG_TCR); if (cpustatus & IMEM_RDY) { RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "IMEM Ready after CPU has refilled\n"); break; } udelay(100); } while (ichecktime--); return !!(cpustatus & IMEM_RDY) ? 0 : -ETIMEDOUT; }
void rtl88ee_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled) { u8 ledcfg; struct rtl_priv *rtlpriv = rtl_priv(hw); RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, "LedAddr:%X ledpin =%d\n", REG_LEDCFG2, pled->ledpin); switch (pled->ledpin) { case LED_PIN_GPIO0: break; case LED_PIN_LED0: ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2); rtl_write_byte(rtlpriv, REG_LEDCFG2, (ledcfg & 0xf0) | BIT(5) | BIT(6)); break; case LED_PIN_LED1: ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG1); rtl_write_byte(rtlpriv, REG_LEDCFG1, ledcfg & 0x10); break; default: RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "switch case not processed\n"); break; } pled->ledon = true; }
void rtl8812ae_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled) { u16 ledreg = REG_LEDCFG1; u8 ledcfg = 0; struct rtl_priv *rtlpriv = rtl_priv(hw); switch (pled->ledpin) { case LED_PIN_LED0: ledreg = REG_LEDCFG1; break; case LED_PIN_LED1: ledreg = REG_LEDCFG2; break; case LED_PIN_GPIO0: default: break; } RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, "In SwLedOn, LedAddr:%X LEDPIN=%d\n", ledreg, pled->ledpin); ledcfg = rtl_read_byte(rtlpriv, ledreg); ledcfg |= BIT(5); /*Set 0x4c[21]*/ ledcfg &= ~(BIT(7) | BIT(6) | BIT(3) | BIT(2) | BIT(1) | BIT(0)); /*Clear 0x4c[23:22] and 0x4c[19:16]*/ rtl_write_byte(rtlpriv, ledreg, ledcfg); /*SW control led0 on.*/ pled->ledon = true; }
void rtl92se_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled) { u8 ledcfg; struct rtl_priv *rtlpriv = rtl_priv(hw); RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, ("LedAddr:%X ledpin=%d\n", LEDCFG, pled->ledpin)); ledcfg = rtl_read_byte(rtlpriv, LEDCFG); switch (pled->ledpin) { case LED_PIN_GPIO0: break; case LED_PIN_LED0: rtl_write_byte(rtlpriv, LEDCFG, ledcfg & 0xf0); break; case LED_PIN_LED1: rtl_write_byte(rtlpriv, LEDCFG, ledcfg & 0x0f); break; default: RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("switch case not process\n")); break; } pled->ledon = true; }
void rtl92se_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled) { struct rtl_priv *rtlpriv; struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); u8 ledcfg; rtlpriv = rtl_priv(hw); if (!rtlpriv || rtlpriv->max_fw_size) return; RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, ("LedAddr:%X ledpin=%d\n", LEDCFG, pled->ledpin)); ledcfg = rtl_read_byte(rtlpriv, LEDCFG); switch (pled->ledpin) { case LED_PIN_GPIO0: break; case LED_PIN_LED0: ledcfg &= 0xf0; if (pcipriv->ledctl.led_opendrain) rtl_write_byte(rtlpriv, LEDCFG, (ledcfg | BIT(1))); else rtl_write_byte(rtlpriv, LEDCFG, (ledcfg | BIT(3))); break; case LED_PIN_LED1: ledcfg &= 0x0f; rtl_write_byte(rtlpriv, LEDCFG, (ledcfg | BIT(3))); break; default: RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("switch case not process\n")); break; } pled->ledon = false; }
void rtl92ce_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled) { u8 ledcfg; struct rtl_priv *rtlpriv = rtl_priv(hw); RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, "LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin); ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2); switch (pled->ledpin) { case LED_PIN_GPIO0: break; case LED_PIN_LED0: rtl_write_byte(rtlpriv, REG_LEDCFG2, (ledcfg & 0xf0) | BIT(5) | BIT(6)); break; case LED_PIN_LED1: rtl_write_byte(rtlpriv, REG_LEDCFG2, (ledcfg & 0x0f) | BIT(5)); break; default: pr_err("switch case %#x not processed\n", pled->ledpin); break; } pled->ledon = true; }
/************************************************************ * IO related function ************************************************************/ u8 halbtc_read_1byte(void *bt_context, u32 reg_addr) { struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context; struct rtl_priv *rtlpriv = btcoexist->adapter; return rtl_read_byte(rtlpriv, reg_addr); }
void rtl8723ae_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled) { struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); u8 ledcfg; RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, "LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin); ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2); switch (pled->ledpin) { case LED_PIN_GPIO0: break; case LED_PIN_LED0: ledcfg &= 0xf0; if (pcipriv->ledctl.led_opendrain) rtl_write_byte(rtlpriv, REG_LEDCFG2, (ledcfg | BIT(1) | BIT(5) | BIT(6))); else rtl_write_byte(rtlpriv, REG_LEDCFG2, (ledcfg | BIT(3) | BIT(5) | BIT(6))); break; case LED_PIN_LED1: ledcfg &= 0x0f; rtl_write_byte(rtlpriv, REG_LEDCFG2, (ledcfg | BIT(3))); break; default: RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "switch case not processed\n"); break; } pled->ledon = false; }
static void _rtl92su_hw_configure(struct ieee80211_hw *hw) { struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_phy *rtlphy = &(rtlpriv->phy); struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); u8 reg_bw_opmode = 0; u32 reg_rrsr = 0; u8 regtmp = 0; reg_bw_opmode = BW_OPMODE_20MHZ; reg_rrsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG; regtmp = rtl_read_byte(rtlpriv, REG_INIRTSMCS_SEL); reg_rrsr = ((reg_rrsr & 0x000fffff) << 8) | regtmp; rtl_write_dword(rtlpriv, REG_INIRTSMCS_SEL, reg_rrsr); rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode); rtl_write_byte(rtlpriv, REG_MLT, 0x8f); /* For Min Spacing configuration. */ switch (rtlphy->rf_type) { case RF_1T2R: case RF_1T1R: rtlhal->minspace_cfg = (MAX_MSS_DENSITY_1T << 3); break; case RF_2T2R: case RF_2T2R_GREEN: rtlhal->minspace_cfg = (MAX_MSS_DENSITY_2T << 3); break; } rtl_write_byte(rtlpriv, AMPDU_MIN_SPACE, rtlhal->minspace_cfg); }
void rtl8723be_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled) { struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); u8 ledcfg; RT_TRACE(COMP_LED, DBG_LOUD, ("LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin)); ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2); switch (pled->ledpin) { case LED_PIN_GPIO0: break; case LED_PIN_LED0: ledcfg &= 0xf0; if (pcipriv->ledctl.bled_opendrain == true) { ledcfg &= 0x90; /* Set to software control. */ rtl_write_byte(rtlpriv, REG_LEDCFG2, (ledcfg|BIT(3))); ledcfg = rtl_read_byte(rtlpriv, REG_MAC_PINMUX_CFG); ledcfg &= 0xFE; rtl_write_byte(rtlpriv, REG_MAC_PINMUX_CFG, ledcfg); } else { ledcfg &= ~BIT(6); rtl_write_byte(rtlpriv, REG_LEDCFG2, (ledcfg | BIT(3) | BIT(5))); } break; case LED_PIN_LED1: ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG1); ledcfg &= 0x10; /* Set to software control. */ rtl_write_byte(rtlpriv, REG_LEDCFG1, ledcfg|BIT(3)); break; default: RT_TRACE(COMP_ERR, DBG_EMERG, ("switch case not process \n")); break; } pled->b_ledon = false; }
void rtl92c_init_retry_function(struct ieee80211_hw *hw) { u8 value8; struct rtl_priv *rtlpriv = rtl_priv(hw); value8 = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL); value8 |= EN_AMPDU_RTY_NEW; rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL, value8); /* Set ACK timeout */ rtl_write_byte(rtlpriv, REG_ACKTO, 0x40); }
int rtl8723_download_fw(struct ieee80211_hw *hw, bool is_8723be, int max_count) { struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); struct rtlwifi_firmware_header *pfwheader; u8 *pfwdata; u32 fwsize; int err; enum version_8723e version = rtlhal->version; int max_page; if (!rtlhal->pfirmware) return 1; pfwheader = (struct rtlwifi_firmware_header *)rtlhal->pfirmware; pfwdata = rtlhal->pfirmware; fwsize = rtlhal->fwsize; if (!is_8723be) max_page = 6; else max_page = 8; if (rtlpriv->cfg->ops->is_fw_header(pfwheader)) { RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "Firmware Version(%d), Signature(%#x), Size(%d)\n", pfwheader->version, pfwheader->signature, (int)sizeof(struct rtlwifi_firmware_header)); pfwdata = pfwdata + sizeof(struct rtlwifi_firmware_header); fwsize = fwsize - sizeof(struct rtlwifi_firmware_header); } if (rtl_read_byte(rtlpriv, REG_MCUFWDL)&BIT(7)) { if (is_8723be) rtl8723be_firmware_selfreset(hw); else rtl8723ae_firmware_selfreset(hw); rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00); } rtl8723_enable_fw_download(hw, true); rtl8723_write_fw(hw, version, pfwdata, fwsize, max_page); rtl8723_enable_fw_download(hw, false); err = rtl8723_fw_free_to_go(hw, is_8723be, max_count); if (err) { RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Firmware is not ready to run!\n"); } else { RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE, "Firmware is ready to run!\n"); } return 0; }
void rtl8812ae_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled) { u16 ledreg = REG_LEDCFG1; struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); switch (pled->ledpin) { case LED_PIN_LED0: ledreg = REG_LEDCFG1; break; case LED_PIN_LED1: ledreg = REG_LEDCFG2; break; case LED_PIN_GPIO0: default: break; } RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, "In SwLedOff,LedAddr:%X LEDPIN=%d\n", ledreg, pled->ledpin); /*Open-drain arrangement for controlling the LED*/ if (pcipriv->ledctl.led_opendrain == true) { u8 ledcfg = rtl_read_byte(rtlpriv, ledreg); ledreg &= 0xd0; /* Set to software control.*/ rtl_write_byte(rtlpriv, ledreg, (ledcfg | BIT(3))); /*Open-drain arrangement*/ ledcfg = rtl_read_byte(rtlpriv, REG_MAC_PINMUX_CFG); ledcfg &= 0xFE;/*Set GPIO[8] to input mode*/ rtl_write_byte(rtlpriv, REG_MAC_PINMUX_CFG, ledcfg); } else { rtl_write_byte(rtlpriv, ledreg, 0x28); } pled->ledon = false; }
void rtl8723be_firmware_selfreset(struct ieee80211_hw *hw) { u8 u1b_tmp; struct rtl_priv *rtlpriv = rtl_priv(hw); u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1); rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, (u1b_tmp & (~BIT(0)))); u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1); rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, (u1b_tmp & (~BIT(2)))); udelay(50); u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1); rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, (u1b_tmp | BIT(0))); u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1); rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, (u1b_tmp | BIT(2))); RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, " _8051Reset8723be(): 8051 reset success .\n"); }
void rtl8723_fw_page_write(struct ieee80211_hw *hw, u32 page, const u8 *buffer, u32 size) { struct rtl_priv *rtlpriv = rtl_priv(hw); u8 value8; u8 u8page = (u8) (page & 0x07); value8 = (rtl_read_byte(rtlpriv, REG_MCUFWDL + 2) & 0xF8) | u8page; rtl_write_byte(rtlpriv, (REG_MCUFWDL + 2), value8); rtl8723_fw_block_write(hw, buffer, size); }
void rtl8822be_tx_polling(struct ieee80211_hw *hw, u8 hw_queue) { struct rtl_priv *rtlpriv = rtl_priv(hw); if (hw_queue == BEACON_QUEUE) { /* kick start */ rtl_write_byte( rtlpriv, REG_RX_RXBD_NUM_8822B + 1, rtl_read_byte(rtlpriv, REG_RX_RXBD_NUM_8822B + 1) | BIT(4)); } }
void rtl8723_enable_fw_download(struct ieee80211_hw *hw, bool enable) { struct rtl_priv *rtlpriv = rtl_priv(hw); u8 tmp; if (enable) { tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1); rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp | 0x04); tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL); rtl_write_byte(rtlpriv, REG_MCUFWDL, tmp | 0x01); tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL + 2); rtl_write_byte(rtlpriv, REG_MCUFWDL + 2, tmp & 0xf7); } else { tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL); rtl_write_byte(rtlpriv, REG_MCUFWDL, tmp & 0xfe); rtl_write_byte(rtlpriv, REG_MCUFWDL + 1, 0x00); } }
void rtl8723ae_firmware_selfreset(struct ieee80211_hw *hw) { u8 u1b_tmp; u8 delay = 100; struct rtl_priv *rtlpriv = rtl_priv(hw); rtl_write_byte(rtlpriv, REG_HMETFR + 3, 0x20); u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1); while (u1b_tmp & BIT(2)) { delay--; if (delay == 0) break; udelay(50); u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1); } if (delay == 0) { u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1); rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, u1b_tmp&(~BIT(2))); } }
void rtl88ee_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled) { struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); u8 ledcfg; u8 val; RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, "LedAddr:%X ledpin =%d\n", REG_LEDCFG2, pled->ledpin); switch (pled->ledpin) { case LED_PIN_GPIO0: break; case LED_PIN_LED0: ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2); ledcfg &= 0xf0; val = ledcfg | BIT(3) | BIT(5) | BIT(6); if (pcipriv->ledctl.led_opendrain == true) { rtl_write_byte(rtlpriv, REG_LEDCFG2, val); ledcfg = rtl_read_byte(rtlpriv, REG_MAC_PINMUX_CFG); val = ledcfg & 0xFE; rtl_write_byte(rtlpriv, REG_MAC_PINMUX_CFG, val); } else { rtl_write_byte(rtlpriv, REG_LEDCFG2, val); } break; case LED_PIN_LED1: ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG1); ledcfg &= 0x10; rtl_write_byte(rtlpriv, REG_LEDCFG1, (ledcfg | BIT(3))); break; default: RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "switch case not processed\n"); break; } pled->ledon = false; }
void rtl92de_sw_led_on( struct ieee80211_hw *hw, struct rtl_led *pled ) { u8 ledcfg; struct rtl_priv *rtlpriv = rtl_priv( hw ); RT_TRACE( rtlpriv, COMP_LED, DBG_LOUD, "LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin ); switch ( pled->ledpin ) { case LED_PIN_GPIO0: break; case LED_PIN_LED0: ledcfg = rtl_read_byte( rtlpriv, REG_LEDCFG2 ); if ( ( rtlpriv->efuse.eeprom_did == 0x8176 ) || ( rtlpriv->efuse.eeprom_did == 0x8193 ) ) /* BIT7 of REG_LEDCFG2 should be set to * make sure we could emit the led2. */ rtl_write_byte( rtlpriv, REG_LEDCFG2, ( ledcfg & 0xf0 ) | BIT( 7 ) | BIT( 5 ) | BIT( 6 ) ); else rtl_write_byte( rtlpriv, REG_LEDCFG2, ( ledcfg & 0xf0 ) | BIT( 7 ) | BIT( 5 ) ); break; case LED_PIN_LED1: ledcfg = rtl_read_byte( rtlpriv, REG_LEDCFG1 ); rtl_write_byte( rtlpriv, REG_LEDCFG2, ( ledcfg & 0x0f ) | BIT( 5 ) ); break; default: pr_err( "switch case %#x not processed\n", pled->ledpin ); break; } pled->ledon = true; }
void halbtc_bitmask_write_1byte(void *bt_context, u32 reg_addr, u8 bit_mask, u8 data) { struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context; struct rtl_priv *rtlpriv = btcoexist->adapter; u8 original_value, bit_shift = 0; u8 i; if (bit_mask != MASKDWORD) {/*if not "double word" write*/ original_value = rtl_read_byte(rtlpriv, reg_addr); for (i=0; i<=7; i++) { if((bit_mask>>i)&0x1) break; } bit_shift = i; data = (original_value & (~bit_mask)) | ((data << bit_shift) & bit_mask); }
static uint8_t _is_fw_read_cmd_down(struct rtl_priv *rtlpriv, uint8_t msgbox_num) { uint8_t read_down = _FALSE; int retry_cnts = 100; uint8_t valid; /* DBG_8192C(" _is_fw_read_cmd_down ,reg_1cc(%x),msg_box(%d)...\n",rtl_read_byte(rtlpriv,REG_HMETFR),msgbox_num); */ do { valid = rtl_read_byte(rtlpriv, REG_HMETFR) & BIT(msgbox_num); if (0 == valid) { read_down = _TRUE; } } while ((!read_down) && (retry_cnts--)); return read_down; }
void _rtl92ce_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t) { u8 tmpreg; u32 rf_a_mode = 0, rf_b_mode = 0, lc_cal; struct rtl_priv *rtlpriv = rtl_priv(hw); tmpreg = rtl_read_byte(rtlpriv, 0xd03); if ((tmpreg & 0x70) != 0) rtl_write_byte(rtlpriv, 0xd03, tmpreg & 0x8F); else rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF); if ((tmpreg & 0x70) != 0) { rf_a_mode = rtl_get_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS); if (is2t) rf_b_mode = rtl_get_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS); rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS, (rf_a_mode & 0x8FFFF) | 0x10000); if (is2t) rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS, (rf_b_mode & 0x8FFFF) | 0x10000); } lc_cal = rtl_get_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS); rtl_set_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS, lc_cal | 0x08000); mdelay(100); if ((tmpreg & 0x70) != 0) { rtl_write_byte(rtlpriv, 0xd03, tmpreg); rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS, rf_a_mode); if (is2t) rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS, rf_b_mode); } else { rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00); } }
static void rtl92d_early_mode_enabled(struct rtl_priv *rtlpriv) { if ((rtlpriv->mac80211.link_state >= MAC80211_LINKED) && (rtlpriv->mac80211.vendor == PEER_CISCO)) { RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, ("IOT_PEER = CISCO\n")); if (de_digtable.last_min_undecorated_pwdb_for_dm >= 50 && de_digtable.min_undecorated_pwdb_for_dm < 50) { rtl_write_byte(rtlpriv, REG_EARLY_MODE_CONTROL, 0x00); RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, ("Early Mode Off\n")); } else if (de_digtable.last_min_undecorated_pwdb_for_dm <= 55 && de_digtable.min_undecorated_pwdb_for_dm > 55) { rtl_write_byte(rtlpriv, REG_EARLY_MODE_CONTROL, 0x0f); RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, ("Early Mode On\n")); } } else if (!(rtl_read_byte(rtlpriv, REG_EARLY_MODE_CONTROL) & 0xf)) { rtl_write_byte(rtlpriv, REG_EARLY_MODE_CONTROL, 0x0f); RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, ("Early Mode On\n")); } }
/*------------------------------------------------------------------------- * HW MAC Address *-------------------------------------------------------------------------*/ void rtl92c_set_mac_addr(struct ieee80211_hw *hw, const u8 *addr) { u32 i; struct rtl_priv *rtlpriv = rtl_priv(hw); for (i = 0 ; i < ETH_ALEN ; i++) rtl_write_byte(rtlpriv, (REG_MACID + i), *(addr+i)); RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, "MAC Address: %02X-%02X-%02X-%02X-%02X-%02X\n", rtl_read_byte(rtlpriv, REG_MACID), rtl_read_byte(rtlpriv, REG_MACID+1), rtl_read_byte(rtlpriv, REG_MACID+2), rtl_read_byte(rtlpriv, REG_MACID+3), rtl_read_byte(rtlpriv, REG_MACID+4), rtl_read_byte(rtlpriv, REG_MACID+5)); }
void rtl92ce_phy_set_bw_mode_callback(struct ieee80211_hw *hw) { struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); struct rtl_phy *rtlphy = &(rtlpriv->phy); struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); u8 reg_bw_opmode; u8 reg_prsr_rsc; RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, ("Switch to %s bandwidth\n", rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ? "20MHz" : "40MHz")) if (is_hal_stop(rtlhal)) { rtlphy->set_bwmode_inprogress = false; return; } reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE); reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2); switch (rtlphy->current_chan_bw) { case HT_CHANNEL_WIDTH_20: reg_bw_opmode |= BW_OPMODE_20MHZ; rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode); break; case HT_CHANNEL_WIDTH_20_40: reg_bw_opmode &= ~BW_OPMODE_20MHZ; rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode); reg_prsr_rsc = (reg_prsr_rsc & 0x90) | (mac->cur_40_prime_sc << 5); rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc); break; default: RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("unknown bandwidth: %#X\n", rtlphy->current_chan_bw)); break; } switch (rtlphy->current_chan_bw) { case HT_CHANNEL_WIDTH_20: rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0); rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0); rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 1); break; case HT_CHANNEL_WIDTH_20_40: rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1); rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1); rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCK_SIDEBAND, (mac->cur_40_prime_sc >> 1)); rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00, mac->cur_40_prime_sc); rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 0); rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)), (mac->cur_40_prime_sc == HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1); break; default: RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("unknown bandwidth: %#X\n", rtlphy->current_chan_bw)); break; } rtl92ce_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw); rtlphy->set_bwmode_inprogress = false; RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, ("<==\n")); }
static bool _rtl92s_firmware_checkready( struct ieee80211_hw *hw, u8 loadfw_status ) { struct rtl_priv *rtlpriv = rtl_priv( hw ); struct rtl_hal *rtlhal = rtl_hal( rtl_priv( hw ) ); struct rt_firmware *pfirmware = ( struct rt_firmware * )rtlhal->pfirmware; u32 tmpu4b; u8 cpustatus = 0; short pollingcnt = 1000; bool rtstatus = true; RT_TRACE( COMP_INIT, DBG_LOUD, ( "LoadStaus(%d)\n", loadfw_status ) ); pfirmware->fwstatus = ( enum fw_status )loadfw_status; switch ( loadfw_status ) { case FW_STATUS_LOAD_IMEM: /* Polling IMEM code done. */ do { cpustatus = rtl_read_byte( rtlpriv, TCR ); if ( cpustatus & IMEM_CODE_DONE ) break; udelay( 5 ); } while ( pollingcnt-- ); if ( !( cpustatus & IMEM_CHK_RPT ) || ( pollingcnt <= 0 ) ) { RT_TRACE( COMP_ERR, DBG_EMERG, ( "FW_STATUS_LOAD_IMEM" " FAIL CPU, Status=%x\r\n", cpustatus ) ); goto status_check_fail; } break; case FW_STATUS_LOAD_EMEM: /* Check Put Code OK and Turn On CPU */ /* Polling EMEM code done. */ do { cpustatus = rtl_read_byte( rtlpriv, TCR ); if ( cpustatus & EMEM_CODE_DONE ) break; udelay( 5 ); } while ( pollingcnt-- ); if ( !( cpustatus & EMEM_CHK_RPT ) || ( pollingcnt <= 0 ) ) { RT_TRACE( COMP_ERR, DBG_EMERG, ( "FW_STATUS_LOAD_EMEM" " FAIL CPU, Status=%x\r\n", cpustatus ) ); goto status_check_fail; } /* Turn On CPU */ rtstatus = _rtl92s_firmware_enable_cpu( hw ); if ( rtstatus != true ) { RT_TRACE( COMP_ERR, DBG_EMERG, ( "Enable CPU fail ! \n" ) ); goto status_check_fail; } break; case FW_STATUS_LOAD_DMEM: /* Polling DMEM code done */ do { cpustatus = rtl_read_byte( rtlpriv, TCR ); if ( cpustatus & DMEM_CODE_DONE ) break; udelay( 5 ); } while ( pollingcnt-- ); if ( !( cpustatus & DMEM_CODE_DONE ) || ( pollingcnt <= 0 ) ) { RT_TRACE( COMP_ERR, DBG_EMERG, ( "Polling DMEM code done" " fail ! cpustatus(%#x)\n", cpustatus ) ); goto status_check_fail; } RT_TRACE( COMP_INIT, DBG_LOUD, ( "DMEM code download success," " cpustatus(%#x)\n", cpustatus ) ); /* Prevent Delay too much and being scheduled out */ /* Polling Load Firmware ready */ pollingcnt = 2000; do { cpustatus = rtl_read_byte( rtlpriv, TCR ); if( cpustatus & FWRDY ) break; udelay( 40 ); } while ( pollingcnt-- ); RT_TRACE( COMP_INIT, DBG_LOUD, ( "Polling Load Firmware ready," " cpustatus(%x)\n", cpustatus ) ); if ( ( ( cpustatus & LOAD_FW_READY ) != LOAD_FW_READY ) || ( pollingcnt <= 0 ) ) { RT_TRACE( COMP_ERR, DBG_EMERG, ( "Polling Load Firmware" " ready fail ! cpustatus(%x)\n", cpustatus ) ); goto status_check_fail; } /* If right here, we can set TCR/RCR to desired value */ /* and config MAC lookback mode to normal mode */ tmpu4b = rtl_read_dword( rtlpriv, TCR ); rtl_write_dword( rtlpriv, TCR, ( tmpu4b & ( ~TCR_ICV ) ) ); tmpu4b = rtl_read_dword( rtlpriv, RCR ); rtl_write_dword( rtlpriv, RCR, ( tmpu4b | RCR_APPFCS | RCR_APP_ICV | RCR_APP_MIC ) ); RT_TRACE( COMP_INIT, DBG_LOUD, ( "Current RCR settings(%#x)\n", tmpu4b ) ); /* Set to normal mode. */ rtl_write_byte( rtlpriv, LBKMD_SEL, LBK_NORMAL ); break; default : RT_TRACE( COMP_INIT, DBG_EMERG, ( "Unknown status check!\n" ) ); rtstatus = false; break; } status_check_fail: RT_TRACE( COMP_INIT, DBG_LOUD, ( "loadfw_status(%d), " "rtstatus(%x)\n", loadfw_status, rtstatus ) ); return rtstatus; }
/* * Description: * This routine deal with the Power Configuration CMDs * parsing for RTL8723/RTL8188E Series IC. * Assumption: * We should follow specific format which was released from HW SD. * * 2011.07.07, added by Roger. */ bool rtl_hal_pwrseqcmdparsing(struct rtl_priv *rtlpriv, u8 cut_version, u8 fab_version, u8 interface_type, struct wlan_pwr_cfg pwrcfgcmd[]) { struct wlan_pwr_cfg pwr_cfg_cmd = {0}; bool b_polling_bit = false; u32 ary_idx = 0; u8 value = 0; u32 offset = 0; u32 polling_count = 0; u32 max_polling_cnt = 5000; do { pwr_cfg_cmd = pwrcfgcmd[ary_idx]; RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "rtl_hal_pwrseqcmdparsing(): offset(%#x),cut_msk(%#x), fab_msk(%#x), interface_msk(%#x), base(%#x), cmd(%#x), msk(%#x), value(%#x)\n", GET_PWR_CFG_OFFSET(pwr_cfg_cmd), GET_PWR_CFG_CUT_MASK(pwr_cfg_cmd), GET_PWR_CFG_FAB_MASK(pwr_cfg_cmd), GET_PWR_CFG_INTF_MASK(pwr_cfg_cmd), GET_PWR_CFG_BASE(pwr_cfg_cmd), GET_PWR_CFG_CMD(pwr_cfg_cmd), GET_PWR_CFG_MASK(pwr_cfg_cmd), GET_PWR_CFG_VALUE(pwr_cfg_cmd)); if ((GET_PWR_CFG_FAB_MASK(pwr_cfg_cmd)&fab_version) && (GET_PWR_CFG_CUT_MASK(pwr_cfg_cmd)&cut_version) && (GET_PWR_CFG_INTF_MASK(pwr_cfg_cmd)&interface_type)) { switch (GET_PWR_CFG_CMD(pwr_cfg_cmd)) { case PWR_CMD_READ: RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "rtl_hal_pwrseqcmdparsing(): PWR_CMD_READ\n"); break; case PWR_CMD_WRITE: { RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "rtl_hal_pwrseqcmdparsing(): PWR_CMD_WRITE\n"); offset = GET_PWR_CFG_OFFSET(pwr_cfg_cmd); /*Read the value from system register*/ value = rtl_read_byte(rtlpriv, offset); value = value & (~(GET_PWR_CFG_MASK(pwr_cfg_cmd))); value = value | (GET_PWR_CFG_VALUE(pwr_cfg_cmd) & GET_PWR_CFG_MASK(pwr_cfg_cmd)); /*Write the value back to sytem register*/ rtl_write_byte(rtlpriv, offset, value); } break; case PWR_CMD_POLLING: RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "rtl_hal_pwrseqcmdparsing(): PWR_CMD_POLLING\n"); b_polling_bit = false; offset = GET_PWR_CFG_OFFSET(pwr_cfg_cmd); do { value = rtl_read_byte(rtlpriv, offset); value = value & GET_PWR_CFG_MASK(pwr_cfg_cmd); if (value == (GET_PWR_CFG_VALUE(pwr_cfg_cmd) & GET_PWR_CFG_MASK(pwr_cfg_cmd))) b_polling_bit = true; else udelay(10); if (polling_count++ > max_polling_cnt) { RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "polling fail in pwrseqcmd\n"); return false; } } while (!b_polling_bit); break; case PWR_CMD_DELAY: RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "rtl_hal_pwrseqcmdparsing(): PWR_CMD_DELAY\n"); if (GET_PWR_CFG_VALUE(pwr_cfg_cmd) == PWRSEQ_DELAY_US) udelay(GET_PWR_CFG_OFFSET(pwr_cfg_cmd)); else mdelay(GET_PWR_CFG_OFFSET(pwr_cfg_cmd)); break; case PWR_CMD_END: RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "rtl_hal_pwrseqcmdparsing(): PWR_CMD_END\n"); return true; break; default: RT_ASSERT(false, "rtl_hal_pwrseqcmdparsing(): Unknown CMD!!\n"); break; } } ary_idx++; } while (1); return true; }