• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/staging/rt2860/common/

Lines Matching refs:pAd

359 int MlmeInit(struct rt_rtmp_adapter *pAd)
366 Status = MlmeQueueInit(&pAd->Mlme.Queue);
370 pAd->Mlme.bRunning = FALSE;
371 NdisAllocateSpinLock(&pAd->Mlme.TaskLock);
374 BssTableInit(&pAd->ScanTab);
377 AssocStateMachineInit(pAd, &pAd->Mlme.AssocMachine,
378 pAd->Mlme.AssocFunc);
379 AuthStateMachineInit(pAd, &pAd->Mlme.AuthMachine,
380 pAd->Mlme.AuthFunc);
381 AuthRspStateMachineInit(pAd, &pAd->Mlme.AuthRspMachine,
382 pAd->Mlme.AuthRspFunc);
383 SyncStateMachineInit(pAd, &pAd->Mlme.SyncMachine,
384 pAd->Mlme.SyncFunc);
388 MlmeCntlInit(pAd, &pAd->Mlme.CntlMachine, NULL);
391 WpaStateMachineInit(pAd, &pAd->Mlme.WpaMachine,
392 pAd->Mlme.WpaFunc);
394 ActionStateMachineInit(pAd, &pAd->Mlme.ActMachine,
395 pAd->Mlme.ActFunc);
398 RTMPInitTimer(pAd, &pAd->Mlme.PeriodicTimer,
399 GET_TIMER_FUNCTION(MlmePeriodicExec), pAd, TRUE);
402 RTMPSetTimer(&pAd->Mlme.PeriodicTimer, MLME_TASK_EXEC_INTV);
405 RTMPInitTimer(pAd, &pAd->Mlme.RxAntEvalTimer,
406 GET_TIMER_FUNCTION(AsicRxAntEvalTimeout), pAd,
411 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)) {
413 RTMPInitTimer(pAd, &pAd->Mlme.PsPollTimer,
415 (PsPollWakeExec), pAd, FALSE);
416 RTMPInitTimer(pAd, &pAd->Mlme.RadioOnOffTimer,
418 pAd, FALSE);
422 RTMPInitTimer(pAd, &pAd->Mlme.LinkDownTimer,
423 GET_TIMER_FUNCTION(LinkDownExec), pAd,
427 RTMPInitTimer(pAd, &pAd->Mlme.AutoWakeupTimer,
429 (RtmpUsbStaAsicForceWakeupTimeout), pAd,
431 pAd->Mlme.AutoWakeupTimerRunning = FALSE;
456 void MlmeHandler(struct rt_rtmp_adapter *pAd)
463 NdisAcquireSpinLock(&pAd->Mlme.TaskLock);
464 if (pAd->Mlme.bRunning) {
465 NdisReleaseSpinLock(&pAd->Mlme.TaskLock);
468 pAd->Mlme.bRunning = TRUE;
470 NdisReleaseSpinLock(&pAd->Mlme.TaskLock);
472 while (!MlmeQueueEmpty(&pAd->Mlme.Queue)) {
473 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_MLME_RESET_IN_PROGRESS) ||
474 RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS) ||
475 RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) {
478 pAd->Mlme.Queue.Num));
482 if (MlmeDequeue(&pAd->Mlme.Queue, &Elem)) {
487 MlmeRestartStateMachine(pAd);
498 StateMachinePerformAction(pAd,
499 &pAd->Mlme.
503 StateMachinePerformAction(pAd,
504 &pAd->Mlme.
508 StateMachinePerformAction(pAd,
509 &pAd->Mlme.
513 StateMachinePerformAction(pAd,
514 &pAd->Mlme.
518 MlmeCntlMachinePerformAction(pAd,
519 &pAd->Mlme.
523 StateMachinePerformAction(pAd,
524 &pAd->Mlme.
529 StateMachinePerformAction(pAd,
530 &pAd->Mlme.ActMachine,
535 StateMachinePerformAction(pAd,
536 &pAd->Mlme.WpaMachine,
556 NdisAcquireSpinLock(&pAd->Mlme.TaskLock);
557 pAd->Mlme.bRunning = FALSE;
558 NdisReleaseSpinLock(&pAd->Mlme.TaskLock);
574 void MlmeHalt(struct rt_rtmp_adapter *pAd)
580 if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) {
582 AsicDisableSync(pAd);
587 RTMPCancelTimer(&pAd->MlmeAux.AssocTimer, &Cancelled);
588 RTMPCancelTimer(&pAd->MlmeAux.ReassocTimer, &Cancelled);
589 RTMPCancelTimer(&pAd->MlmeAux.DisassocTimer, &Cancelled);
590 RTMPCancelTimer(&pAd->MlmeAux.AuthTimer, &Cancelled);
591 RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &Cancelled);
592 RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled);
595 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)
596 && (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE)) {
597 RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled);
598 RTMPCancelTimer(&pAd->Mlme.RadioOnOffTimer, &Cancelled);
602 RTMPCancelTimer(&pAd->Mlme.LinkDownTimer, &Cancelled);
605 RTMPCancelTimer(&pAd->Mlme.AutoWakeupTimer, &Cancelled);
609 RTMPCancelTimer(&pAd->Mlme.PeriodicTimer, &Cancelled);
610 RTMPCancelTimer(&pAd->Mlme.RxAntEvalTimer, &Cancelled);
612 if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) {
613 struct rt_rtmp_chip_op *pChipOps = &pAd->chipOps;
616 RTMPSetLED(pAd, LED_HALT);
617 RTMPSetSignalLED(pAd, -100); /* Force signal strength Led to be turned off, firmware is not done it. */
621 RTMP_IO_READ32(pAd, LED_CFG, &LedCfg.word);
626 RTMP_IO_WRITE32(pAd, LED_CFG, LedCfg.word);
631 pChipOps->AsicHaltAction(pAd);
636 MlmeQueueDestroy(&pAd->Mlme.Queue);
637 NdisFreeSpinLock(&pAd->Mlme.TaskLock);
642 void MlmeResetRalinkCounters(struct rt_rtmp_adapter *pAd)
644 pAd->RalinkCounters.LastOneSecRxOkDataCnt =
645 pAd->RalinkCounters.OneSecRxOkDataCnt;
647 pAd->RalinkCounters.OneSecBeaconSentCnt = 0;
648 pAd->RalinkCounters.OneSecFalseCCACnt = 0;
649 pAd->RalinkCounters.OneSecRxFcsErrCnt = 0;
650 pAd->RalinkCounters.OneSecRxOkCnt = 0;
651 pAd->RalinkCounters.OneSecTxFailCount = 0;
652 pAd->RalinkCounters.OneSecTxNoRetryOkCount = 0;
653 pAd->RalinkCounters.OneSecTxRetryOkCount = 0;
654 pAd->RalinkCounters.OneSecRxOkDataCnt = 0;
655 pAd->RalinkCounters.OneSecReceivedByteCount = 0;
656 pAd->RalinkCounters.OneSecTransmittedByteCount = 0;
659 pAd->RalinkCounters.OneSecOsTxCount[QID_AC_BE] = 0;
660 pAd->RalinkCounters.OneSecOsTxCount[QID_AC_BK] = 0;
661 pAd->RalinkCounters.OneSecOsTxCount[QID_AC_VI] = 0;
662 pAd->RalinkCounters.OneSecOsTxCount[QID_AC_VO] = 0;
663 pAd->RalinkCounters.OneSecDmaDoneCount[QID_AC_BE] = 0;
664 pAd->RalinkCounters.OneSecDmaDoneCount[QID_AC_BK] = 0;
665 pAd->RalinkCounters.OneSecDmaDoneCount[QID_AC_VI] = 0;
666 pAd->RalinkCounters.OneSecDmaDoneCount[QID_AC_VO] = 0;
667 pAd->RalinkCounters.OneSecTxDoneCount = 0;
668 pAd->RalinkCounters.OneSecRxCount = 0;
669 pAd->RalinkCounters.OneSecTxAggregationCount = 0;
670 pAd->RalinkCounters.OneSecRxAggregationCount = 0;
697 struct rt_rtmp_adapter *pAd = (struct rt_rtmp_adapter *)FunctionContext;
703 if ((pAd->Mlme.PeriodicRound % (MLME_TASK_EXEC_MULTIPLE * 2) ==
704 0) && (pAd->StaCfg.bHardwareRadio == TRUE)
705 && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))
706 && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))
707 /*&&(pAd->bPCIclkOff == FALSE) */
713 RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &data);
719 if ((pAd->OpMode == OPMODE_STA) && (IDLE_ON(pAd))
721 (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))
722 && (pAd->StaCfg.PSControl.field.EnablePSinIdle ==
725 RTMPPCIeLinkCtrlValueRestore(pAd, 0);
726 RTMP_IO_FORCE_READ32(pAd, GPIO_CTRL_CFG, &data);
727 RTMPPCIeLinkCtrlSetting(pAd, 3);
729 RTMP_IO_FORCE_READ32(pAd, GPIO_CTRL_CFG, &data);
734 pAd->StaCfg.bHwRadio = TRUE;
736 pAd->StaCfg.bHwRadio = FALSE;
738 if (pAd->StaCfg.bRadio !=
739 (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio)) {
740 pAd->StaCfg.bRadio = (pAd->StaCfg.bHwRadio
741 && pAd->StaCfg.bSwRadio);
742 if (pAd->StaCfg.bRadio == TRUE) {
743 MlmeRadioOn(pAd);
745 pAd->ExtraInfo = EXTRA_INFO_CLEAR;
747 MlmeRadioOff(pAd);
749 pAd->ExtraInfo = HW_RADIO_OFF;
758 if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_HALT_IN_PROGRESS |
764 RTMP_MLME_PRE_SANITY_CHECK(pAd);
768 if (MONITOR_ON(pAd))
771 if (pAd->Mlme.PeriodicRound & 0x1) {
773 if (((pAd->MACVersion & 0xffff) == 0x0101) &&
774 (STA_TGN_WIFI_ON(pAd)) &&
775 (pAd->CommonCfg.IOTestParm.bToggle == FALSE))
777 RTMP_IO_WRITE32(pAd, TXOP_CTRL_CFG, 0x24Bf);
778 pAd->CommonCfg.IOTestParm.bToggle = TRUE;
779 } else if ((STA_TGN_WIFI_ON(pAd)) &&
780 ((pAd->MACVersion & 0xffff) == 0x0101)) {
781 RTMP_IO_WRITE32(pAd, TXOP_CTRL_CFG, 0x243f);
782 pAd->CommonCfg.IOTestParm.bToggle = FALSE;
787 pAd->bUpdateBcnCntDone = FALSE;
790 pAd->Mlme.PeriodicRound++;
794 NICUpdateFifoStaCounters(pAd);
798 if ((pAd->Mlme.PeriodicRound % 5 == 0)
799 && RTMPAutoRateSwitchCheck(pAd)
800 /*(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED)) */ )
805 (pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)
807 && (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)))
808 MlmeDynamicTxRateSwitching(pAd);
812 if (pAd->Mlme.PeriodicRound % MLME_TASK_EXEC_MULTIPLE == 0) {
813 pAd->Mlme.OneSecPeriodicRound++;
815 /*ORIBATimerTimeout(pAd); */
818 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_MEDIA_STATE_CHANGE)) {
819 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_MEDIA_STATE_CHANGE);
821 (pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) {
822 pAd->IndicateMediaState =
824 RTMP_IndicateMediaState(pAd);
827 pAd->IndicateMediaState =
829 RTMP_IndicateMediaState(pAd);
833 NdisGetSystemUpTime(&pAd->Mlme.Now32);
837 NICUpdateRawCounters(pAd);
840 RTUSBWatchDog(pAd);
844 ORIBATimerTimeout(pAd);
849 /* if (pAd->RalinkCounters.MgmtRingFullCount >= 2) */
850 /* RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HARDWARE_ERROR); */
852 /* pAd->RalinkCounters.MgmtRingFullCount = 0; */
856 if (pAd->Mlme.bEnableAutoAntennaCheck) {
858 pAd->RalinkCounters.OneSecTxNoRetryOkCount +
859 pAd->RalinkCounters.OneSecTxRetryOkCount +
860 pAd->RalinkCounters.OneSecTxFailCount;
864 if (pAd->Mlme.OneSecPeriodicRound %
866 AsicEvaluateRxAnt(pAd);
869 if (pAd->Mlme.OneSecPeriodicRound % 3 ==
871 AsicEvaluateRxAnt(pAd);
877 STAMlmePeriodicExec(pAd);
879 MlmeResetRalinkCounters(pAd);
883 if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)
884 && (pAd->bPCIclkOff == FALSE))
896 RTMP_IO_READ32(pAd, 0x10F4, &MacReg);
900 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x1);
902 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0xC);
910 RTMP_MLME_HANDLER(pAd);
913 pAd->bUpdateBcnCntDone = FALSE;
941 void MlmeSelectTxRateTable(struct rt_rtmp_adapter *pAd,
948 if (pAd->CommonCfg.TxRateTableSize > 0) {
956 if ((pAd->OpMode == OPMODE_STA) && ADHOC_ON(pAd)) {
957 if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && (pEntry->HTCapability.MCSSet[0] == 0xff) && ((pEntry->HTCapability.MCSSet[1] == 0x00) || (pAd->Antenna.field.TxPath == 1))) { /* 11N 1S Adhoc */
962 } else if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && (pEntry->HTCapability.MCSSet[0] == 0xff) && (pEntry->HTCapability.MCSSet[1] == 0xff) && (pAd->Antenna.field.TxPath == 2)) { /* 11N 2S Adhoc */
963 if (pAd->LatchRfRegs.Channel <= 14) {
984 } else if (pAd->LatchRfRegs.Channel <= 14) {
997 /*if ((pAd->StaActive.SupRateLen + pAd->StaActive.ExtRateLen == 12) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0xff) && */
998 /* ((pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0x00) || (pAd->Antenna.field.TxPath == 1))) */
999 if (((pEntry->RateLen == 12) || (pAd->OpMode == OPMODE_STA)) && (pEntry->HTCapability.MCSSet[0] == 0xff) && ((pEntry->HTCapability.MCSSet[1] == 0x00) || (pAd->CommonCfg.TxStream == 1))) { /* 11BGN 1S AP */
1006 /*else if ((pAd->StaActive.SupRateLen + pAd->StaActive.ExtRateLen == 12) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0xff) && */
1007 /* (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0xff) && (pAd->Antenna.field.TxPath == 2)) */
1008 if (((pEntry->RateLen == 12) || (pAd->OpMode == OPMODE_STA)) && (pEntry->HTCapability.MCSSet[0] == 0xff) && (pEntry->HTCapability.MCSSet[1] == 0xff) && (pAd->CommonCfg.TxStream == 2)) { /* 11BGN 2S AP */
1009 if (pAd->LatchRfRegs.Channel <= 14) {
1023 /*else if ((pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0xff) && ((pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0x00) || (pAd->Antenna.field.TxPath == 1))) */
1024 if ((pEntry->HTCapability.MCSSet[0] == 0xff) && ((pEntry->HTCapability.MCSSet[1] == 0x00) || (pAd->CommonCfg.TxStream == 1))) { /* 11N 1S AP */
1031 /*else if ((pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0xff) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0xff) && (pAd->Antenna.field.TxPath == 2)) */
1032 if ((pEntry->HTCapability.MCSSet[0] == 0xff) && (pEntry->HTCapability.MCSSet[1] == 0xff) && (pAd->CommonCfg.TxStream == 2)) { /* 11N 2S AP */
1033 if (pAd->LatchRfRegs.Channel <= 14) {
1046 /*else if ((pAd->StaActive.SupRateLen == 4) && (pAd->StaActive.ExtRateLen == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0)) */
1047 if ((pEntry->RateLen == 4 || pAd->CommonCfg.PhyMode == PHY_11B)
1057 /*else if ((pAd->StaActive.SupRateLen + pAd->StaActive.ExtRateLen > 8) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0)) */
1068 /*else if ((pAd->StaActive.SupRateLen + pAd->StaActive.ExtRateLen == 8) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0)) */
1081 /*else if ((pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0)) */
1083 if (pAd->CommonCfg.MaxTxRate <= RATE_11) {
1087 } else if ((pAd->CommonCfg.MaxTxRate > RATE_11)
1088 && (pAd->CommonCfg.MinTxRate >
1102 if (pAd->LatchRfRegs.Channel <= 14) {
1103 if (pAd->CommonCfg.TxStream == 1) {
1119 if (pAd->CommonCfg.TxStream == 1) {
1138 pAd->StaActive.SupRateLen,
1139 pAd->StaActive.ExtRateLen,
1140 pAd->StaActive.SupportedPhyInfo.MCSSet[0],
1141 pAd->StaActive.SupportedPhyInfo.
1147 void STAMlmePeriodicExec(struct rt_rtmp_adapter *pAd)
1158 if (!pAd->CommonCfg.HighPowerPatchDisabled) {
1160 if ((IS_RT3070(pAd) && ((pAd->MACVersion & 0xffff) < 0x0201)))
1163 if ((pAd->StaCfg.RssiSample.AvgRssi0 != 0)
1164 && (pAd->StaCfg.RssiSample.AvgRssi0 >
1165 (pAd->BbpRssiToDbmDelta - 35))) {
1166 RT30xxWriteRFRegister(pAd, RF_R27, 0x20);
1168 RT30xxWriteRFRegister(pAd, RF_R27, 0x23);
1176 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)) {
1177 if ((pAd->OpMode == OPMODE_STA) && (IDLE_ON(pAd))
1178 && (pAd->Mlme.SyncMachine.CurrState == SYNC_IDLE)
1179 && (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE)
1180 && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))) {
1181 if (IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) {
1182 if (pAd->StaCfg.PSControl.field.EnableNewPS ==
1186 RT28xxPciAsicRadioOff(pAd,
1190 AsicSendCommandToMcu(pAd, 0x30,
1194 AsicCheckCommanOk(pAd, PowerSafeCID);
1195 RTMP_SET_FLAG(pAd,
1200 } else if (pAd->Mlme.OneSecPeriodicRound > 180) {
1201 if (pAd->StaCfg.PSControl.field.EnableNewPS ==
1205 RT28xxPciAsicRadioOff(pAd,
1209 AsicSendCommandToMcu(pAd, 0x30,
1213 AsicCheckCommanOk(pAd, PowerSafeCID);
1214 RTMP_SET_FLAG(pAd,
1223 pAd->CommonCfg.SsidLen,
1224 pAd->CommonCfg.Ssid[0],
1225 pAd->CommonCfg.Ssid[1],
1226 pAd->CommonCfg.Ssid[2],
1227 pAd->CommonCfg.Ssid[3], pAd->MlmeAux.SsidLen,
1228 pAd->MlmeAux.Ssid[0], pAd->MlmeAux.Ssid[1],
1229 pAd->MlmeAux.Ssid[2], pAd->MlmeAux.Ssid[3]));
1234 if (pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_DISABLE) {
1236 if (pAd->StaCfg.bBlockAssoc &&
1237 RTMP_TIME_AFTER(pAd->Mlme.Now32,
1238 pAd->StaCfg.LastMicErrorTime +
1240 pAd->StaCfg.bBlockAssoc = FALSE;
1243 if ((pAd->PreMediaState != pAd->IndicateMediaState)
1244 && (pAd->CommonCfg.bWirelessEvent)) {
1245 if (pAd->IndicateMediaState == NdisMediaStateConnected) {
1246 RTMPSendWirelessEvent(pAd, IW_STA_LINKUP_EVENT_FLAG,
1247 pAd->MacTab.Content[BSSID_WCID].
1250 pAd->PreMediaState = pAd->IndicateMediaState;
1253 if (pAd->CommonCfg.PSPXlink && ADHOC_ON(pAd)) {
1255 AsicStaBbpTuning(pAd);
1258 TxTotalCnt = pAd->RalinkCounters.OneSecTxNoRetryOkCount +
1259 pAd->RalinkCounters.OneSecTxRetryOkCount +
1260 pAd->RalinkCounters.OneSecTxFailCount;
1262 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) {
1264 MlmeCalculateChannelQuality(pAd, NULL, pAd->Mlme.Now32);
1268 if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
1269 AsicAdjustTxPower(pAd);
1271 if (INFRA_ON(pAd)) {
1275 if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
1276 MlmeCheckPsmChange(pAd, pAd->Mlme.Now32);
1278 pAd->RalinkCounters.LastOneSecTotalTxCount = TxTotalCnt;
1281 (pAd->Mlme.Now32,
1282 pAd->StaCfg.LastBeaconRxTime + (1 * OS_HZ)))
1284 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
1286 (((TxTotalCnt + pAd->RalinkCounters.OneSecRxOkCnt) <
1288 RTMPSetAGCInitValue(pAd, BW_20);
1291 (0x2E + GET_LNA_GAIN(pAd))));
1293 /*if ((pAd->RalinkCounters.OneSecTxNoRetryOkCount == 0) && */
1294 /* (pAd->RalinkCounters.OneSecTxRetryOkCount == 0)) */
1296 if (pAd->CommonCfg.bAPSDCapable
1297 && pAd->CommonCfg.APEdcaParm.bAPSDCapable) {
1299 if ((pAd->Mlme.OneSecPeriodicRound % 20) == 8)
1300 RTMPSendNullFrame(pAd,
1301 pAd->CommonCfg.TxRate,
1305 if ((pAd->Mlme.OneSecPeriodicRound % 10) == 8) {
1306 if (pAd->CommonCfg.bWmmCapable)
1307 RTMPSendNullFrame(pAd,
1308 pAd->
1312 RTMPSendNullFrame(pAd,
1313 pAd->
1321 if (CQI_IS_DEAD(pAd->Mlme.ChannelQuality)) {
1324 pAd->RalinkCounters.BadCQIAutoRecoveryCount));
1327 LinkDown(pAd, FALSE);
1329 RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL,
1332 /* RTMPPatchMacBbpBug(pAd); */
1333 MlmeAutoReconnectLastSSID(pAd);
1334 } else if (CQI_IS_BAD(pAd->Mlme.ChannelQuality)) {
1335 pAd->RalinkCounters.BadCQIAutoRecoveryCount++;
1338 pAd->RalinkCounters.BadCQIAutoRecoveryCount));
1339 MlmeAutoReconnectLastSSID(pAd);
1342 if (pAd->StaCfg.bAutoRoaming) {
1344 char dBmToRoam = pAd->StaCfg.dBmToRoam;
1345 char MaxRssi = RTMPMaxRssi(pAd,
1346 pAd->StaCfg.RssiSample.
1348 pAd->StaCfg.RssiSample.
1350 pAd->StaCfg.RssiSample.
1355 (pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)
1356 && (pAd->Mlme.SyncMachine.CurrState == SYNC_IDLE)
1364 rv = MlmeCheckForFastRoaming(pAd);
1367 if ((pAd->StaCfg.LastScanTime +
1368 10 * OS_HZ) < pAd->Mlme.Now32) {
1371 pAd->StaCfg.ScanCnt = 2;
1372 pAd->StaCfg.LastScanTime =
1373 pAd->Mlme.Now32;
1374 MlmeAutoScan(pAd);
1379 } else if (ADHOC_ON(pAd)) {
1384 (pAd->Mlme.Now32,
1385 pAd->StaCfg.LastBeaconRxTime + ADHOC_BEACON_LOST_TIME)
1386 && OPSTATUS_TEST_FLAG(pAd,
1392 LinkDown(pAd, FALSE);
1394 StartParmFill(pAd, &StartReq,
1395 (char *) pAd->MlmeAux.Ssid,
1396 pAd->MlmeAux.SsidLen);
1397 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_START_REQ,
1399 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_START;
1403 struct rt_mac_table_entry *pEntry = &pAd->MacTab.Content[i];
1409 (pAd->Mlme.Now32,
1411 MacTableDeleteEntry(pAd, pEntry->Aid,
1417 if (pAd->StaCfg.bScanReqIsFromWebUI &&
1418 RTMP_TIME_BEFORE(pAd->Mlme.Now32,
1419 pAd->StaCfg.LastScanTime + (30 * OS_HZ)))
1422 pAd->StaCfg.bScanReqIsFromWebUI = FALSE;
1424 if ((pAd->StaCfg.bAutoReconnect == TRUE)
1425 && RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP)
1428 (pAd->MlmeAux.AutoReconnectSsid,
1429 pAd->MlmeAux.AutoReconnectSsidLen) == TRUE)) {
1430 if ((pAd->ScanTab.BssNr == 0)
1431 && (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE)) {
1435 (pAd->Mlme.Now32,
1436 pAd->StaCfg.LastScanTime + (10 * OS_HZ))) {
1439 pAd->MlmeAux.
1441 ScanParmFill(pAd, &ScanReq,
1442 (char *)pAd->MlmeAux.
1444 pAd->MlmeAux.
1447 MlmeEnqueue(pAd, SYNC_STATE_MACHINE,
1452 pAd->Mlme.CntlMachine.CurrState =
1455 pAd->StaCfg.LastScanTime =
1456 pAd->Mlme.Now32;
1457 } else if (pAd->StaCfg.BssType == BSS_ADHOC) /* Quit the forever scan when in a very clean room */
1458 MlmeAutoReconnectLastSSID(pAd);
1459 } else if (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) {
1460 if ((pAd->Mlme.OneSecPeriodicRound % 7) == 0) {
1461 MlmeAutoScan(pAd);
1462 pAd->StaCfg.LastScanTime =
1463 pAd->Mlme.Now32;
1465 MlmeAutoReconnectLastSSID(pAd);
1473 if ((pAd->MacTab.Content[BSSID_WCID].TXBAbitmap != 0)
1474 && (pAd->MacTab.fAnyBASession == FALSE)) {
1475 pAd->MacTab.fAnyBASession = TRUE;
1476 AsicUpdateProtect(pAd, HT_FORCERTSCTS, ALLN_SETPROTECT, FALSE,
1478 } else if ((pAd->MacTab.Content[BSSID_WCID].TXBAbitmap == 0)
1479 && (pAd->MacTab.fAnyBASession == TRUE)) {
1480 pAd->MacTab.fAnyBASession = FALSE;
1481 AsicUpdateProtect(pAd,
1482 pAd->MlmeAux.AddHtInfo.AddHtInfo2.
1494 struct rt_rtmp_adapter *pAd = (struct rt_rtmp_adapter *)FunctionContext;
1496 if (pAd != NULL) {
1499 if ((pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED) &&
1500 (INFRA_ON(pAd))) {
1503 DisassocParmFill(pAd, &DisassocReq,
1504 pAd->CommonCfg.Bssid,
1506 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE,
1510 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;
1512 pAd->IndicateMediaState = NdisMediaStateDisconnected;
1513 RTMP_IndicateMediaState(pAd);
1514 pAd->ExtraInfo = GENERAL_LINK_DOWN;
1520 void MlmeAutoScan(struct rt_rtmp_adapter *pAd)
1523 if (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) {
1525 MlmeEnqueue(pAd,
1528 pAd->MlmeAux.AutoReconnectSsidLen,
1529 pAd->MlmeAux.AutoReconnectSsid);
1530 RTMP_MLME_HANDLER(pAd);
1535 void MlmeAutoReconnectLastSSID(struct rt_rtmp_adapter *pAd)
1537 if (pAd->StaCfg.bAutoConnectByBssid) {
1540 pAd->MlmeAux.Bssid[0], pAd->MlmeAux.Bssid[1],
1541 pAd->MlmeAux.Bssid[2], pAd->MlmeAux.Bssid[3],
1542 pAd->MlmeAux.Bssid[4], pAd->MlmeAux.Bssid[5]));
1544 pAd->MlmeAux.Channel = pAd->CommonCfg.Channel;
1545 MlmeEnqueue(pAd,
1547 OID_802_11_BSSID, MAC_ADDR_LEN, pAd->MlmeAux.Bssid);
1549 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
1551 RTMP_MLME_HANDLER(pAd);
1554 else if ((pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) &&
1556 (pAd->MlmeAux.AutoReconnectSsid,
1557 pAd->MlmeAux.AutoReconnectSsidLen) == TRUE)) {
1559 OidSsid.SsidLength = pAd->MlmeAux.AutoReconnectSsidLen;
1560 NdisMoveMemory(OidSsid.Ssid, pAd->MlmeAux.AutoReconnectSsid,
1561 pAd->MlmeAux.AutoReconnectSsidLen);
1565 pAd->MlmeAux.AutoReconnectSsid,
1566 pAd->MlmeAux.AutoReconnectSsidLen));
1567 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, OID_802_11_SSID,
1569 RTMP_MLME_HANDLER(pAd);
1585 void MlmeCheckForRoaming(struct rt_rtmp_adapter *pAd, unsigned long Now32)
1588 struct rt_bss_table *pRoamTab = &pAd->MlmeAux.RoamTab;
1594 for (i = 0; i < pAd->ScanTab.BssNr; i++) {
1595 pBss = &pAd->ScanTab.BssEntry[i];
1597 if ((pBss->LastBeaconRxTime + pAd->StaCfg.BeaconLostTime) <
1602 if (MAC_ADDR_EQUAL(pBss->Bssid, pAd->CommonCfg.Bssid))
1605 (pAd->StaCfg.RssiSample.LastRssi0 + RSSI_DELTA))
1616 if (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) {
1617 pAd->RalinkCounters.PoorCQIRoamingCount++;
1620 pAd->RalinkCounters.PoorCQIRoamingCount));
1621 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE,
1623 RTMP_MLME_HANDLER(pAd);
1643 BOOLEAN MlmeCheckForFastRoaming(struct rt_rtmp_adapter *pAd)
1646 struct rt_bss_table *pRoamTab = &pAd->MlmeAux.RoamTab;
1652 for (i = 0; i < pAd->ScanTab.BssNr; i++) {
1653 pBss = &pAd->ScanTab.BssEntry[i];
1656 && (pBss->Channel == pAd->CommonCfg.Channel))
1658 if (MAC_ADDR_EQUAL(pBss->Bssid, pAd->CommonCfg.Bssid))
1661 (pBss->Ssid, pBss->SsidLen, pAd->CommonCfg.Ssid,
1662 pAd->CommonCfg.SsidLen))
1666 (pAd, pAd->StaCfg.RssiSample.LastRssi0,
1667 pAd->StaCfg.RssiSample.LastRssi1,
1668 pAd->StaCfg.RssiSample.LastRssi2) + RSSI_DELTA))
1673 RTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.LastRssi0,
1674 pAd->StaCfg.RssiSample.LastRssi1,
1675 pAd->StaCfg.RssiSample.LastRssi2),
1687 if (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) {
1688 pAd->RalinkCounters.PoorCQIRoamingCount++;
1691 pAd->RalinkCounters.PoorCQIRoamingCount));
1692 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE,
1694 RTMP_MLME_HANDLER(pAd);
1702 void MlmeSetTxRate(struct rt_rtmp_adapter *pAd,
1709 if (pTxRate->STBC && (pAd->StaCfg.MaxHTPhyMode.field.STBC)
1710 && (pAd->Antenna.field.TxPath == 2))
1711 pAd->StaCfg.HTPhyMode.field.STBC = STBC_USE;
1713 pAd->StaCfg.HTPhyMode.field.STBC = STBC_NONE;
1716 pAd->StaCfg.HTPhyMode.field.MCS = pTxRate->CurrMCS;
1718 if (pAd->StaCfg.HTPhyMode.field.MCS > 7)
1719 pAd->StaCfg.HTPhyMode.field.STBC = STBC_NONE;
1721 if (ADHOC_ON(pAd)) {
1723 pAd->StaCfg.HTPhyMode.field.ShortGI = GI_800;
1731 pAd->StaCfg.HTPhyMode.field.ShortGI;
1732 pEntry->HTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS;
1735 pAd->StaCfg.HTPhyMode.field.MODE = pEntry->HTPhyMode.field.MODE;
1738 pAd->StaCfg.HTPhyMode.field.MODE = pTxRate->Mode;
1741 && (pAd->StaCfg.MaxHTPhyMode.field.ShortGI))
1742 pAd->StaCfg.HTPhyMode.field.ShortGI = GI_400;
1744 pAd->StaCfg.HTPhyMode.field.ShortGI = GI_800;
1747 if (pAd->StaCfg.HTPhyMode.field.ShortGI == GI_400) {
1752 pAd->StaCfg.HTPhyMode.field.ShortGI = GI_800;
1757 pAd->StaCfg.HTPhyMode.field.ShortGI = GI_800;
1761 && (pAd->StaCfg.HTPhyMode.field.MCS != 0)) {
1763 pAd->StaCfg.HTPhyMode.field.MCS;
1764 if (pAd->MacTab.fAnyBASession) {
1765 AsicUpdateProtect(pAd, HT_FORCERTSCTS,
1767 (BOOLEAN) pAd->MlmeAux.
1771 AsicUpdateProtect(pAd,
1772 pAd->MlmeAux.AddHtInfo.
1775 (BOOLEAN) pAd->MlmeAux.
1780 && (pAd->StaCfg.HTPhyMode.field.MCS != 8)) {
1782 pAd->StaCfg.HTPhyMode.field.MCS;
1783 if (pAd->MacTab.fAnyBASession) {
1784 AsicUpdateProtect(pAd, HT_FORCERTSCTS,
1786 (BOOLEAN) pAd->MlmeAux.
1790 AsicUpdateProtect(pAd,
1791 pAd->MlmeAux.AddHtInfo.
1794 (BOOLEAN) pAd->MlmeAux.
1799 && (pAd->StaCfg.HTPhyMode.field.MCS == 0)) {
1800 AsicUpdateProtect(pAd, HT_RTSCTS_6M, ALLN_SETPROTECT,
1802 (BOOLEAN) pAd->MlmeAux.AddHtInfo.
1806 && (pAd->StaCfg.HTPhyMode.field.MCS == 8)) {
1807 AsicUpdateProtect(pAd, HT_RTSCTS_6M, ALLN_SETPROTECT,
1809 (BOOLEAN) pAd->MlmeAux.AddHtInfo.
1813 pEntry->HTPhyMode.field.STBC = pAd->StaCfg.HTPhyMode.field.STBC;
1815 pAd->StaCfg.HTPhyMode.field.ShortGI;
1816 pEntry->HTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS;
1817 pEntry->HTPhyMode.field.MODE = pAd->StaCfg.HTPhyMode.field.MODE;
1818 if ((pAd->StaCfg.MaxHTPhyMode.field.MODE == MODE_HTGREENFIELD)
1819 && pAd->WIFItestbed.bGreenField)
1823 pAd->LastTxRate = (u16)(pEntry->HTPhyMode.word);
1843 void MlmeDynamicTxRateSwitching(struct rt_rtmp_adapter *pAd)
1858 struct rt_rssi_sample *pRssi = &pAd->StaCfg.RssiSample;
1864 pEntry = &pAd->MacTab.Content[i];
1867 if (RTMPCheckEntryEnableAutoRateSwitch(pAd, pEntry) == FALSE)
1870 if ((pAd->MacTab.Size == 1) || (pEntry->ValidAsDls)) {
1871 Rssi = RTMPMaxRssi(pAd,
1876 RTMP_IO_READ32(pAd, TX_STA_CNT0, &TxStaCnt0.word);
1877 RTMP_IO_READ32(pAd, TX_STA_CNT1, &StaTx1.word);
1878 pAd->bUpdateBcnCntDone = TRUE;
1884 pAd->RalinkCounters.OneSecTxRetryOkCount +=
1886 pAd->RalinkCounters.OneSecTxNoRetryOkCount +=
1888 pAd->RalinkCounters.OneSecTxFailCount +=
1890 pAd->WlanCounters.TransmittedFragmentCount.u.LowPart +=
1892 pAd->WlanCounters.RetryCount.u.LowPart +=
1894 pAd->WlanCounters.FailedCount.u.LowPart +=
1901 pAd->RalinkCounters.OneSecTxNoRetryOkCount +
1902 pAd->RalinkCounters.OneSecTxRetryOkCount +
1903 pAd->RalinkCounters.OneSecTxFailCount;
1910 if (INFRA_ON(pAd) && (i == 1))
1911 Rssi = RTMPMaxRssi(pAd,
1916 Rssi = RTMPMaxRssi(pAd,
1942 RTMP_IO_READ32(pAd, TX_RTY_CFG, &TxRtyCfg.word);
1946 RTMP_IO_WRITE32(pAd, TX_RTY_CFG, TxRtyCfg.word);
1953 RTMP_IO_READ32(pAd, TXRXQ_PCNT,
1962 (pAd,
1965 RTMP_IO_READ32(pAd, TX_RTY_CFG, &TxRtyCfg.word);
1970 RTMP_IO_WRITE32(pAd, TX_RTY_CFG, TxRtyCfg.word);
1976 MlmeSelectTxRateTable(pAd, pEntry, &pTable, &TableSize,
1982 /* When switch from Fixed rate -> auto rate, the REAL TX rate might be different from pAd->CommonCfg.TxRateIndex. */
1987 /*&& (pAd->StaCfg.bAutoTxRateSwitch == TRUE) */
1996 MlmeSetTxRate(pAd, pEntry, pCurrTxRate);
2029 /*pAd->DrsCounters.LastTimeTxRateChangeAction = pAd->DrsCounters.LastSecTxRateChangeAction; */
2097 if (pAd->LatchRfRegs.Channel <= 14) {
2098 if (pAd->NicConfig2.field.ExternalLNAForG) {
2104 if (pAd->NicConfig2.field.ExternalLNAForA) {
2191 /* if (TxRateIdx != pAd->CommonCfg.TxRateIndex) */
2197 MlmeSetTxRate(pAd, pEntry, pNextTxRate);
2277 if (!pAd->StaCfg.StaQuickResponeForRateUpTimerRunning) {
2278 RTMPSetTimer(&pAd->StaCfg.
2282 pAd->StaCfg.
2298 if (!pAd->StaCfg.StaQuickResponeForRateUpTimerRunning) {
2299 RTMPSetTimer(&pAd->StaCfg.
2303 pAd->StaCfg.
2318 && (pAd->RalinkCounters.OneSecReceivedByteCount >
2319 (pAd->RalinkCounters.
2324 pAd->RalinkCounters.
2326 pAd->RalinkCounters.
2339 MlmeSetTxRate(pAd, pEntry, pNextTxRate);
2367 struct rt_rtmp_adapter *pAd = (struct rt_rtmp_adapter *)FunctionContext;
2383 pAd->StaCfg.StaQuickResponeForRateUpTimerRunning = FALSE;
2389 pEntry = &pAd->MacTab.Content[i];
2392 if (RTMPCheckEntryEnableAutoRateSwitch(pAd, pEntry) == FALSE)
2395 if (INFRA_ON(pAd) && (i == 1))
2396 Rssi = RTMPMaxRssi(pAd,
2397 pAd->StaCfg.RssiSample.AvgRssi0,
2398 pAd->StaCfg.RssiSample.AvgRssi1,
2399 pAd->StaCfg.RssiSample.AvgRssi2);
2401 Rssi = RTMPMaxRssi(pAd,
2406 CurrRateIdx = pAd->CommonCfg.TxRateIndex;
2408 MlmeSelectTxRateTable(pAd, pEntry, &pTable, &TableSize,
2438 if (pAd->MacTab.Size == 1) {
2440 RTMP_IO_READ32(pAd, TX_STA_CNT0, &TxStaCnt0.word);
2441 RTMP_IO_READ32(pAd, TX_STA_CNT1, &StaTx1.word);
2448 pAd->RalinkCounters.OneSecTxRetryOkCount +=
2450 pAd->RalinkCounters.OneSecTxNoRetryOkCount +=
2452 pAd->RalinkCounters.OneSecTxFailCount +=
2454 pAd->WlanCounters.TransmittedFragmentCount.u.LowPart +=
2456 pAd->WlanCounters.RetryCount.u.LowPart +=
2458 pAd->WlanCounters.FailedCount.u.LowPart +=
2482 NdisZeroMemory(pAd->DrsCounters.TxQuality,
2485 NdisZeroMemory(pAd->DrsCounters.PER,
2489 if ((pAd->DrsCounters.LastSecTxRateChangeAction == 1)
2491 pAd->CommonCfg.TxRateIndex = DownRateIdx;
2492 pAd->DrsCounters.TxQuality[CurrRateIdx] =
2495 if ((pAd->DrsCounters.LastSecTxRateChangeAction ==
2497 pAd->CommonCfg.TxRateIndex = UpRateIdx;
2508 if (pAd->DrsCounters.LastTimeTxRateChangeAction == 0)
2515 pAd->DrsCounters.TxQuality[CurrRateIdx] =
2519 pAd->DrsCounters.PER[CurrRateIdx] =
2525 if ((pAd->DrsCounters.LastSecTxRateChangeAction == 1)
2527 if ((pAd->DrsCounters.LastTxOkCount + 2) >=
2529 pAd->CommonCfg.TxRateIndex =
2531 pAd->DrsCounters.
2538 if ((pAd->DrsCounters.LastSecTxRateChangeAction ==
2543 } else if ((pAd->DrsCounters.LastTxOkCount + 2)
2545 pAd->CommonCfg.TxRateIndex = UpRateIdx;
2551 if (pAd->CommonCfg.TxRateIndex > CurrRateIdx) {
2552 pAd->DrsCounters.TxRateUpPenalty = 0;
2553 NdisZeroMemory(pAd->DrsCounters.TxQuality,
2556 NdisZeroMemory(pAd->DrsCounters.PER,
2562 else if (pAd->CommonCfg.TxRateIndex < CurrRateIdx) {
2565 CurrRateIdx, pAd->CommonCfg.TxRateIndex));
2567 pAd->DrsCounters.TxRateUpPenalty = 0; /* no penalty */
2568 pAd->DrsCounters.TxQuality[pAd->CommonCfg.TxRateIndex] =
2570 pAd->DrsCounters.PER[pAd->CommonCfg.TxRateIndex] = 0;
2578 pTable[(pAd->CommonCfg.TxRateIndex + 1) * 5];
2580 MlmeSetTxRate(pAd, pEntry, pNextTxRate);
2598 1. change pAd->StaCfg.Psm to PWR_SAVE or leave it untouched
2604 void MlmeCheckPsmChange(struct rt_rtmp_adapter *pAd, unsigned long Now32)
2614 PowerMode = pAd->StaCfg.WindowsPowerMode;
2616 if (INFRA_ON(pAd) &&
2618 (pAd->StaCfg.Psm == PWR_ACTIVE) &&
2619 /* (! RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) */
2620 (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) &&
2621 RTMP_TEST_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP)
2623 (pAd->RalinkCounters.OneSecTxNoRetryOkCount == 0) &&
2624 (pAd->RalinkCounters.OneSecTxRetryOkCount == 0) */
2626 NdisGetSystemUpTime(&pAd->Mlme.LastSendNULLpsmTime);
2627 pAd->RalinkCounters.RxCountSinceLastNULL = 0;
2628 RTMP_SET_PSM_BIT(pAd, PWR_SAVE);
2630 (pAd->CommonCfg.bAPSDCapable
2631 && pAd->CommonCfg.APEdcaParm.bAPSDCapable)) {
2632 RTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, FALSE);
2634 RTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE);
2641 void MlmeSetPsmBit(struct rt_rtmp_adapter *pAd, u16 psm)
2645 pAd->StaCfg.Psm = psm;
2646 RTMP_IO_READ32(pAd, AUTO_RSP_CFG, &csr4.word);
2648 RTMP_IO_WRITE32(pAd, AUTO_RSP_CFG, csr4.word);
2667 Caller should make sure a function call to NICUpdateRawCounters(pAd)
2672 void MlmeCalculateChannelQuality(struct rt_rtmp_adapter *pAd,
2686 unsigned long BeaconLostTime = pAd->StaCfg.BeaconLostTime;
2688 if (pAd->OpMode == OPMODE_STA) {
2689 pRssiSample = &pAd->StaCfg.RssiSample;
2691 pAd->RalinkCounters.OneSecTxNoRetryOkCount;
2692 OneSecTxRetryOkCount = pAd->RalinkCounters.OneSecTxRetryOkCount;
2693 OneSecTxFailCount = pAd->RalinkCounters.OneSecTxFailCount;
2694 OneSecRxOkCnt = pAd->RalinkCounters.OneSecRxOkCnt;
2695 OneSecRxFcsErrCnt = pAd->RalinkCounters.OneSecRxFcsErrCnt;
2698 MaxRssi = RTMPMaxRssi(pAd, pRssiSample->LastRssi0,
2726 if ((pAd->OpMode == OPMODE_STA) && INFRA_ON(pAd) && (OneSecTxNoRetryOkCount < 2) && /* no heavy traffic */
2727 ((pAd->StaCfg.LastBeaconRxTime + BeaconLostTime) < Now32)) {
2747 if (pAd->OpMode == OPMODE_STA)
2748 pAd->Mlme.ChannelQuality =
2754 void MlmeSetTxPreamble(struct rt_rtmp_adapter *pAd, u16 TxPreamble)
2764 RTMP_IO_READ32(pAd, AUTO_RSP_CFG, &csr4.word);
2768 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED);
2774 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED);
2778 RTMP_IO_WRITE32(pAd, AUTO_RSP_CFG, csr4.word);
2834 void MlmeUpdateTxRates(struct rt_rtmp_adapter *pAd, IN BOOLEAN bLinkUp, u8 apidx)
2849 UpdateBasicRateBitmap(pAd);
2854 switch (pAd->CommonCfg.DesireRate[i] & 0x7f) {
2912 pHtPhy = &pAd->StaCfg.HTPhyMode;
2913 pMaxHtPhy = &pAd->StaCfg.MaxHTPhyMode;
2914 pMinHtPhy = &pAd->StaCfg.MinHTPhyMode;
2916 auto_rate_cur_p = &pAd->StaCfg.bAutoTxRateSwitch;
2917 HtMcs = pAd->StaCfg.DesiredTransmitSetting.field.MCS;
2919 if ((pAd->StaCfg.BssType == BSS_ADHOC) &&
2920 (pAd->CommonCfg.PhyMode == PHY_11B) &&
2926 pAd->CommonCfg.MaxDesiredRate = MaxDesire;
2934 /*OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED); */
2935 /*pAd->CommonCfg.bAutoTxRateSwitch = FALSE; */
2938 /*OPSTATUS_SET_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED); */
2939 /*pAd->CommonCfg.bAutoTxRateSwitch = TRUE; */
2944 /*OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED); */
2945 /*pAd->CommonCfg.bAutoTxRateSwitch = FALSE; */
2948 /*OPSTATUS_SET_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED); */
2949 /*pAd->CommonCfg.bAutoTxRateSwitch = TRUE; */
2953 if ((ADHOC_ON(pAd) || INFRA_ON(pAd)) && (pAd->OpMode == OPMODE_STA)) {
2954 pSupRate = &pAd->StaActive.SupRate[0];
2955 pExtRate = &pAd->StaActive.ExtRate[0];
2956 SupRateLen = pAd->StaActive.SupRateLen;
2957 ExtRateLen = pAd->StaActive.ExtRateLen;
2959 pSupRate = &pAd->CommonCfg.SupRate[0];
2960 pExtRate = &pAd->CommonCfg.ExtRate[0];
2961 SupRateLen = pAd->CommonCfg.SupRateLen;
2962 ExtRateLen = pAd->CommonCfg.ExtRateLen;
3106 RTMP_IO_WRITE32(pAd, LEGACY_BASIC_RATE, BasicRateBitmap);
3109 /* pAd->CommonCfg.BasicRateBitmap = BasicRateBitmap; */
3116 pAd->CommonCfg.ExpectedACKRate[i] = CurrBasicRate;
3124 pAd->CommonCfg.MaxTxRate = MaxSupport;
3126 pAd->CommonCfg.MaxTxRate = MaxDesire;
3128 pAd->CommonCfg.MinTxRate = MinSupport;
3138 dbm = pAd->StaCfg.RssiSample.AvgRssi0 - pAd->BbpRssiToDbmDelta;
3141 pAd->CommonCfg.TxRate = RATE_24;
3143 pAd->CommonCfg.TxRate = pAd->CommonCfg.MaxTxRate;
3146 pAd->CommonCfg.TxRate = RATE_11;
3148 pAd->CommonCfg.TxRate = RATE_24;
3151 if (pAd->CommonCfg.TxRate > pAd->CommonCfg.MaxTxRate)
3152 pAd->CommonCfg.TxRate = pAd->CommonCfg.MaxTxRate;
3154 pAd->CommonCfg.TxRateIndex = 0;
3156 pAd->CommonCfg.TxRate = pAd->CommonCfg.MaxTxRate;
3158 (pAd->CommonCfg.MaxTxRate >
3159 3) ? (pAd->CommonCfg.MaxTxRate -
3160 4) : pAd->CommonCfg.MaxTxRate;
3162 (pAd->CommonCfg.MaxTxRate > 3) ? MODE_OFDM : MODE_CCK;
3164 pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.STBC =
3166 pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.ShortGI =
3168 pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MCS =
3170 pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE =
3174 if (pAd->CommonCfg.TxRate <= RATE_11) {
3176 pMaxHtPhy->field.MCS = pAd->CommonCfg.TxRate;
3177 pMinHtPhy->field.MCS = pAd->CommonCfg.MinTxRate;
3180 pMaxHtPhy->field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.TxRate];
3181 if (pAd->CommonCfg.MinTxRate >= RATE_6
3182 && (pAd->CommonCfg.MinTxRate <= RATE_54)) {
3184 OfdmRateToRxwiMCS[pAd->CommonCfg.MinTxRate];
3186 pMinHtPhy->field.MCS = pAd->CommonCfg.MinTxRate;
3191 if (bLinkUp && (pAd->OpMode == OPMODE_STA)) {
3192 pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word = pHtPhy->word;
3193 pAd->MacTab.Content[BSSID_WCID].MaxHTPhyMode.word =
3195 pAd->MacTab.Content[BSSID_WCID].MinHTPhyMode.word =
3198 switch (pAd->CommonCfg.PhyMode) {
3202 pAd->CommonCfg.MlmeRate = RATE_1;
3203 pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_CCK;
3204 pAd->CommonCfg.MlmeTransmit.field.MCS = RATE_1;
3207 pAd->CommonCfg.RtsRate = RATE_11;
3209 /* pAd->CommonCfg.RtsRate = RATE_1; */
3219 pAd->CommonCfg.MlmeRate = RATE_6;
3220 pAd->CommonCfg.RtsRate = RATE_6;
3221 pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;
3222 pAd->CommonCfg.MlmeTransmit.field.MCS =
3223 OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];
3227 if (pAd->CommonCfg.Channel <= 14) {
3228 pAd->CommonCfg.MlmeRate = RATE_1;
3229 pAd->CommonCfg.RtsRate = RATE_1;
3230 pAd->CommonCfg.MlmeTransmit.field.MODE =
3232 pAd->CommonCfg.MlmeTransmit.field.MCS = RATE_1;
3234 pAd->CommonCfg.MlmeRate = RATE_6;
3235 pAd->CommonCfg.RtsRate = RATE_6;
3236 pAd->CommonCfg.MlmeTransmit.field.MODE =
3238 pAd->CommonCfg.MlmeTransmit.field.MCS =
3239 OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];
3243 pAd->CommonCfg.MlmeRate = RATE_6;
3244 pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;
3245 pAd->CommonCfg.MlmeTransmit.field.MCS =
3246 OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];
3247 pAd->CommonCfg.RtsRate = RATE_1;
3253 pAd->MacTab.Content[MCAST_WCID].HTPhyMode.word =
3254 pAd->CommonCfg.MlmeTransmit.word;
3255 if (pAd->CommonCfg.MlmeTransmit.field.MODE == MODE_OFDM)
3256 pAd->MacTab.Content[MCAST_WCID].HTPhyMode.field.MCS =
3259 pAd->MacTab.Content[MCAST_WCID].HTPhyMode.field.MCS =
3261 pAd->CommonCfg.BasicMlmeRate = pAd->CommonCfg.MlmeRate;
3267 RateIdToMbps[pAd->CommonCfg.MaxTxRate],
3268 RateIdToMbps[pAd->CommonCfg.MinTxRate],
3269 /*OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED) */
3273 RateIdToMbps[pAd->CommonCfg.TxRate],
3274 RateIdToMbps[pAd->CommonCfg.RtsRate], BasicRateBitmap));
3277 pAd->CommonCfg.MlmeTransmit.word,
3278 pAd->MacTab.Content[BSSID_WCID].MinHTPhyMode.word,
3279 pAd->MacTab.Content[BSSID_WCID].MaxHTPhyMode.word,
3280 pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word));
3295 void MlmeUpdateHtTxRates(struct rt_rtmp_adapter *pAd, u8 apidx)
3314 pDesireHtPhy = &pAd->StaCfg.DesiredHtPhyInfo;
3315 pActiveHtPhy = &pAd->StaCfg.DesiredHtPhyInfo;
3316 pHtPhy = &pAd->StaCfg.HTPhyMode;
3317 pMaxHtPhy = &pAd->StaCfg.MaxHTPhyMode;
3318 pMinHtPhy = &pAd->StaCfg.MinHTPhyMode;
3320 auto_rate_cur_p = &pAd->StaCfg.bAutoTxRateSwitch;
3323 if ((ADHOC_ON(pAd) || INFRA_ON(pAd)) && (pAd->OpMode == OPMODE_STA)) {
3324 if (pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE)
3327 pRtHtCap = &pAd->StaActive.SupportedHtPhy;
3328 pActiveHtPhy = &pAd->StaActive.SupportedPhyInfo;
3329 StbcMcs = (u8)pAd->MlmeAux.AddHtInfo.AddHtInfo3.StbcMcs;
3331 pAd->MlmeAux.AddHtInfo.MCSSet[0] +
3332 (pAd->MlmeAux.AddHtInfo.MCSSet[1] << 8) + (StbcMcs << 16);
3333 if ((pAd->CommonCfg.DesiredHtPhy.TxSTBC) && (pRtHtCap->RxSTBC)
3334 && (pAd->Antenna.field.TxPath == 2))
3342 pRtHtCap = &pAd->CommonCfg.DesiredHtPhy;
3343 StbcMcs = (u8)pAd->CommonCfg.AddHTInfo.AddHtInfo3.StbcMcs;
3345 pAd->CommonCfg.AddHTInfo.MCSSet[0] +
3346 (pAd->CommonCfg.AddHTInfo.MCSSet[1] << 8) + (StbcMcs << 16);
3347 if ((pAd->CommonCfg.DesiredHtPhy.TxSTBC) && (pRtHtCap->RxSTBC)
3348 && (pAd->Antenna.field.TxPath == 2))
3355 if ((pRtHtCap->GF) && (pAd->CommonCfg.DesiredHtPhy.GF))
3360 if ((pAd->CommonCfg.DesiredHtPhy.ChannelWidth)
3368 (pAd->CommonCfg.DesiredHtPhy.ShortGIfor20 & pRtHtCap->
3372 (pAd->CommonCfg.DesiredHtPhy.ShortGIfor40 & pRtHtCap->
3400 if ((pAd->OpMode == OPMODE_STA) && (pDesireHtPhy->MCSSet[0] != 0xff)) {
3439 pAd->CommonCfg.DesiredHtPhy.AmsduSize));
3447 void BATableInit(struct rt_rtmp_adapter *pAd, struct rt_ba_table *Tab)
3454 NdisAllocateSpinLock(&pAd->BATabLock);
3465 void MlmeRadioOff(struct rt_rtmp_adapter *pAd)
3467 RTMP_MLME_RADIO_OFF(pAd);
3471 void MlmeRadioOn(struct rt_rtmp_adapter *pAd)
3473 RTMP_MLME_RADIO_ON(pAd);
3624 void BATableDeleteORIEntry(struct rt_rtmp_adapter *pAd,
3629 NdisAcquireSpinLock(&pAd->BATabLock);
3631 pAd->BATable.numAsOriginator -= 1;
3634 pAd->BATable.numAsRecipient));
3637 pAd->MacTab.Content[pBAORIEntry->Wcid].TXBAbitmap &= (~(1 << (pBAORIEntry->TID))); /* If STA mode, erase flag here */
3638 pAd->MacTab.Content[pBAORIEntry->Wcid].BAOriWcidArray[pBAORIEntry->TID] = 0; /* If STA mode, erase flag here */
3642 NdisReleaseSpinLock(&pAd->BATabLock);
3655 void BssEntrySet(struct rt_rtmp_adapter *pAd, struct rt_bss_entry *pBss, u8 *pBssid, char Ssid[], u8 SsidLen, u8 BssType, u16 BeaconPeriod, struct rt_cf_parm * pCfParm, u16 AtimWin, u16 CapabilityInfo, u8 SupRate[], u8 SupRateLen, u8 ExtRate[], u8 ExtRateLen, struct rt_ht_capability_ie * pHtCapability, struct rt_add_ht_info_ie * pAddHtInfo, /* AP might use this additional ht info IE */
3840 unsigned long BssTableSetEntry(struct rt_rtmp_adapter *pAd, struct rt_bss_table *Tab, u8 *pBssid, char Ssid[], u8 SsidLen, u8 BssType, u16 BeaconPeriod, struct rt_cf_parm * CfParm, u16 AtimWin, u16 CapabilityInfo, u8 SupRate[], u8 SupRateLen, u8 ExtRate[], u8 ExtRateLen, struct rt_ht_capability_ie * pHtCapability, struct rt_add_ht_info_ie * pAddHtInfo, /* AP might use this additional ht info IE */
3866 (pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) {
3867 if (MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, pBssid)
3868 || SSID_EQUAL(pAd->MlmeAux.Ssid,
3869 pAd->MlmeAux.SsidLen, Ssid,
3872 BssEntrySet(pAd, &Tab->BssEntry[Idx],
3895 BssEntrySet(pAd, &Tab->BssEntry[Idx], pBssid, Ssid, SsidLen,
3912 BssEntrySet(pAd, &Tab->BssEntry[Idx], pBssid, Ssid,
3927 void BssTableSsidSort(struct rt_rtmp_adapter *pAd,
3933 for (i = 0; i < pAd->ScanTab.BssNr; i++) {
3934 struct rt_bss_entry *pInBss = &pAd->ScanTab.BssEntry[i];
3937 if (((pAd->CommonCfg.bIEEE80211H == 1) &&
3938 (pAd->MlmeAux.Channel > 14) &&
3939 RadarChannelCheck(pAd, pInBss->Channel))
3945 if ((pInBss->BssType == pAd->StaCfg.BssType) &&
3952 ((pAd->CommonCfg.PhyMode == PHY_11N_2_4G)
3953 || (pAd->CommonCfg.PhyMode == PHY_11N_5G))) {
3960 if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) {
3962 if ((pAd->StaCfg.AuthMode != pInBss->AuthMode)
3963 && (pAd->StaCfg.AuthMode !=
3969 if ((pAd->StaCfg.AuthMode ==
3971 || (pAd->StaCfg.AuthMode ==
3975 if (pAd->StaCfg.WepStatus !=
3980 if ((pAd->StaCfg.WepStatus <
3991 if ((pAd->StaCfg.WepStatus ==
3993 && (pAd->StaCfg.WepStatus !=
3995 && (pAd->StaCfg.WepStatus !=
3999 if ((pAd->StaCfg.AuthMode ==
4001 || (pAd->StaCfg.AuthMode ==
4005 if (pAd->StaCfg.WepStatus !=
4010 if ((pAd->StaCfg.WepStatus <
4021 if ((pAd->StaCfg.WepStatus ==
4023 && (pAd->StaCfg.WepStatus !=
4025 && (pAd->StaCfg.WepStatus !=
4032 else if (pAd->StaCfg.WepStatus != pInBss->WepStatus) {
4035 pAd->StaCfg.WepStatus,
4052 (pAd->CommonCfg.RegTransmitSetting.field.BW ==
4055 (pAd, pInBss->CentralChannel,
4057 pAd->CommonCfg.RegTransmitSetting.field.
4059 SetCommonHT(pAd);
4060 pAd->CommonCfg.RegTransmitSetting.field.
4063 if (pAd->CommonCfg.DesiredHtPhy.
4065 SetCommonHT(pAd);
4073 } else if ((pInBss->BssType == pAd->StaCfg.BssType)
4079 ((pAd->CommonCfg.PhyMode == PHY_11N_2_4G)
4080 || (pAd->CommonCfg.PhyMode == PHY_11N_5G))) {
4087 if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) {
4089 if ((pAd->StaCfg.AuthMode != pInBss->AuthMode)
4090 && (pAd->StaCfg.AuthMode !=
4096 if ((pAd->StaCfg.AuthMode ==
4098 || (pAd->StaCfg.AuthMode ==
4102 if (pAd->StaCfg.WepStatus !=
4107 if (pAd->StaCfg.WepStatus <
4114 if ((pAd->StaCfg.WepStatus ==
4116 && (pAd->StaCfg.WepStatus !=
4118 && (pAd->StaCfg.WepStatus !=
4122 if ((pAd->StaCfg.AuthMode ==
4124 || (pAd->StaCfg.AuthMode ==
4128 if (pAd->StaCfg.WepStatus !=
4133 if (pAd->StaCfg.WepStatus <
4140 if ((pAd->StaCfg.WepStatus ==
4142 && (pAd->StaCfg.WepStatus !=
4144 && (pAd->StaCfg.WepStatus !=
4151 else if (pAd->StaCfg.WepStatus != pInBss->WepStatus)
4157 (pAd->CommonCfg.RegTransmitSetting.field.BW ==
4160 (pAd, pInBss->CentralChannel,
4162 pAd->CommonCfg.RegTransmitSetting.field.
4164 SetCommonHT(pAd);
4165 pAd->CommonCfg.RegTransmitSetting.field.
4549 void MacAddrRandomBssid(struct rt_rtmp_adapter *pAd, u8 *pAddr)
4554 pAddr[i] = RandomByte(pAd);
4565 * \pre the station has the following information in the pAd->StaCfg
4575 void MgtMacHeaderInit(struct rt_rtmp_adapter *pAd,
4588 COPY_MAC_ADDR(pHdr80211->Addr2, pAd->CurrentAddress);
4687 BOOLEAN MlmeEnqueue(struct rt_rtmp_adapter *pAd,
4692 struct rt_mlme_queue *Queue = (struct rt_mlme_queue *)& pAd->Mlme.Queue;
4697 (pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
4747 BOOLEAN MlmeEnqueueForRecv(struct rt_rtmp_adapter *pAd,
4759 struct rt_mlme_queue *Queue = (struct rt_mlme_queue *)& pAd->Mlme.Queue;
4764 (pAd,
4780 if (!MsgTypeSubst(pAd, pFrame, &Machine, &MsgType)) {
4806 Queue->Entry[Tail].Channel = pAd->LatchRfRegs.Channel;
4814 RTMP_MLME_HANDLER(pAd);
4843 void MlmeRestartStateMachine(struct rt_rtmp_adapter *pAd)
4853 NdisAcquireSpinLock(&pAd->Mlme.TaskLock);
4854 if (pAd->Mlme.bRunning) {
4855 NdisReleaseSpinLock(&pAd->Mlme.TaskLock);
4858 pAd->Mlme.bRunning = TRUE;
4860 NdisReleaseSpinLock(&pAd->Mlme.TaskLock);
4863 while (!MlmeQueueEmpty(&pAd->Mlme.Queue)) {
4865 if (MlmeDequeue(&pAd->Mlme.Queue, &Elem)) {
4879 RTMPCancelTimer(&pAd->MlmeAux.AssocTimer, &Cancelled);
4880 RTMPCancelTimer(&pAd->MlmeAux.ReassocTimer, &Cancelled);
4881 RTMPCancelTimer(&pAd->MlmeAux.DisassocTimer, &Cancelled);
4882 RTMPCancelTimer(&pAd->MlmeAux.AuthTimer, &Cancelled);
4883 RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &Cancelled);
4884 RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled);
4889 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
4890 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
4893 RTMPResumeMsduTransmission(pAd);
4897 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
4898 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
4899 pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
4900 pAd->Mlme.AuthRspMachine.CurrState = AUTH_RSP_IDLE;
4901 pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
4902 pAd->Mlme.ActMachine.CurrState = ACT_IDLE;
4907 NdisAcquireSpinLock(&pAd->Mlme.TaskLock);
4908 pAd->Mlme.bRunning = FALSE;
4909 NdisReleaseSpinLock(&pAd->Mlme.TaskLock);
4986 BOOLEAN MsgTypeSubst(struct rt_rtmp_adapter *pAd,
5161 void StateMachinePerformAction(struct rt_rtmp_adapter *pAd,
5165 (pAd, Elem);
5176 void Drop(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
5192 void LfsrInit(struct rt_rtmp_adapter *pAd, unsigned long Seed)
5195 pAd->Mlme.ShiftReg = 1;
5197 pAd->Mlme.ShiftReg = Seed;
5205 u8 RandomByte(struct rt_rtmp_adapter *pAd)
5212 if (pAd->Mlme.ShiftReg == 0)
5213 NdisGetSystemUpTime((unsigned long *) & pAd->Mlme.ShiftReg);
5216 if (pAd->Mlme.ShiftReg & 0x00000001) {
5217 pAd->Mlme.ShiftReg =
5218 ((pAd->Mlme.
5222 pAd->Mlme.ShiftReg = pAd->Mlme.ShiftReg >> 1;
5238 pAd Pointer to our adapter
5247 void RTMPCheckRates(struct rt_rtmp_adapter *pAd,
5255 if (pAd->CommonCfg.PhyMode == PHY_11B)
5270 BOOLEAN RTMPCheckChannel(struct rt_rtmp_adapter *pAd,
5289 for (k = 0; k < pAd->ChannelListNum; k++) {
5290 if (pAd->ChannelList[k].Channel == UpperChannel) {
5293 if (pAd->ChannelList[k].Channel == LowerChannel) {
5314 pAd Pointer to our adapter
5317 FALSE if pAd->CommonCfg.SupportedHtPhy doesn't accept the pHtCapability. (AP Mode)
5323 BOOLEAN RTMPCheckHt(struct rt_rtmp_adapter *pAd,
5332 if (pAd->CommonCfg.DesiredHtPhy.AmsduEnable)
5333 CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid],
5337 CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid],
5340 CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid],
5343 CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid],
5346 CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid],
5348 if (pAd->CommonCfg.bRdg && pHtCapability->ExtHtCapInfo.RDGSupport) {
5349 CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid],
5354 pAd->MacTab.Content[Wcid].MpduDensity =
5358 pAd->MlmeAux.HtCapability.MCSSet[4] = 0x1;
5359 switch (pAd->CommonCfg.RxStream) {
5361 pAd->MlmeAux.HtCapability.MCSSet[0] = 0xff;
5362 pAd->MlmeAux.HtCapability.MCSSet[1] = 0x00;
5363 pAd->MlmeAux.HtCapability.MCSSet[2] = 0x00;
5364 pAd->MlmeAux.HtCapability.MCSSet[3] = 0x00;
5367 pAd->MlmeAux.HtCapability.MCSSet[0] = 0xff;
5368 pAd->MlmeAux.HtCapability.MCSSet[1] = 0xff;
5369 pAd->MlmeAux.HtCapability.MCSSet[2] = 0x00;
5370 pAd->MlmeAux.HtCapability.MCSSet[3] = 0x00;
5373 pAd->MlmeAux.HtCapability.MCSSet[0] = 0xff;
5374 pAd->MlmeAux.HtCapability.MCSSet[1] = 0xff;
5375 pAd->MlmeAux.HtCapability.MCSSet[2] = 0xff;
5376 pAd->MlmeAux.HtCapability.MCSSet[3] = 0x00;
5380 pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth =
5381 pAddHtInfo->AddHtInfo.RecomWidth & pAd->CommonCfg.DesiredHtPhy.
5386 pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth,
5388 pAd->CommonCfg.DesiredHtPhy.ChannelWidth,
5389 pAd->NicConfig2.field.BW40MAvailForA,
5390 pAd->NicConfig2.field.BW40MAvailForG,
5391 pAd->CommonCfg.PhyMode));
5393 pAd->MlmeAux.HtCapability.HtCapInfo.GF =
5394 pHtCapability->HtCapInfo.GF & pAd->CommonCfg.DesiredHtPhy.GF;
5397 pAd->MlmeAux.HtCapability.HtCapInfo.AMsduSize =
5398 pAd->CommonCfg.DesiredHtPhy.AmsduSize;
5399 pAd->MlmeAux.HtCapability.HtCapInfo.MimoPs =
5400 pAd->CommonCfg.DesiredHtPhy.MimoPs;
5401 pAd->MlmeAux.HtCapability.HtCapInfo.ShortGIfor20 =
5402 (pAd->CommonCfg.DesiredHtPhy.ShortGIfor20) & (pHtCapability->
5405 pAd->MlmeAux.HtCapability.HtCapInfo.ShortGIfor40 =
5406 (pAd->CommonCfg.DesiredHtPhy.ShortGIfor40) & (pHtCapability->
5409 pAd->MlmeAux.HtCapability.HtCapInfo.TxSTBC =
5410 (pAd->CommonCfg.DesiredHtPhy.TxSTBC) & (pHtCapability->HtCapInfo.
5412 pAd->MlmeAux.HtCapability.HtCapInfo.RxSTBC =
5413 (pAd->CommonCfg.DesiredHtPhy.RxSTBC) & (pHtCapability->HtCapInfo.
5415 pAd->MlmeAux.HtCapability.HtCapParm.MaxRAmpduFactor =
5416 pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor;
5417 pAd->MlmeAux.HtCapability.HtCapParm.MpduDensity =
5418 pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity;
5419 pAd->MlmeAux.HtCapability.ExtHtCapInfo.PlusHTC =
5421 pAd->MacTab.Content[Wcid].HTCapability.ExtHtCapInfo.PlusHTC =
5423 if (pAd->CommonCfg.bRdg) {
5424 pAd->MlmeAux.HtCapability.ExtHtCapInfo.RDGSupport =
5426 pAd->MlmeAux.HtCapability.ExtHtCapInfo.PlusHTC = 1;
5429 if (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_20)
5430 pAd->MlmeAux.HtCapability.MCSSet[4] = 0x0; /* BW20 can't transmit MCS32 */
5432 COPY_AP_HTSETTINGS_FROM_BEACON(pAd, pHtCapability);
5443 pAd Pointer to our adapter
5452 void RTMPUpdateMlmeRate(struct rt_rtmp_adapter *pAd)
5459 switch (pAd->CommonCfg.PhyMode) {
5467 if ((pAd->MlmeAux.SupRateLen == 4) &&
5468 (pAd->MlmeAux.ExtRateLen == 0))
5474 if (pAd->MlmeAux.Channel <= 14)
5490 if (pAd->MlmeAux.Channel <= 14)
5501 for (i = 0; i < pAd->MlmeAux.SupRateLen; i++) {
5503 if ((pAd->MlmeAux.SupRate[i] & 0x7f) ==
5517 for (i = 0; i < pAd->MlmeAux.ExtRateLen; i++) {
5519 if ((pAd->MlmeAux.ExtRate[i] & 0x7f) ==
5537 pAd->CommonCfg.MlmeRate = MinimumRate;
5538 pAd->CommonCfg.RtsRate = ProperMlmeRate;
5539 if (pAd->CommonCfg.MlmeRate >= RATE_6) {
5540 pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;
5541 pAd->CommonCfg.MlmeTransmit.field.MCS =
5542 OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];
5543 pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MODE =
5545 pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MCS =
5546 OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];
5548 pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_CCK;
5549 pAd->CommonCfg.MlmeTransmit.field.MCS = pAd->CommonCfg.MlmeRate;
5550 pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MODE =
5552 pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MCS =
5553 pAd->CommonCfg.MlmeRate;
5558 pAd->CommonCfg.MlmeTransmit.word));
5561 char RTMPMaxRssi(struct rt_rtmp_adapter *pAd,
5566 if ((pAd->Antenna.field.RxPath == 1) && (Rssi0 != 0)) {
5570 if ((pAd->Antenna.field.RxPath >= 2) && (Rssi1 != 0)) {
5574 if ((pAd->Antenna.field.RxPath == 3) && (Rssi2 != 0)) {
5590 pAd - Adapter pointer
5597 void AsicEvaluateRxAnt(struct rt_rtmp_adapter *pAd)
5601 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS |
5606 OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)
5608 || (pAd->EepromAccess)
5611 || (pAd->bPCIclkOff == TRUE)
5617 /*if (pAd->StaCfg.Psm == PWR_SAVE) */
5622 if (pAd->StaCfg.Psm == PWR_SAVE)
5625 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3);
5627 if (pAd->Antenna.field.RxPath == 3) {
5629 } else if (pAd->Antenna.field.RxPath == 2) {
5631 } else if (pAd->Antenna.field.RxPath == 1) {
5634 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3);
5636 pAd->StaCfg.BBPR3 = BBPR3;
5639 (pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)
5642 pAd->RalinkCounters.OneSecTxNoRetryOkCount +
5643 pAd->RalinkCounters.OneSecTxRetryOkCount +
5644 pAd->RalinkCounters.OneSecTxFailCount;
5648 RTMPSetTimer(&pAd->Mlme.RxAntEvalTimer,
5650 pAd->Mlme.bLowThroughput = FALSE;
5652 RTMPSetTimer(&pAd->Mlme.RxAntEvalTimer,
5654 pAd->Mlme.bLowThroughput = TRUE;
5669 pAd - Adapter pointer
5680 struct rt_rtmp_adapter *pAd = (struct rt_rtmp_adapter *)FunctionContext;
5684 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS |
5688 OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)
5690 || (pAd->EepromAccess)
5693 || (pAd->bPCIclkOff == TRUE)
5699 /*if (pAd->StaCfg.Psm == PWR_SAVE) */
5702 if (pAd->StaCfg.Psm == PWR_SAVE)
5706 if (pAd->Mlme.bLowThroughput == TRUE) {
5707 rssi0 = pAd->StaCfg.RssiSample.LastRssi0;
5708 rssi1 = pAd->StaCfg.RssiSample.LastRssi1;
5709 rssi2 = pAd->StaCfg.RssiSample.LastRssi2;
5711 rssi0 = pAd->StaCfg.RssiSample.AvgRssi0;
5712 rssi1 = pAd->StaCfg.RssiSample.AvgRssi1;
5713 rssi2 = pAd->StaCfg.RssiSample.AvgRssi2;
5716 if (pAd->Antenna.field.RxPath == 3) {
5720 pAd->Mlme.RealRxPath = 2;
5722 pAd->Mlme.RealRxPath = 3;
5723 } else if (pAd->Antenna.field.RxPath == 2) {
5725 pAd->Mlme.RealRxPath = 1;
5727 pAd->Mlme.RealRxPath = 2;
5730 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3);
5732 if (pAd->Mlme.RealRxPath == 3) {
5734 } else if (pAd->Mlme.RealRxPath == 2) {
5736 } else if (pAd->Mlme.RealRxPath == 1) {
5739 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3);
5741 pAd->StaCfg.BBPR3 = BBPR3;
5752 struct rt_rtmp_adapter *pAd = (struct rt_rtmp_adapter *)FunctionContext;
5754 if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))
5757 pAd->CommonCfg.TriggerTimerCount++;
5761 if (pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable
5762 && (pAd->CommonCfg.bNeedSendTriggerFrame ||
5763 (((pAd->CommonCfg.TriggerTimerCount%20) == 19) && (!pAd->CommonCfg.bAPSDAC_BE || !pAd->CommonCfg.bAPSDAC_BK || !pAd->CommonCfg.bAPSDAC_VI || !pAd->CommonCfg.bAPSDAC_VO))))
5766 RTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE);
5767 pAd->CommonCfg.bNeedSendTriggerFrame = FALSE;
5768 pAd->CommonCfg.TriggerTimerCount = 0;
5769 pAd->CommonCfg.bInServicePeriod = TRUE;
5779 pAd - Adapter pointer
5787 void RTMPSetPiggyBack(struct rt_rtmp_adapter *pAd, IN BOOLEAN bPiggyBack)
5791 RTMP_IO_READ32(pAd, TX_LINK_CFG, &TxLinkCfg.word);
5794 RTMP_IO_WRITE32(pAd, TX_LINK_CFG, TxLinkCfg.word);
5803 pAd
5812 BOOLEAN RTMPCheckEntryEnableAutoRateSwitch(struct rt_rtmp_adapter *pAd,
5821 result = pAd->StaCfg.bAutoTxRateSwitch;
5829 BOOLEAN RTMPAutoRateSwitchCheck(struct rt_rtmp_adapter *pAd)
5832 if (pAd->StaCfg.bAutoTxRateSwitch)
5844 pAd
5853 u8 RTMPStaFixedTxMode(struct rt_rtmp_adapter *pAd, struct rt_mac_table_entry *pEntry)
5859 (u8)pAd->StaCfg.DesiredTransmitSetting.field.
5872 pAd
5924 void AsicStaBbpTuning(struct rt_rtmp_adapter *pAd)
5930 if (pAd->MACVersion == 0x28600100)
5936 if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE) /* no R66 tuning when SCANNING */
5939 if ((pAd->OpMode == OPMODE_STA)
5940 && (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)
5942 && !(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
5944 && (pAd->bPCIclkOff == FALSE)
5947 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R66, &OrigR66Value);
5950 if (pAd->Antenna.field.RxPath > 1)
5952 (pAd->StaCfg.RssiSample.AvgRssi0 +
5953 pAd->StaCfg.RssiSample.AvgRssi1) >> 1;
5955 Rssi = pAd->StaCfg.RssiSample.AvgRssi0;
5957 if (pAd->LatchRfRegs.Channel <= 14) { /*BG band */
5962 if (IS_RT3070(pAd) || IS_RT3090(pAd) || IS_RT3572(pAd)
5963 || IS_RT3390(pAd)) {
5966 0x1C + 2 * GET_LNA_GAIN(pAd) + 0x20;
5969 (pAd, BBP_R66, R66);
5972 R66 = 0x1C + 2 * GET_LNA_GAIN(pAd);
5975 (pAd, BBP_R66, R66);
5982 R66 = (0x2E + GET_LNA_GAIN(pAd)) + 0x10;
5985 (pAd, BBP_R66, R66);
5988 R66 = 0x2E + GET_LNA_GAIN(pAd);
5991 (pAd, BBP_R66, R66);
5996 if (pAd->CommonCfg.BBPCurrentBW == BW_20) {
5999 0x32 + (GET_LNA_GAIN(pAd) * 5) / 3 +
6003 (pAd, BBP_R66, R66);
6007 0x32 + (GET_LNA_GAIN(pAd) * 5) / 3;
6010 (pAd, BBP_R66, R66);
6016 0x3A + (GET_LNA_GAIN(pAd) * 5) / 3 +
6020 (pAd, BBP_R66, R66);
6024 0x3A + (GET_LNA_GAIN(pAd) * 5) / 3;
6027 (pAd, BBP_R66, R66);
6036 void RTMPSetAGCInitValue(struct rt_rtmp_adapter *pAd, u8 BandWidth)
6040 if (pAd->LatchRfRegs.Channel <= 14) { /* BG band */
6044 if (IS_RT3070(pAd) || IS_RT3090(pAd) || IS_RT3572(pAd)
6045 || IS_RT3390(pAd)) {
6046 R66 = 0x1C + 2 * GET_LNA_GAIN(pAd);
6047 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);
6051 R66 = 0x2E + GET_LNA_GAIN(pAd);
6052 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);
6059 (GET_LNA_GAIN(pAd) * 5) / 3);
6060 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);
6064 (GET_LNA_GAIN(pAd) * 5) / 3);
6065 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);