void rtl8188e_set_FwMediaStatus_cmd(PADAPTER padapter, u16 mstatus_rpt ) { u8 opmode,macid; u16 mst_rpt = cpu_to_le16 (mstatus_rpt); u32 reg_macid_no_link = REG_MACID_NO_LINK_0; opmode = (u8) mst_rpt; macid = (u8)(mst_rpt >> 8) ; DBG_871X("### %s: MStatus=%x MACID=%d \n", __FUNCTION__,opmode,macid); FillH2CCmd_88E(padapter, H2C_COM_MEDIA_STATUS_RPT, sizeof(mst_rpt), (u8 *)&mst_rpt); if(macid > 31){ macid = macid-32; reg_macid_no_link = REG_MACID_NO_LINK_1; } //Delete select macid (MACID 0~63) from queue list. if(opmode == 1)// 1:connect { rtw_write32(padapter,reg_macid_no_link, (rtw_read32(padapter,reg_macid_no_link) & (~BIT(macid)))); } else//0: disconnect { rtw_write32(padapter,reg_macid_no_link, (rtw_read32(padapter,reg_macid_no_link)|BIT(macid))); } }
void rtl8188e_set_FwPwrMode_cmd(PADAPTER padapter, u8 Mode) { SETPWRMODE_PARM H2CSetPwrMode; struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); u8 RLBM = 0; // 0:Min, 1:Max , 2:User define _func_enter_; DBG_871X("%s: Mode=%d SmartPS=%d UAPSD=%d\n", __FUNCTION__, Mode, pwrpriv->smart_ps, padapter->registrypriv.uapsd_enable); H2CSetPwrMode.AwakeInterval = 2; //DTIM = 1 switch(Mode) { case PS_MODE_ACTIVE: H2CSetPwrMode.Mode = 0; break; case PS_MODE_MIN: H2CSetPwrMode.Mode = 1; break; case PS_MODE_MAX: RLBM = 1; H2CSetPwrMode.Mode = 1; break; case PS_MODE_DTIM: RLBM = 2; H2CSetPwrMode.AwakeInterval = 3; //DTIM = 2 H2CSetPwrMode.Mode = 1; break; case PS_MODE_UAPSD_WMM: H2CSetPwrMode.Mode = 2; break; default: H2CSetPwrMode.Mode = 0; break; } //H2CSetPwrMode.Mode = Mode; H2CSetPwrMode.SmartPS_RLBM = (((pwrpriv->smart_ps<<4)&0xf0) | (RLBM & 0x0f)); H2CSetPwrMode.bAllQueueUAPSD = padapter->registrypriv.uapsd_enable; if(Mode > 0) { H2CSetPwrMode.PwrState = 0x00;// AllON(0x0C), RFON(0x04), RFOFF(0x00) #ifdef CONFIG_EXT_CLK H2CSetPwrMode.Mode |= BIT(7);//supporting 26M XTAL CLK_Request feature. #endif //CONFIG_EXT_CLK } else H2CSetPwrMode.PwrState = 0x0C;// AllON(0x0C), RFON(0x04), RFOFF(0x00) FillH2CCmd_88E(padapter, H2C_PS_PWR_MODE, sizeof(H2CSetPwrMode), (u8 *)&H2CSetPwrMode); _func_exit_; }
void rtl8188e_set_FwRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc) { u8 u1H2CRsvdPageParm[H2C_RSVDPAGE_LOC_LEN]={0}; u8 u1H2CAoacRsvdPageParm[H2C_AOAC_RSVDPAGE_LOC_LEN]={0}; //DBG_871X("8188RsvdPageLoc: PsPoll=%d Null=%d QoSNull=%d\n", // rsvdpageloc->LocPsPoll, rsvdpageloc->LocNullData, rsvdpageloc->LocQosNull); SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1H2CRsvdPageParm, rsvdpageloc->LocPsPoll); SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocNullData); SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocQosNull); FillH2CCmd_88E(padapter, H2C_COM_RSVD_PAGE, H2C_RSVDPAGE_LOC_LEN, u1H2CRsvdPageParm); #ifdef CONFIG_WOWLAN //DBG_871X("8188E_AOACRsvdPageLoc: RWC=%d ArpRsp=%d\n", rsvdpageloc->LocRemoteCtrlInfo, rsvdpageloc->LocArpRsp); SET_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1H2CAoacRsvdPageParm, rsvdpageloc->LocRemoteCtrlInfo); SET_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1H2CAoacRsvdPageParm, rsvdpageloc->LocArpRsp); FillH2CCmd_88E(padapter, H2C_COM_AOAC_RSVD_PAGE, H2C_AOAC_RSVDPAGE_LOC_LEN, u1H2CAoacRsvdPageParm); #endif }
u8 rtl8192c_h2c_msg_hdl(_adapter *padapter, unsigned char *pbuf) { u8 ElementID, CmdLen; u8 *pCmdBuffer; struct cmd_msg_parm *pcmdmsg; if(!pbuf) return H2C_PARAMETERS_ERROR; pcmdmsg = (struct cmd_msg_parm*)pbuf; ElementID = pcmdmsg->eid; CmdLen = pcmdmsg->sz; pCmdBuffer = pcmdmsg->buf; FillH2CCmd_88E(padapter, ElementID, CmdLen, pCmdBuffer); return H2C_SUCCESS; }
/* ask FW to Reset sync register at Beacon early interrupt */ u8 rtl8188e_reset_tsf(_adapter *padapter, u8 reset_port ) { u8 buf[2]; u8 res=_SUCCESS; s32 ret; _func_enter_; if (IFACE_PORT0==reset_port) { buf[0] = 0x1; buf[1] = 0; } else{ buf[0] = 0x0; buf[1] = 0x1; } ret = FillH2CCmd_88E(padapter, H2C_RESET_TSF, 2, buf); _func_exit_; return res; }
/* #if defined(CONFIG_AUTOSUSPEND) && defined(SUPPORT_HW_RFOFF_DETECTED) u8 rtl8192c_set_FwSelectSuspend_cmd(_adapter *padapter ,u8 bfwpoll, u16 period) { u8 res=_SUCCESS; struct H2C_SS_RFOFF_PARAM param; DBG_8192C("==>%s bfwpoll(%x)\n",__FUNCTION__,bfwpoll); param.gpio_period = period;//Polling GPIO_11 period time param.ROFOn = (_TRUE == bfwpoll)?1:0; FillH2CCmd_88E(padapter, SELECTIVE_SUSPEND_ROF_CMD, sizeof(param), (u8*)(¶m)); return res; } #endif //CONFIG_AUTOSUSPEND && SUPPORT_HW_RFOFF_DETECTED */ u8 rtl8188e_set_rssi_cmd(_adapter*padapter, u8 *param) { u8 res=_SUCCESS; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); _func_enter_; if(pHalData->fw_ractrl == _TRUE){ #if 0 *((u32*) param ) = cpu_to_le32( *((u32*) param ) ); FillH2CCmd_88E(padapter, RSSI_SETTING_EID, 3, param); #endif }else{ DBG_8192C("==>%s fw dont support RA \n",__FUNCTION__); res=_FAIL; } _func_exit_; return res; }
u8 rtl8188e_set_raid_cmd(_adapter*padapter, u32 mask) { u8 buf[3]; u8 res=_SUCCESS; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); _func_enter_; if(pHalData->fw_ractrl == _TRUE){ _rtw_memset(buf, 0, 3); mask = cpu_to_le32( mask ); _rtw_memcpy(buf, &mask, 3); FillH2CCmd_88E(padapter, H2C_DM_MACID_CFG, 3, buf); }else{ DBG_8192C("==>%s fw dont support RA \n",__FUNCTION__); res=_FAIL; } _func_exit_; return res; }
VOID ODM_FillH2CCmd( IN PDM_ODM_T pDM_Odm, IN u1Byte ElementID, IN u4Byte CmdLen, IN pu1Byte pCmdBuffer ) { PADAPTER Adapter = pDM_Odm->Adapter; if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) { switch(ElementID) { case ODM_H2C_RSSI_REPORT: #if(DM_ODM_SUPPORT_TYPE & ODM_WIN) FillH2CCmd(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer); #else #if((RTL8812A_SUPPORT==1) ||(RTL8821A_SUPPORT==1)) FillH2CCmd_8812(Adapter, H2C_8812_RSSI_REPORT, CmdLen, pCmdBuffer); #endif #endif break; case ODM_H2C_IQ_CALIBRATION: #if(DM_ODM_SUPPORT_TYPE & ODM_WIN) FillH2CCmd(Adapter, H2C_IQ_CALIBRATION, CmdLen, pCmdBuffer); #else #if((RTL8812A_SUPPORT==1) ||(RTL8821A_SUPPORT==1)) FillH2CCmd_8812(Adapter, H2C_8812_IQ_CALIBRATION, CmdLen, pCmdBuffer); #endif #endif break; default: break; } } else if(pDM_Odm->SupportICType == ODM_RTL8192E) { switch(ElementID) { case ODM_H2C_RSSI_REPORT: #if(DM_ODM_SUPPORT_TYPE & ODM_WIN) FillH2CCmd(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer); #else #if(RTL8192E_SUPPORT==1) FillH2CCmd_8192E(Adapter, H2C_8192E_RSSI_REPORT, CmdLen, pCmdBuffer); #endif #endif break; default: break; } } else if(pDM_Odm->SupportICType == ODM_RTL8723B) { switch(ElementID) { case ODM_H2C_RSSI_REPORT: #if(DM_ODM_SUPPORT_TYPE & ODM_WIN) FillH2CCmd(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer); #else #if(RTL8723B_SUPPORT==1) FillH2CCmd8723B(Adapter, H2C_8723B_RSSI_SETTING, CmdLen, pCmdBuffer); #endif #endif break; case ODM_H2C_WIFI_CALIBRATION: #if(DM_ODM_SUPPORT_TYPE & ODM_WIN) FillH2CCmd(Adapter, H2C_WIFI_CALIBRATION, CmdLen, pCmdBuffer); #else #if(RTL8723B_SUPPORT==1) FillH2CCmd8723B(Adapter, H2C_8723B_BT_WLAN_CALIBRATION, CmdLen, pCmdBuffer); #endif #endif break; default: break; } } else if(pDM_Odm->SupportICType == ODM_RTL8188E) { switch(ElementID) { case ODM_H2C_RSSI_REPORT: //if((pDM_Odm->CutVersion == ODM_CUT_I) && (!pDM_Odm->RaSupport88E)){ if(!pDM_Odm->RaSupport88E){ #if(DM_ODM_SUPPORT_TYPE & ODM_WIN) FillH2CCmd88E(Adapter, H2C_88E_RSSI_REPORT, CmdLen, pCmdBuffer); #else #if(RTL8188E_SUPPORT==1) FillH2CCmd_88E(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer); #endif #endif } break; default: break; } } #if(DM_ODM_SUPPORT_TYPE & ODM_CE) else if(pDM_Odm->SupportICType == ODM_RTL8723A) { switch(ElementID) { case ODM_H2C_RSSI_REPORT: #if(RTL8723A_SUPPORT==1) FillH2CCmd(Adapter, RSSI_SETTING_EID, CmdLen, pCmdBuffer); #endif break; default: break; } } else if(pDM_Odm->SupportICType == ODM_RTL8192D) { switch(ElementID) { case ODM_H2C_RSSI_REPORT: #if(RTL8192D_SUPPORT==1) FillH2CCmd92D(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer); #endif break; default: break; } } #endif else { switch(ElementID) { case ODM_H2C_RSSI_REPORT: #if(DM_ODM_SUPPORT_TYPE & ODM_WIN) FillH2CCmd92C(Adapter, H2C_RSSI_REPORT, CmdLen, pCmdBuffer); #else #if(RTL8192C_SUPPORT==1) rtl8192c_FillH2CCmd(Adapter, RSSI_SETTING_EID, CmdLen, pCmdBuffer); #endif #endif break; default: break; } } }
void rtl8188es_set_wowlan_cmd(_adapter* padapter, u8 enable) { u8 res=_SUCCESS; u32 test=0; struct recv_priv *precvpriv = &padapter->recvpriv; SETWOWLAN_PARM pwowlan_parm; SETAOAC_GLOBAL_INFO paoac_global_info_parm; struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); struct security_priv *psecpriv = &padapter->securitypriv; #ifdef CONFIG_GPIO_WAKEUP u8 gpio_wake_pin = 7; u8 gpio_high_active = 0; //default low active #endif _func_enter_; DBG_871X_LEVEL(_drv_always_, "+%s+\n", __func__); pwowlan_parm.mode =0; pwowlan_parm.gpio_index=0; pwowlan_parm.gpio_duration=0; pwowlan_parm.second_mode =0; pwowlan_parm.reserve=0; if(enable){ pwowlan_parm.mode |=FW_WOWLAN_FUN_EN; pwrpriv->wowlan_magic =_TRUE; if (psecpriv->dot11PrivacyAlgrthm == _WEP40_ || psecpriv->dot11PrivacyAlgrthm == _WEP104_) pwrpriv->wowlan_unicast =_TRUE; if(pwrpriv->wowlan_pattern ==_TRUE){ pwowlan_parm.mode |= FW_WOWLAN_PATTERN_MATCH; DBG_871X_LEVEL(_drv_info_, "%s 2.pwowlan_parm.mode=0x%x \n",__FUNCTION__,pwowlan_parm.mode ); } if(pwrpriv->wowlan_magic ==_TRUE){ pwowlan_parm.mode |=FW_WOWLAN_MAGIC_PKT; DBG_871X_LEVEL(_drv_info_, "%s 3.pwowlan_parm.mode=0x%x \n",__FUNCTION__,pwowlan_parm.mode ); } if(pwrpriv->wowlan_unicast ==_TRUE){ pwowlan_parm.mode |=FW_WOWLAN_UNICAST; DBG_871X_LEVEL(_drv_info_, "%s 4.pwowlan_parm.mode=0x%x \n",__FUNCTION__,pwowlan_parm.mode ); } pwowlan_parm.mode |=FW_WOWLAN_REKEY_WAKEUP; pwowlan_parm.mode |=FW_WOWLAN_DEAUTH_WAKEUP; //DataPinWakeUp #ifdef CONFIG_USB_HCI pwowlan_parm.gpio_index=0x0; #endif //CONFIG_USB_HCI #ifdef CONFIG_SDIO_HCI pwowlan_parm.gpio_index = 0x80; #endif //CONFIG_SDIO_HCI #ifdef CONFIG_GPIO_WAKEUP pwowlan_parm.gpio_index = gpio_wake_pin; //WOWLAN_GPIO_ACTIVE means GPIO high active //pwowlan_parm.mode |=FW_WOWLAN_GPIO_ACTIVE; if (gpio_high_active) pwowlan_parm.mode |=FW_WOWLAN_GPIO_ACTIVE; #endif //CONFIG_GPIO_WAKEUP DBG_871X_LEVEL(_drv_info_, "%s 5.pwowlan_parm.mode=0x%x \n",__FUNCTION__,pwowlan_parm.mode); DBG_871X_LEVEL(_drv_info_, "%s 6.pwowlan_parm.index=0x%x \n",__FUNCTION__,pwowlan_parm.gpio_index); res = FillH2CCmd_88E(padapter, H2C_COM_WWLAN, 2, (u8 *)&pwowlan_parm); rtw_msleep_os(2); //disconnect decision pwowlan_parm.mode =1; pwowlan_parm.gpio_index=0; pwowlan_parm.gpio_duration=0; FillH2CCmd_88E(padapter, H2C_COM_DISCNT_DECISION, 3, (u8 *)&pwowlan_parm); //keep alive period = 10 * 10 BCN interval pwowlan_parm.mode = FW_WOWLAN_KEEP_ALIVE_EN | FW_ADOPT_USER | FW_WOWLAN_KEEP_ALIVE_PKT_TYPE; pwowlan_parm.gpio_index = 5; res = FillH2CCmd_88E(padapter, H2C_COM_KEEP_ALIVE, 2, (u8 *)&pwowlan_parm); rtw_msleep_os(2); //Configure STA security information for GTK rekey wakeup event. paoac_global_info_parm.pairwiseEncAlg = padapter->securitypriv.dot11PrivacyAlgrthm; paoac_global_info_parm.groupEncAlg = padapter->securitypriv.dot118021XGrpPrivacy; FillH2CCmd_88E(padapter, H2C_COM_AOAC_GLOBAL_INFO, 2, (u8 *)&paoac_global_info_parm); rtw_msleep_os(2); //enable Remote wake ctrl pwowlan_parm.mode = FW_REMOTE_WAKE_CTRL_EN | FW_WOW_FW_UNICAST_EN | FW_ARP_EN; if (psecpriv->dot11PrivacyAlgrthm == _AES_ || psecpriv->dot11PrivacyAlgrthm == _NO_PRIVACY_) { pwowlan_parm.gpio_index=0; } else { pwowlan_parm.gpio_index=1; } pwowlan_parm.gpio_duration=0; res = FillH2CCmd_88E(padapter, H2C_COM_REMOTE_WAKE_CTRL, 3, (u8 *)&pwowlan_parm); } else { pwrpriv->wowlan_magic =_FALSE; #ifdef CONFIG_GPIO_WAKEUP rtl8188es_set_output_gpio(padapter, gpio_wake_pin, !gpio_high_active); #endif //CONFIG_GPIO_WAKEUP res = FillH2CCmd_88E(padapter, H2C_COM_WWLAN, 2, (u8 *)&pwowlan_parm); rtw_msleep_os(2); res = FillH2CCmd_88E(padapter, H2C_COM_REMOTE_WAKE_CTRL, 3, (u8 *)&pwowlan_parm); } _func_exit_; DBG_871X_LEVEL(_drv_always_, "-%s res:%d-\n", __func__, res); return ; }
void rtl8188e_set_p2p_ps_offload_cmd(_adapter* padapter, u8 p2p_ps_state) { HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); struct P2P_PS_Offload_t *p2p_ps_offload = (struct P2P_PS_Offload_t *)(&pHalData->p2p_ps_offload); u8 i; _func_enter_; #if 1 switch(p2p_ps_state) { case P2P_PS_DISABLE: DBG_8192C("P2P_PS_DISABLE \n"); _rtw_memset(p2p_ps_offload, 0 ,1); break; case P2P_PS_ENABLE: DBG_8192C("P2P_PS_ENABLE \n"); // update CTWindow value. if( pwdinfo->ctwindow > 0 ) { p2p_ps_offload->CTWindow_En = 1; rtw_write8(padapter, REG_P2P_CTWIN, pwdinfo->ctwindow); } // hw only support 2 set of NoA for( i=0 ; i<pwdinfo->noa_num ; i++) { // To control the register setting for which NOA rtw_write8(padapter, REG_NOA_DESC_SEL, (i << 4)); if(i == 0) p2p_ps_offload->NoA0_En = 1; else p2p_ps_offload->NoA1_En = 1; // config P2P NoA Descriptor Register //DBG_8192C("%s(): noa_duration = %x\n",__FUNCTION__,pwdinfo->noa_duration[i]); rtw_write32(padapter, REG_NOA_DESC_DURATION, pwdinfo->noa_duration[i]); //DBG_8192C("%s(): noa_interval = %x\n",__FUNCTION__,pwdinfo->noa_interval[i]); rtw_write32(padapter, REG_NOA_DESC_INTERVAL, pwdinfo->noa_interval[i]); //DBG_8192C("%s(): start_time = %x\n",__FUNCTION__,pwdinfo->noa_start_time[i]); rtw_write32(padapter, REG_NOA_DESC_START, pwdinfo->noa_start_time[i]); //DBG_8192C("%s(): noa_count = %x\n",__FUNCTION__,pwdinfo->noa_count[i]); rtw_write8(padapter, REG_NOA_DESC_COUNT, pwdinfo->noa_count[i]); } if( (pwdinfo->opp_ps == 1) || (pwdinfo->noa_num > 0) ) { // rst p2p circuit rtw_write8(padapter, REG_DUAL_TSF_RST, BIT(4)); p2p_ps_offload->Offload_En = 1; if(pwdinfo->role == P2P_ROLE_GO) { p2p_ps_offload->role= 1; p2p_ps_offload->AllStaSleep = 0; } else { p2p_ps_offload->role= 0; } p2p_ps_offload->discovery = 0; } break; case P2P_PS_SCAN: DBG_8192C("P2P_PS_SCAN \n"); p2p_ps_offload->discovery = 1; break; case P2P_PS_SCAN_DONE: DBG_8192C("P2P_PS_SCAN_DONE \n"); p2p_ps_offload->discovery = 0; pwdinfo->p2p_ps_state = P2P_PS_ENABLE; break; default: break; } FillH2CCmd_88E(padapter, H2C_PS_P2P_OFFLOAD, 1, (u8 *)p2p_ps_offload); #endif _func_exit_; }
void rtl8188e_set_FwJoinBssReport_cmd(PADAPTER padapter, u8 mstatus) { JOINBSSRPT_PARM_88E JoinBssRptParm; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); #ifdef CONFIG_WOWLAN struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct sta_info *psta = NULL; #endif BOOLEAN bSendBeacon=_FALSE; BOOLEAN bcn_valid = _FALSE; u8 DLBcnCount=0; u32 poll = 0; _func_enter_; DBG_871X("%s mstatus(%x)\n", __FUNCTION__,mstatus); if(mstatus == 1) { // We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 88/92C. // Suggested by filen. Added by tynli. rtw_write16(padapter, REG_BCN_PSR_RPT, (0xC000|pmlmeinfo->aid)); // Do not set TSF again here or vWiFi beacon DMA INT will not work. //correct_TSF(padapter, pmlmeext); // Hw sequende enable by dedault. 2010.06.23. by tynli. //rtw_write16(padapter, REG_NQOS_SEQ, ((pmlmeext->mgnt_seq+100)&0xFFF)); //rtw_write8(padapter, REG_HWSEQ_CTRL, 0xFF); //Set REG_CR bit 8. DMA beacon by SW. pHalData->RegCR_1 |= BIT0; rtw_write8(padapter, REG_CR+1, pHalData->RegCR_1); // Disable Hw protection for a time which revserd for Hw sending beacon. // Fix download reserved page packet fail that access collision with the protection time. // 2010.05.11. Added by tynli. //SetBcnCtrlReg(padapter, 0, BIT3); //SetBcnCtrlReg(padapter, BIT4, 0); rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(3))); rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(4)); if(pHalData->RegFwHwTxQCtrl&BIT6) { DBG_871X("HalDownloadRSVDPage(): There is an Adapter is sending beacon.\n"); bSendBeacon = _TRUE; } // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame. rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl&(~BIT6))); pHalData->RegFwHwTxQCtrl &= (~BIT6); // Clear beacon valid check bit. rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL); DLBcnCount = 0; poll = 0; do { // download rsvd page. SetFwRsvdPagePkt(padapter, _FALSE); DLBcnCount++; do { rtw_yield_os(); //rtw_mdelay_os(10); // check rsvd page download OK. rtw_hal_get_hwreg(padapter, HW_VAR_BCN_VALID, (u8*)(&bcn_valid)); poll++; } while(!bcn_valid && (poll%10)!=0 && !padapter->bSurpriseRemoved && !padapter->bDriverStopped); }while(!bcn_valid && DLBcnCount<=100 && !padapter->bSurpriseRemoved && !padapter->bDriverStopped); //RT_ASSERT(bcn_valid, ("HalDownloadRSVDPage88ES(): 1 Download RSVD page failed!\n")); if(padapter->bSurpriseRemoved || padapter->bDriverStopped) { } else if(!bcn_valid) DBG_871X(ADPT_FMT": 1 DL RSVD page failed! DLBcnCount:%u, poll:%u\n", ADPT_ARG(padapter) ,DLBcnCount, poll); else { struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter); pwrctl->fw_psmode_iface_id = padapter->iface_id; DBG_871X(ADPT_FMT": 1 DL RSVD page success! DLBcnCount:%u, poll:%u\n", ADPT_ARG(padapter), DLBcnCount, poll); } // // We just can send the reserved page twice during the time that Tx thread is stopped (e.g. pnpsetpower) // becuase we need to free the Tx BCN Desc which is used by the first reserved page packet. // At run time, we cannot get the Tx Desc until it is released in TxHandleInterrupt() so we will return // the beacon TCB in the following code. 2011.11.23. by tynli. // //if(bcn_valid && padapter->bEnterPnpSleep) if(0) { if(bSendBeacon) { rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL); DLBcnCount = 0; poll = 0; do { SetFwRsvdPagePkt(padapter, _TRUE); DLBcnCount++; do { rtw_yield_os(); //rtw_mdelay_os(10); // check rsvd page download OK. rtw_hal_get_hwreg(padapter, HW_VAR_BCN_VALID, (u8*)(&bcn_valid)); poll++; } while(!bcn_valid && (poll%10)!=0 && !padapter->bSurpriseRemoved && !padapter->bDriverStopped); }while(!bcn_valid && DLBcnCount<=100 && !padapter->bSurpriseRemoved && !padapter->bDriverStopped); //RT_ASSERT(bcn_valid, ("HalDownloadRSVDPage(): 2 Download RSVD page failed!\n")); if(padapter->bSurpriseRemoved || padapter->bDriverStopped) { } else if(!bcn_valid) DBG_871X("%s: 2 Download RSVD page failed! DLBcnCount:%u, poll:%u\n", __FUNCTION__ ,DLBcnCount, poll); else DBG_871X("%s: 2 Download RSVD success! DLBcnCount:%u, poll:%u\n", __FUNCTION__, DLBcnCount, poll); } } // Enable Bcn //SetBcnCtrlReg(padapter, BIT3, 0); //SetBcnCtrlReg(padapter, 0, BIT4); rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(3)); rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(4))); // To make sure that if there exists an adapter which would like to send beacon. // If exists, the origianl value of 0x422[6] will be 1, we should check this to // prevent from setting 0x422[6] to 0 after download reserved page, or it will cause // the beacon cannot be sent by HW. // 2010.06.23. Added by tynli. if(bSendBeacon) { rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl|BIT6)); pHalData->RegFwHwTxQCtrl |= BIT6; } // // Update RSVD page location H2C to Fw. // if(bcn_valid) { rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL); DBG_871X("Set RSVD page location to Fw.\n"); //FillH2CCmd88E(Adapter, H2C_88E_RSVDPAGE, H2C_RSVDPAGE_LOC_LENGTH, pMgntInfo->u1RsvdPageLoc); } // Do not enable HW DMA BCN or it will cause Pcie interface hang by timing issue. 2011.11.24. by tynli. //if(!padapter->bEnterPnpSleep) { // Clear CR[8] or beacon packet will not be send to TxBuf anymore. pHalData->RegCR_1 &= (~BIT0); rtw_write8(padapter, REG_CR+1, pHalData->RegCR_1); } } #ifdef CONFIG_WOWLAN if (adapter_to_pwrctl(padapter)->wowlan_mode){ JoinBssRptParm.OpMode = mstatus; psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(pmlmepriv)); if (psta != NULL) { JoinBssRptParm.MacID = psta->mac_id; } else { JoinBssRptParm.MacID = 0; } FillH2CCmd_88E(padapter, H2C_COM_MEDIA_STATUS_RPT, sizeof(JoinBssRptParm), (u8 *)&JoinBssRptParm); DBG_871X_LEVEL(_drv_info_, "%s opmode:%d MacId:%d\n", __func__, JoinBssRptParm.OpMode, JoinBssRptParm.MacID); } else { DBG_871X_LEVEL(_drv_info_, "%s wowlan_mode is off\n", __func__); } #endif //CONFIG_WOWLAN _func_exit_; }
VOID ODM_FillH2CCmd( IN PDM_ODM_T pDM_Odm, IN u1Byte phydm_h2c_id, IN u4Byte CmdLen, IN pu1Byte pCmdBuffer ) { PADAPTER Adapter = pDM_Odm->Adapter; u1Byte platform_h2c_id; platform_h2c_id=phydm_trans_h2c_id(pDM_Odm, phydm_h2c_id); if(platform_h2c_id==0xff) { ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[H2C] Wrong H2C CMD-ID !! platform_h2c_id==0xff , PHYDM_ElementID=((%d )) \n",phydm_h2c_id)); return; } #if(DM_ODM_SUPPORT_TYPE & ODM_WIN) if(pDM_Odm->SupportICType == ODM_RTL8188E) { if(!pDM_Odm->RaSupport88E) FillH2CCmd88E(Adapter, platform_h2c_id, CmdLen, pCmdBuffer); } else if(pDM_Odm->SupportICType == ODM_RTL8192C) { FillH2CCmd92C(Adapter, platform_h2c_id, CmdLen, pCmdBuffer); } else if(pDM_Odm->SupportICType == ODM_RTL8814A) { FillH2CCmd8814A(Adapter, platform_h2c_id, CmdLen, pCmdBuffer); } else { FillH2CCmd(Adapter, platform_h2c_id, CmdLen, pCmdBuffer); } #elif(DM_ODM_SUPPORT_TYPE & ODM_CE) #if((RTL8812A_SUPPORT==1) ||(RTL8821A_SUPPORT==1)) FillH2CCmd_8812(Adapter, platform_h2c_id, CmdLen, pCmdBuffer); #elif(RTL8192E_SUPPORT==1) FillH2CCmd_8192E(Adapter, platform_h2c_id, CmdLen, pCmdBuffer); #elif(RTL8723B_SUPPORT==1) FillH2CCmd8723B(Adapter, platform_h2c_id, CmdLen, pCmdBuffer); #elif(RTL8188E_SUPPORT==1) if(!pDM_Odm->RaSupport88E) FillH2CCmd_88E(Adapter, platform_h2c_id, CmdLen, pCmdBuffer); #elif(RTL8723A_SUPPORT==1) FillH2CCmd(Adapter, platform_h2c_id, CmdLen, pCmdBuffer); #elif(RTL8192D_SUPPORT==1) FillH2CCmd92D(Adapter, platform_h2c_id, CmdLen, pCmdBuffer); #elif(RTL8192C_SUPPORT==1) rtl8192c_FillH2CCmd(Adapter, platform_h2c_id, CmdLen, pCmdBuffer); #endif #elif(DM_ODM_SUPPORT_TYPE & ODM_AP) #if((RTL8881A_SUPPORT==1)||(RTL8192E_SUPPORT==1)||(RTL8814A_SUPPORT==1)) if(pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E|| pDM_Odm->SupportICType == ODM_RTL8814A) { GET_HAL_INTERFACE(pDM_Odm->priv)->FillH2CCmdHandler(pDM_Odm->priv, platform_h2c_id, CmdLen, pCmdBuffer); //FillH2CCmd88XX(pDM_Odm->priv, platform_h2c_id, CmdLen, pCmdBuffer); } else #endif #if(RTL8812A_SUPPORT==1) if(pDM_Odm->SupportICType == ODM_RTL8812) { FillH2CCmd8812(pDM_Odm->priv, platform_h2c_id, CmdLen, pCmdBuffer); } else #endif {} #endif }