static INT rtmp_bbp_set_filter_coefficient_ctrl(RTMP_ADAPTER *pAd, UCHAR Channel) { UCHAR bbp_val = 0, org_val = 0; if (Channel == 14) { /* when Channel==14 && Mode==CCK && BandWidth==20M, BBP R4 bit5=1 */ RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &org_val); bbp_val = org_val; if (WMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_B)) bbp_val |= 0x20; else bbp_val &= (~0x20); if (bbp_val != org_val) RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, bbp_val); } return TRUE; }
VOID AsicUpdateWdsRxWCIDTable(RTMP_ADAPTER *pAd) { UINT index; MAC_TABLE_ENTRY *pEntry = NULL; RT_802_11_WDS_ENTRY *wds_entry; for(index = 0; index < MAX_WDS_ENTRY; index++) { wds_entry = &pAd->WdsTab.WdsEntry[index]; if (pAd->WdsTab.Mode >= WDS_LAZY_MODE) { wds_entry->wdev.PhyMode = 0xff; if (WMODE_CAP_N(pAd->CommonCfg.PhyMode)) wds_entry->wdev.PhyMode = MODE_HTMIX; else { if (WMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_B)) wds_entry->wdev.PhyMode = MODE_CCK; else wds_entry->wdev.PhyMode = MODE_OFDM; } } if (wds_entry->Valid != TRUE) continue; pEntry = MacTableInsertWDSEntry(pAd, wds_entry->PeerWdsAddr, index); RTMPSetSupportMCS(pAd, OPMODE_AP, pEntry, pAd->CommonCfg.SupRate, pAd->CommonCfg.SupRateLen, pAd->CommonCfg.ExtRate, pAd->CommonCfg.ExtRateLen, #ifdef DOT11_VHT_AC 0, NULL, #endif /* DOT11_VHT_AC */ &pAd->CommonCfg.HtCapability, sizeof(pAd->CommonCfg.HtCapability)); switch (wds_entry->wdev.PhyMode) { case 0xff: /* user doesn't specific a Mode for WDS link. */ case MODE_OFDM: /* specific OFDM mode. */ pEntry->SupportRateMode = SUPPORT_OFDM_MODE; if (WMODE_CAP_2G(pAd->CommonCfg.PhyMode)) pEntry->SupportRateMode |= SUPPORT_CCK_MODE; break; case MODE_CCK: pEntry->SupportRateMode = SUPPORT_CCK_MODE; break; #ifdef DOT11_N_SUPPORT case MODE_HTMIX: case MODE_HTGREENFIELD: pEntry->SupportRateMode = (SUPPORT_HT_MODE | SUPPORT_OFDM_MODE); if (WMODE_CAP_2G(pAd->CommonCfg.PhyMode)) pEntry->SupportRateMode |= SUPPORT_CCK_MODE; break; #endif /* DOT11_N_SUPPORT */ default: break; } } return; }
/* ========================================================================== Description: assign a new AID to the newly associated/re-associated STA and decide its MaxSupportedRate and CurrTxRate. Both rates should not exceed AP's capapbility Return: MLME_SUCCESS - association successfully built others - association failed due to resource issue ========================================================================== */ static USHORT APBuildAssociation( IN RTMP_ADAPTER *pAd, IN MAC_TABLE_ENTRY *pEntry, IN IE_LISTS *ie_list, IN UCHAR MaxSupportedRateIn500Kbps, OUT USHORT *pAid) { USHORT StatusCode = MLME_SUCCESS; UCHAR MaxSupportedRate = RATE_11; MULTISSID_STRUCT *wdev; MaxSupportedRate = dot11_2_ra_rate(MaxSupportedRateIn500Kbps); if ((WMODE_EQUAL(pAd->CommonCfg.PhyMode, WMODE_G) #ifdef DOT11_N_SUPPORT || WMODE_EQUAL(pAd->CommonCfg.PhyMode, (WMODE_G | WMODE_GN)) #endif /* DOT11_N_SUPPORT */ ) && (MaxSupportedRate < RATE_FIRST_OFDM_RATE) ) return MLME_ASSOC_REJ_DATA_RATE; #ifdef DOT11_N_SUPPORT /* 11n only */ if (WMODE_HT_ONLY(pAd->CommonCfg.PhyMode)&& (ie_list->ht_cap_len == 0)) return MLME_ASSOC_REJ_DATA_RATE; #endif /* DOT11_N_SUPPORT */ if (!pEntry) return MLME_UNSPECIFY_FAIL; if (pEntry && ((pEntry->Sst == SST_AUTH) || (pEntry->Sst == SST_ASSOC))) { /* TODO: */ /* should qualify other parameters, for example - capablity, supported rates, listen interval, ... etc */ /* to decide the Status Code */ /**pAid = APAssignAid(pAd, pEntry); */ /*pEntry->Aid = *pAid; */ *pAid = pEntry->Aid; pEntry->NoDataIdleCount = 0; pEntry->StaConnectTime = 0; { /* check the validity of the received RSNIE */ if ((StatusCode = APValidateRSNIE(pAd, pEntry, &ie_list->RSN_IE[0], ie_list->RSNIE_Len)) != MLME_SUCCESS) return StatusCode; } NdisMoveMemory(pEntry->RSN_IE, &ie_list->RSN_IE[0], ie_list->RSNIE_Len); pEntry->RSNIE_Len = ie_list->RSNIE_Len; wdev = &pAd->ApCfg.MBSSID[pEntry->apidx]; if (*pAid == 0) StatusCode = MLME_ASSOC_REJ_UNABLE_HANDLE_STA; else if ((pEntry->RSNIE_Len == 0) && (wdev->AuthMode >= Ndis802_11AuthModeWPA) #ifdef HOSTAPD_SUPPORT && (wdev->Hostapd == TRUE) #endif ) { StatusCode = MLME_ASSOC_DENY_OUT_SCOPE; #ifdef HOSTAPD_SUPPORT if(wdev->Hostapd == TRUE && (wdev->AuthMode >= Ndis802_11AuthModeWPA || wdev->IEEE8021X)) { RtmpOSWrielessEventSendExt(pAd->net_dev, RT_WLAN_EVENT_EXPIRED, -1, pEntry->Addr, NULL, 0, ((pEntry->CapabilityInfo & 0x0010) == 0 ? 0xFFFD : 0xFFFC)); } #endif /*HOSTAPD_SUPPORT*/ } else { StatusCode = update_associated_mac_entry(pAd, pEntry, ie_list, MaxSupportedRate); } } else /* CLASS 3 error should have been handled beforehand; here should be MAC table full */ StatusCode = MLME_ASSOC_REJ_UNABLE_HANDLE_STA; if (StatusCode == MLME_SUCCESS) { if (ie_list->bWmmCapable) { CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE); } else { CLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE); } } return StatusCode; }