static void _restore_network_status(_adapter *padapter) { HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX*)(&(pmlmeinfo->network)); unsigned short caps; u8 join_type; #if 1 //======================================================= // reset related register of Beacon control //set MSR to nolink Set_MSR(padapter, _HW_STATE_NOLINK_); // reject all data frame rtw_write16(padapter, REG_RXFLTMAP2,0x00); //reset TSF rtw_write8(padapter, REG_DUAL_TSF_RST, (BIT(0)|BIT(1))); // disable update TSF SetBcnCtrlReg(padapter, BIT(4), 0); //======================================================= rtw_joinbss_reset(padapter); set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); //pmlmeinfo->assoc_AP_vendor = maxAP; if (padapter->registrypriv.wifi_spec) { // for WiFi test, follow WMM test plan spec rtw_write32(padapter, REG_EDCA_VO_PARAM, 0x002F431C); rtw_write32(padapter, REG_EDCA_VI_PARAM, 0x005E541C); rtw_write32(padapter, REG_EDCA_BE_PARAM, 0x0000A525); rtw_write32(padapter, REG_EDCA_BK_PARAM, 0x0000A549); // for WiFi test, mixed mode with intel STA under bg mode throughput issue if (padapter->mlmepriv.htpriv.ht_option == 0) rtw_write32(padapter, REG_EDCA_BE_PARAM, 0x00004320); } else { rtw_write32(padapter, REG_EDCA_VO_PARAM, 0x002F3217); rtw_write32(padapter, REG_EDCA_VI_PARAM, 0x005E4317); rtw_write32(padapter, REG_EDCA_BE_PARAM, 0x00105320); rtw_write32(padapter, REG_EDCA_BK_PARAM, 0x0000A444); } //disable dynamic functions, such as high power, DIG //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); #endif rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress); join_type = 0; rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); Set_MSR(padapter, (pmlmeinfo->state & 0x3)); mlmeext_joinbss_event_callback(padapter, 1); //restore Sequence No. rtw_write8(padapter,0x4dc,padapter->xmitpriv.nqos_ssn); }
static void update_hw_ht_param(struct adapter *padapter) { unsigned char max_AMPDU_len; unsigned char min_MPDU_spacing; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; DBG_88E("%s\n", __func__); /* handle A-MPDU parameter field */ /* ampdu_params_info [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k ampdu_params_info [4:2]:Min MPDU Start Spacing */ max_AMPDU_len = pmlmeinfo->HT_caps.ampdu_params_info & 0x03; min_MPDU_spacing = (pmlmeinfo->HT_caps.ampdu_params_info & 0x1c) >> 2; rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_MIN_SPACE, (u8 *)(&min_MPDU_spacing)); rtw_hal_set_hwreg(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len)); /* */ /* Config SM Power Save setting */ /* */ pmlmeinfo->SM_PS = (le16_to_cpu(pmlmeinfo->HT_caps.cap_info) & 0x0C) >> 2; if (pmlmeinfo->SM_PS == WLAN_HT_CAP_SM_PS_STATIC) DBG_88E("%s(): WLAN_HT_CAP_SM_PS_STATIC\n", __func__); }
void hal_init_macaddr(_adapter *adapter) { rtw_hal_set_hwreg(adapter, HW_VAR_MAC_ADDR, adapter->eeprompriv.mac_addr); #ifdef CONFIG_CONCURRENT_MODE if (adapter->pbuddy_adapter) rtw_hal_set_hwreg(adapter->pbuddy_adapter, HW_VAR_MAC_ADDR, adapter->pbuddy_adapter->eeprompriv.mac_addr); #endif }
static void _restore_network_status(struct adapter *padapter) { struct hal_data_8188e *pHalData = GET_HAL_DATA(padapter); struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); struct wlan_bssid_ex *pnetwork = (struct wlan_bssid_ex*)(&(pmlmeinfo->network)); unsigned short caps; u8 join_type; /* */ /* reset related register of Beacon control */ /* set MSR to nolink */ Set_MSR(padapter, _HW_STATE_NOLINK_); /* reject all data frame */ rtw_write16(padapter, REG_RXFLTMAP2,0x00); /* reset TSF */ rtw_write8(padapter, REG_DUAL_TSF_RST, (BIT(0)|BIT(1))); /* disable update TSF */ SetBcnCtrlReg(padapter, BIT(4), 0); /* */ rtw_joinbss_reset(padapter); set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); if (padapter->registrypriv.wifi_spec) { /* for WiFi test, follow WMM test plan spec */ rtw_write32(padapter, REG_EDCA_VO_PARAM, 0x002F431C); rtw_write32(padapter, REG_EDCA_VI_PARAM, 0x005E541C); rtw_write32(padapter, REG_EDCA_BE_PARAM, 0x0000A525); rtw_write32(padapter, REG_EDCA_BK_PARAM, 0x0000A549); /* for WiFi test, mixed mode with intel STA under bg mode throughput issue */ if (padapter->mlmepriv.htpriv.ht_option == 0) rtw_write32(padapter, REG_EDCA_BE_PARAM, 0x00004320); } else { rtw_write32(padapter, REG_EDCA_VO_PARAM, 0x002F3217); rtw_write32(padapter, REG_EDCA_VI_PARAM, 0x005E4317); rtw_write32(padapter, REG_EDCA_BE_PARAM, 0x00105320); rtw_write32(padapter, REG_EDCA_BK_PARAM, 0x0000A444); } rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress); join_type = 0; rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); Set_MSR(padapter, (pmlmeinfo->state & 0x3)); mlmeext_joinbss_event_callback(padapter, 1); /* restore Sequence No. */ rtw_write8(padapter,0x4dc,padapter->xmitpriv.nqos_ssn); }
void rtw_set_ps_mode(struct rtl_priv *rtlpriv, uint8_t ps_mode, uint8_t smart_ps, uint8_t bcn_ant_mode) { struct pwrctrl_priv *pwrpriv = &rtlpriv->pwrctrlpriv; if (ps_mode > PM_Card_Disable) { return; } if (pwrpriv->pwr_mode == ps_mode) { if (PS_MODE_ACTIVE == ps_mode) return; if ((pwrpriv->smart_ps == smart_ps) && (pwrpriv->bcn_ant_mode == bcn_ant_mode)) { return; } } //if(pwrpriv->pwr_mode == PS_MODE_ACTIVE) if(ps_mode == PS_MODE_ACTIVE) { { DBG_871X("rtw_set_ps_mode: Leave 802.11 power save\n"); pwrpriv->pwr_mode = ps_mode; rtw_set_rpwm(rtlpriv, PS_STATE_S4); rtw_hal_set_hwreg(rtlpriv, HW_VAR_H2C_FW_PWRMODE, (uint8_t *)(&ps_mode)); pwrpriv->fw_current_inpsmode = false; } } else { if (PS_RDY_CHECK(rtlpriv)) { DBG_871X("%s: Enter 802.11 power save\n", __FUNCTION__); pwrpriv->fw_current_inpsmode = true; pwrpriv->pwr_mode = ps_mode; pwrpriv->smart_ps = smart_ps; pwrpriv->bcn_ant_mode = bcn_ant_mode; rtw_hal_set_hwreg(rtlpriv, HW_VAR_H2C_FW_PWRMODE, (uint8_t *)(&ps_mode)); rtw_set_rpwm(rtlpriv, PS_STATE_S2); } } }
void rtw_set_ps_mode(struct adapter *padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode) { struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_, ("%s: PowerMode=%d Smart_PS=%d\n", __func__, ps_mode, smart_ps)); if (ps_mode > PM_Card_Disable) { RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_, ("ps_mode:%d error\n", ps_mode)); return; } if (pwrpriv->pwr_mode == ps_mode) { if (PS_MODE_ACTIVE == ps_mode) return; if ((pwrpriv->smart_ps == smart_ps) && (pwrpriv->bcn_ant_mode == bcn_ant_mode)) return; } /* if (pwrpriv->pwr_mode == PS_MODE_ACTIVE) */ if (ps_mode == PS_MODE_ACTIVE) { if (PS_RDY_CHECK(padapter)) { DBG_88E("%s: Enter 802.11 power save\n", __func__); pwrpriv->bFwCurrentInPSMode = true; pwrpriv->pwr_mode = ps_mode; pwrpriv->smart_ps = smart_ps; pwrpriv->bcn_ant_mode = bcn_ant_mode; rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode)); rtw_set_rpwm(padapter, PS_STATE_S2); } } }
void rtw_btcoex_MediaStatusNotify(PADAPTER padapter, u8 mediaStatus) { #ifdef DBG_CONFIG_ERROR_RESET if (_TRUE == rtw_hal_sreset_inprogress(padapter)) { DBG_8192C(FUNC_ADPT_FMT ": [BTCoex] under reset, skip notify!\n", FUNC_ADPT_ARG(padapter)); return; } #endif // DBG_CONFIG_ERROR_RESET #ifdef CONFIG_CONCURRENT_MODE if ((RT_MEDIA_DISCONNECT == mediaStatus) && (padapter->pbuddy_adapter)) { PADAPTER pbuddy = padapter->pbuddy_adapter; if (check_fwstate(&pbuddy->mlmepriv, WIFI_ASOC_STATE) == _TRUE) return; } #endif // CONFIG_CONCURRENT_MODE if ((RT_MEDIA_CONNECT == mediaStatus) && (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE)) { rtw_hal_set_hwreg(padapter, HW_VAR_DL_RSVD_PAGE, NULL); } hal_btcoex_MediaStatusNotify(padapter, mediaStatus); }
void rtw_init_pwrctrl_priv(PADAPTER padapter) { struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter); sema_init(&pwrctrlpriv->lock, 1); sema_init(&pwrctrlpriv->check_32k_lock, 1); pwrctrlpriv->rf_pwrstate = rf_on; pwrctrlpriv->ips_enter_cnts =0; pwrctrlpriv->ips_leave_cnts =0; pwrctrlpriv->bips_processing = false; pwrctrlpriv->ips_mode = padapter->registrypriv.ips_mode; pwrctrlpriv->ips_mode_req = padapter->registrypriv.ips_mode; pwrctrlpriv->pwr_state_check_interval = RTW_PWR_STATE_CHK_INTERVAL; pwrctrlpriv->pwr_state_check_cnts = 0; pwrctrlpriv->bInternalAutoSuspend = false; pwrctrlpriv->bInSuspend = false; pwrctrlpriv->bkeepfwalive = false; pwrctrlpriv->LpsIdleCount = 0; if (padapter->registrypriv.mp_mode == 1) pwrctrlpriv->power_mgnt =PS_MODE_ACTIVE ; else pwrctrlpriv->power_mgnt =padapter->registrypriv.power_mgnt;/* PS_MODE_MIN; */ pwrctrlpriv->bLeisurePs = (PS_MODE_ACTIVE != pwrctrlpriv->power_mgnt)?true:false; pwrctrlpriv->bFwCurrentInPSMode = false; pwrctrlpriv->rpwm = 0; pwrctrlpriv->cpwm = PS_STATE_S4; pwrctrlpriv->pwr_mode = PS_MODE_ACTIVE; pwrctrlpriv->smart_ps = padapter->registrypriv.smart_ps; pwrctrlpriv->bcn_ant_mode = 0; pwrctrlpriv->dtim = 0; pwrctrlpriv->tog = 0x80; rtw_hal_set_hwreg(padapter, HW_VAR_SET_RPWM, (u8 *)(&pwrctrlpriv->rpwm)); _init_workitem(&pwrctrlpriv->cpwm_event, cpwm_event_callback, NULL); pwrctrlpriv->brpwmtimeout = false; _init_workitem(&pwrctrlpriv->rpwmtimeoutwi, rpwmtimeout_workitem_callback, NULL); _init_timer(&pwrctrlpriv->pwr_rpwm_timer, padapter->pnetdev, pwr_rpwm_timeout_handler, padapter); rtw_init_timer(&pwrctrlpriv->pwr_state_check_timer, padapter, pwr_state_check_handler); pwrctrlpriv->wowlan_mode = false; pwrctrlpriv->wowlan_ap_mode = false; #ifdef CONFIG_PNO_SUPPORT pwrctrlpriv->pno_inited = false; pwrctrlpriv->pnlo_info = NULL; pwrctrlpriv->pscan_info = NULL; pwrctrlpriv->pno_ssid_list = NULL; pwrctrlpriv->pno_in_resume = true; #endif }
static void lps_ctrl_wk_hdl(struct adapter *padapter, u8 lps_ctrl_type) { struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); u8 mstatus; if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == true) || (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == true)) return; switch (lps_ctrl_type) { case LPS_CTRL_SCAN: if (check_fwstate(pmlmepriv, _FW_LINKED) == true) { /* connect */ LPS_Leave(padapter); } break; case LPS_CTRL_JOINBSS: LPS_Leave(padapter); break; case LPS_CTRL_CONNECT: mstatus = 1;/* connect */ /* Reset LPS Setting */ padapter->pwrctrlpriv.LpsIdleCount = 0; rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus)); break; case LPS_CTRL_DISCONNECT: mstatus = 0;/* disconnect */ LPS_Leave(padapter); rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus)); break; case LPS_CTRL_SPECIAL_PACKET: /* DBG_88E("LPS_CTRL_SPECIAL_PACKET\n"); */ pwrpriv->DelayLPSLastTimeStamp = jiffies; LPS_Leave(padapter); break; case LPS_CTRL_LEAVE: LPS_Leave(padapter); break; default: break; } }
void rtw_btcoex_MediaStatusNotify(struct adapter *padapter, u8 mediaStatus) { if ((mediaStatus == RT_MEDIA_CONNECT) && (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == true)) { rtw_hal_set_hwreg(padapter, HW_VAR_DL_RSVD_PAGE, NULL); } hal_btcoex_MediaStatusNotify(padapter, mediaStatus); }
void sreset_restore_security_station(_adapter *padapter) { u8 EntryId = 0; struct mlme_priv *mlmepriv = &padapter->mlmepriv; struct sta_priv * pstapriv = &padapter->stapriv; struct sta_info *psta; struct security_priv* psecuritypriv=&(padapter->securitypriv); struct mlme_ext_info *pmlmeinfo = &padapter->mlmeextpriv.mlmext_info; { u8 val8; if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_8021X) { val8 = 0xcc; #ifdef CONFIG_WAPI_SUPPORT } else if (padapter->wapiInfo.bWapiEnable && pmlmeinfo->auth_algo == dot11AuthAlgrthm_WAPI) { //Disable TxUseDefaultKey, RxUseDefaultKey, RxBroadcastUseDefaultKey. val8 = 0x4c; #endif } else { val8 = 0xcf; } rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); } #if 0 if ( ( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP40_ ) || ( padapter->securitypriv.dot11PrivacyAlgrthm == _WEP104_ )) { for(EntryId=0; EntryId<4; EntryId++) { if(EntryId == psecuritypriv->dot11PrivacyKeyIndex) rtw_set_key(padapter,&padapter->securitypriv, EntryId, 1); else rtw_set_key(padapter,&padapter->securitypriv, EntryId, 0); } } else #endif if((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) || (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) { psta = rtw_get_stainfo(pstapriv, get_bssid(mlmepriv)); if (psta == NULL) { //DEBUG_ERR( ("Set wpa_set_encryption: Obtain Sta_info fail \n")); } else { //pairwise key rtw_setstakey_cmd(padapter, (unsigned char *)psta, _TRUE); //group key rtw_set_key(padapter,&padapter->securitypriv,padapter->securitypriv.dot118021XGrpKeyid, 0); } } }
void rtw_ips_dev_unload(struct adapter *padapter) { DBG_88E("====> %s...\n", __func__); rtw_hal_set_hwreg(padapter, HW_VAR_FIFO_CLEARN_UP, NULL); usb_intf_stop(padapter); /* s5. */ if (!padapter->bSurpriseRemoved) rtw_hal_deinit(padapter); }
/* * * Parameters * padapter * pslv power state level, only could be PS_STATE_S0 ~ PS_STATE_S4 * */ void rtw_set_rpwm(struct adapter *padapter, u8 pslv) { u8 rpwm; struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; pslv = PS_STATE(pslv); if (pwrpriv->btcoex_rfon) { if (pslv < PS_STATE_S4) pslv = PS_STATE_S3; } if ((pwrpriv->rpwm == pslv)) { RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_, ("%s: Already set rpwm[0x%02X], new=0x%02X!\n", __func__, pwrpriv->rpwm, pslv)); return; } if ((padapter->bSurpriseRemoved) || (!padapter->hw_init_completed)) { RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_, ("%s: SurpriseRemoved(%d) hw_init_completed(%d)\n", __func__, padapter->bSurpriseRemoved, padapter->hw_init_completed)); pwrpriv->cpwm = PS_STATE_S4; return; } if (padapter->bDriverStopped) { RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_, ("%s: change power state(0x%02X) when DriverStopped\n", __func__, pslv)); if (pslv < PS_STATE_S2) { RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_, ("%s: Reject to enter PS_STATE(0x%02X) lower than S2 when DriverStopped!!\n", __func__, pslv)); return; } } rpwm = pslv | pwrpriv->tog; RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_, ("rtw_set_rpwm: rpwm=0x%02x cpwm=0x%02x\n", rpwm, pwrpriv->cpwm)); pwrpriv->rpwm = pslv; rtw_hal_set_hwreg(padapter, HW_VAR_SET_RPWM, (u8 *)(&rpwm)); pwrpriv->tog += 0x80; pwrpriv->cpwm = pslv; }
s32 rtw_hal_macid_sleep(PADAPTER padapter, u32 macid) { u8 support; support = false; rtw_hal_get_def_var(padapter, HAL_DEF_MACID_SLEEP, &support); if (false == support) return _FAIL; rtw_hal_set_hwreg(padapter, HW_VAR_MACID_SLEEP, (u8*)&macid); return _SUCCESS; }
s32 rtw_hal_macid_wakeup(PADAPTER padapter, u32 macid) { u8 support; support = _FALSE; rtw_hal_get_def_var(padapter, HAL_DEF_MACID_SLEEP, &support); if (_FALSE == support) return _FAIL; rtw_hal_set_hwreg(padapter, HW_VAR_MACID_WAKEUP, (u8*)&macid); return _SUCCESS; }
s32 rtw_hal_macid_wakeup(struct adapter *padapter, u32 macid) { u8 support; support = false; rtw_hal_get_def_var(padapter, HAL_DEF_MACID_SLEEP, &support); if (false == support) return _FAIL; rtw_hal_set_hwreg(padapter, HW_VAR_MACID_WAKEUP, (u8 *)&macid); return _SUCCESS; }
void rtw_ips_dev_unload(struct rtl_priv *rtlpriv) { struct net_device *ndev = (struct net_device *) rtlpriv->ndev; struct xmit_priv *pxmitpriv = &(rtlpriv->xmitpriv); DBG_871X("====> %s...\n", __FUNCTION__); rtw_hal_set_hwreg(rtlpriv, HW_VAR_FIFO_CLEARN_UP, 0); if (rtlpriv->intf_stop) { rtlpriv->intf_stop(rtlpriv); } /* s5. */ if (rtlpriv->bSurpriseRemoved == _FALSE) { rtw_hal_deinit(rtlpriv); } }
/* * * Parameters * padapter * pslv power state level, only could be PS_STATE_S0 ~ PS_STATE_S4 * */ void rtw_set_rpwm(PADAPTER padapter, u8 pslv) { u8 rpwm; struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; _func_enter_; pslv = PS_STATE(pslv); if (pwrpriv->rpwm == pslv) { RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_, ("%s: Already set rpwm[0x%02x]!\n", __FUNCTION__, pslv)); return; } if ((padapter->bDriverStopped == _TRUE) || (padapter->bSurpriseRemoved == _TRUE)) { RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_, ("%s: bDriverStopped(%d) bSurpriseRemoved(%d)\n", __FUNCTION__, padapter->bDriverStopped, padapter->bSurpriseRemoved)); return; } rpwm = pslv | pwrpriv->tog; #ifdef CONFIG_LPS_LCLK if ((pwrpriv->cpwm < PS_STATE_S2) && (pslv >= PS_STATE_S2)) rpwm |= PS_ACK; #endif RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_, ("rtw_set_rpwm: rpwm=0x%02x cpwm=0x%02x\n", rpwm, pwrpriv->cpwm)); pwrpriv->rpwm = pslv; rtw_hal_set_hwreg(padapter, HW_VAR_SET_RPWM, (u8 *)(&rpwm)); pwrpriv->tog += 0x80; if (!(rpwm & PS_ACK)) pwrpriv->cpwm = pslv; _func_exit_; }
s32 rtw_hal_macid_wakeup(PADAPTER padapter, u8 macid) { struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj); u8 support; support = _FALSE; rtw_hal_get_def_var(padapter, HAL_DEF_MACID_SLEEP, &support); if (_FALSE == support) return _FAIL; if (macid >= macid_ctl->num) { DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT": Invalid macid(%u)\n", FUNC_ADPT_ARG(padapter), macid); return _FAIL; } rtw_hal_set_hwreg(padapter, HW_VAR_MACID_WAKEUP, &macid); return _SUCCESS; }
static void antenna_select_wk_hdl(struct adapter *padapter, u8 antenna) { rtw_hal_set_hwreg(padapter, HW_VAR_ANTENNA_DIVERSITY_SELECT, (u8 *)(&antenna)); }
static void rpt_timer_setting_wk_hdl(struct adapter *padapter, u16 min_time) { rtw_hal_set_hwreg(padapter, HW_VAR_RPT_TIMER_SETTING, (u8 *)(&min_time)); }
/* * Description: * This function MUST be called under power lock protect * * Parameters * padapter * pslv power state level, only could be PS_STATE_S0 ~ PS_STATE_S4 * */ void rtw_set_rpwm(PADAPTER padapter, u8 pslv) { u8 rpwm; struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); u8 cpwm_orig; pslv = PS_STATE(pslv); if (pwrpriv->brpwmtimeout == true) { DBG_871X("%s: RPWM timeout, force to set RPWM(0x%02X) again!\n", __FUNCTION__, pslv); } else { if ((pwrpriv->rpwm == pslv) || ((pwrpriv->rpwm >= PS_STATE_S2)&&(pslv >= PS_STATE_S2))) { RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_, ("%s: Already set rpwm[0x%02X], new =0x%02X!\n", __FUNCTION__, pwrpriv->rpwm, pslv)); return; } } if ((padapter->bSurpriseRemoved == true) || (padapter->hw_init_completed == false)) { RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_, ("%s: SurpriseRemoved(%d) hw_init_completed(%d)\n", __FUNCTION__, padapter->bSurpriseRemoved, padapter->hw_init_completed)); pwrpriv->cpwm = PS_STATE_S4; return; } if (padapter->bDriverStopped == true) { RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_, ("%s: change power state(0x%02X) when DriverStopped\n", __FUNCTION__, pslv)); if (pslv < PS_STATE_S2) { RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_, ("%s: Reject to enter PS_STATE(0x%02X) lower than S2 when DriverStopped!!\n", __FUNCTION__, pslv)); return; } } rpwm = pslv | pwrpriv->tog; /* only when from PS_STATE S0/S1 to S2 and higher needs ACK */ if ((pwrpriv->cpwm < PS_STATE_S2) && (pslv >= PS_STATE_S2)) rpwm |= PS_ACK; RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_, ("rtw_set_rpwm: rpwm =0x%02x cpwm =0x%02x\n", rpwm, pwrpriv->cpwm)); pwrpriv->rpwm = pslv; cpwm_orig = 0; if (rpwm & PS_ACK) { rtw_hal_get_hwreg(padapter, HW_VAR_CPWM, &cpwm_orig); } if (rpwm & PS_ACK) _set_timer(&pwrpriv->pwr_rpwm_timer, LPS_RPWM_WAIT_MS); rtw_hal_set_hwreg(padapter, HW_VAR_SET_RPWM, (u8 *)(&rpwm)); pwrpriv->tog += 0x80; /* No LPS 32K, No Ack */ if (rpwm & PS_ACK) { unsigned long start_time; u8 cpwm_now; u8 poll_cnt =0; start_time = jiffies; /* polling cpwm */ do { mdelay(1); poll_cnt++; rtw_hal_get_hwreg(padapter, HW_VAR_CPWM, &cpwm_now); if ((cpwm_orig ^ cpwm_now) & 0x80) { pwrpriv->cpwm = PS_STATE_S4; pwrpriv->cpwm_tog = cpwm_now & PS_TOGGLE; break; } if (jiffies_to_msecs(jiffies - start_time) > LPS_RPWM_WAIT_MS) { DBG_871X("%s: polling cpwm timeout! poll_cnt =%d, cpwm_orig =%02x, cpwm_now =%02x \n", __FUNCTION__, poll_cnt, cpwm_orig, cpwm_now); _set_timer(&pwrpriv->pwr_rpwm_timer, 1); break; } } while (1); } else { pwrpriv->cpwm = pslv; } }
void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode) { struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; #ifdef CONFIG_P2P struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); #endif //CONFIG_P2P #ifdef CONFIG_TDLS struct sta_priv *pstapriv = &padapter->stapriv; _irqL irqL; int i, j; _list *plist, *phead; struct sta_info *ptdls_sta; #endif //CONFIG_TDLS _func_enter_; RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_, ("%s: PowerMode=%d Smart_PS=%d\n", __FUNCTION__, ps_mode, smart_ps)); if(ps_mode > PM_Card_Disable) { RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_,("ps_mode:%d error\n", ps_mode)); return; } if (pwrpriv->pwr_mode == ps_mode) { if (PS_MODE_ACTIVE == ps_mode) return; if ((pwrpriv->smart_ps == smart_ps) && (pwrpriv->bcn_ant_mode == bcn_ant_mode)) { return; } } #ifdef CONFIG_LPS_LCLK _enter_pwrlock(&pwrpriv->lock); #endif //if(pwrpriv->pwr_mode == PS_MODE_ACTIVE) if(ps_mode == PS_MODE_ACTIVE) { #ifdef CONFIG_P2P_PS if(pwdinfo->opp_ps == 0) #endif //CONFIG_P2P_PS { DBG_871X("rtw_set_ps_mode: Leave 802.11 power save\n"); #ifdef CONFIG_TDLS _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); for(i=0; i< NUM_STA; i++) { phead = &(pstapriv->sta_hash[i]); plist = get_next(phead); while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { ptdls_sta = LIST_CONTAINOR(plist, struct sta_info, hash_list); if( ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE ) issue_nulldata_to_TDLS_peer_STA(padapter, ptdls_sta, 0); plist = get_next(plist); } } _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); #endif //CONFIG_TDLS pwrpriv->pwr_mode = ps_mode; rtw_set_rpwm(padapter, PS_STATE_S4); #ifdef CONFIG_WOWLAN if (padapter->pwrctrlpriv.wowlan_mode == _TRUE) { u32 start_time, delay_ms; u8 val8; delay_ms = 20; start_time = rtw_get_current_time(); do { val8 = rtw_read8(padapter, 0x90); if (!(val8 & BIT(0))) break; if (rtw_get_passing_time_ms(start_time) > delay_ms) { DBG_871X("%s: Wait for FW 32K leave more than %u ms!!!\n", __FUNCTION__, delay_ms); break; } rtw_usleep_os(100); } while (1); pwrpriv->cpwm = PS_STATE_S4; } #endif rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode)); pwrpriv->bFwCurrentInPSMode = _FALSE; } }
/* * * Parameters * padapter * pslv power state level, only could be PS_STATE_S0 ~ PS_STATE_S4 * */ void rtw_set_rpwm(PADAPTER padapter, u8 pslv) { u8 rpwm; struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; _func_enter_; pslv = PS_STATE(pslv); if (_TRUE == pwrpriv->btcoex_rfon) { if (pslv < PS_STATE_S4) pslv = PS_STATE_S3; } #ifdef CONFIG_LPS_RPWM_TIMER if (pwrpriv->brpwmtimeout == _TRUE) { DBG_871X("%s: RPWM timeout, force to set RPWM(0x%02X) again!\n", __FUNCTION__, pslv); } else #endif // CONFIG_LPS_RPWM_TIMER { if ( (pwrpriv->rpwm == pslv) #ifdef CONFIG_LPS_LCLK #ifndef CONFIG_RTL8723A || ((pwrpriv->rpwm >= PS_STATE_S2)&&(pslv >= PS_STATE_S2)) #endif #endif ) { RT_TRACE(_module_rtl871x_pwrctrl_c_,_drv_err_, ("%s: Already set rpwm[0x%02X], new=0x%02X!\n", __FUNCTION__, pwrpriv->rpwm, pslv)); return; } } if ((padapter->bSurpriseRemoved == _TRUE) || (padapter->hw_init_completed == _FALSE)) { RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_, ("%s: SurpriseRemoved(%d) hw_init_completed(%d)\n", __FUNCTION__, padapter->bSurpriseRemoved, padapter->hw_init_completed)); pwrpriv->cpwm = PS_STATE_S4; return; } if (padapter->bDriverStopped == _TRUE) { RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_, ("%s: change power state(0x%02X) when DriverStopped\n", __FUNCTION__, pslv)); if (pslv < PS_STATE_S2) { RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_, ("%s: Reject to enter PS_STATE(0x%02X) lower than S2 when DriverStopped!!\n", __FUNCTION__, pslv)); return; } } rpwm = pslv | pwrpriv->tog; #ifdef CONFIG_LPS_LCLK // only when from PS_STATE S0/S1 to S2 and higher needs ACK if ((pwrpriv->cpwm < PS_STATE_S2) && (pslv >= PS_STATE_S2)) rpwm |= PS_ACK; #endif RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_, ("rtw_set_rpwm: rpwm=0x%02x cpwm=0x%02x\n", rpwm, pwrpriv->cpwm)); pwrpriv->rpwm = pslv; #ifdef CONFIG_LPS_RPWM_TIMER if (rpwm & PS_ACK) _set_timer(&pwrpriv->pwr_rpwm_timer, LPS_RPWM_WAIT_MS); #endif // CONFIG_LPS_RPWM_TIMER rtw_hal_set_hwreg(padapter, HW_VAR_SET_RPWM, (u8 *)(&rpwm)); pwrpriv->tog += 0x80; #ifdef CONFIG_LPS_LCLK // No LPS 32K, No Ack if (!(rpwm & PS_ACK)) #endif { pwrpriv->cpwm = pslv; } _func_exit_; }
void hal_init_macaddr(struct adapter *adapter) { rtw_hal_set_hwreg(adapter, HW_VAR_MAC_ADDR, adapter->eeprompriv.mac_addr); }
void rtw_set_ps_mode(PADAPTER padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode, const char *msg) { struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_notice_, ("%s: PowerMode =%d Smart_PS =%d\n", __FUNCTION__, ps_mode, smart_ps)); if (ps_mode > PM_Card_Disable) { RT_TRACE(_module_rtl871x_pwrctrl_c_, _drv_err_, ("ps_mode:%d error\n", ps_mode)); return; } if (pwrpriv->pwr_mode == ps_mode) { if (PS_MODE_ACTIVE == ps_mode) return; } down(&pwrpriv->lock); /* if (pwrpriv->pwr_mode == PS_MODE_ACTIVE) */ if (ps_mode == PS_MODE_ACTIVE) { if (1 && (((rtw_btcoex_IsBtControlLps(padapter) == false) ) || ((rtw_btcoex_IsBtControlLps(padapter) == true) && (rtw_btcoex_IsLpsOn(padapter) == false)) ) ) { DBG_871X(FUNC_ADPT_FMT" Leave 802.11 power save - %s\n", FUNC_ADPT_ARG(padapter), msg); pwrpriv->pwr_mode = ps_mode; rtw_set_rpwm(padapter, PS_STATE_S4); #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN) if (pwrpriv->wowlan_mode == true || pwrpriv->wowlan_ap_mode == true) { unsigned long start_time; u32 delay_ms; u8 val8; delay_ms = 20; start_time = jiffies; do { rtw_hal_get_hwreg(padapter, HW_VAR_SYS_CLKR, &val8); if (!(val8 & BIT(4))){ /* 0x08 bit4 =1 --> in 32k, bit4 = 0 --> leave 32k */ pwrpriv->cpwm = PS_STATE_S4; break; } if (jiffies_to_msecs(jiffies - start_time) > delay_ms) { DBG_871X("%s: Wait for FW 32K leave more than %u ms!!!\n", __FUNCTION__, delay_ms); pdbgpriv->dbg_wow_leave_ps_fail_cnt++; break; } msleep(1); } while (1); } #endif rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode)); pwrpriv->bFwCurrentInPSMode = false; rtw_btcoex_LpsNotify(padapter, ps_mode); } } else { if ((PS_RDY_CHECK(padapter) && check_fwstate(&padapter->mlmepriv, WIFI_ASOC_STATE)) || ((rtw_btcoex_IsBtControlLps(padapter) == true) && (rtw_btcoex_IsLpsOn(padapter) == true)) ) { u8 pslv; DBG_871X(FUNC_ADPT_FMT" Enter 802.11 power save - %s\n", FUNC_ADPT_ARG(padapter), msg); rtw_btcoex_LpsNotify(padapter, ps_mode); pwrpriv->bFwCurrentInPSMode = true; pwrpriv->pwr_mode = ps_mode; pwrpriv->smart_ps = smart_ps; pwrpriv->bcn_ant_mode = bcn_ant_mode; rtw_hal_set_hwreg(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode)); pslv = PS_STATE_S2; if (pwrpriv->alives == 0) pslv = PS_STATE_S0; if ((rtw_btcoex_IsBtDisabled(padapter) == false) && (rtw_btcoex_IsBtControlLps(padapter) == true)) { u8 val8; val8 = rtw_btcoex_LpsVal(padapter); if (val8 & BIT(4)) pslv = PS_STATE_S2; } rtw_set_rpwm(padapter, pslv); } } up(&pwrpriv->lock); }
void rtw_hal_turbo_edca(_adapter *adapter) { HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); struct dvobj_priv *dvobj = adapter_to_dvobj(adapter); struct recv_priv *precvpriv = &(adapter->recvpriv); struct registry_priv *pregpriv = &adapter->registrypriv; struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv); struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); /* Parameter suggested by Scott */ #if 0 u32 EDCA_BE_UL = edca_setting_UL[p_mgnt_info->iot_peer]; u32 EDCA_BE_DL = edca_setting_DL[p_mgnt_info->iot_peer]; #endif u32 EDCA_BE_UL = 0x5ea42b; u32 EDCA_BE_DL = 0x00a42b; u8 ic_type = rtw_get_chip_type(adapter); u8 iot_peer = 0; u8 wireless_mode = 0xFF; /* invalid value */ u8 traffic_index; u32 edca_param; u64 cur_tx_bytes = 0; u64 cur_rx_bytes = 0; u8 bbtchange = _TRUE; u8 is_bias_on_rx = _FALSE; u8 is_linked = _FALSE; u8 interface_type; if (hal_data->dis_turboedca) return; if (rtw_mi_check_status(adapter, MI_ASSOC)) is_linked = _TRUE; if (is_linked != _TRUE) { precvpriv->is_any_non_be_pkts = _FALSE; return; } if ((pregpriv->wifi_spec == 1)) { /* || (pmlmeinfo->HT_enable == 0)) */ precvpriv->is_any_non_be_pkts = _FALSE; return; } interface_type = rtw_get_intf_type(adapter); wireless_mode = pmlmeext->cur_wireless_mode; iot_peer = pmlmeinfo->assoc_AP_vendor; if (iot_peer >= HT_IOT_PEER_MAX) { precvpriv->is_any_non_be_pkts = _FALSE; return; } if (ic_type == RTL8188E) { if ((iot_peer == HT_IOT_PEER_RALINK) || (iot_peer == HT_IOT_PEER_ATHEROS)) is_bias_on_rx = _TRUE; } /* Check if the status needs to be changed. */ if ((bbtchange) || (!precvpriv->is_any_non_be_pkts)) { cur_tx_bytes = dvobj->traffic_stat.cur_tx_bytes; cur_rx_bytes = dvobj->traffic_stat.cur_rx_bytes; /* traffic, TX or RX */ if (is_bias_on_rx) { if (cur_tx_bytes > (cur_rx_bytes << 2)) { /* Uplink TP is present. */ traffic_index = UP_LINK; } else { /* Balance TP is present. */ traffic_index = DOWN_LINK; } } else { if (cur_rx_bytes > (cur_tx_bytes << 2)) { /* Downlink TP is present. */ traffic_index = DOWN_LINK; } else { /* Balance TP is present. */ traffic_index = UP_LINK; } } #if 0 if ((p_dm_odm->dm_edca_table.prv_traffic_idx != traffic_index) || (!p_dm_odm->dm_edca_table.is_current_turbo_edca)) #endif { if (interface_type == RTW_PCIE) { EDCA_BE_UL = 0x6ea42b; EDCA_BE_DL = 0x6ea42b; } /* 92D txop can't be set to 0x3e for cisco1250 */ if ((iot_peer == HT_IOT_PEER_CISCO) && (wireless_mode == ODM_WM_N24G)) { EDCA_BE_DL = edca_setting_DL[iot_peer]; EDCA_BE_UL = edca_setting_UL[iot_peer]; } /* merge from 92s_92c_merge temp*/ else if ((iot_peer == HT_IOT_PEER_CISCO) && ((wireless_mode == ODM_WM_G) || (wireless_mode == (ODM_WM_B | ODM_WM_G)) || (wireless_mode == ODM_WM_A) || (wireless_mode == ODM_WM_B))) EDCA_BE_DL = edca_setting_dl_g_mode[iot_peer]; else if ((iot_peer == HT_IOT_PEER_AIRGO) && ((wireless_mode == ODM_WM_G) || (wireless_mode == ODM_WM_A))) EDCA_BE_DL = 0xa630; else if (iot_peer == HT_IOT_PEER_MARVELL) { EDCA_BE_DL = edca_setting_DL[iot_peer]; EDCA_BE_UL = edca_setting_UL[iot_peer]; } else if (iot_peer == HT_IOT_PEER_ATHEROS) { /* Set DL EDCA for Atheros peer to 0x3ea42b.*/ /* Suggested by SD3 Wilson for ASUS TP issue.*/ EDCA_BE_DL = edca_setting_DL[iot_peer]; } if ((ic_type == RTL8812) || (ic_type == RTL8821) || (ic_type == RTL8192E)) { /* add 8812AU/8812AE */ EDCA_BE_UL = 0x5ea42b; EDCA_BE_DL = 0x5ea42b; RTW_DBG("8812A: EDCA_BE_UL=0x%x EDCA_BE_DL =0x%x\n", EDCA_BE_UL, EDCA_BE_DL); } if (interface_type == RTW_PCIE && (ic_type == RTL8822B)) { EDCA_BE_UL = 0x6ea42b; EDCA_BE_DL = 0x6ea42b; } if (traffic_index == DOWN_LINK) edca_param = EDCA_BE_DL; else edca_param = EDCA_BE_UL; rtw_hal_set_hwreg(adapter, HW_VAR_AC_PARAM_BE, (u8 *)(&edca_param)); RTW_DBG("Turbo EDCA =0x%x\n", edca_param); hal_data->prv_traffic_idx = traffic_index; } hal_data->is_turbo_edca = _TRUE; } else { /* */ /* Turn Off EDCA turbo here. */ /* Restore original EDCA according to the declaration of AP. */ /* */ if (hal_data->is_turbo_edca) { edca_param = hal_data->ac_param_be; rtw_hal_set_hwreg(adapter, HW_VAR_AC_PARAM_BE, (u8 *)(&edca_param)); hal_data->is_turbo_edca = _FALSE; } } }
inline void rtw_odm_ability_set(_adapter *adapter, u32 ability) { rtw_hal_set_hwreg(adapter, HW_VAR_DM_FLAG, (u8*)&ability); }
static void start_bss_network(struct adapter *padapter, u8 *pbuf) { u8 *p; u8 val8, cur_channel, cur_bwmode, cur_ch_offset; u16 bcn_interval; u32 acparm; uint ie_len; struct registry_priv *pregpriv = &padapter->registrypriv; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct security_priv *psecuritypriv = &padapter->securitypriv; struct wlan_bssid_ex *pnetwork = (struct wlan_bssid_ex *)&pmlmepriv->cur_network.network; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; struct wlan_bssid_ex *pnetwork_mlmeext = &pmlmeinfo->network; struct HT_info_element *pht_info = NULL; bcn_interval = (u16)pnetwork->Configuration.BeaconPeriod; cur_channel = pnetwork->Configuration.DSConfig; cur_bwmode = HT_CHANNEL_WIDTH_20; cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; /* check if there is wps ie, * if there is wpsie in beacon, the hostapd will update * beacon twice when stating hostapd, and at first time the * security ie (RSN/WPA IE) will not include in beacon. */ if (!rtw_get_wps_ie(pnetwork->ies + _FIXED_IE_LENGTH_, pnetwork->ie_length - _FIXED_IE_LENGTH_, NULL, NULL)) pmlmeext->bstart_bss = true; /* todo: update wmm, ht cap */ if (pmlmepriv->qospriv.qos_option) pmlmeinfo->WMM_enable = true; if (pmlmepriv->htpriv.ht_option) { pmlmeinfo->WMM_enable = true; pmlmeinfo->HT_enable = true; update_hw_ht_param(padapter); } /* setting only at first time */ if (pmlmepriv->cur_network.join_res != true) { /* WEP Key will be set before this function, do not * clear CAM. */ if ((psecuritypriv->dot11PrivacyAlgrthm != _WEP40_) && (psecuritypriv->dot11PrivacyAlgrthm != _WEP104_)) flush_all_cam_entry(padapter); /* clear CAM */ } /* set MSR to AP_Mode */ Set_MSR(padapter, _HW_STATE_AP_); /* Set BSSID REG */ rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pnetwork->MacAddress); /* Set EDCA param reg */ acparm = 0x002F3217; /* VO */ rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VO, (u8 *)(&acparm)); acparm = 0x005E4317; /* VI */ rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_VI, (u8 *)(&acparm)); acparm = 0x005ea42b; rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acparm)); acparm = 0x0000A444; /* BK */ rtw_hal_set_hwreg(padapter, HW_VAR_AC_PARAM_BK, (u8 *)(&acparm)); /* Set Security */ val8 = (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) ? 0xcc : 0xcf; rtw_hal_set_hwreg(padapter, HW_VAR_SEC_CFG, (u8 *)(&val8)); /* Beacon Control related register */ rtw_hal_set_hwreg(padapter, HW_VAR_BEACON_INTERVAL, (u8 *)(&bcn_interval)); UpdateBrateTbl(padapter, pnetwork->SupportedRates); rtw_hal_set_hwreg(padapter, HW_VAR_BASIC_RATE, pnetwork->SupportedRates); if (!pmlmepriv->cur_network.join_res) { /* setting only at first time */ /* turn on all dynamic functions */ Switch_DM_Func(padapter, DYNAMIC_ALL_FUNC_ENABLE, true); } /* set channel, bwmode */ p = rtw_get_ie((pnetwork->ies + sizeof(struct ndis_802_11_fixed_ie)), _HT_ADD_INFO_IE_, &ie_len, (pnetwork->ie_length - sizeof(struct ndis_802_11_fixed_ie))); if (p && ie_len) { pht_info = (struct HT_info_element *)(p + 2); if ((pregpriv->cbw40_enable) && (pht_info->infos[0] & BIT(2))) { /* switch to the 40M Hz mode */ cur_bwmode = HT_CHANNEL_WIDTH_40; switch (pht_info->infos[0] & 0x3) { case 1: cur_ch_offset = HAL_PRIME_CHNL_OFFSET_LOWER; break; case 3: cur_ch_offset = HAL_PRIME_CHNL_OFFSET_UPPER; break; default: cur_ch_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; break; } } } /* TODO: need to judge the phy parameters on concurrent * mode for single phy */ set_channel_bwmode(padapter, cur_channel, cur_ch_offset, cur_bwmode); DBG_88E("CH =%d, BW =%d, offset =%d\n", cur_channel, cur_bwmode, cur_ch_offset); /* */ pmlmeext->cur_channel = cur_channel; pmlmeext->cur_bwmode = cur_bwmode; pmlmeext->cur_ch_offset = cur_ch_offset; pmlmeext->cur_wireless_mode = pmlmepriv->cur_network.network_type; /* update cur_wireless_mode */ update_wireless_mode(padapter); /* update capability after cur_wireless_mode updated */ update_capinfo(padapter, rtw_get_capability((struct wlan_bssid_ex *)pnetwork)); /* let pnetwork_mlmeext == pnetwork_mlme. */ memcpy(pnetwork_mlmeext, pnetwork, pnetwork->Length); if (pmlmeext->bstart_bss) { update_beacon(padapter, _TIM_IE_, NULL, false); /* issue beacon frame */ if (send_beacon(padapter) == _FAIL) DBG_88E("send_beacon, fail!\n"); } /* update bc/mc sta_info */ update_bmc_sta(padapter); }
void sreset_restore_network_station(_adapter *padapter) { struct mlme_priv *mlmepriv = &padapter->mlmepriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); #if 0 { //======================================================= // reset related register of Beacon control //set MSR to nolink Set_MSR(padapter, _HW_STATE_NOLINK_); // reject all data frame rtw_write16(padapter, REG_RXFLTMAP2,0x00); //reset TSF rtw_write8(padapter, REG_DUAL_TSF_RST, (BIT(0)|BIT(1))); // disable update TSF SetBcnCtrlReg(padapter, BIT(4), 0); //======================================================= } #endif rtw_setopmode_cmd(padapter, Ndis802_11Infrastructure); { u8 threshold; #ifdef CONFIG_USB_HCI // TH=1 => means that invalidate usb rx aggregation // TH=0 => means that validate usb rx aggregation, use init value. if(mlmepriv->htpriv.ht_option) { if(padapter->registrypriv.wifi_spec==1) threshold = 1; else threshold = 0; rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); } else { threshold = 1; rtw_hal_set_hwreg(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); } #endif } set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode); //disable dynamic functions, such as high power, DIG //Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE); rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress); { u8 join_type = 0; rtw_hal_set_hwreg(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); } Set_MSR(padapter, (pmlmeinfo->state & 0x3)); mlmeext_joinbss_event_callback(padapter, 1); //restore Sequence No. rtw_write8(padapter,0x4dc,padapter->xmitpriv.nqos_ssn); sreset_restore_security_station(padapter); }