summaryrefslogtreecommitdiff
path: root/drivers/staging/rt2860/common
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/rt2860/common')
-rw-r--r--drivers/staging/rt2860/common/action.c606
-rw-r--r--drivers/staging/rt2860/common/action.h56
-rw-r--r--drivers/staging/rt2860/common/ba_action.c1650
-rw-r--r--drivers/staging/rt2860/common/cmm_aes.c1311
-rw-r--r--drivers/staging/rt2860/common/cmm_asic.c2565
-rw-r--r--drivers/staging/rt2860/common/cmm_cfg.c258
-rw-r--r--drivers/staging/rt2860/common/cmm_data.c2361
-rw-r--r--drivers/staging/rt2860/common/cmm_data_pci.c1096
-rw-r--r--drivers/staging/rt2860/common/cmm_data_usb.c951
-rw-r--r--drivers/staging/rt2860/common/cmm_info.c955
-rw-r--r--drivers/staging/rt2860/common/cmm_mac_pci.c1661
-rw-r--r--drivers/staging/rt2860/common/cmm_mac_usb.c1162
-rw-r--r--drivers/staging/rt2860/common/cmm_sanity.c1205
-rw-r--r--drivers/staging/rt2860/common/cmm_sync.c718
-rw-r--r--drivers/staging/rt2860/common/cmm_tkip.c833
-rw-r--r--drivers/staging/rt2860/common/cmm_wep.c473
-rw-r--r--drivers/staging/rt2860/common/cmm_wpa.c3010
-rw-r--r--drivers/staging/rt2860/common/crypt_hmac.c187
-rw-r--r--drivers/staging/rt2860/common/crypt_md5.c339
-rw-r--r--drivers/staging/rt2860/common/crypt_sha2.c269
-rw-r--r--drivers/staging/rt2860/common/dfs.c68
-rw-r--r--drivers/staging/rt2860/common/ee_efuse.c351
-rw-r--r--drivers/staging/rt2860/common/ee_prom.c197
-rw-r--r--drivers/staging/rt2860/common/eeprom.c91
-rw-r--r--drivers/staging/rt2860/common/mlme.c6068
-rw-r--r--drivers/staging/rt2860/common/rt_channel.c1705
-rw-r--r--drivers/staging/rt2860/common/rt_rf.c187
-rw-r--r--drivers/staging/rt2860/common/rtmp_init.c3536
-rw-r--r--drivers/staging/rt2860/common/rtmp_mcu.c336
-rw-r--r--drivers/staging/rt2860/common/rtmp_timer.c302
-rw-r--r--drivers/staging/rt2860/common/spectrum.c2205
31 files changed, 0 insertions, 36712 deletions
diff --git a/drivers/staging/rt2860/common/action.c b/drivers/staging/rt2860/common/action.c
deleted file mode 100644
index 56ad236e1144..000000000000
--- a/drivers/staging/rt2860/common/action.c
+++ /dev/null
@@ -1,606 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-
- Module Name:
- action.c
-
- Abstract:
- Handle association related requests either from WSTA or from local MLME
-
- Revision History:
- Who When What
- -------- ---------- ----------------------------------------------
- Jan Lee 2006 created for rt2860
- */
-
-#include "../rt_config.h"
-#include "action.h"
-
-static void ReservedAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
-
-/*
- ==========================================================================
- Description:
- association state machine init, including state transition and timer init
- Parameters:
- S - pointer to the association state machine
- Note:
- The state machine looks like the following
-
- ASSOC_IDLE
- MT2_MLME_DISASSOC_REQ mlme_disassoc_req_action
- MT2_PEER_DISASSOC_REQ peer_disassoc_action
- MT2_PEER_ASSOC_REQ drop
- MT2_PEER_REASSOC_REQ drop
- MT2_CLS3ERR cls3err_action
- ==========================================================================
- */
-void ActionStateMachineInit(struct rt_rtmp_adapter *pAd,
- struct rt_state_machine *S,
- OUT STATE_MACHINE_FUNC Trans[])
-{
- StateMachineInit(S, (STATE_MACHINE_FUNC *) Trans, MAX_ACT_STATE,
- MAX_ACT_MSG, (STATE_MACHINE_FUNC) Drop, ACT_IDLE,
- ACT_MACHINE_BASE);
-
- StateMachineSetAction(S, ACT_IDLE, MT2_PEER_SPECTRUM_CATE,
- (STATE_MACHINE_FUNC) PeerSpectrumAction);
- StateMachineSetAction(S, ACT_IDLE, MT2_PEER_QOS_CATE,
- (STATE_MACHINE_FUNC) PeerQOSAction);
-
- StateMachineSetAction(S, ACT_IDLE, MT2_PEER_DLS_CATE,
- (STATE_MACHINE_FUNC) ReservedAction);
-
- StateMachineSetAction(S, ACT_IDLE, MT2_PEER_BA_CATE,
- (STATE_MACHINE_FUNC) PeerBAAction);
- StateMachineSetAction(S, ACT_IDLE, MT2_PEER_HT_CATE,
- (STATE_MACHINE_FUNC) PeerHTAction);
- StateMachineSetAction(S, ACT_IDLE, MT2_MLME_ADD_BA_CATE,
- (STATE_MACHINE_FUNC) MlmeADDBAAction);
- StateMachineSetAction(S, ACT_IDLE, MT2_MLME_ORI_DELBA_CATE,
- (STATE_MACHINE_FUNC) MlmeDELBAAction);
- StateMachineSetAction(S, ACT_IDLE, MT2_MLME_REC_DELBA_CATE,
- (STATE_MACHINE_FUNC) MlmeDELBAAction);
-
- StateMachineSetAction(S, ACT_IDLE, MT2_PEER_PUBLIC_CATE,
- (STATE_MACHINE_FUNC) PeerPublicAction);
- StateMachineSetAction(S, ACT_IDLE, MT2_PEER_RM_CATE,
- (STATE_MACHINE_FUNC) PeerRMAction);
-
- StateMachineSetAction(S, ACT_IDLE, MT2_MLME_QOS_CATE,
- (STATE_MACHINE_FUNC) MlmeQOSAction);
- StateMachineSetAction(S, ACT_IDLE, MT2_MLME_DLS_CATE,
- (STATE_MACHINE_FUNC) MlmeDLSAction);
- StateMachineSetAction(S, ACT_IDLE, MT2_ACT_INVALID,
- (STATE_MACHINE_FUNC) MlmeInvalidAction);
-}
-
-void MlmeADDBAAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
- struct rt_mlme_addba_req *pInfo;
- u8 Addr[6];
- u8 *pOutBuffer = NULL;
- int NStatus;
- unsigned long Idx;
- struct rt_frame_addba_req Frame;
- unsigned long FrameLen;
- struct rt_ba_ori_entry *pBAEntry = NULL;
-
- pInfo = (struct rt_mlme_addba_req *)Elem->Msg;
- NdisZeroMemory(&Frame, sizeof(struct rt_frame_addba_req));
-
- if (MlmeAddBAReqSanity(pAd, Elem->Msg, Elem->MsgLen, Addr)) {
- NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); /*Get an unused nonpaged memory */
- if (NStatus != NDIS_STATUS_SUCCESS) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("BA - MlmeADDBAAction() allocate memory failed \n"));
- return;
- }
- /* 1. find entry */
- Idx =
- pAd->MacTab.Content[pInfo->Wcid].BAOriWcidArray[pInfo->TID];
- if (Idx == 0) {
- MlmeFreeMemory(pAd, pOutBuffer);
- DBGPRINT(RT_DEBUG_ERROR,
- ("BA - MlmeADDBAAction() can't find BAOriEntry \n"));
- return;
- } else {
- pBAEntry = &pAd->BATable.BAOriEntry[Idx];
- }
-
- {
- if (ADHOC_ON(pAd))
- ActHeaderInit(pAd, &Frame.Hdr, pInfo->pAddr,
- pAd->CurrentAddress,
- pAd->CommonCfg.Bssid);
- else
- ActHeaderInit(pAd, &Frame.Hdr,
- pAd->CommonCfg.Bssid,
- pAd->CurrentAddress,
- pInfo->pAddr);
- }
-
- Frame.Category = CATEGORY_BA;
- Frame.Action = ADDBA_REQ;
- Frame.BaParm.AMSDUSupported = 0;
- Frame.BaParm.BAPolicy = IMMED_BA;
- Frame.BaParm.TID = pInfo->TID;
- Frame.BaParm.BufSize = pInfo->BaBufSize;
- Frame.Token = pInfo->Token;
- Frame.TimeOutValue = pInfo->TimeOutValue;
- Frame.BaStartSeq.field.FragNum = 0;
- Frame.BaStartSeq.field.StartSeq =
- pAd->MacTab.Content[pInfo->Wcid].TxSeq[pInfo->TID];
-
- *(u16 *) (&Frame.BaParm) =
- cpu2le16(*(u16 *) (&Frame.BaParm));
- Frame.TimeOutValue = cpu2le16(Frame.TimeOutValue);
- Frame.BaStartSeq.word = cpu2le16(Frame.BaStartSeq.word);
-
- MakeOutgoingFrame(pOutBuffer, &FrameLen,
- sizeof(struct rt_frame_addba_req), &Frame, END_OF_ARGS);
-
- MiniportMMRequest(pAd,
- (MGMT_USE_QUEUE_FLAG |
- MapUserPriorityToAccessCategory[pInfo->TID]),
- pOutBuffer, FrameLen);
-
- MlmeFreeMemory(pAd, pOutBuffer);
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("BA - Send ADDBA request. StartSeq = %x, FrameLen = %ld. BufSize = %d\n",
- Frame.BaStartSeq.field.StartSeq, FrameLen,
- Frame.BaParm.BufSize));
- }
-}
-
-/*
- ==========================================================================
- Description:
- send DELBA and delete BaEntry if any
- Parametrs:
- Elem - MLME message struct rt_mlme_delba_req
-
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-void MlmeDELBAAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
- struct rt_mlme_delba_req *pInfo;
- u8 *pOutBuffer = NULL;
- u8 *pOutBuffer2 = NULL;
- int NStatus;
- unsigned long Idx;
- struct rt_frame_delba_req Frame;
- unsigned long FrameLen;
- struct rt_frame_bar FrameBar;
-
- pInfo = (struct rt_mlme_delba_req *)Elem->Msg;
- /* must send back DELBA */
- NdisZeroMemory(&Frame, sizeof(struct rt_frame_delba_req));
- DBGPRINT(RT_DEBUG_TRACE,
- ("==> MlmeDELBAAction(), Initiator(%d) \n", pInfo->Initiator));
-
- if (MlmeDelBAReqSanity(pAd, Elem->Msg, Elem->MsgLen)) {
- NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); /*Get an unused nonpaged memory */
- if (NStatus != NDIS_STATUS_SUCCESS) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("BA - MlmeDELBAAction() allocate memory failed 1. \n"));
- return;
- }
-
- NStatus = MlmeAllocateMemory(pAd, &pOutBuffer2); /*Get an unused nonpaged memory */
- if (NStatus != NDIS_STATUS_SUCCESS) {
- MlmeFreeMemory(pAd, pOutBuffer);
- DBGPRINT(RT_DEBUG_ERROR,
- ("BA - MlmeDELBAAction() allocate memory failed 2. \n"));
- return;
- }
- /* SEND BAR (Send BAR to refresh peer reordering buffer.) */
- Idx =
- pAd->MacTab.Content[pInfo->Wcid].BAOriWcidArray[pInfo->TID];
-
- BarHeaderInit(pAd, &FrameBar,
- pAd->MacTab.Content[pInfo->Wcid].Addr,
- pAd->CurrentAddress);
-
- FrameBar.StartingSeq.field.FragNum = 0; /* make sure sequence not clear in DEL funciton. */
- FrameBar.StartingSeq.field.StartSeq = pAd->MacTab.Content[pInfo->Wcid].TxSeq[pInfo->TID]; /* make sure sequence not clear in DEL funciton. */
- FrameBar.BarControl.TID = pInfo->TID; /* make sure sequence not clear in DEL funciton. */
- FrameBar.BarControl.ACKPolicy = IMMED_BA; /* make sure sequence not clear in DEL funciton. */
- FrameBar.BarControl.Compressed = 1; /* make sure sequence not clear in DEL funciton. */
- FrameBar.BarControl.MTID = 0; /* make sure sequence not clear in DEL funciton. */
-
- MakeOutgoingFrame(pOutBuffer2, &FrameLen,
- sizeof(struct rt_frame_bar), &FrameBar, END_OF_ARGS);
- MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer2, FrameLen);
- MlmeFreeMemory(pAd, pOutBuffer2);
- DBGPRINT(RT_DEBUG_TRACE,
- ("BA - MlmeDELBAAction() . Send BAR to refresh peer reordering buffer \n"));
-
- /* SEND DELBA FRAME */
- FrameLen = 0;
-
- {
- if (ADHOC_ON(pAd))
- ActHeaderInit(pAd, &Frame.Hdr,
- pAd->MacTab.Content[pInfo->Wcid].
- Addr, pAd->CurrentAddress,
- pAd->CommonCfg.Bssid);
- else
- ActHeaderInit(pAd, &Frame.Hdr,
- pAd->CommonCfg.Bssid,
- pAd->CurrentAddress,
- pAd->MacTab.Content[pInfo->Wcid].
- Addr);
- }
-
- Frame.Category = CATEGORY_BA;
- Frame.Action = DELBA;
- Frame.DelbaParm.Initiator = pInfo->Initiator;
- Frame.DelbaParm.TID = pInfo->TID;
- Frame.ReasonCode = 39; /* Time Out */
- *(u16 *) (&Frame.DelbaParm) =
- cpu2le16(*(u16 *) (&Frame.DelbaParm));
- Frame.ReasonCode = cpu2le16(Frame.ReasonCode);
-
- MakeOutgoingFrame(pOutBuffer, &FrameLen,
- sizeof(struct rt_frame_delba_req), &Frame, END_OF_ARGS);
- MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);
- MlmeFreeMemory(pAd, pOutBuffer);
- DBGPRINT(RT_DEBUG_TRACE,
- ("BA - MlmeDELBAAction() . 3 DELBA sent. Initiator(%d)\n",
- pInfo->Initiator));
- }
-}
-
-void MlmeQOSAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
-}
-
-void MlmeDLSAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
-}
-
-void MlmeInvalidAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
- /*u8 * pOutBuffer = NULL; */
- /*Return the receiving frame except the MSB of category filed set to 1. 7.3.1.11 */
-}
-
-void PeerQOSAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
-}
-
-void PeerBAAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
- u8 Action = Elem->Msg[LENGTH_802_11 + 1];
-
- switch (Action) {
- case ADDBA_REQ:
- PeerAddBAReqAction(pAd, Elem);
- break;
- case ADDBA_RESP:
- PeerAddBARspAction(pAd, Elem);
- break;
- case DELBA:
- PeerDelBAAction(pAd, Elem);
- break;
- }
-}
-
-void PeerPublicAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
- if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE)
- return;
-}
-
-static void ReservedAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
- u8 Category;
-
- if (Elem->MsgLen <= LENGTH_802_11) {
- return;
- }
-
- Category = Elem->Msg[LENGTH_802_11];
- DBGPRINT(RT_DEBUG_TRACE,
- ("Rcv reserved category(%d) Action Frame\n", Category));
- hex_dump("Reserved Action Frame", &Elem->Msg[0], Elem->MsgLen);
-}
-
-void PeerRMAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
- return;
-}
-
-static void respond_ht_information_exchange_action(struct rt_rtmp_adapter *pAd,
- struct rt_mlme_queue_elem *Elem)
-{
- u8 *pOutBuffer = NULL;
- int NStatus;
- unsigned long FrameLen;
- struct rt_frame_ht_info HTINFOframe, *pFrame;
- u8 *pAddr;
-
- /* 2. Always send back ADDBA Response */
- NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); /*Get an unused nonpaged memory */
-
- if (NStatus != NDIS_STATUS_SUCCESS) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("ACTION - respond_ht_information_exchange_action() allocate memory failed \n"));
- return;
- }
- /* get RA */
- pFrame = (struct rt_frame_ht_info *) & Elem->Msg[0];
- pAddr = pFrame->Hdr.Addr2;
-
- NdisZeroMemory(&HTINFOframe, sizeof(struct rt_frame_ht_info));
- /* 2-1. Prepare ADDBA Response frame. */
- {
- if (ADHOC_ON(pAd))
- ActHeaderInit(pAd, &HTINFOframe.Hdr, pAddr,
- pAd->CurrentAddress,
- pAd->CommonCfg.Bssid);
- else
- ActHeaderInit(pAd, &HTINFOframe.Hdr,
- pAd->CommonCfg.Bssid, pAd->CurrentAddress,
- pAddr);
- }
-
- HTINFOframe.Category = CATEGORY_HT;
- HTINFOframe.Action = HT_INFO_EXCHANGE;
- HTINFOframe.HT_Info.Request = 0;
- HTINFOframe.HT_Info.Forty_MHz_Intolerant =
- pAd->CommonCfg.HtCapability.HtCapInfo.Forty_Mhz_Intolerant;
- HTINFOframe.HT_Info.STA_Channel_Width =
- pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth;
-
- MakeOutgoingFrame(pOutBuffer, &FrameLen,
- sizeof(struct rt_frame_ht_info), &HTINFOframe, END_OF_ARGS);
-
- MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);
- MlmeFreeMemory(pAd, pOutBuffer);
-}
-
-void PeerHTAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
- u8 Action = Elem->Msg[LENGTH_802_11 + 1];
-
- if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE)
- return;
-
- switch (Action) {
- case NOTIFY_BW_ACTION:
- DBGPRINT(RT_DEBUG_TRACE,
- ("ACTION - HT Notify Channel bandwidth action----> \n"));
-
- if (pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE) {
- /* Note, this is to patch DIR-1353 AP. When the AP set to Wep, it will use legacy mode. But AP still keeps */
- /* sending BW_Notify Action frame, and cause us to linkup and linkdown. */
- /* In legacy mode, don't need to parse HT action frame. */
- DBGPRINT(RT_DEBUG_TRACE,
- ("ACTION -Ignore HT Notify Channel BW when link as legacy mode. BW = %d---> \n",
- Elem->Msg[LENGTH_802_11 + 2]));
- break;
- }
-
- if (Elem->Msg[LENGTH_802_11 + 2] == 0) /* 7.4.8.2. if value is 1, keep the same as supported channel bandwidth. */
- pAd->MacTab.Content[Elem->Wcid].HTPhyMode.field.BW = 0;
-
- break;
- case SMPS_ACTION:
- /* 7.3.1.25 */
- DBGPRINT(RT_DEBUG_TRACE, ("ACTION - SMPS action----> \n"));
- if (((Elem->Msg[LENGTH_802_11 + 2] & 0x1) == 0)) {
- pAd->MacTab.Content[Elem->Wcid].MmpsMode = MMPS_ENABLE;
- } else if (((Elem->Msg[LENGTH_802_11 + 2] & 0x2) == 0)) {
- pAd->MacTab.Content[Elem->Wcid].MmpsMode = MMPS_STATIC;
- } else {
- pAd->MacTab.Content[Elem->Wcid].MmpsMode = MMPS_DYNAMIC;
- }
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("Aid(%d) MIMO PS = %d\n", Elem->Wcid,
- pAd->MacTab.Content[Elem->Wcid].MmpsMode));
- /* rt2860c : add something for smps change. */
- break;
-
- case SETPCO_ACTION:
- break;
- case MIMO_CHA_MEASURE_ACTION:
- break;
- case HT_INFO_EXCHANGE:
- {
- struct rt_ht_information_octet *pHT_info;
-
- pHT_info =
- (struct rt_ht_information_octet *) & Elem->Msg[LENGTH_802_11 +
- 2];
- /* 7.4.8.10 */
- DBGPRINT(RT_DEBUG_TRACE,
- ("ACTION - HT Information Exchange action----> \n"));
- if (pHT_info->Request) {
- respond_ht_information_exchange_action(pAd,
- Elem);
- }
- }
- break;
- }
-}
-
-/*
- ==========================================================================
- Description:
- Retry sending ADDBA Reqest.
-
- IRQL = DISPATCH_LEVEL
-
- Parametrs:
- p8023Header: if this is already 802.3 format, p8023Header is NULL
-
- Return : TRUE if put into rx reordering buffer, shouldn't indicaterxhere.
- FALSE , then continue indicaterx at this moment.
- ==========================================================================
- */
-void ORIBATimerTimeout(struct rt_rtmp_adapter *pAd)
-{
- struct rt_mac_table_entry *pEntry;
- int i, total;
- u8 TID;
-
- total = pAd->MacTab.Size * NUM_OF_TID;
-
- for (i = 1; ((i < MAX_LEN_OF_BA_ORI_TABLE) && (total > 0)); i++) {
- if (pAd->BATable.BAOriEntry[i].ORI_BA_Status == Originator_Done) {
- pEntry =
- &pAd->MacTab.Content[pAd->BATable.BAOriEntry[i].
- Wcid];
- TID = pAd->BATable.BAOriEntry[i].TID;
-
- ASSERT(pAd->BATable.BAOriEntry[i].Wcid <
- MAX_LEN_OF_MAC_TABLE);
- }
- total--;
- }
-}
-
-void SendRefreshBAR(struct rt_rtmp_adapter *pAd, struct rt_mac_table_entry *pEntry)
-{
- struct rt_frame_bar FrameBar;
- unsigned long FrameLen;
- int NStatus;
- u8 *pOutBuffer = NULL;
- u16 Sequence;
- u8 i, TID;
- u16 idx;
- struct rt_ba_ori_entry *pBAEntry;
-
- for (i = 0; i < NUM_OF_TID; i++) {
- idx = pEntry->BAOriWcidArray[i];
- if (idx == 0) {
- continue;
- }
- pBAEntry = &pAd->BATable.BAOriEntry[idx];
-
- if (pBAEntry->ORI_BA_Status == Originator_Done) {
- TID = pBAEntry->TID;
-
- ASSERT(pBAEntry->Wcid < MAX_LEN_OF_MAC_TABLE);
-
- NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); /*Get an unused nonpaged memory */
- if (NStatus != NDIS_STATUS_SUCCESS) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("BA - MlmeADDBAAction() allocate memory failed \n"));
- return;
- }
-
- Sequence = pEntry->TxSeq[TID];
-
- BarHeaderInit(pAd, &FrameBar, pEntry->Addr,
- pAd->CurrentAddress);
-
- FrameBar.StartingSeq.field.FragNum = 0; /* make sure sequence not clear in DEL function. */
- FrameBar.StartingSeq.field.StartSeq = Sequence; /* make sure sequence not clear in DEL funciton. */
- FrameBar.BarControl.TID = TID; /* make sure sequence not clear in DEL funciton. */
-
- MakeOutgoingFrame(pOutBuffer, &FrameLen,
- sizeof(struct rt_frame_bar), &FrameBar,
- END_OF_ARGS);
- /*if (!(CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_RALINK_CHIPSET))) */
- if (1) /* Now we always send BAR. */
- {
- /*MiniportMMRequestUnlock(pAd, 0, pOutBuffer, FrameLen); */
- MiniportMMRequest(pAd,
- (MGMT_USE_QUEUE_FLAG |
- MapUserPriorityToAccessCategory
- [TID]), pOutBuffer,
- FrameLen);
-
- }
- MlmeFreeMemory(pAd, pOutBuffer);
- }
- }
-}
-
-void ActHeaderInit(struct rt_rtmp_adapter *pAd,
- struct rt_header_802_11 * pHdr80211,
- u8 *Addr1, u8 *Addr2, u8 *Addr3)
-{
- NdisZeroMemory(pHdr80211, sizeof(struct rt_header_802_11));
- pHdr80211->FC.Type = BTYPE_MGMT;
- pHdr80211->FC.SubType = SUBTYPE_ACTION;
-
- COPY_MAC_ADDR(pHdr80211->Addr1, Addr1);
- COPY_MAC_ADDR(pHdr80211->Addr2, Addr2);
- COPY_MAC_ADDR(pHdr80211->Addr3, Addr3);
-}
-
-void BarHeaderInit(struct rt_rtmp_adapter *pAd,
- struct rt_frame_bar * pCntlBar, u8 *pDA, u8 *pSA)
-{
- NdisZeroMemory(pCntlBar, sizeof(struct rt_frame_bar));
- pCntlBar->FC.Type = BTYPE_CNTL;
- pCntlBar->FC.SubType = SUBTYPE_BLOCK_ACK_REQ;
- pCntlBar->BarControl.MTID = 0;
- pCntlBar->BarControl.Compressed = 1;
- pCntlBar->BarControl.ACKPolicy = 0;
-
- pCntlBar->Duration =
- 16 + RTMPCalcDuration(pAd, RATE_1, sizeof(struct rt_frame_ba));
-
- COPY_MAC_ADDR(pCntlBar->Addr1, pDA);
- COPY_MAC_ADDR(pCntlBar->Addr2, pSA);
-}
-
-/*
- ==========================================================================
- Description:
- Insert Category and action code into the action frame.
-
- Parametrs:
- 1. frame buffer pointer.
- 2. frame length.
- 3. category code of the frame.
- 4. action code of the frame.
-
- Return : None.
- ==========================================================================
- */
-void InsertActField(struct rt_rtmp_adapter *pAd,
- u8 *pFrameBuf,
- unsigned long *pFrameLen, u8 Category, u8 ActCode)
-{
- unsigned long TempLen;
-
- MakeOutgoingFrame(pFrameBuf, &TempLen,
- 1, &Category, 1, &ActCode, END_OF_ARGS);
-
- *pFrameLen = *pFrameLen + TempLen;
-
- return;
-}
diff --git a/drivers/staging/rt2860/common/action.h b/drivers/staging/rt2860/common/action.h
deleted file mode 100644
index 974f8b84039f..000000000000
--- a/drivers/staging/rt2860/common/action.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-
- Module Name:
- aironet.h
-
- Abstract:
-
- Revision History:
- Who When What
- -------- ---------- ----------------------------------------------
- Name Date Modification logs
- Paul Lin 04-06-15 Initial
-*/
-
-#ifndef __ACTION_H__
-#define __ACTION_H__
-
-struct PACKED rt_ht_information_octet {
- u8 Request:1;
- u8 Forty_MHz_Intolerant:1;
- u8 STA_Channel_Width:1;
- u8 Reserved:5;
-};
-
-struct PACKED rt_frame_ht_info {
- struct rt_header_802_11 Hdr;
- u8 Category;
- u8 Action;
- struct rt_ht_information_octet HT_Info;
-};
-
-#endif /* __ACTION_H__ */
diff --git a/drivers/staging/rt2860/common/ba_action.c b/drivers/staging/rt2860/common/ba_action.c
deleted file mode 100644
index 133bc1b87d2c..000000000000
--- a/drivers/staging/rt2860/common/ba_action.c
+++ /dev/null
@@ -1,1650 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
- */
-
-#include "../rt_config.h"
-#include <linux/kernel.h>
-
-#define BA_ORI_INIT_SEQ (pEntry->TxSeq[TID]) /*1 // initial sequence number of BA session */
-
-#define ORI_SESSION_MAX_RETRY 8
-#define ORI_BA_SESSION_TIMEOUT (2000) /* ms */
-#define REC_BA_SESSION_IDLE_TIMEOUT (1000) /* ms */
-
-#define REORDERING_PACKET_TIMEOUT ((100 * OS_HZ)/1000) /* system ticks -- 100 ms */
-#define MAX_REORDERING_PACKET_TIMEOUT ((3000 * OS_HZ)/1000) /* system ticks -- 100 ms */
-
-#define RESET_RCV_SEQ (0xFFFF)
-
-static void ba_mpdu_blk_free(struct rt_rtmp_adapter *pAd,
- struct reordering_mpdu *mpdu_blk);
-
-struct rt_ba_ori_entry *BATableAllocOriEntry(struct rt_rtmp_adapter *pAd, u16 * Idx);
-
-struct rt_ba_rec_entry *BATableAllocRecEntry(struct rt_rtmp_adapter *pAd, u16 * Idx);
-
-void BAOriSessionSetupTimeout(void *SystemSpecific1,
- void *FunctionContext,
- void *SystemSpecific2,
- void *SystemSpecific3);
-
-void BARecSessionIdleTimeout(void *SystemSpecific1,
- void *FunctionContext,
- void *SystemSpecific2,
- void *SystemSpecific3);
-
-BUILD_TIMER_FUNCTION(BAOriSessionSetupTimeout);
-BUILD_TIMER_FUNCTION(BARecSessionIdleTimeout);
-
-#define ANNOUNCE_REORDERING_PACKET(_pAd, _mpdu_blk) \
- Announce_Reordering_Packet(_pAd, _mpdu_blk);
-
-void BA_MaxWinSizeReasign(struct rt_rtmp_adapter *pAd,
- struct rt_mac_table_entry *pEntryPeer, u8 * pWinSize)
-{
- u8 MaxSize;
-
- if (pAd->MACVersion >= RALINK_2883_VERSION) /* 3*3 */
- {
- if (pAd->MACVersion >= RALINK_3070_VERSION) {
- if (pEntryPeer->WepStatus !=
- Ndis802_11EncryptionDisabled)
- MaxSize = 7; /* for non-open mode */
- else
- MaxSize = 13;
- } else
- MaxSize = 31;
- } else if (pAd->MACVersion >= RALINK_2880E_VERSION) /* 2880 e */
- {
- if (pEntryPeer->WepStatus != Ndis802_11EncryptionDisabled)
- MaxSize = 7; /* for non-open mode */
- else
- MaxSize = 13;
- } else
- MaxSize = 7;
-
- DBGPRINT(RT_DEBUG_TRACE, ("ba> Win Size = %d, Max Size = %d\n",
- *pWinSize, MaxSize));
-
- if ((*pWinSize) > MaxSize) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("ba> reassign max win size from %d to %d\n",
- *pWinSize, MaxSize));
-
- *pWinSize = MaxSize;
- }
-}
-
-void Announce_Reordering_Packet(struct rt_rtmp_adapter *pAd,
- IN struct reordering_mpdu *mpdu)
-{
- void *pPacket;
-
- pPacket = mpdu->pPacket;
-
- if (mpdu->bAMSDU) {
- ASSERT(0);
- BA_Reorder_AMSDU_Announce(pAd, pPacket);
- } else {
- /* */
- /* pass this 802.3 packet to upper layer or forward this packet to WM directly */
- /* */
-
- ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pPacket,
- RTMP_GET_PACKET_IF(pPacket));
- }
-}
-
-/*
- * Insert a reordering mpdu into sorted linked list by sequence no.
- */
-BOOLEAN ba_reordering_mpdu_insertsorted(struct reordering_list *list,
- struct reordering_mpdu *mpdu)
-{
-
- struct reordering_mpdu **ppScan = &list->next;
-
- while (*ppScan != NULL) {
- if (SEQ_SMALLER((*ppScan)->Sequence, mpdu->Sequence, MAXSEQ)) {
- ppScan = &(*ppScan)->next;
- } else if ((*ppScan)->Sequence == mpdu->Sequence) {
- /* give up this duplicated frame */
- return (FALSE);
- } else {
- /* find position */
- break;
- }
- }
-
- mpdu->next = *ppScan;
- *ppScan = mpdu;
- list->qlen++;
- return TRUE;
-}
-
-/*
- * caller lock critical section if necessary
- */
-static inline void ba_enqueue(struct reordering_list *list,
- struct reordering_mpdu *mpdu_blk)
-{
- list->qlen++;
- mpdu_blk->next = list->next;
- list->next = mpdu_blk;
-}
-
-/*
- * caller lock critical section if necessary
- */
-static inline struct reordering_mpdu *ba_dequeue(struct reordering_list *list)
-{
- struct reordering_mpdu *mpdu_blk = NULL;
-
- ASSERT(list);
-
- if (list->qlen) {
- list->qlen--;
- mpdu_blk = list->next;
- if (mpdu_blk) {
- list->next = mpdu_blk->next;
- mpdu_blk->next = NULL;
- }
- }
- return mpdu_blk;
-}
-
-static inline struct reordering_mpdu *ba_reordering_mpdu_dequeue(struct
- reordering_list
- *list)
-{
- return (ba_dequeue(list));
-}
-
-static inline struct reordering_mpdu *ba_reordering_mpdu_probe(struct
- reordering_list
- *list)
-{
- ASSERT(list);
-
- return (list->next);
-}
-
-/*
- * free all resource for reordering mechanism
- */
-void ba_reordering_resource_release(struct rt_rtmp_adapter *pAd)
-{
- struct rt_ba_table *Tab;
- struct rt_ba_rec_entry *pBAEntry;
- struct reordering_mpdu *mpdu_blk;
- int i;
-
- Tab = &pAd->BATable;
-
- /* I. release all pending reordering packet */
- NdisAcquireSpinLock(&pAd->BATabLock);
- for (i = 0; i < MAX_LEN_OF_BA_REC_TABLE; i++) {
- pBAEntry = &Tab->BARecEntry[i];
- if (pBAEntry->REC_BA_Status != Recipient_NONE) {
- while ((mpdu_blk =
- ba_reordering_mpdu_dequeue(&pBAEntry->list))) {
- ASSERT(mpdu_blk->pPacket);
- RELEASE_NDIS_PACKET(pAd, mpdu_blk->pPacket,
- NDIS_STATUS_FAILURE);
- ba_mpdu_blk_free(pAd, mpdu_blk);
- }
- }
- }
- NdisReleaseSpinLock(&pAd->BATabLock);
-
- ASSERT(pBAEntry->list.qlen == 0);
- /* II. free memory of reordering mpdu table */
- NdisAcquireSpinLock(&pAd->mpdu_blk_pool.lock);
- os_free_mem(pAd, pAd->mpdu_blk_pool.mem);
- NdisReleaseSpinLock(&pAd->mpdu_blk_pool.lock);
-}
-
-/*
- * Allocate all resource for reordering mechanism
- */
-BOOLEAN ba_reordering_resource_init(struct rt_rtmp_adapter *pAd, int num)
-{
- int i;
- u8 *mem;
- struct reordering_mpdu *mpdu_blk;
- struct reordering_list *freelist;
-
- /* allocate spinlock */
- NdisAllocateSpinLock(&pAd->mpdu_blk_pool.lock);
-
- /* initialize freelist */
- freelist = &pAd->mpdu_blk_pool.freelist;
- freelist->next = NULL;
- freelist->qlen = 0;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("Allocate %d memory for BA reordering\n",
- (u32)(num * sizeof(struct reordering_mpdu))));
-
- /* allocate number of mpdu_blk memory */
- os_alloc_mem(pAd, (u8 **) & mem,
- (num * sizeof(struct reordering_mpdu)));
-
- pAd->mpdu_blk_pool.mem = mem;
-
- if (mem == NULL) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("Can't Allocate Memory for BA Reordering\n"));
- return (FALSE);
- }
-
- /* build mpdu_blk free list */
- for (i = 0; i < num; i++) {
- /* get mpdu_blk */
- mpdu_blk = (struct reordering_mpdu *)mem;
- /* initial mpdu_blk */
- NdisZeroMemory(mpdu_blk, sizeof(struct reordering_mpdu));
- /* next mpdu_blk */
- mem += sizeof(struct reordering_mpdu);
- /* insert mpdu_blk into freelist */
- ba_enqueue(freelist, mpdu_blk);
- }
-
- return (TRUE);
-}
-
-/*static int blk_count=0; // sample take off, no use */
-
-static struct reordering_mpdu *ba_mpdu_blk_alloc(struct rt_rtmp_adapter *pAd)
-{
- struct reordering_mpdu *mpdu_blk;
-
- NdisAcquireSpinLock(&pAd->mpdu_blk_pool.lock);
- mpdu_blk = ba_dequeue(&pAd->mpdu_blk_pool.freelist);
- if (mpdu_blk) {
-/* blk_count++; */
- /* reset mpdu_blk */
- NdisZeroMemory(mpdu_blk, sizeof(struct reordering_mpdu));
- }
- NdisReleaseSpinLock(&pAd->mpdu_blk_pool.lock);
- return mpdu_blk;
-}
-
-static void ba_mpdu_blk_free(struct rt_rtmp_adapter *pAd,
- struct reordering_mpdu *mpdu_blk)
-{
- ASSERT(mpdu_blk);
-
- NdisAcquireSpinLock(&pAd->mpdu_blk_pool.lock);
-/* blk_count--; */
- ba_enqueue(&pAd->mpdu_blk_pool.freelist, mpdu_blk);
- NdisReleaseSpinLock(&pAd->mpdu_blk_pool.lock);
-}
-
-static u16 ba_indicate_reordering_mpdus_in_order(struct rt_rtmp_adapter *pAd,
- struct rt_ba_rec_entry *pBAEntry,
- u16 StartSeq)
-{
- struct reordering_mpdu *mpdu_blk;
- u16 LastIndSeq = RESET_RCV_SEQ;
-
- NdisAcquireSpinLock(&pBAEntry->RxReRingLock);
-
- while ((mpdu_blk = ba_reordering_mpdu_probe(&pBAEntry->list))) {
- /* find in-order frame */
- if (!SEQ_STEPONE(mpdu_blk->Sequence, StartSeq, MAXSEQ)) {
- break;
- }
- /* dequeue in-order frame from reodering list */
- mpdu_blk = ba_reordering_mpdu_dequeue(&pBAEntry->list);
- /* pass this frame up */
- ANNOUNCE_REORDERING_PACKET(pAd, mpdu_blk);
- /* move to next sequence */
- StartSeq = mpdu_blk->Sequence;
- LastIndSeq = StartSeq;
- /* free mpdu_blk */
- ba_mpdu_blk_free(pAd, mpdu_blk);
- }
-
- NdisReleaseSpinLock(&pBAEntry->RxReRingLock);
-
- /* update last indicated sequence */
- return LastIndSeq;
-}
-
-static void ba_indicate_reordering_mpdus_le_seq(struct rt_rtmp_adapter *pAd,
- struct rt_ba_rec_entry *pBAEntry,
- u16 Sequence)
-{
- struct reordering_mpdu *mpdu_blk;
-
- NdisAcquireSpinLock(&pBAEntry->RxReRingLock);
- while ((mpdu_blk = ba_reordering_mpdu_probe(&pBAEntry->list))) {
- /* find in-order frame */
- if ((mpdu_blk->Sequence == Sequence)
- || SEQ_SMALLER(mpdu_blk->Sequence, Sequence, MAXSEQ)) {
- /* dequeue in-order frame from reodering list */
- mpdu_blk = ba_reordering_mpdu_dequeue(&pBAEntry->list);
- /* pass this frame up */
- ANNOUNCE_REORDERING_PACKET(pAd, mpdu_blk);
- /* free mpdu_blk */
- ba_mpdu_blk_free(pAd, mpdu_blk);
- } else {
- break;
- }
- }
- NdisReleaseSpinLock(&pBAEntry->RxReRingLock);
-}
-
-static void ba_refresh_reordering_mpdus(struct rt_rtmp_adapter *pAd,
- struct rt_ba_rec_entry *pBAEntry)
-{
- struct reordering_mpdu *mpdu_blk;
-
- NdisAcquireSpinLock(&pBAEntry->RxReRingLock);
-
- /* dequeue in-order frame from reodering list */
- while ((mpdu_blk = ba_reordering_mpdu_dequeue(&pBAEntry->list))) {
- /* pass this frame up */
- ANNOUNCE_REORDERING_PACKET(pAd, mpdu_blk);
-
- pBAEntry->LastIndSeq = mpdu_blk->Sequence;
- ba_mpdu_blk_free(pAd, mpdu_blk);
-
- /* update last indicated sequence */
- }
- ASSERT(pBAEntry->list.qlen == 0);
- pBAEntry->LastIndSeq = RESET_RCV_SEQ;
- NdisReleaseSpinLock(&pBAEntry->RxReRingLock);
-}
-
-/*static */
-void ba_flush_reordering_timeout_mpdus(struct rt_rtmp_adapter *pAd,
- struct rt_ba_rec_entry *pBAEntry,
- unsigned long Now32)
-{
- u16 Sequence;
-
-/* if ((RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer+REORDERING_PACKET_TIMEOUT)) && */
-/* (pBAEntry->list.qlen > ((pBAEntry->BAWinSize*7)/8))) //|| */
-/* (RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer+(10*REORDERING_PACKET_TIMEOUT))) && */
-/* (pBAEntry->list.qlen > (pBAEntry->BAWinSize/8))) */
- if (RTMP_TIME_AFTER
- ((unsigned long)Now32,
- (unsigned long)(pBAEntry->LastIndSeqAtTimer +
- (MAX_REORDERING_PACKET_TIMEOUT / 6)))
- && (pBAEntry->list.qlen > 1)
- ) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("timeout[%d] (%08lx-%08lx = %d > %d): %x, flush all!\n ",
- pBAEntry->list.qlen, Now32,
- (pBAEntry->LastIndSeqAtTimer),
- (int)((long)Now32 -
- (long)(pBAEntry->LastIndSeqAtTimer)),
- MAX_REORDERING_PACKET_TIMEOUT, pBAEntry->LastIndSeq));
- ba_refresh_reordering_mpdus(pAd, pBAEntry);
- pBAEntry->LastIndSeqAtTimer = Now32;
- } else
- if (RTMP_TIME_AFTER
- ((unsigned long)Now32,
- (unsigned long)(pBAEntry->LastIndSeqAtTimer +
- (REORDERING_PACKET_TIMEOUT)))
- && (pBAEntry->list.qlen > 0)
- ) {
- /* */
- /* force LastIndSeq to shift to LastIndSeq+1 */
- /* */
- Sequence = (pBAEntry->LastIndSeq + 1) & MAXSEQ;
- ba_indicate_reordering_mpdus_le_seq(pAd, pBAEntry, Sequence);
- pBAEntry->LastIndSeqAtTimer = Now32;
- pBAEntry->LastIndSeq = Sequence;
- /* */
- /* indicate in-order mpdus */
- /* */
- Sequence =
- ba_indicate_reordering_mpdus_in_order(pAd, pBAEntry,
- Sequence);
- if (Sequence != RESET_RCV_SEQ) {
- pBAEntry->LastIndSeq = Sequence;
- }
-
- DBGPRINT(RT_DEBUG_OFF,
- ("%x, flush one!\n", pBAEntry->LastIndSeq));
-
- }
-}
-
-/*
- * generate ADDBA request to
- * set up BA agreement
- */
-void BAOriSessionSetUp(struct rt_rtmp_adapter *pAd,
- struct rt_mac_table_entry *pEntry,
- u8 TID,
- u16 TimeOut,
- unsigned long DelayTime, IN BOOLEAN isForced)
-{
- /*struct rt_mlme_addba_req AddbaReq; */
- struct rt_ba_ori_entry *pBAEntry = NULL;
- u16 Idx;
- BOOLEAN Cancelled;
-
- if ((pAd->CommonCfg.BACapability.field.AutoBA != TRUE)
- && (isForced == FALSE))
- return;
-
- /* if this entry is limited to use legacy tx mode, it doesn't generate BA. */
- if (RTMPStaFixedTxMode(pAd, pEntry) != FIXED_TXMODE_HT)
- return;
-
- if ((pEntry->BADeclineBitmap & (1 << TID)) && (isForced == FALSE)) {
- /* try again after 3 secs */
- DelayTime = 3000;
-/* DBGPRINT(RT_DEBUG_TRACE, ("DeCline BA from Peer\n")); */
-/* return; */
- }
-
- Idx = pEntry->BAOriWcidArray[TID];
- if (Idx == 0) {
- /* allocate a BA session */
- pBAEntry = BATableAllocOriEntry(pAd, &Idx);
- if (pBAEntry == NULL) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("ADDBA - MlmeADDBAAction() allocate BA session failed \n"));
- return;
- }
- } else {
- pBAEntry = &pAd->BATable.BAOriEntry[Idx];
- }
-
- if (pBAEntry->ORI_BA_Status >= Originator_WaitRes) {
- return;
- }
-
- pEntry->BAOriWcidArray[TID] = Idx;
-
- /* Initialize BA session */
- pBAEntry->ORI_BA_Status = Originator_WaitRes;
- pBAEntry->Wcid = pEntry->Aid;
- pBAEntry->BAWinSize = pAd->CommonCfg.BACapability.field.RxBAWinLimit;
- pBAEntry->Sequence = BA_ORI_INIT_SEQ;
- pBAEntry->Token = 1; /* (2008-01-21) Jan Lee recommends it - this token can't be 0 */
- pBAEntry->TID = TID;
- pBAEntry->TimeOutValue = TimeOut;
- pBAEntry->pAdapter = pAd;
-
- if (!(pEntry->TXBAbitmap & (1 << TID))) {
- RTMPInitTimer(pAd, &pBAEntry->ORIBATimer,
- GET_TIMER_FUNCTION(BAOriSessionSetupTimeout),
- pBAEntry, FALSE);
- } else
- RTMPCancelTimer(&pBAEntry->ORIBATimer, &Cancelled);
-
- /* set timer to send ADDBA request */
- RTMPSetTimer(&pBAEntry->ORIBATimer, DelayTime);
-}
-
-void BAOriSessionAdd(struct rt_rtmp_adapter *pAd,
- struct rt_mac_table_entry *pEntry, struct rt_frame_addba_rsp * pFrame)
-{
- struct rt_ba_ori_entry *pBAEntry = NULL;
- BOOLEAN Cancelled;
- u8 TID;
- u16 Idx;
- u8 *pOutBuffer2 = NULL;
- int NStatus;
- unsigned long FrameLen;
- struct rt_frame_bar FrameBar;
-
- TID = pFrame->BaParm.TID;
- Idx = pEntry->BAOriWcidArray[TID];
- pBAEntry = &pAd->BATable.BAOriEntry[Idx];
-
- /* Start fill in parameters. */
- if ((Idx != 0) && (pBAEntry->TID == TID)
- && (pBAEntry->ORI_BA_Status == Originator_WaitRes)) {
- pBAEntry->BAWinSize =
- min(pBAEntry->BAWinSize, ((u8)pFrame->BaParm.BufSize));
- BA_MaxWinSizeReasign(pAd, pEntry, &pBAEntry->BAWinSize);
-
- pBAEntry->TimeOutValue = pFrame->TimeOutValue;
- pBAEntry->ORI_BA_Status = Originator_Done;
- pAd->BATable.numDoneOriginator++;
-
- /* reset sequence number */
- pBAEntry->Sequence = BA_ORI_INIT_SEQ;
- /* Set Bitmap flag. */
- pEntry->TXBAbitmap |= (1 << TID);
- RTMPCancelTimer(&pBAEntry->ORIBATimer, &Cancelled);
-
- pBAEntry->ORIBATimer.TimerValue = 0; /*pFrame->TimeOutValue; */
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("%s : TXBAbitmap = %x, BAWinSize = %d, TimeOut = %ld\n",
- __func__, pEntry->TXBAbitmap, pBAEntry->BAWinSize,
- pBAEntry->ORIBATimer.TimerValue));
-
- /* SEND BAR ; */
- NStatus = MlmeAllocateMemory(pAd, &pOutBuffer2); /*Get an unused nonpaged memory */
- if (NStatus != NDIS_STATUS_SUCCESS) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("BA - BAOriSessionAdd() allocate memory failed \n"));
- return;
- }
-
- BarHeaderInit(pAd, &FrameBar,
- pAd->MacTab.Content[pBAEntry->Wcid].Addr,
- pAd->CurrentAddress);
-
- FrameBar.StartingSeq.field.FragNum = 0; /* make sure sequence not clear in DEL function. */
- FrameBar.StartingSeq.field.StartSeq = pBAEntry->Sequence; /* make sure sequence not clear in DEL funciton. */
- FrameBar.BarControl.TID = pBAEntry->TID; /* make sure sequence not clear in DEL funciton. */
- MakeOutgoingFrame(pOutBuffer2, &FrameLen,
- sizeof(struct rt_frame_bar), &FrameBar, END_OF_ARGS);
- MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer2, FrameLen);
- MlmeFreeMemory(pAd, pOutBuffer2);
-
- if (pBAEntry->ORIBATimer.TimerValue)
- RTMPSetTimer(&pBAEntry->ORIBATimer, pBAEntry->ORIBATimer.TimerValue); /* in mSec */
- }
-}
-
-BOOLEAN BARecSessionAdd(struct rt_rtmp_adapter *pAd,
- struct rt_mac_table_entry *pEntry, struct rt_frame_addba_req * pFrame)
-{
- struct rt_ba_rec_entry *pBAEntry = NULL;
- BOOLEAN Status = TRUE;
- BOOLEAN Cancelled;
- u16 Idx;
- u8 TID;
- u8 BAWinSize;
- /*u32 Value; */
- /*u32 offset; */
-
- ASSERT(pEntry);
-
- /* find TID */
- TID = pFrame->BaParm.TID;
-
- BAWinSize =
- min(((u8)pFrame->BaParm.BufSize),
- (u8)pAd->CommonCfg.BACapability.field.RxBAWinLimit);
-
- /* Intel patch */
- if (BAWinSize == 0) {
- BAWinSize = 64;
- }
-
- Idx = pEntry->BARecWcidArray[TID];
-
- if (Idx == 0) {
- pBAEntry = BATableAllocRecEntry(pAd, &Idx);
- } else {
- pBAEntry = &pAd->BATable.BARecEntry[Idx];
- /* flush all pending reordering mpdus */
- ba_refresh_reordering_mpdus(pAd, pBAEntry);
- }
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("%s(%ld): Idx = %d, BAWinSize(req %d) = %d\n", __func__,
- pAd->BATable.numAsRecipient, Idx, pFrame->BaParm.BufSize,
- BAWinSize));
-
- /* Start fill in parameters. */
- if (pBAEntry != NULL) {
- ASSERT(pBAEntry->list.qlen == 0);
-
- pBAEntry->REC_BA_Status = Recipient_HandleRes;
- pBAEntry->BAWinSize = BAWinSize;
- pBAEntry->Wcid = pEntry->Aid;
- pBAEntry->TID = TID;
- pBAEntry->TimeOutValue = pFrame->TimeOutValue;
- pBAEntry->REC_BA_Status = Recipient_Accept;
- /* initial sequence number */
- pBAEntry->LastIndSeq = RESET_RCV_SEQ; /*pFrame->BaStartSeq.field.StartSeq; */
-
- DBGPRINT(RT_DEBUG_OFF,
- ("Start Seq = %08x\n",
- pFrame->BaStartSeq.field.StartSeq));
-
- if (pEntry->RXBAbitmap & (1 << TID)) {
- RTMPCancelTimer(&pBAEntry->RECBATimer, &Cancelled);
- } else {
- RTMPInitTimer(pAd, &pBAEntry->RECBATimer,
- GET_TIMER_FUNCTION
- (BARecSessionIdleTimeout), pBAEntry,
- TRUE);
- }
-
- /* Set Bitmap flag. */
- pEntry->RXBAbitmap |= (1 << TID);
- pEntry->BARecWcidArray[TID] = Idx;
-
- pEntry->BADeclineBitmap &= ~(1 << TID);
-
- /* Set BA session mask in WCID table. */
- RTMP_ADD_BA_SESSION_TO_ASIC(pAd, pEntry->Aid, TID);
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("MACEntry[%d]RXBAbitmap = 0x%x. BARecWcidArray=%d\n",
- pEntry->Aid, pEntry->RXBAbitmap,
- pEntry->BARecWcidArray[TID]));
- } else {
- Status = FALSE;
- DBGPRINT(RT_DEBUG_TRACE,
- ("Can't Accept ADDBA for %pM TID = %d\n",
- pEntry->Addr, TID));
- }
- return (Status);
-}
-
-struct rt_ba_rec_entry *BATableAllocRecEntry(struct rt_rtmp_adapter *pAd, u16 * Idx)
-{
- int i;
- struct rt_ba_rec_entry *pBAEntry = NULL;
-
- NdisAcquireSpinLock(&pAd->BATabLock);
-
- if (pAd->BATable.numAsRecipient >= MAX_BARECI_SESSION) {
- DBGPRINT(RT_DEBUG_OFF, ("BA Recipeint Session (%ld) > %d\n",
- pAd->BATable.numAsRecipient,
- MAX_BARECI_SESSION));
- goto done;
- }
- /* reserve idx 0 to identify BAWcidArray[TID] as empty */
- for (i = 1; i < MAX_LEN_OF_BA_REC_TABLE; i++) {
- pBAEntry = &pAd->BATable.BARecEntry[i];
- if ((pBAEntry->REC_BA_Status == Recipient_NONE)) {
- /* get one */
- pAd->BATable.numAsRecipient++;
- pBAEntry->REC_BA_Status = Recipient_USED;
- *Idx = i;
- break;
- }
- }
-
-done:
- NdisReleaseSpinLock(&pAd->BATabLock);
- return pBAEntry;
-}
-
-struct rt_ba_ori_entry *BATableAllocOriEntry(struct rt_rtmp_adapter *pAd, u16 * Idx)
-{
- int i;
- struct rt_ba_ori_entry *pBAEntry = NULL;
-
- NdisAcquireSpinLock(&pAd->BATabLock);
-
- if (pAd->BATable.numAsOriginator >= (MAX_LEN_OF_BA_ORI_TABLE)) {
- goto done;
- }
- /* reserve idx 0 to identify BAWcidArray[TID] as empty */
- for (i = 1; i < MAX_LEN_OF_BA_ORI_TABLE; i++) {
- pBAEntry = &pAd->BATable.BAOriEntry[i];
- if ((pBAEntry->ORI_BA_Status == Originator_NONE)) {
- /* get one */
- pAd->BATable.numAsOriginator++;
- pBAEntry->ORI_BA_Status = Originator_USED;
- pBAEntry->pAdapter = pAd;
- *Idx = i;
- break;
- }
- }
-
-done:
- NdisReleaseSpinLock(&pAd->BATabLock);
- return pBAEntry;
-}
-
-void BATableFreeOriEntry(struct rt_rtmp_adapter *pAd, unsigned long Idx)
-{
- struct rt_ba_ori_entry *pBAEntry = NULL;
- struct rt_mac_table_entry *pEntry;
-
- if ((Idx == 0) || (Idx >= MAX_LEN_OF_BA_ORI_TABLE))
- return;
-
- pBAEntry = &pAd->BATable.BAOriEntry[Idx];
-
- if (pBAEntry->ORI_BA_Status != Originator_NONE) {
- pEntry = &pAd->MacTab.Content[pBAEntry->Wcid];
- pEntry->BAOriWcidArray[pBAEntry->TID] = 0;
-
- NdisAcquireSpinLock(&pAd->BATabLock);
- if (pBAEntry->ORI_BA_Status == Originator_Done) {
- pAd->BATable.numDoneOriginator -= 1;
- pEntry->TXBAbitmap &= (~(1 << (pBAEntry->TID)));
- DBGPRINT(RT_DEBUG_TRACE,
- ("BATableFreeOriEntry numAsOriginator= %ld\n",
- pAd->BATable.numAsRecipient));
- /* Erase Bitmap flag. */
- }
-
- ASSERT(pAd->BATable.numAsOriginator != 0);
-
- pAd->BATable.numAsOriginator -= 1;
-
- pBAEntry->ORI_BA_Status = Originator_NONE;
- pBAEntry->Token = 0;
- NdisReleaseSpinLock(&pAd->BATabLock);
- }
-}
-
-void BATableFreeRecEntry(struct rt_rtmp_adapter *pAd, unsigned long Idx)
-{
- struct rt_ba_rec_entry *pBAEntry = NULL;
- struct rt_mac_table_entry *pEntry;
-
- if ((Idx == 0) || (Idx >= MAX_LEN_OF_BA_REC_TABLE))
- return;
-
- pBAEntry = &pAd->BATable.BARecEntry[Idx];
-
- if (pBAEntry->REC_BA_Status != Recipient_NONE) {
- pEntry = &pAd->MacTab.Content[pBAEntry->Wcid];
- pEntry->BARecWcidArray[pBAEntry->TID] = 0;
-
- NdisAcquireSpinLock(&pAd->BATabLock);
-
- ASSERT(pAd->BATable.numAsRecipient != 0);
-
- pAd->BATable.numAsRecipient -= 1;
-
- pBAEntry->REC_BA_Status = Recipient_NONE;
- NdisReleaseSpinLock(&pAd->BATabLock);
- }
-}
-
-void BAOriSessionTearDown(struct rt_rtmp_adapter *pAd,
- u8 Wcid,
- u8 TID,
- IN BOOLEAN bPassive, IN BOOLEAN bForceSend)
-{
- unsigned long Idx = 0;
- struct rt_ba_ori_entry *pBAEntry;
- BOOLEAN Cancelled;
-
- if (Wcid >= MAX_LEN_OF_MAC_TABLE) {
- return;
- }
- /* */
- /* Locate corresponding BA Originator Entry in BA Table with the (pAddr,TID). */
- /* */
- Idx = pAd->MacTab.Content[Wcid].BAOriWcidArray[TID];
- if ((Idx == 0) || (Idx >= MAX_LEN_OF_BA_ORI_TABLE)) {
- if (bForceSend == TRUE) {
- /* force send specified TID DelBA */
- struct rt_mlme_delba_req DelbaReq;
- struct rt_mlme_queue_elem *Elem =
- kmalloc(sizeof(struct rt_mlme_queue_elem),
- MEM_ALLOC_FLAG);
- if (Elem != NULL) {
- NdisZeroMemory(&DelbaReq, sizeof(DelbaReq));
- NdisZeroMemory(Elem, sizeof(struct rt_mlme_queue_elem));
-
- COPY_MAC_ADDR(DelbaReq.Addr,
- pAd->MacTab.Content[Wcid].Addr);
- DelbaReq.Wcid = Wcid;
- DelbaReq.TID = TID;
- DelbaReq.Initiator = ORIGINATOR;
- Elem->MsgLen = sizeof(DelbaReq);
- NdisMoveMemory(Elem->Msg, &DelbaReq,
- sizeof(DelbaReq));
- MlmeDELBAAction(pAd, Elem);
- kfree(Elem);
- } else {
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s(bForceSend):alloc memory failed!\n",
- __func__));
- }
- }
-
- return;
- }
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("%s===>Wcid=%d.TID=%d \n", __func__, Wcid, TID));
-
- pBAEntry = &pAd->BATable.BAOriEntry[Idx];
- DBGPRINT(RT_DEBUG_TRACE,
- ("\t===>Idx = %ld, Wcid=%d.TID=%d, ORI_BA_Status = %d \n", Idx,
- Wcid, TID, pBAEntry->ORI_BA_Status));
- /* */
- /* Prepare DelBA action frame and send to the peer. */
- /* */
- if ((bPassive == FALSE) && (TID == pBAEntry->TID)
- && (pBAEntry->ORI_BA_Status == Originator_Done)) {
- struct rt_mlme_delba_req DelbaReq;
- struct rt_mlme_queue_elem *Elem =
- kmalloc(sizeof(struct rt_mlme_queue_elem),
- MEM_ALLOC_FLAG);
- if (Elem != NULL) {
- NdisZeroMemory(&DelbaReq, sizeof(DelbaReq));
- NdisZeroMemory(Elem, sizeof(struct rt_mlme_queue_elem));
-
- COPY_MAC_ADDR(DelbaReq.Addr,
- pAd->MacTab.Content[Wcid].Addr);
- DelbaReq.Wcid = Wcid;
- DelbaReq.TID = pBAEntry->TID;
- DelbaReq.Initiator = ORIGINATOR;
- Elem->MsgLen = sizeof(DelbaReq);
- NdisMoveMemory(Elem->Msg, &DelbaReq, sizeof(DelbaReq));
- MlmeDELBAAction(pAd, Elem);
- kfree(Elem);
- } else {
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s():alloc memory failed!\n", __func__));
- return;
- }
- }
- RTMPCancelTimer(&pBAEntry->ORIBATimer, &Cancelled);
- BATableFreeOriEntry(pAd, Idx);
-
- if (bPassive) {
- /*BAOriSessionSetUp(pAd, &pAd->MacTab.Content[Wcid], TID, 0, 10000, TRUE); */
- }
-}
-
-void BARecSessionTearDown(struct rt_rtmp_adapter *pAd,
- u8 Wcid, u8 TID, IN BOOLEAN bPassive)
-{
- unsigned long Idx = 0;
- struct rt_ba_rec_entry *pBAEntry;
-
- if (Wcid >= MAX_LEN_OF_MAC_TABLE) {
- return;
- }
- /* */
- /* Locate corresponding BA Originator Entry in BA Table with the (pAddr,TID). */
- /* */
- Idx = pAd->MacTab.Content[Wcid].BARecWcidArray[TID];
- if (Idx == 0)
- return;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("%s===>Wcid=%d.TID=%d \n", __func__, Wcid, TID));
-
- pBAEntry = &pAd->BATable.BARecEntry[Idx];
- DBGPRINT(RT_DEBUG_TRACE,
- ("\t===>Idx = %ld, Wcid=%d.TID=%d, REC_BA_Status = %d \n", Idx,
- Wcid, TID, pBAEntry->REC_BA_Status));
- /* */
- /* Prepare DelBA action frame and send to the peer. */
- /* */
- if ((TID == pBAEntry->TID)
- && (pBAEntry->REC_BA_Status == Recipient_Accept)) {
- struct rt_mlme_delba_req DelbaReq;
- BOOLEAN Cancelled;
- /*unsigned long offset; */
- /*u32 VALUE; */
-
- RTMPCancelTimer(&pBAEntry->RECBATimer, &Cancelled);
-
- /* */
- /* 1. Send DELBA Action Frame */
- /* */
- if (bPassive == FALSE) {
- struct rt_mlme_queue_elem *Elem =
- kmalloc(sizeof(struct rt_mlme_queue_elem),
- MEM_ALLOC_FLAG);
- if (Elem != NULL) {
- NdisZeroMemory(&DelbaReq, sizeof(DelbaReq));
- NdisZeroMemory(Elem, sizeof(struct rt_mlme_queue_elem));
-
- COPY_MAC_ADDR(DelbaReq.Addr,
- pAd->MacTab.Content[Wcid].Addr);
- DelbaReq.Wcid = Wcid;
- DelbaReq.TID = TID;
- DelbaReq.Initiator = RECIPIENT;
- Elem->MsgLen = sizeof(DelbaReq);
- NdisMoveMemory(Elem->Msg, &DelbaReq,
- sizeof(DelbaReq));
- MlmeDELBAAction(pAd, Elem);
- kfree(Elem);
- } else {
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s():alloc memory failed!\n",
- __func__));
- return;
- }
- }
-
- /* */
- /* 2. Free resource of BA session */
- /* */
- /* flush all pending reordering mpdus */
- ba_refresh_reordering_mpdus(pAd, pBAEntry);
-
- NdisAcquireSpinLock(&pAd->BATabLock);
-
- /* Erase Bitmap flag. */
- pBAEntry->LastIndSeq = RESET_RCV_SEQ;
- pBAEntry->BAWinSize = 0;
- /* Erase Bitmap flag at software mactable */
- pAd->MacTab.Content[Wcid].RXBAbitmap &=
- (~(1 << (pBAEntry->TID)));
- pAd->MacTab.Content[Wcid].BARecWcidArray[TID] = 0;
-
- RTMP_DEL_BA_SESSION_FROM_ASIC(pAd, Wcid, TID);
-
- NdisReleaseSpinLock(&pAd->BATabLock);
-
- }
-
- BATableFreeRecEntry(pAd, Idx);
-}
-
-void BASessionTearDownALL(struct rt_rtmp_adapter *pAd, u8 Wcid)
-{
- int i;
-
- for (i = 0; i < NUM_OF_TID; i++) {
- BAOriSessionTearDown(pAd, Wcid, i, FALSE, FALSE);
- BARecSessionTearDown(pAd, Wcid, i, FALSE);
- }
-}
-
-/*
- ==========================================================================
- Description:
- Retry sending ADDBA Reqest.
-
- IRQL = DISPATCH_LEVEL
-
- Parametrs:
- p8023Header: if this is already 802.3 format, p8023Header is NULL
-
- Return : TRUE if put into rx reordering buffer, shouldn't indicaterxhere.
- FALSE , then continue indicaterx at this moment.
- ==========================================================================
- */
-void BAOriSessionSetupTimeout(void *SystemSpecific1,
- void *FunctionContext,
- void *SystemSpecific2,
- void *SystemSpecific3)
-{
- struct rt_ba_ori_entry *pBAEntry = (struct rt_ba_ori_entry *)FunctionContext;
- struct rt_mac_table_entry *pEntry;
- struct rt_rtmp_adapter *pAd;
-
- if (pBAEntry == NULL)
- return;
-
- pAd = pBAEntry->pAdapter;
-
- {
- /* Do nothing if monitor mode is on */
- if (MONITOR_ON(pAd))
- return;
- }
-
- pEntry = &pAd->MacTab.Content[pBAEntry->Wcid];
-
- if ((pBAEntry->ORI_BA_Status == Originator_WaitRes)
- && (pBAEntry->Token < ORI_SESSION_MAX_RETRY)) {
- struct rt_mlme_addba_req AddbaReq;
-
- NdisZeroMemory(&AddbaReq, sizeof(AddbaReq));
- COPY_MAC_ADDR(AddbaReq.pAddr, pEntry->Addr);
- AddbaReq.Wcid = (u8)(pEntry->Aid);
- AddbaReq.TID = pBAEntry->TID;
- AddbaReq.BaBufSize =
- pAd->CommonCfg.BACapability.field.RxBAWinLimit;
- AddbaReq.TimeOutValue = 0;
- AddbaReq.Token = pBAEntry->Token;
- MlmeEnqueue(pAd, ACTION_STATE_MACHINE, MT2_MLME_ADD_BA_CATE,
- sizeof(struct rt_mlme_addba_req), (void *)& AddbaReq);
- RTMP_MLME_HANDLER(pAd);
- DBGPRINT(RT_DEBUG_TRACE,
- ("BA Ori Session Timeout(%d) : Send ADD BA again\n",
- pBAEntry->Token));
-
- pBAEntry->Token++;
- RTMPSetTimer(&pBAEntry->ORIBATimer, ORI_BA_SESSION_TIMEOUT);
- } else {
- BATableFreeOriEntry(pAd, pEntry->BAOriWcidArray[pBAEntry->TID]);
- }
-}
-
-/*
- ==========================================================================
- Description:
- Retry sending ADDBA Reqest.
-
- IRQL = DISPATCH_LEVEL
-
- Parametrs:
- p8023Header: if this is already 802.3 format, p8023Header is NULL
-
- Return : TRUE if put into rx reordering buffer, shouldn't indicaterxhere.
- FALSE , then continue indicaterx at this moment.
- ==========================================================================
- */
-void BARecSessionIdleTimeout(void *SystemSpecific1,
- void *FunctionContext,
- void *SystemSpecific2, void *SystemSpecific3)
-{
-
- struct rt_ba_rec_entry *pBAEntry = (struct rt_ba_rec_entry *)FunctionContext;
- struct rt_rtmp_adapter *pAd;
- unsigned long Now32;
-
- if (pBAEntry == NULL)
- return;
-
- if ((pBAEntry->REC_BA_Status == Recipient_Accept)) {
- NdisGetSystemUpTime(&Now32);
-
- if (RTMP_TIME_AFTER
- ((unsigned long)Now32,
- (unsigned long)(pBAEntry->LastIndSeqAtTimer +
- REC_BA_SESSION_IDLE_TIMEOUT))) {
- pAd = pBAEntry->pAdapter;
- /* flush all pending reordering mpdus */
- ba_refresh_reordering_mpdus(pAd, pBAEntry);
- DBGPRINT(RT_DEBUG_OFF,
- ("%ld: REC BA session Timeout\n", Now32));
- }
- }
-}
-
-void PeerAddBAReqAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
- /* 7.4.4.1 */
- /*unsigned long Idx; */
- u8 Status = 1;
- u8 pAddr[6];
- struct rt_frame_addba_rsp ADDframe;
- u8 *pOutBuffer = NULL;
- int NStatus;
- struct rt_frame_addba_req * pAddreqFrame = NULL;
- /*u8 BufSize; */
- unsigned long FrameLen;
- unsigned long *ptemp;
- struct rt_mac_table_entry *pMacEntry;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("%s ==> (Wcid = %d)\n", __func__, Elem->Wcid));
-
- /*hex_dump("AddBAReq", Elem->Msg, Elem->MsgLen); */
-
- /*ADDBA Request from unknown peer, ignore this. */
- if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE)
- return;
-
- pMacEntry = &pAd->MacTab.Content[Elem->Wcid];
- DBGPRINT(RT_DEBUG_TRACE, ("BA - PeerAddBAReqAction----> \n"));
- ptemp = (unsigned long *)Elem->Msg;
- /*DBGPRINT_RAW(RT_DEBUG_EMU, ("%08x:: %08x:: %08x:: %08x:: %08x:: %08x:: %08x:: %08x:: %08x\n", *(ptemp), *(ptemp+1), *(ptemp+2), *(ptemp+3), *(ptemp+4), *(ptemp+5), *(ptemp+6), *(ptemp+7), *(ptemp+8))); */
-
- if (PeerAddBAReqActionSanity(pAd, Elem->Msg, Elem->MsgLen, pAddr)) {
-
- if ((pAd->CommonCfg.bBADecline == FALSE)
- && IS_HT_STA(pMacEntry)) {
- pAddreqFrame = (struct rt_frame_addba_req *) (&Elem->Msg[0]);
- DBGPRINT(RT_DEBUG_OFF,
- ("Rcv Wcid(%d) AddBAReq\n", Elem->Wcid));
- if (BARecSessionAdd
- (pAd, &pAd->MacTab.Content[Elem->Wcid],
- pAddreqFrame))
- Status = 0;
- else
- Status = 38; /* more parameters have invalid values */
- } else {
- Status = 37; /* the request has been declined. */
- }
- }
-
- if (pAd->MacTab.Content[Elem->Wcid].ValidAsCLI)
- ASSERT(pAd->MacTab.Content[Elem->Wcid].Sst == SST_ASSOC);
-
- pAddreqFrame = (struct rt_frame_addba_req *) (&Elem->Msg[0]);
- /* 2. Always send back ADDBA Response */
- NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); /*Get an unused nonpaged memory */
- if (NStatus != NDIS_STATUS_SUCCESS) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("ACTION - PeerBAAction() allocate memory failed \n"));
- return;
- }
-
- NdisZeroMemory(&ADDframe, sizeof(struct rt_frame_addba_rsp));
-
- /* 2-1. Prepare ADDBA Response frame. */
- {
- if (ADHOC_ON(pAd))
- ActHeaderInit(pAd, &ADDframe.Hdr, pAddr,
- pAd->CurrentAddress,
- pAd->CommonCfg.Bssid);
- else
- ActHeaderInit(pAd, &ADDframe.Hdr, pAd->CommonCfg.Bssid,
- pAd->CurrentAddress, pAddr);
- }
-
- ADDframe.Category = CATEGORY_BA;
- ADDframe.Action = ADDBA_RESP;
- ADDframe.Token = pAddreqFrame->Token;
- /* What is the Status code?? need to check. */
- ADDframe.StatusCode = Status;
- ADDframe.BaParm.BAPolicy = IMMED_BA;
- ADDframe.BaParm.AMSDUSupported = 0;
- ADDframe.BaParm.TID = pAddreqFrame->BaParm.TID;
- ADDframe.BaParm.BufSize =
- min(((u8)pAddreqFrame->BaParm.BufSize),
- (u8)pAd->CommonCfg.BACapability.field.RxBAWinLimit);
- if (ADDframe.BaParm.BufSize == 0) {
- ADDframe.BaParm.BufSize = 64;
- }
- ADDframe.TimeOutValue = 0; /*pAddreqFrame->TimeOutValue; */
-
- *(u16 *) (&ADDframe.BaParm) =
- cpu2le16(*(u16 *) (&ADDframe.BaParm));
- ADDframe.StatusCode = cpu2le16(ADDframe.StatusCode);
- ADDframe.TimeOutValue = cpu2le16(ADDframe.TimeOutValue);
-
- MakeOutgoingFrame(pOutBuffer, &FrameLen,
- sizeof(struct rt_frame_addba_rsp), &ADDframe, END_OF_ARGS);
- MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);
- MlmeFreeMemory(pAd, pOutBuffer);
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("%s(%d): TID(%d), BufSize(%d) <== \n", __func__, Elem->Wcid,
- ADDframe.BaParm.TID, ADDframe.BaParm.BufSize));
-}
-
-void PeerAddBARspAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
- /*u8 Idx, i; */
- /*u8 * pOutBuffer = NULL; */
- struct rt_frame_addba_rsp * pFrame = NULL;
- /*struct rt_ba_ori_entry *pBAEntry; */
-
- /*ADDBA Response from unknown peer, ignore this. */
- if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE)
- return;
-
- DBGPRINT(RT_DEBUG_TRACE, ("%s ==> Wcid(%d)\n", __func__, Elem->Wcid));
-
- /*hex_dump("PeerAddBARspAction()", Elem->Msg, Elem->MsgLen); */
-
- if (PeerAddBARspActionSanity(pAd, Elem->Msg, Elem->MsgLen)) {
- pFrame = (struct rt_frame_addba_rsp *) (&Elem->Msg[0]);
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("\t\t StatusCode = %d\n", pFrame->StatusCode));
- switch (pFrame->StatusCode) {
- case 0:
- /* I want a BAsession with this peer as an originator. */
- BAOriSessionAdd(pAd, &pAd->MacTab.Content[Elem->Wcid],
- pFrame);
- break;
- default:
- /* check status == USED ??? */
- BAOriSessionTearDown(pAd, Elem->Wcid,
- pFrame->BaParm.TID, TRUE, FALSE);
- break;
- }
- /* Rcv Decline StatusCode */
- if ((pFrame->StatusCode == 37)
- || ((pAd->OpMode == OPMODE_STA) && STA_TGN_WIFI_ON(pAd)
- && (pFrame->StatusCode != 0))
- ) {
- pAd->MacTab.Content[Elem->Wcid].BADeclineBitmap |=
- 1 << pFrame->BaParm.TID;
- }
- }
-}
-
-void PeerDelBAAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
- /*u8 Idx; */
- /*u8 * pOutBuffer = NULL; */
- struct rt_frame_delba_req * pDelFrame = NULL;
-
- DBGPRINT(RT_DEBUG_TRACE, ("%s ==>\n", __func__));
- /*DELBA Request from unknown peer, ignore this. */
- if (PeerDelBAActionSanity(pAd, Elem->Wcid, Elem->Msg, Elem->MsgLen)) {
- pDelFrame = (struct rt_frame_delba_req *) (&Elem->Msg[0]);
- if (pDelFrame->DelbaParm.Initiator == ORIGINATOR) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("BA - PeerDelBAAction----> ORIGINATOR\n"));
- BARecSessionTearDown(pAd, Elem->Wcid,
- pDelFrame->DelbaParm.TID, TRUE);
- } else {
- DBGPRINT(RT_DEBUG_TRACE,
- ("BA - PeerDelBAAction----> RECIPIENT, Reason = %d\n",
- pDelFrame->ReasonCode));
- /*hex_dump("DelBA Frame", pDelFrame, Elem->MsgLen); */
- BAOriSessionTearDown(pAd, Elem->Wcid,
- pDelFrame->DelbaParm.TID, TRUE,
- FALSE);
- }
- }
-}
-
-BOOLEAN CntlEnqueueForRecv(struct rt_rtmp_adapter *pAd,
- unsigned long Wcid,
- unsigned long MsgLen, struct rt_frame_ba_req * pMsg)
-{
- struct rt_frame_ba_req * pFrame = pMsg;
- /*PRTMP_REORDERBUF pBuffer; */
- /*PRTMP_REORDERBUF pDmaBuf; */
- struct rt_ba_rec_entry *pBAEntry;
- /*BOOLEAN Result; */
- unsigned long Idx;
- /*u8 NumRxPkt; */
- u8 TID; /*, i; */
-
- TID = (u8)pFrame->BARControl.TID;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("%s(): BAR-Wcid(%ld), Tid (%d)\n", __func__, Wcid, TID));
- /*hex_dump("BAR", (char *)pFrame, MsgLen); */
- /* Do nothing if the driver is starting halt state. */
- /* This might happen when timer already been fired before cancel timer with mlmehalt */
- if (RTMP_TEST_FLAG
- (pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
- return FALSE;
-
- /* First check the size, it MUST not exceed the mlme queue size */
- if (MsgLen > MGMT_DMA_BUFFER_SIZE) {
- DBGPRINT_ERR("CntlEnqueueForRecv: frame too large, size = %ld \n", MsgLen);
- return FALSE;
- } else if (MsgLen != sizeof(struct rt_frame_ba_req)) {
- DBGPRINT_ERR("CntlEnqueueForRecv: BlockAck Request frame length size = %ld incorrect\n", MsgLen);
- return FALSE;
- } else if (MsgLen != sizeof(struct rt_frame_ba_req)) {
- DBGPRINT_ERR("CntlEnqueueForRecv: BlockAck Request frame length size = %ld incorrect\n", MsgLen);
- return FALSE;
- }
-
- if ((Wcid < MAX_LEN_OF_MAC_TABLE) && (TID < 8)) {
- /* if this receiving packet is from SA that is in our OriEntry. Since WCID <9 has direct mapping. no need search. */
- Idx = pAd->MacTab.Content[Wcid].BARecWcidArray[TID];
- pBAEntry = &pAd->BATable.BARecEntry[Idx];
- } else {
- return FALSE;
- }
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("BAR(%ld) : Tid (%d) - %04x:%04x\n", Wcid, TID,
- pFrame->BAStartingSeq.field.StartSeq, pBAEntry->LastIndSeq));
-
- if (SEQ_SMALLER
- (pBAEntry->LastIndSeq, pFrame->BAStartingSeq.field.StartSeq,
- MAXSEQ)) {
- /*DBGPRINT(RT_DEBUG_TRACE, ("BAR Seq = %x, LastIndSeq = %x\n", pFrame->BAStartingSeq.field.StartSeq, pBAEntry->LastIndSeq)); */
- ba_indicate_reordering_mpdus_le_seq(pAd, pBAEntry,
- pFrame->BAStartingSeq.field.
- StartSeq);
- pBAEntry->LastIndSeq =
- (pFrame->BAStartingSeq.field.StartSeq ==
- 0) ? MAXSEQ : (pFrame->BAStartingSeq.field.StartSeq - 1);
- }
- /*ba_refresh_reordering_mpdus(pAd, pBAEntry); */
- return TRUE;
-}
-
-/*
-Description : Send PSMP Action frame If PSMP mode switches.
-*/
-void SendPSMPAction(struct rt_rtmp_adapter *pAd, u8 Wcid, u8 Psmp)
-{
- u8 *pOutBuffer = NULL;
- int NStatus;
- /*unsigned long Idx; */
- struct rt_frame_psmp_action Frame;
- unsigned long FrameLen;
-
- NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); /*Get an unused nonpaged memory */
- if (NStatus != NDIS_STATUS_SUCCESS) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("BA - MlmeADDBAAction() allocate memory failed \n"));
- return;
- }
-
- ActHeaderInit(pAd, &Frame.Hdr, pAd->CommonCfg.Bssid,
- pAd->CurrentAddress, pAd->MacTab.Content[Wcid].Addr);
-
- Frame.Category = CATEGORY_HT;
- Frame.Action = SMPS_ACTION;
- switch (Psmp) {
- case MMPS_ENABLE:
-#ifdef RT30xx
- if (IS_RT30xx(pAd)
- && (pAd->Antenna.field.RxPath > 1
- || pAd->Antenna.field.TxPath > 1)) {
- RTMP_ASIC_MMPS_DISABLE(pAd);
- }
-#endif /* RT30xx // */
- Frame.Psmp = 0;
- break;
- case MMPS_DYNAMIC:
- Frame.Psmp = 3;
- break;
- case MMPS_STATIC:
-#ifdef RT30xx
- if (IS_RT30xx(pAd)
- && (pAd->Antenna.field.RxPath > 1
- || pAd->Antenna.field.TxPath > 1)) {
- RTMP_ASIC_MMPS_ENABLE(pAd);
- }
-#endif /* RT30xx // */
- Frame.Psmp = 1;
- break;
- }
- MakeOutgoingFrame(pOutBuffer, &FrameLen,
- sizeof(struct rt_frame_psmp_action), &Frame, END_OF_ARGS);
- MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);
- MlmeFreeMemory(pAd, pOutBuffer);
- DBGPRINT(RT_DEBUG_ERROR, ("HT - SendPSMPAction( %d ) \n", Frame.Psmp));
-}
-
-#define RADIO_MEASUREMENT_REQUEST_ACTION 0
-
-struct PACKED rt_beacon_request {
- u8 RegulatoryClass;
- u8 ChannelNumber;
- u16 RandomInterval;
- u16 MeasurementDuration;
- u8 MeasurementMode;
- u8 BSSID[MAC_ADDR_LEN];
- u8 ReportingCondition;
- u8 Threshold;
- u8 SSIDIE[2]; /* 2 byte */
-};
-
-struct PACKED rt_measurement_req {
- u8 ID;
- u8 Length;
- u8 Token;
- u8 RequestMode;
- u8 Type;
-};
-
-void convert_reordering_packet_to_preAMSDU_or_802_3_packet(struct rt_rtmp_adapter *pAd,
- struct rt_rx_blk *pRxBlk,
- u8
- FromWhichBSSID)
-{
- void *pRxPkt;
- u8 Header802_3[LENGTH_802_3];
-
- /* 1. get 802.3 Header */
- /* 2. remove LLC */
- /* a. pointer pRxBlk->pData to payload */
- /* b. modify pRxBlk->DataSize */
-
- RTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3);
-
- ASSERT(pRxBlk->pRxPacket);
- pRxPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
-
- SET_OS_PKT_NETDEV(pRxPkt, get_netdev_from_bssid(pAd, FromWhichBSSID));
- SET_OS_PKT_DATAPTR(pRxPkt, pRxBlk->pData);
- SET_OS_PKT_LEN(pRxPkt, pRxBlk->DataSize);
- SET_OS_PKT_DATATAIL(pRxPkt, pRxBlk->pData, pRxBlk->DataSize);
-
- /* */
- /* copy 802.3 header, if necessary */
- /* */
- if (!RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU)) {
- {
-#ifdef LINUX
- NdisMoveMemory(skb_push(pRxPkt, LENGTH_802_3),
- Header802_3, LENGTH_802_3);
-#endif
- }
- }
-}
-
-#define INDICATE_LEGACY_OR_AMSDU(_pAd, _pRxBlk, _fromWhichBSSID) \
- do \
- { \
- if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_AMSDU)) \
- { \
- Indicate_AMSDU_Packet(_pAd, _pRxBlk, _fromWhichBSSID); \
- } \
- else if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_EAP)) \
- { \
- Indicate_EAPOL_Packet(_pAd, _pRxBlk, _fromWhichBSSID); \
- } \
- else \
- { \
- Indicate_Legacy_Packet(_pAd, _pRxBlk, _fromWhichBSSID); \
- } \
- } while (0);
-
-static void ba_enqueue_reordering_packet(struct rt_rtmp_adapter *pAd,
- struct rt_ba_rec_entry *pBAEntry,
- struct rt_rx_blk *pRxBlk,
- u8 FromWhichBSSID)
-{
- struct reordering_mpdu *mpdu_blk;
- u16 Sequence = (u16)pRxBlk->pHeader->Sequence;
-
- mpdu_blk = ba_mpdu_blk_alloc(pAd);
- if ((mpdu_blk != NULL) && (!RX_BLK_TEST_FLAG(pRxBlk, fRX_EAP))) {
- /* Write RxD buffer address & allocated buffer length */
- NdisAcquireSpinLock(&pBAEntry->RxReRingLock);
-
- mpdu_blk->Sequence = Sequence;
-
- mpdu_blk->bAMSDU = RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU);
-
- convert_reordering_packet_to_preAMSDU_or_802_3_packet(pAd,
- pRxBlk,
- FromWhichBSSID);
-
- STATS_INC_RX_PACKETS(pAd, FromWhichBSSID);
-
- /* */
- /* it is necessary for reordering packet to record */
- /* which BSS it come from */
- /* */
- RTMP_SET_PACKET_IF(pRxBlk->pRxPacket, FromWhichBSSID);
-
- mpdu_blk->pPacket = pRxBlk->pRxPacket;
-
- if (ba_reordering_mpdu_insertsorted(&pBAEntry->list, mpdu_blk)
- == FALSE) {
- /* had been already within reordering list */
- /* don't indicate */
- RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket,
- NDIS_STATUS_SUCCESS);
- ba_mpdu_blk_free(pAd, mpdu_blk);
- }
-
- ASSERT((0 <= pBAEntry->list.qlen)
- && (pBAEntry->list.qlen <= pBAEntry->BAWinSize));
- NdisReleaseSpinLock(&pBAEntry->RxReRingLock);
- } else {
- DBGPRINT(RT_DEBUG_ERROR,
- (" (%d) Can't allocate reordering mpdu blk\n",
- pBAEntry->list.qlen));
-
- /*
- * flush all pending reordering mpdus
- * and receiving mpdu to upper layer
- * make tcp/ip to take care reordering mechanism
- */
- /*ba_refresh_reordering_mpdus(pAd, pBAEntry); */
- ba_indicate_reordering_mpdus_le_seq(pAd, pBAEntry, Sequence);
-
- pBAEntry->LastIndSeq = Sequence;
- INDICATE_LEGACY_OR_AMSDU(pAd, pRxBlk, FromWhichBSSID);
- }
-}
-
-/*
- ==========================================================================
- Description:
- Indicate this packet to upper layer or put it into reordering buffer
-
- Parametrs:
- pRxBlk : carry necessary packet info 802.11 format
- FromWhichBSSID : the packet received from which BSS
-
- Return :
- none
-
- Note :
- the packet queued into reordering buffer need to cover to 802.3 format
- or pre_AMSDU format
- ==========================================================================
- */
-
-void Indicate_AMPDU_Packet(struct rt_rtmp_adapter *pAd,
- struct rt_rx_blk *pRxBlk, u8 FromWhichBSSID)
-{
- u16 Idx;
- struct rt_ba_rec_entry *pBAEntry = NULL;
- u16 Sequence = pRxBlk->pHeader->Sequence;
- unsigned long Now32;
- u8 Wcid = pRxBlk->pRxWI->WirelessCliID;
- u8 TID = pRxBlk->pRxWI->TID;
-
- if (!RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU)
- && (pRxBlk->DataSize > MAX_RX_PKT_LEN)) {
- /* release packet */
- RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket,
- NDIS_STATUS_FAILURE);
- return;
- }
-
- if (Wcid < MAX_LEN_OF_MAC_TABLE) {
- Idx = pAd->MacTab.Content[Wcid].BARecWcidArray[TID];
- if (Idx == 0) {
- /* Rec BA Session had been torn down */
- INDICATE_LEGACY_OR_AMSDU(pAd, pRxBlk, FromWhichBSSID);
- return;
- }
- pBAEntry = &pAd->BATable.BARecEntry[Idx];
- } else {
- /* impossible ! */
- ASSERT(0);
- /* release packet */
- RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket,
- NDIS_STATUS_FAILURE);
- return;
- }
-
- ASSERT(pBAEntry);
-
- /* update last rx time */
- NdisGetSystemUpTime(&Now32);
-
- pBAEntry->rcvSeq = Sequence;
-
- ba_flush_reordering_timeout_mpdus(pAd, pBAEntry, Now32);
- pBAEntry->LastIndSeqAtTimer = Now32;
-
- /* */
- /* Reset Last Indicate Sequence */
- /* */
- if (pBAEntry->LastIndSeq == RESET_RCV_SEQ) {
- ASSERT((pBAEntry->list.qlen == 0)
- && (pBAEntry->list.next == NULL));
-
- /* reset rcv sequence of BA session */
- pBAEntry->LastIndSeq = Sequence;
- pBAEntry->LastIndSeqAtTimer = Now32;
- INDICATE_LEGACY_OR_AMSDU(pAd, pRxBlk, FromWhichBSSID);
- return;
- }
-
- /* */
- /* I. Check if in order. */
- /* */
- if (SEQ_STEPONE(Sequence, pBAEntry->LastIndSeq, MAXSEQ)) {
- u16 LastIndSeq;
-
- pBAEntry->LastIndSeq = Sequence;
- INDICATE_LEGACY_OR_AMSDU(pAd, pRxBlk, FromWhichBSSID);
- LastIndSeq =
- ba_indicate_reordering_mpdus_in_order(pAd, pBAEntry,
- pBAEntry->LastIndSeq);
- if (LastIndSeq != RESET_RCV_SEQ) {
- pBAEntry->LastIndSeq = LastIndSeq;
- }
- pBAEntry->LastIndSeqAtTimer = Now32;
- }
- /* */
- /* II. Drop Duplicated Packet */
- /* */
- else if (Sequence == pBAEntry->LastIndSeq) {
-
- /* drop and release packet */
- pBAEntry->nDropPacket++;
- RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket,
- NDIS_STATUS_FAILURE);
- }
- /* */
- /* III. Drop Old Received Packet */
- /* */
- else if (SEQ_SMALLER(Sequence, pBAEntry->LastIndSeq, MAXSEQ)) {
-
- /* drop and release packet */
- pBAEntry->nDropPacket++;
- RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket,
- NDIS_STATUS_FAILURE);
- }
- /* */
- /* IV. Receive Sequence within Window Size */
- /* */
- else if (SEQ_SMALLER
- (Sequence,
- (((pBAEntry->LastIndSeq + pBAEntry->BAWinSize + 1)) & MAXSEQ),
- MAXSEQ)) {
- ba_enqueue_reordering_packet(pAd, pBAEntry, pRxBlk,
- FromWhichBSSID);
- }
- /* */
- /* V. Receive seq surpasses Win(lastseq + nMSDU). So refresh all reorder buffer */
- /* */
- else {
- long WinStartSeq, TmpSeq;
-
- TmpSeq = Sequence - (pBAEntry->BAWinSize) - 1;
- if (TmpSeq < 0) {
- TmpSeq = (MAXSEQ + 1) + TmpSeq;
- }
- WinStartSeq = (TmpSeq + 1) & MAXSEQ;
- ba_indicate_reordering_mpdus_le_seq(pAd, pBAEntry, WinStartSeq);
- pBAEntry->LastIndSeq = WinStartSeq; /*TmpSeq; */
-
- pBAEntry->LastIndSeqAtTimer = Now32;
-
- ba_enqueue_reordering_packet(pAd, pBAEntry, pRxBlk,
- FromWhichBSSID);
-
- TmpSeq =
- ba_indicate_reordering_mpdus_in_order(pAd, pBAEntry,
- pBAEntry->LastIndSeq);
- if (TmpSeq != RESET_RCV_SEQ) {
- pBAEntry->LastIndSeq = TmpSeq;
- }
- }
-}
diff --git a/drivers/staging/rt2860/common/cmm_aes.c b/drivers/staging/rt2860/common/cmm_aes.c
deleted file mode 100644
index d70d229a6e53..000000000000
--- a/drivers/staging/rt2860/common/cmm_aes.c
+++ /dev/null
@@ -1,1311 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-
- Module Name:
- cmm_aes.c
-
- Abstract:
-
- Revision History:
- Who When What
- -------- ---------- ----------------------------------------------
- Paul Wu 02-25-02 Initial
-*/
-
-#include "../rt_config.h"
-
-struct aes_context {
- u32 erk[64]; /* encryption round keys */
- u32 drk[64]; /* decryption round keys */
- int nr; /* number of rounds */
-};
-
-/*****************************/
-/******** SBOX Table *********/
-/*****************************/
-
-u8 SboxTable[256] = {
- 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
- 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
- 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
- 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
- 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
- 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
- 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
- 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
- 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
- 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
- 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
- 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
- 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
- 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
- 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
- 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
- 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
- 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
- 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
- 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
- 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
- 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
- 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
- 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
- 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
- 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
- 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
- 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
- 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
- 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
- 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
- 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
-};
-
-void xor_32(u8 *a, u8 *b, u8 *out)
-{
- int i;
-
- for (i = 0; i < 4; i++) {
- out[i] = a[i] ^ b[i];
- }
-}
-
-void xor_128(u8 *a, u8 *b, u8 *out)
-{
- int i;
-
- for (i = 0; i < 16; i++) {
- out[i] = a[i] ^ b[i];
- }
-}
-
-u8 RTMPCkipSbox(u8 a)
-{
- return SboxTable[(int)a];
-}
-
-void next_key(u8 *key, int round)
-{
- u8 rcon;
- u8 sbox_key[4];
- u8 rcon_table[12] = {
- 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
- 0x1b, 0x36, 0x36, 0x36
- };
-
- sbox_key[0] = RTMPCkipSbox(key[13]);
- sbox_key[1] = RTMPCkipSbox(key[14]);
- sbox_key[2] = RTMPCkipSbox(key[15]);
- sbox_key[3] = RTMPCkipSbox(key[12]);
-
- rcon = rcon_table[round];
-
- xor_32(&key[0], sbox_key, &key[0]);
- key[0] = key[0] ^ rcon;
-
- xor_32(&key[4], &key[0], &key[4]);
- xor_32(&key[8], &key[4], &key[8]);
- xor_32(&key[12], &key[8], &key[12]);
-}
-
-void byte_sub(u8 *in, u8 *out)
-{
- int i;
-
- for (i = 0; i < 16; i++) {
- out[i] = RTMPCkipSbox(in[i]);
- }
-}
-
-/************************************/
-/* bitwise_xor() */
-/* A 128 bit, bitwise exclusive or */
-/************************************/
-
-void bitwise_xor(unsigned char *ina, unsigned char *inb, unsigned char *out)
-{
- int i;
- for (i = 0; i < 16; i++) {
- out[i] = ina[i] ^ inb[i];
- }
-}
-
-void shift_row(u8 *in, u8 *out)
-{
- out[0] = in[0];
- out[1] = in[5];
- out[2] = in[10];
- out[3] = in[15];
- out[4] = in[4];
- out[5] = in[9];
- out[6] = in[14];
- out[7] = in[3];
- out[8] = in[8];
- out[9] = in[13];
- out[10] = in[2];
- out[11] = in[7];
- out[12] = in[12];
- out[13] = in[1];
- out[14] = in[6];
- out[15] = in[11];
-}
-
-void mix_column(u8 *in, u8 *out)
-{
- int i;
- u8 add1b[4];
- u8 add1bf7[4];
- u8 rotl[4];
- u8 swap_halfs[4];
- u8 andf7[4];
- u8 rotr[4];
- u8 temp[4];
- u8 tempb[4];
-
- for (i = 0; i < 4; i++) {
- if ((in[i] & 0x80) == 0x80)
- add1b[i] = 0x1b;
- else
- add1b[i] = 0x00;
- }
-
- swap_halfs[0] = in[2]; /* Swap halfs */
- swap_halfs[1] = in[3];
- swap_halfs[2] = in[0];
- swap_halfs[3] = in[1];
-
- rotl[0] = in[3]; /* Rotate left 8 bits */
- rotl[1] = in[0];
- rotl[2] = in[1];
- rotl[3] = in[2];
-
- andf7[0] = in[0] & 0x7f;
- andf7[1] = in[1] & 0x7f;
- andf7[2] = in[2] & 0x7f;
- andf7[3] = in[3] & 0x7f;
-
- for (i = 3; i > 0; i--) { /* logical shift left 1 bit */
- andf7[i] = andf7[i] << 1;
- if ((andf7[i - 1] & 0x80) == 0x80) {
- andf7[i] = (andf7[i] | 0x01);
- }
- }
- andf7[0] = andf7[0] << 1;
- andf7[0] = andf7[0] & 0xfe;
-
- xor_32(add1b, andf7, add1bf7);
-
- xor_32(in, add1bf7, rotr);
-
- temp[0] = rotr[0]; /* Rotate right 8 bits */
- rotr[0] = rotr[1];
- rotr[1] = rotr[2];
- rotr[2] = rotr[3];
- rotr[3] = temp[0];
-
- xor_32(add1bf7, rotr, temp);
- xor_32(swap_halfs, rotl, tempb);
- xor_32(temp, tempb, out);
-}
-
-/************************************************/
-/* construct_mic_header1() */
-/* Builds the first MIC header block from */
-/* header fields. */
-/************************************************/
-
-void construct_mic_header1(unsigned char *mic_header1,
- int header_length, unsigned char *mpdu)
-{
- mic_header1[0] = (unsigned char)((header_length - 2) / 256);
- mic_header1[1] = (unsigned char)((header_length - 2) % 256);
- mic_header1[2] = mpdu[0] & 0xcf; /* Mute CF poll & CF ack bits */
- mic_header1[3] = mpdu[1] & 0xc7; /* Mute retry, more data and pwr mgt bits */
- mic_header1[4] = mpdu[4]; /* A1 */
- mic_header1[5] = mpdu[5];
- mic_header1[6] = mpdu[6];
- mic_header1[7] = mpdu[7];
- mic_header1[8] = mpdu[8];
- mic_header1[9] = mpdu[9];
- mic_header1[10] = mpdu[10]; /* A2 */
- mic_header1[11] = mpdu[11];
- mic_header1[12] = mpdu[12];
- mic_header1[13] = mpdu[13];
- mic_header1[14] = mpdu[14];
- mic_header1[15] = mpdu[15];
-}
-
-/************************************************/
-/* construct_mic_header2() */
-/* Builds the last MIC header block from */
-/* header fields. */
-/************************************************/
-
-void construct_mic_header2(unsigned char *mic_header2,
- unsigned char *mpdu, int a4_exists, int qc_exists)
-{
- int i;
-
- for (i = 0; i < 16; i++)
- mic_header2[i] = 0x00;
-
- mic_header2[0] = mpdu[16]; /* A3 */
- mic_header2[1] = mpdu[17];
- mic_header2[2] = mpdu[18];
- mic_header2[3] = mpdu[19];
- mic_header2[4] = mpdu[20];
- mic_header2[5] = mpdu[21];
-
- /* In Sequence Control field, mute sequence numer bits (12-bit) */
- mic_header2[6] = mpdu[22] & 0x0f; /* SC */
- mic_header2[7] = 0x00; /* mpdu[23]; */
-
- if ((!qc_exists) && a4_exists) {
- for (i = 0; i < 6; i++)
- mic_header2[8 + i] = mpdu[24 + i]; /* A4 */
-
- }
-
- if (qc_exists && (!a4_exists)) {
- mic_header2[8] = mpdu[24] & 0x0f; /* mute bits 15 - 4 */
- mic_header2[9] = mpdu[25] & 0x00;
- }
-
- if (qc_exists && a4_exists) {
- for (i = 0; i < 6; i++)
- mic_header2[8 + i] = mpdu[24 + i]; /* A4 */
-
- mic_header2[14] = mpdu[30] & 0x0f;
- mic_header2[15] = mpdu[31] & 0x00;
- }
-}
-
-/************************************************/
-/* construct_mic_iv() */
-/* Builds the MIC IV from header fields and PN */
-/************************************************/
-
-void construct_mic_iv(unsigned char *mic_iv,
- int qc_exists,
- int a4_exists,
- unsigned char *mpdu,
- unsigned int payload_length, unsigned char *pn_vector)
-{
- int i;
-
- mic_iv[0] = 0x59;
- if (qc_exists && a4_exists)
- mic_iv[1] = mpdu[30] & 0x0f; /* QoS_TC */
- if (qc_exists && !a4_exists)
- mic_iv[1] = mpdu[24] & 0x0f; /* mute bits 7-4 */
- if (!qc_exists)
- mic_iv[1] = 0x00;
- for (i = 2; i < 8; i++)
- mic_iv[i] = mpdu[i + 8]; /* mic_iv[2:7] = A2[0:5] = mpdu[10:15] */
-#ifdef CONSISTENT_PN_ORDER
- for (i = 8; i < 14; i++)
- mic_iv[i] = pn_vector[i - 8]; /* mic_iv[8:13] = PN[0:5] */
-#else
- for (i = 8; i < 14; i++)
- mic_iv[i] = pn_vector[13 - i]; /* mic_iv[8:13] = PN[5:0] */
-#endif
- mic_iv[14] = (unsigned char)(payload_length / 256);
- mic_iv[15] = (unsigned char)(payload_length % 256);
-
-}
-
-/****************************************/
-/* aes128k128d() */
-/* Performs a 128 bit AES encrypt with */
-/* 128 bit data. */
-/****************************************/
-void aes128k128d(unsigned char *key, unsigned char *data,
- unsigned char *ciphertext)
-{
- int round;
- int i;
- unsigned char intermediatea[16];
- unsigned char intermediateb[16];
- unsigned char round_key[16];
-
- for (i = 0; i < 16; i++)
- round_key[i] = key[i];
-
- for (round = 0; round < 11; round++) {
- if (round == 0) {
- xor_128(round_key, data, ciphertext);
- next_key(round_key, round);
- } else if (round == 10) {
- byte_sub(ciphertext, intermediatea);
- shift_row(intermediatea, intermediateb);
- xor_128(intermediateb, round_key, ciphertext);
- } else { /* 1 - 9 */
-
- byte_sub(ciphertext, intermediatea);
- shift_row(intermediatea, intermediateb);
- mix_column(&intermediateb[0], &intermediatea[0]);
- mix_column(&intermediateb[4], &intermediatea[4]);
- mix_column(&intermediateb[8], &intermediatea[8]);
- mix_column(&intermediateb[12], &intermediatea[12]);
- xor_128(intermediatea, round_key, ciphertext);
- next_key(round_key, round);
- }
- }
-
-}
-
-void construct_ctr_preload(unsigned char *ctr_preload,
- int a4_exists,
- int qc_exists,
- unsigned char *mpdu, unsigned char *pn_vector, int c)
-{
-
- int i = 0;
- for (i = 0; i < 16; i++)
- ctr_preload[i] = 0x00;
- i = 0;
-
- ctr_preload[0] = 0x01; /* flag */
- if (qc_exists && a4_exists)
- ctr_preload[1] = mpdu[30] & 0x0f; /* QoC_Control */
- if (qc_exists && !a4_exists)
- ctr_preload[1] = mpdu[24] & 0x0f;
-
- for (i = 2; i < 8; i++)
- ctr_preload[i] = mpdu[i + 8]; /* ctr_preload[2:7] = A2[0:5] = mpdu[10:15] */
-#ifdef CONSISTENT_PN_ORDER
- for (i = 8; i < 14; i++)
- ctr_preload[i] = pn_vector[i - 8]; /* ctr_preload[8:13] = PN[0:5] */
-#else
- for (i = 8; i < 14; i++)
- ctr_preload[i] = pn_vector[13 - i]; /* ctr_preload[8:13] = PN[5:0] */
-#endif
- ctr_preload[14] = (unsigned char)(c / 256); /* Ctr */
- ctr_preload[15] = (unsigned char)(c % 256);
-
-}
-
-BOOLEAN RTMPSoftDecryptAES(struct rt_rtmp_adapter *pAd,
- u8 *pData,
- unsigned long DataByteCnt, struct rt_cipher_key *pWpaKey)
-{
- u8 KeyID;
- u32 HeaderLen;
- u8 PN[6];
- u32 payload_len;
- u32 num_blocks;
- u32 payload_remainder;
- u16 fc;
- u8 fc0;
- u8 fc1;
- u32 frame_type;
- u32 frame_subtype;
- u32 from_ds;
- u32 to_ds;
- int a4_exists;
- int qc_exists;
- u8 aes_out[16];
- int payload_index;
- u32 i;
- u8 ctr_preload[16];
- u8 chain_buffer[16];
- u8 padded_buffer[16];
- u8 mic_iv[16];
- u8 mic_header1[16];
- u8 mic_header2[16];
- u8 MIC[8];
- u8 TrailMIC[8];
-
- fc0 = *pData;
- fc1 = *(pData + 1);
-
- fc = *((u16 *)pData);
-
- frame_type = ((fc0 >> 2) & 0x03);
- frame_subtype = ((fc0 >> 4) & 0x0f);
-
- from_ds = (fc1 & 0x2) >> 1;
- to_ds = (fc1 & 0x1);
-
- a4_exists = (from_ds & to_ds);
- qc_exists = ((frame_subtype == 0x08) || /* Assumed QoS subtypes */
- (frame_subtype == 0x09) || /* Likely to change. */
- (frame_subtype == 0x0a) || (frame_subtype == 0x0b)
- );
-
- HeaderLen = 24;
- if (a4_exists)
- HeaderLen += 6;
-
- KeyID = *((u8 *)(pData + HeaderLen + 3));
- KeyID = KeyID >> 6;
-
- if (pWpaKey[KeyID].KeyLen == 0) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("RTMPSoftDecryptAES failed!(KeyID[%d] Length can not be 0)\n",
- KeyID));
- return FALSE;
- }
-
- PN[0] = *(pData + HeaderLen);
- PN[1] = *(pData + HeaderLen + 1);
- PN[2] = *(pData + HeaderLen + 4);
- PN[3] = *(pData + HeaderLen + 5);
- PN[4] = *(pData + HeaderLen + 6);
- PN[5] = *(pData + HeaderLen + 7);
-
- payload_len = DataByteCnt - HeaderLen - 8 - 8; /* 8 bytes for CCMP header , 8 bytes for MIC */
- payload_remainder = (payload_len) % 16;
- num_blocks = (payload_len) / 16;
-
- /* Find start of payload */
- payload_index = HeaderLen + 8; /*IV+EIV */
-
- for (i = 0; i < num_blocks; i++) {
- construct_ctr_preload(ctr_preload,
- a4_exists, qc_exists, pData, PN, i + 1);
-
- aes128k128d(pWpaKey[KeyID].Key, ctr_preload, aes_out);
-
- bitwise_xor(aes_out, pData + payload_index, chain_buffer);
- NdisMoveMemory(pData + payload_index - 8, chain_buffer, 16);
- payload_index += 16;
- }
-
- /* */
- /* If there is a short final block, then pad it */
- /* encrypt it and copy the unpadded part back */
- /* */
- if (payload_remainder > 0) {
- construct_ctr_preload(ctr_preload,
- a4_exists,
- qc_exists, pData, PN, num_blocks + 1);
-
- NdisZeroMemory(padded_buffer, 16);
- NdisMoveMemory(padded_buffer, pData + payload_index,
- payload_remainder);
-
- aes128k128d(pWpaKey[KeyID].Key, ctr_preload, aes_out);
-
- bitwise_xor(aes_out, padded_buffer, chain_buffer);
- NdisMoveMemory(pData + payload_index - 8, chain_buffer,
- payload_remainder);
- payload_index += payload_remainder;
- }
- /* */
- /* Descrypt the MIC */
- /* */
- construct_ctr_preload(ctr_preload, a4_exists, qc_exists, pData, PN, 0);
- NdisZeroMemory(padded_buffer, 16);
- NdisMoveMemory(padded_buffer, pData + payload_index, 8);
-
- aes128k128d(pWpaKey[KeyID].Key, ctr_preload, aes_out);
-
- bitwise_xor(aes_out, padded_buffer, chain_buffer);
-
- NdisMoveMemory(TrailMIC, chain_buffer, 8);
-
- /* */
- /* Calculate MIC */
- /* */
-
- /*Force the protected frame bit on */
- *(pData + 1) = *(pData + 1) | 0x40;
-
- /* Find start of payload */
- /* Because the CCMP header has been removed */
- payload_index = HeaderLen;
-
- construct_mic_iv(mic_iv, qc_exists, a4_exists, pData, payload_len, PN);
-
- construct_mic_header1(mic_header1, HeaderLen, pData);
-
- construct_mic_header2(mic_header2, pData, a4_exists, qc_exists);
-
- aes128k128d(pWpaKey[KeyID].Key, mic_iv, aes_out);
- bitwise_xor(aes_out, mic_header1, chain_buffer);
- aes128k128d(pWpaKey[KeyID].Key, chain_buffer, aes_out);
- bitwise_xor(aes_out, mic_header2, chain_buffer);
- aes128k128d(pWpaKey[KeyID].Key, chain_buffer, aes_out);
-
- /* iterate through each 16 byte payload block */
- for (i = 0; i < num_blocks; i++) {
- bitwise_xor(aes_out, pData + payload_index, chain_buffer);
- payload_index += 16;
- aes128k128d(pWpaKey[KeyID].Key, chain_buffer, aes_out);
- }
-
- /* Add on the final payload block if it needs padding */
- if (payload_remainder > 0) {
- NdisZeroMemory(padded_buffer, 16);
- NdisMoveMemory(padded_buffer, pData + payload_index,
- payload_remainder);
-
- bitwise_xor(aes_out, padded_buffer, chain_buffer);
- aes128k128d(pWpaKey[KeyID].Key, chain_buffer, aes_out);
- }
- /* aes_out contains padded mic, discard most significant */
- /* 8 bytes to generate 64 bit MIC */
- for (i = 0; i < 8; i++)
- MIC[i] = aes_out[i];
-
- if (!NdisEqualMemory(MIC, TrailMIC, 8)) {
- DBGPRINT(RT_DEBUG_ERROR, ("RTMPSoftDecryptAES, MIC Error !\n")); /*MIC error. */
- return FALSE;
- }
-
- return TRUE;
-}
-
-/* ========================= AES En/Decryption ========================== */
-#ifndef uint8
-#define uint8 unsigned char
-#endif
-
-#ifndef uint32
-#define uint32 unsigned int
-#endif
-
-/* forward S-box */
-static uint32 FSb[256] = {
- 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
- 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
- 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
- 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
- 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
- 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
- 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
- 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
- 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
- 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
- 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
- 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
- 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
- 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
- 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
- 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
- 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
- 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
- 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
- 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
- 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
- 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
- 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
- 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
- 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
- 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
- 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
- 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
- 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
- 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
- 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
- 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
-};
-
-/* forward table */
-#define FT \
-\
- V(C6,63,63,A5), V(F8,7C,7C,84), V(EE,77,77,99), V(F6,7B,7B,8D), \
- V(FF,F2,F2,0D), V(D6,6B,6B,BD), V(DE,6F,6F,B1), V(91,C5,C5,54), \
- V(60,30,30,50), V(02,01,01,03), V(CE,67,67,A9), V(56,2B,2B,7D), \
- V(E7,FE,FE,19), V(B5,D7,D7,62), V(4D,AB,AB,E6), V(EC,76,76,9A), \
- V(8F,CA,CA,45), V(1F,82,82,9D), V(89,C9,C9,40), V(FA,7D,7D,87), \
- V(EF,FA,FA,15), V(B2,59,59,EB), V(8E,47,47,C9), V(FB,F0,F0,0B), \
- V(41,AD,AD,EC), V(B3,D4,D4,67), V(5F,A2,A2,FD), V(45,AF,AF,EA), \
- V(23,9C,9C,BF), V(53,A4,A4,F7), V(E4,72,72,96), V(9B,C0,C0,5B), \
- V(75,B7,B7,C2), V(E1,FD,FD,1C), V(3D,93,93,AE), V(4C,26,26,6A), \
- V(6C,36,36,5A), V(7E,3F,3F,41), V(F5,F7,F7,02), V(83,CC,CC,4F), \
- V(68,34,34,5C), V(51,A5,A5,F4), V(D1,E5,E5,34), V(F9,F1,F1,08), \
- V(E2,71,71,93), V(AB,D8,D8,73), V(62,31,31,53), V(2A,15,15,3F), \
- V(08,04,04,0C), V(95,C7,C7,52), V(46,23,23,65), V(9D,C3,C3,5E), \
- V(30,18,18,28), V(37,96,96,A1), V(0A,05,05,0F), V(2F,9A,9A,B5), \
- V(0E,07,07,09), V(24,12,12,36), V(1B,80,80,9B), V(DF,E2,E2,3D), \
- V(CD,EB,EB,26), V(4E,27,27,69), V(7F,B2,B2,CD), V(EA,75,75,9F), \
- V(12,09,09,1B), V(1D,83,83,9E), V(58,2C,2C,74), V(34,1A,1A,2E), \
- V(36,1B,1B,2D), V(DC,6E,6E,B2), V(B4,5A,5A,EE), V(5B,A0,A0,FB), \
- V(A4,52,52,F6), V(76,3B,3B,4D), V(B7,D6,D6,61), V(7D,B3,B3,CE), \
- V(52,29,29,7B), V(DD,E3,E3,3E), V(5E,2F,2F,71), V(13,84,84,97), \
- V(A6,53,53,F5), V(B9,D1,D1,68), V(00,00,00,00), V(C1,ED,ED,2C), \
- V(40,20,20,60), V(E3,FC,FC,1F), V(79,B1,B1,C8), V(B6,5B,5B,ED), \
- V(D4,6A,6A,BE), V(8D,CB,CB,46), V(67,BE,BE,D9), V(72,39,39,4B), \
- V(94,4A,4A,DE), V(98,4C,4C,D4), V(B0,58,58,E8), V(85,CF,CF,4A), \
- V(BB,D0,D0,6B), V(C5,EF,EF,2A), V(4F,AA,AA,E5), V(ED,FB,FB,16), \
- V(86,43,43,C5), V(9A,4D,4D,D7), V(66,33,33,55), V(11,85,85,94), \
- V(8A,45,45,CF), V(E9,F9,F9,10), V(04,02,02,06), V(FE,7F,7F,81), \
- V(A0,50,50,F0), V(78,3C,3C,44), V(25,9F,9F,BA), V(4B,A8,A8,E3), \
- V(A2,51,51,F3), V(5D,A3,A3,FE), V(80,40,40,C0), V(05,8F,8F,8A), \
- V(3F,92,92,AD), V(21,9D,9D,BC), V(70,38,38,48), V(F1,F5,F5,04), \
- V(63,BC,BC,DF), V(77,B6,B6,C1), V(AF,DA,DA,75), V(42,21,21,63), \
- V(20,10,10,30), V(E5,FF,FF,1A), V(FD,F3,F3,0E), V(BF,D2,D2,6D), \
- V(81,CD,CD,4C), V(18,0C,0C,14), V(26,13,13,35), V(C3,EC,EC,2F), \
- V(BE,5F,5F,E1), V(35,97,97,A2), V(88,44,44,CC), V(2E,17,17,39), \
- V(93,C4,C4,57), V(55,A7,A7,F2), V(FC,7E,7E,82), V(7A,3D,3D,47), \
- V(C8,64,64,AC), V(BA,5D,5D,E7), V(32,19,19,2B), V(E6,73,73,95), \
- V(C0,60,60,A0), V(19,81,81,98), V(9E,4F,4F,D1), V(A3,DC,DC,7F), \
- V(44,22,22,66), V(54,2A,2A,7E), V(3B,90,90,AB), V(0B,88,88,83), \
- V(8C,46,46,CA), V(C7,EE,EE,29), V(6B,B8,B8,D3), V(28,14,14,3C), \
- V(A7,DE,DE,79), V(BC,5E,5E,E2), V(16,0B,0B,1D), V(AD,DB,DB,76), \
- V(DB,E0,E0,3B), V(64,32,32,56), V(74,3A,3A,4E), V(14,0A,0A,1E), \
- V(92,49,49,DB), V(0C,06,06,0A), V(48,24,24,6C), V(B8,5C,5C,E4), \
- V(9F,C2,C2,5D), V(BD,D3,D3,6E), V(43,AC,AC,EF), V(C4,62,62,A6), \
- V(39,91,91,A8), V(31,95,95,A4), V(D3,E4,E4,37), V(F2,79,79,8B), \
- V(D5,E7,E7,32), V(8B,C8,C8,43), V(6E,37,37,59), V(DA,6D,6D,B7), \
- V(01,8D,8D,8C), V(B1,D5,D5,64), V(9C,4E,4E,D2), V(49,A9,A9,E0), \
- V(D8,6C,6C,B4), V(AC,56,56,FA), V(F3,F4,F4,07), V(CF,EA,EA,25), \
- V(CA,65,65,AF), V(F4,7A,7A,8E), V(47,AE,AE,E9), V(10,08,08,18), \
- V(6F,BA,BA,D5), V(F0,78,78,88), V(4A,25,25,6F), V(5C,2E,2E,72), \
- V(38,1C,1C,24), V(57,A6,A6,F1), V(73,B4,B4,C7), V(97,C6,C6,51), \
- V(CB,E8,E8,23), V(A1,DD,DD,7C), V(E8,74,74,9C), V(3E,1F,1F,21), \
- V(96,4B,4B,DD), V(61,BD,BD,DC), V(0D,8B,8B,86), V(0F,8A,8A,85), \
- V(E0,70,70,90), V(7C,3E,3E,42), V(71,B5,B5,C4), V(CC,66,66,AA), \
- V(90,48,48,D8), V(06,03,03,05), V(F7,F6,F6,01), V(1C,0E,0E,12), \
- V(C2,61,61,A3), V(6A,35,35,5F), V(AE,57,57,F9), V(69,B9,B9,D0), \
- V(17,86,86,91), V(99,C1,C1,58), V(3A,1D,1D,27), V(27,9E,9E,B9), \
- V(D9,E1,E1,38), V(EB,F8,F8,13), V(2B,98,98,B3), V(22,11,11,33), \
- V(D2,69,69,BB), V(A9,D9,D9,70), V(07,8E,8E,89), V(33,94,94,A7), \
- V(2D,9B,9B,B6), V(3C,1E,1E,22), V(15,87,87,92), V(C9,E9,E9,20), \
- V(87,CE,CE,49), V(AA,55,55,FF), V(50,28,28,78), V(A5,DF,DF,7A), \
- V(03,8C,8C,8F), V(59,A1,A1,F8), V(09,89,89,80), V(1A,0D,0D,17), \
- V(65,BF,BF,DA), V(D7,E6,E6,31), V(84,42,42,C6), V(D0,68,68,B8), \
- V(82,41,41,C3), V(29,99,99,B0), V(5A,2D,2D,77), V(1E,0F,0F,11), \
- V(7B,B0,B0,CB), V(A8,54,54,FC), V(6D,BB,BB,D6), V(2C,16,16,3A)
-
-#define V(a,b,c,d) 0x##a##b##c##d
-static uint32 FT0[256] = { FT };
-
-#undef V
-
-#define V(a,b,c,d) 0x##d##a##b##c
-static uint32 FT1[256] = { FT };
-
-#undef V
-
-#define V(a,b,c,d) 0x##c##d##a##b
-static uint32 FT2[256] = { FT };
-
-#undef V
-
-#define V(a,b,c,d) 0x##b##c##d##a
-static uint32 FT3[256] = { FT };
-
-#undef V
-
-#undef FT
-
-/* reverse S-box */
-
-static uint32 RSb[256] = {
- 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
- 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
- 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
- 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
- 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
- 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
- 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
- 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
- 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
- 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
- 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
- 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
- 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
- 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
- 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
- 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
- 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
- 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
- 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
- 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
- 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
- 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
- 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
- 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
- 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
- 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
- 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
- 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
- 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
- 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
- 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
- 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
-};
-
-/* reverse table */
-
-#define RT \
-\
- V(51,F4,A7,50), V(7E,41,65,53), V(1A,17,A4,C3), V(3A,27,5E,96), \
- V(3B,AB,6B,CB), V(1F,9D,45,F1), V(AC,FA,58,AB), V(4B,E3,03,93), \
- V(20,30,FA,55), V(AD,76,6D,F6), V(88,CC,76,91), V(F5,02,4C,25), \
- V(4F,E5,D7,FC), V(C5,2A,CB,D7), V(26,35,44,80), V(B5,62,A3,8F), \
- V(DE,B1,5A,49), V(25,BA,1B,67), V(45,EA,0E,98), V(5D,FE,C0,E1), \
- V(C3,2F,75,02), V(81,4C,F0,12), V(8D,46,97,A3), V(6B,D3,F9,C6), \
- V(03,8F,5F,E7), V(15,92,9C,95), V(BF,6D,7A,EB), V(95,52,59,DA), \
- V(D4,BE,83,2D), V(58,74,21,D3), V(49,E0,69,29), V(8E,C9,C8,44), \
- V(75,C2,89,6A), V(F4,8E,79,78), V(99,58,3E,6B), V(27,B9,71,DD), \
- V(BE,E1,4F,B6), V(F0,88,AD,17), V(C9,20,AC,66), V(7D,CE,3A,B4), \
- V(63,DF,4A,18), V(E5,1A,31,82), V(97,51,33,60), V(62,53,7F,45), \
- V(B1,64,77,E0), V(BB,6B,AE,84), V(FE,81,A0,1C), V(F9,08,2B,94), \
- V(70,48,68,58), V(8F,45,FD,19), V(94,DE,6C,87), V(52,7B,F8,B7), \
- V(AB,73,D3,23), V(72,4B,02,E2), V(E3,1F,8F,57), V(66,55,AB,2A), \
- V(B2,EB,28,07), V(2F,B5,C2,03), V(86,C5,7B,9A), V(D3,37,08,A5), \
- V(30,28,87,F2), V(23,BF,A5,B2), V(02,03,6A,BA), V(ED,16,82,5C), \
- V(8A,CF,1C,2B), V(A7,79,B4,92), V(F3,07,F2,F0), V(4E,69,E2,A1), \
- V(65,DA,F4,CD), V(06,05,BE,D5), V(D1,34,62,1F), V(C4,A6,FE,8A), \
- V(34,2E,53,9D), V(A2,F3,55,A0), V(05,8A,E1,32), V(A4,F6,EB,75), \
- V(0B,83,EC,39), V(40,60,EF,AA), V(5E,71,9F,06), V(BD,6E,10,51), \
- V(3E,21,8A,F9), V(96,DD,06,3D), V(DD,3E,05,AE), V(4D,E6,BD,46), \
- V(91,54,8D,B5), V(71,C4,5D,05), V(04,06,D4,6F), V(60,50,15,FF), \
- V(19,98,FB,24), V(D6,BD,E9,97), V(89,40,43,CC), V(67,D9,9E,77), \
- V(B0,E8,42,BD), V(07,89,8B,88), V(E7,19,5B,38), V(79,C8,EE,DB), \
- V(A1,7C,0A,47), V(7C,42,0F,E9), V(F8,84,1E,C9), V(00,00,00,00), \
- V(09,80,86,83), V(32,2B,ED,48), V(1E,11,70,AC), V(6C,5A,72,4E), \
- V(FD,0E,FF,FB), V(0F,85,38,56), V(3D,AE,D5,1E), V(36,2D,39,27), \
- V(0A,0F,D9,64), V(68,5C,A6,21), V(9B,5B,54,D1), V(24,36,2E,3A), \
- V(0C,0A,67,B1), V(93,57,E7,0F), V(B4,EE,96,D2), V(1B,9B,91,9E), \
- V(80,C0,C5,4F), V(61,DC,20,A2), V(5A,77,4B,69), V(1C,12,1A,16), \
- V(E2,93,BA,0A), V(C0,A0,2A,E5), V(3C,22,E0,43), V(12,1B,17,1D), \
- V(0E,09,0D,0B), V(F2,8B,C7,AD), V(2D,B6,A8,B9), V(14,1E,A9,C8), \
- V(57,F1,19,85), V(AF,75,07,4C), V(EE,99,DD,BB), V(A3,7F,60,FD), \
- V(F7,01,26,9F), V(5C,72,F5,BC), V(44,66,3B,C5), V(5B,FB,7E,34), \
- V(8B,43,29,76), V(CB,23,C6,DC), V(B6,ED,FC,68), V(B8,E4,F1,63), \
- V(D7,31,DC,CA), V(42,63,85,10), V(13,97,22,40), V(84,C6,11,20), \
- V(85,4A,24,7D), V(D2,BB,3D,F8), V(AE,F9,32,11), V(C7,29,A1,6D), \
- V(1D,9E,2F,4B), V(DC,B2,30,F3), V(0D,86,52,EC), V(77,C1,E3,D0), \
- V(2B,B3,16,6C), V(A9,70,B9,99), V(11,94,48,FA), V(47,E9,64,22), \
- V(A8,FC,8C,C4), V(A0,F0,3F,1A), V(56,7D,2C,D8), V(22,33,90,EF), \
- V(87,49,4E,C7), V(D9,38,D1,C1), V(8C,CA,A2,FE), V(98,D4,0B,36), \
- V(A6,F5,81,CF), V(A5,7A,DE,28), V(DA,B7,8E,26), V(3F,AD,BF,A4), \
- V(2C,3A,9D,E4), V(50,78,92,0D), V(6A,5F,CC,9B), V(54,7E,46,62), \
- V(F6,8D,13,C2), V(90,D8,B8,E8), V(2E,39,F7,5E), V(82,C3,AF,F5), \
- V(9F,5D,80,BE), V(69,D0,93,7C), V(6F,D5,2D,A9), V(CF,25,12,B3), \
- V(C8,AC,99,3B), V(10,18,7D,A7), V(E8,9C,63,6E), V(DB,3B,BB,7B), \
- V(CD,26,78,09), V(6E,59,18,F4), V(EC,9A,B7,01), V(83,4F,9A,A8), \
- V(E6,95,6E,65), V(AA,FF,E6,7E), V(21,BC,CF,08), V(EF,15,E8,E6), \
- V(BA,E7,9B,D9), V(4A,6F,36,CE), V(EA,9F,09,D4), V(29,B0,7C,D6), \
- V(31,A4,B2,AF), V(2A,3F,23,31), V(C6,A5,94,30), V(35,A2,66,C0), \
- V(74,4E,BC,37), V(FC,82,CA,A6), V(E0,90,D0,B0), V(33,A7,D8,15), \
- V(F1,04,98,4A), V(41,EC,DA,F7), V(7F,CD,50,0E), V(17,91,F6,2F), \
- V(76,4D,D6,8D), V(43,EF,B0,4D), V(CC,AA,4D,54), V(E4,96,04,DF), \
- V(9E,D1,B5,E3), V(4C,6A,88,1B), V(C1,2C,1F,B8), V(46,65,51,7F), \
- V(9D,5E,EA,04), V(01,8C,35,5D), V(FA,87,74,73), V(FB,0B,41,2E), \
- V(B3,67,1D,5A), V(92,DB,D2,52), V(E9,10,56,33), V(6D,D6,47,13), \
- V(9A,D7,61,8C), V(37,A1,0C,7A), V(59,F8,14,8E), V(EB,13,3C,89), \
- V(CE,A9,27,EE), V(B7,61,C9,35), V(E1,1C,E5,ED), V(7A,47,B1,3C), \
- V(9C,D2,DF,59), V(55,F2,73,3F), V(18,14,CE,79), V(73,C7,37,BF), \
- V(53,F7,CD,EA), V(5F,FD,AA,5B), V(DF,3D,6F,14), V(78,44,DB,86), \
- V(CA,AF,F3,81), V(B9,68,C4,3E), V(38,24,34,2C), V(C2,A3,40,5F), \
- V(16,1D,C3,72), V(BC,E2,25,0C), V(28,3C,49,8B), V(FF,0D,95,41), \
- V(39,A8,01,71), V(08,0C,B3,DE), V(D8,B4,E4,9C), V(64,56,C1,90), \
- V(7B,CB,84,61), V(D5,32,B6,70), V(48,6C,5C,74), V(D0,B8,57,42)
-
-#define V(a,b,c,d) 0x##a##b##c##d
-static uint32 RT0[256] = { RT };
-
-#undef V
-
-#define V(a,b,c,d) 0x##d##a##b##c
-static uint32 RT1[256] = { RT };
-
-#undef V
-
-#define V(a,b,c,d) 0x##c##d##a##b
-static uint32 RT2[256] = { RT };
-
-#undef V
-
-#define V(a,b,c,d) 0x##b##c##d##a
-static uint32 RT3[256] = { RT };
-
-#undef V
-
-#undef RT
-
-/* round constants */
-
-static uint32 RCON[10] = {
- 0x01000000, 0x02000000, 0x04000000, 0x08000000,
- 0x10000000, 0x20000000, 0x40000000, 0x80000000,
- 0x1B000000, 0x36000000
-};
-
-/* key schedule tables */
-
-static int KT_init = 1;
-
-static uint32 KT0[256];
-static uint32 KT1[256];
-static uint32 KT2[256];
-static uint32 KT3[256];
-
-/* platform-independent 32-bit integer manipulation macros */
-
-#define GET_UINT32(n,b,i) \
-{ \
- (n) = ( (uint32) (b)[(i) ] << 24 ) \
- | ( (uint32) (b)[(i) + 1] << 16 ) \
- | ( (uint32) (b)[(i) + 2] << 8 ) \
- | ( (uint32) (b)[(i) + 3] ); \
-}
-
-#define PUT_UINT32(n,b,i) \
-{ \
- (b)[(i) ] = (uint8) ( (n) >> 24 ); \
- (b)[(i) + 1] = (uint8) ( (n) >> 16 ); \
- (b)[(i) + 2] = (uint8) ( (n) >> 8 ); \
- (b)[(i) + 3] = (uint8) ( (n) ); \
-}
-
-int rt_aes_set_key(struct aes_context * ctx, uint8 * key, int nbits)
-{
- int i;
- uint32 *RK, *SK;
-
- switch (nbits) {
- case 128:
- ctx->nr = 10;
- break;
- case 192:
- ctx->nr = 12;
- break;
- case 256:
- ctx->nr = 14;
- break;
- default:
- return (1);
- }
-
- RK = (uint32 *) ctx->erk;
-
- for (i = 0; i < (nbits >> 5); i++) {
- GET_UINT32(RK[i], key, i * 4);
- }
-
- /* setup encryption round keys */
-
- switch (nbits) {
- case 128:
-
- for (i = 0; i < 10; i++, RK += 4) {
- RK[4] = RK[0] ^ RCON[i] ^
- (FSb[(uint8) (RK[3] >> 16)] << 24) ^
- (FSb[(uint8) (RK[3] >> 8)] << 16) ^
- (FSb[(uint8) (RK[3])] << 8) ^
- (FSb[(uint8) (RK[3] >> 24)]);
-
- RK[5] = RK[1] ^ RK[4];
- RK[6] = RK[2] ^ RK[5];
- RK[7] = RK[3] ^ RK[6];
- }
- break;
-
- case 192:
-
- for (i = 0; i < 8; i++, RK += 6) {
- RK[6] = RK[0] ^ RCON[i] ^
- (FSb[(uint8) (RK[5] >> 16)] << 24) ^
- (FSb[(uint8) (RK[5] >> 8)] << 16) ^
- (FSb[(uint8) (RK[5])] << 8) ^
- (FSb[(uint8) (RK[5] >> 24)]);
-
- RK[7] = RK[1] ^ RK[6];
- RK[8] = RK[2] ^ RK[7];
- RK[9] = RK[3] ^ RK[8];
- RK[10] = RK[4] ^ RK[9];
- RK[11] = RK[5] ^ RK[10];
- }
- break;
-
- case 256:
-
- for (i = 0; i < 7; i++, RK += 8) {
- RK[8] = RK[0] ^ RCON[i] ^
- (FSb[(uint8) (RK[7] >> 16)] << 24) ^
- (FSb[(uint8) (RK[7] >> 8)] << 16) ^
- (FSb[(uint8) (RK[7])] << 8) ^
- (FSb[(uint8) (RK[7] >> 24)]);
-
- RK[9] = RK[1] ^ RK[8];
- RK[10] = RK[2] ^ RK[9];
- RK[11] = RK[3] ^ RK[10];
-
- RK[12] = RK[4] ^
- (FSb[(uint8) (RK[11] >> 24)] << 24) ^
- (FSb[(uint8) (RK[11] >> 16)] << 16) ^
- (FSb[(uint8) (RK[11] >> 8)] << 8) ^
- (FSb[(uint8) (RK[11])]);
-
- RK[13] = RK[5] ^ RK[12];
- RK[14] = RK[6] ^ RK[13];
- RK[15] = RK[7] ^ RK[14];
- }
- break;
- }
-
- /* setup decryption round keys */
-
- if (KT_init) {
- for (i = 0; i < 256; i++) {
- KT0[i] = RT0[FSb[i]];
- KT1[i] = RT1[FSb[i]];
- KT2[i] = RT2[FSb[i]];
- KT3[i] = RT3[FSb[i]];
- }
-
- KT_init = 0;
- }
-
- SK = (uint32 *) ctx->drk;
-
- *SK++ = *RK++;
- *SK++ = *RK++;
- *SK++ = *RK++;
- *SK++ = *RK++;
-
- for (i = 1; i < ctx->nr; i++) {
- RK -= 8;
-
- *SK++ = KT0[(uint8) (*RK >> 24)] ^
- KT1[(uint8) (*RK >> 16)] ^
- KT2[(uint8) (*RK >> 8)] ^ KT3[(uint8) (*RK)];
- RK++;
-
- *SK++ = KT0[(uint8) (*RK >> 24)] ^
- KT1[(uint8) (*RK >> 16)] ^
- KT2[(uint8) (*RK >> 8)] ^ KT3[(uint8) (*RK)];
- RK++;
-
- *SK++ = KT0[(uint8) (*RK >> 24)] ^
- KT1[(uint8) (*RK >> 16)] ^
- KT2[(uint8) (*RK >> 8)] ^ KT3[(uint8) (*RK)];
- RK++;
-
- *SK++ = KT0[(uint8) (*RK >> 24)] ^
- KT1[(uint8) (*RK >> 16)] ^
- KT2[(uint8) (*RK >> 8)] ^ KT3[(uint8) (*RK)];
- RK++;
- }
-
- RK -= 8;
-
- *SK++ = *RK++;
- *SK++ = *RK++;
- *SK++ = *RK++;
- *SK++ = *RK++;
-
- return (0);
-}
-
-/* AES 128-bit block encryption routine */
-
-void rt_aes_encrypt(struct aes_context * ctx, uint8 input[16], uint8 output[16])
-{
- uint32 *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
-
- RK = (uint32 *) ctx->erk;
- GET_UINT32(X0, input, 0);
- X0 ^= RK[0];
- GET_UINT32(X1, input, 4);
- X1 ^= RK[1];
- GET_UINT32(X2, input, 8);
- X2 ^= RK[2];
- GET_UINT32(X3, input, 12);
- X3 ^= RK[3];
-
-#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
-{ \
- RK += 4; \
- \
- X0 = RK[0] ^ FT0[ (uint8) ( Y0 >> 24 ) ] ^ \
- FT1[ (uint8) ( Y1 >> 16 ) ] ^ \
- FT2[ (uint8) ( Y2 >> 8 ) ] ^ \
- FT3[ (uint8) ( Y3 ) ]; \
- \
- X1 = RK[1] ^ FT0[ (uint8) ( Y1 >> 24 ) ] ^ \
- FT1[ (uint8) ( Y2 >> 16 ) ] ^ \
- FT2[ (uint8) ( Y3 >> 8 ) ] ^ \
- FT3[ (uint8) ( Y0 ) ]; \
- \
- X2 = RK[2] ^ FT0[ (uint8) ( Y2 >> 24 ) ] ^ \
- FT1[ (uint8) ( Y3 >> 16 ) ] ^ \
- FT2[ (uint8) ( Y0 >> 8 ) ] ^ \
- FT3[ (uint8) ( Y1 ) ]; \
- \
- X3 = RK[3] ^ FT0[ (uint8) ( Y3 >> 24 ) ] ^ \
- FT1[ (uint8) ( Y0 >> 16 ) ] ^ \
- FT2[ (uint8) ( Y1 >> 8 ) ] ^ \
- FT3[ (uint8) ( Y2 ) ]; \
-}
-
- AES_FROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 1 */
- AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 2 */
- AES_FROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 3 */
- AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 4 */
- AES_FROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 5 */
- AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 6 */
- AES_FROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 7 */
- AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 8 */
- AES_FROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 9 */
-
- if (ctx->nr > 10) {
- AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 10 */
- AES_FROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 11 */
- }
-
- if (ctx->nr > 12) {
- AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 12 */
- AES_FROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 13 */
- }
-
- /* last round */
-
- RK += 4;
-
- X0 = RK[0] ^ (FSb[(uint8) (Y0 >> 24)] << 24) ^
- (FSb[(uint8) (Y1 >> 16)] << 16) ^
- (FSb[(uint8) (Y2 >> 8)] << 8) ^ (FSb[(uint8) (Y3)]);
-
- X1 = RK[1] ^ (FSb[(uint8) (Y1 >> 24)] << 24) ^
- (FSb[(uint8) (Y2 >> 16)] << 16) ^
- (FSb[(uint8) (Y3 >> 8)] << 8) ^ (FSb[(uint8) (Y0)]);
-
- X2 = RK[2] ^ (FSb[(uint8) (Y2 >> 24)] << 24) ^
- (FSb[(uint8) (Y3 >> 16)] << 16) ^
- (FSb[(uint8) (Y0 >> 8)] << 8) ^ (FSb[(uint8) (Y1)]);
-
- X3 = RK[3] ^ (FSb[(uint8) (Y3 >> 24)] << 24) ^
- (FSb[(uint8) (Y0 >> 16)] << 16) ^
- (FSb[(uint8) (Y1 >> 8)] << 8) ^ (FSb[(uint8) (Y2)]);
-
- PUT_UINT32(X0, output, 0);
- PUT_UINT32(X1, output, 4);
- PUT_UINT32(X2, output, 8);
- PUT_UINT32(X3, output, 12);
-}
-
-/* AES 128-bit block decryption routine */
-
-void rt_aes_decrypt(struct aes_context * ctx, uint8 input[16], uint8 output[16])
-{
- uint32 *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;
-
- RK = (uint32 *) ctx->drk;
-
- GET_UINT32(X0, input, 0);
- X0 ^= RK[0];
- GET_UINT32(X1, input, 4);
- X1 ^= RK[1];
- GET_UINT32(X2, input, 8);
- X2 ^= RK[2];
- GET_UINT32(X3, input, 12);
- X3 ^= RK[3];
-
-#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \
-{ \
- RK += 4; \
- \
- X0 = RK[0] ^ RT0[ (uint8) ( Y0 >> 24 ) ] ^ \
- RT1[ (uint8) ( Y3 >> 16 ) ] ^ \
- RT2[ (uint8) ( Y2 >> 8 ) ] ^ \
- RT3[ (uint8) ( Y1 ) ]; \
- \
- X1 = RK[1] ^ RT0[ (uint8) ( Y1 >> 24 ) ] ^ \
- RT1[ (uint8) ( Y0 >> 16 ) ] ^ \
- RT2[ (uint8) ( Y3 >> 8 ) ] ^ \
- RT3[ (uint8) ( Y2 ) ]; \
- \
- X2 = RK[2] ^ RT0[ (uint8) ( Y2 >> 24 ) ] ^ \
- RT1[ (uint8) ( Y1 >> 16 ) ] ^ \
- RT2[ (uint8) ( Y0 >> 8 ) ] ^ \
- RT3[ (uint8) ( Y3 ) ]; \
- \
- X3 = RK[3] ^ RT0[ (uint8) ( Y3 >> 24 ) ] ^ \
- RT1[ (uint8) ( Y2 >> 16 ) ] ^ \
- RT2[ (uint8) ( Y1 >> 8 ) ] ^ \
- RT3[ (uint8) ( Y0 ) ]; \
-}
-
- AES_RROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 1 */
- AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 2 */
- AES_RROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 3 */
- AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 4 */
- AES_RROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 5 */
- AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 6 */
- AES_RROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 7 */
- AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 8 */
- AES_RROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 9 */
-
- if (ctx->nr > 10) {
- AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 10 */
- AES_RROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 11 */
- }
-
- if (ctx->nr > 12) {
- AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3); /* round 12 */
- AES_RROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3); /* round 13 */
- }
-
- /* last round */
-
- RK += 4;
-
- X0 = RK[0] ^ (RSb[(uint8) (Y0 >> 24)] << 24) ^
- (RSb[(uint8) (Y3 >> 16)] << 16) ^
- (RSb[(uint8) (Y2 >> 8)] << 8) ^ (RSb[(uint8) (Y1)]);
-
- X1 = RK[1] ^ (RSb[(uint8) (Y1 >> 24)] << 24) ^
- (RSb[(uint8) (Y0 >> 16)] << 16) ^
- (RSb[(uint8) (Y3 >> 8)] << 8) ^ (RSb[(uint8) (Y2)]);
-
- X2 = RK[2] ^ (RSb[(uint8) (Y2 >> 24)] << 24) ^
- (RSb[(uint8) (Y1 >> 16)] << 16) ^
- (RSb[(uint8) (Y0 >> 8)] << 8) ^ (RSb[(uint8) (Y3)]);
-
- X3 = RK[3] ^ (RSb[(uint8) (Y3 >> 24)] << 24) ^
- (RSb[(uint8) (Y2 >> 16)] << 16) ^
- (RSb[(uint8) (Y1 >> 8)] << 8) ^ (RSb[(uint8) (Y0)]);
-
- PUT_UINT32(X0, output, 0);
- PUT_UINT32(X1, output, 4);
- PUT_UINT32(X2, output, 8);
- PUT_UINT32(X3, output, 12);
-}
-
-/*
- ==========================================================================
- Description:
- ENCRYPT AES GTK before sending in EAPOL frame.
- AES GTK length = 128 bit, so fix blocks for aes-key-wrap as 2 in this function.
- This function references to RFC 3394 for aes key wrap algorithm.
- Return:
- ==========================================================================
-*/
-void AES_GTK_KEY_WRAP(u8 * key,
- u8 * plaintext,
- u32 p_len, u8 * ciphertext)
-{
- u8 A[8], BIN[16], BOUT[16];
- u8 R[512];
- int num_blocks = p_len / 8; /* unit:64bits */
- int i, j;
- struct aes_context aesctx;
- u8 xor;
-
- rt_aes_set_key(&aesctx, key, 128);
-
- /* Init IA */
- for (i = 0; i < 8; i++)
- A[i] = 0xa6;
-
- /*Input plaintext */
- for (i = 0; i < num_blocks; i++) {
- for (j = 0; j < 8; j++)
- R[8 * (i + 1) + j] = plaintext[8 * i + j];
- }
-
- /* Key Mix */
- for (j = 0; j < 6; j++) {
- for (i = 1; i <= num_blocks; i++) {
- /*phase 1 */
- NdisMoveMemory(BIN, A, 8);
- NdisMoveMemory(&BIN[8], &R[8 * i], 8);
- rt_aes_encrypt(&aesctx, BIN, BOUT);
-
- NdisMoveMemory(A, &BOUT[0], 8);
- xor = num_blocks * j + i;
- A[7] = BOUT[7] ^ xor;
- NdisMoveMemory(&R[8 * i], &BOUT[8], 8);
- }
- }
-
- /* Output ciphertext */
- NdisMoveMemory(ciphertext, A, 8);
-
- for (i = 1; i <= num_blocks; i++) {
- for (j = 0; j < 8; j++)
- ciphertext[8 * i + j] = R[8 * i + j];
- }
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Misc function to decrypt AES body
-
- Arguments:
-
- Return Value:
-
- Note:
- This function references to RFC 3394 for aes key unwrap algorithm.
-
- ========================================================================
-*/
-void AES_GTK_KEY_UNWRAP(u8 * key,
- u8 * plaintext,
- u32 c_len, u8 * ciphertext)
-{
- u8 A[8], BIN[16], BOUT[16];
- u8 xor;
- int i, j;
- struct aes_context aesctx;
- u8 *R;
- int num_blocks = c_len / 8; /* unit:64bits */
-
- os_alloc_mem(NULL, (u8 **) & R, 512);
-
- if (R == NULL) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("AES_GTK_KEY_UNWRAP: no memory!\n"));
- return;
- }
- /* End of if */
- /* Initialize */
- NdisMoveMemory(A, ciphertext, 8);
- /*Input plaintext */
- for (i = 0; i < (c_len - 8); i++) {
- R[i] = ciphertext[i + 8];
- }
-
- rt_aes_set_key(&aesctx, key, 128);
-
- for (j = 5; j >= 0; j--) {
- for (i = (num_blocks - 1); i > 0; i--) {
- xor = (num_blocks - 1) * j + i;
- NdisMoveMemory(BIN, A, 8);
- BIN[7] = A[7] ^ xor;
- NdisMoveMemory(&BIN[8], &R[(i - 1) * 8], 8);
- rt_aes_decrypt(&aesctx, BIN, BOUT);
- NdisMoveMemory(A, &BOUT[0], 8);
- NdisMoveMemory(&R[(i - 1) * 8], &BOUT[8], 8);
- }
- }
-
- /* OUTPUT */
- for (i = 0; i < c_len; i++) {
- plaintext[i] = R[i];
- }
-
- os_free_mem(NULL, R);
-}
diff --git a/drivers/staging/rt2860/common/cmm_asic.c b/drivers/staging/rt2860/common/cmm_asic.c
deleted file mode 100644
index 4d77e83eb418..000000000000
--- a/drivers/staging/rt2860/common/cmm_asic.c
+++ /dev/null
@@ -1,2565 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-
- Module Name:
- cmm_asic.c
-
- Abstract:
- Functions used to communicate with ASIC
-
- Revision History:
- Who When What
- -------- ---------- ----------------------------------------------
-*/
-
-#include "../rt_config.h"
-
-/* Reset the RFIC setting to new series */
-struct rt_rtmp_rf_regs RF2850RegTable[] = {
-/* ch R1 R2 R3(TX0~4=0) R4 */
- {1, 0x98402ecc, 0x984c0786, 0x9816b455, 0x9800510b}
- ,
- {2, 0x98402ecc, 0x984c0786, 0x98168a55, 0x9800519f}
- ,
- {3, 0x98402ecc, 0x984c078a, 0x98168a55, 0x9800518b}
- ,
- {4, 0x98402ecc, 0x984c078a, 0x98168a55, 0x9800519f}
- ,
- {5, 0x98402ecc, 0x984c078e, 0x98168a55, 0x9800518b}
- ,
- {6, 0x98402ecc, 0x984c078e, 0x98168a55, 0x9800519f}
- ,
- {7, 0x98402ecc, 0x984c0792, 0x98168a55, 0x9800518b}
- ,
- {8, 0x98402ecc, 0x984c0792, 0x98168a55, 0x9800519f}
- ,
- {9, 0x98402ecc, 0x984c0796, 0x98168a55, 0x9800518b}
- ,
- {10, 0x98402ecc, 0x984c0796, 0x98168a55, 0x9800519f}
- ,
- {11, 0x98402ecc, 0x984c079a, 0x98168a55, 0x9800518b}
- ,
- {12, 0x98402ecc, 0x984c079a, 0x98168a55, 0x9800519f}
- ,
- {13, 0x98402ecc, 0x984c079e, 0x98168a55, 0x9800518b}
- ,
- {14, 0x98402ecc, 0x984c07a2, 0x98168a55, 0x98005193}
- ,
-
- /* 802.11 UNI / HyperLan 2 */
- {36, 0x98402ecc, 0x984c099a, 0x98158a55, 0x980ed1a3}
- ,
- {38, 0x98402ecc, 0x984c099e, 0x98158a55, 0x980ed193}
- ,
- {40, 0x98402ec8, 0x984c0682, 0x98158a55, 0x980ed183}
- ,
- {44, 0x98402ec8, 0x984c0682, 0x98158a55, 0x980ed1a3}
- ,
- {46, 0x98402ec8, 0x984c0686, 0x98158a55, 0x980ed18b}
- ,
- {48, 0x98402ec8, 0x984c0686, 0x98158a55, 0x980ed19b}
- ,
- {52, 0x98402ec8, 0x984c068a, 0x98158a55, 0x980ed193}
- ,
- {54, 0x98402ec8, 0x984c068a, 0x98158a55, 0x980ed1a3}
- ,
- {56, 0x98402ec8, 0x984c068e, 0x98158a55, 0x980ed18b}
- ,
- {60, 0x98402ec8, 0x984c0692, 0x98158a55, 0x980ed183}
- ,
- {62, 0x98402ec8, 0x984c0692, 0x98158a55, 0x980ed193}
- ,
- {64, 0x98402ec8, 0x984c0692, 0x98158a55, 0x980ed1a3}
- , /* Plugfest#4, Day4, change RFR3 left4th 9->5. */
-
- /* 802.11 HyperLan 2 */
- {100, 0x98402ec8, 0x984c06b2, 0x98178a55, 0x980ed783}
- ,
-
- /* 2008.04.30 modified */
- /* The system team has AN to improve the EVM value */
- /* for channel 102 to 108 for the RT2850/RT2750 dual band solution. */
- {102, 0x98402ec8, 0x985c06b2, 0x98578a55, 0x980ed793}
- ,
- {104, 0x98402ec8, 0x985c06b2, 0x98578a55, 0x980ed1a3}
- ,
- {108, 0x98402ecc, 0x985c0a32, 0x98578a55, 0x980ed193}
- ,
-
- {110, 0x98402ecc, 0x984c0a36, 0x98178a55, 0x980ed183}
- ,
- {112, 0x98402ecc, 0x984c0a36, 0x98178a55, 0x980ed19b}
- ,
- {116, 0x98402ecc, 0x984c0a3a, 0x98178a55, 0x980ed1a3}
- ,
- {118, 0x98402ecc, 0x984c0a3e, 0x98178a55, 0x980ed193}
- ,
- {120, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed183}
- ,
- {124, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed193}
- ,
- {126, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed15b}
- , /* 0x980ed1bb->0x980ed15b required by Rory 20070927 */
- {128, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed1a3}
- ,
- {132, 0x98402ec4, 0x984c0386, 0x98178a55, 0x980ed18b}
- ,
- {134, 0x98402ec4, 0x984c0386, 0x98178a55, 0x980ed193}
- ,
- {136, 0x98402ec4, 0x984c0386, 0x98178a55, 0x980ed19b}
- ,
- {140, 0x98402ec4, 0x984c038a, 0x98178a55, 0x980ed183}
- ,
-
- /* 802.11 UNII */
- {149, 0x98402ec4, 0x984c038a, 0x98178a55, 0x980ed1a7}
- ,
- {151, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed187}
- ,
- {153, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed18f}
- ,
- {157, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed19f}
- ,
- {159, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed1a7}
- ,
- {161, 0x98402ec4, 0x984c0392, 0x98178a55, 0x980ed187}
- ,
- {165, 0x98402ec4, 0x984c0392, 0x98178a55, 0x980ed197}
- ,
- {167, 0x98402ec4, 0x984c03d2, 0x98179855, 0x9815531f}
- ,
- {169, 0x98402ec4, 0x984c03d2, 0x98179855, 0x98155327}
- ,
- {171, 0x98402ec4, 0x984c03d6, 0x98179855, 0x98155307}
- ,
- {173, 0x98402ec4, 0x984c03d6, 0x98179855, 0x9815530f}
- ,
-
- /* Japan */
- {184, 0x95002ccc, 0x9500491e, 0x9509be55, 0x950c0a0b}
- ,
- {188, 0x95002ccc, 0x95004922, 0x9509be55, 0x950c0a13}
- ,
- {192, 0x95002ccc, 0x95004926, 0x9509be55, 0x950c0a1b}
- ,
- {196, 0x95002ccc, 0x9500492a, 0x9509be55, 0x950c0a23}
- ,
- {208, 0x95002ccc, 0x9500493a, 0x9509be55, 0x950c0a13}
- ,
- {212, 0x95002ccc, 0x9500493e, 0x9509be55, 0x950c0a1b}
- ,
- {216, 0x95002ccc, 0x95004982, 0x9509be55, 0x950c0a23}
- ,
-
- /* still lack of MMAC(Japan) ch 34,38,42,46 */
-};
-
-u8 NUM_OF_2850_CHNL = (sizeof(RF2850RegTable) / sizeof(struct rt_rtmp_rf_regs));
-
-struct rt_frequency_item FreqItems3020[] = {
- /**************************************************/
- /* ISM : 2.4 to 2.483 GHz // */
- /**************************************************/
- /* 11g */
- /**************************************************/
- /*-CH---N-------R---K----------- */
- {1, 241, 2, 2}
- ,
- {2, 241, 2, 7}
- ,
- {3, 242, 2, 2}
- ,
- {4, 242, 2, 7}
- ,
- {5, 243, 2, 2}
- ,
- {6, 243, 2, 7}
- ,
- {7, 244, 2, 2}
- ,
- {8, 244, 2, 7}
- ,
- {9, 245, 2, 2}
- ,
- {10, 245, 2, 7}
- ,
- {11, 246, 2, 2}
- ,
- {12, 246, 2, 7}
- ,
- {13, 247, 2, 2}
- ,
- {14, 248, 2, 4}
- ,
-};
-
-u8 NUM_OF_3020_CHNL = (sizeof(FreqItems3020) / sizeof(struct rt_frequency_item));
-
-void AsicUpdateAutoFallBackTable(struct rt_rtmp_adapter *pAd, u8 *pRateTable)
-{
- u8 i;
- HT_FBK_CFG0_STRUC HtCfg0;
- HT_FBK_CFG1_STRUC HtCfg1;
- LG_FBK_CFG0_STRUC LgCfg0;
- LG_FBK_CFG1_STRUC LgCfg1;
- struct rt_rtmp_tx_rate_switch *pCurrTxRate, *pNextTxRate;
-
- /* set to initial value */
- HtCfg0.word = 0x65432100;
- HtCfg1.word = 0xedcba988;
- LgCfg0.word = 0xedcba988;
- LgCfg1.word = 0x00002100;
-
- pNextTxRate = (struct rt_rtmp_tx_rate_switch *) pRateTable + 1;
- for (i = 1; i < *((u8 *)pRateTable); i++) {
- pCurrTxRate = (struct rt_rtmp_tx_rate_switch *) pRateTable + 1 + i;
- switch (pCurrTxRate->Mode) {
- case 0: /*CCK */
- break;
- case 1: /*OFDM */
- {
- switch (pCurrTxRate->CurrMCS) {
- case 0:
- LgCfg0.field.OFDMMCS0FBK =
- (pNextTxRate->Mode ==
- MODE_OFDM) ? (pNextTxRate->
- CurrMCS +
- 8) : pNextTxRate->
- CurrMCS;
- break;
- case 1:
- LgCfg0.field.OFDMMCS1FBK =
- (pNextTxRate->Mode ==
- MODE_OFDM) ? (pNextTxRate->
- CurrMCS +
- 8) : pNextTxRate->
- CurrMCS;
- break;
- case 2:
- LgCfg0.field.OFDMMCS2FBK =
- (pNextTxRate->Mode ==
- MODE_OFDM) ? (pNextTxRate->
- CurrMCS +
- 8) : pNextTxRate->
- CurrMCS;
- break;
- case 3:
- LgCfg0.field.OFDMMCS3FBK =
- (pNextTxRate->Mode ==
- MODE_OFDM) ? (pNextTxRate->
- CurrMCS +
- 8) : pNextTxRate->
- CurrMCS;
- break;
- case 4:
- LgCfg0.field.OFDMMCS4FBK =
- (pNextTxRate->Mode ==
- MODE_OFDM) ? (pNextTxRate->
- CurrMCS +
- 8) : pNextTxRate->
- CurrMCS;
- break;
- case 5:
- LgCfg0.field.OFDMMCS5FBK =
- (pNextTxRate->Mode ==
- MODE_OFDM) ? (pNextTxRate->
- CurrMCS +
- 8) : pNextTxRate->
- CurrMCS;
- break;
- case 6:
- LgCfg0.field.OFDMMCS6FBK =
- (pNextTxRate->Mode ==
- MODE_OFDM) ? (pNextTxRate->
- CurrMCS +
- 8) : pNextTxRate->
- CurrMCS;
- break;
- case 7:
- LgCfg0.field.OFDMMCS7FBK =
- (pNextTxRate->Mode ==
- MODE_OFDM) ? (pNextTxRate->
- CurrMCS +
- 8) : pNextTxRate->
- CurrMCS;
- break;
- }
- }
- break;
- case 2: /*HT-MIX */
- case 3: /*HT-GF */
- {
- if ((pNextTxRate->Mode >= MODE_HTMIX)
- && (pCurrTxRate->CurrMCS !=
- pNextTxRate->CurrMCS)) {
- switch (pCurrTxRate->CurrMCS) {
- case 0:
- HtCfg0.field.HTMCS0FBK =
- pNextTxRate->CurrMCS;
- break;
- case 1:
- HtCfg0.field.HTMCS1FBK =
- pNextTxRate->CurrMCS;
- break;
- case 2:
- HtCfg0.field.HTMCS2FBK =
- pNextTxRate->CurrMCS;
- break;
- case 3:
- HtCfg0.field.HTMCS3FBK =
- pNextTxRate->CurrMCS;
- break;
- case 4:
- HtCfg0.field.HTMCS4FBK =
- pNextTxRate->CurrMCS;
- break;
- case 5:
- HtCfg0.field.HTMCS5FBK =
- pNextTxRate->CurrMCS;
- break;
- case 6:
- HtCfg0.field.HTMCS6FBK =
- pNextTxRate->CurrMCS;
- break;
- case 7:
- HtCfg0.field.HTMCS7FBK =
- pNextTxRate->CurrMCS;
- break;
- case 8:
- HtCfg1.field.HTMCS8FBK =
- pNextTxRate->CurrMCS;
- break;
- case 9:
- HtCfg1.field.HTMCS9FBK =
- pNextTxRate->CurrMCS;
- break;
- case 10:
- HtCfg1.field.HTMCS10FBK =
- pNextTxRate->CurrMCS;
- break;
- case 11:
- HtCfg1.field.HTMCS11FBK =
- pNextTxRate->CurrMCS;
- break;
- case 12:
- HtCfg1.field.HTMCS12FBK =
- pNextTxRate->CurrMCS;
- break;
- case 13:
- HtCfg1.field.HTMCS13FBK =
- pNextTxRate->CurrMCS;
- break;
- case 14:
- HtCfg1.field.HTMCS14FBK =
- pNextTxRate->CurrMCS;
- break;
- case 15:
- HtCfg1.field.HTMCS15FBK =
- pNextTxRate->CurrMCS;
- break;
- default:
- DBGPRINT(RT_DEBUG_ERROR,
- ("AsicUpdateAutoFallBackTable: not support CurrMCS=%d\n",
- pCurrTxRate->
- CurrMCS));
- }
- }
- }
- break;
- }
-
- pNextTxRate = pCurrTxRate;
- }
-
- RTMP_IO_WRITE32(pAd, HT_FBK_CFG0, HtCfg0.word);
- RTMP_IO_WRITE32(pAd, HT_FBK_CFG1, HtCfg1.word);
- RTMP_IO_WRITE32(pAd, LG_FBK_CFG0, LgCfg0.word);
- RTMP_IO_WRITE32(pAd, LG_FBK_CFG1, LgCfg1.word);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Set MAC register value according operation mode.
- OperationMode AND bNonGFExist are for MM and GF Proteciton.
- If MM or GF mask is not set, those passing argument doesn't not take effect.
-
- Operation mode meaning:
- = 0 : Pure HT, no preotection.
- = 0x01; there may be non-HT devices in both the control and extension channel, protection is optional in BSS.
- = 0x10: No Transmission in 40M is protected.
- = 0x11: Transmission in both 40M and 20M shall be protected
- if (bNonGFExist)
- we should choose not to use GF. But still set correct ASIC registers.
- ========================================================================
-*/
-void AsicUpdateProtect(struct rt_rtmp_adapter *pAd,
- u16 OperationMode,
- u8 SetMask,
- IN BOOLEAN bDisableBGProtect, IN BOOLEAN bNonGFExist)
-{
- PROT_CFG_STRUC ProtCfg, ProtCfg4;
- u32 Protect[6];
- u16 offset;
- u8 i;
- u32 MacReg = 0;
-
- if (!(pAd->CommonCfg.bHTProtect) && (OperationMode != 8)) {
- return;
- }
-
- if (pAd->BATable.numDoneOriginator) {
- /* */
- /* enable the RTS/CTS to avoid channel collision */
- /* */
- SetMask = ALLN_SETPROTECT;
- OperationMode = 8;
- }
- /* Config ASIC RTS threshold register */
- RTMP_IO_READ32(pAd, TX_RTS_CFG, &MacReg);
- MacReg &= 0xFF0000FF;
- /* If the user want disable RtsThreshold and enable Amsdu/Ralink-Aggregation, set the RtsThreshold as 4096 */
- if (((pAd->CommonCfg.BACapability.field.AmsduEnable) ||
- (pAd->CommonCfg.bAggregationCapable == TRUE))
- && pAd->CommonCfg.RtsThreshold == MAX_RTS_THRESHOLD) {
- MacReg |= (0x1000 << 8);
- } else {
- MacReg |= (pAd->CommonCfg.RtsThreshold << 8);
- }
-
- RTMP_IO_WRITE32(pAd, TX_RTS_CFG, MacReg);
-
- /* Initial common protection settings */
- RTMPZeroMemory(Protect, sizeof(Protect));
- ProtCfg4.word = 0;
- ProtCfg.word = 0;
- ProtCfg.field.TxopAllowGF40 = 1;
- ProtCfg.field.TxopAllowGF20 = 1;
- ProtCfg.field.TxopAllowMM40 = 1;
- ProtCfg.field.TxopAllowMM20 = 1;
- ProtCfg.field.TxopAllowOfdm = 1;
- ProtCfg.field.TxopAllowCck = 1;
- ProtCfg.field.RTSThEn = 1;
- ProtCfg.field.ProtectNav = ASIC_SHORTNAV;
-
- /* update PHY mode and rate */
- if (pAd->CommonCfg.Channel > 14)
- ProtCfg.field.ProtectRate = 0x4000;
- ProtCfg.field.ProtectRate |= pAd->CommonCfg.RtsRate;
-
- /* Handle legacy(B/G) protection */
- if (bDisableBGProtect) {
- /*ProtCfg.field.ProtectRate = pAd->CommonCfg.RtsRate; */
- ProtCfg.field.ProtectCtrl = 0;
- Protect[0] = ProtCfg.word;
- Protect[1] = ProtCfg.word;
- pAd->FlgCtsEnabled = 0; /* CTS-self is not used */
- } else {
- /*ProtCfg.field.ProtectRate = pAd->CommonCfg.RtsRate; */
- ProtCfg.field.ProtectCtrl = 0; /* CCK do not need to be protected */
- Protect[0] = ProtCfg.word;
- ProtCfg.field.ProtectCtrl = ASIC_CTS; /* OFDM needs using CCK to protect */
- Protect[1] = ProtCfg.word;
- pAd->FlgCtsEnabled = 1; /* CTS-self is used */
- }
-
- /* Decide HT frame protection. */
- if ((SetMask & ALLN_SETPROTECT) != 0) {
- switch (OperationMode) {
- case 0x0:
- /* NO PROTECT */
- /* 1.All STAs in the BSS are 20/40 MHz HT */
- /* 2. in ai 20/40MHz BSS */
- /* 3. all STAs are 20MHz in a 20MHz BSS */
- /* Pure HT. no protection. */
-
- /* MM20_PROT_CFG */
- /* Reserved (31:27) */
- /* PROT_TXOP(25:20) -- 010111 */
- /* PROT_NAV(19:18) -- 01 (Short NAV protection) */
- /* PROT_CTRL(17:16) -- 00 (None) */
- /* PROT_RATE(15:0) -- 0x4004 (OFDM 24M) */
- Protect[2] = 0x01744004;
-
- /* MM40_PROT_CFG */
- /* Reserved (31:27) */
- /* PROT_TXOP(25:20) -- 111111 */
- /* PROT_NAV(19:18) -- 01 (Short NAV protection) */
- /* PROT_CTRL(17:16) -- 00 (None) */
- /* PROT_RATE(15:0) -- 0x4084 (duplicate OFDM 24M) */
- Protect[3] = 0x03f44084;
-
- /* CF20_PROT_CFG */
- /* Reserved (31:27) */
- /* PROT_TXOP(25:20) -- 010111 */
- /* PROT_NAV(19:18) -- 01 (Short NAV protection) */
- /* PROT_CTRL(17:16) -- 00 (None) */
- /* PROT_RATE(15:0) -- 0x4004 (OFDM 24M) */
- Protect[4] = 0x01744004;
-
- /* CF40_PROT_CFG */
- /* Reserved (31:27) */
- /* PROT_TXOP(25:20) -- 111111 */
- /* PROT_NAV(19:18) -- 01 (Short NAV protection) */
- /* PROT_CTRL(17:16) -- 00 (None) */
- /* PROT_RATE(15:0) -- 0x4084 (duplicate OFDM 24M) */
- Protect[5] = 0x03f44084;
-
- if (bNonGFExist) {
- /* PROT_NAV(19:18) -- 01 (Short NAV protectiion) */
- /* PROT_CTRL(17:16) -- 01 (RTS/CTS) */
- Protect[4] = 0x01754004;
- Protect[5] = 0x03f54084;
- }
- pAd->CommonCfg.IOTestParm.bRTSLongProtOn = FALSE;
- break;
-
- case 1:
- /* This is "HT non-member protection mode." */
- /* If there may be non-HT STAs my BSS */
- ProtCfg.word = 0x01744004; /* PROT_CTRL(17:16) : 0 (None) */
- ProtCfg4.word = 0x03f44084; /* duplicaet legacy 24M. BW set 1. */
- if (OPSTATUS_TEST_FLAG
- (pAd, fOP_STATUS_BG_PROTECTION_INUSED)) {
- ProtCfg.word = 0x01740003; /*ERP use Protection bit is set, use protection rate at Clause 18.. */
- ProtCfg4.word = 0x03f40003; /* Don't duplicate RTS/CTS in CCK mode. 0x03f40083; */
- }
- /*Assign Protection method for 20&40 MHz packets */
- ProtCfg.field.ProtectCtrl = ASIC_RTS;
- ProtCfg.field.ProtectNav = ASIC_SHORTNAV;
- ProtCfg4.field.ProtectCtrl = ASIC_RTS;
- ProtCfg4.field.ProtectNav = ASIC_SHORTNAV;
- Protect[2] = ProtCfg.word;
- Protect[3] = ProtCfg4.word;
- Protect[4] = ProtCfg.word;
- Protect[5] = ProtCfg4.word;
- pAd->CommonCfg.IOTestParm.bRTSLongProtOn = TRUE;
- break;
-
- case 2:
- /* If only HT STAs are in BSS. at least one is 20MHz. Only protect 40MHz packets */
- ProtCfg.word = 0x01744004; /* PROT_CTRL(17:16) : 0 (None) */
- ProtCfg4.word = 0x03f44084; /* duplicaet legacy 24M. BW set 1. */
-
- /*Assign Protection method for 40MHz packets */
- ProtCfg4.field.ProtectCtrl = ASIC_RTS;
- ProtCfg4.field.ProtectNav = ASIC_SHORTNAV;
- Protect[2] = ProtCfg.word;
- Protect[3] = ProtCfg4.word;
- if (bNonGFExist) {
- ProtCfg.field.ProtectCtrl = ASIC_RTS;
- ProtCfg.field.ProtectNav = ASIC_SHORTNAV;
- }
- Protect[4] = ProtCfg.word;
- Protect[5] = ProtCfg4.word;
-
- pAd->CommonCfg.IOTestParm.bRTSLongProtOn = FALSE;
- break;
-
- case 3:
- /* HT mixed mode. PROTECT ALL! */
- /* Assign Rate */
- ProtCfg.word = 0x01744004; /*duplicaet legacy 24M. BW set 1. */
- ProtCfg4.word = 0x03f44084;
- /* both 20MHz and 40MHz are protected. Whether use RTS or CTS-to-self depends on the */
- if (OPSTATUS_TEST_FLAG
- (pAd, fOP_STATUS_BG_PROTECTION_INUSED)) {
- ProtCfg.word = 0x01740003; /*ERP use Protection bit is set, use protection rate at Clause 18.. */
- ProtCfg4.word = 0x03f40003; /* Don't duplicate RTS/CTS in CCK mode. 0x03f40083 */
- }
- /*Assign Protection method for 20&40 MHz packets */
- ProtCfg.field.ProtectCtrl = ASIC_RTS;
- ProtCfg.field.ProtectNav = ASIC_SHORTNAV;
- ProtCfg4.field.ProtectCtrl = ASIC_RTS;
- ProtCfg4.field.ProtectNav = ASIC_SHORTNAV;
- Protect[2] = ProtCfg.word;
- Protect[3] = ProtCfg4.word;
- Protect[4] = ProtCfg.word;
- Protect[5] = ProtCfg4.word;
- pAd->CommonCfg.IOTestParm.bRTSLongProtOn = TRUE;
- break;
-
- case 8:
- /* Special on for Atheros problem n chip. */
- Protect[2] = 0x01754004;
- Protect[3] = 0x03f54084;
- Protect[4] = 0x01754004;
- Protect[5] = 0x03f54084;
- pAd->CommonCfg.IOTestParm.bRTSLongProtOn = TRUE;
- break;
- }
- }
-
- offset = CCK_PROT_CFG;
- for (i = 0; i < 6; i++) {
- if ((SetMask & (1 << i))) {
- RTMP_IO_WRITE32(pAd, offset + i * 4, Protect[i]);
- }
- }
-}
-
-/*
- ==========================================================================
- Description:
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-void AsicSwitchChannel(struct rt_rtmp_adapter *pAd, u8 Channel, IN BOOLEAN bScan)
-{
- unsigned long R2 = 0, R3 = DEFAULT_RF_TX_POWER, R4 = 0;
- char TxPwer = 0, TxPwer2 = DEFAULT_RF_TX_POWER; /*Bbp94 = BBPR94_DEFAULT, TxPwer2 = DEFAULT_RF_TX_POWER; */
- u8 index;
- u32 Value = 0; /*BbpReg, Value; */
- struct rt_rtmp_rf_regs *RFRegTable;
- u8 RFValue;
-
- RFValue = 0;
- /* Search Tx power value */
- /* We can't use ChannelList to search channel, since some central channl's txpowr doesn't list */
- /* in ChannelList, so use TxPower array instead. */
- /* */
- for (index = 0; index < MAX_NUM_OF_CHANNELS; index++) {
- if (Channel == pAd->TxPower[index].Channel) {
- TxPwer = pAd->TxPower[index].Power;
- TxPwer2 = pAd->TxPower[index].Power2;
- break;
- }
- }
-
- if (index == MAX_NUM_OF_CHANNELS) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("AsicSwitchChannel: Can't find the Channel#%d \n",
- Channel));
- }
-#ifdef RT30xx
- /* The RF programming sequence is difference between 3xxx and 2xxx */
- if ((IS_RT3070(pAd) || IS_RT3090(pAd) || IS_RT3390(pAd))
- && ((pAd->RfIcType == RFIC_3020) || (pAd->RfIcType == RFIC_2020)
- || (pAd->RfIcType == RFIC_3021)
- || (pAd->RfIcType == RFIC_3022))) {
- /* modify by WY for Read RF Reg. error */
-
- for (index = 0; index < NUM_OF_3020_CHNL; index++) {
- if (Channel == FreqItems3020[index].Channel) {
- /* Programming channel parameters */
- RT30xxWriteRFRegister(pAd, RF_R02,
- FreqItems3020[index].N);
- RT30xxWriteRFRegister(pAd, RF_R03,
- FreqItems3020[index].K);
- RT30xxReadRFRegister(pAd, RF_R06, &RFValue);
- RFValue =
- (RFValue & 0xFC) | FreqItems3020[index].R;
- RT30xxWriteRFRegister(pAd, RF_R06, RFValue);
-
- /* Set Tx0 Power */
- RT30xxReadRFRegister(pAd, RF_R12, &RFValue);
- RFValue = (RFValue & 0xE0) | TxPwer;
- RT30xxWriteRFRegister(pAd, RF_R12, RFValue);
-
- /* Set Tx1 Power */
- RT30xxReadRFRegister(pAd, RF_R13, &RFValue);
- RFValue = (RFValue & 0xE0) | TxPwer2;
- RT30xxWriteRFRegister(pAd, RF_R13, RFValue);
-
- /* Tx/Rx Stream setting */
- RT30xxReadRFRegister(pAd, RF_R01, &RFValue);
- /*if (IS_RT3090(pAd)) */
- /* RFValue |= 0x01; // Enable RF block. */
- RFValue &= 0x03; /*clear bit[7~2] */
- if (pAd->Antenna.field.TxPath == 1)
- RFValue |= 0xA0;
- else if (pAd->Antenna.field.TxPath == 2)
- RFValue |= 0x80;
- if (pAd->Antenna.field.RxPath == 1)
- RFValue |= 0x50;
- else if (pAd->Antenna.field.RxPath == 2)
- RFValue |= 0x40;
- RT30xxWriteRFRegister(pAd, RF_R01, RFValue);
-
- /* Set RF offset */
- RT30xxReadRFRegister(pAd, RF_R23, &RFValue);
- RFValue = (RFValue & 0x80) | pAd->RfFreqOffset;
- RT30xxWriteRFRegister(pAd, RF_R23, RFValue);
-
- /* Set BW */
- if (!bScan
- && (pAd->CommonCfg.BBPCurrentBW == BW_40)) {
- RFValue = pAd->Mlme.CaliBW40RfR24;
- /*DISABLE_11N_CHECK(pAd); */
- } else {
- RFValue = pAd->Mlme.CaliBW20RfR24;
- }
- RT30xxWriteRFRegister(pAd, RF_R24, RFValue);
- RT30xxWriteRFRegister(pAd, RF_R31, RFValue);
-
- /* Enable RF tuning */
- RT30xxReadRFRegister(pAd, RF_R07, &RFValue);
- RFValue = RFValue | 0x1;
- RT30xxWriteRFRegister(pAd, RF_R07, RFValue);
-
- /* latch channel for future usage. */
- pAd->LatchRfRegs.Channel = Channel;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("SwitchChannel#%d(RF=%d, Pwr0=%d, Pwr1=%d, %dT), N=0x%02X, K=0x%02X, R=0x%02X\n",
- Channel, pAd->RfIcType, TxPwer,
- TxPwer2, pAd->Antenna.field.TxPath,
- FreqItems3020[index].N,
- FreqItems3020[index].K,
- FreqItems3020[index].R));
-
- break;
- }
- }
- } else
-#endif /* RT30xx // */
- {
- RFRegTable = RF2850RegTable;
- switch (pAd->RfIcType) {
- case RFIC_2820:
- case RFIC_2850:
- case RFIC_2720:
- case RFIC_2750:
-
- for (index = 0; index < NUM_OF_2850_CHNL; index++) {
- if (Channel == RFRegTable[index].Channel) {
- R2 = RFRegTable[index].R2;
- if (pAd->Antenna.field.TxPath == 1) {
- R2 |= 0x4000; /* If TXpath is 1, bit 14 = 1; */
- }
-
- if (pAd->Antenna.field.RxPath == 2) {
- R2 |= 0x40; /* write 1 to off Rxpath. */
- } else if (pAd->Antenna.field.RxPath ==
- 1) {
- R2 |= 0x20040; /* write 1 to off RxPath */
- }
-
- if (Channel > 14) {
- /* initialize R3, R4 */
- R3 = (RFRegTable[index].
- R3 & 0xffffc1ff);
- R4 = (RFRegTable[index].
- R4 & (~0x001f87c0)) |
- (pAd->RfFreqOffset << 15);
-
- /* 5G band power range: 0xF9~0X0F, TX0 Reg3 bit9/TX1 Reg4 bit6="0" means the TX power reduce 7dB */
- /* R3 */
- if ((TxPwer >= -7)
- && (TxPwer < 0)) {
- TxPwer = (7 + TxPwer);
- TxPwer =
- (TxPwer >
- 0xF) ? (0xF)
- : (TxPwer);
- R3 |= (TxPwer << 10);
- DBGPRINT(RT_DEBUG_ERROR,
- ("AsicSwitchChannel: TxPwer=%d \n",
- TxPwer));
- } else {
- TxPwer =
- (TxPwer >
- 0xF) ? (0xF)
- : (TxPwer);
- R3 |=
- (TxPwer << 10) | (1
- <<
- 9);
- }
-
- /* R4 */
- if ((TxPwer2 >= -7)
- && (TxPwer2 < 0)) {
- TxPwer2 = (7 + TxPwer2);
- TxPwer2 =
- (TxPwer2 >
- 0xF) ? (0xF)
- : (TxPwer2);
- R4 |= (TxPwer2 << 7);
- DBGPRINT(RT_DEBUG_ERROR,
- ("AsicSwitchChannel: TxPwer2=%d \n",
- TxPwer2));
- } else {
- TxPwer2 =
- (TxPwer2 >
- 0xF) ? (0xF)
- : (TxPwer2);
- R4 |=
- (TxPwer2 << 7) | (1
- <<
- 6);
- }
- } else {
- R3 = (RFRegTable[index].R3 & 0xffffc1ff) | (TxPwer << 9); /* set TX power0 */
- R4 = (RFRegTable[index].R4 & (~0x001f87c0)) | (pAd->RfFreqOffset << 15) | (TxPwer2 << 6); /* Set freq Offset & TxPwr1 */
- }
-
- /* Based on BBP current mode before changing RF channel. */
- if (!bScan
- && (pAd->CommonCfg.BBPCurrentBW ==
- BW_40)) {
- R4 |= 0x200000;
- }
- /* Update variables */
- pAd->LatchRfRegs.Channel = Channel;
- pAd->LatchRfRegs.R1 =
- RFRegTable[index].R1;
- pAd->LatchRfRegs.R2 = R2;
- pAd->LatchRfRegs.R3 = R3;
- pAd->LatchRfRegs.R4 = R4;
-
- /* Set RF value 1's set R3[bit2] = [0] */
- RTMP_RF_IO_WRITE32(pAd,
- pAd->LatchRfRegs.R1);
- RTMP_RF_IO_WRITE32(pAd,
- pAd->LatchRfRegs.R2);
- RTMP_RF_IO_WRITE32(pAd,
- (pAd->LatchRfRegs.
- R3 & (~0x04)));
- RTMP_RF_IO_WRITE32(pAd,
- pAd->LatchRfRegs.R4);
-
- RTMPusecDelay(200);
-
- /* Set RF value 2's set R3[bit2] = [1] */
- RTMP_RF_IO_WRITE32(pAd,
- pAd->LatchRfRegs.R1);
- RTMP_RF_IO_WRITE32(pAd,
- pAd->LatchRfRegs.R2);
- RTMP_RF_IO_WRITE32(pAd,
- (pAd->LatchRfRegs.
- R3 | 0x04));
- RTMP_RF_IO_WRITE32(pAd,
- pAd->LatchRfRegs.R4);
-
- RTMPusecDelay(200);
-
- /* Set RF value 3's set R3[bit2] = [0] */
- RTMP_RF_IO_WRITE32(pAd,
- pAd->LatchRfRegs.R1);
- RTMP_RF_IO_WRITE32(pAd,
- pAd->LatchRfRegs.R2);
- RTMP_RF_IO_WRITE32(pAd,
- (pAd->LatchRfRegs.
- R3 & (~0x04)));
- RTMP_RF_IO_WRITE32(pAd,
- pAd->LatchRfRegs.R4);
-
- break;
- }
- }
- break;
-
- default:
- break;
- }
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("SwitchChannel#%d(RF=%d, Pwr0=%lu, Pwr1=%lu, %dT) to , R1=0x%08lx, R2=0x%08lx, R3=0x%08lx, R4=0x%08lx\n",
- Channel, pAd->RfIcType, (R3 & 0x00003e00) >> 9,
- (R4 & 0x000007c0) >> 6, pAd->Antenna.field.TxPath,
- pAd->LatchRfRegs.R1, pAd->LatchRfRegs.R2,
- pAd->LatchRfRegs.R3, pAd->LatchRfRegs.R4));
- }
-
- /* Change BBP setting during siwtch from a->g, g->a */
- if (Channel <= 14) {
- unsigned long TxPinCfg = 0x00050F0A; /*Gary 2007/08/09 0x050A0A */
-
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R62,
- (0x37 - GET_LNA_GAIN(pAd)));
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R63,
- (0x37 - GET_LNA_GAIN(pAd)));
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R64,
- (0x37 - GET_LNA_GAIN(pAd)));
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R86, 0); /*(0x44 - GET_LNA_GAIN(pAd))); // According the Rory's suggestion to solve the middle range issue. */
- /*RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x62); */
-
- /* Rx High power VGA offset for LNA select */
- if (pAd->NicConfig2.field.ExternalLNAForG) {
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x62);
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x46);
- } else {
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x84);
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x50);
- }
-
- /* 5G band selection PIN, bit1 and bit2 are complement */
- RTMP_IO_READ32(pAd, TX_BAND_CFG, &Value);
- Value &= (~0x6);
- Value |= (0x04);
- RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value);
-
- /* Turn off unused PA or LNA when only 1T or 1R */
- if (pAd->Antenna.field.TxPath == 1) {
- TxPinCfg &= 0xFFFFFFF3;
- }
- if (pAd->Antenna.field.RxPath == 1) {
- TxPinCfg &= 0xFFFFF3FF;
- }
-
- RTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg);
-
-#if defined(RT3090) || defined(RT3390)
- /* PCIe PHY Transmit attenuation adjustment */
- if (IS_RT3090A(pAd) || IS_RT3390(pAd)) {
- TX_ATTENUATION_CTRL_STRUC TxAttenuationCtrl = {
- .word = 0};
-
- RTMP_IO_READ32(pAd, PCIE_PHY_TX_ATTENUATION_CTRL,
- &TxAttenuationCtrl.word);
-
- if (Channel == 14) /* Channel #14 */
- {
- TxAttenuationCtrl.field.PCIE_PHY_TX_ATTEN_EN = 1; /* Enable PCIe PHY Tx attenuation */
- TxAttenuationCtrl.field.PCIE_PHY_TX_ATTEN_VALUE = 4; /* 9/16 full drive level */
- } else /* Channel #1~#13 */
- {
- TxAttenuationCtrl.field.PCIE_PHY_TX_ATTEN_EN = 0; /* Disable PCIe PHY Tx attenuation */
- TxAttenuationCtrl.field.PCIE_PHY_TX_ATTEN_VALUE = 0; /* n/a */
- }
-
- RTMP_IO_WRITE32(pAd, PCIE_PHY_TX_ATTENUATION_CTRL,
- TxAttenuationCtrl.word);
- }
-#endif
- } else {
- unsigned long TxPinCfg = 0x00050F05; /*Gary 2007/8/9 0x050505 */
-
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R62,
- (0x37 - GET_LNA_GAIN(pAd)));
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R63,
- (0x37 - GET_LNA_GAIN(pAd)));
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R64,
- (0x37 - GET_LNA_GAIN(pAd)));
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R86, 0); /*(0x44 - GET_LNA_GAIN(pAd))); // According the Rory's suggestion to solve the middle range issue. */
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0xF2);
-
- /* Rx High power VGA offset for LNA select */
- if (pAd->NicConfig2.field.ExternalLNAForA) {
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x46);
- } else {
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x50);
- }
-
- /* 5G band selection PIN, bit1 and bit2 are complement */
- RTMP_IO_READ32(pAd, TX_BAND_CFG, &Value);
- Value &= (~0x6);
- Value |= (0x02);
- RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value);
-
- /* Turn off unused PA or LNA when only 1T or 1R */
- if (pAd->Antenna.field.TxPath == 1) {
- TxPinCfg &= 0xFFFFFFF3;
- }
- if (pAd->Antenna.field.RxPath == 1) {
- TxPinCfg &= 0xFFFFF3FF;
- }
-
- RTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg);
-
- }
-
- /* R66 should be set according to Channel and use 20MHz when scanning */
- /*RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, (0x2E + GET_LNA_GAIN(pAd))); */
- if (bScan)
- RTMPSetAGCInitValue(pAd, BW_20);
- else
- RTMPSetAGCInitValue(pAd, pAd->CommonCfg.BBPCurrentBW);
-
- /* */
- /* On 11A, We should delay and wait RF/BBP to be stable */
- /* and the appropriate time should be 1000 micro seconds */
- /* 2005/06/05 - On 11G, We also need this delay time. Otherwise it's difficult to pass the WHQL. */
- /* */
- RTMPusecDelay(1000);
-}
-
-void AsicResetBBPAgent(struct rt_rtmp_adapter *pAd)
-{
- BBP_CSR_CFG_STRUC BbpCsr;
- DBGPRINT(RT_DEBUG_ERROR, ("Reset BBP Agent busy bit!\n"));
- /* Still need to find why BBP agent keeps busy, but in fact, hardware still function ok. Now clear busy first. */
- RTMP_IO_READ32(pAd, H2M_BBP_AGENT, &BbpCsr.word);
- BbpCsr.field.Busy = 0;
- RTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, BbpCsr.word);
-}
-
-/*
- ==========================================================================
- Description:
- This function is required for 2421 only, and should not be used during
- site survey. It's only required after NIC decided to stay at a channel
- for a longer period.
- When this function is called, it's always after AsicSwitchChannel().
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-void AsicLockChannel(struct rt_rtmp_adapter *pAd, u8 Channel)
-{
-}
-
-void AsicRfTuningExec(void *SystemSpecific1,
- void *FunctionContext,
- void *SystemSpecific2, void *SystemSpecific3)
-{
-}
-
-/*
- ==========================================================================
- Description:
- Gives CCK TX rate 2 more dB TX power.
- This routine works only in LINK UP in INFRASTRUCTURE mode.
-
- calculate desired Tx power in RF R3.Tx0~5, should consider -
- 0. if current radio is a noisy environment (pAd->DrsCounters.fNoisyEnvironment)
- 1. TxPowerPercentage
- 2. auto calibration based on TSSI feedback
- 3. extra 2 db for CCK
- 4. -10 db upon very-short distance (AvgRSSI >= -40db) to AP
-
- NOTE: Since this routine requires the value of (pAd->DrsCounters.fNoisyEnvironment),
- it should be called AFTER MlmeDynamicTxRatSwitching()
- ==========================================================================
- */
-void AsicAdjustTxPower(struct rt_rtmp_adapter *pAd)
-{
- int i, j;
- char DeltaPwr = 0;
- BOOLEAN bAutoTxAgc = FALSE;
- u8 TssiRef, *pTssiMinusBoundary, *pTssiPlusBoundary, TxAgcStep;
- u8 BbpR1 = 0, BbpR49 = 0, idx;
- char *pTxAgcCompensate;
- unsigned long TxPwr[5];
- char Value;
- char Rssi = -127;
-
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) ||
-#ifdef RTMP_MAC_PCI
- (pAd->bPCIclkOff == TRUE) ||
-#endif /* RTMP_MAC_PCI // */
- RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF) ||
- RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
- return;
-
- Rssi = RTMPMaxRssi(pAd,
- pAd->StaCfg.RssiSample.AvgRssi0,
- pAd->StaCfg.RssiSample.AvgRssi1,
- pAd->StaCfg.RssiSample.AvgRssi2);
-
- if (pAd->CommonCfg.BBPCurrentBW == BW_40) {
- if (pAd->CommonCfg.CentralChannel > 14) {
- TxPwr[0] = pAd->Tx40MPwrCfgABand[0];
- TxPwr[1] = pAd->Tx40MPwrCfgABand[1];
- TxPwr[2] = pAd->Tx40MPwrCfgABand[2];
- TxPwr[3] = pAd->Tx40MPwrCfgABand[3];
- TxPwr[4] = pAd->Tx40MPwrCfgABand[4];
- } else {
- TxPwr[0] = pAd->Tx40MPwrCfgGBand[0];
- TxPwr[1] = pAd->Tx40MPwrCfgGBand[1];
- TxPwr[2] = pAd->Tx40MPwrCfgGBand[2];
- TxPwr[3] = pAd->Tx40MPwrCfgGBand[3];
- TxPwr[4] = pAd->Tx40MPwrCfgGBand[4];
- }
- } else {
- if (pAd->CommonCfg.Channel > 14) {
- TxPwr[0] = pAd->Tx20MPwrCfgABand[0];
- TxPwr[1] = pAd->Tx20MPwrCfgABand[1];
- TxPwr[2] = pAd->Tx20MPwrCfgABand[2];
- TxPwr[3] = pAd->Tx20MPwrCfgABand[3];
- TxPwr[4] = pAd->Tx20MPwrCfgABand[4];
- } else {
- TxPwr[0] = pAd->Tx20MPwrCfgGBand[0];
- TxPwr[1] = pAd->Tx20MPwrCfgGBand[1];
- TxPwr[2] = pAd->Tx20MPwrCfgGBand[2];
- TxPwr[3] = pAd->Tx20MPwrCfgGBand[3];
- TxPwr[4] = pAd->Tx20MPwrCfgGBand[4];
- }
- }
-
- /* TX power compensation for temperature variation based on TSSI. try every 4 second */
- if (pAd->Mlme.OneSecPeriodicRound % 4 == 0) {
- if (pAd->CommonCfg.Channel <= 14) {
- /* bg channel */
- bAutoTxAgc = pAd->bAutoTxAgcG;
- TssiRef = pAd->TssiRefG;
- pTssiMinusBoundary = &pAd->TssiMinusBoundaryG[0];
- pTssiPlusBoundary = &pAd->TssiPlusBoundaryG[0];
- TxAgcStep = pAd->TxAgcStepG;
- pTxAgcCompensate = &pAd->TxAgcCompensateG;
- } else {
- /* a channel */
- bAutoTxAgc = pAd->bAutoTxAgcA;
- TssiRef = pAd->TssiRefA;
- pTssiMinusBoundary = &pAd->TssiMinusBoundaryA[0];
- pTssiPlusBoundary = &pAd->TssiPlusBoundaryA[0];
- TxAgcStep = pAd->TxAgcStepA;
- pTxAgcCompensate = &pAd->TxAgcCompensateA;
- }
-
- if (bAutoTxAgc) {
- /* BbpR1 is unsigned char */
- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, &BbpR49);
-
- /* (p) TssiPlusBoundaryG[0] = 0 = (m) TssiMinusBoundaryG[0] */
- /* compensate: +4 +3 +2 +1 0 -1 -2 -3 -4 * steps */
- /* step value is defined in pAd->TxAgcStepG for tx power value */
-
- /* [4]+1+[4] p4 p3 p2 p1 o1 m1 m2 m3 m4 */
- /* ex: 0x00 0x15 0x25 0x45 0x88 0xA0 0xB5 0xD0 0xF0
- above value are examined in mass factory production */
- /* [4] [3] [2] [1] [0] [1] [2] [3] [4] */
-
- /* plus (+) is 0x00 ~ 0x45, minus (-) is 0xa0 ~ 0xf0 */
- /* if value is between p1 ~ o1 or o1 ~ s1, no need to adjust tx power */
- /* if value is 0xa5, tx power will be -= TxAgcStep*(2-1) */
-
- if (BbpR49 > pTssiMinusBoundary[1]) {
- /* Reading is larger than the reference value */
- /* check for how large we need to decrease the Tx power */
- for (idx = 1; idx < 5; idx++) {
- if (BbpR49 <= pTssiMinusBoundary[idx]) /* Found the range */
- break;
- }
- /* The index is the step we should decrease, idx = 0 means there is nothing to compensate */
-/* if (R3 > (unsigned long)(TxAgcStep * (idx-1))) */
- *pTxAgcCompensate = -(TxAgcStep * (idx - 1));
-/* else */
-/* *pTxAgcCompensate = -((u8)R3); */
-
- DeltaPwr += (*pTxAgcCompensate);
- DBGPRINT(RT_DEBUG_TRACE,
- ("-- Tx Power, BBP R1=%x, TssiRef=%x, TxAgcStep=%x, step = -%d\n",
- BbpR49, TssiRef, TxAgcStep, idx - 1));
- } else if (BbpR49 < pTssiPlusBoundary[1]) {
- /* Reading is smaller than the reference value */
- /* check for how large we need to increase the Tx power */
- for (idx = 1; idx < 5; idx++) {
- if (BbpR49 >= pTssiPlusBoundary[idx]) /* Found the range */
- break;
- }
- /* The index is the step we should increase, idx = 0 means there is nothing to compensate */
- *pTxAgcCompensate = TxAgcStep * (idx - 1);
- DeltaPwr += (*pTxAgcCompensate);
- DBGPRINT(RT_DEBUG_TRACE,
- ("++ Tx Power, BBP R1=%x, TssiRef=%x, TxAgcStep=%x, step = +%d\n",
- BbpR49, TssiRef, TxAgcStep, idx - 1));
- } else {
- *pTxAgcCompensate = 0;
- DBGPRINT(RT_DEBUG_TRACE,
- (" Tx Power, BBP R49=%x, TssiRef=%x, TxAgcStep=%x, step = +%d\n",
- BbpR49, TssiRef, TxAgcStep, 0));
- }
- }
- } else {
- if (pAd->CommonCfg.Channel <= 14) {
- bAutoTxAgc = pAd->bAutoTxAgcG;
- pTxAgcCompensate = &pAd->TxAgcCompensateG;
- } else {
- bAutoTxAgc = pAd->bAutoTxAgcA;
- pTxAgcCompensate = &pAd->TxAgcCompensateA;
- }
-
- if (bAutoTxAgc)
- DeltaPwr += (*pTxAgcCompensate);
- }
-
- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BbpR1);
- BbpR1 &= 0xFC;
-
- /* calculate delta power based on the percentage specified from UI */
- /* E2PROM setting is calibrated for maximum TX power (i.e. 100%) */
- /* We lower TX power here according to the percentage specified from UI */
- if (pAd->CommonCfg.TxPowerPercentage == 0xffffffff) /* AUTO TX POWER control */
- {
- {
- /* to patch high power issue with some APs, like Belkin N1. */
- if (Rssi > -35) {
- BbpR1 |= 0x02; /* DeltaPwr -= 12; */
- } else if (Rssi > -40) {
- BbpR1 |= 0x01; /* DeltaPwr -= 6; */
- } else;
- }
- } else if (pAd->CommonCfg.TxPowerPercentage > 90) /* 91 ~ 100% & AUTO, treat as 100% in terms of mW */
- ;
- else if (pAd->CommonCfg.TxPowerPercentage > 60) /* 61 ~ 90%, treat as 75% in terms of mW // DeltaPwr -= 1; */
- {
- DeltaPwr -= 1;
- } else if (pAd->CommonCfg.TxPowerPercentage > 30) /* 31 ~ 60%, treat as 50% in terms of mW // DeltaPwr -= 3; */
- {
- DeltaPwr -= 3;
- } else if (pAd->CommonCfg.TxPowerPercentage > 15) /* 16 ~ 30%, treat as 25% in terms of mW // DeltaPwr -= 6; */
- {
- BbpR1 |= 0x01;
- } else if (pAd->CommonCfg.TxPowerPercentage > 9) /* 10 ~ 15%, treat as 12.5% in terms of mW // DeltaPwr -= 9; */
- {
- BbpR1 |= 0x01;
- DeltaPwr -= 3;
- } else /* 0 ~ 9 %, treat as MIN(~3%) in terms of mW // DeltaPwr -= 12; */
- {
- BbpR1 |= 0x02;
- }
-
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BbpR1);
-
- /* reset different new tx power for different TX rate */
- for (i = 0; i < 5; i++) {
- if (TxPwr[i] != 0xffffffff) {
- for (j = 0; j < 8; j++) {
- Value = (char)((TxPwr[i] >> j * 4) & 0x0F); /* 0 ~ 15 */
-
- if ((Value + DeltaPwr) < 0) {
- Value = 0; /* min */
- } else if ((Value + DeltaPwr) > 0xF) {
- Value = 0xF; /* max */
- } else {
- Value += DeltaPwr; /* temperature compensation */
- }
-
- /* fill new value to CSR offset */
- TxPwr[i] =
- (TxPwr[i] & ~(0x0000000F << j * 4)) | (Value
- << j
- * 4);
- }
-
- /* write tx power value to CSR */
- /* TX_PWR_CFG_0 (8 tx rate) for TX power for OFDM 12M/18M
- TX power for OFDM 6M/9M
- TX power for CCK5.5M/11M
- TX power for CCK1M/2M */
- /* TX_PWR_CFG_1 ~ TX_PWR_CFG_4 */
- RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i * 4, TxPwr[i]);
- }
- }
-
-}
-
-/*
- ==========================================================================
- Description:
- put PHY to sleep here, and set next wakeup timer. PHY doesn't not wakeup
- automatically. Instead, MCU will issue a TwakeUpInterrupt to host after
- the wakeup timer timeout. Driver has to issue a separate command to wake
- PHY up.
-
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-void AsicSleepThenAutoWakeup(struct rt_rtmp_adapter *pAd,
- u16 TbttNumToNextWakeUp)
-{
- RTMP_STA_SLEEP_THEN_AUTO_WAKEUP(pAd, TbttNumToNextWakeUp);
-}
-
-/*
- ==========================================================================
- Description:
- AsicForceWakeup() is used whenever manual wakeup is required
- AsicForceSleep() should only be used when not in INFRA BSS. When
- in INFRA BSS, we should use AsicSleepThenAutoWakeup() instead.
- ==========================================================================
- */
-void AsicForceSleep(struct rt_rtmp_adapter *pAd)
-{
-
-}
-
-/*
- ==========================================================================
- Description:
- AsicForceWakeup() is used whenever Twakeup timer (set via AsicSleepThenAutoWakeup)
- expired.
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
- ==========================================================================
- */
-void AsicForceWakeup(struct rt_rtmp_adapter *pAd, IN BOOLEAN bFromTx)
-{
- DBGPRINT(RT_DEBUG_INFO, ("--> AsicForceWakeup \n"));
- RTMP_STA_FORCE_WAKEUP(pAd, bFromTx);
-}
-
-/*
- ==========================================================================
- Description:
- Set My BSSID
-
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-void AsicSetBssid(struct rt_rtmp_adapter *pAd, u8 *pBssid)
-{
- unsigned long Addr4;
- DBGPRINT(RT_DEBUG_TRACE,
- ("==============> AsicSetBssid %x:%x:%x:%x:%x:%x\n", pBssid[0],
- pBssid[1], pBssid[2], pBssid[3], pBssid[4], pBssid[5]));
-
- Addr4 = (unsigned long)(pBssid[0]) |
- (unsigned long)(pBssid[1] << 8) |
- (unsigned long)(pBssid[2] << 16) | (unsigned long)(pBssid[3] << 24);
- RTMP_IO_WRITE32(pAd, MAC_BSSID_DW0, Addr4);
-
- Addr4 = 0;
- /* always one BSSID in STA mode */
- Addr4 = (unsigned long)(pBssid[4]) | (unsigned long)(pBssid[5] << 8);
-
- RTMP_IO_WRITE32(pAd, MAC_BSSID_DW1, Addr4);
-}
-
-void AsicSetMcastWC(struct rt_rtmp_adapter *pAd)
-{
- struct rt_mac_table_entry *pEntry = &pAd->MacTab.Content[MCAST_WCID];
- u16 offset;
-
- pEntry->Sst = SST_ASSOC;
- pEntry->Aid = MCAST_WCID; /* Softap supports 1 BSSID and use WCID=0 as multicast Wcid index */
- pEntry->PsMode = PWR_ACTIVE;
- pEntry->CurrTxRate = pAd->CommonCfg.MlmeRate;
- offset = MAC_WCID_BASE + BSS0Mcast_WCID * HW_WCID_ENTRY_SIZE;
-}
-
-/*
- ==========================================================================
- Description:
-
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-void AsicDelWcidTab(struct rt_rtmp_adapter *pAd, u8 Wcid)
-{
- unsigned long Addr0 = 0x0, Addr1 = 0x0;
- unsigned long offset;
-
- DBGPRINT(RT_DEBUG_TRACE, ("AsicDelWcidTab==>Wcid = 0x%x\n", Wcid));
- offset = MAC_WCID_BASE + Wcid * HW_WCID_ENTRY_SIZE;
- RTMP_IO_WRITE32(pAd, offset, Addr0);
- offset += 4;
- RTMP_IO_WRITE32(pAd, offset, Addr1);
-}
-
-/*
- ==========================================================================
- Description:
-
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-void AsicEnableRDG(struct rt_rtmp_adapter *pAd)
-{
- TX_LINK_CFG_STRUC TxLinkCfg;
- u32 Data = 0;
-
- RTMP_IO_READ32(pAd, TX_LINK_CFG, &TxLinkCfg.word);
- TxLinkCfg.field.TxRDGEn = 1;
- RTMP_IO_WRITE32(pAd, TX_LINK_CFG, TxLinkCfg.word);
-
- RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);
- Data &= 0xFFFFFF00;
- Data |= 0x80;
- RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data);
-
- /*OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED); */
-}
-
-/*
- ==========================================================================
- Description:
-
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-void AsicDisableRDG(struct rt_rtmp_adapter *pAd)
-{
- TX_LINK_CFG_STRUC TxLinkCfg;
- u32 Data = 0;
-
- RTMP_IO_READ32(pAd, TX_LINK_CFG, &TxLinkCfg.word);
- TxLinkCfg.field.TxRDGEn = 0;
- RTMP_IO_WRITE32(pAd, TX_LINK_CFG, TxLinkCfg.word);
-
- RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);
-
- Data &= 0xFFFFFF00;
- /*Data |= 0x20; */
-#ifndef WIFI_TEST
- /*if ( pAd->CommonCfg.bEnableTxBurst ) */
- /* Data |= 0x60; // for performance issue not set the TXOP to 0 */
-#endif
- if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_DYNAMIC_BE_TXOP_ACTIVE)
- && (pAd->MacTab.fAnyStationMIMOPSDynamic == FALSE)
- ) {
- /* For CWC test, change txop from 0x30 to 0x20 in TxBurst mode */
- if (pAd->CommonCfg.bEnableTxBurst)
- Data |= 0x20;
- }
- RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data);
-}
-
-/*
- ==========================================================================
- Description:
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-void AsicDisableSync(struct rt_rtmp_adapter *pAd)
-{
- BCN_TIME_CFG_STRUC csr;
-
- DBGPRINT(RT_DEBUG_TRACE, ("--->Disable TSF synchronization\n"));
-
- /* 2003-12-20 disable TSF and TBTT while NIC in power-saving have side effect */
- /* that NIC will never wakes up because TSF stops and no more */
- /* TBTT interrupts */
- pAd->TbttTickCount = 0;
- RTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr.word);
- csr.field.bBeaconGen = 0;
- csr.field.bTBTTEnable = 0;
- csr.field.TsfSyncMode = 0;
- csr.field.bTsfTicking = 0;
- RTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr.word);
-
-}
-
-/*
- ==========================================================================
- Description:
-
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-void AsicEnableBssSync(struct rt_rtmp_adapter *pAd)
-{
- BCN_TIME_CFG_STRUC csr;
-
- DBGPRINT(RT_DEBUG_TRACE, ("--->AsicEnableBssSync(INFRA mode)\n"));
-
- RTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr.word);
-/* RTMP_IO_WRITE32(pAd, BCN_TIME_CFG, 0x00000000); */
- {
- csr.field.BeaconInterval = pAd->CommonCfg.BeaconPeriod << 4; /* ASIC register in units of 1/16 TU */
- csr.field.bTsfTicking = 1;
- csr.field.TsfSyncMode = 1; /* sync TSF in INFRASTRUCTURE mode */
- csr.field.bBeaconGen = 0; /* do NOT generate BEACON */
- csr.field.bTBTTEnable = 1;
- }
- RTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr.word);
-}
-
-/*
- ==========================================================================
- Description:
- Note:
- BEACON frame in shared memory should be built ok before this routine
- can be called. Otherwise, a garbage frame maybe transmitted out every
- Beacon period.
-
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-void AsicEnableIbssSync(struct rt_rtmp_adapter *pAd)
-{
- BCN_TIME_CFG_STRUC csr9;
- u8 *ptr;
- u32 i;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("--->AsicEnableIbssSync(ADHOC mode. MPDUtotalByteCount = %d)\n",
- pAd->BeaconTxWI.MPDUtotalByteCount));
-
- RTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr9.word);
- csr9.field.bBeaconGen = 0;
- csr9.field.bTBTTEnable = 0;
- csr9.field.bTsfTicking = 0;
- RTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr9.word);
-
-#ifdef RTMP_MAC_PCI
- /* move BEACON TXD and frame content to on-chip memory */
- ptr = (u8 *)& pAd->BeaconTxWI;
- for (i = 0; i < TXWI_SIZE; i += 4) /* 16-byte TXWI field */
- {
- u32 longptr =
- *ptr + (*(ptr + 1) << 8) + (*(ptr + 2) << 16) +
- (*(ptr + 3) << 24);
- RTMP_IO_WRITE32(pAd, HW_BEACON_BASE0 + i, longptr);
- ptr += 4;
- }
-
- /* start right after the 16-byte TXWI field */
- ptr = pAd->BeaconBuf;
- for (i = 0; i < pAd->BeaconTxWI.MPDUtotalByteCount; i += 4) {
- u32 longptr =
- *ptr + (*(ptr + 1) << 8) + (*(ptr + 2) << 16) +
- (*(ptr + 3) << 24);
- RTMP_IO_WRITE32(pAd, HW_BEACON_BASE0 + TXWI_SIZE + i, longptr);
- ptr += 4;
- }
-#endif /* RTMP_MAC_PCI // */
-#ifdef RTMP_MAC_USB
- /* move BEACON TXD and frame content to on-chip memory */
- ptr = (u8 *)& pAd->BeaconTxWI;
- for (i = 0; i < TXWI_SIZE; i += 2) /* 16-byte TXWI field */
- {
- /*u32 longptr = *ptr + (*(ptr+1)<<8) + (*(ptr+2)<<16) + (*(ptr+3)<<24); */
- /*RTMP_IO_WRITE32(pAd, HW_BEACON_BASE0 + i, longptr); */
- RTUSBMultiWrite(pAd, HW_BEACON_BASE0 + i, ptr, 2);
- ptr += 2;
- }
-
- /* start right after the 16-byte TXWI field */
- ptr = pAd->BeaconBuf;
- for (i = 0; i < pAd->BeaconTxWI.MPDUtotalByteCount; i += 2) {
- /*u32 longptr = *ptr + (*(ptr+1)<<8) + (*(ptr+2)<<16) + (*(ptr+3)<<24); */
- /*RTMP_IO_WRITE32(pAd, HW_BEACON_BASE0 + TXWI_SIZE + i, longptr); */
- RTUSBMultiWrite(pAd, HW_BEACON_BASE0 + TXWI_SIZE + i, ptr, 2);
- ptr += 2;
- }
-#endif /* RTMP_MAC_USB // */
-
- /* */
- /* For Wi-Fi faily generated beacons between participating stations. */
- /* Set TBTT phase adaptive adjustment step to 8us (default 16us) */
- /* don't change settings 2006-5- by Jerry */
- /*RTMP_IO_WRITE32(pAd, TBTT_SYNC_CFG, 0x00001010); */
-
- /* start sending BEACON */
- csr9.field.BeaconInterval = pAd->CommonCfg.BeaconPeriod << 4; /* ASIC register in units of 1/16 TU */
- csr9.field.bTsfTicking = 1;
- csr9.field.TsfSyncMode = 2; /* sync TSF in IBSS mode */
- csr9.field.bTBTTEnable = 1;
- csr9.field.bBeaconGen = 1;
- RTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr9.word);
-}
-
-/*
- ==========================================================================
- Description:
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-void AsicSetEdcaParm(struct rt_rtmp_adapter *pAd, struct rt_edca_parm *pEdcaParm)
-{
- EDCA_AC_CFG_STRUC Ac0Cfg, Ac1Cfg, Ac2Cfg, Ac3Cfg;
- AC_TXOP_CSR0_STRUC csr0;
- AC_TXOP_CSR1_STRUC csr1;
- AIFSN_CSR_STRUC AifsnCsr;
- CWMIN_CSR_STRUC CwminCsr;
- CWMAX_CSR_STRUC CwmaxCsr;
- int i;
-
- Ac0Cfg.word = 0;
- Ac1Cfg.word = 0;
- Ac2Cfg.word = 0;
- Ac3Cfg.word = 0;
- if ((pEdcaParm == NULL) || (pEdcaParm->bValid == FALSE)) {
- DBGPRINT(RT_DEBUG_TRACE, ("AsicSetEdcaParm\n"));
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_WMM_INUSED);
- for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) {
- if (pAd->MacTab.Content[i].ValidAsCLI
- || pAd->MacTab.Content[i].ValidAsApCli)
- CLIENT_STATUS_CLEAR_FLAG(&pAd->MacTab.
- Content[i],
- fCLIENT_STATUS_WMM_CAPABLE);
- }
-
- /*======================================================== */
- /* MAC Register has a copy . */
- /*======================================================== */
-/*#ifndef WIFI_TEST */
- if (pAd->CommonCfg.bEnableTxBurst) {
- /* For CWC test, change txop from 0x30 to 0x20 in TxBurst mode */
- Ac0Cfg.field.AcTxop = 0x20; /* Suggest by John for TxBurst in HT Mode */
- } else
- Ac0Cfg.field.AcTxop = 0; /* QID_AC_BE */
-/*#else */
-/* Ac0Cfg.field.AcTxop = 0; // QID_AC_BE */
-/*#endif */
- Ac0Cfg.field.Cwmin = CW_MIN_IN_BITS;
- Ac0Cfg.field.Cwmax = CW_MAX_IN_BITS;
- Ac0Cfg.field.Aifsn = 2;
- RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Ac0Cfg.word);
-
- Ac1Cfg.field.AcTxop = 0; /* QID_AC_BK */
- Ac1Cfg.field.Cwmin = CW_MIN_IN_BITS;
- Ac1Cfg.field.Cwmax = CW_MAX_IN_BITS;
- Ac1Cfg.field.Aifsn = 2;
- RTMP_IO_WRITE32(pAd, EDCA_AC1_CFG, Ac1Cfg.word);
-
- if (pAd->CommonCfg.PhyMode == PHY_11B) {
- Ac2Cfg.field.AcTxop = 192; /* AC_VI: 192*32us ~= 6ms */
- Ac3Cfg.field.AcTxop = 96; /* AC_VO: 96*32us ~= 3ms */
- } else {
- Ac2Cfg.field.AcTxop = 96; /* AC_VI: 96*32us ~= 3ms */
- Ac3Cfg.field.AcTxop = 48; /* AC_VO: 48*32us ~= 1.5ms */
- }
- Ac2Cfg.field.Cwmin = CW_MIN_IN_BITS;
- Ac2Cfg.field.Cwmax = CW_MAX_IN_BITS;
- Ac2Cfg.field.Aifsn = 2;
- RTMP_IO_WRITE32(pAd, EDCA_AC2_CFG, Ac2Cfg.word);
- Ac3Cfg.field.Cwmin = CW_MIN_IN_BITS;
- Ac3Cfg.field.Cwmax = CW_MAX_IN_BITS;
- Ac3Cfg.field.Aifsn = 2;
- RTMP_IO_WRITE32(pAd, EDCA_AC3_CFG, Ac3Cfg.word);
-
- /*======================================================== */
- /* DMA Register has a copy too. */
- /*======================================================== */
- csr0.field.Ac0Txop = 0; /* QID_AC_BE */
- csr0.field.Ac1Txop = 0; /* QID_AC_BK */
- RTMP_IO_WRITE32(pAd, WMM_TXOP0_CFG, csr0.word);
- if (pAd->CommonCfg.PhyMode == PHY_11B) {
- csr1.field.Ac2Txop = 192; /* AC_VI: 192*32us ~= 6ms */
- csr1.field.Ac3Txop = 96; /* AC_VO: 96*32us ~= 3ms */
- } else {
- csr1.field.Ac2Txop = 96; /* AC_VI: 96*32us ~= 3ms */
- csr1.field.Ac3Txop = 48; /* AC_VO: 48*32us ~= 1.5ms */
- }
- RTMP_IO_WRITE32(pAd, WMM_TXOP1_CFG, csr1.word);
-
- CwminCsr.word = 0;
- CwminCsr.field.Cwmin0 = CW_MIN_IN_BITS;
- CwminCsr.field.Cwmin1 = CW_MIN_IN_BITS;
- CwminCsr.field.Cwmin2 = CW_MIN_IN_BITS;
- CwminCsr.field.Cwmin3 = CW_MIN_IN_BITS;
- RTMP_IO_WRITE32(pAd, WMM_CWMIN_CFG, CwminCsr.word);
-
- CwmaxCsr.word = 0;
- CwmaxCsr.field.Cwmax0 = CW_MAX_IN_BITS;
- CwmaxCsr.field.Cwmax1 = CW_MAX_IN_BITS;
- CwmaxCsr.field.Cwmax2 = CW_MAX_IN_BITS;
- CwmaxCsr.field.Cwmax3 = CW_MAX_IN_BITS;
- RTMP_IO_WRITE32(pAd, WMM_CWMAX_CFG, CwmaxCsr.word);
-
- RTMP_IO_WRITE32(pAd, WMM_AIFSN_CFG, 0x00002222);
-
- NdisZeroMemory(&pAd->CommonCfg.APEdcaParm, sizeof(struct rt_edca_parm));
- } else {
- OPSTATUS_SET_FLAG(pAd, fOP_STATUS_WMM_INUSED);
- /*======================================================== */
- /* MAC Register has a copy. */
- /*======================================================== */
- /* */
- /* Modify Cwmin/Cwmax/Txop on queue[QID_AC_VI], Recommend by Jerry 2005/07/27 */
- /* To degrade our VIDO Queue's throughput for WiFi WMM S3T07 Issue. */
- /* */
- /*pEdcaParm->Txop[QID_AC_VI] = pEdcaParm->Txop[QID_AC_VI] * 7 / 10; // rt2860c need this */
-
- Ac0Cfg.field.AcTxop = pEdcaParm->Txop[QID_AC_BE];
- Ac0Cfg.field.Cwmin = pEdcaParm->Cwmin[QID_AC_BE];
- Ac0Cfg.field.Cwmax = pEdcaParm->Cwmax[QID_AC_BE];
- Ac0Cfg.field.Aifsn = pEdcaParm->Aifsn[QID_AC_BE]; /*+1; */
-
- Ac1Cfg.field.AcTxop = pEdcaParm->Txop[QID_AC_BK];
- Ac1Cfg.field.Cwmin = pEdcaParm->Cwmin[QID_AC_BK]; /*+2; */
- Ac1Cfg.field.Cwmax = pEdcaParm->Cwmax[QID_AC_BK];
- Ac1Cfg.field.Aifsn = pEdcaParm->Aifsn[QID_AC_BK]; /*+1; */
-
- Ac2Cfg.field.AcTxop = (pEdcaParm->Txop[QID_AC_VI] * 6) / 10;
- if (pAd->Antenna.field.TxPath == 1) {
- Ac2Cfg.field.Cwmin = pEdcaParm->Cwmin[QID_AC_VI] + 1;
- Ac2Cfg.field.Cwmax = pEdcaParm->Cwmax[QID_AC_VI] + 1;
- } else {
- Ac2Cfg.field.Cwmin = pEdcaParm->Cwmin[QID_AC_VI];
- Ac2Cfg.field.Cwmax = pEdcaParm->Cwmax[QID_AC_VI];
- }
- Ac2Cfg.field.Aifsn = pEdcaParm->Aifsn[QID_AC_VI] + 1;
-#ifdef RTMP_MAC_USB
- Ac2Cfg.field.Aifsn = pEdcaParm->Aifsn[QID_AC_VI] + 3;
-#endif /* RTMP_MAC_USB // */
-
- {
- /* Tuning for Wi-Fi WMM S06 */
- if (pAd->CommonCfg.bWiFiTest &&
- pEdcaParm->Aifsn[QID_AC_VI] == 10)
- Ac2Cfg.field.Aifsn -= 1;
-
- /* Tuning for TGn Wi-Fi 5.2.32 */
- /* STA TestBed changes in this item: conexant legacy sta ==> broadcom 11n sta */
- if (STA_TGN_WIFI_ON(pAd) &&
- pEdcaParm->Aifsn[QID_AC_VI] == 10) {
- Ac0Cfg.field.Aifsn = 3;
- Ac2Cfg.field.AcTxop = 5;
- }
-#ifdef RT30xx
- if (pAd->RfIcType == RFIC_3020
- || pAd->RfIcType == RFIC_2020) {
- /* Tuning for WiFi WMM S3-T07: connexant legacy sta ==> broadcom 11n sta. */
- Ac2Cfg.field.Aifsn = 5;
- }
-#endif /* RT30xx // */
- }
-
- Ac3Cfg.field.AcTxop = pEdcaParm->Txop[QID_AC_VO];
- Ac3Cfg.field.Cwmin = pEdcaParm->Cwmin[QID_AC_VO];
- Ac3Cfg.field.Cwmax = pEdcaParm->Cwmax[QID_AC_VO];
- Ac3Cfg.field.Aifsn = pEdcaParm->Aifsn[QID_AC_VO];
-
-/*#ifdef WIFI_TEST */
- if (pAd->CommonCfg.bWiFiTest) {
- if (Ac3Cfg.field.AcTxop == 102) {
- Ac0Cfg.field.AcTxop =
- pEdcaParm->Txop[QID_AC_BE] ? pEdcaParm->
- Txop[QID_AC_BE] : 10;
- Ac0Cfg.field.Aifsn = pEdcaParm->Aifsn[QID_AC_BE] - 1; /* AIFSN must >= 1 */
- Ac1Cfg.field.AcTxop =
- pEdcaParm->Txop[QID_AC_BK];
- Ac1Cfg.field.Aifsn =
- pEdcaParm->Aifsn[QID_AC_BK];
- Ac2Cfg.field.AcTxop =
- pEdcaParm->Txop[QID_AC_VI];
- } /* End of if */
- }
-/*#endif // WIFI_TEST // */
-
- RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Ac0Cfg.word);
- RTMP_IO_WRITE32(pAd, EDCA_AC1_CFG, Ac1Cfg.word);
- RTMP_IO_WRITE32(pAd, EDCA_AC2_CFG, Ac2Cfg.word);
- RTMP_IO_WRITE32(pAd, EDCA_AC3_CFG, Ac3Cfg.word);
-
- /*======================================================== */
- /* DMA Register has a copy too. */
- /*======================================================== */
- csr0.field.Ac0Txop = Ac0Cfg.field.AcTxop;
- csr0.field.Ac1Txop = Ac1Cfg.field.AcTxop;
- RTMP_IO_WRITE32(pAd, WMM_TXOP0_CFG, csr0.word);
-
- csr1.field.Ac2Txop = Ac2Cfg.field.AcTxop;
- csr1.field.Ac3Txop = Ac3Cfg.field.AcTxop;
- RTMP_IO_WRITE32(pAd, WMM_TXOP1_CFG, csr1.word);
-
- CwminCsr.word = 0;
- CwminCsr.field.Cwmin0 = pEdcaParm->Cwmin[QID_AC_BE];
- CwminCsr.field.Cwmin1 = pEdcaParm->Cwmin[QID_AC_BK];
- CwminCsr.field.Cwmin2 = pEdcaParm->Cwmin[QID_AC_VI];
- CwminCsr.field.Cwmin3 = pEdcaParm->Cwmin[QID_AC_VO] - 1; /*for TGn wifi test */
- RTMP_IO_WRITE32(pAd, WMM_CWMIN_CFG, CwminCsr.word);
-
- CwmaxCsr.word = 0;
- CwmaxCsr.field.Cwmax0 = pEdcaParm->Cwmax[QID_AC_BE];
- CwmaxCsr.field.Cwmax1 = pEdcaParm->Cwmax[QID_AC_BK];
- CwmaxCsr.field.Cwmax2 = pEdcaParm->Cwmax[QID_AC_VI];
- CwmaxCsr.field.Cwmax3 = pEdcaParm->Cwmax[QID_AC_VO];
- RTMP_IO_WRITE32(pAd, WMM_CWMAX_CFG, CwmaxCsr.word);
-
- AifsnCsr.word = 0;
- AifsnCsr.field.Aifsn0 = Ac0Cfg.field.Aifsn; /*pEdcaParm->Aifsn[QID_AC_BE]; */
- AifsnCsr.field.Aifsn1 = Ac1Cfg.field.Aifsn; /*pEdcaParm->Aifsn[QID_AC_BK]; */
- AifsnCsr.field.Aifsn2 = Ac2Cfg.field.Aifsn; /*pEdcaParm->Aifsn[QID_AC_VI]; */
-
- {
- /* Tuning for Wi-Fi WMM S06 */
- if (pAd->CommonCfg.bWiFiTest &&
- pEdcaParm->Aifsn[QID_AC_VI] == 10)
- AifsnCsr.field.Aifsn2 = Ac2Cfg.field.Aifsn - 4;
-
- /* Tuning for TGn Wi-Fi 5.2.32 */
- /* STA TestBed changes in this item: connexant legacy sta ==> broadcom 11n sta */
- if (STA_TGN_WIFI_ON(pAd) &&
- pEdcaParm->Aifsn[QID_AC_VI] == 10) {
- AifsnCsr.field.Aifsn0 = 3;
- AifsnCsr.field.Aifsn2 = 7;
- }
-
- if (INFRA_ON(pAd))
- CLIENT_STATUS_SET_FLAG(&pAd->MacTab.
- Content[BSSID_WCID],
- fCLIENT_STATUS_WMM_CAPABLE);
- }
-
- {
- AifsnCsr.field.Aifsn3 = Ac3Cfg.field.Aifsn - 1; /*pEdcaParm->Aifsn[QID_AC_VO]; //for TGn wifi test */
-#ifdef RT30xx
- /* TODO: Shiang, this modification also suitable for RT3052/RT3050 ??? */
- if (pAd->RfIcType == RFIC_3020
- || pAd->RfIcType == RFIC_2020) {
- AifsnCsr.field.Aifsn2 = 0x2; /*pEdcaParm->Aifsn[QID_AC_VI]; //for WiFi WMM S4-T04. */
- }
-#endif /* RT30xx // */
- }
- RTMP_IO_WRITE32(pAd, WMM_AIFSN_CFG, AifsnCsr.word);
-
- NdisMoveMemory(&pAd->CommonCfg.APEdcaParm, pEdcaParm,
- sizeof(struct rt_edca_parm));
- if (!ADHOC_ON(pAd)) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("EDCA [#%d]: AIFSN CWmin CWmax TXOP(us) ACM\n",
- pEdcaParm->EdcaUpdateCount));
- DBGPRINT(RT_DEBUG_TRACE,
- (" AC_BE %2d %2d %2d %4d %d\n",
- pEdcaParm->Aifsn[0], pEdcaParm->Cwmin[0],
- pEdcaParm->Cwmax[0], pEdcaParm->Txop[0] << 5,
- pEdcaParm->bACM[0]));
- DBGPRINT(RT_DEBUG_TRACE,
- (" AC_BK %2d %2d %2d %4d %d\n",
- pEdcaParm->Aifsn[1], pEdcaParm->Cwmin[1],
- pEdcaParm->Cwmax[1], pEdcaParm->Txop[1] << 5,
- pEdcaParm->bACM[1]));
- DBGPRINT(RT_DEBUG_TRACE,
- (" AC_VI %2d %2d %2d %4d %d\n",
- pEdcaParm->Aifsn[2], pEdcaParm->Cwmin[2],
- pEdcaParm->Cwmax[2], pEdcaParm->Txop[2] << 5,
- pEdcaParm->bACM[2]));
- DBGPRINT(RT_DEBUG_TRACE,
- (" AC_VO %2d %2d %2d %4d %d\n",
- pEdcaParm->Aifsn[3], pEdcaParm->Cwmin[3],
- pEdcaParm->Cwmax[3], pEdcaParm->Txop[3] << 5,
- pEdcaParm->bACM[3]));
- }
- }
-
-}
-
-/*
- ==========================================================================
- Description:
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-void AsicSetSlotTime(struct rt_rtmp_adapter *pAd, IN BOOLEAN bUseShortSlotTime)
-{
- unsigned long SlotTime;
- u32 RegValue = 0;
-
- if (pAd->CommonCfg.Channel > 14)
- bUseShortSlotTime = TRUE;
-
- if (bUseShortSlotTime
- && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED))
- return;
- else if ((!bUseShortSlotTime)
- && (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED)))
- return;
-
- if (bUseShortSlotTime)
- OPSTATUS_SET_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED);
- else
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED);
-
- SlotTime = (bUseShortSlotTime) ? 9 : 20;
-
- {
- /* force using short SLOT time for FAE to demo performance when TxBurst is ON */
- if (((pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE)
- && (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED)))
- || ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE)
- && (pAd->CommonCfg.BACapability.field.Policy ==
- BA_NOTUSE))
- ) {
- /* In this case, we will think it is doing Wi-Fi test */
- /* And we will not set to short slot when bEnableTxBurst is TRUE. */
- } else if (pAd->CommonCfg.bEnableTxBurst) {
- OPSTATUS_SET_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED);
- SlotTime = 9;
- }
- }
-
- /* */
- /* For some reasons, always set it to short slot time. */
- /* */
- /* ToDo: Should consider capability with 11B */
- /* */
- {
- if (pAd->StaCfg.BssType == BSS_ADHOC) {
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED);
- SlotTime = 20;
- }
- }
-
- RTMP_IO_READ32(pAd, BKOFF_SLOT_CFG, &RegValue);
- RegValue = RegValue & 0xFFFFFF00;
-
- RegValue |= SlotTime;
-
- RTMP_IO_WRITE32(pAd, BKOFF_SLOT_CFG, RegValue);
-}
-
-/*
- ========================================================================
- Description:
- Add Shared key information into ASIC.
- Update shared key, TxMic and RxMic to Asic Shared key table
- Update its cipherAlg to Asic Shared key Mode.
-
- Return:
- ========================================================================
-*/
-void AsicAddSharedKeyEntry(struct rt_rtmp_adapter *pAd,
- u8 BssIndex,
- u8 KeyIdx,
- u8 CipherAlg,
- u8 *pKey, u8 *pTxMic, u8 *pRxMic)
-{
- unsigned long offset; /*, csr0; */
- SHAREDKEY_MODE_STRUC csr1;
-#ifdef RTMP_MAC_PCI
- int i;
-#endif /* RTMP_MAC_PCI // */
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("AsicAddSharedKeyEntry BssIndex=%d, KeyIdx=%d\n", BssIndex,
- KeyIdx));
-/*============================================================================================ */
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("AsicAddSharedKeyEntry: %s key #%d\n", CipherName[CipherAlg],
- BssIndex * 4 + KeyIdx));
- DBGPRINT_RAW(RT_DEBUG_TRACE,
- (" Key = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
- pKey[0], pKey[1], pKey[2], pKey[3], pKey[4],
- pKey[5], pKey[6], pKey[7], pKey[8], pKey[9],
- pKey[10], pKey[11], pKey[12], pKey[13], pKey[14],
- pKey[15]));
- if (pRxMic) {
- DBGPRINT_RAW(RT_DEBUG_TRACE,
- (" Rx MIC Key = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
- pRxMic[0], pRxMic[1], pRxMic[2], pRxMic[3],
- pRxMic[4], pRxMic[5], pRxMic[6], pRxMic[7]));
- }
- if (pTxMic) {
- DBGPRINT_RAW(RT_DEBUG_TRACE,
- (" Tx MIC Key = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
- pTxMic[0], pTxMic[1], pTxMic[2], pTxMic[3],
- pTxMic[4], pTxMic[5], pTxMic[6], pTxMic[7]));
- }
-/*============================================================================================ */
- /* */
- /* fill key material - key + TX MIC + RX MIC */
- /* */
-#ifdef RTMP_MAC_PCI
- offset =
- SHARED_KEY_TABLE_BASE + (4 * BssIndex + KeyIdx) * HW_KEY_ENTRY_SIZE;
- for (i = 0; i < MAX_LEN_OF_SHARE_KEY; i++) {
- RTMP_IO_WRITE8(pAd, offset + i, pKey[i]);
- }
-
- offset += MAX_LEN_OF_SHARE_KEY;
- if (pTxMic) {
- for (i = 0; i < 8; i++) {
- RTMP_IO_WRITE8(pAd, offset + i, pTxMic[i]);
- }
- }
-
- offset += 8;
- if (pRxMic) {
- for (i = 0; i < 8; i++) {
- RTMP_IO_WRITE8(pAd, offset + i, pRxMic[i]);
- }
- }
-#endif /* RTMP_MAC_PCI // */
-#ifdef RTMP_MAC_USB
- {
- offset =
- SHARED_KEY_TABLE_BASE + (4 * BssIndex +
- KeyIdx) * HW_KEY_ENTRY_SIZE;
- RTUSBMultiWrite(pAd, offset, pKey, MAX_LEN_OF_SHARE_KEY);
-
- offset += MAX_LEN_OF_SHARE_KEY;
- if (pTxMic) {
- RTUSBMultiWrite(pAd, offset, pTxMic, 8);
- }
-
- offset += 8;
- if (pRxMic) {
- RTUSBMultiWrite(pAd, offset, pRxMic, 8);
- }
- }
-#endif /* RTMP_MAC_USB // */
-
- /* */
- /* Update cipher algorithm. WSTA always use BSS0 */
- /* */
- RTMP_IO_READ32(pAd, SHARED_KEY_MODE_BASE + 4 * (BssIndex / 2),
- &csr1.word);
- DBGPRINT(RT_DEBUG_TRACE,
- ("Read: SHARED_KEY_MODE_BASE at this Bss[%d] KeyIdx[%d]= 0x%x \n",
- BssIndex, KeyIdx, csr1.word));
- if ((BssIndex % 2) == 0) {
- if (KeyIdx == 0)
- csr1.field.Bss0Key0CipherAlg = CipherAlg;
- else if (KeyIdx == 1)
- csr1.field.Bss0Key1CipherAlg = CipherAlg;
- else if (KeyIdx == 2)
- csr1.field.Bss0Key2CipherAlg = CipherAlg;
- else
- csr1.field.Bss0Key3CipherAlg = CipherAlg;
- } else {
- if (KeyIdx == 0)
- csr1.field.Bss1Key0CipherAlg = CipherAlg;
- else if (KeyIdx == 1)
- csr1.field.Bss1Key1CipherAlg = CipherAlg;
- else if (KeyIdx == 2)
- csr1.field.Bss1Key2CipherAlg = CipherAlg;
- else
- csr1.field.Bss1Key3CipherAlg = CipherAlg;
- }
- DBGPRINT(RT_DEBUG_TRACE,
- ("Write: SHARED_KEY_MODE_BASE at this Bss[%d] = 0x%x \n",
- BssIndex, csr1.word));
- RTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE + 4 * (BssIndex / 2),
- csr1.word);
-
-}
-
-/* IRQL = DISPATCH_LEVEL */
-void AsicRemoveSharedKeyEntry(struct rt_rtmp_adapter *pAd,
- u8 BssIndex, u8 KeyIdx)
-{
- /*unsigned long SecCsr0; */
- SHAREDKEY_MODE_STRUC csr1;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("AsicRemoveSharedKeyEntry: #%d \n", BssIndex * 4 + KeyIdx));
-
- RTMP_IO_READ32(pAd, SHARED_KEY_MODE_BASE + 4 * (BssIndex / 2),
- &csr1.word);
- if ((BssIndex % 2) == 0) {
- if (KeyIdx == 0)
- csr1.field.Bss0Key0CipherAlg = 0;
- else if (KeyIdx == 1)
- csr1.field.Bss0Key1CipherAlg = 0;
- else if (KeyIdx == 2)
- csr1.field.Bss0Key2CipherAlg = 0;
- else
- csr1.field.Bss0Key3CipherAlg = 0;
- } else {
- if (KeyIdx == 0)
- csr1.field.Bss1Key0CipherAlg = 0;
- else if (KeyIdx == 1)
- csr1.field.Bss1Key1CipherAlg = 0;
- else if (KeyIdx == 2)
- csr1.field.Bss1Key2CipherAlg = 0;
- else
- csr1.field.Bss1Key3CipherAlg = 0;
- }
- DBGPRINT(RT_DEBUG_TRACE,
- ("Write: SHARED_KEY_MODE_BASE at this Bss[%d] = 0x%x \n",
- BssIndex, csr1.word));
- RTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE + 4 * (BssIndex / 2),
- csr1.word);
- ASSERT(BssIndex < 4);
- ASSERT(KeyIdx < 4);
-
-}
-
-void AsicUpdateWCIDAttribute(struct rt_rtmp_adapter *pAd,
- u16 WCID,
- u8 BssIndex,
- u8 CipherAlg,
- IN BOOLEAN bUsePairewiseKeyTable)
-{
- unsigned long WCIDAttri = 0, offset;
-
- /* */
- /* Update WCID attribute. */
- /* Only TxKey could update WCID attribute. */
- /* */
- offset = MAC_WCID_ATTRIBUTE_BASE + (WCID * HW_WCID_ATTRI_SIZE);
- WCIDAttri =
- (BssIndex << 4) | (CipherAlg << 1) | (bUsePairewiseKeyTable);
- RTMP_IO_WRITE32(pAd, offset, WCIDAttri);
-}
-
-void AsicUpdateWCIDIVEIV(struct rt_rtmp_adapter *pAd,
- u16 WCID, unsigned long uIV, unsigned long uEIV)
-{
- unsigned long offset;
-
- offset = MAC_IVEIV_TABLE_BASE + (WCID * HW_IVEIV_ENTRY_SIZE);
-
- RTMP_IO_WRITE32(pAd, offset, uIV);
- RTMP_IO_WRITE32(pAd, offset + 4, uEIV);
-}
-
-void AsicUpdateRxWCIDTable(struct rt_rtmp_adapter *pAd,
- u16 WCID, u8 *pAddr)
-{
- unsigned long offset;
- unsigned long Addr;
-
- offset = MAC_WCID_BASE + (WCID * HW_WCID_ENTRY_SIZE);
- Addr = pAddr[0] + (pAddr[1] << 8) + (pAddr[2] << 16) + (pAddr[3] << 24);
- RTMP_IO_WRITE32(pAd, offset, Addr);
- Addr = pAddr[4] + (pAddr[5] << 8);
- RTMP_IO_WRITE32(pAd, offset + 4, Addr);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Set Cipher Key, Cipher algorithm, IV/EIV to Asic
-
- Arguments:
- pAd Pointer to our adapter
- WCID WCID Entry number.
- BssIndex BSSID index, station or none multiple BSSID support
- this value should be 0.
- KeyIdx This KeyIdx will set to IV's KeyID if bTxKey enabled
- pCipherKey Pointer to Cipher Key.
- bUsePairewiseKeyTable TRUE means saved the key in SharedKey table,
- otherwise PairewiseKey table
- bTxKey This is the transmit key if enabled.
-
- Return Value:
- None
-
- Note:
- This routine will set the relative key stuff to Asic including WCID attribute,
- Cipher Key, Cipher algorithm and IV/EIV.
-
- IV/EIV will be update if this CipherKey is the transmission key because
- ASIC will base on IV's KeyID value to select Cipher Key.
-
- If bTxKey sets to FALSE, this is not the TX key, but it could be
- RX key
-
- For AP mode bTxKey must be always set to TRUE.
- ========================================================================
-*/
-void AsicAddKeyEntry(struct rt_rtmp_adapter *pAd,
- u16 WCID,
- u8 BssIndex,
- u8 KeyIdx,
- struct rt_cipher_key *pCipherKey,
- IN BOOLEAN bUsePairewiseKeyTable, IN BOOLEAN bTxKey)
-{
- unsigned long offset;
-/* unsigned long WCIDAttri = 0; */
- u8 IV4 = 0;
- u8 *pKey = pCipherKey->Key;
-/* unsigned long KeyLen = pCipherKey->KeyLen; */
- u8 *pTxMic = pCipherKey->TxMic;
- u8 *pRxMic = pCipherKey->RxMic;
- u8 *pTxtsc = pCipherKey->TxTsc;
- u8 CipherAlg = pCipherKey->CipherAlg;
- SHAREDKEY_MODE_STRUC csr1;
-#ifdef RTMP_MAC_PCI
- u8 i;
-#endif /* RTMP_MAC_PCI // */
-
-/* ASSERT(KeyLen <= MAX_LEN_OF_PEER_KEY); */
-
- DBGPRINT(RT_DEBUG_TRACE, ("==> AsicAddKeyEntry\n"));
- /* */
- /* 1.) decide key table offset */
- /* */
- if (bUsePairewiseKeyTable)
- offset = PAIRWISE_KEY_TABLE_BASE + (WCID * HW_KEY_ENTRY_SIZE);
- else
- offset =
- SHARED_KEY_TABLE_BASE + (4 * BssIndex +
- KeyIdx) * HW_KEY_ENTRY_SIZE;
-
- /* */
- /* 2.) Set Key to Asic */
- /* */
- /*for (i = 0; i < KeyLen; i++) */
-#ifdef RTMP_MAC_PCI
- for (i = 0; i < MAX_LEN_OF_PEER_KEY; i++) {
- RTMP_IO_WRITE8(pAd, offset + i, pKey[i]);
- }
- offset += MAX_LEN_OF_PEER_KEY;
-
- /* */
- /* 3.) Set MIC key if available */
- /* */
- if (pTxMic) {
- for (i = 0; i < 8; i++) {
- RTMP_IO_WRITE8(pAd, offset + i, pTxMic[i]);
- }
- }
- offset += LEN_TKIP_TXMICK;
-
- if (pRxMic) {
- for (i = 0; i < 8; i++) {
- RTMP_IO_WRITE8(pAd, offset + i, pRxMic[i]);
- }
- }
-#endif /* RTMP_MAC_PCI // */
-#ifdef RTMP_MAC_USB
- RTUSBMultiWrite(pAd, offset, pKey, MAX_LEN_OF_PEER_KEY);
- offset += MAX_LEN_OF_PEER_KEY;
-
- /* */
- /* 3.) Set MIC key if available */
- /* */
- if (pTxMic) {
- RTUSBMultiWrite(pAd, offset, pTxMic, 8);
- }
- offset += LEN_TKIP_TXMICK;
-
- if (pRxMic) {
- RTUSBMultiWrite(pAd, offset, pRxMic, 8);
- }
-#endif /* RTMP_MAC_USB // */
-
- /* */
- /* 4.) Modify IV/EIV if needs */
- /* This will force Asic to use this key ID by setting IV. */
- /* */
- if (bTxKey) {
-#ifdef RTMP_MAC_PCI
- offset = MAC_IVEIV_TABLE_BASE + (WCID * HW_IVEIV_ENTRY_SIZE);
- /* */
- /* Write IV */
- /* */
- RTMP_IO_WRITE8(pAd, offset, pTxtsc[1]);
- RTMP_IO_WRITE8(pAd, offset + 1, ((pTxtsc[1] | 0x20) & 0x7f));
- RTMP_IO_WRITE8(pAd, offset + 2, pTxtsc[0]);
-
- IV4 = (KeyIdx << 6);
- if ((CipherAlg == CIPHER_TKIP)
- || (CipherAlg == CIPHER_TKIP_NO_MIC)
- || (CipherAlg == CIPHER_AES))
- IV4 |= 0x20; /* turn on extension bit means EIV existence */
-
- RTMP_IO_WRITE8(pAd, offset + 3, IV4);
-
- /* */
- /* Write EIV */
- /* */
- offset += 4;
- for (i = 0; i < 4; i++) {
- RTMP_IO_WRITE8(pAd, offset + i, pTxtsc[i + 2]);
- }
-#endif /* RTMP_MAC_PCI // */
-#ifdef RTMP_MAC_USB
- u32 tmpVal;
-
- /* */
- /* Write IV */
- /* */
- IV4 = (KeyIdx << 6);
- if ((CipherAlg == CIPHER_TKIP)
- || (CipherAlg == CIPHER_TKIP_NO_MIC)
- || (CipherAlg == CIPHER_AES))
- IV4 |= 0x20; /* turn on extension bit means EIV existence */
-
- tmpVal =
- pTxtsc[1] + (((pTxtsc[1] | 0x20) & 0x7f) << 8) +
- (pTxtsc[0] << 16) + (IV4 << 24);
- RTMP_IO_WRITE32(pAd, offset, tmpVal);
-
- /* */
- /* Write EIV */
- /* */
- offset += 4;
- RTMP_IO_WRITE32(pAd, offset, *(u32 *)& pCipherKey->TxTsc[2]);
-#endif /* RTMP_MAC_USB // */
-
- AsicUpdateWCIDAttribute(pAd, WCID, BssIndex, CipherAlg,
- bUsePairewiseKeyTable);
- }
-
- if (!bUsePairewiseKeyTable) {
- /* */
- /* Only update the shared key security mode */
- /* */
- RTMP_IO_READ32(pAd, SHARED_KEY_MODE_BASE + 4 * (BssIndex / 2),
- &csr1.word);
- if ((BssIndex % 2) == 0) {
- if (KeyIdx == 0)
- csr1.field.Bss0Key0CipherAlg = CipherAlg;
- else if (KeyIdx == 1)
- csr1.field.Bss0Key1CipherAlg = CipherAlg;
- else if (KeyIdx == 2)
- csr1.field.Bss0Key2CipherAlg = CipherAlg;
- else
- csr1.field.Bss0Key3CipherAlg = CipherAlg;
- } else {
- if (KeyIdx == 0)
- csr1.field.Bss1Key0CipherAlg = CipherAlg;
- else if (KeyIdx == 1)
- csr1.field.Bss1Key1CipherAlg = CipherAlg;
- else if (KeyIdx == 2)
- csr1.field.Bss1Key2CipherAlg = CipherAlg;
- else
- csr1.field.Bss1Key3CipherAlg = CipherAlg;
- }
- RTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE + 4 * (BssIndex / 2),
- csr1.word);
- }
-
- DBGPRINT(RT_DEBUG_TRACE, ("<== AsicAddKeyEntry\n"));
-}
-
-/*
- ========================================================================
- Description:
- Add Pair-wise key material into ASIC.
- Update pairwise key, TxMic and RxMic to Asic Pair-wise key table
-
- Return:
- ========================================================================
-*/
-void AsicAddPairwiseKeyEntry(struct rt_rtmp_adapter *pAd,
- u8 *pAddr,
- u8 WCID, struct rt_cipher_key *pCipherKey)
-{
- int i;
- unsigned long offset;
- u8 *pKey = pCipherKey->Key;
- u8 *pTxMic = pCipherKey->TxMic;
- u8 *pRxMic = pCipherKey->RxMic;
-#ifdef DBG
- u8 CipherAlg = pCipherKey->CipherAlg;
-#endif /* DBG // */
-
- /* EKEY */
- offset = PAIRWISE_KEY_TABLE_BASE + (WCID * HW_KEY_ENTRY_SIZE);
-#ifdef RTMP_MAC_PCI
- for (i = 0; i < MAX_LEN_OF_PEER_KEY; i++) {
- RTMP_IO_WRITE8(pAd, offset + i, pKey[i]);
- }
-#endif /* RTMP_MAC_PCI // */
-#ifdef RTMP_MAC_USB
- RTUSBMultiWrite(pAd, offset, &pCipherKey->Key[0], MAX_LEN_OF_PEER_KEY);
-#endif /* RTMP_MAC_USB // */
- for (i = 0; i < MAX_LEN_OF_PEER_KEY; i += 4) {
- u32 Value;
- RTMP_IO_READ32(pAd, offset + i, &Value);
- }
-
- offset += MAX_LEN_OF_PEER_KEY;
-
- /* MIC KEY */
- if (pTxMic) {
-#ifdef RTMP_MAC_PCI
- for (i = 0; i < 8; i++) {
- RTMP_IO_WRITE8(pAd, offset + i, pTxMic[i]);
- }
-#endif /* RTMP_MAC_PCI // */
-#ifdef RTMP_MAC_USB
- RTUSBMultiWrite(pAd, offset, &pCipherKey->TxMic[0], 8);
-#endif /* RTMP_MAC_USB // */
- }
- offset += 8;
- if (pRxMic) {
-#ifdef RTMP_MAC_PCI
- for (i = 0; i < 8; i++) {
- RTMP_IO_WRITE8(pAd, offset + i, pRxMic[i]);
- }
-#endif /* RTMP_MAC_PCI // */
-#ifdef RTMP_MAC_USB
- RTUSBMultiWrite(pAd, offset, &pCipherKey->RxMic[0], 8);
-#endif /* RTMP_MAC_USB // */
- }
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("AsicAddPairwiseKeyEntry: WCID #%d Alg=%s\n", WCID,
- CipherName[CipherAlg]));
- DBGPRINT(RT_DEBUG_TRACE,
- (" Key = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
- pKey[0], pKey[1], pKey[2], pKey[3], pKey[4], pKey[5],
- pKey[6], pKey[7], pKey[8], pKey[9], pKey[10], pKey[11],
- pKey[12], pKey[13], pKey[14], pKey[15]));
- if (pRxMic) {
- DBGPRINT(RT_DEBUG_TRACE,
- (" Rx MIC Key = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
- pRxMic[0], pRxMic[1], pRxMic[2], pRxMic[3],
- pRxMic[4], pRxMic[5], pRxMic[6], pRxMic[7]));
- }
- if (pTxMic) {
- DBGPRINT(RT_DEBUG_TRACE,
- (" Tx MIC Key = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
- pTxMic[0], pTxMic[1], pTxMic[2], pTxMic[3],
- pTxMic[4], pTxMic[5], pTxMic[6], pTxMic[7]));
- }
-}
-
-/*
- ========================================================================
- Description:
- Remove Pair-wise key material from ASIC.
-
- Return:
- ========================================================================
-*/
-void AsicRemovePairwiseKeyEntry(struct rt_rtmp_adapter *pAd,
- u8 BssIdx, u8 Wcid)
-{
- unsigned long WCIDAttri;
- u16 offset;
-
- /* re-set the entry's WCID attribute as OPEN-NONE. */
- offset = MAC_WCID_ATTRIBUTE_BASE + (Wcid * HW_WCID_ATTRI_SIZE);
- WCIDAttri = (BssIdx << 4) | PAIRWISEKEYTABLE;
- RTMP_IO_WRITE32(pAd, offset, WCIDAttri);
-}
-
-BOOLEAN AsicSendCommandToMcu(struct rt_rtmp_adapter *pAd,
- u8 Command,
- u8 Token, u8 Arg0, u8 Arg1)
-{
-
- if (pAd->chipOps.sendCommandToMcu)
- pAd->chipOps.sendCommandToMcu(pAd, Command, Token, Arg0, Arg1);
-
- return TRUE;
-}
-
-void AsicSetRxAnt(struct rt_rtmp_adapter *pAd, u8 Ant)
-{
-#ifdef RT30xx
- /* RT3572 ATE need not to do this. */
- RT30xxSetRxAnt(pAd, Ant);
-#endif /* RT30xx // */
-}
-
-void AsicTurnOffRFClk(struct rt_rtmp_adapter *pAd, u8 Channel)
-{
- if (pAd->chipOps.AsicRfTurnOff) {
- pAd->chipOps.AsicRfTurnOff(pAd);
- } else {
- /* RF R2 bit 18 = 0 */
- u32 R1 = 0, R2 = 0, R3 = 0;
- u8 index;
- struct rt_rtmp_rf_regs *RFRegTable;
-
- RFRegTable = RF2850RegTable;
-
- switch (pAd->RfIcType) {
- case RFIC_2820:
- case RFIC_2850:
- case RFIC_2720:
- case RFIC_2750:
-
- for (index = 0; index < NUM_OF_2850_CHNL; index++) {
- if (Channel == RFRegTable[index].Channel) {
- R1 = RFRegTable[index].R1 & 0xffffdfff;
- R2 = RFRegTable[index].R2 & 0xfffbffff;
- R3 = RFRegTable[index].R3 & 0xfff3ffff;
-
- RTMP_RF_IO_WRITE32(pAd, R1);
- RTMP_RF_IO_WRITE32(pAd, R2);
-
- /* Program R1b13 to 1, R3/b18,19 to 0, R2b18 to 0. */
- /* Set RF R2 bit18=0, R3 bit[18:19]=0 */
- /*if (pAd->StaCfg.bRadio == FALSE) */
- if (1) {
- RTMP_RF_IO_WRITE32(pAd, R3);
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("AsicTurnOffRFClk#%d(RF=%d, ) , R2=0x%08x, R3 = 0x%08x \n",
- Channel,
- pAd->RfIcType, R2,
- R3));
- } else
- DBGPRINT(RT_DEBUG_TRACE,
- ("AsicTurnOffRFClk#%d(RF=%d, ) , R2=0x%08x \n",
- Channel,
- pAd->RfIcType, R2));
- break;
- }
- }
- break;
-
- default:
- break;
- }
- }
-}
-
-void AsicTurnOnRFClk(struct rt_rtmp_adapter *pAd, u8 Channel)
-{
- /* RF R2 bit 18 = 0 */
- u32 R1 = 0, R2 = 0, R3 = 0;
- u8 index;
- struct rt_rtmp_rf_regs *RFRegTable;
-
-#ifdef PCIE_PS_SUPPORT
- /* The RF programming sequence is difference between 3xxx and 2xxx */
- if ((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))) {
- return;
- }
-#endif /* PCIE_PS_SUPPORT // */
-
- RFRegTable = RF2850RegTable;
-
- switch (pAd->RfIcType) {
- case RFIC_2820:
- case RFIC_2850:
- case RFIC_2720:
- case RFIC_2750:
-
- for (index = 0; index < NUM_OF_2850_CHNL; index++) {
- if (Channel == RFRegTable[index].Channel) {
- R3 = pAd->LatchRfRegs.R3;
- R3 &= 0xfff3ffff;
- R3 |= 0x00080000;
- RTMP_RF_IO_WRITE32(pAd, R3);
-
- R1 = RFRegTable[index].R1;
- RTMP_RF_IO_WRITE32(pAd, R1);
-
- R2 = RFRegTable[index].R2;
- if (pAd->Antenna.field.TxPath == 1) {
- R2 |= 0x4000; /* If TXpath is 1, bit 14 = 1; */
- }
-
- if (pAd->Antenna.field.RxPath == 2) {
- R2 |= 0x40; /* write 1 to off Rxpath. */
- } else if (pAd->Antenna.field.RxPath == 1) {
- R2 |= 0x20040; /* write 1 to off RxPath */
- }
- RTMP_RF_IO_WRITE32(pAd, R2);
-
- break;
- }
- }
- break;
-
- default:
- break;
- }
-
- DBGPRINT(RT_DEBUG_TRACE, ("AsicTurnOnRFClk#%d(RF=%d, ) , R2=0x%08x\n",
- Channel, pAd->RfIcType, R2));
-}
diff --git a/drivers/staging/rt2860/common/cmm_cfg.c b/drivers/staging/rt2860/common/cmm_cfg.c
deleted file mode 100644
index 727f79929258..000000000000
--- a/drivers/staging/rt2860/common/cmm_cfg.c
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-
- Module Name:
- cmm_cfg.c
-
- Abstract:
- Ralink WiFi Driver configuration related subroutines
-
- Revision History:
- Who When What
- --------- ---------- ----------------------------------------------
-*/
-
-#include "../rt_config.h"
-
-char *GetPhyMode(int Mode)
-{
- switch (Mode) {
- case MODE_CCK:
- return "CCK";
-
- case MODE_OFDM:
- return "OFDM";
- case MODE_HTMIX:
- return "HTMIX";
-
- case MODE_HTGREENFIELD:
- return "GREEN";
- default:
- return "N/A";
- }
-}
-
-char *GetBW(int BW)
-{
- switch (BW) {
- case BW_10:
- return "10M";
-
- case BW_20:
- return "20M";
- case BW_40:
- return "40M";
- default:
- return "N/A";
- }
-}
-
-/*
- ==========================================================================
- Description:
- Set Country Region to pAd->CommonCfg.CountryRegion.
- This command will not work, if the field of CountryRegion in eeprom is programmed.
-
- Return:
- TRUE if all parameters are OK, FALSE otherwise
- ==========================================================================
-*/
-int RT_CfgSetCountryRegion(struct rt_rtmp_adapter *pAd, char *arg, int band)
-{
- long region, regionMax;
- u8 *pCountryRegion;
-
- region = simple_strtol(arg, 0, 10);
-
- if (band == BAND_24G) {
- pCountryRegion = &pAd->CommonCfg.CountryRegion;
- regionMax = REGION_MAXIMUM_BG_BAND;
- } else {
- pCountryRegion = &pAd->CommonCfg.CountryRegionForABand;
- regionMax = REGION_MAXIMUM_A_BAND;
- }
-
- /* TODO: Is it neccesay for following check??? */
- /* Country can be set only when EEPROM not programmed */
- if (*pCountryRegion & 0x80) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("CfgSetCountryRegion():CountryRegion in eeprom was programmed\n"));
- return FALSE;
- }
-
- if ((region >= 0) && (region <= REGION_MAXIMUM_BG_BAND)) {
- *pCountryRegion = (u8)region;
- } else if ((region == REGION_31_BG_BAND) && (band == BAND_24G)) {
- *pCountryRegion = (u8)region;
- } else {
- DBGPRINT(RT_DEBUG_ERROR,
- ("CfgSetCountryRegion():region(%ld) out of range!\n",
- region));
- return FALSE;
- }
-
- return TRUE;
-
-}
-
-/*
- ==========================================================================
- Description:
- Set Wireless Mode
- Return:
- TRUE if all parameters are OK, FALSE otherwise
- ==========================================================================
-*/
-int RT_CfgSetWirelessMode(struct rt_rtmp_adapter *pAd, char *arg)
-{
- int MaxPhyMode = PHY_11G;
- long WirelessMode;
-
- MaxPhyMode = PHY_11N_5G;
-
- WirelessMode = simple_strtol(arg, 0, 10);
- if (WirelessMode <= MaxPhyMode) {
- pAd->CommonCfg.PhyMode = WirelessMode;
- return TRUE;
- }
-
- return FALSE;
-
-}
-
-int RT_CfgSetShortSlot(struct rt_rtmp_adapter *pAd, char *arg)
-{
- long ShortSlot;
-
- ShortSlot = simple_strtol(arg, 0, 10);
-
- if (ShortSlot == 1)
- pAd->CommonCfg.bUseShortSlotTime = TRUE;
- else if (ShortSlot == 0)
- pAd->CommonCfg.bUseShortSlotTime = FALSE;
- else
- return FALSE; /*Invalid argument */
-
- return TRUE;
-}
-
-/*
- ==========================================================================
- Description:
- Set WEP KEY base on KeyIdx
- Return:
- TRUE if all parameters are OK, FALSE otherwise
- ==========================================================================
-*/
-int RT_CfgSetWepKey(struct rt_rtmp_adapter *pAd,
- char *keyString,
- struct rt_cipher_key *pSharedKey, int keyIdx)
-{
- int KeyLen;
- int i;
- u8 CipherAlg = CIPHER_NONE;
- BOOLEAN bKeyIsHex = FALSE;
-
- /* TODO: Shall we do memset for the original key info?? */
- memset(pSharedKey, 0, sizeof(struct rt_cipher_key));
- KeyLen = strlen(keyString);
- switch (KeyLen) {
- case 5: /*wep 40 Ascii type */
- case 13: /*wep 104 Ascii type */
- bKeyIsHex = FALSE;
- pSharedKey->KeyLen = KeyLen;
- NdisMoveMemory(pSharedKey->Key, keyString, KeyLen);
- break;
-
- case 10: /*wep 40 Hex type */
- case 26: /*wep 104 Hex type */
- for (i = 0; i < KeyLen; i++) {
- if (!isxdigit(*(keyString + i)))
- return FALSE; /*Not Hex value; */
- }
- bKeyIsHex = TRUE;
- pSharedKey->KeyLen = KeyLen / 2;
- AtoH(keyString, pSharedKey->Key, pSharedKey->KeyLen);
- break;
-
- default: /*Invalid argument */
- DBGPRINT(RT_DEBUG_TRACE,
- ("RT_CfgSetWepKey(keyIdx=%d):Invalid argument (arg=%s)\n",
- keyIdx, keyString));
- return FALSE;
- }
-
- pSharedKey->CipherAlg = ((KeyLen % 5) ? CIPHER_WEP128 : CIPHER_WEP64);
- DBGPRINT(RT_DEBUG_TRACE,
- ("RT_CfgSetWepKey:(KeyIdx=%d,type=%s, Alg=%s)\n", keyIdx,
- (bKeyIsHex == FALSE ? "Ascii" : "Hex"),
- CipherName[CipherAlg]));
-
- return TRUE;
-}
-
-/*
- ==========================================================================
- Description:
- Set WPA PSK key
-
- Arguments:
- pAdapter Pointer to our adapter
- keyString WPA pre-shared key string
- pHashStr String used for password hash function
- hashStrLen Length of the hash string
- pPMKBuf Output buffer of WPAPSK key
-
- Return:
- TRUE if all parameters are OK, FALSE otherwise
- ==========================================================================
-*/
-int RT_CfgSetWPAPSKKey(struct rt_rtmp_adapter *pAd,
- char *keyString,
- u8 * pHashStr,
- int hashStrLen, u8 *pPMKBuf)
-{
- int keyLen;
- u8 keyMaterial[40];
-
- keyLen = strlen(keyString);
- if ((keyLen < 8) || (keyLen > 64)) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("WPAPSK Key length(%d) error, required 8 ~ 64 characters!(keyStr=%s)\n",
- keyLen, keyString));
- return FALSE;
- }
-
- memset(pPMKBuf, 0, 32);
- if (keyLen == 64) {
- AtoH(keyString, pPMKBuf, 32);
- } else {
- PasswordHash(keyString, pHashStr, hashStrLen, keyMaterial);
- NdisMoveMemory(pPMKBuf, keyMaterial, 32);
- }
-
- return TRUE;
-}
diff --git a/drivers/staging/rt2860/common/cmm_data.c b/drivers/staging/rt2860/common/cmm_data.c
deleted file mode 100644
index 33799e1449ae..000000000000
--- a/drivers/staging/rt2860/common/cmm_data.c
+++ /dev/null
@@ -1,2361 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-*/
-
-#include "../rt_config.h"
-
-u8 SNAP_802_1H[] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
-u8 SNAP_BRIDGE_TUNNEL[] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 };
-
-/* Add Cisco Aironet SNAP heade for CCX2 support */
-u8 SNAP_AIRONET[] = { 0xaa, 0xaa, 0x03, 0x00, 0x40, 0x96, 0x00, 0x00 };
-u8 CKIP_LLC_SNAP[] = { 0xaa, 0xaa, 0x03, 0x00, 0x40, 0x96, 0x00, 0x02 };
-u8 EAPOL_LLC_SNAP[] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, 0x88, 0x8e };
-u8 EAPOL[] = { 0x88, 0x8e };
-u8 TPID[] = { 0x81, 0x00 }; /* VLAN related */
-
-u8 IPX[] = { 0x81, 0x37 };
-u8 APPLE_TALK[] = { 0x80, 0xf3 };
-
-u8 RateIdToPlcpSignal[12] = {
- 0, /* RATE_1 */ 1, /* RATE_2 */ 2, /* RATE_5_5 */ 3, /* RATE_11 *//* see BBP spec */
- 11, /* RATE_6 */ 15, /* RATE_9 */ 10, /* RATE_12 */ 14, /* RATE_18 *//* see IEEE802.11a-1999 p.14 */
- 9, /* RATE_24 */ 13, /* RATE_36 */ 8, /* RATE_48 */ 12 /* RATE_54 */
-}; /* see IEEE802.11a-1999 p.14 */
-
-u8 OfdmSignalToRateId[16] = {
- RATE_54, RATE_54, RATE_54, RATE_54, /* OFDM PLCP Signal = 0, 1, 2, 3 respectively */
- RATE_54, RATE_54, RATE_54, RATE_54, /* OFDM PLCP Signal = 4, 5, 6, 7 respectively */
- RATE_48, RATE_24, RATE_12, RATE_6, /* OFDM PLCP Signal = 8, 9, 10, 11 respectively */
- RATE_54, RATE_36, RATE_18, RATE_9, /* OFDM PLCP Signal = 12, 13, 14, 15 respectively */
-};
-
-u8 OfdmRateToRxwiMCS[12] = {
- 0, 0, 0, 0,
- 0, 1, 2, 3, /* OFDM rate 6,9,12,18 = rxwi mcs 0,1,2,3 */
- 4, 5, 6, 7, /* OFDM rate 24,36,48,54 = rxwi mcs 4,5,6,7 */
-};
-
-u8 RxwiMCSToOfdmRate[12] = {
- RATE_6, RATE_9, RATE_12, RATE_18,
- RATE_24, RATE_36, RATE_48, RATE_54, /* OFDM rate 6,9,12,18 = rxwi mcs 0,1,2,3 */
- 4, 5, 6, 7, /* OFDM rate 24,36,48,54 = rxwi mcs 4,5,6,7 */
-};
-
-char *MCSToMbps[] =
- { "1Mbps", "2Mbps", "5.5Mbps", "11Mbps", "06Mbps", "09Mbps", "12Mbps",
-"18Mbps", "24Mbps", "36Mbps", "48Mbps", "54Mbps", "MM-0", "MM-1", "MM-2", "MM-3",
-"MM-4", "MM-5", "MM-6", "MM-7", "MM-8", "MM-9", "MM-10", "MM-11", "MM-12", "MM-13",
-"MM-14", "MM-15", "MM-32", "ee1", "ee2", "ee3" };
-
-u8 default_cwmin[] =
- { CW_MIN_IN_BITS, CW_MIN_IN_BITS, CW_MIN_IN_BITS - 1, CW_MIN_IN_BITS - 2 };
-/*u8 default_cwmax[]={CW_MAX_IN_BITS, CW_MAX_IN_BITS, CW_MIN_IN_BITS, CW_MIN_IN_BITS-1}; */
-u8 default_sta_aifsn[] = { 3, 7, 2, 2 };
-
-u8 MapUserPriorityToAccessCategory[8] =
- { QID_AC_BE, QID_AC_BK, QID_AC_BK, QID_AC_BE, QID_AC_VI, QID_AC_VI,
-QID_AC_VO, QID_AC_VO };
-
-/*
- ========================================================================
-
- Routine Description:
- API for MLME to transmit management frame to AP (BSS Mode)
- or station (IBSS Mode)
-
- Arguments:
- pAd Pointer to our adapter
- pData Pointer to the outgoing 802.11 frame
- Length Size of outgoing management frame
-
- Return Value:
- NDIS_STATUS_FAILURE
- NDIS_STATUS_PENDING
- NDIS_STATUS_SUCCESS
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-int MiniportMMRequest(struct rt_rtmp_adapter *pAd,
- u8 QueIdx, u8 *pData, u32 Length)
-{
- void *pPacket;
- int Status = NDIS_STATUS_SUCCESS;
- unsigned long FreeNum;
- u8 rtmpHwHdr[TXINFO_SIZE + TXWI_SIZE]; /*RTMP_HW_HDR_LEN]; */
-#ifdef RTMP_MAC_PCI
- unsigned long IrqFlags = 0;
- u8 IrqState;
-#endif /* RTMP_MAC_PCI // */
- BOOLEAN bUseDataQ = FALSE;
- int retryCnt = 0;
-
- ASSERT(Length <= MGMT_DMA_BUFFER_SIZE);
-
- if ((QueIdx & MGMT_USE_QUEUE_FLAG) == MGMT_USE_QUEUE_FLAG) {
- bUseDataQ = TRUE;
- QueIdx &= (~MGMT_USE_QUEUE_FLAG);
- }
-#ifdef RTMP_MAC_PCI
- /* 2860C use Tx Ring */
- IrqState = pAd->irq_disabled;
- if (pAd->MACVersion == 0x28600100) {
- QueIdx = (bUseDataQ == TRUE ? QueIdx : 3);
- bUseDataQ = TRUE;
- }
- if (bUseDataQ && (!IrqState))
- RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);
-#endif /* RTMP_MAC_PCI // */
-
- do {
- /* Reset is in progress, stop immediately */
- if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS) ||
- RTMP_TEST_FLAG(pAd,
- fRTMP_ADAPTER_HALT_IN_PROGRESS |
- fRTMP_ADAPTER_NIC_NOT_EXIST)
- || !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP)) {
- Status = NDIS_STATUS_FAILURE;
- break;
- }
- /* Check Free priority queue */
- /* Since we use PBF Queue2 for management frame. Its corresponding DMA ring should be using TxRing. */
-#ifdef RTMP_MAC_PCI
- if (bUseDataQ) {
- retryCnt = MAX_DATAMM_RETRY;
- /* free Tx(QueIdx) resources */
- RTMPFreeTXDUponTxDmaDone(pAd, QueIdx);
- FreeNum = GET_TXRING_FREENO(pAd, QueIdx);
- } else
-#endif /* RTMP_MAC_PCI // */
- {
- FreeNum = GET_MGMTRING_FREENO(pAd);
- }
-
- if ((FreeNum > 0)) {
- /* We need to reserve space for rtmp hardware header. i.e., TxWI for RT2860 and TxInfo+TxWI for RT2870 */
- NdisZeroMemory(&rtmpHwHdr, (TXINFO_SIZE + TXWI_SIZE));
- Status =
- RTMPAllocateNdisPacket(pAd, &pPacket,
- (u8 *)& rtmpHwHdr,
- (TXINFO_SIZE + TXWI_SIZE),
- pData, Length);
- if (Status != NDIS_STATUS_SUCCESS) {
- DBGPRINT(RT_DEBUG_WARN,
- ("MiniportMMRequest (error:: can't allocate NDIS PACKET)\n"));
- break;
- }
- /*pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_CCK; */
- /*pAd->CommonCfg.MlmeRate = RATE_2; */
-
-#ifdef RTMP_MAC_PCI
- if (bUseDataQ) {
- Status =
- MlmeDataHardTransmit(pAd, QueIdx, pPacket);
- retryCnt--;
- } else
-#endif /* RTMP_MAC_PCI // */
- Status = MlmeHardTransmit(pAd, QueIdx, pPacket);
- if (Status == NDIS_STATUS_SUCCESS)
- retryCnt = 0;
- else
- RTMPFreeNdisPacket(pAd, pPacket);
- } else {
- pAd->RalinkCounters.MgmtRingFullCount++;
-#ifdef RTMP_MAC_PCI
- if (bUseDataQ) {
- retryCnt--;
- DBGPRINT(RT_DEBUG_TRACE,
- ("retryCnt %d\n", retryCnt));
- if (retryCnt == 0) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("Qidx(%d), not enough space in DataRing, MgmtRingFullCount=%ld!\n",
- QueIdx,
- pAd->RalinkCounters.
- MgmtRingFullCount));
- }
- }
-#endif /* RTMP_MAC_PCI // */
- DBGPRINT(RT_DEBUG_ERROR,
- ("Qidx(%d), not enough space in MgmtRing, MgmtRingFullCount=%ld!\n",
- QueIdx,
- pAd->RalinkCounters.MgmtRingFullCount));
- }
- } while (retryCnt > 0);
-
-#ifdef RTMP_MAC_PCI
- if (bUseDataQ && (!IrqState))
- RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);
-#endif /* RTMP_MAC_PCI // */
-
- return Status;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Copy frame from waiting queue into relative ring buffer and set
- appropriate ASIC register to kick hardware transmit function
-
- Arguments:
- pAd Pointer to our adapter
- pBuffer Pointer to memory of outgoing frame
- Length Size of outgoing management frame
-
- Return Value:
- NDIS_STATUS_FAILURE
- NDIS_STATUS_PENDING
- NDIS_STATUS_SUCCESS
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-int MlmeHardTransmit(struct rt_rtmp_adapter *pAd,
- u8 QueIdx, void *pPacket)
-{
- struct rt_packet_info PacketInfo;
- u8 *pSrcBufVA;
- u32 SrcBufLen;
- struct rt_header_802_11 * pHeader_802_11;
-
- if ((pAd->CommonCfg.RadarDetect.RDMode != RD_NORMAL_MODE)
- ) {
- return NDIS_STATUS_FAILURE;
- }
-
- RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen);
- if (pSrcBufVA == NULL)
- return NDIS_STATUS_FAILURE;
-
- pHeader_802_11 = (struct rt_header_802_11 *) (pSrcBufVA + TXINFO_SIZE + TXWI_SIZE);
-
-#ifdef RTMP_MAC_PCI
- if (pAd->MACVersion == 0x28600100)
- return MlmeHardTransmitTxRing(pAd, QueIdx, pPacket);
- else
-#endif /* RTMP_MAC_PCI // */
- return MlmeHardTransmitMgmtRing(pAd, QueIdx, pPacket);
-
-}
-
-int MlmeHardTransmitMgmtRing(struct rt_rtmp_adapter *pAd,
- u8 QueIdx, void *pPacket)
-{
- struct rt_packet_info PacketInfo;
- u8 *pSrcBufVA;
- u32 SrcBufLen;
- struct rt_header_802_11 * pHeader_802_11;
- BOOLEAN bAckRequired, bInsertTimestamp;
- u8 MlmeRate;
- struct rt_txwi * pFirstTxWI;
- struct rt_mac_table_entry *pMacEntry = NULL;
- u8 PID;
-
- RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen);
-
- /* Make sure MGMT ring resource won't be used by other threads */
- RTMP_SEM_LOCK(&pAd->MgmtRingLock);
- if (pSrcBufVA == NULL) {
- /* The buffer shouldn't be NULL */
- RTMP_SEM_UNLOCK(&pAd->MgmtRingLock);
- return NDIS_STATUS_FAILURE;
- }
-
- {
- /* outgoing frame always wakeup PHY to prevent frame lost */
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
- AsicForceWakeup(pAd, TRUE);
- }
-
- pFirstTxWI = (struct rt_txwi *) (pSrcBufVA + TXINFO_SIZE);
- pHeader_802_11 = (struct rt_header_802_11 *) (pSrcBufVA + TXINFO_SIZE + TXWI_SIZE); /*TXWI_SIZE); */
-
- if (pHeader_802_11->Addr1[0] & 0x01) {
- MlmeRate = pAd->CommonCfg.BasicMlmeRate;
- } else {
- MlmeRate = pAd->CommonCfg.MlmeRate;
- }
-
- /* Verify Mlme rate for a / g bands. */
- if ((pAd->LatchRfRegs.Channel > 14) && (MlmeRate < RATE_6)) /* 11A band */
- MlmeRate = RATE_6;
-
- if ((pHeader_802_11->FC.Type == BTYPE_DATA) &&
- (pHeader_802_11->FC.SubType == SUBTYPE_QOS_NULL)) {
- pMacEntry = MacTableLookup(pAd, pHeader_802_11->Addr1);
- }
-
- {
- /* Fixed W52 with Activity scan issue in ABG_MIXED and ABGN_MIXED mode. */
- if (pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED
- || pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) {
- if (pAd->LatchRfRegs.Channel > 14)
- pAd->CommonCfg.MlmeTransmit.field.MODE = 1;
- else
- pAd->CommonCfg.MlmeTransmit.field.MODE = 0;
- }
- }
-
- /* */
- /* Should not be hard code to set PwrMgmt to 0 (PWR_ACTIVE) */
- /* Snice it's been set to 0 while on MgtMacHeaderInit */
- /* By the way this will cause frame to be send on PWR_SAVE failed. */
- /* */
- pHeader_802_11->FC.PwrMgmt = PWR_ACTIVE; /* (pAd->StaCfg.Psm == PWR_SAVE); */
-
- /* */
- /* In WMM-UAPSD, mlme frame should be set psm as power saving but probe request frame */
- /* Data-Null packets also pass through MMRequest in RT2860, however, we hope control the psm bit to pass APSD */
-/* if ((pHeader_802_11->FC.Type != BTYPE_DATA) && (pHeader_802_11->FC.Type != BTYPE_CNTL)) */
- {
- if ((pHeader_802_11->FC.SubType == SUBTYPE_ACTION) ||
- ((pHeader_802_11->FC.Type == BTYPE_DATA) &&
- ((pHeader_802_11->FC.SubType == SUBTYPE_QOS_NULL) ||
- (pHeader_802_11->FC.SubType == SUBTYPE_NULL_FUNC)))) {
- if (pAd->StaCfg.Psm == PWR_SAVE)
- pHeader_802_11->FC.PwrMgmt = PWR_SAVE;
- else
- pHeader_802_11->FC.PwrMgmt =
- pAd->CommonCfg.bAPSDForcePowerSave;
- }
- }
-
- bInsertTimestamp = FALSE;
- if (pHeader_802_11->FC.Type == BTYPE_CNTL) /* must be PS-POLL */
- {
- /*Set PM bit in ps-poll, to fix WLK 1.2 PowerSaveMode_ext failure issue. */
- if ((pAd->OpMode == OPMODE_STA)
- && (pHeader_802_11->FC.SubType == SUBTYPE_PS_POLL)) {
- pHeader_802_11->FC.PwrMgmt = PWR_SAVE;
- }
- bAckRequired = FALSE;
- } else /* BTYPE_MGMT or BTYPE_DATA(must be NULL frame) */
- {
- /*pAd->Sequence++; */
- /*pHeader_802_11->Sequence = pAd->Sequence; */
-
- if (pHeader_802_11->Addr1[0] & 0x01) /* MULTICAST, BROADCAST */
- {
- bAckRequired = FALSE;
- pHeader_802_11->Duration = 0;
- } else {
- bAckRequired = TRUE;
- pHeader_802_11->Duration =
- RTMPCalcDuration(pAd, MlmeRate, 14);
- if ((pHeader_802_11->FC.SubType == SUBTYPE_PROBE_RSP)
- && (pHeader_802_11->FC.Type == BTYPE_MGMT)) {
- bInsertTimestamp = TRUE;
- bAckRequired = FALSE; /* Disable ACK to prevent retry 0x1f for Probe Response */
- } else
- if ((pHeader_802_11->FC.SubType ==
- SUBTYPE_PROBE_REQ)
- && (pHeader_802_11->FC.Type == BTYPE_MGMT)) {
- bAckRequired = FALSE; /* Disable ACK to prevent retry 0x1f for Probe Request */
- }
- }
- }
-
- pHeader_802_11->Sequence = pAd->Sequence++;
- if (pAd->Sequence > 0xfff)
- pAd->Sequence = 0;
-
- /* Before radar detection done, mgmt frame can not be sent but probe req */
- /* Because we need to use probe req to trigger driver to send probe req in passive scan */
- if ((pHeader_802_11->FC.SubType != SUBTYPE_PROBE_REQ)
- && (pAd->CommonCfg.bIEEE80211H == 1)
- && (pAd->CommonCfg.RadarDetect.RDMode != RD_NORMAL_MODE)) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("MlmeHardTransmit --> radar detect not in normal mode!\n"));
-/* if (!IrqState) */
- RTMP_SEM_UNLOCK(&pAd->MgmtRingLock);
- return (NDIS_STATUS_FAILURE);
- }
-
- /* */
- /* fill scatter-and-gather buffer list into TXD. Internally created NDIS PACKET */
- /* should always has only one physical buffer, and the whole frame size equals */
- /* to the first scatter buffer size */
- /* */
-
- /* Initialize TX Descriptor */
- /* For inter-frame gap, the number is for this frame and next frame */
- /* For MLME rate, we will fix as 2Mb to match other vendor's implement */
-/* pAd->CommonCfg.MlmeTransmit.field.MODE = 1; */
-
-/* management frame doesn't need encryption. so use RESERVED_WCID no matter u are sending to specific wcid or not. */
- PID = PID_MGMT;
-
- if (pMacEntry == NULL) {
- RTMPWriteTxWI(pAd, pFirstTxWI, FALSE, FALSE, bInsertTimestamp,
- FALSE, bAckRequired, FALSE, 0, RESERVED_WCID,
- (SrcBufLen - TXINFO_SIZE - TXWI_SIZE), PID, 0,
- (u8)pAd->CommonCfg.MlmeTransmit.field.MCS,
- IFS_BACKOFF, FALSE, &pAd->CommonCfg.MlmeTransmit);
- } else {
- /* dont use low rate to send QoS Null data frame */
- RTMPWriteTxWI(pAd, pFirstTxWI, FALSE, FALSE,
- bInsertTimestamp, FALSE, bAckRequired, FALSE,
- 0, pMacEntry->Aid,
- (SrcBufLen - TXINFO_SIZE - TXWI_SIZE),
- pMacEntry->MaxHTPhyMode.field.MCS, 0,
- (u8)pMacEntry->MaxHTPhyMode.field.MCS,
- IFS_BACKOFF, FALSE, &pMacEntry->MaxHTPhyMode);
- }
-
- /* Now do hardware-depened kick out. */
- HAL_KickOutMgmtTx(pAd, QueIdx, pPacket, pSrcBufVA, SrcBufLen);
-
- /* Make sure to release MGMT ring resource */
-/* if (!IrqState) */
- RTMP_SEM_UNLOCK(&pAd->MgmtRingLock);
- return NDIS_STATUS_SUCCESS;
-}
-
-/********************************************************************************
-
- New DeQueue Procedures.
-
- ********************************************************************************/
-
-#define DEQUEUE_LOCK(lock, bIntContext, IrqFlags) \
- do{ \
- if (bIntContext == FALSE) \
- RTMP_IRQ_LOCK((lock), IrqFlags); \
- }while(0)
-
-#define DEQUEUE_UNLOCK(lock, bIntContext, IrqFlags) \
- do{ \
- if (bIntContext == FALSE) \
- RTMP_IRQ_UNLOCK((lock), IrqFlags); \
- }while(0)
-
-/*
- ========================================================================
- Tx Path design algorithm:
- Basically, we divide the packets into four types, Broadcast/Multicast, 11N Rate(AMPDU, AMSDU, Normal), B/G Rate(ARALINK, Normal),
- Specific Packet Type. Following show the classification rule and policy for each kinds of packets.
- Classification Rule=>
- Multicast: (*addr1 & 0x01) == 0x01
- Specific : bDHCPFrame, bARPFrame, bEAPOLFrame, etc.
- 11N Rate : If peer support HT
- (1).AMPDU -- If TXBA is negotiated.
- (2).AMSDU -- If AMSDU is capable for both peer and ourself.
- *). AMSDU can embedded in a AMPDU, but now we didn't support it.
- (3).Normal -- Other packets which send as 11n rate.
-
- B/G Rate : If peer is b/g only.
- (1).ARALINK-- If both of peer/us supprot Ralink proprietary Aggregation and the TxRate is large than RATE_6
- (2).Normal -- Other packets which send as b/g rate.
- Fragment:
- The packet must be unicast, NOT A-RALINK, NOT A-MSDU, NOT 11n, then can consider about fragment.
-
- Classified Packet Handle Rule=>
- Multicast:
- No ACK, //pTxBlk->bAckRequired = FALSE;
- No WMM, //pTxBlk->bWMM = FALSE;
- No piggyback, //pTxBlk->bPiggyBack = FALSE;
- Force LowRate, //pTxBlk->bForceLowRate = TRUE;
- Specific : Basically, for specific packet, we should handle it specifically, but now all specific packets are use
- the same policy to handle it.
- Force LowRate, //pTxBlk->bForceLowRate = TRUE;
-
- 11N Rate :
- No piggyback, //pTxBlk->bPiggyBack = FALSE;
-
- (1).AMSDU
- pTxBlk->bWMM = TRUE;
- (2).AMPDU
- pTxBlk->bWMM = TRUE;
- (3).Normal
-
- B/G Rate :
- (1).ARALINK
-
- (2).Normal
- ========================================================================
-*/
-static u8 TxPktClassification(struct rt_rtmp_adapter *pAd, void *pPacket)
-{
- u8 TxFrameType = TX_UNKOWN_FRAME;
- u8 Wcid;
- struct rt_mac_table_entry *pMacEntry = NULL;
- BOOLEAN bHTRate = FALSE;
-
- Wcid = RTMP_GET_PACKET_WCID(pPacket);
- if (Wcid == MCAST_WCID) { /* Handle for RA is Broadcast/Multicast Address. */
- return TX_MCAST_FRAME;
- }
- /* Handle for unicast packets */
- pMacEntry = &pAd->MacTab.Content[Wcid];
- if (RTMP_GET_PACKET_LOWRATE(pPacket)) { /* It's a specific packet need to force low rate, i.e., bDHCPFrame, bEAPOLFrame, bWAIFrame */
- TxFrameType = TX_LEGACY_FRAME;
- } else if (IS_HT_RATE(pMacEntry)) { /* it's a 11n capable packet */
-
- /* Depends on HTPhyMode to check if the peer support the HTRate transmission. */
- /* Currently didn't support A-MSDU embedded in A-MPDU */
- bHTRate = TRUE;
- if (RTMP_GET_PACKET_MOREDATA(pPacket)
- || (pMacEntry->PsMode == PWR_SAVE))
- TxFrameType = TX_LEGACY_FRAME;
- else if ((pMacEntry->
- TXBAbitmap & (1 << (RTMP_GET_PACKET_UP(pPacket)))) !=
- 0)
- return TX_AMPDU_FRAME;
- else if (CLIENT_STATUS_TEST_FLAG
- (pMacEntry, fCLIENT_STATUS_AMSDU_INUSED))
- return TX_AMSDU_FRAME;
- else
- TxFrameType = TX_LEGACY_FRAME;
- } else { /* it's a legacy b/g packet. */
- if ((CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE) && pAd->CommonCfg.bAggregationCapable) && (RTMP_GET_PACKET_TXRATE(pPacket) >= RATE_6) && (!(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) && CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE)))) { /* if peer support Ralink Aggregation, we use it. */
- TxFrameType = TX_RALINK_FRAME;
- } else {
- TxFrameType = TX_LEGACY_FRAME;
- }
- }
-
- /* Currently, our fragment only support when a unicast packet send as NOT-ARALINK, NOT-AMSDU and NOT-AMPDU. */
- if ((RTMP_GET_PACKET_FRAGMENTS(pPacket) > 1)
- && (TxFrameType == TX_LEGACY_FRAME))
- TxFrameType = TX_FRAG_FRAME;
-
- return TxFrameType;
-}
-
-BOOLEAN RTMP_FillTxBlkInfo(struct rt_rtmp_adapter *pAd, struct rt_tx_blk *pTxBlk)
-{
- struct rt_packet_info PacketInfo;
- void *pPacket;
- struct rt_mac_table_entry *pMacEntry = NULL;
-
- pPacket = pTxBlk->pPacket;
- RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pTxBlk->pSrcBufHeader,
- &pTxBlk->SrcBufLen);
-
- pTxBlk->Wcid = RTMP_GET_PACKET_WCID(pPacket);
- pTxBlk->apidx = RTMP_GET_PACKET_IF(pPacket);
- pTxBlk->UserPriority = RTMP_GET_PACKET_UP(pPacket);
- pTxBlk->FrameGap = IFS_HTTXOP; /* ASIC determine Frame Gap */
-
- if (RTMP_GET_PACKET_CLEAR_EAP_FRAME(pTxBlk->pPacket))
- TX_BLK_SET_FLAG(pTxBlk, fTX_bClearEAPFrame);
- else
- TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bClearEAPFrame);
-
- /* Default to clear this flag */
- TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bForceNonQoS);
-
- if (pTxBlk->Wcid == MCAST_WCID) {
- pTxBlk->pMacEntry = NULL;
- {
- pTxBlk->pTransmit =
- &pAd->MacTab.Content[MCAST_WCID].HTPhyMode;
- }
-
- TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bAckRequired); /* AckRequired = FALSE, when broadcast packet in Adhoc mode. */
- /*TX_BLK_SET_FLAG(pTxBlk, fTX_bForceLowRate); */
- TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bAllowFrag);
- TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bWMM);
- if (RTMP_GET_PACKET_MOREDATA(pPacket)) {
- TX_BLK_SET_FLAG(pTxBlk, fTX_bMoreData);
- }
-
- } else {
- pTxBlk->pMacEntry = &pAd->MacTab.Content[pTxBlk->Wcid];
- pTxBlk->pTransmit = &pTxBlk->pMacEntry->HTPhyMode;
-
- pMacEntry = pTxBlk->pMacEntry;
-
- /* For all unicast packets, need Ack unless the Ack Policy is not set as NORMAL_ACK. */
- if (pAd->CommonCfg.AckPolicy[pTxBlk->QueIdx] != NORMAL_ACK)
- TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bAckRequired);
- else
- TX_BLK_SET_FLAG(pTxBlk, fTX_bAckRequired);
-
- if ((pAd->OpMode == OPMODE_STA) &&
- (ADHOC_ON(pAd)) &&
- (RX_FILTER_TEST_FLAG(pAd, fRX_FILTER_ACCEPT_PROMISCUOUS))) {
- if (pAd->CommonCfg.PSPXlink)
- TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bAckRequired);
- }
-
- {
- {
-
- /* If support WMM, enable it. */
- if (OPSTATUS_TEST_FLAG
- (pAd, fOP_STATUS_WMM_INUSED)
- && CLIENT_STATUS_TEST_FLAG(pMacEntry,
- fCLIENT_STATUS_WMM_CAPABLE))
- TX_BLK_SET_FLAG(pTxBlk, fTX_bWMM);
-
-/* if (pAd->StaCfg.bAutoTxRateSwitch) */
-/* TX_BLK_SET_FLAG(pTxBlk, fTX_AutoRateSwitch); */
- }
- }
-
- if (pTxBlk->TxFrameType == TX_LEGACY_FRAME) {
- if ((RTMP_GET_PACKET_LOWRATE(pPacket)) || ((pAd->OpMode == OPMODE_AP) && (pMacEntry->MaxHTPhyMode.field.MODE == MODE_CCK) && (pMacEntry->MaxHTPhyMode.field.MCS == RATE_1))) { /* Specific packet, i.e., bDHCPFrame, bEAPOLFrame, bWAIFrame, need force low rate. */
- pTxBlk->pTransmit =
- &pAd->MacTab.Content[MCAST_WCID].HTPhyMode;
-
- /* Modify the WMM bit for ICV issue. If we have a packet with EOSP field need to set as 1, how to handle it??? */
- if (IS_HT_STA(pTxBlk->pMacEntry) &&
- (CLIENT_STATUS_TEST_FLAG
- (pMacEntry, fCLIENT_STATUS_RALINK_CHIPSET))
- && ((pAd->CommonCfg.bRdg == TRUE)
- && CLIENT_STATUS_TEST_FLAG(pMacEntry,
- fCLIENT_STATUS_RDG_CAPABLE)))
- {
- TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bWMM);
- TX_BLK_SET_FLAG(pTxBlk,
- fTX_bForceNonQoS);
- }
- }
-
- if ((IS_HT_RATE(pMacEntry) == FALSE) && (CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_PIGGYBACK_CAPABLE))) { /* Currently piggy-back only support when peer is operate in b/g mode. */
- TX_BLK_SET_FLAG(pTxBlk, fTX_bPiggyBack);
- }
-
- if (RTMP_GET_PACKET_MOREDATA(pPacket)) {
- TX_BLK_SET_FLAG(pTxBlk, fTX_bMoreData);
- }
- } else if (pTxBlk->TxFrameType == TX_FRAG_FRAME) {
- TX_BLK_SET_FLAG(pTxBlk, fTX_bAllowFrag);
- }
-
- pMacEntry->DebugTxCount++;
- }
-
- return TRUE;
-}
-
-BOOLEAN CanDoAggregateTransmit(struct rt_rtmp_adapter *pAd,
- char * pPacket, struct rt_tx_blk *pTxBlk)
-{
-
- /*DBGPRINT(RT_DEBUG_TRACE, ("Check if can do aggregation! TxFrameType=%d!\n", pTxBlk->TxFrameType)); */
-
- if (RTMP_GET_PACKET_WCID(pPacket) == MCAST_WCID)
- return FALSE;
-
- if (RTMP_GET_PACKET_DHCP(pPacket) ||
- RTMP_GET_PACKET_EAPOL(pPacket) || RTMP_GET_PACKET_WAI(pPacket))
- return FALSE;
-
- if ((pTxBlk->TxFrameType == TX_AMSDU_FRAME) && ((pTxBlk->TotalFrameLen + GET_OS_PKT_LEN(pPacket)) > (RX_BUFFER_AGGRESIZE - 100))) { /* For AMSDU, allow the packets with total length < max-amsdu size */
- return FALSE;
- }
-
- if ((pTxBlk->TxFrameType == TX_RALINK_FRAME) && (pTxBlk->TxPacketList.Number == 2)) { /* For RALINK-Aggregation, allow two frames in one batch. */
- return FALSE;
- }
-
- if ((INFRA_ON(pAd)) && (pAd->OpMode == OPMODE_STA)) /* must be unicast to AP */
- return TRUE;
- else
- return FALSE;
-
-}
-
-/*
- ========================================================================
-
- Routine Description:
- To do the enqueue operation and extract the first item of waiting
- list. If a number of available shared memory segments could meet
- the request of extracted item, the extracted item will be fragmented
- into shared memory segments.
-
- Arguments:
- pAd Pointer to our adapter
- pQueue Pointer to Waiting Queue
-
- Return Value:
- None
-
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPDeQueuePacket(struct rt_rtmp_adapter *pAd, IN BOOLEAN bIntContext, u8 QIdx, /* BulkOutPipeId */
- u8 Max_Tx_Packets)
-{
- struct rt_queue_entry *pEntry = NULL;
- void *pPacket;
- int Status = NDIS_STATUS_SUCCESS;
- u8 Count = 0;
- struct rt_queue_header *pQueue;
- unsigned long FreeNumber[NUM_OF_TX_RING];
- u8 QueIdx, sQIdx, eQIdx;
- unsigned long IrqFlags = 0;
- BOOLEAN hasTxDesc = FALSE;
- struct rt_tx_blk TxBlk;
- struct rt_tx_blk *pTxBlk;
-
- if (QIdx == NUM_OF_TX_RING) {
- sQIdx = 0;
- eQIdx = 3; /* 4 ACs, start from 0. */
- } else {
- sQIdx = eQIdx = QIdx;
- }
-
- for (QueIdx = sQIdx; QueIdx <= eQIdx; QueIdx++) {
- Count = 0;
-
- RTMP_START_DEQUEUE(pAd, QueIdx, IrqFlags);
-
- while (1) {
- if ((RTMP_TEST_FLAG
- (pAd,
- (fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS |
- fRTMP_ADAPTER_RADIO_OFF |
- fRTMP_ADAPTER_RESET_IN_PROGRESS |
- fRTMP_ADAPTER_HALT_IN_PROGRESS |
- fRTMP_ADAPTER_NIC_NOT_EXIST)))) {
- RTMP_STOP_DEQUEUE(pAd, QueIdx, IrqFlags);
- return;
- }
-
- if (Count >= Max_Tx_Packets)
- break;
-
- DEQUEUE_LOCK(&pAd->irq_lock, bIntContext, IrqFlags);
- if (&pAd->TxSwQueue[QueIdx] == NULL) {
- DEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext,
- IrqFlags);
- break;
- }
-#ifdef RTMP_MAC_PCI
- FreeNumber[QueIdx] = GET_TXRING_FREENO(pAd, QueIdx);
-
- if (FreeNumber[QueIdx] <= 5) {
- /* free Tx(QueIdx) resources */
- RTMPFreeTXDUponTxDmaDone(pAd, QueIdx);
- FreeNumber[QueIdx] =
- GET_TXRING_FREENO(pAd, QueIdx);
- }
-#endif /* RTMP_MAC_PCI // */
-
- /* probe the Queue Head */
- pQueue = &pAd->TxSwQueue[QueIdx];
- pEntry = pQueue->Head;
- if (pEntry == NULL) {
- DEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext,
- IrqFlags);
- break;
- }
-
- pTxBlk = &TxBlk;
- NdisZeroMemory((u8 *)pTxBlk, sizeof(struct rt_tx_blk));
- /*InitializeQueueHeader(&pTxBlk->TxPacketList); // Didn't need it because we already memzero it. */
- pTxBlk->QueIdx = QueIdx;
-
- pPacket = QUEUE_ENTRY_TO_PACKET(pEntry);
-
- /* Early check to make sure we have enoguh Tx Resource. */
- hasTxDesc =
- RTMP_HAS_ENOUGH_FREE_DESC(pAd, pTxBlk,
- FreeNumber[QueIdx],
- pPacket);
- if (!hasTxDesc) {
- pAd->PrivateInfo.TxRingFullCnt++;
-
- DEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext,
- IrqFlags);
-
- break;
- }
-
- pTxBlk->TxFrameType = TxPktClassification(pAd, pPacket);
- pEntry = RemoveHeadQueue(pQueue);
- pTxBlk->TotalFrameNum++;
- pTxBlk->TotalFragNum += RTMP_GET_PACKET_FRAGMENTS(pPacket); /* The real fragment number maybe vary */
- pTxBlk->TotalFrameLen += GET_OS_PKT_LEN(pPacket);
- pTxBlk->pPacket = pPacket;
- InsertTailQueue(&pTxBlk->TxPacketList,
- PACKET_TO_QUEUE_ENTRY(pPacket));
-
- if (pTxBlk->TxFrameType == TX_RALINK_FRAME
- || pTxBlk->TxFrameType == TX_AMSDU_FRAME) {
- /* Enhance SW Aggregation Mechanism */
- if (NEED_QUEUE_BACK_FOR_AGG
- (pAd, QueIdx, FreeNumber[QueIdx],
- pTxBlk->TxFrameType)) {
- InsertHeadQueue(pQueue,
- PACKET_TO_QUEUE_ENTRY
- (pPacket));
- DEQUEUE_UNLOCK(&pAd->irq_lock,
- bIntContext, IrqFlags);
- break;
- }
-
- do {
- pEntry = pQueue->Head;
- if (pEntry == NULL)
- break;
-
- /* For TX_AMSDU_FRAME/TX_RALINK_FRAME, Need to check if next pakcet can do aggregation. */
- pPacket = QUEUE_ENTRY_TO_PACKET(pEntry);
- FreeNumber[QueIdx] =
- GET_TXRING_FREENO(pAd, QueIdx);
- hasTxDesc =
- RTMP_HAS_ENOUGH_FREE_DESC(pAd,
- pTxBlk,
- FreeNumber
- [QueIdx],
- pPacket);
- if ((hasTxDesc == FALSE)
- ||
- (CanDoAggregateTransmit
- (pAd, pPacket, pTxBlk) == FALSE))
- break;
-
- /*Remove the packet from the TxSwQueue and insert into pTxBlk */
- pEntry = RemoveHeadQueue(pQueue);
- ASSERT(pEntry);
- pPacket = QUEUE_ENTRY_TO_PACKET(pEntry);
- pTxBlk->TotalFrameNum++;
- pTxBlk->TotalFragNum += RTMP_GET_PACKET_FRAGMENTS(pPacket); /* The real fragment number maybe vary */
- pTxBlk->TotalFrameLen +=
- GET_OS_PKT_LEN(pPacket);
- InsertTailQueue(&pTxBlk->TxPacketList,
- PACKET_TO_QUEUE_ENTRY
- (pPacket));
- } while (1);
-
- if (pTxBlk->TxPacketList.Number == 1)
- pTxBlk->TxFrameType = TX_LEGACY_FRAME;
- }
-#ifdef RTMP_MAC_USB
- DEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags);
-#endif /* RTMP_MAC_USB // */
- Count += pTxBlk->TxPacketList.Number;
-
- /* Do HardTransmit now. */
- Status = STAHardTransmit(pAd, pTxBlk, QueIdx);
-
-#ifdef RTMP_MAC_PCI
- DEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags);
- /* static rate also need NICUpdateFifoStaCounters() function. */
- /*if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED)) */
- NICUpdateFifoStaCounters(pAd);
-#endif /* RTMP_MAC_PCI // */
-
- }
-
- RTMP_STOP_DEQUEUE(pAd, QueIdx, IrqFlags);
-
-#ifdef RTMP_MAC_USB
- if (!hasTxDesc)
- RTUSBKickBulkOut(pAd);
-#endif /* RTMP_MAC_USB // */
- }
-
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Calculates the duration which is required to transmit out frames
- with given size and specified rate.
-
- Arguments:
- pAd Pointer to our adapter
- Rate Transmit rate
- Size Frame size in units of byte
-
- Return Value:
- Duration number in units of usec
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-u16 RTMPCalcDuration(struct rt_rtmp_adapter *pAd, u8 Rate, unsigned long Size)
-{
- unsigned long Duration = 0;
-
- if (Rate < RATE_FIRST_OFDM_RATE) /* CCK */
- {
- if ((Rate > RATE_1)
- && OPSTATUS_TEST_FLAG(pAd,
- fOP_STATUS_SHORT_PREAMBLE_INUSED))
- Duration = 96; /* 72+24 preamble+plcp */
- else
- Duration = 192; /* 144+48 preamble+plcp */
-
- Duration += (u16)((Size << 4) / RateIdTo500Kbps[Rate]);
- if ((Size << 4) % RateIdTo500Kbps[Rate])
- Duration++;
- } else if (Rate <= RATE_LAST_OFDM_RATE) /* OFDM rates */
- {
- Duration = 20 + 6; /* 16+4 preamble+plcp + Signal Extension */
- Duration +=
- 4 * (u16)((11 + Size * 4) / RateIdTo500Kbps[Rate]);
- if ((11 + Size * 4) % RateIdTo500Kbps[Rate])
- Duration += 4;
- } else /*mimo rate */
- {
- Duration = 20 + 6; /* 16+4 preamble+plcp + Signal Extension */
- }
-
- return (u16)Duration;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Calculates the duration which is required to transmit out frames
- with given size and specified rate.
-
- Arguments:
- pTxWI Pointer to head of each MPDU to HW.
- Ack Setting for Ack requirement bit
- Fragment Setting for Fragment bit
- RetryMode Setting for retry mode
- Ifs Setting for IFS gap
- Rate Setting for transmit rate
- Service Setting for service
- Length Frame length
- TxPreamble Short or Long preamble when using CCK rates
- QueIdx - 0-3, according to 802.11e/d4.4 June/2003
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- See also : BASmartHardTransmit() !
-
- ========================================================================
-*/
-void RTMPWriteTxWI(struct rt_rtmp_adapter *pAd, struct rt_txwi * pOutTxWI, IN BOOLEAN FRAG, IN BOOLEAN CFACK, IN BOOLEAN InsTimestamp, IN BOOLEAN AMPDU, IN BOOLEAN Ack, IN BOOLEAN NSeq, /* HW new a sequence. */
- u8 BASize,
- u8 WCID,
- unsigned long Length,
- u8 PID,
- u8 TID,
- u8 TxRate,
- u8 Txopmode,
- IN BOOLEAN CfAck, IN HTTRANSMIT_SETTING * pTransmit)
-{
- struct rt_mac_table_entry *pMac = NULL;
- struct rt_txwi TxWI;
- struct rt_txwi * pTxWI;
-
- if (WCID < MAX_LEN_OF_MAC_TABLE)
- pMac = &pAd->MacTab.Content[WCID];
-
- /* */
- /* Always use Long preamble before verifiation short preamble functionality works well. */
- /* Todo: remove the following line if short preamble functionality works */
- /* */
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED);
- NdisZeroMemory(&TxWI, TXWI_SIZE);
- pTxWI = &TxWI;
-
- pTxWI->FRAG = FRAG;
-
- pTxWI->CFACK = CFACK;
- pTxWI->TS = InsTimestamp;
- pTxWI->AMPDU = AMPDU;
- pTxWI->ACK = Ack;
- pTxWI->txop = Txopmode;
-
- pTxWI->NSEQ = NSeq;
- /* John tune the performace with Intel Client in 20 MHz performance */
- BASize = pAd->CommonCfg.TxBASize;
- if (pAd->MACVersion == 0x28720200) {
- if (BASize > 13)
- BASize = 13;
- } else {
- if (BASize > 7)
- BASize = 7;
- }
- pTxWI->BAWinSize = BASize;
- pTxWI->ShortGI = pTransmit->field.ShortGI;
- pTxWI->STBC = pTransmit->field.STBC;
-
- pTxWI->WirelessCliID = WCID;
- pTxWI->MPDUtotalByteCount = Length;
- pTxWI->PacketId = PID;
-
- /* If CCK or OFDM, BW must be 20 */
- pTxWI->BW =
- (pTransmit->field.MODE <=
- MODE_OFDM) ? (BW_20) : (pTransmit->field.BW);
-
- pTxWI->MCS = pTransmit->field.MCS;
- pTxWI->PHYMODE = pTransmit->field.MODE;
- pTxWI->CFACK = CfAck;
-
- if (pMac) {
- if (pAd->CommonCfg.bMIMOPSEnable) {
- if ((pMac->MmpsMode == MMPS_DYNAMIC)
- && (pTransmit->field.MCS > 7)) {
- /* Dynamic MIMO Power Save Mode */
- pTxWI->MIMOps = 1;
- } else if (pMac->MmpsMode == MMPS_STATIC) {
- /* Static MIMO Power Save Mode */
- if (pTransmit->field.MODE >= MODE_HTMIX
- && pTransmit->field.MCS > 7) {
- pTxWI->MCS = 7;
- pTxWI->MIMOps = 0;
- }
- }
- }
- /*pTxWI->MIMOps = (pMac->PsMode == PWR_MMPS)? 1:0; */
- if (pMac->bIAmBadAtheros
- && (pMac->WepStatus != Ndis802_11WEPDisabled)) {
- pTxWI->MpduDensity = 7;
- } else {
- pTxWI->MpduDensity = pMac->MpduDensity;
- }
- }
-
- pTxWI->PacketId = pTxWI->MCS;
- NdisMoveMemory(pOutTxWI, &TxWI, sizeof(struct rt_txwi));
-}
-
-void RTMPWriteTxWI_Data(struct rt_rtmp_adapter *pAd,
- struct rt_txwi * pTxWI, struct rt_tx_blk *pTxBlk)
-{
- HTTRANSMIT_SETTING *pTransmit;
- struct rt_mac_table_entry *pMacEntry;
- u8 BASize;
-
- ASSERT(pTxWI);
-
- pTransmit = pTxBlk->pTransmit;
- pMacEntry = pTxBlk->pMacEntry;
-
- /* */
- /* Always use Long preamble before verifiation short preamble functionality works well. */
- /* Todo: remove the following line if short preamble functionality works */
- /* */
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED);
- NdisZeroMemory(pTxWI, TXWI_SIZE);
-
- pTxWI->FRAG = TX_BLK_TEST_FLAG(pTxBlk, fTX_bAllowFrag);
- pTxWI->ACK = TX_BLK_TEST_FLAG(pTxBlk, fTX_bAckRequired);
- pTxWI->txop = pTxBlk->FrameGap;
-
- pTxWI->WirelessCliID = pTxBlk->Wcid;
-
- pTxWI->MPDUtotalByteCount = pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen;
- pTxWI->CFACK = TX_BLK_TEST_FLAG(pTxBlk, fTX_bPiggyBack);
-
- /* If CCK or OFDM, BW must be 20 */
- pTxWI->BW =
- (pTransmit->field.MODE <=
- MODE_OFDM) ? (BW_20) : (pTransmit->field.BW);
- pTxWI->AMPDU = ((pTxBlk->TxFrameType == TX_AMPDU_FRAME) ? TRUE : FALSE);
-
- /* John tune the performace with Intel Client in 20 MHz performance */
- BASize = pAd->CommonCfg.TxBASize;
- if ((pTxBlk->TxFrameType == TX_AMPDU_FRAME) && (pMacEntry)) {
- u8 RABAOriIdx = 0; /*The RA's BA Originator table index. */
-
- RABAOriIdx =
- pTxBlk->pMacEntry->BAOriWcidArray[pTxBlk->UserPriority];
- BASize = pAd->BATable.BAOriEntry[RABAOriIdx].BAWinSize;
- }
-
- pTxWI->TxBF = pTransmit->field.TxBF;
- pTxWI->BAWinSize = BASize;
- pTxWI->ShortGI = pTransmit->field.ShortGI;
- pTxWI->STBC = pTransmit->field.STBC;
-
- pTxWI->MCS = pTransmit->field.MCS;
- pTxWI->PHYMODE = pTransmit->field.MODE;
-
- if (pMacEntry) {
- if ((pMacEntry->MmpsMode == MMPS_DYNAMIC)
- && (pTransmit->field.MCS > 7)) {
- /* Dynamic MIMO Power Save Mode */
- pTxWI->MIMOps = 1;
- } else if (pMacEntry->MmpsMode == MMPS_STATIC) {
- /* Static MIMO Power Save Mode */
- if (pTransmit->field.MODE >= MODE_HTMIX
- && pTransmit->field.MCS > 7) {
- pTxWI->MCS = 7;
- pTxWI->MIMOps = 0;
- }
- }
-
- if (pMacEntry->bIAmBadAtheros
- && (pMacEntry->WepStatus != Ndis802_11WEPDisabled)) {
- pTxWI->MpduDensity = 7;
- } else {
- pTxWI->MpduDensity = pMacEntry->MpduDensity;
- }
- }
-
- /* for rate adapation */
- pTxWI->PacketId = pTxWI->MCS;
-}
-
-void RTMPWriteTxWI_Cache(struct rt_rtmp_adapter *pAd,
- struct rt_txwi * pTxWI, struct rt_tx_blk *pTxBlk)
-{
- PHTTRANSMIT_SETTING /*pTxHTPhyMode, */ pTransmit;
- struct rt_mac_table_entry *pMacEntry;
-
- /* */
- /* update TXWI */
- /* */
- pMacEntry = pTxBlk->pMacEntry;
- pTransmit = pTxBlk->pTransmit;
-
- /*if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED)) */
- /*if (RTMPCheckEntryEnableAutoRateSwitch(pAd, pMacEntry)) */
- /*if (TX_BLK_TEST_FLAG(pTxBlk, fTX_AutoRateSwitch)) */
- if (pMacEntry->bAutoTxRateSwitch) {
- pTxWI->txop = IFS_HTTXOP;
-
- /* If CCK or OFDM, BW must be 20 */
- pTxWI->BW =
- (pTransmit->field.MODE <=
- MODE_OFDM) ? (BW_20) : (pTransmit->field.BW);
- pTxWI->ShortGI = pTransmit->field.ShortGI;
- pTxWI->STBC = pTransmit->field.STBC;
-
- pTxWI->MCS = pTransmit->field.MCS;
- pTxWI->PHYMODE = pTransmit->field.MODE;
-
- /* set PID for TxRateSwitching */
- pTxWI->PacketId = pTransmit->field.MCS;
- }
-
- pTxWI->AMPDU = ((pMacEntry->NoBADataCountDown == 0) ? TRUE : FALSE);
- pTxWI->MIMOps = 0;
-
- if (pAd->CommonCfg.bMIMOPSEnable) {
- /* MIMO Power Save Mode */
- if ((pMacEntry->MmpsMode == MMPS_DYNAMIC)
- && (pTransmit->field.MCS > 7)) {
- /* Dynamic MIMO Power Save Mode */
- pTxWI->MIMOps = 1;
- } else if (pMacEntry->MmpsMode == MMPS_STATIC) {
- /* Static MIMO Power Save Mode */
- if ((pTransmit->field.MODE >= MODE_HTMIX)
- && (pTransmit->field.MCS > 7)) {
- pTxWI->MCS = 7;
- pTxWI->MIMOps = 0;
- }
- }
- }
-
- pTxWI->MPDUtotalByteCount = pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen;
-
-}
-
-/* should be called only when - */
-/* 1. MEADIA_CONNECTED */
-/* 2. AGGREGATION_IN_USED */
-/* 3. Fragmentation not in used */
-/* 4. either no previous frame (pPrevAddr1=NULL) .OR. previoud frame is aggregatible */
-BOOLEAN TxFrameIsAggregatible(struct rt_rtmp_adapter *pAd,
- u8 *pPrevAddr1, u8 *p8023hdr)
-{
-
- /* can't aggregate EAPOL (802.1x) frame */
- if ((p8023hdr[12] == 0x88) && (p8023hdr[13] == 0x8e))
- return FALSE;
-
- /* can't aggregate multicast/broadcast frame */
- if (p8023hdr[0] & 0x01)
- return FALSE;
-
- if (INFRA_ON(pAd)) /* must be unicast to AP */
- return TRUE;
- else if ((pPrevAddr1 == NULL) || MAC_ADDR_EQUAL(pPrevAddr1, p8023hdr)) /* unicast to same STA */
- return TRUE;
- else
- return FALSE;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Check the MSDU Aggregation policy
- 1.HT aggregation is A-MSDU
- 2.legaacy rate aggregation is software aggregation by Ralink.
-
- Arguments:
-
- Return Value:
-
- Note:
-
- ========================================================================
-*/
-BOOLEAN PeerIsAggreOn(struct rt_rtmp_adapter *pAd,
- unsigned long TxRate, struct rt_mac_table_entry *pMacEntry)
-{
- unsigned long AFlags =
- (fCLIENT_STATUS_AMSDU_INUSED | fCLIENT_STATUS_AGGREGATION_CAPABLE);
-
- if (pMacEntry != NULL && CLIENT_STATUS_TEST_FLAG(pMacEntry, AFlags)) {
- if (pMacEntry->HTPhyMode.field.MODE >= MODE_HTMIX) {
- return TRUE;
- }
-#ifdef AGGREGATION_SUPPORT
- if (TxRate >= RATE_6 && pAd->CommonCfg.bAggregationCapable && (!(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) && CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE)))) { /* legacy Ralink Aggregation support */
- return TRUE;
- }
-#endif /* AGGREGATION_SUPPORT // */
- }
-
- return FALSE;
-
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Check and fine the packet waiting in SW queue with highest priority
-
- Arguments:
- pAd Pointer to our adapter
-
- Return Value:
- pQueue Pointer to Waiting Queue
-
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-struct rt_queue_header *RTMPCheckTxSwQueue(struct rt_rtmp_adapter *pAd, u8 *pQueIdx)
-{
-
- unsigned long Number;
- /* 2004-11-15 to be removed. test aggregation only */
-/* if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED)) && (*pNumber < 2)) */
-/* return NULL; */
-
- Number = pAd->TxSwQueue[QID_AC_BK].Number
- + pAd->TxSwQueue[QID_AC_BE].Number
- + pAd->TxSwQueue[QID_AC_VI].Number
- + pAd->TxSwQueue[QID_AC_VO].Number;
-
- if (pAd->TxSwQueue[QID_AC_VO].Head != NULL) {
- *pQueIdx = QID_AC_VO;
- return (&pAd->TxSwQueue[QID_AC_VO]);
- } else if (pAd->TxSwQueue[QID_AC_VI].Head != NULL) {
- *pQueIdx = QID_AC_VI;
- return (&pAd->TxSwQueue[QID_AC_VI]);
- } else if (pAd->TxSwQueue[QID_AC_BE].Head != NULL) {
- *pQueIdx = QID_AC_BE;
- return (&pAd->TxSwQueue[QID_AC_BE]);
- } else if (pAd->TxSwQueue[QID_AC_BK].Head != NULL) {
- *pQueIdx = QID_AC_BK;
- return (&pAd->TxSwQueue[QID_AC_BK]);
- }
- /* No packet pending in Tx Sw queue */
- *pQueIdx = QID_AC_BK;
-
- return (NULL);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Suspend MSDU transmission
-
- Arguments:
- pAd Pointer to our adapter
-
- Return Value:
- None
-
- Note:
-
- ========================================================================
-*/
-void RTMPSuspendMsduTransmission(struct rt_rtmp_adapter *pAd)
-{
- DBGPRINT(RT_DEBUG_TRACE, ("SCANNING, suspend MSDU transmission ...\n"));
-
- /* */
- /* Before BSS_SCAN_IN_PROGRESS, we need to keep Current R66 value and */
- /* use Lowbound as R66 value on ScanNextChannel(...) */
- /* */
- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R66,
- &pAd->BbpTuning.R66CurrentValue);
-
- /* set BBP_R66 to 0x30/0x40 when scanning (AsicSwitchChannel will set R66 according to channel when scanning) */
- /*RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, (0x26 + GET_LNA_GAIN(pAd))); */
- RTMPSetAGCInitValue(pAd, BW_20);
-
- RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);
- /*RTMP_IO_WRITE32(pAd, TX_CNTL_CSR, 0x000f0000); // abort all TX rings */
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Resume MSDU transmission
-
- Arguments:
- pAd Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPResumeMsduTransmission(struct rt_rtmp_adapter *pAd)
-{
-/* u8 IrqState; */
-
- DBGPRINT(RT_DEBUG_TRACE, ("SCAN done, resume MSDU transmission ...\n"));
-
- /* After finish BSS_SCAN_IN_PROGRESS, we need to restore Current R66 value */
- /* R66 should not be 0 */
- if (pAd->BbpTuning.R66CurrentValue == 0) {
- pAd->BbpTuning.R66CurrentValue = 0x38;
- DBGPRINT_ERR("RTMPResumeMsduTransmission, R66CurrentValue=0...\n");
- }
-
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66,
- pAd->BbpTuning.R66CurrentValue);
-
- RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);
-/* sample, for IRQ LOCK to SEM LOCK */
-/* IrqState = pAd->irq_disabled; */
-/* if (IrqState) */
-/* RTMPDeQueuePacket(pAd, TRUE, NUM_OF_TX_RING, MAX_TX_PROCESS); */
-/* else */
- RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);
-}
-
-u32 deaggregate_AMSDU_announce(struct rt_rtmp_adapter *pAd,
- void *pPacket,
- u8 *pData, unsigned long DataSize)
-{
- u16 PayloadSize;
- u16 SubFrameSize;
- struct rt_header_802_3 * pAMSDUsubheader;
- u32 nMSDU;
- u8 Header802_3[14];
-
- u8 *pPayload, *pDA, *pSA, *pRemovedLLCSNAP;
- void *pClonePacket;
-
- nMSDU = 0;
-
- while (DataSize > LENGTH_802_3) {
-
- nMSDU++;
-
- /*hex_dump("subheader", pData, 64); */
- pAMSDUsubheader = (struct rt_header_802_3 *) pData;
- /*pData += LENGTH_802_3; */
- PayloadSize =
- pAMSDUsubheader->Octet[1] +
- (pAMSDUsubheader->Octet[0] << 8);
- SubFrameSize = PayloadSize + LENGTH_802_3;
-
- if ((DataSize < SubFrameSize) || (PayloadSize > 1518)) {
- break;
- }
- /*DBGPRINT(RT_DEBUG_TRACE,("%d subframe: Size = %d\n", nMSDU, PayloadSize)); */
-
- pPayload = pData + LENGTH_802_3;
- pDA = pData;
- pSA = pData + MAC_ADDR_LEN;
-
- /* convert to 802.3 header */
- CONVERT_TO_802_3(Header802_3, pDA, pSA, pPayload, PayloadSize,
- pRemovedLLCSNAP);
-
- if ((Header802_3[12] == 0x88) && (Header802_3[13] == 0x8E)) {
- /* avoid local heap overflow, use dyanamic allocation */
- struct rt_mlme_queue_elem *Elem =
- kmalloc(sizeof(struct rt_mlme_queue_elem),
- MEM_ALLOC_FLAG);
- if (Elem != NULL) {
- memmove(Elem->Msg +
- (LENGTH_802_11 + LENGTH_802_1_H),
- pPayload, PayloadSize);
- Elem->MsgLen =
- LENGTH_802_11 + LENGTH_802_1_H +
- PayloadSize;
- /*WpaEAPOLKeyAction(pAd, Elem); */
- REPORT_MGMT_FRAME_TO_MLME(pAd, BSSID_WCID,
- Elem->Msg,
- Elem->MsgLen, 0, 0, 0,
- 0);
- kfree(Elem);
- }
- }
-
- {
- if (pRemovedLLCSNAP) {
- pPayload -= LENGTH_802_3;
- PayloadSize += LENGTH_802_3;
- NdisMoveMemory(pPayload, &Header802_3[0],
- LENGTH_802_3);
- }
- }
-
- pClonePacket = ClonePacket(pAd, pPacket, pPayload, PayloadSize);
- if (pClonePacket) {
- ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pClonePacket,
- RTMP_GET_PACKET_IF
- (pPacket));
- }
-
- /* A-MSDU has padding to multiple of 4 including subframe header. */
- /* align SubFrameSize up to multiple of 4 */
- SubFrameSize = (SubFrameSize + 3) & (~0x3);
-
- if (SubFrameSize > 1528 || SubFrameSize < 32) {
- break;
- }
-
- if (DataSize > SubFrameSize) {
- pData += SubFrameSize;
- DataSize -= SubFrameSize;
- } else {
- /* end of A-MSDU */
- DataSize = 0;
- }
- }
-
- /* finally release original rx packet */
- RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS);
-
- return nMSDU;
-}
-
-u32 BA_Reorder_AMSDU_Announce(struct rt_rtmp_adapter *pAd, void *pPacket)
-{
- u8 *pData;
- u16 DataSize;
- u32 nMSDU = 0;
-
- pData = (u8 *)GET_OS_PKT_DATAPTR(pPacket);
- DataSize = (u16)GET_OS_PKT_LEN(pPacket);
-
- nMSDU = deaggregate_AMSDU_announce(pAd, pPacket, pData, DataSize);
-
- return nMSDU;
-}
-
-/*
- ==========================================================================
- Description:
- Look up the MAC address in the MAC table. Return NULL if not found.
- Return:
- pEntry - pointer to the MAC entry; NULL is not found
- ==========================================================================
-*/
-struct rt_mac_table_entry *MacTableLookup(struct rt_rtmp_adapter *pAd, u8 *pAddr)
-{
- unsigned long HashIdx;
- struct rt_mac_table_entry *pEntry = NULL;
-
- HashIdx = MAC_ADDR_HASH_INDEX(pAddr);
- pEntry = pAd->MacTab.Hash[HashIdx];
-
- while (pEntry
- && (pEntry->ValidAsCLI || pEntry->ValidAsWDS
- || pEntry->ValidAsApCli || pEntry->ValidAsMesh)) {
- if (MAC_ADDR_EQUAL(pEntry->Addr, pAddr)) {
- break;
- } else
- pEntry = pEntry->pNext;
- }
-
- return pEntry;
-}
-
-struct rt_mac_table_entry *MacTableInsertEntry(struct rt_rtmp_adapter *pAd,
- u8 *pAddr,
- u8 apidx, IN BOOLEAN CleanAll)
-{
- u8 HashIdx;
- int i, FirstWcid;
- struct rt_mac_table_entry *pEntry = NULL, *pCurrEntry;
-/* u16 offset; */
-/* unsigned long addr; */
-
- /* if FULL, return */
- if (pAd->MacTab.Size >= MAX_LEN_OF_MAC_TABLE)
- return NULL;
-
- FirstWcid = 1;
-
- if (pAd->StaCfg.BssType == BSS_INFRA)
- FirstWcid = 2;
-
- /* allocate one MAC entry */
- NdisAcquireSpinLock(&pAd->MacTabLock);
- for (i = FirstWcid; i < MAX_LEN_OF_MAC_TABLE; i++) /* skip entry#0 so that "entry index == AID" for fast lookup */
- {
- /* pick up the first available vacancy */
- if ((pAd->MacTab.Content[i].ValidAsCLI == FALSE) &&
- (pAd->MacTab.Content[i].ValidAsWDS == FALSE) &&
- (pAd->MacTab.Content[i].ValidAsApCli == FALSE) &&
- (pAd->MacTab.Content[i].ValidAsMesh == FALSE)
- ) {
- pEntry = &pAd->MacTab.Content[i];
- if (CleanAll == TRUE) {
- pEntry->MaxSupportedRate = RATE_11;
- pEntry->CurrTxRate = RATE_11;
- NdisZeroMemory(pEntry, sizeof(struct rt_mac_table_entry));
- pEntry->PairwiseKey.KeyLen = 0;
- pEntry->PairwiseKey.CipherAlg = CIPHER_NONE;
- }
- {
- {
- pEntry->ValidAsCLI = TRUE;
- pEntry->ValidAsWDS = FALSE;
- pEntry->ValidAsApCli = FALSE;
- pEntry->ValidAsMesh = FALSE;
- pEntry->ValidAsDls = FALSE;
- }
- }
-
- pEntry->bIAmBadAtheros = FALSE;
- pEntry->pAd = pAd;
- pEntry->CMTimerRunning = FALSE;
- pEntry->EnqueueEapolStartTimerRunning =
- EAPOL_START_DISABLE;
- pEntry->RSNIE_Len = 0;
- NdisZeroMemory(pEntry->R_Counter,
- sizeof(pEntry->R_Counter));
- pEntry->ReTryCounter = PEER_MSG1_RETRY_TIMER_CTR;
-
- if (pEntry->ValidAsMesh)
- pEntry->apidx =
- (apidx - MIN_NET_DEVICE_FOR_MESH);
- else if (pEntry->ValidAsApCli)
- pEntry->apidx =
- (apidx - MIN_NET_DEVICE_FOR_APCLI);
- else if (pEntry->ValidAsWDS)
- pEntry->apidx =
- (apidx - MIN_NET_DEVICE_FOR_WDS);
- else
- pEntry->apidx = apidx;
-
- {
- {
- pEntry->AuthMode = pAd->StaCfg.AuthMode;
- pEntry->WepStatus =
- pAd->StaCfg.WepStatus;
- pEntry->PrivacyFilter =
- Ndis802_11PrivFilterAcceptAll;
-#ifdef RTMP_MAC_PCI
- AsicRemovePairwiseKeyEntry(pAd,
- pEntry->
- apidx,
- (u8)i);
-#endif /* RTMP_MAC_PCI // */
- }
- }
-
- pEntry->GTKState = REKEY_NEGOTIATING;
- pEntry->PairwiseKey.KeyLen = 0;
- pEntry->PairwiseKey.CipherAlg = CIPHER_NONE;
- pEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;
-
- pEntry->PMKID_CacheIdx = ENTRY_NOT_FOUND;
- COPY_MAC_ADDR(pEntry->Addr, pAddr);
- pEntry->Sst = SST_NOT_AUTH;
- pEntry->AuthState = AS_NOT_AUTH;
- pEntry->Aid = (u16)i; /*0; */
- pEntry->CapabilityInfo = 0;
- pEntry->PsMode = PWR_ACTIVE;
- pEntry->PsQIdleCount = 0;
- pEntry->NoDataIdleCount = 0;
- pEntry->AssocDeadLine = MAC_TABLE_ASSOC_TIMEOUT;
- pEntry->ContinueTxFailCnt = 0;
- InitializeQueueHeader(&pEntry->PsQueue);
-
- pAd->MacTab.Size++;
- /* Add this entry into ASIC RX WCID search table */
- RTMP_STA_ENTRY_ADD(pAd, pEntry);
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("MacTableInsertEntry - allocate entry #%d, Total= %d\n",
- i, pAd->MacTab.Size));
- break;
- }
- }
-
- /* add this MAC entry into HASH table */
- if (pEntry) {
- HashIdx = MAC_ADDR_HASH_INDEX(pAddr);
- if (pAd->MacTab.Hash[HashIdx] == NULL) {
- pAd->MacTab.Hash[HashIdx] = pEntry;
- } else {
- pCurrEntry = pAd->MacTab.Hash[HashIdx];
- while (pCurrEntry->pNext != NULL)
- pCurrEntry = pCurrEntry->pNext;
- pCurrEntry->pNext = pEntry;
- }
- }
-
- NdisReleaseSpinLock(&pAd->MacTabLock);
- return pEntry;
-}
-
-/*
- ==========================================================================
- Description:
- Delete a specified client from MAC table
- ==========================================================================
- */
-BOOLEAN MacTableDeleteEntry(struct rt_rtmp_adapter *pAd,
- u16 wcid, u8 *pAddr)
-{
- u16 HashIdx;
- struct rt_mac_table_entry *pEntry, *pPrevEntry, *pProbeEntry;
- BOOLEAN Cancelled;
- /*u16 offset; // unused variable */
- /*u8 j; // unused variable */
-
- if (wcid >= MAX_LEN_OF_MAC_TABLE)
- return FALSE;
-
- NdisAcquireSpinLock(&pAd->MacTabLock);
-
- HashIdx = MAC_ADDR_HASH_INDEX(pAddr);
- /*pEntry = pAd->MacTab.Hash[HashIdx]; */
- pEntry = &pAd->MacTab.Content[wcid];
-
- if (pEntry
- && (pEntry->ValidAsCLI || pEntry->ValidAsApCli || pEntry->ValidAsWDS
- || pEntry->ValidAsMesh)) {
- if (MAC_ADDR_EQUAL(pEntry->Addr, pAddr)) {
-
- /* Delete this entry from ASIC on-chip WCID Table */
- RTMP_STA_ENTRY_MAC_RESET(pAd, wcid);
-
- /* free resources of BA */
- BASessionTearDownALL(pAd, pEntry->Aid);
-
- pPrevEntry = NULL;
- pProbeEntry = pAd->MacTab.Hash[HashIdx];
- ASSERT(pProbeEntry);
-
- /* update Hash list */
- do {
- if (pProbeEntry == pEntry) {
- if (pPrevEntry == NULL) {
- pAd->MacTab.Hash[HashIdx] =
- pEntry->pNext;
- } else {
- pPrevEntry->pNext =
- pEntry->pNext;
- }
- break;
- }
-
- pPrevEntry = pProbeEntry;
- pProbeEntry = pProbeEntry->pNext;
- } while (pProbeEntry);
-
- /* not found ! */
- ASSERT(pProbeEntry != NULL);
-
- RTMP_STA_ENTRY_KEY_DEL(pAd, BSS0, wcid);
-
- if (pEntry->EnqueueEapolStartTimerRunning !=
- EAPOL_START_DISABLE) {
- RTMPCancelTimer(&pEntry->
- EnqueueStartForPSKTimer,
- &Cancelled);
- pEntry->EnqueueEapolStartTimerRunning =
- EAPOL_START_DISABLE;
- }
-
- NdisZeroMemory(pEntry, sizeof(struct rt_mac_table_entry));
- pAd->MacTab.Size--;
- DBGPRINT(RT_DEBUG_TRACE,
- ("MacTableDeleteEntry1 - Total= %d\n",
- pAd->MacTab.Size));
- } else {
- DBGPRINT(RT_DEBUG_OFF,
- ("\n%s: Impossible Wcid = %d !\n",
- __func__, wcid));
- }
- }
-
- NdisReleaseSpinLock(&pAd->MacTabLock);
-
- /*Reset operating mode when no Sta. */
- if (pAd->MacTab.Size == 0) {
- pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode = 0;
- RTMP_UPDATE_PROTECT(pAd); /* edit by johnli, fix "in_interrupt" error when call "MacTableDeleteEntry" in Rx tasklet */
- }
-
- return TRUE;
-}
-
-/*
- ==========================================================================
- Description:
- This routine reset the entire MAC table. All packets pending in
- the power-saving queues are freed here.
- ==========================================================================
- */
-void MacTableReset(struct rt_rtmp_adapter *pAd)
-{
- int i;
-
- DBGPRINT(RT_DEBUG_TRACE, ("MacTableReset\n"));
- /*NdisAcquireSpinLock(&pAd->MacTabLock); */
-
- for (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++) {
-#ifdef RTMP_MAC_PCI
- RTMP_STA_ENTRY_MAC_RESET(pAd, i);
-#endif /* RTMP_MAC_PCI // */
- if (pAd->MacTab.Content[i].ValidAsCLI == TRUE) {
-
- /* free resources of BA */
- BASessionTearDownALL(pAd, i);
-
- pAd->MacTab.Content[i].ValidAsCLI = FALSE;
-
-#ifdef RTMP_MAC_USB
- NdisZeroMemory(pAd->MacTab.Content[i].Addr, 6);
- RTMP_STA_ENTRY_MAC_RESET(pAd, i);
-#endif /* RTMP_MAC_USB // */
-
- /*AsicDelWcidTab(pAd, i); */
- }
- }
-
- return;
-}
-
-/*
- ==========================================================================
- Description:
-
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
-*/
-void AssocParmFill(struct rt_rtmp_adapter *pAd,
- struct rt_mlme_assoc_req *AssocReq,
- u8 *pAddr,
- u16 CapabilityInfo,
- unsigned long Timeout, u16 ListenIntv)
-{
- COPY_MAC_ADDR(AssocReq->Addr, pAddr);
- /* Add mask to support 802.11b mode only */
- AssocReq->CapabilityInfo = CapabilityInfo & SUPPORTED_CAPABILITY_INFO; /* not cf-pollable, not cf-poll-request */
- AssocReq->Timeout = Timeout;
- AssocReq->ListenIntv = ListenIntv;
-}
-
-/*
- ==========================================================================
- Description:
-
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
-*/
-void DisassocParmFill(struct rt_rtmp_adapter *pAd,
- struct rt_mlme_disassoc_req *DisassocReq,
- u8 *pAddr, u16 Reason)
-{
- COPY_MAC_ADDR(DisassocReq->Addr, pAddr);
- DisassocReq->Reason = Reason;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Check the out going frame, if this is an DHCP or ARP datagram
- will be duplicate another frame at low data rate transmit.
-
- Arguments:
- pAd Pointer to our adapter
- pPacket Pointer to outgoing Ndis frame
-
- Return Value:
- TRUE To be duplicate at Low data rate transmit. (1mb)
- FALSE Do nothing.
-
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- MAC header + IP Header + UDP Header
- 14 Bytes 20 Bytes
-
- UDP Header
- 00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|
- Source Port
- 16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|
- Destination Port
-
- port 0x43 means Bootstrap Protocol, server.
- Port 0x44 means Bootstrap Protocol, client.
-
- ========================================================================
-*/
-
-BOOLEAN RTMPCheckDHCPFrame(struct rt_rtmp_adapter *pAd, void *pPacket)
-{
- struct rt_packet_info PacketInfo;
- unsigned long NumberOfBytesRead = 0;
- unsigned long CurrentOffset = 0;
- void *pVirtualAddress = NULL;
- u32 NdisBufferLength;
- u8 *pSrc;
- u16 Protocol;
- u8 ByteOffset36 = 0;
- u8 ByteOffset38 = 0;
- BOOLEAN ReadFirstParm = TRUE;
-
- RTMP_QueryPacketInfo(pPacket, &PacketInfo, (u8 **) & pVirtualAddress,
- &NdisBufferLength);
-
- NumberOfBytesRead += NdisBufferLength;
- pSrc = (u8 *)pVirtualAddress;
- Protocol = *(pSrc + 12) * 256 + *(pSrc + 13);
-
- /* */
- /* Check DHCP & BOOTP protocol */
- /* */
- while (NumberOfBytesRead <= PacketInfo.TotalPacketLength) {
- if ((NumberOfBytesRead >= 35) && (ReadFirstParm == TRUE)) {
- CurrentOffset =
- 35 - (NumberOfBytesRead - NdisBufferLength);
- ByteOffset36 = *(pSrc + CurrentOffset);
- ReadFirstParm = FALSE;
- }
-
- if (NumberOfBytesRead >= 37) {
- CurrentOffset =
- 37 - (NumberOfBytesRead - NdisBufferLength);
- ByteOffset38 = *(pSrc + CurrentOffset);
- /*End of Read */
- break;
- }
- return FALSE;
- }
-
- /* Check for DHCP & BOOTP protocol */
- if ((ByteOffset36 != 0x44) || (ByteOffset38 != 0x43)) {
- /* */
- /* 2054 (hex 0806) for ARP datagrams */
- /* if this packet is not ARP datagrams, then do nothing */
- /* ARP datagrams will also be duplicate at 1mb broadcast frames */
- /* */
- if (Protocol != 0x0806)
- return FALSE;
- }
-
- return TRUE;
-}
-
-BOOLEAN RTMPCheckEtherType(struct rt_rtmp_adapter *pAd, void *pPacket)
-{
- u16 TypeLen;
- u8 Byte0, Byte1;
- u8 *pSrcBuf;
- u32 pktLen;
- u16 srcPort, dstPort;
- BOOLEAN status = TRUE;
-
- pSrcBuf = GET_OS_PKT_DATAPTR(pPacket);
- pktLen = GET_OS_PKT_LEN(pPacket);
-
- ASSERT(pSrcBuf);
-
- RTMP_SET_PACKET_SPECIFIC(pPacket, 0);
-
- /* get Ethernet protocol field */
- TypeLen = (pSrcBuf[12] << 8) | pSrcBuf[13];
-
- pSrcBuf += LENGTH_802_3; /* Skip the Ethernet Header. */
-
- if (TypeLen <= 1500) { /* 802.3, 802.3 LLC */
- /*
- DestMAC(6) + SrcMAC(6) + Length(2) +
- DSAP(1) + SSAP(1) + Control(1) +
- if the DSAP = 0xAA, SSAP=0xAA, Contorl = 0x03, it has a 5-bytes SNAP header.
- => + SNAP (5, OriginationID(3) + etherType(2))
- */
- if (pSrcBuf[0] == 0xAA && pSrcBuf[1] == 0xAA
- && pSrcBuf[2] == 0x03) {
- Sniff2BytesFromNdisBuffer((char *)pSrcBuf, 6,
- &Byte0, &Byte1);
- RTMP_SET_PACKET_LLCSNAP(pPacket, 1);
- TypeLen = (u16)((Byte0 << 8) + Byte1);
- pSrcBuf += 8; /* Skip this LLC/SNAP header */
- } else {
- /*It just has 3-byte LLC header, maybe a legacy ether type frame. we didn't handle it. */
- }
- }
- /* If it's a VLAN packet, get the real Type/Length field. */
- if (TypeLen == 0x8100) {
- /* 0x8100 means VLAN packets */
-
- /* Dest. MAC Address (6-bytes) +
- Source MAC Address (6-bytes) +
- Length/Type = 802.1Q Tag Type (2-byte) +
- Tag Control Information (2-bytes) +
- Length / Type (2-bytes) +
- data payload (0-n bytes) +
- Pad (0-p bytes) +
- Frame Check Sequence (4-bytes) */
-
- RTMP_SET_PACKET_VLAN(pPacket, 1);
- Sniff2BytesFromNdisBuffer((char *)pSrcBuf, 2, &Byte0,
- &Byte1);
- TypeLen = (u16)((Byte0 << 8) + Byte1);
-
- pSrcBuf += 4; /* Skip the VLAN Header. */
- }
-
- switch (TypeLen) {
- case 0x0800:
- {
- ASSERT((pktLen > 34));
- if (*(pSrcBuf + 9) == 0x11) { /* udp packet */
- ASSERT((pktLen > 34)); /* 14 for ethernet header, 20 for IP header */
-
- pSrcBuf += 20; /* Skip the IP header */
- srcPort =
- OS_NTOHS(get_unaligned
- ((u16 *)(pSrcBuf)));
- dstPort =
- OS_NTOHS(get_unaligned
- ((u16 *)(pSrcBuf + 2)));
-
- if ((srcPort == 0x44 && dstPort == 0x43) || (srcPort == 0x43 && dstPort == 0x44)) { /*It's a BOOTP/DHCP packet */
- RTMP_SET_PACKET_DHCP(pPacket, 1);
- }
- }
- }
- break;
- case 0x0806:
- {
- /*ARP Packet. */
- RTMP_SET_PACKET_DHCP(pPacket, 1);
- }
- break;
- case 0x888e:
- {
- /* EAPOL Packet. */
- RTMP_SET_PACKET_EAPOL(pPacket, 1);
- }
- break;
- default:
- status = FALSE;
- break;
- }
-
- return status;
-
-}
-
-void Update_Rssi_Sample(struct rt_rtmp_adapter *pAd,
- struct rt_rssi_sample *pRssi, struct rt_rxwi * pRxWI)
-{
- char rssi0 = pRxWI->RSSI0;
- char rssi1 = pRxWI->RSSI1;
- char rssi2 = pRxWI->RSSI2;
-
- if (rssi0 != 0) {
- pRssi->LastRssi0 = ConvertToRssi(pAd, (char)rssi0, RSSI_0);
- pRssi->AvgRssi0X8 =
- (pRssi->AvgRssi0X8 - pRssi->AvgRssi0) + pRssi->LastRssi0;
- pRssi->AvgRssi0 = pRssi->AvgRssi0X8 >> 3;
- }
-
- if (rssi1 != 0) {
- pRssi->LastRssi1 = ConvertToRssi(pAd, (char)rssi1, RSSI_1);
- pRssi->AvgRssi1X8 =
- (pRssi->AvgRssi1X8 - pRssi->AvgRssi1) + pRssi->LastRssi1;
- pRssi->AvgRssi1 = pRssi->AvgRssi1X8 >> 3;
- }
-
- if (rssi2 != 0) {
- pRssi->LastRssi2 = ConvertToRssi(pAd, (char)rssi2, RSSI_2);
- pRssi->AvgRssi2X8 =
- (pRssi->AvgRssi2X8 - pRssi->AvgRssi2) + pRssi->LastRssi2;
- pRssi->AvgRssi2 = pRssi->AvgRssi2X8 >> 3;
- }
-}
-
-/* Normal legacy Rx packet indication */
-void Indicate_Legacy_Packet(struct rt_rtmp_adapter *pAd,
- struct rt_rx_blk *pRxBlk, u8 FromWhichBSSID)
-{
- void *pRxPacket = pRxBlk->pRxPacket;
- u8 Header802_3[LENGTH_802_3];
-
- /* 1. get 802.3 Header */
- /* 2. remove LLC */
- /* a. pointer pRxBlk->pData to payload */
- /* b. modify pRxBlk->DataSize */
- RTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3);
-
- if (pRxBlk->DataSize > MAX_RX_PKT_LEN) {
-
- /* release packet */
- RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);
- return;
- }
-
- STATS_INC_RX_PACKETS(pAd, FromWhichBSSID);
-
-#ifdef RTMP_MAC_USB
- if (pAd->CommonCfg.bDisableReordering == 0) {
- struct rt_ba_rec_entry *pBAEntry;
- unsigned long Now32;
- u8 Wcid = pRxBlk->pRxWI->WirelessCliID;
- u8 TID = pRxBlk->pRxWI->TID;
- u16 Idx;
-
-#define REORDERING_PACKET_TIMEOUT ((100 * OS_HZ)/1000) /* system ticks -- 100 ms */
-
- if (Wcid < MAX_LEN_OF_MAC_TABLE) {
- Idx = pAd->MacTab.Content[Wcid].BARecWcidArray[TID];
- if (Idx != 0) {
- pBAEntry = &pAd->BATable.BARecEntry[Idx];
- /* update last rx time */
- NdisGetSystemUpTime(&Now32);
- if ((pBAEntry->list.qlen > 0) &&
- RTMP_TIME_AFTER((unsigned long)Now32,
- (unsigned long)(pBAEntry->
- LastIndSeqAtTimer
- +
- (REORDERING_PACKET_TIMEOUT)))
- ) {
- DBGPRINT(RT_DEBUG_OFF,
- ("Indicate_Legacy_Packet():flush reordering_timeout_mpdus! RxWI->Flags=%d, pRxWI.TID=%d, RxD->AMPDU=%d!\n",
- pRxBlk->Flags,
- pRxBlk->pRxWI->TID,
- pRxBlk->RxD.AMPDU));
- hex_dump("Dump the legacy Packet:",
- GET_OS_PKT_DATAPTR(pRxBlk->
- pRxPacket),
- 64);
- ba_flush_reordering_timeout_mpdus(pAd,
- pBAEntry,
- Now32);
- }
- }
- }
- }
-#endif /* RTMP_MAC_USB // */
-
- wlan_802_11_to_802_3_packet(pAd, pRxBlk, Header802_3, FromWhichBSSID);
-
- /* */
- /* pass this 802.3 packet to upper layer or forward this packet to WM directly */
- /* */
- ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pRxPacket, FromWhichBSSID);
-}
-
-/* Normal, AMPDU or AMSDU */
-void CmmRxnonRalinkFrameIndicate(struct rt_rtmp_adapter *pAd,
- struct rt_rx_blk *pRxBlk, u8 FromWhichBSSID)
-{
- if (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMPDU)
- && (pAd->CommonCfg.bDisableReordering == 0)) {
- Indicate_AMPDU_Packet(pAd, pRxBlk, FromWhichBSSID);
- } else {
- if (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU)) {
- /* handle A-MSDU */
- Indicate_AMSDU_Packet(pAd, pRxBlk, FromWhichBSSID);
- } else {
- Indicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID);
- }
- }
-}
-
-void CmmRxRalinkFrameIndicate(struct rt_rtmp_adapter *pAd,
- struct rt_mac_table_entry *pEntry,
- struct rt_rx_blk *pRxBlk, u8 FromWhichBSSID)
-{
- u8 Header802_3[LENGTH_802_3];
- u16 Msdu2Size;
- u16 Payload1Size, Payload2Size;
- u8 *pData2;
- void *pPacket2 = NULL;
-
- Msdu2Size = *(pRxBlk->pData) + (*(pRxBlk->pData + 1) << 8);
-
- if ((Msdu2Size <= 1536) && (Msdu2Size < pRxBlk->DataSize)) {
- /* skip two byte MSDU2 len */
- pRxBlk->pData += 2;
- pRxBlk->DataSize -= 2;
- } else {
- /* release packet */
- RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket,
- NDIS_STATUS_FAILURE);
- return;
- }
-
- /* get 802.3 Header and remove LLC */
- RTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3);
-
- ASSERT(pRxBlk->pRxPacket);
-
- /* Ralink Aggregation frame */
- pAd->RalinkCounters.OneSecRxAggregationCount++;
- Payload1Size = pRxBlk->DataSize - Msdu2Size;
- Payload2Size = Msdu2Size - LENGTH_802_3;
-
- pData2 = pRxBlk->pData + Payload1Size + LENGTH_802_3;
-
- pPacket2 =
- duplicate_pkt(pAd, (pData2 - LENGTH_802_3), LENGTH_802_3, pData2,
- Payload2Size, FromWhichBSSID);
-
- if (!pPacket2) {
- /* release packet */
- RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket,
- NDIS_STATUS_FAILURE);
- return;
- }
- /* update payload size of 1st packet */
- pRxBlk->DataSize = Payload1Size;
- wlan_802_11_to_802_3_packet(pAd, pRxBlk, Header802_3, FromWhichBSSID);
-
- ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pRxBlk->pRxPacket,
- FromWhichBSSID);
-
- if (pPacket2) {
- ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pPacket2, FromWhichBSSID);
- }
-}
-
-#define RESET_FRAGFRAME(_fragFrame) \
- { \
- _fragFrame.RxSize = 0; \
- _fragFrame.Sequence = 0; \
- _fragFrame.LastFrag = 0; \
- _fragFrame.Flags = 0; \
- }
-
-void *RTMPDeFragmentDataFrame(struct rt_rtmp_adapter *pAd, struct rt_rx_blk *pRxBlk)
-{
- struct rt_header_802_11 * pHeader = pRxBlk->pHeader;
- void *pRxPacket = pRxBlk->pRxPacket;
- u8 *pData = pRxBlk->pData;
- u16 DataSize = pRxBlk->DataSize;
- void *pRetPacket = NULL;
- u8 *pFragBuffer = NULL;
- BOOLEAN bReassDone = FALSE;
- u8 HeaderRoom = 0;
-
- ASSERT(pHeader);
-
- HeaderRoom = pData - (u8 *) pHeader;
-
- /* Re-assemble the fragmented packets */
- if (pHeader->Frag == 0) /* Frag. Number is 0 : First frag or only one pkt */
- {
- /* the first pkt of fragment, record it. */
- if (pHeader->FC.MoreFrag) {
- ASSERT(pAd->FragFrame.pFragPacket);
- pFragBuffer =
- GET_OS_PKT_DATAPTR(pAd->FragFrame.pFragPacket);
- pAd->FragFrame.RxSize = DataSize + HeaderRoom;
- NdisMoveMemory(pFragBuffer, pHeader,
- pAd->FragFrame.RxSize);
- pAd->FragFrame.Sequence = pHeader->Sequence;
- pAd->FragFrame.LastFrag = pHeader->Frag; /* Should be 0 */
- ASSERT(pAd->FragFrame.LastFrag == 0);
- goto done; /* end of processing this frame */
- }
- } else /*Middle & End of fragment */
- {
- if ((pHeader->Sequence != pAd->FragFrame.Sequence) ||
- (pHeader->Frag != (pAd->FragFrame.LastFrag + 1))) {
- /* Fragment is not the same sequence or out of fragment number order */
- /* Reset Fragment control blk */
- RESET_FRAGFRAME(pAd->FragFrame);
- DBGPRINT(RT_DEBUG_ERROR,
- ("Fragment is not the same sequence or out of fragment number order.\n"));
- goto done; /* give up this frame */
- } else if ((pAd->FragFrame.RxSize + DataSize) > MAX_FRAME_SIZE) {
- /* Fragment frame is too large, it exeeds the maximum frame size. */
- /* Reset Fragment control blk */
- RESET_FRAGFRAME(pAd->FragFrame);
- DBGPRINT(RT_DEBUG_ERROR,
- ("Fragment frame is too large, it exeeds the maximum frame size.\n"));
- goto done; /* give up this frame */
- }
- /* */
- /* Broadcom AP(BCM94704AGR) will send out LLC in fragment's packet, LLC only can accpet at first fragment. */
- /* In this case, we will dropt it. */
- /* */
- if (NdisEqualMemory(pData, SNAP_802_1H, sizeof(SNAP_802_1H))) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("Find another LLC at Middle or End fragment(SN=%d, Frag=%d)\n",
- pHeader->Sequence, pHeader->Frag));
- goto done; /* give up this frame */
- }
-
- pFragBuffer = GET_OS_PKT_DATAPTR(pAd->FragFrame.pFragPacket);
-
- /* concatenate this fragment into the re-assembly buffer */
- NdisMoveMemory((pFragBuffer + pAd->FragFrame.RxSize), pData,
- DataSize);
- pAd->FragFrame.RxSize += DataSize;
- pAd->FragFrame.LastFrag = pHeader->Frag; /* Update fragment number */
-
- /* Last fragment */
- if (pHeader->FC.MoreFrag == FALSE) {
- bReassDone = TRUE;
- }
- }
-
-done:
- /* always release rx fragmented packet */
- RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);
-
- /* return defragmented packet if packet is reassembled completely */
- /* otherwise return NULL */
- if (bReassDone) {
- void *pNewFragPacket;
-
- /* allocate a new packet buffer for fragment */
- pNewFragPacket =
- RTMP_AllocateFragPacketBuffer(pAd, RX_BUFFER_NORMSIZE);
- if (pNewFragPacket) {
- /* update RxBlk */
- pRetPacket = pAd->FragFrame.pFragPacket;
- pAd->FragFrame.pFragPacket = pNewFragPacket;
- pRxBlk->pHeader =
- (struct rt_header_802_11 *) GET_OS_PKT_DATAPTR(pRetPacket);
- pRxBlk->pData = (u8 *) pRxBlk->pHeader + HeaderRoom;
- pRxBlk->DataSize = pAd->FragFrame.RxSize - HeaderRoom;
- pRxBlk->pRxPacket = pRetPacket;
- } else {
- RESET_FRAGFRAME(pAd->FragFrame);
- }
- }
-
- return pRetPacket;
-}
-
-void Indicate_AMSDU_Packet(struct rt_rtmp_adapter *pAd,
- struct rt_rx_blk *pRxBlk, u8 FromWhichBSSID)
-{
- u32 nMSDU;
-
- update_os_packet_info(pAd, pRxBlk, FromWhichBSSID);
- RTMP_SET_PACKET_IF(pRxBlk->pRxPacket, FromWhichBSSID);
- nMSDU =
- deaggregate_AMSDU_announce(pAd, pRxBlk->pRxPacket, pRxBlk->pData,
- pRxBlk->DataSize);
-}
-
-void Indicate_EAPOL_Packet(struct rt_rtmp_adapter *pAd,
- struct rt_rx_blk *pRxBlk, u8 FromWhichBSSID)
-{
- struct rt_mac_table_entry *pEntry = NULL;
-
- {
- pEntry = &pAd->MacTab.Content[BSSID_WCID];
- STARxEAPOLFrameIndicate(pAd, pEntry, pRxBlk, FromWhichBSSID);
- return;
- }
-
- if (pEntry == NULL) {
- DBGPRINT(RT_DEBUG_WARN,
- ("Indicate_EAPOL_Packet: drop and release the invalid packet.\n"));
- /* release packet */
- RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket,
- NDIS_STATUS_FAILURE);
- return;
- }
-}
-
-#define BCN_TBTT_OFFSET 64 /*defer 64 us */
-void ReSyncBeaconTime(struct rt_rtmp_adapter *pAd)
-{
-
- u32 Offset;
-
- Offset = (pAd->TbttTickCount) % (BCN_TBTT_OFFSET);
-
- pAd->TbttTickCount++;
-
- /* */
- /* The updated BeaconInterval Value will affect Beacon Interval after two TBTT */
- /* beacasue the original BeaconInterval had been loaded into next TBTT_TIMER */
- /* */
- if (Offset == (BCN_TBTT_OFFSET - 2)) {
- BCN_TIME_CFG_STRUC csr;
- RTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr.word);
- csr.field.BeaconInterval = (pAd->CommonCfg.BeaconPeriod << 4) - 1; /* ASIC register in units of 1/16 TU = 64us */
- RTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr.word);
- } else {
- if (Offset == (BCN_TBTT_OFFSET - 1)) {
- BCN_TIME_CFG_STRUC csr;
-
- RTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr.word);
- csr.field.BeaconInterval = (pAd->CommonCfg.BeaconPeriod) << 4; /* ASIC register in units of 1/16 TU */
- RTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr.word);
- }
- }
-}
diff --git a/drivers/staging/rt2860/common/cmm_data_pci.c b/drivers/staging/rt2860/common/cmm_data_pci.c
deleted file mode 100644
index f01a51c381f1..000000000000
--- a/drivers/staging/rt2860/common/cmm_data_pci.c
+++ /dev/null
@@ -1,1096 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
- */
-
-/*
- All functions in this file must be PCI-depended, or you should out your function
- in other files.
-
-*/
-#include "../rt_config.h"
-
-u16 RtmpPCI_WriteTxResource(struct rt_rtmp_adapter *pAd,
- struct rt_tx_blk *pTxBlk,
- IN BOOLEAN bIsLast, u16 * FreeNumber)
-{
-
- u8 *pDMAHeaderBufVA;
- u16 TxIdx, RetTxIdx;
- struct rt_txd * pTxD;
- u32 BufBasePaLow;
- struct rt_rtmp_tx_ring *pTxRing;
- u16 hwHeaderLen;
-
- /* */
- /* get Tx Ring Resource */
- /* */
- pTxRing = &pAd->TxRing[pTxBlk->QueIdx];
- TxIdx = pAd->TxRing[pTxBlk->QueIdx].TxCpuIdx;
- pDMAHeaderBufVA = (u8 *)pTxRing->Cell[TxIdx].DmaBuf.AllocVa;
- BufBasePaLow =
- RTMP_GetPhysicalAddressLow(pTxRing->Cell[TxIdx].DmaBuf.AllocPa);
-
- /* copy TXINFO + TXWI + WLAN Header + LLC into DMA Header Buffer */
- if (pTxBlk->TxFrameType == TX_AMSDU_FRAME) {
- /*hwHeaderLen = ROUND_UP(pTxBlk->MpduHeaderLen-LENGTH_AMSDU_SUBFRAMEHEAD, 4)+LENGTH_AMSDU_SUBFRAMEHEAD; */
- hwHeaderLen =
- pTxBlk->MpduHeaderLen - LENGTH_AMSDU_SUBFRAMEHEAD +
- pTxBlk->HdrPadLen + LENGTH_AMSDU_SUBFRAMEHEAD;
- } else {
- /*hwHeaderLen = ROUND_UP(pTxBlk->MpduHeaderLen, 4); */
- hwHeaderLen = pTxBlk->MpduHeaderLen + pTxBlk->HdrPadLen;
- }
- NdisMoveMemory(pDMAHeaderBufVA, pTxBlk->HeaderBuf,
- TXINFO_SIZE + TXWI_SIZE + hwHeaderLen);
-
- pTxRing->Cell[TxIdx].pNdisPacket = pTxBlk->pPacket;
- pTxRing->Cell[TxIdx].pNextNdisPacket = NULL;
-
- /* */
- /* build Tx Descriptor */
- /* */
-
- pTxD = (struct rt_txd *) pTxRing->Cell[TxIdx].AllocVa;
- NdisZeroMemory(pTxD, TXD_SIZE);
-
- pTxD->SDPtr0 = BufBasePaLow;
- pTxD->SDLen0 = TXINFO_SIZE + TXWI_SIZE + hwHeaderLen; /* include padding */
- pTxD->SDPtr1 = PCI_MAP_SINGLE(pAd, pTxBlk, 0, 1, PCI_DMA_TODEVICE);
- pTxD->SDLen1 = pTxBlk->SrcBufLen;
- pTxD->LastSec0 = 0;
- pTxD->LastSec1 = (bIsLast) ? 1 : 0;
-
- RTMPWriteTxDescriptor(pAd, pTxD, FALSE, FIFO_EDCA);
-
- RetTxIdx = TxIdx;
- /* */
- /* Update Tx index */
- /* */
- INC_RING_INDEX(TxIdx, TX_RING_SIZE);
- pTxRing->TxCpuIdx = TxIdx;
-
- *FreeNumber -= 1;
-
- return RetTxIdx;
-}
-
-u16 RtmpPCI_WriteSingleTxResource(struct rt_rtmp_adapter *pAd,
- struct rt_tx_blk *pTxBlk,
- IN BOOLEAN bIsLast,
- u16 * FreeNumber)
-{
-
- u8 *pDMAHeaderBufVA;
- u16 TxIdx, RetTxIdx;
- struct rt_txd * pTxD;
- u32 BufBasePaLow;
- struct rt_rtmp_tx_ring *pTxRing;
- u16 hwHeaderLen;
-
- /* */
- /* get Tx Ring Resource */
- /* */
- pTxRing = &pAd->TxRing[pTxBlk->QueIdx];
- TxIdx = pAd->TxRing[pTxBlk->QueIdx].TxCpuIdx;
- pDMAHeaderBufVA = (u8 *)pTxRing->Cell[TxIdx].DmaBuf.AllocVa;
- BufBasePaLow =
- RTMP_GetPhysicalAddressLow(pTxRing->Cell[TxIdx].DmaBuf.AllocPa);
-
- /* copy TXINFO + TXWI + WLAN Header + LLC into DMA Header Buffer */
- /*hwHeaderLen = ROUND_UP(pTxBlk->MpduHeaderLen, 4); */
- hwHeaderLen = pTxBlk->MpduHeaderLen + pTxBlk->HdrPadLen;
-
- NdisMoveMemory(pDMAHeaderBufVA, pTxBlk->HeaderBuf,
- TXINFO_SIZE + TXWI_SIZE + hwHeaderLen);
-
- pTxRing->Cell[TxIdx].pNdisPacket = pTxBlk->pPacket;
- pTxRing->Cell[TxIdx].pNextNdisPacket = NULL;
-
- /* */
- /* build Tx Descriptor */
- /* */
- pTxD = (struct rt_txd *) pTxRing->Cell[TxIdx].AllocVa;
- NdisZeroMemory(pTxD, TXD_SIZE);
-
- pTxD->SDPtr0 = BufBasePaLow;
- pTxD->SDLen0 = TXINFO_SIZE + TXWI_SIZE + hwHeaderLen; /* include padding */
- pTxD->SDPtr1 = PCI_MAP_SINGLE(pAd, pTxBlk, 0, 1, PCI_DMA_TODEVICE);
- pTxD->SDLen1 = pTxBlk->SrcBufLen;
- pTxD->LastSec0 = 0;
- pTxD->LastSec1 = (bIsLast) ? 1 : 0;
-
- RTMPWriteTxDescriptor(pAd, pTxD, FALSE, FIFO_EDCA);
-
- RetTxIdx = TxIdx;
- /* */
- /* Update Tx index */
- /* */
- INC_RING_INDEX(TxIdx, TX_RING_SIZE);
- pTxRing->TxCpuIdx = TxIdx;
-
- *FreeNumber -= 1;
-
- return RetTxIdx;
-}
-
-u16 RtmpPCI_WriteMultiTxResource(struct rt_rtmp_adapter *pAd,
- struct rt_tx_blk *pTxBlk,
- u8 frameNum, u16 * FreeNumber)
-{
- BOOLEAN bIsLast;
- u8 *pDMAHeaderBufVA;
- u16 TxIdx, RetTxIdx;
- struct rt_txd * pTxD;
- u32 BufBasePaLow;
- struct rt_rtmp_tx_ring *pTxRing;
- u16 hwHdrLen;
- u32 firstDMALen;
-
- bIsLast = ((frameNum == (pTxBlk->TotalFrameNum - 1)) ? 1 : 0);
-
- /* */
- /* get Tx Ring Resource */
- /* */
- pTxRing = &pAd->TxRing[pTxBlk->QueIdx];
- TxIdx = pAd->TxRing[pTxBlk->QueIdx].TxCpuIdx;
- pDMAHeaderBufVA = (u8 *)pTxRing->Cell[TxIdx].DmaBuf.AllocVa;
- BufBasePaLow =
- RTMP_GetPhysicalAddressLow(pTxRing->Cell[TxIdx].DmaBuf.AllocPa);
-
- if (frameNum == 0) {
- /* copy TXINFO + TXWI + WLAN Header + LLC into DMA Header Buffer */
- if (pTxBlk->TxFrameType == TX_AMSDU_FRAME)
- /*hwHdrLen = ROUND_UP(pTxBlk->MpduHeaderLen-LENGTH_AMSDU_SUBFRAMEHEAD, 4)+LENGTH_AMSDU_SUBFRAMEHEAD; */
- hwHdrLen =
- pTxBlk->MpduHeaderLen - LENGTH_AMSDU_SUBFRAMEHEAD +
- pTxBlk->HdrPadLen + LENGTH_AMSDU_SUBFRAMEHEAD;
- else if (pTxBlk->TxFrameType == TX_RALINK_FRAME)
- /*hwHdrLen = ROUND_UP(pTxBlk->MpduHeaderLen-LENGTH_ARALINK_HEADER_FIELD, 4)+LENGTH_ARALINK_HEADER_FIELD; */
- hwHdrLen =
- pTxBlk->MpduHeaderLen -
- LENGTH_ARALINK_HEADER_FIELD + pTxBlk->HdrPadLen +
- LENGTH_ARALINK_HEADER_FIELD;
- else
- /*hwHdrLen = ROUND_UP(pTxBlk->MpduHeaderLen, 4); */
- hwHdrLen = pTxBlk->MpduHeaderLen + pTxBlk->HdrPadLen;
-
- firstDMALen = TXINFO_SIZE + TXWI_SIZE + hwHdrLen;
- } else {
- firstDMALen = pTxBlk->MpduHeaderLen;
- }
-
- NdisMoveMemory(pDMAHeaderBufVA, pTxBlk->HeaderBuf, firstDMALen);
-
- pTxRing->Cell[TxIdx].pNdisPacket = pTxBlk->pPacket;
- pTxRing->Cell[TxIdx].pNextNdisPacket = NULL;
-
- /* */
- /* build Tx Descriptor */
- /* */
- pTxD = (struct rt_txd *) pTxRing->Cell[TxIdx].AllocVa;
- NdisZeroMemory(pTxD, TXD_SIZE);
-
- pTxD->SDPtr0 = BufBasePaLow;
- pTxD->SDLen0 = firstDMALen; /* include padding */
- pTxD->SDPtr1 = PCI_MAP_SINGLE(pAd, pTxBlk, 0, 1, PCI_DMA_TODEVICE);
- pTxD->SDLen1 = pTxBlk->SrcBufLen;
- pTxD->LastSec0 = 0;
- pTxD->LastSec1 = (bIsLast) ? 1 : 0;
-
- RTMPWriteTxDescriptor(pAd, pTxD, FALSE, FIFO_EDCA);
-
- RetTxIdx = TxIdx;
- /* */
- /* Update Tx index */
- /* */
- INC_RING_INDEX(TxIdx, TX_RING_SIZE);
- pTxRing->TxCpuIdx = TxIdx;
-
- *FreeNumber -= 1;
-
- return RetTxIdx;
-
-}
-
-void RtmpPCI_FinalWriteTxResource(struct rt_rtmp_adapter *pAd,
- struct rt_tx_blk *pTxBlk,
- u16 totalMPDUSize, u16 FirstTxIdx)
-{
-
- struct rt_txwi * pTxWI;
- struct rt_rtmp_tx_ring *pTxRing;
-
- /* */
- /* get Tx Ring Resource */
- /* */
- pTxRing = &pAd->TxRing[pTxBlk->QueIdx];
- pTxWI = (struct rt_txwi *) pTxRing->Cell[FirstTxIdx].DmaBuf.AllocVa;
- pTxWI->MPDUtotalByteCount = totalMPDUSize;
-
-}
-
-void RtmpPCIDataLastTxIdx(struct rt_rtmp_adapter *pAd,
- u8 QueIdx, u16 LastTxIdx)
-{
- struct rt_txd * pTxD;
- struct rt_rtmp_tx_ring *pTxRing;
-
- /* */
- /* get Tx Ring Resource */
- /* */
- pTxRing = &pAd->TxRing[QueIdx];
-
- /* */
- /* build Tx Descriptor */
- /* */
- pTxD = (struct rt_txd *) pTxRing->Cell[LastTxIdx].AllocVa;
-
- pTxD->LastSec1 = 1;
-
-}
-
-u16 RtmpPCI_WriteFragTxResource(struct rt_rtmp_adapter *pAd,
- struct rt_tx_blk *pTxBlk,
- u8 fragNum, u16 * FreeNumber)
-{
- u8 *pDMAHeaderBufVA;
- u16 TxIdx, RetTxIdx;
- struct rt_txd * pTxD;
- u32 BufBasePaLow;
- struct rt_rtmp_tx_ring *pTxRing;
- u16 hwHeaderLen;
- u32 firstDMALen;
-
- /* */
- /* Get Tx Ring Resource */
- /* */
- pTxRing = &pAd->TxRing[pTxBlk->QueIdx];
- TxIdx = pAd->TxRing[pTxBlk->QueIdx].TxCpuIdx;
- pDMAHeaderBufVA = (u8 *)pTxRing->Cell[TxIdx].DmaBuf.AllocVa;
- BufBasePaLow =
- RTMP_GetPhysicalAddressLow(pTxRing->Cell[TxIdx].DmaBuf.AllocPa);
-
- /* */
- /* Copy TXINFO + TXWI + WLAN Header + LLC into DMA Header Buffer */
- /* */
- /*hwHeaderLen = ROUND_UP(pTxBlk->MpduHeaderLen, 4); */
- hwHeaderLen = pTxBlk->MpduHeaderLen + pTxBlk->HdrPadLen;
-
- firstDMALen = TXINFO_SIZE + TXWI_SIZE + hwHeaderLen;
- NdisMoveMemory(pDMAHeaderBufVA, pTxBlk->HeaderBuf, firstDMALen);
-
- /* */
- /* Build Tx Descriptor */
- /* */
- pTxD = (struct rt_txd *) pTxRing->Cell[TxIdx].AllocVa;
- NdisZeroMemory(pTxD, TXD_SIZE);
-
- if (fragNum == pTxBlk->TotalFragNum) {
- pTxRing->Cell[TxIdx].pNdisPacket = pTxBlk->pPacket;
- pTxRing->Cell[TxIdx].pNextNdisPacket = NULL;
- }
-
- pTxD->SDPtr0 = BufBasePaLow;
- pTxD->SDLen0 = firstDMALen; /* include padding */
- pTxD->SDPtr1 = PCI_MAP_SINGLE(pAd, pTxBlk, 0, 1, PCI_DMA_TODEVICE);
- pTxD->SDLen1 = pTxBlk->SrcBufLen;
- pTxD->LastSec0 = 0;
- pTxD->LastSec1 = 1;
-
- RTMPWriteTxDescriptor(pAd, pTxD, FALSE, FIFO_EDCA);
-
- RetTxIdx = TxIdx;
- pTxBlk->Priv += pTxBlk->SrcBufLen;
-
- /* */
- /* Update Tx index */
- /* */
- INC_RING_INDEX(TxIdx, TX_RING_SIZE);
- pTxRing->TxCpuIdx = TxIdx;
-
- *FreeNumber -= 1;
-
- return RetTxIdx;
-
-}
-
-/*
- Must be run in Interrupt context
- This function handle PCI specific TxDesc and cpu index update and kick the packet out.
- */
-int RtmpPCIMgmtKickOut(struct rt_rtmp_adapter *pAd,
- u8 QueIdx,
- void *pPacket,
- u8 *pSrcBufVA, u32 SrcBufLen)
-{
- struct rt_txd * pTxD;
- unsigned long SwIdx = pAd->MgmtRing.TxCpuIdx;
-
- pTxD = (struct rt_txd *) pAd->MgmtRing.Cell[SwIdx].AllocVa;
-
- pAd->MgmtRing.Cell[SwIdx].pNdisPacket = pPacket;
- pAd->MgmtRing.Cell[SwIdx].pNextNdisPacket = NULL;
-
- RTMPWriteTxDescriptor(pAd, pTxD, TRUE, FIFO_MGMT);
- pTxD->LastSec0 = 1;
- pTxD->LastSec1 = 1;
- pTxD->DMADONE = 0;
- pTxD->SDLen1 = 0;
- pTxD->SDPtr0 =
- PCI_MAP_SINGLE(pAd, pSrcBufVA, SrcBufLen, 0, PCI_DMA_TODEVICE);
- pTxD->SDLen0 = SrcBufLen;
-
-/*================================================================== */
-/* DBGPRINT_RAW(RT_DEBUG_TRACE, ("MLMEHardTransmit\n"));
- for (i = 0; i < (TXWI_SIZE+24); i++)
- {
-
- DBGPRINT_RAW(RT_DEBUG_TRACE, ("%x:", *(pSrcBufVA+i)));
- if ( i%4 == 3)
- DBGPRINT_RAW(RT_DEBUG_TRACE, (" :: "));
- if ( i%16 == 15)
- DBGPRINT_RAW(RT_DEBUG_TRACE, ("\n "));
- }
- DBGPRINT_RAW(RT_DEBUG_TRACE, ("\n "));*/
-/*======================================================================= */
-
- pAd->RalinkCounters.KickTxCount++;
- pAd->RalinkCounters.OneSecTxDoneCount++;
-
- /* Increase TX_CTX_IDX, but write to register later. */
- INC_RING_INDEX(pAd->MgmtRing.TxCpuIdx, MGMT_RING_SIZE);
-
- RTMP_IO_WRITE32(pAd, TX_MGMTCTX_IDX, pAd->MgmtRing.TxCpuIdx);
-
- return 0;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Check Rx descriptor, return NDIS_STATUS_FAILURE if any error dound
-
- Arguments:
- pRxD Pointer to the Rx descriptor
-
- Return Value:
- NDIS_STATUS_SUCCESS No err
- NDIS_STATUS_FAILURE Error
-
- Note:
-
- ========================================================================
-*/
-int RTMPCheckRxError(struct rt_rtmp_adapter *pAd,
- struct rt_header_802_11 * pHeader,
- struct rt_rxwi * pRxWI, IN PRT28XX_RXD_STRUC pRxD)
-{
- struct rt_cipher_key *pWpaKey;
- int dBm;
-
- /* Phy errors & CRC errors */
- if ( /*(pRxD->PhyErr) || */ (pRxD->Crc)) {
- /* Check RSSI for Noise Hist statistic collection. */
- dBm = (int)(pRxWI->RSSI0) - pAd->BbpRssiToDbmDelta;
- if (dBm <= -87)
- pAd->StaCfg.RPIDensity[0] += 1;
- else if (dBm <= -82)
- pAd->StaCfg.RPIDensity[1] += 1;
- else if (dBm <= -77)
- pAd->StaCfg.RPIDensity[2] += 1;
- else if (dBm <= -72)
- pAd->StaCfg.RPIDensity[3] += 1;
- else if (dBm <= -67)
- pAd->StaCfg.RPIDensity[4] += 1;
- else if (dBm <= -62)
- pAd->StaCfg.RPIDensity[5] += 1;
- else if (dBm <= -57)
- pAd->StaCfg.RPIDensity[6] += 1;
- else if (dBm > -57)
- pAd->StaCfg.RPIDensity[7] += 1;
-
- return (NDIS_STATUS_FAILURE);
- }
- /* Add Rx size to channel load counter, we should ignore error counts */
- pAd->StaCfg.CLBusyBytes += (pRxD->SDL0 + 14);
-
- /* Drop ToDs promiscuous frame, it is opened due to CCX 2 channel load statistics */
- if (pHeader != NULL) {
- if (pHeader->FC.ToDs) {
- return (NDIS_STATUS_FAILURE);
- }
- }
- /* Drop not U2M frames, can't drop here because we will drop beacon in this case */
- /* I am kind of doubting the U2M bit operation */
- /* if (pRxD->U2M == 0) */
- /* return(NDIS_STATUS_FAILURE); */
-
- /* drop decyption fail frame */
- if (pRxD->CipherErr) {
- if (pRxD->CipherErr == 2) {
- DBGPRINT_RAW(RT_DEBUG_TRACE,
- ("pRxD ERROR: ICV ok but MICErr "));
- } else if (pRxD->CipherErr == 1) {
- DBGPRINT_RAW(RT_DEBUG_TRACE, ("pRxD ERROR: ICV Err "));
- } else if (pRxD->CipherErr == 3)
- DBGPRINT_RAW(RT_DEBUG_TRACE,
- ("pRxD ERROR: Key not valid "));
-
- if (((pRxD->CipherErr & 1) == 1)
- && pAd->CommonCfg.bWirelessEvent && INFRA_ON(pAd))
- RTMPSendWirelessEvent(pAd, IW_ICV_ERROR_EVENT_FLAG,
- pAd->MacTab.Content[BSSID_WCID].
- Addr, BSS0, 0);
-
- DBGPRINT_RAW(RT_DEBUG_TRACE,
- (" %d (len=%d, Mcast=%d, MyBss=%d, Wcid=%d, KeyId=%d)\n",
- pRxD->CipherErr, pRxD->SDL0,
- pRxD->Mcast | pRxD->Bcast, pRxD->MyBss,
- pRxWI->WirelessCliID,
-/* CipherName[pRxD->CipherAlg], */
- pRxWI->KeyIndex));
-
- /* */
- /* MIC Error */
- /* */
- if (pRxD->CipherErr == 2) {
- pWpaKey = &pAd->SharedKey[BSS0][pRxWI->KeyIndex];
- if (pAd->StaCfg.WpaSupplicantUP)
- WpaSendMicFailureToWpaSupplicant(pAd,
- (pWpaKey->
- Type ==
- PAIRWISEKEY) ?
- TRUE : FALSE);
- else
- RTMPReportMicError(pAd, pWpaKey);
-
- if (((pRxD->CipherErr & 2) == 2)
- && pAd->CommonCfg.bWirelessEvent && INFRA_ON(pAd))
- RTMPSendWirelessEvent(pAd,
- IW_MIC_ERROR_EVENT_FLAG,
- pAd->MacTab.
- Content[BSSID_WCID].Addr,
- BSS0, 0);
-
- DBGPRINT_RAW(RT_DEBUG_ERROR, ("Rx MIC Value error\n"));
- }
-
- if (pHeader == NULL)
- return (NDIS_STATUS_SUCCESS);
- /*if ((pRxD->CipherAlg == CIPHER_AES) &&
- (pHeader->Sequence == pAd->FragFrame.Sequence))
- {
- //
- // Acceptable since the First FragFrame no CipherErr problem.
- //
- return(NDIS_STATUS_SUCCESS);
- } */
-
- return (NDIS_STATUS_FAILURE);
- }
-
- return (NDIS_STATUS_SUCCESS);
-}
-
-BOOLEAN RTMPFreeTXDUponTxDmaDone(struct rt_rtmp_adapter *pAd, u8 QueIdx)
-{
- struct rt_rtmp_tx_ring *pTxRing;
- struct rt_txd * pTxD;
- void *pPacket;
- u8 FREE = 0;
- struct rt_txd TxD, *pOriTxD;
- /*unsigned long IrqFlags; */
- BOOLEAN bReschedule = FALSE;
-
- ASSERT(QueIdx < NUM_OF_TX_RING);
- pTxRing = &pAd->TxRing[QueIdx];
-
- RTMP_IO_READ32(pAd, TX_DTX_IDX0 + QueIdx * RINGREG_DIFF,
- &pTxRing->TxDmaIdx);
- while (pTxRing->TxSwFreeIdx != pTxRing->TxDmaIdx) {
-/* RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags); */
-
- /* static rate also need NICUpdateFifoStaCounters() function. */
- /*if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED)) */
- NICUpdateFifoStaCounters(pAd);
-
- /* Note : If (pAd->ate.bQATxStart == TRUE), we will never reach here. */
- FREE++;
- pTxD =
- (struct rt_txd *) (pTxRing->Cell[pTxRing->TxSwFreeIdx].AllocVa);
- pOriTxD = pTxD;
- NdisMoveMemory(&TxD, pTxD, sizeof(struct rt_txd));
- pTxD = &TxD;
-
- pTxD->DMADONE = 0;
-
- {
- pPacket =
- pTxRing->Cell[pTxRing->TxSwFreeIdx].pNdisPacket;
- if (pPacket) {
- PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1,
- pTxD->SDLen1,
- PCI_DMA_TODEVICE);
- RELEASE_NDIS_PACKET(pAd, pPacket,
- NDIS_STATUS_SUCCESS);
- }
- /*Always assign pNdisPacket as NULL after clear */
- pTxRing->Cell[pTxRing->TxSwFreeIdx].pNdisPacket = NULL;
-
- pPacket =
- pTxRing->Cell[pTxRing->TxSwFreeIdx].pNextNdisPacket;
-
- ASSERT(pPacket == NULL);
- if (pPacket) {
- PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1,
- pTxD->SDLen1,
- PCI_DMA_TODEVICE);
- RELEASE_NDIS_PACKET(pAd, pPacket,
- NDIS_STATUS_SUCCESS);
- }
- /*Always assign pNextNdisPacket as NULL after clear */
- pTxRing->Cell[pTxRing->TxSwFreeIdx].pNextNdisPacket =
- NULL;
- }
-
- pAd->RalinkCounters.TransmittedByteCount +=
- (pTxD->SDLen1 + pTxD->SDLen0);
- pAd->RalinkCounters.OneSecDmaDoneCount[QueIdx]++;
- INC_RING_INDEX(pTxRing->TxSwFreeIdx, TX_RING_SIZE);
- /* get tx_tdx_idx again */
- RTMP_IO_READ32(pAd, TX_DTX_IDX0 + QueIdx * RINGREG_DIFF,
- &pTxRing->TxDmaIdx);
- NdisMoveMemory(pOriTxD, pTxD, sizeof(struct rt_txd));
-
-/* RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags); */
- }
-
- return bReschedule;
-
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Process TX Rings DMA Done interrupt, running in DPC level
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = DISPATCH_LEVEL
-
- ========================================================================
-*/
-BOOLEAN RTMPHandleTxRingDmaDoneInterrupt(struct rt_rtmp_adapter *pAd,
- INT_SOURCE_CSR_STRUC TxRingBitmap)
-{
-/* u8 Count = 0; */
- unsigned long IrqFlags;
- BOOLEAN bReschedule = FALSE;
-
- /* Make sure Tx ring resource won't be used by other threads */
- /*NdisAcquireSpinLock(&pAd->TxRingLock); */
-
- RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);
-
- if (TxRingBitmap.field.Ac0DmaDone)
- bReschedule = RTMPFreeTXDUponTxDmaDone(pAd, QID_AC_BE);
-
- if (TxRingBitmap.field.Ac3DmaDone)
- bReschedule |= RTMPFreeTXDUponTxDmaDone(pAd, QID_AC_VO);
-
- if (TxRingBitmap.field.Ac2DmaDone)
- bReschedule |= RTMPFreeTXDUponTxDmaDone(pAd, QID_AC_VI);
-
- if (TxRingBitmap.field.Ac1DmaDone)
- bReschedule |= RTMPFreeTXDUponTxDmaDone(pAd, QID_AC_BK);
-
- /* Make sure to release Tx ring resource */
- /*NdisReleaseSpinLock(&pAd->TxRingLock); */
- RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);
-
- /* Dequeue outgoing frames from TxSwQueue[] and process it */
- RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);
-
- return bReschedule;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Process MGMT ring DMA done interrupt, running in DPC level
-
- Arguments:
- pAd Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPHandleMgmtRingDmaDoneInterrupt(struct rt_rtmp_adapter *pAd)
-{
- struct rt_txd * pTxD;
- void *pPacket;
-/* int i; */
- u8 FREE = 0;
- struct rt_rtmp_mgmt_ring *pMgmtRing = &pAd->MgmtRing;
-
- NdisAcquireSpinLock(&pAd->MgmtRingLock);
-
- RTMP_IO_READ32(pAd, TX_MGMTDTX_IDX, &pMgmtRing->TxDmaIdx);
- while (pMgmtRing->TxSwFreeIdx != pMgmtRing->TxDmaIdx) {
- FREE++;
- pTxD =
- (struct rt_txd *) (pMgmtRing->Cell[pAd->MgmtRing.TxSwFreeIdx].
- AllocVa);
- pTxD->DMADONE = 0;
- pPacket = pMgmtRing->Cell[pMgmtRing->TxSwFreeIdx].pNdisPacket;
-
- if (pPacket) {
- PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr0, pTxD->SDLen0,
- PCI_DMA_TODEVICE);
- RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS);
- }
- pMgmtRing->Cell[pMgmtRing->TxSwFreeIdx].pNdisPacket = NULL;
-
- pPacket =
- pMgmtRing->Cell[pMgmtRing->TxSwFreeIdx].pNextNdisPacket;
- if (pPacket) {
- PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, pTxD->SDLen1,
- PCI_DMA_TODEVICE);
- RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS);
- }
- pMgmtRing->Cell[pMgmtRing->TxSwFreeIdx].pNextNdisPacket = NULL;
- INC_RING_INDEX(pMgmtRing->TxSwFreeIdx, MGMT_RING_SIZE);
-
- }
- NdisReleaseSpinLock(&pAd->MgmtRingLock);
-
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Arguments:
- Adapter Pointer to our adapter. Dequeue all power safe delayed braodcast frames after beacon.
-
- IRQL = DISPATCH_LEVEL
-
- ========================================================================
-*/
-void RTMPHandleTBTTInterrupt(struct rt_rtmp_adapter *pAd)
-{
- {
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) {
- }
- }
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Arguments:
- pAd Pointer to our adapter. Rewrite beacon content before next send-out.
-
- IRQL = DISPATCH_LEVEL
-
- ========================================================================
-*/
-void RTMPHandlePreTBTTInterrupt(struct rt_rtmp_adapter *pAd)
-{
- {
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("RTMPHandlePreTBTTInterrupt...\n"));
- }
- }
-
-}
-
-void RTMPHandleRxCoherentInterrupt(struct rt_rtmp_adapter *pAd)
-{
- WPDMA_GLO_CFG_STRUC GloCfg;
-
- if (pAd == NULL) {
- DBGPRINT(RT_DEBUG_TRACE, ("====> pAd is NULL, return.\n"));
- return;
- }
-
- DBGPRINT(RT_DEBUG_TRACE, ("==> RTMPHandleRxCoherentInterrupt \n"));
-
- RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
-
- GloCfg.field.EnTXWriteBackDDONE = 0;
- GloCfg.field.EnableRxDMA = 0;
- GloCfg.field.EnableTxDMA = 0;
- RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);
-
- RTMPRingCleanUp(pAd, QID_AC_BE);
- RTMPRingCleanUp(pAd, QID_AC_BK);
- RTMPRingCleanUp(pAd, QID_AC_VI);
- RTMPRingCleanUp(pAd, QID_AC_VO);
- RTMPRingCleanUp(pAd, QID_MGMT);
- RTMPRingCleanUp(pAd, QID_RX);
-
- RTMPEnableRxTx(pAd);
-
- DBGPRINT(RT_DEBUG_TRACE, ("<== RTMPHandleRxCoherentInterrupt \n"));
-}
-
-void *GetPacketFromRxRing(struct rt_rtmp_adapter *pAd,
- OUT PRT28XX_RXD_STRUC pSaveRxD,
- OUT BOOLEAN * pbReschedule,
- IN u32 * pRxPending)
-{
- struct rt_rxd * pRxD;
- void *pRxPacket = NULL;
- void *pNewPacket;
- void *AllocVa;
- dma_addr_t AllocPa;
- BOOLEAN bReschedule = FALSE;
- struct rt_rtmp_dmacb *pRxCell;
-
- RTMP_SEM_LOCK(&pAd->RxRingLock);
-
- if (*pRxPending == 0) {
- /* Get how may packets had been received */
- RTMP_IO_READ32(pAd, RX_DRX_IDX, &pAd->RxRing.RxDmaIdx);
-
- if (pAd->RxRing.RxSwReadIdx == pAd->RxRing.RxDmaIdx) {
- /* no more rx packets */
- bReschedule = FALSE;
- goto done;
- }
- /* get rx pending count */
- if (pAd->RxRing.RxDmaIdx > pAd->RxRing.RxSwReadIdx)
- *pRxPending =
- pAd->RxRing.RxDmaIdx - pAd->RxRing.RxSwReadIdx;
- else
- *pRxPending =
- pAd->RxRing.RxDmaIdx + RX_RING_SIZE -
- pAd->RxRing.RxSwReadIdx;
-
- }
-
- pRxCell = &pAd->RxRing.Cell[pAd->RxRing.RxSwReadIdx];
-
- /* Point to Rx indexed rx ring descriptor */
- pRxD = (struct rt_rxd *) pRxCell->AllocVa;
-
- if (pRxD->DDONE == 0) {
- *pRxPending = 0;
- /* DMAIndx had done but DDONE bit not ready */
- bReschedule = TRUE;
- goto done;
- }
-
- /* return rx descriptor */
- NdisMoveMemory(pSaveRxD, pRxD, RXD_SIZE);
-
- pNewPacket =
- RTMP_AllocateRxPacketBuffer(pAd, RX_BUFFER_AGGRESIZE, FALSE,
- &AllocVa, &AllocPa);
-
- if (pNewPacket) {
- /* unmap the rx buffer */
- PCI_UNMAP_SINGLE(pAd, pRxCell->DmaBuf.AllocPa,
- pRxCell->DmaBuf.AllocSize, PCI_DMA_FROMDEVICE);
- pRxPacket = pRxCell->pNdisPacket;
-
- pRxCell->DmaBuf.AllocSize = RX_BUFFER_AGGRESIZE;
- pRxCell->pNdisPacket = (void *)pNewPacket;
- pRxCell->DmaBuf.AllocVa = AllocVa;
- pRxCell->DmaBuf.AllocPa = AllocPa;
- /* update SDP0 to new buffer of rx packet */
- pRxD->SDP0 = AllocPa;
- } else {
- /*DBGPRINT(RT_DEBUG_TRACE,("No Rx Buffer\n")); */
- pRxPacket = NULL;
- bReschedule = TRUE;
- }
-
- pRxD->DDONE = 0;
-
- /* had handled one rx packet */
- *pRxPending = *pRxPending - 1;
-
- /* update rx descriptor and kick rx */
- INC_RING_INDEX(pAd->RxRing.RxSwReadIdx, RX_RING_SIZE);
-
- pAd->RxRing.RxCpuIdx =
- (pAd->RxRing.RxSwReadIdx ==
- 0) ? (RX_RING_SIZE - 1) : (pAd->RxRing.RxSwReadIdx - 1);
- RTMP_IO_WRITE32(pAd, RX_CRX_IDX, pAd->RxRing.RxCpuIdx);
-
-done:
- RTMP_SEM_UNLOCK(&pAd->RxRingLock);
- *pbReschedule = bReschedule;
- return pRxPacket;
-}
-
-int MlmeHardTransmitTxRing(struct rt_rtmp_adapter *pAd,
- u8 QueIdx, void *pPacket)
-{
- struct rt_packet_info PacketInfo;
- u8 *pSrcBufVA;
- u32 SrcBufLen;
- struct rt_txd * pTxD;
- struct rt_header_802_11 * pHeader_802_11;
- BOOLEAN bAckRequired, bInsertTimestamp;
- unsigned long SrcBufPA;
- /*u8 TxBufIdx; */
- u8 MlmeRate;
- unsigned long SwIdx = pAd->TxRing[QueIdx].TxCpuIdx;
- struct rt_txwi * pFirstTxWI;
- /*unsigned long i; */
- /*HTTRANSMIT_SETTING MlmeTransmit; //Rate for this MGMT frame. */
- unsigned long FreeNum;
- struct rt_mac_table_entry *pMacEntry = NULL;
-
- RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen);
-
- if (pSrcBufVA == NULL) {
- /* The buffer shouldn't be NULL */
- return NDIS_STATUS_FAILURE;
- }
- /* Make sure MGMT ring resource won't be used by other threads */
- /*NdisAcquireSpinLock(&pAd->TxRingLock); */
-
- FreeNum = GET_TXRING_FREENO(pAd, QueIdx);
-
- if (FreeNum == 0) {
- /*NdisReleaseSpinLock(&pAd->TxRingLock); */
- return NDIS_STATUS_FAILURE;
- }
-
- SwIdx = pAd->TxRing[QueIdx].TxCpuIdx;
-
- pTxD = (struct rt_txd *) pAd->TxRing[QueIdx].Cell[SwIdx].AllocVa;
-
- if (pAd->TxRing[QueIdx].Cell[SwIdx].pNdisPacket) {
- DBGPRINT(RT_DEBUG_OFF, ("MlmeHardTransmit Error\n"));
- /*NdisReleaseSpinLock(&pAd->TxRingLock); */
- return NDIS_STATUS_FAILURE;
- }
-
- {
- /* outgoing frame always wakeup PHY to prevent frame lost */
- /* if (pAd->StaCfg.Psm == PWR_SAVE) */
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
- AsicForceWakeup(pAd, TRUE);
- }
- pFirstTxWI = (struct rt_txwi *) pSrcBufVA;
-
- pHeader_802_11 = (struct rt_header_802_11 *) (pSrcBufVA + TXWI_SIZE);
- if (pHeader_802_11->Addr1[0] & 0x01) {
- MlmeRate = pAd->CommonCfg.BasicMlmeRate;
- } else {
- MlmeRate = pAd->CommonCfg.MlmeRate;
- }
-
- if ((pHeader_802_11->FC.Type == BTYPE_DATA) &&
- (pHeader_802_11->FC.SubType == SUBTYPE_QOS_NULL)) {
- pMacEntry = MacTableLookup(pAd, pHeader_802_11->Addr1);
- }
- /* Verify Mlme rate for a / g bands. */
- if ((pAd->LatchRfRegs.Channel > 14) && (MlmeRate < RATE_6)) /* 11A band */
- MlmeRate = RATE_6;
-
- /* */
- /* Should not be hard code to set PwrMgmt to 0 (PWR_ACTIVE) */
- /* Snice it's been set to 0 while on MgtMacHeaderInit */
- /* By the way this will cause frame to be send on PWR_SAVE failed. */
- /* */
- /* */
- /* In WMM-UAPSD, mlme frame should be set psm as power saving but probe request frame */
- /* Data-Null packets also pass through MMRequest in RT2860, however, we hope control the psm bit to pass APSD */
- if (pHeader_802_11->FC.Type != BTYPE_DATA) {
- if ((pHeader_802_11->FC.SubType == SUBTYPE_PROBE_REQ)
- || !(pAd->CommonCfg.bAPSDCapable
- && pAd->CommonCfg.APEdcaParm.bAPSDCapable)) {
- pHeader_802_11->FC.PwrMgmt = PWR_ACTIVE;
- } else {
- pHeader_802_11->FC.PwrMgmt =
- pAd->CommonCfg.bAPSDForcePowerSave;
- }
- }
-
- bInsertTimestamp = FALSE;
- if (pHeader_802_11->FC.Type == BTYPE_CNTL) /* must be PS-POLL */
- {
- bAckRequired = FALSE;
- } else /* BTYPE_MGMT or BTYPE_DATA(must be NULL frame) */
- {
- if (pHeader_802_11->Addr1[0] & 0x01) /* MULTICAST, BROADCAST */
- {
- bAckRequired = FALSE;
- pHeader_802_11->Duration = 0;
- } else {
- bAckRequired = TRUE;
- pHeader_802_11->Duration =
- RTMPCalcDuration(pAd, MlmeRate, 14);
- if (pHeader_802_11->FC.SubType == SUBTYPE_PROBE_RSP) {
- bInsertTimestamp = TRUE;
- }
- }
- }
- pHeader_802_11->Sequence = pAd->Sequence++;
- if (pAd->Sequence > 0xfff)
- pAd->Sequence = 0;
- /* Before radar detection done, mgmt frame can not be sent but probe req */
- /* Because we need to use probe req to trigger driver to send probe req in passive scan */
- if ((pHeader_802_11->FC.SubType != SUBTYPE_PROBE_REQ)
- && (pAd->CommonCfg.bIEEE80211H == 1)
- && (pAd->CommonCfg.RadarDetect.RDMode != RD_NORMAL_MODE)) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("MlmeHardTransmit --> radar detect not in normal mode!\n"));
- /*NdisReleaseSpinLock(&pAd->TxRingLock); */
- return (NDIS_STATUS_FAILURE);
- }
- /* */
- /* fill scatter-and-gather buffer list into TXD. Internally created NDIS PACKET */
- /* should always has only one ohysical buffer, and the whole frame size equals */
- /* to the first scatter buffer size */
- /* */
-
- /* Initialize TX Descriptor */
- /* For inter-frame gap, the number is for this frame and next frame */
- /* For MLME rate, we will fix as 2Mb to match other vendor's implement */
-/* pAd->CommonCfg.MlmeTransmit.field.MODE = 1; */
-
-/* management frame doesn't need encryption. so use RESERVED_WCID no matter u are sending to specific wcid or not. */
- /* Only beacon use Nseq=TRUE. So here we use Nseq=FALSE. */
- if (pMacEntry == NULL) {
- RTMPWriteTxWI(pAd, pFirstTxWI, FALSE, FALSE, bInsertTimestamp,
- FALSE, bAckRequired, FALSE, 0, RESERVED_WCID,
- (SrcBufLen - TXWI_SIZE), PID_MGMT, 0,
- (u8)pAd->CommonCfg.MlmeTransmit.field.MCS,
- IFS_BACKOFF, FALSE, &pAd->CommonCfg.MlmeTransmit);
- } else {
- RTMPWriteTxWI(pAd, pFirstTxWI, FALSE, FALSE,
- bInsertTimestamp, FALSE, bAckRequired, FALSE,
- 0, pMacEntry->Aid, (SrcBufLen - TXWI_SIZE),
- pMacEntry->MaxHTPhyMode.field.MCS, 0,
- (u8)pMacEntry->MaxHTPhyMode.field.MCS,
- IFS_BACKOFF, FALSE, &pMacEntry->MaxHTPhyMode);
- }
-
- pAd->TxRing[QueIdx].Cell[SwIdx].pNdisPacket = pPacket;
- pAd->TxRing[QueIdx].Cell[SwIdx].pNextNdisPacket = NULL;
-/* pFirstTxWI->MPDUtotalByteCount = SrcBufLen - TXWI_SIZE; */
- SrcBufPA =
- PCI_MAP_SINGLE(pAd, pSrcBufVA, SrcBufLen, 0, PCI_DMA_TODEVICE);
-
- RTMPWriteTxDescriptor(pAd, pTxD, TRUE, FIFO_EDCA);
- pTxD->LastSec0 = 1;
- pTxD->LastSec1 = 1;
- pTxD->SDLen0 = SrcBufLen;
- pTxD->SDLen1 = 0;
- pTxD->SDPtr0 = SrcBufPA;
- pTxD->DMADONE = 0;
-
- pAd->RalinkCounters.KickTxCount++;
- pAd->RalinkCounters.OneSecTxDoneCount++;
-
- /* Increase TX_CTX_IDX, but write to register later. */
- INC_RING_INDEX(pAd->TxRing[QueIdx].TxCpuIdx, TX_RING_SIZE);
-
- RTMP_IO_WRITE32(pAd, TX_CTX_IDX0 + QueIdx * 0x10,
- pAd->TxRing[QueIdx].TxCpuIdx);
-
- /* Make sure to release MGMT ring resource */
-/* NdisReleaseSpinLock(&pAd->TxRingLock); */
-
- return NDIS_STATUS_SUCCESS;
-}
-
-int MlmeDataHardTransmit(struct rt_rtmp_adapter *pAd,
- u8 QueIdx, void *pPacket)
-{
- if ((pAd->CommonCfg.RadarDetect.RDMode != RD_NORMAL_MODE)
- ) {
- return NDIS_STATUS_FAILURE;
- }
-
- return MlmeHardTransmitTxRing(pAd, QueIdx, pPacket);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Calculates the duration which is required to transmit out frames
- with given size and specified rate.
-
- Arguments:
- pTxD Pointer to transmit descriptor
- Ack Setting for Ack requirement bit
- Fragment Setting for Fragment bit
- RetryMode Setting for retry mode
- Ifs Setting for IFS gap
- Rate Setting for transmit rate
- Service Setting for service
- Length Frame length
- TxPreamble Short or Long preamble when using CCK rates
- QueIdx - 0-3, according to 802.11e/d4.4 June/2003
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- ========================================================================
-*/
-void RTMPWriteTxDescriptor(struct rt_rtmp_adapter *pAd,
- struct rt_txd * pTxD,
- IN BOOLEAN bWIV, u8 QueueSEL)
-{
- /* */
- /* Always use Long preamble before verifiation short preamble functionality works well. */
- /* Todo: remove the following line if short preamble functionality works */
- /* */
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED);
-
- pTxD->WIV = (bWIV) ? 1 : 0;
- pTxD->QSEL = (QueueSEL);
- /*RT2860c?? fixed using EDCA queue for test... We doubt Queue1 has problem. 2006-09-26 Jan */
- /*pTxD->QSEL= FIFO_EDCA; */
- pTxD->DMADONE = 0;
-}
diff --git a/drivers/staging/rt2860/common/cmm_data_usb.c b/drivers/staging/rt2860/common/cmm_data_usb.c
deleted file mode 100644
index 83a62faa7e57..000000000000
--- a/drivers/staging/rt2860/common/cmm_data_usb.c
+++ /dev/null
@@ -1,951 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-*/
-
-/*
- All functions in this file must be USB-depended, or you should out your function
- in other files.
-
-*/
-
-#ifdef RTMP_MAC_USB
-
-#include "../rt_config.h"
-
-/*
- We can do copy the frame into pTxContext when match following conditions.
- =>
- =>
- =>
-*/
-static inline int RtmpUSBCanDoWrite(struct rt_rtmp_adapter *pAd,
- u8 QueIdx,
- struct rt_ht_tx_context *pHTTXContext)
-{
- int canWrite = NDIS_STATUS_RESOURCES;
-
- if (((pHTTXContext->CurWritePosition) <
- pHTTXContext->NextBulkOutPosition)
- && (pHTTXContext->CurWritePosition + LOCAL_TXBUF_SIZE) >
- pHTTXContext->NextBulkOutPosition) {
- DBGPRINT(RT_DEBUG_ERROR, ("RtmpUSBCanDoWrite c1!\n"));
- RTUSB_SET_BULK_FLAG(pAd,
- (fRTUSB_BULK_OUT_DATA_NORMAL << QueIdx));
- } else if ((pHTTXContext->CurWritePosition == 8)
- && (pHTTXContext->NextBulkOutPosition < LOCAL_TXBUF_SIZE)) {
- DBGPRINT(RT_DEBUG_ERROR, ("RtmpUSBCanDoWrite c2!\n"));
- RTUSB_SET_BULK_FLAG(pAd,
- (fRTUSB_BULK_OUT_DATA_NORMAL << QueIdx));
- } else if (pHTTXContext->bCurWriting == TRUE) {
- DBGPRINT(RT_DEBUG_ERROR, ("RtmpUSBCanDoWrite c3!\n"));
- } else {
- canWrite = NDIS_STATUS_SUCCESS;
- }
-
- return canWrite;
-}
-
-u16 RtmpUSB_WriteSubTxResource(struct rt_rtmp_adapter *pAd,
- struct rt_tx_blk *pTxBlk,
- IN BOOLEAN bIsLast, u16 * FreeNumber)
-{
-
- /* Dummy function. Should be removed in the future. */
- return 0;
-
-}
-
-u16 RtmpUSB_WriteFragTxResource(struct rt_rtmp_adapter *pAd,
- struct rt_tx_blk *pTxBlk,
- u8 fragNum, u16 * FreeNumber)
-{
- struct rt_ht_tx_context *pHTTXContext;
- u16 hwHdrLen; /* The hwHdrLen consist of 802.11 header length plus the header padding length. */
- u32 fillOffset;
- struct rt_txinfo *pTxInfo;
- struct rt_txwi *pTxWI;
- u8 *pWirelessPacket = NULL;
- u8 QueIdx;
- int Status;
- unsigned long IrqFlags;
- u32 USBDMApktLen = 0, DMAHdrLen, padding;
- BOOLEAN TxQLastRound = FALSE;
-
- /* */
- /* get Tx Ring Resource & Dma Buffer address */
- /* */
- QueIdx = pTxBlk->QueIdx;
- pHTTXContext = &pAd->TxContext[QueIdx];
-
- RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);
-
- pHTTXContext = &pAd->TxContext[QueIdx];
- fillOffset = pHTTXContext->CurWritePosition;
-
- if (fragNum == 0) {
- /* Check if we have enough space for this bulk-out batch. */
- Status = RtmpUSBCanDoWrite(pAd, QueIdx, pHTTXContext);
- if (Status == NDIS_STATUS_SUCCESS) {
- pHTTXContext->bCurWriting = TRUE;
-
- /* Reserve space for 8 bytes padding. */
- if ((pHTTXContext->ENextBulkOutPosition ==
- pHTTXContext->CurWritePosition)) {
- pHTTXContext->ENextBulkOutPosition += 8;
- pHTTXContext->CurWritePosition += 8;
- fillOffset += 8;
- }
- pTxBlk->Priv = 0;
- pHTTXContext->CurWriteRealPos =
- pHTTXContext->CurWritePosition;
- } else {
- RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx],
- IrqFlags);
-
- RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket,
- NDIS_STATUS_FAILURE);
- return (Status);
- }
- } else {
- /* For sub-sequent frames of this bulk-out batch. Just copy it to our bulk-out buffer. */
- Status =
- ((pHTTXContext->bCurWriting ==
- TRUE) ? NDIS_STATUS_SUCCESS : NDIS_STATUS_FAILURE);
- if (Status == NDIS_STATUS_SUCCESS) {
- fillOffset += pTxBlk->Priv;
- } else {
- RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx],
- IrqFlags);
-
- RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket,
- NDIS_STATUS_FAILURE);
- return (Status);
- }
- }
-
- NdisZeroMemory((u8 *)(&pTxBlk->HeaderBuf[0]), TXINFO_SIZE);
- pTxInfo = (struct rt_txinfo *)(&pTxBlk->HeaderBuf[0]);
- pTxWI = (struct rt_txwi *) (&pTxBlk->HeaderBuf[TXINFO_SIZE]);
-
- pWirelessPacket =
- &pHTTXContext->TransferBuffer->field.WirelessPacket[fillOffset];
-
- /* copy TXWI + WLAN Header + LLC into DMA Header Buffer */
- /*hwHdrLen = ROUND_UP(pTxBlk->MpduHeaderLen, 4); */
- hwHdrLen = pTxBlk->MpduHeaderLen + pTxBlk->HdrPadLen;
-
- /* Build our URB for USBD */
- DMAHdrLen = TXWI_SIZE + hwHdrLen;
- USBDMApktLen = DMAHdrLen + pTxBlk->SrcBufLen;
- padding = (4 - (USBDMApktLen % 4)) & 0x03; /* round up to 4 byte alignment */
- USBDMApktLen += padding;
-
- pTxBlk->Priv += (TXINFO_SIZE + USBDMApktLen);
-
- /* For TxInfo, the length of USBDMApktLen = TXWI_SIZE + 802.11 header + payload */
- RTMPWriteTxInfo(pAd, pTxInfo, (u16)(USBDMApktLen), FALSE, FIFO_EDCA,
- FALSE /*NextValid */ , FALSE);
-
- if (fragNum == pTxBlk->TotalFragNum) {
- pTxInfo->USBDMATxburst = 0;
- if ((pHTTXContext->CurWritePosition + pTxBlk->Priv + 3906) >
- MAX_TXBULK_LIMIT) {
- pTxInfo->SwUseLastRound = 1;
- TxQLastRound = TRUE;
- }
- } else {
- pTxInfo->USBDMATxburst = 1;
- }
-
- NdisMoveMemory(pWirelessPacket, pTxBlk->HeaderBuf,
- TXINFO_SIZE + TXWI_SIZE + hwHdrLen);
- pWirelessPacket += (TXINFO_SIZE + TXWI_SIZE + hwHdrLen);
- pHTTXContext->CurWriteRealPos += (TXINFO_SIZE + TXWI_SIZE + hwHdrLen);
-
- RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);
-
- NdisMoveMemory(pWirelessPacket, pTxBlk->pSrcBufData, pTxBlk->SrcBufLen);
-
- /* Zero the last padding. */
- pWirelessPacket += pTxBlk->SrcBufLen;
- NdisZeroMemory(pWirelessPacket, padding + 8);
-
- if (fragNum == pTxBlk->TotalFragNum) {
- RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);
-
- /* Update the pHTTXContext->CurWritePosition. 3906 used to prevent the NextBulkOut is a A-RALINK/A-MSDU Frame. */
- pHTTXContext->CurWritePosition += pTxBlk->Priv;
- if (TxQLastRound == TRUE)
- pHTTXContext->CurWritePosition = 8;
- pHTTXContext->CurWriteRealPos = pHTTXContext->CurWritePosition;
-
- /* Finally, set bCurWriting as FALSE */
- pHTTXContext->bCurWriting = FALSE;
-
- RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);
-
- /* succeed and release the skb buffer */
- RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_SUCCESS);
- }
-
- return (Status);
-
-}
-
-u16 RtmpUSB_WriteSingleTxResource(struct rt_rtmp_adapter *pAd,
- struct rt_tx_blk *pTxBlk,
- IN BOOLEAN bIsLast,
- u16 * FreeNumber)
-{
- struct rt_ht_tx_context *pHTTXContext;
- u16 hwHdrLen;
- u32 fillOffset;
- struct rt_txinfo *pTxInfo;
- struct rt_txwi *pTxWI;
- u8 *pWirelessPacket;
- u8 QueIdx;
- unsigned long IrqFlags;
- int Status;
- u32 USBDMApktLen = 0, DMAHdrLen, padding;
- BOOLEAN bTxQLastRound = FALSE;
-
- /* For USB, didn't need PCI_MAP_SINGLE() */
- /*SrcBufPA = PCI_MAP_SINGLE(pAd, (char *) pTxBlk->pSrcBufData, pTxBlk->SrcBufLen, PCI_DMA_TODEVICE); */
-
- /* */
- /* get Tx Ring Resource & Dma Buffer address */
- /* */
- QueIdx = pTxBlk->QueIdx;
-
- RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);
- pHTTXContext = &pAd->TxContext[QueIdx];
- fillOffset = pHTTXContext->CurWritePosition;
-
- /* Check ring full. */
- Status = RtmpUSBCanDoWrite(pAd, QueIdx, pHTTXContext);
- if (Status == NDIS_STATUS_SUCCESS) {
- pHTTXContext->bCurWriting = TRUE;
-
- pTxInfo = (struct rt_txinfo *)(&pTxBlk->HeaderBuf[0]);
- pTxWI = (struct rt_txwi *) (&pTxBlk->HeaderBuf[TXINFO_SIZE]);
-
- /* Reserve space for 8 bytes padding. */
- if ((pHTTXContext->ENextBulkOutPosition ==
- pHTTXContext->CurWritePosition)) {
- pHTTXContext->ENextBulkOutPosition += 8;
- pHTTXContext->CurWritePosition += 8;
- fillOffset += 8;
- }
- pHTTXContext->CurWriteRealPos = pHTTXContext->CurWritePosition;
-
- pWirelessPacket =
- &pHTTXContext->TransferBuffer->field.
- WirelessPacket[fillOffset];
-
- /* copy TXWI + WLAN Header + LLC into DMA Header Buffer */
- /*hwHdrLen = ROUND_UP(pTxBlk->MpduHeaderLen, 4); */
- hwHdrLen = pTxBlk->MpduHeaderLen + pTxBlk->HdrPadLen;
-
- /* Build our URB for USBD */
- DMAHdrLen = TXWI_SIZE + hwHdrLen;
- USBDMApktLen = DMAHdrLen + pTxBlk->SrcBufLen;
- padding = (4 - (USBDMApktLen % 4)) & 0x03; /* round up to 4 byte alignment */
- USBDMApktLen += padding;
-
- pTxBlk->Priv = (TXINFO_SIZE + USBDMApktLen);
-
- /* For TxInfo, the length of USBDMApktLen = TXWI_SIZE + 802.11 header + payload */
- RTMPWriteTxInfo(pAd, pTxInfo, (u16)(USBDMApktLen), FALSE,
- FIFO_EDCA, FALSE /*NextValid */ , FALSE);
-
- if ((pHTTXContext->CurWritePosition + 3906 + pTxBlk->Priv) >
- MAX_TXBULK_LIMIT) {
- pTxInfo->SwUseLastRound = 1;
- bTxQLastRound = TRUE;
- }
- NdisMoveMemory(pWirelessPacket, pTxBlk->HeaderBuf,
- TXINFO_SIZE + TXWI_SIZE + hwHdrLen);
- pWirelessPacket += (TXINFO_SIZE + TXWI_SIZE + hwHdrLen);
-
- /* We unlock it here to prevent the first 8 bytes maybe over-writed issue. */
- /* 1. First we got CurWritePosition but the first 8 bytes still not write to the pTxcontext. */
- /* 2. An interrupt break our routine and handle bulk-out complete. */
- /* 3. In the bulk-out compllete, it need to do another bulk-out, */
- /* if the ENextBulkOutPosition is just the same as CurWritePosition, it will save the first 8 bytes from CurWritePosition, */
- /* but the payload still not copyed. the pTxContext->SavedPad[] will save as allzero. and set the bCopyPad = TRUE. */
- /* 4. Interrupt complete. */
- /* 5. Our interrupted routine go back and fill the first 8 bytes to pTxContext. */
- /* 6. Next time when do bulk-out, it found the bCopyPad==TRUE and will copy the SavedPad[] to pTxContext->NextBulkOutPosition. */
- /* and the packet will wrong. */
- pHTTXContext->CurWriteRealPos +=
- (TXINFO_SIZE + TXWI_SIZE + hwHdrLen);
- RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);
-
- NdisMoveMemory(pWirelessPacket, pTxBlk->pSrcBufData,
- pTxBlk->SrcBufLen);
- pWirelessPacket += pTxBlk->SrcBufLen;
- NdisZeroMemory(pWirelessPacket, padding + 8);
-
- RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);
-
- pHTTXContext->CurWritePosition += pTxBlk->Priv;
- if (bTxQLastRound)
- pHTTXContext->CurWritePosition = 8;
- pHTTXContext->CurWriteRealPos = pHTTXContext->CurWritePosition;
-
- pHTTXContext->bCurWriting = FALSE;
- }
-
- RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);
-
- /* succeed and release the skb buffer */
- RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_SUCCESS);
-
- return (Status);
-
-}
-
-u16 RtmpUSB_WriteMultiTxResource(struct rt_rtmp_adapter *pAd,
- struct rt_tx_blk *pTxBlk,
- u8 frameNum, u16 * FreeNumber)
-{
- struct rt_ht_tx_context *pHTTXContext;
- u16 hwHdrLen; /* The hwHdrLen consist of 802.11 header length plus the header padding length. */
- u32 fillOffset;
- struct rt_txinfo *pTxInfo;
- struct rt_txwi *pTxWI;
- u8 *pWirelessPacket = NULL;
- u8 QueIdx;
- int Status;
- unsigned long IrqFlags;
- /*u32 USBDMApktLen = 0, DMAHdrLen, padding; */
-
- /* */
- /* get Tx Ring Resource & Dma Buffer address */
- /* */
- QueIdx = pTxBlk->QueIdx;
- pHTTXContext = &pAd->TxContext[QueIdx];
-
- RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);
-
- if (frameNum == 0) {
- /* Check if we have enough space for this bulk-out batch. */
- Status = RtmpUSBCanDoWrite(pAd, QueIdx, pHTTXContext);
- if (Status == NDIS_STATUS_SUCCESS) {
- pHTTXContext->bCurWriting = TRUE;
-
- pTxInfo = (struct rt_txinfo *)(&pTxBlk->HeaderBuf[0]);
- pTxWI = (struct rt_txwi *) (&pTxBlk->HeaderBuf[TXINFO_SIZE]);
-
- /* Reserve space for 8 bytes padding. */
- if ((pHTTXContext->ENextBulkOutPosition ==
- pHTTXContext->CurWritePosition)) {
-
- pHTTXContext->CurWritePosition += 8;
- pHTTXContext->ENextBulkOutPosition += 8;
- }
- fillOffset = pHTTXContext->CurWritePosition;
- pHTTXContext->CurWriteRealPos =
- pHTTXContext->CurWritePosition;
-
- pWirelessPacket =
- &pHTTXContext->TransferBuffer->field.
- WirelessPacket[fillOffset];
-
- /* */
- /* Copy TXINFO + TXWI + WLAN Header + LLC into DMA Header Buffer */
- /* */
- if (pTxBlk->TxFrameType == TX_AMSDU_FRAME)
- /*hwHdrLen = ROUND_UP(pTxBlk->MpduHeaderLen-LENGTH_AMSDU_SUBFRAMEHEAD, 4)+LENGTH_AMSDU_SUBFRAMEHEAD; */
- hwHdrLen =
- pTxBlk->MpduHeaderLen -
- LENGTH_AMSDU_SUBFRAMEHEAD +
- pTxBlk->HdrPadLen +
- LENGTH_AMSDU_SUBFRAMEHEAD;
- else if (pTxBlk->TxFrameType == TX_RALINK_FRAME)
- /*hwHdrLen = ROUND_UP(pTxBlk->MpduHeaderLen-LENGTH_ARALINK_HEADER_FIELD, 4)+LENGTH_ARALINK_HEADER_FIELD; */
- hwHdrLen =
- pTxBlk->MpduHeaderLen -
- LENGTH_ARALINK_HEADER_FIELD +
- pTxBlk->HdrPadLen +
- LENGTH_ARALINK_HEADER_FIELD;
- else
- /*hwHdrLen = ROUND_UP(pTxBlk->MpduHeaderLen, 4); */
- hwHdrLen =
- pTxBlk->MpduHeaderLen + pTxBlk->HdrPadLen;
-
- /* Update the pTxBlk->Priv. */
- pTxBlk->Priv = TXINFO_SIZE + TXWI_SIZE + hwHdrLen;
-
- /* pTxInfo->USBDMApktLen now just a temp value and will to correct latter. */
- RTMPWriteTxInfo(pAd, pTxInfo, (u16)(pTxBlk->Priv),
- FALSE, FIFO_EDCA, FALSE /*NextValid */ ,
- FALSE);
-
- /* Copy it. */
- NdisMoveMemory(pWirelessPacket, pTxBlk->HeaderBuf,
- pTxBlk->Priv);
- pHTTXContext->CurWriteRealPos += pTxBlk->Priv;
- pWirelessPacket += pTxBlk->Priv;
- }
- } else { /* For sub-sequent frames of this bulk-out batch. Just copy it to our bulk-out buffer. */
-
- Status =
- ((pHTTXContext->bCurWriting ==
- TRUE) ? NDIS_STATUS_SUCCESS : NDIS_STATUS_FAILURE);
- if (Status == NDIS_STATUS_SUCCESS) {
- fillOffset =
- (pHTTXContext->CurWritePosition + pTxBlk->Priv);
- pWirelessPacket =
- &pHTTXContext->TransferBuffer->field.
- WirelessPacket[fillOffset];
-
- /*hwHdrLen = pTxBlk->MpduHeaderLen; */
- NdisMoveMemory(pWirelessPacket, pTxBlk->HeaderBuf,
- pTxBlk->MpduHeaderLen);
- pWirelessPacket += (pTxBlk->MpduHeaderLen);
- pTxBlk->Priv += pTxBlk->MpduHeaderLen;
- } else { /* It should not happened now unless we are going to shutdown. */
- DBGPRINT(RT_DEBUG_ERROR,
- ("WriteMultiTxResource():bCurWriting is FALSE when handle sub-sequent frames.\n"));
- Status = NDIS_STATUS_FAILURE;
- }
- }
-
- /* We unlock it here to prevent the first 8 bytes maybe over-write issue. */
- /* 1. First we got CurWritePosition but the first 8 bytes still not write to the pTxContext. */
- /* 2. An interrupt break our routine and handle bulk-out complete. */
- /* 3. In the bulk-out compllete, it need to do another bulk-out, */
- /* if the ENextBulkOutPosition is just the same as CurWritePosition, it will save the first 8 bytes from CurWritePosition, */
- /* but the payload still not copyed. the pTxContext->SavedPad[] will save as allzero. and set the bCopyPad = TRUE. */
- /* 4. Interrupt complete. */
- /* 5. Our interrupted routine go back and fill the first 8 bytes to pTxContext. */
- /* 6. Next time when do bulk-out, it found the bCopyPad==TRUE and will copy the SavedPad[] to pTxContext->NextBulkOutPosition. */
- /* and the packet will wrong. */
- RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);
-
- if (Status != NDIS_STATUS_SUCCESS) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("WriteMultiTxResource: CWPos = %ld, NBOutPos = %ld.\n",
- pHTTXContext->CurWritePosition,
- pHTTXContext->NextBulkOutPosition));
- goto done;
- }
- /* Copy the frame content into DMA buffer and update the pTxBlk->Priv */
- NdisMoveMemory(pWirelessPacket, pTxBlk->pSrcBufData, pTxBlk->SrcBufLen);
- pWirelessPacket += pTxBlk->SrcBufLen;
- pTxBlk->Priv += pTxBlk->SrcBufLen;
-
-done:
- /* Release the skb buffer here */
- RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_SUCCESS);
-
- return (Status);
-
-}
-
-void RtmpUSB_FinalWriteTxResource(struct rt_rtmp_adapter *pAd,
- struct rt_tx_blk *pTxBlk,
- u16 totalMPDUSize, u16 TxIdx)
-{
- u8 QueIdx;
- struct rt_ht_tx_context *pHTTXContext;
- u32 fillOffset;
- struct rt_txinfo *pTxInfo;
- struct rt_txwi *pTxWI;
- u32 USBDMApktLen, padding;
- unsigned long IrqFlags;
- u8 *pWirelessPacket;
-
- QueIdx = pTxBlk->QueIdx;
- pHTTXContext = &pAd->TxContext[QueIdx];
-
- RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);
-
- if (pHTTXContext->bCurWriting == TRUE) {
- fillOffset = pHTTXContext->CurWritePosition;
- if (((pHTTXContext->ENextBulkOutPosition ==
- pHTTXContext->CurWritePosition)
- || ((pHTTXContext->ENextBulkOutPosition - 8) ==
- pHTTXContext->CurWritePosition))
- && (pHTTXContext->bCopySavePad == TRUE))
- pWirelessPacket = (u8 *)(&pHTTXContext->SavedPad[0]);
- else
- pWirelessPacket =
- (u8 *)(&pHTTXContext->TransferBuffer->field.
- WirelessPacket[fillOffset]);
-
- /* */
- /* Update TxInfo->USBDMApktLen , */
- /* the length = TXWI_SIZE + 802.11_hdr + 802.11_hdr_pad + payload_of_all_batch_frames + Bulk-Out-padding */
- /* */
- pTxInfo = (struct rt_txinfo *)(pWirelessPacket);
-
- /* Calculate the bulk-out padding */
- USBDMApktLen = pTxBlk->Priv - TXINFO_SIZE;
- padding = (4 - (USBDMApktLen % 4)) & 0x03; /* round up to 4 byte alignment */
- USBDMApktLen += padding;
-
- pTxInfo->USBDMATxPktLen = USBDMApktLen;
-
- /* */
- /* Update TXWI->MPDUtotalByteCount , */
- /* the length = 802.11 header + payload_of_all_batch_frames */
- pTxWI = (struct rt_txwi *) (pWirelessPacket + TXINFO_SIZE);
- pTxWI->MPDUtotalByteCount = totalMPDUSize;
-
- /* */
- /* Update the pHTTXContext->CurWritePosition */
- /* */
- pHTTXContext->CurWritePosition += (TXINFO_SIZE + USBDMApktLen);
- if ((pHTTXContext->CurWritePosition + 3906) > MAX_TXBULK_LIMIT) { /* Add 3906 for prevent the NextBulkOut packet size is a A-RALINK/A-MSDU Frame. */
- pHTTXContext->CurWritePosition = 8;
- pTxInfo->SwUseLastRound = 1;
- }
- pHTTXContext->CurWriteRealPos = pHTTXContext->CurWritePosition;
-
- /* */
- /* Zero the last padding. */
- /* */
- pWirelessPacket =
- (&pHTTXContext->TransferBuffer->field.
- WirelessPacket[fillOffset + pTxBlk->Priv]);
- NdisZeroMemory(pWirelessPacket, padding + 8);
-
- /* Finally, set bCurWriting as FALSE */
- pHTTXContext->bCurWriting = FALSE;
-
- } else { /* It should not happened now unless we are going to shutdown. */
- DBGPRINT(RT_DEBUG_ERROR,
- ("FinalWriteTxResource():bCurWriting is FALSE when handle last frames.\n"));
- }
-
- RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);
-
-}
-
-void RtmpUSBDataLastTxIdx(struct rt_rtmp_adapter *pAd,
- u8 QueIdx, u16 TxIdx)
-{
- /* DO nothing for USB. */
-}
-
-/*
- When can do bulk-out:
- 1. TxSwFreeIdx < TX_RING_SIZE;
- It means has at least one Ring entity is ready for bulk-out, kick it out.
- 2. If TxSwFreeIdx == TX_RING_SIZE
- Check if the CurWriting flag is FALSE, if it's FALSE, we can do kick out.
-
-*/
-void RtmpUSBDataKickOut(struct rt_rtmp_adapter *pAd,
- struct rt_tx_blk *pTxBlk, u8 QueIdx)
-{
- RTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << QueIdx));
- RTUSBKickBulkOut(pAd);
-
-}
-
-/*
- Must be run in Interrupt context
- This function handle RT2870 specific TxDesc and cpu index update and kick the packet out.
- */
-int RtmpUSBMgmtKickOut(struct rt_rtmp_adapter *pAd,
- u8 QueIdx,
- void *pPacket,
- u8 *pSrcBufVA, u32 SrcBufLen)
-{
- struct rt_txinfo *pTxInfo;
- unsigned long BulkOutSize;
- u8 padLen;
- u8 *pDest;
- unsigned long SwIdx = pAd->MgmtRing.TxCpuIdx;
- struct rt_tx_context *pMLMEContext =
- (struct rt_tx_context *)pAd->MgmtRing.Cell[SwIdx].AllocVa;
- unsigned long IrqFlags;
-
- pTxInfo = (struct rt_txinfo *)(pSrcBufVA);
-
- /* Build our URB for USBD */
- BulkOutSize = SrcBufLen;
- BulkOutSize = (BulkOutSize + 3) & (~3);
- RTMPWriteTxInfo(pAd, pTxInfo, (u16)(BulkOutSize - TXINFO_SIZE),
- TRUE, EpToQueue[MGMTPIPEIDX], FALSE, FALSE);
-
- BulkOutSize += 4; /* Always add 4 extra bytes at every packet. */
-
- /* If BulkOutSize is multiple of BulkOutMaxPacketSize, add extra 4 bytes again. */
- if ((BulkOutSize % pAd->BulkOutMaxPacketSize) == 0)
- BulkOutSize += 4;
-
- padLen = BulkOutSize - SrcBufLen;
- ASSERT((padLen <= RTMP_PKT_TAIL_PADDING));
-
- /* Now memzero all extra padding bytes. */
- pDest = (u8 *)(pSrcBufVA + SrcBufLen);
- skb_put(GET_OS_PKT_TYPE(pPacket), padLen);
- NdisZeroMemory(pDest, padLen);
-
- RTMP_IRQ_LOCK(&pAd->MLMEBulkOutLock, IrqFlags);
-
- pAd->MgmtRing.Cell[pAd->MgmtRing.TxCpuIdx].pNdisPacket = pPacket;
- pMLMEContext->TransferBuffer =
- (struct rt_tx_buffer *)(GET_OS_PKT_DATAPTR(pPacket));
-
- /* Length in TxInfo should be 8 less than bulkout size. */
- pMLMEContext->BulkOutSize = BulkOutSize;
- pMLMEContext->InUse = TRUE;
- pMLMEContext->bWaitingBulkOut = TRUE;
-
- /*for debug */
- /*hex_dump("RtmpUSBMgmtKickOut", &pMLMEContext->TransferBuffer->field.WirelessPacket[0], (pMLMEContext->BulkOutSize > 16 ? 16 : pMLMEContext->BulkOutSize)); */
-
- /*pAd->RalinkCounters.KickTxCount++; */
- /*pAd->RalinkCounters.OneSecTxDoneCount++; */
-
- /*if (pAd->MgmtRing.TxSwFreeIdx == MGMT_RING_SIZE) */
- /* needKickOut = TRUE; */
-
- /* Decrease the TxSwFreeIdx and Increase the TX_CTX_IDX */
- pAd->MgmtRing.TxSwFreeIdx--;
- INC_RING_INDEX(pAd->MgmtRing.TxCpuIdx, MGMT_RING_SIZE);
-
- RTMP_IRQ_UNLOCK(&pAd->MLMEBulkOutLock, IrqFlags);
-
- RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);
- /*if (needKickOut) */
- RTUSBKickBulkOut(pAd);
-
- return 0;
-}
-
-void RtmpUSBNullFrameKickOut(struct rt_rtmp_adapter *pAd,
- u8 QueIdx,
- u8 * pNullFrame, u32 frameLen)
-{
- if (pAd->NullContext.InUse == FALSE) {
- struct rt_tx_context *pNullContext;
- struct rt_txinfo *pTxInfo;
- struct rt_txwi * pTxWI;
- u8 *pWirelessPkt;
-
- pNullContext = &(pAd->NullContext);
-
- /* Set the in use bit */
- pNullContext->InUse = TRUE;
- pWirelessPkt =
- (u8 *)& pNullContext->TransferBuffer->field.
- WirelessPacket[0];
-
- RTMPZeroMemory(&pWirelessPkt[0], 100);
- pTxInfo = (struct rt_txinfo *)& pWirelessPkt[0];
- RTMPWriteTxInfo(pAd, pTxInfo,
- (u16)(sizeof(struct rt_header_802_11) + TXWI_SIZE),
- TRUE, EpToQueue[MGMTPIPEIDX], FALSE, FALSE);
- pTxInfo->QSEL = FIFO_EDCA;
- pTxWI = (struct rt_txwi *) & pWirelessPkt[TXINFO_SIZE];
- RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, FALSE, FALSE, TRUE,
- FALSE, 0, BSSID_WCID, (sizeof(struct rt_header_802_11)), 0,
- 0, (u8)pAd->CommonCfg.MlmeTransmit.field.MCS,
- IFS_HTTXOP, FALSE, &pAd->CommonCfg.MlmeTransmit);
-
- RTMPMoveMemory(&pWirelessPkt[TXWI_SIZE + TXINFO_SIZE],
- &pAd->NullFrame, sizeof(struct rt_header_802_11));
- pAd->NullContext.BulkOutSize =
- TXINFO_SIZE + TXWI_SIZE + sizeof(pAd->NullFrame) + 4;
-
- /* Fill out frame length information for global Bulk out arbitor */
- /*pNullContext->BulkOutSize = TransferBufferLength; */
- DBGPRINT(RT_DEBUG_TRACE,
- ("SYNC - send NULL Frame @%d Mbps...\n",
- RateIdToMbps[pAd->CommonCfg.TxRate]));
- RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NULL);
-
- /* Kick bulk out */
- RTUSBKickBulkOut(pAd);
- }
-
-}
-
-/*
-========================================================================
-Routine Description:
- Get a received packet.
-
-Arguments:
- pAd device control block
- pSaveRxD receive descriptor information
- *pbReschedule need reschedule flag
- *pRxPending pending received packet flag
-
-Return Value:
- the received packet
-
-Note:
-========================================================================
-*/
-void *GetPacketFromRxRing(struct rt_rtmp_adapter *pAd,
- OUT PRT28XX_RXD_STRUC pSaveRxD,
- OUT BOOLEAN * pbReschedule,
- IN u32 * pRxPending)
-{
- struct rt_rx_context *pRxContext;
- void *pSkb;
- u8 *pData;
- unsigned long ThisFrameLen;
- unsigned long RxBufferLength;
- struct rt_rxwi * pRxWI;
-
- pRxContext = &pAd->RxContext[pAd->NextRxBulkInReadIndex];
- if ((pRxContext->Readable == FALSE) || (pRxContext->InUse == TRUE))
- return NULL;
-
- RxBufferLength = pRxContext->BulkInOffset - pAd->ReadPosition;
- if (RxBufferLength <
- (RT2870_RXDMALEN_FIELD_SIZE + sizeof(struct rt_rxwi) +
- sizeof(struct rt_rxinfo))) {
- goto label_null;
- }
-
- pData = &pRxContext->TransferBuffer[pAd->ReadPosition]; /* 4KB */
- /* The RXDMA field is 4 bytes, now just use the first 2 bytes. The Length including the (RXWI + MSDU + Padding) */
- ThisFrameLen = *pData + (*(pData + 1) << 8);
- if (ThisFrameLen == 0) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("BIRIdx(%d): RXDMALen is zero.[%ld], BulkInBufLen = %ld)\n",
- pAd->NextRxBulkInReadIndex, ThisFrameLen,
- pRxContext->BulkInOffset));
- goto label_null;
- }
- if ((ThisFrameLen & 0x3) != 0) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("BIRIdx(%d): RXDMALen not multiple of 4.[%ld], BulkInBufLen = %ld)\n",
- pAd->NextRxBulkInReadIndex, ThisFrameLen,
- pRxContext->BulkInOffset));
- goto label_null;
- }
-
- if ((ThisFrameLen + 8) > RxBufferLength) /* 8 for (RT2870_RXDMALEN_FIELD_SIZE + sizeof(struct rt_rxinfo)) */
- {
- DBGPRINT(RT_DEBUG_TRACE,
- ("BIRIdx(%d):FrameLen(0x%lx) outranges. BulkInLen=0x%lx, remaining RxBufLen=0x%lx, ReadPos=0x%lx\n",
- pAd->NextRxBulkInReadIndex, ThisFrameLen,
- pRxContext->BulkInOffset, RxBufferLength,
- pAd->ReadPosition));
-
- /* error frame. finish this loop */
- goto label_null;
- }
- /* skip USB frame length field */
- pData += RT2870_RXDMALEN_FIELD_SIZE;
- pRxWI = (struct rt_rxwi *) pData;
- if (pRxWI->MPDUtotalByteCount > ThisFrameLen) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s():pRxWIMPDUtotalByteCount(%d) large than RxDMALen(%ld)\n",
- __FUNCTION__, pRxWI->MPDUtotalByteCount,
- ThisFrameLen));
- goto label_null;
- }
- /* allocate a rx packet */
- pSkb = dev_alloc_skb(ThisFrameLen);
- if (pSkb == NULL) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s():Cannot Allocate sk buffer for this Bulk-In buffer!\n",
- __FUNCTION__));
- goto label_null;
- }
- /* copy the rx packet */
- memcpy(skb_put(pSkb, ThisFrameLen), pData, ThisFrameLen);
- RTPKT_TO_OSPKT(pSkb)->dev = get_netdev_from_bssid(pAd, BSS0);
- RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pSkb), PKTSRC_NDIS);
-
- /* copy RxD */
- *pSaveRxD = *(struct rt_rxinfo *) (pData + ThisFrameLen);
-
- /* update next packet read position. */
- pAd->ReadPosition += (ThisFrameLen + RT2870_RXDMALEN_FIELD_SIZE + RXINFO_SIZE); /* 8 for (RT2870_RXDMALEN_FIELD_SIZE + sizeof(struct rt_rxinfo)) */
-
- return pSkb;
-
-label_null:
-
- return NULL;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Check Rx descriptor, return NDIS_STATUS_FAILURE if any error dound
-
- Arguments:
- pRxD Pointer to the Rx descriptor
-
- Return Value:
- NDIS_STATUS_SUCCESS No err
- NDIS_STATUS_FAILURE Error
-
- Note:
-
- ========================================================================
-*/
-int RTMPCheckRxError(struct rt_rtmp_adapter *pAd,
- struct rt_header_802_11 * pHeader,
- struct rt_rxwi * pRxWI, IN PRT28XX_RXD_STRUC pRxINFO)
-{
- struct rt_cipher_key *pWpaKey;
- int dBm;
-
- if (pAd->bPromiscuous == TRUE)
- return (NDIS_STATUS_SUCCESS);
- if (pRxINFO == NULL)
- return (NDIS_STATUS_FAILURE);
-
- /* Phy errors & CRC errors */
- if (pRxINFO->Crc) {
- /* Check RSSI for Noise Hist statistic collection. */
- dBm = (int)(pRxWI->RSSI0) - pAd->BbpRssiToDbmDelta;
- if (dBm <= -87)
- pAd->StaCfg.RPIDensity[0] += 1;
- else if (dBm <= -82)
- pAd->StaCfg.RPIDensity[1] += 1;
- else if (dBm <= -77)
- pAd->StaCfg.RPIDensity[2] += 1;
- else if (dBm <= -72)
- pAd->StaCfg.RPIDensity[3] += 1;
- else if (dBm <= -67)
- pAd->StaCfg.RPIDensity[4] += 1;
- else if (dBm <= -62)
- pAd->StaCfg.RPIDensity[5] += 1;
- else if (dBm <= -57)
- pAd->StaCfg.RPIDensity[6] += 1;
- else if (dBm > -57)
- pAd->StaCfg.RPIDensity[7] += 1;
-
- return (NDIS_STATUS_FAILURE);
- }
- /* Add Rx size to channel load counter, we should ignore error counts */
- pAd->StaCfg.CLBusyBytes += (pRxWI->MPDUtotalByteCount + 14);
-
- /* Drop ToDs promiscuous frame, it is opened due to CCX 2 channel load statistics */
- if (pHeader->FC.ToDs) {
- DBGPRINT_RAW(RT_DEBUG_ERROR, ("Err;FC.ToDs\n"));
- return NDIS_STATUS_FAILURE;
- }
- /* Paul 04-03 for OFDM Rx length issue */
- if (pRxWI->MPDUtotalByteCount > MAX_AGGREGATION_SIZE) {
- DBGPRINT_RAW(RT_DEBUG_ERROR, ("received packet too long\n"));
- return NDIS_STATUS_FAILURE;
- }
- /* Drop not U2M frames, can't drop here because we will drop beacon in this case */
- /* I am kind of doubting the U2M bit operation */
- /* if (pRxD->U2M == 0) */
- /* return(NDIS_STATUS_FAILURE); */
-
- /* drop decyption fail frame */
- if (pRxINFO->Decrypted && pRxINFO->CipherErr) {
-
- if (((pRxINFO->CipherErr & 1) == 1)
- && pAd->CommonCfg.bWirelessEvent && INFRA_ON(pAd))
- RTMPSendWirelessEvent(pAd, IW_ICV_ERROR_EVENT_FLAG,
- pAd->MacTab.Content[BSSID_WCID].
- Addr, BSS0, 0);
-
- if (((pRxINFO->CipherErr & 2) == 2)
- && pAd->CommonCfg.bWirelessEvent && INFRA_ON(pAd))
- RTMPSendWirelessEvent(pAd, IW_MIC_ERROR_EVENT_FLAG,
- pAd->MacTab.Content[BSSID_WCID].
- Addr, BSS0, 0);
- /* */
- /* MIC Error */
- /* */
- if ((pRxINFO->CipherErr == 2) && pRxINFO->MyBss) {
- pWpaKey = &pAd->SharedKey[BSS0][pRxWI->KeyIndex];
- RTMPReportMicError(pAd, pWpaKey);
- DBGPRINT_RAW(RT_DEBUG_ERROR, ("Rx MIC Value error\n"));
- }
-
- if (pRxINFO->Decrypted &&
- (pAd->SharedKey[BSS0][pRxWI->KeyIndex].CipherAlg ==
- CIPHER_AES)
- && (pHeader->Sequence == pAd->FragFrame.Sequence)) {
- /* */
- /* Acceptable since the First FragFrame no CipherErr problem. */
- /* */
- return (NDIS_STATUS_SUCCESS);
- }
-
- return (NDIS_STATUS_FAILURE);
- }
-
- return (NDIS_STATUS_SUCCESS);
-}
-
-void RtmpUsbStaAsicForceWakeupTimeout(void *SystemSpecific1,
- void *FunctionContext,
- void *SystemSpecific2,
- void *SystemSpecific3)
-{
- struct rt_rtmp_adapter *pAd = (struct rt_rtmp_adapter *)FunctionContext;
-
- if (pAd && pAd->Mlme.AutoWakeupTimerRunning) {
- AsicSendCommandToMcu(pAd, 0x31, 0xff, 0x00, 0x02);
-
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
- pAd->Mlme.AutoWakeupTimerRunning = FALSE;
- }
-}
-
-void RT28xxUsbStaAsicForceWakeup(struct rt_rtmp_adapter *pAd, IN BOOLEAN bFromTx)
-{
- BOOLEAN Canceled;
-
- if (pAd->Mlme.AutoWakeupTimerRunning)
- RTMPCancelTimer(&pAd->Mlme.AutoWakeupTimer, &Canceled);
-
- AsicSendCommandToMcu(pAd, 0x31, 0xff, 0x00, 0x02);
-
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
-}
-
-void RT28xxUsbStaAsicSleepThenAutoWakeup(struct rt_rtmp_adapter *pAd,
- u16 TbttNumToNextWakeUp)
-{
-
- /* we have decided to SLEEP, so at least do it for a BEACON period. */
- if (TbttNumToNextWakeUp == 0)
- TbttNumToNextWakeUp = 1;
-
- RTMPSetTimer(&pAd->Mlme.AutoWakeupTimer, AUTO_WAKEUP_TIMEOUT);
- pAd->Mlme.AutoWakeupTimerRunning = TRUE;
-
- AsicSendCommandToMcu(pAd, 0x30, 0xff, 0xff, 0x02); /* send POWER-SAVE command to MCU. Timeout 40us. */
-
- OPSTATUS_SET_FLAG(pAd, fOP_STATUS_DOZE);
-
-}
-
-#endif /* RTMP_MAC_USB // */
diff --git a/drivers/staging/rt2860/common/cmm_info.c b/drivers/staging/rt2860/common/cmm_info.c
deleted file mode 100644
index 25302e8363b9..000000000000
--- a/drivers/staging/rt2860/common/cmm_info.c
+++ /dev/null
@@ -1,955 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
- */
-
-#include <linux/sched.h>
-#include "../rt_config.h"
-
-/*
- ========================================================================
-
- Routine Description:
- Remove WPA Key process
-
- Arguments:
- pAd Pointer to our adapter
- pBuf Pointer to the where the key stored
-
- Return Value:
- NDIS_SUCCESS Add key successfully
-
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPSetDesiredRates(struct rt_rtmp_adapter *pAdapter, long Rates)
-{
- NDIS_802_11_RATES aryRates;
-
- memset(&aryRates, 0x00, sizeof(NDIS_802_11_RATES));
- switch (pAdapter->CommonCfg.PhyMode) {
- case PHY_11A: /* A only */
- switch (Rates) {
- case 6000000: /*6M */
- aryRates[0] = 0x0c; /* 6M */
- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
- MCS_0;
- break;
- case 9000000: /*9M */
- aryRates[0] = 0x12; /* 9M */
- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
- MCS_1;
- break;
- case 12000000: /*12M */
- aryRates[0] = 0x18; /* 12M */
- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
- MCS_2;
- break;
- case 18000000: /*18M */
- aryRates[0] = 0x24; /* 18M */
- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
- MCS_3;
- break;
- case 24000000: /*24M */
- aryRates[0] = 0x30; /* 24M */
- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
- MCS_4;
- break;
- case 36000000: /*36M */
- aryRates[0] = 0x48; /* 36M */
- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
- MCS_5;
- break;
- case 48000000: /*48M */
- aryRates[0] = 0x60; /* 48M */
- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
- MCS_6;
- break;
- case 54000000: /*54M */
- aryRates[0] = 0x6c; /* 54M */
- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
- MCS_7;
- break;
- case -1: /*Auto */
- default:
- aryRates[0] = 0x6c; /* 54Mbps */
- aryRates[1] = 0x60; /* 48Mbps */
- aryRates[2] = 0x48; /* 36Mbps */
- aryRates[3] = 0x30; /* 24Mbps */
- aryRates[4] = 0x24; /* 18M */
- aryRates[5] = 0x18; /* 12M */
- aryRates[6] = 0x12; /* 9M */
- aryRates[7] = 0x0c; /* 6M */
- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
- MCS_AUTO;
- break;
- }
- break;
- case PHY_11BG_MIXED: /* B/G Mixed */
- case PHY_11B: /* B only */
- case PHY_11ABG_MIXED: /* A/B/G Mixed */
- default:
- switch (Rates) {
- case 1000000: /*1M */
- aryRates[0] = 0x02;
- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
- MCS_0;
- break;
- case 2000000: /*2M */
- aryRates[0] = 0x04;
- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
- MCS_1;
- break;
- case 5000000: /*5.5M */
- aryRates[0] = 0x0b; /* 5.5M */
- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
- MCS_2;
- break;
- case 11000000: /*11M */
- aryRates[0] = 0x16; /* 11M */
- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
- MCS_3;
- break;
- case 6000000: /*6M */
- aryRates[0] = 0x0c; /* 6M */
- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
- MCS_0;
- break;
- case 9000000: /*9M */
- aryRates[0] = 0x12; /* 9M */
- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
- MCS_1;
- break;
- case 12000000: /*12M */
- aryRates[0] = 0x18; /* 12M */
- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
- MCS_2;
- break;
- case 18000000: /*18M */
- aryRates[0] = 0x24; /* 18M */
- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
- MCS_3;
- break;
- case 24000000: /*24M */
- aryRates[0] = 0x30; /* 24M */
- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
- MCS_4;
- break;
- case 36000000: /*36M */
- aryRates[0] = 0x48; /* 36M */
- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
- MCS_5;
- break;
- case 48000000: /*48M */
- aryRates[0] = 0x60; /* 48M */
- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
- MCS_6;
- break;
- case 54000000: /*54M */
- aryRates[0] = 0x6c; /* 54M */
- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
- MCS_7;
- break;
- case -1: /*Auto */
- default:
- if (pAdapter->CommonCfg.PhyMode == PHY_11B) { /*B Only */
- aryRates[0] = 0x16; /* 11Mbps */
- aryRates[1] = 0x0b; /* 5.5Mbps */
- aryRates[2] = 0x04; /* 2Mbps */
- aryRates[3] = 0x02; /* 1Mbps */
- } else { /*(B/G) Mixed or (A/B/G) Mixed */
- aryRates[0] = 0x6c; /* 54Mbps */
- aryRates[1] = 0x60; /* 48Mbps */
- aryRates[2] = 0x48; /* 36Mbps */
- aryRates[3] = 0x30; /* 24Mbps */
- aryRates[4] = 0x16; /* 11Mbps */
- aryRates[5] = 0x0b; /* 5.5Mbps */
- aryRates[6] = 0x04; /* 2Mbps */
- aryRates[7] = 0x02; /* 1Mbps */
- }
- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
- MCS_AUTO;
- break;
- }
- break;
- }
-
- NdisZeroMemory(pAdapter->CommonCfg.DesireRate,
- MAX_LEN_OF_SUPPORTED_RATES);
- NdisMoveMemory(pAdapter->CommonCfg.DesireRate, &aryRates,
- sizeof(NDIS_802_11_RATES));
- DBGPRINT(RT_DEBUG_TRACE,
- (" RTMPSetDesiredRates (%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x)\n",
- pAdapter->CommonCfg.DesireRate[0],
- pAdapter->CommonCfg.DesireRate[1],
- pAdapter->CommonCfg.DesireRate[2],
- pAdapter->CommonCfg.DesireRate[3],
- pAdapter->CommonCfg.DesireRate[4],
- pAdapter->CommonCfg.DesireRate[5],
- pAdapter->CommonCfg.DesireRate[6],
- pAdapter->CommonCfg.DesireRate[7]));
- /* Changing DesiredRate may affect the MAX TX rate we used to TX frames out */
- MlmeUpdateTxRates(pAdapter, FALSE, 0);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Remove All WPA Keys
-
- Arguments:
- pAd Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPWPARemoveAllKeys(struct rt_rtmp_adapter *pAd)
-{
-
- u8 i;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("RTMPWPARemoveAllKeys(AuthMode=%d, WepStatus=%d)\n",
- pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus));
- RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
- /* For WEP/CKIP, there is no need to remove it, since WinXP won't set it again after */
- /* Link up. And it will be replaced if user changed it. */
- if (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA)
- return;
-
- /* For WPA-None, there is no need to remove it, since WinXP won't set it again after */
- /* Link up. And it will be replaced if user changed it. */
- if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
- return;
-
- /* set BSSID wcid entry of the Pair-wise Key table as no-security mode */
- AsicRemovePairwiseKeyEntry(pAd, BSS0, BSSID_WCID);
-
- /* set all shared key mode as no-security. */
- for (i = 0; i < SHARE_KEY_NUM; i++) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("remove %s key #%d\n",
- CipherName[pAd->SharedKey[BSS0][i].CipherAlg], i));
- NdisZeroMemory(&pAd->SharedKey[BSS0][i], sizeof(struct rt_cipher_key));
-
- AsicRemoveSharedKeyEntry(pAd, BSS0, i);
- }
- RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- As STA's BSSID is a WC too, it uses shared key table.
- This function write correct unicast TX key to ASIC WCID.
- And we still make a copy in our MacTab.Content[BSSID_WCID].PairwiseKey.
- Caller guarantee TKIP/AES always has keyidx = 0. (pairwise key)
- Caller guarantee WEP calls this function when set Txkey, default key index=0~3.
-
- Arguments:
- pAd Pointer to our adapter
- pKey Pointer to the where the key stored
-
- Return Value:
- NDIS_SUCCESS Add key successfully
-
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-/*
- ========================================================================
- Routine Description:
- Change NIC PHY mode. Re-association may be necessary. possible settings
- include - PHY_11B, PHY_11BG_MIXED, PHY_11A, and PHY_11ABG_MIXED
-
- Arguments:
- pAd - Pointer to our adapter
- phymode -
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- ========================================================================
-*/
-void RTMPSetPhyMode(struct rt_rtmp_adapter *pAd, unsigned long phymode)
-{
- int i;
- /* the selected phymode must be supported by the RF IC encoded in E2PROM */
-
- /* if no change, do nothing */
- /* bug fix
- if (pAd->CommonCfg.PhyMode == phymode)
- return;
- */
- pAd->CommonCfg.PhyMode = (u8)phymode;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("RTMPSetPhyMode : PhyMode=%d, channel=%d \n",
- pAd->CommonCfg.PhyMode, pAd->CommonCfg.Channel));
-
- BuildChannelList(pAd);
-
- /* sanity check user setting */
- for (i = 0; i < pAd->ChannelListNum; i++) {
- if (pAd->CommonCfg.Channel == pAd->ChannelList[i].Channel)
- break;
- }
-
- if (i == pAd->ChannelListNum) {
- pAd->CommonCfg.Channel = FirstChannel(pAd);
- DBGPRINT(RT_DEBUG_ERROR,
- ("RTMPSetPhyMode: channel is out of range, use first channel=%d \n",
- pAd->CommonCfg.Channel));
- }
-
- NdisZeroMemory(pAd->CommonCfg.SupRate, MAX_LEN_OF_SUPPORTED_RATES);
- NdisZeroMemory(pAd->CommonCfg.ExtRate, MAX_LEN_OF_SUPPORTED_RATES);
- NdisZeroMemory(pAd->CommonCfg.DesireRate, MAX_LEN_OF_SUPPORTED_RATES);
- switch (phymode) {
- case PHY_11B:
- pAd->CommonCfg.SupRate[0] = 0x82; /* 1 mbps, in units of 0.5 Mbps, basic rate */
- pAd->CommonCfg.SupRate[1] = 0x84; /* 2 mbps, in units of 0.5 Mbps, basic rate */
- pAd->CommonCfg.SupRate[2] = 0x8B; /* 5.5 mbps, in units of 0.5 Mbps, basic rate */
- pAd->CommonCfg.SupRate[3] = 0x96; /* 11 mbps, in units of 0.5 Mbps, basic rate */
- pAd->CommonCfg.SupRateLen = 4;
- pAd->CommonCfg.ExtRateLen = 0;
- pAd->CommonCfg.DesireRate[0] = 2; /* 1 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.DesireRate[1] = 4; /* 2 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.DesireRate[2] = 11; /* 5.5 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.DesireRate[3] = 22; /* 11 mbps, in units of 0.5 Mbps */
- /*pAd->CommonCfg.HTPhyMode.field.MODE = MODE_CCK; // This MODE is only FYI. not use */
- break;
-
- case PHY_11G:
- case PHY_11BG_MIXED:
- case PHY_11ABG_MIXED:
- case PHY_11N_2_4G:
- case PHY_11ABGN_MIXED:
- case PHY_11BGN_MIXED:
- case PHY_11GN_MIXED:
- pAd->CommonCfg.SupRate[0] = 0x82; /* 1 mbps, in units of 0.5 Mbps, basic rate */
- pAd->CommonCfg.SupRate[1] = 0x84; /* 2 mbps, in units of 0.5 Mbps, basic rate */
- pAd->CommonCfg.SupRate[2] = 0x8B; /* 5.5 mbps, in units of 0.5 Mbps, basic rate */
- pAd->CommonCfg.SupRate[3] = 0x96; /* 11 mbps, in units of 0.5 Mbps, basic rate */
- pAd->CommonCfg.SupRate[4] = 0x12; /* 9 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.SupRate[5] = 0x24; /* 18 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.SupRate[6] = 0x48; /* 36 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.SupRate[7] = 0x6c; /* 54 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.SupRateLen = 8;
- pAd->CommonCfg.ExtRate[0] = 0x0C; /* 6 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.ExtRate[1] = 0x18; /* 12 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.ExtRate[2] = 0x30; /* 24 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.ExtRate[3] = 0x60; /* 48 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.ExtRateLen = 4;
- pAd->CommonCfg.DesireRate[0] = 2; /* 1 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.DesireRate[1] = 4; /* 2 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.DesireRate[2] = 11; /* 5.5 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.DesireRate[3] = 22; /* 11 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.DesireRate[4] = 12; /* 6 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.DesireRate[5] = 18; /* 9 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.DesireRate[6] = 24; /* 12 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.DesireRate[7] = 36; /* 18 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.DesireRate[8] = 48; /* 24 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.DesireRate[9] = 72; /* 36 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.DesireRate[10] = 96; /* 48 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.DesireRate[11] = 108; /* 54 mbps, in units of 0.5 Mbps */
- break;
-
- case PHY_11A:
- case PHY_11AN_MIXED:
- case PHY_11AGN_MIXED:
- case PHY_11N_5G:
- pAd->CommonCfg.SupRate[0] = 0x8C; /* 6 mbps, in units of 0.5 Mbps, basic rate */
- pAd->CommonCfg.SupRate[1] = 0x12; /* 9 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.SupRate[2] = 0x98; /* 12 mbps, in units of 0.5 Mbps, basic rate */
- pAd->CommonCfg.SupRate[3] = 0x24; /* 18 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.SupRate[4] = 0xb0; /* 24 mbps, in units of 0.5 Mbps, basic rate */
- pAd->CommonCfg.SupRate[5] = 0x48; /* 36 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.SupRate[6] = 0x60; /* 48 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.SupRate[7] = 0x6c; /* 54 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.SupRateLen = 8;
- pAd->CommonCfg.ExtRateLen = 0;
- pAd->CommonCfg.DesireRate[0] = 12; /* 6 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.DesireRate[1] = 18; /* 9 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.DesireRate[2] = 24; /* 12 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.DesireRate[3] = 36; /* 18 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.DesireRate[4] = 48; /* 24 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.DesireRate[5] = 72; /* 36 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.DesireRate[6] = 96; /* 48 mbps, in units of 0.5 Mbps */
- pAd->CommonCfg.DesireRate[7] = 108; /* 54 mbps, in units of 0.5 Mbps */
- /*pAd->CommonCfg.HTPhyMode.field.MODE = MODE_OFDM; // This MODE is only FYI. not use */
- break;
-
- default:
- break;
- }
-
- pAd->CommonCfg.BandState = UNKNOWN_BAND;
-}
-
-/*
- ========================================================================
- Routine Description:
- Caller ensures we has 802.11n support.
- Calls at setting HT from AP/STASetinformation
-
- Arguments:
- pAd - Pointer to our adapter
- phymode -
-
- ========================================================================
-*/
-void RTMPSetHT(struct rt_rtmp_adapter *pAd, struct rt_oid_set_ht_phymode *pHTPhyMode)
-{
- /*unsigned long *pmcs; */
- u32 Value = 0;
- u8 BBPValue = 0;
- u8 BBP3Value = 0;
- u8 RxStream = pAd->CommonCfg.RxStream;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("RTMPSetHT : HT_mode(%d), ExtOffset(%d), MCS(%d), BW(%d), STBC(%d), SHORTGI(%d)\n",
- pHTPhyMode->HtMode, pHTPhyMode->ExtOffset, pHTPhyMode->MCS,
- pHTPhyMode->BW, pHTPhyMode->STBC, pHTPhyMode->SHORTGI));
-
- /* Don't zero supportedHyPhy structure. */
- RTMPZeroMemory(&pAd->CommonCfg.HtCapability,
- sizeof(pAd->CommonCfg.HtCapability));
- RTMPZeroMemory(&pAd->CommonCfg.AddHTInfo,
- sizeof(pAd->CommonCfg.AddHTInfo));
- RTMPZeroMemory(&pAd->CommonCfg.NewExtChanOffset,
- sizeof(pAd->CommonCfg.NewExtChanOffset));
- RTMPZeroMemory(&pAd->CommonCfg.DesiredHtPhy,
- sizeof(pAd->CommonCfg.DesiredHtPhy));
-
- if (pAd->CommonCfg.bRdg) {
- pAd->CommonCfg.HtCapability.ExtHtCapInfo.PlusHTC = 1;
- pAd->CommonCfg.HtCapability.ExtHtCapInfo.RDGSupport = 1;
- } else {
- pAd->CommonCfg.HtCapability.ExtHtCapInfo.PlusHTC = 0;
- pAd->CommonCfg.HtCapability.ExtHtCapInfo.RDGSupport = 0;
- }
-
- pAd->CommonCfg.HtCapability.HtCapParm.MaxRAmpduFactor = 3;
- pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor = 3;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("RTMPSetHT : RxBAWinLimit = %d\n",
- pAd->CommonCfg.BACapability.field.RxBAWinLimit));
-
- /* Mimo power save, A-MSDU size, */
- pAd->CommonCfg.DesiredHtPhy.AmsduEnable =
- (u16)pAd->CommonCfg.BACapability.field.AmsduEnable;
- pAd->CommonCfg.DesiredHtPhy.AmsduSize =
- (u8)pAd->CommonCfg.BACapability.field.AmsduSize;
- pAd->CommonCfg.DesiredHtPhy.MimoPs =
- (u8)pAd->CommonCfg.BACapability.field.MMPSmode;
- pAd->CommonCfg.DesiredHtPhy.MpduDensity =
- (u8)pAd->CommonCfg.BACapability.field.MpduDensity;
-
- pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize =
- (u16)pAd->CommonCfg.BACapability.field.AmsduSize;
- pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs =
- (u16)pAd->CommonCfg.BACapability.field.MMPSmode;
- pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity =
- (u8)pAd->CommonCfg.BACapability.field.MpduDensity;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("RTMPSetHT : AMsduSize = %d, MimoPs = %d, MpduDensity = %d, MaxRAmpduFactor = %d\n",
- pAd->CommonCfg.DesiredHtPhy.AmsduSize,
- pAd->CommonCfg.DesiredHtPhy.MimoPs,
- pAd->CommonCfg.DesiredHtPhy.MpduDensity,
- pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor));
-
- if (pHTPhyMode->HtMode == HTMODE_GF) {
- pAd->CommonCfg.HtCapability.HtCapInfo.GF = 1;
- pAd->CommonCfg.DesiredHtPhy.GF = 1;
- } else
- pAd->CommonCfg.DesiredHtPhy.GF = 0;
-
- /* Decide Rx MCSSet */
- switch (RxStream) {
- case 1:
- pAd->CommonCfg.HtCapability.MCSSet[0] = 0xff;
- pAd->CommonCfg.HtCapability.MCSSet[1] = 0x00;
- break;
-
- case 2:
- pAd->CommonCfg.HtCapability.MCSSet[0] = 0xff;
- pAd->CommonCfg.HtCapability.MCSSet[1] = 0xff;
- break;
-
- case 3: /* 3*3 */
- pAd->CommonCfg.HtCapability.MCSSet[0] = 0xff;
- pAd->CommonCfg.HtCapability.MCSSet[1] = 0xff;
- pAd->CommonCfg.HtCapability.MCSSet[2] = 0xff;
- break;
- }
-
- if (pAd->CommonCfg.bForty_Mhz_Intolerant
- && (pAd->CommonCfg.Channel <= 14) && (pHTPhyMode->BW == BW_40)) {
- pHTPhyMode->BW = BW_20;
- pAd->CommonCfg.HtCapability.HtCapInfo.Forty_Mhz_Intolerant = 1;
- }
-
- if (pHTPhyMode->BW == BW_40) {
- pAd->CommonCfg.HtCapability.MCSSet[4] = 0x1; /* MCS 32 */
- pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth = 1;
- if (pAd->CommonCfg.Channel <= 14)
- pAd->CommonCfg.HtCapability.HtCapInfo.CCKmodein40 = 1;
-
- pAd->CommonCfg.DesiredHtPhy.ChannelWidth = 1;
- pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 1;
- pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset =
- (pHTPhyMode->ExtOffset ==
- EXTCHA_BELOW) ? (EXTCHA_BELOW) : EXTCHA_ABOVE;
- /* Set Regsiter for extension channel position. */
- RTMP_IO_READ32(pAd, TX_BAND_CFG, &Value);
- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBP3Value);
- if ((pHTPhyMode->ExtOffset == EXTCHA_BELOW)) {
- Value |= 0x1;
- BBP3Value |= (0x20);
- RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value);
- } else if ((pHTPhyMode->ExtOffset == EXTCHA_ABOVE)) {
- Value &= 0xfe;
- BBP3Value &= (~0x20);
- RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value);
- }
- /* Turn on BBP 40MHz mode now only as AP . */
- /* Sta can turn on BBP 40MHz after connection with 40MHz AP. Sta only broadcast 40MHz capability before connection. */
- if ((pAd->OpMode == OPMODE_AP) || INFRA_ON(pAd) || ADHOC_ON(pAd)
- ) {
- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
- BBPValue &= (~0x18);
- BBPValue |= 0x10;
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
-
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBP3Value);
- pAd->CommonCfg.BBPCurrentBW = BW_40;
- }
- } else {
- pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth = 0;
- pAd->CommonCfg.DesiredHtPhy.ChannelWidth = 0;
- pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 0;
- pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = EXTCHA_NONE;
- pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;
- /* Turn on BBP 20MHz mode by request here. */
- {
- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
- BBPValue &= (~0x18);
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
- pAd->CommonCfg.BBPCurrentBW = BW_20;
- }
- }
-
- if (pHTPhyMode->STBC == STBC_USE) {
- pAd->CommonCfg.HtCapability.HtCapInfo.TxSTBC = 1;
- pAd->CommonCfg.DesiredHtPhy.TxSTBC = 1;
- pAd->CommonCfg.HtCapability.HtCapInfo.RxSTBC = 1;
- pAd->CommonCfg.DesiredHtPhy.RxSTBC = 1;
- } else {
- pAd->CommonCfg.DesiredHtPhy.TxSTBC = 0;
- pAd->CommonCfg.DesiredHtPhy.RxSTBC = 0;
- }
-
- if (pHTPhyMode->SHORTGI == GI_400) {
- pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor20 = 1;
- pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor40 = 1;
- pAd->CommonCfg.DesiredHtPhy.ShortGIfor20 = 1;
- pAd->CommonCfg.DesiredHtPhy.ShortGIfor40 = 1;
- } else {
- pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor20 = 0;
- pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor40 = 0;
- pAd->CommonCfg.DesiredHtPhy.ShortGIfor20 = 0;
- pAd->CommonCfg.DesiredHtPhy.ShortGIfor40 = 0;
- }
-
- /* We support link adaptation for unsolicit MCS feedback, set to 2. */
- pAd->CommonCfg.HtCapability.ExtHtCapInfo.MCSFeedback = MCSFBK_NONE; /*MCSFBK_UNSOLICIT; */
- pAd->CommonCfg.AddHTInfo.ControlChan = pAd->CommonCfg.Channel;
- /* 1, the extension channel above the control channel. */
-
- /* EDCA parameters used for AP's own transmission */
- if (pAd->CommonCfg.APEdcaParm.bValid == FALSE) {
- pAd->CommonCfg.APEdcaParm.bValid = TRUE;
- pAd->CommonCfg.APEdcaParm.Aifsn[0] = 3;
- pAd->CommonCfg.APEdcaParm.Aifsn[1] = 7;
- pAd->CommonCfg.APEdcaParm.Aifsn[2] = 1;
- pAd->CommonCfg.APEdcaParm.Aifsn[3] = 1;
-
- pAd->CommonCfg.APEdcaParm.Cwmin[0] = 4;
- pAd->CommonCfg.APEdcaParm.Cwmin[1] = 4;
- pAd->CommonCfg.APEdcaParm.Cwmin[2] = 3;
- pAd->CommonCfg.APEdcaParm.Cwmin[3] = 2;
-
- pAd->CommonCfg.APEdcaParm.Cwmax[0] = 6;
- pAd->CommonCfg.APEdcaParm.Cwmax[1] = 10;
- pAd->CommonCfg.APEdcaParm.Cwmax[2] = 4;
- pAd->CommonCfg.APEdcaParm.Cwmax[3] = 3;
-
- pAd->CommonCfg.APEdcaParm.Txop[0] = 0;
- pAd->CommonCfg.APEdcaParm.Txop[1] = 0;
- pAd->CommonCfg.APEdcaParm.Txop[2] = 94;
- pAd->CommonCfg.APEdcaParm.Txop[3] = 47;
- }
- AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);
-
- {
- RTMPSetIndividualHT(pAd, 0);
- }
-
-}
-
-/*
- ========================================================================
- Routine Description:
- Caller ensures we has 802.11n support.
- Calls at setting HT from AP/STASetinformation
-
- Arguments:
- pAd - Pointer to our adapter
- phymode -
-
- ========================================================================
-*/
-void RTMPSetIndividualHT(struct rt_rtmp_adapter *pAd, u8 apidx)
-{
- struct rt_ht_phy_info *pDesired_ht_phy = NULL;
- u8 TxStream = pAd->CommonCfg.TxStream;
- u8 DesiredMcs = MCS_AUTO;
-
- do {
- {
- pDesired_ht_phy = &pAd->StaCfg.DesiredHtPhyInfo;
- DesiredMcs =
- pAd->StaCfg.DesiredTransmitSetting.field.MCS;
- /*pAd->StaCfg.bAutoTxRateSwitch = (DesiredMcs == MCS_AUTO) ? TRUE : FALSE; */
- break;
- }
- } while (FALSE);
-
- if (pDesired_ht_phy == NULL) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("RTMPSetIndividualHT: invalid apidx(%d)\n", apidx));
- return;
- }
- RTMPZeroMemory(pDesired_ht_phy, sizeof(struct rt_ht_phy_info));
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("RTMPSetIndividualHT : Desired MCS = %d\n", DesiredMcs));
- /* Check the validity of MCS */
- if ((TxStream == 1)
- && ((DesiredMcs >= MCS_8) && (DesiredMcs <= MCS_15))) {
- DBGPRINT(RT_DEBUG_WARN,
- ("RTMPSetIndividualHT: MCS(%d) is invalid in 1S, reset it as MCS_7\n",
- DesiredMcs));
- DesiredMcs = MCS_7;
- }
-
- if ((pAd->CommonCfg.DesiredHtPhy.ChannelWidth == BW_20)
- && (DesiredMcs == MCS_32)) {
- DBGPRINT(RT_DEBUG_WARN,
- ("RTMPSetIndividualHT: MCS_32 is only supported in 40-MHz, reset it as MCS_0\n"));
- DesiredMcs = MCS_0;
- }
-
- pDesired_ht_phy->bHtEnable = TRUE;
-
- /* Decide desired Tx MCS */
- switch (TxStream) {
- case 1:
- if (DesiredMcs == MCS_AUTO) {
- pDesired_ht_phy->MCSSet[0] = 0xff;
- pDesired_ht_phy->MCSSet[1] = 0x00;
- } else if (DesiredMcs <= MCS_7) {
- pDesired_ht_phy->MCSSet[0] = 1 << DesiredMcs;
- pDesired_ht_phy->MCSSet[1] = 0x00;
- }
- break;
-
- case 2:
- if (DesiredMcs == MCS_AUTO) {
- pDesired_ht_phy->MCSSet[0] = 0xff;
- pDesired_ht_phy->MCSSet[1] = 0xff;
- } else if (DesiredMcs <= MCS_15) {
- unsigned long mode;
-
- mode = DesiredMcs / 8;
- if (mode < 2)
- pDesired_ht_phy->MCSSet[mode] =
- (1 << (DesiredMcs - mode * 8));
- }
- break;
-
- case 3: /* 3*3 */
- if (DesiredMcs == MCS_AUTO) {
- /* MCS0 ~ MCS23, 3 bytes */
- pDesired_ht_phy->MCSSet[0] = 0xff;
- pDesired_ht_phy->MCSSet[1] = 0xff;
- pDesired_ht_phy->MCSSet[2] = 0xff;
- } else if (DesiredMcs <= MCS_23) {
- unsigned long mode;
-
- mode = DesiredMcs / 8;
- if (mode < 3)
- pDesired_ht_phy->MCSSet[mode] =
- (1 << (DesiredMcs - mode * 8));
- }
- break;
- }
-
- if (pAd->CommonCfg.DesiredHtPhy.ChannelWidth == BW_40) {
- if (DesiredMcs == MCS_AUTO || DesiredMcs == MCS_32)
- pDesired_ht_phy->MCSSet[4] = 0x1;
- }
- /* update HT Rate setting */
- if (pAd->OpMode == OPMODE_STA)
- MlmeUpdateHtTxRates(pAd, BSS0);
- else
- MlmeUpdateHtTxRates(pAd, apidx);
-}
-
-/*
- ========================================================================
- Routine Description:
- Update HT IE from our capability.
-
- Arguments:
- Send all HT IE in beacon/probe rsp/assoc rsp/action frame.
-
- ========================================================================
-*/
-void RTMPUpdateHTIE(struct rt_ht_capability *pRtHt,
- u8 * pMcsSet,
- struct rt_ht_capability_ie * pHtCapability,
- struct rt_add_ht_info_ie * pAddHtInfo)
-{
- RTMPZeroMemory(pHtCapability, sizeof(struct rt_ht_capability_ie));
- RTMPZeroMemory(pAddHtInfo, sizeof(struct rt_add_ht_info_ie));
-
- pHtCapability->HtCapInfo.ChannelWidth = pRtHt->ChannelWidth;
- pHtCapability->HtCapInfo.MimoPs = pRtHt->MimoPs;
- pHtCapability->HtCapInfo.GF = pRtHt->GF;
- pHtCapability->HtCapInfo.ShortGIfor20 = pRtHt->ShortGIfor20;
- pHtCapability->HtCapInfo.ShortGIfor40 = pRtHt->ShortGIfor40;
- pHtCapability->HtCapInfo.TxSTBC = pRtHt->TxSTBC;
- pHtCapability->HtCapInfo.RxSTBC = pRtHt->RxSTBC;
- pHtCapability->HtCapInfo.AMsduSize = pRtHt->AmsduSize;
- pHtCapability->HtCapParm.MaxRAmpduFactor = pRtHt->MaxRAmpduFactor;
- pHtCapability->HtCapParm.MpduDensity = pRtHt->MpduDensity;
-
- pAddHtInfo->AddHtInfo.ExtChanOffset = pRtHt->ExtChanOffset;
- pAddHtInfo->AddHtInfo.RecomWidth = pRtHt->RecomWidth;
- pAddHtInfo->AddHtInfo2.OperaionMode = pRtHt->OperaionMode;
- pAddHtInfo->AddHtInfo2.NonGfPresent = pRtHt->NonGfPresent;
- RTMPMoveMemory(pAddHtInfo->MCSSet, /*pRtHt->MCSSet */ pMcsSet, 4); /* rt2860 only support MCS max=32, no need to copy all 16 uchar. */
-
- DBGPRINT(RT_DEBUG_TRACE, ("RTMPUpdateHTIE <== \n"));
-}
-
-/*
- ========================================================================
- Description:
- Add Client security information into ASIC WCID table and IVEIV table.
- Return:
- ========================================================================
-*/
-void RTMPAddWcidAttributeEntry(struct rt_rtmp_adapter *pAd,
- u8 BssIdx,
- u8 KeyIdx,
- u8 CipherAlg, struct rt_mac_table_entry *pEntry)
-{
- u32 WCIDAttri = 0;
- u16 offset;
- u8 IVEIV = 0;
- u16 Wcid = 0;
-
- {
- {
- if (BssIdx > BSS0) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("RTMPAddWcidAttributeEntry: The BSS-index(%d) is out of range for Infra link. \n",
- BssIdx));
- return;
- }
- /* 1. In ADHOC mode, the AID is wcid number. And NO mesh link exists. */
- /* 2. In Infra mode, the AID:1 MUST be wcid of infra STA. */
- /* the AID:2~ assign to mesh link entry. */
- if (pEntry)
- Wcid = pEntry->Aid;
- else
- Wcid = MCAST_WCID;
- }
- }
-
- /* Update WCID attribute table */
- offset = MAC_WCID_ATTRIBUTE_BASE + (Wcid * HW_WCID_ATTRI_SIZE);
-
- {
- if (pEntry && pEntry->ValidAsMesh)
- WCIDAttri = (CipherAlg << 1) | PAIRWISEKEYTABLE;
- else
- WCIDAttri = (CipherAlg << 1) | SHAREDKEYTABLE;
- }
-
- RTMP_IO_WRITE32(pAd, offset, WCIDAttri);
-
- /* Update IV/EIV table */
- offset = MAC_IVEIV_TABLE_BASE + (Wcid * HW_IVEIV_ENTRY_SIZE);
-
- /* WPA mode */
- if ((CipherAlg == CIPHER_TKIP) || (CipherAlg == CIPHER_TKIP_NO_MIC)
- || (CipherAlg == CIPHER_AES)) {
- /* Eiv bit on. keyid always is 0 for pairwise key */
- IVEIV = (KeyIdx << 6) | 0x20;
- } else {
- /* WEP KeyIdx is default tx key. */
- IVEIV = (KeyIdx << 6);
- }
-
- /* For key index and ext IV bit, so only need to update the position(offset+3). */
-#ifdef RTMP_MAC_PCI
- RTMP_IO_WRITE8(pAd, offset + 3, IVEIV);
-#endif /* RTMP_MAC_PCI // */
-#ifdef RTMP_MAC_USB
- RTUSBMultiWrite_OneByte(pAd, offset + 3, &IVEIV);
-#endif /* RTMP_MAC_USB // */
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("RTMPAddWcidAttributeEntry: WCID #%d, KeyIndex #%d, Alg=%s\n",
- Wcid, KeyIdx, CipherName[CipherAlg]));
- DBGPRINT(RT_DEBUG_TRACE, (" WCIDAttri = 0x%x \n", WCIDAttri));
-
-}
-
-/*
- ==========================================================================
- Description:
- Parse encryption type
-Arguments:
- pAdapter Pointer to our adapter
- wrq Pointer to the ioctl argument
-
- Return Value:
- None
-
- Note:
- ==========================================================================
-*/
-char *GetEncryptType(char enc)
-{
- if (enc == Ndis802_11WEPDisabled)
- return "NONE";
- if (enc == Ndis802_11WEPEnabled)
- return "WEP";
- if (enc == Ndis802_11Encryption2Enabled)
- return "TKIP";
- if (enc == Ndis802_11Encryption3Enabled)
- return "AES";
- if (enc == Ndis802_11Encryption4Enabled)
- return "TKIPAES";
- else
- return "UNKNOW";
-}
-
-char *GetAuthMode(char auth)
-{
- if (auth == Ndis802_11AuthModeOpen)
- return "OPEN";
- if (auth == Ndis802_11AuthModeShared)
- return "SHARED";
- if (auth == Ndis802_11AuthModeAutoSwitch)
- return "AUTOWEP";
- if (auth == Ndis802_11AuthModeWPA)
- return "WPA";
- if (auth == Ndis802_11AuthModeWPAPSK)
- return "WPAPSK";
- if (auth == Ndis802_11AuthModeWPANone)
- return "WPANONE";
- if (auth == Ndis802_11AuthModeWPA2)
- return "WPA2";
- if (auth == Ndis802_11AuthModeWPA2PSK)
- return "WPA2PSK";
- if (auth == Ndis802_11AuthModeWPA1WPA2)
- return "WPA1WPA2";
- if (auth == Ndis802_11AuthModeWPA1PSKWPA2PSK)
- return "WPA1PSKWPA2PSK";
-
- return "UNKNOW";
-}
-
-int SetCommonHT(struct rt_rtmp_adapter *pAd)
-{
- struct rt_oid_set_ht_phymode SetHT;
-
- if (pAd->CommonCfg.PhyMode < PHY_11ABGN_MIXED)
- return FALSE;
-
- SetHT.PhyMode = pAd->CommonCfg.PhyMode;
- SetHT.TransmitNo = ((u8)pAd->Antenna.field.TxPath);
- SetHT.HtMode = (u8)pAd->CommonCfg.RegTransmitSetting.field.HTMODE;
- SetHT.ExtOffset =
- (u8)pAd->CommonCfg.RegTransmitSetting.field.EXTCHA;
- SetHT.MCS = MCS_AUTO;
- SetHT.BW = (u8)pAd->CommonCfg.RegTransmitSetting.field.BW;
- SetHT.STBC = (u8)pAd->CommonCfg.RegTransmitSetting.field.STBC;
- SetHT.SHORTGI = (u8)pAd->CommonCfg.RegTransmitSetting.field.ShortGI;
-
- RTMPSetHT(pAd, &SetHT);
-
- return TRUE;
-}
-
-char *RTMPGetRalinkEncryModeStr(u16 encryMode)
-{
- switch (encryMode) {
- case Ndis802_11WEPDisabled:
- return "NONE";
- case Ndis802_11WEPEnabled:
- return "WEP";
- case Ndis802_11Encryption2Enabled:
- return "TKIP";
- case Ndis802_11Encryption3Enabled:
- return "AES";
- case Ndis802_11Encryption4Enabled:
- return "TKIPAES";
- default:
- return "UNKNOW";
- }
-}
diff --git a/drivers/staging/rt2860/common/cmm_mac_pci.c b/drivers/staging/rt2860/common/cmm_mac_pci.c
deleted file mode 100644
index d06f0a6dc379..000000000000
--- a/drivers/staging/rt2860/common/cmm_mac_pci.c
+++ /dev/null
@@ -1,1661 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-*/
-
-#ifdef RTMP_MAC_PCI
-#include "../rt_config.h"
-
-/*
- ========================================================================
-
- Routine Description:
- Allocate DMA memory blocks for send, receive
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- NDIS_STATUS_SUCCESS
- NDIS_STATUS_FAILURE
- NDIS_STATUS_RESOURCES
-
- IRQL = PASSIVE_LEVEL
-
- Note:
-
- ========================================================================
-*/
-int RTMPAllocTxRxRingMemory(struct rt_rtmp_adapter *pAd)
-{
- int Status = NDIS_STATUS_SUCCESS;
- unsigned long RingBasePaHigh;
- unsigned long RingBasePaLow;
- void *RingBaseVa;
- int index, num;
- struct rt_txd * pTxD;
- struct rt_rxd * pRxD;
- unsigned long ErrorValue = 0;
- struct rt_rtmp_tx_ring *pTxRing;
- struct rt_rtmp_dmabuf *pDmaBuf;
- void *pPacket;
-/* PRTMP_REORDERBUF pReorderBuf; */
-
- DBGPRINT(RT_DEBUG_TRACE, ("--> RTMPAllocTxRxRingMemory\n"));
- do {
- /* */
- /* Allocate all ring descriptors, include TxD, RxD, MgmtD. */
- /* Although each size is different, to prevent cacheline and alignment */
- /* issue, I intentional set them all to 64 bytes. */
- /* */
- for (num = 0; num < NUM_OF_TX_RING; num++) {
- unsigned long BufBasePaHigh;
- unsigned long BufBasePaLow;
- void *BufBaseVa;
-
- /* */
- /* Allocate Tx ring descriptor's memory (5 TX rings = 4 ACs + 1 HCCA) */
- /* */
- pAd->TxDescRing[num].AllocSize =
- TX_RING_SIZE * TXD_SIZE;
- RTMP_AllocateTxDescMemory(pAd, num,
- pAd->TxDescRing[num].
- AllocSize, FALSE,
- &pAd->TxDescRing[num].AllocVa,
- &pAd->TxDescRing[num].
- AllocPa);
-
- if (pAd->TxDescRing[num].AllocVa == NULL) {
- ErrorValue = ERRLOG_OUT_OF_SHARED_MEMORY;
- DBGPRINT_ERR("Failed to allocate a big buffer\n");
- Status = NDIS_STATUS_RESOURCES;
- break;
- }
- /* Zero init this memory block */
- NdisZeroMemory(pAd->TxDescRing[num].AllocVa,
- pAd->TxDescRing[num].AllocSize);
-
- /* Save PA & VA for further operation */
- RingBasePaHigh =
- RTMP_GetPhysicalAddressHigh(pAd->TxDescRing[num].
- AllocPa);
- RingBasePaLow =
- RTMP_GetPhysicalAddressLow(pAd->TxDescRing[num].
- AllocPa);
- RingBaseVa = pAd->TxDescRing[num].AllocVa;
-
- /* */
- /* Allocate all 1st TXBuf's memory for this TxRing */
- /* */
- pAd->TxBufSpace[num].AllocSize =
- TX_RING_SIZE * TX_DMA_1ST_BUFFER_SIZE;
- RTMP_AllocateFirstTxBuffer(pAd, num,
- pAd->TxBufSpace[num].
- AllocSize, FALSE,
- &pAd->TxBufSpace[num].
- AllocVa,
- &pAd->TxBufSpace[num].
- AllocPa);
-
- if (pAd->TxBufSpace[num].AllocVa == NULL) {
- ErrorValue = ERRLOG_OUT_OF_SHARED_MEMORY;
- DBGPRINT_ERR("Failed to allocate a big buffer\n");
- Status = NDIS_STATUS_RESOURCES;
- break;
- }
- /* Zero init this memory block */
- NdisZeroMemory(pAd->TxBufSpace[num].AllocVa,
- pAd->TxBufSpace[num].AllocSize);
-
- /* Save PA & VA for further operation */
- BufBasePaHigh =
- RTMP_GetPhysicalAddressHigh(pAd->TxBufSpace[num].
- AllocPa);
- BufBasePaLow =
- RTMP_GetPhysicalAddressLow(pAd->TxBufSpace[num].
- AllocPa);
- BufBaseVa = pAd->TxBufSpace[num].AllocVa;
-
- /* */
- /* Initialize Tx Ring Descriptor and associated buffer memory */
- /* */
- pTxRing = &pAd->TxRing[num];
- for (index = 0; index < TX_RING_SIZE; index++) {
- pTxRing->Cell[index].pNdisPacket = NULL;
- pTxRing->Cell[index].pNextNdisPacket = NULL;
- /* Init Tx Ring Size, Va, Pa variables */
- pTxRing->Cell[index].AllocSize = TXD_SIZE;
- pTxRing->Cell[index].AllocVa = RingBaseVa;
- RTMP_SetPhysicalAddressHigh(pTxRing->
- Cell[index].AllocPa,
- RingBasePaHigh);
- RTMP_SetPhysicalAddressLow(pTxRing->Cell[index].
- AllocPa,
- RingBasePaLow);
-
- /* Setup Tx Buffer size & address. only 802.11 header will store in this space */
- pDmaBuf = &pTxRing->Cell[index].DmaBuf;
- pDmaBuf->AllocSize = TX_DMA_1ST_BUFFER_SIZE;
- pDmaBuf->AllocVa = BufBaseVa;
- RTMP_SetPhysicalAddressHigh(pDmaBuf->AllocPa,
- BufBasePaHigh);
- RTMP_SetPhysicalAddressLow(pDmaBuf->AllocPa,
- BufBasePaLow);
-
- /* link the pre-allocated TxBuf to TXD */
- pTxD =
- (struct rt_txd *) pTxRing->Cell[index].AllocVa;
- pTxD->SDPtr0 = BufBasePaLow;
- /* advance to next ring descriptor address */
- pTxD->DMADONE = 1;
- RingBasePaLow += TXD_SIZE;
- RingBaseVa = (u8 *)RingBaseVa + TXD_SIZE;
-
- /* advance to next TxBuf address */
- BufBasePaLow += TX_DMA_1ST_BUFFER_SIZE;
- BufBaseVa =
- (u8 *)BufBaseVa + TX_DMA_1ST_BUFFER_SIZE;
- }
- DBGPRINT(RT_DEBUG_TRACE,
- ("TxRing[%d]: total %d entry allocated\n", num,
- index));
- }
- if (Status == NDIS_STATUS_RESOURCES)
- break;
-
- /* */
- /* Allocate MGMT ring descriptor's memory except Tx ring which allocated eariler */
- /* */
- pAd->MgmtDescRing.AllocSize = MGMT_RING_SIZE * TXD_SIZE;
- RTMP_AllocateMgmtDescMemory(pAd,
- pAd->MgmtDescRing.AllocSize,
- FALSE,
- &pAd->MgmtDescRing.AllocVa,
- &pAd->MgmtDescRing.AllocPa);
-
- if (pAd->MgmtDescRing.AllocVa == NULL) {
- ErrorValue = ERRLOG_OUT_OF_SHARED_MEMORY;
- DBGPRINT_ERR("Failed to allocate a big buffer\n");
- Status = NDIS_STATUS_RESOURCES;
- break;
- }
- /* Zero init this memory block */
- NdisZeroMemory(pAd->MgmtDescRing.AllocVa,
- pAd->MgmtDescRing.AllocSize);
-
- /* Save PA & VA for further operation */
- RingBasePaHigh =
- RTMP_GetPhysicalAddressHigh(pAd->MgmtDescRing.AllocPa);
- RingBasePaLow =
- RTMP_GetPhysicalAddressLow(pAd->MgmtDescRing.AllocPa);
- RingBaseVa = pAd->MgmtDescRing.AllocVa;
-
- /* */
- /* Initialize MGMT Ring and associated buffer memory */
- /* */
- for (index = 0; index < MGMT_RING_SIZE; index++) {
- pAd->MgmtRing.Cell[index].pNdisPacket = NULL;
- pAd->MgmtRing.Cell[index].pNextNdisPacket = NULL;
- /* Init MGMT Ring Size, Va, Pa variables */
- pAd->MgmtRing.Cell[index].AllocSize = TXD_SIZE;
- pAd->MgmtRing.Cell[index].AllocVa = RingBaseVa;
- RTMP_SetPhysicalAddressHigh(pAd->MgmtRing.Cell[index].
- AllocPa, RingBasePaHigh);
- RTMP_SetPhysicalAddressLow(pAd->MgmtRing.Cell[index].
- AllocPa, RingBasePaLow);
-
- /* Offset to next ring descriptor address */
- RingBasePaLow += TXD_SIZE;
- RingBaseVa = (u8 *)RingBaseVa + TXD_SIZE;
-
- /* link the pre-allocated TxBuf to TXD */
- pTxD = (struct rt_txd *) pAd->MgmtRing.Cell[index].AllocVa;
- pTxD->DMADONE = 1;
-
- /* no pre-allocated buffer required in MgmtRing for scatter-gather case */
- }
- DBGPRINT(RT_DEBUG_TRACE,
- ("MGMT Ring: total %d entry allocated\n", index));
-
- /* */
- /* Allocate RX ring descriptor's memory except Tx ring which allocated eariler */
- /* */
- pAd->RxDescRing.AllocSize = RX_RING_SIZE * RXD_SIZE;
- RTMP_AllocateRxDescMemory(pAd,
- pAd->RxDescRing.AllocSize,
- FALSE,
- &pAd->RxDescRing.AllocVa,
- &pAd->RxDescRing.AllocPa);
-
- if (pAd->RxDescRing.AllocVa == NULL) {
- ErrorValue = ERRLOG_OUT_OF_SHARED_MEMORY;
- DBGPRINT_ERR("Failed to allocate a big buffer\n");
- Status = NDIS_STATUS_RESOURCES;
- break;
- }
- /* Zero init this memory block */
- NdisZeroMemory(pAd->RxDescRing.AllocVa,
- pAd->RxDescRing.AllocSize);
-
- DBGPRINT(RT_DEBUG_OFF,
- ("RX DESC %p size = %ld\n", pAd->RxDescRing.AllocVa,
- pAd->RxDescRing.AllocSize));
-
- /* Save PA & VA for further operation */
- RingBasePaHigh =
- RTMP_GetPhysicalAddressHigh(pAd->RxDescRing.AllocPa);
- RingBasePaLow =
- RTMP_GetPhysicalAddressLow(pAd->RxDescRing.AllocPa);
- RingBaseVa = pAd->RxDescRing.AllocVa;
-
- /* */
- /* Initialize Rx Ring and associated buffer memory */
- /* */
- for (index = 0; index < RX_RING_SIZE; index++) {
- /* Init RX Ring Size, Va, Pa variables */
- pAd->RxRing.Cell[index].AllocSize = RXD_SIZE;
- pAd->RxRing.Cell[index].AllocVa = RingBaseVa;
- RTMP_SetPhysicalAddressHigh(pAd->RxRing.Cell[index].
- AllocPa, RingBasePaHigh);
- RTMP_SetPhysicalAddressLow(pAd->RxRing.Cell[index].
- AllocPa, RingBasePaLow);
-
- /*NdisZeroMemory(RingBaseVa, RXD_SIZE); */
-
- /* Offset to next ring descriptor address */
- RingBasePaLow += RXD_SIZE;
- RingBaseVa = (u8 *)RingBaseVa + RXD_SIZE;
-
- /* Setup Rx associated Buffer size & allocate share memory */
- pDmaBuf = &pAd->RxRing.Cell[index].DmaBuf;
- pDmaBuf->AllocSize = RX_BUFFER_AGGRESIZE;
- pPacket = RTMP_AllocateRxPacketBuffer(pAd,
- pDmaBuf->
- AllocSize, FALSE,
- &pDmaBuf->AllocVa,
- &pDmaBuf->
- AllocPa);
-
- /* keep allocated rx packet */
- pAd->RxRing.Cell[index].pNdisPacket = pPacket;
-
- /* Error handling */
- if (pDmaBuf->AllocVa == NULL) {
- ErrorValue = ERRLOG_OUT_OF_SHARED_MEMORY;
- DBGPRINT_ERR("Failed to allocate RxRing's 1st buffer\n");
- Status = NDIS_STATUS_RESOURCES;
- break;
- }
- /* Zero init this memory block */
- NdisZeroMemory(pDmaBuf->AllocVa, pDmaBuf->AllocSize);
-
- /* Write RxD buffer address & allocated buffer length */
- pRxD = (struct rt_rxd *) pAd->RxRing.Cell[index].AllocVa;
- pRxD->SDP0 =
- RTMP_GetPhysicalAddressLow(pDmaBuf->AllocPa);
- pRxD->DDONE = 0;
-
- }
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("Rx Ring: total %d entry allocated\n", index));
-
- } while (FALSE);
-
- NdisZeroMemory(&pAd->FragFrame, sizeof(struct rt_fragment_frame));
- pAd->FragFrame.pFragPacket =
- RTMP_AllocateFragPacketBuffer(pAd, RX_BUFFER_NORMSIZE);
-
- if (pAd->FragFrame.pFragPacket == NULL) {
- Status = NDIS_STATUS_RESOURCES;
- }
-
- if (Status != NDIS_STATUS_SUCCESS) {
- /* Log error inforamtion */
- NdisWriteErrorLogEntry(pAd->AdapterHandle,
- NDIS_ERROR_CODE_OUT_OF_RESOURCES,
- 1, ErrorValue);
- }
- /* Following code segment get from original func:NICInitTxRxRingAndBacklogQueue(), now should integrate it to here. */
- {
- DBGPRINT(RT_DEBUG_TRACE,
- ("--> NICInitTxRxRingAndBacklogQueue\n"));
-
-/*
- // Disable DMA.
- RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
- GloCfg.word &= 0xff0;
- GloCfg.field.EnTXWriteBackDDONE =1;
- RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);
-*/
-
- /* Initialize all transmit related software queues */
- for (index = 0; index < NUM_OF_TX_RING; index++) {
- InitializeQueueHeader(&pAd->TxSwQueue[index]);
- /* Init TX rings index pointer */
- pAd->TxRing[index].TxSwFreeIdx = 0;
- pAd->TxRing[index].TxCpuIdx = 0;
- /*RTMP_IO_WRITE32(pAd, (TX_CTX_IDX0 + i * 0x10) , pAd->TxRing[i].TX_CTX_IDX); */
- }
-
- /* Init RX Ring index pointer */
- pAd->RxRing.RxSwReadIdx = 0;
- pAd->RxRing.RxCpuIdx = RX_RING_SIZE - 1;
- /*RTMP_IO_WRITE32(pAd, RX_CRX_IDX, pAd->RxRing.RX_CRX_IDX0); */
-
- /* init MGMT ring index pointer */
- pAd->MgmtRing.TxSwFreeIdx = 0;
- pAd->MgmtRing.TxCpuIdx = 0;
-
- pAd->PrivateInfo.TxRingFullCnt = 0;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("<-- NICInitTxRxRingAndBacklogQueue\n"));
- }
-
- DBGPRINT_S(Status,
- ("<-- RTMPAllocTxRxRingMemory, Status=%x\n", Status));
- return Status;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Reset NIC Asics. Call after rest DMA. So reset TX_CTX_IDX to zero.
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- Note:
- Reset NIC to initial state AS IS system boot up time.
-
- ========================================================================
-*/
-void RTMPRingCleanUp(struct rt_rtmp_adapter *pAd, u8 RingType)
-{
- struct rt_txd * pTxD;
- struct rt_rxd * pRxD;
- struct rt_queue_entry *pEntry;
- void *pPacket;
- int i;
- struct rt_rtmp_tx_ring *pTxRing;
- unsigned long IrqFlags;
- /*u32 RxSwReadIdx; */
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("RTMPRingCleanUp(RingIdx=%d, Pending-NDIS=%ld)\n", RingType,
- pAd->RalinkCounters.PendingNdisPacketCount));
- switch (RingType) {
- case QID_AC_BK:
- case QID_AC_BE:
- case QID_AC_VI:
- case QID_AC_VO:
-
- pTxRing = &pAd->TxRing[RingType];
-
- RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);
- /* We have to clean all descriptors in case some error happened with reset */
- for (i = 0; i < TX_RING_SIZE; i++) /* We have to scan all TX ring */
- {
- pTxD = (struct rt_txd *) pTxRing->Cell[i].AllocVa;
-
- pPacket = (void *)pTxRing->Cell[i].pNdisPacket;
- /* release scatter-and-gather char */
- if (pPacket) {
- RELEASE_NDIS_PACKET(pAd, pPacket,
- NDIS_STATUS_FAILURE);
- pTxRing->Cell[i].pNdisPacket = NULL;
- }
-
- pPacket =
- (void *)pTxRing->Cell[i].pNextNdisPacket;
- /* release scatter-and-gather char */
- if (pPacket) {
- RELEASE_NDIS_PACKET(pAd, pPacket,
- NDIS_STATUS_FAILURE);
- pTxRing->Cell[i].pNextNdisPacket = NULL;
- }
- }
-
- RTMP_IO_READ32(pAd, TX_DTX_IDX0 + RingType * 0x10,
- &pTxRing->TxDmaIdx);
- pTxRing->TxSwFreeIdx = pTxRing->TxDmaIdx;
- pTxRing->TxCpuIdx = pTxRing->TxDmaIdx;
- RTMP_IO_WRITE32(pAd, TX_CTX_IDX0 + RingType * 0x10,
- pTxRing->TxCpuIdx);
-
- RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);
-
- RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);
- while (pAd->TxSwQueue[RingType].Head != NULL) {
- pEntry = RemoveHeadQueue(&pAd->TxSwQueue[RingType]);
- pPacket = QUEUE_ENTRY_TO_PACKET(pEntry);
- RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
- DBGPRINT(RT_DEBUG_TRACE,
- ("Release 1 NDIS packet from s/w backlog queue\n"));
- }
- RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);
- break;
-
- case QID_MGMT:
- /* We have to clean all descriptors in case some error happened with reset */
- NdisAcquireSpinLock(&pAd->MgmtRingLock);
-
- for (i = 0; i < MGMT_RING_SIZE; i++) {
- pTxD = (struct rt_txd *) pAd->MgmtRing.Cell[i].AllocVa;
-
- pPacket =
- (void *)pAd->MgmtRing.Cell[i].pNdisPacket;
- /* rlease scatter-and-gather char */
- if (pPacket) {
- PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr0,
- pTxD->SDLen0,
- PCI_DMA_TODEVICE);
- RELEASE_NDIS_PACKET(pAd, pPacket,
- NDIS_STATUS_FAILURE);
- }
- pAd->MgmtRing.Cell[i].pNdisPacket = NULL;
-
- pPacket =
- (void *)pAd->MgmtRing.Cell[i].
- pNextNdisPacket;
- /* release scatter-and-gather char */
- if (pPacket) {
- PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1,
- pTxD->SDLen1,
- PCI_DMA_TODEVICE);
- RELEASE_NDIS_PACKET(pAd, pPacket,
- NDIS_STATUS_FAILURE);
- }
- pAd->MgmtRing.Cell[i].pNextNdisPacket = NULL;
-
- }
-
- RTMP_IO_READ32(pAd, TX_MGMTDTX_IDX, &pAd->MgmtRing.TxDmaIdx);
- pAd->MgmtRing.TxSwFreeIdx = pAd->MgmtRing.TxDmaIdx;
- pAd->MgmtRing.TxCpuIdx = pAd->MgmtRing.TxDmaIdx;
- RTMP_IO_WRITE32(pAd, TX_MGMTCTX_IDX, pAd->MgmtRing.TxCpuIdx);
-
- NdisReleaseSpinLock(&pAd->MgmtRingLock);
- pAd->RalinkCounters.MgmtRingFullCount = 0;
- break;
-
- case QID_RX:
- /* We have to clean all descriptors in case some error happened with reset */
- NdisAcquireSpinLock(&pAd->RxRingLock);
-
- for (i = 0; i < RX_RING_SIZE; i++) {
- pRxD = (struct rt_rxd *) pAd->RxRing.Cell[i].AllocVa;
- pRxD->DDONE = 0;
- }
-
- RTMP_IO_READ32(pAd, RX_DRX_IDX, &pAd->RxRing.RxDmaIdx);
- pAd->RxRing.RxSwReadIdx = pAd->RxRing.RxDmaIdx;
- pAd->RxRing.RxCpuIdx =
- ((pAd->RxRing.RxDmaIdx ==
- 0) ? (RX_RING_SIZE - 1) : (pAd->RxRing.RxDmaIdx - 1));
- RTMP_IO_WRITE32(pAd, RX_CRX_IDX, pAd->RxRing.RxCpuIdx);
-
- NdisReleaseSpinLock(&pAd->RxRingLock);
- break;
-
- default:
- break;
- }
-}
-
-void RTMPFreeTxRxRingMemory(struct rt_rtmp_adapter *pAd)
-{
- int index, num, j;
- struct rt_rtmp_tx_ring *pTxRing;
- struct rt_txd * pTxD;
- void *pPacket;
- unsigned int IrqFlags;
-
- /*struct os_cookie *pObj =(struct os_cookie *)pAd->OS_Cookie; */
-
- DBGPRINT(RT_DEBUG_TRACE, ("--> RTMPFreeTxRxRingMemory\n"));
-
- /* Free TxSwQueue Packet */
- for (index = 0; index < NUM_OF_TX_RING; index++) {
- struct rt_queue_entry *pEntry;
- void *pPacket;
- struct rt_queue_header *pQueue;
-
- RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);
- pQueue = &pAd->TxSwQueue[index];
- while (pQueue->Head) {
- pEntry = RemoveHeadQueue(pQueue);
- pPacket = QUEUE_ENTRY_TO_PACKET(pEntry);
- RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
- }
- RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);
- }
-
- /* Free Tx Ring Packet */
- for (index = 0; index < NUM_OF_TX_RING; index++) {
- pTxRing = &pAd->TxRing[index];
-
- for (j = 0; j < TX_RING_SIZE; j++) {
- pTxD = (struct rt_txd *) (pTxRing->Cell[j].AllocVa);
- pPacket = pTxRing->Cell[j].pNdisPacket;
-
- if (pPacket) {
- PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr0,
- pTxD->SDLen0,
- PCI_DMA_TODEVICE);
- RELEASE_NDIS_PACKET(pAd, pPacket,
- NDIS_STATUS_SUCCESS);
- }
- /*Always assign pNdisPacket as NULL after clear */
- pTxRing->Cell[j].pNdisPacket = NULL;
-
- pPacket = pTxRing->Cell[j].pNextNdisPacket;
-
- if (pPacket) {
- PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1,
- pTxD->SDLen1,
- PCI_DMA_TODEVICE);
- RELEASE_NDIS_PACKET(pAd, pPacket,
- NDIS_STATUS_SUCCESS);
- }
- /*Always assign pNextNdisPacket as NULL after clear */
- pTxRing->Cell[pTxRing->TxSwFreeIdx].pNextNdisPacket =
- NULL;
-
- }
- }
-
- for (index = RX_RING_SIZE - 1; index >= 0; index--) {
- if ((pAd->RxRing.Cell[index].DmaBuf.AllocVa)
- && (pAd->RxRing.Cell[index].pNdisPacket)) {
- PCI_UNMAP_SINGLE(pAd,
- pAd->RxRing.Cell[index].DmaBuf.AllocPa,
- pAd->RxRing.Cell[index].DmaBuf.
- AllocSize, PCI_DMA_FROMDEVICE);
- RELEASE_NDIS_PACKET(pAd,
- pAd->RxRing.Cell[index].pNdisPacket,
- NDIS_STATUS_SUCCESS);
- }
- }
- NdisZeroMemory(pAd->RxRing.Cell, RX_RING_SIZE * sizeof(struct rt_rtmp_dmacb));
-
- if (pAd->RxDescRing.AllocVa) {
- RTMP_FreeDescMemory(pAd, pAd->RxDescRing.AllocSize,
- pAd->RxDescRing.AllocVa,
- pAd->RxDescRing.AllocPa);
- }
- NdisZeroMemory(&pAd->RxDescRing, sizeof(struct rt_rtmp_dmabuf));
-
- if (pAd->MgmtDescRing.AllocVa) {
- RTMP_FreeDescMemory(pAd, pAd->MgmtDescRing.AllocSize,
- pAd->MgmtDescRing.AllocVa,
- pAd->MgmtDescRing.AllocPa);
- }
- NdisZeroMemory(&pAd->MgmtDescRing, sizeof(struct rt_rtmp_dmabuf));
-
- for (num = 0; num < NUM_OF_TX_RING; num++) {
- if (pAd->TxBufSpace[num].AllocVa) {
- RTMP_FreeFirstTxBuffer(pAd,
- pAd->TxBufSpace[num].AllocSize,
- FALSE,
- pAd->TxBufSpace[num].AllocVa,
- pAd->TxBufSpace[num].AllocPa);
- }
- NdisZeroMemory(&pAd->TxBufSpace[num], sizeof(struct rt_rtmp_dmabuf));
-
- if (pAd->TxDescRing[num].AllocVa) {
- RTMP_FreeDescMemory(pAd, pAd->TxDescRing[num].AllocSize,
- pAd->TxDescRing[num].AllocVa,
- pAd->TxDescRing[num].AllocPa);
- }
- NdisZeroMemory(&pAd->TxDescRing[num], sizeof(struct rt_rtmp_dmabuf));
- }
-
- if (pAd->FragFrame.pFragPacket)
- RELEASE_NDIS_PACKET(pAd, pAd->FragFrame.pFragPacket,
- NDIS_STATUS_SUCCESS);
-
- DBGPRINT(RT_DEBUG_TRACE, ("<-- RTMPFreeTxRxRingMemory\n"));
-}
-
-/***************************************************************************
- *
- * register related procedures.
- *
- **************************************************************************/
-/*
-========================================================================
-Routine Description:
- Disable DMA.
-
-Arguments:
- *pAd the raxx interface data pointer
-
-Return Value:
- None
-
-Note:
-========================================================================
-*/
-void RT28XXDMADisable(struct rt_rtmp_adapter *pAd)
-{
- WPDMA_GLO_CFG_STRUC GloCfg;
-
- RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
- GloCfg.word &= 0xff0;
- GloCfg.field.EnTXWriteBackDDONE = 1;
- RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);
-}
-
-/*
-========================================================================
-Routine Description:
- Enable DMA.
-
-Arguments:
- *pAd the raxx interface data pointer
-
-Return Value:
- None
-
-Note:
-========================================================================
-*/
-void RT28XXDMAEnable(struct rt_rtmp_adapter *pAd)
-{
- WPDMA_GLO_CFG_STRUC GloCfg;
- int i = 0;
-
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x4);
- do {
- RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
- if ((GloCfg.field.TxDMABusy == 0)
- && (GloCfg.field.RxDMABusy == 0))
- break;
-
- DBGPRINT(RT_DEBUG_TRACE, ("==> DMABusy\n"));
- RTMPusecDelay(1000);
- i++;
- } while (i < 200);
-
- RTMPusecDelay(50);
-
- GloCfg.field.EnTXWriteBackDDONE = 1;
- GloCfg.field.WPDMABurstSIZE = 2;
- GloCfg.field.EnableRxDMA = 1;
- GloCfg.field.EnableTxDMA = 1;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("<== WRITE DMA offset 0x208 = 0x%x\n", GloCfg.word));
- RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);
-
-}
-
-BOOLEAN AsicCheckCommanOk(struct rt_rtmp_adapter *pAd, u8 Command)
-{
- u32 CmdStatus = 0, CID = 0, i;
- u32 ThisCIDMask = 0;
-
- i = 0;
- do {
- RTMP_IO_READ32(pAd, H2M_MAILBOX_CID, &CID);
- /* Find where the command is. Because this is randomly specified by firmware. */
- if ((CID & CID0MASK) == Command) {
- ThisCIDMask = CID0MASK;
- break;
- } else if ((((CID & CID1MASK) >> 8) & 0xff) == Command) {
- ThisCIDMask = CID1MASK;
- break;
- } else if ((((CID & CID2MASK) >> 16) & 0xff) == Command) {
- ThisCIDMask = CID2MASK;
- break;
- } else if ((((CID & CID3MASK) >> 24) & 0xff) == Command) {
- ThisCIDMask = CID3MASK;
- break;
- }
-
- RTMPusecDelay(100);
- i++;
- } while (i < 200);
-
- /* Get CommandStatus Value */
- RTMP_IO_READ32(pAd, H2M_MAILBOX_STATUS, &CmdStatus);
-
- /* This command's status is at the same position as command. So AND command position's bitmask to read status. */
- if (i < 200) {
- /* If Status is 1, the command is success. */
- if (((CmdStatus & ThisCIDMask) == 0x1)
- || ((CmdStatus & ThisCIDMask) == 0x100)
- || ((CmdStatus & ThisCIDMask) == 0x10000)
- || ((CmdStatus & ThisCIDMask) == 0x1000000)) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("--> AsicCheckCommanOk CID = 0x%x, CmdStatus= 0x%x \n",
- CID, CmdStatus));
- RTMP_IO_WRITE32(pAd, H2M_MAILBOX_STATUS, 0xffffffff);
- RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CID, 0xffffffff);
- return TRUE;
- }
- DBGPRINT(RT_DEBUG_TRACE,
- ("--> AsicCheckCommanFail1 CID = 0x%x, CmdStatus= 0x%x \n",
- CID, CmdStatus));
- } else {
- DBGPRINT(RT_DEBUG_TRACE,
- ("--> AsicCheckCommanFail2 Timeout Command = %d, CmdStatus= 0x%x \n",
- Command, CmdStatus));
- }
- /* Clear Command and Status. */
- RTMP_IO_WRITE32(pAd, H2M_MAILBOX_STATUS, 0xffffffff);
- RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CID, 0xffffffff);
-
- return FALSE;
-}
-
-/*
-========================================================================
-Routine Description:
- Write Beacon buffer to Asic.
-
-Arguments:
- *pAd the raxx interface data pointer
-
-Return Value:
- None
-
-Note:
-========================================================================
-*/
-void RT28xx_UpdateBeaconToAsic(struct rt_rtmp_adapter *pAd,
- int apidx,
- unsigned long FrameLen, unsigned long UpdatePos)
-{
- unsigned long CapInfoPos = 0;
- u8 *ptr, *ptr_update, *ptr_capinfo;
- u32 i;
- BOOLEAN bBcnReq = FALSE;
- u8 bcn_idx = 0;
-
- {
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s() : No valid Interface be found.\n", __func__));
- return;
- }
-
- /*if ((pAd->WdsTab.Mode == WDS_BRIDGE_MODE) */
- /* || ((pAd->ApCfg.MBSSID[apidx].MSSIDDev == NULL) */
- /* || !(pAd->ApCfg.MBSSID[apidx].MSSIDDev->flags & IFF_UP)) */
- /* ) */
- if (bBcnReq == FALSE) {
- /* when the ra interface is down, do not send its beacon frame */
- /* clear all zero */
- for (i = 0; i < TXWI_SIZE; i += 4)
- RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[bcn_idx] + i,
- 0x00);
- } else {
- ptr = (u8 *)& pAd->BeaconTxWI;
- for (i = 0; i < TXWI_SIZE; i += 4) /* 16-byte TXWI field */
- {
- u32 longptr =
- *ptr + (*(ptr + 1) << 8) + (*(ptr + 2) << 16) +
- (*(ptr + 3) << 24);
- RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[bcn_idx] + i,
- longptr);
- ptr += 4;
- }
-
- /* Update CapabilityInfo in Beacon */
- for (i = CapInfoPos; i < (CapInfoPos + 2); i++) {
- RTMP_IO_WRITE8(pAd,
- pAd->BeaconOffset[bcn_idx] + TXWI_SIZE +
- i, *ptr_capinfo);
- ptr_capinfo++;
- }
-
- if (FrameLen > UpdatePos) {
- for (i = UpdatePos; i < (FrameLen); i++) {
- RTMP_IO_WRITE8(pAd,
- pAd->BeaconOffset[bcn_idx] +
- TXWI_SIZE + i, *ptr_update);
- ptr_update++;
- }
- }
-
- }
-
-}
-
-void RT28xxPciStaAsicForceWakeup(struct rt_rtmp_adapter *pAd, IN BOOLEAN bFromTx)
-{
- AUTO_WAKEUP_STRUC AutoWakeupCfg;
-
- if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
- return;
-
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WAKEUP_NOW)) {
- DBGPRINT(RT_DEBUG_TRACE, ("waking up now!\n"));
- return;
- }
-
- OPSTATUS_SET_FLAG(pAd, fOP_STATUS_WAKEUP_NOW);
-
- RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_GO_TO_SLEEP_NOW);
-
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)
- && pAd->StaCfg.PSControl.field.EnableNewPS == TRUE) {
- /* Support PCIe Advance Power Save */
- if (bFromTx == TRUE && (pAd->Mlme.bPsPollTimerRunning == TRUE)) {
- pAd->Mlme.bPsPollTimerRunning = FALSE;
- RTMPPCIeLinkCtrlValueRestore(pAd, RESTORE_WAKEUP);
- RTMPusecDelay(3000);
- DBGPRINT(RT_DEBUG_TRACE,
- ("=======AsicForceWakeup===bFromTx\n"));
- }
-
- AutoWakeupCfg.word = 0;
- RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);
-
- if (RT28xxPciAsicRadioOn(pAd, DOT11POWERSAVE)) {
-#ifdef PCIE_PS_SUPPORT
- /* add by johnli, RF power sequence setup, load RF normal operation-mode setup */
- if ((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))
- && IS_VERSION_AFTER_F(pAd)) {
- struct rt_rtmp_chip_op *pChipOps = &pAd->chipOps;
-
- if (pChipOps->AsicReverseRfFromSleepMode)
- pChipOps->
- AsicReverseRfFromSleepMode(pAd);
- } else
-#endif /* PCIE_PS_SUPPORT // */
- {
- /* end johnli */
- /* In Radio Off, we turn off RF clk, So now need to call ASICSwitchChannel again. */
- if (INFRA_ON(pAd)
- && (pAd->CommonCfg.CentralChannel !=
- pAd->CommonCfg.Channel)
- && (pAd->MlmeAux.HtCapability.HtCapInfo.
- ChannelWidth == BW_40)) {
- /* Must using 40MHz. */
- AsicSwitchChannel(pAd,
- pAd->CommonCfg.
- CentralChannel,
- FALSE);
- AsicLockChannel(pAd,
- pAd->CommonCfg.
- CentralChannel);
- } else {
- /* Must using 20MHz. */
- AsicSwitchChannel(pAd,
- pAd->CommonCfg.
- Channel, FALSE);
- AsicLockChannel(pAd,
- pAd->CommonCfg.Channel);
- }
- }
- }
-#ifdef PCIE_PS_SUPPORT
- /* 3090 MCU Wakeup command needs more time to be stable. */
- /* Before stable, don't issue other MCU command to prevent from firmware error. */
- if (((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))
- && IS_VERSION_AFTER_F(pAd)) && IS_VERSION_AFTER_F(pAd)
- && (pAd->StaCfg.PSControl.field.rt30xxPowerMode == 3)
- && (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE)) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("<==RT28xxPciStaAsicForceWakeup::Release the MCU Lock(3090)\n"));
- RTMP_SEM_LOCK(&pAd->McuCmdLock);
- pAd->brt30xxBanMcuCmd = FALSE;
- RTMP_SEM_UNLOCK(&pAd->McuCmdLock);
- }
-#endif /* PCIE_PS_SUPPORT // */
- } else {
- /* PCI, 2860-PCIe */
- DBGPRINT(RT_DEBUG_TRACE,
- ("<==RT28xxPciStaAsicForceWakeup::Original PCI Power Saving\n"));
- AsicSendCommandToMcu(pAd, 0x31, 0xff, 0x00, 0x02);
- AutoWakeupCfg.word = 0;
- RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);
- }
-
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_WAKEUP_NOW);
- DBGPRINT(RT_DEBUG_TRACE, ("<=======RT28xxPciStaAsicForceWakeup\n"));
-}
-
-void RT28xxPciStaAsicSleepThenAutoWakeup(struct rt_rtmp_adapter *pAd,
- u16 TbttNumToNextWakeUp)
-{
- BOOLEAN brc;
-
- if (pAd->StaCfg.bRadio == FALSE) {
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
- return;
- }
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)
- && pAd->StaCfg.PSControl.field.EnableNewPS == TRUE) {
- unsigned long Now = 0;
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WAKEUP_NOW)) {
- DBGPRINT(RT_DEBUG_TRACE, ("waking up now!\n"));
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
- return;
- }
-
- NdisGetSystemUpTime(&Now);
- /* If last send NULL fram time is too close to this receiving beacon (within 8ms), don't go to sleep for this DTM. */
- /* Because Some AP can't queuing outgoing frames immediately. */
- if (((pAd->Mlme.LastSendNULLpsmTime + 8) >= Now)
- && (pAd->Mlme.LastSendNULLpsmTime <= Now)) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("Now = %lu, LastSendNULLpsmTime=%lu : RxCountSinceLastNULL = %lu. \n",
- Now, pAd->Mlme.LastSendNULLpsmTime,
- pAd->RalinkCounters.RxCountSinceLastNULL));
- return;
- } else if ((pAd->RalinkCounters.RxCountSinceLastNULL > 0)
- &&
- ((pAd->Mlme.LastSendNULLpsmTime +
- pAd->CommonCfg.BeaconPeriod) >= Now)) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("Now = %lu, LastSendNULLpsmTime=%lu: RxCountSinceLastNULL = %lu > 0 \n",
- Now, pAd->Mlme.LastSendNULLpsmTime,
- pAd->RalinkCounters.RxCountSinceLastNULL));
- return;
- }
-
- brc =
- RT28xxPciAsicRadioOff(pAd, DOT11POWERSAVE,
- TbttNumToNextWakeUp);
- if (brc == TRUE)
- OPSTATUS_SET_FLAG(pAd, fOP_STATUS_DOZE);
- } else {
- AUTO_WAKEUP_STRUC AutoWakeupCfg;
- /* we have decided to SLEEP, so at least do it for a BEACON period. */
- if (TbttNumToNextWakeUp == 0)
- TbttNumToNextWakeUp = 1;
-
- /*RTMP_IO_WRITE32(pAd, INT_MASK_CSR, AutoWakeupInt); */
-
- AutoWakeupCfg.word = 0;
- RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);
- AutoWakeupCfg.field.NumofSleepingTbtt = TbttNumToNextWakeUp - 1;
- AutoWakeupCfg.field.EnableAutoWakeup = 1;
- AutoWakeupCfg.field.AutoLeadTime = 5;
- RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);
- AsicSendCommandToMcu(pAd, 0x30, 0xff, 0xff, 0x00); /* send POWER-SAVE command to MCU. Timeout 40us. */
- OPSTATUS_SET_FLAG(pAd, fOP_STATUS_DOZE);
- DBGPRINT(RT_DEBUG_TRACE,
- ("<-- %s, TbttNumToNextWakeUp=%d \n", __func__,
- TbttNumToNextWakeUp));
- }
-
-}
-
-void PsPollWakeExec(void *SystemSpecific1,
- void *FunctionContext,
- void *SystemSpecific2, void *SystemSpecific3)
-{
- struct rt_rtmp_adapter *pAd = (struct rt_rtmp_adapter *)FunctionContext;
- unsigned long flags;
-
- DBGPRINT(RT_DEBUG_TRACE, ("-->PsPollWakeExec \n"));
- RTMP_INT_LOCK(&pAd->irq_lock, flags);
- if (pAd->Mlme.bPsPollTimerRunning) {
- RTMPPCIeLinkCtrlValueRestore(pAd, RESTORE_WAKEUP);
- }
- pAd->Mlme.bPsPollTimerRunning = FALSE;
- RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
-#ifdef PCIE_PS_SUPPORT
- /* For rt30xx power solution 3, Use software timer to wake up in psm. So call */
- /* AsicForceWakeup here instead of handling twakeup interrupt. */
- if (((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))
- && IS_VERSION_AFTER_F(pAd))
- && (pAd->StaCfg.PSControl.field.rt30xxPowerMode == 3)
- && (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE)) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("<--PsPollWakeExec::3090 calls AsicForceWakeup(pAd, DOT11POWERSAVE) in advance \n"));
- AsicForceWakeup(pAd, DOT11POWERSAVE);
- }
-#endif /* PCIE_PS_SUPPORT // */
-}
-
-void RadioOnExec(void *SystemSpecific1,
- void *FunctionContext,
- void *SystemSpecific2, void *SystemSpecific3)
-{
- struct rt_rtmp_adapter *pAd = (struct rt_rtmp_adapter *)FunctionContext;
- struct rt_rtmp_chip_op *pChipOps = &pAd->chipOps;
- WPDMA_GLO_CFG_STRUC DmaCfg;
- BOOLEAN Cancelled;
-
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("-->RadioOnExec() return on fOP_STATUS_DOZE == TRUE; \n"));
-/*KH Debug: Add the compile flag "RT2860 and condition */
-#ifdef RTMP_PCI_SUPPORT
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)
- && pAd->StaCfg.PSControl.field.EnableNewPS == TRUE)
- RTMPSetTimer(&pAd->Mlme.RadioOnOffTimer, 10);
-#endif /* RTMP_PCI_SUPPORT // */
- return;
- }
-
- if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("-->RadioOnExec() return on SCAN_IN_PROGRESS; \n"));
-#ifdef RTMP_PCI_SUPPORT
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)
- && pAd->StaCfg.PSControl.field.EnableNewPS == TRUE)
- RTMPSetTimer(&pAd->Mlme.RadioOnOffTimer, 10);
-#endif /* RTMP_PCI_SUPPORT // */
- return;
- }
-/*KH Debug: need to check. I add the compile flag "CONFIG_STA_SUPPORT" to enclose the following codes. */
-#ifdef RTMP_PCI_SUPPORT
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)
- && pAd->StaCfg.PSControl.field.EnableNewPS == TRUE) {
- pAd->Mlme.bPsPollTimerRunning = FALSE;
- RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled);
- }
-#endif /* RTMP_PCI_SUPPORT // */
- if (pAd->StaCfg.bRadio == TRUE) {
- pAd->bPCIclkOff = FALSE;
- RTMPRingCleanUp(pAd, QID_AC_BK);
- RTMPRingCleanUp(pAd, QID_AC_BE);
- RTMPRingCleanUp(pAd, QID_AC_VI);
- RTMPRingCleanUp(pAd, QID_AC_VO);
- RTMPRingCleanUp(pAd, QID_MGMT);
- RTMPRingCleanUp(pAd, QID_RX);
-
- /* 2. Send wake up command. */
- AsicSendCommandToMcu(pAd, 0x31, PowerWakeCID, 0x00, 0x02);
- /* 2-1. wait command ok. */
- AsicCheckCommanOk(pAd, PowerWakeCID);
-
- /* When PCI clock is off, don't want to service interrupt. So when back to clock on, enable interrupt. */
- /*RTMP_IO_WRITE32(pAd, INT_MASK_CSR, (DELAYINTMASK|RxINT)); */
- RTMP_ASIC_INTERRUPT_ENABLE(pAd);
-
- /* 3. Enable Tx DMA. */
- RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &DmaCfg.word);
- DmaCfg.field.EnableTxDMA = 1;
- RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, DmaCfg.word);
-
- /* In Radio Off, we turn off RF clk, So now need to call ASICSwitchChannel again. */
- if (INFRA_ON(pAd)
- && (pAd->CommonCfg.CentralChannel != pAd->CommonCfg.Channel)
- && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth ==
- BW_40)) {
- /* Must using 40MHz. */
- AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel,
- FALSE);
- AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
- } else {
- /* Must using 20MHz. */
- AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
- AsicLockChannel(pAd, pAd->CommonCfg.Channel);
- }
-
-/*KH Debug:The following codes should be enclosed by RT3090 compile flag */
- if (pChipOps->AsicReverseRfFromSleepMode)
- pChipOps->AsicReverseRfFromSleepMode(pAd);
-
-#ifdef PCIE_PS_SUPPORT
-/* 3090 MCU Wakeup command needs more time to be stable. */
-/* Before stable, don't issue other MCU command to prevent from firmware error. */
- if ((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))
- && IS_VERSION_AFTER_F(pAd)
- && (pAd->StaCfg.PSControl.field.rt30xxPowerMode == 3)
- && (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE)) {
- RTMP_SEM_LOCK(&pAd->McuCmdLock);
- pAd->brt30xxBanMcuCmd = FALSE;
- RTMP_SEM_UNLOCK(&pAd->McuCmdLock);
- }
-#endif /* PCIE_PS_SUPPORT // */
-
- /* Clear Radio off flag */
- RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
-
- /* Set LED */
- RTMPSetLED(pAd, LED_RADIO_ON);
-
- if (pAd->StaCfg.Psm == PWR_ACTIVE) {
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3,
- pAd->StaCfg.BBPR3);
- }
- } else {
- RT28xxPciAsicRadioOff(pAd, GUIRADIO_OFF, 0);
- }
-}
-
-/*
- ==========================================================================
- Description:
- This routine sends command to firmware and turn our chip to wake up mode from power save mode.
- Both RadioOn and .11 power save function needs to call this routine.
- Input:
- Level = GUIRADIO_OFF : call this function is from Radio Off to Radio On. Need to restore PCI host value.
- Level = other value : normal wake up function.
-
- ==========================================================================
- */
-BOOLEAN RT28xxPciAsicRadioOn(struct rt_rtmp_adapter *pAd, u8 Level)
-{
- /*WPDMA_GLO_CFG_STRUC DmaCfg; */
- BOOLEAN Cancelled;
- /*u32 MACValue; */
-
- if (pAd->OpMode == OPMODE_AP && Level == DOT11POWERSAVE)
- return FALSE;
-
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)) {
- if (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE) {
- pAd->Mlme.bPsPollTimerRunning = FALSE;
- RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled);
- }
- if ((pAd->StaCfg.PSControl.field.EnableNewPS == TRUE &&
- (Level == GUIRADIO_OFF || Level == GUI_IDLE_POWER_SAVE)) ||
- RTMP_TEST_PSFLAG(pAd, fRTMP_PS_SET_PCI_CLK_OFF_COMMAND)) {
- /* Some chips don't need to delay 6ms, so copy RTMPPCIePowerLinkCtrlRestore */
- /* return condition here. */
- /*
- if (((pAd->MACVersion&0xffff0000) != 0x28600000)
- && ((pAd->DeviceID == NIC2860_PCIe_DEVICE_ID)
- ||(pAd->DeviceID == NIC2790_PCIe_DEVICE_ID)))
- */
- {
- DBGPRINT(RT_DEBUG_TRACE,
- ("RT28xxPciAsicRadioOn ()\n"));
- /* 1. Set PCI Link Control in Configuration Space. */
- RTMPPCIeLinkCtrlValueRestore(pAd,
- RESTORE_WAKEUP);
- RTMPusecDelay(6000);
- }
- }
- }
-#ifdef PCIE_PS_SUPPORT
- if (!
- (((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))
- && IS_VERSION_AFTER_F(pAd)
- && (pAd->StaCfg.PSControl.field.rt30xxPowerMode == 3)
- && (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE))))
-#endif /* PCIE_PS_SUPPORT // */
- {
- pAd->bPCIclkOff = FALSE;
- DBGPRINT(RT_DEBUG_TRACE,
- ("PSM :309xbPCIclkOff == %d\n", pAd->bPCIclkOff));
- }
- /* 2. Send wake up command. */
- AsicSendCommandToMcu(pAd, 0x31, PowerWakeCID, 0x00, 0x02);
- pAd->bPCIclkOff = FALSE;
- /* 2-1. wait command ok. */
- AsicCheckCommanOk(pAd, PowerWakeCID);
- RTMP_ASIC_INTERRUPT_ENABLE(pAd);
-
- RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF);
- if (Level == GUI_IDLE_POWER_SAVE) {
-#ifdef PCIE_PS_SUPPORT
-
- /* add by johnli, RF power sequence setup, load RF normal operation-mode setup */
- if ((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))) {
- struct rt_rtmp_chip_op *pChipOps = &pAd->chipOps;
-
- if (pChipOps->AsicReverseRfFromSleepMode)
- pChipOps->AsicReverseRfFromSleepMode(pAd);
- /* 3090 MCU Wakeup command needs more time to be stable. */
- /* Before stable, don't issue other MCU command to prevent from firmware error. */
- if ((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))
- && IS_VERSION_AFTER_F(pAd)
- && (pAd->StaCfg.PSControl.field.rt30xxPowerMode ==
- 3)
- && (pAd->StaCfg.PSControl.field.EnableNewPS ==
- TRUE)) {
- RTMP_SEM_LOCK(&pAd->McuCmdLock);
- pAd->brt30xxBanMcuCmd = FALSE;
- RTMP_SEM_UNLOCK(&pAd->McuCmdLock);
- }
- } else
- /* end johnli */
-#endif /* PCIE_PS_SUPPORT // */
- {
- /* In Radio Off, we turn off RF clk, So now need to call ASICSwitchChannel again. */
- {
- if (INFRA_ON(pAd)
- && (pAd->CommonCfg.CentralChannel !=
- pAd->CommonCfg.Channel)
- && (pAd->MlmeAux.HtCapability.HtCapInfo.
- ChannelWidth == BW_40)) {
- /* Must using 40MHz. */
- AsicSwitchChannel(pAd,
- pAd->CommonCfg.
- CentralChannel,
- FALSE);
- AsicLockChannel(pAd,
- pAd->CommonCfg.
- CentralChannel);
- } else {
- /* Must using 20MHz. */
- AsicSwitchChannel(pAd,
- pAd->CommonCfg.
- Channel, FALSE);
- AsicLockChannel(pAd,
- pAd->CommonCfg.Channel);
- }
- }
-
- }
- }
- return TRUE;
-
-}
-
-/*
- ==========================================================================
- Description:
- This routine sends command to firmware and turn our chip to power save mode.
- Both RadioOff and .11 power save function needs to call this routine.
- Input:
- Level = GUIRADIO_OFF : GUI Radio Off mode
- Level = DOT11POWERSAVE : 802.11 power save mode
- Level = RTMP_HALT : When Disable device.
-
- ==========================================================================
- */
-BOOLEAN RT28xxPciAsicRadioOff(struct rt_rtmp_adapter *pAd,
- u8 Level, u16 TbttNumToNextWakeUp)
-{
- WPDMA_GLO_CFG_STRUC DmaCfg;
- u8 i, tempBBP_R3 = 0;
- BOOLEAN brc = FALSE, Cancelled;
- u32 TbTTTime = 0;
- u32 PsPollTime = 0 /*, MACValue */ ;
- unsigned long BeaconPeriodTime;
- u32 RxDmaIdx, RxCpuIdx;
- DBGPRINT(RT_DEBUG_TRACE,
- ("AsicRadioOff ===> Lv= %d, TxCpuIdx = %d, TxDmaIdx = %d. RxCpuIdx = %d, RxDmaIdx = %d.\n",
- Level, pAd->TxRing[0].TxCpuIdx, pAd->TxRing[0].TxDmaIdx,
- pAd->RxRing.RxCpuIdx, pAd->RxRing.RxDmaIdx));
-
- if (pAd->OpMode == OPMODE_AP && Level == DOT11POWERSAVE)
- return FALSE;
-
- /* Check Rx DMA busy status, if more than half is occupied, give up this radio off. */
- RTMP_IO_READ32(pAd, RX_DRX_IDX, &RxDmaIdx);
- RTMP_IO_READ32(pAd, RX_CRX_IDX, &RxCpuIdx);
- if ((RxDmaIdx > RxCpuIdx) && ((RxDmaIdx - RxCpuIdx) > RX_RING_SIZE / 3)) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("AsicRadioOff ===> return1. RxDmaIdx = %d , RxCpuIdx = %d. \n",
- RxDmaIdx, RxCpuIdx));
- return FALSE;
- } else if ((RxCpuIdx >= RxDmaIdx)
- && ((RxCpuIdx - RxDmaIdx) < RX_RING_SIZE / 3)) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("AsicRadioOff ===> return2. RxCpuIdx = %d. RxDmaIdx = %d , \n",
- RxCpuIdx, RxDmaIdx));
- return FALSE;
- }
- /* Once go into this function, disable tx because don't want too many packets in queue to prevent HW stops. */
- /*pAd->bPCIclkOffDisableTx = TRUE; */
- RTMP_SET_PSFLAG(pAd, fRTMP_PS_DISABLE_TX);
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)
- && pAd->OpMode == OPMODE_STA
- && pAd->StaCfg.PSControl.field.EnableNewPS == TRUE) {
- RTMPCancelTimer(&pAd->Mlme.RadioOnOffTimer, &Cancelled);
- RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled);
-
- if (Level == DOT11POWERSAVE) {
- RTMP_IO_READ32(pAd, TBTT_TIMER, &TbTTTime);
- TbTTTime &= 0x1ffff;
- /* 00. check if need to do sleep in this DTIM period. If next beacon will arrive within 30ms , ...doesn't necessarily sleep. */
- /* TbTTTime uint = 64us, LEAD_TIME unit = 1024us, PsPollTime unit = 1ms */
- if (((64 * TbTTTime) < ((LEAD_TIME * 1024) + 40000))
- && (TbttNumToNextWakeUp == 0)) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("TbTTTime = 0x%x , give up this sleep. \n",
- TbTTTime));
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
- /*pAd->bPCIclkOffDisableTx = FALSE; */
- RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_DISABLE_TX);
- return FALSE;
- } else {
- PsPollTime =
- (64 * TbTTTime - LEAD_TIME * 1024) / 1000;
-#ifdef PCIE_PS_SUPPORT
- if ((IS_RT3090(pAd) || IS_RT3572(pAd)
- || IS_RT3390(pAd))
- && IS_VERSION_AFTER_F(pAd)
- && (pAd->StaCfg.PSControl.field.
- rt30xxPowerMode == 3)
- && (pAd->StaCfg.PSControl.field.
- EnableNewPS == TRUE)) {
- PsPollTime -= 5;
- } else
-#endif /* PCIE_PS_SUPPORT // */
- PsPollTime -= 3;
-
- BeaconPeriodTime =
- pAd->CommonCfg.BeaconPeriod * 102 / 100;
- if (TbttNumToNextWakeUp > 0)
- PsPollTime +=
- ((TbttNumToNextWakeUp -
- 1) * BeaconPeriodTime);
-
- pAd->Mlme.bPsPollTimerRunning = TRUE;
- RTMPSetTimer(&pAd->Mlme.PsPollTimer,
- PsPollTime);
- }
- }
- } else {
- DBGPRINT(RT_DEBUG_TRACE,
- ("RT28xxPciAsicRadioOff::Level!=DOT11POWERSAVE \n"));
- }
-
- pAd->bPCIclkOffDisableTx = FALSE;
-
- RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF);
-
- /* Set to 1R. */
- if (pAd->Antenna.field.RxPath > 1 && pAd->OpMode == OPMODE_STA) {
- tempBBP_R3 = (pAd->StaCfg.BBPR3 & 0xE7);
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, tempBBP_R3);
- }
- /* In Radio Off, we turn off RF clk, So now need to call ASICSwitchChannel again. */
- if ((INFRA_ON(pAd) || pAd->OpMode == OPMODE_AP)
- && (pAd->CommonCfg.CentralChannel != pAd->CommonCfg.Channel)
- && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40)) {
- /* Must using 40MHz. */
- AsicTurnOffRFClk(pAd, pAd->CommonCfg.CentralChannel);
- } else {
- /* Must using 20MHz. */
- AsicTurnOffRFClk(pAd, pAd->CommonCfg.Channel);
- }
-
- if (Level != RTMP_HALT) {
- /* Change Interrupt bitmask. */
- /* When PCI clock is off, don't want to service interrupt. */
- RTMP_IO_WRITE32(pAd, INT_MASK_CSR, AutoWakeupInt);
- } else {
- RTMP_ASIC_INTERRUPT_DISABLE(pAd);
- }
-
- RTMP_IO_WRITE32(pAd, RX_CRX_IDX, pAd->RxRing.RxCpuIdx);
- /* 2. Send Sleep command */
- RTMP_IO_WRITE32(pAd, H2M_MAILBOX_STATUS, 0xffffffff);
- RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CID, 0xffffffff);
- /* send POWER-SAVE command to MCU. high-byte = 1 save power as much as possible. high byte = 0 save less power */
- AsicSendCommandToMcu(pAd, 0x30, PowerSafeCID, 0xff, 0x1);
- /* 2-1. Wait command success */
- /* Status = 1 : success, Status = 2, already sleep, Status = 3, Maybe MAC is busy so can't finish this task. */
- brc = AsicCheckCommanOk(pAd, PowerSafeCID);
-
- /* 3. After 0x30 command is ok, send radio off command. lowbyte = 0 for power safe. */
- /* If 0x30 command is not ok this time, we can ignore 0x35 command. It will make sure not cause firmware'r problem. */
- if ((Level == DOT11POWERSAVE) && (brc == TRUE)) {
- AsicSendCommandToMcu(pAd, 0x35, PowerRadioOffCID, 0, 0x00); /* lowbyte = 0 means to do power safe, NOT turn off radio. */
- /* 3-1. Wait command success */
- AsicCheckCommanOk(pAd, PowerRadioOffCID);
- } else if (brc == TRUE) {
- AsicSendCommandToMcu(pAd, 0x35, PowerRadioOffCID, 1, 0x00); /* lowbyte = 0 means to do power safe, NOT turn off radio. */
- /* 3-1. Wait command success */
- AsicCheckCommanOk(pAd, PowerRadioOffCID);
- }
- /* 1. Wait DMA not busy */
- i = 0;
- do {
- RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &DmaCfg.word);
- if ((DmaCfg.field.RxDMABusy == 0)
- && (DmaCfg.field.TxDMABusy == 0))
- break;
- RTMPusecDelay(20);
- i++;
- } while (i < 50);
-
- /*
- if (i >= 50)
- {
- pAd->CheckDmaBusyCount++;
- DBGPRINT(RT_DEBUG_TRACE, ("DMA Rx keeps busy. return on AsicRadioOff () CheckDmaBusyCount = %d \n", pAd->CheckDmaBusyCount));
- }
- else
- {
- pAd->CheckDmaBusyCount = 0;
- }
- */
-/*KH Debug:My original codes have the following codes, but currecnt codes do not have it. */
-/* Disable for stability. If PCIE Link Control is modified for advance power save, re-covery this code segment. */
- RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0x1280);
-/*OPSTATUS_SET_FLAG(pAd, fOP_STATUS_CLKSELECT_40MHZ); */
-
-#ifdef PCIE_PS_SUPPORT
- if ((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))
- && IS_VERSION_AFTER_F(pAd)
- && (pAd->StaCfg.PSControl.field.rt30xxPowerMode == 3)
- && (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE)) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("RT28xxPciAsicRadioOff::3090 return to skip the following TbttNumToNextWakeUp setting for 279x\n"));
- pAd->bPCIclkOff = TRUE;
- RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_DISABLE_TX);
- /* For this case, doesn't need to below actions, so return here. */
- return brc;
- }
-#endif /* PCIE_PS_SUPPORT // */
-
- if (Level == DOT11POWERSAVE) {
- AUTO_WAKEUP_STRUC AutoWakeupCfg;
- /*RTMPSetTimer(&pAd->Mlme.PsPollTimer, 90); */
-
- /* we have decided to SLEEP, so at least do it for a BEACON period. */
- if (TbttNumToNextWakeUp == 0)
- TbttNumToNextWakeUp = 1;
-
- AutoWakeupCfg.word = 0;
- RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);
-
- /* 1. Set auto wake up timer. */
- AutoWakeupCfg.field.NumofSleepingTbtt = TbttNumToNextWakeUp - 1;
- AutoWakeupCfg.field.EnableAutoWakeup = 1;
- AutoWakeupCfg.field.AutoLeadTime = LEAD_TIME;
- RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);
- }
- /* 4-1. If it's to disable our device. Need to restore PCI Configuration Space to its original value. */
- if (Level == RTMP_HALT && pAd->OpMode == OPMODE_STA) {
- if ((brc == TRUE) && (i < 50))
- RTMPPCIeLinkCtrlSetting(pAd, 1);
- }
- /* 4. Set PCI configuration Space Link Comtrol fields. Only Radio Off needs to call this function */
- else if (pAd->OpMode == OPMODE_STA) {
- if ((brc == TRUE) && (i < 50))
- RTMPPCIeLinkCtrlSetting(pAd, 3);
- }
- /*pAd->bPCIclkOffDisableTx = FALSE; */
- RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_DISABLE_TX);
- return TRUE;
-}
-
-void RT28xxPciMlmeRadioOn(struct rt_rtmp_adapter *pAd)
-{
- if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))
- return;
-
- DBGPRINT(RT_DEBUG_TRACE, ("%s===>\n", __func__));
-
- if ((pAd->OpMode == OPMODE_AP) || ((pAd->OpMode == OPMODE_STA)
- &&
- (!OPSTATUS_TEST_FLAG
- (pAd, fOP_STATUS_PCIE_DEVICE)
- || pAd->StaCfg.PSControl.field.
- EnableNewPS == FALSE))) {
- RT28xxPciAsicRadioOn(pAd, GUI_IDLE_POWER_SAVE);
- /*NICResetFromError(pAd); */
-
- RTMPRingCleanUp(pAd, QID_AC_BK);
- RTMPRingCleanUp(pAd, QID_AC_BE);
- RTMPRingCleanUp(pAd, QID_AC_VI);
- RTMPRingCleanUp(pAd, QID_AC_VO);
- RTMPRingCleanUp(pAd, QID_MGMT);
- RTMPRingCleanUp(pAd, QID_RX);
-
- /* Enable Tx/Rx */
- RTMPEnableRxTx(pAd);
-
- /* Clear Radio off flag */
- RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
-
- RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF);
-
- /* Set LED */
- RTMPSetLED(pAd, LED_RADIO_ON);
- }
-
- if ((pAd->OpMode == OPMODE_STA) &&
- (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE))
- && (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE)) {
- BOOLEAN Cancelled;
-
- RTMPPCIeLinkCtrlValueRestore(pAd, RESTORE_WAKEUP);
-
- pAd->Mlme.bPsPollTimerRunning = FALSE;
- RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled);
- RTMPCancelTimer(&pAd->Mlme.RadioOnOffTimer, &Cancelled);
- RTMPSetTimer(&pAd->Mlme.RadioOnOffTimer, 40);
- }
-}
-
-void RT28xxPciMlmeRadioOFF(struct rt_rtmp_adapter *pAd)
-{
- BOOLEAN brc = TRUE;
-
- if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))
- return;
-
- /* Link down first if any association exists */
- if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) {
- if (INFRA_ON(pAd) || ADHOC_ON(pAd)) {
- struct rt_mlme_disassoc_req DisReq;
- struct rt_mlme_queue_elem *pMsgElem =
- kmalloc(sizeof(struct rt_mlme_queue_elem),
- MEM_ALLOC_FLAG);
-
- if (pMsgElem) {
- COPY_MAC_ADDR(&DisReq.Addr,
- pAd->CommonCfg.Bssid);
- DisReq.Reason = REASON_DISASSOC_STA_LEAVING;
-
- pMsgElem->Machine = ASSOC_STATE_MACHINE;
- pMsgElem->MsgType = MT2_MLME_DISASSOC_REQ;
- pMsgElem->MsgLen =
- sizeof(struct rt_mlme_disassoc_req);
- NdisMoveMemory(pMsgElem->Msg, &DisReq,
- sizeof
- (struct rt_mlme_disassoc_req));
-
- MlmeDisassocReqAction(pAd, pMsgElem);
- kfree(pMsgElem);
-
- RTMPusecDelay(1000);
- }
- }
- }
-
- DBGPRINT(RT_DEBUG_TRACE, ("%s===>\n", __func__));
-
- /* Set Radio off flag */
- RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
-
- {
- BOOLEAN Cancelled;
- if (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE) {
- if (RTMP_TEST_FLAG
- (pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) {
- RTMPCancelTimer(&pAd->MlmeAux.ScanTimer,
- &Cancelled);
- RTMP_CLEAR_FLAG(pAd,
- fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);
- }
- /* If during power safe mode. */
- if (pAd->StaCfg.bRadio == TRUE) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("-->MlmeRadioOff() return on bRadio == TRUE; \n"));
- return;
- }
- /* Always radio on since the NIC needs to set the MCU command (LED_RADIO_OFF). */
- if (IDLE_ON(pAd) &&
- (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF)))
- {
- RT28xxPciAsicRadioOn(pAd, GUI_IDLE_POWER_SAVE);
- }
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)) {
- BOOLEAN Cancelled;
- pAd->Mlme.bPsPollTimerRunning = FALSE;
- RTMPCancelTimer(&pAd->Mlme.PsPollTimer,
- &Cancelled);
- RTMPCancelTimer(&pAd->Mlme.RadioOnOffTimer,
- &Cancelled);
- }
- }
- /* Link down first if any association exists */
- if (INFRA_ON(pAd) || ADHOC_ON(pAd))
- LinkDown(pAd, FALSE);
- RTMPusecDelay(10000);
- /*========================================== */
- /* Clean up old bss table */
- BssTableInit(&pAd->ScanTab);
-
- /*
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE))
- {
- RTMPSetTimer(&pAd->Mlme.RadioOnOffTimer, 10);
- return;
- }
- */
- }
-
- /* Set LED.Move to here for fixing LED bug. This flag must be called after LinkDown */
- RTMPSetLED(pAd, LED_RADIO_OFF);
-
-/*KH Debug:All PCIe devices need to use timer to execute radio off function, or the PCIe&&EnableNewPS needs. */
-/*KH Ans:It is right, because only when the PCIe and EnableNewPs is true, we need to delay the RadioOffTimer */
-/*to avoid the deadlock with PCIe Power saving function. */
- if (pAd->OpMode == OPMODE_STA &&
- OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE) &&
- pAd->StaCfg.PSControl.field.EnableNewPS == TRUE) {
- RTMPSetTimer(&pAd->Mlme.RadioOnOffTimer, 10);
- } else {
- brc = RT28xxPciAsicRadioOff(pAd, GUIRADIO_OFF, 0);
-
- if (brc == FALSE) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s call RT28xxPciAsicRadioOff fail!\n",
- __func__));
- }
- }
-/*
-*/
-}
-
-#endif /* RTMP_MAC_PCI // */
diff --git a/drivers/staging/rt2860/common/cmm_mac_usb.c b/drivers/staging/rt2860/common/cmm_mac_usb.c
deleted file mode 100644
index 64a65a460c29..000000000000
--- a/drivers/staging/rt2860/common/cmm_mac_usb.c
+++ /dev/null
@@ -1,1162 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-*/
-
-#ifdef RTMP_MAC_USB
-
-#include "../rt_config.h"
-
-/*
-========================================================================
-Routine Description:
- Initialize receive data structures.
-
-Arguments:
- pAd Pointer to our adapter
-
-Return Value:
- NDIS_STATUS_SUCCESS
- NDIS_STATUS_RESOURCES
-
-Note:
- Initialize all receive releated private buffer, include those define
- in struct rt_rtmp_adapter structure and all private data structures. The mahor
- work is to allocate buffer for each packet and chain buffer to
- NDIS packet descriptor.
-========================================================================
-*/
-int NICInitRecv(struct rt_rtmp_adapter *pAd)
-{
- u8 i;
- int Status = NDIS_STATUS_SUCCESS;
- struct os_cookie *pObj = (struct os_cookie *)pAd->OS_Cookie;
-
- DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitRecv\n"));
- pObj = pObj;
-
- /*InterlockedExchange(&pAd->PendingRx, 0); */
- pAd->PendingRx = 0;
- pAd->NextRxBulkInReadIndex = 0; /* Next Rx Read index */
- pAd->NextRxBulkInIndex = 0; /*RX_RING_SIZE -1; // Rx Bulk pointer */
- pAd->NextRxBulkInPosition = 0;
-
- for (i = 0; i < (RX_RING_SIZE); i++) {
- struct rt_rx_context *pRxContext = &(pAd->RxContext[i]);
-
- /*Allocate URB */
- pRxContext->pUrb = RTUSB_ALLOC_URB(0);
- if (pRxContext->pUrb == NULL) {
- Status = NDIS_STATUS_RESOURCES;
- goto out1;
- }
- /* Allocate transfer buffer */
- pRxContext->TransferBuffer =
- RTUSB_URB_ALLOC_BUFFER(pObj->pUsb_Dev, MAX_RXBULK_SIZE,
- &pRxContext->data_dma);
- if (pRxContext->TransferBuffer == NULL) {
- Status = NDIS_STATUS_RESOURCES;
- goto out1;
- }
-
- NdisZeroMemory(pRxContext->TransferBuffer, MAX_RXBULK_SIZE);
-
- pRxContext->pAd = pAd;
- pRxContext->pIrp = NULL;
- pRxContext->InUse = FALSE;
- pRxContext->IRPPending = FALSE;
- pRxContext->Readable = FALSE;
- /*pRxContext->ReorderInUse = FALSE; */
- pRxContext->bRxHandling = FALSE;
- pRxContext->BulkInOffset = 0;
- }
-
- DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitRecv(Status=%d)\n", Status));
- return Status;
-
-out1:
- for (i = 0; i < (RX_RING_SIZE); i++) {
- struct rt_rx_context *pRxContext = &(pAd->RxContext[i]);
-
- if (NULL != pRxContext->TransferBuffer) {
- RTUSB_URB_FREE_BUFFER(pObj->pUsb_Dev, MAX_RXBULK_SIZE,
- pRxContext->TransferBuffer,
- pRxContext->data_dma);
- pRxContext->TransferBuffer = NULL;
- }
-
- if (NULL != pRxContext->pUrb) {
- RTUSB_UNLINK_URB(pRxContext->pUrb);
- RTUSB_FREE_URB(pRxContext->pUrb);
- pRxContext->pUrb = NULL;
- }
- }
-
- return Status;
-}
-
-/*
-========================================================================
-Routine Description:
- Initialize transmit data structures.
-
-Arguments:
- pAd Pointer to our adapter
-
-Return Value:
- NDIS_STATUS_SUCCESS
- NDIS_STATUS_RESOURCES
-
-Note:
-========================================================================
-*/
-int NICInitTransmit(struct rt_rtmp_adapter *pAd)
-{
-#define LM_USB_ALLOC(pObj, Context, TB_Type, BufferSize, Status, msg1, err1, msg2, err2) \
- Context->pUrb = RTUSB_ALLOC_URB(0); \
- if (Context->pUrb == NULL) { \
- DBGPRINT(RT_DEBUG_ERROR, msg1); \
- Status = NDIS_STATUS_RESOURCES; \
- goto err1; } \
- \
- Context->TransferBuffer = \
- (TB_Type)RTUSB_URB_ALLOC_BUFFER(pObj->pUsb_Dev, BufferSize, &Context->data_dma); \
- if (Context->TransferBuffer == NULL) { \
- DBGPRINT(RT_DEBUG_ERROR, msg2); \
- Status = NDIS_STATUS_RESOURCES; \
- goto err2; }
-
-#define LM_URB_FREE(pObj, Context, BufferSize) \
- if (NULL != Context->pUrb) { \
- RTUSB_UNLINK_URB(Context->pUrb); \
- RTUSB_FREE_URB(Context->pUrb); \
- Context->pUrb = NULL; } \
- if (NULL != Context->TransferBuffer) { \
- RTUSB_URB_FREE_BUFFER(pObj->pUsb_Dev, BufferSize, \
- Context->TransferBuffer, \
- Context->data_dma); \
- Context->TransferBuffer = NULL; }
-
- u8 i, acidx;
- int Status = NDIS_STATUS_SUCCESS;
- struct rt_tx_context *pNullContext = &(pAd->NullContext);
- struct rt_tx_context *pPsPollContext = &(pAd->PsPollContext);
- struct rt_tx_context *pRTSContext = &(pAd->RTSContext);
- struct rt_tx_context *pMLMEContext = NULL;
-/* struct rt_ht_tx_context *pHTTXContext = NULL; */
- struct os_cookie *pObj = (struct os_cookie *)pAd->OS_Cookie;
- void *RingBaseVa;
-/* struct rt_rtmp_tx_ring *pTxRing; */
- struct rt_rtmp_mgmt_ring *pMgmtRing;
-
- DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitTransmit\n"));
- pObj = pObj;
-
- /* Init 4 set of Tx parameters */
- for (acidx = 0; acidx < NUM_OF_TX_RING; acidx++) {
- /* Initialize all Transmit releated queues */
- InitializeQueueHeader(&pAd->TxSwQueue[acidx]);
-
- /* Next Local tx ring pointer waiting for buck out */
- pAd->NextBulkOutIndex[acidx] = acidx;
- pAd->BulkOutPending[acidx] = FALSE; /* Buck Out control flag */
- /*pAd->DataBulkDoneIdx[acidx] = 0; */
- }
-
- /*pAd->NextMLMEIndex = 0; */
- /*pAd->PushMgmtIndex = 0; */
- /*pAd->PopMgmtIndex = 0; */
- /*InterlockedExchange(&pAd->MgmtQueueSize, 0); */
- /*InterlockedExchange(&pAd->TxCount, 0); */
-
- /*pAd->PrioRingFirstIndex = 0; */
- /*pAd->PrioRingTxCnt = 0; */
-
- do {
- /* */
- /* TX_RING_SIZE, 4 ACs */
- /* */
- for (acidx = 0; acidx < 4; acidx++) {
- struct rt_ht_tx_context *pHTTXContext = &(pAd->TxContext[acidx]);
-
- NdisZeroMemory(pHTTXContext, sizeof(struct rt_ht_tx_context));
- /*Allocate URB */
- LM_USB_ALLOC(pObj, pHTTXContext, struct rt_httx_buffer *,
- sizeof(struct rt_httx_buffer), Status,
- ("<-- ERROR in Alloc TX TxContext[%d] urb!\n",
- acidx), done,
- ("<-- ERROR in Alloc TX TxContext[%d] struct rt_httx_buffer!\n",
- acidx), out1);
-
- NdisZeroMemory(pHTTXContext->TransferBuffer->
- Aggregation, 4);
- pHTTXContext->pAd = pAd;
- pHTTXContext->pIrp = NULL;
- pHTTXContext->IRPPending = FALSE;
- pHTTXContext->NextBulkOutPosition = 0;
- pHTTXContext->ENextBulkOutPosition = 0;
- pHTTXContext->CurWritePosition = 0;
- pHTTXContext->CurWriteRealPos = 0;
- pHTTXContext->BulkOutSize = 0;
- pHTTXContext->BulkOutPipeId = acidx;
- pHTTXContext->bRingEmpty = TRUE;
- pHTTXContext->bCopySavePad = FALSE;
- pAd->BulkOutPending[acidx] = FALSE;
- }
-
- /* */
- /* MGMT_RING_SIZE */
- /* */
-
- /* Allocate MGMT ring descriptor's memory */
- pAd->MgmtDescRing.AllocSize =
- MGMT_RING_SIZE * sizeof(struct rt_tx_context);
- os_alloc_mem(pAd, (u8 **) (&pAd->MgmtDescRing.AllocVa),
- pAd->MgmtDescRing.AllocSize);
- if (pAd->MgmtDescRing.AllocVa == NULL) {
- DBGPRINT_ERR("Failed to allocate a big buffer for MgmtDescRing!\n");
- Status = NDIS_STATUS_RESOURCES;
- goto out1;
- }
- NdisZeroMemory(pAd->MgmtDescRing.AllocVa,
- pAd->MgmtDescRing.AllocSize);
- RingBaseVa = pAd->MgmtDescRing.AllocVa;
-
- /* Initialize MGMT Ring and associated buffer memory */
- pMgmtRing = &pAd->MgmtRing;
- for (i = 0; i < MGMT_RING_SIZE; i++) {
- /* link the pre-allocated Mgmt buffer to MgmtRing.Cell */
- pMgmtRing->Cell[i].AllocSize = sizeof(struct rt_tx_context);
- pMgmtRing->Cell[i].AllocVa = RingBaseVa;
- pMgmtRing->Cell[i].pNdisPacket = NULL;
- pMgmtRing->Cell[i].pNextNdisPacket = NULL;
-
- /*Allocate URB for MLMEContext */
- pMLMEContext =
- (struct rt_tx_context *)pAd->MgmtRing.Cell[i].AllocVa;
- pMLMEContext->pUrb = RTUSB_ALLOC_URB(0);
- if (pMLMEContext->pUrb == NULL) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("<-- ERROR in Alloc TX MLMEContext[%d] urb!\n",
- i));
- Status = NDIS_STATUS_RESOURCES;
- goto out2;
- }
- pMLMEContext->pAd = pAd;
- pMLMEContext->pIrp = NULL;
- pMLMEContext->TransferBuffer = NULL;
- pMLMEContext->InUse = FALSE;
- pMLMEContext->IRPPending = FALSE;
- pMLMEContext->bWaitingBulkOut = FALSE;
- pMLMEContext->BulkOutSize = 0;
- pMLMEContext->SelfIdx = i;
-
- /* Offset to next ring descriptor address */
- RingBaseVa = (u8 *)RingBaseVa + sizeof(struct rt_tx_context);
- }
- DBGPRINT(RT_DEBUG_TRACE,
- ("MGMT Ring: total %d entry allocated\n", i));
-
- /*pAd->MgmtRing.TxSwFreeIdx = (MGMT_RING_SIZE - 1); */
- pAd->MgmtRing.TxSwFreeIdx = MGMT_RING_SIZE;
- pAd->MgmtRing.TxCpuIdx = 0;
- pAd->MgmtRing.TxDmaIdx = 0;
-
- /* */
- /* BEACON_RING_SIZE */
- /* */
- for (i = 0; i < BEACON_RING_SIZE; i++) /* 2 */
- {
- struct rt_tx_context *pBeaconContext = &(pAd->BeaconContext[i]);
-
- NdisZeroMemory(pBeaconContext, sizeof(struct rt_tx_context));
-
- /*Allocate URB */
- LM_USB_ALLOC(pObj, pBeaconContext, struct rt_tx_buffer *,
- sizeof(struct rt_tx_buffer), Status,
- ("<-- ERROR in Alloc TX BeaconContext[%d] urb!\n",
- i), out2,
- ("<-- ERROR in Alloc TX BeaconContext[%d] struct rt_tx_buffer!\n",
- i), out3);
-
- pBeaconContext->pAd = pAd;
- pBeaconContext->pIrp = NULL;
- pBeaconContext->InUse = FALSE;
- pBeaconContext->IRPPending = FALSE;
- }
-
- /* */
- /* NullContext */
- /* */
- NdisZeroMemory(pNullContext, sizeof(struct rt_tx_context));
-
- /*Allocate URB */
- LM_USB_ALLOC(pObj, pNullContext, struct rt_tx_buffer *, sizeof(struct rt_tx_buffer),
- Status,
- ("<-- ERROR in Alloc TX NullContext urb!\n"),
- out3,
- ("<-- ERROR in Alloc TX NullContext struct rt_tx_buffer!\n"),
- out4);
-
- pNullContext->pAd = pAd;
- pNullContext->pIrp = NULL;
- pNullContext->InUse = FALSE;
- pNullContext->IRPPending = FALSE;
-
- /* */
- /* RTSContext */
- /* */
- NdisZeroMemory(pRTSContext, sizeof(struct rt_tx_context));
-
- /*Allocate URB */
- LM_USB_ALLOC(pObj, pRTSContext, struct rt_tx_buffer *, sizeof(struct rt_tx_buffer),
- Status,
- ("<-- ERROR in Alloc TX RTSContext urb!\n"),
- out4,
- ("<-- ERROR in Alloc TX RTSContext struct rt_tx_buffer!\n"),
- out5);
-
- pRTSContext->pAd = pAd;
- pRTSContext->pIrp = NULL;
- pRTSContext->InUse = FALSE;
- pRTSContext->IRPPending = FALSE;
-
- /* */
- /* PsPollContext */
- /* */
- /*NdisZeroMemory(pPsPollContext, sizeof(struct rt_tx_context)); */
- /*Allocate URB */
- LM_USB_ALLOC(pObj, pPsPollContext, struct rt_tx_buffer *,
- sizeof(struct rt_tx_buffer), Status,
- ("<-- ERROR in Alloc TX PsPollContext urb!\n"),
- out5,
- ("<-- ERROR in Alloc TX PsPollContext struct rt_tx_buffer!\n"),
- out6);
-
- pPsPollContext->pAd = pAd;
- pPsPollContext->pIrp = NULL;
- pPsPollContext->InUse = FALSE;
- pPsPollContext->IRPPending = FALSE;
- pPsPollContext->bAggregatible = FALSE;
- pPsPollContext->LastOne = TRUE;
-
- } while (FALSE);
-
-done:
- DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitTransmit(Status=%d)\n", Status));
-
- return Status;
-
- /* --------------------------- ERROR HANDLE --------------------------- */
-out6:
- LM_URB_FREE(pObj, pPsPollContext, sizeof(struct rt_tx_buffer));
-
-out5:
- LM_URB_FREE(pObj, pRTSContext, sizeof(struct rt_tx_buffer));
-
-out4:
- LM_URB_FREE(pObj, pNullContext, sizeof(struct rt_tx_buffer));
-
-out3:
- for (i = 0; i < BEACON_RING_SIZE; i++) {
- struct rt_tx_context *pBeaconContext = &(pAd->BeaconContext[i]);
- if (pBeaconContext)
- LM_URB_FREE(pObj, pBeaconContext, sizeof(struct rt_tx_buffer));
- }
-
-out2:
- if (pAd->MgmtDescRing.AllocVa) {
- pMgmtRing = &pAd->MgmtRing;
- for (i = 0; i < MGMT_RING_SIZE; i++) {
- pMLMEContext =
- (struct rt_tx_context *)pAd->MgmtRing.Cell[i].AllocVa;
- if (pMLMEContext)
- LM_URB_FREE(pObj, pMLMEContext,
- sizeof(struct rt_tx_buffer));
- }
- os_free_mem(pAd, pAd->MgmtDescRing.AllocVa);
- pAd->MgmtDescRing.AllocVa = NULL;
- }
-
-out1:
- for (acidx = 0; acidx < 4; acidx++) {
- struct rt_ht_tx_context *pTxContext = &(pAd->TxContext[acidx]);
- if (pTxContext)
- LM_URB_FREE(pObj, pTxContext, sizeof(struct rt_httx_buffer));
- }
-
- /* Here we didn't have any pre-allocated memory need to free. */
-
- return Status;
-}
-
-/*
-========================================================================
-Routine Description:
- Allocate DMA memory blocks for send, receive.
-
-Arguments:
- pAd Pointer to our adapter
-
-Return Value:
- NDIS_STATUS_SUCCESS
- NDIS_STATUS_FAILURE
- NDIS_STATUS_RESOURCES
-
-Note:
-========================================================================
-*/
-int RTMPAllocTxRxRingMemory(struct rt_rtmp_adapter *pAd)
-{
-/* struct rt_counter_802_11 pCounter = &pAd->WlanCounters; */
- int Status;
- int num;
-
- DBGPRINT(RT_DEBUG_TRACE, ("--> RTMPAllocTxRxRingMemory\n"));
-
- do {
- /* Init the struct rt_cmdq and CmdQLock */
- NdisAllocateSpinLock(&pAd->CmdQLock);
- NdisAcquireSpinLock(&pAd->CmdQLock);
- RTUSBInitializeCmdQ(&pAd->CmdQ);
- NdisReleaseSpinLock(&pAd->CmdQLock);
-
- NdisAllocateSpinLock(&pAd->MLMEBulkOutLock);
- /*NdisAllocateSpinLock(&pAd->MLMEWaitQueueLock); */
- NdisAllocateSpinLock(&pAd->BulkOutLock[0]);
- NdisAllocateSpinLock(&pAd->BulkOutLock[1]);
- NdisAllocateSpinLock(&pAd->BulkOutLock[2]);
- NdisAllocateSpinLock(&pAd->BulkOutLock[3]);
- NdisAllocateSpinLock(&pAd->BulkOutLock[4]);
- NdisAllocateSpinLock(&pAd->BulkOutLock[5]);
- NdisAllocateSpinLock(&pAd->BulkInLock);
-
- for (num = 0; num < NUM_OF_TX_RING; num++) {
- NdisAllocateSpinLock(&pAd->TxContextQueueLock[num]);
- }
-
-/* NdisAllocateSpinLock(&pAd->MemLock); // Not used in RT28XX */
-
-/* NdisAllocateSpinLock(&pAd->MacTabLock); // init it in UserCfgInit() */
-/* NdisAllocateSpinLock(&pAd->BATabLock); // init it in BATableInit() */
-
-/* for(num=0; num<MAX_LEN_OF_BA_REC_TABLE; num++) */
-/* { */
-/* NdisAllocateSpinLock(&pAd->BATable.BARecEntry[num].RxReRingLock); */
-/* } */
-
- /* */
- /* Init Mac Table */
- /* */
-/* MacTableInitialize(pAd); */
-
- /* */
- /* Init send data structures and related parameters */
- /* */
- Status = NICInitTransmit(pAd);
- if (Status != NDIS_STATUS_SUCCESS)
- break;
-
- /* */
- /* Init receive data structures and related parameters */
- /* */
- Status = NICInitRecv(pAd);
- if (Status != NDIS_STATUS_SUCCESS)
- break;
-
- pAd->PendingIoCount = 1;
-
- } while (FALSE);
-
- NdisZeroMemory(&pAd->FragFrame, sizeof(struct rt_fragment_frame));
- pAd->FragFrame.pFragPacket =
- RTMP_AllocateFragPacketBuffer(pAd, RX_BUFFER_NORMSIZE);
-
- if (pAd->FragFrame.pFragPacket == NULL) {
- Status = NDIS_STATUS_RESOURCES;
- }
-
- DBGPRINT_S(Status,
- ("<-- RTMPAllocTxRxRingMemory, Status=%x\n", Status));
- return Status;
-}
-
-/*
-========================================================================
-Routine Description:
- Calls USB_InterfaceStop and frees memory allocated for the URBs
- calls NdisMDeregisterDevice and frees the memory
- allocated in VNetInitialize for the Adapter Object
-
-Arguments:
- *pAd the raxx interface data pointer
-
-Return Value:
- None
-
-Note:
-========================================================================
-*/
-void RTMPFreeTxRxRingMemory(struct rt_rtmp_adapter *pAd)
-{
-#define LM_URB_FREE(pObj, Context, BufferSize) \
- if (NULL != Context->pUrb) { \
- RTUSB_UNLINK_URB(Context->pUrb); \
- RTUSB_FREE_URB(Context->pUrb); \
- Context->pUrb = NULL; } \
- if (NULL != Context->TransferBuffer) { \
- RTUSB_URB_FREE_BUFFER(pObj->pUsb_Dev, BufferSize, \
- Context->TransferBuffer, \
- Context->data_dma); \
- Context->TransferBuffer = NULL; }
-
- u32 i, acidx;
- struct rt_tx_context *pNullContext = &pAd->NullContext;
- struct rt_tx_context *pPsPollContext = &pAd->PsPollContext;
- struct rt_tx_context *pRTSContext = &pAd->RTSContext;
-/* struct rt_ht_tx_context *pHTTXContext; */
- /*PRTMP_REORDERBUF pReorderBuf; */
- struct os_cookie *pObj = (struct os_cookie *)pAd->OS_Cookie;
-/* struct rt_rtmp_tx_ring *pTxRing; */
-
- DBGPRINT(RT_DEBUG_ERROR, ("---> RTMPFreeTxRxRingMemory\n"));
- pObj = pObj;
-
- /* Free all resources for the RECEIVE buffer queue. */
- for (i = 0; i < (RX_RING_SIZE); i++) {
- struct rt_rx_context *pRxContext = &(pAd->RxContext[i]);
- if (pRxContext)
- LM_URB_FREE(pObj, pRxContext, MAX_RXBULK_SIZE);
- }
-
- /* Free PsPoll frame resource */
- LM_URB_FREE(pObj, pPsPollContext, sizeof(struct rt_tx_buffer));
-
- /* Free NULL frame resource */
- LM_URB_FREE(pObj, pNullContext, sizeof(struct rt_tx_buffer));
-
- /* Free RTS frame resource */
- LM_URB_FREE(pObj, pRTSContext, sizeof(struct rt_tx_buffer));
-
- /* Free beacon frame resource */
- for (i = 0; i < BEACON_RING_SIZE; i++) {
- struct rt_tx_context *pBeaconContext = &(pAd->BeaconContext[i]);
- if (pBeaconContext)
- LM_URB_FREE(pObj, pBeaconContext, sizeof(struct rt_tx_buffer));
- }
-
- /* Free mgmt frame resource */
- for (i = 0; i < MGMT_RING_SIZE; i++) {
- struct rt_tx_context *pMLMEContext =
- (struct rt_tx_context *)pAd->MgmtRing.Cell[i].AllocVa;
- /*LM_URB_FREE(pObj, pMLMEContext, sizeof(struct rt_tx_buffer)); */
- if (NULL != pAd->MgmtRing.Cell[i].pNdisPacket) {
- RTMPFreeNdisPacket(pAd,
- pAd->MgmtRing.Cell[i].pNdisPacket);
- pAd->MgmtRing.Cell[i].pNdisPacket = NULL;
- pMLMEContext->TransferBuffer = NULL;
- }
-
- if (pMLMEContext) {
- if (NULL != pMLMEContext->pUrb) {
- RTUSB_UNLINK_URB(pMLMEContext->pUrb);
- RTUSB_FREE_URB(pMLMEContext->pUrb);
- pMLMEContext->pUrb = NULL;
- }
- }
- }
- if (pAd->MgmtDescRing.AllocVa)
- os_free_mem(pAd, pAd->MgmtDescRing.AllocVa);
-
- /* Free Tx frame resource */
- for (acidx = 0; acidx < 4; acidx++) {
- struct rt_ht_tx_context *pHTTXContext = &(pAd->TxContext[acidx]);
- if (pHTTXContext)
- LM_URB_FREE(pObj, pHTTXContext, sizeof(struct rt_httx_buffer));
- }
-
- if (pAd->FragFrame.pFragPacket)
- RELEASE_NDIS_PACKET(pAd, pAd->FragFrame.pFragPacket,
- NDIS_STATUS_SUCCESS);
-
- for (i = 0; i < 6; i++) {
- NdisFreeSpinLock(&pAd->BulkOutLock[i]);
- }
-
- NdisFreeSpinLock(&pAd->BulkInLock);
- NdisFreeSpinLock(&pAd->MLMEBulkOutLock);
-
- NdisFreeSpinLock(&pAd->CmdQLock);
- /* Clear all pending bulk-out request flags. */
- RTUSB_CLEAR_BULK_FLAG(pAd, 0xffffffff);
-
-/* NdisFreeSpinLock(&pAd->MacTabLock); */
-
-/* for(i=0; i<MAX_LEN_OF_BA_REC_TABLE; i++) */
-/* { */
-/* NdisFreeSpinLock(&pAd->BATable.BARecEntry[i].RxReRingLock); */
-/* } */
-
- DBGPRINT(RT_DEBUG_ERROR, ("<--- RTMPFreeTxRxRingMemory\n"));
-}
-
-/*
-========================================================================
-Routine Description:
- Write WLAN MAC address to USB 2870.
-
-Arguments:
- pAd Pointer to our adapter
-
-Return Value:
- NDIS_STATUS_SUCCESS
-
-Note:
-========================================================================
-*/
-int RTUSBWriteHWMACAddress(struct rt_rtmp_adapter *pAd)
-{
- MAC_DW0_STRUC StaMacReg0;
- MAC_DW1_STRUC StaMacReg1;
- int Status = NDIS_STATUS_SUCCESS;
- LARGE_INTEGER NOW;
-
- /* initialize the random number generator */
- RTMP_GetCurrentSystemTime(&NOW);
-
- if (pAd->bLocalAdminMAC != TRUE) {
- pAd->CurrentAddress[0] = pAd->PermanentAddress[0];
- pAd->CurrentAddress[1] = pAd->PermanentAddress[1];
- pAd->CurrentAddress[2] = pAd->PermanentAddress[2];
- pAd->CurrentAddress[3] = pAd->PermanentAddress[3];
- pAd->CurrentAddress[4] = pAd->PermanentAddress[4];
- pAd->CurrentAddress[5] = pAd->PermanentAddress[5];
- }
- /* Write New MAC address to MAC_CSR2 & MAC_CSR3 & let ASIC know our new MAC */
- StaMacReg0.field.Byte0 = pAd->CurrentAddress[0];
- StaMacReg0.field.Byte1 = pAd->CurrentAddress[1];
- StaMacReg0.field.Byte2 = pAd->CurrentAddress[2];
- StaMacReg0.field.Byte3 = pAd->CurrentAddress[3];
- StaMacReg1.field.Byte4 = pAd->CurrentAddress[4];
- StaMacReg1.field.Byte5 = pAd->CurrentAddress[5];
- StaMacReg1.field.U2MeMask = 0xff;
- DBGPRINT_RAW(RT_DEBUG_TRACE,
- ("Local MAC = %pM\n", pAd->CurrentAddress));
-
- RTUSBWriteMACRegister(pAd, MAC_ADDR_DW0, StaMacReg0.word);
- RTUSBWriteMACRegister(pAd, MAC_ADDR_DW1, StaMacReg1.word);
- return Status;
-}
-
-/*
-========================================================================
-Routine Description:
- Disable DMA.
-
-Arguments:
- *pAd the raxx interface data pointer
-
-Return Value:
- None
-
-Note:
-========================================================================
-*/
-void RT28XXDMADisable(struct rt_rtmp_adapter *pAd)
-{
- /* no use */
-}
-
-/*
-========================================================================
-Routine Description:
- Enable DMA.
-
-Arguments:
- *pAd the raxx interface data pointer
-
-Return Value:
- None
-
-Note:
-========================================================================
-*/
-void RT28XXDMAEnable(struct rt_rtmp_adapter *pAd)
-{
- WPDMA_GLO_CFG_STRUC GloCfg;
- USB_DMA_CFG_STRUC UsbCfg;
- int i = 0;
-
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x4);
- do {
- RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
- if ((GloCfg.field.TxDMABusy == 0)
- && (GloCfg.field.RxDMABusy == 0))
- break;
-
- DBGPRINT(RT_DEBUG_TRACE, ("==> DMABusy\n"));
- RTMPusecDelay(1000);
- i++;
- } while (i < 200);
-
- RTMPusecDelay(50);
- GloCfg.field.EnTXWriteBackDDONE = 1;
- GloCfg.field.EnableRxDMA = 1;
- GloCfg.field.EnableTxDMA = 1;
- DBGPRINT(RT_DEBUG_TRACE,
- ("<== WRITE DMA offset 0x208 = 0x%x\n", GloCfg.word));
- RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);
-
- UsbCfg.word = 0;
- UsbCfg.field.phyclear = 0;
- /* usb version is 1.1,do not use bulk in aggregation */
- if (pAd->BulkInMaxPacketSize == 512)
- UsbCfg.field.RxBulkAggEn = 1;
- /* for last packet, PBF might use more than limited, so minus 2 to prevent from error */
- UsbCfg.field.RxBulkAggLmt = (MAX_RXBULK_SIZE / 1024) - 3;
- UsbCfg.field.RxBulkAggTOut = 0x80; /* 2006-10-18 */
- UsbCfg.field.RxBulkEn = 1;
- UsbCfg.field.TxBulkEn = 1;
-
- RTUSBWriteMACRegister(pAd, USB_DMA_CFG, UsbCfg.word);
-
-}
-
-/********************************************************************
- *
- * 2870 Beacon Update Related functions.
- *
- ********************************************************************/
-
-/*
-========================================================================
-Routine Description:
- Write Beacon buffer to Asic.
-
-Arguments:
- *pAd the raxx interface data pointer
-
-Return Value:
- None
-
-Note:
-========================================================================
-*/
-void RT28xx_UpdateBeaconToAsic(struct rt_rtmp_adapter *pAd,
- int apidx,
- unsigned long FrameLen, unsigned long UpdatePos)
-{
- u8 *pBeaconFrame = NULL;
- u8 *ptr;
- u32 i, padding;
- struct rt_beacon_sync *pBeaconSync = pAd->CommonCfg.pBeaconSync;
- u32 longValue;
-/* u16 shortValue; */
- BOOLEAN bBcnReq = FALSE;
- u8 bcn_idx = 0;
-
- if (pBeaconFrame == NULL) {
- DBGPRINT(RT_DEBUG_ERROR, ("pBeaconFrame is NULL!\n"));
- return;
- }
-
- if (pBeaconSync == NULL) {
- DBGPRINT(RT_DEBUG_ERROR, ("pBeaconSync is NULL!\n"));
- return;
- }
- /*if ((pAd->WdsTab.Mode == WDS_BRIDGE_MODE) || */
- /* ((pAd->ApCfg.MBSSID[apidx].MSSIDDev == NULL) || !(pAd->ApCfg.MBSSID[apidx].MSSIDDev->flags & IFF_UP)) */
- /* ) */
- if (bBcnReq == FALSE) {
- /* when the ra interface is down, do not send its beacon frame */
- /* clear all zero */
- for (i = 0; i < TXWI_SIZE; i += 4) {
- RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[bcn_idx] + i,
- 0x00);
- }
- pBeaconSync->BeaconBitMap &=
- (~(BEACON_BITMAP_MASK & (1 << bcn_idx)));
- NdisZeroMemory(pBeaconSync->BeaconTxWI[bcn_idx], TXWI_SIZE);
- } else {
- ptr = (u8 *)& pAd->BeaconTxWI;
- if (NdisEqualMemory(pBeaconSync->BeaconTxWI[bcn_idx], &pAd->BeaconTxWI, TXWI_SIZE) == FALSE) { /* If BeaconTxWI changed, we need to rewrite the TxWI for the Beacon frames. */
- pBeaconSync->BeaconBitMap &=
- (~(BEACON_BITMAP_MASK & (1 << bcn_idx)));
- NdisMoveMemory(pBeaconSync->BeaconTxWI[bcn_idx],
- &pAd->BeaconTxWI, TXWI_SIZE);
- }
-
- if ((pBeaconSync->BeaconBitMap & (1 << bcn_idx)) !=
- (1 << bcn_idx)) {
- for (i = 0; i < TXWI_SIZE; i += 4) /* 16-byte TXWI field */
- {
- longValue =
- *ptr + (*(ptr + 1) << 8) +
- (*(ptr + 2) << 16) + (*(ptr + 3) << 24);
- RTMP_IO_WRITE32(pAd,
- pAd->BeaconOffset[bcn_idx] + i,
- longValue);
- ptr += 4;
- }
- }
-
- ptr = pBeaconSync->BeaconBuf[bcn_idx];
- padding = (FrameLen & 0x01);
- NdisZeroMemory((u8 *)(pBeaconFrame + FrameLen), padding);
- FrameLen += padding;
- for (i = 0; i < FrameLen /*HW_BEACON_OFFSET */ ; i += 2) {
- if (NdisEqualMemory(ptr, pBeaconFrame, 2) == FALSE) {
- NdisMoveMemory(ptr, pBeaconFrame, 2);
- /*shortValue = *ptr + (*(ptr+1)<<8); */
- /*RTMP_IO_WRITE8(pAd, pAd->BeaconOffset[bcn_idx] + TXWI_SIZE + i, shortValue); */
- RTUSBMultiWrite(pAd,
- pAd->BeaconOffset[bcn_idx] +
- TXWI_SIZE + i, ptr, 2);
- }
- ptr += 2;
- pBeaconFrame += 2;
- }
-
- pBeaconSync->BeaconBitMap |= (1 << bcn_idx);
-
- /* For AP interface, set the DtimBitOn so that we can send Bcast/Mcast frame out after this beacon frame. */
- }
-
-}
-
-void RTUSBBssBeaconStop(struct rt_rtmp_adapter *pAd)
-{
- struct rt_beacon_sync *pBeaconSync;
- int i, offset;
- BOOLEAN Cancelled = TRUE;
-
- pBeaconSync = pAd->CommonCfg.pBeaconSync;
- if (pBeaconSync && pBeaconSync->EnableBeacon) {
- int NumOfBcn;
-
- {
- NumOfBcn = MAX_MESH_NUM;
- }
-
- RTMPCancelTimer(&pAd->CommonCfg.BeaconUpdateTimer, &Cancelled);
-
- for (i = 0; i < NumOfBcn; i++) {
- NdisZeroMemory(pBeaconSync->BeaconBuf[i],
- HW_BEACON_OFFSET);
- NdisZeroMemory(pBeaconSync->BeaconTxWI[i], TXWI_SIZE);
-
- for (offset = 0; offset < HW_BEACON_OFFSET; offset += 4)
- RTMP_IO_WRITE32(pAd,
- pAd->BeaconOffset[i] + offset,
- 0x00);
-
- pBeaconSync->CapabilityInfoLocationInBeacon[i] = 0;
- pBeaconSync->TimIELocationInBeacon[i] = 0;
- }
- pBeaconSync->BeaconBitMap = 0;
- pBeaconSync->DtimBitOn = 0;
- }
-}
-
-void RTUSBBssBeaconStart(struct rt_rtmp_adapter *pAd)
-{
- int apidx;
- struct rt_beacon_sync *pBeaconSync;
-/* LARGE_INTEGER tsfTime, deltaTime; */
-
- pBeaconSync = pAd->CommonCfg.pBeaconSync;
- if (pBeaconSync && pBeaconSync->EnableBeacon) {
- int NumOfBcn;
-
- {
- NumOfBcn = MAX_MESH_NUM;
- }
-
- for (apidx = 0; apidx < NumOfBcn; apidx++) {
- u8 CapabilityInfoLocationInBeacon = 0;
- u8 TimIELocationInBeacon = 0;
-
- NdisZeroMemory(pBeaconSync->BeaconBuf[apidx],
- HW_BEACON_OFFSET);
- pBeaconSync->CapabilityInfoLocationInBeacon[apidx] =
- CapabilityInfoLocationInBeacon;
- pBeaconSync->TimIELocationInBeacon[apidx] =
- TimIELocationInBeacon;
- NdisZeroMemory(pBeaconSync->BeaconTxWI[apidx],
- TXWI_SIZE);
- }
- pBeaconSync->BeaconBitMap = 0;
- pBeaconSync->DtimBitOn = 0;
- pAd->CommonCfg.BeaconUpdateTimer.Repeat = TRUE;
-
- pAd->CommonCfg.BeaconAdjust = 0;
- pAd->CommonCfg.BeaconFactor =
- 0xffffffff / (pAd->CommonCfg.BeaconPeriod << 10);
- pAd->CommonCfg.BeaconRemain =
- (0xffffffff % (pAd->CommonCfg.BeaconPeriod << 10)) + 1;
- DBGPRINT(RT_DEBUG_TRACE,
- ("RTUSBBssBeaconStart:BeaconFactor=%d, BeaconRemain=%d!\n",
- pAd->CommonCfg.BeaconFactor,
- pAd->CommonCfg.BeaconRemain));
- RTMPSetTimer(&pAd->CommonCfg.BeaconUpdateTimer,
- 10 /*pAd->CommonCfg.BeaconPeriod */ );
-
- }
-}
-
-void RTUSBBssBeaconInit(struct rt_rtmp_adapter *pAd)
-{
- struct rt_beacon_sync *pBeaconSync;
- int i;
-
- os_alloc_mem(pAd, (u8 **) (&pAd->CommonCfg.pBeaconSync),
- sizeof(struct rt_beacon_sync));
- /*NdisAllocMemory(pAd->CommonCfg.pBeaconSync, sizeof(struct rt_beacon_sync), MEM_ALLOC_FLAG); */
- if (pAd->CommonCfg.pBeaconSync) {
- pBeaconSync = pAd->CommonCfg.pBeaconSync;
- NdisZeroMemory(pBeaconSync, sizeof(struct rt_beacon_sync));
- for (i = 0; i < HW_BEACON_MAX_COUNT; i++) {
- NdisZeroMemory(pBeaconSync->BeaconBuf[i],
- HW_BEACON_OFFSET);
- pBeaconSync->CapabilityInfoLocationInBeacon[i] = 0;
- pBeaconSync->TimIELocationInBeacon[i] = 0;
- NdisZeroMemory(pBeaconSync->BeaconTxWI[i], TXWI_SIZE);
- }
- pBeaconSync->BeaconBitMap = 0;
-
- /*RTMPInitTimer(pAd, &pAd->CommonCfg.BeaconUpdateTimer, GET_TIMER_FUNCTION(BeaconUpdateExec), pAd, TRUE); */
- pBeaconSync->EnableBeacon = TRUE;
- }
-}
-
-void RTUSBBssBeaconExit(struct rt_rtmp_adapter *pAd)
-{
- struct rt_beacon_sync *pBeaconSync;
- BOOLEAN Cancelled = TRUE;
- int i;
-
- if (pAd->CommonCfg.pBeaconSync) {
- pBeaconSync = pAd->CommonCfg.pBeaconSync;
- pBeaconSync->EnableBeacon = FALSE;
- RTMPCancelTimer(&pAd->CommonCfg.BeaconUpdateTimer, &Cancelled);
- pBeaconSync->BeaconBitMap = 0;
-
- for (i = 0; i < HW_BEACON_MAX_COUNT; i++) {
- NdisZeroMemory(pBeaconSync->BeaconBuf[i],
- HW_BEACON_OFFSET);
- pBeaconSync->CapabilityInfoLocationInBeacon[i] = 0;
- pBeaconSync->TimIELocationInBeacon[i] = 0;
- NdisZeroMemory(pBeaconSync->BeaconTxWI[i], TXWI_SIZE);
- }
-
- os_free_mem(pAd, pAd->CommonCfg.pBeaconSync);
- pAd->CommonCfg.pBeaconSync = NULL;
- }
-}
-
-/*
- ========================================================================
- Routine Description:
- For device work as AP mode but didn't have TBTT interrupt event, we need a mechanism
- to update the beacon context in each Beacon interval. Here we use a periodical timer
- to simulate the TBTT interrupt to handle the beacon context update.
-
- Arguments:
- SystemSpecific1 - Not used.
- FunctionContext - Pointer to our Adapter context.
- SystemSpecific2 - Not used.
- SystemSpecific3 - Not used.
-
- Return Value:
- None
-
- ========================================================================
-*/
-void BeaconUpdateExec(void *SystemSpecific1,
- void *FunctionContext,
- void *SystemSpecific2, void *SystemSpecific3)
-{
- struct rt_rtmp_adapter *pAd = (struct rt_rtmp_adapter *)FunctionContext;
- LARGE_INTEGER tsfTime_a; /*, tsfTime_b, deltaTime_exp, deltaTime_ab; */
- u32 delta, delta2MS, period2US, remain, remain_low, remain_high;
-/* BOOLEAN positive; */
-
- if (pAd->CommonCfg.IsUpdateBeacon == TRUE) {
- ReSyncBeaconTime(pAd);
-
- }
-
- RTMP_IO_READ32(pAd, TSF_TIMER_DW0, &tsfTime_a.u.LowPart);
- RTMP_IO_READ32(pAd, TSF_TIMER_DW1, &tsfTime_a.u.HighPart);
-
- /*positive=getDeltaTime(tsfTime_a, expectedTime, &deltaTime_exp); */
- period2US = (pAd->CommonCfg.BeaconPeriod << 10);
- remain_high = pAd->CommonCfg.BeaconRemain * tsfTime_a.u.HighPart;
- remain_low = tsfTime_a.u.LowPart % (pAd->CommonCfg.BeaconPeriod << 10);
- remain =
- (remain_high + remain_low) % (pAd->CommonCfg.BeaconPeriod << 10);
- delta = (pAd->CommonCfg.BeaconPeriod << 10) - remain;
-
- delta2MS = (delta >> 10);
- if (delta2MS > 150) {
- pAd->CommonCfg.BeaconUpdateTimer.TimerValue = 100;
- pAd->CommonCfg.IsUpdateBeacon = FALSE;
- } else {
- pAd->CommonCfg.BeaconUpdateTimer.TimerValue = delta2MS + 10;
- pAd->CommonCfg.IsUpdateBeacon = TRUE;
- }
-
-}
-
-/********************************************************************
- *
- * 2870 Radio on/off Related functions.
- *
- ********************************************************************/
-void RT28xxUsbMlmeRadioOn(struct rt_rtmp_adapter *pAd)
-{
- struct rt_rtmp_chip_op *pChipOps = &pAd->chipOps;
-
- DBGPRINT(RT_DEBUG_TRACE, ("RT28xxUsbMlmeRadioOn()\n"));
-
- if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))
- return;
-
- {
- AsicSendCommandToMcu(pAd, 0x31, 0xff, 0x00, 0x02);
- RTMPusecDelay(10000);
- }
- /*NICResetFromError(pAd); */
-
- /* Enable Tx/Rx */
- RTMPEnableRxTx(pAd);
-
- if (pChipOps->AsicReverseRfFromSleepMode)
- pChipOps->AsicReverseRfFromSleepMode(pAd);
-
- /* Clear Radio off flag */
- RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
-
- RTUSBBulkReceive(pAd);
-
- /* Set LED */
- RTMPSetLED(pAd, LED_RADIO_ON);
-}
-
-void RT28xxUsbMlmeRadioOFF(struct rt_rtmp_adapter *pAd)
-{
- WPDMA_GLO_CFG_STRUC GloCfg;
- u32 Value, i;
-
- DBGPRINT(RT_DEBUG_TRACE, ("RT28xxUsbMlmeRadioOFF()\n"));
-
- if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))
- return;
-
- /* Clear PMKID cache. */
- pAd->StaCfg.SavedPMKNum = 0;
- RTMPZeroMemory(pAd->StaCfg.SavedPMK, (PMKID_NO * sizeof(struct rt_bssid_info)));
-
- /* Link down first if any association exists */
- if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) {
- if (INFRA_ON(pAd) || ADHOC_ON(pAd)) {
- struct rt_mlme_disassoc_req DisReq;
- struct rt_mlme_queue_elem *pMsgElem =
- kmalloc(sizeof(struct rt_mlme_queue_elem),
- MEM_ALLOC_FLAG);
-
- if (pMsgElem) {
- COPY_MAC_ADDR(&DisReq.Addr,
- pAd->CommonCfg.Bssid);
- DisReq.Reason = REASON_DISASSOC_STA_LEAVING;
-
- pMsgElem->Machine = ASSOC_STATE_MACHINE;
- pMsgElem->MsgType = MT2_MLME_DISASSOC_REQ;
- pMsgElem->MsgLen =
- sizeof(struct rt_mlme_disassoc_req);
- NdisMoveMemory(pMsgElem->Msg, &DisReq,
- sizeof
- (struct rt_mlme_disassoc_req));
-
- MlmeDisassocReqAction(pAd, pMsgElem);
- kfree(pMsgElem);
-
- RTMPusecDelay(1000);
- }
- }
- }
- /* Set Radio off flag */
- RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
-
- {
- /* Link down first if any association exists */
- if (INFRA_ON(pAd) || ADHOC_ON(pAd))
- LinkDown(pAd, FALSE);
- RTMPusecDelay(10000);
-
- /*========================================== */
- /* Clean up old bss table */
- BssTableInit(&pAd->ScanTab);
- }
-
- /* Set LED */
- RTMPSetLED(pAd, LED_RADIO_OFF);
-
- if (pAd->CommonCfg.BBPCurrentBW == BW_40) {
- /* Must using 40MHz. */
- AsicTurnOffRFClk(pAd, pAd->CommonCfg.CentralChannel);
- } else {
- /* Must using 20MHz. */
- AsicTurnOffRFClk(pAd, pAd->CommonCfg.Channel);
- }
-
- /* Disable Tx/Rx DMA */
- RTUSBReadMACRegister(pAd, WPDMA_GLO_CFG, &GloCfg.word); /* disable DMA */
- GloCfg.field.EnableTxDMA = 0;
- GloCfg.field.EnableRxDMA = 0;
- RTUSBWriteMACRegister(pAd, WPDMA_GLO_CFG, GloCfg.word); /* abort all TX rings */
-
- /* Waiting for DMA idle */
- i = 0;
- do {
- RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
- if ((GloCfg.field.TxDMABusy == 0)
- && (GloCfg.field.RxDMABusy == 0))
- break;
-
- RTMPusecDelay(1000);
- } while (i++ < 100);
-
- /* Disable MAC Tx/Rx */
- RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
- Value &= (0xfffffff3);
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
-
- {
- AsicSendCommandToMcu(pAd, 0x30, 0xff, 0xff, 0x02);
- }
-}
-
-#endif /* RTMP_MAC_USB // */
diff --git a/drivers/staging/rt2860/common/cmm_sanity.c b/drivers/staging/rt2860/common/cmm_sanity.c
deleted file mode 100644
index 3bfb4ad00c1a..000000000000
--- a/drivers/staging/rt2860/common/cmm_sanity.c
+++ /dev/null
@@ -1,1205 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-
- Module Name:
- sanity.c
-
- Abstract:
-
- Revision History:
- Who When What
- -------- ---------- ----------------------------------------------
- John Chang 2004-09-01 add WMM support
-*/
-#include "../rt_config.h"
-
-extern u8 CISCO_OUI[];
-
-extern u8 WPA_OUI[];
-extern u8 RSN_OUI[];
-extern u8 WME_INFO_ELEM[];
-extern u8 WME_PARM_ELEM[];
-extern u8 Ccx2QosInfo[];
-extern u8 RALINK_OUI[];
-extern u8 BROADCOM_OUI[];
-extern u8 WPS_OUI[];
-
-/*
- ==========================================================================
- Description:
- MLME message sanity check
- Return:
- TRUE if all parameters are OK, FALSE otherwise
-
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-BOOLEAN MlmeAddBAReqSanity(struct rt_rtmp_adapter *pAd,
- void * Msg, unsigned long MsgLen, u8 *pAddr2)
-{
- struct rt_mlme_addba_req *pInfo;
-
- pInfo = (struct rt_mlme_addba_req *)Msg;
-
- if ((MsgLen != sizeof(struct rt_mlme_addba_req))) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("MlmeAddBAReqSanity fail - message length not correct.\n"));
- return FALSE;
- }
-
- if ((pInfo->Wcid >= MAX_LEN_OF_MAC_TABLE)) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("MlmeAddBAReqSanity fail - The peer Mac is not associated yet.\n"));
- return FALSE;
- }
-
- if ((pInfo->pAddr[0] & 0x01) == 0x01) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("MlmeAddBAReqSanity fail - broadcast address not support BA\n"));
- return FALSE;
- }
-
- return TRUE;
-}
-
-/*
- ==========================================================================
- Description:
- MLME message sanity check
- Return:
- TRUE if all parameters are OK, FALSE otherwise
-
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-BOOLEAN MlmeDelBAReqSanity(struct rt_rtmp_adapter *pAd, void * Msg, unsigned long MsgLen)
-{
- struct rt_mlme_delba_req *pInfo;
- pInfo = (struct rt_mlme_delba_req *)Msg;
-
- if ((MsgLen != sizeof(struct rt_mlme_delba_req))) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("MlmeDelBAReqSanity fail - message length not correct.\n"));
- return FALSE;
- }
-
- if ((pInfo->Wcid >= MAX_LEN_OF_MAC_TABLE)) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("MlmeDelBAReqSanity fail - The peer Mac is not associated yet.\n"));
- return FALSE;
- }
-
- if ((pInfo->TID & 0xf0)) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("MlmeDelBAReqSanity fail - The peer TID is incorrect.\n"));
- return FALSE;
- }
-
- if (NdisEqualMemory
- (pAd->MacTab.Content[pInfo->Wcid].Addr, pInfo->Addr,
- MAC_ADDR_LEN) == 0) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("MlmeDelBAReqSanity fail - the peer addr dosen't exist.\n"));
- return FALSE;
- }
-
- return TRUE;
-}
-
-BOOLEAN PeerAddBAReqActionSanity(struct rt_rtmp_adapter *pAd,
- void * pMsg,
- unsigned long MsgLen, u8 *pAddr2)
-{
- struct rt_frame_802_11 * pFrame = (struct rt_frame_802_11 *) pMsg;
- struct rt_frame_addba_req * pAddFrame;
- pAddFrame = (struct rt_frame_addba_req *) (pMsg);
- if (MsgLen < (sizeof(struct rt_frame_addba_req))) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("PeerAddBAReqActionSanity: ADDBA Request frame length size = %ld incorrect\n",
- MsgLen));
- return FALSE;
- }
- /* we support immediate BA. */
- *(u16 *) (&pAddFrame->BaParm) =
- cpu2le16(*(u16 *) (&pAddFrame->BaParm));
- pAddFrame->TimeOutValue = cpu2le16(pAddFrame->TimeOutValue);
- pAddFrame->BaStartSeq.word = cpu2le16(pAddFrame->BaStartSeq.word);
-
- if (pAddFrame->BaParm.BAPolicy != IMMED_BA) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("PeerAddBAReqActionSanity: ADDBA Request Ba Policy[%d] not support\n",
- pAddFrame->BaParm.BAPolicy));
- DBGPRINT(RT_DEBUG_ERROR,
- ("ADDBA Request. tid=%x, Bufsize=%x, AMSDUSupported=%x \n",
- pAddFrame->BaParm.TID, pAddFrame->BaParm.BufSize,
- pAddFrame->BaParm.AMSDUSupported));
- return FALSE;
- }
- /* we support immediate BA. */
- if (pAddFrame->BaParm.TID & 0xfff0) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("PeerAddBAReqActionSanity: ADDBA Request incorrect TID = %d\n",
- pAddFrame->BaParm.TID));
- return FALSE;
- }
- COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);
- return TRUE;
-}
-
-BOOLEAN PeerAddBARspActionSanity(struct rt_rtmp_adapter *pAd,
- void * pMsg, unsigned long MsgLen)
-{
- struct rt_frame_addba_rsp * pAddFrame;
-
- pAddFrame = (struct rt_frame_addba_rsp *) (pMsg);
- if (MsgLen < (sizeof(struct rt_frame_addba_rsp))) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("PeerAddBARspActionSanity: ADDBA Response frame length size = %ld incorrect\n",
- MsgLen));
- return FALSE;
- }
- /* we support immediate BA. */
- *(u16 *) (&pAddFrame->BaParm) =
- cpu2le16(*(u16 *) (&pAddFrame->BaParm));
- pAddFrame->StatusCode = cpu2le16(pAddFrame->StatusCode);
- pAddFrame->TimeOutValue = cpu2le16(pAddFrame->TimeOutValue);
-
- if (pAddFrame->BaParm.BAPolicy != IMMED_BA) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("PeerAddBAReqActionSanity: ADDBA Response Ba Policy[%d] not support\n",
- pAddFrame->BaParm.BAPolicy));
- return FALSE;
- }
- /* we support immediate BA. */
- if (pAddFrame->BaParm.TID & 0xfff0) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("PeerAddBARspActionSanity: ADDBA Response incorrect TID = %d\n",
- pAddFrame->BaParm.TID));
- return FALSE;
- }
- return TRUE;
-
-}
-
-BOOLEAN PeerDelBAActionSanity(struct rt_rtmp_adapter *pAd,
- u8 Wcid, void * pMsg, unsigned long MsgLen)
-{
- /*struct rt_frame_802_11 * pFrame = (struct rt_frame_802_11 *)pMsg; */
- struct rt_frame_delba_req * pDelFrame;
- if (MsgLen != (sizeof(struct rt_frame_delba_req)))
- return FALSE;
-
- if (Wcid >= MAX_LEN_OF_MAC_TABLE)
- return FALSE;
-
- pDelFrame = (struct rt_frame_delba_req *) (pMsg);
-
- *(u16 *) (&pDelFrame->DelbaParm) =
- cpu2le16(*(u16 *) (&pDelFrame->DelbaParm));
- pDelFrame->ReasonCode = cpu2le16(pDelFrame->ReasonCode);
-
- if (pDelFrame->DelbaParm.TID & 0xfff0)
- return FALSE;
-
- return TRUE;
-}
-
-/*
- ==========================================================================
- Description:
- MLME message sanity check
- Return:
- TRUE if all parameters are OK, FALSE otherwise
-
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-BOOLEAN PeerBeaconAndProbeRspSanity(struct rt_rtmp_adapter *pAd, void * Msg, unsigned long MsgLen, u8 MsgChannel, u8 *pAddr2, u8 *pBssid, char Ssid[], u8 * pSsidLen, u8 * pBssType, u16 * pBeaconPeriod, u8 * pChannel, u8 * pNewChannel, OUT LARGE_INTEGER * pTimestamp, struct rt_cf_parm * pCfParm, u16 * pAtimWin, u16 * pCapabilityInfo, u8 * pErp, u8 * pDtimCount, u8 * pDtimPeriod, u8 * pBcastFlag, u8 * pMessageToMe, u8 SupRate[], u8 * pSupRateLen, u8 ExtRate[], u8 * pExtRateLen, u8 * pCkipFlag, u8 * pAironetCellPowerLimit, struct rt_edca_parm *pEdcaParm, struct rt_qbss_load_parm *pQbssLoad, struct rt_qos_capability_parm *pQosCapability, unsigned long * pRalinkIe, u8 * pHtCapabilityLen, u8 * pPreNHtCapabilityLen, struct rt_ht_capability_ie * pHtCapability, u8 * AddHtInfoLen, struct rt_add_ht_info_ie * AddHtInfo, u8 * NewExtChannelOffset, /* Ht extension channel offset(above or below) */
- u16 * LengthVIE,
- struct rt_ndis_802_11_variable_ies *pVIE)
-{
- u8 *Ptr;
- u8 TimLen;
- struct rt_frame_802_11 * pFrame;
- struct rt_eid * pEid;
- u8 SubType;
- u8 Sanity;
- /*u8 ECWMin, ECWMax; */
- /*MAC_CSR9_STRUC Csr9; */
- unsigned long Length = 0;
-
- /* For some 11a AP which didn't have DS_IE, we use two conditions to decide the channel */
- /* 1. If the AP is 11n enabled, then check the control channel. */
- /* 2. If the AP didn't have any info about channel, use the channel we received this frame as the channel. (May inaccuracy!) */
- u8 CtrlChannel = 0;
-
- /* Add for 3 necessary EID field check */
- Sanity = 0;
-
- *pAtimWin = 0;
- *pErp = 0;
- *pDtimCount = 0;
- *pDtimPeriod = 0;
- *pBcastFlag = 0;
- *pMessageToMe = 0;
- *pExtRateLen = 0;
- *pCkipFlag = 0; /* Default of CkipFlag is 0 */
- *pAironetCellPowerLimit = 0xFF; /* Default of AironetCellPowerLimit is 0xFF */
- *LengthVIE = 0; /* Set the length of VIE to init value 0 */
- *pHtCapabilityLen = 0; /* Set the length of VIE to init value 0 */
- if (pAd->OpMode == OPMODE_STA)
- *pPreNHtCapabilityLen = 0; /* Set the length of VIE to init value 0 */
- *AddHtInfoLen = 0; /* Set the length of VIE to init value 0 */
- *pRalinkIe = 0;
- *pNewChannel = 0;
- *NewExtChannelOffset = 0xff; /*Default 0xff means no such IE */
- pCfParm->bValid = FALSE; /* default: no IE_CF found */
- pQbssLoad->bValid = FALSE; /* default: no IE_QBSS_LOAD found */
- pEdcaParm->bValid = FALSE; /* default: no IE_EDCA_PARAMETER found */
- pQosCapability->bValid = FALSE; /* default: no IE_QOS_CAPABILITY found */
-
- pFrame = (struct rt_frame_802_11 *) Msg;
-
- /* get subtype from header */
- SubType = (u8)pFrame->Hdr.FC.SubType;
-
- /* get Addr2 and BSSID from header */
- COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);
- COPY_MAC_ADDR(pBssid, pFrame->Hdr.Addr3);
-
- Ptr = pFrame->Octet;
- Length += LENGTH_802_11;
-
- /* get timestamp from payload and advance the pointer */
- NdisMoveMemory(pTimestamp, Ptr, TIMESTAMP_LEN);
-
- pTimestamp->u.LowPart = cpu2le32(pTimestamp->u.LowPart);
- pTimestamp->u.HighPart = cpu2le32(pTimestamp->u.HighPart);
-
- Ptr += TIMESTAMP_LEN;
- Length += TIMESTAMP_LEN;
-
- /* get beacon interval from payload and advance the pointer */
- NdisMoveMemory(pBeaconPeriod, Ptr, 2);
- Ptr += 2;
- Length += 2;
-
- /* get capability info from payload and advance the pointer */
- NdisMoveMemory(pCapabilityInfo, Ptr, 2);
- Ptr += 2;
- Length += 2;
-
- if (CAP_IS_ESS_ON(*pCapabilityInfo))
- *pBssType = BSS_INFRA;
- else
- *pBssType = BSS_ADHOC;
-
- pEid = (struct rt_eid *) Ptr;
-
- /* get variable fields from payload and advance the pointer */
- while ((Length + 2 + pEid->Len) <= MsgLen) {
- /* */
- /* Secure copy VIE to VarIE[MAX_VIE_LEN] didn't overflow. */
- /* */
- if ((*LengthVIE + pEid->Len + 2) >= MAX_VIE_LEN) {
- DBGPRINT(RT_DEBUG_WARN,
- ("PeerBeaconAndProbeRspSanity - Variable IEs out of resource [len(=%d) > MAX_VIE_LEN(=%d)]\n",
- (*LengthVIE + pEid->Len + 2), MAX_VIE_LEN));
- break;
- }
-
- switch (pEid->Eid) {
- case IE_SSID:
- /* Already has one SSID EID in this beacon, ignore the second one */
- if (Sanity & 0x1)
- break;
- if (pEid->Len <= MAX_LEN_OF_SSID) {
- NdisMoveMemory(Ssid, pEid->Octet, pEid->Len);
- *pSsidLen = pEid->Len;
- Sanity |= 0x1;
- } else {
- DBGPRINT(RT_DEBUG_TRACE,
- ("PeerBeaconAndProbeRspSanity - wrong IE_SSID (len=%d)\n",
- pEid->Len));
- return FALSE;
- }
- break;
-
- case IE_SUPP_RATES:
- if (pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES) {
- Sanity |= 0x2;
- NdisMoveMemory(SupRate, pEid->Octet, pEid->Len);
- *pSupRateLen = pEid->Len;
-
- /* TODO: 2004-09-14 not a good design here, cause it exclude extra rates */
- /* from ScanTab. We should report as is. And filter out unsupported */
- /* rates in MlmeAux. */
- /* Check against the supported rates */
- /* RTMPCheckRates(pAd, SupRate, pSupRateLen); */
- } else {
- DBGPRINT(RT_DEBUG_TRACE,
- ("PeerBeaconAndProbeRspSanity - wrong IE_SUPP_RATES (len=%d)\n",
- pEid->Len));
- return FALSE;
- }
- break;
-
- case IE_HT_CAP:
- if (pEid->Len >= SIZE_HT_CAP_IE) /*Note: allow extension! */
- {
- NdisMoveMemory(pHtCapability, pEid->Octet,
- sizeof(struct rt_ht_capability_ie));
- *pHtCapabilityLen = SIZE_HT_CAP_IE; /* Nnow we only support 26 bytes. */
-
- *(u16 *) (&pHtCapability->HtCapInfo) =
- cpu2le16(*(u16 *)
- (&pHtCapability->HtCapInfo));
- *(u16 *) (&pHtCapability->ExtHtCapInfo) =
- cpu2le16(*(u16 *)
- (&pHtCapability->ExtHtCapInfo));
-
- {
- *pPreNHtCapabilityLen = 0; /* Nnow we only support 26 bytes. */
-
- Ptr = (u8 *)pVIE;
- NdisMoveMemory(Ptr + *LengthVIE,
- &pEid->Eid,
- pEid->Len + 2);
- *LengthVIE += (pEid->Len + 2);
- }
- } else {
- DBGPRINT(RT_DEBUG_WARN,
- ("PeerBeaconAndProbeRspSanity - wrong IE_HT_CAP. pEid->Len = %d\n",
- pEid->Len));
- }
-
- break;
- case IE_ADD_HT:
- if (pEid->Len >= sizeof(struct rt_add_ht_info_ie)) {
- /* This IE allows extension, but we can ignore extra bytes beyond our knowledge , so only */
- /* copy first sizeof(struct rt_add_ht_info_ie) */
- NdisMoveMemory(AddHtInfo, pEid->Octet,
- sizeof(struct rt_add_ht_info_ie));
- *AddHtInfoLen = SIZE_ADD_HT_INFO_IE;
-
- CtrlChannel = AddHtInfo->ControlChan;
-
- *(u16 *) (&AddHtInfo->AddHtInfo2) =
- cpu2le16(*(u16 *)
- (&AddHtInfo->AddHtInfo2));
- *(u16 *) (&AddHtInfo->AddHtInfo3) =
- cpu2le16(*(u16 *)
- (&AddHtInfo->AddHtInfo3));
-
- {
- Ptr = (u8 *)pVIE;
- NdisMoveMemory(Ptr + *LengthVIE,
- &pEid->Eid,
- pEid->Len + 2);
- *LengthVIE += (pEid->Len + 2);
- }
- } else {
- DBGPRINT(RT_DEBUG_WARN,
- ("PeerBeaconAndProbeRspSanity - wrong IE_ADD_HT. \n"));
- }
-
- break;
- case IE_SECONDARY_CH_OFFSET:
- if (pEid->Len == 1) {
- *NewExtChannelOffset = pEid->Octet[0];
- } else {
- DBGPRINT(RT_DEBUG_WARN,
- ("PeerBeaconAndProbeRspSanity - wrong IE_SECONDARY_CH_OFFSET. \n"));
- }
-
- break;
- case IE_FH_PARM:
- DBGPRINT(RT_DEBUG_TRACE,
- ("PeerBeaconAndProbeRspSanity(IE_FH_PARM) \n"));
- break;
-
- case IE_DS_PARM:
- if (pEid->Len == 1) {
- *pChannel = *pEid->Octet;
-
- {
- if (ChannelSanity(pAd, *pChannel) == 0) {
-
- return FALSE;
- }
- }
-
- Sanity |= 0x4;
- } else {
- DBGPRINT(RT_DEBUG_TRACE,
- ("PeerBeaconAndProbeRspSanity - wrong IE_DS_PARM (len=%d)\n",
- pEid->Len));
- return FALSE;
- }
- break;
-
- case IE_CF_PARM:
- if (pEid->Len == 6) {
- pCfParm->bValid = TRUE;
- pCfParm->CfpCount = pEid->Octet[0];
- pCfParm->CfpPeriod = pEid->Octet[1];
- pCfParm->CfpMaxDuration =
- pEid->Octet[2] + 256 * pEid->Octet[3];
- pCfParm->CfpDurRemaining =
- pEid->Octet[4] + 256 * pEid->Octet[5];
- } else {
- DBGPRINT(RT_DEBUG_TRACE,
- ("PeerBeaconAndProbeRspSanity - wrong IE_CF_PARM\n"));
- return FALSE;
- }
- break;
-
- case IE_IBSS_PARM:
- if (pEid->Len == 2) {
- NdisMoveMemory(pAtimWin, pEid->Octet,
- pEid->Len);
- } else {
- DBGPRINT(RT_DEBUG_TRACE,
- ("PeerBeaconAndProbeRspSanity - wrong IE_IBSS_PARM\n"));
- return FALSE;
- }
- break;
-
- case IE_TIM:
- if (INFRA_ON(pAd) && SubType == SUBTYPE_BEACON) {
- GetTimBit((char *)pEid, pAd->StaActive.Aid,
- &TimLen, pBcastFlag, pDtimCount,
- pDtimPeriod, pMessageToMe);
- }
- break;
- case IE_CHANNEL_SWITCH_ANNOUNCEMENT:
- if (pEid->Len == 3) {
- *pNewChannel = pEid->Octet[1]; /*extract new channel number */
- }
- break;
-
- /* New for WPA */
- /* CCX v2 has the same IE, we need to parse that too */
- /* Wifi WMM use the same IE vale, need to parse that too */
- /* case IE_WPA: */
- case IE_VENDOR_SPECIFIC:
- /* Check Broadcom/Atheros 802.11n OUI version, for HT Capability IE. */
- /* This HT IE is before IEEE draft set HT IE value.2006-09-28 by Jan. */
- /*if (NdisEqualMemory(pEid->Octet, BROADCOM_OUI, 3) && (pEid->Len >= 4))
- {
- if ((pEid->Octet[3] == OUI_BROADCOM_HT) && (pEid->Len >= 30))
- {
- {
- NdisMoveMemory(pHtCapability, &pEid->Octet[4], sizeof(struct rt_ht_capability_ie));
- *pHtCapabilityLen = SIZE_HT_CAP_IE; // Nnow we only support 26 bytes.
- }
- }
- if ((pEid->Octet[3] == OUI_BROADCOM_HT) && (pEid->Len >= 26))
- {
- {
- NdisMoveMemory(AddHtInfo, &pEid->Octet[4], sizeof(struct rt_add_ht_info_ie));
- *AddHtInfoLen = SIZE_ADD_HT_INFO_IE; // Nnow we only support 26 bytes.
- }
- }
- }
- */
- /* Check the OUI version, filter out non-standard usage */
- if (NdisEqualMemory(pEid->Octet, RALINK_OUI, 3)
- && (pEid->Len == 7)) {
- /**pRalinkIe = pEid->Octet[3]; */
- if (pEid->Octet[3] != 0)
- *pRalinkIe = pEid->Octet[3];
- else
- *pRalinkIe = 0xf0000000; /* Set to non-zero value (can't set bit0-2) to represent this is Ralink Chip. So at linkup, we will set ralinkchip flag. */
- }
- /* This HT IE is before IEEE draft set HT IE value.2006-09-28 by Jan. */
-
- /* Other vendors had production before IE_HT_CAP value is assigned. To backward support those old-firmware AP, */
- /* Check broadcom-defiend pre-802.11nD1.0 OUI for HT related IE, including HT Capatilities IE and HT Information IE */
- else if ((*pHtCapabilityLen == 0)
- && NdisEqualMemory(pEid->Octet, PRE_N_HT_OUI,
- 3) && (pEid->Len >= 4)
- && (pAd->OpMode == OPMODE_STA)) {
- if ((pEid->Octet[3] == OUI_PREN_HT_CAP)
- && (pEid->Len >= 30)
- && (*pHtCapabilityLen == 0)) {
- NdisMoveMemory(pHtCapability,
- &pEid->Octet[4],
- sizeof
- (struct rt_ht_capability_ie));
- *pPreNHtCapabilityLen = SIZE_HT_CAP_IE;
- }
-
- if ((pEid->Octet[3] == OUI_PREN_ADD_HT)
- && (pEid->Len >= 26)) {
- NdisMoveMemory(AddHtInfo,
- &pEid->Octet[4],
- sizeof(struct rt_add_ht_info_ie));
- *AddHtInfoLen = SIZE_ADD_HT_INFO_IE;
- }
- } else if (NdisEqualMemory(pEid->Octet, WPA_OUI, 4)) {
- /* Copy to pVIE which will report to microsoft bssid list. */
- Ptr = (u8 *)pVIE;
- NdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid,
- pEid->Len + 2);
- *LengthVIE += (pEid->Len + 2);
- } else
- if (NdisEqualMemory(pEid->Octet, WME_PARM_ELEM, 6)
- && (pEid->Len == 24)) {
- u8 *ptr;
- int i;
-
- /* parsing EDCA parameters */
- pEdcaParm->bValid = TRUE;
- pEdcaParm->bQAck = FALSE; /* pEid->Octet[0] & 0x10; */
- pEdcaParm->bQueueRequest = FALSE; /* pEid->Octet[0] & 0x20; */
- pEdcaParm->bTxopRequest = FALSE; /* pEid->Octet[0] & 0x40; */
- pEdcaParm->EdcaUpdateCount =
- pEid->Octet[6] & 0x0f;
- pEdcaParm->bAPSDCapable =
- (pEid->Octet[6] & 0x80) ? 1 : 0;
- ptr = &pEid->Octet[8];
- for (i = 0; i < 4; i++) {
- u8 aci = (*ptr & 0x60) >> 5; /* b5~6 is AC INDEX */
- pEdcaParm->bACM[aci] = (((*ptr) & 0x10) == 0x10); /* b5 is ACM */
- pEdcaParm->Aifsn[aci] = (*ptr) & 0x0f; /* b0~3 is AIFSN */
- pEdcaParm->Cwmin[aci] = *(ptr + 1) & 0x0f; /* b0~4 is Cwmin */
- pEdcaParm->Cwmax[aci] = *(ptr + 1) >> 4; /* b5~8 is Cwmax */
- pEdcaParm->Txop[aci] = *(ptr + 2) + 256 * (*(ptr + 3)); /* in unit of 32-us */
- ptr += 4; /* point to next AC */
- }
- } else
- if (NdisEqualMemory(pEid->Octet, WME_INFO_ELEM, 6)
- && (pEid->Len == 7)) {
- /* parsing EDCA parameters */
- pEdcaParm->bValid = TRUE;
- pEdcaParm->bQAck = FALSE; /* pEid->Octet[0] & 0x10; */
- pEdcaParm->bQueueRequest = FALSE; /* pEid->Octet[0] & 0x20; */
- pEdcaParm->bTxopRequest = FALSE; /* pEid->Octet[0] & 0x40; */
- pEdcaParm->EdcaUpdateCount =
- pEid->Octet[6] & 0x0f;
- pEdcaParm->bAPSDCapable =
- (pEid->Octet[6] & 0x80) ? 1 : 0;
-
- /* use default EDCA parameter */
- pEdcaParm->bACM[QID_AC_BE] = 0;
- pEdcaParm->Aifsn[QID_AC_BE] = 3;
- pEdcaParm->Cwmin[QID_AC_BE] = CW_MIN_IN_BITS;
- pEdcaParm->Cwmax[QID_AC_BE] = CW_MAX_IN_BITS;
- pEdcaParm->Txop[QID_AC_BE] = 0;
-
- pEdcaParm->bACM[QID_AC_BK] = 0;
- pEdcaParm->Aifsn[QID_AC_BK] = 7;
- pEdcaParm->Cwmin[QID_AC_BK] = CW_MIN_IN_BITS;
- pEdcaParm->Cwmax[QID_AC_BK] = CW_MAX_IN_BITS;
- pEdcaParm->Txop[QID_AC_BK] = 0;
-
- pEdcaParm->bACM[QID_AC_VI] = 0;
- pEdcaParm->Aifsn[QID_AC_VI] = 2;
- pEdcaParm->Cwmin[QID_AC_VI] =
- CW_MIN_IN_BITS - 1;
- pEdcaParm->Cwmax[QID_AC_VI] = CW_MAX_IN_BITS;
- pEdcaParm->Txop[QID_AC_VI] = 96; /* AC_VI: 96*32us ~= 3ms */
-
- pEdcaParm->bACM[QID_AC_VO] = 0;
- pEdcaParm->Aifsn[QID_AC_VO] = 2;
- pEdcaParm->Cwmin[QID_AC_VO] =
- CW_MIN_IN_BITS - 2;
- pEdcaParm->Cwmax[QID_AC_VO] =
- CW_MAX_IN_BITS - 1;
- pEdcaParm->Txop[QID_AC_VO] = 48; /* AC_VO: 48*32us ~= 1.5ms */
- }
-
- break;
-
- case IE_EXT_SUPP_RATES:
- if (pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES) {
- NdisMoveMemory(ExtRate, pEid->Octet, pEid->Len);
- *pExtRateLen = pEid->Len;
-
- /* TODO: 2004-09-14 not a good design here, cause it exclude extra rates */
- /* from ScanTab. We should report as is. And filter out unsupported */
- /* rates in MlmeAux. */
- /* Check against the supported rates */
- /* RTMPCheckRates(pAd, ExtRate, pExtRateLen); */
- }
- break;
-
- case IE_ERP:
- if (pEid->Len == 1) {
- *pErp = (u8)pEid->Octet[0];
- }
- break;
-
- case IE_AIRONET_CKIP:
- /* 0. Check Aironet IE length, it must be larger or equal to 28 */
- /* Cisco AP350 used length as 28 */
- /* Cisco AP12XX used length as 30 */
- if (pEid->Len < (CKIP_NEGOTIATION_LENGTH - 2))
- break;
-
- /* 1. Copy CKIP flag byte to buffer for process */
- *pCkipFlag = *(pEid->Octet + 8);
- break;
-
- case IE_AP_TX_POWER:
- /* AP Control of Client Transmit Power */
- /*0. Check Aironet IE length, it must be 6 */
- if (pEid->Len != 0x06)
- break;
-
- /* Get cell power limit in dBm */
- if (NdisEqualMemory(pEid->Octet, CISCO_OUI, 3) == 1)
- *pAironetCellPowerLimit = *(pEid->Octet + 4);
- break;
-
- /* WPA2 & 802.11i RSN */
- case IE_RSN:
- /* There is no OUI for version anymore, check the group cipher OUI before copying */
- if (RTMPEqualMemory(pEid->Octet + 2, RSN_OUI, 3)) {
- /* Copy to pVIE which will report to microsoft bssid list. */
- Ptr = (u8 *)pVIE;
- NdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid,
- pEid->Len + 2);
- *LengthVIE += (pEid->Len + 2);
- }
- break;
-
- default:
- break;
- }
-
- Length = Length + 2 + pEid->Len; /* Eid[1] + Len[1]+ content[Len] */
- pEid = (struct rt_eid *) ((u8 *) pEid + 2 + pEid->Len);
- }
-
- /* For some 11a AP. it did not have the channel EID, patch here */
- {
- u8 LatchRfChannel = MsgChannel;
- if ((pAd->LatchRfRegs.Channel > 14) && ((Sanity & 0x4) == 0)) {
- if (CtrlChannel != 0)
- *pChannel = CtrlChannel;
- else
- *pChannel = LatchRfChannel;
- Sanity |= 0x4;
- }
- }
-
- if (Sanity != 0x7) {
- DBGPRINT(RT_DEBUG_LOUD,
- ("PeerBeaconAndProbeRspSanity - missing field, Sanity=0x%02x\n",
- Sanity));
- return FALSE;
- } else {
- return TRUE;
- }
-
-}
-
-/*
- ==========================================================================
- Description:
- MLME message sanity check
- Return:
- TRUE if all parameters are OK, FALSE otherwise
- ==========================================================================
- */
-BOOLEAN MlmeScanReqSanity(struct rt_rtmp_adapter *pAd,
- void * Msg,
- unsigned long MsgLen,
- u8 * pBssType,
- char Ssid[],
- u8 * pSsidLen, u8 * pScanType)
-{
- struct rt_mlme_scan_req *Info;
-
- Info = (struct rt_mlme_scan_req *)(Msg);
- *pBssType = Info->BssType;
- *pSsidLen = Info->SsidLen;
- NdisMoveMemory(Ssid, Info->Ssid, *pSsidLen);
- *pScanType = Info->ScanType;
-
- if ((*pBssType == BSS_INFRA || *pBssType == BSS_ADHOC
- || *pBssType == BSS_ANY)
- && (*pScanType == SCAN_ACTIVE || *pScanType == SCAN_PASSIVE)) {
- return TRUE;
- } else {
- DBGPRINT(RT_DEBUG_TRACE,
- ("MlmeScanReqSanity fail - wrong BssType or ScanType\n"));
- return FALSE;
- }
-}
-
-/* IRQL = DISPATCH_LEVEL */
-u8 ChannelSanity(struct rt_rtmp_adapter *pAd, u8 channel)
-{
- int i;
-
- for (i = 0; i < pAd->ChannelListNum; i++) {
- if (channel == pAd->ChannelList[i].Channel)
- return 1;
- }
- return 0;
-}
-
-/*
- ==========================================================================
- Description:
- MLME message sanity check
- Return:
- TRUE if all parameters are OK, FALSE otherwise
-
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-BOOLEAN PeerDeauthSanity(struct rt_rtmp_adapter *pAd,
- void * Msg,
- unsigned long MsgLen,
- u8 *pAddr2, u16 * pReason)
-{
- struct rt_frame_802_11 * pFrame = (struct rt_frame_802_11 *) Msg;
-
- COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);
- NdisMoveMemory(pReason, &pFrame->Octet[0], 2);
-
- return TRUE;
-}
-
-/*
- ==========================================================================
- Description:
- MLME message sanity check
- Return:
- TRUE if all parameters are OK, FALSE otherwise
-
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-BOOLEAN PeerAuthSanity(struct rt_rtmp_adapter *pAd,
- void * Msg,
- unsigned long MsgLen,
- u8 *pAddr,
- u16 * pAlg,
- u16 * pSeq,
- u16 * pStatus, char * pChlgText)
-{
- struct rt_frame_802_11 * pFrame = (struct rt_frame_802_11 *) Msg;
-
- COPY_MAC_ADDR(pAddr, pFrame->Hdr.Addr2);
- NdisMoveMemory(pAlg, &pFrame->Octet[0], 2);
- NdisMoveMemory(pSeq, &pFrame->Octet[2], 2);
- NdisMoveMemory(pStatus, &pFrame->Octet[4], 2);
-
- if (*pAlg == AUTH_MODE_OPEN) {
- if (*pSeq == 1 || *pSeq == 2) {
- return TRUE;
- } else {
- DBGPRINT(RT_DEBUG_TRACE,
- ("PeerAuthSanity fail - wrong Seg#\n"));
- return FALSE;
- }
- } else if (*pAlg == AUTH_MODE_KEY) {
- if (*pSeq == 1 || *pSeq == 4) {
- return TRUE;
- } else if (*pSeq == 2 || *pSeq == 3) {
- NdisMoveMemory(pChlgText, &pFrame->Octet[8],
- CIPHER_TEXT_LEN);
- return TRUE;
- } else {
- DBGPRINT(RT_DEBUG_TRACE,
- ("PeerAuthSanity fail - wrong Seg#\n"));
- return FALSE;
- }
- } else {
- DBGPRINT(RT_DEBUG_TRACE,
- ("PeerAuthSanity fail - wrong algorithm\n"));
- return FALSE;
- }
-}
-
-/*
- ==========================================================================
- Description:
- MLME message sanity check
- Return:
- TRUE if all parameters are OK, FALSE otherwise
- ==========================================================================
- */
-BOOLEAN MlmeAuthReqSanity(struct rt_rtmp_adapter *pAd,
- void * Msg,
- unsigned long MsgLen,
- u8 *pAddr,
- unsigned long * pTimeout, u16 * pAlg)
-{
- struct rt_mlme_auth_req *pInfo;
-
- pInfo = (struct rt_mlme_auth_req *)Msg;
- COPY_MAC_ADDR(pAddr, pInfo->Addr);
- *pTimeout = pInfo->Timeout;
- *pAlg = pInfo->Alg;
-
- if (((*pAlg == AUTH_MODE_KEY) || (*pAlg == AUTH_MODE_OPEN)
- ) && ((*pAddr & 0x01) == 0)) {
- return TRUE;
- } else {
- DBGPRINT(RT_DEBUG_TRACE,
- ("MlmeAuthReqSanity fail - wrong algorithm\n"));
- return FALSE;
- }
-}
-
-/*
- ==========================================================================
- Description:
- MLME message sanity check
- Return:
- TRUE if all parameters are OK, FALSE otherwise
-
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-BOOLEAN MlmeAssocReqSanity(struct rt_rtmp_adapter *pAd,
- void * Msg,
- unsigned long MsgLen,
- u8 *pApAddr,
- u16 * pCapabilityInfo,
- unsigned long * pTimeout, u16 * pListenIntv)
-{
- struct rt_mlme_assoc_req *pInfo;
-
- pInfo = (struct rt_mlme_assoc_req *)Msg;
- *pTimeout = pInfo->Timeout; /* timeout */
- COPY_MAC_ADDR(pApAddr, pInfo->Addr); /* AP address */
- *pCapabilityInfo = pInfo->CapabilityInfo; /* capability info */
- *pListenIntv = pInfo->ListenIntv;
-
- return TRUE;
-}
-
-/*
- ==========================================================================
- Description:
- MLME message sanity check
- Return:
- TRUE if all parameters are OK, FALSE otherwise
-
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-BOOLEAN PeerDisassocSanity(struct rt_rtmp_adapter *pAd,
- void * Msg,
- unsigned long MsgLen,
- u8 *pAddr2, u16 * pReason)
-{
- struct rt_frame_802_11 * pFrame = (struct rt_frame_802_11 *) Msg;
-
- COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);
- NdisMoveMemory(pReason, &pFrame->Octet[0], 2);
-
- return TRUE;
-}
-
-/*
- ========================================================================
- Routine Description:
- Sanity check NetworkType (11b, 11g or 11a)
-
- Arguments:
- pBss - Pointer to BSS table.
-
- Return Value:
- Ndis802_11DS .......(11b)
- Ndis802_11OFDM24....(11g)
- Ndis802_11OFDM5.....(11a)
-
- IRQL = DISPATCH_LEVEL
-
- ========================================================================
-*/
-NDIS_802_11_NETWORK_TYPE NetworkTypeInUseSanity(struct rt_bss_entry *pBss)
-{
- NDIS_802_11_NETWORK_TYPE NetWorkType;
- u8 rate, i;
-
- NetWorkType = Ndis802_11DS;
-
- if (pBss->Channel <= 14) {
- /* */
- /* First check support Rate. */
- /* */
- for (i = 0; i < pBss->SupRateLen; i++) {
- rate = pBss->SupRate[i] & 0x7f; /* Mask out basic rate set bit */
- if ((rate == 2) || (rate == 4) || (rate == 11)
- || (rate == 22)) {
- continue;
- } else {
- /* */
- /* Otherwise (even rate > 108) means Ndis802_11OFDM24 */
- /* */
- NetWorkType = Ndis802_11OFDM24;
- break;
- }
- }
-
- /* */
- /* Second check Extend Rate. */
- /* */
- if (NetWorkType != Ndis802_11OFDM24) {
- for (i = 0; i < pBss->ExtRateLen; i++) {
- rate = pBss->SupRate[i] & 0x7f; /* Mask out basic rate set bit */
- if ((rate == 2) || (rate == 4) || (rate == 11)
- || (rate == 22)) {
- continue;
- } else {
- /* */
- /* Otherwise (even rate > 108) means Ndis802_11OFDM24 */
- /* */
- NetWorkType = Ndis802_11OFDM24;
- break;
- }
- }
- }
- } else {
- NetWorkType = Ndis802_11OFDM5;
- }
-
- if (pBss->HtCapabilityLen != 0) {
- if (NetWorkType == Ndis802_11OFDM5)
- NetWorkType = Ndis802_11OFDM5_N;
- else
- NetWorkType = Ndis802_11OFDM24_N;
- }
-
- return NetWorkType;
-}
-
-/*
- ==========================================================================
- Description:
- Check the validity of the received EAPoL frame
- Return:
- TRUE if all parameters are OK,
- FALSE otherwise
- ==========================================================================
- */
-BOOLEAN PeerWpaMessageSanity(struct rt_rtmp_adapter *pAd,
- struct rt_eapol_packet * pMsg,
- unsigned long MsgLen,
- u8 MsgType, struct rt_mac_table_entry *pEntry)
-{
- u8 mic[LEN_KEY_DESC_MIC], digest[80], KEYDATA[MAX_LEN_OF_RSNIE];
- BOOLEAN bReplayDiff = FALSE;
- BOOLEAN bWPA2 = FALSE;
- struct rt_key_info EapolKeyInfo;
- u8 GroupKeyIndex = 0;
-
- NdisZeroMemory(mic, sizeof(mic));
- NdisZeroMemory(digest, sizeof(digest));
- NdisZeroMemory(KEYDATA, sizeof(KEYDATA));
- NdisZeroMemory((u8 *)& EapolKeyInfo, sizeof(EapolKeyInfo));
-
- NdisMoveMemory((u8 *)& EapolKeyInfo,
- (u8 *)& pMsg->KeyDesc.KeyInfo, sizeof(struct rt_key_info));
-
- *((u16 *) & EapolKeyInfo) = cpu2le16(*((u16 *) & EapolKeyInfo));
-
- /* Choose WPA2 or not */
- if ((pEntry->AuthMode == Ndis802_11AuthModeWPA2)
- || (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK))
- bWPA2 = TRUE;
-
- /* 0. Check MsgType */
- if ((MsgType > EAPOL_GROUP_MSG_2) || (MsgType < EAPOL_PAIR_MSG_1)) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("The message type is invalid(%d)! \n", MsgType));
- return FALSE;
- }
- /* 1. Replay counter check */
- if (MsgType == EAPOL_PAIR_MSG_1 || MsgType == EAPOL_PAIR_MSG_3 || MsgType == EAPOL_GROUP_MSG_1) /* For supplicant */
- {
- /* First validate replay counter, only accept message with larger replay counter. */
- /* Let equal pass, some AP start with all zero replay counter */
- u8 ZeroReplay[LEN_KEY_DESC_REPLAY];
-
- NdisZeroMemory(ZeroReplay, LEN_KEY_DESC_REPLAY);
- if ((RTMPCompareMemory
- (pMsg->KeyDesc.ReplayCounter, pEntry->R_Counter,
- LEN_KEY_DESC_REPLAY) != 1)
- &&
- (RTMPCompareMemory
- (pMsg->KeyDesc.ReplayCounter, ZeroReplay,
- LEN_KEY_DESC_REPLAY) != 0)) {
- bReplayDiff = TRUE;
- }
- } else if (MsgType == EAPOL_PAIR_MSG_2 || MsgType == EAPOL_PAIR_MSG_4 || MsgType == EAPOL_GROUP_MSG_2) /* For authenticator */
- {
- /* check Replay Counter coresponds to MSG from authenticator, otherwise discard */
- if (!NdisEqualMemory
- (pMsg->KeyDesc.ReplayCounter, pEntry->R_Counter,
- LEN_KEY_DESC_REPLAY)) {
- bReplayDiff = TRUE;
- }
- }
- /* Replay Counter different condition */
- if (bReplayDiff) {
- /* send wireless event - for replay counter different */
- if (pAd->CommonCfg.bWirelessEvent)
- RTMPSendWirelessEvent(pAd,
- IW_REPLAY_COUNTER_DIFF_EVENT_FLAG,
- pEntry->Addr, pEntry->apidx, 0);
-
- if (MsgType < EAPOL_GROUP_MSG_1) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("Replay Counter Different in pairwise msg %d of 4-way handshake!\n",
- MsgType));
- } else {
- DBGPRINT(RT_DEBUG_ERROR,
- ("Replay Counter Different in group msg %d of 2-way handshake!\n",
- (MsgType - EAPOL_PAIR_MSG_4)));
- }
-
- hex_dump("Receive replay counter ", pMsg->KeyDesc.ReplayCounter,
- LEN_KEY_DESC_REPLAY);
- hex_dump("Current replay counter ", pEntry->R_Counter,
- LEN_KEY_DESC_REPLAY);
- return FALSE;
- }
- /* 2. Verify MIC except Pairwise Msg1 */
- if (MsgType != EAPOL_PAIR_MSG_1) {
- u8 rcvd_mic[LEN_KEY_DESC_MIC];
-
- /* Record the received MIC for check later */
- NdisMoveMemory(rcvd_mic, pMsg->KeyDesc.KeyMic,
- LEN_KEY_DESC_MIC);
- NdisZeroMemory(pMsg->KeyDesc.KeyMic, LEN_KEY_DESC_MIC);
-
- if (EapolKeyInfo.KeyDescVer == DESC_TYPE_TKIP) /* TKIP */
- {
- HMAC_MD5(pEntry->PTK, LEN_EAP_MICK, (u8 *)pMsg,
- MsgLen, mic, MD5_DIGEST_SIZE);
- } else if (EapolKeyInfo.KeyDescVer == DESC_TYPE_AES) /* AES */
- {
- HMAC_SHA1(pEntry->PTK, LEN_EAP_MICK, (u8 *)pMsg,
- MsgLen, digest, SHA1_DIGEST_SIZE);
- NdisMoveMemory(mic, digest, LEN_KEY_DESC_MIC);
- }
-
- if (!NdisEqualMemory(rcvd_mic, mic, LEN_KEY_DESC_MIC)) {
- /* send wireless event - for MIC different */
- if (pAd->CommonCfg.bWirelessEvent)
- RTMPSendWirelessEvent(pAd,
- IW_MIC_DIFF_EVENT_FLAG,
- pEntry->Addr,
- pEntry->apidx, 0);
-
- if (MsgType < EAPOL_GROUP_MSG_1) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("MIC Different in pairwise msg %d of 4-way handshake!\n",
- MsgType));
- } else {
- DBGPRINT(RT_DEBUG_ERROR,
- ("MIC Different in group msg %d of 2-way handshake!\n",
- (MsgType - EAPOL_PAIR_MSG_4)));
- }
-
- hex_dump("Received MIC", rcvd_mic, LEN_KEY_DESC_MIC);
- hex_dump("Desired MIC", mic, LEN_KEY_DESC_MIC);
-
- return FALSE;
- }
- }
- /* 1. Decrypt the Key Data field if GTK is included. */
- /* 2. Extract the context of the Key Data field if it exist. */
- /* The field in pairwise_msg_2_WPA1(WPA2) & pairwise_msg_3_WPA1 is clear. */
- /* The field in group_msg_1_WPA1(WPA2) & pairwise_msg_3_WPA2 is encrypted. */
- if (CONV_ARRARY_TO_u16(pMsg->KeyDesc.KeyDataLen) > 0) {
- /* Decrypt this field */
- if ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2)
- || (MsgType == EAPOL_GROUP_MSG_1)) {
- if ((EapolKeyInfo.KeyDescVer == DESC_TYPE_AES)) {
- /* AES */
- AES_GTK_KEY_UNWRAP(&pEntry->PTK[16], KEYDATA,
- CONV_ARRARY_TO_u16(pMsg->
- KeyDesc.
- KeyDataLen),
- pMsg->KeyDesc.KeyData);
- } else {
- int i;
- u8 Key[32];
- /* Decrypt TKIP GTK */
- /* Construct 32 bytes RC4 Key */
- NdisMoveMemory(Key, pMsg->KeyDesc.KeyIv, 16);
- NdisMoveMemory(&Key[16], &pEntry->PTK[16], 16);
- ARCFOUR_INIT(&pAd->PrivateInfo.WEPCONTEXT, Key,
- 32);
- /*discard first 256 bytes */
- for (i = 0; i < 256; i++)
- ARCFOUR_BYTE(&pAd->PrivateInfo.
- WEPCONTEXT);
- /* Decrypt GTK. Becareful, there is no ICV to check the result is correct or not */
- ARCFOUR_DECRYPT(&pAd->PrivateInfo.WEPCONTEXT,
- KEYDATA, pMsg->KeyDesc.KeyData,
- CONV_ARRARY_TO_u16(pMsg->
- KeyDesc.
- KeyDataLen));
- }
-
- if (!bWPA2 && (MsgType == EAPOL_GROUP_MSG_1))
- GroupKeyIndex = EapolKeyInfo.KeyIndex;
-
- } else if ((MsgType == EAPOL_PAIR_MSG_2)
- || (MsgType == EAPOL_PAIR_MSG_3 && !bWPA2)) {
- NdisMoveMemory(KEYDATA, pMsg->KeyDesc.KeyData,
- CONV_ARRARY_TO_u16(pMsg->KeyDesc.
- KeyDataLen));
- } else {
-
- return TRUE;
- }
-
- /* Parse Key Data field to */
- /* 1. verify RSN IE for pairwise_msg_2_WPA1(WPA2) ,pairwise_msg_3_WPA1(WPA2) */
- /* 2. verify KDE format for pairwise_msg_3_WPA2, group_msg_1_WPA2 */
- /* 3. update shared key for pairwise_msg_3_WPA2, group_msg_1_WPA1(WPA2) */
- if (!RTMPParseEapolKeyData(pAd, KEYDATA,
- CONV_ARRARY_TO_u16(pMsg->KeyDesc.
- KeyDataLen),
- GroupKeyIndex, MsgType, bWPA2,
- pEntry)) {
- return FALSE;
- }
- }
-
- return TRUE;
-
-}
diff --git a/drivers/staging/rt2860/common/cmm_sync.c b/drivers/staging/rt2860/common/cmm_sync.c
deleted file mode 100644
index aefe1b774650..000000000000
--- a/drivers/staging/rt2860/common/cmm_sync.c
+++ /dev/null
@@ -1,718 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-
- Module Name:
- cmm_sync.c
-
- Abstract:
-
- Revision History:
- Who When What
- -------- ---------- ----------------------------------------------
- John Chang 2004-09-01 modified for rt2561/2661
-*/
-#include "../rt_config.h"
-
-/* 2.4 Ghz channel plan index in the TxPower arrays. */
-#define BG_BAND_REGION_0_START 0 /* 1,2,3,4,5,6,7,8,9,10,11 */
-#define BG_BAND_REGION_0_SIZE 11
-#define BG_BAND_REGION_1_START 0 /* 1,2,3,4,5,6,7,8,9,10,11,12,13 */
-#define BG_BAND_REGION_1_SIZE 13
-#define BG_BAND_REGION_2_START 9 /* 10,11 */
-#define BG_BAND_REGION_2_SIZE 2
-#define BG_BAND_REGION_3_START 9 /* 10,11,12,13 */
-#define BG_BAND_REGION_3_SIZE 4
-#define BG_BAND_REGION_4_START 13 /* 14 */
-#define BG_BAND_REGION_4_SIZE 1
-#define BG_BAND_REGION_5_START 0 /* 1,2,3,4,5,6,7,8,9,10,11,12,13,14 */
-#define BG_BAND_REGION_5_SIZE 14
-#define BG_BAND_REGION_6_START 2 /* 3,4,5,6,7,8,9 */
-#define BG_BAND_REGION_6_SIZE 7
-#define BG_BAND_REGION_7_START 4 /* 5,6,7,8,9,10,11,12,13 */
-#define BG_BAND_REGION_7_SIZE 9
-#define BG_BAND_REGION_31_START 0 /* 1,2,3,4,5,6,7,8,9,10,11,12,13,14 */
-#define BG_BAND_REGION_31_SIZE 14
-
-/* 5 Ghz channel plan index in the TxPower arrays. */
-u8 A_BAND_REGION_0_CHANNEL_LIST[] =
- { 36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165 };
-u8 A_BAND_REGION_1_CHANNEL_LIST[] =
- { 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128,
-132, 136, 140 };
-u8 A_BAND_REGION_2_CHANNEL_LIST[] = { 36, 40, 44, 48, 52, 56, 60, 64 };
-u8 A_BAND_REGION_3_CHANNEL_LIST[] = { 52, 56, 60, 64, 149, 153, 157, 161 };
-u8 A_BAND_REGION_4_CHANNEL_LIST[] = { 149, 153, 157, 161, 165 };
-u8 A_BAND_REGION_5_CHANNEL_LIST[] = { 149, 153, 157, 161 };
-u8 A_BAND_REGION_6_CHANNEL_LIST[] = { 36, 40, 44, 48 };
-u8 A_BAND_REGION_7_CHANNEL_LIST[] =
- { 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128,
-132, 136, 140, 149, 153, 157, 161, 165, 169, 173 };
-u8 A_BAND_REGION_8_CHANNEL_LIST[] = { 52, 56, 60, 64 };
-u8 A_BAND_REGION_9_CHANNEL_LIST[] =
- { 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140,
-149, 153, 157, 161, 165 };
-u8 A_BAND_REGION_10_CHANNEL_LIST[] =
- { 36, 40, 44, 48, 149, 153, 157, 161, 165 };
-u8 A_BAND_REGION_11_CHANNEL_LIST[] =
- { 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 149, 153,
-157, 161 };
-u8 A_BAND_REGION_12_CHANNEL_LIST[] =
- { 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128,
-132, 136, 140 };
-u8 A_BAND_REGION_13_CHANNEL_LIST[] =
- { 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140,
-149, 153, 157, 161 };
-u8 A_BAND_REGION_14_CHANNEL_LIST[] =
- { 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 136, 140, 149,
-153, 157, 161, 165 };
-u8 A_BAND_REGION_15_CHANNEL_LIST[] = { 149, 153, 157, 161, 165, 169, 173 };
-
-/*BaSizeArray follows the 802.11n definition as MaxRxFactor. 2^(13+factor) bytes. When factor =0, it's about Ba buffer size =8. */
-u8 BaSizeArray[4] = { 8, 16, 32, 64 };
-
-/*
- ==========================================================================
- Description:
- Update StaCfg->ChannelList[] according to 1) Country Region 2) RF IC type,
- and 3) PHY-mode user selected.
- The outcome is used by driver when doing site survey.
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-void BuildChannelList(struct rt_rtmp_adapter *pAd)
-{
- u8 i, j, index = 0, num = 0;
- u8 *pChannelList = NULL;
-
- NdisZeroMemory(pAd->ChannelList,
- MAX_NUM_OF_CHANNELS * sizeof(struct rt_channel_tx_power));
-
- /* if not 11a-only mode, channel list starts from 2.4Ghz band */
- if ((pAd->CommonCfg.PhyMode != PHY_11A)
- && (pAd->CommonCfg.PhyMode != PHY_11AN_MIXED)
- && (pAd->CommonCfg.PhyMode != PHY_11N_5G)
- ) {
- switch (pAd->CommonCfg.CountryRegion & 0x7f) {
- case REGION_0_BG_BAND: /* 1 -11 */
- NdisMoveMemory(&pAd->ChannelList[index],
- &pAd->TxPower[BG_BAND_REGION_0_START],
- sizeof(struct rt_channel_tx_power) *
- BG_BAND_REGION_0_SIZE);
- index += BG_BAND_REGION_0_SIZE;
- break;
- case REGION_1_BG_BAND: /* 1 - 13 */
- NdisMoveMemory(&pAd->ChannelList[index],
- &pAd->TxPower[BG_BAND_REGION_1_START],
- sizeof(struct rt_channel_tx_power) *
- BG_BAND_REGION_1_SIZE);
- index += BG_BAND_REGION_1_SIZE;
- break;
- case REGION_2_BG_BAND: /* 10 - 11 */
- NdisMoveMemory(&pAd->ChannelList[index],
- &pAd->TxPower[BG_BAND_REGION_2_START],
- sizeof(struct rt_channel_tx_power) *
- BG_BAND_REGION_2_SIZE);
- index += BG_BAND_REGION_2_SIZE;
- break;
- case REGION_3_BG_BAND: /* 10 - 13 */
- NdisMoveMemory(&pAd->ChannelList[index],
- &pAd->TxPower[BG_BAND_REGION_3_START],
- sizeof(struct rt_channel_tx_power) *
- BG_BAND_REGION_3_SIZE);
- index += BG_BAND_REGION_3_SIZE;
- break;
- case REGION_4_BG_BAND: /* 14 */
- NdisMoveMemory(&pAd->ChannelList[index],
- &pAd->TxPower[BG_BAND_REGION_4_START],
- sizeof(struct rt_channel_tx_power) *
- BG_BAND_REGION_4_SIZE);
- index += BG_BAND_REGION_4_SIZE;
- break;
- case REGION_5_BG_BAND: /* 1 - 14 */
- NdisMoveMemory(&pAd->ChannelList[index],
- &pAd->TxPower[BG_BAND_REGION_5_START],
- sizeof(struct rt_channel_tx_power) *
- BG_BAND_REGION_5_SIZE);
- index += BG_BAND_REGION_5_SIZE;
- break;
- case REGION_6_BG_BAND: /* 3 - 9 */
- NdisMoveMemory(&pAd->ChannelList[index],
- &pAd->TxPower[BG_BAND_REGION_6_START],
- sizeof(struct rt_channel_tx_power) *
- BG_BAND_REGION_6_SIZE);
- index += BG_BAND_REGION_6_SIZE;
- break;
- case REGION_7_BG_BAND: /* 5 - 13 */
- NdisMoveMemory(&pAd->ChannelList[index],
- &pAd->TxPower[BG_BAND_REGION_7_START],
- sizeof(struct rt_channel_tx_power) *
- BG_BAND_REGION_7_SIZE);
- index += BG_BAND_REGION_7_SIZE;
- break;
- case REGION_31_BG_BAND: /* 1 - 14 */
- NdisMoveMemory(&pAd->ChannelList[index],
- &pAd->TxPower[BG_BAND_REGION_31_START],
- sizeof(struct rt_channel_tx_power) *
- BG_BAND_REGION_31_SIZE);
- index += BG_BAND_REGION_31_SIZE;
- break;
- default: /* Error. should never happen */
- break;
- }
- for (i = 0; i < index; i++)
- pAd->ChannelList[i].MaxTxPwr = 20;
- }
-
- if ((pAd->CommonCfg.PhyMode == PHY_11A)
- || (pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED)
- || (pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED)
- || (pAd->CommonCfg.PhyMode == PHY_11AN_MIXED)
- || (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED)
- || (pAd->CommonCfg.PhyMode == PHY_11N_5G)
- ) {
- switch (pAd->CommonCfg.CountryRegionForABand & 0x7f) {
- case REGION_0_A_BAND:
- num =
- sizeof(A_BAND_REGION_0_CHANNEL_LIST) /
- sizeof(u8);
- pChannelList = A_BAND_REGION_0_CHANNEL_LIST;
- break;
- case REGION_1_A_BAND:
- num =
- sizeof(A_BAND_REGION_1_CHANNEL_LIST) /
- sizeof(u8);
- pChannelList = A_BAND_REGION_1_CHANNEL_LIST;
- break;
- case REGION_2_A_BAND:
- num =
- sizeof(A_BAND_REGION_2_CHANNEL_LIST) /
- sizeof(u8);
- pChannelList = A_BAND_REGION_2_CHANNEL_LIST;
- break;
- case REGION_3_A_BAND:
- num =
- sizeof(A_BAND_REGION_3_CHANNEL_LIST) /
- sizeof(u8);
- pChannelList = A_BAND_REGION_3_CHANNEL_LIST;
- break;
- case REGION_4_A_BAND:
- num =
- sizeof(A_BAND_REGION_4_CHANNEL_LIST) /
- sizeof(u8);
- pChannelList = A_BAND_REGION_4_CHANNEL_LIST;
- break;
- case REGION_5_A_BAND:
- num =
- sizeof(A_BAND_REGION_5_CHANNEL_LIST) /
- sizeof(u8);
- pChannelList = A_BAND_REGION_5_CHANNEL_LIST;
- break;
- case REGION_6_A_BAND:
- num =
- sizeof(A_BAND_REGION_6_CHANNEL_LIST) /
- sizeof(u8);
- pChannelList = A_BAND_REGION_6_CHANNEL_LIST;
- break;
- case REGION_7_A_BAND:
- num =
- sizeof(A_BAND_REGION_7_CHANNEL_LIST) /
- sizeof(u8);
- pChannelList = A_BAND_REGION_7_CHANNEL_LIST;
- break;
- case REGION_8_A_BAND:
- num =
- sizeof(A_BAND_REGION_8_CHANNEL_LIST) /
- sizeof(u8);
- pChannelList = A_BAND_REGION_8_CHANNEL_LIST;
- break;
- case REGION_9_A_BAND:
- num =
- sizeof(A_BAND_REGION_9_CHANNEL_LIST) /
- sizeof(u8);
- pChannelList = A_BAND_REGION_9_CHANNEL_LIST;
- break;
-
- case REGION_10_A_BAND:
- num =
- sizeof(A_BAND_REGION_10_CHANNEL_LIST) /
- sizeof(u8);
- pChannelList = A_BAND_REGION_10_CHANNEL_LIST;
- break;
-
- case REGION_11_A_BAND:
- num =
- sizeof(A_BAND_REGION_11_CHANNEL_LIST) /
- sizeof(u8);
- pChannelList = A_BAND_REGION_11_CHANNEL_LIST;
- break;
- case REGION_12_A_BAND:
- num =
- sizeof(A_BAND_REGION_12_CHANNEL_LIST) /
- sizeof(u8);
- pChannelList = A_BAND_REGION_12_CHANNEL_LIST;
- break;
- case REGION_13_A_BAND:
- num =
- sizeof(A_BAND_REGION_13_CHANNEL_LIST) /
- sizeof(u8);
- pChannelList = A_BAND_REGION_13_CHANNEL_LIST;
- break;
- case REGION_14_A_BAND:
- num =
- sizeof(A_BAND_REGION_14_CHANNEL_LIST) /
- sizeof(u8);
- pChannelList = A_BAND_REGION_14_CHANNEL_LIST;
- break;
- case REGION_15_A_BAND:
- num =
- sizeof(A_BAND_REGION_15_CHANNEL_LIST) /
- sizeof(u8);
- pChannelList = A_BAND_REGION_15_CHANNEL_LIST;
- break;
- default: /* Error. should never happen */
- DBGPRINT(RT_DEBUG_WARN,
- ("countryregion=%d not support",
- pAd->CommonCfg.CountryRegionForABand));
- break;
- }
-
- if (num != 0) {
- u8 RadarCh[15] =
- { 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124,
- 128, 132, 136, 140 };
- for (i = 0; i < num; i++) {
- for (j = 0; j < MAX_NUM_OF_CHANNELS; j++) {
- if (pChannelList[i] ==
- pAd->TxPower[j].Channel)
- NdisMoveMemory(&pAd->
- ChannelList[index
- + i],
- &pAd->TxPower[j],
- sizeof
- (struct rt_channel_tx_power));
- }
- for (j = 0; j < 15; j++) {
- if (pChannelList[i] == RadarCh[j])
- pAd->ChannelList[index +
- i].DfsReq =
- TRUE;
- }
- pAd->ChannelList[index + i].MaxTxPwr = 20;
- }
- index += num;
- }
- }
-
- pAd->ChannelListNum = index;
- DBGPRINT(RT_DEBUG_TRACE,
- ("country code=%d/%d, RFIC=%d, PHY mode=%d, support %d channels\n",
- pAd->CommonCfg.CountryRegion,
- pAd->CommonCfg.CountryRegionForABand, pAd->RfIcType,
- pAd->CommonCfg.PhyMode, pAd->ChannelListNum));
-#ifdef DBG
- for (i = 0; i < pAd->ChannelListNum; i++) {
- DBGPRINT_RAW(RT_DEBUG_TRACE,
- ("BuildChannel # %d :: Pwr0 = %d, Pwr1 =%d, \n ",
- pAd->ChannelList[i].Channel,
- pAd->ChannelList[i].Power,
- pAd->ChannelList[i].Power2));
- }
-#endif
-}
-
-/*
- ==========================================================================
- Description:
- This routine return the first channel number according to the country
- code selection and RF IC selection (signal band or dual band). It is called
- whenever driver need to start a site survey of all supported channels.
- Return:
- ch - the first channel number of current country code setting
-
- IRQL = PASSIVE_LEVEL
-
- ==========================================================================
- */
-u8 FirstChannel(struct rt_rtmp_adapter *pAd)
-{
- return pAd->ChannelList[0].Channel;
-}
-
-/*
- ==========================================================================
- Description:
- This routine returns the next channel number. This routine is called
- during driver need to start a site survey of all supported channels.
- Return:
- next_channel - the next channel number valid in current country code setting.
- Note:
- return 0 if no more next channel
- ==========================================================================
- */
-u8 NextChannel(struct rt_rtmp_adapter *pAd, u8 channel)
-{
- int i;
- u8 next_channel = 0;
-
- for (i = 0; i < (pAd->ChannelListNum - 1); i++)
- if (channel == pAd->ChannelList[i].Channel) {
- next_channel = pAd->ChannelList[i + 1].Channel;
- break;
- }
- return next_channel;
-}
-
-/*
- ==========================================================================
- Description:
- This routine is for Cisco Compatible Extensions 2.X
- Spec31. AP Control of Client Transmit Power
- Return:
- None
- Note:
- Required by Aironet dBm(mW)
- 0dBm(1mW), 1dBm(5mW), 13dBm(20mW), 15dBm(30mW),
- 17dBm(50mw), 20dBm(100mW)
-
- We supported
- 3dBm(Lowest), 6dBm(10%), 9dBm(25%), 12dBm(50%),
- 14dBm(75%), 15dBm(100%)
-
- The client station's actual transmit power shall be within +/- 5dB of
- the minimum value or next lower value.
- ==========================================================================
- */
-void ChangeToCellPowerLimit(struct rt_rtmp_adapter *pAd,
- u8 AironetCellPowerLimit)
-{
- /*valud 0xFF means that hasn't found power limit information */
- /*from the AP's Beacon/Probe response. */
- if (AironetCellPowerLimit == 0xFF)
- return;
-
- if (AironetCellPowerLimit < 6) /*Used Lowest Power Percentage. */
- pAd->CommonCfg.TxPowerPercentage = 6;
- else if (AironetCellPowerLimit < 9)
- pAd->CommonCfg.TxPowerPercentage = 10;
- else if (AironetCellPowerLimit < 12)
- pAd->CommonCfg.TxPowerPercentage = 25;
- else if (AironetCellPowerLimit < 14)
- pAd->CommonCfg.TxPowerPercentage = 50;
- else if (AironetCellPowerLimit < 15)
- pAd->CommonCfg.TxPowerPercentage = 75;
- else
- pAd->CommonCfg.TxPowerPercentage = 100; /*else used maximum */
-
- if (pAd->CommonCfg.TxPowerPercentage > pAd->CommonCfg.TxPowerDefault)
- pAd->CommonCfg.TxPowerPercentage =
- pAd->CommonCfg.TxPowerDefault;
-
-}
-
-char ConvertToRssi(struct rt_rtmp_adapter *pAd, char Rssi, u8 RssiNumber)
-{
- u8 RssiOffset, LNAGain;
-
- /* Rssi equals to zero should be an invalid value */
- if (Rssi == 0)
- return -99;
-
- LNAGain = GET_LNA_GAIN(pAd);
- if (pAd->LatchRfRegs.Channel > 14) {
- if (RssiNumber == 0)
- RssiOffset = pAd->ARssiOffset0;
- else if (RssiNumber == 1)
- RssiOffset = pAd->ARssiOffset1;
- else
- RssiOffset = pAd->ARssiOffset2;
- } else {
- if (RssiNumber == 0)
- RssiOffset = pAd->BGRssiOffset0;
- else if (RssiNumber == 1)
- RssiOffset = pAd->BGRssiOffset1;
- else
- RssiOffset = pAd->BGRssiOffset2;
- }
-
- return (-12 - RssiOffset - LNAGain - Rssi);
-}
-
-/*
- ==========================================================================
- Description:
- Scan next channel
- ==========================================================================
- */
-void ScanNextChannel(struct rt_rtmp_adapter *pAd)
-{
- struct rt_header_802_11 Hdr80211;
- u8 *pOutBuffer = NULL;
- int NStatus;
- unsigned long FrameLen = 0;
- u8 SsidLen = 0, ScanType = pAd->MlmeAux.ScanType, BBPValue = 0;
- u16 Status;
- struct rt_header_802_11 * pHdr80211;
- u32 ScanTimeIn5gChannel = SHORT_CHANNEL_TIME;
-
- {
- if (MONITOR_ON(pAd))
- return;
- }
-
- if (pAd->MlmeAux.Channel == 0) {
- if ((pAd->CommonCfg.BBPCurrentBW == BW_40)
- && (INFRA_ON(pAd)
- || (pAd->OpMode == OPMODE_AP))
- ) {
- AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel,
- FALSE);
- AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
- BBPValue &= (~0x18);
- BBPValue |= 0x10;
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
- DBGPRINT(RT_DEBUG_TRACE,
- ("SYNC - End of SCAN, restore to 40MHz channel %d, Total BSS[%02d]\n",
- pAd->CommonCfg.CentralChannel,
- pAd->ScanTab.BssNr));
- } else {
- AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
- AsicLockChannel(pAd, pAd->CommonCfg.Channel);
- DBGPRINT(RT_DEBUG_TRACE,
- ("SYNC - End of SCAN, restore to channel %d, Total BSS[%02d]\n",
- pAd->CommonCfg.Channel, pAd->ScanTab.BssNr));
- }
-
- {
- /* */
- /* To prevent data lost. */
- /* Send an NULL data with turned PSM bit on to current associated AP before SCAN progress. */
- /* Now, we need to send an NULL data with turned PSM bit off to AP, when scan progress done */
- /* */
- if (OPSTATUS_TEST_FLAG
- (pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)
- && (INFRA_ON(pAd))) {
- NStatus =
- MlmeAllocateMemory(pAd,
- (void *)& pOutBuffer);
- if (NStatus == NDIS_STATUS_SUCCESS) {
- pHdr80211 = (struct rt_header_802_11 *) pOutBuffer;
- MgtMacHeaderInit(pAd, pHdr80211,
- SUBTYPE_NULL_FUNC, 1,
- pAd->CommonCfg.Bssid,
- pAd->CommonCfg.Bssid);
- pHdr80211->Duration = 0;
- pHdr80211->FC.Type = BTYPE_DATA;
- pHdr80211->FC.PwrMgmt =
- (pAd->StaCfg.Psm == PWR_SAVE);
-
- /* Send using priority queue */
- MiniportMMRequest(pAd, 0, pOutBuffer,
- sizeof
- (struct rt_header_802_11));
- DBGPRINT(RT_DEBUG_TRACE,
- ("MlmeScanReqAction -- Send PSM Data frame\n"));
- MlmeFreeMemory(pAd, pOutBuffer);
- RTMPusecDelay(5000);
- }
- }
-
- pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
- Status = MLME_SUCCESS;
- MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF,
- 2, &Status);
- }
-
- RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);
- }
-#ifdef RTMP_MAC_USB
- else if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)
- && (pAd->OpMode == OPMODE_STA)) {
- pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
- MlmeCntlConfirm(pAd, MT2_SCAN_CONF, MLME_FAIL_NO_RESOURCE);
- }
-#endif /* RTMP_MAC_USB // */
- else {
- {
- /* BBP and RF are not accessible in PS mode, we has to wake them up first */
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
- AsicForceWakeup(pAd, TRUE);
-
- /* leave PSM during scanning. otherwise we may lost ProbeRsp & BEACON */
- if (pAd->StaCfg.Psm == PWR_SAVE)
- RTMP_SET_PSM_BIT(pAd, PWR_ACTIVE);
- }
-
- AsicSwitchChannel(pAd, pAd->MlmeAux.Channel, TRUE);
- AsicLockChannel(pAd, pAd->MlmeAux.Channel);
-
- {
- if (pAd->MlmeAux.Channel > 14) {
- if ((pAd->CommonCfg.bIEEE80211H == 1)
- && RadarChannelCheck(pAd,
- pAd->MlmeAux.
- Channel)) {
- ScanType = SCAN_PASSIVE;
- ScanTimeIn5gChannel = MIN_CHANNEL_TIME;
- }
- }
- }
-
- /*Global country domain(ch1-11:active scan, ch12-14 passive scan) */
- if ((pAd->MlmeAux.Channel <= 14) && (pAd->MlmeAux.Channel >= 12)
- && ((pAd->CommonCfg.CountryRegion & 0x7f) ==
- REGION_31_BG_BAND)) {
- ScanType = SCAN_PASSIVE;
- }
- /* We need to shorten active scan time in order for WZC connect issue */
- /* Chnage the channel scan time for CISCO stuff based on its IAPP announcement */
- if (ScanType == FAST_SCAN_ACTIVE)
- RTMPSetTimer(&pAd->MlmeAux.ScanTimer,
- FAST_ACTIVE_SCAN_TIME);
- else /* must be SCAN_PASSIVE or SCAN_ACTIVE */
- {
- if ((pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED)
- || (pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED)
- || (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED)
- ) {
- if (pAd->MlmeAux.Channel > 14)
- RTMPSetTimer(&pAd->MlmeAux.ScanTimer,
- ScanTimeIn5gChannel);
- else
- RTMPSetTimer(&pAd->MlmeAux.ScanTimer,
- MIN_CHANNEL_TIME);
- } else
- RTMPSetTimer(&pAd->MlmeAux.ScanTimer,
- MAX_CHANNEL_TIME);
- }
-
- if ((ScanType == SCAN_ACTIVE)
- || (ScanType == FAST_SCAN_ACTIVE)
- ) {
- NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); /*Get an unused nonpaged memory */
- if (NStatus != NDIS_STATUS_SUCCESS) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("SYNC - ScanNextChannel() allocate memory fail\n"));
-
- {
- pAd->Mlme.SyncMachine.CurrState =
- SYNC_IDLE;
- Status = MLME_FAIL_NO_RESOURCE;
- MlmeEnqueue(pAd,
- MLME_CNTL_STATE_MACHINE,
- MT2_SCAN_CONF, 2, &Status);
- }
-
- return;
- }
- /* There is no need to send broadcast probe request if active scan is in effect. */
- if ((ScanType == SCAN_ACTIVE)
- || (ScanType == FAST_SCAN_ACTIVE)
- )
- SsidLen = pAd->MlmeAux.SsidLen;
- else
- SsidLen = 0;
-
- MgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0,
- BROADCAST_ADDR, BROADCAST_ADDR);
- MakeOutgoingFrame(pOutBuffer, &FrameLen,
- sizeof(struct rt_header_802_11), &Hdr80211, 1,
- &SsidIe, 1, &SsidLen, SsidLen,
- pAd->MlmeAux.Ssid, 1, &SupRateIe, 1,
- &pAd->CommonCfg.SupRateLen,
- pAd->CommonCfg.SupRateLen,
- pAd->CommonCfg.SupRate, END_OF_ARGS);
-
- if (pAd->CommonCfg.ExtRateLen) {
- unsigned long Tmp;
- MakeOutgoingFrame(pOutBuffer + FrameLen, &Tmp,
- 1, &ExtRateIe,
- 1, &pAd->CommonCfg.ExtRateLen,
- pAd->CommonCfg.ExtRateLen,
- pAd->CommonCfg.ExtRate,
- END_OF_ARGS);
- FrameLen += Tmp;
- }
-
- if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) {
- unsigned long Tmp;
- u8 HtLen;
- u8 BROADCOM[4] = { 0x0, 0x90, 0x4c, 0x33 };
-
- if (pAd->bBroadComHT == TRUE) {
- HtLen =
- pAd->MlmeAux.HtCapabilityLen + 4;
-
- MakeOutgoingFrame(pOutBuffer + FrameLen,
- &Tmp, 1, &WpaIe, 1,
- &HtLen, 4,
- &BROADCOM[0],
- pAd->MlmeAux.
- HtCapabilityLen,
- &pAd->MlmeAux.
- HtCapability,
- END_OF_ARGS);
- } else {
- HtLen = pAd->MlmeAux.HtCapabilityLen;
-
- MakeOutgoingFrame(pOutBuffer + FrameLen,
- &Tmp, 1, &HtCapIe, 1,
- &HtLen, HtLen,
- &pAd->CommonCfg.
- HtCapability,
- END_OF_ARGS);
- }
- FrameLen += Tmp;
- }
-
- MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
- MlmeFreeMemory(pAd, pOutBuffer);
- }
- /* For SCAN_CISCO_PASSIVE, do nothing and silently wait for beacon or other probe response */
-
- pAd->Mlme.SyncMachine.CurrState = SCAN_LISTEN;
- }
-}
-
-void MgtProbReqMacHeaderInit(struct rt_rtmp_adapter *pAd,
- struct rt_header_802_11 * pHdr80211,
- u8 SubType,
- u8 ToDs, u8 *pDA, u8 *pBssid)
-{
- NdisZeroMemory(pHdr80211, sizeof(struct rt_header_802_11));
-
- pHdr80211->FC.Type = BTYPE_MGMT;
- pHdr80211->FC.SubType = SubType;
- if (SubType == SUBTYPE_ACK)
- pHdr80211->FC.Type = BTYPE_CNTL;
- pHdr80211->FC.ToDs = ToDs;
- COPY_MAC_ADDR(pHdr80211->Addr1, pDA);
- COPY_MAC_ADDR(pHdr80211->Addr2, pAd->CurrentAddress);
- COPY_MAC_ADDR(pHdr80211->Addr3, pBssid);
-}
diff --git a/drivers/staging/rt2860/common/cmm_tkip.c b/drivers/staging/rt2860/common/cmm_tkip.c
deleted file mode 100644
index 4881ef9ba022..000000000000
--- a/drivers/staging/rt2860/common/cmm_tkip.c
+++ /dev/null
@@ -1,833 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-
- Module Name:
- cmm_tkip.c
-
- Abstract:
-
- Revision History:
- Who When What
- -------- ---------- ----------------------------------------------
- Paul Wu 02-25-02 Initial
-*/
-
-#include "../rt_config.h"
-
-/* Rotation functions on 32 bit values */
-#define ROL32( A, n ) \
- ( ((A) << (n)) | ( ((A)>>(32-(n))) & ( (1UL << (n)) - 1 ) ) )
-#define ROR32( A, n ) ROL32( (A), 32-(n) )
-
-u32 Tkip_Sbox_Lower[256] = {
- 0xA5, 0x84, 0x99, 0x8D, 0x0D, 0xBD, 0xB1, 0x54,
- 0x50, 0x03, 0xA9, 0x7D, 0x19, 0x62, 0xE6, 0x9A,
- 0x45, 0x9D, 0x40, 0x87, 0x15, 0xEB, 0xC9, 0x0B,
- 0xEC, 0x67, 0xFD, 0xEA, 0xBF, 0xF7, 0x96, 0x5B,
- 0xC2, 0x1C, 0xAE, 0x6A, 0x5A, 0x41, 0x02, 0x4F,
- 0x5C, 0xF4, 0x34, 0x08, 0x93, 0x73, 0x53, 0x3F,
- 0x0C, 0x52, 0x65, 0x5E, 0x28, 0xA1, 0x0F, 0xB5,
- 0x09, 0x36, 0x9B, 0x3D, 0x26, 0x69, 0xCD, 0x9F,
- 0x1B, 0x9E, 0x74, 0x2E, 0x2D, 0xB2, 0xEE, 0xFB,
- 0xF6, 0x4D, 0x61, 0xCE, 0x7B, 0x3E, 0x71, 0x97,
- 0xF5, 0x68, 0x00, 0x2C, 0x60, 0x1F, 0xC8, 0xED,
- 0xBE, 0x46, 0xD9, 0x4B, 0xDE, 0xD4, 0xE8, 0x4A,
- 0x6B, 0x2A, 0xE5, 0x16, 0xC5, 0xD7, 0x55, 0x94,
- 0xCF, 0x10, 0x06, 0x81, 0xF0, 0x44, 0xBA, 0xE3,
- 0xF3, 0xFE, 0xC0, 0x8A, 0xAD, 0xBC, 0x48, 0x04,
- 0xDF, 0xC1, 0x75, 0x63, 0x30, 0x1A, 0x0E, 0x6D,
- 0x4C, 0x14, 0x35, 0x2F, 0xE1, 0xA2, 0xCC, 0x39,
- 0x57, 0xF2, 0x82, 0x47, 0xAC, 0xE7, 0x2B, 0x95,
- 0xA0, 0x98, 0xD1, 0x7F, 0x66, 0x7E, 0xAB, 0x83,
- 0xCA, 0x29, 0xD3, 0x3C, 0x79, 0xE2, 0x1D, 0x76,
- 0x3B, 0x56, 0x4E, 0x1E, 0xDB, 0x0A, 0x6C, 0xE4,
- 0x5D, 0x6E, 0xEF, 0xA6, 0xA8, 0xA4, 0x37, 0x8B,
- 0x32, 0x43, 0x59, 0xB7, 0x8C, 0x64, 0xD2, 0xE0,
- 0xB4, 0xFA, 0x07, 0x25, 0xAF, 0x8E, 0xE9, 0x18,
- 0xD5, 0x88, 0x6F, 0x72, 0x24, 0xF1, 0xC7, 0x51,
- 0x23, 0x7C, 0x9C, 0x21, 0xDD, 0xDC, 0x86, 0x85,
- 0x90, 0x42, 0xC4, 0xAA, 0xD8, 0x05, 0x01, 0x12,
- 0xA3, 0x5F, 0xF9, 0xD0, 0x91, 0x58, 0x27, 0xB9,
- 0x38, 0x13, 0xB3, 0x33, 0xBB, 0x70, 0x89, 0xA7,
- 0xB6, 0x22, 0x92, 0x20, 0x49, 0xFF, 0x78, 0x7A,
- 0x8F, 0xF8, 0x80, 0x17, 0xDA, 0x31, 0xC6, 0xB8,
- 0xC3, 0xB0, 0x77, 0x11, 0xCB, 0xFC, 0xD6, 0x3A
-};
-
-u32 Tkip_Sbox_Upper[256] = {
- 0xC6, 0xF8, 0xEE, 0xF6, 0xFF, 0xD6, 0xDE, 0x91,
- 0x60, 0x02, 0xCE, 0x56, 0xE7, 0xB5, 0x4D, 0xEC,
- 0x8F, 0x1F, 0x89, 0xFA, 0xEF, 0xB2, 0x8E, 0xFB,
- 0x41, 0xB3, 0x5F, 0x45, 0x23, 0x53, 0xE4, 0x9B,
- 0x75, 0xE1, 0x3D, 0x4C, 0x6C, 0x7E, 0xF5, 0x83,
- 0x68, 0x51, 0xD1, 0xF9, 0xE2, 0xAB, 0x62, 0x2A,
- 0x08, 0x95, 0x46, 0x9D, 0x30, 0x37, 0x0A, 0x2F,
- 0x0E, 0x24, 0x1B, 0xDF, 0xCD, 0x4E, 0x7F, 0xEA,
- 0x12, 0x1D, 0x58, 0x34, 0x36, 0xDC, 0xB4, 0x5B,
- 0xA4, 0x76, 0xB7, 0x7D, 0x52, 0xDD, 0x5E, 0x13,
- 0xA6, 0xB9, 0x00, 0xC1, 0x40, 0xE3, 0x79, 0xB6,
- 0xD4, 0x8D, 0x67, 0x72, 0x94, 0x98, 0xB0, 0x85,
- 0xBB, 0xC5, 0x4F, 0xED, 0x86, 0x9A, 0x66, 0x11,
- 0x8A, 0xE9, 0x04, 0xFE, 0xA0, 0x78, 0x25, 0x4B,
- 0xA2, 0x5D, 0x80, 0x05, 0x3F, 0x21, 0x70, 0xF1,
- 0x63, 0x77, 0xAF, 0x42, 0x20, 0xE5, 0xFD, 0xBF,
- 0x81, 0x18, 0x26, 0xC3, 0xBE, 0x35, 0x88, 0x2E,
- 0x93, 0x55, 0xFC, 0x7A, 0xC8, 0xBA, 0x32, 0xE6,
- 0xC0, 0x19, 0x9E, 0xA3, 0x44, 0x54, 0x3B, 0x0B,
- 0x8C, 0xC7, 0x6B, 0x28, 0xA7, 0xBC, 0x16, 0xAD,
- 0xDB, 0x64, 0x74, 0x14, 0x92, 0x0C, 0x48, 0xB8,
- 0x9F, 0xBD, 0x43, 0xC4, 0x39, 0x31, 0xD3, 0xF2,
- 0xD5, 0x8B, 0x6E, 0xDA, 0x01, 0xB1, 0x9C, 0x49,
- 0xD8, 0xAC, 0xF3, 0xCF, 0xCA, 0xF4, 0x47, 0x10,
- 0x6F, 0xF0, 0x4A, 0x5C, 0x38, 0x57, 0x73, 0x97,
- 0xCB, 0xA1, 0xE8, 0x3E, 0x96, 0x61, 0x0D, 0x0F,
- 0xE0, 0x7C, 0x71, 0xCC, 0x90, 0x06, 0xF7, 0x1C,
- 0xC2, 0x6A, 0xAE, 0x69, 0x17, 0x99, 0x3A, 0x27,
- 0xD9, 0xEB, 0x2B, 0x22, 0xD2, 0xA9, 0x07, 0x33,
- 0x2D, 0x3C, 0x15, 0xC9, 0x87, 0xAA, 0x50, 0xA5,
- 0x03, 0x59, 0x09, 0x1A, 0x65, 0xD7, 0x84, 0xD0,
- 0x82, 0x29, 0x5A, 0x1E, 0x7B, 0xA8, 0x6D, 0x2C
-};
-
-/* */
-/* Expanded IV for TKIP function. */
-/* */
-struct PACKED rt_tkip_iv {
- union PACKED {
- struct PACKED {
- u8 rc0;
- u8 rc1;
- u8 rc2;
-
- union PACKED {
- struct PACKED {
- u8 Rsvd:5;
- u8 ExtIV:1;
- u8 KeyID:2;
- } field;
- u8 Byte;
- } CONTROL;
- } field;
-
- unsigned long word;
- } IV16;
-
- unsigned long IV32;
-};
-
-/*
- ========================================================================
-
- Routine Description:
- Convert from u8[] to unsigned long in a portable way
-
- Arguments:
- pMICKey pointer to MIC Key
-
- Return Value:
- None
-
- Note:
-
- ========================================================================
-*/
-unsigned long RTMPTkipGetUInt32(u8 *pMICKey)
-{
- unsigned long res = 0;
- int i;
-
- for (i = 0; i < 4; i++) {
- res |= (*pMICKey++) << (8 * i);
- }
-
- return res;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Convert from unsigned long to u8[] in a portable way
-
- Arguments:
- pDst pointer to destination for convert unsigned long to u8[]
- val the value for convert
-
- Return Value:
- None
-
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPTkipPutUInt32(IN u8 *pDst, unsigned long val)
-{
- int i;
-
- for (i = 0; i < 4; i++) {
- *pDst++ = (u8)(val & 0xff);
- val >>= 8;
- }
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Set the MIC Key.
-
- Arguments:
- pAd Pointer to our adapter
- pMICKey pointer to MIC Key
-
- Return Value:
- None
-
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPTkipSetMICKey(struct rt_tkip_key_info *pTkip, u8 *pMICKey)
-{
- /* Set the key */
- pTkip->K0 = RTMPTkipGetUInt32(pMICKey);
- pTkip->K1 = RTMPTkipGetUInt32(pMICKey + 4);
- /* and reset the message */
- pTkip->L = pTkip->K0;
- pTkip->R = pTkip->K1;
- pTkip->nBytesInM = 0;
- pTkip->M = 0;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Calculate the MIC Value.
-
- Arguments:
- pAd Pointer to our adapter
- uChar Append this uChar
-
- Return Value:
- None
-
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPTkipAppendByte(struct rt_tkip_key_info *pTkip, u8 uChar)
-{
- /* Append the byte to our word-sized buffer */
- pTkip->M |= (uChar << (8 * pTkip->nBytesInM));
- pTkip->nBytesInM++;
- /* Process the word if it is full. */
- if (pTkip->nBytesInM >= 4) {
- pTkip->L ^= pTkip->M;
- pTkip->R ^= ROL32(pTkip->L, 17);
- pTkip->L += pTkip->R;
- pTkip->R ^=
- ((pTkip->L & 0xff00ff00) >> 8) | ((pTkip->
- L & 0x00ff00ff) << 8);
- pTkip->L += pTkip->R;
- pTkip->R ^= ROL32(pTkip->L, 3);
- pTkip->L += pTkip->R;
- pTkip->R ^= ROR32(pTkip->L, 2);
- pTkip->L += pTkip->R;
- /* Clear the buffer */
- pTkip->M = 0;
- pTkip->nBytesInM = 0;
- }
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Calculate the MIC Value.
-
- Arguments:
- pAd Pointer to our adapter
- pSrc Pointer to source data for Calculate MIC Value
- Len Indicate the length of the source data
-
- Return Value:
- None
-
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPTkipAppend(struct rt_tkip_key_info *pTkip, u8 *pSrc, u32 nBytes)
-{
- /* This is simple */
- while (nBytes > 0) {
- RTMPTkipAppendByte(pTkip, *pSrc++);
- nBytes--;
- }
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Get the MIC Value.
-
- Arguments:
- pAd Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = DISPATCH_LEVEL
-
- Note:
- the MIC Value is store in pAd->PrivateInfo.MIC
- ========================================================================
-*/
-void RTMPTkipGetMIC(struct rt_tkip_key_info *pTkip)
-{
- /* Append the minimum padding */
- RTMPTkipAppendByte(pTkip, 0x5a);
- RTMPTkipAppendByte(pTkip, 0);
- RTMPTkipAppendByte(pTkip, 0);
- RTMPTkipAppendByte(pTkip, 0);
- RTMPTkipAppendByte(pTkip, 0);
- /* and then zeroes until the length is a multiple of 4 */
- while (pTkip->nBytesInM != 0) {
- RTMPTkipAppendByte(pTkip, 0);
- }
- /* The appendByte function has already computed the result. */
- RTMPTkipPutUInt32(pTkip->MIC, pTkip->L);
- RTMPTkipPutUInt32(pTkip->MIC + 4, pTkip->R);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Init Tkip function.
-
- Arguments:
- pAd Pointer to our adapter
- pTKey Pointer to the Temporal Key (TK), TK shall be 128bits.
- KeyId TK Key ID
- pTA Pointer to transmitter address
- pMICKey pointer to MIC Key
-
- Return Value:
- None
-
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPInitTkipEngine(struct rt_rtmp_adapter *pAd,
- u8 *pKey,
- u8 KeyId,
- u8 *pTA,
- u8 *pMICKey,
- u8 *pTSC, unsigned long *pIV16, unsigned long *pIV32)
-{
- struct rt_tkip_iv tkipIv;
-
- /* Prepare 8 bytes TKIP encapsulation for MPDU */
- NdisZeroMemory(&tkipIv, sizeof(struct rt_tkip_iv));
- tkipIv.IV16.field.rc0 = *(pTSC + 1);
- tkipIv.IV16.field.rc1 = (tkipIv.IV16.field.rc0 | 0x20) & 0x7f;
- tkipIv.IV16.field.rc2 = *pTSC;
- tkipIv.IV16.field.CONTROL.field.ExtIV = 1; /* 0: non-extended IV, 1: an extended IV */
- tkipIv.IV16.field.CONTROL.field.KeyID = KeyId;
-/* tkipIv.IV32 = *(unsigned long *)(pTSC + 2); */
- NdisMoveMemory(&tkipIv.IV32, (pTSC + 2), 4); /* Copy IV */
-
- *pIV16 = tkipIv.IV16.word;
- *pIV32 = tkipIv.IV32;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Init MIC Value calculation function which include set MIC key &
- calculate first 16 bytes (DA + SA + priority + 0)
-
- Arguments:
- pAd Pointer to our adapter
- pTKey Pointer to the Temporal Key (TK), TK shall be 128bits.
- pDA Pointer to DA address
- pSA Pointer to SA address
- pMICKey pointer to MIC Key
-
- Return Value:
- None
-
- Note:
-
- ========================================================================
-*/
-void RTMPInitMICEngine(struct rt_rtmp_adapter *pAd,
- u8 *pKey,
- u8 *pDA,
- u8 *pSA, u8 UserPriority, u8 *pMICKey)
-{
- unsigned long Priority = UserPriority;
-
- /* Init MIC value calculation */
- RTMPTkipSetMICKey(&pAd->PrivateInfo.Tx, pMICKey);
- /* DA */
- RTMPTkipAppend(&pAd->PrivateInfo.Tx, pDA, MAC_ADDR_LEN);
- /* SA */
- RTMPTkipAppend(&pAd->PrivateInfo.Tx, pSA, MAC_ADDR_LEN);
- /* Priority + 3 bytes of 0 */
- RTMPTkipAppend(&pAd->PrivateInfo.Tx, (u8 *)& Priority, 4);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Compare MIC value of received MSDU
-
- Arguments:
- pAd Pointer to our adapter
- pSrc Pointer to the received Plain text data
- pDA Pointer to DA address
- pSA Pointer to SA address
- pMICKey pointer to MIC Key
- Len the length of the received plain text data exclude MIC value
-
- Return Value:
- TRUE MIC value matched
- FALSE MIC value mismatched
-
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-BOOLEAN RTMPTkipCompareMICValue(struct rt_rtmp_adapter *pAd,
- u8 *pSrc,
- u8 *pDA,
- u8 *pSA,
- u8 *pMICKey,
- u8 UserPriority, u32 Len)
-{
- u8 OldMic[8];
- unsigned long Priority = UserPriority;
-
- /* Init MIC value calculation */
- RTMPTkipSetMICKey(&pAd->PrivateInfo.Rx, pMICKey);
- /* DA */
- RTMPTkipAppend(&pAd->PrivateInfo.Rx, pDA, MAC_ADDR_LEN);
- /* SA */
- RTMPTkipAppend(&pAd->PrivateInfo.Rx, pSA, MAC_ADDR_LEN);
- /* Priority + 3 bytes of 0 */
- RTMPTkipAppend(&pAd->PrivateInfo.Rx, (u8 *)& Priority, 4);
-
- /* Calculate MIC value from plain text data */
- RTMPTkipAppend(&pAd->PrivateInfo.Rx, pSrc, Len);
-
- /* Get MIC valude from received frame */
- NdisMoveMemory(OldMic, pSrc + Len, 8);
-
- /* Get MIC value from decrypted plain data */
- RTMPTkipGetMIC(&pAd->PrivateInfo.Rx);
-
- /* Move MIC value from MSDU, this steps should move to data path. */
- /* Since the MIC value might cross MPDUs. */
- if (!NdisEqualMemory(pAd->PrivateInfo.Rx.MIC, OldMic, 8)) {
- DBGPRINT_RAW(RT_DEBUG_ERROR, ("RTMPTkipCompareMICValue(): TKIP MIC Error !\n")); /*MIC error. */
-
- return (FALSE);
- }
- return (TRUE);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Copy frame from waiting queue into relative ring buffer and set
- appropriate ASIC register to kick hardware transmit function
-
- Arguments:
- pAd Pointer to our adapter
- void * Pointer to Ndis Packet for MIC calculation
- pEncap Pointer to LLC encap data
- LenEncap Total encap length, might be 0 which indicates no encap
-
- Return Value:
- None
-
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPCalculateMICValue(struct rt_rtmp_adapter *pAd,
- void *pPacket,
- u8 *pEncap,
- struct rt_cipher_key *pKey, u8 apidx)
-{
- struct rt_packet_info PacketInfo;
- u8 *pSrcBufVA;
- u32 SrcBufLen;
- u8 *pSrc;
- u8 UserPriority;
- u8 vlan_offset = 0;
-
- RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen);
-
- UserPriority = RTMP_GET_PACKET_UP(pPacket);
- pSrc = pSrcBufVA;
-
- /* determine if this is a vlan packet */
- if (((*(pSrc + 12) << 8) + *(pSrc + 13)) == 0x8100)
- vlan_offset = 4;
-
- {
- RTMPInitMICEngine(pAd,
- pKey->Key,
- pSrc, pSrc + 6, UserPriority, pKey->TxMic);
- }
-
- if (pEncap != NULL) {
- /* LLC encapsulation */
- RTMPTkipAppend(&pAd->PrivateInfo.Tx, pEncap, 6);
- /* Protocol Type */
- RTMPTkipAppend(&pAd->PrivateInfo.Tx, pSrc + 12 + vlan_offset,
- 2);
- }
- SrcBufLen -= (14 + vlan_offset);
- pSrc += (14 + vlan_offset);
- do {
- if (SrcBufLen > 0) {
- RTMPTkipAppend(&pAd->PrivateInfo.Tx, pSrc, SrcBufLen);
- }
-
- break; /* No need handle next packet */
-
- } while (TRUE); /* End of copying payload */
-
- /* Compute the final MIC Value */
- RTMPTkipGetMIC(&pAd->PrivateInfo.Tx);
-}
-
-/************************************************************/
-/* tkip_sbox() */
-/* Returns a 16 bit value from a 64K entry table. The Table */
-/* is synthesized from two 256 entry byte wide tables. */
-/************************************************************/
-
-u32 tkip_sbox(u32 index)
-{
- u32 index_low;
- u32 index_high;
- u32 left, right;
-
- index_low = (index % 256);
- index_high = ((index >> 8) % 256);
-
- left = Tkip_Sbox_Lower[index_low] + (Tkip_Sbox_Upper[index_low] * 256);
- right =
- Tkip_Sbox_Upper[index_high] + (Tkip_Sbox_Lower[index_high] * 256);
-
- return (left ^ right);
-}
-
-u32 rotr1(u32 a)
-{
- unsigned int b;
-
- if ((a & 0x01) == 0x01) {
- b = (a >> 1) | 0x8000;
- } else {
- b = (a >> 1) & 0x7fff;
- }
- b = b % 65536;
- return b;
-}
-
-void RTMPTkipMixKey(u8 * key, u8 * ta, unsigned long pnl, /* Least significant 16 bits of PN */
- unsigned long pnh, /* Most significant 32 bits of PN */
- u8 * rc4key, u32 * p1k)
-{
-
- u32 tsc0;
- u32 tsc1;
- u32 tsc2;
-
- u32 ppk0;
- u32 ppk1;
- u32 ppk2;
- u32 ppk3;
- u32 ppk4;
- u32 ppk5;
-
- int i;
- int j;
-
- tsc0 = (unsigned int)((pnh >> 16) % 65536); /* msb */
- tsc1 = (unsigned int)(pnh % 65536);
- tsc2 = (unsigned int)(pnl % 65536); /* lsb */
-
- /* Phase 1, step 1 */
- p1k[0] = tsc1;
- p1k[1] = tsc0;
- p1k[2] = (u32)(ta[0] + (ta[1] * 256));
- p1k[3] = (u32)(ta[2] + (ta[3] * 256));
- p1k[4] = (u32)(ta[4] + (ta[5] * 256));
-
- /* Phase 1, step 2 */
- for (i = 0; i < 8; i++) {
- j = 2 * (i & 1);
- p1k[0] =
- (p1k[0] +
- tkip_sbox((p1k[4] ^ ((256 * key[1 + j]) + key[j])) %
- 65536)) % 65536;
- p1k[1] =
- (p1k[1] +
- tkip_sbox((p1k[0] ^ ((256 * key[5 + j]) + key[4 + j])) %
- 65536)) % 65536;
- p1k[2] =
- (p1k[2] +
- tkip_sbox((p1k[1] ^ ((256 * key[9 + j]) + key[8 + j])) %
- 65536)) % 65536;
- p1k[3] =
- (p1k[3] +
- tkip_sbox((p1k[2] ^ ((256 * key[13 + j]) + key[12 + j])) %
- 65536)) % 65536;
- p1k[4] =
- (p1k[4] +
- tkip_sbox((p1k[3] ^ (((256 * key[1 + j]) + key[j]))) %
- 65536)) % 65536;
- p1k[4] = (p1k[4] + i) % 65536;
- }
-
- /* Phase 2, Step 1 */
- ppk0 = p1k[0];
- ppk1 = p1k[1];
- ppk2 = p1k[2];
- ppk3 = p1k[3];
- ppk4 = p1k[4];
- ppk5 = (p1k[4] + tsc2) % 65536;
-
- /* Phase2, Step 2 */
- ppk0 = ppk0 + tkip_sbox((ppk5 ^ ((256 * key[1]) + key[0])) % 65536);
- ppk1 = ppk1 + tkip_sbox((ppk0 ^ ((256 * key[3]) + key[2])) % 65536);
- ppk2 = ppk2 + tkip_sbox((ppk1 ^ ((256 * key[5]) + key[4])) % 65536);
- ppk3 = ppk3 + tkip_sbox((ppk2 ^ ((256 * key[7]) + key[6])) % 65536);
- ppk4 = ppk4 + tkip_sbox((ppk3 ^ ((256 * key[9]) + key[8])) % 65536);
- ppk5 = ppk5 + tkip_sbox((ppk4 ^ ((256 * key[11]) + key[10])) % 65536);
-
- ppk0 = ppk0 + rotr1(ppk5 ^ ((256 * key[13]) + key[12]));
- ppk1 = ppk1 + rotr1(ppk0 ^ ((256 * key[15]) + key[14]));
- ppk2 = ppk2 + rotr1(ppk1);
- ppk3 = ppk3 + rotr1(ppk2);
- ppk4 = ppk4 + rotr1(ppk3);
- ppk5 = ppk5 + rotr1(ppk4);
-
- /* Phase 2, Step 3 */
- /* Phase 2, Step 3 */
-
- tsc0 = (unsigned int)((pnh >> 16) % 65536); /* msb */
- tsc1 = (unsigned int)(pnh % 65536);
- tsc2 = (unsigned int)(pnl % 65536); /* lsb */
-
- rc4key[0] = (tsc2 >> 8) % 256;
- rc4key[1] = (((tsc2 >> 8) % 256) | 0x20) & 0x7f;
- rc4key[2] = tsc2 % 256;
- rc4key[3] = ((ppk5 ^ ((256 * key[1]) + key[0])) >> 1) % 256;
-
- rc4key[4] = ppk0 % 256;
- rc4key[5] = (ppk0 >> 8) % 256;
-
- rc4key[6] = ppk1 % 256;
- rc4key[7] = (ppk1 >> 8) % 256;
-
- rc4key[8] = ppk2 % 256;
- rc4key[9] = (ppk2 >> 8) % 256;
-
- rc4key[10] = ppk3 % 256;
- rc4key[11] = (ppk3 >> 8) % 256;
-
- rc4key[12] = ppk4 % 256;
- rc4key[13] = (ppk4 >> 8) % 256;
-
- rc4key[14] = ppk5 % 256;
- rc4key[15] = (ppk5 >> 8) % 256;
-}
-
-/* */
-/* TRUE: Success! */
-/* FALSE: Decrypt Error! */
-/* */
-BOOLEAN RTMPSoftDecryptTKIP(struct rt_rtmp_adapter *pAd,
- u8 *pData,
- unsigned long DataByteCnt,
- u8 UserPriority, struct rt_cipher_key *pWpaKey)
-{
- u8 KeyID;
- u32 HeaderLen;
- u8 fc0;
- u8 fc1;
- u16 fc;
- u32 frame_type;
- u32 frame_subtype;
- u32 from_ds;
- u32 to_ds;
- int a4_exists;
- int qc_exists;
- u16 duration;
- u16 seq_control;
- u16 qos_control;
- u8 TA[MAC_ADDR_LEN];
- u8 DA[MAC_ADDR_LEN];
- u8 SA[MAC_ADDR_LEN];
- u8 RC4Key[16];
- u32 p1k[5]; /*for mix_key; */
- unsigned long pnl; /* Least significant 16 bits of PN */
- unsigned long pnh; /* Most significant 32 bits of PN */
- u32 num_blocks;
- u32 payload_remainder;
- struct rt_arcfourcontext ArcFourContext;
- u32 crc32 = 0;
- u32 trailfcs = 0;
- u8 MIC[8];
- u8 TrailMIC[8];
-
- fc0 = *pData;
- fc1 = *(pData + 1);
-
- fc = *((u16 *)pData);
-
- frame_type = ((fc0 >> 2) & 0x03);
- frame_subtype = ((fc0 >> 4) & 0x0f);
-
- from_ds = (fc1 & 0x2) >> 1;
- to_ds = (fc1 & 0x1);
-
- a4_exists = (from_ds & to_ds);
- qc_exists = ((frame_subtype == 0x08) || /* Assumed QoS subtypes */
- (frame_subtype == 0x09) || /* Likely to change. */
- (frame_subtype == 0x0a) || (frame_subtype == 0x0b)
- );
-
- HeaderLen = 24;
- if (a4_exists)
- HeaderLen += 6;
-
- KeyID = *((u8 *)(pData + HeaderLen + 3));
- KeyID = KeyID >> 6;
-
- if (pWpaKey[KeyID].KeyLen == 0) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("RTMPSoftDecryptTKIP failed!(KeyID[%d] Length can not be 0)\n",
- KeyID));
- return FALSE;
- }
-
- duration = *((u16 *)(pData + 2));
-
- seq_control = *((u16 *)(pData + 22));
-
- if (qc_exists) {
- if (a4_exists) {
- qos_control = *((u16 *)(pData + 30));
- } else {
- qos_control = *((u16 *)(pData + 24));
- }
- }
-
- if (to_ds == 0 && from_ds == 1) {
- NdisMoveMemory(DA, pData + 4, MAC_ADDR_LEN);
- NdisMoveMemory(SA, pData + 16, MAC_ADDR_LEN);
- NdisMoveMemory(TA, pData + 10, MAC_ADDR_LEN); /*BSSID */
- } else if (to_ds == 0 && from_ds == 0) {
- NdisMoveMemory(TA, pData + 10, MAC_ADDR_LEN);
- NdisMoveMemory(DA, pData + 4, MAC_ADDR_LEN);
- NdisMoveMemory(SA, pData + 10, MAC_ADDR_LEN);
- } else if (to_ds == 1 && from_ds == 0) {
- NdisMoveMemory(SA, pData + 10, MAC_ADDR_LEN);
- NdisMoveMemory(TA, pData + 10, MAC_ADDR_LEN);
- NdisMoveMemory(DA, pData + 16, MAC_ADDR_LEN);
- } else if (to_ds == 1 && from_ds == 1) {
- NdisMoveMemory(TA, pData + 10, MAC_ADDR_LEN);
- NdisMoveMemory(DA, pData + 16, MAC_ADDR_LEN);
- NdisMoveMemory(SA, pData + 22, MAC_ADDR_LEN);
- }
-
- num_blocks = (DataByteCnt - 16) / 16;
- payload_remainder = (DataByteCnt - 16) % 16;
-
- pnl = (*(pData + HeaderLen)) * 256 + *(pData + HeaderLen + 2);
- pnh = *((unsigned long *)(pData + HeaderLen + 4));
- pnh = cpu2le32(pnh);
- RTMPTkipMixKey(pWpaKey[KeyID].Key, TA, pnl, pnh, RC4Key, p1k);
-
- ARCFOUR_INIT(&ArcFourContext, RC4Key, 16);
-
- ARCFOUR_DECRYPT(&ArcFourContext, pData + HeaderLen,
- pData + HeaderLen + 8, DataByteCnt - HeaderLen - 8);
- NdisMoveMemory(&trailfcs, pData + DataByteCnt - 8 - 4, 4);
- crc32 = RTMP_CALC_FCS32(PPPINITFCS32, pData + HeaderLen, DataByteCnt - HeaderLen - 8 - 4); /*Skip IV+EIV 8 bytes & Skip last 4 bytes(FCS). */
- crc32 ^= 0xffffffff; /* complement */
-
- if (crc32 != cpu2le32(trailfcs)) {
- DBGPRINT(RT_DEBUG_TRACE, ("RTMPSoftDecryptTKIP, WEP Data ICV Error !\n")); /*ICV error. */
-
- return (FALSE);
- }
-
- NdisMoveMemory(TrailMIC, pData + DataByteCnt - 8 - 8 - 4, 8);
- RTMPInitMICEngine(pAd, pWpaKey[KeyID].Key, DA, SA, UserPriority,
- pWpaKey[KeyID].RxMic);
- RTMPTkipAppend(&pAd->PrivateInfo.Tx, pData + HeaderLen,
- DataByteCnt - HeaderLen - 8 - 12);
- RTMPTkipGetMIC(&pAd->PrivateInfo.Tx);
- NdisMoveMemory(MIC, pAd->PrivateInfo.Tx.MIC, 8);
-
- if (!NdisEqualMemory(MIC, TrailMIC, 8)) {
- DBGPRINT(RT_DEBUG_ERROR, ("RTMPSoftDecryptTKIP, WEP Data MIC Error !\n")); /*MIC error. */
- /*RTMPReportMicError(pAd, &pWpaKey[KeyID]); // marked by AlbertY @ 20060630 */
- return (FALSE);
- }
- /*DBGPRINT(RT_DEBUG_TRACE, "RTMPSoftDecryptTKIP Decript done!\n"); */
- return TRUE;
-}
diff --git a/drivers/staging/rt2860/common/cmm_wep.c b/drivers/staging/rt2860/common/cmm_wep.c
deleted file mode 100644
index 76f880cb39b0..000000000000
--- a/drivers/staging/rt2860/common/cmm_wep.c
+++ /dev/null
@@ -1,473 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-
- Module Name:
- rtmp_wep.c
-
- Abstract:
-
- Revision History:
- Who When What
- -------- ---------- ----------------------------------------------
- Paul Wu 10-28-02 Initial
-*/
-
-#include "../rt_config.h"
-
-u32 FCSTAB_32[256] = {
- 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
- 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
- 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
- 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
- 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
- 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
- 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
- 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
- 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
- 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
- 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
- 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
- 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
- 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
- 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
- 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
- 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
- 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
- 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
- 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
- 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
- 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
- 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
- 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
- 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
- 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
- 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
- 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
- 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
- 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
- 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
- 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
- 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
- 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
- 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
- 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
- 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
- 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
- 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
- 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
- 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
- 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
- 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
- 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
- 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
- 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
- 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
- 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
- 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
- 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
- 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
- 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
- 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
- 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
- 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
- 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
- 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
- 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
- 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
- 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
- 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
- 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
- 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
- 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
-};
-
-/*
-u8 WEPKEY[] = {
- //IV
- 0x00, 0x11, 0x22,
- //WEP KEY
- 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC
- };
- */
-
-/*
- ========================================================================
-
- Routine Description:
- Init WEP function.
-
- Arguments:
- pAd Pointer to our adapter
- pKey Pointer to the WEP KEY
- KeyId WEP Key ID
- KeyLen the length of WEP KEY
- pDest Pointer to the destination which Encryption data will store in.
-
- Return Value:
- None
-
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPInitWepEngine(struct rt_rtmp_adapter *pAd,
- u8 *pKey,
- u8 KeyId, u8 KeyLen, IN u8 *pDest)
-{
- u32 i;
- u8 WEPKEY[] = {
- /*IV */
- 0x00, 0x11, 0x22,
- /*WEP KEY */
- 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
- 0xAA, 0xBB, 0xCC
- };
-
- pAd->PrivateInfo.FCSCRC32 = PPPINITFCS32; /*Init crc32. */
-
- {
- NdisMoveMemory(WEPKEY + 3, pKey, KeyLen);
-
- for (i = 0; i < 3; i++)
- WEPKEY[i] = RandomByte(pAd); /*Call mlme RandomByte() function. */
- ARCFOUR_INIT(&pAd->PrivateInfo.WEPCONTEXT, WEPKEY, KeyLen + 3); /*INIT SBOX, KEYLEN+3(IV) */
-
- NdisMoveMemory(pDest, WEPKEY, 3); /*Append Init Vector */
- }
- *(pDest + 3) = (KeyId << 6); /*Append KEYID */
-
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Encrypt transimitted data
-
- Arguments:
- pAd Pointer to our adapter
- pSrc Pointer to the transimitted source data that will be encrypt
- pDest Pointer to the destination where entryption data will be store in.
- Len Indicate the length of the source data
-
- Return Value:
- None
-
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPEncryptData(struct rt_rtmp_adapter *pAd,
- u8 *pSrc, u8 *pDest, u32 Len)
-{
- pAd->PrivateInfo.FCSCRC32 =
- RTMP_CALC_FCS32(pAd->PrivateInfo.FCSCRC32, pSrc, Len);
- ARCFOUR_ENCRYPT(&pAd->PrivateInfo.WEPCONTEXT, pDest, pSrc, Len);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Decrypt received WEP data
-
- Arguments:
- pAdapter Pointer to our adapter
- pSrc Pointer to the received data
- Len the length of the received data
-
- Return Value:
- TRUE Decrypt WEP data success
- FALSE Decrypt WEP data failed
-
- Note:
-
- ========================================================================
-*/
-BOOLEAN RTMPSoftDecryptWEP(struct rt_rtmp_adapter *pAd,
- u8 *pData,
- unsigned long DataByteCnt, struct rt_cipher_key *pGroupKey)
-{
- u32 trailfcs;
- u32 crc32;
- u8 KeyIdx;
- u8 WEPKEY[] = {
- /*IV */
- 0x00, 0x11, 0x22,
- /*WEP KEY */
- 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
- 0xAA, 0xBB, 0xCC
- };
- u8 *pPayload = (u8 *) pData + LENGTH_802_11;
- unsigned long payload_len = DataByteCnt - LENGTH_802_11;
-
- NdisMoveMemory(WEPKEY, pPayload, 3); /*Get WEP IV */
-
- KeyIdx = (*(pPayload + 3) & 0xc0) >> 6;
- if (pGroupKey[KeyIdx].KeyLen == 0)
- return (FALSE);
-
- NdisMoveMemory(WEPKEY + 3, pGroupKey[KeyIdx].Key,
- pGroupKey[KeyIdx].KeyLen);
- ARCFOUR_INIT(&pAd->PrivateInfo.WEPCONTEXT, WEPKEY,
- pGroupKey[KeyIdx].KeyLen + 3);
- ARCFOUR_DECRYPT(&pAd->PrivateInfo.WEPCONTEXT, pPayload, pPayload + 4,
- payload_len - 4);
- NdisMoveMemory(&trailfcs, pPayload + payload_len - 8, 4);
- crc32 = RTMP_CALC_FCS32(PPPINITFCS32, pPayload, payload_len - 8); /*Skip last 4 bytes(FCS). */
- crc32 ^= 0xffffffff; /* complement */
-
- if (crc32 != cpu2le32(trailfcs)) {
- DBGPRINT(RT_DEBUG_TRACE, ("WEP Data CRC Error!\n")); /*CRC error. */
- return (FALSE);
- }
- return (TRUE);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- The Stream Cipher Encryption Algorithm "struct rt_arcfour" initialize
-
- Arguments:
- Ctx Pointer to struct rt_arcfour CONTEXT (SBOX)
- pKey Pointer to the WEP KEY
- KeyLen Indicate the length fo the WEP KEY
-
- Return Value:
- None
-
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void ARCFOUR_INIT(struct rt_arcfourcontext *Ctx, u8 *pKey, u32 KeyLen)
-{
- u8 t, u;
- u32 keyindex;
- u32 stateindex;
- u8 *state;
- u32 counter;
-
- state = Ctx->STATE;
- Ctx->X = 0;
- Ctx->Y = 0;
- for (counter = 0; counter < 256; counter++)
- state[counter] = (u8)counter;
- keyindex = 0;
- stateindex = 0;
- for (counter = 0; counter < 256; counter++) {
- t = state[counter];
- stateindex = (stateindex + pKey[keyindex] + t) & 0xff;
- u = state[stateindex];
- state[stateindex] = t;
- state[counter] = u;
- if (++keyindex >= KeyLen)
- keyindex = 0;
- }
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Get bytes from struct rt_arcfour CONTEXT (S-BOX)
-
- Arguments:
- Ctx Pointer to struct rt_arcfour CONTEXT (SBOX)
-
- Return Value:
- u8 - the value of the struct rt_arcfour CONTEXT (S-BOX)
-
- Note:
-
- ========================================================================
-*/
-u8 ARCFOUR_BYTE(struct rt_arcfourcontext *Ctx)
-{
- u32 x;
- u32 y;
- u8 sx, sy;
- u8 *state;
-
- state = Ctx->STATE;
- x = (Ctx->X + 1) & 0xff;
- sx = state[x];
- y = (sx + Ctx->Y) & 0xff;
- sy = state[y];
- Ctx->X = x;
- Ctx->Y = y;
- state[y] = sx;
- state[x] = sy;
-
- return (state[(sx + sy) & 0xff]);
-
-}
-
-/*
- ========================================================================
-
- Routine Description:
- The Stream Cipher Decryption Algorithm
-
- Arguments:
- Ctx Pointer to struct rt_arcfour CONTEXT (SBOX)
- pDest Pointer to the Destination
- pSrc Pointer to the Source data
- Len Indicate the length of the Source data
-
- Return Value:
- None
-
- Note:
-
- ========================================================================
-*/
-void ARCFOUR_DECRYPT(struct rt_arcfourcontext *Ctx,
- u8 *pDest, u8 *pSrc, u32 Len)
-{
- u32 i;
-
- for (i = 0; i < Len; i++)
- pDest[i] = pSrc[i] ^ ARCFOUR_BYTE(Ctx);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- The Stream Cipher Encryption Algorithm
-
- Arguments:
- Ctx Pointer to struct rt_arcfour CONTEXT (SBOX)
- pDest Pointer to the Destination
- pSrc Pointer to the Source data
- Len Indicate the length of the Source dta
-
- Return Value:
- None
-
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void ARCFOUR_ENCRYPT(struct rt_arcfourcontext *Ctx,
- u8 *pDest, u8 *pSrc, u32 Len)
-{
- u32 i;
-
- for (i = 0; i < Len; i++)
- pDest[i] = pSrc[i] ^ ARCFOUR_BYTE(Ctx);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- The Stream Cipher Encryption Algorithm which conform to the special requirement to encrypt GTK.
-
- Arguments:
- Ctx Pointer to struct rt_arcfour CONTEXT (SBOX)
- pDest Pointer to the Destination
- pSrc Pointer to the Source data
- Len Indicate the length of the Source dta
-
- ========================================================================
-*/
-
-void WPAARCFOUR_ENCRYPT(struct rt_arcfourcontext *Ctx,
- u8 *pDest, u8 *pSrc, u32 Len)
-{
- u32 i;
- /*discard first 256 bytes */
- for (i = 0; i < 256; i++)
- ARCFOUR_BYTE(Ctx);
-
- for (i = 0; i < Len; i++)
- pDest[i] = pSrc[i] ^ ARCFOUR_BYTE(Ctx);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Calculate a new FCS given the current FCS and the new data.
-
- Arguments:
- Fcs the original FCS value
- Cp pointer to the data which will be calculate the FCS
- Len the length of the data
-
- Return Value:
- u32 - FCS 32 bits
-
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-u32 RTMP_CALC_FCS32(u32 Fcs, u8 *Cp, int Len)
-{
- while (Len--)
- Fcs = (((Fcs) >> 8) ^ FCSTAB_32[((Fcs) ^ (*Cp++)) & 0xff]);
-
- return (Fcs);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Get last FCS and encrypt it to the destination
-
- Arguments:
- pDest Pointer to the Destination
-
- Return Value:
- None
-
- Note:
-
- ========================================================================
-*/
-void RTMPSetICV(struct rt_rtmp_adapter *pAd, u8 *pDest)
-{
- pAd->PrivateInfo.FCSCRC32 ^= 0xffffffff; /* complement */
- pAd->PrivateInfo.FCSCRC32 = cpu2le32(pAd->PrivateInfo.FCSCRC32);
-
- ARCFOUR_ENCRYPT(&pAd->PrivateInfo.WEPCONTEXT, pDest,
- (u8 *)& pAd->PrivateInfo.FCSCRC32, 4);
-}
diff --git a/drivers/staging/rt2860/common/cmm_wpa.c b/drivers/staging/rt2860/common/cmm_wpa.c
deleted file mode 100644
index 616ebec50c61..000000000000
--- a/drivers/staging/rt2860/common/cmm_wpa.c
+++ /dev/null
@@ -1,3010 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-
- Module Name:
- wpa.c
-
- Abstract:
-
- Revision History:
- Who When What
- -------- ---------- ----------------------------------------------
- Jan Lee 03-07-22 Initial
- Paul Lin 03-11-28 Modify for supplicant
-*/
-#include "../rt_config.h"
-/* WPA OUI */
-u8 OUI_WPA_NONE_AKM[4] = { 0x00, 0x50, 0xF2, 0x00 };
-u8 OUI_WPA_VERSION[4] = { 0x00, 0x50, 0xF2, 0x01 };
-u8 OUI_WPA_WEP40[4] = { 0x00, 0x50, 0xF2, 0x01 };
-u8 OUI_WPA_TKIP[4] = { 0x00, 0x50, 0xF2, 0x02 };
-u8 OUI_WPA_CCMP[4] = { 0x00, 0x50, 0xF2, 0x04 };
-u8 OUI_WPA_WEP104[4] = { 0x00, 0x50, 0xF2, 0x05 };
-u8 OUI_WPA_8021X_AKM[4] = { 0x00, 0x50, 0xF2, 0x01 };
-u8 OUI_WPA_PSK_AKM[4] = { 0x00, 0x50, 0xF2, 0x02 };
-
-/* WPA2 OUI */
-u8 OUI_WPA2_WEP40[4] = { 0x00, 0x0F, 0xAC, 0x01 };
-u8 OUI_WPA2_TKIP[4] = { 0x00, 0x0F, 0xAC, 0x02 };
-u8 OUI_WPA2_CCMP[4] = { 0x00, 0x0F, 0xAC, 0x04 };
-u8 OUI_WPA2_8021X_AKM[4] = { 0x00, 0x0F, 0xAC, 0x01 };
-u8 OUI_WPA2_PSK_AKM[4] = { 0x00, 0x0F, 0xAC, 0x02 };
-u8 OUI_WPA2_WEP104[4] = { 0x00, 0x0F, 0xAC, 0x05 };
-
-static void ConstructEapolKeyData(struct rt_mac_table_entry *pEntry,
- u8 GroupKeyWepStatus,
- u8 keyDescVer,
- u8 MsgType,
- u8 DefaultKeyIdx,
- u8 * GTK,
- u8 * RSNIE,
- u8 RSNIE_LEN, struct rt_eapol_packet * pMsg);
-
-static void CalculateMIC(u8 KeyDescVer,
- u8 * PTK, struct rt_eapol_packet * pMsg);
-
-static void WpaEAPPacketAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
-
-static void WpaEAPOLASFAlertAction(struct rt_rtmp_adapter *pAd,
- struct rt_mlme_queue_elem *Elem);
-
-static void WpaEAPOLLogoffAction(struct rt_rtmp_adapter *pAd,
- struct rt_mlme_queue_elem *Elem);
-
-static void WpaEAPOLStartAction(struct rt_rtmp_adapter *pAd,
- struct rt_mlme_queue_elem *Elem);
-
-static void WpaEAPOLKeyAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem);
-
-/*
- ==========================================================================
- Description:
- association state machine init, including state transition and timer init
- Parameters:
- S - pointer to the association state machine
- ==========================================================================
- */
-void WpaStateMachineInit(struct rt_rtmp_adapter *pAd,
- struct rt_state_machine *S, OUT STATE_MACHINE_FUNC Trans[])
-{
- StateMachineInit(S, (STATE_MACHINE_FUNC *) Trans, MAX_WPA_PTK_STATE,
- MAX_WPA_MSG, (STATE_MACHINE_FUNC) Drop, WPA_PTK,
- WPA_MACHINE_BASE);
-
- StateMachineSetAction(S, WPA_PTK, MT2_EAPPacket,
- (STATE_MACHINE_FUNC) WpaEAPPacketAction);
- StateMachineSetAction(S, WPA_PTK, MT2_EAPOLStart,
- (STATE_MACHINE_FUNC) WpaEAPOLStartAction);
- StateMachineSetAction(S, WPA_PTK, MT2_EAPOLLogoff,
- (STATE_MACHINE_FUNC) WpaEAPOLLogoffAction);
- StateMachineSetAction(S, WPA_PTK, MT2_EAPOLKey,
- (STATE_MACHINE_FUNC) WpaEAPOLKeyAction);
- StateMachineSetAction(S, WPA_PTK, MT2_EAPOLASFAlert,
- (STATE_MACHINE_FUNC) WpaEAPOLASFAlertAction);
-}
-
-/*
- ==========================================================================
- Description:
- this is state machine function.
- When receiving EAP packets which is for 802.1x authentication use.
- Not use in PSK case
- Return:
- ==========================================================================
-*/
-void WpaEAPPacketAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
-}
-
-void WpaEAPOLASFAlertAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
-}
-
-void WpaEAPOLLogoffAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
-}
-
-/*
- ==========================================================================
- Description:
- Start 4-way HS when rcv EAPOL_START which may create by our driver in assoc.c
- Return:
- ==========================================================================
-*/
-void WpaEAPOLStartAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
- struct rt_mac_table_entry *pEntry;
- struct rt_header_802_11 * pHeader;
-
- DBGPRINT(RT_DEBUG_TRACE, ("WpaEAPOLStartAction ===> \n"));
-
- pHeader = (struct rt_header_802_11 *) Elem->Msg;
-
- /*For normaol PSK, we enqueue an EAPOL-Start command to trigger the process. */
- if (Elem->MsgLen == 6)
- pEntry = MacTableLookup(pAd, Elem->Msg);
- else {
- pEntry = MacTableLookup(pAd, pHeader->Addr2);
- }
-
- if (pEntry) {
- DBGPRINT(RT_DEBUG_TRACE,
- (" PortSecured(%d), WpaState(%d), AuthMode(%d), PMKID_CacheIdx(%d) \n",
- pEntry->PortSecured, pEntry->WpaState,
- pEntry->AuthMode, pEntry->PMKID_CacheIdx));
-
- if ((pEntry->PortSecured == WPA_802_1X_PORT_NOT_SECURED)
- && (pEntry->WpaState < AS_PTKSTART)
- && ((pEntry->AuthMode == Ndis802_11AuthModeWPAPSK)
- || (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK)
- || ((pEntry->AuthMode == Ndis802_11AuthModeWPA2)
- && (pEntry->PMKID_CacheIdx != ENTRY_NOT_FOUND)))) {
- pEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP;
- pEntry->WpaState = AS_INITPSK;
- pEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;
- NdisZeroMemory(pEntry->R_Counter,
- sizeof(pEntry->R_Counter));
- pEntry->ReTryCounter = PEER_MSG1_RETRY_TIMER_CTR;
-
- WPAStart4WayHS(pAd, pEntry, PEER_MSG1_RETRY_EXEC_INTV);
- }
- }
-}
-
-/*
- ==========================================================================
- Description:
- This is state machine function.
- When receiving EAPOL packets which is for 802.1x key management.
- Use both in WPA, and WPAPSK case.
- In this function, further dispatch to different functions according to the received packet. 3 categories are :
- 1. normal 4-way pairwisekey and 2-way groupkey handshake
- 2. MIC error (Countermeasures attack) report packet from STA.
- 3. Request for pairwise/group key update from STA
- Return:
- ==========================================================================
-*/
-void WpaEAPOLKeyAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
- struct rt_mac_table_entry *pEntry;
- struct rt_header_802_11 * pHeader;
- struct rt_eapol_packet * pEapol_packet;
- struct rt_key_info peerKeyInfo;
-
- DBGPRINT(RT_DEBUG_TRACE, ("WpaEAPOLKeyAction ===>\n"));
-
- pHeader = (struct rt_header_802_11 *) Elem->Msg;
- pEapol_packet =
- (struct rt_eapol_packet *) & Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H];
-
- NdisZeroMemory((u8 *)& peerKeyInfo, sizeof(peerKeyInfo));
- NdisMoveMemory((u8 *)& peerKeyInfo,
- (u8 *)& pEapol_packet->KeyDesc.KeyInfo,
- sizeof(struct rt_key_info));
-
- hex_dump("Received Eapol frame", (unsigned char *)pEapol_packet,
- (Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H));
-
- *((u16 *) & peerKeyInfo) = cpu2le16(*((u16 *) & peerKeyInfo));
-
- do {
- pEntry = MacTableLookup(pAd, pHeader->Addr2);
-
- if (!pEntry
- || ((!pEntry->ValidAsCLI) && (!pEntry->ValidAsApCli)))
- break;
-
- if (pEntry->AuthMode < Ndis802_11AuthModeWPA)
- break;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("Receive EAPoL-Key frame from STA %pMF\n",
- pEntry->Addr));
-
- if (((pEapol_packet->ProVer != EAPOL_VER)
- && (pEapol_packet->ProVer != EAPOL_VER2))
- || ((pEapol_packet->KeyDesc.Type != WPA1_KEY_DESC)
- && (pEapol_packet->KeyDesc.Type != WPA2_KEY_DESC))) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("Key descripter does not match with WPA rule\n"));
- break;
- }
- /* The value 1 shall be used for all EAPOL-Key frames to and from a STA when */
- /* neither the group nor pairwise ciphers are CCMP for Key Descriptor 1. */
- if ((pEntry->WepStatus == Ndis802_11Encryption2Enabled)
- && (peerKeyInfo.KeyDescVer != DESC_TYPE_TKIP)) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("Key descripter version not match(TKIP) \n"));
- break;
- }
- /* The value 2 shall be used for all EAPOL-Key frames to and from a STA when */
- /* either the pairwise or the group cipher is AES-CCMP for Key Descriptor 2. */
- else if ((pEntry->WepStatus == Ndis802_11Encryption3Enabled)
- && (peerKeyInfo.KeyDescVer != DESC_TYPE_AES)) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("Key descripter version not match(AES) \n"));
- break;
- }
- /* Check if this STA is in class 3 state and the WPA state is started */
- if ((pEntry->Sst == SST_ASSOC)
- && (pEntry->WpaState >= AS_INITPSK)) {
- /* Check the Key Ack (bit 7) of the Key Information to determine the Authenticator */
- /* or not. */
- /* An EAPOL-Key frame that is sent by the Supplicant in response to an EAPOL- */
- /* Key frame from the Authenticator must not have the Ack bit set. */
- if (peerKeyInfo.KeyAck == 1) {
- /* The frame is snet by Authenticator. */
- /* So the Supplicant side shall handle this. */
-
- if ((peerKeyInfo.Secure == 0)
- && (peerKeyInfo.Request == 0)
- && (peerKeyInfo.Error == 0)
- && (peerKeyInfo.KeyType == PAIRWISEKEY)) {
- /* Process 1. the message 1 of 4-way HS in WPA or WPA2 */
- /* EAPOL-Key(0,0,1,0,P,0,0,ANonce,0,DataKD_M1) */
- /* 2. the message 3 of 4-way HS in WPA */
- /* EAPOL-Key(0,1,1,1,P,0,KeyRSC,ANonce,MIC,DataKD_M3) */
- if (peerKeyInfo.KeyMic == 0)
- PeerPairMsg1Action(pAd, pEntry,
- Elem);
- else
- PeerPairMsg3Action(pAd, pEntry,
- Elem);
- } else if ((peerKeyInfo.Secure == 1)
- && (peerKeyInfo.KeyMic == 1)
- && (peerKeyInfo.Request == 0)
- && (peerKeyInfo.Error == 0)) {
- /* Process 1. the message 3 of 4-way HS in WPA2 */
- /* EAPOL-Key(1,1,1,1,P,0,KeyRSC,ANonce,MIC,DataKD_M3) */
- /* 2. the message 1 of group KS in WPA or WPA2 */
- /* EAPOL-Key(1,1,1,0,G,0,Key RSC,0, MIC,GTK[N]) */
- if (peerKeyInfo.KeyType == PAIRWISEKEY)
- PeerPairMsg3Action(pAd, pEntry,
- Elem);
- else
- PeerGroupMsg1Action(pAd, pEntry,
- Elem);
- }
- } else {
- /* The frame is snet by Supplicant. */
- /* So the Authenticator side shall handle this. */
- if ((peerKeyInfo.Request == 0) &&
- (peerKeyInfo.Error == 0) &&
- (peerKeyInfo.KeyMic == 1)) {
- if (peerKeyInfo.Secure == 0
- && peerKeyInfo.KeyType ==
- PAIRWISEKEY) {
- /* EAPOL-Key(0,1,0,0,P,0,0,SNonce,MIC,Data) */
- /* Process 1. message 2 of 4-way HS in WPA or WPA2 */
- /* 2. message 4 of 4-way HS in WPA */
- if (CONV_ARRARY_TO_u16
- (pEapol_packet->KeyDesc.
- KeyDataLen) == 0) {
- PeerPairMsg4Action(pAd,
- pEntry,
- Elem);
- } else {
- PeerPairMsg2Action(pAd,
- pEntry,
- Elem);
- }
- } else if (peerKeyInfo.Secure == 1
- && peerKeyInfo.KeyType ==
- PAIRWISEKEY) {
- /* EAPOL-Key(1,1,0,0,P,0,0,0,MIC,0) */
- /* Process message 4 of 4-way HS in WPA2 */
- PeerPairMsg4Action(pAd, pEntry,
- Elem);
- } else if (peerKeyInfo.Secure == 1
- && peerKeyInfo.KeyType ==
- GROUPKEY) {
- /* EAPOL-Key(1,1,0,0,G,0,0,0,MIC,0) */
- /* Process message 2 of Group key HS in WPA or WPA2 */
- PeerGroupMsg2Action(pAd, pEntry,
- &Elem->
- Msg
- [LENGTH_802_11],
- (Elem->
- MsgLen -
- LENGTH_802_11));
- }
- }
- }
- }
- } while (FALSE);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Copy frame from waiting queue into relative ring buffer and set
- appropriate ASIC register to kick hardware encryption before really
- sent out to air.
-
- Arguments:
- pAd Pointer to our adapter
- void * Pointer to outgoing Ndis frame
- NumberOfFrag Number of fragment required
-
- Return Value:
- None
-
- Note:
-
- ========================================================================
-*/
-void RTMPToWirelessSta(struct rt_rtmp_adapter *pAd,
- struct rt_mac_table_entry *pEntry,
- u8 *pHeader802_3,
- u32 HdrLen,
- u8 *pData, u32 DataLen, IN BOOLEAN bClearFrame)
-{
- void *pPacket;
- int Status;
-
- if ((!pEntry) || ((!pEntry->ValidAsCLI) && (!pEntry->ValidAsApCli)))
- return;
-
- do {
- /* build a NDIS packet */
- Status =
- RTMPAllocateNdisPacket(pAd, &pPacket, pHeader802_3, HdrLen,
- pData, DataLen);
- if (Status != NDIS_STATUS_SUCCESS)
- break;
-
- if (bClearFrame)
- RTMP_SET_PACKET_CLEAR_EAP_FRAME(pPacket, 1);
- else
- RTMP_SET_PACKET_CLEAR_EAP_FRAME(pPacket, 0);
- {
- RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS);
-
- RTMP_SET_PACKET_NET_DEVICE_MBSSID(pPacket, MAIN_MBSSID); /* set a default value */
- if (pEntry->apidx != 0)
- RTMP_SET_PACKET_NET_DEVICE_MBSSID(pPacket,
- pEntry->
- apidx);
-
- RTMP_SET_PACKET_WCID(pPacket, (u8)pEntry->Aid);
- RTMP_SET_PACKET_MOREDATA(pPacket, FALSE);
- }
-
- {
- /* send out the packet */
- Status = STASendPacket(pAd, pPacket);
- if (Status == NDIS_STATUS_SUCCESS) {
- u8 Index;
-
- /* Dequeue one frame from TxSwQueue0..3 queue and process it */
- /* There are three place calling dequeue for TX ring. */
- /* 1. Here, right after queueing the frame. */
- /* 2. At the end of TxRingTxDone service routine. */
- /* 3. Upon NDIS call RTMPSendPackets */
- if ((!RTMP_TEST_FLAG
- (pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
- &&
- (!RTMP_TEST_FLAG
- (pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS))) {
- for (Index = 0; Index < 5; Index++)
- if (pAd->TxSwQueue[Index].
- Number > 0)
- RTMPDeQueuePacket(pAd,
- FALSE,
- Index,
- MAX_TX_PROCESS);
- }
- }
- }
-
- } while (FALSE);
-}
-
-/*
- ==========================================================================
- Description:
- This is a function to initialize 4-way handshake
-
- Return:
-
- ==========================================================================
-*/
-void WPAStart4WayHS(struct rt_rtmp_adapter *pAd,
- struct rt_mac_table_entry *pEntry, unsigned long TimeInterval)
-{
- u8 Header802_3[14];
- struct rt_eapol_packet EAPOLPKT;
- u8 *pBssid = NULL;
- u8 group_cipher = Ndis802_11WEPDisabled;
-
- DBGPRINT(RT_DEBUG_TRACE, ("===> WPAStart4WayHS\n"));
-
- if (RTMP_TEST_FLAG
- (pAd,
- fRTMP_ADAPTER_RESET_IN_PROGRESS | fRTMP_ADAPTER_HALT_IN_PROGRESS))
- {
- DBGPRINT(RT_DEBUG_ERROR,
- ("[ERROR]WPAStart4WayHS : The interface is closed...\n"));
- return;
- }
-
- if (pBssid == NULL) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("[ERROR]WPAStart4WayHS : No corresponding Authenticator.\n"));
- return;
- }
- /* Check the status */
- if ((pEntry->WpaState > AS_PTKSTART) || (pEntry->WpaState < AS_INITPMK)) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("[ERROR]WPAStart4WayHS : Not expect calling\n"));
- return;
- }
-
- /* Increment replay counter by 1 */
- ADD_ONE_To_64BIT_VAR(pEntry->R_Counter);
-
- /* Randomly generate ANonce */
- GenRandom(pAd, (u8 *) pBssid, pEntry->ANonce);
-
- /* Construct EAPoL message - Pairwise Msg 1 */
- /* EAPOL-Key(0,0,1,0,P,0,0,ANonce,0,DataKD_M1) */
- NdisZeroMemory(&EAPOLPKT, sizeof(struct rt_eapol_packet));
- ConstructEapolMsg(pEntry, group_cipher, EAPOL_PAIR_MSG_1, 0, /* Default key index */
- pEntry->ANonce, NULL, /* TxRSC */
- NULL, /* GTK */
- NULL, /* RSNIE */
- 0, /* RSNIE length */
- &EAPOLPKT);
-
- /* Make outgoing frame */
- MAKE_802_3_HEADER(Header802_3, pEntry->Addr, pBssid, EAPOL);
- RTMPToWirelessSta(pAd, pEntry, Header802_3,
- LENGTH_802_3, (u8 *)& EAPOLPKT,
- CONV_ARRARY_TO_u16(EAPOLPKT.Body_Len) + 4,
- (pEntry->PortSecured ==
- WPA_802_1X_PORT_SECURED) ? FALSE : TRUE);
-
- /* Trigger Retry Timer */
- RTMPModTimer(&pEntry->RetryTimer, TimeInterval);
-
- /* Update State */
- pEntry->WpaState = AS_PTKSTART;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("<=== WPAStart4WayHS: send Msg1 of 4-way \n"));
-
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Process Pairwise key Msg-1 of 4-way handshaking and send Msg-2
-
- Arguments:
- pAd Pointer to our adapter
- Elem Message body
-
- Return Value:
- None
-
- Note:
-
- ========================================================================
-*/
-void PeerPairMsg1Action(struct rt_rtmp_adapter *pAd,
- struct rt_mac_table_entry *pEntry, struct rt_mlme_queue_elem *Elem)
-{
- u8 PTK[80];
- u8 Header802_3[14];
- struct rt_eapol_packet * pMsg1;
- u32 MsgLen;
- struct rt_eapol_packet EAPOLPKT;
- u8 *pCurrentAddr = NULL;
- u8 *pmk_ptr = NULL;
- u8 group_cipher = Ndis802_11WEPDisabled;
- u8 *rsnie_ptr = NULL;
- u8 rsnie_len = 0;
-
- DBGPRINT(RT_DEBUG_TRACE, ("===> PeerPairMsg1Action \n"));
-
- if ((!pEntry) || ((!pEntry->ValidAsCLI) && (!pEntry->ValidAsApCli)))
- return;
-
- if (Elem->MsgLen <
- (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_EAPOL_H +
- sizeof(struct rt_key_descripter) - MAX_LEN_OF_RSNIE - 2))
- return;
-
- {
- pCurrentAddr = pAd->CurrentAddress;
- pmk_ptr = pAd->StaCfg.PMK;
- group_cipher = pAd->StaCfg.GroupCipher;
- rsnie_ptr = pAd->StaCfg.RSN_IE;
- rsnie_len = pAd->StaCfg.RSNIE_Len;
- }
-
- /* Store the received frame */
- pMsg1 = (struct rt_eapol_packet *) & Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H];
- MsgLen = Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H;
-
- /* Sanity Check peer Pairwise message 1 - Replay Counter */
- if (PeerWpaMessageSanity(pAd, pMsg1, MsgLen, EAPOL_PAIR_MSG_1, pEntry)
- == FALSE)
- return;
-
- /* Store Replay counter, it will use to verify message 3 and construct message 2 */
- NdisMoveMemory(pEntry->R_Counter, pMsg1->KeyDesc.ReplayCounter,
- LEN_KEY_DESC_REPLAY);
-
- /* Store ANonce */
- NdisMoveMemory(pEntry->ANonce, pMsg1->KeyDesc.KeyNonce,
- LEN_KEY_DESC_NONCE);
-
- /* Generate random SNonce */
- GenRandom(pAd, (u8 *) pCurrentAddr, pEntry->SNonce);
-
- {
- /* Calculate PTK(ANonce, SNonce) */
- WpaDerivePTK(pAd,
- pmk_ptr,
- pEntry->ANonce,
- pEntry->Addr,
- pEntry->SNonce, pCurrentAddr, PTK, LEN_PTK);
-
- /* Save key to PTK entry */
- NdisMoveMemory(pEntry->PTK, PTK, LEN_PTK);
- }
-
- /* Update WpaState */
- pEntry->WpaState = AS_PTKINIT_NEGOTIATING;
-
- /* Construct EAPoL message - Pairwise Msg 2 */
- /* EAPOL-Key(0,1,0,0,P,0,0,SNonce,MIC,DataKD_M2) */
- NdisZeroMemory(&EAPOLPKT, sizeof(struct rt_eapol_packet));
- ConstructEapolMsg(pEntry, group_cipher, EAPOL_PAIR_MSG_2, 0, /* DefaultKeyIdx */
- pEntry->SNonce, NULL, /* TxRsc */
- NULL, /* GTK */
- (u8 *) rsnie_ptr, rsnie_len, &EAPOLPKT);
-
- /* Make outgoing frame */
- MAKE_802_3_HEADER(Header802_3, pEntry->Addr, pCurrentAddr, EAPOL);
-
- RTMPToWirelessSta(pAd, pEntry,
- Header802_3, sizeof(Header802_3), (u8 *)& EAPOLPKT,
- CONV_ARRARY_TO_u16(EAPOLPKT.Body_Len) + 4, TRUE);
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("<=== PeerPairMsg1Action: send Msg2 of 4-way \n"));
-}
-
-/*
- ==========================================================================
- Description:
- When receiving the second packet of 4-way pairwisekey handshake.
- Return:
- ==========================================================================
-*/
-void PeerPairMsg2Action(struct rt_rtmp_adapter *pAd,
- struct rt_mac_table_entry *pEntry, struct rt_mlme_queue_elem *Elem)
-{
- u8 PTK[80];
- BOOLEAN Cancelled;
- struct rt_header_802_11 * pHeader;
- struct rt_eapol_packet EAPOLPKT;
- struct rt_eapol_packet * pMsg2;
- u32 MsgLen;
- u8 Header802_3[LENGTH_802_3];
- u8 TxTsc[6];
- u8 *pBssid = NULL;
- u8 *pmk_ptr = NULL;
- u8 *gtk_ptr = NULL;
- u8 default_key = 0;
- u8 group_cipher = Ndis802_11WEPDisabled;
- u8 *rsnie_ptr = NULL;
- u8 rsnie_len = 0;
-
- DBGPRINT(RT_DEBUG_TRACE, ("===> PeerPairMsg2Action \n"));
-
- if ((!pEntry) || (!pEntry->ValidAsCLI))
- return;
-
- if (Elem->MsgLen <
- (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_EAPOL_H +
- sizeof(struct rt_key_descripter) - MAX_LEN_OF_RSNIE - 2))
- return;
-
- /* check Entry in valid State */
- if (pEntry->WpaState < AS_PTKSTART)
- return;
-
- /* pointer to 802.11 header */
- pHeader = (struct rt_header_802_11 *) Elem->Msg;
-
- /* skip 802.11_header(24-byte) and LLC_header(8) */
- pMsg2 = (struct rt_eapol_packet *) & Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H];
- MsgLen = Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H;
-
- /* Store SNonce */
- NdisMoveMemory(pEntry->SNonce, pMsg2->KeyDesc.KeyNonce,
- LEN_KEY_DESC_NONCE);
-
- {
- /* Derive PTK */
- WpaDerivePTK(pAd, (u8 *) pmk_ptr, pEntry->ANonce, /* ANONCE */
- (u8 *) pBssid, pEntry->SNonce, /* SNONCE */
- pEntry->Addr, PTK, LEN_PTK);
-
- NdisMoveMemory(pEntry->PTK, PTK, LEN_PTK);
- }
-
- /* Sanity Check peer Pairwise message 2 - Replay Counter, MIC, RSNIE */
- if (PeerWpaMessageSanity(pAd, pMsg2, MsgLen, EAPOL_PAIR_MSG_2, pEntry)
- == FALSE)
- return;
-
- do {
- /* delete retry timer */
- RTMPCancelTimer(&pEntry->RetryTimer, &Cancelled);
-
- /* Change state */
- pEntry->WpaState = AS_PTKINIT_NEGOTIATING;
-
- /* Increment replay counter by 1 */
- ADD_ONE_To_64BIT_VAR(pEntry->R_Counter);
-
- /* Construct EAPoL message - Pairwise Msg 3 */
- NdisZeroMemory(&EAPOLPKT, sizeof(struct rt_eapol_packet));
- ConstructEapolMsg(pEntry,
- group_cipher,
- EAPOL_PAIR_MSG_3,
- default_key,
- pEntry->ANonce,
- TxTsc,
- (u8 *) gtk_ptr,
- (u8 *) rsnie_ptr, rsnie_len, &EAPOLPKT);
-
- /* Make outgoing frame */
- MAKE_802_3_HEADER(Header802_3, pEntry->Addr, pBssid, EAPOL);
- RTMPToWirelessSta(pAd, pEntry, Header802_3, LENGTH_802_3,
- (u8 *)& EAPOLPKT,
- CONV_ARRARY_TO_u16(EAPOLPKT.Body_Len) + 4,
- (pEntry->PortSecured ==
- WPA_802_1X_PORT_SECURED) ? FALSE : TRUE);
-
- pEntry->ReTryCounter = PEER_MSG3_RETRY_TIMER_CTR;
- RTMPSetTimer(&pEntry->RetryTimer, PEER_MSG3_RETRY_EXEC_INTV);
-
- /* Update State */
- pEntry->WpaState = AS_PTKINIT_NEGOTIATING;
- } while (FALSE);
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("<=== PeerPairMsg2Action: send Msg3 of 4-way \n"));
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Process Pairwise key Msg 3 of 4-way handshaking and send Msg 4
-
- Arguments:
- pAd Pointer to our adapter
- Elem Message body
-
- Return Value:
- None
-
- Note:
-
- ========================================================================
-*/
-void PeerPairMsg3Action(struct rt_rtmp_adapter *pAd,
- struct rt_mac_table_entry *pEntry, struct rt_mlme_queue_elem *Elem)
-{
- struct rt_header_802_11 * pHeader;
- u8 Header802_3[14];
- struct rt_eapol_packet EAPOLPKT;
- struct rt_eapol_packet * pMsg3;
- u32 MsgLen;
- u8 *pCurrentAddr = NULL;
- u8 group_cipher = Ndis802_11WEPDisabled;
-
- DBGPRINT(RT_DEBUG_TRACE, ("===> PeerPairMsg3Action \n"));
-
- if ((!pEntry) || ((!pEntry->ValidAsCLI) && (!pEntry->ValidAsApCli)))
- return;
-
- if (Elem->MsgLen <
- (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_EAPOL_H +
- sizeof(struct rt_key_descripter) - MAX_LEN_OF_RSNIE - 2))
- return;
-
- {
- pCurrentAddr = pAd->CurrentAddress;
- group_cipher = pAd->StaCfg.GroupCipher;
-
- }
-
- /* Record 802.11 header & the received EAPOL packet Msg3 */
- pHeader = (struct rt_header_802_11 *) Elem->Msg;
- pMsg3 = (struct rt_eapol_packet *) & Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H];
- MsgLen = Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H;
-
- /* Sanity Check peer Pairwise message 3 - Replay Counter, MIC, RSNIE */
- if (PeerWpaMessageSanity(pAd, pMsg3, MsgLen, EAPOL_PAIR_MSG_3, pEntry)
- == FALSE)
- return;
-
- /* Save Replay counter, it will use construct message 4 */
- NdisMoveMemory(pEntry->R_Counter, pMsg3->KeyDesc.ReplayCounter,
- LEN_KEY_DESC_REPLAY);
-
- /* Double check ANonce */
- if (!NdisEqualMemory
- (pEntry->ANonce, pMsg3->KeyDesc.KeyNonce, LEN_KEY_DESC_NONCE)) {
- return;
- }
- /* Construct EAPoL message - Pairwise Msg 4 */
- NdisZeroMemory(&EAPOLPKT, sizeof(struct rt_eapol_packet));
- ConstructEapolMsg(pEntry, group_cipher, EAPOL_PAIR_MSG_4, 0, /* group key index not used in message 4 */
- NULL, /* Nonce not used in message 4 */
- NULL, /* TxRSC not used in message 4 */
- NULL, /* GTK not used in message 4 */
- NULL, /* RSN IE not used in message 4 */
- 0, &EAPOLPKT);
-
- /* Update WpaState */
- pEntry->WpaState = AS_PTKINITDONE;
-
- /* Update pairwise key */
- {
- struct rt_cipher_key *pSharedKey;
-
- pSharedKey = &pAd->SharedKey[BSS0][0];
-
- NdisMoveMemory(pAd->StaCfg.PTK, pEntry->PTK, LEN_PTK);
-
- /* Prepare pair-wise key information into shared key table */
- NdisZeroMemory(pSharedKey, sizeof(struct rt_cipher_key));
- pSharedKey->KeyLen = LEN_TKIP_EK;
- NdisMoveMemory(pSharedKey->Key, &pAd->StaCfg.PTK[32],
- LEN_TKIP_EK);
- NdisMoveMemory(pSharedKey->RxMic, &pAd->StaCfg.PTK[48],
- LEN_TKIP_RXMICK);
- NdisMoveMemory(pSharedKey->TxMic,
- &pAd->StaCfg.PTK[48 + LEN_TKIP_RXMICK],
- LEN_TKIP_TXMICK);
-
- /* Decide its ChiperAlg */
- if (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled)
- pSharedKey->CipherAlg = CIPHER_TKIP;
- else if (pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled)
- pSharedKey->CipherAlg = CIPHER_AES;
- else
- pSharedKey->CipherAlg = CIPHER_NONE;
-
- /* Update these related information to struct rt_mac_table_entry */
- pEntry = &pAd->MacTab.Content[BSSID_WCID];
- NdisMoveMemory(pEntry->PairwiseKey.Key, &pAd->StaCfg.PTK[32],
- LEN_TKIP_EK);
- NdisMoveMemory(pEntry->PairwiseKey.RxMic, &pAd->StaCfg.PTK[48],
- LEN_TKIP_RXMICK);
- NdisMoveMemory(pEntry->PairwiseKey.TxMic,
- &pAd->StaCfg.PTK[48 + LEN_TKIP_RXMICK],
- LEN_TKIP_TXMICK);
- pEntry->PairwiseKey.CipherAlg = pSharedKey->CipherAlg;
-
- /* Update pairwise key information to ASIC Shared Key Table */
- AsicAddSharedKeyEntry(pAd,
- BSS0,
- 0,
- pSharedKey->CipherAlg,
- pSharedKey->Key,
- pSharedKey->TxMic, pSharedKey->RxMic);
-
- /* Update ASIC WCID attribute table and IVEIV table */
- RTMPAddWcidAttributeEntry(pAd,
- BSS0,
- 0, pSharedKey->CipherAlg, pEntry);
-
- }
-
- /* open 802.1x port control and privacy filter */
- if (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK ||
- pEntry->AuthMode == Ndis802_11AuthModeWPA2) {
- pEntry->PortSecured = WPA_802_1X_PORT_SECURED;
- pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;
-
- STA_PORT_SECURED(pAd);
- /* Indicate Connected for GUI */
- pAd->IndicateMediaState = NdisMediaStateConnected;
- DBGPRINT(RT_DEBUG_TRACE,
- ("PeerPairMsg3Action: AuthMode(%s) PairwiseCipher(%s) GroupCipher(%s) \n",
- GetAuthMode(pEntry->AuthMode),
- GetEncryptType(pEntry->WepStatus),
- GetEncryptType(group_cipher)));
- } else {
- }
-
- /* Init 802.3 header and send out */
- MAKE_802_3_HEADER(Header802_3, pEntry->Addr, pCurrentAddr, EAPOL);
- RTMPToWirelessSta(pAd, pEntry,
- Header802_3, sizeof(Header802_3),
- (u8 *)& EAPOLPKT,
- CONV_ARRARY_TO_u16(EAPOLPKT.Body_Len) + 4, TRUE);
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("<=== PeerPairMsg3Action: send Msg4 of 4-way \n"));
-}
-
-/*
- ==========================================================================
- Description:
- When receiving the last packet of 4-way pairwisekey handshake.
- Initialize 2-way groupkey handshake following.
- Return:
- ==========================================================================
-*/
-void PeerPairMsg4Action(struct rt_rtmp_adapter *pAd,
- struct rt_mac_table_entry *pEntry, struct rt_mlme_queue_elem *Elem)
-{
- struct rt_eapol_packet * pMsg4;
- struct rt_header_802_11 * pHeader;
- u32 MsgLen;
- BOOLEAN Cancelled;
- u8 group_cipher = Ndis802_11WEPDisabled;
-
- DBGPRINT(RT_DEBUG_TRACE, ("===> PeerPairMsg4Action\n"));
-
- do {
- if ((!pEntry) || (!pEntry->ValidAsCLI))
- break;
-
- if (Elem->MsgLen <
- (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_EAPOL_H +
- sizeof(struct rt_key_descripter) - MAX_LEN_OF_RSNIE - 2))
- break;
-
- if (pEntry->WpaState < AS_PTKINIT_NEGOTIATING)
- break;
-
- /* pointer to 802.11 header */
- pHeader = (struct rt_header_802_11 *) Elem->Msg;
-
- /* skip 802.11_header(24-byte) and LLC_header(8) */
- pMsg4 =
- (struct rt_eapol_packet *) & Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H];
- MsgLen = Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H;
-
- /* Sanity Check peer Pairwise message 4 - Replay Counter, MIC */
- if (PeerWpaMessageSanity
- (pAd, pMsg4, MsgLen, EAPOL_PAIR_MSG_4, pEntry) == FALSE)
- break;
-
- /* 3. uses the MLME.SETKEYS.request to configure PTK into MAC */
- NdisZeroMemory(&pEntry->PairwiseKey, sizeof(struct rt_cipher_key));
-
- /* reset IVEIV in Asic */
- AsicUpdateWCIDIVEIV(pAd, pEntry->Aid, 1, 0);
-
- pEntry->PairwiseKey.KeyLen = LEN_TKIP_EK;
- NdisMoveMemory(pEntry->PairwiseKey.Key, &pEntry->PTK[32],
- LEN_TKIP_EK);
- NdisMoveMemory(pEntry->PairwiseKey.RxMic,
- &pEntry->PTK[TKIP_AP_RXMICK_OFFSET],
- LEN_TKIP_RXMICK);
- NdisMoveMemory(pEntry->PairwiseKey.TxMic,
- &pEntry->PTK[TKIP_AP_TXMICK_OFFSET],
- LEN_TKIP_TXMICK);
-
- /* Set pairwise key to Asic */
- {
- pEntry->PairwiseKey.CipherAlg = CIPHER_NONE;
- if (pEntry->WepStatus == Ndis802_11Encryption2Enabled)
- pEntry->PairwiseKey.CipherAlg = CIPHER_TKIP;
- else if (pEntry->WepStatus ==
- Ndis802_11Encryption3Enabled)
- pEntry->PairwiseKey.CipherAlg = CIPHER_AES;
-
- /* Add Pair-wise key to Asic */
- AsicAddPairwiseKeyEntry(pAd,
- pEntry->Addr,
- (u8)pEntry->Aid,
- &pEntry->PairwiseKey);
-
- /* update WCID attribute table and IVEIV table for this entry */
- RTMPAddWcidAttributeEntry(pAd,
- pEntry->apidx,
- 0,
- pEntry->PairwiseKey.CipherAlg,
- pEntry);
- }
-
- /* 4. upgrade state */
- pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;
- pEntry->WpaState = AS_PTKINITDONE;
- pEntry->PortSecured = WPA_802_1X_PORT_SECURED;
-
- if (pEntry->AuthMode == Ndis802_11AuthModeWPA2 ||
- pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK) {
- pEntry->GTKState = REKEY_ESTABLISHED;
- RTMPCancelTimer(&pEntry->RetryTimer, &Cancelled);
-
- /* send wireless event - for set key done WPA2 */
- if (pAd->CommonCfg.bWirelessEvent)
- RTMPSendWirelessEvent(pAd,
- IW_SET_KEY_DONE_WPA2_EVENT_FLAG,
- pEntry->Addr,
- pEntry->apidx, 0);
-
- DBGPRINT(RT_DEBUG_OFF,
- ("AP SETKEYS DONE - WPA2, AuthMode(%d)=%s, WepStatus(%d)=%s, GroupWepStatus(%d)=%s\n\n",
- pEntry->AuthMode,
- GetAuthMode(pEntry->AuthMode),
- pEntry->WepStatus,
- GetEncryptType(pEntry->WepStatus),
- group_cipher, GetEncryptType(group_cipher)));
- } else {
- /* 5. init Group 2-way handshake if necessary. */
- WPAStart2WayGroupHS(pAd, pEntry);
-
- pEntry->ReTryCounter = GROUP_MSG1_RETRY_TIMER_CTR;
- RTMPModTimer(&pEntry->RetryTimer,
- PEER_MSG3_RETRY_EXEC_INTV);
- }
- } while (FALSE);
-
-}
-
-/*
- ==========================================================================
- Description:
- This is a function to send the first packet of 2-way groupkey handshake
- Return:
-
- ==========================================================================
-*/
-void WPAStart2WayGroupHS(struct rt_rtmp_adapter *pAd, struct rt_mac_table_entry *pEntry)
-{
- u8 Header802_3[14];
- u8 TxTsc[6];
- struct rt_eapol_packet EAPOLPKT;
- u8 group_cipher = Ndis802_11WEPDisabled;
- u8 default_key = 0;
- u8 *gnonce_ptr = NULL;
- u8 *gtk_ptr = NULL;
- u8 *pBssid = NULL;
-
- DBGPRINT(RT_DEBUG_TRACE, ("===> WPAStart2WayGroupHS\n"));
-
- if ((!pEntry) || (!pEntry->ValidAsCLI))
- return;
-
- do {
- /* Increment replay counter by 1 */
- ADD_ONE_To_64BIT_VAR(pEntry->R_Counter);
-
- /* Construct EAPoL message - Group Msg 1 */
- NdisZeroMemory(&EAPOLPKT, sizeof(struct rt_eapol_packet));
- ConstructEapolMsg(pEntry,
- group_cipher,
- EAPOL_GROUP_MSG_1,
- default_key,
- (u8 *) gnonce_ptr,
- TxTsc, (u8 *) gtk_ptr, NULL, 0, &EAPOLPKT);
-
- /* Make outgoing frame */
- MAKE_802_3_HEADER(Header802_3, pEntry->Addr, pBssid, EAPOL);
- RTMPToWirelessSta(pAd, pEntry,
- Header802_3, LENGTH_802_3,
- (u8 *)& EAPOLPKT,
- CONV_ARRARY_TO_u16(EAPOLPKT.Body_Len) + 4,
- FALSE);
-
- } while (FALSE);
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("<=== WPAStart2WayGroupHS : send out Group Message 1 \n"));
-
- return;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Process Group key 2-way handshaking
-
- Arguments:
- pAd Pointer to our adapter
- Elem Message body
-
- Return Value:
- None
-
- Note:
-
- ========================================================================
-*/
-void PeerGroupMsg1Action(struct rt_rtmp_adapter *pAd,
- struct rt_mac_table_entry *pEntry, struct rt_mlme_queue_elem *Elem)
-{
- u8 Header802_3[14];
- struct rt_eapol_packet EAPOLPKT;
- struct rt_eapol_packet * pGroup;
- u32 MsgLen;
- BOOLEAN Cancelled;
- u8 default_key = 0;
- u8 group_cipher = Ndis802_11WEPDisabled;
- u8 *pCurrentAddr = NULL;
-
- DBGPRINT(RT_DEBUG_TRACE, ("===> PeerGroupMsg1Action \n"));
-
- if ((!pEntry) || ((!pEntry->ValidAsCLI) && (!pEntry->ValidAsApCli)))
- return;
-
- {
- pCurrentAddr = pAd->CurrentAddress;
- group_cipher = pAd->StaCfg.GroupCipher;
- default_key = pAd->StaCfg.DefaultKeyId;
- }
-
- /* Process Group Message 1 frame. skip 802.11 header(24) & LLC_SNAP header(8) */
- pGroup = (struct rt_eapol_packet *) & Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H];
- MsgLen = Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H;
-
- /* Sanity Check peer group message 1 - Replay Counter, MIC, RSNIE */
- if (PeerWpaMessageSanity(pAd, pGroup, MsgLen, EAPOL_GROUP_MSG_1, pEntry)
- == FALSE)
- return;
-
- /* delete retry timer */
- RTMPCancelTimer(&pEntry->RetryTimer, &Cancelled);
-
- /* Save Replay counter, it will use to construct message 2 */
- NdisMoveMemory(pEntry->R_Counter, pGroup->KeyDesc.ReplayCounter,
- LEN_KEY_DESC_REPLAY);
-
- /* Construct EAPoL message - Group Msg 2 */
- NdisZeroMemory(&EAPOLPKT, sizeof(struct rt_eapol_packet));
- ConstructEapolMsg(pEntry, group_cipher, EAPOL_GROUP_MSG_2, default_key, NULL, /* Nonce not used */
- NULL, /* TxRSC not used */
- NULL, /* GTK not used */
- NULL, /* RSN IE not used */
- 0, &EAPOLPKT);
-
- /* open 802.1x port control and privacy filter */
- pEntry->PortSecured = WPA_802_1X_PORT_SECURED;
- pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;
-
- STA_PORT_SECURED(pAd);
- /* Indicate Connected for GUI */
- pAd->IndicateMediaState = NdisMediaStateConnected;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("PeerGroupMsg1Action: AuthMode(%s) PairwiseCipher(%s) GroupCipher(%s) \n",
- GetAuthMode(pEntry->AuthMode),
- GetEncryptType(pEntry->WepStatus),
- GetEncryptType(group_cipher)));
-
- /* init header and Fill Packet and send Msg 2 to authenticator */
- MAKE_802_3_HEADER(Header802_3, pEntry->Addr, pCurrentAddr, EAPOL);
- RTMPToWirelessSta(pAd, pEntry,
- Header802_3, sizeof(Header802_3),
- (u8 *)& EAPOLPKT,
- CONV_ARRARY_TO_u16(EAPOLPKT.Body_Len) + 4, FALSE);
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("<=== PeerGroupMsg1Action: sned group message 2\n"));
-}
-
-/*
- ==========================================================================
- Description:
- When receiving the last packet of 2-way groupkey handshake.
- Return:
- ==========================================================================
-*/
-void PeerGroupMsg2Action(struct rt_rtmp_adapter *pAd,
- struct rt_mac_table_entry *pEntry,
- void * Msg, u32 MsgLen)
-{
- u32 Len;
- u8 *pData;
- BOOLEAN Cancelled;
- struct rt_eapol_packet * pMsg2;
- u8 group_cipher = Ndis802_11WEPDisabled;
-
- DBGPRINT(RT_DEBUG_TRACE, ("===> PeerGroupMsg2Action \n"));
-
- do {
- if ((!pEntry) || (!pEntry->ValidAsCLI))
- break;
-
- if (MsgLen <
- (LENGTH_802_1_H + LENGTH_EAPOL_H + sizeof(struct rt_key_descripter) -
- MAX_LEN_OF_RSNIE - 2))
- break;
-
- if (pEntry->WpaState != AS_PTKINITDONE)
- break;
-
- pData = (u8 *)Msg;
- pMsg2 = (struct rt_eapol_packet *) (pData + LENGTH_802_1_H);
- Len = MsgLen - LENGTH_802_1_H;
-
- /* Sanity Check peer group message 2 - Replay Counter, MIC */
- if (PeerWpaMessageSanity
- (pAd, pMsg2, Len, EAPOL_GROUP_MSG_2, pEntry) == FALSE)
- break;
-
- /* 3. upgrade state */
-
- RTMPCancelTimer(&pEntry->RetryTimer, &Cancelled);
- pEntry->GTKState = REKEY_ESTABLISHED;
-
- if ((pEntry->AuthMode == Ndis802_11AuthModeWPA2)
- || (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK)) {
- /* send wireless event - for set key done WPA2 */
- if (pAd->CommonCfg.bWirelessEvent)
- RTMPSendWirelessEvent(pAd,
- IW_SET_KEY_DONE_WPA2_EVENT_FLAG,
- pEntry->Addr,
- pEntry->apidx, 0);
-
- DBGPRINT(RT_DEBUG_OFF,
- ("AP SETKEYS DONE - WPA2, AuthMode(%d)=%s, WepStatus(%d)=%s, GroupWepStatus(%d)=%s\n\n",
- pEntry->AuthMode,
- GetAuthMode(pEntry->AuthMode),
- pEntry->WepStatus,
- GetEncryptType(pEntry->WepStatus),
- group_cipher, GetEncryptType(group_cipher)));
- } else {
- /* send wireless event - for set key done WPA */
- if (pAd->CommonCfg.bWirelessEvent)
- RTMPSendWirelessEvent(pAd,
- IW_SET_KEY_DONE_WPA1_EVENT_FLAG,
- pEntry->Addr,
- pEntry->apidx, 0);
-
- DBGPRINT(RT_DEBUG_OFF,
- ("AP SETKEYS DONE - WPA1, AuthMode(%d)=%s, WepStatus(%d)=%s, GroupWepStatus(%d)=%s\n\n",
- pEntry->AuthMode,
- GetAuthMode(pEntry->AuthMode),
- pEntry->WepStatus,
- GetEncryptType(pEntry->WepStatus),
- group_cipher, GetEncryptType(group_cipher)));
- }
- } while (FALSE);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Classify WPA EAP message type
-
- Arguments:
- EAPType Value of EAP message type
- MsgType Internal Message definition for MLME state machine
-
- Return Value:
- TRUE Found appropriate message type
- FALSE No appropriate message type
-
- IRQL = DISPATCH_LEVEL
-
- Note:
- All these constants are defined in wpa.h
- For supplicant, there is only EAPOL Key message available
-
- ========================================================================
-*/
-BOOLEAN WpaMsgTypeSubst(u8 EAPType, int * MsgType)
-{
- switch (EAPType) {
- case EAPPacket:
- *MsgType = MT2_EAPPacket;
- break;
- case EAPOLStart:
- *MsgType = MT2_EAPOLStart;
- break;
- case EAPOLLogoff:
- *MsgType = MT2_EAPOLLogoff;
- break;
- case EAPOLKey:
- *MsgType = MT2_EAPOLKey;
- break;
- case EAPOLASFAlert:
- *MsgType = MT2_EAPOLASFAlert;
- break;
- default:
- return FALSE;
- }
- return TRUE;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- The pseudo-random function(PRF) that hashes various inputs to
- derive a pseudo-random value. To add liveness to the pseudo-random
- value, a nonce should be one of the inputs.
-
- It is used to generate PTK, GTK or some specific random value.
-
- Arguments:
- u8 *key, - the key material for HMAC_SHA1 use
- int key_len - the length of key
- u8 *prefix - a prefix label
- int prefix_len - the length of the label
- u8 *data - a specific data with variable length
- int data_len - the length of a specific data
- int len - the output length
-
- Return Value:
- u8 *output - the calculated result
-
- Note:
- 802.11i-2004 Annex H.3
-
- ========================================================================
-*/
-void PRF(u8 * key,
- int key_len,
- u8 * prefix,
- int prefix_len,
- u8 * data, int data_len, u8 * output, int len)
-{
- int i;
- u8 *input;
- int currentindex = 0;
- int total_len;
-
- /* Allocate memory for input */
- os_alloc_mem(NULL, (u8 **) & input, 1024);
-
- if (input == NULL) {
- DBGPRINT(RT_DEBUG_ERROR, ("PRF: no memory!\n"));
- return;
- }
- /* Generate concatenation input */
- NdisMoveMemory(input, prefix, prefix_len);
-
- /* Concatenate a single octet containing 0 */
- input[prefix_len] = 0;
-
- /* Concatenate specific data */
- NdisMoveMemory(&input[prefix_len + 1], data, data_len);
- total_len = prefix_len + 1 + data_len;
-
- /* Concatenate a single octet containing 0 */
- /* This octet shall be update later */
- input[total_len] = 0;
- total_len++;
-
- /* Iterate to calculate the result by hmac-sha-1 */
- /* Then concatenate to last result */
- for (i = 0; i < (len + 19) / 20; i++) {
- HMAC_SHA1(key, key_len, input, total_len, &output[currentindex],
- SHA1_DIGEST_SIZE);
- currentindex += 20;
-
- /* update the last octet */
- input[total_len - 1]++;
- }
- os_free_mem(NULL, input);
-}
-
-/*
-* F(P, S, c, i) = U1 xor U2 xor ... Uc
-* U1 = PRF(P, S || Int(i))
-* U2 = PRF(P, U1)
-* Uc = PRF(P, Uc-1)
-*/
-
-static void F(char *password, unsigned char *ssid, int ssidlength,
- int iterations, int count, unsigned char *output)
-{
- unsigned char digest[36], digest1[SHA1_DIGEST_SIZE];
- int i, j;
-
- /* U1 = PRF(P, S || int(i)) */
- memcpy(digest, ssid, ssidlength);
- digest[ssidlength] = (unsigned char)((count >> 24) & 0xff);
- digest[ssidlength + 1] = (unsigned char)((count >> 16) & 0xff);
- digest[ssidlength + 2] = (unsigned char)((count >> 8) & 0xff);
- digest[ssidlength + 3] = (unsigned char)(count & 0xff);
- HMAC_SHA1((unsigned char *)password, (int)strlen(password), digest, ssidlength + 4, digest1, SHA1_DIGEST_SIZE); /* for WPA update */
-
- /* output = U1 */
- memcpy(output, digest1, SHA1_DIGEST_SIZE);
-
- for (i = 1; i < iterations; i++) {
- /* Un = PRF(P, Un-1) */
- HMAC_SHA1((unsigned char *)password, (int)strlen(password), digest1, SHA1_DIGEST_SIZE, digest, SHA1_DIGEST_SIZE); /* for WPA update */
- memcpy(digest1, digest, SHA1_DIGEST_SIZE);
-
- /* output = output xor Un */
- for (j = 0; j < SHA1_DIGEST_SIZE; j++) {
- output[j] ^= digest[j];
- }
- }
-}
-
-/*
-* password - ascii string up to 63 characters in length
-* ssid - octet string up to 32 octets
-* ssidlength - length of ssid in octets
-* output must be 40 octets in length and outputs 256 bits of key
-*/
-int PasswordHash(char *password, u8 *ssid, int ssidlength, u8 *output)
-{
- if ((strlen(password) > 63) || (ssidlength > 32))
- return 0;
-
- F(password, ssid, ssidlength, 4096, 1, output);
- F(password, ssid, ssidlength, 4096, 2, &output[SHA1_DIGEST_SIZE]);
- return 1;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- It utilizes PRF-384 or PRF-512 to derive session-specific keys from a PMK.
- It shall be called by 4-way handshake processing.
-
- Arguments:
- pAd - pointer to our pAdapter context
- PMK - pointer to PMK
- ANonce - pointer to ANonce
- AA - pointer to Authenticator Address
- SNonce - pointer to SNonce
- SA - pointer to Supplicant Address
- len - indicate the length of PTK (octet)
-
- Return Value:
- Output pointer to the PTK
-
- Note:
- Refer to IEEE 802.11i-2004 8.5.1.2
-
- ========================================================================
-*/
-void WpaDerivePTK(struct rt_rtmp_adapter *pAd,
- u8 * PMK,
- u8 * ANonce,
- u8 * AA,
- u8 * SNonce,
- u8 * SA, u8 * output, u32 len)
-{
- u8 concatenation[76];
- u32 CurrPos = 0;
- u8 temp[32];
- u8 Prefix[] =
- { 'P', 'a', 'i', 'r', 'w', 'i', 's', 'e', ' ', 'k', 'e', 'y', ' ',
- 'e', 'x', 'p', 'a', 'n', 's', 'i', 'o', 'n'
- };
-
- /* initiate the concatenation input */
- NdisZeroMemory(temp, sizeof(temp));
- NdisZeroMemory(concatenation, 76);
-
- /* Get smaller address */
- if (RTMPCompareMemory(SA, AA, 6) == 1)
- NdisMoveMemory(concatenation, AA, 6);
- else
- NdisMoveMemory(concatenation, SA, 6);
- CurrPos += 6;
-
- /* Get larger address */
- if (RTMPCompareMemory(SA, AA, 6) == 1)
- NdisMoveMemory(&concatenation[CurrPos], SA, 6);
- else
- NdisMoveMemory(&concatenation[CurrPos], AA, 6);
-
- /* store the larger mac address for backward compatible of */
- /* ralink proprietary STA-key issue */
- NdisMoveMemory(temp, &concatenation[CurrPos], MAC_ADDR_LEN);
- CurrPos += 6;
-
- /* Get smaller Nonce */
- if (RTMPCompareMemory(ANonce, SNonce, 32) == 0)
- NdisMoveMemory(&concatenation[CurrPos], temp, 32); /* patch for ralink proprietary STA-key issue */
- else if (RTMPCompareMemory(ANonce, SNonce, 32) == 1)
- NdisMoveMemory(&concatenation[CurrPos], SNonce, 32);
- else
- NdisMoveMemory(&concatenation[CurrPos], ANonce, 32);
- CurrPos += 32;
-
- /* Get larger Nonce */
- if (RTMPCompareMemory(ANonce, SNonce, 32) == 0)
- NdisMoveMemory(&concatenation[CurrPos], temp, 32); /* patch for ralink proprietary STA-key issue */
- else if (RTMPCompareMemory(ANonce, SNonce, 32) == 1)
- NdisMoveMemory(&concatenation[CurrPos], ANonce, 32);
- else
- NdisMoveMemory(&concatenation[CurrPos], SNonce, 32);
- CurrPos += 32;
-
- hex_dump("concatenation=", concatenation, 76);
-
- /* Use PRF to generate PTK */
- PRF(PMK, LEN_MASTER_KEY, Prefix, 22, concatenation, 76, output, len);
-
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Generate random number by software.
-
- Arguments:
- pAd - pointer to our pAdapter context
- macAddr - pointer to local MAC address
-
- Return Value:
-
- Note:
- 802.1ii-2004 Annex H.5
-
- ========================================================================
-*/
-void GenRandom(struct rt_rtmp_adapter *pAd, u8 * macAddr, u8 * random)
-{
- int i, curr;
- u8 local[80], KeyCounter[32];
- u8 result[80];
- unsigned long CurrentTime;
- u8 prefix[] =
- { 'I', 'n', 'i', 't', ' ', 'C', 'o', 'u', 'n', 't', 'e', 'r' };
-
- /* Zero the related information */
- NdisZeroMemory(result, 80);
- NdisZeroMemory(local, 80);
- NdisZeroMemory(KeyCounter, 32);
-
- for (i = 0; i < 32; i++) {
- /* copy the local MAC address */
- COPY_MAC_ADDR(local, macAddr);
- curr = MAC_ADDR_LEN;
-
- /* concatenate the current time */
- NdisGetSystemUpTime(&CurrentTime);
- NdisMoveMemory(&local[curr], &CurrentTime, sizeof(CurrentTime));
- curr += sizeof(CurrentTime);
-
- /* concatenate the last result */
- NdisMoveMemory(&local[curr], result, 32);
- curr += 32;
-
- /* concatenate a variable */
- NdisMoveMemory(&local[curr], &i, 2);
- curr += 2;
-
- /* calculate the result */
- PRF(KeyCounter, 32, prefix, 12, local, curr, result, 32);
- }
-
- NdisMoveMemory(random, result, 32);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Build cipher suite in RSN-IE.
- It only shall be called by RTMPMakeRSNIE.
-
- Arguments:
- pAd - pointer to our pAdapter context
- ElementID - indicate the WPA1 or WPA2
- WepStatus - indicate the encryption type
- bMixCipher - a boolean to indicate the pairwise cipher and group
- cipher are the same or not
-
- Return Value:
-
- Note:
-
- ========================================================================
-*/
-static void RTMPMakeRsnIeCipher(struct rt_rtmp_adapter *pAd,
- u8 ElementID,
- u32 WepStatus,
- IN BOOLEAN bMixCipher,
- u8 FlexibleCipher,
- u8 *pRsnIe, u8 * rsn_len)
-{
- u8 PairwiseCnt;
-
- *rsn_len = 0;
-
- /* decide WPA2 or WPA1 */
- if (ElementID == Wpa2Ie) {
- struct rt_rsnie2 *pRsnie_cipher = (struct rt_rsnie2 *)pRsnIe;
-
- /* Assign the verson as 1 */
- pRsnie_cipher->version = 1;
-
- switch (WepStatus) {
- /* TKIP mode */
- case Ndis802_11Encryption2Enabled:
- NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_TKIP, 4);
- pRsnie_cipher->ucount = 1;
- NdisMoveMemory(pRsnie_cipher->ucast[0].oui,
- OUI_WPA2_TKIP, 4);
- *rsn_len = sizeof(struct rt_rsnie2);
- break;
-
- /* AES mode */
- case Ndis802_11Encryption3Enabled:
- if (bMixCipher)
- NdisMoveMemory(pRsnie_cipher->mcast,
- OUI_WPA2_TKIP, 4);
- else
- NdisMoveMemory(pRsnie_cipher->mcast,
- OUI_WPA2_CCMP, 4);
- pRsnie_cipher->ucount = 1;
- NdisMoveMemory(pRsnie_cipher->ucast[0].oui,
- OUI_WPA2_CCMP, 4);
- *rsn_len = sizeof(struct rt_rsnie2);
- break;
-
- /* TKIP-AES mix mode */
- case Ndis802_11Encryption4Enabled:
- NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_TKIP, 4);
-
- PairwiseCnt = 1;
- /* Insert WPA2 TKIP as the first pairwise cipher */
- if (MIX_CIPHER_WPA2_TKIP_ON(FlexibleCipher)) {
- NdisMoveMemory(pRsnie_cipher->ucast[0].oui,
- OUI_WPA2_TKIP, 4);
- /* Insert WPA2 AES as the secondary pairwise cipher */
- if (MIX_CIPHER_WPA2_AES_ON(FlexibleCipher)) {
- NdisMoveMemory(pRsnie_cipher->ucast[0].
- oui + 4, OUI_WPA2_CCMP,
- 4);
- PairwiseCnt = 2;
- }
- } else {
- /* Insert WPA2 AES as the first pairwise cipher */
- NdisMoveMemory(pRsnie_cipher->ucast[0].oui,
- OUI_WPA2_CCMP, 4);
- }
-
- pRsnie_cipher->ucount = PairwiseCnt;
- *rsn_len = sizeof(struct rt_rsnie2) + (4 * (PairwiseCnt - 1));
- break;
- }
-
- if ((pAd->OpMode == OPMODE_STA) &&
- (pAd->StaCfg.GroupCipher != Ndis802_11Encryption2Enabled) &&
- (pAd->StaCfg.GroupCipher != Ndis802_11Encryption3Enabled)) {
- u32 GroupCipher = pAd->StaCfg.GroupCipher;
- switch (GroupCipher) {
- case Ndis802_11GroupWEP40Enabled:
- NdisMoveMemory(pRsnie_cipher->mcast,
- OUI_WPA2_WEP40, 4);
- break;
- case Ndis802_11GroupWEP104Enabled:
- NdisMoveMemory(pRsnie_cipher->mcast,
- OUI_WPA2_WEP104, 4);
- break;
- }
- }
- /* swap for big-endian platform */
- pRsnie_cipher->version = cpu2le16(pRsnie_cipher->version);
- pRsnie_cipher->ucount = cpu2le16(pRsnie_cipher->ucount);
- } else {
- struct rt_rsnie *pRsnie_cipher = (struct rt_rsnie *)pRsnIe;
-
- /* Assign OUI and version */
- NdisMoveMemory(pRsnie_cipher->oui, OUI_WPA_VERSION, 4);
- pRsnie_cipher->version = 1;
-
- switch (WepStatus) {
- /* TKIP mode */
- case Ndis802_11Encryption2Enabled:
- NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_TKIP, 4);
- pRsnie_cipher->ucount = 1;
- NdisMoveMemory(pRsnie_cipher->ucast[0].oui,
- OUI_WPA_TKIP, 4);
- *rsn_len = sizeof(struct rt_rsnie);
- break;
-
- /* AES mode */
- case Ndis802_11Encryption3Enabled:
- if (bMixCipher)
- NdisMoveMemory(pRsnie_cipher->mcast,
- OUI_WPA_TKIP, 4);
- else
- NdisMoveMemory(pRsnie_cipher->mcast,
- OUI_WPA_CCMP, 4);
- pRsnie_cipher->ucount = 1;
- NdisMoveMemory(pRsnie_cipher->ucast[0].oui,
- OUI_WPA_CCMP, 4);
- *rsn_len = sizeof(struct rt_rsnie);
- break;
-
- /* TKIP-AES mix mode */
- case Ndis802_11Encryption4Enabled:
- NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_TKIP, 4);
-
- PairwiseCnt = 1;
- /* Insert WPA TKIP as the first pairwise cipher */
- if (MIX_CIPHER_WPA_TKIP_ON(FlexibleCipher)) {
- NdisMoveMemory(pRsnie_cipher->ucast[0].oui,
- OUI_WPA_TKIP, 4);
- /* Insert WPA AES as the secondary pairwise cipher */
- if (MIX_CIPHER_WPA_AES_ON(FlexibleCipher)) {
- NdisMoveMemory(pRsnie_cipher->ucast[0].
- oui + 4, OUI_WPA_CCMP,
- 4);
- PairwiseCnt = 2;
- }
- } else {
- /* Insert WPA AES as the first pairwise cipher */
- NdisMoveMemory(pRsnie_cipher->ucast[0].oui,
- OUI_WPA_CCMP, 4);
- }
-
- pRsnie_cipher->ucount = PairwiseCnt;
- *rsn_len = sizeof(struct rt_rsnie) + (4 * (PairwiseCnt - 1));
- break;
- }
-
- if ((pAd->OpMode == OPMODE_STA) &&
- (pAd->StaCfg.GroupCipher != Ndis802_11Encryption2Enabled) &&
- (pAd->StaCfg.GroupCipher != Ndis802_11Encryption3Enabled)) {
- u32 GroupCipher = pAd->StaCfg.GroupCipher;
- switch (GroupCipher) {
- case Ndis802_11GroupWEP40Enabled:
- NdisMoveMemory(pRsnie_cipher->mcast,
- OUI_WPA_WEP40, 4);
- break;
- case Ndis802_11GroupWEP104Enabled:
- NdisMoveMemory(pRsnie_cipher->mcast,
- OUI_WPA_WEP104, 4);
- break;
- }
- }
- /* swap for big-endian platform */
- pRsnie_cipher->version = cpu2le16(pRsnie_cipher->version);
- pRsnie_cipher->ucount = cpu2le16(pRsnie_cipher->ucount);
- }
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Build AKM suite in RSN-IE.
- It only shall be called by RTMPMakeRSNIE.
-
- Arguments:
- pAd - pointer to our pAdapter context
- ElementID - indicate the WPA1 or WPA2
- AuthMode - indicate the authentication mode
- apidx - indicate the interface index
-
- Return Value:
-
- Note:
-
- ========================================================================
-*/
-static void RTMPMakeRsnIeAKM(struct rt_rtmp_adapter *pAd,
- u8 ElementID,
- u32 AuthMode,
- u8 apidx,
- u8 *pRsnIe, u8 * rsn_len)
-{
- struct rt_rsnie_auth *pRsnie_auth;
- u8 AkmCnt = 1; /* default as 1 */
-
- pRsnie_auth = (struct rt_rsnie_auth *) (pRsnIe + (*rsn_len));
-
- /* decide WPA2 or WPA1 */
- if (ElementID == Wpa2Ie) {
-
- switch (AuthMode) {
- case Ndis802_11AuthModeWPA2:
- case Ndis802_11AuthModeWPA1WPA2:
- NdisMoveMemory(pRsnie_auth->auth[0].oui,
- OUI_WPA2_8021X_AKM, 4);
- break;
-
- case Ndis802_11AuthModeWPA2PSK:
- case Ndis802_11AuthModeWPA1PSKWPA2PSK:
- NdisMoveMemory(pRsnie_auth->auth[0].oui,
- OUI_WPA2_PSK_AKM, 4);
- break;
- default:
- AkmCnt = 0;
- break;
-
- }
- } else {
- switch (AuthMode) {
- case Ndis802_11AuthModeWPA:
- case Ndis802_11AuthModeWPA1WPA2:
- NdisMoveMemory(pRsnie_auth->auth[0].oui,
- OUI_WPA_8021X_AKM, 4);
- break;
-
- case Ndis802_11AuthModeWPAPSK:
- case Ndis802_11AuthModeWPA1PSKWPA2PSK:
- NdisMoveMemory(pRsnie_auth->auth[0].oui,
- OUI_WPA_PSK_AKM, 4);
- break;
-
- case Ndis802_11AuthModeWPANone:
- NdisMoveMemory(pRsnie_auth->auth[0].oui,
- OUI_WPA_NONE_AKM, 4);
- break;
- default:
- AkmCnt = 0;
- break;
- }
- }
-
- pRsnie_auth->acount = AkmCnt;
- pRsnie_auth->acount = cpu2le16(pRsnie_auth->acount);
-
- /* update current RSNIE length */
- (*rsn_len) += (sizeof(struct rt_rsnie_auth) + (4 * (AkmCnt - 1)));
-
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Build capability in RSN-IE.
- It only shall be called by RTMPMakeRSNIE.
-
- Arguments:
- pAd - pointer to our pAdapter context
- ElementID - indicate the WPA1 or WPA2
- apidx - indicate the interface index
-
- Return Value:
-
- Note:
-
- ========================================================================
-*/
-static void RTMPMakeRsnIeCap(struct rt_rtmp_adapter *pAd,
- u8 ElementID,
- u8 apidx,
- u8 *pRsnIe, u8 * rsn_len)
-{
- RSN_CAPABILITIES *pRSN_Cap;
-
- /* it could be ignored in WPA1 mode */
- if (ElementID == WpaIe)
- return;
-
- pRSN_Cap = (RSN_CAPABILITIES *) (pRsnIe + (*rsn_len));
-
- pRSN_Cap->word = cpu2le16(pRSN_Cap->word);
-
- (*rsn_len) += sizeof(RSN_CAPABILITIES); /* update current RSNIE length */
-
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Build RSN IE context. It is not included element-ID and length.
-
- Arguments:
- pAd - pointer to our pAdapter context
- AuthMode - indicate the authentication mode
- WepStatus - indicate the encryption type
- apidx - indicate the interface index
-
- Return Value:
-
- Note:
-
- ========================================================================
-*/
-void RTMPMakeRSNIE(struct rt_rtmp_adapter *pAd,
- u32 AuthMode, u32 WepStatus, u8 apidx)
-{
- u8 *pRsnIe = NULL; /* primary RSNIE */
- u8 *rsnielen_cur_p = 0; /* the length of the primary RSNIE */
- u8 *rsnielen_ex_cur_p = 0; /* the length of the secondary RSNIE */
- u8 PrimaryRsnie;
- BOOLEAN bMixCipher = FALSE; /* indicate the pairwise and group cipher are different */
- u8 p_offset;
- WPA_MIX_PAIR_CIPHER FlexibleCipher = WPA_TKIPAES_WPA2_TKIPAES; /* it provide the more flexible cipher combination in WPA-WPA2 and TKIPAES mode */
-
- rsnielen_cur_p = NULL;
- rsnielen_ex_cur_p = NULL;
-
- {
- {
- if (pAd->StaCfg.WpaSupplicantUP !=
- WPA_SUPPLICANT_DISABLE) {
- if (AuthMode < Ndis802_11AuthModeWPA)
- return;
- } else {
- /* Support WPAPSK or WPA2PSK in STA-Infra mode */
- /* Support WPANone in STA-Adhoc mode */
- if ((AuthMode != Ndis802_11AuthModeWPAPSK) &&
- (AuthMode != Ndis802_11AuthModeWPA2PSK) &&
- (AuthMode != Ndis802_11AuthModeWPANone)
- )
- return;
- }
-
- DBGPRINT(RT_DEBUG_TRACE, ("==> RTMPMakeRSNIE(STA)\n"));
-
- /* Zero RSNIE context */
- pAd->StaCfg.RSNIE_Len = 0;
- NdisZeroMemory(pAd->StaCfg.RSN_IE, MAX_LEN_OF_RSNIE);
-
- /* Pointer to RSNIE */
- rsnielen_cur_p = &pAd->StaCfg.RSNIE_Len;
- pRsnIe = pAd->StaCfg.RSN_IE;
-
- bMixCipher = pAd->StaCfg.bMixCipher;
- }
- }
-
- /* indicate primary RSNIE as WPA or WPA2 */
- if ((AuthMode == Ndis802_11AuthModeWPA) ||
- (AuthMode == Ndis802_11AuthModeWPAPSK) ||
- (AuthMode == Ndis802_11AuthModeWPANone) ||
- (AuthMode == Ndis802_11AuthModeWPA1WPA2) ||
- (AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK))
- PrimaryRsnie = WpaIe;
- else
- PrimaryRsnie = Wpa2Ie;
-
- {
- /* Build the primary RSNIE */
- /* 1. insert cipher suite */
- RTMPMakeRsnIeCipher(pAd, PrimaryRsnie, WepStatus, bMixCipher,
- FlexibleCipher, pRsnIe, &p_offset);
-
- /* 2. insert AKM */
- RTMPMakeRsnIeAKM(pAd, PrimaryRsnie, AuthMode, apidx, pRsnIe,
- &p_offset);
-
- /* 3. insert capability */
- RTMPMakeRsnIeCap(pAd, PrimaryRsnie, apidx, pRsnIe, &p_offset);
- }
-
- /* 4. update the RSNIE length */
- *rsnielen_cur_p = p_offset;
-
- hex_dump("The primary RSNIE", pRsnIe, (*rsnielen_cur_p));
-
-}
-
-/*
- ==========================================================================
- Description:
- Check whether the received frame is EAP frame.
-
- Arguments:
- pAd - pointer to our pAdapter context
- pEntry - pointer to active entry
- pData - the received frame
- DataByteCount - the received frame's length
- FromWhichBSSID - indicate the interface index
-
- Return:
- TRUE - This frame is EAP frame
- FALSE - otherwise
- ==========================================================================
-*/
-BOOLEAN RTMPCheckWPAframe(struct rt_rtmp_adapter *pAd,
- struct rt_mac_table_entry *pEntry,
- u8 *pData,
- unsigned long DataByteCount, u8 FromWhichBSSID)
-{
- unsigned long Body_len;
- BOOLEAN Cancelled;
-
- if (DataByteCount < (LENGTH_802_1_H + LENGTH_EAPOL_H))
- return FALSE;
-
- /* Skip LLC header */
- if (NdisEqualMemory(SNAP_802_1H, pData, 6) ||
- /* Cisco 1200 AP may send packet with SNAP_BRIDGE_TUNNEL */
- NdisEqualMemory(SNAP_BRIDGE_TUNNEL, pData, 6)) {
- pData += 6;
- }
- /* Skip 2-bytes EAPoL type */
- if (NdisEqualMemory(EAPOL, pData, 2)) {
- pData += 2;
- } else
- return FALSE;
-
- switch (*(pData + 1)) {
- case EAPPacket:
- Body_len = (*(pData + 2) << 8) | (*(pData + 3));
- DBGPRINT(RT_DEBUG_TRACE,
- ("Receive EAP-Packet frame, TYPE = 0, Length = %ld\n",
- Body_len));
- break;
- case EAPOLStart:
- DBGPRINT(RT_DEBUG_TRACE,
- ("Receive EAPOL-Start frame, TYPE = 1 \n"));
- if (pEntry->EnqueueEapolStartTimerRunning !=
- EAPOL_START_DISABLE) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("Cancel the EnqueueEapolStartTimerRunning \n"));
- RTMPCancelTimer(&pEntry->EnqueueStartForPSKTimer,
- &Cancelled);
- pEntry->EnqueueEapolStartTimerRunning =
- EAPOL_START_DISABLE;
- }
- break;
- case EAPOLLogoff:
- DBGPRINT(RT_DEBUG_TRACE,
- ("Receive EAPOLLogoff frame, TYPE = 2 \n"));
- break;
- case EAPOLKey:
- Body_len = (*(pData + 2) << 8) | (*(pData + 3));
- DBGPRINT(RT_DEBUG_TRACE,
- ("Receive EAPOL-Key frame, TYPE = 3, Length = %ld\n",
- Body_len));
- break;
- case EAPOLASFAlert:
- DBGPRINT(RT_DEBUG_TRACE,
- ("Receive EAPOLASFAlert frame, TYPE = 4 \n"));
- break;
- default:
- return FALSE;
-
- }
- return TRUE;
-}
-
-/*
- ==========================================================================
- Description:
- Report the EAP message type
-
- Arguments:
- msg - EAPOL_PAIR_MSG_1
- EAPOL_PAIR_MSG_2
- EAPOL_PAIR_MSG_3
- EAPOL_PAIR_MSG_4
- EAPOL_GROUP_MSG_1
- EAPOL_GROUP_MSG_2
-
- Return:
- message type string
-
- ==========================================================================
-*/
-char *GetEapolMsgType(char msg)
-{
- if (msg == EAPOL_PAIR_MSG_1)
- return "Pairwise Message 1";
- else if (msg == EAPOL_PAIR_MSG_2)
- return "Pairwise Message 2";
- else if (msg == EAPOL_PAIR_MSG_3)
- return "Pairwise Message 3";
- else if (msg == EAPOL_PAIR_MSG_4)
- return "Pairwise Message 4";
- else if (msg == EAPOL_GROUP_MSG_1)
- return "Group Message 1";
- else if (msg == EAPOL_GROUP_MSG_2)
- return "Group Message 2";
- else
- return "Invalid Message";
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Check Sanity RSN IE of EAPoL message
-
- Arguments:
-
- Return Value:
-
- ========================================================================
-*/
-BOOLEAN RTMPCheckRSNIE(struct rt_rtmp_adapter *pAd,
- u8 *pData,
- u8 DataLen,
- struct rt_mac_table_entry *pEntry, u8 * Offset)
-{
- u8 *pVIE;
- u8 len;
- struct rt_eid * pEid;
- BOOLEAN result = FALSE;
-
- pVIE = pData;
- len = DataLen;
- *Offset = 0;
-
- while (len > sizeof(struct rt_rsnie2)) {
- pEid = (struct rt_eid *) pVIE;
- /* WPA RSN IE */
- if ((pEid->Eid == IE_WPA)
- && (NdisEqualMemory(pEid->Octet, WPA_OUI, 4))) {
- if ((pEntry->AuthMode == Ndis802_11AuthModeWPA
- || pEntry->AuthMode == Ndis802_11AuthModeWPAPSK)
- &&
- (NdisEqualMemory
- (pVIE, pEntry->RSN_IE, pEntry->RSNIE_Len))
- && (pEntry->RSNIE_Len == (pEid->Len + 2))) {
- result = TRUE;
- }
-
- *Offset += (pEid->Len + 2);
- }
- /* WPA2 RSN IE */
- else if ((pEid->Eid == IE_RSN)
- && (NdisEqualMemory(pEid->Octet + 2, RSN_OUI, 3))) {
- if ((pEntry->AuthMode == Ndis802_11AuthModeWPA2
- || pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK)
- && (pEid->Eid == pEntry->RSN_IE[0])
- && ((pEid->Len + 2) >= pEntry->RSNIE_Len)
- &&
- (NdisEqualMemory
- (pEid->Octet, &pEntry->RSN_IE[2],
- pEntry->RSNIE_Len - 2))) {
-
- result = TRUE;
- }
-
- *Offset += (pEid->Len + 2);
- } else {
- break;
- }
-
- pVIE += (pEid->Len + 2);
- len -= (pEid->Len + 2);
- }
-
- return result;
-
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Parse KEYDATA field. KEYDATA[] May contain 2 RSN IE and optionally GTK.
- GTK is encaptulated in KDE format at p.83 802.11i D10
-
- Arguments:
-
- Return Value:
-
- Note:
- 802.11i D10
-
- ========================================================================
-*/
-BOOLEAN RTMPParseEapolKeyData(struct rt_rtmp_adapter *pAd,
- u8 *pKeyData,
- u8 KeyDataLen,
- u8 GroupKeyIndex,
- u8 MsgType,
- IN BOOLEAN bWPA2, struct rt_mac_table_entry *pEntry)
-{
- struct rt_kde_encap * pKDE = NULL;
- u8 *pMyKeyData = pKeyData;
- u8 KeyDataLength = KeyDataLen;
- u8 GTKLEN = 0;
- u8 DefaultIdx = 0;
- u8 skip_offset;
-
- /* Verify The RSN IE contained in pairewise_msg_2 && pairewise_msg_3 and skip it */
- if (MsgType == EAPOL_PAIR_MSG_2 || MsgType == EAPOL_PAIR_MSG_3) {
- /* Check RSN IE whether it is WPA2/WPA2PSK */
- if (!RTMPCheckRSNIE
- (pAd, pKeyData, KeyDataLen, pEntry, &skip_offset)) {
- /* send wireless event - for RSN IE different */
- if (pAd->CommonCfg.bWirelessEvent)
- RTMPSendWirelessEvent(pAd,
- IW_RSNIE_DIFF_EVENT_FLAG,
- pEntry->Addr,
- pEntry->apidx, 0);
-
- DBGPRINT(RT_DEBUG_ERROR,
- ("RSN_IE Different in msg %d of 4-way handshake!\n",
- MsgType));
- hex_dump("Receive RSN_IE ", pKeyData, KeyDataLen);
- hex_dump("Desired RSN_IE ", pEntry->RSN_IE,
- pEntry->RSNIE_Len);
-
- return FALSE;
- } else {
- if (bWPA2 && MsgType == EAPOL_PAIR_MSG_3) {
- WpaShowAllsuite(pMyKeyData, skip_offset);
-
- /* skip RSN IE */
- pMyKeyData += skip_offset;
- KeyDataLength -= skip_offset;
- DBGPRINT(RT_DEBUG_TRACE,
- ("RTMPParseEapolKeyData ==> WPA2/WPA2PSK RSN IE matched in Msg 3, Length(%d) \n",
- skip_offset));
- } else
- return TRUE;
- }
- }
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("RTMPParseEapolKeyData ==> KeyDataLength %d without RSN_IE \n",
- KeyDataLength));
- /*hex_dump("remain data", pMyKeyData, KeyDataLength); */
-
- /* Parse EKD format in pairwise_msg_3_WPA2 && group_msg_1_WPA2 */
- if (bWPA2
- && (MsgType == EAPOL_PAIR_MSG_3 || MsgType == EAPOL_GROUP_MSG_1)) {
- if (KeyDataLength >= 8) /* KDE format exclude GTK length */
- {
- pKDE = (struct rt_kde_encap *) pMyKeyData;
-
- DefaultIdx = pKDE->GTKEncap.Kid;
-
- /* Sanity check - KED length */
- if (KeyDataLength < (pKDE->Len + 2)) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("ERROR: The len from KDE is too short \n"));
- return FALSE;
- }
- /* Get GTK length - refer to IEEE 802.11i-2004 p.82 */
- GTKLEN = pKDE->Len - 6;
- if (GTKLEN < LEN_AES_KEY) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("ERROR: GTK Key length is too short (%d) \n",
- GTKLEN));
- return FALSE;
- }
-
- } else {
- DBGPRINT(RT_DEBUG_ERROR,
- ("ERROR: KDE format length is too short \n"));
- return FALSE;
- }
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("GTK in KDE format ,DefaultKeyID=%d, KeyLen=%d \n",
- DefaultIdx, GTKLEN));
- /* skip it */
- pMyKeyData += 8;
- KeyDataLength -= 8;
-
- } else if (!bWPA2 && MsgType == EAPOL_GROUP_MSG_1) {
- DefaultIdx = GroupKeyIndex;
- DBGPRINT(RT_DEBUG_TRACE,
- ("GTK DefaultKeyID=%d \n", DefaultIdx));
- }
- /* Sanity check - shared key index must be 1 ~ 3 */
- if (DefaultIdx < 1 || DefaultIdx > 3) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("ERROR: GTK Key index(%d) is invalid in %s %s \n",
- DefaultIdx, ((bWPA2) ? "WPA2" : "WPA"),
- GetEapolMsgType(MsgType)));
- return FALSE;
- }
-
- {
- struct rt_cipher_key *pSharedKey;
-
- /* set key material, TxMic and RxMic */
- NdisMoveMemory(pAd->StaCfg.GTK, pMyKeyData, 32);
- pAd->StaCfg.DefaultKeyId = DefaultIdx;
-
- pSharedKey = &pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId];
-
- /* Prepare pair-wise key information into shared key table */
- NdisZeroMemory(pSharedKey, sizeof(struct rt_cipher_key));
- pSharedKey->KeyLen = LEN_TKIP_EK;
- NdisMoveMemory(pSharedKey->Key, pAd->StaCfg.GTK, LEN_TKIP_EK);
- NdisMoveMemory(pSharedKey->RxMic, &pAd->StaCfg.GTK[16],
- LEN_TKIP_RXMICK);
- NdisMoveMemory(pSharedKey->TxMic, &pAd->StaCfg.GTK[24],
- LEN_TKIP_TXMICK);
-
- /* Update Shared Key CipherAlg */
- pSharedKey->CipherAlg = CIPHER_NONE;
- if (pAd->StaCfg.GroupCipher == Ndis802_11Encryption2Enabled)
- pSharedKey->CipherAlg = CIPHER_TKIP;
- else if (pAd->StaCfg.GroupCipher ==
- Ndis802_11Encryption3Enabled)
- pSharedKey->CipherAlg = CIPHER_AES;
- else if (pAd->StaCfg.GroupCipher == Ndis802_11GroupWEP40Enabled)
- pSharedKey->CipherAlg = CIPHER_WEP64;
- else if (pAd->StaCfg.GroupCipher ==
- Ndis802_11GroupWEP104Enabled)
- pSharedKey->CipherAlg = CIPHER_WEP128;
-
- /* Update group key information to ASIC Shared Key Table */
- AsicAddSharedKeyEntry(pAd,
- BSS0,
- pAd->StaCfg.DefaultKeyId,
- pSharedKey->CipherAlg,
- pSharedKey->Key,
- pSharedKey->TxMic, pSharedKey->RxMic);
-
- /* Update ASIC WCID attribute table and IVEIV table */
- RTMPAddWcidAttributeEntry(pAd,
- BSS0,
- pAd->StaCfg.DefaultKeyId,
- pSharedKey->CipherAlg, NULL);
- }
-
- return TRUE;
-
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Construct EAPoL message for WPA handshaking
- Its format is below,
-
- +--------------------+
- | Protocol Version | 1 octet
- +--------------------+
- | Protocol Type | 1 octet
- +--------------------+
- | Body Length | 2 octets
- +--------------------+
- | Descriptor Type | 1 octet
- +--------------------+
- | Key Information | 2 octets
- +--------------------+
- | Key Length | 1 octet
- +--------------------+
- | Key Repaly Counter | 8 octets
- +--------------------+
- | Key Nonce | 32 octets
- +--------------------+
- | Key IV | 16 octets
- +--------------------+
- | Key RSC | 8 octets
- +--------------------+
- | Key ID or Reserved | 8 octets
- +--------------------+
- | Key MIC | 16 octets
- +--------------------+
- | Key Data Length | 2 octets
- +--------------------+
- | Key Data | n octets
- +--------------------+
-
- Arguments:
- pAd Pointer to our adapter
-
- Return Value:
- None
-
- Note:
-
- ========================================================================
-*/
-void ConstructEapolMsg(struct rt_mac_table_entry *pEntry,
- u8 GroupKeyWepStatus,
- u8 MsgType,
- u8 DefaultKeyIdx,
- u8 * KeyNonce,
- u8 * TxRSC,
- u8 * GTK,
- u8 * RSNIE,
- u8 RSNIE_Len, struct rt_eapol_packet * pMsg)
-{
- BOOLEAN bWPA2 = FALSE;
- u8 KeyDescVer;
-
- /* Choose WPA2 or not */
- if ((pEntry->AuthMode == Ndis802_11AuthModeWPA2) ||
- (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK))
- bWPA2 = TRUE;
-
- /* Init Packet and Fill header */
- pMsg->ProVer = EAPOL_VER;
- pMsg->ProType = EAPOLKey;
-
- /* Default 95 bytes, the EAPoL-Key descriptor exclude Key-data field */
- SET_u16_TO_ARRARY(pMsg->Body_Len, LEN_EAPOL_KEY_MSG);
-
- /* Fill in EAPoL descriptor */
- if (bWPA2)
- pMsg->KeyDesc.Type = WPA2_KEY_DESC;
- else
- pMsg->KeyDesc.Type = WPA1_KEY_DESC;
-
- /* Key Descriptor Version (bits 0-2) specifies the key descriptor version type */
- {
- /* Fill in Key information, refer to IEEE Std 802.11i-2004 page 78 */
- /* When either the pairwise or the group cipher is AES, the DESC_TYPE_AES(2) shall be used. */
- KeyDescVer =
- (((pEntry->WepStatus == Ndis802_11Encryption3Enabled)
- || (GroupKeyWepStatus ==
- Ndis802_11Encryption3Enabled)) ? (DESC_TYPE_AES)
- : (DESC_TYPE_TKIP));
- }
-
- pMsg->KeyDesc.KeyInfo.KeyDescVer = KeyDescVer;
-
- /* Specify Key Type as Group(0) or Pairwise(1) */
- if (MsgType >= EAPOL_GROUP_MSG_1)
- pMsg->KeyDesc.KeyInfo.KeyType = GROUPKEY;
- else
- pMsg->KeyDesc.KeyInfo.KeyType = PAIRWISEKEY;
-
- /* Specify Key Index, only group_msg1_WPA1 */
- if (!bWPA2 && (MsgType >= EAPOL_GROUP_MSG_1))
- pMsg->KeyDesc.KeyInfo.KeyIndex = DefaultKeyIdx;
-
- if (MsgType == EAPOL_PAIR_MSG_3)
- pMsg->KeyDesc.KeyInfo.Install = 1;
-
- if ((MsgType == EAPOL_PAIR_MSG_1) || (MsgType == EAPOL_PAIR_MSG_3)
- || (MsgType == EAPOL_GROUP_MSG_1))
- pMsg->KeyDesc.KeyInfo.KeyAck = 1;
-
- if (MsgType != EAPOL_PAIR_MSG_1)
- pMsg->KeyDesc.KeyInfo.KeyMic = 1;
-
- if ((bWPA2 && (MsgType >= EAPOL_PAIR_MSG_3)) ||
- (!bWPA2 && (MsgType >= EAPOL_GROUP_MSG_1))) {
- pMsg->KeyDesc.KeyInfo.Secure = 1;
- }
-
- if (bWPA2 && ((MsgType == EAPOL_PAIR_MSG_3) ||
- (MsgType == EAPOL_GROUP_MSG_1))) {
- pMsg->KeyDesc.KeyInfo.EKD_DL = 1;
- }
- /* key Information element has done. */
- *(u16 *) (&pMsg->KeyDesc.KeyInfo) =
- cpu2le16(*(u16 *) (&pMsg->KeyDesc.KeyInfo));
-
- /* Fill in Key Length */
- {
- if (MsgType >= EAPOL_GROUP_MSG_1) {
- /* the length of group key cipher */
- pMsg->KeyDesc.KeyLength[1] =
- ((GroupKeyWepStatus ==
- Ndis802_11Encryption2Enabled) ? TKIP_GTK_LENGTH :
- LEN_AES_KEY);
- } else {
- /* the length of pairwise key cipher */
- pMsg->KeyDesc.KeyLength[1] =
- ((pEntry->WepStatus ==
- Ndis802_11Encryption2Enabled) ? LEN_TKIP_KEY :
- LEN_AES_KEY);
- }
- }
-
- /* Fill in replay counter */
- NdisMoveMemory(pMsg->KeyDesc.ReplayCounter, pEntry->R_Counter,
- LEN_KEY_DESC_REPLAY);
-
- /* Fill Key Nonce field */
- /* ANonce : pairwise_msg1 & pairwise_msg3 */
- /* SNonce : pairwise_msg2 */
- /* GNonce : group_msg1_wpa1 */
- if ((MsgType <= EAPOL_PAIR_MSG_3)
- || ((!bWPA2 && (MsgType == EAPOL_GROUP_MSG_1))))
- NdisMoveMemory(pMsg->KeyDesc.KeyNonce, KeyNonce,
- LEN_KEY_DESC_NONCE);
-
- /* Fill key IV - WPA2 as 0, WPA1 as random */
- if (!bWPA2 && (MsgType == EAPOL_GROUP_MSG_1)) {
- /* Suggest IV be random number plus some number, */
- NdisMoveMemory(pMsg->KeyDesc.KeyIv, &KeyNonce[16],
- LEN_KEY_DESC_IV);
- pMsg->KeyDesc.KeyIv[15] += 2;
- }
- /* Fill Key RSC field */
- /* It contains the RSC for the GTK being installed. */
- if ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2)
- || (MsgType == EAPOL_GROUP_MSG_1)) {
- NdisMoveMemory(pMsg->KeyDesc.KeyRsc, TxRSC, 6);
- }
- /* Clear Key MIC field for MIC calculation later */
- NdisZeroMemory(pMsg->KeyDesc.KeyMic, LEN_KEY_DESC_MIC);
-
- ConstructEapolKeyData(pEntry,
- GroupKeyWepStatus,
- KeyDescVer,
- MsgType,
- DefaultKeyIdx, GTK, RSNIE, RSNIE_Len, pMsg);
-
- /* Calculate MIC and fill in KeyMic Field except Pairwise Msg 1. */
- if (MsgType != EAPOL_PAIR_MSG_1) {
- CalculateMIC(KeyDescVer, pEntry->PTK, pMsg);
- }
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("===> ConstructEapolMsg for %s %s\n",
- ((bWPA2) ? "WPA2" : "WPA"), GetEapolMsgType(MsgType)));
- DBGPRINT(RT_DEBUG_TRACE,
- (" Body length = %d \n",
- CONV_ARRARY_TO_u16(pMsg->Body_Len)));
- DBGPRINT(RT_DEBUG_TRACE,
- (" Key length = %d \n",
- CONV_ARRARY_TO_u16(pMsg->KeyDesc.KeyLength)));
-
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Construct the Key Data field of EAPoL message
-
- Arguments:
- pAd Pointer to our adapter
- Elem Message body
-
- Return Value:
- None
-
- Note:
-
- ========================================================================
-*/
-void ConstructEapolKeyData(struct rt_mac_table_entry *pEntry,
- u8 GroupKeyWepStatus,
- u8 keyDescVer,
- u8 MsgType,
- u8 DefaultKeyIdx,
- u8 * GTK,
- u8 * RSNIE,
- u8 RSNIE_LEN, struct rt_eapol_packet * pMsg)
-{
- u8 *mpool, *Key_Data, *Rc4GTK;
- u8 ekey[(LEN_KEY_DESC_IV + LEN_EAP_EK)];
- unsigned long data_offset;
- BOOLEAN bWPA2Capable = FALSE;
- struct rt_rtmp_adapter *pAd = pEntry->pAd;
- BOOLEAN GTK_Included = FALSE;
-
- /* Choose WPA2 or not */
- if ((pEntry->AuthMode == Ndis802_11AuthModeWPA2) ||
- (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK))
- bWPA2Capable = TRUE;
-
- if (MsgType == EAPOL_PAIR_MSG_1 ||
- MsgType == EAPOL_PAIR_MSG_4 || MsgType == EAPOL_GROUP_MSG_2)
- return;
-
- /* allocate memory pool */
- os_alloc_mem(NULL, (u8 **) & mpool, 1500);
-
- if (mpool == NULL)
- return;
-
- /* Rc4GTK Len = 512 */
- Rc4GTK = (u8 *) ROUND_UP(mpool, 4);
- /* Key_Data Len = 512 */
- Key_Data = (u8 *) ROUND_UP(Rc4GTK + 512, 4);
-
- NdisZeroMemory(Key_Data, 512);
- SET_u16_TO_ARRARY(pMsg->KeyDesc.KeyDataLen, 0);
- data_offset = 0;
-
- /* Encapsulate RSNIE in pairwise_msg2 & pairwise_msg3 */
- if (RSNIE_LEN
- && ((MsgType == EAPOL_PAIR_MSG_2)
- || (MsgType == EAPOL_PAIR_MSG_3))) {
- u8 *pmkid_ptr = NULL;
- u8 pmkid_len = 0;
-
- RTMPInsertRSNIE(&Key_Data[data_offset],
- &data_offset,
- RSNIE, RSNIE_LEN, pmkid_ptr, pmkid_len);
- }
-
- /* Encapsulate KDE format in pairwise_msg3_WPA2 & group_msg1_WPA2 */
- if (bWPA2Capable
- && ((MsgType == EAPOL_PAIR_MSG_3)
- || (MsgType == EAPOL_GROUP_MSG_1))) {
- /* Key Data Encapsulation (KDE) format - 802.11i-2004 Figure-43w and Table-20h */
- Key_Data[data_offset + 0] = 0xDD;
-
- if (GroupKeyWepStatus == Ndis802_11Encryption3Enabled) {
- Key_Data[data_offset + 1] = 0x16; /* 4+2+16(OUI+DataType+DataField) */
- } else {
- Key_Data[data_offset + 1] = 0x26; /* 4+2+32(OUI+DataType+DataField) */
- }
-
- Key_Data[data_offset + 2] = 0x00;
- Key_Data[data_offset + 3] = 0x0F;
- Key_Data[data_offset + 4] = 0xAC;
- Key_Data[data_offset + 5] = 0x01;
-
- /* GTK KDE format - 802.11i-2004 Figure-43x */
- Key_Data[data_offset + 6] = (DefaultKeyIdx & 0x03);
- Key_Data[data_offset + 7] = 0x00; /* Reserved Byte */
-
- data_offset += 8;
- }
-
- /* Encapsulate GTK */
- /* Only for pairwise_msg3_WPA2 and group_msg1 */
- if ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2Capable)
- || (MsgType == EAPOL_GROUP_MSG_1)) {
- /* Fill in GTK */
- if (GroupKeyWepStatus == Ndis802_11Encryption3Enabled) {
- NdisMoveMemory(&Key_Data[data_offset], GTK,
- LEN_AES_KEY);
- data_offset += LEN_AES_KEY;
- } else {
- NdisMoveMemory(&Key_Data[data_offset], GTK,
- TKIP_GTK_LENGTH);
- data_offset += TKIP_GTK_LENGTH;
- }
-
- GTK_Included = TRUE;
- }
-
- /* This whole key-data field shall be encrypted if a GTK is included. */
- /* Encrypt the data material in key data field with KEK */
- if (GTK_Included) {
- /*hex_dump("GTK_Included", Key_Data, data_offset); */
-
- if ((keyDescVer == DESC_TYPE_AES)) {
- u8 remainder = 0;
- u8 pad_len = 0;
-
- /* Key Descriptor Version 2 or 3: AES key wrap, defined in IETF RFC 3394, */
- /* shall be used to encrypt the Key Data field using the KEK field from */
- /* the derived PTK. */
-
- /* If the Key Data field uses the NIST AES key wrap, then the Key Data field */
- /* shall be padded before encrypting if the key data length is less than 16 */
- /* octets or if it is not a multiple of 8. The padding consists of appending */
- /* a single octet 0xdd followed by zero or more 0x00 octets. */
- if ((remainder = data_offset & 0x07) != 0) {
- int i;
-
- pad_len = (8 - remainder);
- Key_Data[data_offset] = 0xDD;
- for (i = 1; i < pad_len; i++)
- Key_Data[data_offset + i] = 0;
-
- data_offset += pad_len;
- }
-
- AES_GTK_KEY_WRAP(&pEntry->PTK[16], Key_Data,
- data_offset, Rc4GTK);
- /* AES wrap function will grow 8 bytes in length */
- data_offset += 8;
- } else {
- /* Key Descriptor Version 1: ARC4 is used to encrypt the Key Data field
- using the KEK field from the derived PTK. */
-
- /* PREPARE Encrypted "Key DATA" field. (Encrypt GTK with RC4, usinf PTK[16]->[31] as Key, IV-field as IV) */
- /* put TxTsc in Key RSC field */
- pAd->PrivateInfo.FCSCRC32 = PPPINITFCS32; /*Init crc32. */
-
- /* ekey is the contanetion of IV-field, and PTK[16]->PTK[31] */
- NdisMoveMemory(ekey, pMsg->KeyDesc.KeyIv,
- LEN_KEY_DESC_IV);
- NdisMoveMemory(&ekey[LEN_KEY_DESC_IV], &pEntry->PTK[16],
- LEN_EAP_EK);
- ARCFOUR_INIT(&pAd->PrivateInfo.WEPCONTEXT, ekey, sizeof(ekey)); /*INIT SBOX, KEYLEN+3(IV) */
- pAd->PrivateInfo.FCSCRC32 =
- RTMP_CALC_FCS32(pAd->PrivateInfo.FCSCRC32, Key_Data,
- data_offset);
- WPAARCFOUR_ENCRYPT(&pAd->PrivateInfo.WEPCONTEXT, Rc4GTK,
- Key_Data, data_offset);
- }
-
- NdisMoveMemory(pMsg->KeyDesc.KeyData, Rc4GTK, data_offset);
- } else {
- NdisMoveMemory(pMsg->KeyDesc.KeyData, Key_Data, data_offset);
- }
-
- /* Update key data length field and total body length */
- SET_u16_TO_ARRARY(pMsg->KeyDesc.KeyDataLen, data_offset);
- INC_u16_TO_ARRARY(pMsg->Body_Len, data_offset);
-
- os_free_mem(NULL, mpool);
-
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Calcaulate MIC. It is used during 4-ways handsharking.
-
- Arguments:
- pAd - pointer to our pAdapter context
- PeerWepStatus - indicate the encryption type
-
- Return Value:
-
- Note:
-
- ========================================================================
-*/
-static void CalculateMIC(u8 KeyDescVer,
- u8 * PTK, struct rt_eapol_packet * pMsg)
-{
- u8 *OutBuffer;
- unsigned long FrameLen = 0;
- u8 mic[LEN_KEY_DESC_MIC];
- u8 digest[80];
-
- /* allocate memory for MIC calculation */
- os_alloc_mem(NULL, (u8 **) & OutBuffer, 512);
-
- if (OutBuffer == NULL) {
- DBGPRINT(RT_DEBUG_ERROR, ("CalculateMIC: no memory!\n"));
- return;
- }
- /* make a frame for calculating MIC. */
- MakeOutgoingFrame(OutBuffer, &FrameLen,
- CONV_ARRARY_TO_u16(pMsg->Body_Len) + 4, pMsg,
- END_OF_ARGS);
-
- NdisZeroMemory(mic, sizeof(mic));
-
- /* Calculate MIC */
- if (KeyDescVer == DESC_TYPE_AES) {
- HMAC_SHA1(PTK, LEN_EAP_MICK, OutBuffer, FrameLen, digest,
- SHA1_DIGEST_SIZE);
- NdisMoveMemory(mic, digest, LEN_KEY_DESC_MIC);
- } else {
- HMAC_MD5(PTK, LEN_EAP_MICK, OutBuffer, FrameLen, mic,
- MD5_DIGEST_SIZE);
- }
-
- /* store the calculated MIC */
- NdisMoveMemory(pMsg->KeyDesc.KeyMic, mic, LEN_KEY_DESC_MIC);
-
- os_free_mem(NULL, OutBuffer);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Some received frames can't decrypt by Asic, so decrypt them by software.
-
- Arguments:
- pAd - pointer to our pAdapter context
- PeerWepStatus - indicate the encryption type
-
- Return Value:
- NDIS_STATUS_SUCCESS - decryption successful
- NDIS_STATUS_FAILURE - decryption failure
-
- ========================================================================
-*/
-int RTMPSoftDecryptBroadCastData(struct rt_rtmp_adapter *pAd,
- struct rt_rx_blk *pRxBlk,
- IN NDIS_802_11_ENCRYPTION_STATUS
- GroupCipher, struct rt_cipher_key *pShard_key)
-{
- struct rt_rxwi * pRxWI = pRxBlk->pRxWI;
-
- /* handle WEP decryption */
- if (GroupCipher == Ndis802_11Encryption1Enabled) {
- if (RTMPSoftDecryptWEP
- (pAd, pRxBlk->pData, pRxWI->MPDUtotalByteCount,
- pShard_key)) {
-
- /*Minus IV[4] & ICV[4] */
- pRxWI->MPDUtotalByteCount -= 8;
- } else {
- DBGPRINT(RT_DEBUG_ERROR,
- ("ERROR : Software decrypt WEP data fails.\n"));
- /* give up this frame */
- return NDIS_STATUS_FAILURE;
- }
- }
- /* handle TKIP decryption */
- else if (GroupCipher == Ndis802_11Encryption2Enabled) {
- if (RTMPSoftDecryptTKIP
- (pAd, pRxBlk->pData, pRxWI->MPDUtotalByteCount, 0,
- pShard_key)) {
-
- /*Minus 8 bytes MIC, 8 bytes IV/EIV, 4 bytes ICV */
- pRxWI->MPDUtotalByteCount -= 20;
- } else {
- DBGPRINT(RT_DEBUG_ERROR,
- ("ERROR : RTMPSoftDecryptTKIP Failed\n"));
- /* give up this frame */
- return NDIS_STATUS_FAILURE;
- }
- }
- /* handle AES decryption */
- else if (GroupCipher == Ndis802_11Encryption3Enabled) {
- if (RTMPSoftDecryptAES
- (pAd, pRxBlk->pData, pRxWI->MPDUtotalByteCount,
- pShard_key)) {
-
- /*8 bytes MIC, 8 bytes IV/EIV (CCMP Header) */
- pRxWI->MPDUtotalByteCount -= 16;
- } else {
- DBGPRINT(RT_DEBUG_ERROR,
- ("ERROR : RTMPSoftDecryptAES Failed\n"));
- /* give up this frame */
- return NDIS_STATUS_FAILURE;
- }
- } else {
- /* give up this frame */
- return NDIS_STATUS_FAILURE;
- }
-
- return NDIS_STATUS_SUCCESS;
-
-}
-
-u8 *GetSuiteFromRSNIE(u8 *rsnie,
- u32 rsnie_len, u8 type, u8 * count)
-{
- struct rt_eid * pEid;
- int len;
- u8 *pBuf;
- int offset = 0;
- struct rt_rsnie_auth *pAkm;
- u16 acount;
- BOOLEAN isWPA2 = FALSE;
-
- pEid = (struct rt_eid *) rsnie;
- len = rsnie_len - 2; /* exclude IE and length */
- pBuf = (u8 *)& pEid->Octet[0];
-
- /* set default value */
- *count = 0;
-
- /* Check length */
- if ((len <= 0) || (pEid->Len != len)) {
- DBGPRINT_ERR("%s : The length is invalid\n", __func__);
- return NULL;
- }
- /* Check WPA or WPA2 */
- if (pEid->Eid == IE_WPA) {
- struct rt_rsnie *pRsnie = (struct rt_rsnie *)pBuf;
- u16 ucount;
-
- if (len < sizeof(struct rt_rsnie)) {
- DBGPRINT_ERR("%s : The length is too short for WPA\n", __func__);
- return NULL;
- }
- /* Get the count of pairwise cipher */
- ucount = cpu2le16(pRsnie->ucount);
- if (ucount > 2) {
- DBGPRINT_ERR("%s : The count(%d) of pairwise cipher is invlaid\n", __func__, ucount);
- return NULL;
- }
- /* Get the group cipher */
- if (type == GROUP_SUITE) {
- *count = 1;
- return pRsnie->mcast;
- }
- /* Get the pairwise cipher suite */
- else if (type == PAIRWISE_SUITE) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("%s : The count of pairwise cipher is %d\n",
- __func__, ucount));
- *count = ucount;
- return pRsnie->ucast[0].oui;
- }
-
- offset = sizeof(struct rt_rsnie) + (4 * (ucount - 1));
-
- } else if (pEid->Eid == IE_RSN) {
- struct rt_rsnie2 *pRsnie = (struct rt_rsnie2 *)pBuf;
- u16 ucount;
-
- isWPA2 = TRUE;
-
- if (len < sizeof(struct rt_rsnie2)) {
- DBGPRINT_ERR("%s : The length is too short for WPA2\n", __func__);
- return NULL;
- }
- /* Get the count of pairwise cipher */
- ucount = cpu2le16(pRsnie->ucount);
- if (ucount > 2) {
- DBGPRINT_ERR("%s : The count(%d) of pairwise cipher is invlaid\n", __func__, ucount);
- return NULL;
- }
- /* Get the group cipher */
- if (type == GROUP_SUITE) {
- *count = 1;
- return pRsnie->mcast;
- }
- /* Get the pairwise cipher suite */
- else if (type == PAIRWISE_SUITE) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("%s : The count of pairwise cipher is %d\n",
- __func__, ucount));
- *count = ucount;
- return pRsnie->ucast[0].oui;
- }
-
- offset = sizeof(struct rt_rsnie2) + (4 * (ucount - 1));
-
- } else {
- DBGPRINT_ERR("%s : Unknown IE (%d)\n", __func__, pEid->Eid);
- return NULL;
- }
-
- /* skip group cipher and pairwise cipher suite */
- pBuf += offset;
- len -= offset;
-
- if (len < sizeof(struct rt_rsnie_auth)) {
- DBGPRINT_ERR("%s : The length of RSNIE is too short\n", __func__);
- return NULL;
- }
- /* pointer to AKM count */
- pAkm = (struct rt_rsnie_auth *)pBuf;
-
- /* Get the count of pairwise cipher */
- acount = cpu2le16(pAkm->acount);
- if (acount > 2) {
- DBGPRINT_ERR("%s : The count(%d) of AKM is invlaid\n", __func__, acount);
- return NULL;
- }
- /* Get the AKM suite */
- if (type == AKM_SUITE) {
- DBGPRINT(RT_DEBUG_TRACE, ("%s : The count of AKM is %d\n",
- __func__, acount));
- *count = acount;
- return pAkm->auth[0].oui;
- }
- offset = sizeof(struct rt_rsnie_auth) + (4 * (acount - 1));
-
- pBuf += offset;
- len -= offset;
-
- /* The remaining length must larger than (RSN-Capability(2) + PMKID-Count(2) + PMKID(16~)) */
- if (len >= (sizeof(RSN_CAPABILITIES) + 2 + LEN_PMKID)) {
- /* Skip RSN capability and PMKID-Count */
- pBuf += (sizeof(RSN_CAPABILITIES) + 2);
- len -= (sizeof(RSN_CAPABILITIES) + 2);
-
- /* Get PMKID */
- if (type == PMKID_LIST) {
- *count = 1;
- return pBuf;
- }
- } else {
- DBGPRINT_ERR("%s : it can't get any more information beyond AKM \n", __func__);
- return NULL;
- }
-
- *count = 0;
- /*DBGPRINT_ERR(("%s : The type(%d) doesn't support \n", __func__, type)); */
- return NULL;
-
-}
-
-void WpaShowAllsuite(u8 *rsnie, u32 rsnie_len)
-{
- u8 *pSuite = NULL;
- u8 count;
-
- hex_dump("RSNIE", rsnie, rsnie_len);
-
- /* group cipher */
- pSuite = GetSuiteFromRSNIE(rsnie, rsnie_len, GROUP_SUITE, &count);
- if (pSuite != NULL) {
- hex_dump("group cipher", pSuite, 4 * count);
- }
- /* pairwise cipher */
- pSuite = GetSuiteFromRSNIE(rsnie, rsnie_len, PAIRWISE_SUITE, &count);
- if (pSuite != NULL) {
- hex_dump("pairwise cipher", pSuite, 4 * count);
- }
- /* AKM */
- pSuite = GetSuiteFromRSNIE(rsnie, rsnie_len, AKM_SUITE, &count);
- if (pSuite != NULL) {
- hex_dump("AKM suite", pSuite, 4 * count);
- }
- /* PMKID */
- pSuite = GetSuiteFromRSNIE(rsnie, rsnie_len, PMKID_LIST, &count);
- if (pSuite != NULL) {
- hex_dump("PMKID", pSuite, LEN_PMKID);
- }
-
-}
-
-void RTMPInsertRSNIE(u8 *pFrameBuf,
- unsigned long *pFrameLen,
- u8 *rsnie_ptr,
- u8 rsnie_len,
- u8 *pmkid_ptr, u8 pmkid_len)
-{
- u8 *pTmpBuf;
- unsigned long TempLen = 0;
- u8 extra_len = 0;
- u16 pmk_count = 0;
- u8 ie_num;
- u8 total_len = 0;
- u8 WPA2_OUI[3] = { 0x00, 0x0F, 0xAC };
-
- pTmpBuf = pFrameBuf;
-
- /* PMKID-List Must larger than 0 and the multiple of 16. */
- if (pmkid_len > 0 && ((pmkid_len & 0x0f) == 0)) {
- extra_len = sizeof(u16)+ pmkid_len;
-
- pmk_count = (pmkid_len >> 4);
- pmk_count = cpu2le16(pmk_count);
- } else {
- DBGPRINT(RT_DEBUG_WARN,
- ("%s : The length is PMKID-List is invalid (%d), so don't insert it.\n",
- __func__, pmkid_len));
- }
-
- if (rsnie_len != 0) {
- ie_num = IE_WPA;
- total_len = rsnie_len;
-
- if (NdisEqualMemory(rsnie_ptr + 2, WPA2_OUI, sizeof(WPA2_OUI))) {
- ie_num = IE_RSN;
- total_len += extra_len;
- }
-
- /* construct RSNIE body */
- MakeOutgoingFrame(pTmpBuf, &TempLen,
- 1, &ie_num,
- 1, &total_len,
- rsnie_len, rsnie_ptr, END_OF_ARGS);
-
- pTmpBuf += TempLen;
- *pFrameLen = *pFrameLen + TempLen;
-
- if (ie_num == IE_RSN) {
- /* Insert PMKID-List field */
- if (extra_len > 0) {
- MakeOutgoingFrame(pTmpBuf, &TempLen,
- 2, &pmk_count,
- pmkid_len, pmkid_ptr,
- END_OF_ARGS);
-
- pTmpBuf += TempLen;
- *pFrameLen = *pFrameLen + TempLen;
- }
- }
- }
-
- return;
-}
diff --git a/drivers/staging/rt2860/common/crypt_hmac.c b/drivers/staging/rt2860/common/crypt_hmac.c
deleted file mode 100644
index d7ab08ec1a41..000000000000
--- a/drivers/staging/rt2860/common/crypt_hmac.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************/
-
-#include "../crypt_hmac.h"
-
-#ifdef HMAC_SHA1_SUPPORT
-/*
-========================================================================
-Routine Description:
- HMAC using SHA1 hash function
-
-Arguments:
- key Secret key
- key_len The length of the key in bytes
- message Message context
- message_len The length of message in bytes
- macLen Request the length of message authentication code
-
-Return Value:
- mac Message authentication code
-
-Note:
- None
-========================================================================
-*/
-void HMAC_SHA1(IN const u8 Key[],
- u32 KeyLen,
- IN const u8 Message[],
- u32 MessageLen, u8 MAC[], u32 MACLen)
-{
- struct rt_sha1_ctx sha_ctx1;
- struct rt_sha1_ctx sha_ctx2;
- u8 K0[SHA1_BLOCK_SIZE];
- u8 Digest[SHA1_DIGEST_SIZE];
- u32 index;
-
- NdisZeroMemory(&sha_ctx1, sizeof(struct rt_sha1_ctx));
- NdisZeroMemory(&sha_ctx2, sizeof(struct rt_sha1_ctx));
- /*
- * If the length of K = B(Block size): K0 = K.
- * If the length of K > B: hash K to obtain an L byte string,
- * then append (B-L) zeros to create a B-byte string K0 (i.e., K0 = H(K) || 00...00).
- * If the length of K < B: append zeros to the end of K to create a B-byte string K0
- */
- NdisZeroMemory(K0, SHA1_BLOCK_SIZE);
- if (KeyLen <= SHA1_BLOCK_SIZE)
- NdisMoveMemory(K0, Key, KeyLen);
- else
- RT_SHA1(Key, KeyLen, K0);
- /* End of if */
-
- /* Exclusive-Or K0 with ipad */
- /* ipad: Inner pad; the byte x¡¦36¡¦ repeated B times. */
- for (index = 0; index < SHA1_BLOCK_SIZE; index++)
- K0[index] ^= 0x36;
- /* End of for */
-
- RT_SHA1_Init(&sha_ctx1);
- /* H(K0^ipad) */
- SHA1_Append(&sha_ctx1, K0, sizeof(K0));
- /* H((K0^ipad)||text) */
- SHA1_Append(&sha_ctx1, Message, MessageLen);
- SHA1_End(&sha_ctx1, Digest);
-
- /* Exclusive-Or K0 with opad and remove ipad */
- /* opad: Outer pad; the byte x¡¦5c¡¦ repeated B times. */
- for (index = 0; index < SHA1_BLOCK_SIZE; index++)
- K0[index] ^= 0x36 ^ 0x5c;
- /* End of for */
-
- RT_SHA1_Init(&sha_ctx2);
- /* H(K0^opad) */
- SHA1_Append(&sha_ctx2, K0, sizeof(K0));
- /* H( (K0^opad) || H((K0^ipad)||text) ) */
- SHA1_Append(&sha_ctx2, Digest, SHA1_DIGEST_SIZE);
- SHA1_End(&sha_ctx2, Digest);
-
- if (MACLen > SHA1_DIGEST_SIZE)
- NdisMoveMemory(MAC, Digest, SHA1_DIGEST_SIZE);
- else
- NdisMoveMemory(MAC, Digest, MACLen);
-} /* End of HMAC_SHA1 */
-#endif /* HMAC_SHA1_SUPPORT */
-
-#ifdef HMAC_MD5_SUPPORT
-/*
-========================================================================
-Routine Description:
- HMAC using MD5 hash function
-
-Arguments:
- key Secret key
- key_len The length of the key in bytes
- message Message context
- message_len The length of message in bytes
- macLen Request the length of message authentication code
-
-Return Value:
- mac Message authentication code
-
-Note:
- None
-========================================================================
-*/
-void HMAC_MD5(IN const u8 Key[],
- u32 KeyLen,
- IN const u8 Message[],
- u32 MessageLen, u8 MAC[], u32 MACLen)
-{
- struct rt_md5_ctx_struc md5_ctx1;
- struct rt_md5_ctx_struc md5_ctx2;
- u8 K0[MD5_BLOCK_SIZE];
- u8 Digest[MD5_DIGEST_SIZE];
- u32 index;
-
- NdisZeroMemory(&md5_ctx1, sizeof(struct rt_md5_ctx_struc));
- NdisZeroMemory(&md5_ctx2, sizeof(struct rt_md5_ctx_struc));
- /*
- * If the length of K = B(Block size): K0 = K.
- * If the length of K > B: hash K to obtain an L byte string,
- * then append (B-L) zeros to create a B-byte string K0 (i.e., K0 = H(K) || 00...00).
- * If the length of K < B: append zeros to the end of K to create a B-byte string K0
- */
- NdisZeroMemory(K0, MD5_BLOCK_SIZE);
- if (KeyLen <= MD5_BLOCK_SIZE) {
- NdisMoveMemory(K0, Key, KeyLen);
- } else {
- RT_MD5(Key, KeyLen, K0);
- }
-
- /* Exclusive-Or K0 with ipad */
- /* ipad: Inner pad; the byte x¡¦36¡¦ repeated B times. */
- for (index = 0; index < MD5_BLOCK_SIZE; index++)
- K0[index] ^= 0x36;
- /* End of for */
-
- MD5_Init(&md5_ctx1);
- /* H(K0^ipad) */
- MD5_Append(&md5_ctx1, K0, sizeof(K0));
- /* H((K0^ipad)||text) */
- MD5_Append(&md5_ctx1, Message, MessageLen);
- MD5_End(&md5_ctx1, Digest);
-
- /* Exclusive-Or K0 with opad and remove ipad */
- /* opad: Outer pad; the byte x¡¦5c¡¦ repeated B times. */
- for (index = 0; index < MD5_BLOCK_SIZE; index++)
- K0[index] ^= 0x36 ^ 0x5c;
- /* End of for */
-
- MD5_Init(&md5_ctx2);
- /* H(K0^opad) */
- MD5_Append(&md5_ctx2, K0, sizeof(K0));
- /* H( (K0^opad) || H((K0^ipad)||text) ) */
- MD5_Append(&md5_ctx2, Digest, MD5_DIGEST_SIZE);
- MD5_End(&md5_ctx2, Digest);
-
- if (MACLen > MD5_DIGEST_SIZE)
- NdisMoveMemory(MAC, Digest, MD5_DIGEST_SIZE);
- else
- NdisMoveMemory(MAC, Digest, MACLen);
-} /* End of HMAC_SHA256 */
-#endif /* HMAC_MD5_SUPPORT */
-
-/* End of crypt_hmac.c */
diff --git a/drivers/staging/rt2860/common/crypt_md5.c b/drivers/staging/rt2860/common/crypt_md5.c
deleted file mode 100644
index 6deab659c22b..000000000000
--- a/drivers/staging/rt2860/common/crypt_md5.c
+++ /dev/null
@@ -1,339 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************/
-
-#include "../crypt_md5.h"
-
-#ifdef MD5_SUPPORT
-/*
- * F, G, H and I are basic MD5 functions.
- */
-#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
-#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
-#define H(x, y, z) ((x) ^ (y) ^ (z))
-#define I(x, y, z) ((y) ^ ((x) | (~z)))
-
-#define ROTL(x,n,w) ((x << n) | (x >> (w - n)))
-#define ROTL32(x,n) ROTL(x,n,32) /* 32 bits word */
-
-#define ROUND1(a, b, c, d, x, s, ac) { \
- (a) += F((b),(c),(d)) + (x) + (u32)(ac); \
- (a) = ROTL32((a),(s)); \
- (a) += (b); \
-}
-#define ROUND2(a, b, c, d, x, s, ac) { \
- (a) += G((b),(c),(d)) + (x) + (u32)(ac); \
- (a) = ROTL32((a),(s)); \
- (a) += (b); \
-}
-#define ROUND3(a, b, c, d, x, s, ac) { \
- (a) += H((b),(c),(d)) + (x) + (u32)(ac); \
- (a) = ROTL32((a),(s)); \
- (a) += (b); \
-}
-#define ROUND4(a, b, c, d, x, s, ac) { \
- (a) += I((b),(c),(d)) + (x) + (u32)(ac); \
- (a) = ROTL32((a),(s)); \
- (a) += (b); \
-}
-static const u32 MD5_DefaultHashValue[4] = {
- 0x67452301UL, 0xefcdab89UL, 0x98badcfeUL, 0x10325476UL
-};
-#endif /* MD5_SUPPORT */
-
-#ifdef MD5_SUPPORT
-/*
-========================================================================
-Routine Description:
- Initial Md5_CTX_STRUC
-
-Arguments:
- pMD5_CTX Pointer to Md5_CTX_STRUC
-
-Return Value:
- None
-
-Note:
- None
-========================================================================
-*/
-void MD5_Init(struct rt_md5_ctx_struc *pMD5_CTX)
-{
- NdisMoveMemory(pMD5_CTX->HashValue, MD5_DefaultHashValue,
- sizeof(MD5_DefaultHashValue));
- NdisZeroMemory(pMD5_CTX->Block, MD5_BLOCK_SIZE);
- pMD5_CTX->BlockLen = 0;
- pMD5_CTX->MessageLen = 0;
-} /* End of MD5_Init */
-
-/*
-========================================================================
-Routine Description:
- MD5 computation for one block (512 bits)
-
-Arguments:
- pMD5_CTX Pointer to Md5_CTX_STRUC
-
-Return Value:
- None
-
-Note:
- T[i] := floor(abs(sin(i + 1)) * (2 pow 32)), i is number of round
-========================================================================
-*/
-void MD5_Hash(struct rt_md5_ctx_struc *pMD5_CTX)
-{
- u32 X_i;
- u32 X[16];
- u32 a, b, c, d;
-
- /* Prepare the message schedule, {X_i} */
- NdisMoveMemory(X, pMD5_CTX->Block, MD5_BLOCK_SIZE);
- for (X_i = 0; X_i < 16; X_i++)
- X[X_i] = cpu2le32(X[X_i]); /* Endian Swap */
- /* End of for */
-
- /* MD5 hash computation */
- /* Initialize the working variables */
- a = pMD5_CTX->HashValue[0];
- b = pMD5_CTX->HashValue[1];
- c = pMD5_CTX->HashValue[2];
- d = pMD5_CTX->HashValue[3];
-
- /*
- * Round 1
- * Let [abcd k s i] denote the operation
- * a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s)
- */
- ROUND1(a, b, c, d, X[0], 7, 0xd76aa478); /* 1 */
- ROUND1(d, a, b, c, X[1], 12, 0xe8c7b756); /* 2 */
- ROUND1(c, d, a, b, X[2], 17, 0x242070db); /* 3 */
- ROUND1(b, c, d, a, X[3], 22, 0xc1bdceee); /* 4 */
- ROUND1(a, b, c, d, X[4], 7, 0xf57c0faf); /* 5 */
- ROUND1(d, a, b, c, X[5], 12, 0x4787c62a); /* 6 */
- ROUND1(c, d, a, b, X[6], 17, 0xa8304613); /* 7 */
- ROUND1(b, c, d, a, X[7], 22, 0xfd469501); /* 8 */
- ROUND1(a, b, c, d, X[8], 7, 0x698098d8); /* 9 */
- ROUND1(d, a, b, c, X[9], 12, 0x8b44f7af); /* 10 */
- ROUND1(c, d, a, b, X[10], 17, 0xffff5bb1); /* 11 */
- ROUND1(b, c, d, a, X[11], 22, 0x895cd7be); /* 12 */
- ROUND1(a, b, c, d, X[12], 7, 0x6b901122); /* 13 */
- ROUND1(d, a, b, c, X[13], 12, 0xfd987193); /* 14 */
- ROUND1(c, d, a, b, X[14], 17, 0xa679438e); /* 15 */
- ROUND1(b, c, d, a, X[15], 22, 0x49b40821); /* 16 */
-
- /*
- * Round 2
- * Let [abcd k s i] denote the operation
- * a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s)
- */
- ROUND2(a, b, c, d, X[1], 5, 0xf61e2562); /* 17 */
- ROUND2(d, a, b, c, X[6], 9, 0xc040b340); /* 18 */
- ROUND2(c, d, a, b, X[11], 14, 0x265e5a51); /* 19 */
- ROUND2(b, c, d, a, X[0], 20, 0xe9b6c7aa); /* 20 */
- ROUND2(a, b, c, d, X[5], 5, 0xd62f105d); /* 21 */
- ROUND2(d, a, b, c, X[10], 9, 0x2441453); /* 22 */
- ROUND2(c, d, a, b, X[15], 14, 0xd8a1e681); /* 23 */
- ROUND2(b, c, d, a, X[4], 20, 0xe7d3fbc8); /* 24 */
- ROUND2(a, b, c, d, X[9], 5, 0x21e1cde6); /* 25 */
- ROUND2(d, a, b, c, X[14], 9, 0xc33707d6); /* 26 */
- ROUND2(c, d, a, b, X[3], 14, 0xf4d50d87); /* 27 */
- ROUND2(b, c, d, a, X[8], 20, 0x455a14ed); /* 28 */
- ROUND2(a, b, c, d, X[13], 5, 0xa9e3e905); /* 29 */
- ROUND2(d, a, b, c, X[2], 9, 0xfcefa3f8); /* 30 */
- ROUND2(c, d, a, b, X[7], 14, 0x676f02d9); /* 31 */
- ROUND2(b, c, d, a, X[12], 20, 0x8d2a4c8a); /* 32 */
-
- /*
- * Round 3
- * Let [abcd k s t] denote the operation
- * a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s)
- */
- ROUND3(a, b, c, d, X[5], 4, 0xfffa3942); /* 33 */
- ROUND3(d, a, b, c, X[8], 11, 0x8771f681); /* 34 */
- ROUND3(c, d, a, b, X[11], 16, 0x6d9d6122); /* 35 */
- ROUND3(b, c, d, a, X[14], 23, 0xfde5380c); /* 36 */
- ROUND3(a, b, c, d, X[1], 4, 0xa4beea44); /* 37 */
- ROUND3(d, a, b, c, X[4], 11, 0x4bdecfa9); /* 38 */
- ROUND3(c, d, a, b, X[7], 16, 0xf6bb4b60); /* 39 */
- ROUND3(b, c, d, a, X[10], 23, 0xbebfbc70); /* 40 */
- ROUND3(a, b, c, d, X[13], 4, 0x289b7ec6); /* 41 */
- ROUND3(d, a, b, c, X[0], 11, 0xeaa127fa); /* 42 */
- ROUND3(c, d, a, b, X[3], 16, 0xd4ef3085); /* 43 */
- ROUND3(b, c, d, a, X[6], 23, 0x4881d05); /* 44 */
- ROUND3(a, b, c, d, X[9], 4, 0xd9d4d039); /* 45 */
- ROUND3(d, a, b, c, X[12], 11, 0xe6db99e5); /* 46 */
- ROUND3(c, d, a, b, X[15], 16, 0x1fa27cf8); /* 47 */
- ROUND3(b, c, d, a, X[2], 23, 0xc4ac5665); /* 48 */
-
- /*
- * Round 4
- * Let [abcd k s t] denote the operation
- * a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s)
- */
- ROUND4(a, b, c, d, X[0], 6, 0xf4292244); /* 49 */
- ROUND4(d, a, b, c, X[7], 10, 0x432aff97); /* 50 */
- ROUND4(c, d, a, b, X[14], 15, 0xab9423a7); /* 51 */
- ROUND4(b, c, d, a, X[5], 21, 0xfc93a039); /* 52 */
- ROUND4(a, b, c, d, X[12], 6, 0x655b59c3); /* 53 */
- ROUND4(d, a, b, c, X[3], 10, 0x8f0ccc92); /* 54 */
- ROUND4(c, d, a, b, X[10], 15, 0xffeff47d); /* 55 */
- ROUND4(b, c, d, a, X[1], 21, 0x85845dd1); /* 56 */
- ROUND4(a, b, c, d, X[8], 6, 0x6fa87e4f); /* 57 */
- ROUND4(d, a, b, c, X[15], 10, 0xfe2ce6e0); /* 58 */
- ROUND4(c, d, a, b, X[6], 15, 0xa3014314); /* 59 */
- ROUND4(b, c, d, a, X[13], 21, 0x4e0811a1); /* 60 */
- ROUND4(a, b, c, d, X[4], 6, 0xf7537e82); /* 61 */
- ROUND4(d, a, b, c, X[11], 10, 0xbd3af235); /* 62 */
- ROUND4(c, d, a, b, X[2], 15, 0x2ad7d2bb); /* 63 */
- ROUND4(b, c, d, a, X[9], 21, 0xeb86d391); /* 64 */
-
- /* Compute the i^th intermediate hash value H^(i) */
- pMD5_CTX->HashValue[0] += a;
- pMD5_CTX->HashValue[1] += b;
- pMD5_CTX->HashValue[2] += c;
- pMD5_CTX->HashValue[3] += d;
-
- NdisZeroMemory(pMD5_CTX->Block, MD5_BLOCK_SIZE);
- pMD5_CTX->BlockLen = 0;
-} /* End of MD5_Hash */
-
-/*
-========================================================================
-Routine Description:
- The message is appended to block. If block size > 64 bytes, the MD5_Hash
-will be called.
-
-Arguments:
- pMD5_CTX Pointer to struct rt_md5_ctx_struc
- message Message context
- messageLen The length of message in bytes
-
-Return Value:
- None
-
-Note:
- None
-========================================================================
-*/
-void MD5_Append(struct rt_md5_ctx_struc *pMD5_CTX,
- IN const u8 Message[], u32 MessageLen)
-{
- u32 appendLen = 0;
- u32 diffLen = 0;
-
- while (appendLen != MessageLen) {
- diffLen = MessageLen - appendLen;
- if ((pMD5_CTX->BlockLen + diffLen) < MD5_BLOCK_SIZE) {
- NdisMoveMemory(pMD5_CTX->Block + pMD5_CTX->BlockLen,
- Message + appendLen, diffLen);
- pMD5_CTX->BlockLen += diffLen;
- appendLen += diffLen;
- } else {
- NdisMoveMemory(pMD5_CTX->Block + pMD5_CTX->BlockLen,
- Message + appendLen,
- MD5_BLOCK_SIZE - pMD5_CTX->BlockLen);
- appendLen += (MD5_BLOCK_SIZE - pMD5_CTX->BlockLen);
- pMD5_CTX->BlockLen = MD5_BLOCK_SIZE;
- MD5_Hash(pMD5_CTX);
- } /* End of if */
- } /* End of while */
- pMD5_CTX->MessageLen += MessageLen;
-} /* End of MD5_Append */
-
-/*
-========================================================================
-Routine Description:
- 1. Append bit 1 to end of the message
- 2. Append the length of message in rightmost 64 bits
- 3. Transform the Hash Value to digest message
-
-Arguments:
- pMD5_CTX Pointer to struct rt_md5_ctx_struc
-
-Return Value:
- digestMessage Digest message
-
-Note:
- None
-========================================================================
-*/
-void MD5_End(struct rt_md5_ctx_struc *pMD5_CTX, u8 DigestMessage[])
-{
- u32 index;
- u64 message_length_bits;
-
- /* append 1 bits to end of the message */
- NdisFillMemory(pMD5_CTX->Block + pMD5_CTX->BlockLen, 1, 0x80);
-
- /* 55 = 64 - 8 - 1: append 1 bit(1 byte) and message length (8 bytes) */
- if (pMD5_CTX->BlockLen > 55)
- MD5_Hash(pMD5_CTX);
- /* End of if */
-
- /* Append the length of message in rightmost 64 bits */
- message_length_bits = pMD5_CTX->MessageLen * 8;
- message_length_bits = cpu2le64(message_length_bits);
- NdisMoveMemory(&pMD5_CTX->Block[56], &message_length_bits, 8);
- MD5_Hash(pMD5_CTX);
-
- /* Return message digest, transform the u32 hash value to bytes */
- for (index = 0; index < 4; index++)
- pMD5_CTX->HashValue[index] =
- cpu2le32(pMD5_CTX->HashValue[index]);
- /* End of for */
- NdisMoveMemory(DigestMessage, pMD5_CTX->HashValue, MD5_DIGEST_SIZE);
-} /* End of MD5_End */
-
-/*
-========================================================================
-Routine Description:
- MD5 algorithm
-
-Arguments:
- message Message context
- messageLen The length of message in bytes
-
-Return Value:
- digestMessage Digest message
-
-Note:
- None
-========================================================================
-*/
-void RT_MD5(IN const u8 Message[],
- u32 MessageLen, u8 DigestMessage[])
-{
- struct rt_md5_ctx_struc md5_ctx;
-
- NdisZeroMemory(&md5_ctx, sizeof(struct rt_md5_ctx_struc));
- MD5_Init(&md5_ctx);
- MD5_Append(&md5_ctx, Message, MessageLen);
- MD5_End(&md5_ctx, DigestMessage);
-} /* End of RT_MD5 */
-
-#endif /* MD5_SUPPORT */
-
-/* End of crypt_md5.c */
diff --git a/drivers/staging/rt2860/common/crypt_sha2.c b/drivers/staging/rt2860/common/crypt_sha2.c
deleted file mode 100644
index fa83fb287fe5..000000000000
--- a/drivers/staging/rt2860/common/crypt_sha2.c
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************/
-
-#include "../crypt_sha2.h"
-
-/* Basic operations */
-#define SHR(x,n) (x >> n) /* SHR(x)^n, right shift n bits , x is w-bit word, 0 <= n <= w */
-#define ROTR(x,n,w) ((x >> n) | (x << (w - n))) /* ROTR(x)^n, circular right shift n bits , x is w-bit word, 0 <= n <= w */
-#define ROTL(x,n,w) ((x << n) | (x >> (w - n))) /* ROTL(x)^n, circular left shift n bits , x is w-bit word, 0 <= n <= w */
-#define ROTR32(x,n) ROTR(x,n,32) /* 32 bits word */
-#define ROTL32(x,n) ROTL(x,n,32) /* 32 bits word */
-
-/* Basic functions */
-#define Ch(x,y,z) ((x & y) ^ ((~x) & z))
-#define Maj(x,y,z) ((x & y) ^ (x & z) ^ (y & z))
-#define Parity(x,y,z) (x ^ y ^ z)
-
-#ifdef SHA1_SUPPORT
-/* SHA1 constants */
-#define SHA1_MASK 0x0000000f
-static const u32 SHA1_K[4] = {
- 0x5a827999UL, 0x6ed9eba1UL, 0x8f1bbcdcUL, 0xca62c1d6UL
-};
-
-static const u32 SHA1_DefaultHashValue[5] = {
- 0x67452301UL, 0xefcdab89UL, 0x98badcfeUL, 0x10325476UL, 0xc3d2e1f0UL
-};
-
-/*
-========================================================================
-Routine Description:
- Initial struct rt_sha1_ctx
-
-Arguments:
- pSHA_CTX Pointer to struct rt_sha1_ctx
-
-Return Value:
- None
-
-Note:
- None
-========================================================================
-*/
-void RT_SHA1_Init(struct rt_sha1_ctx *pSHA_CTX)
-{
- NdisMoveMemory(pSHA_CTX->HashValue, SHA1_DefaultHashValue,
- sizeof(SHA1_DefaultHashValue));
- NdisZeroMemory(pSHA_CTX->Block, SHA1_BLOCK_SIZE);
- pSHA_CTX->MessageLen = 0;
- pSHA_CTX->BlockLen = 0;
-} /* End of RT_SHA1_Init */
-
-/*
-========================================================================
-Routine Description:
- SHA1 computation for one block (512 bits)
-
-Arguments:
- pSHA_CTX Pointer to struct rt_sha1_ctx
-
-Return Value:
- None
-
-Note:
- None
-========================================================================
-*/
-void SHA1_Hash(struct rt_sha1_ctx *pSHA_CTX)
-{
- u32 W_i, t, s;
- u32 W[16];
- u32 a, b, c, d, e, T, f_t = 0;
-
- /* Prepare the message schedule, {W_i}, 0 < t < 15 */
- NdisMoveMemory(W, pSHA_CTX->Block, SHA1_BLOCK_SIZE);
- for (W_i = 0; W_i < 16; W_i++)
- W[W_i] = cpu2be32(W[W_i]); /* Endian Swap */
- /* End of for */
-
- /* SHA256 hash computation */
- /* Initialize the working variables */
- a = pSHA_CTX->HashValue[0];
- b = pSHA_CTX->HashValue[1];
- c = pSHA_CTX->HashValue[2];
- d = pSHA_CTX->HashValue[3];
- e = pSHA_CTX->HashValue[4];
-
- /* 80 rounds */
- for (t = 0; t < 80; t++) {
- s = t & SHA1_MASK;
- if (t > 15) { /* Prepare the message schedule, {W_i}, 16 < t < 79 */
- W[s] =
- (W[(s + 13) & SHA1_MASK]) ^ (W[(s + 8) & SHA1_MASK])
- ^ (W[(s + 2) & SHA1_MASK]) ^ W[s];
- W[s] = ROTL32(W[s], 1);
- } /* End of if */
- switch (t / 20) {
- case 0:
- f_t = Ch(b, c, d);
- break;
- case 1:
- f_t = Parity(b, c, d);
- break;
- case 2:
- f_t = Maj(b, c, d);
- break;
- case 3:
- f_t = Parity(b, c, d);
- break;
- } /* End of switch */
- T = ROTL32(a, 5) + f_t + e + SHA1_K[t / 20] + W[s];
- e = d;
- d = c;
- c = ROTL32(b, 30);
- b = a;
- a = T;
- } /* End of for */
-
- /* Compute the i^th intermediate hash value H^(i) */
- pSHA_CTX->HashValue[0] += a;
- pSHA_CTX->HashValue[1] += b;
- pSHA_CTX->HashValue[2] += c;
- pSHA_CTX->HashValue[3] += d;
- pSHA_CTX->HashValue[4] += e;
-
- NdisZeroMemory(pSHA_CTX->Block, SHA1_BLOCK_SIZE);
- pSHA_CTX->BlockLen = 0;
-} /* End of SHA1_Hash */
-
-/*
-========================================================================
-Routine Description:
- The message is appended to block. If block size > 64 bytes, the SHA1_Hash
-will be called.
-
-Arguments:
- pSHA_CTX Pointer to struct rt_sha1_ctx
- message Message context
- messageLen The length of message in bytes
-
-Return Value:
- None
-
-Note:
- None
-========================================================================
-*/
-void SHA1_Append(struct rt_sha1_ctx *pSHA_CTX,
- IN const u8 Message[], u32 MessageLen)
-{
- u32 appendLen = 0;
- u32 diffLen = 0;
-
- while (appendLen != MessageLen) {
- diffLen = MessageLen - appendLen;
- if ((pSHA_CTX->BlockLen + diffLen) < SHA1_BLOCK_SIZE) {
- NdisMoveMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen,
- Message + appendLen, diffLen);
- pSHA_CTX->BlockLen += diffLen;
- appendLen += diffLen;
- } else {
- NdisMoveMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen,
- Message + appendLen,
- SHA1_BLOCK_SIZE - pSHA_CTX->BlockLen);
- appendLen += (SHA1_BLOCK_SIZE - pSHA_CTX->BlockLen);
- pSHA_CTX->BlockLen = SHA1_BLOCK_SIZE;
- SHA1_Hash(pSHA_CTX);
- } /* End of if */
- } /* End of while */
- pSHA_CTX->MessageLen += MessageLen;
-} /* End of SHA1_Append */
-
-/*
-========================================================================
-Routine Description:
- 1. Append bit 1 to end of the message
- 2. Append the length of message in rightmost 64 bits
- 3. Transform the Hash Value to digest message
-
-Arguments:
- pSHA_CTX Pointer to struct rt_sha1_ctx
-
-Return Value:
- digestMessage Digest message
-
-Note:
- None
-========================================================================
-*/
-void SHA1_End(struct rt_sha1_ctx *pSHA_CTX, u8 DigestMessage[])
-{
- u32 index;
- u64 message_length_bits;
-
- /* Append bit 1 to end of the message */
- NdisFillMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen, 1, 0x80);
-
- /* 55 = 64 - 8 - 1: append 1 bit(1 byte) and message length (8 bytes) */
- if (pSHA_CTX->BlockLen > 55)
- SHA1_Hash(pSHA_CTX);
- /* End of if */
-
- /* Append the length of message in rightmost 64 bits */
- message_length_bits = pSHA_CTX->MessageLen * 8;
- message_length_bits = cpu2be64(message_length_bits);
- NdisMoveMemory(&pSHA_CTX->Block[56], &message_length_bits, 8);
- SHA1_Hash(pSHA_CTX);
-
- /* Return message digest, transform the u32 hash value to bytes */
- for (index = 0; index < 5; index++)
- pSHA_CTX->HashValue[index] =
- cpu2be32(pSHA_CTX->HashValue[index]);
- /* End of for */
- NdisMoveMemory(DigestMessage, pSHA_CTX->HashValue, SHA1_DIGEST_SIZE);
-} /* End of SHA1_End */
-
-/*
-========================================================================
-Routine Description:
- SHA1 algorithm
-
-Arguments:
- message Message context
- messageLen The length of message in bytes
-
-Return Value:
- digestMessage Digest message
-
-Note:
- None
-========================================================================
-*/
-void RT_SHA1(IN const u8 Message[],
- u32 MessageLen, u8 DigestMessage[])
-{
-
- struct rt_sha1_ctx sha_ctx;
-
- NdisZeroMemory(&sha_ctx, sizeof(struct rt_sha1_ctx));
- RT_SHA1_Init(&sha_ctx);
- SHA1_Append(&sha_ctx, Message, MessageLen);
- SHA1_End(&sha_ctx, DigestMessage);
-} /* End of RT_SHA1 */
-#endif /* SHA1_SUPPORT */
-
-/* End of crypt_sha2.c */
diff --git a/drivers/staging/rt2860/common/dfs.c b/drivers/staging/rt2860/common/dfs.c
deleted file mode 100644
index 71cbb2665243..000000000000
--- a/drivers/staging/rt2860/common/dfs.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-
- Module Name:
- ap_dfs.c
-
- Abstract:
- Support DFS function.
-
- Revision History:
- Who When What
- -------- ---------- ----------------------------------------------
-*/
-
-#include "../rt_config.h"
-
-/*
- ========================================================================
-
- Routine Description:
- Radar channel check routine
-
- Arguments:
- pAd Pointer to our adapter
-
- Return Value:
- TRUE need to do radar detect
- FALSE need not to do radar detect
-
- ========================================================================
-*/
-BOOLEAN RadarChannelCheck(struct rt_rtmp_adapter *pAd, u8 Ch)
-{
- int i;
- BOOLEAN result = FALSE;
-
- for (i = 0; i < pAd->ChannelListNum; i++) {
- if (Ch == pAd->ChannelList[i].Channel) {
- result = pAd->ChannelList[i].DfsReq;
- break;
- }
- }
-
- return result;
-}
diff --git a/drivers/staging/rt2860/common/ee_efuse.c b/drivers/staging/rt2860/common/ee_efuse.c
deleted file mode 100644
index fed0ba452271..000000000000
--- a/drivers/staging/rt2860/common/ee_efuse.c
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-
- Module Name:
- ee_efuse.c
-
- Abstract:
- Miniport generic portion header file
-
- Revision History:
- Who When What
- -------- ---------- ----------------------------------------------
-*/
-
-#include "../rt_config.h"
-
-#define EFUSE_USAGE_MAP_START 0x2d0
-#define EFUSE_USAGE_MAP_END 0x2fc
-#define EFUSE_USAGE_MAP_SIZE 45
-
-#define EFUSE_EEPROM_DEFULT_FILE "RT30xxEEPROM.bin"
-#define MAX_EEPROM_BIN_FILE_SIZE 1024
-
-#define EFUSE_TAG 0x2fe
-
-typedef union _EFUSE_CTRL_STRUC {
- struct {
- u32 EFSROM_AOUT:6;
- u32 EFSROM_MODE:2;
- u32 EFSROM_LDO_OFF_TIME:6;
- u32 EFSROM_LDO_ON_TIME:2;
- u32 EFSROM_AIN:10;
- u32 RESERVED:4;
- u32 EFSROM_KICK:1;
- u32 SEL_EFUSE:1;
- } field;
- u32 word;
-} EFUSE_CTRL_STRUC, *PEFUSE_CTRL_STRUC;
-
-/*
-========================================================================
-
- Routine Description:
-
- Arguments:
-
- Return Value:
-
- Note:
-
-========================================================================
-*/
-u8 eFuseReadRegisters(struct rt_rtmp_adapter *pAd,
- u16 Offset, u16 Length, u16 * pData)
-{
- EFUSE_CTRL_STRUC eFuseCtrlStruc;
- int i;
- u16 efuseDataOffset;
- u32 data;
-
- RTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrlStruc.word);
-
- /*Step0. Write 10-bit of address to EFSROM_AIN (0x580, bit25:bit16). The address must be 16-byte alignment. */
- /*Use the eeprom logical address and covert to address to block number */
- eFuseCtrlStruc.field.EFSROM_AIN = Offset & 0xfff0;
-
- /*Step1. Write EFSROM_MODE (0x580, bit7:bit6) to 0. */
- eFuseCtrlStruc.field.EFSROM_MODE = 0;
-
- /*Step2. Write EFSROM_KICK (0x580, bit30) to 1 to kick-off physical read procedure. */
- eFuseCtrlStruc.field.EFSROM_KICK = 1;
-
- NdisMoveMemory(&data, &eFuseCtrlStruc, 4);
- RTMP_IO_WRITE32(pAd, EFUSE_CTRL, data);
-
- /*Step3. Polling EFSROM_KICK(0x580, bit30) until it become 0 again. */
- i = 0;
- while (i < 500) {
- /*rtmp.HwMemoryReadDword(EFUSE_CTRL, (DWORD *) &eFuseCtrlStruc, 4); */
- RTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrlStruc.word);
- if (eFuseCtrlStruc.field.EFSROM_KICK == 0) {
- break;
- }
- RTMPusecDelay(2);
- i++;
- }
-
- /*if EFSROM_AOUT is not found in physical address, write 0xffff */
- if (eFuseCtrlStruc.field.EFSROM_AOUT == 0x3f) {
- for (i = 0; i < Length / 2; i++)
- *(pData + 2 * i) = 0xffff;
- } else {
- /*Step4. Read 16-byte of data from EFUSE_DATA0-3 (0x590-0x59C) */
- efuseDataOffset = EFUSE_DATA3 - (Offset & 0xC);
- /*data hold 4 bytes data. */
- /*In RTMP_IO_READ32 will automatically execute 32-bytes swapping */
- RTMP_IO_READ32(pAd, efuseDataOffset, &data);
- /*Decide the upper 2 bytes or the bottom 2 bytes. */
- /* Little-endian S | S Big-endian */
- /* addr 3 2 1 0 | 0 1 2 3 */
- /* Ori-V D C B A | A B C D */
- /*After swapping */
- /* D C B A | D C B A */
- /*Return 2-bytes */
- /*The return byte statrs from S. Therefore, the little-endian will return BA, the Big-endian will return DC. */
- /*For returning the bottom 2 bytes, the Big-endian should shift right 2-bytes. */
- data = data >> (8 * (Offset & 0x3));
-
- NdisMoveMemory(pData, &data, Length);
- }
-
- return (u8)eFuseCtrlStruc.field.EFSROM_AOUT;
-
-}
-
-/*
-========================================================================
-
- Routine Description:
-
- Arguments:
-
- Return Value:
-
- Note:
-
-========================================================================
-*/
-void eFusePhysicalReadRegisters(struct rt_rtmp_adapter *pAd,
- u16 Offset,
- u16 Length, u16 * pData)
-{
- EFUSE_CTRL_STRUC eFuseCtrlStruc;
- int i;
- u16 efuseDataOffset;
- u32 data;
-
- RTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrlStruc.word);
-
- /*Step0. Write 10-bit of address to EFSROM_AIN (0x580, bit25:bit16). The address must be 16-byte alignment. */
- eFuseCtrlStruc.field.EFSROM_AIN = Offset & 0xfff0;
-
- /*Step1. Write EFSROM_MODE (0x580, bit7:bit6) to 1. */
- /*Read in physical view */
- eFuseCtrlStruc.field.EFSROM_MODE = 1;
-
- /*Step2. Write EFSROM_KICK (0x580, bit30) to 1 to kick-off physical read procedure. */
- eFuseCtrlStruc.field.EFSROM_KICK = 1;
-
- NdisMoveMemory(&data, &eFuseCtrlStruc, 4);
- RTMP_IO_WRITE32(pAd, EFUSE_CTRL, data);
-
- /*Step3. Polling EFSROM_KICK(0x580, bit30) until it become 0 again. */
- i = 0;
- while (i < 500) {
- RTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrlStruc.word);
- if (eFuseCtrlStruc.field.EFSROM_KICK == 0)
- break;
- RTMPusecDelay(2);
- i++;
- }
-
- /*Step4. Read 16-byte of data from EFUSE_DATA0-3 (0x59C-0x590) */
- /*Because the size of each EFUSE_DATA is 4 Bytes, the size of address of each is 2 bits. */
- /*The previous 2 bits is the EFUSE_DATA number, the last 2 bits is used to decide which bytes */
- /*Decide which EFUSE_DATA to read */
- /*590:F E D C */
- /*594:B A 9 8 */
- /*598:7 6 5 4 */
- /*59C:3 2 1 0 */
- efuseDataOffset = EFUSE_DATA3 - (Offset & 0xC);
-
- RTMP_IO_READ32(pAd, efuseDataOffset, &data);
-
- data = data >> (8 * (Offset & 0x3));
-
- NdisMoveMemory(pData, &data, Length);
-
-}
-
-/*
-========================================================================
-
- Routine Description:
-
- Arguments:
-
- Return Value:
-
- Note:
-
-========================================================================
-*/
-static void eFuseReadPhysical(struct rt_rtmp_adapter *pAd,
- u16 *lpInBuffer,
- unsigned long nInBufferSize,
- u16 *lpOutBuffer, unsigned long nOutBufferSize)
-{
- u16 *pInBuf = (u16 *) lpInBuffer;
- u16 *pOutBuf = (u16 *) lpOutBuffer;
-
- u16 Offset = pInBuf[0]; /*addr */
- u16 Length = pInBuf[1]; /*length */
- int i;
-
- for (i = 0; i < Length; i += 2) {
- eFusePhysicalReadRegisters(pAd, Offset + i, 2, &pOutBuf[i / 2]);
- }
-}
-
-/*
-========================================================================
-
- Routine Description:
-
- Arguments:
-
- Return Value:
-
- Note:
-
-========================================================================
-*/
-int set_eFuseGetFreeBlockCount_Proc(struct rt_rtmp_adapter *pAd, char *arg)
-{
- u16 i;
- u16 LogicalAddress;
- u16 efusefreenum = 0;
- if (!pAd->bUseEfuse)
- return FALSE;
- for (i = EFUSE_USAGE_MAP_START; i <= EFUSE_USAGE_MAP_END; i += 2) {
- eFusePhysicalReadRegisters(pAd, i, 2, &LogicalAddress);
- if ((LogicalAddress & 0xff) == 0) {
- efusefreenum = (u8)(EFUSE_USAGE_MAP_END - i + 1);
- break;
- } else if (((LogicalAddress >> 8) & 0xff) == 0) {
- efusefreenum = (u8)(EFUSE_USAGE_MAP_END - i);
- break;
- }
-
- if (i == EFUSE_USAGE_MAP_END)
- efusefreenum = 0;
- }
- printk(KERN_DEBUG "efuseFreeNumber is %d\n", efusefreenum);
- return TRUE;
-}
-
-int set_eFusedump_Proc(struct rt_rtmp_adapter *pAd, char *arg)
-{
- u16 InBuf[3];
- int i = 0;
- if (!pAd->bUseEfuse)
- return FALSE;
-
- printk(KERN_DEBUG "Block 0: ");
-
- for (i = 0; i < EFUSE_USAGE_MAP_END / 2; i++) {
- InBuf[0] = 2 * i;
- InBuf[1] = 2;
- InBuf[2] = 0x0;
-
- eFuseReadPhysical(pAd, &InBuf[0], 4, &InBuf[2], 2);
- if (i && i % 4 == 0) {
- printk(KERN_CONT "\n");
- printk(KERN_DEBUG "Block %x:", i / 8);
- }
- printk(KERN_CONT "%04x ", InBuf[2]);
- }
- printk(KERN_CONT "\n");
-
- return TRUE;
-}
-
-int rtmp_ee_efuse_read16(struct rt_rtmp_adapter *pAd,
- u16 Offset, u16 * pValue)
-{
- eFuseReadRegisters(pAd, Offset, 2, pValue);
- return (*pValue);
-}
-
-int RtmpEfuseSupportCheck(struct rt_rtmp_adapter *pAd)
-{
- u16 value;
-
- if (IS_RT30xx(pAd)) {
- eFusePhysicalReadRegisters(pAd, EFUSE_TAG, 2, &value);
- pAd->EFuseTag = (value & 0xff);
- }
- return 0;
-}
-
-void eFuseGetFreeBlockCount(struct rt_rtmp_adapter *pAd, u32 *EfuseFreeBlock)
-{
- u16 i;
- u16 LogicalAddress;
- if (!pAd->bUseEfuse) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("eFuseGetFreeBlockCount Only supports efuse Mode\n"));
- return;
- }
- for (i = EFUSE_USAGE_MAP_START; i <= EFUSE_USAGE_MAP_END; i += 2) {
- eFusePhysicalReadRegisters(pAd, i, 2, &LogicalAddress);
- if ((LogicalAddress & 0xff) == 0) {
- *EfuseFreeBlock = (u8)(EFUSE_USAGE_MAP_END - i + 1);
- break;
- } else if (((LogicalAddress >> 8) & 0xff) == 0) {
- *EfuseFreeBlock = (u8)(EFUSE_USAGE_MAP_END - i);
- break;
- }
-
- if (i == EFUSE_USAGE_MAP_END)
- *EfuseFreeBlock = 0;
- }
- DBGPRINT(RT_DEBUG_TRACE,
- ("eFuseGetFreeBlockCount is 0x%x\n", *EfuseFreeBlock));
-}
-
-int eFuse_init(struct rt_rtmp_adapter *pAd)
-{
- u32 EfuseFreeBlock = 0;
- DBGPRINT(RT_DEBUG_ERROR,
- ("NVM is Efuse and its size =%x[%x-%x] \n",
- EFUSE_USAGE_MAP_SIZE, EFUSE_USAGE_MAP_START,
- EFUSE_USAGE_MAP_END));
- eFuseGetFreeBlockCount(pAd, &EfuseFreeBlock);
-
- return 0;
-}
diff --git a/drivers/staging/rt2860/common/ee_prom.c b/drivers/staging/rt2860/common/ee_prom.c
deleted file mode 100644
index 2083740a844b..000000000000
--- a/drivers/staging/rt2860/common/ee_prom.c
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-
- Module Name:
- ee_prom.c
-
- Abstract:
- Miniport generic portion header file
-
- Revision History:
- Who When What
- -------- ---------- ----------------------------------------------
-*/
-
-#include "../rt_config.h"
-
-/* IRQL = PASSIVE_LEVEL */
-static inline void RaiseClock(struct rt_rtmp_adapter *pAd, u32 * x)
-{
- *x = *x | EESK;
- RTMP_IO_WRITE32(pAd, E2PROM_CSR, *x);
- RTMPusecDelay(1); /* Max frequency = 1MHz in Spec. definition */
-}
-
-/* IRQL = PASSIVE_LEVEL */
-static inline void LowerClock(struct rt_rtmp_adapter *pAd, u32 * x)
-{
- *x = *x & ~EESK;
- RTMP_IO_WRITE32(pAd, E2PROM_CSR, *x);
- RTMPusecDelay(1);
-}
-
-/* IRQL = PASSIVE_LEVEL */
-static inline u16 ShiftInBits(struct rt_rtmp_adapter *pAd)
-{
- u32 x, i;
- u16 data = 0;
-
- RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
-
- x &= ~(EEDO | EEDI);
-
- for (i = 0; i < 16; i++) {
- data = data << 1;
- RaiseClock(pAd, &x);
-
- RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
- LowerClock(pAd, &x); /*prevent read failed */
-
- x &= ~(EEDI);
- if (x & EEDO)
- data |= 1;
- }
-
- return data;
-}
-
-/* IRQL = PASSIVE_LEVEL */
-static inline void ShiftOutBits(struct rt_rtmp_adapter *pAd,
- u16 data, u16 count)
-{
- u32 x, mask;
-
- mask = 0x01 << (count - 1);
- RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
-
- x &= ~(EEDO | EEDI);
-
- do {
- x &= ~EEDI;
- if (data & mask)
- x |= EEDI;
-
- RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
-
- RaiseClock(pAd, &x);
- LowerClock(pAd, &x);
-
- mask = mask >> 1;
- } while (mask);
-
- x &= ~EEDI;
- RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
-}
-
-/* IRQL = PASSIVE_LEVEL */
-static inline void EEpromCleanup(struct rt_rtmp_adapter *pAd)
-{
- u32 x;
-
- RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
-
- x &= ~(EECS | EEDI);
- RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
-
- RaiseClock(pAd, &x);
- LowerClock(pAd, &x);
-}
-
-static inline void EWEN(struct rt_rtmp_adapter *pAd)
-{
- u32 x;
-
- /* reset bits and set EECS */
- RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
- x &= ~(EEDI | EEDO | EESK);
- x |= EECS;
- RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
-
- /* kick a pulse */
- RaiseClock(pAd, &x);
- LowerClock(pAd, &x);
-
- /* output the read_opcode and six pulse in that order */
- ShiftOutBits(pAd, EEPROM_EWEN_OPCODE, 5);
- ShiftOutBits(pAd, 0, 6);
-
- EEpromCleanup(pAd);
-}
-
-static inline void EWDS(struct rt_rtmp_adapter *pAd)
-{
- u32 x;
-
- /* reset bits and set EECS */
- RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
- x &= ~(EEDI | EEDO | EESK);
- x |= EECS;
- RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
-
- /* kick a pulse */
- RaiseClock(pAd, &x);
- LowerClock(pAd, &x);
-
- /* output the read_opcode and six pulse in that order */
- ShiftOutBits(pAd, EEPROM_EWDS_OPCODE, 5);
- ShiftOutBits(pAd, 0, 6);
-
- EEpromCleanup(pAd);
-}
-
-/* IRQL = PASSIVE_LEVEL */
-int rtmp_ee_prom_read16(struct rt_rtmp_adapter *pAd,
- u16 Offset, u16 * pValue)
-{
- u32 x;
- u16 data;
-
- Offset /= 2;
- /* reset bits and set EECS */
- RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
- x &= ~(EEDI | EEDO | EESK);
- x |= EECS;
- RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
-
- /* patch can not access e-Fuse issue */
- if (!(IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))) {
- /* kick a pulse */
- RaiseClock(pAd, &x);
- LowerClock(pAd, &x);
- }
- /* output the read_opcode and register number in that order */
- ShiftOutBits(pAd, EEPROM_READ_OPCODE, 3);
- ShiftOutBits(pAd, Offset, pAd->EEPROMAddressNum);
-
- /* Now read the data (16 bits) in from the selected EEPROM word */
- data = ShiftInBits(pAd);
-
- EEpromCleanup(pAd);
-
- *pValue = data;
-
- return NDIS_STATUS_SUCCESS;
-}
diff --git a/drivers/staging/rt2860/common/eeprom.c b/drivers/staging/rt2860/common/eeprom.c
deleted file mode 100644
index 94670076d32b..000000000000
--- a/drivers/staging/rt2860/common/eeprom.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-
- Module Name:
- eeprom.c
-
- Abstract:
-
- Revision History:
- Who When What
- -------- ---------- ----------------------------------------------
- Name Date Modification logs
-*/
-#include "../rt_config.h"
-
-int RtmpChipOpsEepromHook(struct rt_rtmp_adapter *pAd, int infType)
-{
- struct rt_rtmp_chip_op *pChipOps = &pAd->chipOps;
-#ifdef RT30xx
-#ifdef RTMP_EFUSE_SUPPORT
- u32 eFuseCtrl, MacCsr0;
- int index;
-
- index = 0;
- do {
- RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0);
- pAd->MACVersion = MacCsr0;
-
- if ((pAd->MACVersion != 0x00)
- && (pAd->MACVersion != 0xFFFFFFFF))
- break;
-
- RTMPusecDelay(10);
- } while (index++ < 100);
-
- pAd->bUseEfuse = FALSE;
- RTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrl);
- pAd->bUseEfuse = ((eFuseCtrl & 0x80000000) == 0x80000000) ? 1 : 0;
- if (pAd->bUseEfuse) {
- pChipOps->eeinit = eFuse_init;
- pChipOps->eeread = rtmp_ee_efuse_read16;
- return 0;
- } else
- DBGPRINT(RT_DEBUG_TRACE, ("NVM is EEPROM\n"));
-#endif /* RTMP_EFUSE_SUPPORT // */
-#endif /* RT30xx // */
-
- switch (infType) {
-#ifdef RTMP_PCI_SUPPORT
- case RTMP_DEV_INF_PCI:
- pChipOps->eeinit = NULL;
- pChipOps->eeread = rtmp_ee_prom_read16;
- break;
-#endif /* RTMP_PCI_SUPPORT // */
-#ifdef RTMP_USB_SUPPORT
- case RTMP_DEV_INF_USB:
- pChipOps->eeinit = NULL;
- pChipOps->eeread = RTUSBReadEEPROM16;
- break;
-#endif /* RTMP_USB_SUPPORT // */
-
- default:
- DBGPRINT(RT_DEBUG_ERROR, ("RtmpChipOpsEepromHook() failed!\n"));
- break;
- }
-
- return 0;
-}
diff --git a/drivers/staging/rt2860/common/mlme.c b/drivers/staging/rt2860/common/mlme.c
deleted file mode 100644
index e48eac0f3a29..000000000000
--- a/drivers/staging/rt2860/common/mlme.c
+++ /dev/null
@@ -1,6068 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-
- Module Name:
- mlme.c
-
- Abstract:
-
- Revision History:
- Who When What
- -------- ---------- ----------------------------------------------
- John Chang 2004-08-25 Modify from RT2500 code base
- John Chang 2004-09-06 modified for RT2600
-*/
-
-#include "../rt_config.h"
-#include <stdarg.h>
-#include <linux/kernel.h>
-
-u8 CISCO_OUI[] = { 0x00, 0x40, 0x96 };
-
-u8 WPA_OUI[] = { 0x00, 0x50, 0xf2, 0x01 };
-u8 RSN_OUI[] = { 0x00, 0x0f, 0xac };
-u8 WME_INFO_ELEM[] = { 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01 };
-u8 WME_PARM_ELEM[] = { 0x00, 0x50, 0xf2, 0x02, 0x01, 0x01 };
-u8 Ccx2QosInfo[] = { 0x00, 0x40, 0x96, 0x04 };
-u8 RALINK_OUI[] = { 0x00, 0x0c, 0x43 };
-u8 BROADCOM_OUI[] = { 0x00, 0x90, 0x4c };
-u8 WPS_OUI[] = { 0x00, 0x50, 0xf2, 0x04 };
-u8 PRE_N_HT_OUI[] = { 0x00, 0x90, 0x4c };
-
-u8 RateSwitchTable[] = {
-/* Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) */
- 0x11, 0x00, 0, 0, 0, /* Initial used item after association */
- 0x00, 0x00, 0, 40, 101,
- 0x01, 0x00, 1, 40, 50,
- 0x02, 0x00, 2, 35, 45,
- 0x03, 0x00, 3, 20, 45,
- 0x04, 0x21, 0, 30, 50,
- 0x05, 0x21, 1, 20, 50,
- 0x06, 0x21, 2, 20, 50,
- 0x07, 0x21, 3, 15, 50,
- 0x08, 0x21, 4, 15, 30,
- 0x09, 0x21, 5, 10, 25,
- 0x0a, 0x21, 6, 8, 25,
- 0x0b, 0x21, 7, 8, 25,
- 0x0c, 0x20, 12, 15, 30,
- 0x0d, 0x20, 13, 8, 20,
- 0x0e, 0x20, 14, 8, 20,
- 0x0f, 0x20, 15, 8, 25,
- 0x10, 0x22, 15, 8, 25,
- 0x11, 0x00, 0, 0, 0,
- 0x12, 0x00, 0, 0, 0,
- 0x13, 0x00, 0, 0, 0,
- 0x14, 0x00, 0, 0, 0,
- 0x15, 0x00, 0, 0, 0,
- 0x16, 0x00, 0, 0, 0,
- 0x17, 0x00, 0, 0, 0,
- 0x18, 0x00, 0, 0, 0,
- 0x19, 0x00, 0, 0, 0,
- 0x1a, 0x00, 0, 0, 0,
- 0x1b, 0x00, 0, 0, 0,
- 0x1c, 0x00, 0, 0, 0,
- 0x1d, 0x00, 0, 0, 0,
- 0x1e, 0x00, 0, 0, 0,
- 0x1f, 0x00, 0, 0, 0,
-};
-
-u8 RateSwitchTable11B[] = {
-/* Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) */
- 0x04, 0x03, 0, 0, 0, /* Initial used item after association */
- 0x00, 0x00, 0, 40, 101,
- 0x01, 0x00, 1, 40, 50,
- 0x02, 0x00, 2, 35, 45,
- 0x03, 0x00, 3, 20, 45,
-};
-
-u8 RateSwitchTable11BG[] = {
-/* Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) */
- 0x0a, 0x00, 0, 0, 0, /* Initial used item after association */
- 0x00, 0x00, 0, 40, 101,
- 0x01, 0x00, 1, 40, 50,
- 0x02, 0x00, 2, 35, 45,
- 0x03, 0x00, 3, 20, 45,
- 0x04, 0x10, 2, 20, 35,
- 0x05, 0x10, 3, 16, 35,
- 0x06, 0x10, 4, 10, 25,
- 0x07, 0x10, 5, 16, 25,
- 0x08, 0x10, 6, 10, 25,
- 0x09, 0x10, 7, 10, 13,
-};
-
-u8 RateSwitchTable11G[] = {
-/* Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) */
- 0x08, 0x00, 0, 0, 0, /* Initial used item after association */
- 0x00, 0x10, 0, 20, 101,
- 0x01, 0x10, 1, 20, 35,
- 0x02, 0x10, 2, 20, 35,
- 0x03, 0x10, 3, 16, 35,
- 0x04, 0x10, 4, 10, 25,
- 0x05, 0x10, 5, 16, 25,
- 0x06, 0x10, 6, 10, 25,
- 0x07, 0x10, 7, 10, 13,
-};
-
-u8 RateSwitchTable11N1S[] = {
-/* Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) */
- 0x0c, 0x0a, 0, 0, 0, /* Initial used item after association */
- 0x00, 0x00, 0, 40, 101,
- 0x01, 0x00, 1, 40, 50,
- 0x02, 0x00, 2, 25, 45,
- 0x03, 0x21, 0, 20, 35,
- 0x04, 0x21, 1, 20, 35,
- 0x05, 0x21, 2, 20, 35,
- 0x06, 0x21, 3, 15, 35,
- 0x07, 0x21, 4, 15, 30,
- 0x08, 0x21, 5, 10, 25,
- 0x09, 0x21, 6, 8, 14,
- 0x0a, 0x21, 7, 8, 14,
- 0x0b, 0x23, 7, 8, 14,
-};
-
-u8 RateSwitchTable11N2S[] = {
-/* Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) */
- 0x0e, 0x0c, 0, 0, 0, /* Initial used item after association */
- 0x00, 0x00, 0, 40, 101,
- 0x01, 0x00, 1, 40, 50,
- 0x02, 0x00, 2, 25, 45,
- 0x03, 0x21, 0, 20, 35,
- 0x04, 0x21, 1, 20, 35,
- 0x05, 0x21, 2, 20, 35,
- 0x06, 0x21, 3, 15, 35,
- 0x07, 0x21, 4, 15, 30,
- 0x08, 0x20, 11, 15, 30,
- 0x09, 0x20, 12, 15, 30,
- 0x0a, 0x20, 13, 8, 20,
- 0x0b, 0x20, 14, 8, 20,
- 0x0c, 0x20, 15, 8, 25,
- 0x0d, 0x22, 15, 8, 15,
-};
-
-u8 RateSwitchTable11N3S[] = {
-/* Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) */
- 0x0b, 0x00, 0, 0, 0, /* 0x0a, 0x00, 0, 0, 0, // Initial used item after association */
- 0x00, 0x21, 0, 30, 101,
- 0x01, 0x21, 1, 20, 50,
- 0x02, 0x21, 2, 20, 50,
- 0x03, 0x21, 3, 15, 50,
- 0x04, 0x21, 4, 15, 30,
- 0x05, 0x20, 11, 15, 30, /* Required by System-Alan @ 20080812 */
- 0x06, 0x20, 12, 15, 30, /* 0x05, 0x20, 12, 15, 30, */
- 0x07, 0x20, 13, 8, 20, /* 0x06, 0x20, 13, 8, 20, */
- 0x08, 0x20, 14, 8, 20, /* 0x07, 0x20, 14, 8, 20, */
- 0x09, 0x20, 15, 8, 25, /* 0x08, 0x20, 15, 8, 25, */
- 0x0a, 0x22, 15, 8, 25, /* 0x09, 0x22, 15, 8, 25, */
-};
-
-u8 RateSwitchTable11N2SForABand[] = {
-/* Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) */
- 0x0b, 0x09, 0, 0, 0, /* Initial used item after association */
- 0x00, 0x21, 0, 30, 101,
- 0x01, 0x21, 1, 20, 50,
- 0x02, 0x21, 2, 20, 50,
- 0x03, 0x21, 3, 15, 50,
- 0x04, 0x21, 4, 15, 30,
- 0x05, 0x21, 5, 15, 30,
- 0x06, 0x20, 12, 15, 30,
- 0x07, 0x20, 13, 8, 20,
- 0x08, 0x20, 14, 8, 20,
- 0x09, 0x20, 15, 8, 25,
- 0x0a, 0x22, 15, 8, 25,
-};
-
-u8 RateSwitchTable11N3SForABand[] = { /* 3*3 */
-/* Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) */
- 0x0b, 0x09, 0, 0, 0, /* Initial used item after association */
- 0x00, 0x21, 0, 30, 101,
- 0x01, 0x21, 1, 20, 50,
- 0x02, 0x21, 2, 20, 50,
- 0x03, 0x21, 3, 15, 50,
- 0x04, 0x21, 4, 15, 30,
- 0x05, 0x21, 5, 15, 30,
- 0x06, 0x20, 12, 15, 30,
- 0x07, 0x20, 13, 8, 20,
- 0x08, 0x20, 14, 8, 20,
- 0x09, 0x20, 15, 8, 25,
- 0x0a, 0x22, 15, 8, 25,
-};
-
-u8 RateSwitchTable11BGN1S[] = {
-/* Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) */
- 0x0c, 0x0a, 0, 0, 0, /* Initial used item after association */
- 0x00, 0x00, 0, 40, 101,
- 0x01, 0x00, 1, 40, 50,
- 0x02, 0x00, 2, 25, 45,
- 0x03, 0x21, 0, 20, 35,
- 0x04, 0x21, 1, 20, 35,
- 0x05, 0x21, 2, 20, 35,
- 0x06, 0x21, 3, 15, 35,
- 0x07, 0x21, 4, 15, 30,
- 0x08, 0x21, 5, 10, 25,
- 0x09, 0x21, 6, 8, 14,
- 0x0a, 0x21, 7, 8, 14,
- 0x0b, 0x23, 7, 8, 14,
-};
-
-u8 RateSwitchTable11BGN2S[] = {
-/* Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) */
- 0x0e, 0x0c, 0, 0, 0, /* Initial used item after association */
- 0x00, 0x00, 0, 40, 101,
- 0x01, 0x00, 1, 40, 50,
- 0x02, 0x00, 2, 25, 45,
- 0x03, 0x21, 0, 20, 35,
- 0x04, 0x21, 1, 20, 35,
- 0x05, 0x21, 2, 20, 35,
- 0x06, 0x21, 3, 15, 35,
- 0x07, 0x21, 4, 15, 30,
- 0x08, 0x20, 11, 15, 30,
- 0x09, 0x20, 12, 15, 30,
- 0x0a, 0x20, 13, 8, 20,
- 0x0b, 0x20, 14, 8, 20,
- 0x0c, 0x20, 15, 8, 25,
- 0x0d, 0x22, 15, 8, 15,
-};
-
-u8 RateSwitchTable11BGN3S[] = { /* 3*3 */
-/* Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) */
- 0x0a, 0x00, 0, 0, 0, /* Initial used item after association */
- 0x00, 0x21, 0, 30, 101, /*50 */
- 0x01, 0x21, 1, 20, 50,
- 0x02, 0x21, 2, 20, 50,
- 0x03, 0x21, 3, 20, 50,
- 0x04, 0x21, 4, 15, 50,
- 0x05, 0x20, 20, 15, 30,
- 0x06, 0x20, 21, 8, 20,
- 0x07, 0x20, 22, 8, 20,
- 0x08, 0x20, 23, 8, 25,
- 0x09, 0x22, 23, 8, 25,
-};
-
-u8 RateSwitchTable11BGN2SForABand[] = {
-/* Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) */
- 0x0b, 0x09, 0, 0, 0, /* Initial used item after association */
- 0x00, 0x21, 0, 30, 101, /*50 */
- 0x01, 0x21, 1, 20, 50,
- 0x02, 0x21, 2, 20, 50,
- 0x03, 0x21, 3, 15, 50,
- 0x04, 0x21, 4, 15, 30,
- 0x05, 0x21, 5, 15, 30,
- 0x06, 0x20, 12, 15, 30,
- 0x07, 0x20, 13, 8, 20,
- 0x08, 0x20, 14, 8, 20,
- 0x09, 0x20, 15, 8, 25,
- 0x0a, 0x22, 15, 8, 25,
-};
-
-u8 RateSwitchTable11BGN3SForABand[] = { /* 3*3 */
-/* Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) */
- 0x0c, 0x09, 0, 0, 0, /* Initial used item after association */
- 0x00, 0x21, 0, 30, 101, /*50 */
- 0x01, 0x21, 1, 20, 50,
- 0x02, 0x21, 2, 20, 50,
- 0x03, 0x21, 3, 15, 50,
- 0x04, 0x21, 4, 15, 30,
- 0x05, 0x21, 5, 15, 30,
- 0x06, 0x21, 12, 15, 30,
- 0x07, 0x20, 20, 15, 30,
- 0x08, 0x20, 21, 8, 20,
- 0x09, 0x20, 22, 8, 20,
- 0x0a, 0x20, 23, 8, 25,
- 0x0b, 0x22, 23, 8, 25,
-};
-
-extern u8 OfdmRateToRxwiMCS[];
-/* since RT61 has better RX sensibility, we have to limit TX ACK rate not to exceed our normal data TX rate. */
-/* otherwise the WLAN peer may not be able to receive the ACK thus downgrade its data TX rate */
-unsigned long BasicRateMask[12] =
- { 0xfffff001 /* 1-Mbps */ , 0xfffff003 /* 2 Mbps */ , 0xfffff007 /* 5.5 */ ,
-0xfffff00f /* 11 */ ,
- 0xfffff01f /* 6 */ , 0xfffff03f /* 9 */ , 0xfffff07f /* 12 */ ,
- 0xfffff0ff /* 18 */ ,
- 0xfffff1ff /* 24 */ , 0xfffff3ff /* 36 */ , 0xfffff7ff /* 48 */ ,
- 0xffffffff /* 54 */
-};
-
-u8 BROADCAST_ADDR[MAC_ADDR_LEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
-u8 ZERO_MAC_ADDR[MAC_ADDR_LEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
-
-/* e.g. RssiSafeLevelForTxRate[RATE_36]" means if the current RSSI is greater than */
-/* this value, then it's quaranteed capable of operating in 36 mbps TX rate in */
-/* clean environment. */
-/* TxRate: 1 2 5.5 11 6 9 12 18 24 36 48 54 72 100 */
-char RssiSafeLevelForTxRate[] =
- { -92, -91, -90, -87, -88, -86, -85, -83, -81, -78, -72, -71, -40, -40 };
-
-u8 RateIdToMbps[] = { 1, 2, 5, 11, 6, 9, 12, 18, 24, 36, 48, 54, 72, 100 };
-u16 RateIdTo500Kbps[] =
- { 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108, 144, 200 };
-
-u8 SsidIe = IE_SSID;
-u8 SupRateIe = IE_SUPP_RATES;
-u8 ExtRateIe = IE_EXT_SUPP_RATES;
-u8 HtCapIe = IE_HT_CAP;
-u8 AddHtInfoIe = IE_ADD_HT;
-u8 NewExtChanIe = IE_SECONDARY_CH_OFFSET;
-u8 ErpIe = IE_ERP;
-u8 DsIe = IE_DS_PARM;
-u8 TimIe = IE_TIM;
-u8 WpaIe = IE_WPA;
-u8 Wpa2Ie = IE_WPA2;
-u8 IbssIe = IE_IBSS_PARM;
-
-extern u8 WPA_OUI[];
-
-u8 SES_OUI[] = { 0x00, 0x90, 0x4c };
-
-u8 ZeroSsid[32] =
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00
-};
-
-/*
- ==========================================================================
- Description:
- initialize the MLME task and its data structure (queue, spinlock,
- timer, state machines).
-
- IRQL = PASSIVE_LEVEL
-
- Return:
- always return NDIS_STATUS_SUCCESS
-
- ==========================================================================
-*/
-int MlmeInit(struct rt_rtmp_adapter *pAd)
-{
- int Status = NDIS_STATUS_SUCCESS;
-
- DBGPRINT(RT_DEBUG_TRACE, ("--> MLME Initialize\n"));
-
- do {
- Status = MlmeQueueInit(&pAd->Mlme.Queue);
- if (Status != NDIS_STATUS_SUCCESS)
- break;
-
- pAd->Mlme.bRunning = FALSE;
- NdisAllocateSpinLock(&pAd->Mlme.TaskLock);
-
- {
- BssTableInit(&pAd->ScanTab);
-
- /* init STA state machines */
- AssocStateMachineInit(pAd, &pAd->Mlme.AssocMachine,
- pAd->Mlme.AssocFunc);
- AuthStateMachineInit(pAd, &pAd->Mlme.AuthMachine,
- pAd->Mlme.AuthFunc);
- AuthRspStateMachineInit(pAd, &pAd->Mlme.AuthRspMachine,
- pAd->Mlme.AuthRspFunc);
- SyncStateMachineInit(pAd, &pAd->Mlme.SyncMachine,
- pAd->Mlme.SyncFunc);
-
- /* Since we are using switch/case to implement it, the init is different from the above */
- /* state machine init */
- MlmeCntlInit(pAd, &pAd->Mlme.CntlMachine, NULL);
- }
-
- WpaStateMachineInit(pAd, &pAd->Mlme.WpaMachine,
- pAd->Mlme.WpaFunc);
-
- ActionStateMachineInit(pAd, &pAd->Mlme.ActMachine,
- pAd->Mlme.ActFunc);
-
- /* Init mlme periodic timer */
- RTMPInitTimer(pAd, &pAd->Mlme.PeriodicTimer,
- GET_TIMER_FUNCTION(MlmePeriodicExec), pAd, TRUE);
-
- /* Set mlme periodic timer */
- RTMPSetTimer(&pAd->Mlme.PeriodicTimer, MLME_TASK_EXEC_INTV);
-
- /* software-based RX Antenna diversity */
- RTMPInitTimer(pAd, &pAd->Mlme.RxAntEvalTimer,
- GET_TIMER_FUNCTION(AsicRxAntEvalTimeout), pAd,
- FALSE);
-
- {
-#ifdef RTMP_PCI_SUPPORT
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)) {
- /* only PCIe cards need these two timers */
- RTMPInitTimer(pAd, &pAd->Mlme.PsPollTimer,
- GET_TIMER_FUNCTION
- (PsPollWakeExec), pAd, FALSE);
- RTMPInitTimer(pAd, &pAd->Mlme.RadioOnOffTimer,
- GET_TIMER_FUNCTION(RadioOnExec),
- pAd, FALSE);
- }
-#endif /* RTMP_PCI_SUPPORT // */
-
- RTMPInitTimer(pAd, &pAd->Mlme.LinkDownTimer,
- GET_TIMER_FUNCTION(LinkDownExec), pAd,
- FALSE);
-
-#ifdef RTMP_MAC_USB
- RTMPInitTimer(pAd, &pAd->Mlme.AutoWakeupTimer,
- GET_TIMER_FUNCTION
- (RtmpUsbStaAsicForceWakeupTimeout), pAd,
- FALSE);
- pAd->Mlme.AutoWakeupTimerRunning = FALSE;
-#endif /* RTMP_MAC_USB // */
- }
-
- } while (FALSE);
-
- DBGPRINT(RT_DEBUG_TRACE, ("<-- MLME Initialize\n"));
-
- return Status;
-}
-
-/*
- ==========================================================================
- Description:
- main loop of the MLME
- Pre:
- Mlme has to be initialized, and there are something inside the queue
- Note:
- This function is invoked from MPSetInformation and MPReceive;
- This task guarantee only one MlmeHandler will run.
-
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-void MlmeHandler(struct rt_rtmp_adapter *pAd)
-{
- struct rt_mlme_queue_elem *Elem = NULL;
-
- /* Only accept MLME and Frame from peer side, no other (control/data) frame should */
- /* get into this state machine */
-
- NdisAcquireSpinLock(&pAd->Mlme.TaskLock);
- if (pAd->Mlme.bRunning) {
- NdisReleaseSpinLock(&pAd->Mlme.TaskLock);
- return;
- } else {
- pAd->Mlme.bRunning = TRUE;
- }
- NdisReleaseSpinLock(&pAd->Mlme.TaskLock);
-
- while (!MlmeQueueEmpty(&pAd->Mlme.Queue)) {
- if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_MLME_RESET_IN_PROGRESS) ||
- RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS) ||
- RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("Device Halted or Removed or MlmeRest, exit MlmeHandler! (queue num = %ld)\n",
- pAd->Mlme.Queue.Num));
- break;
- }
- /*From message type, determine which state machine I should drive */
- if (MlmeDequeue(&pAd->Mlme.Queue, &Elem)) {
-#ifdef RTMP_MAC_USB
- if (Elem->MsgType == MT2_RESET_CONF) {
- DBGPRINT_RAW(RT_DEBUG_TRACE,
- ("reset MLME state machine!\n"));
- MlmeRestartStateMachine(pAd);
- Elem->Occupied = FALSE;
- Elem->MsgLen = 0;
- continue;
- }
-#endif /* RTMP_MAC_USB // */
-
- /* if dequeue success */
- switch (Elem->Machine) {
- /* STA state machines */
- case ASSOC_STATE_MACHINE:
- StateMachinePerformAction(pAd,
- &pAd->Mlme.
- AssocMachine, Elem);
- break;
- case AUTH_STATE_MACHINE:
- StateMachinePerformAction(pAd,
- &pAd->Mlme.
- AuthMachine, Elem);
- break;
- case AUTH_RSP_STATE_MACHINE:
- StateMachinePerformAction(pAd,
- &pAd->Mlme.
- AuthRspMachine, Elem);
- break;
- case SYNC_STATE_MACHINE:
- StateMachinePerformAction(pAd,
- &pAd->Mlme.
- SyncMachine, Elem);
- break;
- case MLME_CNTL_STATE_MACHINE:
- MlmeCntlMachinePerformAction(pAd,
- &pAd->Mlme.
- CntlMachine, Elem);
- break;
- case WPA_PSK_STATE_MACHINE:
- StateMachinePerformAction(pAd,
- &pAd->Mlme.
- WpaPskMachine, Elem);
- break;
-
- case ACTION_STATE_MACHINE:
- StateMachinePerformAction(pAd,
- &pAd->Mlme.ActMachine,
- Elem);
- break;
-
- case WPA_STATE_MACHINE:
- StateMachinePerformAction(pAd,
- &pAd->Mlme.WpaMachine,
- Elem);
- break;
-
- default:
- DBGPRINT(RT_DEBUG_TRACE,
- ("ERROR: Illegal machine %ld in MlmeHandler()\n",
- Elem->Machine));
- break;
- } /* end of switch */
-
- /* free MLME element */
- Elem->Occupied = FALSE;
- Elem->MsgLen = 0;
-
- } else {
- DBGPRINT_ERR("MlmeHandler: MlmeQueue empty\n");
- }
- }
-
- NdisAcquireSpinLock(&pAd->Mlme.TaskLock);
- pAd->Mlme.bRunning = FALSE;
- NdisReleaseSpinLock(&pAd->Mlme.TaskLock);
-}
-
-/*
- ==========================================================================
- Description:
- Destructor of MLME (Destroy queue, state machine, spin lock and timer)
- Parameters:
- Adapter - NIC Adapter pointer
- Post:
- The MLME task will no longer work properly
-
- IRQL = PASSIVE_LEVEL
-
- ==========================================================================
- */
-void MlmeHalt(struct rt_rtmp_adapter *pAd)
-{
- BOOLEAN Cancelled;
-
- DBGPRINT(RT_DEBUG_TRACE, ("==> MlmeHalt\n"));
-
- if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) {
- /* disable BEACON generation and other BEACON related hardware timers */
- AsicDisableSync(pAd);
- }
-
- {
- /* Cancel pending timers */
- RTMPCancelTimer(&pAd->MlmeAux.AssocTimer, &Cancelled);
- RTMPCancelTimer(&pAd->MlmeAux.ReassocTimer, &Cancelled);
- RTMPCancelTimer(&pAd->MlmeAux.DisassocTimer, &Cancelled);
- RTMPCancelTimer(&pAd->MlmeAux.AuthTimer, &Cancelled);
- RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &Cancelled);
- RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled);
-
-#ifdef RTMP_MAC_PCI
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)
- && (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE)) {
- RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled);
- RTMPCancelTimer(&pAd->Mlme.RadioOnOffTimer, &Cancelled);
- }
-#endif /* RTMP_MAC_PCI // */
-
- RTMPCancelTimer(&pAd->Mlme.LinkDownTimer, &Cancelled);
-
-#ifdef RTMP_MAC_USB
- RTMPCancelTimer(&pAd->Mlme.AutoWakeupTimer, &Cancelled);
-#endif /* RTMP_MAC_USB // */
- }
-
- RTMPCancelTimer(&pAd->Mlme.PeriodicTimer, &Cancelled);
- RTMPCancelTimer(&pAd->Mlme.RxAntEvalTimer, &Cancelled);
-
- if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) {
- struct rt_rtmp_chip_op *pChipOps = &pAd->chipOps;
-
- /* Set LED */
- RTMPSetLED(pAd, LED_HALT);
- RTMPSetSignalLED(pAd, -100); /* Force signal strength Led to be turned off, firmware is not done it. */
-#ifdef RTMP_MAC_USB
- {
- LED_CFG_STRUC LedCfg;
- RTMP_IO_READ32(pAd, LED_CFG, &LedCfg.word);
- LedCfg.field.LedPolar = 0;
- LedCfg.field.RLedMode = 0;
- LedCfg.field.GLedMode = 0;
- LedCfg.field.YLedMode = 0;
- RTMP_IO_WRITE32(pAd, LED_CFG, LedCfg.word);
- }
-#endif /* RTMP_MAC_USB // */
-
- if (pChipOps->AsicHaltAction)
- pChipOps->AsicHaltAction(pAd);
- }
-
- RTMPusecDelay(5000); /* 5 msec to guarantee Ant Diversity timer canceled */
-
- MlmeQueueDestroy(&pAd->Mlme.Queue);
- NdisFreeSpinLock(&pAd->Mlme.TaskLock);
-
- DBGPRINT(RT_DEBUG_TRACE, ("<== MlmeHalt\n"));
-}
-
-void MlmeResetRalinkCounters(struct rt_rtmp_adapter *pAd)
-{
- pAd->RalinkCounters.LastOneSecRxOkDataCnt =
- pAd->RalinkCounters.OneSecRxOkDataCnt;
- /* clear all OneSecxxx counters. */
- pAd->RalinkCounters.OneSecBeaconSentCnt = 0;
- pAd->RalinkCounters.OneSecFalseCCACnt = 0;
- pAd->RalinkCounters.OneSecRxFcsErrCnt = 0;
- pAd->RalinkCounters.OneSecRxOkCnt = 0;
- pAd->RalinkCounters.OneSecTxFailCount = 0;
- pAd->RalinkCounters.OneSecTxNoRetryOkCount = 0;
- pAd->RalinkCounters.OneSecTxRetryOkCount = 0;
- pAd->RalinkCounters.OneSecRxOkDataCnt = 0;
- pAd->RalinkCounters.OneSecReceivedByteCount = 0;
- pAd->RalinkCounters.OneSecTransmittedByteCount = 0;
-
- /* TODO: for debug only. to be removed */
- pAd->RalinkCounters.OneSecOsTxCount[QID_AC_BE] = 0;
- pAd->RalinkCounters.OneSecOsTxCount[QID_AC_BK] = 0;
- pAd->RalinkCounters.OneSecOsTxCount[QID_AC_VI] = 0;
- pAd->RalinkCounters.OneSecOsTxCount[QID_AC_VO] = 0;
- pAd->RalinkCounters.OneSecDmaDoneCount[QID_AC_BE] = 0;
- pAd->RalinkCounters.OneSecDmaDoneCount[QID_AC_BK] = 0;
- pAd->RalinkCounters.OneSecDmaDoneCount[QID_AC_VI] = 0;
- pAd->RalinkCounters.OneSecDmaDoneCount[QID_AC_VO] = 0;
- pAd->RalinkCounters.OneSecTxDoneCount = 0;
- pAd->RalinkCounters.OneSecRxCount = 0;
- pAd->RalinkCounters.OneSecTxAggregationCount = 0;
- pAd->RalinkCounters.OneSecRxAggregationCount = 0;
-
- return;
-}
-
-/*
- ==========================================================================
- Description:
- This routine is executed periodically to -
- 1. Decide if it's a right time to turn on PwrMgmt bit of all
- outgoiing frames
- 2. Calculate ChannelQuality based on statistics of the last
- period, so that TX rate won't toggling very frequently between a
- successful TX and a failed TX.
- 3. If the calculated ChannelQuality indicated current connection not
- healthy, then a ROAMing attempt is tried here.
-
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-#define ADHOC_BEACON_LOST_TIME (8*OS_HZ) /* 8 sec */
-void MlmePeriodicExec(void *SystemSpecific1,
- void *FunctionContext,
- void *SystemSpecific2, void *SystemSpecific3)
-{
- unsigned long TxTotalCnt;
- struct rt_rtmp_adapter *pAd = (struct rt_rtmp_adapter *)FunctionContext;
-
-#ifdef RTMP_MAC_PCI
- {
- /* If Hardware controlled Radio enabled, we have to check GPIO pin2 every 2 second. */
- /* Move code to here, because following code will return when radio is off */
- if ((pAd->Mlme.PeriodicRound % (MLME_TASK_EXEC_MULTIPLE * 2) ==
- 0) && (pAd->StaCfg.bHardwareRadio == TRUE)
- && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))
- && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))
- /*&&(pAd->bPCIclkOff == FALSE) */
- ) {
- u32 data = 0;
-
- /* Read GPIO pin2 as Hardware controlled radio state */
-#ifndef RT3090
- RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &data);
-#endif /* RT3090 // */
-/*KH(PCIE PS):Added based on Jane<-- */
-#ifdef RT3090
-/* Read GPIO pin2 as Hardware controlled radio state */
-/* We need to Read GPIO if HW said so no mater what advance power saving */
- if ((pAd->OpMode == OPMODE_STA) && (IDLE_ON(pAd))
- &&
- (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))
- && (pAd->StaCfg.PSControl.field.EnablePSinIdle ==
- TRUE)) {
- /* Want to make sure device goes to L0 state before reading register. */
- RTMPPCIeLinkCtrlValueRestore(pAd, 0);
- RTMP_IO_FORCE_READ32(pAd, GPIO_CTRL_CFG, &data);
- RTMPPCIeLinkCtrlSetting(pAd, 3);
- } else
- RTMP_IO_FORCE_READ32(pAd, GPIO_CTRL_CFG, &data);
-#endif /* RT3090 // */
-/*KH(PCIE PS):Added based on Jane--> */
-
- if (data & 0x04) {
- pAd->StaCfg.bHwRadio = TRUE;
- } else {
- pAd->StaCfg.bHwRadio = FALSE;
- }
- if (pAd->StaCfg.bRadio !=
- (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio)) {
- pAd->StaCfg.bRadio = (pAd->StaCfg.bHwRadio
- && pAd->StaCfg.bSwRadio);
- if (pAd->StaCfg.bRadio == TRUE) {
- MlmeRadioOn(pAd);
- /* Update extra information */
- pAd->ExtraInfo = EXTRA_INFO_CLEAR;
- } else {
- MlmeRadioOff(pAd);
- /* Update extra information */
- pAd->ExtraInfo = HW_RADIO_OFF;
- }
- }
- }
- }
-#endif /* RTMP_MAC_PCI // */
-
- /* Do nothing if the driver is starting halt state. */
- /* This might happen when timer already been fired before cancel timer with mlmehalt */
- if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_HALT_IN_PROGRESS |
- fRTMP_ADAPTER_RADIO_OFF |
- fRTMP_ADAPTER_RADIO_MEASUREMENT |
- fRTMP_ADAPTER_RESET_IN_PROGRESS))))
- return;
-
- RTMP_MLME_PRE_SANITY_CHECK(pAd);
-
- {
- /* Do nothing if monitor mode is on */
- if (MONITOR_ON(pAd))
- return;
-
- if (pAd->Mlme.PeriodicRound & 0x1) {
- /* This is the fix for wifi 11n extension channel overlapping test case. for 2860D */
- if (((pAd->MACVersion & 0xffff) == 0x0101) &&
- (STA_TGN_WIFI_ON(pAd)) &&
- (pAd->CommonCfg.IOTestParm.bToggle == FALSE))
- {
- RTMP_IO_WRITE32(pAd, TXOP_CTRL_CFG, 0x24Bf);
- pAd->CommonCfg.IOTestParm.bToggle = TRUE;
- } else if ((STA_TGN_WIFI_ON(pAd)) &&
- ((pAd->MACVersion & 0xffff) == 0x0101)) {
- RTMP_IO_WRITE32(pAd, TXOP_CTRL_CFG, 0x243f);
- pAd->CommonCfg.IOTestParm.bToggle = FALSE;
- }
- }
- }
-
- pAd->bUpdateBcnCntDone = FALSE;
-
-/* RECBATimerTimeout(SystemSpecific1,FunctionContext,SystemSpecific2,SystemSpecific3); */
- pAd->Mlme.PeriodicRound++;
-
-#ifdef RTMP_MAC_USB
- /* execute every 100ms, update the Tx FIFO Cnt for update Tx Rate. */
- NICUpdateFifoStaCounters(pAd);
-#endif /* RTMP_MAC_USB // */
-
- /* execute every 500ms */
- if ((pAd->Mlme.PeriodicRound % 5 == 0)
- && RTMPAutoRateSwitchCheck(pAd)
- /*(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED)) */ )
- {
- /* perform dynamic tx rate switching based on past TX history */
- {
- if ((OPSTATUS_TEST_FLAG
- (pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)
- )
- && (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)))
- MlmeDynamicTxRateSwitching(pAd);
- }
- }
- /* Normal 1 second Mlme PeriodicExec. */
- if (pAd->Mlme.PeriodicRound % MLME_TASK_EXEC_MULTIPLE == 0) {
- pAd->Mlme.OneSecPeriodicRound++;
-
- /*ORIBATimerTimeout(pAd); */
-
- /* Media status changed, report to NDIS */
- if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_MEDIA_STATE_CHANGE)) {
- RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_MEDIA_STATE_CHANGE);
- if (OPSTATUS_TEST_FLAG
- (pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) {
- pAd->IndicateMediaState =
- NdisMediaStateConnected;
- RTMP_IndicateMediaState(pAd);
-
- } else {
- pAd->IndicateMediaState =
- NdisMediaStateDisconnected;
- RTMP_IndicateMediaState(pAd);
- }
- }
-
- NdisGetSystemUpTime(&pAd->Mlme.Now32);
-
- /* add the most up-to-date h/w raw counters into software variable, so that */
- /* the dynamic tuning mechanism below are based on most up-to-date information */
- NICUpdateRawCounters(pAd);
-
-#ifdef RTMP_MAC_USB
- RTUSBWatchDog(pAd);
-#endif /* RTMP_MAC_USB // */
-
- /* Need statistics after read counter. So put after NICUpdateRawCounters */
- ORIBATimerTimeout(pAd);
-
- /* if MGMT RING is full more than twice within 1 second, we consider there's */
- /* a hardware problem stucking the TX path. In this case, try a hardware reset */
- /* to recover the system */
- /* if (pAd->RalinkCounters.MgmtRingFullCount >= 2) */
- /* RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HARDWARE_ERROR); */
- /* else */
- /* pAd->RalinkCounters.MgmtRingFullCount = 0; */
-
- /* The time period for checking antenna is according to traffic */
- {
- if (pAd->Mlme.bEnableAutoAntennaCheck) {
- TxTotalCnt =
- pAd->RalinkCounters.OneSecTxNoRetryOkCount +
- pAd->RalinkCounters.OneSecTxRetryOkCount +
- pAd->RalinkCounters.OneSecTxFailCount;
-
- /* dynamic adjust antenna evaluation period according to the traffic */
- if (TxTotalCnt > 50) {
- if (pAd->Mlme.OneSecPeriodicRound %
- 10 == 0) {
- AsicEvaluateRxAnt(pAd);
- }
- } else {
- if (pAd->Mlme.OneSecPeriodicRound % 3 ==
- 0) {
- AsicEvaluateRxAnt(pAd);
- }
- }
- }
- }
-
- STAMlmePeriodicExec(pAd);
-
- MlmeResetRalinkCounters(pAd);
-
- {
-#ifdef RTMP_MAC_PCI
- if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)
- && (pAd->bPCIclkOff == FALSE))
-#endif /* RTMP_MAC_PCI // */
- {
- /* When Adhoc beacon is enabled and RTS/CTS is enabled, there is a chance that hardware MAC FSM will run into a deadlock */
- /* and sending CTS-to-self over and over. */
- /* Software Patch Solution: */
- /* 1. Polling debug state register 0x10F4 every one second. */
- /* 2. If in 0x10F4 the ((bit29==1) && (bit7==1)) OR ((bit29==1) && (bit5==1)), it means the deadlock has occurred. */
- /* 3. If the deadlock occurred, reset MAC/BBP by setting 0x1004 to 0x0001 for a while then setting it back to 0x000C again. */
-
- u32 MacReg = 0;
-
- RTMP_IO_READ32(pAd, 0x10F4, &MacReg);
- if (((MacReg & 0x20000000) && (MacReg & 0x80))
- || ((MacReg & 0x20000000)
- && (MacReg & 0x20))) {
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x1);
- RTMPusecDelay(1);
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0xC);
-
- DBGPRINT(RT_DEBUG_WARN,
- ("Warning, MAC specific condition occurs \n"));
- }
- }
- }
-
- RTMP_MLME_HANDLER(pAd);
- }
-
- pAd->bUpdateBcnCntDone = FALSE;
-}
-
-/*
- ==========================================================================
- Validate SSID for connection try and rescan purpose
- Valid SSID will have visible chars only.
- The valid length is from 0 to 32.
- IRQL = DISPATCH_LEVEL
- ==========================================================================
- */
-BOOLEAN MlmeValidateSSID(u8 *pSsid, u8 SsidLen)
-{
- int index;
-
- if (SsidLen > MAX_LEN_OF_SSID)
- return (FALSE);
-
- /* Check each character value */
- for (index = 0; index < SsidLen; index++) {
- if (pSsid[index] < 0x20)
- return (FALSE);
- }
-
- /* All checked */
- return (TRUE);
-}
-
-void MlmeSelectTxRateTable(struct rt_rtmp_adapter *pAd,
- struct rt_mac_table_entry *pEntry,
- u8 ** ppTable,
- u8 *pTableSize, u8 *pInitTxRateIdx)
-{
- do {
- /* decide the rate table for tuning */
- if (pAd->CommonCfg.TxRateTableSize > 0) {
- *ppTable = RateSwitchTable;
- *pTableSize = RateSwitchTable[0];
- *pInitTxRateIdx = RateSwitchTable[1];
-
- break;
- }
-
- if ((pAd->OpMode == OPMODE_STA) && ADHOC_ON(pAd)) {
- 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 */
- *ppTable = RateSwitchTable11N1S;
- *pTableSize = RateSwitchTable11N1S[0];
- *pInitTxRateIdx = RateSwitchTable11N1S[1];
-
- } 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 */
- if (pAd->LatchRfRegs.Channel <= 14) {
- *ppTable = RateSwitchTable11N2S;
- *pTableSize = RateSwitchTable11N2S[0];
- *pInitTxRateIdx =
- RateSwitchTable11N2S[1];
- } else {
- *ppTable = RateSwitchTable11N2SForABand;
- *pTableSize =
- RateSwitchTable11N2SForABand[0];
- *pInitTxRateIdx =
- RateSwitchTable11N2SForABand[1];
- }
-
- } else if ((pEntry->RateLen == 4)
- && (pEntry->HTCapability.MCSSet[0] == 0)
- && (pEntry->HTCapability.MCSSet[1] == 0)
- ) {
- *ppTable = RateSwitchTable11B;
- *pTableSize = RateSwitchTable11B[0];
- *pInitTxRateIdx = RateSwitchTable11B[1];
-
- } else if (pAd->LatchRfRegs.Channel <= 14) {
- *ppTable = RateSwitchTable11BG;
- *pTableSize = RateSwitchTable11BG[0];
- *pInitTxRateIdx = RateSwitchTable11BG[1];
-
- } else {
- *ppTable = RateSwitchTable11G;
- *pTableSize = RateSwitchTable11G[0];
- *pInitTxRateIdx = RateSwitchTable11G[1];
-
- }
- break;
- }
- /*if ((pAd->StaActive.SupRateLen + pAd->StaActive.ExtRateLen == 12) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0xff) && */
- /* ((pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0x00) || (pAd->Antenna.field.TxPath == 1))) */
- 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 */
- *ppTable = RateSwitchTable11BGN1S;
- *pTableSize = RateSwitchTable11BGN1S[0];
- *pInitTxRateIdx = RateSwitchTable11BGN1S[1];
-
- break;
- }
- /*else if ((pAd->StaActive.SupRateLen + pAd->StaActive.ExtRateLen == 12) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0xff) && */
- /* (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0xff) && (pAd->Antenna.field.TxPath == 2)) */
- 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 */
- if (pAd->LatchRfRegs.Channel <= 14) {
- *ppTable = RateSwitchTable11BGN2S;
- *pTableSize = RateSwitchTable11BGN2S[0];
- *pInitTxRateIdx = RateSwitchTable11BGN2S[1];
-
- } else {
- *ppTable = RateSwitchTable11BGN2SForABand;
- *pTableSize = RateSwitchTable11BGN2SForABand[0];
- *pInitTxRateIdx =
- RateSwitchTable11BGN2SForABand[1];
-
- }
- break;
- }
- /*else if ((pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0xff) && ((pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0x00) || (pAd->Antenna.field.TxPath == 1))) */
- if ((pEntry->HTCapability.MCSSet[0] == 0xff) && ((pEntry->HTCapability.MCSSet[1] == 0x00) || (pAd->CommonCfg.TxStream == 1))) { /* 11N 1S AP */
- *ppTable = RateSwitchTable11N1S;
- *pTableSize = RateSwitchTable11N1S[0];
- *pInitTxRateIdx = RateSwitchTable11N1S[1];
-
- break;
- }
- /*else if ((pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0xff) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0xff) && (pAd->Antenna.field.TxPath == 2)) */
- if ((pEntry->HTCapability.MCSSet[0] == 0xff) && (pEntry->HTCapability.MCSSet[1] == 0xff) && (pAd->CommonCfg.TxStream == 2)) { /* 11N 2S AP */
- if (pAd->LatchRfRegs.Channel <= 14) {
- *ppTable = RateSwitchTable11N2S;
- *pTableSize = RateSwitchTable11N2S[0];
- *pInitTxRateIdx = RateSwitchTable11N2S[1];
- } else {
- *ppTable = RateSwitchTable11N2SForABand;
- *pTableSize = RateSwitchTable11N2SForABand[0];
- *pInitTxRateIdx =
- RateSwitchTable11N2SForABand[1];
- }
-
- break;
- }
- /*else if ((pAd->StaActive.SupRateLen == 4) && (pAd->StaActive.ExtRateLen == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0)) */
- if ((pEntry->RateLen == 4 || pAd->CommonCfg.PhyMode == PHY_11B)
- /*Iverson mark for Adhoc b mode,sta will use rate 54 Mbps when connect with sta b/g/n mode */
- /* && (pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0) */
- ) { /* B only AP */
- *ppTable = RateSwitchTable11B;
- *pTableSize = RateSwitchTable11B[0];
- *pInitTxRateIdx = RateSwitchTable11B[1];
-
- break;
- }
- /*else if ((pAd->StaActive.SupRateLen + pAd->StaActive.ExtRateLen > 8) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0)) */
- if ((pEntry->RateLen > 8)
- && (pEntry->HTCapability.MCSSet[0] == 0)
- && (pEntry->HTCapability.MCSSet[1] == 0)
- ) { /* B/G mixed AP */
- *ppTable = RateSwitchTable11BG;
- *pTableSize = RateSwitchTable11BG[0];
- *pInitTxRateIdx = RateSwitchTable11BG[1];
-
- break;
- }
- /*else if ((pAd->StaActive.SupRateLen + pAd->StaActive.ExtRateLen == 8) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0)) */
- if ((pEntry->RateLen == 8)
- && (pEntry->HTCapability.MCSSet[0] == 0)
- && (pEntry->HTCapability.MCSSet[1] == 0)
- ) { /* G only AP */
- *ppTable = RateSwitchTable11G;
- *pTableSize = RateSwitchTable11G[0];
- *pInitTxRateIdx = RateSwitchTable11G[1];
-
- break;
- }
-
- {
- /*else if ((pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0)) */
- if ((pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0)) { /* Legacy mode */
- if (pAd->CommonCfg.MaxTxRate <= RATE_11) {
- *ppTable = RateSwitchTable11B;
- *pTableSize = RateSwitchTable11B[0];
- *pInitTxRateIdx = RateSwitchTable11B[1];
- } else if ((pAd->CommonCfg.MaxTxRate > RATE_11)
- && (pAd->CommonCfg.MinTxRate >
- RATE_11)) {
- *ppTable = RateSwitchTable11G;
- *pTableSize = RateSwitchTable11G[0];
- *pInitTxRateIdx = RateSwitchTable11G[1];
-
- } else {
- *ppTable = RateSwitchTable11BG;
- *pTableSize = RateSwitchTable11BG[0];
- *pInitTxRateIdx =
- RateSwitchTable11BG[1];
- }
- break;
- }
- if (pAd->LatchRfRegs.Channel <= 14) {
- if (pAd->CommonCfg.TxStream == 1) {
- *ppTable = RateSwitchTable11N1S;
- *pTableSize = RateSwitchTable11N1S[0];
- *pInitTxRateIdx =
- RateSwitchTable11N1S[1];
- DBGPRINT_RAW(RT_DEBUG_ERROR,
- ("DRS: unknown mode,default use 11N 1S AP \n"));
- } else {
- *ppTable = RateSwitchTable11N2S;
- *pTableSize = RateSwitchTable11N2S[0];
- *pInitTxRateIdx =
- RateSwitchTable11N2S[1];
- DBGPRINT_RAW(RT_DEBUG_ERROR,
- ("DRS: unknown mode,default use 11N 2S AP \n"));
- }
- } else {
- if (pAd->CommonCfg.TxStream == 1) {
- *ppTable = RateSwitchTable11N1S;
- *pTableSize = RateSwitchTable11N1S[0];
- *pInitTxRateIdx =
- RateSwitchTable11N1S[1];
- DBGPRINT_RAW(RT_DEBUG_ERROR,
- ("DRS: unknown mode,default use 11N 1S AP \n"));
- } else {
- *ppTable = RateSwitchTable11N2SForABand;
- *pTableSize =
- RateSwitchTable11N2SForABand[0];
- *pInitTxRateIdx =
- RateSwitchTable11N2SForABand[1];
- DBGPRINT_RAW(RT_DEBUG_ERROR,
- ("DRS: unknown mode,default use 11N 2S AP \n"));
- }
- }
- DBGPRINT_RAW(RT_DEBUG_ERROR,
- ("DRS: unknown mode (SupRateLen=%d, ExtRateLen=%d, MCSSet[0]=0x%x, MCSSet[1]=0x%x)\n",
- pAd->StaActive.SupRateLen,
- pAd->StaActive.ExtRateLen,
- pAd->StaActive.SupportedPhyInfo.MCSSet[0],
- pAd->StaActive.SupportedPhyInfo.
- MCSSet[1]));
- }
- } while (FALSE);
-}
-
-void STAMlmePeriodicExec(struct rt_rtmp_adapter *pAd)
-{
- unsigned long TxTotalCnt;
- int i;
-
- /*
- We return here in ATE mode, because the statistics
- that ATE need are not collected via this routine.
- */
-#if defined(RT305x)||defined(RT3070)
- /* request by Gary, if Rssi0 > -42, BBP 82 need to be changed from 0x62 to 0x42, , bbp 67 need to be changed from 0x20 to 0x18 */
- if (!pAd->CommonCfg.HighPowerPatchDisabled) {
-#ifdef RT3070
- if ((IS_RT3070(pAd) && ((pAd->MACVersion & 0xffff) < 0x0201)))
-#endif /* RT3070 // */
- {
- if ((pAd->StaCfg.RssiSample.AvgRssi0 != 0)
- && (pAd->StaCfg.RssiSample.AvgRssi0 >
- (pAd->BbpRssiToDbmDelta - 35))) {
- RT30xxWriteRFRegister(pAd, RF_R27, 0x20);
- } else {
- RT30xxWriteRFRegister(pAd, RF_R27, 0x23);
- }
- }
- }
-#endif
-#ifdef PCIE_PS_SUPPORT
-/* don't perform idle-power-save mechanism within 3 min after driver initialization. */
-/* This can make rebooter test more robust */
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)) {
- if ((pAd->OpMode == OPMODE_STA) && (IDLE_ON(pAd))
- && (pAd->Mlme.SyncMachine.CurrState == SYNC_IDLE)
- && (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE)
- && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))) {
- if (IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) {
- if (pAd->StaCfg.PSControl.field.EnableNewPS ==
- TRUE) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("%s\n", __func__));
- RT28xxPciAsicRadioOff(pAd,
- GUI_IDLE_POWER_SAVE,
- 0);
- } else {
- AsicSendCommandToMcu(pAd, 0x30,
- PowerSafeCID, 0xff,
- 0x2);
- /* Wait command success */
- AsicCheckCommanOk(pAd, PowerSafeCID);
- RTMP_SET_FLAG(pAd,
- fRTMP_ADAPTER_IDLE_RADIO_OFF);
- DBGPRINT(RT_DEBUG_TRACE,
- ("PSM - rt30xx Issue Sleep command)\n"));
- }
- } else if (pAd->Mlme.OneSecPeriodicRound > 180) {
- if (pAd->StaCfg.PSControl.field.EnableNewPS ==
- TRUE) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("%s\n", __func__));
- RT28xxPciAsicRadioOff(pAd,
- GUI_IDLE_POWER_SAVE,
- 0);
- } else {
- AsicSendCommandToMcu(pAd, 0x30,
- PowerSafeCID, 0xff,
- 0x02);
- /* Wait command success */
- AsicCheckCommanOk(pAd, PowerSafeCID);
- RTMP_SET_FLAG(pAd,
- fRTMP_ADAPTER_IDLE_RADIO_OFF);
- DBGPRINT(RT_DEBUG_TRACE,
- ("PSM - rt28xx Issue Sleep command)\n"));
- }
- }
- } else {
- DBGPRINT(RT_DEBUG_TRACE,
- ("STAMlmePeriodicExec MMCHK - CommonCfg.Ssid[%d]=%c%c%c%c... MlmeAux.Ssid[%d]=%c%c%c%c...\n",
- pAd->CommonCfg.SsidLen,
- pAd->CommonCfg.Ssid[0],
- pAd->CommonCfg.Ssid[1],
- pAd->CommonCfg.Ssid[2],
- pAd->CommonCfg.Ssid[3], pAd->MlmeAux.SsidLen,
- pAd->MlmeAux.Ssid[0], pAd->MlmeAux.Ssid[1],
- pAd->MlmeAux.Ssid[2], pAd->MlmeAux.Ssid[3]));
- }
- }
-#endif /* PCIE_PS_SUPPORT // */
-
- if (pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_DISABLE) {
- /* WPA MIC error should block association attempt for 60 seconds */
- if (pAd->StaCfg.bBlockAssoc &&
- RTMP_TIME_AFTER(pAd->Mlme.Now32,
- pAd->StaCfg.LastMicErrorTime +
- (60 * OS_HZ)))
- pAd->StaCfg.bBlockAssoc = FALSE;
- }
-
- if ((pAd->PreMediaState != pAd->IndicateMediaState)
- && (pAd->CommonCfg.bWirelessEvent)) {
- if (pAd->IndicateMediaState == NdisMediaStateConnected) {
- RTMPSendWirelessEvent(pAd, IW_STA_LINKUP_EVENT_FLAG,
- pAd->MacTab.Content[BSSID_WCID].
- Addr, BSS0, 0);
- }
- pAd->PreMediaState = pAd->IndicateMediaState;
- }
-
- if (pAd->CommonCfg.PSPXlink && ADHOC_ON(pAd)) {
- } else {
- AsicStaBbpTuning(pAd);
- }
-
- TxTotalCnt = pAd->RalinkCounters.OneSecTxNoRetryOkCount +
- pAd->RalinkCounters.OneSecTxRetryOkCount +
- pAd->RalinkCounters.OneSecTxFailCount;
-
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) {
- /* update channel quality for Roaming and UI LinkQuality display */
- MlmeCalculateChannelQuality(pAd, NULL, pAd->Mlme.Now32);
- }
- /* must be AFTER MlmeDynamicTxRateSwitching() because it needs to know if */
- /* Radio is currently in noisy environment */
- if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
- AsicAdjustTxPower(pAd);
-
- if (INFRA_ON(pAd)) {
-
- /* Is PSM bit consistent with user power management policy? */
- /* This is the only place that will set PSM bit ON. */
- if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
- MlmeCheckPsmChange(pAd, pAd->Mlme.Now32);
-
- pAd->RalinkCounters.LastOneSecTotalTxCount = TxTotalCnt;
-
- if ((RTMP_TIME_AFTER
- (pAd->Mlme.Now32,
- pAd->StaCfg.LastBeaconRxTime + (1 * OS_HZ)))
- &&
- (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
- &&
- (((TxTotalCnt + pAd->RalinkCounters.OneSecRxOkCnt) <
- 600))) {
- RTMPSetAGCInitValue(pAd, BW_20);
- DBGPRINT(RT_DEBUG_TRACE,
- ("MMCHK - No BEACON. restore R66 to the low bound(%d) \n",
- (0x2E + GET_LNA_GAIN(pAd))));
- }
- /*if ((pAd->RalinkCounters.OneSecTxNoRetryOkCount == 0) && */
- /* (pAd->RalinkCounters.OneSecTxRetryOkCount == 0)) */
- {
- if (pAd->CommonCfg.bAPSDCapable
- && pAd->CommonCfg.APEdcaParm.bAPSDCapable) {
- /* When APSD is enabled, the period changes as 20 sec */
- if ((pAd->Mlme.OneSecPeriodicRound % 20) == 8)
- RTMPSendNullFrame(pAd,
- pAd->CommonCfg.TxRate,
- TRUE);
- } else {
- /* Send out a NULL frame every 10 sec to inform AP that STA is still alive (Avoid being age out) */
- if ((pAd->Mlme.OneSecPeriodicRound % 10) == 8) {
- if (pAd->CommonCfg.bWmmCapable)
- RTMPSendNullFrame(pAd,
- pAd->
- CommonCfg.
- TxRate, TRUE);
- else
- RTMPSendNullFrame(pAd,
- pAd->
- CommonCfg.
- TxRate,
- FALSE);
- }
- }
- }
-
- if (CQI_IS_DEAD(pAd->Mlme.ChannelQuality)) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("MMCHK - No BEACON. Dead CQI. Auto Recovery attempt #%ld\n",
- pAd->RalinkCounters.BadCQIAutoRecoveryCount));
-
- /* Lost AP, send disconnect & link down event */
- LinkDown(pAd, FALSE);
-
- RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL,
- 0);
-
- /* RTMPPatchMacBbpBug(pAd); */
- MlmeAutoReconnectLastSSID(pAd);
- } else if (CQI_IS_BAD(pAd->Mlme.ChannelQuality)) {
- pAd->RalinkCounters.BadCQIAutoRecoveryCount++;
- DBGPRINT(RT_DEBUG_TRACE,
- ("MMCHK - Bad CQI. Auto Recovery attempt #%ld\n",
- pAd->RalinkCounters.BadCQIAutoRecoveryCount));
- MlmeAutoReconnectLastSSID(pAd);
- }
-
- if (pAd->StaCfg.bAutoRoaming) {
- BOOLEAN rv = FALSE;
- char dBmToRoam = pAd->StaCfg.dBmToRoam;
- char MaxRssi = RTMPMaxRssi(pAd,
- pAd->StaCfg.RssiSample.
- LastRssi0,
- pAd->StaCfg.RssiSample.
- LastRssi1,
- pAd->StaCfg.RssiSample.
- LastRssi2);
-
- /* Scanning, ignore Roaming */
- if (!RTMP_TEST_FLAG
- (pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)
- && (pAd->Mlme.SyncMachine.CurrState == SYNC_IDLE)
- && (MaxRssi <= dBmToRoam)) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("Rssi=%d, dBmToRoam=%d\n", MaxRssi,
- (char)dBmToRoam));
-
- /* Add auto seamless roaming */
- if (rv == FALSE)
- rv = MlmeCheckForFastRoaming(pAd);
-
- if (rv == FALSE) {
- if ((pAd->StaCfg.LastScanTime +
- 10 * OS_HZ) < pAd->Mlme.Now32) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("MMCHK - Roaming, No eligible entry, try new scan!\n"));
- pAd->StaCfg.ScanCnt = 2;
- pAd->StaCfg.LastScanTime =
- pAd->Mlme.Now32;
- MlmeAutoScan(pAd);
- }
- }
- }
- }
- } else if (ADHOC_ON(pAd)) {
- /* If all peers leave, and this STA becomes the last one in this IBSS, then change MediaState */
- /* to DISCONNECTED. But still holding this IBSS (i.e. sending BEACON) so that other STAs can */
- /* join later. */
- if (RTMP_TIME_AFTER
- (pAd->Mlme.Now32,
- pAd->StaCfg.LastBeaconRxTime + ADHOC_BEACON_LOST_TIME)
- && OPSTATUS_TEST_FLAG(pAd,
- fOP_STATUS_MEDIA_STATE_CONNECTED)) {
- struct rt_mlme_start_req StartReq;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("MMCHK - excessive BEACON lost, last STA in this IBSS, MediaState=Disconnected\n"));
- LinkDown(pAd, FALSE);
-
- StartParmFill(pAd, &StartReq,
- (char *) pAd->MlmeAux.Ssid,
- pAd->MlmeAux.SsidLen);
- MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_START_REQ,
- sizeof(struct rt_mlme_start_req), &StartReq);
- pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_START;
- }
-
- for (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++) {
- struct rt_mac_table_entry *pEntry = &pAd->MacTab.Content[i];
-
- if (pEntry->ValidAsCLI == FALSE)
- continue;
-
- if (RTMP_TIME_AFTER
- (pAd->Mlme.Now32,
- pEntry->LastBeaconRxTime + ADHOC_BEACON_LOST_TIME))
- MacTableDeleteEntry(pAd, pEntry->Aid,
- pEntry->Addr);
- }
- } else /* no INFRA nor ADHOC connection */
- {
-
- if (pAd->StaCfg.bScanReqIsFromWebUI &&
- RTMP_TIME_BEFORE(pAd->Mlme.Now32,
- pAd->StaCfg.LastScanTime + (30 * OS_HZ)))
- goto SKIP_AUTO_SCAN_CONN;
- else
- pAd->StaCfg.bScanReqIsFromWebUI = FALSE;
-
- if ((pAd->StaCfg.bAutoReconnect == TRUE)
- && RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP)
- &&
- (MlmeValidateSSID
- (pAd->MlmeAux.AutoReconnectSsid,
- pAd->MlmeAux.AutoReconnectSsidLen) == TRUE)) {
- if ((pAd->ScanTab.BssNr == 0)
- && (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE)) {
- struct rt_mlme_scan_req ScanReq;
-
- if (RTMP_TIME_AFTER
- (pAd->Mlme.Now32,
- pAd->StaCfg.LastScanTime + (10 * OS_HZ))) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("STAMlmePeriodicExec():CNTL - ScanTab.BssNr==0, start a new ACTIVE scan SSID[%s]\n",
- pAd->MlmeAux.
- AutoReconnectSsid));
- ScanParmFill(pAd, &ScanReq,
- (char *)pAd->MlmeAux.
- AutoReconnectSsid,
- pAd->MlmeAux.
- AutoReconnectSsidLen,
- BSS_ANY, SCAN_ACTIVE);
- MlmeEnqueue(pAd, SYNC_STATE_MACHINE,
- MT2_MLME_SCAN_REQ,
- sizeof
- (struct rt_mlme_scan_req),
- &ScanReq);
- pAd->Mlme.CntlMachine.CurrState =
- CNTL_WAIT_OID_LIST_SCAN;
- /* Reset Missed scan number */
- pAd->StaCfg.LastScanTime =
- pAd->Mlme.Now32;
- } else if (pAd->StaCfg.BssType == BSS_ADHOC) /* Quit the forever scan when in a very clean room */
- MlmeAutoReconnectLastSSID(pAd);
- } else if (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) {
- if ((pAd->Mlme.OneSecPeriodicRound % 7) == 0) {
- MlmeAutoScan(pAd);
- pAd->StaCfg.LastScanTime =
- pAd->Mlme.Now32;
- } else {
- MlmeAutoReconnectLastSSID(pAd);
- }
- }
- }
- }
-
-SKIP_AUTO_SCAN_CONN:
-
- if ((pAd->MacTab.Content[BSSID_WCID].TXBAbitmap != 0)
- && (pAd->MacTab.fAnyBASession == FALSE)) {
- pAd->MacTab.fAnyBASession = TRUE;
- AsicUpdateProtect(pAd, HT_FORCERTSCTS, ALLN_SETPROTECT, FALSE,
- FALSE);
- } else if ((pAd->MacTab.Content[BSSID_WCID].TXBAbitmap == 0)
- && (pAd->MacTab.fAnyBASession == TRUE)) {
- pAd->MacTab.fAnyBASession = FALSE;
- AsicUpdateProtect(pAd,
- pAd->MlmeAux.AddHtInfo.AddHtInfo2.
- OperaionMode, ALLN_SETPROTECT, FALSE, FALSE);
- }
-
- return;
-}
-
-/* Link down report */
-void LinkDownExec(void *SystemSpecific1,
- void *FunctionContext,
- void *SystemSpecific2, void *SystemSpecific3)
-{
- struct rt_rtmp_adapter *pAd = (struct rt_rtmp_adapter *)FunctionContext;
-
- if (pAd != NULL) {
- struct rt_mlme_disassoc_req DisassocReq;
-
- if ((pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED) &&
- (INFRA_ON(pAd))) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("LinkDownExec(): disassociate with current AP...\n"));
- DisassocParmFill(pAd, &DisassocReq,
- pAd->CommonCfg.Bssid,
- REASON_DISASSOC_STA_LEAVING);
- MlmeEnqueue(pAd, ASSOC_STATE_MACHINE,
- MT2_MLME_DISASSOC_REQ,
- sizeof(struct rt_mlme_disassoc_req),
- &DisassocReq);
- pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;
-
- pAd->IndicateMediaState = NdisMediaStateDisconnected;
- RTMP_IndicateMediaState(pAd);
- pAd->ExtraInfo = GENERAL_LINK_DOWN;
- }
- }
-}
-
-/* IRQL = DISPATCH_LEVEL */
-void MlmeAutoScan(struct rt_rtmp_adapter *pAd)
-{
- /* check CntlMachine.CurrState to avoid collision with NDIS SetOID request */
- if (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) {
- DBGPRINT(RT_DEBUG_TRACE, ("MMCHK - Driver auto scan\n"));
- MlmeEnqueue(pAd,
- MLME_CNTL_STATE_MACHINE,
- OID_802_11_BSSID_LIST_SCAN,
- pAd->MlmeAux.AutoReconnectSsidLen,
- pAd->MlmeAux.AutoReconnectSsid);
- RTMP_MLME_HANDLER(pAd);
- }
-}
-
-/* IRQL = DISPATCH_LEVEL */
-void MlmeAutoReconnectLastSSID(struct rt_rtmp_adapter *pAd)
-{
- if (pAd->StaCfg.bAutoConnectByBssid) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("Driver auto reconnect to last OID_802_11_BSSID "
- "setting - %pM\n", pAd->MlmeAux.Bssid));
-
- pAd->MlmeAux.Channel = pAd->CommonCfg.Channel;
- MlmeEnqueue(pAd,
- MLME_CNTL_STATE_MACHINE,
- OID_802_11_BSSID, MAC_ADDR_LEN, pAd->MlmeAux.Bssid);
-
- pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
-
- RTMP_MLME_HANDLER(pAd);
- }
- /* check CntlMachine.CurrState to avoid collision with NDIS SetOID request */
- else if ((pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) &&
- (MlmeValidateSSID
- (pAd->MlmeAux.AutoReconnectSsid,
- pAd->MlmeAux.AutoReconnectSsidLen) == TRUE)) {
- struct rt_ndis_802_11_ssid OidSsid;
- OidSsid.SsidLength = pAd->MlmeAux.AutoReconnectSsidLen;
- NdisMoveMemory(OidSsid.Ssid, pAd->MlmeAux.AutoReconnectSsid,
- pAd->MlmeAux.AutoReconnectSsidLen);
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("Driver auto reconnect to last OID_802_11_SSID setting - %s, len - %d\n",
- pAd->MlmeAux.AutoReconnectSsid,
- pAd->MlmeAux.AutoReconnectSsidLen));
- MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, OID_802_11_SSID,
- sizeof(struct rt_ndis_802_11_ssid), &OidSsid);
- RTMP_MLME_HANDLER(pAd);
- }
-}
-
-/*
- ==========================================================================
- Description:
- This routine checks if there're other APs out there capable for
- roaming. Caller should call this routine only when Link up in INFRA mode
- and channel quality is below CQI_GOOD_THRESHOLD.
-
- IRQL = DISPATCH_LEVEL
-
- Output:
- ==========================================================================
- */
-void MlmeCheckForRoaming(struct rt_rtmp_adapter *pAd, unsigned long Now32)
-{
- u16 i;
- struct rt_bss_table *pRoamTab = &pAd->MlmeAux.RoamTab;
- struct rt_bss_entry *pBss;
-
- DBGPRINT(RT_DEBUG_TRACE, ("==> MlmeCheckForRoaming\n"));
- /* put all roaming candidates into RoamTab, and sort in RSSI order */
- BssTableInit(pRoamTab);
- for (i = 0; i < pAd->ScanTab.BssNr; i++) {
- pBss = &pAd->ScanTab.BssEntry[i];
-
- if ((pBss->LastBeaconRxTime + pAd->StaCfg.BeaconLostTime) <
- Now32)
- continue; /* AP disappear */
- if (pBss->Rssi <= RSSI_THRESHOLD_FOR_ROAMING)
- continue; /* RSSI too weak. forget it. */
- if (MAC_ADDR_EQUAL(pBss->Bssid, pAd->CommonCfg.Bssid))
- continue; /* skip current AP */
- if (pBss->Rssi <
- (pAd->StaCfg.RssiSample.LastRssi0 + RSSI_DELTA))
- continue; /* only AP with stronger RSSI is eligible for roaming */
-
- /* AP passing all above rules is put into roaming candidate table */
- NdisMoveMemory(&pRoamTab->BssEntry[pRoamTab->BssNr], pBss,
- sizeof(struct rt_bss_entry));
- pRoamTab->BssNr += 1;
- }
-
- if (pRoamTab->BssNr > 0) {
- /* check CntlMachine.CurrState to avoid collision with NDIS SetOID request */
- if (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) {
- pAd->RalinkCounters.PoorCQIRoamingCount++;
- DBGPRINT(RT_DEBUG_TRACE,
- ("MMCHK - Roaming attempt #%ld\n",
- pAd->RalinkCounters.PoorCQIRoamingCount));
- MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE,
- MT2_MLME_ROAMING_REQ, 0, NULL);
- RTMP_MLME_HANDLER(pAd);
- }
- }
- DBGPRINT(RT_DEBUG_TRACE,
- ("<== MlmeCheckForRoaming(# of candidate= %d)\n",
- pRoamTab->BssNr));
-}
-
-/*
- ==========================================================================
- Description:
- This routine checks if there're other APs out there capable for
- roaming. Caller should call this routine only when link up in INFRA mode
- and channel quality is below CQI_GOOD_THRESHOLD.
-
- IRQL = DISPATCH_LEVEL
-
- Output:
- ==========================================================================
- */
-BOOLEAN MlmeCheckForFastRoaming(struct rt_rtmp_adapter *pAd)
-{
- u16 i;
- struct rt_bss_table *pRoamTab = &pAd->MlmeAux.RoamTab;
- struct rt_bss_entry *pBss;
-
- DBGPRINT(RT_DEBUG_TRACE, ("==> MlmeCheckForFastRoaming\n"));
- /* put all roaming candidates into RoamTab, and sort in RSSI order */
- BssTableInit(pRoamTab);
- for (i = 0; i < pAd->ScanTab.BssNr; i++) {
- pBss = &pAd->ScanTab.BssEntry[i];
-
- if ((pBss->Rssi <= -50)
- && (pBss->Channel == pAd->CommonCfg.Channel))
- continue; /* RSSI too weak. forget it. */
- if (MAC_ADDR_EQUAL(pBss->Bssid, pAd->CommonCfg.Bssid))
- continue; /* skip current AP */
- if (!SSID_EQUAL
- (pBss->Ssid, pBss->SsidLen, pAd->CommonCfg.Ssid,
- pAd->CommonCfg.SsidLen))
- continue; /* skip different SSID */
- if (pBss->Rssi <
- (RTMPMaxRssi
- (pAd, pAd->StaCfg.RssiSample.LastRssi0,
- pAd->StaCfg.RssiSample.LastRssi1,
- pAd->StaCfg.RssiSample.LastRssi2) + RSSI_DELTA))
- continue; /* skip AP without better RSSI */
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("LastRssi0 = %d, pBss->Rssi = %d\n",
- RTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.LastRssi0,
- pAd->StaCfg.RssiSample.LastRssi1,
- pAd->StaCfg.RssiSample.LastRssi2),
- pBss->Rssi));
- /* AP passing all above rules is put into roaming candidate table */
- NdisMoveMemory(&pRoamTab->BssEntry[pRoamTab->BssNr], pBss,
- sizeof(struct rt_bss_entry));
- pRoamTab->BssNr += 1;
- }
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("<== MlmeCheckForFastRoaming (BssNr=%d)\n", pRoamTab->BssNr));
- if (pRoamTab->BssNr > 0) {
- /* check CntlMachine.CurrState to avoid collision with NDIS SetOID request */
- if (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) {
- pAd->RalinkCounters.PoorCQIRoamingCount++;
- DBGPRINT(RT_DEBUG_TRACE,
- ("MMCHK - Roaming attempt #%ld\n",
- pAd->RalinkCounters.PoorCQIRoamingCount));
- MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE,
- MT2_MLME_ROAMING_REQ, 0, NULL);
- RTMP_MLME_HANDLER(pAd);
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-void MlmeSetTxRate(struct rt_rtmp_adapter *pAd,
- struct rt_mac_table_entry *pEntry, struct rt_rtmp_tx_rate_switch * pTxRate)
-{
- u8 MaxMode = MODE_OFDM;
-
- MaxMode = MODE_HTGREENFIELD;
-
- if (pTxRate->STBC && (pAd->StaCfg.MaxHTPhyMode.field.STBC)
- && (pAd->Antenna.field.TxPath == 2))
- pAd->StaCfg.HTPhyMode.field.STBC = STBC_USE;
- else
- pAd->StaCfg.HTPhyMode.field.STBC = STBC_NONE;
-
- if (pTxRate->CurrMCS < MCS_AUTO)
- pAd->StaCfg.HTPhyMode.field.MCS = pTxRate->CurrMCS;
-
- if (pAd->StaCfg.HTPhyMode.field.MCS > 7)
- pAd->StaCfg.HTPhyMode.field.STBC = STBC_NONE;
-
- if (ADHOC_ON(pAd)) {
- /* If peer adhoc is b-only mode, we can't send 11g rate. */
- pAd->StaCfg.HTPhyMode.field.ShortGI = GI_800;
- pEntry->HTPhyMode.field.STBC = STBC_NONE;
-
- /* */
- /* For Adhoc MODE_CCK, driver will use AdhocBOnlyJoined flag to roll back to B only if necessary */
- /* */
- pEntry->HTPhyMode.field.MODE = pTxRate->Mode;
- pEntry->HTPhyMode.field.ShortGI =
- pAd->StaCfg.HTPhyMode.field.ShortGI;
- pEntry->HTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS;
-
- /* Patch speed error in status page */
- pAd->StaCfg.HTPhyMode.field.MODE = pEntry->HTPhyMode.field.MODE;
- } else {
- if (pTxRate->Mode <= MaxMode)
- pAd->StaCfg.HTPhyMode.field.MODE = pTxRate->Mode;
-
- if (pTxRate->ShortGI
- && (pAd->StaCfg.MaxHTPhyMode.field.ShortGI))
- pAd->StaCfg.HTPhyMode.field.ShortGI = GI_400;
- else
- pAd->StaCfg.HTPhyMode.field.ShortGI = GI_800;
-
- /* Reexam each bandwidth's SGI support. */
- if (pAd->StaCfg.HTPhyMode.field.ShortGI == GI_400) {
- if ((pEntry->HTPhyMode.field.BW == BW_20)
- &&
- (!CLIENT_STATUS_TEST_FLAG
- (pEntry, fCLIENT_STATUS_SGI20_CAPABLE)))
- pAd->StaCfg.HTPhyMode.field.ShortGI = GI_800;
- if ((pEntry->HTPhyMode.field.BW == BW_40)
- &&
- (!CLIENT_STATUS_TEST_FLAG
- (pEntry, fCLIENT_STATUS_SGI40_CAPABLE)))
- pAd->StaCfg.HTPhyMode.field.ShortGI = GI_800;
- }
- /* Turn RTS/CTS rate to 6Mbps. */
- if ((pEntry->HTPhyMode.field.MCS == 0)
- && (pAd->StaCfg.HTPhyMode.field.MCS != 0)) {
- pEntry->HTPhyMode.field.MCS =
- pAd->StaCfg.HTPhyMode.field.MCS;
- if (pAd->MacTab.fAnyBASession) {
- AsicUpdateProtect(pAd, HT_FORCERTSCTS,
- ALLN_SETPROTECT, TRUE,
- (BOOLEAN) pAd->MlmeAux.
- AddHtInfo.AddHtInfo2.
- NonGfPresent);
- } else {
- AsicUpdateProtect(pAd,
- pAd->MlmeAux.AddHtInfo.
- AddHtInfo2.OperaionMode,
- ALLN_SETPROTECT, TRUE,
- (BOOLEAN) pAd->MlmeAux.
- AddHtInfo.AddHtInfo2.
- NonGfPresent);
- }
- } else if ((pEntry->HTPhyMode.field.MCS == 8)
- && (pAd->StaCfg.HTPhyMode.field.MCS != 8)) {
- pEntry->HTPhyMode.field.MCS =
- pAd->StaCfg.HTPhyMode.field.MCS;
- if (pAd->MacTab.fAnyBASession) {
- AsicUpdateProtect(pAd, HT_FORCERTSCTS,
- ALLN_SETPROTECT, TRUE,
- (BOOLEAN) pAd->MlmeAux.
- AddHtInfo.AddHtInfo2.
- NonGfPresent);
- } else {
- AsicUpdateProtect(pAd,
- pAd->MlmeAux.AddHtInfo.
- AddHtInfo2.OperaionMode,
- ALLN_SETPROTECT, TRUE,
- (BOOLEAN) pAd->MlmeAux.
- AddHtInfo.AddHtInfo2.
- NonGfPresent);
- }
- } else if ((pEntry->HTPhyMode.field.MCS != 0)
- && (pAd->StaCfg.HTPhyMode.field.MCS == 0)) {
- AsicUpdateProtect(pAd, HT_RTSCTS_6M, ALLN_SETPROTECT,
- TRUE,
- (BOOLEAN) pAd->MlmeAux.AddHtInfo.
- AddHtInfo2.NonGfPresent);
-
- } else if ((pEntry->HTPhyMode.field.MCS != 8)
- && (pAd->StaCfg.HTPhyMode.field.MCS == 8)) {
- AsicUpdateProtect(pAd, HT_RTSCTS_6M, ALLN_SETPROTECT,
- TRUE,
- (BOOLEAN) pAd->MlmeAux.AddHtInfo.
- AddHtInfo2.NonGfPresent);
- }
-
- pEntry->HTPhyMode.field.STBC = pAd->StaCfg.HTPhyMode.field.STBC;
- pEntry->HTPhyMode.field.ShortGI =
- pAd->StaCfg.HTPhyMode.field.ShortGI;
- pEntry->HTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS;
- pEntry->HTPhyMode.field.MODE = pAd->StaCfg.HTPhyMode.field.MODE;
- if ((pAd->StaCfg.MaxHTPhyMode.field.MODE == MODE_HTGREENFIELD)
- && pAd->WIFItestbed.bGreenField)
- pEntry->HTPhyMode.field.MODE = MODE_HTGREENFIELD;
- }
-
- pAd->LastTxRate = (u16)(pEntry->HTPhyMode.word);
-}
-
-/*
- ==========================================================================
- Description:
- This routine calculates the acumulated TxPER of eaxh TxRate. And
- according to the calculation result, change CommonCfg.TxRate which
- is the stable TX Rate we expect the Radio situation could sustained.
-
- CommonCfg.TxRate will change dynamically within {RATE_1/RATE_6, MaxTxRate}
- Output:
- CommonCfg.TxRate -
-
- IRQL = DISPATCH_LEVEL
-
- NOTE:
- call this routine every second
- ==========================================================================
- */
-void MlmeDynamicTxRateSwitching(struct rt_rtmp_adapter *pAd)
-{
- u8 UpRateIdx = 0, DownRateIdx = 0, CurrRateIdx;
- unsigned long i, AccuTxTotalCnt = 0, TxTotalCnt;
- unsigned long TxErrorRatio = 0;
- BOOLEAN bTxRateChanged = FALSE, bUpgradeQuality = FALSE;
- struct rt_rtmp_tx_rate_switch *pCurrTxRate, *pNextTxRate = NULL;
- u8 *pTable;
- u8 TableSize = 0;
- u8 InitTxRateIdx = 0, TrainUp, TrainDown;
- char Rssi, RssiOffset = 0;
- TX_STA_CNT1_STRUC StaTx1;
- TX_STA_CNT0_STRUC TxStaCnt0;
- unsigned long TxRetransmit = 0, TxSuccess = 0, TxFailCount = 0;
- struct rt_mac_table_entry *pEntry;
- struct rt_rssi_sample *pRssi = &pAd->StaCfg.RssiSample;
-
- /* */
- /* walk through MAC table, see if need to change AP's TX rate toward each entry */
- /* */
- for (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++) {
- pEntry = &pAd->MacTab.Content[i];
-
- /* check if this entry need to switch rate automatically */
- if (RTMPCheckEntryEnableAutoRateSwitch(pAd, pEntry) == FALSE)
- continue;
-
- if ((pAd->MacTab.Size == 1) || (pEntry->ValidAsDls)) {
- Rssi = RTMPMaxRssi(pAd,
- pRssi->AvgRssi0,
- pRssi->AvgRssi1, pRssi->AvgRssi2);
-
- /* Update statistic counter */
- RTMP_IO_READ32(pAd, TX_STA_CNT0, &TxStaCnt0.word);
- RTMP_IO_READ32(pAd, TX_STA_CNT1, &StaTx1.word);
- pAd->bUpdateBcnCntDone = TRUE;
- TxRetransmit = StaTx1.field.TxRetransmit;
- TxSuccess = StaTx1.field.TxSuccess;
- TxFailCount = TxStaCnt0.field.TxFailCount;
- TxTotalCnt = TxRetransmit + TxSuccess + TxFailCount;
-
- pAd->RalinkCounters.OneSecTxRetryOkCount +=
- StaTx1.field.TxRetransmit;
- pAd->RalinkCounters.OneSecTxNoRetryOkCount +=
- StaTx1.field.TxSuccess;
- pAd->RalinkCounters.OneSecTxFailCount +=
- TxStaCnt0.field.TxFailCount;
- pAd->WlanCounters.TransmittedFragmentCount.u.LowPart +=
- StaTx1.field.TxSuccess;
- pAd->WlanCounters.RetryCount.u.LowPart +=
- StaTx1.field.TxRetransmit;
- pAd->WlanCounters.FailedCount.u.LowPart +=
- TxStaCnt0.field.TxFailCount;
-
- /* if no traffic in the past 1-sec period, don't change TX rate, */
- /* but clear all bad history. because the bad history may affect the next */
- /* Chariot throughput test */
- AccuTxTotalCnt =
- pAd->RalinkCounters.OneSecTxNoRetryOkCount +
- pAd->RalinkCounters.OneSecTxRetryOkCount +
- pAd->RalinkCounters.OneSecTxFailCount;
-
- if (TxTotalCnt)
- TxErrorRatio =
- ((TxRetransmit +
- TxFailCount) * 100) / TxTotalCnt;
- } else {
- if (INFRA_ON(pAd) && (i == 1))
- Rssi = RTMPMaxRssi(pAd,
- pRssi->AvgRssi0,
- pRssi->AvgRssi1,
- pRssi->AvgRssi2);
- else
- Rssi = RTMPMaxRssi(pAd,
- pEntry->RssiSample.AvgRssi0,
- pEntry->RssiSample.AvgRssi1,
- pEntry->RssiSample.AvgRssi2);
-
- TxTotalCnt = pEntry->OneSecTxNoRetryOkCount +
- pEntry->OneSecTxRetryOkCount +
- pEntry->OneSecTxFailCount;
-
- if (TxTotalCnt)
- TxErrorRatio =
- ((pEntry->OneSecTxRetryOkCount +
- pEntry->OneSecTxFailCount) * 100) /
- TxTotalCnt;
- }
-
- if (TxTotalCnt) {
- /*
- Three AdHoc connections can not work normally if one AdHoc connection is disappeared from a heavy traffic environment generated by ping tool
- We force to set LongRtyLimit and ShortRtyLimit to 0 to stop retransmitting packet, after a while, resoring original settings
- */
- if (TxErrorRatio == 100) {
- TX_RTY_CFG_STRUC TxRtyCfg, TxRtyCfgtmp;
- unsigned long Index;
- unsigned long MACValue;
-
- RTMP_IO_READ32(pAd, TX_RTY_CFG, &TxRtyCfg.word);
- TxRtyCfgtmp.word = TxRtyCfg.word;
- TxRtyCfg.field.LongRtyLimit = 0x0;
- TxRtyCfg.field.ShortRtyLimit = 0x0;
- RTMP_IO_WRITE32(pAd, TX_RTY_CFG, TxRtyCfg.word);
-
- RTMPusecDelay(1);
-
- Index = 0;
- MACValue = 0;
- do {
- RTMP_IO_READ32(pAd, TXRXQ_PCNT,
- &MACValue);
- if ((MACValue & 0xffffff) == 0)
- break;
- Index++;
- RTMPusecDelay(1000);
- } while ((Index < 330)
- &&
- (!RTMP_TEST_FLAG
- (pAd,
- fRTMP_ADAPTER_HALT_IN_PROGRESS)));
-
- RTMP_IO_READ32(pAd, TX_RTY_CFG, &TxRtyCfg.word);
- TxRtyCfg.field.LongRtyLimit =
- TxRtyCfgtmp.field.LongRtyLimit;
- TxRtyCfg.field.ShortRtyLimit =
- TxRtyCfgtmp.field.ShortRtyLimit;
- RTMP_IO_WRITE32(pAd, TX_RTY_CFG, TxRtyCfg.word);
- }
- }
-
- CurrRateIdx = pEntry->CurrTxRateIndex;
-
- MlmeSelectTxRateTable(pAd, pEntry, &pTable, &TableSize,
- &InitTxRateIdx);
-
- if (CurrRateIdx >= TableSize) {
- CurrRateIdx = TableSize - 1;
- }
- /* When switch from Fixed rate -> auto rate, the REAL TX rate might be different from pAd->CommonCfg.TxRateIndex. */
- /* So need to sync here. */
- pCurrTxRate =
- (struct rt_rtmp_tx_rate_switch *) & pTable[(CurrRateIdx + 1) * 5];
- if ((pEntry->HTPhyMode.field.MCS != pCurrTxRate->CurrMCS)
- /*&& (pAd->StaCfg.bAutoTxRateSwitch == TRUE) */
- ) {
-
- /* Need to sync Real Tx rate and our record. */
- /* Then return for next DRS. */
- pCurrTxRate =
- (struct rt_rtmp_tx_rate_switch *) & pTable[(InitTxRateIdx + 1)
- * 5];
- pEntry->CurrTxRateIndex = InitTxRateIdx;
- MlmeSetTxRate(pAd, pEntry, pCurrTxRate);
-
- /* reset all OneSecTx counters */
- RESET_ONE_SEC_TX_CNT(pEntry);
- continue;
- }
- /* decide the next upgrade rate and downgrade rate, if any */
- if ((CurrRateIdx > 0) && (CurrRateIdx < (TableSize - 1))) {
- UpRateIdx = CurrRateIdx + 1;
- DownRateIdx = CurrRateIdx - 1;
- } else if (CurrRateIdx == 0) {
- UpRateIdx = CurrRateIdx + 1;
- DownRateIdx = CurrRateIdx;
- } else if (CurrRateIdx == (TableSize - 1)) {
- UpRateIdx = CurrRateIdx;
- DownRateIdx = CurrRateIdx - 1;
- }
-
- pCurrTxRate =
- (struct rt_rtmp_tx_rate_switch *) & pTable[(CurrRateIdx + 1) * 5];
-
- if ((Rssi > -65) && (pCurrTxRate->Mode >= MODE_HTMIX)) {
- TrainUp =
- (pCurrTxRate->TrainUp +
- (pCurrTxRate->TrainUp >> 1));
- TrainDown =
- (pCurrTxRate->TrainDown +
- (pCurrTxRate->TrainDown >> 1));
- } else {
- TrainUp = pCurrTxRate->TrainUp;
- TrainDown = pCurrTxRate->TrainDown;
- }
-
- /*pAd->DrsCounters.LastTimeTxRateChangeAction = pAd->DrsCounters.LastSecTxRateChangeAction; */
-
- /* */
- /* Keep the last time TxRateChangeAction status. */
- /* */
- pEntry->LastTimeTxRateChangeAction =
- pEntry->LastSecTxRateChangeAction;
-
- /* */
- /* CASE 1. when TX samples are fewer than 15, then decide TX rate solely on RSSI */
- /* (criteria copied from RT2500 for Netopia case) */
- /* */
- if (TxTotalCnt <= 15) {
- char idx = 0;
- u8 TxRateIdx;
- u8 MCS0 = 0, MCS1 = 0, MCS2 = 0, MCS3 = 0, MCS4 =
- 0, MCS5 = 0, MCS6 = 0, MCS7 = 0;
- u8 MCS12 = 0, MCS13 = 0, MCS14 = 0, MCS15 = 0;
- u8 MCS20 = 0, MCS21 = 0, MCS22 = 0, MCS23 = 0; /* 3*3 */
-
- /* check the existence and index of each needed MCS */
- while (idx < pTable[0]) {
- pCurrTxRate =
- (struct rt_rtmp_tx_rate_switch *) & pTable[(idx + 1) *
- 5];
-
- if (pCurrTxRate->CurrMCS == MCS_0) {
- MCS0 = idx;
- } else if (pCurrTxRate->CurrMCS == MCS_1) {
- MCS1 = idx;
- } else if (pCurrTxRate->CurrMCS == MCS_2) {
- MCS2 = idx;
- } else if (pCurrTxRate->CurrMCS == MCS_3) {
- MCS3 = idx;
- } else if (pCurrTxRate->CurrMCS == MCS_4) {
- MCS4 = idx;
- } else if (pCurrTxRate->CurrMCS == MCS_5) {
- MCS5 = idx;
- } else if (pCurrTxRate->CurrMCS == MCS_6) {
- MCS6 = idx;
- }
- /*else if (pCurrTxRate->CurrMCS == MCS_7) */
- else if ((pCurrTxRate->CurrMCS == MCS_7) && (pCurrTxRate->ShortGI == GI_800)) /* prevent the highest MCS using short GI when 1T and low throughput */
- {
- MCS7 = idx;
- } else if (pCurrTxRate->CurrMCS == MCS_12) {
- MCS12 = idx;
- } else if (pCurrTxRate->CurrMCS == MCS_13) {
- MCS13 = idx;
- } else if (pCurrTxRate->CurrMCS == MCS_14) {
- MCS14 = idx;
- }
- else if ((pCurrTxRate->CurrMCS == MCS_15) && (pCurrTxRate->ShortGI == GI_800)) /*we hope to use ShortGI as initial rate, however Atheros's chip has bugs when short GI */
- {
- MCS15 = idx;
- } else if (pCurrTxRate->CurrMCS == MCS_20) /* 3*3 */
- {
- MCS20 = idx;
- } else if (pCurrTxRate->CurrMCS == MCS_21) {
- MCS21 = idx;
- } else if (pCurrTxRate->CurrMCS == MCS_22) {
- MCS22 = idx;
- } else if (pCurrTxRate->CurrMCS == MCS_23) {
- MCS23 = idx;
- }
- idx++;
- }
-
- if (pAd->LatchRfRegs.Channel <= 14) {
- if (pAd->NicConfig2.field.ExternalLNAForG) {
- RssiOffset = 2;
- } else {
- RssiOffset = 5;
- }
- } else {
- if (pAd->NicConfig2.field.ExternalLNAForA) {
- RssiOffset = 5;
- } else {
- RssiOffset = 8;
- }
- }
-
- /*if (MCS15) */
- if ((pTable == RateSwitchTable11BGN3S) || (pTable == RateSwitchTable11N3S) || (pTable == RateSwitchTable)) { /* N mode with 3 stream // 3*3 */
- if (MCS23 && (Rssi >= -70))
- TxRateIdx = MCS23;
- else if (MCS22 && (Rssi >= -72))
- TxRateIdx = MCS22;
- else if (MCS21 && (Rssi >= -76))
- TxRateIdx = MCS21;
- else if (MCS20 && (Rssi >= -78))
- TxRateIdx = MCS20;
- else if (MCS4 && (Rssi >= -82))
- TxRateIdx = MCS4;
- else if (MCS3 && (Rssi >= -84))
- TxRateIdx = MCS3;
- else if (MCS2 && (Rssi >= -86))
- TxRateIdx = MCS2;
- else if (MCS1 && (Rssi >= -88))
- TxRateIdx = MCS1;
- else
- TxRateIdx = MCS0;
- }
-/* else if ((pTable == RateSwitchTable11BGN2S) || (pTable == RateSwitchTable11BGN2SForABand) ||(pTable == RateSwitchTable11N2S) ||(pTable == RateSwitchTable11N2SForABand) || (pTable == RateSwitchTable)) */
- else if ((pTable == RateSwitchTable11BGN2S) || (pTable == RateSwitchTable11BGN2SForABand) || (pTable == RateSwitchTable11N2S) || (pTable == RateSwitchTable11N2SForABand)) /* 3*3 */
- { /* N mode with 2 stream */
- if (MCS15 && (Rssi >= (-70 + RssiOffset)))
- TxRateIdx = MCS15;
- else if (MCS14 && (Rssi >= (-72 + RssiOffset)))
- TxRateIdx = MCS14;
- else if (MCS13 && (Rssi >= (-76 + RssiOffset)))
- TxRateIdx = MCS13;
- else if (MCS12 && (Rssi >= (-78 + RssiOffset)))
- TxRateIdx = MCS12;
- else if (MCS4 && (Rssi >= (-82 + RssiOffset)))
- TxRateIdx = MCS4;
- else if (MCS3 && (Rssi >= (-84 + RssiOffset)))
- TxRateIdx = MCS3;
- else if (MCS2 && (Rssi >= (-86 + RssiOffset)))
- TxRateIdx = MCS2;
- else if (MCS1 && (Rssi >= (-88 + RssiOffset)))
- TxRateIdx = MCS1;
- else
- TxRateIdx = MCS0;
- } else if ((pTable == RateSwitchTable11BGN1S) || (pTable == RateSwitchTable11N1S)) { /* N mode with 1 stream */
- if (MCS7 && (Rssi > (-72 + RssiOffset)))
- TxRateIdx = MCS7;
- else if (MCS6 && (Rssi > (-74 + RssiOffset)))
- TxRateIdx = MCS6;
- else if (MCS5 && (Rssi > (-77 + RssiOffset)))
- TxRateIdx = MCS5;
- else if (MCS4 && (Rssi > (-79 + RssiOffset)))
- TxRateIdx = MCS4;
- else if (MCS3 && (Rssi > (-81 + RssiOffset)))
- TxRateIdx = MCS3;
- else if (MCS2 && (Rssi > (-83 + RssiOffset)))
- TxRateIdx = MCS2;
- else if (MCS1 && (Rssi > (-86 + RssiOffset)))
- TxRateIdx = MCS1;
- else
- TxRateIdx = MCS0;
- } else { /* Legacy mode */
- if (MCS7 && (Rssi > -70))
- TxRateIdx = MCS7;
- else if (MCS6 && (Rssi > -74))
- TxRateIdx = MCS6;
- else if (MCS5 && (Rssi > -78))
- TxRateIdx = MCS5;
- else if (MCS4 && (Rssi > -82))
- TxRateIdx = MCS4;
- else if (MCS4 == 0) /* for B-only mode */
- TxRateIdx = MCS3;
- else if (MCS3 && (Rssi > -85))
- TxRateIdx = MCS3;
- else if (MCS2 && (Rssi > -87))
- TxRateIdx = MCS2;
- else if (MCS1 && (Rssi > -90))
- TxRateIdx = MCS1;
- else
- TxRateIdx = MCS0;
- }
-
- /* if (TxRateIdx != pAd->CommonCfg.TxRateIndex) */
- {
- pEntry->CurrTxRateIndex = TxRateIdx;
- pNextTxRate =
- (struct rt_rtmp_tx_rate_switch *) &
- pTable[(pEntry->CurrTxRateIndex + 1) * 5];
- MlmeSetTxRate(pAd, pEntry, pNextTxRate);
- }
-
- NdisZeroMemory(pEntry->TxQuality,
- sizeof(u16)*
- MAX_STEP_OF_TX_RATE_SWITCH);
- NdisZeroMemory(pEntry->PER,
- sizeof(u8)*
- MAX_STEP_OF_TX_RATE_SWITCH);
- pEntry->fLastSecAccordingRSSI = TRUE;
- /* reset all OneSecTx counters */
- RESET_ONE_SEC_TX_CNT(pEntry);
-
- continue;
- }
-
- if (pEntry->fLastSecAccordingRSSI == TRUE) {
- pEntry->fLastSecAccordingRSSI = FALSE;
- pEntry->LastSecTxRateChangeAction = 0;
- /* reset all OneSecTx counters */
- RESET_ONE_SEC_TX_CNT(pEntry);
-
- continue;
- }
-
- do {
- BOOLEAN bTrainUpDown = FALSE;
-
- pEntry->CurrTxRateStableTime++;
-
- /* downgrade TX quality if PER >= Rate-Down threshold */
- if (TxErrorRatio >= TrainDown) {
- bTrainUpDown = TRUE;
- pEntry->TxQuality[CurrRateIdx] =
- DRS_TX_QUALITY_WORST_BOUND;
- }
- /* upgrade TX quality if PER <= Rate-Up threshold */
- else if (TxErrorRatio <= TrainUp) {
- bTrainUpDown = TRUE;
- bUpgradeQuality = TRUE;
- if (pEntry->TxQuality[CurrRateIdx])
- pEntry->TxQuality[CurrRateIdx]--; /* quality very good in CurrRate */
-
- if (pEntry->TxRateUpPenalty)
- pEntry->TxRateUpPenalty--;
- else if (pEntry->TxQuality[UpRateIdx])
- pEntry->TxQuality[UpRateIdx]--; /* may improve next UP rate's quality */
- }
-
- pEntry->PER[CurrRateIdx] = (u8)TxErrorRatio;
-
- if (bTrainUpDown) {
- /* perform DRS - consider TxRate Down first, then rate up. */
- if ((CurrRateIdx != DownRateIdx)
- && (pEntry->TxQuality[CurrRateIdx] >=
- DRS_TX_QUALITY_WORST_BOUND)) {
- pEntry->CurrTxRateIndex = DownRateIdx;
- } else if ((CurrRateIdx != UpRateIdx)
- && (pEntry->TxQuality[UpRateIdx] <=
- 0)) {
- pEntry->CurrTxRateIndex = UpRateIdx;
- }
- }
- } while (FALSE);
-
- /* if rate-up happen, clear all bad history of all TX rates */
- if (pEntry->CurrTxRateIndex > CurrRateIdx) {
- pEntry->CurrTxRateStableTime = 0;
- pEntry->TxRateUpPenalty = 0;
- pEntry->LastSecTxRateChangeAction = 1; /* rate UP */
- NdisZeroMemory(pEntry->TxQuality,
- sizeof(u16)*
- MAX_STEP_OF_TX_RATE_SWITCH);
- NdisZeroMemory(pEntry->PER,
- sizeof(u8)*
- MAX_STEP_OF_TX_RATE_SWITCH);
-
- /* */
- /* For TxRate fast train up */
- /* */
- if (!pAd->StaCfg.StaQuickResponeForRateUpTimerRunning) {
- RTMPSetTimer(&pAd->StaCfg.
- StaQuickResponeForRateUpTimer,
- 100);
-
- pAd->StaCfg.
- StaQuickResponeForRateUpTimerRunning = TRUE;
- }
- bTxRateChanged = TRUE;
- }
- /* if rate-down happen, only clear DownRate's bad history */
- else if (pEntry->CurrTxRateIndex < CurrRateIdx) {
- pEntry->CurrTxRateStableTime = 0;
- pEntry->TxRateUpPenalty = 0; /* no penalty */
- pEntry->LastSecTxRateChangeAction = 2; /* rate DOWN */
- pEntry->TxQuality[pEntry->CurrTxRateIndex] = 0;
- pEntry->PER[pEntry->CurrTxRateIndex] = 0;
-
- /* */
- /* For TxRate fast train down */
- /* */
- if (!pAd->StaCfg.StaQuickResponeForRateUpTimerRunning) {
- RTMPSetTimer(&pAd->StaCfg.
- StaQuickResponeForRateUpTimer,
- 100);
-
- pAd->StaCfg.
- StaQuickResponeForRateUpTimerRunning = TRUE;
- }
- bTxRateChanged = TRUE;
- } else {
- pEntry->LastSecTxRateChangeAction = 0; /* rate no change */
- bTxRateChanged = FALSE;
- }
-
- pEntry->LastTxOkCount = TxSuccess;
- {
- u8 tmpTxRate;
-
- /* to fix tcp ack issue */
- if (!bTxRateChanged
- && (pAd->RalinkCounters.OneSecReceivedByteCount >
- (pAd->RalinkCounters.
- OneSecTransmittedByteCount * 5))) {
- tmpTxRate = DownRateIdx;
- DBGPRINT_RAW(RT_DEBUG_TRACE,
- ("DRS: Rx(%d) is 5 times larger than Tx(%d), use low rate (curr=%d, tmp=%d)\n",
- pAd->RalinkCounters.
- OneSecReceivedByteCount,
- pAd->RalinkCounters.
- OneSecTransmittedByteCount,
- pEntry->CurrTxRateIndex,
- tmpTxRate));
- } else {
- tmpTxRate = pEntry->CurrTxRateIndex;
- }
-
- pNextTxRate =
- (struct rt_rtmp_tx_rate_switch *) & pTable[(tmpTxRate + 1) *
- 5];
- }
- if (bTxRateChanged && pNextTxRate) {
- MlmeSetTxRate(pAd, pEntry, pNextTxRate);
- }
- /* reset all OneSecTx counters */
- RESET_ONE_SEC_TX_CNT(pEntry);
- }
-}
-
-/*
- ========================================================================
- Routine Description:
- Station side, Auto TxRate faster train up timer call back function.
-
- Arguments:
- SystemSpecific1 - Not used.
- FunctionContext - Pointer to our Adapter context.
- SystemSpecific2 - Not used.
- SystemSpecific3 - Not used.
-
- Return Value:
- None
-
- ========================================================================
-*/
-void StaQuickResponeForRateUpExec(void *SystemSpecific1,
- void *FunctionContext,
- void *SystemSpecific2,
- void *SystemSpecific3)
-{
- struct rt_rtmp_adapter *pAd = (struct rt_rtmp_adapter *)FunctionContext;
- u8 UpRateIdx = 0, DownRateIdx = 0, CurrRateIdx = 0;
- unsigned long TxTotalCnt;
- unsigned long TxErrorRatio = 0;
- BOOLEAN bTxRateChanged; /*, bUpgradeQuality = FALSE; */
- struct rt_rtmp_tx_rate_switch *pCurrTxRate, *pNextTxRate = NULL;
- u8 *pTable;
- u8 TableSize = 0;
- u8 InitTxRateIdx = 0, TrainUp, TrainDown;
- TX_STA_CNT1_STRUC StaTx1;
- TX_STA_CNT0_STRUC TxStaCnt0;
- char Rssi, ratio;
- unsigned long TxRetransmit = 0, TxSuccess = 0, TxFailCount = 0;
- struct rt_mac_table_entry *pEntry;
- unsigned long i;
-
- pAd->StaCfg.StaQuickResponeForRateUpTimerRunning = FALSE;
-
- /* */
- /* walk through MAC table, see if need to change AP's TX rate toward each entry */
- /* */
- for (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++) {
- pEntry = &pAd->MacTab.Content[i];
-
- /* check if this entry need to switch rate automatically */
- if (RTMPCheckEntryEnableAutoRateSwitch(pAd, pEntry) == FALSE)
- continue;
-
- if (INFRA_ON(pAd) && (i == 1))
- Rssi = RTMPMaxRssi(pAd,
- pAd->StaCfg.RssiSample.AvgRssi0,
- pAd->StaCfg.RssiSample.AvgRssi1,
- pAd->StaCfg.RssiSample.AvgRssi2);
- else
- Rssi = RTMPMaxRssi(pAd,
- pEntry->RssiSample.AvgRssi0,
- pEntry->RssiSample.AvgRssi1,
- pEntry->RssiSample.AvgRssi2);
-
- CurrRateIdx = pAd->CommonCfg.TxRateIndex;
-
- MlmeSelectTxRateTable(pAd, pEntry, &pTable, &TableSize,
- &InitTxRateIdx);
-
- /* decide the next upgrade rate and downgrade rate, if any */
- if ((CurrRateIdx > 0) && (CurrRateIdx < (TableSize - 1))) {
- UpRateIdx = CurrRateIdx + 1;
- DownRateIdx = CurrRateIdx - 1;
- } else if (CurrRateIdx == 0) {
- UpRateIdx = CurrRateIdx + 1;
- DownRateIdx = CurrRateIdx;
- } else if (CurrRateIdx == (TableSize - 1)) {
- UpRateIdx = CurrRateIdx;
- DownRateIdx = CurrRateIdx - 1;
- }
-
- pCurrTxRate =
- (struct rt_rtmp_tx_rate_switch *) & pTable[(CurrRateIdx + 1) * 5];
-
- if ((Rssi > -65) && (pCurrTxRate->Mode >= MODE_HTMIX)) {
- TrainUp =
- (pCurrTxRate->TrainUp +
- (pCurrTxRate->TrainUp >> 1));
- TrainDown =
- (pCurrTxRate->TrainDown +
- (pCurrTxRate->TrainDown >> 1));
- } else {
- TrainUp = pCurrTxRate->TrainUp;
- TrainDown = pCurrTxRate->TrainDown;
- }
-
- if (pAd->MacTab.Size == 1) {
- /* Update statistic counter */
- RTMP_IO_READ32(pAd, TX_STA_CNT0, &TxStaCnt0.word);
- RTMP_IO_READ32(pAd, TX_STA_CNT1, &StaTx1.word);
-
- TxRetransmit = StaTx1.field.TxRetransmit;
- TxSuccess = StaTx1.field.TxSuccess;
- TxFailCount = TxStaCnt0.field.TxFailCount;
- TxTotalCnt = TxRetransmit + TxSuccess + TxFailCount;
-
- pAd->RalinkCounters.OneSecTxRetryOkCount +=
- StaTx1.field.TxRetransmit;
- pAd->RalinkCounters.OneSecTxNoRetryOkCount +=
- StaTx1.field.TxSuccess;
- pAd->RalinkCounters.OneSecTxFailCount +=
- TxStaCnt0.field.TxFailCount;
- pAd->WlanCounters.TransmittedFragmentCount.u.LowPart +=
- StaTx1.field.TxSuccess;
- pAd->WlanCounters.RetryCount.u.LowPart +=
- StaTx1.field.TxRetransmit;
- pAd->WlanCounters.FailedCount.u.LowPart +=
- TxStaCnt0.field.TxFailCount;
-
- if (TxTotalCnt)
- TxErrorRatio =
- ((TxRetransmit +
- TxFailCount) * 100) / TxTotalCnt;
- } else {
- TxTotalCnt = pEntry->OneSecTxNoRetryOkCount +
- pEntry->OneSecTxRetryOkCount +
- pEntry->OneSecTxFailCount;
-
- if (TxTotalCnt)
- TxErrorRatio =
- ((pEntry->OneSecTxRetryOkCount +
- pEntry->OneSecTxFailCount) * 100) /
- TxTotalCnt;
- }
-
- /* */
- /* CASE 1. when TX samples are fewer than 15, then decide TX rate solely on RSSI */
- /* (criteria copied from RT2500 for Netopia case) */
- /* */
- if (TxTotalCnt <= 12) {
- NdisZeroMemory(pAd->DrsCounters.TxQuality,
- sizeof(u16)*
- MAX_STEP_OF_TX_RATE_SWITCH);
- NdisZeroMemory(pAd->DrsCounters.PER,
- sizeof(u8)*
- MAX_STEP_OF_TX_RATE_SWITCH);
-
- if ((pAd->DrsCounters.LastSecTxRateChangeAction == 1)
- && (CurrRateIdx != DownRateIdx)) {
- pAd->CommonCfg.TxRateIndex = DownRateIdx;
- pAd->DrsCounters.TxQuality[CurrRateIdx] =
- DRS_TX_QUALITY_WORST_BOUND;
- } else
- if ((pAd->DrsCounters.LastSecTxRateChangeAction ==
- 2) && (CurrRateIdx != UpRateIdx)) {
- pAd->CommonCfg.TxRateIndex = UpRateIdx;
- }
-
- DBGPRINT_RAW(RT_DEBUG_TRACE,
- ("QuickDRS: TxTotalCnt <= 15, train back to original rate \n"));
- return;
- }
-
- do {
- unsigned long OneSecTxNoRetryOKRationCount;
-
- if (pAd->DrsCounters.LastTimeTxRateChangeAction == 0)
- ratio = 5;
- else
- ratio = 4;
-
- /* downgrade TX quality if PER >= Rate-Down threshold */
- if (TxErrorRatio >= TrainDown) {
- pAd->DrsCounters.TxQuality[CurrRateIdx] =
- DRS_TX_QUALITY_WORST_BOUND;
- }
-
- pAd->DrsCounters.PER[CurrRateIdx] =
- (u8)TxErrorRatio;
-
- OneSecTxNoRetryOKRationCount = (TxSuccess * ratio);
-
- /* perform DRS - consider TxRate Down first, then rate up. */
- if ((pAd->DrsCounters.LastSecTxRateChangeAction == 1)
- && (CurrRateIdx != DownRateIdx)) {
- if ((pAd->DrsCounters.LastTxOkCount + 2) >=
- OneSecTxNoRetryOKRationCount) {
- pAd->CommonCfg.TxRateIndex =
- DownRateIdx;
- pAd->DrsCounters.
- TxQuality[CurrRateIdx] =
- DRS_TX_QUALITY_WORST_BOUND;
-
- }
-
- } else
- if ((pAd->DrsCounters.LastSecTxRateChangeAction ==
- 2) && (CurrRateIdx != UpRateIdx)) {
- if ((TxErrorRatio >= 50)
- || (TxErrorRatio >= TrainDown)) {
-
- } else if ((pAd->DrsCounters.LastTxOkCount + 2)
- >= OneSecTxNoRetryOKRationCount) {
- pAd->CommonCfg.TxRateIndex = UpRateIdx;
- }
- }
- } while (FALSE);
-
- /* if rate-up happen, clear all bad history of all TX rates */
- if (pAd->CommonCfg.TxRateIndex > CurrRateIdx) {
- pAd->DrsCounters.TxRateUpPenalty = 0;
- NdisZeroMemory(pAd->DrsCounters.TxQuality,
- sizeof(u16)*
- MAX_STEP_OF_TX_RATE_SWITCH);
- NdisZeroMemory(pAd->DrsCounters.PER,
- sizeof(u8)*
- MAX_STEP_OF_TX_RATE_SWITCH);
- bTxRateChanged = TRUE;
- }
- /* if rate-down happen, only clear DownRate's bad history */
- else if (pAd->CommonCfg.TxRateIndex < CurrRateIdx) {
- DBGPRINT_RAW(RT_DEBUG_TRACE,
- ("QuickDRS: --TX rate from %d to %d \n",
- CurrRateIdx, pAd->CommonCfg.TxRateIndex));
-
- pAd->DrsCounters.TxRateUpPenalty = 0; /* no penalty */
- pAd->DrsCounters.TxQuality[pAd->CommonCfg.TxRateIndex] =
- 0;
- pAd->DrsCounters.PER[pAd->CommonCfg.TxRateIndex] = 0;
- bTxRateChanged = TRUE;
- } else {
- bTxRateChanged = FALSE;
- }
-
- pNextTxRate =
- (struct rt_rtmp_tx_rate_switch *) &
- pTable[(pAd->CommonCfg.TxRateIndex + 1) * 5];
- if (bTxRateChanged && pNextTxRate) {
- MlmeSetTxRate(pAd, pEntry, pNextTxRate);
- }
- }
-}
-
-/*
- ==========================================================================
- Description:
- This routine is executed periodically inside MlmePeriodicExec() after
- association with an AP.
- It checks if StaCfg.Psm is consistent with user policy (recorded in
- StaCfg.WindowsPowerMode). If not, enforce user policy. However,
- there're some conditions to consider:
- 1. we don't support power-saving in ADHOC mode, so Psm=PWR_ACTIVE all
- the time when Mibss==TRUE
- 2. When link up in INFRA mode, Psm should not be switch to PWR_SAVE
- if outgoing traffic available in TxRing or MgmtRing.
- Output:
- 1. change pAd->StaCfg.Psm to PWR_SAVE or leave it untouched
-
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-void MlmeCheckPsmChange(struct rt_rtmp_adapter *pAd, unsigned long Now32)
-{
- unsigned long PowerMode;
-
- /* condition - */
- /* 1. Psm maybe ON only happen in INFRASTRUCTURE mode */
- /* 2. user wants either MAX_PSP or FAST_PSP */
- /* 3. but current psm is not in PWR_SAVE */
- /* 4. CNTL state machine is not doing SCANning */
- /* 5. no TX SUCCESS event for the past 1-sec period */
- PowerMode = pAd->StaCfg.WindowsPowerMode;
-
- if (INFRA_ON(pAd) &&
- (PowerMode != Ndis802_11PowerModeCAM) &&
- (pAd->StaCfg.Psm == PWR_ACTIVE) &&
-/* (! RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) */
- (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) &&
- RTMP_TEST_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP)
- /*&&
- (pAd->RalinkCounters.OneSecTxNoRetryOkCount == 0) &&
- (pAd->RalinkCounters.OneSecTxRetryOkCount == 0) */
- ) {
- NdisGetSystemUpTime(&pAd->Mlme.LastSendNULLpsmTime);
- pAd->RalinkCounters.RxCountSinceLastNULL = 0;
- RTMP_SET_PSM_BIT(pAd, PWR_SAVE);
- if (!
- (pAd->CommonCfg.bAPSDCapable
- && pAd->CommonCfg.APEdcaParm.bAPSDCapable)) {
- RTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, FALSE);
- } else {
- RTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE);
- }
- }
-}
-
-/* IRQL = PASSIVE_LEVEL */
-/* IRQL = DISPATCH_LEVEL */
-void MlmeSetPsmBit(struct rt_rtmp_adapter *pAd, u16 psm)
-{
- AUTO_RSP_CFG_STRUC csr4;
-
- pAd->StaCfg.Psm = psm;
- RTMP_IO_READ32(pAd, AUTO_RSP_CFG, &csr4.word);
- csr4.field.AckCtsPsmBit = (psm == PWR_SAVE) ? 1 : 0;
- RTMP_IO_WRITE32(pAd, AUTO_RSP_CFG, csr4.word);
-
- DBGPRINT(RT_DEBUG_TRACE, ("MlmeSetPsmBit = %d\n", psm));
-}
-
-/*
- ==========================================================================
- Description:
- This routine calculates TxPER, RxPER of the past N-sec period. And
- according to the calculation result, ChannelQuality is calculated here
- to decide if current AP is still doing the job.
-
- If ChannelQuality is not good, a ROAMing attempt may be tried later.
- Output:
- StaCfg.ChannelQuality - 0..100
-
- IRQL = DISPATCH_LEVEL
-
- NOTE: This routine decide channle quality based on RX CRC error ratio.
- Caller should make sure a function call to NICUpdateRawCounters(pAd)
- is performed right before this routine, so that this routine can decide
- channel quality based on the most up-to-date information
- ==========================================================================
- */
-void MlmeCalculateChannelQuality(struct rt_rtmp_adapter *pAd,
- struct rt_mac_table_entry *pMacEntry, unsigned long Now32)
-{
- unsigned long TxOkCnt, TxCnt, TxPER, TxPRR;
- unsigned long RxCnt, RxPER;
- u8 NorRssi;
- char MaxRssi;
- struct rt_rssi_sample *pRssiSample = NULL;
- u32 OneSecTxNoRetryOkCount = 0;
- u32 OneSecTxRetryOkCount = 0;
- u32 OneSecTxFailCount = 0;
- u32 OneSecRxOkCnt = 0;
- u32 OneSecRxFcsErrCnt = 0;
- unsigned long ChannelQuality = 0; /* 0..100, Channel Quality Indication for Roaming */
- unsigned long BeaconLostTime = pAd->StaCfg.BeaconLostTime;
-
- if (pAd->OpMode == OPMODE_STA) {
- pRssiSample = &pAd->StaCfg.RssiSample;
- OneSecTxNoRetryOkCount =
- pAd->RalinkCounters.OneSecTxNoRetryOkCount;
- OneSecTxRetryOkCount = pAd->RalinkCounters.OneSecTxRetryOkCount;
- OneSecTxFailCount = pAd->RalinkCounters.OneSecTxFailCount;
- OneSecRxOkCnt = pAd->RalinkCounters.OneSecRxOkCnt;
- OneSecRxFcsErrCnt = pAd->RalinkCounters.OneSecRxFcsErrCnt;
- }
-
- MaxRssi = RTMPMaxRssi(pAd, pRssiSample->LastRssi0,
- pRssiSample->LastRssi1, pRssiSample->LastRssi2);
-
- /* */
- /* calculate TX packet error ratio and TX retry ratio - if too few TX samples, skip TX related statistics */
- /* */
- TxOkCnt = OneSecTxNoRetryOkCount + OneSecTxRetryOkCount;
- TxCnt = TxOkCnt + OneSecTxFailCount;
- if (TxCnt < 5) {
- TxPER = 0;
- TxPRR = 0;
- } else {
- TxPER = (OneSecTxFailCount * 100) / TxCnt;
- TxPRR = ((TxCnt - OneSecTxNoRetryOkCount) * 100) / TxCnt;
- }
-
- /* */
- /* calculate RX PER - don't take RxPER into consideration if too few sample */
- /* */
- RxCnt = OneSecRxOkCnt + OneSecRxFcsErrCnt;
- if (RxCnt < 5)
- RxPER = 0;
- else
- RxPER = (OneSecRxFcsErrCnt * 100) / RxCnt;
-
- /* */
- /* decide ChannelQuality based on: 1)last BEACON received time, 2)last RSSI, 3)TxPER, and 4)RxPER */
- /* */
- if ((pAd->OpMode == OPMODE_STA) && INFRA_ON(pAd) && (OneSecTxNoRetryOkCount < 2) && /* no heavy traffic */
- ((pAd->StaCfg.LastBeaconRxTime + BeaconLostTime) < Now32)) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("BEACON lost > %ld msec with TxOkCnt=%ld -> CQI=0\n",
- BeaconLostTime, TxOkCnt));
- ChannelQuality = 0;
- } else {
- /* Normalize Rssi */
- if (MaxRssi > -40)
- NorRssi = 100;
- else if (MaxRssi < -90)
- NorRssi = 0;
- else
- NorRssi = (MaxRssi + 90) * 2;
-
- /* ChannelQuality = W1*RSSI + W2*TxPRR + W3*RxPER (RSSI 0..100), (TxPER 100..0), (RxPER 100..0) */
- ChannelQuality = (RSSI_WEIGHTING * NorRssi +
- TX_WEIGHTING * (100 - TxPRR) +
- RX_WEIGHTING * (100 - RxPER)) / 100;
- }
-
- if (pAd->OpMode == OPMODE_STA)
- pAd->Mlme.ChannelQuality =
- (ChannelQuality > 100) ? 100 : ChannelQuality;
-
-}
-
-/* IRQL = DISPATCH_LEVEL */
-void MlmeSetTxPreamble(struct rt_rtmp_adapter *pAd, u16 TxPreamble)
-{
- AUTO_RSP_CFG_STRUC csr4;
-
- /* */
- /* Always use Long preamble before verifiation short preamble functionality works well. */
- /* Todo: remove the following line if short preamble functionality works */
- /* */
- /*TxPreamble = Rt802_11PreambleLong; */
-
- RTMP_IO_READ32(pAd, AUTO_RSP_CFG, &csr4.word);
- if (TxPreamble == Rt802_11PreambleLong) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("MlmeSetTxPreamble (= long PREAMBLE)\n"));
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED);
- csr4.field.AutoResponderPreamble = 0;
- } else {
- /* NOTE: 1Mbps should always use long preamble */
- DBGPRINT(RT_DEBUG_TRACE,
- ("MlmeSetTxPreamble (= short PREAMBLE)\n"));
- OPSTATUS_SET_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED);
- csr4.field.AutoResponderPreamble = 1;
- }
-
- RTMP_IO_WRITE32(pAd, AUTO_RSP_CFG, csr4.word);
-}
-
-/*
- ==========================================================================
- Description:
- Update basic rate bitmap
- ==========================================================================
- */
-
-void UpdateBasicRateBitmap(struct rt_rtmp_adapter *pAdapter)
-{
- int i, j;
- /* 1 2 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54 */
- u8 rate[] = { 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108 };
- u8 *sup_p = pAdapter->CommonCfg.SupRate;
- u8 *ext_p = pAdapter->CommonCfg.ExtRate;
- unsigned long bitmap = pAdapter->CommonCfg.BasicRateBitmap;
-
- /* if A mode, always use fix BasicRateBitMap */
- /*if (pAdapter->CommonCfg.Channel == PHY_11A) */
- if (pAdapter->CommonCfg.Channel > 14)
- pAdapter->CommonCfg.BasicRateBitmap = 0x150; /* 6, 12, 24M */
- /* End of if */
-
- if (pAdapter->CommonCfg.BasicRateBitmap > 4095) {
- /* (2 ^ MAX_LEN_OF_SUPPORTED_RATES) -1 */
- return;
- }
- /* End of if */
- for (i = 0; i < MAX_LEN_OF_SUPPORTED_RATES; i++) {
- sup_p[i] &= 0x7f;
- ext_p[i] &= 0x7f;
- } /* End of for */
-
- for (i = 0; i < MAX_LEN_OF_SUPPORTED_RATES; i++) {
- if (bitmap & (1 << i)) {
- for (j = 0; j < MAX_LEN_OF_SUPPORTED_RATES; j++) {
- if (sup_p[j] == rate[i])
- sup_p[j] |= 0x80;
- /* End of if */
- } /* End of for */
-
- for (j = 0; j < MAX_LEN_OF_SUPPORTED_RATES; j++) {
- if (ext_p[j] == rate[i])
- ext_p[j] |= 0x80;
- /* End of if */
- } /* End of for */
- } /* End of if */
- } /* End of for */
-} /* End of UpdateBasicRateBitmap */
-
-/* IRQL = PASSIVE_LEVEL */
-/* IRQL = DISPATCH_LEVEL */
-/* bLinkUp is to identify the initial link speed. */
-/* TRUE indicates the rate update at linkup, we should not try to set the rate at 54Mbps. */
-void MlmeUpdateTxRates(struct rt_rtmp_adapter *pAd, IN BOOLEAN bLinkUp, u8 apidx)
-{
- int i, num;
- u8 Rate = RATE_6, MaxDesire = RATE_1, MaxSupport = RATE_1;
- u8 MinSupport = RATE_54;
- unsigned long BasicRateBitmap = 0;
- u8 CurrBasicRate = RATE_1;
- u8 *pSupRate, SupRateLen, *pExtRate, ExtRateLen;
- PHTTRANSMIT_SETTING pHtPhy = NULL;
- PHTTRANSMIT_SETTING pMaxHtPhy = NULL;
- PHTTRANSMIT_SETTING pMinHtPhy = NULL;
- BOOLEAN *auto_rate_cur_p;
- u8 HtMcs = MCS_AUTO;
-
- /* find max desired rate */
- UpdateBasicRateBitmap(pAd);
-
- num = 0;
- auto_rate_cur_p = NULL;
- for (i = 0; i < MAX_LEN_OF_SUPPORTED_RATES; i++) {
- switch (pAd->CommonCfg.DesireRate[i] & 0x7f) {
- case 2:
- Rate = RATE_1;
- num++;
- break;
- case 4:
- Rate = RATE_2;
- num++;
- break;
- case 11:
- Rate = RATE_5_5;
- num++;
- break;
- case 22:
- Rate = RATE_11;
- num++;
- break;
- case 12:
- Rate = RATE_6;
- num++;
- break;
- case 18:
- Rate = RATE_9;
- num++;
- break;
- case 24:
- Rate = RATE_12;
- num++;
- break;
- case 36:
- Rate = RATE_18;
- num++;
- break;
- case 48:
- Rate = RATE_24;
- num++;
- break;
- case 72:
- Rate = RATE_36;
- num++;
- break;
- case 96:
- Rate = RATE_48;
- num++;
- break;
- case 108:
- Rate = RATE_54;
- num++;
- break;
- /*default: Rate = RATE_1; break; */
- }
- if (MaxDesire < Rate)
- MaxDesire = Rate;
- }
-
-/*=========================================================================== */
-/*=========================================================================== */
- {
- pHtPhy = &pAd->StaCfg.HTPhyMode;
- pMaxHtPhy = &pAd->StaCfg.MaxHTPhyMode;
- pMinHtPhy = &pAd->StaCfg.MinHTPhyMode;
-
- auto_rate_cur_p = &pAd->StaCfg.bAutoTxRateSwitch;
- HtMcs = pAd->StaCfg.DesiredTransmitSetting.field.MCS;
-
- if ((pAd->StaCfg.BssType == BSS_ADHOC) &&
- (pAd->CommonCfg.PhyMode == PHY_11B) &&
- (MaxDesire > RATE_11)) {
- MaxDesire = RATE_11;
- }
- }
-
- pAd->CommonCfg.MaxDesiredRate = MaxDesire;
- pMinHtPhy->word = 0;
- pMaxHtPhy->word = 0;
- pHtPhy->word = 0;
-
- /* Auto rate switching is enabled only if more than one DESIRED RATES are */
- /* specified; otherwise disabled */
- if (num <= 1) {
- /*OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED); */
- /*pAd->CommonCfg.bAutoTxRateSwitch = FALSE; */
- *auto_rate_cur_p = FALSE;
- } else {
- /*OPSTATUS_SET_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED); */
- /*pAd->CommonCfg.bAutoTxRateSwitch = TRUE; */
- *auto_rate_cur_p = TRUE;
- }
-
- if (HtMcs != MCS_AUTO) {
- /*OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED); */
- /*pAd->CommonCfg.bAutoTxRateSwitch = FALSE; */
- *auto_rate_cur_p = FALSE;
- } else {
- /*OPSTATUS_SET_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED); */
- /*pAd->CommonCfg.bAutoTxRateSwitch = TRUE; */
- *auto_rate_cur_p = TRUE;
- }
-
- if ((ADHOC_ON(pAd) || INFRA_ON(pAd)) && (pAd->OpMode == OPMODE_STA)) {
- pSupRate = &pAd->StaActive.SupRate[0];
- pExtRate = &pAd->StaActive.ExtRate[0];
- SupRateLen = pAd->StaActive.SupRateLen;
- ExtRateLen = pAd->StaActive.ExtRateLen;
- } else {
- pSupRate = &pAd->CommonCfg.SupRate[0];
- pExtRate = &pAd->CommonCfg.ExtRate[0];
- SupRateLen = pAd->CommonCfg.SupRateLen;
- ExtRateLen = pAd->CommonCfg.ExtRateLen;
- }
-
- /* find max supported rate */
- for (i = 0; i < SupRateLen; i++) {
- switch (pSupRate[i] & 0x7f) {
- case 2:
- Rate = RATE_1;
- if (pSupRate[i] & 0x80)
- BasicRateBitmap |= 0x0001;
- break;
- case 4:
- Rate = RATE_2;
- if (pSupRate[i] & 0x80)
- BasicRateBitmap |= 0x0002;
- break;
- case 11:
- Rate = RATE_5_5;
- if (pSupRate[i] & 0x80)
- BasicRateBitmap |= 0x0004;
- break;
- case 22:
- Rate = RATE_11;
- if (pSupRate[i] & 0x80)
- BasicRateBitmap |= 0x0008;
- break;
- case 12:
- Rate = RATE_6; /*if (pSupRate[i] & 0x80) */
- BasicRateBitmap |= 0x0010;
- break;
- case 18:
- Rate = RATE_9;
- if (pSupRate[i] & 0x80)
- BasicRateBitmap |= 0x0020;
- break;
- case 24:
- Rate = RATE_12; /*if (pSupRate[i] & 0x80) */
- BasicRateBitmap |= 0x0040;
- break;
- case 36:
- Rate = RATE_18;
- if (pSupRate[i] & 0x80)
- BasicRateBitmap |= 0x0080;
- break;
- case 48:
- Rate = RATE_24; /*if (pSupRate[i] & 0x80) */
- BasicRateBitmap |= 0x0100;
- break;
- case 72:
- Rate = RATE_36;
- if (pSupRate[i] & 0x80)
- BasicRateBitmap |= 0x0200;
- break;
- case 96:
- Rate = RATE_48;
- if (pSupRate[i] & 0x80)
- BasicRateBitmap |= 0x0400;
- break;
- case 108:
- Rate = RATE_54;
- if (pSupRate[i] & 0x80)
- BasicRateBitmap |= 0x0800;
- break;
- default:
- Rate = RATE_1;
- break;
- }
- if (MaxSupport < Rate)
- MaxSupport = Rate;
-
- if (MinSupport > Rate)
- MinSupport = Rate;
- }
-
- for (i = 0; i < ExtRateLen; i++) {
- switch (pExtRate[i] & 0x7f) {
- case 2:
- Rate = RATE_1;
- if (pExtRate[i] & 0x80)
- BasicRateBitmap |= 0x0001;
- break;
- case 4:
- Rate = RATE_2;
- if (pExtRate[i] & 0x80)
- BasicRateBitmap |= 0x0002;
- break;
- case 11:
- Rate = RATE_5_5;
- if (pExtRate[i] & 0x80)
- BasicRateBitmap |= 0x0004;
- break;
- case 22:
- Rate = RATE_11;
- if (pExtRate[i] & 0x80)
- BasicRateBitmap |= 0x0008;
- break;
- case 12:
- Rate = RATE_6; /*if (pExtRate[i] & 0x80) */
- BasicRateBitmap |= 0x0010;
- break;
- case 18:
- Rate = RATE_9;
- if (pExtRate[i] & 0x80)
- BasicRateBitmap |= 0x0020;
- break;
- case 24:
- Rate = RATE_12; /*if (pExtRate[i] & 0x80) */
- BasicRateBitmap |= 0x0040;
- break;
- case 36:
- Rate = RATE_18;
- if (pExtRate[i] & 0x80)
- BasicRateBitmap |= 0x0080;
- break;
- case 48:
- Rate = RATE_24; /*if (pExtRate[i] & 0x80) */
- BasicRateBitmap |= 0x0100;
- break;
- case 72:
- Rate = RATE_36;
- if (pExtRate[i] & 0x80)
- BasicRateBitmap |= 0x0200;
- break;
- case 96:
- Rate = RATE_48;
- if (pExtRate[i] & 0x80)
- BasicRateBitmap |= 0x0400;
- break;
- case 108:
- Rate = RATE_54;
- if (pExtRate[i] & 0x80)
- BasicRateBitmap |= 0x0800;
- break;
- default:
- Rate = RATE_1;
- break;
- }
- if (MaxSupport < Rate)
- MaxSupport = Rate;
-
- if (MinSupport > Rate)
- MinSupport = Rate;
- }
-
- RTMP_IO_WRITE32(pAd, LEGACY_BASIC_RATE, BasicRateBitmap);
-
- /* bug fix */
- /* pAd->CommonCfg.BasicRateBitmap = BasicRateBitmap; */
-
- /* calculate the exptected ACK rate for each TX rate. This info is used to caculate */
- /* the DURATION field of outgoing uniicast DATA/MGMT frame */
- for (i = 0; i < MAX_LEN_OF_SUPPORTED_RATES; i++) {
- if (BasicRateBitmap & (0x01 << i))
- CurrBasicRate = (u8)i;
- pAd->CommonCfg.ExpectedACKRate[i] = CurrBasicRate;
- }
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("MlmeUpdateTxRates[MaxSupport = %d] = MaxDesire %d Mbps\n",
- RateIdToMbps[MaxSupport], RateIdToMbps[MaxDesire]));
- /* max tx rate = min {max desire rate, max supported rate} */
- if (MaxSupport < MaxDesire)
- pAd->CommonCfg.MaxTxRate = MaxSupport;
- else
- pAd->CommonCfg.MaxTxRate = MaxDesire;
-
- pAd->CommonCfg.MinTxRate = MinSupport;
- /* 2003-07-31 john - 2500 doesn't have good sensitivity at high OFDM rates. to increase the success */
- /* ratio of initial DHCP packet exchange, TX rate starts from a lower rate depending */
- /* on average RSSI */
- /* 1. RSSI >= -70db, start at 54 Mbps (short distance) */
- /* 2. -70 > RSSI >= -75, start at 24 Mbps (mid distance) */
- /* 3. -75 > RSSI, start at 11 Mbps (long distance) */
- if (*auto_rate_cur_p) {
- short dbm = 0;
-
- dbm = pAd->StaCfg.RssiSample.AvgRssi0 - pAd->BbpRssiToDbmDelta;
-
- if (bLinkUp == TRUE)
- pAd->CommonCfg.TxRate = RATE_24;
- else
- pAd->CommonCfg.TxRate = pAd->CommonCfg.MaxTxRate;
-
- if (dbm < -75)
- pAd->CommonCfg.TxRate = RATE_11;
- else if (dbm < -70)
- pAd->CommonCfg.TxRate = RATE_24;
-
- /* should never exceed MaxTxRate (consider 11B-only mode) */
- if (pAd->CommonCfg.TxRate > pAd->CommonCfg.MaxTxRate)
- pAd->CommonCfg.TxRate = pAd->CommonCfg.MaxTxRate;
-
- pAd->CommonCfg.TxRateIndex = 0;
- } else {
- pAd->CommonCfg.TxRate = pAd->CommonCfg.MaxTxRate;
- pHtPhy->field.MCS =
- (pAd->CommonCfg.MaxTxRate >
- 3) ? (pAd->CommonCfg.MaxTxRate -
- 4) : pAd->CommonCfg.MaxTxRate;
- pHtPhy->field.MODE =
- (pAd->CommonCfg.MaxTxRate > 3) ? MODE_OFDM : MODE_CCK;
-
- pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.STBC =
- pHtPhy->field.STBC;
- pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.ShortGI =
- pHtPhy->field.ShortGI;
- pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MCS =
- pHtPhy->field.MCS;
- pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE =
- pHtPhy->field.MODE;
- }
-
- if (pAd->CommonCfg.TxRate <= RATE_11) {
- pMaxHtPhy->field.MODE = MODE_CCK;
- pMaxHtPhy->field.MCS = pAd->CommonCfg.TxRate;
- pMinHtPhy->field.MCS = pAd->CommonCfg.MinTxRate;
- } else {
- pMaxHtPhy->field.MODE = MODE_OFDM;
- pMaxHtPhy->field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.TxRate];
- if (pAd->CommonCfg.MinTxRate >= RATE_6
- && (pAd->CommonCfg.MinTxRate <= RATE_54)) {
- pMinHtPhy->field.MCS =
- OfdmRateToRxwiMCS[pAd->CommonCfg.MinTxRate];
- } else {
- pMinHtPhy->field.MCS = pAd->CommonCfg.MinTxRate;
- }
- }
-
- pHtPhy->word = (pMaxHtPhy->word);
- if (bLinkUp && (pAd->OpMode == OPMODE_STA)) {
- pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word = pHtPhy->word;
- pAd->MacTab.Content[BSSID_WCID].MaxHTPhyMode.word =
- pMaxHtPhy->word;
- pAd->MacTab.Content[BSSID_WCID].MinHTPhyMode.word =
- pMinHtPhy->word;
- } else {
- switch (pAd->CommonCfg.PhyMode) {
- case PHY_11BG_MIXED:
- case PHY_11B:
- case PHY_11BGN_MIXED:
- pAd->CommonCfg.MlmeRate = RATE_1;
- pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_CCK;
- pAd->CommonCfg.MlmeTransmit.field.MCS = RATE_1;
-
-/*#ifdef WIFI_TEST */
- pAd->CommonCfg.RtsRate = RATE_11;
-/*#else */
-/* pAd->CommonCfg.RtsRate = RATE_1; */
-/*#endif */
- break;
- case PHY_11G:
- case PHY_11A:
- case PHY_11AGN_MIXED:
- case PHY_11GN_MIXED:
- case PHY_11N_2_4G:
- case PHY_11AN_MIXED:
- case PHY_11N_5G:
- pAd->CommonCfg.MlmeRate = RATE_6;
- pAd->CommonCfg.RtsRate = RATE_6;
- pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;
- pAd->CommonCfg.MlmeTransmit.field.MCS =
- OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];
- break;
- case PHY_11ABG_MIXED:
- case PHY_11ABGN_MIXED:
- if (pAd->CommonCfg.Channel <= 14) {
- pAd->CommonCfg.MlmeRate = RATE_1;
- pAd->CommonCfg.RtsRate = RATE_1;
- pAd->CommonCfg.MlmeTransmit.field.MODE =
- MODE_CCK;
- pAd->CommonCfg.MlmeTransmit.field.MCS = RATE_1;
- } else {
- pAd->CommonCfg.MlmeRate = RATE_6;
- pAd->CommonCfg.RtsRate = RATE_6;
- pAd->CommonCfg.MlmeTransmit.field.MODE =
- MODE_OFDM;
- pAd->CommonCfg.MlmeTransmit.field.MCS =
- OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];
- }
- break;
- default: /* error */
- pAd->CommonCfg.MlmeRate = RATE_6;
- pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;
- pAd->CommonCfg.MlmeTransmit.field.MCS =
- OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];
- pAd->CommonCfg.RtsRate = RATE_1;
- break;
- }
- /* */
- /* Keep Basic Mlme Rate. */
- /* */
- pAd->MacTab.Content[MCAST_WCID].HTPhyMode.word =
- pAd->CommonCfg.MlmeTransmit.word;
- if (pAd->CommonCfg.MlmeTransmit.field.MODE == MODE_OFDM)
- pAd->MacTab.Content[MCAST_WCID].HTPhyMode.field.MCS =
- OfdmRateToRxwiMCS[RATE_24];
- else
- pAd->MacTab.Content[MCAST_WCID].HTPhyMode.field.MCS =
- RATE_1;
- pAd->CommonCfg.BasicMlmeRate = pAd->CommonCfg.MlmeRate;
- }
-
- DBGPRINT(RT_DEBUG_TRACE,
- (" MlmeUpdateTxRates (MaxDesire=%d, MaxSupport=%d, MaxTxRate=%d, MinRate=%d, Rate Switching =%d)\n",
- RateIdToMbps[MaxDesire], RateIdToMbps[MaxSupport],
- RateIdToMbps[pAd->CommonCfg.MaxTxRate],
- RateIdToMbps[pAd->CommonCfg.MinTxRate],
- /*OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED) */
- *auto_rate_cur_p));
- DBGPRINT(RT_DEBUG_TRACE,
- (" MlmeUpdateTxRates (TxRate=%d, RtsRate=%d, BasicRateBitmap=0x%04lx)\n",
- RateIdToMbps[pAd->CommonCfg.TxRate],
- RateIdToMbps[pAd->CommonCfg.RtsRate], BasicRateBitmap));
- DBGPRINT(RT_DEBUG_TRACE,
- ("MlmeUpdateTxRates (MlmeTransmit=0x%x, MinHTPhyMode=%x, MaxHTPhyMode=0x%x, HTPhyMode=0x%x)\n",
- pAd->CommonCfg.MlmeTransmit.word,
- pAd->MacTab.Content[BSSID_WCID].MinHTPhyMode.word,
- pAd->MacTab.Content[BSSID_WCID].MaxHTPhyMode.word,
- pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word));
-}
-
-/*
- ==========================================================================
- Description:
- This function update HT Rate setting.
- Input Wcid value is valid for 2 case :
- 1. it's used for Station in infra mode that copy AP rate to Mactable.
- 2. OR Station in adhoc mode to copy peer's HT rate to Mactable.
-
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-void MlmeUpdateHtTxRates(struct rt_rtmp_adapter *pAd, u8 apidx)
-{
- u8 StbcMcs; /*j, StbcMcs, bitmask; */
- char i; /* 3*3 */
- struct rt_ht_capability *pRtHtCap = NULL;
- struct rt_ht_phy_info *pActiveHtPhy = NULL;
- unsigned long BasicMCS;
- u8 j, bitmask;
- struct rt_ht_phy_info *pDesireHtPhy = NULL;
- PHTTRANSMIT_SETTING pHtPhy = NULL;
- PHTTRANSMIT_SETTING pMaxHtPhy = NULL;
- PHTTRANSMIT_SETTING pMinHtPhy = NULL;
- BOOLEAN *auto_rate_cur_p;
-
- DBGPRINT(RT_DEBUG_TRACE, ("MlmeUpdateHtTxRates===> \n"));
-
- auto_rate_cur_p = NULL;
-
- {
- pDesireHtPhy = &pAd->StaCfg.DesiredHtPhyInfo;
- pActiveHtPhy = &pAd->StaCfg.DesiredHtPhyInfo;
- pHtPhy = &pAd->StaCfg.HTPhyMode;
- pMaxHtPhy = &pAd->StaCfg.MaxHTPhyMode;
- pMinHtPhy = &pAd->StaCfg.MinHTPhyMode;
-
- auto_rate_cur_p = &pAd->StaCfg.bAutoTxRateSwitch;
- }
-
- if ((ADHOC_ON(pAd) || INFRA_ON(pAd)) && (pAd->OpMode == OPMODE_STA)) {
- if (pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE)
- return;
-
- pRtHtCap = &pAd->StaActive.SupportedHtPhy;
- pActiveHtPhy = &pAd->StaActive.SupportedPhyInfo;
- StbcMcs = (u8)pAd->MlmeAux.AddHtInfo.AddHtInfo3.StbcMcs;
- BasicMCS =
- pAd->MlmeAux.AddHtInfo.MCSSet[0] +
- (pAd->MlmeAux.AddHtInfo.MCSSet[1] << 8) + (StbcMcs << 16);
- if ((pAd->CommonCfg.DesiredHtPhy.TxSTBC) && (pRtHtCap->RxSTBC)
- && (pAd->Antenna.field.TxPath == 2))
- pMaxHtPhy->field.STBC = STBC_USE;
- else
- pMaxHtPhy->field.STBC = STBC_NONE;
- } else {
- if (pDesireHtPhy->bHtEnable == FALSE)
- return;
-
- pRtHtCap = &pAd->CommonCfg.DesiredHtPhy;
- StbcMcs = (u8)pAd->CommonCfg.AddHTInfo.AddHtInfo3.StbcMcs;
- BasicMCS =
- pAd->CommonCfg.AddHTInfo.MCSSet[0] +
- (pAd->CommonCfg.AddHTInfo.MCSSet[1] << 8) + (StbcMcs << 16);
- if ((pAd->CommonCfg.DesiredHtPhy.TxSTBC) && (pRtHtCap->RxSTBC)
- && (pAd->Antenna.field.TxPath == 2))
- pMaxHtPhy->field.STBC = STBC_USE;
- else
- pMaxHtPhy->field.STBC = STBC_NONE;
- }
-
- /* Decide MAX ht rate. */
- if ((pRtHtCap->GF) && (pAd->CommonCfg.DesiredHtPhy.GF))
- pMaxHtPhy->field.MODE = MODE_HTGREENFIELD;
- else
- pMaxHtPhy->field.MODE = MODE_HTMIX;
-
- if ((pAd->CommonCfg.DesiredHtPhy.ChannelWidth)
- && (pRtHtCap->ChannelWidth))
- pMaxHtPhy->field.BW = BW_40;
- else
- pMaxHtPhy->field.BW = BW_20;
-
- if (pMaxHtPhy->field.BW == BW_20)
- pMaxHtPhy->field.ShortGI =
- (pAd->CommonCfg.DesiredHtPhy.ShortGIfor20 & pRtHtCap->
- ShortGIfor20);
- else
- pMaxHtPhy->field.ShortGI =
- (pAd->CommonCfg.DesiredHtPhy.ShortGIfor40 & pRtHtCap->
- ShortGIfor40);
-
- if (pDesireHtPhy->MCSSet[4] != 0) {
- pMaxHtPhy->field.MCS = 32;
- }
-
- for (i = 23; i >= 0; i--) /* 3*3 */
- {
- j = i / 8;
- bitmask = (1 << (i - (j * 8)));
-
- if ((pActiveHtPhy->MCSSet[j] & bitmask)
- && (pDesireHtPhy->MCSSet[j] & bitmask)) {
- pMaxHtPhy->field.MCS = i;
- break;
- }
-
- if (i == 0)
- break;
- }
-
- /* Copy MIN ht rate. rt2860??? */
- pMinHtPhy->field.BW = BW_20;
- pMinHtPhy->field.MCS = 0;
- pMinHtPhy->field.STBC = 0;
- pMinHtPhy->field.ShortGI = 0;
- /*If STA assigns fixed rate. update to fixed here. */
- if ((pAd->OpMode == OPMODE_STA) && (pDesireHtPhy->MCSSet[0] != 0xff)) {
- if (pDesireHtPhy->MCSSet[4] != 0) {
- pMaxHtPhy->field.MCS = 32;
- pMinHtPhy->field.MCS = 32;
- DBGPRINT(RT_DEBUG_TRACE,
- ("MlmeUpdateHtTxRates<=== Use Fixed MCS = %d\n",
- pMinHtPhy->field.MCS));
- }
-
- for (i = 23; (char)i >= 0; i--) /* 3*3 */
- {
- j = i / 8;
- bitmask = (1 << (i - (j * 8)));
- if ((pDesireHtPhy->MCSSet[j] & bitmask)
- && (pActiveHtPhy->MCSSet[j] & bitmask)) {
- pMaxHtPhy->field.MCS = i;
- pMinHtPhy->field.MCS = i;
- break;
- }
- if (i == 0)
- break;
- }
- }
-
- /* Decide ht rate */
- pHtPhy->field.STBC = pMaxHtPhy->field.STBC;
- pHtPhy->field.BW = pMaxHtPhy->field.BW;
- pHtPhy->field.MODE = pMaxHtPhy->field.MODE;
- pHtPhy->field.MCS = pMaxHtPhy->field.MCS;
- pHtPhy->field.ShortGI = pMaxHtPhy->field.ShortGI;
-
- /* use default now. rt2860 */
- if (pDesireHtPhy->MCSSet[0] != 0xff)
- *auto_rate_cur_p = FALSE;
- else
- *auto_rate_cur_p = TRUE;
-
- DBGPRINT(RT_DEBUG_TRACE,
- (" MlmeUpdateHtTxRates<---.AMsduSize = %d \n",
- pAd->CommonCfg.DesiredHtPhy.AmsduSize));
- DBGPRINT(RT_DEBUG_TRACE,
- ("TX: MCS[0] = %x (choose %d), BW = %d, ShortGI = %d, MODE = %d, \n",
- pActiveHtPhy->MCSSet[0], pHtPhy->field.MCS, pHtPhy->field.BW,
- pHtPhy->field.ShortGI, pHtPhy->field.MODE));
- DBGPRINT(RT_DEBUG_TRACE, ("MlmeUpdateHtTxRates<=== \n"));
-}
-
-void BATableInit(struct rt_rtmp_adapter *pAd, struct rt_ba_table *Tab)
-{
- int i;
-
- Tab->numAsOriginator = 0;
- Tab->numAsRecipient = 0;
- Tab->numDoneOriginator = 0;
- NdisAllocateSpinLock(&pAd->BATabLock);
- for (i = 0; i < MAX_LEN_OF_BA_REC_TABLE; i++) {
- Tab->BARecEntry[i].REC_BA_Status = Recipient_NONE;
- NdisAllocateSpinLock(&(Tab->BARecEntry[i].RxReRingLock));
- }
- for (i = 0; i < MAX_LEN_OF_BA_ORI_TABLE; i++) {
- Tab->BAOriEntry[i].ORI_BA_Status = Originator_NONE;
- }
-}
-
-/* IRQL = DISPATCH_LEVEL */
-void MlmeRadioOff(struct rt_rtmp_adapter *pAd)
-{
- RTMP_MLME_RADIO_OFF(pAd);
-}
-
-/* IRQL = DISPATCH_LEVEL */
-void MlmeRadioOn(struct rt_rtmp_adapter *pAd)
-{
- RTMP_MLME_RADIO_ON(pAd);
-}
-
-/* =========================================================================================== */
-/* bss_table.c */
-/* =========================================================================================== */
-
-/*! \brief initialize BSS table
- * \param p_tab pointer to the table
- * \return none
- * \pre
- * \post
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- */
-void BssTableInit(struct rt_bss_table *Tab)
-{
- int i;
-
- Tab->BssNr = 0;
- Tab->BssOverlapNr = 0;
- for (i = 0; i < MAX_LEN_OF_BSS_TABLE; i++) {
- NdisZeroMemory(&Tab->BssEntry[i], sizeof(struct rt_bss_entry));
- Tab->BssEntry[i].Rssi = -127; /* initial the rssi as a minimum value */
- }
-}
-
-/*! \brief search the BSS table by SSID
- * \param p_tab pointer to the bss table
- * \param ssid SSID string
- * \return index of the table, BSS_NOT_FOUND if not in the table
- * \pre
- * \post
- * \note search by sequential search
-
- IRQL = DISPATCH_LEVEL
-
- */
-unsigned long BssTableSearch(struct rt_bss_table *Tab, u8 *pBssid, u8 Channel)
-{
- u8 i;
-
- for (i = 0; i < Tab->BssNr; i++) {
- /* */
- /* Some AP that support A/B/G mode that may used the same BSSID on 11A and 11B/G. */
- /* We should distinguish this case. */
- /* */
- if ((((Tab->BssEntry[i].Channel <= 14) && (Channel <= 14)) ||
- ((Tab->BssEntry[i].Channel > 14) && (Channel > 14))) &&
- MAC_ADDR_EQUAL(Tab->BssEntry[i].Bssid, pBssid)) {
- return i;
- }
- }
- return (unsigned long)BSS_NOT_FOUND;
-}
-
-unsigned long BssSsidTableSearch(struct rt_bss_table *Tab,
- u8 *pBssid,
- u8 *pSsid, u8 SsidLen, u8 Channel)
-{
- u8 i;
-
- for (i = 0; i < Tab->BssNr; i++) {
- /* */
- /* Some AP that support A/B/G mode that may used the same BSSID on 11A and 11B/G. */
- /* We should distinguish this case. */
- /* */
- if ((((Tab->BssEntry[i].Channel <= 14) && (Channel <= 14)) ||
- ((Tab->BssEntry[i].Channel > 14) && (Channel > 14))) &&
- MAC_ADDR_EQUAL(Tab->BssEntry[i].Bssid, pBssid) &&
- SSID_EQUAL(pSsid, SsidLen, Tab->BssEntry[i].Ssid,
- Tab->BssEntry[i].SsidLen)) {
- return i;
- }
- }
- return (unsigned long)BSS_NOT_FOUND;
-}
-
-unsigned long BssTableSearchWithSSID(struct rt_bss_table *Tab,
- u8 *Bssid,
- u8 *pSsid,
- u8 SsidLen, u8 Channel)
-{
- u8 i;
-
- for (i = 0; i < Tab->BssNr; i++) {
- if ((((Tab->BssEntry[i].Channel <= 14) && (Channel <= 14)) ||
- ((Tab->BssEntry[i].Channel > 14) && (Channel > 14))) &&
- MAC_ADDR_EQUAL(&(Tab->BssEntry[i].Bssid), Bssid) &&
- (SSID_EQUAL
- (pSsid, SsidLen, Tab->BssEntry[i].Ssid,
- Tab->BssEntry[i].SsidLen)
- || (NdisEqualMemory(pSsid, ZeroSsid, SsidLen))
- ||
- (NdisEqualMemory
- (Tab->BssEntry[i].Ssid, ZeroSsid,
- Tab->BssEntry[i].SsidLen)))) {
- return i;
- }
- }
- return (unsigned long)BSS_NOT_FOUND;
-}
-
-unsigned long BssSsidTableSearchBySSID(struct rt_bss_table *Tab,
- u8 *pSsid, u8 SsidLen)
-{
- u8 i;
-
- for (i = 0; i < Tab->BssNr; i++) {
- if (SSID_EQUAL
- (pSsid, SsidLen, Tab->BssEntry[i].Ssid,
- Tab->BssEntry[i].SsidLen)) {
- return i;
- }
- }
- return (unsigned long)BSS_NOT_FOUND;
-}
-
-/* IRQL = DISPATCH_LEVEL */
-void BssTableDeleteEntry(struct rt_bss_table *Tab,
- u8 *pBssid, u8 Channel)
-{
- u8 i, j;
-
- for (i = 0; i < Tab->BssNr; i++) {
- if ((Tab->BssEntry[i].Channel == Channel) &&
- (MAC_ADDR_EQUAL(Tab->BssEntry[i].Bssid, pBssid))) {
- for (j = i; j < Tab->BssNr - 1; j++) {
- NdisMoveMemory(&(Tab->BssEntry[j]),
- &(Tab->BssEntry[j + 1]),
- sizeof(struct rt_bss_entry));
- }
- NdisZeroMemory(&(Tab->BssEntry[Tab->BssNr - 1]),
- sizeof(struct rt_bss_entry));
- Tab->BssNr -= 1;
- return;
- }
- }
-}
-
-/*
- ========================================================================
- Routine Description:
- Delete the Originator Entry in BAtable. Or decrease numAs Originator by 1 if needed.
-
- Arguments:
- // IRQL = DISPATCH_LEVEL
- ========================================================================
-*/
-void BATableDeleteORIEntry(struct rt_rtmp_adapter *pAd,
- struct rt_ba_ori_entry *pBAORIEntry)
-{
-
- if (pBAORIEntry->ORI_BA_Status != Originator_NONE) {
- NdisAcquireSpinLock(&pAd->BATabLock);
- if (pBAORIEntry->ORI_BA_Status == Originator_Done) {
- pAd->BATable.numAsOriginator -= 1;
- DBGPRINT(RT_DEBUG_TRACE,
- ("BATableDeleteORIEntry numAsOriginator= %ld\n",
- pAd->BATable.numAsRecipient));
- /* Erase Bitmap flag. */
- }
- pAd->MacTab.Content[pBAORIEntry->Wcid].TXBAbitmap &= (~(1 << (pBAORIEntry->TID))); /* If STA mode, erase flag here */
- pAd->MacTab.Content[pBAORIEntry->Wcid].BAOriWcidArray[pBAORIEntry->TID] = 0; /* If STA mode, erase flag here */
- pBAORIEntry->ORI_BA_Status = Originator_NONE;
- pBAORIEntry->Token = 1;
- /* Not clear Sequence here. */
- NdisReleaseSpinLock(&pAd->BATabLock);
- }
-}
-
-/*! \brief
- * \param
- * \return
- * \pre
- * \post
-
- IRQL = DISPATCH_LEVEL
-
- */
-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 */
- u8 HtCapabilityLen,
- u8 AddHtInfoLen,
- u8 NewExtChanOffset,
- u8 Channel,
- char Rssi,
- IN LARGE_INTEGER TimeStamp,
- u8 CkipFlag,
- struct rt_edca_parm *pEdcaParm,
- struct rt_qos_capability_parm *pQosCapability,
- struct rt_qbss_load_parm *pQbssLoad,
- u16 LengthVIE, struct rt_ndis_802_11_variable_ies *pVIE)
-{
- COPY_MAC_ADDR(pBss->Bssid, pBssid);
- /* Default Hidden SSID to be TRUE, it will be turned to FALSE after coping SSID */
- pBss->Hidden = 1;
- if (SsidLen > 0) {
- /* For hidden SSID AP, it might send beacon with SSID len equal to 0 */
- /* Or send beacon /probe response with SSID len matching real SSID length, */
- /* but SSID is all zero. such as "00-00-00-00" with length 4. */
- /* We have to prevent this case overwrite correct table */
- if (NdisEqualMemory(Ssid, ZeroSsid, SsidLen) == 0) {
- NdisZeroMemory(pBss->Ssid, MAX_LEN_OF_SSID);
- NdisMoveMemory(pBss->Ssid, Ssid, SsidLen);
- pBss->SsidLen = SsidLen;
- pBss->Hidden = 0;
- }
- } else
- pBss->SsidLen = 0;
- pBss->BssType = BssType;
- pBss->BeaconPeriod = BeaconPeriod;
- if (BssType == BSS_INFRA) {
- if (pCfParm->bValid) {
- pBss->CfpCount = pCfParm->CfpCount;
- pBss->CfpPeriod = pCfParm->CfpPeriod;
- pBss->CfpMaxDuration = pCfParm->CfpMaxDuration;
- pBss->CfpDurRemaining = pCfParm->CfpDurRemaining;
- }
- } else {
- pBss->AtimWin = AtimWin;
- }
-
- pBss->CapabilityInfo = CapabilityInfo;
- /* The privacy bit indicate security is ON, it maight be WEP, TKIP or AES */
- /* Combine with AuthMode, they will decide the connection methods. */
- pBss->Privacy = CAP_IS_PRIVACY_ON(pBss->CapabilityInfo);
- ASSERT(SupRateLen <= MAX_LEN_OF_SUPPORTED_RATES);
- if (SupRateLen <= MAX_LEN_OF_SUPPORTED_RATES)
- NdisMoveMemory(pBss->SupRate, SupRate, SupRateLen);
- else
- NdisMoveMemory(pBss->SupRate, SupRate,
- MAX_LEN_OF_SUPPORTED_RATES);
- pBss->SupRateLen = SupRateLen;
- ASSERT(ExtRateLen <= MAX_LEN_OF_SUPPORTED_RATES);
- NdisMoveMemory(pBss->ExtRate, ExtRate, ExtRateLen);
- pBss->NewExtChanOffset = NewExtChanOffset;
- pBss->ExtRateLen = ExtRateLen;
- pBss->Channel = Channel;
- pBss->CentralChannel = Channel;
- pBss->Rssi = Rssi;
- /* Update CkipFlag. if not exists, the value is 0x0 */
- pBss->CkipFlag = CkipFlag;
-
- /* New for microsoft Fixed IEs */
- NdisMoveMemory(pBss->FixIEs.Timestamp, &TimeStamp, 8);
- pBss->FixIEs.BeaconInterval = BeaconPeriod;
- pBss->FixIEs.Capabilities = CapabilityInfo;
-
- /* New for microsoft Variable IEs */
- if (LengthVIE != 0) {
- pBss->VarIELen = LengthVIE;
- NdisMoveMemory(pBss->VarIEs, pVIE, pBss->VarIELen);
- } else {
- pBss->VarIELen = 0;
- }
-
- pBss->AddHtInfoLen = 0;
- pBss->HtCapabilityLen = 0;
- if (HtCapabilityLen > 0) {
- pBss->HtCapabilityLen = HtCapabilityLen;
- NdisMoveMemory(&pBss->HtCapability, pHtCapability,
- HtCapabilityLen);
- if (AddHtInfoLen > 0) {
- pBss->AddHtInfoLen = AddHtInfoLen;
- NdisMoveMemory(&pBss->AddHtInfo, pAddHtInfo,
- AddHtInfoLen);
-
- if ((pAddHtInfo->ControlChan > 2)
- && (pAddHtInfo->AddHtInfo.ExtChanOffset ==
- EXTCHA_BELOW)
- && (pHtCapability->HtCapInfo.ChannelWidth ==
- BW_40)) {
- pBss->CentralChannel =
- pAddHtInfo->ControlChan - 2;
- } else
- if ((pAddHtInfo->AddHtInfo.ExtChanOffset ==
- EXTCHA_ABOVE)
- && (pHtCapability->HtCapInfo.ChannelWidth ==
- BW_40)) {
- pBss->CentralChannel =
- pAddHtInfo->ControlChan + 2;
- }
- }
- }
-
- BssCipherParse(pBss);
-
- /* new for QOS */
- if (pEdcaParm)
- NdisMoveMemory(&pBss->EdcaParm, pEdcaParm, sizeof(struct rt_edca_parm));
- else
- pBss->EdcaParm.bValid = FALSE;
- if (pQosCapability)
- NdisMoveMemory(&pBss->QosCapability, pQosCapability,
- sizeof(struct rt_qos_capability_parm));
- else
- pBss->QosCapability.bValid = FALSE;
- if (pQbssLoad)
- NdisMoveMemory(&pBss->QbssLoad, pQbssLoad,
- sizeof(struct rt_qbss_load_parm));
- else
- pBss->QbssLoad.bValid = FALSE;
-
- {
- struct rt_eid * pEid;
- u16 Length = 0;
-
- NdisZeroMemory(&pBss->WpaIE.IE[0], MAX_CUSTOM_LEN);
- NdisZeroMemory(&pBss->RsnIE.IE[0], MAX_CUSTOM_LEN);
- pEid = (struct rt_eid *) pVIE;
- while ((Length + 2 + (u16)pEid->Len) <= LengthVIE) {
- switch (pEid->Eid) {
- case IE_WPA:
- if (NdisEqualMemory(pEid->Octet, WPA_OUI, 4)) {
- if ((pEid->Len + 2) > MAX_CUSTOM_LEN) {
- pBss->WpaIE.IELen = 0;
- break;
- }
- pBss->WpaIE.IELen = pEid->Len + 2;
- NdisMoveMemory(pBss->WpaIE.IE, pEid,
- pBss->WpaIE.IELen);
- }
- break;
- case IE_RSN:
- if (NdisEqualMemory
- (pEid->Octet + 2, RSN_OUI, 3)) {
- if ((pEid->Len + 2) > MAX_CUSTOM_LEN) {
- pBss->RsnIE.IELen = 0;
- break;
- }
- pBss->RsnIE.IELen = pEid->Len + 2;
- NdisMoveMemory(pBss->RsnIE.IE, pEid,
- pBss->RsnIE.IELen);
- }
- break;
- }
- Length = Length + 2 + (u16)pEid->Len; /* Eid[1] + Len[1]+ content[Len] */
- pEid = (struct rt_eid *) ((u8 *) pEid + 2 + pEid->Len);
- }
- }
-}
-
-/*!
- * \brief insert an entry into the bss table
- * \param p_tab The BSS table
- * \param Bssid BSSID
- * \param ssid SSID
- * \param ssid_len Length of SSID
- * \param bss_type
- * \param beacon_period
- * \param timestamp
- * \param p_cf
- * \param atim_win
- * \param cap
- * \param rates
- * \param rates_len
- * \param channel_idx
- * \return none
- * \pre
- * \post
- * \note If SSID is identical, the old entry will be replaced by the new one
-
- IRQL = DISPATCH_LEVEL
-
- */
-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 */
- u8 HtCapabilityLen,
- u8 AddHtInfoLen,
- u8 NewExtChanOffset,
- u8 ChannelNo,
- char Rssi,
- IN LARGE_INTEGER TimeStamp,
- u8 CkipFlag,
- struct rt_edca_parm *pEdcaParm,
- struct rt_qos_capability_parm *pQosCapability,
- struct rt_qbss_load_parm *pQbssLoad,
- u16 LengthVIE, struct rt_ndis_802_11_variable_ies *pVIE)
-{
- unsigned long Idx;
-
- Idx =
- BssTableSearchWithSSID(Tab, pBssid, (u8 *) Ssid, SsidLen,
- ChannelNo);
- if (Idx == BSS_NOT_FOUND) {
- if (Tab->BssNr >= MAX_LEN_OF_BSS_TABLE) {
- /* */
- /* It may happen when BSS Table was full. */
- /* The desired AP will not be added into BSS Table */
- /* In this case, if we found the desired AP then overwrite BSS Table. */
- /* */
- if (!OPSTATUS_TEST_FLAG
- (pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) {
- if (MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, pBssid)
- || SSID_EQUAL(pAd->MlmeAux.Ssid,
- pAd->MlmeAux.SsidLen, Ssid,
- SsidLen)) {
- Idx = Tab->BssOverlapNr;
- BssEntrySet(pAd, &Tab->BssEntry[Idx],
- pBssid, Ssid, SsidLen,
- BssType, BeaconPeriod,
- CfParm, AtimWin,
- CapabilityInfo, SupRate,
- SupRateLen, ExtRate,
- ExtRateLen, pHtCapability,
- pAddHtInfo, HtCapabilityLen,
- AddHtInfoLen,
- NewExtChanOffset, ChannelNo,
- Rssi, TimeStamp, CkipFlag,
- pEdcaParm, pQosCapability,
- pQbssLoad, LengthVIE, pVIE);
- Tab->BssOverlapNr =
- (Tab->BssOverlapNr++) %
- MAX_LEN_OF_BSS_TABLE;
- }
- return Idx;
- } else {
- return BSS_NOT_FOUND;
- }
- }
- Idx = Tab->BssNr;
- BssEntrySet(pAd, &Tab->BssEntry[Idx], pBssid, Ssid, SsidLen,
- BssType, BeaconPeriod, CfParm, AtimWin,
- CapabilityInfo, SupRate, SupRateLen, ExtRate,
- ExtRateLen, pHtCapability, pAddHtInfo,
- HtCapabilityLen, AddHtInfoLen, NewExtChanOffset,
- ChannelNo, Rssi, TimeStamp, CkipFlag, pEdcaParm,
- pQosCapability, pQbssLoad, LengthVIE, pVIE);
- Tab->BssNr++;
- } else {
- /* avoid Hidden SSID form beacon to overwirite correct SSID from probe response */
- if ((SSID_EQUAL
- (Ssid, SsidLen, Tab->BssEntry[Idx].Ssid,
- Tab->BssEntry[Idx].SsidLen))
- ||
- (NdisEqualMemory
- (Tab->BssEntry[Idx].Ssid, ZeroSsid,
- Tab->BssEntry[Idx].SsidLen))) {
- BssEntrySet(pAd, &Tab->BssEntry[Idx], pBssid, Ssid,
- SsidLen, BssType, BeaconPeriod, CfParm,
- AtimWin, CapabilityInfo, SupRate,
- SupRateLen, ExtRate, ExtRateLen,
- pHtCapability, pAddHtInfo, HtCapabilityLen,
- AddHtInfoLen, NewExtChanOffset, ChannelNo,
- Rssi, TimeStamp, CkipFlag, pEdcaParm,
- pQosCapability, pQbssLoad, LengthVIE, pVIE);
- }
- }
-
- return Idx;
-}
-
-/* IRQL = DISPATCH_LEVEL */
-void BssTableSsidSort(struct rt_rtmp_adapter *pAd,
- struct rt_bss_table *OutTab, char Ssid[], u8 SsidLen)
-{
- int i;
- BssTableInit(OutTab);
-
- for (i = 0; i < pAd->ScanTab.BssNr; i++) {
- struct rt_bss_entry *pInBss = &pAd->ScanTab.BssEntry[i];
- BOOLEAN bIsHiddenApIncluded = FALSE;
-
- if (((pAd->CommonCfg.bIEEE80211H == 1) &&
- (pAd->MlmeAux.Channel > 14) &&
- RadarChannelCheck(pAd, pInBss->Channel))
- ) {
- if (pInBss->Hidden)
- bIsHiddenApIncluded = TRUE;
- }
-
- if ((pInBss->BssType == pAd->StaCfg.BssType) &&
- (SSID_EQUAL(Ssid, SsidLen, pInBss->Ssid, pInBss->SsidLen)
- || bIsHiddenApIncluded)) {
- struct rt_bss_entry *pOutBss = &OutTab->BssEntry[OutTab->BssNr];
-
- /* 2.4G/5G N only mode */
- if ((pInBss->HtCapabilityLen == 0) &&
- ((pAd->CommonCfg.PhyMode == PHY_11N_2_4G)
- || (pAd->CommonCfg.PhyMode == PHY_11N_5G))) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("STA is in N-only Mode, this AP don't have Ht capability in Beacon.\n"));
- continue;
- }
- /* New for WPA2 */
- /* Check the Authmode first */
- if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) {
- /* Check AuthMode and AuthModeAux for matching, in case AP support dual-mode */
- if ((pAd->StaCfg.AuthMode != pInBss->AuthMode)
- && (pAd->StaCfg.AuthMode !=
- pInBss->AuthModeAux))
- /* None matched */
- continue;
-
- /* Check cipher suite, AP must have more secured cipher than station setting */
- if ((pAd->StaCfg.AuthMode ==
- Ndis802_11AuthModeWPA)
- || (pAd->StaCfg.AuthMode ==
- Ndis802_11AuthModeWPAPSK)) {
- /* If it's not mixed mode, we should only let BSS pass with the same encryption */
- if (pInBss->WPA.bMixMode == FALSE)
- if (pAd->StaCfg.WepStatus !=
- pInBss->WPA.GroupCipher)
- continue;
-
- /* check group cipher */
- if ((pAd->StaCfg.WepStatus <
- pInBss->WPA.GroupCipher)
- && (pInBss->WPA.GroupCipher !=
- Ndis802_11GroupWEP40Enabled)
- && (pInBss->WPA.GroupCipher !=
- Ndis802_11GroupWEP104Enabled))
- continue;
-
- /* check pairwise cipher, skip if none matched */
- /* If profile set to AES, let it pass without question. */
- /* If profile set to TKIP, we must find one mateched */
- if ((pAd->StaCfg.WepStatus ==
- Ndis802_11Encryption2Enabled)
- && (pAd->StaCfg.WepStatus !=
- pInBss->WPA.PairCipher)
- && (pAd->StaCfg.WepStatus !=
- pInBss->WPA.PairCipherAux))
- continue;
- } else
- if ((pAd->StaCfg.AuthMode ==
- Ndis802_11AuthModeWPA2)
- || (pAd->StaCfg.AuthMode ==
- Ndis802_11AuthModeWPA2PSK)) {
- /* If it's not mixed mode, we should only let BSS pass with the same encryption */
- if (pInBss->WPA2.bMixMode == FALSE)
- if (pAd->StaCfg.WepStatus !=
- pInBss->WPA2.GroupCipher)
- continue;
-
- /* check group cipher */
- if ((pAd->StaCfg.WepStatus <
- pInBss->WPA.GroupCipher)
- && (pInBss->WPA2.GroupCipher !=
- Ndis802_11GroupWEP40Enabled)
- && (pInBss->WPA2.GroupCipher !=
- Ndis802_11GroupWEP104Enabled))
- continue;
-
- /* check pairwise cipher, skip if none matched */
- /* If profile set to AES, let it pass without question. */
- /* If profile set to TKIP, we must find one mateched */
- if ((pAd->StaCfg.WepStatus ==
- Ndis802_11Encryption2Enabled)
- && (pAd->StaCfg.WepStatus !=
- pInBss->WPA2.PairCipher)
- && (pAd->StaCfg.WepStatus !=
- pInBss->WPA2.PairCipherAux))
- continue;
- }
- }
- /* Bss Type matched, SSID matched. */
- /* We will check wepstatus for qualification Bss */
- else if (pAd->StaCfg.WepStatus != pInBss->WepStatus) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("StaCfg.WepStatus=%d, while pInBss->WepStatus=%d\n",
- pAd->StaCfg.WepStatus,
- pInBss->WepStatus));
- /* */
- /* For the SESv2 case, we will not qualify WepStatus. */
- /* */
- if (!pInBss->bSES)
- continue;
- }
- /* Since the AP is using hidden SSID, and we are trying to connect to ANY */
- /* It definitely will fail. So, skip it. */
- /* CCX also require not even try to connect it! */
- if (SsidLen == 0)
- continue;
-
- /* If both station and AP use 40MHz, still need to check if the 40MHZ band's legality in my country region */
- /* If this 40MHz wideband is not allowed in my country list, use bandwidth 20MHZ instead, */
- if ((pInBss->CentralChannel != pInBss->Channel) &&
- (pAd->CommonCfg.RegTransmitSetting.field.BW ==
- BW_40)) {
- if (RTMPCheckChannel
- (pAd, pInBss->CentralChannel,
- pInBss->Channel) == FALSE) {
- pAd->CommonCfg.RegTransmitSetting.field.
- BW = BW_20;
- SetCommonHT(pAd);
- pAd->CommonCfg.RegTransmitSetting.field.
- BW = BW_40;
- } else {
- if (pAd->CommonCfg.DesiredHtPhy.
- ChannelWidth == BAND_WIDTH_20) {
- SetCommonHT(pAd);
- }
- }
- }
- /* copy matching BSS from InTab to OutTab */
- NdisMoveMemory(pOutBss, pInBss, sizeof(struct rt_bss_entry));
-
- OutTab->BssNr++;
- } else if ((pInBss->BssType == pAd->StaCfg.BssType)
- && (SsidLen == 0)) {
- struct rt_bss_entry *pOutBss = &OutTab->BssEntry[OutTab->BssNr];
-
- /* 2.4G/5G N only mode */
- if ((pInBss->HtCapabilityLen == 0) &&
- ((pAd->CommonCfg.PhyMode == PHY_11N_2_4G)
- || (pAd->CommonCfg.PhyMode == PHY_11N_5G))) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("STA is in N-only Mode, this AP don't have Ht capability in Beacon.\n"));
- continue;
- }
- /* New for WPA2 */
- /* Check the Authmode first */
- if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) {
- /* Check AuthMode and AuthModeAux for matching, in case AP support dual-mode */
- if ((pAd->StaCfg.AuthMode != pInBss->AuthMode)
- && (pAd->StaCfg.AuthMode !=
- pInBss->AuthModeAux))
- /* None matched */
- continue;
-
- /* Check cipher suite, AP must have more secured cipher than station setting */
- if ((pAd->StaCfg.AuthMode ==
- Ndis802_11AuthModeWPA)
- || (pAd->StaCfg.AuthMode ==
- Ndis802_11AuthModeWPAPSK)) {
- /* If it's not mixed mode, we should only let BSS pass with the same encryption */
- if (pInBss->WPA.bMixMode == FALSE)
- if (pAd->StaCfg.WepStatus !=
- pInBss->WPA.GroupCipher)
- continue;
-
- /* check group cipher */
- if (pAd->StaCfg.WepStatus <
- pInBss->WPA.GroupCipher)
- continue;
-
- /* check pairwise cipher, skip if none matched */
- /* If profile set to AES, let it pass without question. */
- /* If profile set to TKIP, we must find one mateched */
- if ((pAd->StaCfg.WepStatus ==
- Ndis802_11Encryption2Enabled)
- && (pAd->StaCfg.WepStatus !=
- pInBss->WPA.PairCipher)
- && (pAd->StaCfg.WepStatus !=
- pInBss->WPA.PairCipherAux))
- continue;
- } else
- if ((pAd->StaCfg.AuthMode ==
- Ndis802_11AuthModeWPA2)
- || (pAd->StaCfg.AuthMode ==
- Ndis802_11AuthModeWPA2PSK)) {
- /* If it's not mixed mode, we should only let BSS pass with the same encryption */
- if (pInBss->WPA2.bMixMode == FALSE)
- if (pAd->StaCfg.WepStatus !=
- pInBss->WPA2.GroupCipher)
- continue;
-
- /* check group cipher */
- if (pAd->StaCfg.WepStatus <
- pInBss->WPA2.GroupCipher)
- continue;
-
- /* check pairwise cipher, skip if none matched */
- /* If profile set to AES, let it pass without question. */
- /* If profile set to TKIP, we must find one mateched */
- if ((pAd->StaCfg.WepStatus ==
- Ndis802_11Encryption2Enabled)
- && (pAd->StaCfg.WepStatus !=
- pInBss->WPA2.PairCipher)
- && (pAd->StaCfg.WepStatus !=
- pInBss->WPA2.PairCipherAux))
- continue;
- }
- }
- /* Bss Type matched, SSID matched. */
- /* We will check wepstatus for qualification Bss */
- else if (pAd->StaCfg.WepStatus != pInBss->WepStatus)
- continue;
-
- /* If both station and AP use 40MHz, still need to check if the 40MHZ band's legality in my country region */
- /* If this 40MHz wideband is not allowed in my country list, use bandwidth 20MHZ instead, */
- if ((pInBss->CentralChannel != pInBss->Channel) &&
- (pAd->CommonCfg.RegTransmitSetting.field.BW ==
- BW_40)) {
- if (RTMPCheckChannel
- (pAd, pInBss->CentralChannel,
- pInBss->Channel) == FALSE) {
- pAd->CommonCfg.RegTransmitSetting.field.
- BW = BW_20;
- SetCommonHT(pAd);
- pAd->CommonCfg.RegTransmitSetting.field.
- BW = BW_40;
- }
- }
- /* copy matching BSS from InTab to OutTab */
- NdisMoveMemory(pOutBss, pInBss, sizeof(struct rt_bss_entry));
-
- OutTab->BssNr++;
- }
-
- if (OutTab->BssNr >= MAX_LEN_OF_BSS_TABLE)
- break;
- }
-
- BssTableSortByRssi(OutTab);
-}
-
-/* IRQL = DISPATCH_LEVEL */
-void BssTableSortByRssi(struct rt_bss_table *OutTab)
-{
- int i, j;
- struct rt_bss_entry TmpBss;
-
- for (i = 0; i < OutTab->BssNr - 1; i++) {
- for (j = i + 1; j < OutTab->BssNr; j++) {
- if (OutTab->BssEntry[j].Rssi > OutTab->BssEntry[i].Rssi) {
- NdisMoveMemory(&TmpBss, &OutTab->BssEntry[j],
- sizeof(struct rt_bss_entry));
- NdisMoveMemory(&OutTab->BssEntry[j],
- &OutTab->BssEntry[i],
- sizeof(struct rt_bss_entry));
- NdisMoveMemory(&OutTab->BssEntry[i], &TmpBss,
- sizeof(struct rt_bss_entry));
- }
- }
- }
-}
-
-void BssCipherParse(struct rt_bss_entry *pBss)
-{
- struct rt_eid * pEid;
- u8 *pTmp;
- struct rt_rsn_ie_header * pRsnHeader;
- struct rt_cipher_suite_struct * pCipher;
- struct rt_akm_suite * pAKM;
- u16 Count;
- int Length;
- NDIS_802_11_ENCRYPTION_STATUS TmpCipher;
-
- /* */
- /* WepStatus will be reset later, if AP announce TKIP or AES on the beacon frame. */
- /* */
- if (pBss->Privacy) {
- pBss->WepStatus = Ndis802_11WEPEnabled;
- } else {
- pBss->WepStatus = Ndis802_11WEPDisabled;
- }
- /* Set default to disable & open authentication before parsing variable IE */
- pBss->AuthMode = Ndis802_11AuthModeOpen;
- pBss->AuthModeAux = Ndis802_11AuthModeOpen;
-
- /* Init WPA setting */
- pBss->WPA.PairCipher = Ndis802_11WEPDisabled;
- pBss->WPA.PairCipherAux = Ndis802_11WEPDisabled;
- pBss->WPA.GroupCipher = Ndis802_11WEPDisabled;
- pBss->WPA.RsnCapability = 0;
- pBss->WPA.bMixMode = FALSE;
-
- /* Init WPA2 setting */
- pBss->WPA2.PairCipher = Ndis802_11WEPDisabled;
- pBss->WPA2.PairCipherAux = Ndis802_11WEPDisabled;
- pBss->WPA2.GroupCipher = Ndis802_11WEPDisabled;
- pBss->WPA2.RsnCapability = 0;
- pBss->WPA2.bMixMode = FALSE;
-
- Length = (int)pBss->VarIELen;
-
- while (Length > 0) {
- /* Parse cipher suite base on WPA1 & WPA2, they should be parsed differently */
- pTmp = ((u8 *)pBss->VarIEs) + pBss->VarIELen - Length;
- pEid = (struct rt_eid *) pTmp;
- switch (pEid->Eid) {
- case IE_WPA:
- if (NdisEqualMemory(pEid->Octet, SES_OUI, 3)
- && (pEid->Len == 7)) {
- pBss->bSES = TRUE;
- break;
- } else if (NdisEqualMemory(pEid->Octet, WPA_OUI, 4) !=
- 1) {
- /* if unsupported vendor specific IE */
- break;
- }
- /* Skip OUI, version, and multicast suite */
- /* This part should be improved in the future when AP supported multiple cipher suite. */
- /* For now, it's OK since almost all APs have fixed cipher suite supported. */
- /* pTmp = (u8 *)pEid->Octet; */
- pTmp += 11;
-
- /* Cipher Suite Selectors from Spec P802.11i/D3.2 P26. */
- /* Value Meaning */
- /* 0 None */
- /* 1 WEP-40 */
- /* 2 Tkip */
- /* 3 WRAP */
- /* 4 AES */
- /* 5 WEP-104 */
- /* Parse group cipher */
- switch (*pTmp) {
- case 1:
- pBss->WPA.GroupCipher =
- Ndis802_11GroupWEP40Enabled;
- break;
- case 5:
- pBss->WPA.GroupCipher =
- Ndis802_11GroupWEP104Enabled;
- break;
- case 2:
- pBss->WPA.GroupCipher =
- Ndis802_11Encryption2Enabled;
- break;
- case 4:
- pBss->WPA.GroupCipher =
- Ndis802_11Encryption3Enabled;
- break;
- default:
- break;
- }
- /* number of unicast suite */
- pTmp += 1;
-
- /* skip all unicast cipher suites */
- /*Count = *(u16 *)pTmp; */
- Count = (pTmp[1] << 8) + pTmp[0];
- pTmp += sizeof(u16);
-
- /* Parsing all unicast cipher suite */
- while (Count > 0) {
- /* Skip OUI */
- pTmp += 3;
- TmpCipher = Ndis802_11WEPDisabled;
- switch (*pTmp) {
- case 1:
- case 5: /* Although WEP is not allowed in WPA related auth mode, we parse it anyway */
- TmpCipher =
- Ndis802_11Encryption1Enabled;
- break;
- case 2:
- TmpCipher =
- Ndis802_11Encryption2Enabled;
- break;
- case 4:
- TmpCipher =
- Ndis802_11Encryption3Enabled;
- break;
- default:
- break;
- }
- if (TmpCipher > pBss->WPA.PairCipher) {
- /* Move the lower cipher suite to PairCipherAux */
- pBss->WPA.PairCipherAux =
- pBss->WPA.PairCipher;
- pBss->WPA.PairCipher = TmpCipher;
- } else {
- pBss->WPA.PairCipherAux = TmpCipher;
- }
- pTmp++;
- Count--;
- }
-
- /* 4. get AKM suite counts */
- /*Count = *(u16 *)pTmp; */
- Count = (pTmp[1] << 8) + pTmp[0];
- pTmp += sizeof(u16);
- pTmp += 3;
-
- switch (*pTmp) {
- case 1:
- /* Set AP support WPA-enterprise mode */
- if (pBss->AuthMode == Ndis802_11AuthModeOpen)
- pBss->AuthMode = Ndis802_11AuthModeWPA;
- else
- pBss->AuthModeAux =
- Ndis802_11AuthModeWPA;
- break;
- case 2:
- /* Set AP support WPA-PSK mode */
- if (pBss->AuthMode == Ndis802_11AuthModeOpen)
- pBss->AuthMode =
- Ndis802_11AuthModeWPAPSK;
- else
- pBss->AuthModeAux =
- Ndis802_11AuthModeWPAPSK;
- break;
- default:
- break;
- }
- pTmp += 1;
-
- /* Fixed for WPA-None */
- if (pBss->BssType == BSS_ADHOC) {
- pBss->AuthMode = Ndis802_11AuthModeWPANone;
- pBss->AuthModeAux = Ndis802_11AuthModeWPANone;
- pBss->WepStatus = pBss->WPA.GroupCipher;
- /* Patched bugs for old driver */
- if (pBss->WPA.PairCipherAux ==
- Ndis802_11WEPDisabled)
- pBss->WPA.PairCipherAux =
- pBss->WPA.GroupCipher;
- } else
- pBss->WepStatus = pBss->WPA.PairCipher;
-
- /* Check the Pair & Group, if different, turn on mixed mode flag */
- if (pBss->WPA.GroupCipher != pBss->WPA.PairCipher)
- pBss->WPA.bMixMode = TRUE;
-
- break;
-
- case IE_RSN:
- pRsnHeader = (struct rt_rsn_ie_header *) pTmp;
-
- /* 0. Version must be 1 */
- if (le2cpu16(pRsnHeader->Version) != 1)
- break;
- pTmp += sizeof(struct rt_rsn_ie_header);
-
- /* 1. Check group cipher */
- pCipher = (struct rt_cipher_suite_struct *) pTmp;
- if (!RTMPEqualMemory(pTmp, RSN_OUI, 3))
- break;
-
- /* Parse group cipher */
- switch (pCipher->Type) {
- case 1:
- pBss->WPA2.GroupCipher =
- Ndis802_11GroupWEP40Enabled;
- break;
- case 5:
- pBss->WPA2.GroupCipher =
- Ndis802_11GroupWEP104Enabled;
- break;
- case 2:
- pBss->WPA2.GroupCipher =
- Ndis802_11Encryption2Enabled;
- break;
- case 4:
- pBss->WPA2.GroupCipher =
- Ndis802_11Encryption3Enabled;
- break;
- default:
- break;
- }
- /* set to correct offset for next parsing */
- pTmp += sizeof(struct rt_cipher_suite_struct);
-
- /* 2. Get pairwise cipher counts */
- /*Count = *(u16 *)pTmp; */
- Count = (pTmp[1] << 8) + pTmp[0];
- pTmp += sizeof(u16);
-
- /* 3. Get pairwise cipher */
- /* Parsing all unicast cipher suite */
- while (Count > 0) {
- /* Skip OUI */
- pCipher = (struct rt_cipher_suite_struct *) pTmp;
- TmpCipher = Ndis802_11WEPDisabled;
- switch (pCipher->Type) {
- case 1:
- case 5: /* Although WEP is not allowed in WPA related auth mode, we parse it anyway */
- TmpCipher =
- Ndis802_11Encryption1Enabled;
- break;
- case 2:
- TmpCipher =
- Ndis802_11Encryption2Enabled;
- break;
- case 4:
- TmpCipher =
- Ndis802_11Encryption3Enabled;
- break;
- default:
- break;
- }
- if (TmpCipher > pBss->WPA2.PairCipher) {
- /* Move the lower cipher suite to PairCipherAux */
- pBss->WPA2.PairCipherAux =
- pBss->WPA2.PairCipher;
- pBss->WPA2.PairCipher = TmpCipher;
- } else {
- pBss->WPA2.PairCipherAux = TmpCipher;
- }
- pTmp += sizeof(struct rt_cipher_suite_struct);
- Count--;
- }
-
- /* 4. get AKM suite counts */
- /*Count = *(u16 *)pTmp; */
- Count = (pTmp[1] << 8) + pTmp[0];
- pTmp += sizeof(u16);
-
- /* 5. Get AKM ciphers */
- /* Parsing all AKM ciphers */
- while (Count > 0) {
- pAKM = (struct rt_akm_suite *) pTmp;
- if (!RTMPEqualMemory(pTmp, RSN_OUI, 3))
- break;
-
- switch (pAKM->Type) {
- case 1:
- /* Set AP support WPA-enterprise mode */
- if (pBss->AuthMode ==
- Ndis802_11AuthModeOpen)
- pBss->AuthMode =
- Ndis802_11AuthModeWPA2;
- else
- pBss->AuthModeAux =
- Ndis802_11AuthModeWPA2;
- break;
- case 2:
- /* Set AP support WPA-PSK mode */
- if (pBss->AuthMode ==
- Ndis802_11AuthModeOpen)
- pBss->AuthMode =
- Ndis802_11AuthModeWPA2PSK;
- else
- pBss->AuthModeAux =
- Ndis802_11AuthModeWPA2PSK;
- break;
- default:
- if (pBss->AuthMode ==
- Ndis802_11AuthModeOpen)
- pBss->AuthMode =
- Ndis802_11AuthModeMax;
- else
- pBss->AuthModeAux =
- Ndis802_11AuthModeMax;
- break;
- }
- pTmp += (Count * sizeof(struct rt_akm_suite));
- Count--;
- }
-
- /* Fixed for WPA-None */
- if (pBss->BssType == BSS_ADHOC) {
- pBss->AuthMode = Ndis802_11AuthModeWPANone;
- pBss->AuthModeAux = Ndis802_11AuthModeWPANone;
- pBss->WPA.PairCipherAux =
- pBss->WPA2.PairCipherAux;
- pBss->WPA.GroupCipher = pBss->WPA2.GroupCipher;
- pBss->WepStatus = pBss->WPA.GroupCipher;
- /* Patched bugs for old driver */
- if (pBss->WPA.PairCipherAux ==
- Ndis802_11WEPDisabled)
- pBss->WPA.PairCipherAux =
- pBss->WPA.GroupCipher;
- }
- pBss->WepStatus = pBss->WPA2.PairCipher;
-
- /* 6. Get RSN capability */
- /*pBss->WPA2.RsnCapability = *(u16 *)pTmp; */
- pBss->WPA2.RsnCapability = (pTmp[1] << 8) + pTmp[0];
- pTmp += sizeof(u16);
-
- /* Check the Pair & Group, if different, turn on mixed mode flag */
- if (pBss->WPA2.GroupCipher != pBss->WPA2.PairCipher)
- pBss->WPA2.bMixMode = TRUE;
-
- break;
- default:
- break;
- }
- Length -= (pEid->Len + 2);
- }
-}
-
-/* =========================================================================================== */
-/* mac_table.c */
-/* =========================================================================================== */
-
-/*! \brief generates a random mac address value for IBSS BSSID
- * \param Addr the bssid location
- * \return none
- * \pre
- * \post
- */
-void MacAddrRandomBssid(struct rt_rtmp_adapter *pAd, u8 *pAddr)
-{
- int i;
-
- for (i = 0; i < MAC_ADDR_LEN; i++) {
- pAddr[i] = RandomByte(pAd);
- }
-
- pAddr[0] = (pAddr[0] & 0xfe) | 0x02; /* the first 2 bits must be 01xxxxxxxx */
-}
-
-/*! \brief init the management mac frame header
- * \param p_hdr mac header
- * \param subtype subtype of the frame
- * \param p_ds destination address, don't care if it is a broadcast address
- * \return none
- * \pre the station has the following information in the pAd->StaCfg
- * - bssid
- * - station address
- * \post
- * \note this function initializes the following field
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- */
-void MgtMacHeaderInit(struct rt_rtmp_adapter *pAd,
- struct rt_header_802_11 * pHdr80211,
- u8 SubType,
- u8 ToDs, u8 *pDA, u8 *pBssid)
-{
- NdisZeroMemory(pHdr80211, sizeof(struct rt_header_802_11));
-
- pHdr80211->FC.Type = BTYPE_MGMT;
- pHdr80211->FC.SubType = SubType;
-/* if (SubType == SUBTYPE_ACK) // sample, no use, it will conflict with ACTION frame sub type */
-/* pHdr80211->FC.Type = BTYPE_CNTL; */
- pHdr80211->FC.ToDs = ToDs;
- COPY_MAC_ADDR(pHdr80211->Addr1, pDA);
- COPY_MAC_ADDR(pHdr80211->Addr2, pAd->CurrentAddress);
- COPY_MAC_ADDR(pHdr80211->Addr3, pBssid);
-}
-
-/* =========================================================================================== */
-/* mem_mgmt.c */
-/* =========================================================================================== */
-
-/*!***************************************************************************
- * This routine build an outgoing frame, and fill all information specified
- * in argument list to the frame body. The actual frame size is the summation
- * of all arguments.
- * input params:
- * Buffer - pointer to a pre-allocated memory segment
- * args - a list of <int arg_size, arg> pairs.
- * NOTE NOTE NOTE! the last argument must be NULL, otherwise this
- * function will FAIL!
- * return:
- * Size of the buffer
- * usage:
- * MakeOutgoingFrame(Buffer, output_length, 2, &fc, 2, &dur, 6, p_addr1, 6,p_addr2, END_OF_ARGS);
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- ****************************************************************************/
-unsigned long MakeOutgoingFrame(u8 * Buffer, unsigned long * FrameLen, ...)
-{
- u8 *p;
- int leng;
- unsigned long TotLeng;
- va_list Args;
-
- /* calculates the total length */
- TotLeng = 0;
- va_start(Args, FrameLen);
- do {
- leng = va_arg(Args, int);
- if (leng == END_OF_ARGS) {
- break;
- }
- p = va_arg(Args, void *);
- NdisMoveMemory(&Buffer[TotLeng], p, leng);
- TotLeng = TotLeng + leng;
- } while (TRUE);
-
- va_end(Args); /* clean up */
- *FrameLen = TotLeng;
- return TotLeng;
-}
-
-/* =========================================================================================== */
-/* mlme_queue.c */
-/* =========================================================================================== */
-
-/*! \brief Initialize The MLME Queue, used by MLME Functions
- * \param *Queue The MLME Queue
- * \return Always Return NDIS_STATE_SUCCESS in this implementation
- * \pre
- * \post
- * \note Because this is done only once (at the init stage), no need to be locked
-
- IRQL = PASSIVE_LEVEL
-
- */
-int MlmeQueueInit(struct rt_mlme_queue *Queue)
-{
- int i;
-
- NdisAllocateSpinLock(&Queue->Lock);
-
- Queue->Num = 0;
- Queue->Head = 0;
- Queue->Tail = 0;
-
- for (i = 0; i < MAX_LEN_OF_MLME_QUEUE; i++) {
- Queue->Entry[i].Occupied = FALSE;
- Queue->Entry[i].MsgLen = 0;
- NdisZeroMemory(Queue->Entry[i].Msg, MGMT_DMA_BUFFER_SIZE);
- }
-
- return NDIS_STATUS_SUCCESS;
-}
-
-/*! \brief Enqueue a message for other threads, if they want to send messages to MLME thread
- * \param *Queue The MLME Queue
- * \param Machine The State Machine Id
- * \param MsgType The Message Type
- * \param MsgLen The Message length
- * \param *Msg The message pointer
- * \return TRUE if enqueue is successful, FALSE if the queue is full
- * \pre
- * \post
- * \note The message has to be initialized
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- */
-BOOLEAN MlmeEnqueue(struct rt_rtmp_adapter *pAd,
- unsigned long Machine,
- unsigned long MsgType, unsigned long MsgLen, void * Msg)
-{
- int Tail;
- struct rt_mlme_queue *Queue = (struct rt_mlme_queue *)& pAd->Mlme.Queue;
-
- /* Do nothing if the driver is starting halt state. */
- /* This might happen when timer already been fired before cancel timer with mlmehalt */
- if (RTMP_TEST_FLAG
- (pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
- return FALSE;
-
- /* First check the size, it MUST not exceed the mlme queue size */
- if (MsgLen > MGMT_DMA_BUFFER_SIZE) {
- DBGPRINT_ERR("MlmeEnqueue: msg too large, size = %ld \n", MsgLen);
- return FALSE;
- }
-
- if (MlmeQueueFull(Queue)) {
- return FALSE;
- }
-
- NdisAcquireSpinLock(&(Queue->Lock));
- Tail = Queue->Tail;
- Queue->Tail++;
- Queue->Num++;
- if (Queue->Tail == MAX_LEN_OF_MLME_QUEUE) {
- Queue->Tail = 0;
- }
-
- Queue->Entry[Tail].Wcid = RESERVED_WCID;
- Queue->Entry[Tail].Occupied = TRUE;
- Queue->Entry[Tail].Machine = Machine;
- Queue->Entry[Tail].MsgType = MsgType;
- Queue->Entry[Tail].MsgLen = MsgLen;
-
- if (Msg != NULL) {
- NdisMoveMemory(Queue->Entry[Tail].Msg, Msg, MsgLen);
- }
-
- NdisReleaseSpinLock(&(Queue->Lock));
- return TRUE;
-}
-
-/*! \brief This function is used when Recv gets a MLME message
- * \param *Queue The MLME Queue
- * \param TimeStampHigh The upper 32 bit of timestamp
- * \param TimeStampLow The lower 32 bit of timestamp
- * \param Rssi The receiving RSSI strength
- * \param MsgLen The length of the message
- * \param *Msg The message pointer
- * \return TRUE if everything ok, FALSE otherwise (like Queue Full)
- * \pre
- * \post
-
- IRQL = DISPATCH_LEVEL
-
- */
-BOOLEAN MlmeEnqueueForRecv(struct rt_rtmp_adapter *pAd,
- unsigned long Wcid,
- unsigned long TimeStampHigh,
- unsigned long TimeStampLow,
- u8 Rssi0,
- u8 Rssi1,
- u8 Rssi2,
- unsigned long MsgLen, void * Msg, u8 Signal)
-{
- int Tail, Machine;
- struct rt_frame_802_11 * pFrame = (struct rt_frame_802_11 *) Msg;
- int MsgType;
- struct rt_mlme_queue *Queue = (struct rt_mlme_queue *)& pAd->Mlme.Queue;
-
- /* Do nothing if the driver is starting halt state. */
- /* This might happen when timer already been fired before cancel timer with mlmehalt */
- if (RTMP_TEST_FLAG
- (pAd,
- fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) {
- DBGPRINT_ERR("MlmeEnqueueForRecv: fRTMP_ADAPTER_HALT_IN_PROGRESS\n");
- return FALSE;
- }
- /* First check the size, it MUST not exceed the mlme queue size */
- if (MsgLen > MGMT_DMA_BUFFER_SIZE) {
- DBGPRINT_ERR("MlmeEnqueueForRecv: frame too large, size = %ld \n", MsgLen);
- return FALSE;
- }
-
- if (MlmeQueueFull(Queue)) {
- return FALSE;
- }
-
- {
- if (!MsgTypeSubst(pAd, pFrame, &Machine, &MsgType)) {
- DBGPRINT_ERR("MlmeEnqueueForRecv: un-recongnized mgmt->subtype=%d\n", pFrame->Hdr.FC.SubType);
- return FALSE;
- }
- }
-
- /* OK, we got all the informations, it is time to put things into queue */
- NdisAcquireSpinLock(&(Queue->Lock));
- Tail = Queue->Tail;
- Queue->Tail++;
- Queue->Num++;
- if (Queue->Tail == MAX_LEN_OF_MLME_QUEUE) {
- Queue->Tail = 0;
- }
- Queue->Entry[Tail].Occupied = TRUE;
- Queue->Entry[Tail].Machine = Machine;
- Queue->Entry[Tail].MsgType = MsgType;
- Queue->Entry[Tail].MsgLen = MsgLen;
- Queue->Entry[Tail].TimeStamp.u.LowPart = TimeStampLow;
- Queue->Entry[Tail].TimeStamp.u.HighPart = TimeStampHigh;
- Queue->Entry[Tail].Rssi0 = Rssi0;
- Queue->Entry[Tail].Rssi1 = Rssi1;
- Queue->Entry[Tail].Rssi2 = Rssi2;
- Queue->Entry[Tail].Signal = Signal;
- Queue->Entry[Tail].Wcid = (u8)Wcid;
-
- Queue->Entry[Tail].Channel = pAd->LatchRfRegs.Channel;
-
- if (Msg != NULL) {
- NdisMoveMemory(Queue->Entry[Tail].Msg, Msg, MsgLen);
- }
-
- NdisReleaseSpinLock(&(Queue->Lock));
-
- RTMP_MLME_HANDLER(pAd);
-
- return TRUE;
-}
-
-/*! \brief Dequeue a message from the MLME Queue
- * \param *Queue The MLME Queue
- * \param *Elem The message dequeued from MLME Queue
- * \return TRUE if the Elem contains something, FALSE otherwise
- * \pre
- * \post
-
- IRQL = DISPATCH_LEVEL
-
- */
-BOOLEAN MlmeDequeue(struct rt_mlme_queue *Queue, struct rt_mlme_queue_elem ** Elem)
-{
- NdisAcquireSpinLock(&(Queue->Lock));
- *Elem = &(Queue->Entry[Queue->Head]);
- Queue->Num--;
- Queue->Head++;
- if (Queue->Head == MAX_LEN_OF_MLME_QUEUE) {
- Queue->Head = 0;
- }
- NdisReleaseSpinLock(&(Queue->Lock));
- return TRUE;
-}
-
-/* IRQL = DISPATCH_LEVEL */
-void MlmeRestartStateMachine(struct rt_rtmp_adapter *pAd)
-{
-#ifdef RTMP_MAC_PCI
- struct rt_mlme_queue_elem *Elem = NULL;
-#endif /* RTMP_MAC_PCI // */
- BOOLEAN Cancelled;
-
- DBGPRINT(RT_DEBUG_TRACE, ("MlmeRestartStateMachine \n"));
-
-#ifdef RTMP_MAC_PCI
- NdisAcquireSpinLock(&pAd->Mlme.TaskLock);
- if (pAd->Mlme.bRunning) {
- NdisReleaseSpinLock(&pAd->Mlme.TaskLock);
- return;
- } else {
- pAd->Mlme.bRunning = TRUE;
- }
- NdisReleaseSpinLock(&pAd->Mlme.TaskLock);
-
- /* Remove all Mlme queues elements */
- while (!MlmeQueueEmpty(&pAd->Mlme.Queue)) {
- /*From message type, determine which state machine I should drive */
- if (MlmeDequeue(&pAd->Mlme.Queue, &Elem)) {
- /* free MLME element */
- Elem->Occupied = FALSE;
- Elem->MsgLen = 0;
-
- } else {
- DBGPRINT_ERR("MlmeRestartStateMachine: MlmeQueue empty\n");
- }
- }
-#endif /* RTMP_MAC_PCI // */
-
- {
- /* Cancel all timer events */
- /* Be careful to cancel new added timer */
- RTMPCancelTimer(&pAd->MlmeAux.AssocTimer, &Cancelled);
- RTMPCancelTimer(&pAd->MlmeAux.ReassocTimer, &Cancelled);
- RTMPCancelTimer(&pAd->MlmeAux.DisassocTimer, &Cancelled);
- RTMPCancelTimer(&pAd->MlmeAux.AuthTimer, &Cancelled);
- RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &Cancelled);
- RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled);
-
- }
-
- /* Change back to original channel in case of doing scan */
- AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
- AsicLockChannel(pAd, pAd->CommonCfg.Channel);
-
- /* Resume MSDU which is turned off durning scan */
- RTMPResumeMsduTransmission(pAd);
-
- {
- /* Set all state machines back IDLE */
- pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
- pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
- pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
- pAd->Mlme.AuthRspMachine.CurrState = AUTH_RSP_IDLE;
- pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
- pAd->Mlme.ActMachine.CurrState = ACT_IDLE;
- }
-
-#ifdef RTMP_MAC_PCI
- /* Remove running state */
- NdisAcquireSpinLock(&pAd->Mlme.TaskLock);
- pAd->Mlme.bRunning = FALSE;
- NdisReleaseSpinLock(&pAd->Mlme.TaskLock);
-#endif /* RTMP_MAC_PCI // */
-}
-
-/*! \brief test if the MLME Queue is empty
- * \param *Queue The MLME Queue
- * \return TRUE if the Queue is empty, FALSE otherwise
- * \pre
- * \post
-
- IRQL = DISPATCH_LEVEL
-
- */
-BOOLEAN MlmeQueueEmpty(struct rt_mlme_queue *Queue)
-{
- BOOLEAN Ans;
-
- NdisAcquireSpinLock(&(Queue->Lock));
- Ans = (Queue->Num == 0);
- NdisReleaseSpinLock(&(Queue->Lock));
-
- return Ans;
-}
-
-/*! \brief test if the MLME Queue is full
- * \param *Queue The MLME Queue
- * \return TRUE if the Queue is empty, FALSE otherwise
- * \pre
- * \post
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- */
-BOOLEAN MlmeQueueFull(struct rt_mlme_queue *Queue)
-{
- BOOLEAN Ans;
-
- NdisAcquireSpinLock(&(Queue->Lock));
- Ans = (Queue->Num == MAX_LEN_OF_MLME_QUEUE
- || Queue->Entry[Queue->Tail].Occupied);
- NdisReleaseSpinLock(&(Queue->Lock));
-
- return Ans;
-}
-
-/*! \brief The destructor of MLME Queue
- * \param
- * \return
- * \pre
- * \post
- * \note Clear Mlme Queue, Set Queue->Num to Zero.
-
- IRQL = PASSIVE_LEVEL
-
- */
-void MlmeQueueDestroy(struct rt_mlme_queue *pQueue)
-{
- NdisAcquireSpinLock(&(pQueue->Lock));
- pQueue->Num = 0;
- pQueue->Head = 0;
- pQueue->Tail = 0;
- NdisReleaseSpinLock(&(pQueue->Lock));
- NdisFreeSpinLock(&(pQueue->Lock));
-}
-
-/*! \brief To substitute the message type if the message is coming from external
- * \param pFrame The frame received
- * \param *Machine The state machine
- * \param *MsgType the message type for the state machine
- * \return TRUE if the substitution is successful, FALSE otherwise
- * \pre
- * \post
-
- IRQL = DISPATCH_LEVEL
-
- */
-BOOLEAN MsgTypeSubst(struct rt_rtmp_adapter *pAd,
- struct rt_frame_802_11 * pFrame,
- int * Machine, int * MsgType)
-{
- u16 Seq, Alg;
- u8 EAPType;
- u8 *pData;
-
- /* Pointer to start of data frames including SNAP header */
- pData = (u8 *)pFrame + LENGTH_802_11;
-
- /* The only data type will pass to this function is EAPOL frame */
- if (pFrame->Hdr.FC.Type == BTYPE_DATA) {
- {
- *Machine = WPA_STATE_MACHINE;
- EAPType =
- *((u8 *) pFrame + LENGTH_802_11 +
- LENGTH_802_1_H + 1);
- return (WpaMsgTypeSubst(EAPType, (int *) MsgType));
- }
- }
-
- switch (pFrame->Hdr.FC.SubType) {
- case SUBTYPE_ASSOC_REQ:
- *Machine = ASSOC_STATE_MACHINE;
- *MsgType = MT2_PEER_ASSOC_REQ;
- break;
- case SUBTYPE_ASSOC_RSP:
- *Machine = ASSOC_STATE_MACHINE;
- *MsgType = MT2_PEER_ASSOC_RSP;
- break;
- case SUBTYPE_REASSOC_REQ:
- *Machine = ASSOC_STATE_MACHINE;
- *MsgType = MT2_PEER_REASSOC_REQ;
- break;
- case SUBTYPE_REASSOC_RSP:
- *Machine = ASSOC_STATE_MACHINE;
- *MsgType = MT2_PEER_REASSOC_RSP;
- break;
- case SUBTYPE_PROBE_REQ:
- *Machine = SYNC_STATE_MACHINE;
- *MsgType = MT2_PEER_PROBE_REQ;
- break;
- case SUBTYPE_PROBE_RSP:
- *Machine = SYNC_STATE_MACHINE;
- *MsgType = MT2_PEER_PROBE_RSP;
- break;
- case SUBTYPE_BEACON:
- *Machine = SYNC_STATE_MACHINE;
- *MsgType = MT2_PEER_BEACON;
- break;
- case SUBTYPE_ATIM:
- *Machine = SYNC_STATE_MACHINE;
- *MsgType = MT2_PEER_ATIM;
- break;
- case SUBTYPE_DISASSOC:
- *Machine = ASSOC_STATE_MACHINE;
- *MsgType = MT2_PEER_DISASSOC_REQ;
- break;
- case SUBTYPE_AUTH:
- /* get the sequence number from payload 24 Mac Header + 2 bytes algorithm */
- NdisMoveMemory(&Seq, &pFrame->Octet[2], sizeof(u16));
- NdisMoveMemory(&Alg, &pFrame->Octet[0], sizeof(u16));
- if (Seq == 1 || Seq == 3) {
- *Machine = AUTH_RSP_STATE_MACHINE;
- *MsgType = MT2_PEER_AUTH_ODD;
- } else if (Seq == 2 || Seq == 4) {
- if (Alg == AUTH_MODE_OPEN || Alg == AUTH_MODE_KEY) {
- *Machine = AUTH_STATE_MACHINE;
- *MsgType = MT2_PEER_AUTH_EVEN;
- }
- } else {
- return FALSE;
- }
- break;
- case SUBTYPE_DEAUTH:
- *Machine = AUTH_RSP_STATE_MACHINE;
- *MsgType = MT2_PEER_DEAUTH;
- break;
- case SUBTYPE_ACTION:
- *Machine = ACTION_STATE_MACHINE;
- /* Sometimes Sta will return with category bytes with MSB = 1, if they receive catogory out of their support */
- if ((pFrame->Octet[0] & 0x7F) > MAX_PEER_CATE_MSG) {
- *MsgType = MT2_ACT_INVALID;
- } else {
- *MsgType = (pFrame->Octet[0] & 0x7F);
- }
- break;
- default:
- return FALSE;
- break;
- }
-
- return TRUE;
-}
-
-/* =========================================================================================== */
-/* state_machine.c */
-/* =========================================================================================== */
-
-/*! \brief Initialize the state machine.
- * \param *S pointer to the state machine
- * \param Trans State machine transition function
- * \param StNr number of states
- * \param MsgNr number of messages
- * \param DefFunc default function, when there is invalid state/message combination
- * \param InitState initial state of the state machine
- * \param Base StateMachine base, internal use only
- * \pre p_sm should be a legal pointer
- * \post
-
- IRQL = PASSIVE_LEVEL
-
- */
-void StateMachineInit(struct rt_state_machine *S,
- IN STATE_MACHINE_FUNC Trans[],
- unsigned long StNr,
- unsigned long MsgNr,
- IN STATE_MACHINE_FUNC DefFunc,
- unsigned long InitState, unsigned long Base)
-{
- unsigned long i, j;
-
- /* set number of states and messages */
- S->NrState = StNr;
- S->NrMsg = MsgNr;
- S->Base = Base;
-
- S->TransFunc = Trans;
-
- /* init all state transition to default function */
- for (i = 0; i < StNr; i++) {
- for (j = 0; j < MsgNr; j++) {
- S->TransFunc[i * MsgNr + j] = DefFunc;
- }
- }
-
- /* set the starting state */
- S->CurrState = InitState;
-}
-
-/*! \brief This function fills in the function pointer into the cell in the state machine
- * \param *S pointer to the state machine
- * \param St state
- * \param Msg incoming message
- * \param f the function to be executed when (state, message) combination occurs at the state machine
- * \pre *S should be a legal pointer to the state machine, st, msg, should be all within the range, Base should be set in the initial state
- * \post
-
- IRQL = PASSIVE_LEVEL
-
- */
-void StateMachineSetAction(struct rt_state_machine *S,
- unsigned long St,
- unsigned long Msg, IN STATE_MACHINE_FUNC Func)
-{
- unsigned long MsgIdx;
-
- MsgIdx = Msg - S->Base;
-
- if (St < S->NrState && MsgIdx < S->NrMsg) {
- /* boundary checking before setting the action */
- S->TransFunc[St * S->NrMsg + MsgIdx] = Func;
- }
-}
-
-/*! \brief This function does the state transition
- * \param *Adapter the NIC adapter pointer
- * \param *S the state machine
- * \param *Elem the message to be executed
- * \return None
-
- IRQL = DISPATCH_LEVEL
-
- */
-void StateMachinePerformAction(struct rt_rtmp_adapter *pAd,
- struct rt_state_machine *S, struct rt_mlme_queue_elem *Elem)
-{
- (*(S->TransFunc[S->CurrState * S->NrMsg + Elem->MsgType - S->Base]))
- (pAd, Elem);
-}
-
-/*
- ==========================================================================
- Description:
- The drop function, when machine executes this, the message is simply
- ignored. This function does nothing, the message is freed in
- StateMachinePerformAction()
- ==========================================================================
- */
-void Drop(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
-}
-
-/* =========================================================================================== */
-/* lfsr.c */
-/* =========================================================================================== */
-
-/*
- ==========================================================================
- Description:
-
- IRQL = PASSIVE_LEVEL
-
- ==========================================================================
- */
-void LfsrInit(struct rt_rtmp_adapter *pAd, unsigned long Seed)
-{
- if (Seed == 0)
- pAd->Mlme.ShiftReg = 1;
- else
- pAd->Mlme.ShiftReg = Seed;
-}
-
-/*
- ==========================================================================
- Description:
- ==========================================================================
- */
-u8 RandomByte(struct rt_rtmp_adapter *pAd)
-{
- unsigned long i;
- u8 R, Result;
-
- R = 0;
-
- if (pAd->Mlme.ShiftReg == 0)
- NdisGetSystemUpTime((unsigned long *) & pAd->Mlme.ShiftReg);
-
- for (i = 0; i < 8; i++) {
- if (pAd->Mlme.ShiftReg & 0x00000001) {
- pAd->Mlme.ShiftReg =
- ((pAd->Mlme.
- ShiftReg ^ LFSR_MASK) >> 1) | 0x80000000;
- Result = 1;
- } else {
- pAd->Mlme.ShiftReg = pAd->Mlme.ShiftReg >> 1;
- Result = 0;
- }
- R = (R << 1) | Result;
- }
-
- return R;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Verify the support rate for different PHY type
-
- Arguments:
- pAd Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
-
- ========================================================================
-*/
-void RTMPCheckRates(struct rt_rtmp_adapter *pAd,
- IN u8 SupRate[], IN u8 * SupRateLen)
-{
- u8 RateIdx, i, j;
- u8 NewRate[12], NewRateLen;
-
- NewRateLen = 0;
-
- if (pAd->CommonCfg.PhyMode == PHY_11B)
- RateIdx = 4;
- else
- RateIdx = 12;
-
- /* Check for support rates exclude basic rate bit */
- for (i = 0; i < *SupRateLen; i++)
- for (j = 0; j < RateIdx; j++)
- if ((SupRate[i] & 0x7f) == RateIdTo500Kbps[j])
- NewRate[NewRateLen++] = SupRate[i];
-
- *SupRateLen = NewRateLen;
- NdisMoveMemory(SupRate, NewRate, NewRateLen);
-}
-
-BOOLEAN RTMPCheckChannel(struct rt_rtmp_adapter *pAd,
- u8 CentralChannel, u8 Channel)
-{
- u8 k;
- u8 UpperChannel = 0, LowerChannel = 0;
- u8 NoEffectChannelinList = 0;
-
- /* Find upper and lower channel according to 40MHz current operation. */
- if (CentralChannel < Channel) {
- UpperChannel = Channel;
- if (CentralChannel > 2)
- LowerChannel = CentralChannel - 2;
- else
- return FALSE;
- } else if (CentralChannel > Channel) {
- UpperChannel = CentralChannel + 2;
- LowerChannel = Channel;
- }
-
- for (k = 0; k < pAd->ChannelListNum; k++) {
- if (pAd->ChannelList[k].Channel == UpperChannel) {
- NoEffectChannelinList++;
- }
- if (pAd->ChannelList[k].Channel == LowerChannel) {
- NoEffectChannelinList++;
- }
- }
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("Total Channel in Channel List = [%d]\n",
- NoEffectChannelinList));
- if (NoEffectChannelinList == 2)
- return TRUE;
- else
- return FALSE;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Verify the support rate for HT phy type
-
- Arguments:
- pAd Pointer to our adapter
-
- Return Value:
- FALSE if pAd->CommonCfg.SupportedHtPhy doesn't accept the pHtCapability. (AP Mode)
-
- IRQL = PASSIVE_LEVEL
-
- ========================================================================
-*/
-BOOLEAN RTMPCheckHt(struct rt_rtmp_adapter *pAd,
- u8 Wcid,
- struct rt_ht_capability_ie * pHtCapability,
- struct rt_add_ht_info_ie * pAddHtInfo)
-{
- if (Wcid >= MAX_LEN_OF_MAC_TABLE)
- return FALSE;
-
- /* If use AMSDU, set flag. */
- if (pAd->CommonCfg.DesiredHtPhy.AmsduEnable)
- CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid],
- fCLIENT_STATUS_AMSDU_INUSED);
- /* Save Peer Capability */
- if (pHtCapability->HtCapInfo.ShortGIfor20)
- CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid],
- fCLIENT_STATUS_SGI20_CAPABLE);
- if (pHtCapability->HtCapInfo.ShortGIfor40)
- CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid],
- fCLIENT_STATUS_SGI40_CAPABLE);
- if (pHtCapability->HtCapInfo.TxSTBC)
- CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid],
- fCLIENT_STATUS_TxSTBC_CAPABLE);
- if (pHtCapability->HtCapInfo.RxSTBC)
- CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid],
- fCLIENT_STATUS_RxSTBC_CAPABLE);
- if (pAd->CommonCfg.bRdg && pHtCapability->ExtHtCapInfo.RDGSupport) {
- CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid],
- fCLIENT_STATUS_RDG_CAPABLE);
- }
-
- if (Wcid < MAX_LEN_OF_MAC_TABLE) {
- pAd->MacTab.Content[Wcid].MpduDensity =
- pHtCapability->HtCapParm.MpduDensity;
- }
- /* Will check ChannelWidth for MCSSet[4] below */
- pAd->MlmeAux.HtCapability.MCSSet[4] = 0x1;
- switch (pAd->CommonCfg.RxStream) {
- case 1:
- pAd->MlmeAux.HtCapability.MCSSet[0] = 0xff;
- pAd->MlmeAux.HtCapability.MCSSet[1] = 0x00;
- pAd->MlmeAux.HtCapability.MCSSet[2] = 0x00;
- pAd->MlmeAux.HtCapability.MCSSet[3] = 0x00;
- break;
- case 2:
- pAd->MlmeAux.HtCapability.MCSSet[0] = 0xff;
- pAd->MlmeAux.HtCapability.MCSSet[1] = 0xff;
- pAd->MlmeAux.HtCapability.MCSSet[2] = 0x00;
- pAd->MlmeAux.HtCapability.MCSSet[3] = 0x00;
- break;
- case 3:
- pAd->MlmeAux.HtCapability.MCSSet[0] = 0xff;
- pAd->MlmeAux.HtCapability.MCSSet[1] = 0xff;
- pAd->MlmeAux.HtCapability.MCSSet[2] = 0xff;
- pAd->MlmeAux.HtCapability.MCSSet[3] = 0x00;
- break;
- }
-
- pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth =
- pAddHtInfo->AddHtInfo.RecomWidth & pAd->CommonCfg.DesiredHtPhy.
- ChannelWidth;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("RTMPCheckHt:: HtCapInfo.ChannelWidth=%d, RecomWidth=%d, DesiredHtPhy.ChannelWidth=%d, BW40MAvailForA/G=%d/%d, PhyMode=%d \n",
- pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth,
- pAddHtInfo->AddHtInfo.RecomWidth,
- pAd->CommonCfg.DesiredHtPhy.ChannelWidth,
- pAd->NicConfig2.field.BW40MAvailForA,
- pAd->NicConfig2.field.BW40MAvailForG,
- pAd->CommonCfg.PhyMode));
-
- pAd->MlmeAux.HtCapability.HtCapInfo.GF =
- pHtCapability->HtCapInfo.GF & pAd->CommonCfg.DesiredHtPhy.GF;
-
- /* Send Assoc Req with my HT capability. */
- pAd->MlmeAux.HtCapability.HtCapInfo.AMsduSize =
- pAd->CommonCfg.DesiredHtPhy.AmsduSize;
- pAd->MlmeAux.HtCapability.HtCapInfo.MimoPs =
- pAd->CommonCfg.DesiredHtPhy.MimoPs;
- pAd->MlmeAux.HtCapability.HtCapInfo.ShortGIfor20 =
- (pAd->CommonCfg.DesiredHtPhy.ShortGIfor20) & (pHtCapability->
- HtCapInfo.
- ShortGIfor20);
- pAd->MlmeAux.HtCapability.HtCapInfo.ShortGIfor40 =
- (pAd->CommonCfg.DesiredHtPhy.ShortGIfor40) & (pHtCapability->
- HtCapInfo.
- ShortGIfor40);
- pAd->MlmeAux.HtCapability.HtCapInfo.TxSTBC =
- (pAd->CommonCfg.DesiredHtPhy.TxSTBC) & (pHtCapability->HtCapInfo.
- RxSTBC);
- pAd->MlmeAux.HtCapability.HtCapInfo.RxSTBC =
- (pAd->CommonCfg.DesiredHtPhy.RxSTBC) & (pHtCapability->HtCapInfo.
- TxSTBC);
- pAd->MlmeAux.HtCapability.HtCapParm.MaxRAmpduFactor =
- pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor;
- pAd->MlmeAux.HtCapability.HtCapParm.MpduDensity =
- pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity;
- pAd->MlmeAux.HtCapability.ExtHtCapInfo.PlusHTC =
- pHtCapability->ExtHtCapInfo.PlusHTC;
- pAd->MacTab.Content[Wcid].HTCapability.ExtHtCapInfo.PlusHTC =
- pHtCapability->ExtHtCapInfo.PlusHTC;
- if (pAd->CommonCfg.bRdg) {
- pAd->MlmeAux.HtCapability.ExtHtCapInfo.RDGSupport =
- pHtCapability->ExtHtCapInfo.RDGSupport;
- pAd->MlmeAux.HtCapability.ExtHtCapInfo.PlusHTC = 1;
- }
-
- if (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_20)
- pAd->MlmeAux.HtCapability.MCSSet[4] = 0x0; /* BW20 can't transmit MCS32 */
-
- COPY_AP_HTSETTINGS_FROM_BEACON(pAd, pHtCapability);
- return TRUE;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Verify the support rate for different PHY type
-
- Arguments:
- pAd Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
-
- ========================================================================
-*/
-void RTMPUpdateMlmeRate(struct rt_rtmp_adapter *pAd)
-{
- u8 MinimumRate;
- u8 ProperMlmeRate; /*= RATE_54; */
- u8 i, j, RateIdx = 12; /*1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54 */
- BOOLEAN bMatch = FALSE;
-
- switch (pAd->CommonCfg.PhyMode) {
- case PHY_11B:
- ProperMlmeRate = RATE_11;
- MinimumRate = RATE_1;
- break;
- case PHY_11BG_MIXED:
- case PHY_11ABGN_MIXED:
- case PHY_11BGN_MIXED:
- if ((pAd->MlmeAux.SupRateLen == 4) &&
- (pAd->MlmeAux.ExtRateLen == 0))
- /* B only AP */
- ProperMlmeRate = RATE_11;
- else
- ProperMlmeRate = RATE_24;
-
- if (pAd->MlmeAux.Channel <= 14)
- MinimumRate = RATE_1;
- else
- MinimumRate = RATE_6;
- break;
- case PHY_11A:
- case PHY_11N_2_4G: /* rt2860 need to check mlmerate for 802.11n */
- case PHY_11GN_MIXED:
- case PHY_11AGN_MIXED:
- case PHY_11AN_MIXED:
- case PHY_11N_5G:
- ProperMlmeRate = RATE_24;
- MinimumRate = RATE_6;
- break;
- case PHY_11ABG_MIXED:
- ProperMlmeRate = RATE_24;
- if (pAd->MlmeAux.Channel <= 14)
- MinimumRate = RATE_1;
- else
- MinimumRate = RATE_6;
- break;
- default: /* error */
- ProperMlmeRate = RATE_1;
- MinimumRate = RATE_1;
- break;
- }
-
- for (i = 0; i < pAd->MlmeAux.SupRateLen; i++) {
- for (j = 0; j < RateIdx; j++) {
- if ((pAd->MlmeAux.SupRate[i] & 0x7f) ==
- RateIdTo500Kbps[j]) {
- if (j == ProperMlmeRate) {
- bMatch = TRUE;
- break;
- }
- }
- }
-
- if (bMatch)
- break;
- }
-
- if (bMatch == FALSE) {
- for (i = 0; i < pAd->MlmeAux.ExtRateLen; i++) {
- for (j = 0; j < RateIdx; j++) {
- if ((pAd->MlmeAux.ExtRate[i] & 0x7f) ==
- RateIdTo500Kbps[j]) {
- if (j == ProperMlmeRate) {
- bMatch = TRUE;
- break;
- }
- }
- }
-
- if (bMatch)
- break;
- }
- }
-
- if (bMatch == FALSE) {
- ProperMlmeRate = MinimumRate;
- }
-
- pAd->CommonCfg.MlmeRate = MinimumRate;
- pAd->CommonCfg.RtsRate = ProperMlmeRate;
- if (pAd->CommonCfg.MlmeRate >= RATE_6) {
- pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;
- pAd->CommonCfg.MlmeTransmit.field.MCS =
- OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];
- pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MODE =
- MODE_OFDM;
- pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MCS =
- OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];
- } else {
- pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_CCK;
- pAd->CommonCfg.MlmeTransmit.field.MCS = pAd->CommonCfg.MlmeRate;
- pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MODE =
- MODE_CCK;
- pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MCS =
- pAd->CommonCfg.MlmeRate;
- }
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("RTMPUpdateMlmeRate ==> MlmeTransmit = 0x%x \n",
- pAd->CommonCfg.MlmeTransmit.word));
-}
-
-char RTMPMaxRssi(struct rt_rtmp_adapter *pAd,
- char Rssi0, char Rssi1, char Rssi2)
-{
- char larger = -127;
-
- if ((pAd->Antenna.field.RxPath == 1) && (Rssi0 != 0)) {
- larger = Rssi0;
- }
-
- if ((pAd->Antenna.field.RxPath >= 2) && (Rssi1 != 0)) {
- larger = max(Rssi0, Rssi1);
- }
-
- if ((pAd->Antenna.field.RxPath == 3) && (Rssi2 != 0)) {
- larger = max(larger, Rssi2);
- }
-
- if (larger == -127)
- larger = 0;
-
- return larger;
-}
-
-/*
- ========================================================================
- Routine Description:
- Periodic evaluate antenna link status
-
- Arguments:
- pAd - Adapter pointer
-
- Return Value:
- None
-
- ========================================================================
-*/
-void AsicEvaluateRxAnt(struct rt_rtmp_adapter *pAd)
-{
- u8 BBPR3 = 0;
-
- if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS |
- fRTMP_ADAPTER_HALT_IN_PROGRESS |
- fRTMP_ADAPTER_RADIO_OFF |
- fRTMP_ADAPTER_NIC_NOT_EXIST |
- fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS) ||
- OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)
-#ifdef RT30xx
- || (pAd->EepromAccess)
-#endif /* RT30xx // */
-#ifdef RT3090
- || (pAd->bPCIclkOff == TRUE)
-#endif /* RT3090 // */
- )
- return;
-
- {
- /*if (pAd->StaCfg.Psm == PWR_SAVE) */
- /* return; */
-
- {
-
- if (pAd->StaCfg.Psm == PWR_SAVE)
- return;
-
- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3);
- BBPR3 &= (~0x18);
- if (pAd->Antenna.field.RxPath == 3) {
- BBPR3 |= (0x10);
- } else if (pAd->Antenna.field.RxPath == 2) {
- BBPR3 |= (0x8);
- } else if (pAd->Antenna.field.RxPath == 1) {
- BBPR3 |= (0x0);
- }
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3);
-#ifdef RTMP_MAC_PCI
- pAd->StaCfg.BBPR3 = BBPR3;
-#endif /* RTMP_MAC_PCI // */
- if (OPSTATUS_TEST_FLAG
- (pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)
- ) {
- unsigned long TxTotalCnt =
- pAd->RalinkCounters.OneSecTxNoRetryOkCount +
- pAd->RalinkCounters.OneSecTxRetryOkCount +
- pAd->RalinkCounters.OneSecTxFailCount;
-
- /* dynamic adjust antenna evaluation period according to the traffic */
- if (TxTotalCnt > 50) {
- RTMPSetTimer(&pAd->Mlme.RxAntEvalTimer,
- 20);
- pAd->Mlme.bLowThroughput = FALSE;
- } else {
- RTMPSetTimer(&pAd->Mlme.RxAntEvalTimer,
- 300);
- pAd->Mlme.bLowThroughput = TRUE;
- }
- }
- }
-
- }
-
-}
-
-/*
- ========================================================================
- Routine Description:
- After evaluation, check antenna link status
-
- Arguments:
- pAd - Adapter pointer
-
- Return Value:
- None
-
- ========================================================================
-*/
-void AsicRxAntEvalTimeout(void *SystemSpecific1,
- void *FunctionContext,
- void *SystemSpecific2, void *SystemSpecific3)
-{
- struct rt_rtmp_adapter *pAd = (struct rt_rtmp_adapter *)FunctionContext;
- u8 BBPR3 = 0;
- char larger = -127, rssi0, rssi1, rssi2;
-
- if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS |
- fRTMP_ADAPTER_HALT_IN_PROGRESS |
- fRTMP_ADAPTER_RADIO_OFF |
- fRTMP_ADAPTER_NIC_NOT_EXIST) ||
- OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)
-#ifdef RT30xx
- || (pAd->EepromAccess)
-#endif /* RT30xx // */
-#ifdef RT3090
- || (pAd->bPCIclkOff == TRUE)
-#endif /* RT3090 // */
- )
- return;
-
- {
- /*if (pAd->StaCfg.Psm == PWR_SAVE) */
- /* return; */
- {
- if (pAd->StaCfg.Psm == PWR_SAVE)
- return;
-
- /* if the traffic is low, use average rssi as the criteria */
- if (pAd->Mlme.bLowThroughput == TRUE) {
- rssi0 = pAd->StaCfg.RssiSample.LastRssi0;
- rssi1 = pAd->StaCfg.RssiSample.LastRssi1;
- rssi2 = pAd->StaCfg.RssiSample.LastRssi2;
- } else {
- rssi0 = pAd->StaCfg.RssiSample.AvgRssi0;
- rssi1 = pAd->StaCfg.RssiSample.AvgRssi1;
- rssi2 = pAd->StaCfg.RssiSample.AvgRssi2;
- }
-
- if (pAd->Antenna.field.RxPath == 3) {
- larger = max(rssi0, rssi1);
-
- if (larger > (rssi2 + 20))
- pAd->Mlme.RealRxPath = 2;
- else
- pAd->Mlme.RealRxPath = 3;
- } else if (pAd->Antenna.field.RxPath == 2) {
- if (rssi0 > (rssi1 + 20))
- pAd->Mlme.RealRxPath = 1;
- else
- pAd->Mlme.RealRxPath = 2;
- }
-
- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3);
- BBPR3 &= (~0x18);
- if (pAd->Mlme.RealRxPath == 3) {
- BBPR3 |= (0x10);
- } else if (pAd->Mlme.RealRxPath == 2) {
- BBPR3 |= (0x8);
- } else if (pAd->Mlme.RealRxPath == 1) {
- BBPR3 |= (0x0);
- }
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3);
-#ifdef RTMP_MAC_PCI
- pAd->StaCfg.BBPR3 = BBPR3;
-#endif /* RTMP_MAC_PCI // */
- }
- }
-
-}
-
-void APSDPeriodicExec(void *SystemSpecific1,
- void *FunctionContext,
- void *SystemSpecific2, void *SystemSpecific3)
-{
- struct rt_rtmp_adapter *pAd = (struct rt_rtmp_adapter *)FunctionContext;
-
- if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))
- return;
-
- pAd->CommonCfg.TriggerTimerCount++;
-
-/* Driver should not send trigger frame, it should be send by application layer */
-/*
- if (pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable
- && (pAd->CommonCfg.bNeedSendTriggerFrame ||
- (((pAd->CommonCfg.TriggerTimerCount%20) == 19) && (!pAd->CommonCfg.bAPSDAC_BE || !pAd->CommonCfg.bAPSDAC_BK || !pAd->CommonCfg.bAPSDAC_VI || !pAd->CommonCfg.bAPSDAC_VO))))
- {
- DBGPRINT(RT_DEBUG_TRACE,("Sending trigger frame and enter service period when support APSD\n"));
- RTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE);
- pAd->CommonCfg.bNeedSendTriggerFrame = FALSE;
- pAd->CommonCfg.TriggerTimerCount = 0;
- pAd->CommonCfg.bInServicePeriod = TRUE;
- }*/
-}
-
-/*
- ========================================================================
- Routine Description:
- Set/reset MAC registers according to bPiggyBack parameter
-
- Arguments:
- pAd - Adapter pointer
- bPiggyBack - Enable / Disable Piggy-Back
-
- Return Value:
- None
-
- ========================================================================
-*/
-void RTMPSetPiggyBack(struct rt_rtmp_adapter *pAd, IN BOOLEAN bPiggyBack)
-{
- TX_LINK_CFG_STRUC TxLinkCfg;
-
- RTMP_IO_READ32(pAd, TX_LINK_CFG, &TxLinkCfg.word);
-
- TxLinkCfg.field.TxCFAckEn = bPiggyBack;
- RTMP_IO_WRITE32(pAd, TX_LINK_CFG, TxLinkCfg.word);
-}
-
-/*
- ========================================================================
- Routine Description:
- check if this entry need to switch rate automatically
-
- Arguments:
- pAd
- pEntry
-
- Return Value:
- TURE
- FALSE
-
- ========================================================================
-*/
-BOOLEAN RTMPCheckEntryEnableAutoRateSwitch(struct rt_rtmp_adapter *pAd,
- struct rt_mac_table_entry *pEntry)
-{
- BOOLEAN result = TRUE;
-
- {
- /* only associated STA counts */
- if (pEntry && (pEntry->ValidAsCLI)
- && (pEntry->Sst == SST_ASSOC)) {
- result = pAd->StaCfg.bAutoTxRateSwitch;
- } else
- result = FALSE;
- }
-
- return result;
-}
-
-BOOLEAN RTMPAutoRateSwitchCheck(struct rt_rtmp_adapter *pAd)
-{
- {
- if (pAd->StaCfg.bAutoTxRateSwitch)
- return TRUE;
- }
- return FALSE;
-}
-
-/*
- ========================================================================
- Routine Description:
- check if this entry need to fix tx legacy rate
-
- Arguments:
- pAd
- pEntry
-
- Return Value:
- TURE
- FALSE
-
- ========================================================================
-*/
-u8 RTMPStaFixedTxMode(struct rt_rtmp_adapter *pAd, struct rt_mac_table_entry *pEntry)
-{
- u8 tx_mode = FIXED_TXMODE_HT;
-
- {
- tx_mode =
- (u8)pAd->StaCfg.DesiredTransmitSetting.field.
- FixedTxMode;
- }
-
- return tx_mode;
-}
-
-/*
- ========================================================================
- Routine Description:
- Overwrite HT Tx Mode by Fixed Legency Tx Mode, if specified.
-
- Arguments:
- pAd
- pEntry
-
- Return Value:
- TURE
- FALSE
-
- ========================================================================
-*/
-void RTMPUpdateLegacyTxSetting(u8 fixed_tx_mode, struct rt_mac_table_entry *pEntry)
-{
- HTTRANSMIT_SETTING TransmitSetting;
-
- if (fixed_tx_mode == FIXED_TXMODE_HT)
- return;
-
- TransmitSetting.word = 0;
-
- TransmitSetting.field.MODE = pEntry->HTPhyMode.field.MODE;
- TransmitSetting.field.MCS = pEntry->HTPhyMode.field.MCS;
-
- if (fixed_tx_mode == FIXED_TXMODE_CCK) {
- TransmitSetting.field.MODE = MODE_CCK;
- /* CCK mode allow MCS 0~3 */
- if (TransmitSetting.field.MCS > MCS_3)
- TransmitSetting.field.MCS = MCS_3;
- } else {
- TransmitSetting.field.MODE = MODE_OFDM;
- /* OFDM mode allow MCS 0~7 */
- if (TransmitSetting.field.MCS > MCS_7)
- TransmitSetting.field.MCS = MCS_7;
- }
-
- if (pEntry->HTPhyMode.field.MODE >= TransmitSetting.field.MODE) {
- pEntry->HTPhyMode.word = TransmitSetting.word;
- DBGPRINT(RT_DEBUG_TRACE,
- ("RTMPUpdateLegacyTxSetting : wcid-%d, MODE=%s, MCS=%d \n",
- pEntry->Aid, GetPhyMode(pEntry->HTPhyMode.field.MODE),
- pEntry->HTPhyMode.field.MCS));
- }
-}
-
-/*
- ==========================================================================
- Description:
- dynamic tune BBP R66 to find a balance between sensibility and
- noise isolation
-
- IRQL = DISPATCH_LEVEL
-
- ==========================================================================
- */
-void AsicStaBbpTuning(struct rt_rtmp_adapter *pAd)
-{
- u8 OrigR66Value = 0, R66; /*, R66UpperBound = 0x30, R66LowerBound = 0x30; */
- char Rssi;
-
- /* 2860C did not support Fase CCA, therefore can't tune */
- if (pAd->MACVersion == 0x28600100)
- return;
-
- /* */
- /* work as a STA */
- /* */
- if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE) /* no R66 tuning when SCANNING */
- return;
-
- if ((pAd->OpMode == OPMODE_STA)
- && (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)
- )
- && !(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
-#ifdef RTMP_MAC_PCI
- && (pAd->bPCIclkOff == FALSE)
-#endif /* RTMP_MAC_PCI // */
- ) {
- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R66, &OrigR66Value);
- R66 = OrigR66Value;
-
- if (pAd->Antenna.field.RxPath > 1)
- Rssi =
- (pAd->StaCfg.RssiSample.AvgRssi0 +
- pAd->StaCfg.RssiSample.AvgRssi1) >> 1;
- else
- Rssi = pAd->StaCfg.RssiSample.AvgRssi0;
-
- if (pAd->LatchRfRegs.Channel <= 14) { /*BG band */
-#ifdef RT30xx
- /* RT3070 is a no LNA solution, it should have different control regarding to AGC gain control */
- /* Otherwise, it will have some throughput side effect when low RSSI */
-
- if (IS_RT3070(pAd) || IS_RT3090(pAd) || IS_RT3572(pAd)
- || IS_RT3390(pAd)) {
- if (Rssi > RSSI_FOR_MID_LOW_SENSIBILITY) {
- R66 =
- 0x1C + 2 * GET_LNA_GAIN(pAd) + 0x20;
- if (OrigR66Value != R66) {
- RTMP_BBP_IO_WRITE8_BY_REG_ID
- (pAd, BBP_R66, R66);
- }
- } else {
- R66 = 0x1C + 2 * GET_LNA_GAIN(pAd);
- if (OrigR66Value != R66) {
- RTMP_BBP_IO_WRITE8_BY_REG_ID
- (pAd, BBP_R66, R66);
- }
- }
- } else
-#endif /* RT30xx // */
- {
- if (Rssi > RSSI_FOR_MID_LOW_SENSIBILITY) {
- R66 = (0x2E + GET_LNA_GAIN(pAd)) + 0x10;
- if (OrigR66Value != R66) {
- RTMP_BBP_IO_WRITE8_BY_REG_ID
- (pAd, BBP_R66, R66);
- }
- } else {
- R66 = 0x2E + GET_LNA_GAIN(pAd);
- if (OrigR66Value != R66) {
- RTMP_BBP_IO_WRITE8_BY_REG_ID
- (pAd, BBP_R66, R66);
- }
- }
- }
- } else { /*A band */
- if (pAd->CommonCfg.BBPCurrentBW == BW_20) {
- if (Rssi > RSSI_FOR_MID_LOW_SENSIBILITY) {
- R66 =
- 0x32 + (GET_LNA_GAIN(pAd) * 5) / 3 +
- 0x10;
- if (OrigR66Value != R66) {
- RTMP_BBP_IO_WRITE8_BY_REG_ID
- (pAd, BBP_R66, R66);
- }
- } else {
- R66 =
- 0x32 + (GET_LNA_GAIN(pAd) * 5) / 3;
- if (OrigR66Value != R66) {
- RTMP_BBP_IO_WRITE8_BY_REG_ID
- (pAd, BBP_R66, R66);
- }
- }
- } else {
- if (Rssi > RSSI_FOR_MID_LOW_SENSIBILITY) {
- R66 =
- 0x3A + (GET_LNA_GAIN(pAd) * 5) / 3 +
- 0x10;
- if (OrigR66Value != R66) {
- RTMP_BBP_IO_WRITE8_BY_REG_ID
- (pAd, BBP_R66, R66);
- }
- } else {
- R66 =
- 0x3A + (GET_LNA_GAIN(pAd) * 5) / 3;
- if (OrigR66Value != R66) {
- RTMP_BBP_IO_WRITE8_BY_REG_ID
- (pAd, BBP_R66, R66);
- }
- }
- }
- }
-
- }
-}
-
-void RTMPSetAGCInitValue(struct rt_rtmp_adapter *pAd, u8 BandWidth)
-{
- u8 R66 = 0x30;
-
- if (pAd->LatchRfRegs.Channel <= 14) { /* BG band */
-#ifdef RT30xx
- /* Gary was verified Amazon AP and find that RT307x has BBP_R66 invalid default value */
-
- if (IS_RT3070(pAd) || IS_RT3090(pAd) || IS_RT3572(pAd)
- || IS_RT3390(pAd)) {
- R66 = 0x1C + 2 * GET_LNA_GAIN(pAd);
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);
- } else
-#endif /* RT30xx // */
- {
- R66 = 0x2E + GET_LNA_GAIN(pAd);
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);
- }
- } else { /*A band */
- {
- if (BandWidth == BW_20) {
- R66 =
- (u8)(0x32 +
- (GET_LNA_GAIN(pAd) * 5) / 3);
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);
- } else {
- R66 =
- (u8)(0x3A +
- (GET_LNA_GAIN(pAd) * 5) / 3);
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);
- }
- }
- }
-
-}
diff --git a/drivers/staging/rt2860/common/rt_channel.c b/drivers/staging/rt2860/common/rt_channel.c
deleted file mode 100644
index 538798981177..000000000000
--- a/drivers/staging/rt2860/common/rt_channel.c
+++ /dev/null
@@ -1,1705 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-*/
-#include "../rt_config.h"
-
-struct rt_ch_freq_map CH_HZ_ID_MAP[] = {
- {1, 2412}
- ,
- {2, 2417}
- ,
- {3, 2422}
- ,
- {4, 2427}
- ,
- {5, 2432}
- ,
- {6, 2437}
- ,
- {7, 2442}
- ,
- {8, 2447}
- ,
- {9, 2452}
- ,
- {10, 2457}
- ,
- {11, 2462}
- ,
- {12, 2467}
- ,
- {13, 2472}
- ,
- {14, 2484}
- ,
-
- /* UNII */
- {36, 5180}
- ,
- {40, 5200}
- ,
- {44, 5220}
- ,
- {48, 5240}
- ,
- {52, 5260}
- ,
- {56, 5280}
- ,
- {60, 5300}
- ,
- {64, 5320}
- ,
- {149, 5745}
- ,
- {153, 5765}
- ,
- {157, 5785}
- ,
- {161, 5805}
- ,
- {165, 5825}
- ,
- {167, 5835}
- ,
- {169, 5845}
- ,
- {171, 5855}
- ,
- {173, 5865}
- ,
-
- /* HiperLAN2 */
- {100, 5500}
- ,
- {104, 5520}
- ,
- {108, 5540}
- ,
- {112, 5560}
- ,
- {116, 5580}
- ,
- {120, 5600}
- ,
- {124, 5620}
- ,
- {128, 5640}
- ,
- {132, 5660}
- ,
- {136, 5680}
- ,
- {140, 5700}
- ,
-
- /* Japan MMAC */
- {34, 5170}
- ,
- {38, 5190}
- ,
- {42, 5210}
- ,
- {46, 5230}
- ,
-
- /* Japan */
- {184, 4920}
- ,
- {188, 4940}
- ,
- {192, 4960}
- ,
- {196, 4980}
- ,
-
- {208, 5040}
- , /* Japan, means J08 */
- {212, 5060}
- , /* Japan, means J12 */
- {216, 5080}
- , /* Japan, means J16 */
-};
-
-int CH_HZ_ID_MAP_NUM = (sizeof(CH_HZ_ID_MAP) / sizeof(struct rt_ch_freq_map));
-
-struct rt_ch_region ChRegion[] = {
- { /* Antigua and Berbuda */
- "AG",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, FALSE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Argentina */
- "AR",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {52, 4, 24, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {149, 4, 30, BOTH, FALSE}
- , /* 5G, ch 149~161 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Aruba */
- "AW",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, FALSE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Australia */
- "AU",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 24, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {149, 5, 30, BOTH, FALSE}
- , /* 5G, ch 149~165 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Austria */
- "AT",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, TRUE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Bahamas */
- "BS",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 24, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {149, 5, 30, BOTH, FALSE}
- , /* 5G, ch 149~165 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Barbados */
- "BB",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 24, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, FALSE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Bermuda */
- "BM",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 24, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, FALSE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Brazil */
- "BR",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 24, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {100, 11, 24, BOTH, FALSE}
- , /* 5G, ch 100~140 */
- {149, 5, 30, BOTH, FALSE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Belgium */
- "BE",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 18, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 18, IDOR, FALSE}
- , /* 5G, ch 52~64 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Bulgaria */
- "BG",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, ODOR, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Canada */
- "CA",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {149, 5, 30, BOTH, FALSE}
- , /* 5G, ch 149~165 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Cayman IsLands */
- "KY",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 24, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, FALSE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Chile */
- "CL",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 20, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 20, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {149, 5, 20, BOTH, FALSE}
- , /* 5G, ch 149~165 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* China */
- "CN",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {149, 4, 27, BOTH, FALSE}
- , /* 5G, ch 149~161 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Colombia */
- "CO",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 17, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 24, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, FALSE}
- , /* 5G, ch 100~140 */
- {149, 5, 30, BOTH, FALSE}
- , /* 5G, ch 149~165 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Costa Rica */
- "CR",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 17, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 24, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {149, 4, 30, BOTH, FALSE}
- , /* 5G, ch 149~161 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Cyprus */
- "CY",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 24, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Czech_Republic */
- "CZ",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Denmark */
- "DK",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Dominican Republic */
- "DO",
- CE,
- {
- {1, 0, 20, BOTH, FALSE}
- , /* 2.4 G, ch 0 */
- {149, 4, 20, BOTH, FALSE}
- , /* 5G, ch 149~161 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Equador */
- "EC",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {100, 11, 27, BOTH, FALSE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* El Salvador */
- "SV",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 30, BOTH, TRUE}
- , /* 5G, ch 52~64 */
- {149, 4, 36, BOTH, TRUE}
- , /* 5G, ch 149~165 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Finland */
- "FI",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* France */
- "FR",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Germany */
- "DE",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Greece */
- "GR",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, ODOR, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Guam */
- "GU",
- CE,
- {
- {1, 11, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~11 */
- {36, 4, 17, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 24, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, FALSE}
- , /* 5G, ch 100~140 */
- {149, 5, 30, BOTH, FALSE}
- , /* 5G, ch 149~165 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Guatemala */
- "GT",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 17, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 24, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {149, 4, 30, BOTH, FALSE}
- , /* 5G, ch 149~161 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Haiti */
- "HT",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 17, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 24, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {149, 4, 30, BOTH, FALSE}
- , /* 5G, ch 149~161 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Honduras */
- "HN",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {149, 4, 27, BOTH, FALSE}
- , /* 5G, ch 149~161 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Hong Kong */
- "HK",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, FALSE}
- , /* 5G, ch 52~64 */
- {149, 4, 30, BOTH, FALSE}
- , /* 5G, ch 149~161 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Hungary */
- "HU",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Iceland */
- "IS",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* India */
- "IN",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {149, 4, 24, IDOR, FALSE}
- , /* 5G, ch 149~161 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Indonesia */
- "ID",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {149, 4, 27, BOTH, FALSE}
- , /* 5G, ch 149~161 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Ireland */
- "IE",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, ODOR, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Israel */
- "IL",
- CE,
- {
- {1, 3, 20, IDOR, FALSE}
- , /* 2.4 G, ch 1~3 */
- {4, 6, 20, BOTH, FALSE}
- , /* 2.4 G, ch 4~9 */
- {10, 4, 20, IDOR, FALSE}
- , /* 2.4 G, ch 10~13 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Italy */
- "IT",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, ODOR, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Japan */
- "JP",
- JAP,
- {
- {1, 14, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~14 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Jordan */
- "JO",
- CE,
- {
- {1, 13, 20, IDOR, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {149, 4, 23, IDOR, FALSE}
- , /* 5G, ch 149~161 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Latvia */
- "LV",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Liechtenstein */
- "LI",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Lithuania */
- "LT",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Luxemburg */
- "LU",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Malaysia */
- "MY",
- CE,
- {
- {36, 4, 23, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {149, 5, 20, BOTH, FALSE}
- , /* 5G, ch 149~165 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Malta */
- "MT",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Marocco */
- "MA",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 24, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Mexico */
- "MX",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 24, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {149, 5, 30, IDOR, FALSE}
- , /* 5G, ch 149~165 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Netherlands */
- "NL",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 24, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* New Zealand */
- "NZ",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 24, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 24, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {149, 4, 30, BOTH, FALSE}
- , /* 5G, ch 149~161 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Norway */
- "NO",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 24, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 24, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, TRUE}
- , /* 5G, ch 149~161 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Peru */
- "PE",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {149, 4, 27, BOTH, FALSE}
- , /* 5G, ch 149~161 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Portugal */
- "PT",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Poland */
- "PL",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Romania */
- "RO",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Russia */
- "RU",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {149, 4, 20, IDOR, FALSE}
- , /* 5G, ch 149~161 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Saudi Arabia */
- "SA",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {149, 4, 23, BOTH, FALSE}
- , /* 5G, ch 149~161 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Serbia_and_Montenegro */
- "CS",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Singapore */
- "SG",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {149, 4, 20, BOTH, FALSE}
- , /* 5G, ch 149~161 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Slovakia */
- "SK",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Slovenia */
- "SI",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* South Africa */
- "ZA",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, FALSE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, TRUE}
- , /* 5G, ch 100~140 */
- {149, 4, 30, BOTH, FALSE}
- , /* 5G, ch 149~161 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* South Korea */
- "KR",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 20, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 20, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {100, 8, 20, BOTH, FALSE}
- , /* 5G, ch 100~128 */
- {149, 4, 20, BOTH, FALSE}
- , /* 5G, ch 149~161 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Spain */
- "ES",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 17, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Sweden */
- "SE",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Switzerland */
- "CH",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~13 */
- {36, 4, 23, IDOR, TRUE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Taiwan */
- "TW",
- CE,
- {
- {1, 11, 30, BOTH, FALSE}
- , /* 2.4 G, ch 1~11 */
- {52, 4, 23, IDOR, FALSE}
- , /* 5G, ch 52~64 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Turkey */
- "TR",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~11 */
- {36, 4, 23, BOTH, FALSE}
- , /* 5G, ch 36~48 */
- {52, 4, 23, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* UK */
- "GB",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~11 */
- {36, 4, 23, IDOR, FALSE}
- , /* 5G, ch 52~64 */
- {52, 4, 23, IDOR, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, TRUE}
- , /* 5G, ch 100~140 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Ukraine */
- "UA",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~11 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* United_Arab_Emirates */
- "AE",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~11 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* United_States */
- "US",
- CE,
- {
- {1, 11, 30, BOTH, FALSE}
- , /* 2.4 G, ch 1~11 */
- {36, 4, 17, IDOR, FALSE}
- , /* 5G, ch 52~64 */
- {52, 4, 24, BOTH, TRUE}
- , /* 5G, ch 52~64 */
- {100, 11, 30, BOTH, TRUE}
- , /* 5G, ch 100~140 */
- {149, 5, 30, BOTH, FALSE}
- , /* 5G, ch 149~165 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Venezuela */
- "VE",
- CE,
- {
- {1, 13, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~11 */
- {149, 4, 27, BOTH, FALSE}
- , /* 5G, ch 149~161 */
- {0}
- , /* end */
- }
- }
- ,
-
- { /* Default */
- "",
- CE,
- {
- {1, 11, 20, BOTH, FALSE}
- , /* 2.4 G, ch 1~11 */
- {36, 4, 20, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {52, 4, 20, BOTH, FALSE}
- , /* 5G, ch 52~64 */
- {100, 11, 20, BOTH, FALSE}
- , /* 5G, ch 100~140 */
- {149, 5, 20, BOTH, FALSE}
- , /* 5G, ch 149~165 */
- {0}
- , /* end */
- }
- }
- ,
-};
-
-static struct rt_ch_region *GetChRegion(u8 *CntryCode)
-{
- int loop = 0;
- struct rt_ch_region *pChRegion = NULL;
-
- while (strcmp((char *)ChRegion[loop].CountReg, "") != 0) {
- if (strncmp
- ((char *)ChRegion[loop].CountReg, (char *)CntryCode,
- 2) == 0) {
- pChRegion = &ChRegion[loop];
- break;
- }
- loop++;
- }
-
- if (pChRegion == NULL)
- pChRegion = &ChRegion[loop];
- return pChRegion;
-}
-
-static void ChBandCheck(u8 PhyMode, u8 *pChType)
-{
- switch (PhyMode) {
- case PHY_11A:
- case PHY_11AN_MIXED:
- *pChType = BAND_5G;
- break;
- case PHY_11ABG_MIXED:
- case PHY_11AGN_MIXED:
- case PHY_11ABGN_MIXED:
- *pChType = BAND_BOTH;
- break;
-
- default:
- *pChType = BAND_24G;
- break;
- }
-}
-
-static u8 FillChList(struct rt_rtmp_adapter *pAd,
- struct rt_ch_desp *pChDesp,
- u8 Offset, u8 increment)
-{
- int i, j, l;
- u8 channel;
-
- j = Offset;
- for (i = 0; i < pChDesp->NumOfCh; i++) {
- channel = pChDesp->FirstChannel + i * increment;
- for (l = 0; l < MAX_NUM_OF_CHANNELS; l++) {
- if (channel == pAd->TxPower[l].Channel) {
- pAd->ChannelList[j].Power =
- pAd->TxPower[l].Power;
- pAd->ChannelList[j].Power2 =
- pAd->TxPower[l].Power2;
- break;
- }
- }
- if (l == MAX_NUM_OF_CHANNELS)
- continue;
-
- pAd->ChannelList[j].Channel =
- pChDesp->FirstChannel + i * increment;
- pAd->ChannelList[j].MaxTxPwr = pChDesp->MaxTxPwr;
- pAd->ChannelList[j].DfsReq = pChDesp->DfsReq;
- j++;
- }
- pAd->ChannelListNum = j;
-
- return j;
-}
-
-static inline void CreateChList(struct rt_rtmp_adapter *pAd,
- struct rt_ch_region *pChRegion, u8 Geography)
-{
- int i;
- u8 offset = 0;
- struct rt_ch_desp *pChDesp;
- u8 ChType;
- u8 increment;
-
- if (pChRegion == NULL)
- return;
-
- ChBandCheck(pAd->CommonCfg.PhyMode, &ChType);
-
- for (i = 0; i < 10; i++) {
- pChDesp = &pChRegion->ChDesp[i];
- if (pChDesp->FirstChannel == 0)
- break;
-
- if (ChType == BAND_5G) {
- if (pChDesp->FirstChannel <= 14)
- continue;
- } else if (ChType == BAND_24G) {
- if (pChDesp->FirstChannel > 14)
- continue;
- }
-
- if ((pChDesp->Geography == BOTH)
- || (pChDesp->Geography == Geography)) {
- if (pChDesp->FirstChannel > 14)
- increment = 4;
- else
- increment = 1;
- offset = FillChList(pAd, pChDesp, offset, increment);
- }
- }
-}
-
-void BuildChannelListEx(struct rt_rtmp_adapter *pAd)
-{
- struct rt_ch_region *pChReg;
-
- pChReg = GetChRegion(pAd->CommonCfg.CountryCode);
- CreateChList(pAd, pChReg, pAd->CommonCfg.Geography);
-}
-
-void BuildBeaconChList(struct rt_rtmp_adapter *pAd,
- u8 *pBuf, unsigned long *pBufLen)
-{
- int i;
- unsigned long TmpLen;
- struct rt_ch_region *pChRegion;
- struct rt_ch_desp *pChDesp;
- u8 ChType;
-
- pChRegion = GetChRegion(pAd->CommonCfg.CountryCode);
-
- if (pChRegion == NULL)
- return;
-
- ChBandCheck(pAd->CommonCfg.PhyMode, &ChType);
- *pBufLen = 0;
-
- for (i = 0; i < 10; i++) {
- pChDesp = &pChRegion->ChDesp[i];
- if (pChDesp->FirstChannel == 0)
- break;
-
- if (ChType == BAND_5G) {
- if (pChDesp->FirstChannel <= 14)
- continue;
- } else if (ChType == BAND_24G) {
- if (pChDesp->FirstChannel > 14)
- continue;
- }
-
- if ((pChDesp->Geography == BOTH)
- || (pChDesp->Geography == pAd->CommonCfg.Geography)) {
- MakeOutgoingFrame(pBuf + *pBufLen, &TmpLen,
- 1, &pChDesp->FirstChannel,
- 1, &pChDesp->NumOfCh,
- 1, &pChDesp->MaxTxPwr, END_OF_ARGS);
- *pBufLen += TmpLen;
- }
- }
-}
-
-static BOOLEAN IsValidChannel(struct rt_rtmp_adapter *pAd, u8 channel)
-{
- int i;
-
- for (i = 0; i < pAd->ChannelListNum; i++) {
- if (pAd->ChannelList[i].Channel == channel)
- break;
- }
-
- if (i == pAd->ChannelListNum)
- return FALSE;
- else
- return TRUE;
-}
-
-static u8 GetExtCh(u8 Channel, u8 Direction)
-{
- char ExtCh;
-
- if (Direction == EXTCHA_ABOVE)
- ExtCh = Channel + 4;
- else
- ExtCh = (Channel - 4) > 0 ? (Channel - 4) : 0;
-
- return ExtCh;
-}
-
-void N_ChannelCheck(struct rt_rtmp_adapter *pAd)
-{
- /*u8 ChannelNum = pAd->ChannelListNum; */
- u8 Channel = pAd->CommonCfg.Channel;
-
- if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)
- && (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)) {
- if (Channel > 14) {
- if ((Channel == 36) || (Channel == 44)
- || (Channel == 52) || (Channel == 60)
- || (Channel == 100) || (Channel == 108)
- || (Channel == 116) || (Channel == 124)
- || (Channel == 132) || (Channel == 149)
- || (Channel == 157)) {
- pAd->CommonCfg.RegTransmitSetting.field.EXTCHA =
- EXTCHA_ABOVE;
- } else if ((Channel == 40) || (Channel == 48)
- || (Channel == 56) || (Channel == 64)
- || (Channel == 104) || (Channel == 112)
- || (Channel == 120) || (Channel == 128)
- || (Channel == 136) || (Channel == 153)
- || (Channel == 161)) {
- pAd->CommonCfg.RegTransmitSetting.field.EXTCHA =
- EXTCHA_BELOW;
- } else {
- pAd->CommonCfg.RegTransmitSetting.field.BW =
- BW_20;
- }
- } else {
- do {
- u8 ExtCh;
- u8 Dir =
- pAd->CommonCfg.RegTransmitSetting.field.
- EXTCHA;
- ExtCh = GetExtCh(Channel, Dir);
- if (IsValidChannel(pAd, ExtCh))
- break;
-
- Dir =
- (Dir ==
- EXTCHA_ABOVE) ? EXTCHA_BELOW :
- EXTCHA_ABOVE;
- ExtCh = GetExtCh(Channel, Dir);
- if (IsValidChannel(pAd, ExtCh)) {
- pAd->CommonCfg.RegTransmitSetting.field.
- EXTCHA = Dir;
- break;
- }
- pAd->CommonCfg.RegTransmitSetting.field.BW =
- BW_20;
- } while (FALSE);
-
- if (Channel == 14) {
- pAd->CommonCfg.RegTransmitSetting.field.BW =
- BW_20;
- /*pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_NONE; // We didn't set the ExtCh as NONE due to it'll set in RTMPSetHT() */
- }
- }
- }
-
-}
-
-void N_SetCenCh(struct rt_rtmp_adapter *pAd)
-{
- if (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40) {
- if (pAd->CommonCfg.RegTransmitSetting.field.EXTCHA ==
- EXTCHA_ABOVE) {
- pAd->CommonCfg.CentralChannel =
- pAd->CommonCfg.Channel + 2;
- } else {
- if (pAd->CommonCfg.Channel == 14)
- pAd->CommonCfg.CentralChannel =
- pAd->CommonCfg.Channel - 1;
- else
- pAd->CommonCfg.CentralChannel =
- pAd->CommonCfg.Channel - 2;
- }
- } else {
- pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;
- }
-}
-
-u8 GetCuntryMaxTxPwr(struct rt_rtmp_adapter *pAd, u8 channel)
-{
- int i;
- for (i = 0; i < pAd->ChannelListNum; i++) {
- if (pAd->ChannelList[i].Channel == channel)
- break;
- }
-
- if (i == pAd->ChannelListNum)
- return 0xff;
- else
- return pAd->ChannelList[i].MaxTxPwr;
-}
diff --git a/drivers/staging/rt2860/common/rt_rf.c b/drivers/staging/rt2860/common/rt_rf.c
deleted file mode 100644
index 2895447ffc48..000000000000
--- a/drivers/staging/rt2860/common/rt_rf.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-
- Module Name:
- rt_rf.c
-
- Abstract:
- Ralink Wireless driver RF related functions
-
- Revision History:
- Who When What
- -------- ---------- ----------------------------------------------
-*/
-
-#include "../rt_config.h"
-
-#ifdef RTMP_RF_RW_SUPPORT
-/*
- ========================================================================
-
- Routine Description: Write RT30xx RF register through MAC
-
- Arguments:
-
- Return Value:
-
- IRQL =
-
- Note:
-
- ========================================================================
-*/
-int RT30xxWriteRFRegister(struct rt_rtmp_adapter *pAd,
- u8 regID, u8 value)
-{
- RF_CSR_CFG_STRUC rfcsr;
- u32 i = 0;
-
- do {
- RTMP_IO_READ32(pAd, RF_CSR_CFG, &rfcsr.word);
-
- if (!rfcsr.field.RF_CSR_KICK)
- break;
- i++;
- }
- while ((i < RETRY_LIMIT)
- && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)));
-
- if ((i == RETRY_LIMIT)
- || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) {
- DBGPRINT_RAW(RT_DEBUG_ERROR,
- ("Retry count exhausted or device removed!\n"));
- return STATUS_UNSUCCESSFUL;
- }
-
- rfcsr.field.RF_CSR_WR = 1;
- rfcsr.field.RF_CSR_KICK = 1;
- rfcsr.field.TESTCSR_RFACC_REGNUM = regID;
- rfcsr.field.RF_CSR_DATA = value;
-
- RTMP_IO_WRITE32(pAd, RF_CSR_CFG, rfcsr.word);
-
- return NDIS_STATUS_SUCCESS;
-}
-
-/*
- ========================================================================
-
- Routine Description: Read RT30xx RF register through MAC
-
- Arguments:
-
- Return Value:
-
- IRQL =
-
- Note:
-
- ========================================================================
-*/
-int RT30xxReadRFRegister(struct rt_rtmp_adapter *pAd,
- u8 regID, u8 *pValue)
-{
- RF_CSR_CFG_STRUC rfcsr;
- u32 i = 0, k = 0;
-
- for (i = 0; i < MAX_BUSY_COUNT; i++) {
- RTMP_IO_READ32(pAd, RF_CSR_CFG, &rfcsr.word);
-
- if (rfcsr.field.RF_CSR_KICK == BUSY) {
- continue;
- }
- rfcsr.word = 0;
- rfcsr.field.RF_CSR_WR = 0;
- rfcsr.field.RF_CSR_KICK = 1;
- rfcsr.field.TESTCSR_RFACC_REGNUM = regID;
- RTMP_IO_WRITE32(pAd, RF_CSR_CFG, rfcsr.word);
- for (k = 0; k < MAX_BUSY_COUNT; k++) {
- RTMP_IO_READ32(pAd, RF_CSR_CFG, &rfcsr.word);
-
- if (rfcsr.field.RF_CSR_KICK == IDLE)
- break;
- }
- if ((rfcsr.field.RF_CSR_KICK == IDLE) &&
- (rfcsr.field.TESTCSR_RFACC_REGNUM == regID)) {
- *pValue = (u8)rfcsr.field.RF_CSR_DATA;
- break;
- }
- }
- if (rfcsr.field.RF_CSR_KICK == BUSY) {
- DBGPRINT_ERR("RF read R%d=0x%x fail, i[%d], k[%d]\n", regID, rfcsr.word, i, k);
- return STATUS_UNSUCCESSFUL;
- }
-
- return STATUS_SUCCESS;
-}
-
-void NICInitRFRegisters(struct rt_rtmp_adapter *pAd)
-{
- if (pAd->chipOps.AsicRfInit)
- pAd->chipOps.AsicRfInit(pAd);
-}
-
-void RtmpChipOpsRFHook(struct rt_rtmp_adapter *pAd)
-{
- struct rt_rtmp_chip_op *pChipOps = &pAd->chipOps;
-
- pChipOps->pRFRegTable = NULL;
- pChipOps->AsicRfInit = NULL;
- pChipOps->AsicRfTurnOn = NULL;
- pChipOps->AsicRfTurnOff = NULL;
- pChipOps->AsicReverseRfFromSleepMode = NULL;
- pChipOps->AsicHaltAction = NULL;
- /* We depends on RfICType and MACVersion to assign the corresponding operation callbacks. */
-
-#ifdef RT30xx
- if (IS_RT30xx(pAd)) {
- pChipOps->pRFRegTable = RT30xx_RFRegTable;
- pChipOps->AsicHaltAction = RT30xxHaltAction;
-#ifdef RT3070
- if ((IS_RT3070(pAd) || IS_RT3071(pAd))
- && (pAd->infType == RTMP_DEV_INF_USB)) {
- pChipOps->AsicRfInit = NICInitRT3070RFRegisters;
- if (IS_RT3071(pAd)) {
- pChipOps->AsicRfTurnOff =
- RT30xxLoadRFSleepModeSetup;
- pChipOps->AsicReverseRfFromSleepMode =
- RT30xxReverseRFSleepModeSetup;
- }
- }
-#endif /* RT3070 // */
-#ifdef RT3090
- if (IS_RT3090(pAd) && (pAd->infType == RTMP_DEV_INF_PCI)) {
- pChipOps->AsicRfTurnOff = RT30xxLoadRFSleepModeSetup;
- pChipOps->AsicRfInit = NICInitRT3090RFRegisters;
- pChipOps->AsicReverseRfFromSleepMode =
- RT30xxReverseRFSleepModeSetup;
- }
-#endif /* RT3090 // */
- }
-#endif /* RT30xx // */
-}
-
-#endif /* RTMP_RF_RW_SUPPORT // */
diff --git a/drivers/staging/rt2860/common/rtmp_init.c b/drivers/staging/rt2860/common/rtmp_init.c
deleted file mode 100644
index 5fa193eac0d3..000000000000
--- a/drivers/staging/rt2860/common/rtmp_init.c
+++ /dev/null
@@ -1,3536 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-
- Module Name:
- rtmp_init.c
-
- Abstract:
- Miniport generic portion header file
-
- Revision History:
- Who When What
- -------- ---------- ----------------------------------------------
-*/
-#include "../rt_config.h"
-
-u8 BIT8[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
-char *CipherName[] =
- { "none", "wep64", "wep128", "TKIP", "AES", "CKIP64", "CKIP128" };
-
-/* */
-/* BBP register initialization set */
-/* */
-struct rt_reg_pair BBPRegTable[] = {
- {BBP_R65, 0x2C}, /* fix rssi issue */
- {BBP_R66, 0x38}, /* Also set this default value to pAd->BbpTuning.R66CurrentValue at initial */
- {BBP_R69, 0x12},
- {BBP_R70, 0xa}, /* BBP_R70 will change to 0x8 in ApStartUp and LinkUp for rt2860C, otherwise value is 0xa */
- {BBP_R73, 0x10},
- {BBP_R81, 0x37},
- {BBP_R82, 0x62},
- {BBP_R83, 0x6A},
- {BBP_R84, 0x99}, /* 0x19 is for rt2860E and after. This is for extension channel overlapping IOT. 0x99 is for rt2860D and before */
- {BBP_R86, 0x00}, /* middle range issue, Rory @2008-01-28 */
- {BBP_R91, 0x04}, /* middle range issue, Rory @2008-01-28 */
- {BBP_R92, 0x00}, /* middle range issue, Rory @2008-01-28 */
- {BBP_R103, 0x00}, /* near range high-power issue, requested from Gary @2008-0528 */
- {BBP_R105, 0x05}, /* 0x05 is for rt2860E to turn on FEQ control. It is safe for rt2860D and before, because Bit 7:2 are reserved in rt2860D and before. */
- {BBP_R106, 0x35}, /* for ShortGI throughput */
-};
-
-#define NUM_BBP_REG_PARMS (sizeof(BBPRegTable) / sizeof(struct rt_reg_pair))
-
-/* */
-/* ASIC register initialization sets */
-/* */
-
-struct rt_rtmp_reg_pair MACRegTable[] = {
-#if defined(HW_BEACON_OFFSET) && (HW_BEACON_OFFSET == 0x200)
- {BCN_OFFSET0, 0xf8f0e8e0}, /* 0x3800(e0), 0x3A00(e8), 0x3C00(f0), 0x3E00(f8), 512B for each beacon */
- {BCN_OFFSET1, 0x6f77d0c8}, /* 0x3200(c8), 0x3400(d0), 0x1DC0(77), 0x1BC0(6f), 512B for each beacon */
-#elif defined(HW_BEACON_OFFSET) && (HW_BEACON_OFFSET == 0x100)
- {BCN_OFFSET0, 0xece8e4e0}, /* 0x3800, 0x3A00, 0x3C00, 0x3E00, 512B for each beacon */
- {BCN_OFFSET1, 0xfcf8f4f0}, /* 0x3800, 0x3A00, 0x3C00, 0x3E00, 512B for each beacon */
-#else
-#error You must re-calculate new value for BCN_OFFSET0 & BCN_OFFSET1 in MACRegTable[]!
-#endif /* HW_BEACON_OFFSET // */
-
- {LEGACY_BASIC_RATE, 0x0000013f}, /* Basic rate set bitmap */
- {HT_BASIC_RATE, 0x00008003}, /* Basic HT rate set , 20M, MCS=3, MM. Format is the same as in TXWI. */
- {MAC_SYS_CTRL, 0x00}, /* 0x1004, , default Disable RX */
- {RX_FILTR_CFG, 0x17f97}, /*0x1400 , RX filter control, */
- {BKOFF_SLOT_CFG, 0x209}, /* default set short slot time, CC_DELAY_TIME should be 2 */
- /*{TX_SW_CFG0, 0x40a06}, // Gary,2006-08-23 */
- {TX_SW_CFG0, 0x0}, /* Gary,2008-05-21 for CWC test */
- {TX_SW_CFG1, 0x80606}, /* Gary,2006-08-23 */
- {TX_LINK_CFG, 0x1020}, /* Gary,2006-08-23 */
- /*{TX_TIMEOUT_CFG, 0x00182090}, // CCK has some problem. So increase timieout value. 2006-10-09// MArvek RT */
- {TX_TIMEOUT_CFG, 0x000a2090}, /* CCK has some problem. So increase timieout value. 2006-10-09// MArvek RT , Modify for 2860E ,2007-08-01 */
- {MAX_LEN_CFG, MAX_AGGREGATION_SIZE | 0x00001000}, /* 0x3018, MAX frame length. Max PSDU = 16kbytes. */
- {LED_CFG, 0x7f031e46}, /* Gary, 2006-08-23 */
-
- {PBF_MAX_PCNT, 0x1F3FBF9F}, /*0x1F3f7f9f}, //Jan, 2006/04/20 */
-
- {TX_RTY_CFG, 0x47d01f0f}, /* Jan, 2006/11/16, Set TxWI->ACK =0 in Probe Rsp Modify for 2860E ,2007-08-03 */
-
- {AUTO_RSP_CFG, 0x00000013}, /* Initial Auto_Responder, because QA will turn off Auto-Responder */
- {CCK_PROT_CFG, 0x05740003 /*0x01740003 */ }, /* Initial Auto_Responder, because QA will turn off Auto-Responder. And RTS threshold is enabled. */
- {OFDM_PROT_CFG, 0x05740003 /*0x01740003 */ }, /* Initial Auto_Responder, because QA will turn off Auto-Responder. And RTS threshold is enabled. */
-#ifdef RTMP_MAC_USB
- {PBF_CFG, 0xf40006}, /* Only enable Queue 2 */
- {MM40_PROT_CFG, 0x3F44084}, /* Initial Auto_Responder, because QA will turn off Auto-Responder */
- {WPDMA_GLO_CFG, 0x00000030},
-#endif /* RTMP_MAC_USB // */
- {GF20_PROT_CFG, 0x01744004}, /* set 19:18 --> Short NAV for MIMO PS */
- {GF40_PROT_CFG, 0x03F44084},
- {MM20_PROT_CFG, 0x01744004},
-#ifdef RTMP_MAC_PCI
- {MM40_PROT_CFG, 0x03F54084},
-#endif /* RTMP_MAC_PCI // */
- {TXOP_CTRL_CFG, 0x0000583f, /*0x0000243f *//*0x000024bf */ }, /*Extension channel backoff. */
- {TX_RTS_CFG, 0x00092b20},
- {EXP_ACK_TIME, 0x002400ca}, /* default value */
-
- {TXOP_HLDR_ET, 0x00000002},
-
- /* Jerry comments 2008/01/16: we use SIFS = 10us in CCK defaultly, but it seems that 10us
- is too small for INTEL 2200bg card, so in MBSS mode, the delta time between beacon0
- and beacon1 is SIFS (10us), so if INTEL 2200bg card connects to BSS0, the ping
- will always lost. So we change the SIFS of CCK from 10us to 16us. */
- {XIFS_TIME_CFG, 0x33a41010},
- {PWR_PIN_CFG, 0x00000003}, /* patch for 2880-E */
-};
-
-struct rt_rtmp_reg_pair STAMACRegTable[] = {
- {WMM_AIFSN_CFG, 0x00002273},
- {WMM_CWMIN_CFG, 0x00002344},
- {WMM_CWMAX_CFG, 0x000034aa},
-};
-
-#define NUM_MAC_REG_PARMS (sizeof(MACRegTable) / sizeof(struct rt_rtmp_reg_pair))
-#define NUM_STA_MAC_REG_PARMS (sizeof(STAMACRegTable) / sizeof(struct rt_rtmp_reg_pair))
-
-/*
- ========================================================================
-
- Routine Description:
- Allocate struct rt_rtmp_adapter data block and do some initialization
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- NDIS_STATUS_SUCCESS
- NDIS_STATUS_FAILURE
-
- IRQL = PASSIVE_LEVEL
-
- Note:
-
- ========================================================================
-*/
-int RTMPAllocAdapterBlock(void *handle,
- struct rt_rtmp_adapter * * ppAdapter)
-{
- struct rt_rtmp_adapter *pAd;
- int Status;
- int index;
- u8 *pBeaconBuf = NULL;
-
- DBGPRINT(RT_DEBUG_TRACE, ("--> RTMPAllocAdapterBlock\n"));
-
- *ppAdapter = NULL;
-
- do {
- /* Allocate struct rt_rtmp_adapter memory block */
- pBeaconBuf = kmalloc(MAX_BEACON_SIZE, MEM_ALLOC_FLAG);
- if (pBeaconBuf == NULL) {
- Status = NDIS_STATUS_FAILURE;
- DBGPRINT_ERR("Failed to allocate memory - BeaconBuf!\n");
- break;
- }
- NdisZeroMemory(pBeaconBuf, MAX_BEACON_SIZE);
-
- Status = AdapterBlockAllocateMemory(handle, (void **) & pAd);
- if (Status != NDIS_STATUS_SUCCESS) {
- DBGPRINT_ERR("Failed to allocate memory - ADAPTER\n");
- break;
- }
- pAd->BeaconBuf = pBeaconBuf;
- DBGPRINT(RT_DEBUG_OFF,
- ("=== pAd = %p, size = %d ===\n", pAd,
- (u32)sizeof(struct rt_rtmp_adapter)));
-
- /* Init spin locks */
- NdisAllocateSpinLock(&pAd->MgmtRingLock);
-#ifdef RTMP_MAC_PCI
- NdisAllocateSpinLock(&pAd->RxRingLock);
-#ifdef RT3090
- NdisAllocateSpinLock(&pAd->McuCmdLock);
-#endif /* RT3090 // */
-#endif /* RTMP_MAC_PCI // */
-
- for (index = 0; index < NUM_OF_TX_RING; index++) {
- NdisAllocateSpinLock(&pAd->TxSwQueueLock[index]);
- NdisAllocateSpinLock(&pAd->DeQueueLock[index]);
- pAd->DeQueueRunning[index] = FALSE;
- }
-
- NdisAllocateSpinLock(&pAd->irq_lock);
-
- } while (FALSE);
-
- if ((Status != NDIS_STATUS_SUCCESS) && (pBeaconBuf))
- kfree(pBeaconBuf);
-
- *ppAdapter = pAd;
-
- DBGPRINT_S(Status, ("<-- RTMPAllocAdapterBlock, Status=%x\n", Status));
- return Status;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Read initial Tx power per MCS and BW from EEPROM
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPReadTxPwrPerRate(struct rt_rtmp_adapter *pAd)
-{
- unsigned long data, Adata, Gdata;
- u16 i, value, value2;
- int Apwrdelta, Gpwrdelta;
- u8 t1, t2, t3, t4;
- BOOLEAN bApwrdeltaMinus = TRUE, bGpwrdeltaMinus = TRUE;
-
- /* */
- /* Get power delta for 20MHz and 40MHz. */
- /* */
- DBGPRINT(RT_DEBUG_TRACE, ("Txpower per Rate\n"));
- RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_DELTA, value2);
- Apwrdelta = 0;
- Gpwrdelta = 0;
-
- if ((value2 & 0xff) != 0xff) {
- if ((value2 & 0x80))
- Gpwrdelta = (value2 & 0xf);
-
- if ((value2 & 0x40))
- bGpwrdeltaMinus = FALSE;
- else
- bGpwrdeltaMinus = TRUE;
- }
- if ((value2 & 0xff00) != 0xff00) {
- if ((value2 & 0x8000))
- Apwrdelta = ((value2 & 0xf00) >> 8);
-
- if ((value2 & 0x4000))
- bApwrdeltaMinus = FALSE;
- else
- bApwrdeltaMinus = TRUE;
- }
- DBGPRINT(RT_DEBUG_TRACE,
- ("Gpwrdelta = %x, Apwrdelta = %x .\n", Gpwrdelta, Apwrdelta));
-
- /* */
- /* Get Txpower per MCS for 20MHz in 2.4G. */
- /* */
- for (i = 0; i < 5; i++) {
- RT28xx_EEPROM_READ16(pAd,
- EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i * 4,
- value);
- data = value;
- if (bApwrdeltaMinus == FALSE) {
- t1 = (value & 0xf) + (Apwrdelta);
- if (t1 > 0xf)
- t1 = 0xf;
- t2 = ((value & 0xf0) >> 4) + (Apwrdelta);
- if (t2 > 0xf)
- t2 = 0xf;
- t3 = ((value & 0xf00) >> 8) + (Apwrdelta);
- if (t3 > 0xf)
- t3 = 0xf;
- t4 = ((value & 0xf000) >> 12) + (Apwrdelta);
- if (t4 > 0xf)
- t4 = 0xf;
- } else {
- if ((value & 0xf) > Apwrdelta)
- t1 = (value & 0xf) - (Apwrdelta);
- else
- t1 = 0;
- if (((value & 0xf0) >> 4) > Apwrdelta)
- t2 = ((value & 0xf0) >> 4) - (Apwrdelta);
- else
- t2 = 0;
- if (((value & 0xf00) >> 8) > Apwrdelta)
- t3 = ((value & 0xf00) >> 8) - (Apwrdelta);
- else
- t3 = 0;
- if (((value & 0xf000) >> 12) > Apwrdelta)
- t4 = ((value & 0xf000) >> 12) - (Apwrdelta);
- else
- t4 = 0;
- }
- Adata = t1 + (t2 << 4) + (t3 << 8) + (t4 << 12);
- if (bGpwrdeltaMinus == FALSE) {
- t1 = (value & 0xf) + (Gpwrdelta);
- if (t1 > 0xf)
- t1 = 0xf;
- t2 = ((value & 0xf0) >> 4) + (Gpwrdelta);
- if (t2 > 0xf)
- t2 = 0xf;
- t3 = ((value & 0xf00) >> 8) + (Gpwrdelta);
- if (t3 > 0xf)
- t3 = 0xf;
- t4 = ((value & 0xf000) >> 12) + (Gpwrdelta);
- if (t4 > 0xf)
- t4 = 0xf;
- } else {
- if ((value & 0xf) > Gpwrdelta)
- t1 = (value & 0xf) - (Gpwrdelta);
- else
- t1 = 0;
- if (((value & 0xf0) >> 4) > Gpwrdelta)
- t2 = ((value & 0xf0) >> 4) - (Gpwrdelta);
- else
- t2 = 0;
- if (((value & 0xf00) >> 8) > Gpwrdelta)
- t3 = ((value & 0xf00) >> 8) - (Gpwrdelta);
- else
- t3 = 0;
- if (((value & 0xf000) >> 12) > Gpwrdelta)
- t4 = ((value & 0xf000) >> 12) - (Gpwrdelta);
- else
- t4 = 0;
- }
- Gdata = t1 + (t2 << 4) + (t3 << 8) + (t4 << 12);
-
- RT28xx_EEPROM_READ16(pAd,
- EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i * 4 +
- 2, value);
- if (bApwrdeltaMinus == FALSE) {
- t1 = (value & 0xf) + (Apwrdelta);
- if (t1 > 0xf)
- t1 = 0xf;
- t2 = ((value & 0xf0) >> 4) + (Apwrdelta);
- if (t2 > 0xf)
- t2 = 0xf;
- t3 = ((value & 0xf00) >> 8) + (Apwrdelta);
- if (t3 > 0xf)
- t3 = 0xf;
- t4 = ((value & 0xf000) >> 12) + (Apwrdelta);
- if (t4 > 0xf)
- t4 = 0xf;
- } else {
- if ((value & 0xf) > Apwrdelta)
- t1 = (value & 0xf) - (Apwrdelta);
- else
- t1 = 0;
- if (((value & 0xf0) >> 4) > Apwrdelta)
- t2 = ((value & 0xf0) >> 4) - (Apwrdelta);
- else
- t2 = 0;
- if (((value & 0xf00) >> 8) > Apwrdelta)
- t3 = ((value & 0xf00) >> 8) - (Apwrdelta);
- else
- t3 = 0;
- if (((value & 0xf000) >> 12) > Apwrdelta)
- t4 = ((value & 0xf000) >> 12) - (Apwrdelta);
- else
- t4 = 0;
- }
- Adata |= ((t1 << 16) + (t2 << 20) + (t3 << 24) + (t4 << 28));
- if (bGpwrdeltaMinus == FALSE) {
- t1 = (value & 0xf) + (Gpwrdelta);
- if (t1 > 0xf)
- t1 = 0xf;
- t2 = ((value & 0xf0) >> 4) + (Gpwrdelta);
- if (t2 > 0xf)
- t2 = 0xf;
- t3 = ((value & 0xf00) >> 8) + (Gpwrdelta);
- if (t3 > 0xf)
- t3 = 0xf;
- t4 = ((value & 0xf000) >> 12) + (Gpwrdelta);
- if (t4 > 0xf)
- t4 = 0xf;
- } else {
- if ((value & 0xf) > Gpwrdelta)
- t1 = (value & 0xf) - (Gpwrdelta);
- else
- t1 = 0;
- if (((value & 0xf0) >> 4) > Gpwrdelta)
- t2 = ((value & 0xf0) >> 4) - (Gpwrdelta);
- else
- t2 = 0;
- if (((value & 0xf00) >> 8) > Gpwrdelta)
- t3 = ((value & 0xf00) >> 8) - (Gpwrdelta);
- else
- t3 = 0;
- if (((value & 0xf000) >> 12) > Gpwrdelta)
- t4 = ((value & 0xf000) >> 12) - (Gpwrdelta);
- else
- t4 = 0;
- }
- Gdata |= ((t1 << 16) + (t2 << 20) + (t3 << 24) + (t4 << 28));
- data |= (value << 16);
-
- /* For 20M/40M Power Delta issue */
- pAd->Tx20MPwrCfgABand[i] = data;
- pAd->Tx20MPwrCfgGBand[i] = data;
- pAd->Tx40MPwrCfgABand[i] = Adata;
- pAd->Tx40MPwrCfgGBand[i] = Gdata;
-
- if (data != 0xffffffff)
- RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i * 4, data);
- DBGPRINT_RAW(RT_DEBUG_TRACE,
- ("20MHz BW, 2.4G band-%lx, Adata = %lx, Gdata = %lx \n",
- data, Adata, Gdata));
- }
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Read initial channel power parameters from EEPROM
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPReadChannelPwr(struct rt_rtmp_adapter *pAd)
-{
- u8 i, choffset;
- EEPROM_TX_PWR_STRUC Power;
- EEPROM_TX_PWR_STRUC Power2;
-
- /* Read Tx power value for all channels */
- /* Value from 1 - 0x7f. Default value is 24. */
- /* Power value : 2.4G 0x00 (0) ~ 0x1F (31) */
- /* : 5.5G 0xF9 (-7) ~ 0x0F (15) */
-
- /* 0. 11b/g, ch1 - ch 14 */
- for (i = 0; i < 7; i++) {
- RT28xx_EEPROM_READ16(pAd, EEPROM_G_TX_PWR_OFFSET + i * 2,
- Power.word);
- RT28xx_EEPROM_READ16(pAd, EEPROM_G_TX2_PWR_OFFSET + i * 2,
- Power2.word);
- pAd->TxPower[i * 2].Channel = i * 2 + 1;
- pAd->TxPower[i * 2 + 1].Channel = i * 2 + 2;
-
- if ((Power.field.Byte0 > 31) || (Power.field.Byte0 < 0))
- pAd->TxPower[i * 2].Power = DEFAULT_RF_TX_POWER;
- else
- pAd->TxPower[i * 2].Power = Power.field.Byte0;
-
- if ((Power.field.Byte1 > 31) || (Power.field.Byte1 < 0))
- pAd->TxPower[i * 2 + 1].Power = DEFAULT_RF_TX_POWER;
- else
- pAd->TxPower[i * 2 + 1].Power = Power.field.Byte1;
-
- if ((Power2.field.Byte0 > 31) || (Power2.field.Byte0 < 0))
- pAd->TxPower[i * 2].Power2 = DEFAULT_RF_TX_POWER;
- else
- pAd->TxPower[i * 2].Power2 = Power2.field.Byte0;
-
- if ((Power2.field.Byte1 > 31) || (Power2.field.Byte1 < 0))
- pAd->TxPower[i * 2 + 1].Power2 = DEFAULT_RF_TX_POWER;
- else
- pAd->TxPower[i * 2 + 1].Power2 = Power2.field.Byte1;
- }
-
- /* 1. U-NII lower/middle band: 36, 38, 40; 44, 46, 48; 52, 54, 56; 60, 62, 64 (including central frequency in BW 40MHz) */
- /* 1.1 Fill up channel */
- choffset = 14;
- for (i = 0; i < 4; i++) {
- pAd->TxPower[3 * i + choffset + 0].Channel = 36 + i * 8 + 0;
- pAd->TxPower[3 * i + choffset + 0].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * i + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
-
- pAd->TxPower[3 * i + choffset + 1].Channel = 36 + i * 8 + 2;
- pAd->TxPower[3 * i + choffset + 1].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * i + choffset + 1].Power2 = DEFAULT_RF_TX_POWER;
-
- pAd->TxPower[3 * i + choffset + 2].Channel = 36 + i * 8 + 4;
- pAd->TxPower[3 * i + choffset + 2].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * i + choffset + 2].Power2 = DEFAULT_RF_TX_POWER;
- }
-
- /* 1.2 Fill up power */
- for (i = 0; i < 6; i++) {
- RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + i * 2,
- Power.word);
- RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + i * 2,
- Power2.word);
-
- if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))
- pAd->TxPower[i * 2 + choffset + 0].Power =
- Power.field.Byte0;
-
- if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))
- pAd->TxPower[i * 2 + choffset + 1].Power =
- Power.field.Byte1;
-
- if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))
- pAd->TxPower[i * 2 + choffset + 0].Power2 =
- Power2.field.Byte0;
-
- if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))
- pAd->TxPower[i * 2 + choffset + 1].Power2 =
- Power2.field.Byte1;
- }
-
- /* 2. HipperLAN 2 100, 102 ,104; 108, 110, 112; 116, 118, 120; 124, 126, 128; 132, 134, 136; 140 (including central frequency in BW 40MHz) */
- /* 2.1 Fill up channel */
- choffset = 14 + 12;
- for (i = 0; i < 5; i++) {
- pAd->TxPower[3 * i + choffset + 0].Channel = 100 + i * 8 + 0;
- pAd->TxPower[3 * i + choffset + 0].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * i + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
-
- pAd->TxPower[3 * i + choffset + 1].Channel = 100 + i * 8 + 2;
- pAd->TxPower[3 * i + choffset + 1].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * i + choffset + 1].Power2 = DEFAULT_RF_TX_POWER;
-
- pAd->TxPower[3 * i + choffset + 2].Channel = 100 + i * 8 + 4;
- pAd->TxPower[3 * i + choffset + 2].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * i + choffset + 2].Power2 = DEFAULT_RF_TX_POWER;
- }
- pAd->TxPower[3 * 5 + choffset + 0].Channel = 140;
- pAd->TxPower[3 * 5 + choffset + 0].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * 5 + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
-
- /* 2.2 Fill up power */
- for (i = 0; i < 8; i++) {
- RT28xx_EEPROM_READ16(pAd,
- EEPROM_A_TX_PWR_OFFSET + (choffset - 14) +
- i * 2, Power.word);
- RT28xx_EEPROM_READ16(pAd,
- EEPROM_A_TX2_PWR_OFFSET + (choffset - 14) +
- i * 2, Power2.word);
-
- if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))
- pAd->TxPower[i * 2 + choffset + 0].Power =
- Power.field.Byte0;
-
- if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))
- pAd->TxPower[i * 2 + choffset + 1].Power =
- Power.field.Byte1;
-
- if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))
- pAd->TxPower[i * 2 + choffset + 0].Power2 =
- Power2.field.Byte0;
-
- if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))
- pAd->TxPower[i * 2 + choffset + 1].Power2 =
- Power2.field.Byte1;
- }
-
- /* 3. U-NII upper band: 149, 151, 153; 157, 159, 161; 165, 167, 169; 171, 173 (including central frequency in BW 40MHz) */
- /* 3.1 Fill up channel */
- choffset = 14 + 12 + 16;
- /*for (i = 0; i < 2; i++) */
- for (i = 0; i < 3; i++) {
- pAd->TxPower[3 * i + choffset + 0].Channel = 149 + i * 8 + 0;
- pAd->TxPower[3 * i + choffset + 0].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * i + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
-
- pAd->TxPower[3 * i + choffset + 1].Channel = 149 + i * 8 + 2;
- pAd->TxPower[3 * i + choffset + 1].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * i + choffset + 1].Power2 = DEFAULT_RF_TX_POWER;
-
- pAd->TxPower[3 * i + choffset + 2].Channel = 149 + i * 8 + 4;
- pAd->TxPower[3 * i + choffset + 2].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * i + choffset + 2].Power2 = DEFAULT_RF_TX_POWER;
- }
- pAd->TxPower[3 * 3 + choffset + 0].Channel = 171;
- pAd->TxPower[3 * 3 + choffset + 0].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * 3 + choffset + 0].Power2 = DEFAULT_RF_TX_POWER;
-
- pAd->TxPower[3 * 3 + choffset + 1].Channel = 173;
- pAd->TxPower[3 * 3 + choffset + 1].Power = DEFAULT_RF_TX_POWER;
- pAd->TxPower[3 * 3 + choffset + 1].Power2 = DEFAULT_RF_TX_POWER;
-
- /* 3.2 Fill up power */
- /*for (i = 0; i < 4; i++) */
- for (i = 0; i < 6; i++) {
- RT28xx_EEPROM_READ16(pAd,
- EEPROM_A_TX_PWR_OFFSET + (choffset - 14) +
- i * 2, Power.word);
- RT28xx_EEPROM_READ16(pAd,
- EEPROM_A_TX2_PWR_OFFSET + (choffset - 14) +
- i * 2, Power2.word);
-
- if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7))
- pAd->TxPower[i * 2 + choffset + 0].Power =
- Power.field.Byte0;
-
- if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7))
- pAd->TxPower[i * 2 + choffset + 1].Power =
- Power.field.Byte1;
-
- if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7))
- pAd->TxPower[i * 2 + choffset + 0].Power2 =
- Power2.field.Byte0;
-
- if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7))
- pAd->TxPower[i * 2 + choffset + 1].Power2 =
- Power2.field.Byte1;
- }
-
- /* 4. Print and Debug */
- /*choffset = 14 + 12 + 16 + 7; */
- choffset = 14 + 12 + 16 + 11;
-
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Read the following from the registry
- 1. All the parameters
- 2. NetworkAddres
-
- Arguments:
- Adapter Pointer to our adapter
- WrapperConfigurationContext For use by NdisOpenConfiguration
-
- Return Value:
- NDIS_STATUS_SUCCESS
- NDIS_STATUS_FAILURE
- NDIS_STATUS_RESOURCES
-
- IRQL = PASSIVE_LEVEL
-
- Note:
-
- ========================================================================
-*/
-int NICReadRegParameters(struct rt_rtmp_adapter *pAd,
- void *WrapperConfigurationContext)
-{
- int Status = NDIS_STATUS_SUCCESS;
- DBGPRINT_S(Status, ("<-- NICReadRegParameters, Status=%x\n", Status));
- return Status;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Read initial parameters from EEPROM
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void NICReadEEPROMParameters(struct rt_rtmp_adapter *pAd, u8 *mac_addr)
-{
- u32 data = 0;
- u16 i, value, value2;
- u8 TmpPhy;
- EEPROM_TX_PWR_STRUC Power;
- EEPROM_VERSION_STRUC Version;
- EEPROM_ANTENNA_STRUC Antenna;
- EEPROM_NIC_CONFIG2_STRUC NicConfig2;
-
- DBGPRINT(RT_DEBUG_TRACE, ("--> NICReadEEPROMParameters\n"));
-
- if (pAd->chipOps.eeinit)
- pAd->chipOps.eeinit(pAd);
-
- /* Init EEPROM Address Number, before access EEPROM; if 93c46, EEPROMAddressNum=6, else if 93c66, EEPROMAddressNum=8 */
- RTMP_IO_READ32(pAd, E2PROM_CSR, &data);
- DBGPRINT(RT_DEBUG_TRACE, ("--> E2PROM_CSR = 0x%x\n", data));
-
- if ((data & 0x30) == 0)
- pAd->EEPROMAddressNum = 6; /* 93C46 */
- else if ((data & 0x30) == 0x10)
- pAd->EEPROMAddressNum = 8; /* 93C66 */
- else
- pAd->EEPROMAddressNum = 8; /* 93C86 */
- DBGPRINT(RT_DEBUG_TRACE,
- ("--> EEPROMAddressNum = %d\n", pAd->EEPROMAddressNum));
-
- /* RT2860 MAC no longer auto load MAC address from E2PROM. Driver has to initialize */
- /* MAC address registers according to E2PROM setting */
- if (mac_addr == NULL ||
- strlen((char *)mac_addr) != 17 ||
- mac_addr[2] != ':' || mac_addr[5] != ':' || mac_addr[8] != ':' ||
- mac_addr[11] != ':' || mac_addr[14] != ':') {
- u16 Addr01, Addr23, Addr45;
-
- RT28xx_EEPROM_READ16(pAd, 0x04, Addr01);
- RT28xx_EEPROM_READ16(pAd, 0x06, Addr23);
- RT28xx_EEPROM_READ16(pAd, 0x08, Addr45);
-
- pAd->PermanentAddress[0] = (u8)(Addr01 & 0xff);
- pAd->PermanentAddress[1] = (u8)(Addr01 >> 8);
- pAd->PermanentAddress[2] = (u8)(Addr23 & 0xff);
- pAd->PermanentAddress[3] = (u8)(Addr23 >> 8);
- pAd->PermanentAddress[4] = (u8)(Addr45 & 0xff);
- pAd->PermanentAddress[5] = (u8)(Addr45 >> 8);
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("Initialize MAC Address from E2PROM \n"));
- } else {
- int j;
- char *macptr;
-
- macptr = (char *)mac_addr;
-
- for (j = 0; j < MAC_ADDR_LEN; j++) {
- AtoH(macptr, &pAd->PermanentAddress[j], 1);
- macptr = macptr + 3;
- }
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("Initialize MAC Address from module parameter \n"));
- }
-
- {
- /*more conveninet to test mbssid, so ap's bssid &0xf1 */
- if (pAd->PermanentAddress[0] == 0xff)
- pAd->PermanentAddress[0] = RandomByte(pAd) & 0xf8;
-
- /*if (pAd->PermanentAddress[5] == 0xff) */
- /* pAd->PermanentAddress[5] = RandomByte(pAd)&0xf8; */
-
- DBGPRINT_RAW(RT_DEBUG_TRACE,
- ("E2PROM MAC: =%pM\n", pAd->PermanentAddress));
- if (pAd->bLocalAdminMAC == FALSE) {
- MAC_DW0_STRUC csr2;
- MAC_DW1_STRUC csr3;
- COPY_MAC_ADDR(pAd->CurrentAddress,
- pAd->PermanentAddress);
- csr2.field.Byte0 = pAd->CurrentAddress[0];
- csr2.field.Byte1 = pAd->CurrentAddress[1];
- csr2.field.Byte2 = pAd->CurrentAddress[2];
- csr2.field.Byte3 = pAd->CurrentAddress[3];
- RTMP_IO_WRITE32(pAd, MAC_ADDR_DW0, csr2.word);
- csr3.word = 0;
- csr3.field.Byte4 = pAd->CurrentAddress[4];
- csr3.field.Byte5 = pAd->CurrentAddress[5];
- csr3.field.U2MeMask = 0xff;
- RTMP_IO_WRITE32(pAd, MAC_ADDR_DW1, csr3.word);
- DBGPRINT_RAW(RT_DEBUG_TRACE,
- ("E2PROM MAC: =%pM\n",
- pAd->PermanentAddress));
- }
- }
-
- /* if not return early. cause fail at emulation. */
- /* Init the channel number for TX channel power */
- RTMPReadChannelPwr(pAd);
-
- /* if E2PROM version mismatch with driver's expectation, then skip */
- /* all subsequent E2RPOM retieval and set a system error bit to notify GUI */
- RT28xx_EEPROM_READ16(pAd, EEPROM_VERSION_OFFSET, Version.word);
- pAd->EepromVersion =
- Version.field.Version + Version.field.FaeReleaseNumber * 256;
- DBGPRINT(RT_DEBUG_TRACE,
- ("E2PROM: Version = %d, FAE release #%d\n",
- Version.field.Version, Version.field.FaeReleaseNumber));
-
- if (Version.field.Version > VALID_EEPROM_VERSION) {
- DBGPRINT_ERR("E2PROM: WRONG VERSION 0x%x, should be %d\n", Version.field.Version, VALID_EEPROM_VERSION);
- /*pAd->SystemErrorBitmap |= 0x00000001;
-
- // hard-code default value when no proper E2PROM installed
- pAd->bAutoTxAgcA = FALSE;
- pAd->bAutoTxAgcG = FALSE;
-
- // Default the channel power
- for (i = 0; i < MAX_NUM_OF_CHANNELS; i++)
- pAd->TxPower[i].Power = DEFAULT_RF_TX_POWER;
-
- // Default the channel power
- for (i = 0; i < MAX_NUM_OF_11JCHANNELS; i++)
- pAd->TxPower11J[i].Power = DEFAULT_RF_TX_POWER;
-
- for(i = 0; i < NUM_EEPROM_BBP_PARMS; i++)
- pAd->EEPROMDefaultValue[i] = 0xffff;
- return; */
- }
- /* Read BBP default value from EEPROM and store to array(EEPROMDefaultValue) in pAd */
- RT28xx_EEPROM_READ16(pAd, EEPROM_NIC1_OFFSET, value);
- pAd->EEPROMDefaultValue[0] = value;
-
- RT28xx_EEPROM_READ16(pAd, EEPROM_NIC2_OFFSET, value);
- pAd->EEPROMDefaultValue[1] = value;
-
- RT28xx_EEPROM_READ16(pAd, 0x38, value); /* Country Region */
- pAd->EEPROMDefaultValue[2] = value;
-
- for (i = 0; i < 8; i++) {
- RT28xx_EEPROM_READ16(pAd, EEPROM_BBP_BASE_OFFSET + i * 2,
- value);
- pAd->EEPROMDefaultValue[i + 3] = value;
- }
-
- /* We have to parse NIC configuration 0 at here. */
- /* If TSSI did not have preloaded value, it should reset the TxAutoAgc to false */
- /* Therefore, we have to read TxAutoAgc control beforehand. */
- /* Read Tx AGC control bit */
- Antenna.word = pAd->EEPROMDefaultValue[0];
- if (Antenna.word == 0xFFFF) {
-#ifdef RT30xx
- if (IS_RT3090(pAd) || IS_RT3390(pAd)) {
- Antenna.word = 0;
- Antenna.field.RfIcType = RFIC_3020;
- Antenna.field.TxPath = 1;
- Antenna.field.RxPath = 1;
- } else
-#endif /* RT30xx // */
- {
-
- Antenna.word = 0;
- Antenna.field.RfIcType = RFIC_2820;
- Antenna.field.TxPath = 1;
- Antenna.field.RxPath = 2;
- DBGPRINT(RT_DEBUG_WARN,
- ("E2PROM error, hard code as 0x%04x\n",
- Antenna.word));
- }
- }
- /* Choose the desired Tx&Rx stream. */
- if ((pAd->CommonCfg.TxStream == 0)
- || (pAd->CommonCfg.TxStream > Antenna.field.TxPath))
- pAd->CommonCfg.TxStream = Antenna.field.TxPath;
-
- if ((pAd->CommonCfg.RxStream == 0)
- || (pAd->CommonCfg.RxStream > Antenna.field.RxPath)) {
- pAd->CommonCfg.RxStream = Antenna.field.RxPath;
-
- if ((pAd->MACVersion < RALINK_2883_VERSION) &&
- (pAd->CommonCfg.RxStream > 2)) {
- /* only 2 Rx streams for RT2860 series */
- pAd->CommonCfg.RxStream = 2;
- }
- }
- /* 3*3 */
- /* read value from EEPROM and set them to CSR174 ~ 177 in chain0 ~ chain2 */
- /* yet implement */
- for (i = 0; i < 3; i++) {
- }
-
- NicConfig2.word = pAd->EEPROMDefaultValue[1];
-
- {
- if ((NicConfig2.word & 0x00ff) == 0xff) {
- NicConfig2.word &= 0xff00;
- }
-
- if ((NicConfig2.word >> 8) == 0xff) {
- NicConfig2.word &= 0x00ff;
- }
- }
-
- if (NicConfig2.field.DynamicTxAgcControl == 1)
- pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;
- else
- pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;
-
- DBGPRINT_RAW(RT_DEBUG_TRACE,
- ("NICReadEEPROMParameters: RxPath = %d, TxPath = %d\n",
- Antenna.field.RxPath, Antenna.field.TxPath));
-
- /* Save the antenna for future use */
- pAd->Antenna.word = Antenna.word;
-
- /* Set the RfICType here, then we can initialize RFIC related operation callbacks */
- pAd->Mlme.RealRxPath = (u8)Antenna.field.RxPath;
- pAd->RfIcType = (u8)Antenna.field.RfIcType;
-
-#ifdef RTMP_RF_RW_SUPPORT
- RtmpChipOpsRFHook(pAd);
-#endif /* RTMP_RF_RW_SUPPORT // */
-
-#ifdef RTMP_MAC_PCI
- sprintf((char *)pAd->nickname, "RT2860STA");
-#endif /* RTMP_MAC_PCI // */
-
- /* */
- /* Reset PhyMode if we don't support 802.11a */
- /* Only RFIC_2850 & RFIC_2750 support 802.11a */
- /* */
- if ((Antenna.field.RfIcType != RFIC_2850)
- && (Antenna.field.RfIcType != RFIC_2750)
- && (Antenna.field.RfIcType != RFIC_3052)) {
- if ((pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) ||
- (pAd->CommonCfg.PhyMode == PHY_11A))
- pAd->CommonCfg.PhyMode = PHY_11BG_MIXED;
- else if ((pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) ||
- (pAd->CommonCfg.PhyMode == PHY_11AN_MIXED) ||
- (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED) ||
- (pAd->CommonCfg.PhyMode == PHY_11N_5G))
- pAd->CommonCfg.PhyMode = PHY_11BGN_MIXED;
- }
- /* Read TSSI reference and TSSI boundary for temperature compensation. This is ugly */
- /* 0. 11b/g */
- {
- /* these are tempature reference value (0x00 ~ 0xFE)
- ex: 0x00 0x15 0x25 0x45 0x88 0xA0 0xB5 0xD0 0xF0
- TssiPlusBoundaryG [4] [3] [2] [1] [0] (smaller) +
- TssiMinusBoundaryG[0] [1] [2] [3] [4] (larger) */
- RT28xx_EEPROM_READ16(pAd, 0x6E, Power.word);
- pAd->TssiMinusBoundaryG[4] = Power.field.Byte0;
- pAd->TssiMinusBoundaryG[3] = Power.field.Byte1;
- RT28xx_EEPROM_READ16(pAd, 0x70, Power.word);
- pAd->TssiMinusBoundaryG[2] = Power.field.Byte0;
- pAd->TssiMinusBoundaryG[1] = Power.field.Byte1;
- RT28xx_EEPROM_READ16(pAd, 0x72, Power.word);
- pAd->TssiRefG = Power.field.Byte0; /* reference value [0] */
- pAd->TssiPlusBoundaryG[1] = Power.field.Byte1;
- RT28xx_EEPROM_READ16(pAd, 0x74, Power.word);
- pAd->TssiPlusBoundaryG[2] = Power.field.Byte0;
- pAd->TssiPlusBoundaryG[3] = Power.field.Byte1;
- RT28xx_EEPROM_READ16(pAd, 0x76, Power.word);
- pAd->TssiPlusBoundaryG[4] = Power.field.Byte0;
- pAd->TxAgcStepG = Power.field.Byte1;
- pAd->TxAgcCompensateG = 0;
- pAd->TssiMinusBoundaryG[0] = pAd->TssiRefG;
- pAd->TssiPlusBoundaryG[0] = pAd->TssiRefG;
-
- /* Disable TxAgc if the based value is not right */
- if (pAd->TssiRefG == 0xff)
- pAd->bAutoTxAgcG = FALSE;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("E2PROM: G Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n",
- pAd->TssiMinusBoundaryG[4],
- pAd->TssiMinusBoundaryG[3],
- pAd->TssiMinusBoundaryG[2],
- pAd->TssiMinusBoundaryG[1], pAd->TssiRefG,
- pAd->TssiPlusBoundaryG[1], pAd->TssiPlusBoundaryG[2],
- pAd->TssiPlusBoundaryG[3], pAd->TssiPlusBoundaryG[4],
- pAd->TxAgcStepG, pAd->bAutoTxAgcG));
- }
- /* 1. 11a */
- {
- RT28xx_EEPROM_READ16(pAd, 0xD4, Power.word);
- pAd->TssiMinusBoundaryA[4] = Power.field.Byte0;
- pAd->TssiMinusBoundaryA[3] = Power.field.Byte1;
- RT28xx_EEPROM_READ16(pAd, 0xD6, Power.word);
- pAd->TssiMinusBoundaryA[2] = Power.field.Byte0;
- pAd->TssiMinusBoundaryA[1] = Power.field.Byte1;
- RT28xx_EEPROM_READ16(pAd, 0xD8, Power.word);
- pAd->TssiRefA = Power.field.Byte0;
- pAd->TssiPlusBoundaryA[1] = Power.field.Byte1;
- RT28xx_EEPROM_READ16(pAd, 0xDA, Power.word);
- pAd->TssiPlusBoundaryA[2] = Power.field.Byte0;
- pAd->TssiPlusBoundaryA[3] = Power.field.Byte1;
- RT28xx_EEPROM_READ16(pAd, 0xDC, Power.word);
- pAd->TssiPlusBoundaryA[4] = Power.field.Byte0;
- pAd->TxAgcStepA = Power.field.Byte1;
- pAd->TxAgcCompensateA = 0;
- pAd->TssiMinusBoundaryA[0] = pAd->TssiRefA;
- pAd->TssiPlusBoundaryA[0] = pAd->TssiRefA;
-
- /* Disable TxAgc if the based value is not right */
- if (pAd->TssiRefA == 0xff)
- pAd->bAutoTxAgcA = FALSE;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("E2PROM: A Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n",
- pAd->TssiMinusBoundaryA[4],
- pAd->TssiMinusBoundaryA[3],
- pAd->TssiMinusBoundaryA[2],
- pAd->TssiMinusBoundaryA[1], pAd->TssiRefA,
- pAd->TssiPlusBoundaryA[1], pAd->TssiPlusBoundaryA[2],
- pAd->TssiPlusBoundaryA[3], pAd->TssiPlusBoundaryA[4],
- pAd->TxAgcStepA, pAd->bAutoTxAgcA));
- }
- pAd->BbpRssiToDbmDelta = 0x0;
-
- /* Read frequency offset setting for RF */
- RT28xx_EEPROM_READ16(pAd, EEPROM_FREQ_OFFSET, value);
- if ((value & 0x00FF) != 0x00FF)
- pAd->RfFreqOffset = (unsigned long)(value & 0x00FF);
- else
- pAd->RfFreqOffset = 0;
- DBGPRINT(RT_DEBUG_TRACE,
- ("E2PROM: RF FreqOffset=0x%lx \n", pAd->RfFreqOffset));
-
- /*CountryRegion byte offset (38h) */
- value = pAd->EEPROMDefaultValue[2] >> 8; /* 2.4G band */
- value2 = pAd->EEPROMDefaultValue[2] & 0x00FF; /* 5G band */
-
- if ((value <= REGION_MAXIMUM_BG_BAND)
- && (value2 <= REGION_MAXIMUM_A_BAND)) {
- pAd->CommonCfg.CountryRegion = ((u8)value) | 0x80;
- pAd->CommonCfg.CountryRegionForABand = ((u8)value2) | 0x80;
- TmpPhy = pAd->CommonCfg.PhyMode;
- pAd->CommonCfg.PhyMode = 0xff;
- RTMPSetPhyMode(pAd, TmpPhy);
- SetCommonHT(pAd);
- }
- /* */
- /* Get RSSI Offset on EEPROM 0x9Ah & 0x9Ch. */
- /* The valid value are (-10 ~ 10) */
- /* */
- RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET, value);
- pAd->BGRssiOffset0 = value & 0x00ff;
- pAd->BGRssiOffset1 = (value >> 8);
- RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET + 2, value);
- pAd->BGRssiOffset2 = value & 0x00ff;
- pAd->ALNAGain1 = (value >> 8);
- RT28xx_EEPROM_READ16(pAd, EEPROM_LNA_OFFSET, value);
- pAd->BLNAGain = value & 0x00ff;
- pAd->ALNAGain0 = (value >> 8);
-
- /* Validate 11b/g RSSI_0 offset. */
- if ((pAd->BGRssiOffset0 < -10) || (pAd->BGRssiOffset0 > 10))
- pAd->BGRssiOffset0 = 0;
-
- /* Validate 11b/g RSSI_1 offset. */
- if ((pAd->BGRssiOffset1 < -10) || (pAd->BGRssiOffset1 > 10))
- pAd->BGRssiOffset1 = 0;
-
- /* Validate 11b/g RSSI_2 offset. */
- if ((pAd->BGRssiOffset2 < -10) || (pAd->BGRssiOffset2 > 10))
- pAd->BGRssiOffset2 = 0;
-
- RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_A_OFFSET, value);
- pAd->ARssiOffset0 = value & 0x00ff;
- pAd->ARssiOffset1 = (value >> 8);
- RT28xx_EEPROM_READ16(pAd, (EEPROM_RSSI_A_OFFSET + 2), value);
- pAd->ARssiOffset2 = value & 0x00ff;
- pAd->ALNAGain2 = (value >> 8);
-
- if (((u8)pAd->ALNAGain1 == 0xFF) || (pAd->ALNAGain1 == 0x00))
- pAd->ALNAGain1 = pAd->ALNAGain0;
- if (((u8)pAd->ALNAGain2 == 0xFF) || (pAd->ALNAGain2 == 0x00))
- pAd->ALNAGain2 = pAd->ALNAGain0;
-
- /* Validate 11a RSSI_0 offset. */
- if ((pAd->ARssiOffset0 < -10) || (pAd->ARssiOffset0 > 10))
- pAd->ARssiOffset0 = 0;
-
- /* Validate 11a RSSI_1 offset. */
- if ((pAd->ARssiOffset1 < -10) || (pAd->ARssiOffset1 > 10))
- pAd->ARssiOffset1 = 0;
-
- /*Validate 11a RSSI_2 offset. */
- if ((pAd->ARssiOffset2 < -10) || (pAd->ARssiOffset2 > 10))
- pAd->ARssiOffset2 = 0;
-
-#ifdef RT30xx
- /* */
- /* Get TX mixer gain setting */
- /* 0xff are invalid value */
- /* Note: RT30xX default value is 0x00 and will program to RF_R17 only when this value is not zero. */
- /* RT359X default value is 0x02 */
- /* */
- if (IS_RT30xx(pAd) || IS_RT3572(pAd)) {
- RT28xx_EEPROM_READ16(pAd, EEPROM_TXMIXER_GAIN_2_4G, value);
- pAd->TxMixerGain24G = 0;
- value &= 0x00ff;
- if (value != 0xff) {
- value &= 0x07;
- pAd->TxMixerGain24G = (u8)value;
- }
- }
-#endif /* RT30xx // */
-
- /* */
- /* Get LED Setting. */
- /* */
- RT28xx_EEPROM_READ16(pAd, 0x3a, value);
- pAd->LedCntl.word = (value >> 8);
- RT28xx_EEPROM_READ16(pAd, EEPROM_LED1_OFFSET, value);
- pAd->Led1 = value;
- RT28xx_EEPROM_READ16(pAd, EEPROM_LED2_OFFSET, value);
- pAd->Led2 = value;
- RT28xx_EEPROM_READ16(pAd, EEPROM_LED3_OFFSET, value);
- pAd->Led3 = value;
-
- RTMPReadTxPwrPerRate(pAd);
-
-#ifdef RT30xx
-#ifdef RTMP_EFUSE_SUPPORT
- RtmpEfuseSupportCheck(pAd);
-#endif /* RTMP_EFUSE_SUPPORT // */
-#endif /* RT30xx // */
-
- DBGPRINT(RT_DEBUG_TRACE, ("<-- NICReadEEPROMParameters\n"));
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Set default value from EEPROM
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void NICInitAsicFromEEPROM(struct rt_rtmp_adapter *pAd)
-{
- u32 data = 0;
- u8 BBPR1 = 0;
- u16 i;
-/* EEPROM_ANTENNA_STRUC Antenna; */
- EEPROM_NIC_CONFIG2_STRUC NicConfig2;
- u8 BBPR3 = 0;
-
- DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitAsicFromEEPROM\n"));
- for (i = 3; i < NUM_EEPROM_BBP_PARMS; i++) {
- u8 BbpRegIdx, BbpValue;
-
- if ((pAd->EEPROMDefaultValue[i] != 0xFFFF)
- && (pAd->EEPROMDefaultValue[i] != 0)) {
- BbpRegIdx = (u8)(pAd->EEPROMDefaultValue[i] >> 8);
- BbpValue = (u8)(pAd->EEPROMDefaultValue[i] & 0xff);
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BbpRegIdx, BbpValue);
- }
- }
-
- NicConfig2.word = pAd->EEPROMDefaultValue[1];
-
- {
- if ((NicConfig2.word & 0x00ff) == 0xff) {
- NicConfig2.word &= 0xff00;
- }
-
- if ((NicConfig2.word >> 8) == 0xff) {
- NicConfig2.word &= 0x00ff;
- }
- }
-
- /* Save the antenna for future use */
- pAd->NicConfig2.word = NicConfig2.word;
-
-#ifdef RT30xx
- /* set default antenna as main */
- if (pAd->RfIcType == RFIC_3020)
- AsicSetRxAnt(pAd, pAd->RxAnt.Pair1PrimaryRxAnt);
-#endif /* RT30xx // */
-
- /* */
- /* Send LED Setting to MCU. */
- /* */
- if (pAd->LedCntl.word == 0xFF) {
- pAd->LedCntl.word = 0x01;
- pAd->Led1 = 0x5555;
- pAd->Led2 = 0x2221;
-
-#ifdef RTMP_MAC_PCI
- pAd->Led3 = 0xA9F8;
-#endif /* RTMP_MAC_PCI // */
-#ifdef RTMP_MAC_USB
- pAd->Led3 = 0x5627;
-#endif /* RTMP_MAC_USB // */
- }
-
- AsicSendCommandToMcu(pAd, 0x52, 0xff, (u8)pAd->Led1,
- (u8)(pAd->Led1 >> 8));
- AsicSendCommandToMcu(pAd, 0x53, 0xff, (u8)pAd->Led2,
- (u8)(pAd->Led2 >> 8));
- AsicSendCommandToMcu(pAd, 0x54, 0xff, (u8)pAd->Led3,
- (u8)(pAd->Led3 >> 8));
- AsicSendCommandToMcu(pAd, 0x51, 0xff, 0, pAd->LedCntl.field.Polarity);
-
- pAd->LedIndicatorStrength = 0xFF;
- RTMPSetSignalLED(pAd, -100); /* Force signal strength Led to be turned off, before link up */
-
- {
- /* Read Hardware controlled Radio state enable bit */
- if (NicConfig2.field.HardwareRadioControl == 1) {
- pAd->StaCfg.bHardwareRadio = TRUE;
-
- /* Read GPIO pin2 as Hardware controlled radio state */
- RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &data);
- if ((data & 0x04) == 0) {
- pAd->StaCfg.bHwRadio = FALSE;
- pAd->StaCfg.bRadio = FALSE;
-/* RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x00001818); */
- RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
- }
- } else
- pAd->StaCfg.bHardwareRadio = FALSE;
-
- if (pAd->StaCfg.bRadio == FALSE) {
- RTMPSetLED(pAd, LED_RADIO_OFF);
- } else {
- RTMPSetLED(pAd, LED_RADIO_ON);
-#ifdef RTMP_MAC_PCI
-#ifdef RT3090
- AsicSendCommandToMcu(pAd, 0x30, PowerRadioOffCID, 0xff,
- 0x02);
- AsicCheckCommanOk(pAd, PowerRadioOffCID);
-#endif /* RT3090 // */
-#ifndef RT3090
- AsicSendCommandToMcu(pAd, 0x30, 0xff, 0xff, 0x02);
-#endif /* RT3090 // */
- AsicSendCommandToMcu(pAd, 0x31, PowerWakeCID, 0x00,
- 0x00);
- /* 2-1. wait command ok. */
- AsicCheckCommanOk(pAd, PowerWakeCID);
-#endif /* RTMP_MAC_PCI // */
- }
- }
-
-#ifdef RTMP_MAC_PCI
-#ifdef RT30xx
- if (IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) {
- struct rt_rtmp_chip_op *pChipOps = &pAd->chipOps;
- if (pChipOps->AsicReverseRfFromSleepMode)
- pChipOps->AsicReverseRfFromSleepMode(pAd);
- }
- /* 3090 MCU Wakeup command needs more time to be stable. */
- /* Before stable, don't issue other MCU command to prevent from firmware error. */
-
- if ((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))
- && IS_VERSION_AFTER_F(pAd)
- && (pAd->StaCfg.PSControl.field.rt30xxPowerMode == 3)
- && (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE)) {
- DBGPRINT(RT_DEBUG_TRACE, ("%s, release Mcu Lock\n", __func__));
- RTMP_SEM_LOCK(&pAd->McuCmdLock);
- pAd->brt30xxBanMcuCmd = FALSE;
- RTMP_SEM_UNLOCK(&pAd->McuCmdLock);
- }
-#endif /* RT30xx // */
-#endif /* RTMP_MAC_PCI // */
-
- /* Turn off patching for cardbus controller */
- if (NicConfig2.field.CardbusAcceleration == 1) {
-/* pAd->bTest1 = TRUE; */
- }
-
- if (NicConfig2.field.DynamicTxAgcControl == 1)
- pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE;
- else
- pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE;
- /* */
- /* Since BBP has been progamed, to make sure BBP setting will be */
- /* upate inside of AsicAntennaSelect, so reset to UNKNOWN_BAND! */
- /* */
- pAd->CommonCfg.BandState = UNKNOWN_BAND;
-
- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3);
- BBPR3 &= (~0x18);
- if (pAd->Antenna.field.RxPath == 3) {
- BBPR3 |= (0x10);
- } else if (pAd->Antenna.field.RxPath == 2) {
- BBPR3 |= (0x8);
- } else if (pAd->Antenna.field.RxPath == 1) {
- BBPR3 |= (0x0);
- }
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3);
-
- {
- /* Handle the difference when 1T */
- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BBPR1);
- if (pAd->Antenna.field.TxPath == 1) {
- BBPR1 &= (~0x18);
- }
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BBPR1);
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("Use Hw Radio Control Pin=%d; if used Pin=%d;\n",
- pAd->CommonCfg.bHardwareRadio,
- pAd->CommonCfg.bHardwareRadio));
- }
-
-#ifdef RTMP_MAC_USB
-#ifdef RT30xx
- /* update registers from EEPROM for RT3071 or later(3572/3592). */
-
- if (IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) {
- u8 RegIdx, RegValue;
- u16 value;
-
- /* after RT3071, write BBP from EEPROM 0xF0 to 0x102 */
- for (i = 0xF0; i <= 0x102; i = i + 2) {
- value = 0xFFFF;
- RT28xx_EEPROM_READ16(pAd, i, value);
- if ((value != 0xFFFF) && (value != 0)) {
- RegIdx = (u8)(value >> 8);
- RegValue = (u8)(value & 0xff);
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, RegIdx,
- RegValue);
- DBGPRINT(RT_DEBUG_TRACE,
- ("Update BBP Registers from EEPROM(0x%0x), BBP(0x%x) = 0x%x\n",
- i, RegIdx, RegValue));
- }
- }
-
- /* after RT3071, write RF from EEPROM 0x104 to 0x116 */
- for (i = 0x104; i <= 0x116; i = i + 2) {
- value = 0xFFFF;
- RT28xx_EEPROM_READ16(pAd, i, value);
- if ((value != 0xFFFF) && (value != 0)) {
- RegIdx = (u8)(value >> 8);
- RegValue = (u8)(value & 0xff);
- RT30xxWriteRFRegister(pAd, RegIdx, RegValue);
- DBGPRINT(RT_DEBUG_TRACE,
- ("Update RF Registers from EEPROM0x%x), BBP(0x%x) = 0x%x\n",
- i, RegIdx, RegValue));
- }
- }
- }
-#endif /* RT30xx // */
-#endif /* RTMP_MAC_USB // */
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("TxPath = %d, RxPath = %d, RFIC=%d, Polar+LED mode=%x\n",
- pAd->Antenna.field.TxPath, pAd->Antenna.field.RxPath,
- pAd->RfIcType, pAd->LedCntl.word));
- DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitAsicFromEEPROM\n"));
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Initialize NIC hardware
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
-
- Note:
-
- ========================================================================
-*/
-int NICInitializeAdapter(struct rt_rtmp_adapter *pAd, IN BOOLEAN bHardReset)
-{
- int Status = NDIS_STATUS_SUCCESS;
- WPDMA_GLO_CFG_STRUC GloCfg;
-#ifdef RTMP_MAC_PCI
- u32 Value;
- DELAY_INT_CFG_STRUC IntCfg;
-#endif /* RTMP_MAC_PCI // */
-/* INT_MASK_CSR_STRUC IntMask; */
- unsigned long i = 0, j = 0;
- AC_TXOP_CSR0_STRUC csr0;
-
- DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitializeAdapter\n"));
-
- /* 3. Set DMA global configuration except TX_DMA_EN and RX_DMA_EN bits: */
-retry:
- i = 0;
- do {
- RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
- if ((GloCfg.field.TxDMABusy == 0)
- && (GloCfg.field.RxDMABusy == 0))
- break;
-
- RTMPusecDelay(1000);
- i++;
- } while (i < 100);
- DBGPRINT(RT_DEBUG_TRACE,
- ("<== DMA offset 0x208 = 0x%x\n", GloCfg.word));
- GloCfg.word &= 0xff0;
- GloCfg.field.EnTXWriteBackDDONE = 1;
- RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);
-
- /* Record HW Beacon offset */
- pAd->BeaconOffset[0] = HW_BEACON_BASE0;
- pAd->BeaconOffset[1] = HW_BEACON_BASE1;
- pAd->BeaconOffset[2] = HW_BEACON_BASE2;
- pAd->BeaconOffset[3] = HW_BEACON_BASE3;
- pAd->BeaconOffset[4] = HW_BEACON_BASE4;
- pAd->BeaconOffset[5] = HW_BEACON_BASE5;
- pAd->BeaconOffset[6] = HW_BEACON_BASE6;
- pAd->BeaconOffset[7] = HW_BEACON_BASE7;
-
- /* */
- /* write all shared Ring's base address into ASIC */
- /* */
-
- /* asic simulation sequence put this ahead before loading firmware. */
- /* pbf hardware reset */
-#ifdef RTMP_MAC_PCI
- RTMP_IO_WRITE32(pAd, WPDMA_RST_IDX, 0x1003f); /* 0x10000 for reset rx, 0x3f resets all 6 tx rings. */
- RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0xe1f);
- RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0xe00);
-#endif /* RTMP_MAC_PCI // */
-
- /* Initialze ASIC for TX & Rx operation */
- if (NICInitializeAsic(pAd, bHardReset) != NDIS_STATUS_SUCCESS) {
- if (j++ == 0) {
- NICLoadFirmware(pAd);
- goto retry;
- }
- return NDIS_STATUS_FAILURE;
- }
-
-#ifdef RTMP_MAC_PCI
- /* Write AC_BK base address register */
- Value =
- RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_BK].Cell[0].AllocPa);
- RTMP_IO_WRITE32(pAd, TX_BASE_PTR1, Value);
- DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR1 : 0x%x\n", Value));
-
- /* Write AC_BE base address register */
- Value =
- RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_BE].Cell[0].AllocPa);
- RTMP_IO_WRITE32(pAd, TX_BASE_PTR0, Value);
- DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR0 : 0x%x\n", Value));
-
- /* Write AC_VI base address register */
- Value =
- RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_VI].Cell[0].AllocPa);
- RTMP_IO_WRITE32(pAd, TX_BASE_PTR2, Value);
- DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR2 : 0x%x\n", Value));
-
- /* Write AC_VO base address register */
- Value =
- RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_VO].Cell[0].AllocPa);
- RTMP_IO_WRITE32(pAd, TX_BASE_PTR3, Value);
- DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR3 : 0x%x\n", Value));
-
- /* Write MGMT_BASE_CSR register */
- Value = RTMP_GetPhysicalAddressLow(pAd->MgmtRing.Cell[0].AllocPa);
- RTMP_IO_WRITE32(pAd, TX_BASE_PTR5, Value);
- DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR5 : 0x%x\n", Value));
-
- /* Write RX_BASE_CSR register */
- Value = RTMP_GetPhysicalAddressLow(pAd->RxRing.Cell[0].AllocPa);
- RTMP_IO_WRITE32(pAd, RX_BASE_PTR, Value);
- DBGPRINT(RT_DEBUG_TRACE, ("--> RX_BASE_PTR : 0x%x\n", Value));
-
- /* Init RX Ring index pointer */
- pAd->RxRing.RxSwReadIdx = 0;
- pAd->RxRing.RxCpuIdx = RX_RING_SIZE - 1;
- RTMP_IO_WRITE32(pAd, RX_CRX_IDX, pAd->RxRing.RxCpuIdx);
-
- /* Init TX rings index pointer */
- {
- for (i = 0; i < NUM_OF_TX_RING; i++) {
- pAd->TxRing[i].TxSwFreeIdx = 0;
- pAd->TxRing[i].TxCpuIdx = 0;
- RTMP_IO_WRITE32(pAd, (TX_CTX_IDX0 + i * 0x10),
- pAd->TxRing[i].TxCpuIdx);
- }
- }
-
- /* init MGMT ring index pointer */
- pAd->MgmtRing.TxSwFreeIdx = 0;
- pAd->MgmtRing.TxCpuIdx = 0;
- RTMP_IO_WRITE32(pAd, TX_MGMTCTX_IDX, pAd->MgmtRing.TxCpuIdx);
-
- /* */
- /* set each Ring's SIZE into ASIC. Descriptor Size is fixed by design. */
- /* */
-
- /* Write TX_RING_CSR0 register */
- Value = TX_RING_SIZE;
- RTMP_IO_WRITE32(pAd, TX_MAX_CNT0, Value);
- RTMP_IO_WRITE32(pAd, TX_MAX_CNT1, Value);
- RTMP_IO_WRITE32(pAd, TX_MAX_CNT2, Value);
- RTMP_IO_WRITE32(pAd, TX_MAX_CNT3, Value);
- RTMP_IO_WRITE32(pAd, TX_MAX_CNT4, Value);
- Value = MGMT_RING_SIZE;
- RTMP_IO_WRITE32(pAd, TX_MGMTMAX_CNT, Value);
-
- /* Write RX_RING_CSR register */
- Value = RX_RING_SIZE;
- RTMP_IO_WRITE32(pAd, RX_MAX_CNT, Value);
-#endif /* RTMP_MAC_PCI // */
-
- /* WMM parameter */
- csr0.word = 0;
- RTMP_IO_WRITE32(pAd, WMM_TXOP0_CFG, csr0.word);
- if (pAd->CommonCfg.PhyMode == PHY_11B) {
- csr0.field.Ac0Txop = 192; /* AC_VI: 192*32us ~= 6ms */
- csr0.field.Ac1Txop = 96; /* AC_VO: 96*32us ~= 3ms */
- } else {
- csr0.field.Ac0Txop = 96; /* AC_VI: 96*32us ~= 3ms */
- csr0.field.Ac1Txop = 48; /* AC_VO: 48*32us ~= 1.5ms */
- }
- RTMP_IO_WRITE32(pAd, WMM_TXOP1_CFG, csr0.word);
-
-#ifdef RTMP_MAC_PCI
- /* 3. Set DMA global configuration except TX_DMA_EN and RX_DMA_EN bits: */
- i = 0;
- do {
- RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
- if ((GloCfg.field.TxDMABusy == 0)
- && (GloCfg.field.RxDMABusy == 0))
- break;
-
- RTMPusecDelay(1000);
- i++;
- } while (i < 100);
-
- GloCfg.word &= 0xff0;
- GloCfg.field.EnTXWriteBackDDONE = 1;
- RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word);
-
- IntCfg.word = 0;
- RTMP_IO_WRITE32(pAd, DELAY_INT_CFG, IntCfg.word);
-#endif /* RTMP_MAC_PCI // */
-
- /* reset action */
- /* Load firmware */
- /* Status = NICLoadFirmware(pAd); */
-
- DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitializeAdapter\n"));
- return Status;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Initialize ASIC
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
-
- Note:
-
- ========================================================================
-*/
-int NICInitializeAsic(struct rt_rtmp_adapter *pAd, IN BOOLEAN bHardReset)
-{
- unsigned long Index = 0;
- u8 R0 = 0xff;
- u32 MacCsr12 = 0, Counter = 0;
-#ifdef RTMP_MAC_USB
- u32 MacCsr0 = 0;
- int Status;
- u8 Value = 0xff;
-#endif /* RTMP_MAC_USB // */
-#ifdef RT30xx
- u8 bbpreg = 0;
- u8 RFValue = 0;
-#endif /* RT30xx // */
- u16 KeyIdx;
- int i, apidx;
-
- DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitializeAsic\n"));
-
-#ifdef RTMP_MAC_PCI
- RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x3); /* To fix driver disable/enable hang issue when radio off */
- if (bHardReset == TRUE) {
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x3);
- } else
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x1);
-
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);
- /* Initialize MAC register to default value */
- for (Index = 0; Index < NUM_MAC_REG_PARMS; Index++) {
- RTMP_IO_WRITE32(pAd, MACRegTable[Index].Register,
- MACRegTable[Index].Value);
- }
-
- {
- for (Index = 0; Index < NUM_STA_MAC_REG_PARMS; Index++) {
- RTMP_IO_WRITE32(pAd, STAMACRegTable[Index].Register,
- STAMACRegTable[Index].Value);
- }
- }
-#endif /* RTMP_MAC_PCI // */
-#ifdef RTMP_MAC_USB
- /* */
- /* Make sure MAC gets ready after NICLoadFirmware(). */
- /* */
- Index = 0;
-
- /*To avoid hang-on issue when interface up in kernel 2.4, */
- /*we use a local variable "MacCsr0" instead of using "pAd->MACVersion" directly. */
- do {
- RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0);
-
- if ((MacCsr0 != 0x00) && (MacCsr0 != 0xFFFFFFFF))
- break;
-
- RTMPusecDelay(10);
- } while (Index++ < 100);
-
- pAd->MACVersion = MacCsr0;
- DBGPRINT(RT_DEBUG_TRACE,
- ("MAC_CSR0 [ Ver:Rev=0x%08x]\n", pAd->MACVersion));
- /* turn on bit13 (set to zero) after rt2860D. This is to solve high-current issue. */
- RTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MacCsr12);
- MacCsr12 &= (~0x2000);
- RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, MacCsr12);
-
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x3);
- RTMP_IO_WRITE32(pAd, USB_DMA_CFG, 0x0);
- Status = RTUSBVenderReset(pAd);
-
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);
-
- /* Initialize MAC register to default value */
- for (Index = 0; Index < NUM_MAC_REG_PARMS; Index++) {
-#ifdef RT30xx
- if ((MACRegTable[Index].Register == TX_SW_CFG0)
- && (IS_RT3070(pAd) || IS_RT3071(pAd) || IS_RT3572(pAd)
- || IS_RT3090(pAd) || IS_RT3390(pAd))) {
- MACRegTable[Index].Value = 0x00000400;
- }
-#endif /* RT30xx // */
- RTMP_IO_WRITE32(pAd, (u16)MACRegTable[Index].Register,
- MACRegTable[Index].Value);
- }
-
- {
- for (Index = 0; Index < NUM_STA_MAC_REG_PARMS; Index++) {
- RTMP_IO_WRITE32(pAd,
- (u16)STAMACRegTable[Index].Register,
- STAMACRegTable[Index].Value);
- }
- }
-#endif /* RTMP_MAC_USB // */
-
-#ifdef RT30xx
- /* Initialize RT3070 serial MAC registers which is different from RT2870 serial */
- if (IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) {
- RTMP_IO_WRITE32(pAd, TX_SW_CFG1, 0);
-
- /* RT3071 version E has fixed this issue */
- if ((pAd->MACVersion & 0xffff) < 0x0211) {
- if (pAd->NicConfig2.field.DACTestBit == 1) {
- RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x2C); /* To fix throughput drop drastically */
- } else {
- RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x0F); /* To fix throughput drop drastically */
- }
- } else {
- RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x0);
- }
- } else if (IS_RT3070(pAd)) {
- if (((pAd->MACVersion & 0xffff) < 0x0201)) {
- RTMP_IO_WRITE32(pAd, TX_SW_CFG1, 0);
- RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x2C); /* To fix throughput drop drastically */
- } else {
- RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0);
- }
- }
-#endif /* RT30xx // */
-
- /* */
- /* Before program BBP, we need to wait BBP/RF get wake up. */
- /* */
- Index = 0;
- do {
- RTMP_IO_READ32(pAd, MAC_STATUS_CFG, &MacCsr12);
-
- if ((MacCsr12 & 0x03) == 0) /* if BB.RF is stable */
- break;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("Check MAC_STATUS_CFG = Busy = %x\n", MacCsr12));
- RTMPusecDelay(1000);
- } while (Index++ < 100);
-
- /* The commands to firmware should be after these commands, these commands will init firmware */
- /* PCI and USB are not the same because PCI driver needs to wait for PCI bus ready */
- RTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, 0); /* initialize BBP R/W access agent */
- RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CSR, 0);
-#ifdef RT3090
- /*2008/11/28:KH add to fix the dead rf frequency offset bug<-- */
- AsicSendCommandToMcu(pAd, 0x72, 0, 0, 0);
- /*2008/11/28:KH add to fix the dead rf frequency offset bug--> */
-#endif /* RT3090 // */
- RTMPusecDelay(1000);
-
- /* Read BBP register, make sure BBP is up and running before write new data */
- Index = 0;
- do {
- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R0, &R0);
- DBGPRINT(RT_DEBUG_TRACE, ("BBP version = %x\n", R0));
- } while ((++Index < 20) && ((R0 == 0xff) || (R0 == 0x00)));
- /*ASSERT(Index < 20); //this will cause BSOD on Check-build driver */
-
- if ((R0 == 0xff) || (R0 == 0x00))
- return NDIS_STATUS_FAILURE;
-
- /* Initialize BBP register to default value */
- for (Index = 0; Index < NUM_BBP_REG_PARMS; Index++) {
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBPRegTable[Index].Register,
- BBPRegTable[Index].Value);
- }
-
-#ifdef RTMP_MAC_PCI
- /* TODO: shiang, check MACVersion, currently, rbus-based chip use this. */
- if (pAd->MACVersion == 0x28720200) {
- /*u8 value; */
- unsigned long value2;
-
- /*disable MLD by Bruce 20080704 */
- /*BBP_IO_READ8_BY_REG_ID(pAd, BBP_R105, &value); */
- /*BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R105, value | 4); */
-
- /*Maximum PSDU length from 16K to 32K bytes */
- RTMP_IO_READ32(pAd, MAX_LEN_CFG, &value2);
- value2 &= ~(0x3 << 12);
- value2 |= (0x2 << 12);
- RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, value2);
- }
-#endif /* RTMP_MAC_PCI // */
-
- /* for rt2860E and after, init BBP_R84 with 0x19. This is for extension channel overlapping IOT. */
- /* RT3090 should not program BBP R84 to 0x19, otherwise TX will block. */
- /*3070/71/72,3090,3090A( are included in RT30xx),3572,3390 */
- if (((pAd->MACVersion & 0xffff) != 0x0101)
- && !(IS_RT30xx(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)))
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R84, 0x19);
-
-#ifdef RT30xx
-/* add by johnli, RF power sequence setup */
- if (IS_RT30xx(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) { /*update for RT3070/71/72/90/91/92,3572,3390. */
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R79, 0x13);
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R80, 0x05);
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R81, 0x33);
- }
-
- if (IS_RT3090(pAd) || IS_RT3390(pAd)) /* RT309x, RT3071/72 */
- {
- /* enable DC filter */
- if ((pAd->MACVersion & 0xffff) >= 0x0211) {
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R103, 0xc0);
- }
- /* improve power consumption */
- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R138, &bbpreg);
- if (pAd->Antenna.field.TxPath == 1) {
- /* turn off tx DAC_1 */
- bbpreg = (bbpreg | 0x20);
- }
-
- if (pAd->Antenna.field.RxPath == 1) {
- /* turn off tx ADC_1 */
- bbpreg &= (~0x2);
- }
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R138, bbpreg);
-
- /* improve power consumption in RT3071 Ver.E */
- if ((pAd->MACVersion & 0xffff) >= 0x0211) {
- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R31, &bbpreg);
- bbpreg &= (~0x3);
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R31, bbpreg);
- }
- } else if (IS_RT3070(pAd)) {
- if ((pAd->MACVersion & 0xffff) >= 0x0201) {
- /* enable DC filter */
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R103, 0xc0);
-
- /* improve power consumption in RT3070 Ver.F */
- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R31, &bbpreg);
- bbpreg &= (~0x3);
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R31, bbpreg);
- }
- /* TX_LO1_en, RF R17 register Bit 3 to 0 */
- RT30xxReadRFRegister(pAd, RF_R17, &RFValue);
- RFValue &= (~0x08);
- /* to fix rx long range issue */
- if (pAd->NicConfig2.field.ExternalLNAForG == 0) {
- RFValue |= 0x20;
- }
- /* set RF_R17_bit[2:0] equal to EEPROM setting at 0x48h */
- if (pAd->TxMixerGain24G >= 1) {
- RFValue &= (~0x7); /* clean bit [2:0] */
- RFValue |= pAd->TxMixerGain24G;
- }
- RT30xxWriteRFRegister(pAd, RF_R17, RFValue);
- }
-/* end johnli */
-#endif /* RT30xx // */
-
- if (pAd->MACVersion == 0x28600100) {
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x12);
- }
-
- if (pAd->MACVersion >= RALINK_2880E_VERSION && pAd->MACVersion < RALINK_3070_VERSION) /* 3*3 */
- {
- /* enlarge MAX_LEN_CFG */
- u32 csr;
- RTMP_IO_READ32(pAd, MAX_LEN_CFG, &csr);
- csr &= 0xFFF;
- csr |= 0x2000;
- RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, csr);
- }
-#ifdef RTMP_MAC_USB
- {
- u8 MAC_Value[] =
- { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0 };
-
- /*Initialize WCID table */
- Value = 0xff;
- for (Index = 0; Index < 254; Index++) {
- RTUSBMultiWrite(pAd,
- (u16)(MAC_WCID_BASE + Index * 8),
- MAC_Value, 8);
- }
- }
-#endif /* RTMP_MAC_USB // */
-
- /* Add radio off control */
- {
- if (pAd->StaCfg.bRadio == FALSE) {
-/* RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x00001818); */
- RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
- DBGPRINT(RT_DEBUG_TRACE, ("Set Radio Off\n"));
- }
- }
-
- /* Clear raw counters */
- RTMP_IO_READ32(pAd, RX_STA_CNT0, &Counter);
- RTMP_IO_READ32(pAd, RX_STA_CNT1, &Counter);
- RTMP_IO_READ32(pAd, RX_STA_CNT2, &Counter);
- RTMP_IO_READ32(pAd, TX_STA_CNT0, &Counter);
- RTMP_IO_READ32(pAd, TX_STA_CNT1, &Counter);
- RTMP_IO_READ32(pAd, TX_STA_CNT2, &Counter);
-
- /* ASIC will keep garbage value after boot */
- /* Clear all shared key table when initial */
- /* This routine can be ignored in radio-ON/OFF operation. */
- if (bHardReset) {
- for (KeyIdx = 0; KeyIdx < 4; KeyIdx++) {
- RTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE + 4 * KeyIdx,
- 0);
- }
-
- /* Clear all pairwise key table when initial */
- for (KeyIdx = 0; KeyIdx < 256; KeyIdx++) {
- RTMP_IO_WRITE32(pAd,
- MAC_WCID_ATTRIBUTE_BASE +
- (KeyIdx * HW_WCID_ATTRI_SIZE), 1);
- }
- }
- /* assert HOST ready bit */
-/* RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x0); // 2004-09-14 asked by Mark */
-/* RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x4); */
-
- /* It isn't necessary to clear this space when not hard reset. */
- if (bHardReset == TRUE) {
- /* clear all on-chip BEACON frame space */
- for (apidx = 0; apidx < HW_BEACON_MAX_COUNT; apidx++) {
- for (i = 0; i < HW_BEACON_OFFSET >> 2; i += 4)
- RTMP_IO_WRITE32(pAd,
- pAd->BeaconOffset[apidx] + i,
- 0x00);
- }
- }
-#ifdef RTMP_MAC_USB
- AsicDisableSync(pAd);
- /* Clear raw counters */
- RTMP_IO_READ32(pAd, RX_STA_CNT0, &Counter);
- RTMP_IO_READ32(pAd, RX_STA_CNT1, &Counter);
- RTMP_IO_READ32(pAd, RX_STA_CNT2, &Counter);
- RTMP_IO_READ32(pAd, TX_STA_CNT0, &Counter);
- RTMP_IO_READ32(pAd, TX_STA_CNT1, &Counter);
- RTMP_IO_READ32(pAd, TX_STA_CNT2, &Counter);
- /* Default PCI clock cycle per ms is different as default setting, which is based on PCI. */
- RTMP_IO_READ32(pAd, USB_CYC_CFG, &Counter);
- Counter &= 0xffffff00;
- Counter |= 0x000001e;
- RTMP_IO_WRITE32(pAd, USB_CYC_CFG, Counter);
-#endif /* RTMP_MAC_USB // */
-
- {
- /* for rt2860E and after, init TXOP_CTRL_CFG with 0x583f. This is for extension channel overlapping IOT. */
- if ((pAd->MACVersion & 0xffff) != 0x0101)
- RTMP_IO_WRITE32(pAd, TXOP_CTRL_CFG, 0x583f);
- }
-
- DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitializeAsic\n"));
- return NDIS_STATUS_SUCCESS;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Reset NIC Asics
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
-
- Note:
- Reset NIC to initial state AS IS system boot up time.
-
- ========================================================================
-*/
-void NICIssueReset(struct rt_rtmp_adapter *pAd)
-{
- u32 Value = 0;
- DBGPRINT(RT_DEBUG_TRACE, ("--> NICIssueReset\n"));
-
- /* Abort Tx, prevent ASIC from writing to Host memory */
- /*RTMP_IO_WRITE32(pAd, TX_CNTL_CSR, 0x001f0000); */
-
- /* Disable Rx, register value supposed will remain after reset */
- RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
- Value &= (0xfffffff3);
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
-
- /* Issue reset and clear from reset state */
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x03); /* 2004-09-17 change from 0x01 */
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x00);
-
- DBGPRINT(RT_DEBUG_TRACE, ("<-- NICIssueReset\n"));
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Check ASIC registers and find any reason the system might hang
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = DISPATCH_LEVEL
-
- ========================================================================
-*/
-BOOLEAN NICCheckForHang(struct rt_rtmp_adapter *pAd)
-{
- return (FALSE);
-}
-
-void NICUpdateFifoStaCounters(struct rt_rtmp_adapter *pAd)
-{
- TX_STA_FIFO_STRUC StaFifo;
- struct rt_mac_table_entry *pEntry;
- u8 i = 0;
- u8 pid = 0, wcid = 0;
- char reTry;
- u8 succMCS;
-
- do {
- RTMP_IO_READ32(pAd, TX_STA_FIFO, &StaFifo.word);
-
- if (StaFifo.field.bValid == 0)
- break;
-
- wcid = (u8)StaFifo.field.wcid;
-
- /* ignore NoACK and MGMT frame use 0xFF as WCID */
- if ((StaFifo.field.TxAckRequired == 0)
- || (wcid >= MAX_LEN_OF_MAC_TABLE)) {
- i++;
- continue;
- }
-
- /* PID store Tx MCS Rate */
- pid = (u8)StaFifo.field.PidType;
-
- pEntry = &pAd->MacTab.Content[wcid];
-
- pEntry->DebugFIFOCount++;
-
- if (StaFifo.field.TxBF) /* 3*3 */
- pEntry->TxBFCount++;
-
- if (!StaFifo.field.TxSuccess) {
- pEntry->FIFOCount++;
- pEntry->OneSecTxFailCount++;
-
- if (pEntry->FIFOCount >= 1) {
- DBGPRINT(RT_DEBUG_TRACE, ("#"));
- pEntry->NoBADataCountDown = 64;
-
- if (pEntry->PsMode == PWR_ACTIVE) {
- int tid;
- for (tid = 0; tid < NUM_OF_TID; tid++) {
- BAOriSessionTearDown(pAd,
- pEntry->
- Aid, tid,
- FALSE,
- FALSE);
- }
-
- /* Update the continuous transmission counter except PS mode */
- pEntry->ContinueTxFailCnt++;
- } else {
- /* Clear the FIFOCount when sta in Power Save mode. Basically we assume */
- /* this tx error happened due to sta just go to sleep. */
- pEntry->FIFOCount = 0;
- pEntry->ContinueTxFailCnt = 0;
- }
- /*pEntry->FIFOCount = 0; */
- }
- /*pEntry->bSendBAR = TRUE; */
- } else {
- if ((pEntry->PsMode != PWR_SAVE)
- && (pEntry->NoBADataCountDown > 0)) {
- pEntry->NoBADataCountDown--;
- if (pEntry->NoBADataCountDown == 0) {
- DBGPRINT(RT_DEBUG_TRACE, ("@\n"));
- }
- }
-
- pEntry->FIFOCount = 0;
- pEntry->OneSecTxNoRetryOkCount++;
- /* update NoDataIdleCount when successful send packet to STA. */
- pEntry->NoDataIdleCount = 0;
- pEntry->ContinueTxFailCnt = 0;
- }
-
- succMCS = StaFifo.field.SuccessRate & 0x7F;
-
- reTry = pid - succMCS;
-
- if (StaFifo.field.TxSuccess) {
- pEntry->TXMCSExpected[pid]++;
- if (pid == succMCS) {
- pEntry->TXMCSSuccessful[pid]++;
- } else {
- pEntry->TXMCSAutoFallBack[pid][succMCS]++;
- }
- } else {
- pEntry->TXMCSFailed[pid]++;
- }
-
- if (reTry > 0) {
- if ((pid >= 12) && succMCS <= 7) {
- reTry -= 4;
- }
- pEntry->OneSecTxRetryOkCount += reTry;
- }
-
- i++;
- /* ASIC store 16 stack */
- } while (i < (2 * TX_RING_SIZE));
-
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Read statistical counters from hardware registers and record them
- in software variables for later on query
-
- Arguments:
- pAd Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = DISPATCH_LEVEL
-
- ========================================================================
-*/
-void NICUpdateRawCounters(struct rt_rtmp_adapter *pAd)
-{
- u32 OldValue; /*, Value2; */
- /*unsigned long PageSum, OneSecTransmitCount; */
- /*unsigned long TxErrorRatio, Retry, Fail; */
- RX_STA_CNT0_STRUC RxStaCnt0;
- RX_STA_CNT1_STRUC RxStaCnt1;
- RX_STA_CNT2_STRUC RxStaCnt2;
- TX_STA_CNT0_STRUC TxStaCnt0;
- TX_STA_CNT1_STRUC StaTx1;
- TX_STA_CNT2_STRUC StaTx2;
- TX_AGG_CNT_STRUC TxAggCnt;
- TX_AGG_CNT0_STRUC TxAggCnt0;
- TX_AGG_CNT1_STRUC TxAggCnt1;
- TX_AGG_CNT2_STRUC TxAggCnt2;
- TX_AGG_CNT3_STRUC TxAggCnt3;
- TX_AGG_CNT4_STRUC TxAggCnt4;
- TX_AGG_CNT5_STRUC TxAggCnt5;
- TX_AGG_CNT6_STRUC TxAggCnt6;
- TX_AGG_CNT7_STRUC TxAggCnt7;
- struct rt_counter_ralink *pRalinkCounters;
-
- pRalinkCounters = &pAd->RalinkCounters;
-
- RTMP_IO_READ32(pAd, RX_STA_CNT0, &RxStaCnt0.word);
- RTMP_IO_READ32(pAd, RX_STA_CNT2, &RxStaCnt2.word);
-
- {
- RTMP_IO_READ32(pAd, RX_STA_CNT1, &RxStaCnt1.word);
- /* Update RX PLCP error counter */
- pAd->PrivateInfo.PhyRxErrCnt += RxStaCnt1.field.PlcpErr;
- /* Update False CCA counter */
- pAd->RalinkCounters.OneSecFalseCCACnt +=
- RxStaCnt1.field.FalseCca;
- }
-
- /* Update FCS counters */
- OldValue = pAd->WlanCounters.FCSErrorCount.u.LowPart;
- pAd->WlanCounters.FCSErrorCount.u.LowPart += (RxStaCnt0.field.CrcErr); /* >> 7); */
- if (pAd->WlanCounters.FCSErrorCount.u.LowPart < OldValue)
- pAd->WlanCounters.FCSErrorCount.u.HighPart++;
-
- /* Add FCS error count to private counters */
- pRalinkCounters->OneSecRxFcsErrCnt += RxStaCnt0.field.CrcErr;
- OldValue = pRalinkCounters->RealFcsErrCount.u.LowPart;
- pRalinkCounters->RealFcsErrCount.u.LowPart += RxStaCnt0.field.CrcErr;
- if (pRalinkCounters->RealFcsErrCount.u.LowPart < OldValue)
- pRalinkCounters->RealFcsErrCount.u.HighPart++;
-
- /* Update Duplicate Rcv check */
- pRalinkCounters->DuplicateRcv += RxStaCnt2.field.RxDupliCount;
- pAd->WlanCounters.FrameDuplicateCount.u.LowPart +=
- RxStaCnt2.field.RxDupliCount;
- /* Update RX Overflow counter */
- pAd->Counters8023.RxNoBuffer += (RxStaCnt2.field.RxFifoOverflowCount);
-
- /*pAd->RalinkCounters.RxCount = 0; */
-#ifdef RTMP_MAC_USB
- if (pRalinkCounters->RxCount != pAd->watchDogRxCnt) {
- pAd->watchDogRxCnt = pRalinkCounters->RxCount;
- pAd->watchDogRxOverFlowCnt = 0;
- } else {
- if (RxStaCnt2.field.RxFifoOverflowCount)
- pAd->watchDogRxOverFlowCnt++;
- else
- pAd->watchDogRxOverFlowCnt = 0;
- }
-#endif /* RTMP_MAC_USB // */
-
- /*if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED) || */
- /* (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED) && (pAd->MacTab.Size != 1))) */
- if (!pAd->bUpdateBcnCntDone) {
- /* Update BEACON sent count */
- RTMP_IO_READ32(pAd, TX_STA_CNT0, &TxStaCnt0.word);
- RTMP_IO_READ32(pAd, TX_STA_CNT1, &StaTx1.word);
- RTMP_IO_READ32(pAd, TX_STA_CNT2, &StaTx2.word);
- pRalinkCounters->OneSecBeaconSentCnt +=
- TxStaCnt0.field.TxBeaconCount;
- pRalinkCounters->OneSecTxRetryOkCount +=
- StaTx1.field.TxRetransmit;
- pRalinkCounters->OneSecTxNoRetryOkCount +=
- StaTx1.field.TxSuccess;
- pRalinkCounters->OneSecTxFailCount +=
- TxStaCnt0.field.TxFailCount;
- pAd->WlanCounters.TransmittedFragmentCount.u.LowPart +=
- StaTx1.field.TxSuccess;
- pAd->WlanCounters.RetryCount.u.LowPart +=
- StaTx1.field.TxRetransmit;
- pAd->WlanCounters.FailedCount.u.LowPart +=
- TxStaCnt0.field.TxFailCount;
- }
-
- /*if (pAd->bStaFifoTest == TRUE) */
- {
- RTMP_IO_READ32(pAd, TX_AGG_CNT, &TxAggCnt.word);
- RTMP_IO_READ32(pAd, TX_AGG_CNT0, &TxAggCnt0.word);
- RTMP_IO_READ32(pAd, TX_AGG_CNT1, &TxAggCnt1.word);
- RTMP_IO_READ32(pAd, TX_AGG_CNT2, &TxAggCnt2.word);
- RTMP_IO_READ32(pAd, TX_AGG_CNT3, &TxAggCnt3.word);
- RTMP_IO_READ32(pAd, TX_AGG_CNT4, &TxAggCnt4.word);
- RTMP_IO_READ32(pAd, TX_AGG_CNT5, &TxAggCnt5.word);
- RTMP_IO_READ32(pAd, TX_AGG_CNT6, &TxAggCnt6.word);
- RTMP_IO_READ32(pAd, TX_AGG_CNT7, &TxAggCnt7.word);
- pRalinkCounters->TxAggCount += TxAggCnt.field.AggTxCount;
- pRalinkCounters->TxNonAggCount += TxAggCnt.field.NonAggTxCount;
- pRalinkCounters->TxAgg1MPDUCount +=
- TxAggCnt0.field.AggSize1Count;
- pRalinkCounters->TxAgg2MPDUCount +=
- TxAggCnt0.field.AggSize2Count;
-
- pRalinkCounters->TxAgg3MPDUCount +=
- TxAggCnt1.field.AggSize3Count;
- pRalinkCounters->TxAgg4MPDUCount +=
- TxAggCnt1.field.AggSize4Count;
- pRalinkCounters->TxAgg5MPDUCount +=
- TxAggCnt2.field.AggSize5Count;
- pRalinkCounters->TxAgg6MPDUCount +=
- TxAggCnt2.field.AggSize6Count;
-
- pRalinkCounters->TxAgg7MPDUCount +=
- TxAggCnt3.field.AggSize7Count;
- pRalinkCounters->TxAgg8MPDUCount +=
- TxAggCnt3.field.AggSize8Count;
- pRalinkCounters->TxAgg9MPDUCount +=
- TxAggCnt4.field.AggSize9Count;
- pRalinkCounters->TxAgg10MPDUCount +=
- TxAggCnt4.field.AggSize10Count;
-
- pRalinkCounters->TxAgg11MPDUCount +=
- TxAggCnt5.field.AggSize11Count;
- pRalinkCounters->TxAgg12MPDUCount +=
- TxAggCnt5.field.AggSize12Count;
- pRalinkCounters->TxAgg13MPDUCount +=
- TxAggCnt6.field.AggSize13Count;
- pRalinkCounters->TxAgg14MPDUCount +=
- TxAggCnt6.field.AggSize14Count;
-
- pRalinkCounters->TxAgg15MPDUCount +=
- TxAggCnt7.field.AggSize15Count;
- pRalinkCounters->TxAgg16MPDUCount +=
- TxAggCnt7.field.AggSize16Count;
-
- /* Calculate the transmitted A-MPDU count */
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- TxAggCnt0.field.AggSize1Count;
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt0.field.AggSize2Count / 2);
-
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt1.field.AggSize3Count / 3);
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt1.field.AggSize4Count / 4);
-
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt2.field.AggSize5Count / 5);
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt2.field.AggSize6Count / 6);
-
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt3.field.AggSize7Count / 7);
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt3.field.AggSize8Count / 8);
-
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt4.field.AggSize9Count / 9);
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt4.field.AggSize10Count / 10);
-
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt5.field.AggSize11Count / 11);
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt5.field.AggSize12Count / 12);
-
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt6.field.AggSize13Count / 13);
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt6.field.AggSize14Count / 14);
-
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt7.field.AggSize15Count / 15);
- pRalinkCounters->TransmittedAMPDUCount.u.LowPart +=
- (TxAggCnt7.field.AggSize16Count / 16);
- }
-
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Reset NIC from error
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
-
- Note:
- Reset NIC from error state
-
- ========================================================================
-*/
-void NICResetFromError(struct rt_rtmp_adapter *pAd)
-{
- /* Reset BBP (according to alex, reset ASIC will force reset BBP */
- /* Therefore, skip the reset BBP */
- /* RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x2); */
-
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x1);
- /* Remove ASIC from reset state */
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0);
-
- NICInitializeAdapter(pAd, FALSE);
- NICInitAsicFromEEPROM(pAd);
-
- /* Switch to current channel, since during reset process, the connection should remains on. */
- AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
- AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
-}
-
-int NICLoadFirmware(struct rt_rtmp_adapter *pAd)
-{
- int status = NDIS_STATUS_SUCCESS;
- if (pAd->chipOps.loadFirmware)
- status = pAd->chipOps.loadFirmware(pAd);
-
- return status;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- erase 8051 firmware image in MAC ASIC
-
- Arguments:
- Adapter Pointer to our adapter
-
- IRQL = PASSIVE_LEVEL
-
- ========================================================================
-*/
-void NICEraseFirmware(struct rt_rtmp_adapter *pAd)
-{
- if (pAd->chipOps.eraseFirmware)
- pAd->chipOps.eraseFirmware(pAd);
-
-} /* End of NICEraseFirmware */
-
-/*
- ========================================================================
-
- Routine Description:
- Load Tx rate switching parameters
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- NDIS_STATUS_SUCCESS firmware image load ok
- NDIS_STATUS_FAILURE image not found
-
- IRQL = PASSIVE_LEVEL
-
- Rate Table Format:
- 1. (B0: Valid Item number) (B1:Initial item from zero)
- 2. Item Number(Dec) Mode(Hex) Current MCS(Dec) TrainUp(Dec) TrainDown(Dec)
-
- ========================================================================
-*/
-int NICLoadRateSwitchingParams(struct rt_rtmp_adapter *pAd)
-{
- return NDIS_STATUS_SUCCESS;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Compare two memory block
-
- Arguments:
- pSrc1 Pointer to first memory address
- pSrc2 Pointer to second memory address
-
- Return Value:
- 0: memory is equal
- 1: pSrc1 memory is larger
- 2: pSrc2 memory is larger
-
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-unsigned long RTMPCompareMemory(void *pSrc1, void *pSrc2, unsigned long Length)
-{
- u8 *pMem1;
- u8 *pMem2;
- unsigned long Index = 0;
-
- pMem1 = (u8 *)pSrc1;
- pMem2 = (u8 *)pSrc2;
-
- for (Index = 0; Index < Length; Index++) {
- if (pMem1[Index] > pMem2[Index])
- return (1);
- else if (pMem1[Index] < pMem2[Index])
- return (2);
- }
-
- /* Equal */
- return (0);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Zero out memory block
-
- Arguments:
- pSrc1 Pointer to memory address
- Length Size
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPZeroMemory(void *pSrc, unsigned long Length)
-{
- u8 *pMem;
- unsigned long Index = 0;
-
- pMem = (u8 *)pSrc;
-
- for (Index = 0; Index < Length; Index++) {
- pMem[Index] = 0x00;
- }
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Copy data from memory block 1 to memory block 2
-
- Arguments:
- pDest Pointer to destination memory address
- pSrc Pointer to source memory address
- Length Copy size
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPMoveMemory(void *pDest, void *pSrc, unsigned long Length)
-{
- u8 *pMem1;
- u8 *pMem2;
- u32 Index;
-
- ASSERT((Length == 0) || (pDest && pSrc));
-
- pMem1 = (u8 *)pDest;
- pMem2 = (u8 *)pSrc;
-
- for (Index = 0; Index < Length; Index++) {
- pMem1[Index] = pMem2[Index];
- }
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Initialize port configuration structure
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void UserCfgInit(struct rt_rtmp_adapter *pAd)
-{
- u32 key_index, bss_index;
-
- DBGPRINT(RT_DEBUG_TRACE, ("--> UserCfgInit\n"));
-
- /* */
- /* part I. initialize common configuration */
- /* */
-#ifdef RTMP_MAC_USB
- pAd->BulkOutReq = 0;
-
- pAd->BulkOutComplete = 0;
- pAd->BulkOutCompleteOther = 0;
- pAd->BulkOutCompleteCancel = 0;
- pAd->BulkInReq = 0;
- pAd->BulkInComplete = 0;
- pAd->BulkInCompleteFail = 0;
-
- /*pAd->QuickTimerP = 100; */
- /*pAd->TurnAggrBulkInCount = 0; */
- pAd->bUsbTxBulkAggre = 0;
-
- /* init as unused value to ensure driver will set to MCU once. */
- pAd->LedIndicatorStrength = 0xFF;
-
- pAd->CommonCfg.MaxPktOneTxBulk = 2;
- pAd->CommonCfg.TxBulkFactor = 1;
- pAd->CommonCfg.RxBulkFactor = 1;
-
- pAd->CommonCfg.TxPower = 100; /*mW */
-
- NdisZeroMemory(&pAd->CommonCfg.IOTestParm,
- sizeof(pAd->CommonCfg.IOTestParm));
-#endif /* RTMP_MAC_USB // */
-
- for (key_index = 0; key_index < SHARE_KEY_NUM; key_index++) {
- for (bss_index = 0; bss_index < MAX_MBSSID_NUM; bss_index++) {
- pAd->SharedKey[bss_index][key_index].KeyLen = 0;
- pAd->SharedKey[bss_index][key_index].CipherAlg =
- CIPHER_NONE;
- }
- }
-
- pAd->EepromAccess = FALSE;
-
- pAd->Antenna.word = 0;
- pAd->CommonCfg.BBPCurrentBW = BW_20;
-
- pAd->LedCntl.word = 0;
-#ifdef RTMP_MAC_PCI
- pAd->LedIndicatorStrength = 0;
- pAd->RLnkCtrlOffset = 0;
- pAd->HostLnkCtrlOffset = 0;
- pAd->StaCfg.PSControl.field.EnableNewPS = TRUE;
- pAd->CheckDmaBusyCount = 0;
-#endif /* RTMP_MAC_PCI // */
-
- pAd->bAutoTxAgcA = FALSE; /* Default is OFF */
- pAd->bAutoTxAgcG = FALSE; /* Default is OFF */
- pAd->RfIcType = RFIC_2820;
-
- /* Init timer for reset complete event */
- pAd->CommonCfg.CentralChannel = 1;
- pAd->bForcePrintTX = FALSE;
- pAd->bForcePrintRX = FALSE;
- pAd->bStaFifoTest = FALSE;
- pAd->bProtectionTest = FALSE;
- pAd->CommonCfg.Dsifs = 10; /* in units of usec */
- pAd->CommonCfg.TxPower = 100; /*mW */
- pAd->CommonCfg.TxPowerPercentage = 0xffffffff; /* AUTO */
- pAd->CommonCfg.TxPowerDefault = 0xffffffff; /* AUTO */
- pAd->CommonCfg.TxPreamble = Rt802_11PreambleAuto; /* use Long preamble on TX by defaut */
- pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
- pAd->CommonCfg.RtsThreshold = 2347;
- pAd->CommonCfg.FragmentThreshold = 2346;
- pAd->CommonCfg.UseBGProtection = 0; /* 0: AUTO */
- pAd->CommonCfg.bEnableTxBurst = TRUE; /*0; */
- pAd->CommonCfg.PhyMode = 0xff; /* unknown */
- pAd->CommonCfg.BandState = UNKNOWN_BAND;
- pAd->CommonCfg.RadarDetect.CSPeriod = 10;
- pAd->CommonCfg.RadarDetect.CSCount = 0;
- pAd->CommonCfg.RadarDetect.RDMode = RD_NORMAL_MODE;
-
- pAd->CommonCfg.RadarDetect.ChMovingTime = 65;
- pAd->CommonCfg.RadarDetect.LongPulseRadarTh = 3;
- pAd->CommonCfg.bAPSDCapable = FALSE;
- pAd->CommonCfg.bNeedSendTriggerFrame = FALSE;
- pAd->CommonCfg.TriggerTimerCount = 0;
- pAd->CommonCfg.bAPSDForcePowerSave = FALSE;
- pAd->CommonCfg.bCountryFlag = FALSE;
- pAd->CommonCfg.TxStream = 0;
- pAd->CommonCfg.RxStream = 0;
-
- NdisZeroMemory(&pAd->BeaconTxWI, sizeof(pAd->BeaconTxWI));
-
- NdisZeroMemory(&pAd->CommonCfg.HtCapability,
- sizeof(pAd->CommonCfg.HtCapability));
- pAd->HTCEnable = FALSE;
- pAd->bBroadComHT = FALSE;
- pAd->CommonCfg.bRdg = FALSE;
-
- NdisZeroMemory(&pAd->CommonCfg.AddHTInfo,
- sizeof(pAd->CommonCfg.AddHTInfo));
- pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
- pAd->CommonCfg.BACapability.field.MpduDensity = 0;
- pAd->CommonCfg.BACapability.field.Policy = IMMED_BA;
- pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64; /*32; */
- pAd->CommonCfg.BACapability.field.TxBAWinLimit = 64; /*32; */
- DBGPRINT(RT_DEBUG_TRACE,
- ("--> UserCfgInit. BACapability = 0x%x\n",
- pAd->CommonCfg.BACapability.word));
-
- pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
- BATableInit(pAd, &pAd->BATable);
-
- pAd->CommonCfg.bExtChannelSwitchAnnouncement = 1;
- pAd->CommonCfg.bHTProtect = 1;
- pAd->CommonCfg.bMIMOPSEnable = TRUE;
- /*2008/11/05:KH add to support Antenna power-saving of AP<-- */
- pAd->CommonCfg.bGreenAPEnable = FALSE;
- /*2008/11/05:KH add to support Antenna power-saving of AP--> */
- pAd->CommonCfg.bBADecline = FALSE;
- pAd->CommonCfg.bDisableReordering = FALSE;
-
- if (pAd->MACVersion == 0x28720200) {
- pAd->CommonCfg.TxBASize = 13; /*by Jerry recommend */
- } else {
- pAd->CommonCfg.TxBASize = 7;
- }
-
- pAd->CommonCfg.REGBACapability.word = pAd->CommonCfg.BACapability.word;
-
- /*pAd->CommonCfg.HTPhyMode.field.BW = BW_20; */
- /*pAd->CommonCfg.HTPhyMode.field.MCS = MCS_AUTO; */
- /*pAd->CommonCfg.HTPhyMode.field.ShortGI = GI_800; */
- /*pAd->CommonCfg.HTPhyMode.field.STBC = STBC_NONE; */
- pAd->CommonCfg.TxRate = RATE_6;
-
- pAd->CommonCfg.MlmeTransmit.field.MCS = MCS_RATE_6;
- pAd->CommonCfg.MlmeTransmit.field.BW = BW_20;
- pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;
-
- pAd->CommonCfg.BeaconPeriod = 100; /* in mSec */
-
- /* */
- /* part II. initialize STA specific configuration */
- /* */
- {
- RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_DIRECT);
- RX_FILTER_CLEAR_FLAG(pAd, fRX_FILTER_ACCEPT_MULTICAST);
- RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_BROADCAST);
- RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_ALL_MULTICAST);
-
- pAd->StaCfg.Psm = PWR_ACTIVE;
-
- pAd->StaCfg.OrigWepStatus = Ndis802_11EncryptionDisabled;
- pAd->StaCfg.PairCipher = Ndis802_11EncryptionDisabled;
- pAd->StaCfg.GroupCipher = Ndis802_11EncryptionDisabled;
- pAd->StaCfg.bMixCipher = FALSE;
- pAd->StaCfg.DefaultKeyId = 0;
-
- /* 802.1x port control */
- pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP;
- pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
- pAd->StaCfg.LastMicErrorTime = 0;
- pAd->StaCfg.MicErrCnt = 0;
- pAd->StaCfg.bBlockAssoc = FALSE;
- pAd->StaCfg.WpaState = SS_NOTUSE;
-
- pAd->CommonCfg.NdisRadioStateOff = FALSE; /* New to support microsoft disable radio with OID command */
-
- pAd->StaCfg.RssiTrigger = 0;
- NdisZeroMemory(&pAd->StaCfg.RssiSample, sizeof(struct rt_rssi_sample));
- pAd->StaCfg.RssiTriggerMode =
- RSSI_TRIGGERED_UPON_BELOW_THRESHOLD;
- pAd->StaCfg.AtimWin = 0;
- pAd->StaCfg.DefaultListenCount = 3; /*default listen count; */
- pAd->StaCfg.BssType = BSS_INFRA; /* BSS_INFRA or BSS_ADHOC or BSS_MONITOR */
- pAd->StaCfg.bScanReqIsFromWebUI = FALSE;
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_WAKEUP_NOW);
-
- pAd->StaCfg.bAutoTxRateSwitch = TRUE;
- pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
- }
-
-#ifdef PCIE_PS_SUPPORT
- pAd->brt30xxBanMcuCmd = FALSE;
- pAd->b3090ESpecialChip = FALSE;
-/*KH Debug:the following must be removed */
- pAd->StaCfg.PSControl.field.rt30xxPowerMode = 3;
- pAd->StaCfg.PSControl.field.rt30xxForceASPMTest = 0;
- pAd->StaCfg.PSControl.field.rt30xxFollowHostASPM = 1;
-#endif /* PCIE_PS_SUPPORT // */
-
- /* global variables mXXXX used in MAC protocol state machines */
- OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM);
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON);
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON);
-
- /* PHY specification */
- pAd->CommonCfg.PhyMode = PHY_11BG_MIXED; /* default PHY mode */
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED); /* CCK use long preamble */
-
- {
- /* user desired power mode */
- pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
- pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
- pAd->StaCfg.bWindowsACCAMEnable = FALSE;
-
- RTMPInitTimer(pAd, &pAd->StaCfg.StaQuickResponeForRateUpTimer,
- GET_TIMER_FUNCTION(StaQuickResponeForRateUpExec),
- pAd, FALSE);
- pAd->StaCfg.StaQuickResponeForRateUpTimerRunning = FALSE;
-
- /* Patch for Ndtest */
- pAd->StaCfg.ScanCnt = 0;
-
- pAd->StaCfg.bHwRadio = TRUE; /* Default Hardware Radio status is On */
- pAd->StaCfg.bSwRadio = TRUE; /* Default Software Radio status is On */
- pAd->StaCfg.bRadio = TRUE; /* bHwRadio && bSwRadio */
- pAd->StaCfg.bHardwareRadio = FALSE; /* Default is OFF */
- pAd->StaCfg.bShowHiddenSSID = FALSE; /* Default no show */
-
- /* Nitro mode control */
- pAd->StaCfg.bAutoReconnect = TRUE;
-
- /* Save the init time as last scan time, the system should do scan after 2 seconds. */
- /* This patch is for driver wake up from standby mode, system will do scan right away. */
- NdisGetSystemUpTime(&pAd->StaCfg.LastScanTime);
- if (pAd->StaCfg.LastScanTime > 10 * OS_HZ)
- pAd->StaCfg.LastScanTime -= (10 * OS_HZ);
-
- NdisZeroMemory(pAd->nickname, IW_ESSID_MAX_SIZE + 1);
-#ifdef RTMP_MAC_PCI
- sprintf((char *)pAd->nickname, "RT2860STA");
-#endif /* RTMP_MAC_PCI // */
-#ifdef RTMP_MAC_USB
- sprintf((char *)pAd->nickname, "RT2870STA");
-#endif /* RTMP_MAC_USB // */
- RTMPInitTimer(pAd, &pAd->StaCfg.WpaDisassocAndBlockAssocTimer,
- GET_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc),
- pAd, FALSE);
- pAd->StaCfg.IEEE8021X = FALSE;
- pAd->StaCfg.IEEE8021x_required_keys = FALSE;
- pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_DISABLE;
- pAd->StaCfg.bRSN_IE_FromWpaSupplicant = FALSE;
- pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_ENABLE;
-
- NdisZeroMemory(pAd->StaCfg.ReplayCounter, 8);
-
- pAd->StaCfg.bAutoConnectByBssid = FALSE;
- pAd->StaCfg.BeaconLostTime = BEACON_LOST_TIME;
- NdisZeroMemory(pAd->StaCfg.WpaPassPhrase, 64);
- pAd->StaCfg.WpaPassPhraseLen = 0;
- pAd->StaCfg.bAutoRoaming = FALSE;
- pAd->StaCfg.bForceTxBurst = FALSE;
- }
-
- /* Default for extra information is not valid */
- pAd->ExtraInfo = EXTRA_INFO_CLEAR;
-
- /* Default Config change flag */
- pAd->bConfigChanged = FALSE;
-
- /* */
- /* part III. AP configurations */
- /* */
-
- /* */
- /* part IV. others */
- /* */
- /* dynamic BBP R66:sensibity tuning to overcome background noise */
- pAd->BbpTuning.bEnable = TRUE;
- pAd->BbpTuning.FalseCcaLowerThreshold = 100;
- pAd->BbpTuning.FalseCcaUpperThreshold = 512;
- pAd->BbpTuning.R66Delta = 4;
- pAd->Mlme.bEnableAutoAntennaCheck = TRUE;
-
- /* */
- /* Also initial R66CurrentValue, RTUSBResumeMsduTransmission might use this value. */
- /* if not initial this value, the default value will be 0. */
- /* */
- pAd->BbpTuning.R66CurrentValue = 0x38;
-
- pAd->Bbp94 = BBPR94_DEFAULT;
- pAd->BbpForCCK = FALSE;
-
- /* Default is FALSE for test bit 1 */
- /*pAd->bTest1 = FALSE; */
-
- /* initialize MAC table and allocate spin lock */
- NdisZeroMemory(&pAd->MacTab, sizeof(struct rt_mac_table));
- InitializeQueueHeader(&pAd->MacTab.McastPsQueue);
- NdisAllocateSpinLock(&pAd->MacTabLock);
-
- /*RTMPInitTimer(pAd, &pAd->RECBATimer, RECBATimerTimeout, pAd, TRUE); */
- /*RTMPSetTimer(&pAd->RECBATimer, REORDER_EXEC_INTV); */
-
- pAd->CommonCfg.bWiFiTest = FALSE;
-#ifdef RTMP_MAC_PCI
- pAd->bPCIclkOff = FALSE;
-#endif /* RTMP_MAC_PCI // */
-
- RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
- DBGPRINT(RT_DEBUG_TRACE, ("<-- UserCfgInit\n"));
-}
-
-/* IRQL = PASSIVE_LEVEL */
-/* */
-/* FUNCTION: AtoH(char *, u8 *, int) */
-/* */
-/* PURPOSE: Converts ascii string to network order hex */
-/* */
-/* PARAMETERS: */
-/* src - pointer to input ascii string */
-/* dest - pointer to output hex */
-/* destlen - size of dest */
-/* */
-/* COMMENTS: */
-/* */
-/* 2 ascii bytes make a hex byte so must put 1st ascii byte of pair */
-/* into upper nibble and 2nd ascii byte of pair into lower nibble. */
-/* */
-/* IRQL = PASSIVE_LEVEL */
-
-void AtoH(char *src, u8 *dest, int destlen)
-{
- char *srcptr;
- u8 *destTemp;
-
- srcptr = src;
- destTemp = (u8 *)dest;
-
- while (destlen--) {
- *destTemp = hex_to_bin(*srcptr++) << 4; /* Put 1st ascii byte in upper nibble. */
- *destTemp += hex_to_bin(*srcptr++); /* Add 2nd ascii byte to above. */
- destTemp++;
- }
-}
-
-/*+++Mark by shiang, not use now, need to remove after confirm */
-/*---Mark by shiang, not use now, need to remove after confirm */
-
-/*
- ========================================================================
-
- Routine Description:
- Init timer objects
-
- Arguments:
- pAd Pointer to our adapter
- pTimer Timer structure
- pTimerFunc Function to execute when timer expired
- Repeat Ture for period timer
-
- Return Value:
- None
-
- Note:
-
- ========================================================================
-*/
-void RTMPInitTimer(struct rt_rtmp_adapter *pAd,
- struct rt_ralink_timer *pTimer,
- void *pTimerFunc, void *pData, IN BOOLEAN Repeat)
-{
- /* */
- /* Set Valid to TRUE for later used. */
- /* It will crash if we cancel a timer or set a timer */
- /* that we haven't initialize before. */
- /* */
- pTimer->Valid = TRUE;
-
- pTimer->PeriodicType = Repeat;
- pTimer->State = FALSE;
- pTimer->cookie = (unsigned long)pData;
-
-#ifdef RTMP_TIMER_TASK_SUPPORT
- pTimer->pAd = pAd;
-#endif /* RTMP_TIMER_TASK_SUPPORT // */
-
- RTMP_OS_Init_Timer(pAd, &pTimer->TimerObj, pTimerFunc, (void *)pTimer);
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Init timer objects
-
- Arguments:
- pTimer Timer structure
- Value Timer value in milliseconds
-
- Return Value:
- None
-
- Note:
- To use this routine, must call RTMPInitTimer before.
-
- ========================================================================
-*/
-void RTMPSetTimer(struct rt_ralink_timer *pTimer, unsigned long Value)
-{
- if (pTimer->Valid) {
- pTimer->TimerValue = Value;
- pTimer->State = FALSE;
- if (pTimer->PeriodicType == TRUE) {
- pTimer->Repeat = TRUE;
- RTMP_SetPeriodicTimer(&pTimer->TimerObj, Value);
- } else {
- pTimer->Repeat = FALSE;
- RTMP_OS_Add_Timer(&pTimer->TimerObj, Value);
- }
- } else {
- DBGPRINT_ERR("RTMPSetTimer failed, Timer hasn't been initialize!\n");
- }
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Init timer objects
-
- Arguments:
- pTimer Timer structure
- Value Timer value in milliseconds
-
- Return Value:
- None
-
- Note:
- To use this routine, must call RTMPInitTimer before.
-
- ========================================================================
-*/
-void RTMPModTimer(struct rt_ralink_timer *pTimer, unsigned long Value)
-{
- BOOLEAN Cancel;
-
- if (pTimer->Valid) {
- pTimer->TimerValue = Value;
- pTimer->State = FALSE;
- if (pTimer->PeriodicType == TRUE) {
- RTMPCancelTimer(pTimer, &Cancel);
- RTMPSetTimer(pTimer, Value);
- } else {
- RTMP_OS_Mod_Timer(&pTimer->TimerObj, Value);
- }
- } else {
- DBGPRINT_ERR("RTMPModTimer failed, Timer hasn't been initialize!\n");
- }
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Cancel timer objects
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- Note:
- 1.) To use this routine, must call RTMPInitTimer before.
- 2.) Reset NIC to initial state AS IS system boot up time.
-
- ========================================================================
-*/
-void RTMPCancelTimer(struct rt_ralink_timer *pTimer, OUT BOOLEAN * pCancelled)
-{
- if (pTimer->Valid) {
- if (pTimer->State == FALSE)
- pTimer->Repeat = FALSE;
-
- RTMP_OS_Del_Timer(&pTimer->TimerObj, pCancelled);
-
- if (*pCancelled == TRUE)
- pTimer->State = TRUE;
-
-#ifdef RTMP_TIMER_TASK_SUPPORT
- /* We need to go-through the TimerQ to findout this timer handler and remove it if */
- /* it's still waiting for execution. */
- RtmpTimerQRemove(pTimer->pAd, pTimer);
-#endif /* RTMP_TIMER_TASK_SUPPORT // */
- } else {
- DBGPRINT_ERR("RTMPCancelTimer failed, Timer hasn't been initialize!\n");
- }
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Set LED Status
-
- Arguments:
- pAd Pointer to our adapter
- Status LED Status
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
- IRQL = DISPATCH_LEVEL
-
- Note:
-
- ========================================================================
-*/
-void RTMPSetLED(struct rt_rtmp_adapter *pAd, u8 Status)
-{
- /*unsigned long data; */
- u8 HighByte = 0;
- u8 LowByte;
-
- LowByte = pAd->LedCntl.field.LedMode & 0x7f;
- switch (Status) {
- case LED_LINK_DOWN:
- HighByte = 0x20;
- AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
- pAd->LedIndicatorStrength = 0;
- break;
- case LED_LINK_UP:
- if (pAd->CommonCfg.Channel > 14)
- HighByte = 0xa0;
- else
- HighByte = 0x60;
- AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
- break;
- case LED_RADIO_ON:
- HighByte = 0x20;
- AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
- break;
- case LED_HALT:
- LowByte = 0; /* Driver sets MAC register and MAC controls LED */
- case LED_RADIO_OFF:
- HighByte = 0;
- AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
- break;
- case LED_WPS:
- HighByte = 0x10;
- AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
- break;
- case LED_ON_SITE_SURVEY:
- HighByte = 0x08;
- AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
- break;
- case LED_POWER_UP:
- HighByte = 0x04;
- AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte);
- break;
- default:
- DBGPRINT(RT_DEBUG_WARN,
- ("RTMPSetLED::Unknown Status %d\n", Status));
- break;
- }
-
- /* */
- /* Keep LED status for LED SiteSurvey mode. */
- /* After SiteSurvey, we will set the LED mode to previous status. */
- /* */
- if ((Status != LED_ON_SITE_SURVEY) && (Status != LED_POWER_UP))
- pAd->LedStatus = Status;
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("RTMPSetLED::Mode=%d,HighByte=0x%02x,LowByte=0x%02x\n",
- pAd->LedCntl.field.LedMode, HighByte, LowByte));
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Set LED Signal Strength
-
- Arguments:
- pAd Pointer to our adapter
- Dbm Signal Strength
-
- Return Value:
- None
-
- IRQL = PASSIVE_LEVEL
-
- Note:
- Can be run on any IRQL level.
-
- According to Microsoft Zero Config Wireless Signal Strength definition as belows.
- <= -90 No Signal
- <= -81 Very Low
- <= -71 Low
- <= -67 Good
- <= -57 Very Good
- > -57 Excellent
- ========================================================================
-*/
-void RTMPSetSignalLED(struct rt_rtmp_adapter *pAd, IN NDIS_802_11_RSSI Dbm)
-{
- u8 nLed = 0;
-
- if (pAd->LedCntl.field.LedMode == LED_MODE_SIGNAL_STREGTH) {
- if (Dbm <= -90)
- nLed = 0;
- else if (Dbm <= -81)
- nLed = 1;
- else if (Dbm <= -71)
- nLed = 3;
- else if (Dbm <= -67)
- nLed = 7;
- else if (Dbm <= -57)
- nLed = 15;
- else
- nLed = 31;
-
- /* */
- /* Update Signal Strength to firmware if changed. */
- /* */
- if (pAd->LedIndicatorStrength != nLed) {
- AsicSendCommandToMcu(pAd, 0x51, 0xff, nLed,
- pAd->LedCntl.field.Polarity);
- pAd->LedIndicatorStrength = nLed;
- }
- }
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Enable RX
-
- Arguments:
- pAd Pointer to our adapter
-
- Return Value:
- None
-
- IRQL <= DISPATCH_LEVEL
-
- Note:
- Before Enable RX, make sure you have enabled Interrupt.
- ========================================================================
-*/
-void RTMPEnableRxTx(struct rt_rtmp_adapter *pAd)
-{
-/* WPDMA_GLO_CFG_STRUC GloCfg; */
-/* unsigned long i = 0; */
- u32 rx_filter_flag;
-
- DBGPRINT(RT_DEBUG_TRACE, ("==> RTMPEnableRxTx\n"));
-
- /* Enable Rx DMA. */
- RT28XXDMAEnable(pAd);
-
- /* enable RX of MAC block */
- if (pAd->OpMode == OPMODE_AP) {
- rx_filter_flag = APNORMAL;
-
- RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, rx_filter_flag); /* enable RX of DMA block */
- } else {
- if (pAd->CommonCfg.PSPXlink)
- rx_filter_flag = PSPXLINK;
- else
- rx_filter_flag = STANORMAL; /* Station not drop control frame will fail WiFi Certification. */
- RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, rx_filter_flag);
- }
-
- RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0xc);
- DBGPRINT(RT_DEBUG_TRACE, ("<== RTMPEnableRxTx\n"));
-}
-
-/*+++Add by shiang, move from os/linux/rt_main_dev.c */
-void CfgInitHook(struct rt_rtmp_adapter *pAd)
-{
- pAd->bBroadComHT = TRUE;
-}
-
-int rt28xx_init(struct rt_rtmp_adapter *pAd,
- char *pDefaultMac, char *pHostName)
-{
- u32 index;
- u8 TmpPhy;
- int Status;
- u32 MacCsr0 = 0;
-
-#ifdef RTMP_MAC_PCI
- {
- /* If dirver doesn't wake up firmware here, */
- /* NICLoadFirmware will hang forever when interface is up again. */
- /* RT2860 PCI */
- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) &&
- OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)) {
- AUTO_WAKEUP_STRUC AutoWakeupCfg;
- AsicForceWakeup(pAd, TRUE);
- AutoWakeupCfg.word = 0;
- RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG,
- AutoWakeupCfg.word);
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
- }
- }
-#endif /* RTMP_MAC_PCI // */
-
- /* reset Adapter flags */
- RTMP_CLEAR_FLAGS(pAd);
-
- /* Init BssTab & ChannelInfo tabbles for auto channel select. */
-
- /* Allocate BA Reordering memory */
- ba_reordering_resource_init(pAd, MAX_REORDERING_MPDU_NUM);
-
- /* Make sure MAC gets ready. */
- index = 0;
- do {
- RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0);
- pAd->MACVersion = MacCsr0;
-
- if ((pAd->MACVersion != 0x00)
- && (pAd->MACVersion != 0xFFFFFFFF))
- break;
-
- RTMPusecDelay(10);
- } while (index++ < 100);
- DBGPRINT(RT_DEBUG_TRACE,
- ("MAC_CSR0 [ Ver:Rev=0x%08x]\n", pAd->MACVersion));
-
-#ifdef RTMP_MAC_PCI
-#ifdef PCIE_PS_SUPPORT
- /*Iverson patch PCIE L1 issue to make sure that driver can be read,write ,BBP and RF register at pcie L.1 level */
- if ((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))
- && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)) {
- RTMP_IO_READ32(pAd, AUX_CTRL, &MacCsr0);
- MacCsr0 |= 0x402;
- RTMP_IO_WRITE32(pAd, AUX_CTRL, MacCsr0);
- DBGPRINT(RT_DEBUG_TRACE, ("AUX_CTRL = 0x%x\n", MacCsr0));
- }
-#endif /* PCIE_PS_SUPPORT // */
-
- /* To fix driver disable/enable hang issue when radio off */
- RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x2);
-#endif /* RTMP_MAC_PCI // */
-
- /* Disable DMA */
- RT28XXDMADisable(pAd);
-
- /* Load 8051 firmware */
- Status = NICLoadFirmware(pAd);
- if (Status != NDIS_STATUS_SUCCESS) {
- DBGPRINT_ERR("NICLoadFirmware failed, Status[=0x%08x]\n", Status);
- goto err1;
- }
-
- NICLoadRateSwitchingParams(pAd);
-
- /* Disable interrupts here which is as soon as possible */
- /* This statement should never be true. We might consider to remove it later */
-#ifdef RTMP_MAC_PCI
- if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE)) {
- RTMP_ASIC_INTERRUPT_DISABLE(pAd);
- }
-#endif /* RTMP_MAC_PCI // */
-
- Status = RTMPAllocTxRxRingMemory(pAd);
- if (Status != NDIS_STATUS_SUCCESS) {
- DBGPRINT_ERR("RTMPAllocDMAMemory failed, Status[=0x%08x]\n", Status);
- goto err1;
- }
-
- RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE);
-
- /* initialize MLME */
- /* */
-
- Status = RtmpMgmtTaskInit(pAd);
- if (Status != NDIS_STATUS_SUCCESS)
- goto err2;
-
- Status = MlmeInit(pAd);
- if (Status != NDIS_STATUS_SUCCESS) {
- DBGPRINT_ERR("MlmeInit failed, Status[=0x%08x]\n", Status);
- goto err2;
- }
- /* Initialize pAd->StaCfg, pAd->ApCfg, pAd->CommonCfg to manufacture default */
- /* */
- UserCfgInit(pAd);
- Status = RtmpNetTaskInit(pAd);
- if (Status != NDIS_STATUS_SUCCESS)
- goto err3;
-
-/* COPY_MAC_ADDR(pAd->ApCfg.MBSSID[apidx].Bssid, netif->hwaddr); */
-/* pAd->bForcePrintTX = TRUE; */
-
- CfgInitHook(pAd);
-
- NdisAllocateSpinLock(&pAd->MacTabLock);
-
- MeasureReqTabInit(pAd);
- TpcReqTabInit(pAd);
-
- /* */
- /* Init the hardware, we need to init asic before read registry, otherwise mac register will be reset */
- /* */
- Status = NICInitializeAdapter(pAd, TRUE);
- if (Status != NDIS_STATUS_SUCCESS) {
- DBGPRINT_ERR("NICInitializeAdapter failed, Status[=0x%08x]\n", Status);
- if (Status != NDIS_STATUS_SUCCESS)
- goto err3;
- }
-
- DBGPRINT(RT_DEBUG_OFF, ("1. Phy Mode = %d\n", pAd->CommonCfg.PhyMode));
-
-#ifdef RTMP_MAC_USB
- pAd->CommonCfg.bMultipleIRP = FALSE;
-
- if (pAd->CommonCfg.bMultipleIRP)
- pAd->CommonCfg.NumOfBulkInIRP = RX_RING_SIZE;
- else
- pAd->CommonCfg.NumOfBulkInIRP = 1;
-#endif /* RTMP_MAC_USB // */
-
- /*Init Ba Capability parameters. */
-/* RT28XX_BA_INIT(pAd); */
- pAd->CommonCfg.DesiredHtPhy.MpduDensity =
- (u8)pAd->CommonCfg.BACapability.field.MpduDensity;
- pAd->CommonCfg.DesiredHtPhy.AmsduEnable =
- (u16)pAd->CommonCfg.BACapability.field.AmsduEnable;
- pAd->CommonCfg.DesiredHtPhy.AmsduSize =
- (u16)pAd->CommonCfg.BACapability.field.AmsduSize;
- pAd->CommonCfg.DesiredHtPhy.MimoPs =
- (u16)pAd->CommonCfg.BACapability.field.MMPSmode;
- /* UPdata to HT IE */
- pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs =
- (u16)pAd->CommonCfg.BACapability.field.MMPSmode;
- pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize =
- (u16)pAd->CommonCfg.BACapability.field.AmsduSize;
- pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity =
- (u8)pAd->CommonCfg.BACapability.field.MpduDensity;
-
- /* after reading Registry, we now know if in AP mode or STA mode */
-
- /* Load 8051 firmware; crash when FW image not existent */
- /* Status = NICLoadFirmware(pAd); */
- /* if (Status != NDIS_STATUS_SUCCESS) */
- /* break; */
-
- DBGPRINT(RT_DEBUG_OFF, ("2. Phy Mode = %d\n", pAd->CommonCfg.PhyMode));
-
- /* We should read EEPROM for all cases. rt2860b */
- NICReadEEPROMParameters(pAd, (u8 *)pDefaultMac);
-
- DBGPRINT(RT_DEBUG_OFF, ("3. Phy Mode = %d\n", pAd->CommonCfg.PhyMode));
-
- NICInitAsicFromEEPROM(pAd); /*rt2860b */
-
- /* Set PHY to appropriate mode */
- TmpPhy = pAd->CommonCfg.PhyMode;
- pAd->CommonCfg.PhyMode = 0xff;
- RTMPSetPhyMode(pAd, TmpPhy);
- SetCommonHT(pAd);
-
- /* No valid channels. */
- if (pAd->ChannelListNum == 0) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("Wrong configuration. No valid channel found. Check \"ContryCode\" and \"ChannelGeography\" setting.\n"));
- goto err4;
- }
-
- DBGPRINT(RT_DEBUG_OFF,
- ("MCS Set = %02x %02x %02x %02x %02x\n",
- pAd->CommonCfg.HtCapability.MCSSet[0],
- pAd->CommonCfg.HtCapability.MCSSet[1],
- pAd->CommonCfg.HtCapability.MCSSet[2],
- pAd->CommonCfg.HtCapability.MCSSet[3],
- pAd->CommonCfg.HtCapability.MCSSet[4]));
-
-#ifdef RTMP_RF_RW_SUPPORT
- /*Init RT30xx RFRegisters after read RFIC type from EEPROM */
- NICInitRFRegisters(pAd);
-#endif /* RTMP_RF_RW_SUPPORT // */
-
-/* APInitialize(pAd); */
-
- /* */
- /* Initialize RF register to default value */
- /* */
- AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
- AsicLockChannel(pAd, pAd->CommonCfg.Channel);
-
- /* 8051 firmware require the signal during booting time. */
- /*2008/11/28:KH marked the following codes to patch Frequency offset bug */
- /*AsicSendCommandToMcu(pAd, 0x72, 0xFF, 0x00, 0x00); */
-
- if (pAd && (Status != NDIS_STATUS_SUCCESS)) {
- /* */
- /* Undo everything if it failed */
- /* */
- if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
-/* NdisMDeregisterInterrupt(&pAd->Interrupt); */
- RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE);
- }
-/* RTMPFreeAdapter(pAd); // we will free it in disconnect() */
- } else if (pAd) {
- /* Microsoft HCT require driver send a disconnect event after driver initialization. */
- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);
-/* pAd->IndicateMediaState = NdisMediaStateDisconnected; */
- RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_MEDIA_STATE_CHANGE);
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("NDIS_STATUS_MEDIA_DISCONNECT Event B!\n"));
-
-#ifdef RTMP_MAC_USB
- RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS);
- RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS);
-
- /* */
- /* Support multiple BulkIn IRP, */
- /* the value on pAd->CommonCfg.NumOfBulkInIRP may be large than 1. */
- /* */
- for (index = 0; index < pAd->CommonCfg.NumOfBulkInIRP; index++) {
- RTUSBBulkReceive(pAd);
- DBGPRINT(RT_DEBUG_TRACE, ("RTUSBBulkReceive!\n"));
- }
-#endif /* RTMP_MAC_USB // */
- } /* end of else */
-
- /* Set up the Mac address */
- RtmpOSNetDevAddrSet(pAd->net_dev, &pAd->CurrentAddress[0]);
-
- DBGPRINT_S(Status, ("<==== rt28xx_init, Status=%x\n", Status));
-
- return TRUE;
-
-err4:
-err3:
- MlmeHalt(pAd);
-err2:
- RTMPFreeTxRxRingMemory(pAd);
-err1:
-
- os_free_mem(pAd, pAd->mpdu_blk_pool.mem); /* free BA pool */
-
- /* shall not set priv to NULL here because the priv didn't been free yet. */
- /*net_dev->ml_priv = 0; */
-#ifdef ST
-err0:
-#endif /* ST // */
-
- DBGPRINT(RT_DEBUG_ERROR, ("rt28xx Initialized fail!\n"));
- return FALSE;
-}
-
-/*---Add by shiang, move from os/linux/rt_main_dev.c */
-
-static int RtmpChipOpsRegister(struct rt_rtmp_adapter *pAd, int infType)
-{
- struct rt_rtmp_chip_op *pChipOps = &pAd->chipOps;
- int status;
-
- memset(pChipOps, 0, sizeof(struct rt_rtmp_chip_op));
-
- /* set eeprom related hook functions */
- status = RtmpChipOpsEepromHook(pAd, infType);
-
- /* set mcu related hook functions */
- switch (infType) {
-#ifdef RTMP_PCI_SUPPORT
- case RTMP_DEV_INF_PCI:
- pChipOps->loadFirmware = RtmpAsicLoadFirmware;
- pChipOps->eraseFirmware = RtmpAsicEraseFirmware;
- pChipOps->sendCommandToMcu = RtmpAsicSendCommandToMcu;
- break;
-#endif /* RTMP_PCI_SUPPORT // */
-#ifdef RTMP_USB_SUPPORT
- case RTMP_DEV_INF_USB:
- pChipOps->loadFirmware = RtmpAsicLoadFirmware;
- pChipOps->sendCommandToMcu = RtmpAsicSendCommandToMcu;
- break;
-#endif /* RTMP_USB_SUPPORT // */
- default:
- break;
- }
-
- return status;
-}
-
-int RtmpRaDevCtrlInit(struct rt_rtmp_adapter *pAd, IN RTMP_INF_TYPE infType)
-{
- /*void *handle; */
-
- /* Assign the interface type. We need use it when do register/EEPROM access. */
- pAd->infType = infType;
-
- pAd->OpMode = OPMODE_STA;
- DBGPRINT(RT_DEBUG_TRACE,
- ("STA Driver version-%s\n", STA_DRIVER_VERSION));
-
-#ifdef RTMP_MAC_USB
- sema_init(&(pAd->UsbVendorReq_semaphore), 1);
- os_alloc_mem(pAd, (u8 **) & pAd->UsbVendorReqBuf,
- MAX_PARAM_BUFFER_SIZE - 1);
- if (pAd->UsbVendorReqBuf == NULL) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("Allocate vendor request temp buffer failed!\n"));
- return FALSE;
- }
-#endif /* RTMP_MAC_USB // */
-
- RtmpChipOpsRegister(pAd, infType);
-
- return 0;
-}
-
-BOOLEAN RtmpRaDevCtrlExit(struct rt_rtmp_adapter *pAd)
-{
-
- RTMPFreeAdapter(pAd);
-
- return TRUE;
-}
-
-/* not yet support MBSS */
-struct net_device *get_netdev_from_bssid(struct rt_rtmp_adapter *pAd, u8 FromWhichBSSID)
-{
- struct net_device *dev_p = NULL;
-
- {
- dev_p = pAd->net_dev;
- }
-
- ASSERT(dev_p);
- return dev_p; /* return one of MBSS */
-}
diff --git a/drivers/staging/rt2860/common/rtmp_mcu.c b/drivers/staging/rt2860/common/rtmp_mcu.c
deleted file mode 100644
index 80fa4160ed62..000000000000
--- a/drivers/staging/rt2860/common/rtmp_mcu.c
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-
- Module Name:
- rtmp_mcu.c
-
- Abstract:
- Miniport generic portion header file
-
- Revision History:
- Who When What
- -------- ---------- ----------------------------------------------
-*/
-
-#include "../rt_config.h"
-
-#include <linux/crc-ccitt.h>
-#include <linux/firmware.h>
-
-#ifdef RTMP_MAC_USB
-
-#define FIRMWAREIMAGE_LENGTH 0x1000
-
-#define FIRMWARE_2870_MIN_VERSION 12
-#define FIRMWARE_2870_FILENAME "rt2870.bin"
-MODULE_FIRMWARE(FIRMWARE_2870_FILENAME);
-
-#define FIRMWARE_3070_MIN_VERSION 17
-#define FIRMWARE_3070_FILENAME "rt3070.bin"
-MODULE_FIRMWARE(FIRMWARE_3070_FILENAME);
-
-#define FIRMWARE_3071_MIN_VERSION 17
-#define FIRMWARE_3071_FILENAME "rt3071.bin" /* for RT3071/RT3072 */
-MODULE_FIRMWARE(FIRMWARE_3071_FILENAME);
-
-#else /* RTMP_MAC_PCI */
-
-#define FIRMWAREIMAGE_LENGTH 0x2000
-
-#define FIRMWARE_2860_MIN_VERSION 11
-#define FIRMWARE_2860_FILENAME "rt2860.bin"
-MODULE_FIRMWARE(FIRMWARE_2860_FILENAME);
-
-#define FIRMWARE_3090_MIN_VERSION 19
-#define FIRMWARE_3090_FILENAME "rt3090.bin" /* for RT3090/RT3390 */
-MODULE_FIRMWARE(FIRMWARE_3090_FILENAME);
-
-#endif
-
-/*
- ========================================================================
-
- Routine Description:
- erase 8051 firmware image in MAC ASIC
-
- Arguments:
- Adapter Pointer to our adapter
-
- IRQL = PASSIVE_LEVEL
-
- ========================================================================
-*/
-int RtmpAsicEraseFirmware(struct rt_rtmp_adapter *pAd)
-{
- unsigned long i;
-
- for (i = 0; i < MAX_FIRMWARE_IMAGE_SIZE; i += 4)
- RTMP_IO_WRITE32(pAd, FIRMWARE_IMAGE_BASE + i, 0);
-
- return 0;
-}
-
-static const struct firmware *rtmp_get_firmware(struct rt_rtmp_adapter *adapter)
-{
- const char *name;
- const struct firmware *fw = NULL;
- u8 min_version;
- struct device *dev;
- int err;
-
- if (adapter->firmware)
- return adapter->firmware;
-
-#ifdef RTMP_MAC_USB
- if (IS_RT3071(adapter)) {
- name = FIRMWARE_3071_FILENAME;
- min_version = FIRMWARE_3071_MIN_VERSION;
- } else if (IS_RT3070(adapter)) {
- name = FIRMWARE_3070_FILENAME;
- min_version = FIRMWARE_3070_MIN_VERSION;
- } else {
- name = FIRMWARE_2870_FILENAME;
- min_version = FIRMWARE_2870_MIN_VERSION;
- }
- dev = &((struct os_cookie *)adapter->OS_Cookie)->pUsb_Dev->dev;
-#else /* RTMP_MAC_PCI */
- if (IS_RT3090(adapter) || IS_RT3390(adapter)) {
- name = FIRMWARE_3090_FILENAME;
- min_version = FIRMWARE_3090_MIN_VERSION;
- } else {
- name = FIRMWARE_2860_FILENAME;
- min_version = FIRMWARE_2860_MIN_VERSION;
- }
- dev = &((struct os_cookie *)adapter->OS_Cookie)->pci_dev->dev;
-#endif
-
- err = request_firmware(&fw, name, dev);
- if (err) {
- dev_err(dev, "firmware file %s request failed (%d)\n",
- name, err);
- return NULL;
- }
-
- if (fw->size < FIRMWAREIMAGE_LENGTH) {
- dev_err(dev, "firmware file %s size is invalid\n", name);
- goto invalid;
- }
-
- /* is it new enough? */
- adapter->FirmwareVersion = fw->data[FIRMWAREIMAGE_LENGTH - 3];
- if (adapter->FirmwareVersion < min_version) {
- dev_err(dev,
- "firmware file %s is too old;"
- " driver requires v%d or later\n",
- name, min_version);
- goto invalid;
- }
-
- /* is the internal CRC correct? */
- if (crc_ccitt(0xffff, fw->data, FIRMWAREIMAGE_LENGTH - 2) !=
- (fw->data[FIRMWAREIMAGE_LENGTH - 2] |
- (fw->data[FIRMWAREIMAGE_LENGTH - 1] << 8))) {
- dev_err(dev, "firmware file %s failed internal CRC\n", name);
- goto invalid;
- }
-
- adapter->firmware = fw;
- return fw;
-
-invalid:
- release_firmware(fw);
- return NULL;
-}
-
-/*
- ========================================================================
-
- Routine Description:
- Load 8051 firmware file into MAC ASIC
-
- Arguments:
- Adapter Pointer to our adapter
-
- Return Value:
- NDIS_STATUS_SUCCESS firmware image load ok
- NDIS_STATUS_FAILURE image not found
-
- IRQL = PASSIVE_LEVEL
-
- ========================================================================
-*/
-int RtmpAsicLoadFirmware(struct rt_rtmp_adapter *pAd)
-{
- const struct firmware *fw;
- int Status = NDIS_STATUS_SUCCESS;
- unsigned long Index;
- u32 MacReg = 0;
-
- fw = rtmp_get_firmware(pAd);
- if (!fw)
- return NDIS_STATUS_FAILURE;
-
- RTMP_WRITE_FIRMWARE(pAd, fw->data, FIRMWAREIMAGE_LENGTH);
-
- /* check if MCU is ready */
- Index = 0;
- do {
- RTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MacReg);
-
- if (MacReg & 0x80)
- break;
-
- RTMPusecDelay(1000);
- } while (Index++ < 1000);
-
- if (Index > 1000) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("NICLoadFirmware: MCU is not ready\n"));
- Status = NDIS_STATUS_FAILURE;
- }
-
- DBGPRINT(RT_DEBUG_TRACE, ("<=== %s (status=%d)\n", __func__, Status));
-
- return Status;
-}
-
-int RtmpAsicSendCommandToMcu(struct rt_rtmp_adapter *pAd,
- u8 Command,
- u8 Token, u8 Arg0, u8 Arg1)
-{
- HOST_CMD_CSR_STRUC H2MCmd;
- H2M_MAILBOX_STRUC H2MMailbox;
- unsigned long i = 0;
-
-#ifdef PCIE_PS_SUPPORT
- /* 3090F power solution 3 has hw limitation that needs to ban all mcu command */
- /* when firmware is in radio state. For other chip doesn't have this limitation. */
- if (((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))
- && IS_VERSION_AFTER_F(pAd)) && IS_VERSION_AFTER_F(pAd)
- && (pAd->StaCfg.PSControl.field.rt30xxPowerMode == 3)
- && (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE)) {
- RTMP_SEM_LOCK(&pAd->McuCmdLock);
- if ((pAd->brt30xxBanMcuCmd == TRUE)
- && (Command != WAKE_MCU_CMD) && (Command != RFOFF_MCU_CMD)) {
- RTMP_SEM_UNLOCK(&pAd->McuCmdLock);
- DBGPRINT(RT_DEBUG_TRACE,
- (" Ban Mcu Cmd %x in sleep mode\n", Command));
- return FALSE;
- } else if ((Command == SLEEP_MCU_CMD)
- || (Command == RFOFF_MCU_CMD)) {
- pAd->brt30xxBanMcuCmd = TRUE;
- } else if (Command != WAKE_MCU_CMD) {
- pAd->brt30xxBanMcuCmd = FALSE;
- }
-
- RTMP_SEM_UNLOCK(&pAd->McuCmdLock);
-
- }
- if (((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))
- && IS_VERSION_AFTER_F(pAd)) && IS_VERSION_AFTER_F(pAd)
- && (pAd->StaCfg.PSControl.field.rt30xxPowerMode == 3)
- && (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE)
- && (Command == WAKE_MCU_CMD)) {
-
- do {
- RTMP_IO_FORCE_READ32(pAd, H2M_MAILBOX_CSR,
- &H2MMailbox.word);
- if (H2MMailbox.field.Owner == 0)
- break;
-
- RTMPusecDelay(2);
- DBGPRINT(RT_DEBUG_INFO,
- ("AsicSendCommanToMcu::Mail box is busy\n"));
- } while (i++ < 100);
-
- if (i > 100) {
- DBGPRINT_ERR("H2M_MAILBOX still hold by MCU. command fail\n");
- return FALSE;
- }
-
- H2MMailbox.field.Owner = 1; /* pass ownership to MCU */
- H2MMailbox.field.CmdToken = Token;
- H2MMailbox.field.HighByte = Arg1;
- H2MMailbox.field.LowByte = Arg0;
- RTMP_IO_FORCE_WRITE32(pAd, H2M_MAILBOX_CSR, H2MMailbox.word);
-
- H2MCmd.word = 0;
- H2MCmd.field.HostCommand = Command;
- RTMP_IO_FORCE_WRITE32(pAd, HOST_CMD_CSR, H2MCmd.word);
-
- } else
-#endif /* PCIE_PS_SUPPORT // */
- {
- do {
- RTMP_IO_READ32(pAd, H2M_MAILBOX_CSR, &H2MMailbox.word);
- if (H2MMailbox.field.Owner == 0)
- break;
-
- RTMPusecDelay(2);
- } while (i++ < 100);
-
- if (i > 100) {
-#ifdef RTMP_MAC_PCI
-#endif /* RTMP_MAC_PCI // */
- {
- DBGPRINT_ERR("H2M_MAILBOX still hold by MCU. command fail\n");
- }
- return FALSE;
- }
-#ifdef RTMP_MAC_PCI
-#endif /* RTMP_MAC_PCI // */
-
- H2MMailbox.field.Owner = 1; /* pass ownership to MCU */
- H2MMailbox.field.CmdToken = Token;
- H2MMailbox.field.HighByte = Arg1;
- H2MMailbox.field.LowByte = Arg0;
- RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CSR, H2MMailbox.word);
-
- H2MCmd.word = 0;
- H2MCmd.field.HostCommand = Command;
- RTMP_IO_WRITE32(pAd, HOST_CMD_CSR, H2MCmd.word);
-
- if (Command != 0x80) {
- }
- }
-#ifdef PCIE_PS_SUPPORT
- /* 3090 MCU Wakeup command needs more time to be stable. */
- /* Before stable, don't issue other MCU command to prevent from firmware error. */
- if (((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))
- && IS_VERSION_AFTER_F(pAd)) && IS_VERSION_AFTER_F(pAd)
- && (pAd->StaCfg.PSControl.field.rt30xxPowerMode == 3)
- && (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE)
- && (Command == WAKE_MCU_CMD)) {
- RTMPusecDelay(2000);
- /*Put this is after RF programming. */
- /*NdisAcquireSpinLock(&pAd->McuCmdLock); */
- /*pAd->brt30xxBanMcuCmd = FALSE; */
- /*NdisReleaseSpinLock(&pAd->McuCmdLock); */
- }
-#endif /* PCIE_PS_SUPPORT // */
-
- return TRUE;
-}
diff --git a/drivers/staging/rt2860/common/rtmp_timer.c b/drivers/staging/rt2860/common/rtmp_timer.c
deleted file mode 100644
index ab520909490f..000000000000
--- a/drivers/staging/rt2860/common/rtmp_timer.c
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-
- Module Name:
- rtmp_timer.c
-
- Abstract:
- task for timer handling
-
- Revision History:
- Who When What
- -------- ---------- ----------------------------------------------
- Name Date Modification logs
- Shiang Tu 08-28-2008 init version
-
-*/
-
-#include "../rt_config.h"
-
-BUILD_TIMER_FUNCTION(MlmePeriodicExec);
-/*BUILD_TIMER_FUNCTION(MlmeRssiReportExec); */
-BUILD_TIMER_FUNCTION(AsicRxAntEvalTimeout);
-BUILD_TIMER_FUNCTION(APSDPeriodicExec);
-BUILD_TIMER_FUNCTION(AsicRfTuningExec);
-#ifdef RTMP_MAC_USB
-BUILD_TIMER_FUNCTION(BeaconUpdateExec);
-#endif /* RTMP_MAC_USB // */
-
-BUILD_TIMER_FUNCTION(BeaconTimeout);
-BUILD_TIMER_FUNCTION(ScanTimeout);
-BUILD_TIMER_FUNCTION(AuthTimeout);
-BUILD_TIMER_FUNCTION(AssocTimeout);
-BUILD_TIMER_FUNCTION(ReassocTimeout);
-BUILD_TIMER_FUNCTION(DisassocTimeout);
-BUILD_TIMER_FUNCTION(LinkDownExec);
-BUILD_TIMER_FUNCTION(StaQuickResponeForRateUpExec);
-BUILD_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc);
-#ifdef RTMP_MAC_PCI
-BUILD_TIMER_FUNCTION(PsPollWakeExec);
-BUILD_TIMER_FUNCTION(RadioOnExec);
-#endif /* RTMP_MAC_PCI // */
-#ifdef RTMP_MAC_USB
-BUILD_TIMER_FUNCTION(RtmpUsbStaAsicForceWakeupTimeout);
-#endif /* RTMP_MAC_USB // */
-
-#if defined(AP_LED) || defined(STA_LED)
-extern void LedCtrlMain(void *SystemSpecific1,
- void *FunctionContext,
- void *SystemSpecific2, void *SystemSpecific3);
-BUILD_TIMER_FUNCTION(LedCtrlMain);
-#endif
-
-#ifdef RTMP_TIMER_TASK_SUPPORT
-static void RtmpTimerQHandle(struct rt_rtmp_adapter *pAd)
-{
-#ifndef KTHREAD_SUPPORT
- int status;
-#endif
- struct rt_ralink_timer *pTimer;
- struct rt_rtmp_timer_task_entry *pEntry;
- unsigned long irqFlag;
- struct rt_rtmp_os_task *pTask;
-
- pTask = &pAd->timerTask;
- while (!pTask->task_killed) {
- pTimer = NULL;
-
-#ifdef KTHREAD_SUPPORT
- RTMP_WAIT_EVENT_INTERRUPTIBLE(pAd, pTask);
-#else
- RTMP_SEM_EVENT_WAIT(&(pTask->taskSema), status);
-#endif
-
- if (pAd->TimerQ.status == RTMP_TASK_STAT_STOPED)
- break;
-
- /* event happened. */
- while (pAd->TimerQ.pQHead) {
- RTMP_INT_LOCK(&pAd->TimerQLock, irqFlag);
- pEntry = pAd->TimerQ.pQHead;
- if (pEntry) {
- pTimer = pEntry->pRaTimer;
-
- /* update pQHead */
- pAd->TimerQ.pQHead = pEntry->pNext;
- if (pEntry == pAd->TimerQ.pQTail)
- pAd->TimerQ.pQTail = NULL;
-
- /* return this queue entry to timerQFreeList. */
- pEntry->pNext = pAd->TimerQ.pQPollFreeList;
- pAd->TimerQ.pQPollFreeList = pEntry;
- }
- RTMP_INT_UNLOCK(&pAd->TimerQLock, irqFlag);
-
- if (pTimer) {
- if ((pTimer->handle != NULL)
- && (!pAd->PM_FlgSuspend))
- pTimer->handle(NULL,
- (void *)pTimer->cookie,
- NULL, pTimer);
- if ((pTimer->Repeat)
- && (pTimer->State == FALSE))
- RTMP_OS_Add_Timer(&pTimer->TimerObj,
- pTimer->TimerValue);
- }
- }
-
-#ifndef KTHREAD_SUPPORT
- if (status != 0) {
- pAd->TimerQ.status = RTMP_TASK_STAT_STOPED;
- RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
- break;
- }
-#endif
- }
-}
-
-int RtmpTimerQThread(IN void *Context)
-{
- struct rt_rtmp_os_task *pTask;
- struct rt_rtmp_adapter *pAd;
-
- pTask = Context;
- pAd = pTask->priv;
-
- RtmpOSTaskCustomize(pTask);
-
- RtmpTimerQHandle(pAd);
-
- DBGPRINT(RT_DEBUG_TRACE, ("<---%s\n", __func__));
-#ifndef KTHREAD_SUPPORT
- pTask->taskPID = THREAD_PID_INIT_VALUE;
-#endif
- /* notify the exit routine that we're actually exiting now
- *
- * complete()/wait_for_completion() is similar to up()/down(),
- * except that complete() is safe in the case where the structure
- * is getting deleted in a parallel mode of execution (i.e. just
- * after the down() -- that's necessary for the thread-shutdown
- * case.
- *
- * complete_and_exit() goes even further than this -- it is safe in
- * the case that the thread of the caller is going away (not just
- * the structure) -- this is necessary for the module-remove case.
- * This is important in preemption kernels, which transfer the flow
- * of execution immediately upon a complete().
- */
- RtmpOSTaskNotifyToExit(pTask);
-
- return 0;
-
-}
-
-struct rt_rtmp_timer_task_entry *RtmpTimerQInsert(struct rt_rtmp_adapter *pAd,
- struct rt_ralink_timer *pTimer)
-{
- struct rt_rtmp_timer_task_entry *pQNode = NULL, *pQTail;
- unsigned long irqFlags;
- struct rt_rtmp_os_task *pTask = &pAd->timerTask;
-
- RTMP_INT_LOCK(&pAd->TimerQLock, irqFlags);
- if (pAd->TimerQ.status & RTMP_TASK_CAN_DO_INSERT) {
- if (pAd->TimerQ.pQPollFreeList) {
- pQNode = pAd->TimerQ.pQPollFreeList;
- pAd->TimerQ.pQPollFreeList = pQNode->pNext;
-
- pQNode->pRaTimer = pTimer;
- pQNode->pNext = NULL;
-
- pQTail = pAd->TimerQ.pQTail;
- if (pAd->TimerQ.pQTail != NULL)
- pQTail->pNext = pQNode;
- pAd->TimerQ.pQTail = pQNode;
- if (pAd->TimerQ.pQHead == NULL)
- pAd->TimerQ.pQHead = pQNode;
- }
- }
- RTMP_INT_UNLOCK(&pAd->TimerQLock, irqFlags);
-
- if (pQNode) {
-#ifdef KTHREAD_SUPPORT
- WAKE_UP(pTask);
-#else
- RTMP_SEM_EVENT_UP(&pTask->taskSema);
-#endif
- }
-
- return pQNode;
-}
-
-BOOLEAN RtmpTimerQRemove(struct rt_rtmp_adapter *pAd, struct rt_ralink_timer *pTimer)
-{
- struct rt_rtmp_timer_task_entry *pNode, *pPrev = NULL;
- unsigned long irqFlags;
-
- RTMP_INT_LOCK(&pAd->TimerQLock, irqFlags);
- if (pAd->TimerQ.status >= RTMP_TASK_STAT_INITED) {
- pNode = pAd->TimerQ.pQHead;
- while (pNode) {
- if (pNode->pRaTimer == pTimer)
- break;
- pPrev = pNode;
- pNode = pNode->pNext;
- }
-
- /* Now move it to freeList queue. */
- if (pNode) {
- if (pNode == pAd->TimerQ.pQHead)
- pAd->TimerQ.pQHead = pNode->pNext;
- if (pNode == pAd->TimerQ.pQTail)
- pAd->TimerQ.pQTail = pPrev;
- if (pPrev != NULL)
- pPrev->pNext = pNode->pNext;
-
- /* return this queue entry to timerQFreeList. */
- pNode->pNext = pAd->TimerQ.pQPollFreeList;
- pAd->TimerQ.pQPollFreeList = pNode;
- }
- }
- RTMP_INT_UNLOCK(&pAd->TimerQLock, irqFlags);
-
- return TRUE;
-}
-
-void RtmpTimerQExit(struct rt_rtmp_adapter *pAd)
-{
- struct rt_rtmp_timer_task_entry *pTimerQ;
- unsigned long irqFlags;
-
- RTMP_INT_LOCK(&pAd->TimerQLock, irqFlags);
- while (pAd->TimerQ.pQHead) {
- pTimerQ = pAd->TimerQ.pQHead;
- pAd->TimerQ.pQHead = pTimerQ->pNext;
- /* remove the timeQ */
- }
- pAd->TimerQ.pQPollFreeList = NULL;
- os_free_mem(pAd, pAd->TimerQ.pTimerQPoll);
- pAd->TimerQ.pQTail = NULL;
- pAd->TimerQ.pQHead = NULL;
-#ifndef KTHREAD_SUPPORT
- pAd->TimerQ.status = RTMP_TASK_STAT_STOPED;
-#endif
- RTMP_INT_UNLOCK(&pAd->TimerQLock, irqFlags);
-
-}
-
-void RtmpTimerQInit(struct rt_rtmp_adapter *pAd)
-{
- int i;
- struct rt_rtmp_timer_task_entry *pQNode, *pEntry;
- unsigned long irqFlags;
-
- NdisAllocateSpinLock(&pAd->TimerQLock);
-
- NdisZeroMemory(&pAd->TimerQ, sizeof(pAd->TimerQ));
-
- os_alloc_mem(pAd, &pAd->TimerQ.pTimerQPoll,
- sizeof(struct rt_rtmp_timer_task_entry) * TIMER_QUEUE_SIZE_MAX);
- if (pAd->TimerQ.pTimerQPoll) {
- pEntry = NULL;
- pQNode = (struct rt_rtmp_timer_task_entry *)pAd->TimerQ.pTimerQPoll;
- NdisZeroMemory(pAd->TimerQ.pTimerQPoll,
- sizeof(struct rt_rtmp_timer_task_entry) *
- TIMER_QUEUE_SIZE_MAX);
-
- RTMP_INT_LOCK(&pAd->TimerQLock, irqFlags);
- for (i = 0; i < TIMER_QUEUE_SIZE_MAX; i++) {
- pQNode->pNext = pEntry;
- pEntry = pQNode;
- pQNode++;
- }
- pAd->TimerQ.pQPollFreeList = pEntry;
- pAd->TimerQ.pQHead = NULL;
- pAd->TimerQ.pQTail = NULL;
- pAd->TimerQ.status = RTMP_TASK_STAT_INITED;
- RTMP_INT_UNLOCK(&pAd->TimerQLock, irqFlags);
- }
-}
-#endif /* RTMP_TIMER_TASK_SUPPORT // */
diff --git a/drivers/staging/rt2860/common/spectrum.c b/drivers/staging/rt2860/common/spectrum.c
deleted file mode 100644
index ceb622df12d7..000000000000
--- a/drivers/staging/rt2860/common/spectrum.c
+++ /dev/null
@@ -1,2205 +0,0 @@
-/*
- *************************************************************************
- * Ralink Tech Inc.
- * 5F., No.36, Taiyuan St., Jhubei City,
- * Hsinchu County 302,
- * Taiwan, R.O.C.
- *
- * (c) Copyright 2002-2007, Ralink Technology, Inc.
- *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
- * *
- *************************************************************************
-
- Module Name:
- action.c
-
- Abstract:
- Handle association related requests either from WSTA or from local MLME
-
- Revision History:
- Who When What
- --------- ---------- ----------------------------------------------
- Fonchi Wu 2008 created for 802.11h
- */
-
-#include "../rt_config.h"
-#include "action.h"
-
-/* The regulatory information in the USA (US) */
-struct rt_dot11_regulatory_information USARegulatoryInfo[] = {
-/* "regulatory class" "number of channels" "Max Tx Pwr" "channel list" */
- {0, {0, 0, {0}
- }
- }
- , /* Invlid entry */
- {1, {4, 16, {36, 40, 44, 48}
- }
- }
- ,
- {2, {4, 23, {52, 56, 60, 64}
- }
- }
- ,
- {3, {4, 29, {149, 153, 157, 161}
- }
- }
- ,
- {4, {11, 23, {100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140}
- }
- }
- ,
- {5, {5, 30, {149, 153, 157, 161, 165}
- }
- }
- ,
- {6, {10, 14, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
- }
- }
- ,
- {7, {10, 27, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
- }
- }
- ,
- {8, {5, 17, {11, 13, 15, 17, 19}
- }
- }
- ,
- {9, {5, 30, {11, 13, 15, 17, 19}
- }
- }
- ,
- {10, {2, 20, {21, 25}
- }
- }
- ,
- {11, {2, 33, {21, 25}
- }
- }
- ,
- {12, {11, 30, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}
- }
- }
-};
-
-#define USA_REGULATORY_INFO_SIZE (sizeof(USARegulatoryInfo) / sizeof(struct rt_dot11_regulatory_information))
-
-/* The regulatory information in Europe */
-struct rt_dot11_regulatory_information EuropeRegulatoryInfo[] = {
-/* "regulatory class" "number of channels" "Max Tx Pwr" "channel list" */
- {0, {0, 0, {0}
- }
- }
- , /* Invalid entry */
- {1, {4, 20, {36, 40, 44, 48}
- }
- }
- ,
- {2, {4, 20, {52, 56, 60, 64}
- }
- }
- ,
- {3, {11, 30, {100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140}
- }
- }
- ,
- {4, {13, 20, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}
- }
- }
-};
-
-#define EU_REGULATORY_INFO_SIZE (sizeof(EuropeRegulatoryInfo) / sizeof(struct rt_dot11_regulatory_information))
-
-/* The regulatory information in Japan */
-struct rt_dot11_regulatory_information JapanRegulatoryInfo[] = {
-/* "regulatory class" "number of channels" "Max Tx Pwr" "channel list" */
- {0, {0, 0, {0}
- }
- }
- , /* Invalid entry */
- {1, {4, 22, {34, 38, 42, 46}
- }
- }
- ,
- {2, {3, 24, {8, 12, 16}
- }
- }
- ,
- {3, {3, 24, {8, 12, 16}
- }
- }
- ,
- {4, {3, 24, {8, 12, 16}
- }
- }
- ,
- {5, {3, 24, {8, 12, 16}
- }
- }
- ,
- {6, {3, 22, {8, 12, 16}
- }
- }
- ,
- {7, {4, 24, {184, 188, 192, 196}
- }
- }
- ,
- {8, {4, 24, {184, 188, 192, 196}
- }
- }
- ,
- {9, {4, 24, {184, 188, 192, 196}
- }
- }
- ,
- {10, {4, 24, {184, 188, 192, 196}
- }
- }
- ,
- {11, {4, 22, {184, 188, 192, 196}
- }
- }
- ,
- {12, {4, 24, {7, 8, 9, 11}
- }
- }
- ,
- {13, {4, 24, {7, 8, 9, 11}
- }
- }
- ,
- {14, {4, 24, {7, 8, 9, 11}
- }
- }
- ,
- {15, {4, 24, {7, 8, 9, 11}
- }
- }
- ,
- {16, {6, 24, {183, 184, 185, 187, 188, 189}
- }
- }
- ,
- {17, {6, 24, {183, 184, 185, 187, 188, 189}
- }
- }
- ,
- {18, {6, 24, {183, 184, 185, 187, 188, 189}
- }
- }
- ,
- {19, {6, 24, {183, 184, 185, 187, 188, 189}
- }
- }
- ,
- {20, {6, 17, {183, 184, 185, 187, 188, 189}
- }
- }
- ,
- {21, {6, 24, {6, 7, 8, 9, 10, 11}
- }
- }
- ,
- {22, {6, 24, {6, 7, 8, 9, 10, 11}
- }
- }
- ,
- {23, {6, 24, {6, 7, 8, 9, 10, 11}
- }
- }
- ,
- {24, {6, 24, {6, 7, 8, 9, 10, 11}
- }
- }
- ,
- {25, {8, 24, {182, 183, 184, 185, 186, 187, 188, 189}
- }
- }
- ,
- {26, {8, 24, {182, 183, 184, 185, 186, 187, 188, 189}
- }
- }
- ,
- {27, {8, 24, {182, 183, 184, 185, 186, 187, 188, 189}
- }
- }
- ,
- {28, {8, 24, {182, 183, 184, 185, 186, 187, 188, 189}
- }
- }
- ,
- {29, {8, 17, {182, 183, 184, 185, 186, 187, 188, 189}
- }
- }
- ,
- {30, {13, 23, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}
- }
- }
- ,
- {31, {1, 23, {14}
- }
- }
- ,
- {32, {4, 22, {52, 56, 60, 64}
- }
- }
-};
-
-#define JP_REGULATORY_INFO_SIZE (sizeof(JapanRegulatoryInfo) / sizeof(struct rt_dot11_regulatory_information))
-
-char RTMP_GetTxPwr(struct rt_rtmp_adapter *pAd, IN HTTRANSMIT_SETTING HTTxMode)
-{
- struct tx_pwr_cfg {
- u8 Mode;
- u8 MCS;
- u16 req;
- u8 shift;
- u32 BitMask;
- };
-
- u32 Value;
- int Idx;
- u8 PhyMode;
- char CurTxPwr;
- u8 TxPwrRef = 0;
- char DaltaPwr;
- unsigned long TxPwr[5];
-
- struct tx_pwr_cfg TxPwrCfg[] = {
- {MODE_CCK, 0, 0, 4, 0x000000f0},
- {MODE_CCK, 1, 0, 0, 0x0000000f},
- {MODE_CCK, 2, 0, 12, 0x0000f000},
- {MODE_CCK, 3, 0, 8, 0x00000f00},
-
- {MODE_OFDM, 0, 0, 20, 0x00f00000},
- {MODE_OFDM, 1, 0, 16, 0x000f0000},
- {MODE_OFDM, 2, 0, 28, 0xf0000000},
- {MODE_OFDM, 3, 0, 24, 0x0f000000},
- {MODE_OFDM, 4, 1, 4, 0x000000f0},
- {MODE_OFDM, 5, 1, 0, 0x0000000f},
- {MODE_OFDM, 6, 1, 12, 0x0000f000},
- {MODE_OFDM, 7, 1, 8, 0x00000f00}
- , {MODE_HTMIX, 0, 1, 20, 0x00f00000},
- {MODE_HTMIX, 1, 1, 16, 0x000f0000},
- {MODE_HTMIX, 2, 1, 28, 0xf0000000},
- {MODE_HTMIX, 3, 1, 24, 0x0f000000},
- {MODE_HTMIX, 4, 2, 4, 0x000000f0},
- {MODE_HTMIX, 5, 2, 0, 0x0000000f},
- {MODE_HTMIX, 6, 2, 12, 0x0000f000},
- {MODE_HTMIX, 7, 2, 8, 0x00000f00},
- {MODE_HTMIX, 8, 2, 20, 0x00f00000},
- {MODE_HTMIX, 9, 2, 16, 0x000f0000},
- {MODE_HTMIX, 10, 2, 28, 0xf0000000},
- {MODE_HTMIX, 11, 2, 24, 0x0f000000},
- {MODE_HTMIX, 12, 3, 4, 0x000000f0},
- {MODE_HTMIX, 13, 3, 0, 0x0000000f},
- {MODE_HTMIX, 14, 3, 12, 0x0000f000},
- {MODE_HTMIX, 15, 3, 8, 0x00000f00}
- };
-#define MAX_TXPWR_TAB_SIZE (sizeof(TxPwrCfg) / sizeof(struct tx_pwr_cfg))
-
- CurTxPwr = 19;
-
- /* check Tx Power setting from UI. */
- if (pAd->CommonCfg.TxPowerPercentage > 90) ;
- else if (pAd->CommonCfg.TxPowerPercentage > 60) /* reduce Pwr for 1 dB. */
- CurTxPwr -= 1;
- else if (pAd->CommonCfg.TxPowerPercentage > 30) /* reduce Pwr for 3 dB. */
- CurTxPwr -= 3;
- else if (pAd->CommonCfg.TxPowerPercentage > 15) /* reduce Pwr for 6 dB. */
- CurTxPwr -= 6;
- else if (pAd->CommonCfg.TxPowerPercentage > 9) /* reduce Pwr for 9 dB. */
- CurTxPwr -= 9;
- else /* reduce Pwr for 12 dB. */
- CurTxPwr -= 12;
-
- if (pAd->CommonCfg.BBPCurrentBW == BW_40) {
- if (pAd->CommonCfg.CentralChannel > 14) {
- TxPwr[0] = pAd->Tx40MPwrCfgABand[0];
- TxPwr[1] = pAd->Tx40MPwrCfgABand[1];
- TxPwr[2] = pAd->Tx40MPwrCfgABand[2];
- TxPwr[3] = pAd->Tx40MPwrCfgABand[3];
- TxPwr[4] = pAd->Tx40MPwrCfgABand[4];
- } else {
- TxPwr[0] = pAd->Tx40MPwrCfgGBand[0];
- TxPwr[1] = pAd->Tx40MPwrCfgGBand[1];
- TxPwr[2] = pAd->Tx40MPwrCfgGBand[2];
- TxPwr[3] = pAd->Tx40MPwrCfgGBand[3];
- TxPwr[4] = pAd->Tx40MPwrCfgGBand[4];
- }
- } else {
- if (pAd->CommonCfg.Channel > 14) {
- TxPwr[0] = pAd->Tx20MPwrCfgABand[0];
- TxPwr[1] = pAd->Tx20MPwrCfgABand[1];
- TxPwr[2] = pAd->Tx20MPwrCfgABand[2];
- TxPwr[3] = pAd->Tx20MPwrCfgABand[3];
- TxPwr[4] = pAd->Tx20MPwrCfgABand[4];
- } else {
- TxPwr[0] = pAd->Tx20MPwrCfgGBand[0];
- TxPwr[1] = pAd->Tx20MPwrCfgGBand[1];
- TxPwr[2] = pAd->Tx20MPwrCfgGBand[2];
- TxPwr[3] = pAd->Tx20MPwrCfgGBand[3];
- TxPwr[4] = pAd->Tx20MPwrCfgGBand[4];
- }
- }
-
- switch (HTTxMode.field.MODE) {
- case MODE_CCK:
- case MODE_OFDM:
- Value = TxPwr[1];
- TxPwrRef = (Value & 0x00000f00) >> 8;
-
- break;
-
- case MODE_HTMIX:
- case MODE_HTGREENFIELD:
- if (pAd->CommonCfg.TxStream == 1) {
- Value = TxPwr[2];
- TxPwrRef = (Value & 0x00000f00) >> 8;
- } else if (pAd->CommonCfg.TxStream == 2) {
- Value = TxPwr[3];
- TxPwrRef = (Value & 0x00000f00) >> 8;
- }
- break;
- }
-
- PhyMode = (HTTxMode.field.MODE == MODE_HTGREENFIELD)
- ? MODE_HTMIX : HTTxMode.field.MODE;
-
- for (Idx = 0; Idx < MAX_TXPWR_TAB_SIZE; Idx++) {
- if ((TxPwrCfg[Idx].Mode == PhyMode)
- && (TxPwrCfg[Idx].MCS == HTTxMode.field.MCS)) {
- Value = TxPwr[TxPwrCfg[Idx].req];
- DaltaPwr =
- TxPwrRef - (char)((Value & TxPwrCfg[Idx].BitMask)
- >> TxPwrCfg[Idx].shift);
- CurTxPwr -= DaltaPwr;
- break;
- }
- }
-
- return CurTxPwr;
-}
-
-void MeasureReqTabInit(struct rt_rtmp_adapter *pAd)
-{
- NdisAllocateSpinLock(&pAd->CommonCfg.MeasureReqTabLock);
-
- pAd->CommonCfg.pMeasureReqTab =
- kmalloc(sizeof(struct rt_measure_req_tab), GFP_ATOMIC);
- if (pAd->CommonCfg.pMeasureReqTab)
- NdisZeroMemory(pAd->CommonCfg.pMeasureReqTab,
- sizeof(struct rt_measure_req_tab));
- else
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s Fail to alloc memory for pAd->CommonCfg.pMeasureReqTab.\n",
- __func__));
-
- return;
-}
-
-void MeasureReqTabExit(struct rt_rtmp_adapter *pAd)
-{
- NdisFreeSpinLock(&pAd->CommonCfg.MeasureReqTabLock);
-
- kfree(pAd->CommonCfg.pMeasureReqTab);
- pAd->CommonCfg.pMeasureReqTab = NULL;
-
- return;
-}
-
-struct rt_measure_req_entry *MeasureReqLookUp(struct rt_rtmp_adapter *pAd, u8 DialogToken)
-{
- u32 HashIdx;
- struct rt_measure_req_tab *pTab = pAd->CommonCfg.pMeasureReqTab;
- struct rt_measure_req_entry *pEntry = NULL;
- struct rt_measure_req_entry *pPrevEntry = NULL;
-
- if (pTab == NULL) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s: pMeasureReqTab doesn't exist.\n", __func__));
- return NULL;
- }
-
- RTMP_SEM_LOCK(&pAd->CommonCfg.MeasureReqTabLock);
-
- HashIdx = MQ_DIALOGTOKEN_HASH_INDEX(DialogToken);
- pEntry = pTab->Hash[HashIdx];
-
- while (pEntry) {
- if (pEntry->DialogToken == DialogToken)
- break;
- else {
- pPrevEntry = pEntry;
- pEntry = pEntry->pNext;
- }
- }
-
- RTMP_SEM_UNLOCK(&pAd->CommonCfg.MeasureReqTabLock);
-
- return pEntry;
-}
-
-struct rt_measure_req_entry *MeasureReqInsert(struct rt_rtmp_adapter *pAd, u8 DialogToken)
-{
- int i;
- unsigned long HashIdx;
- struct rt_measure_req_tab *pTab = pAd->CommonCfg.pMeasureReqTab;
- struct rt_measure_req_entry *pEntry = NULL, *pCurrEntry;
- unsigned long Now;
-
- if (pTab == NULL) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s: pMeasureReqTab doesn't exist.\n", __func__));
- return NULL;
- }
-
- pEntry = MeasureReqLookUp(pAd, DialogToken);
- if (pEntry == NULL) {
- RTMP_SEM_LOCK(&pAd->CommonCfg.MeasureReqTabLock);
- for (i = 0; i < MAX_MEASURE_REQ_TAB_SIZE; i++) {
- NdisGetSystemUpTime(&Now);
- pEntry = &pTab->Content[i];
-
- if ((pEntry->Valid == TRUE)
- && RTMP_TIME_AFTER((unsigned long)Now,
- (unsigned long)(pEntry->
- lastTime +
- MQ_REQ_AGE_OUT)))
- {
- struct rt_measure_req_entry *pPrevEntry = NULL;
- unsigned long HashIdx =
- MQ_DIALOGTOKEN_HASH_INDEX(pEntry->
- DialogToken);
- struct rt_measure_req_entry *pProbeEntry =
- pTab->Hash[HashIdx];
-
- /* update Hash list */
- do {
- if (pProbeEntry == pEntry) {
- if (pPrevEntry == NULL) {
- pTab->Hash[HashIdx] =
- pEntry->pNext;
- } else {
- pPrevEntry->pNext =
- pEntry->pNext;
- }
- break;
- }
-
- pPrevEntry = pProbeEntry;
- pProbeEntry = pProbeEntry->pNext;
- } while (pProbeEntry);
-
- NdisZeroMemory(pEntry,
- sizeof(struct rt_measure_req_entry));
- pTab->Size--;
-
- break;
- }
-
- if (pEntry->Valid == FALSE)
- break;
- }
-
- if (i < MAX_MEASURE_REQ_TAB_SIZE) {
- NdisGetSystemUpTime(&Now);
- pEntry->lastTime = Now;
- pEntry->Valid = TRUE;
- pEntry->DialogToken = DialogToken;
- pTab->Size++;
- } else {
- pEntry = NULL;
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s: pMeasureReqTab tab full.\n", __func__));
- }
-
- /* add this Neighbor entry into HASH table */
- if (pEntry) {
- HashIdx = MQ_DIALOGTOKEN_HASH_INDEX(DialogToken);
- if (pTab->Hash[HashIdx] == NULL) {
- pTab->Hash[HashIdx] = pEntry;
- } else {
- pCurrEntry = pTab->Hash[HashIdx];
- while (pCurrEntry->pNext != NULL)
- pCurrEntry = pCurrEntry->pNext;
- pCurrEntry->pNext = pEntry;
- }
- }
-
- RTMP_SEM_UNLOCK(&pAd->CommonCfg.MeasureReqTabLock);
- }
-
- return pEntry;
-}
-
-void MeasureReqDelete(struct rt_rtmp_adapter *pAd, u8 DialogToken)
-{
- struct rt_measure_req_tab *pTab = pAd->CommonCfg.pMeasureReqTab;
- struct rt_measure_req_entry *pEntry = NULL;
-
- if (pTab == NULL) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s: pMeasureReqTab doesn't exist.\n", __func__));
- return;
- }
- /* if empty, return */
- if (pTab->Size == 0) {
- DBGPRINT(RT_DEBUG_ERROR, ("pMeasureReqTab empty.\n"));
- return;
- }
-
- pEntry = MeasureReqLookUp(pAd, DialogToken);
- if (pEntry != NULL) {
- struct rt_measure_req_entry *pPrevEntry = NULL;
- unsigned long HashIdx = MQ_DIALOGTOKEN_HASH_INDEX(pEntry->DialogToken);
- struct rt_measure_req_entry *pProbeEntry = pTab->Hash[HashIdx];
-
- RTMP_SEM_LOCK(&pAd->CommonCfg.MeasureReqTabLock);
- /* update Hash list */
- do {
- if (pProbeEntry == pEntry) {
- if (pPrevEntry == NULL) {
- pTab->Hash[HashIdx] = pEntry->pNext;
- } else {
- pPrevEntry->pNext = pEntry->pNext;
- }
- break;
- }
-
- pPrevEntry = pProbeEntry;
- pProbeEntry = pProbeEntry->pNext;
- } while (pProbeEntry);
-
- NdisZeroMemory(pEntry, sizeof(struct rt_measure_req_entry));
- pTab->Size--;
-
- RTMP_SEM_UNLOCK(&pAd->CommonCfg.MeasureReqTabLock);
- }
-
- return;
-}
-
-void TpcReqTabInit(struct rt_rtmp_adapter *pAd)
-{
- NdisAllocateSpinLock(&pAd->CommonCfg.TpcReqTabLock);
-
- pAd->CommonCfg.pTpcReqTab = kmalloc(sizeof(struct rt_tpc_req_tab), GFP_ATOMIC);
- if (pAd->CommonCfg.pTpcReqTab)
- NdisZeroMemory(pAd->CommonCfg.pTpcReqTab, sizeof(struct rt_tpc_req_tab));
- else
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s Fail to alloc memory for pAd->CommonCfg.pTpcReqTab.\n",
- __func__));
-
- return;
-}
-
-void TpcReqTabExit(struct rt_rtmp_adapter *pAd)
-{
- NdisFreeSpinLock(&pAd->CommonCfg.TpcReqTabLock);
-
- kfree(pAd->CommonCfg.pTpcReqTab);
- pAd->CommonCfg.pTpcReqTab = NULL;
-
- return;
-}
-
-static struct rt_tpc_req_entry *TpcReqLookUp(struct rt_rtmp_adapter *pAd, u8 DialogToken)
-{
- u32 HashIdx;
- struct rt_tpc_req_tab *pTab = pAd->CommonCfg.pTpcReqTab;
- struct rt_tpc_req_entry *pEntry = NULL;
- struct rt_tpc_req_entry *pPrevEntry = NULL;
-
- if (pTab == NULL) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s: pTpcReqTab doesn't exist.\n", __func__));
- return NULL;
- }
-
- RTMP_SEM_LOCK(&pAd->CommonCfg.TpcReqTabLock);
-
- HashIdx = TPC_DIALOGTOKEN_HASH_INDEX(DialogToken);
- pEntry = pTab->Hash[HashIdx];
-
- while (pEntry) {
- if (pEntry->DialogToken == DialogToken)
- break;
- else {
- pPrevEntry = pEntry;
- pEntry = pEntry->pNext;
- }
- }
-
- RTMP_SEM_UNLOCK(&pAd->CommonCfg.TpcReqTabLock);
-
- return pEntry;
-}
-
-static struct rt_tpc_req_entry *TpcReqInsert(struct rt_rtmp_adapter *pAd, u8 DialogToken)
-{
- int i;
- unsigned long HashIdx;
- struct rt_tpc_req_tab *pTab = pAd->CommonCfg.pTpcReqTab;
- struct rt_tpc_req_entry *pEntry = NULL, *pCurrEntry;
- unsigned long Now;
-
- if (pTab == NULL) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s: pTpcReqTab doesn't exist.\n", __func__));
- return NULL;
- }
-
- pEntry = TpcReqLookUp(pAd, DialogToken);
- if (pEntry == NULL) {
- RTMP_SEM_LOCK(&pAd->CommonCfg.TpcReqTabLock);
- for (i = 0; i < MAX_TPC_REQ_TAB_SIZE; i++) {
- NdisGetSystemUpTime(&Now);
- pEntry = &pTab->Content[i];
-
- if ((pEntry->Valid == TRUE)
- && RTMP_TIME_AFTER((unsigned long)Now,
- (unsigned long)(pEntry->
- lastTime +
- TPC_REQ_AGE_OUT)))
- {
- struct rt_tpc_req_entry *pPrevEntry = NULL;
- unsigned long HashIdx =
- TPC_DIALOGTOKEN_HASH_INDEX(pEntry->
- DialogToken);
- struct rt_tpc_req_entry *pProbeEntry =
- pTab->Hash[HashIdx];
-
- /* update Hash list */
- do {
- if (pProbeEntry == pEntry) {
- if (pPrevEntry == NULL) {
- pTab->Hash[HashIdx] =
- pEntry->pNext;
- } else {
- pPrevEntry->pNext =
- pEntry->pNext;
- }
- break;
- }
-
- pPrevEntry = pProbeEntry;
- pProbeEntry = pProbeEntry->pNext;
- } while (pProbeEntry);
-
- NdisZeroMemory(pEntry, sizeof(struct rt_tpc_req_entry));
- pTab->Size--;
-
- break;
- }
-
- if (pEntry->Valid == FALSE)
- break;
- }
-
- if (i < MAX_TPC_REQ_TAB_SIZE) {
- NdisGetSystemUpTime(&Now);
- pEntry->lastTime = Now;
- pEntry->Valid = TRUE;
- pEntry->DialogToken = DialogToken;
- pTab->Size++;
- } else {
- pEntry = NULL;
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s: pTpcReqTab tab full.\n", __func__));
- }
-
- /* add this Neighbor entry into HASH table */
- if (pEntry) {
- HashIdx = TPC_DIALOGTOKEN_HASH_INDEX(DialogToken);
- if (pTab->Hash[HashIdx] == NULL) {
- pTab->Hash[HashIdx] = pEntry;
- } else {
- pCurrEntry = pTab->Hash[HashIdx];
- while (pCurrEntry->pNext != NULL)
- pCurrEntry = pCurrEntry->pNext;
- pCurrEntry->pNext = pEntry;
- }
- }
-
- RTMP_SEM_UNLOCK(&pAd->CommonCfg.TpcReqTabLock);
- }
-
- return pEntry;
-}
-
-static void TpcReqDelete(struct rt_rtmp_adapter *pAd, u8 DialogToken)
-{
- struct rt_tpc_req_tab *pTab = pAd->CommonCfg.pTpcReqTab;
- struct rt_tpc_req_entry *pEntry = NULL;
-
- if (pTab == NULL) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s: pTpcReqTab doesn't exist.\n", __func__));
- return;
- }
- /* if empty, return */
- if (pTab->Size == 0) {
- DBGPRINT(RT_DEBUG_ERROR, ("pTpcReqTab empty.\n"));
- return;
- }
-
- pEntry = TpcReqLookUp(pAd, DialogToken);
- if (pEntry != NULL) {
- struct rt_tpc_req_entry *pPrevEntry = NULL;
- unsigned long HashIdx = TPC_DIALOGTOKEN_HASH_INDEX(pEntry->DialogToken);
- struct rt_tpc_req_entry *pProbeEntry = pTab->Hash[HashIdx];
-
- RTMP_SEM_LOCK(&pAd->CommonCfg.TpcReqTabLock);
- /* update Hash list */
- do {
- if (pProbeEntry == pEntry) {
- if (pPrevEntry == NULL) {
- pTab->Hash[HashIdx] = pEntry->pNext;
- } else {
- pPrevEntry->pNext = pEntry->pNext;
- }
- break;
- }
-
- pPrevEntry = pProbeEntry;
- pProbeEntry = pProbeEntry->pNext;
- } while (pProbeEntry);
-
- NdisZeroMemory(pEntry, sizeof(struct rt_tpc_req_entry));
- pTab->Size--;
-
- RTMP_SEM_UNLOCK(&pAd->CommonCfg.TpcReqTabLock);
- }
-
- return;
-}
-
-/*
- ==========================================================================
- Description:
- Get Current TimeS tamp.
-
- Parametrs:
-
- Return : Current Time Stamp.
- ==========================================================================
- */
-static u64 GetCurrentTimeStamp(struct rt_rtmp_adapter *pAd)
-{
- /* get current time stamp. */
- return 0;
-}
-
-/*
- ==========================================================================
- Description:
- Get Current Transmit Power.
-
- Parametrs:
-
- Return : Current Time Stamp.
- ==========================================================================
- */
-static u8 GetCurTxPwr(struct rt_rtmp_adapter *pAd, u8 Wcid)
-{
- return 16; /* 16 dBm */
-}
-
-/*
- ==========================================================================
- Description:
- Get Current Transmit Power.
-
- Parametrs:
-
- Return : Current Time Stamp.
- ==========================================================================
- */
-void InsertChannelRepIE(struct rt_rtmp_adapter *pAd,
- u8 *pFrameBuf,
- unsigned long *pFrameLen,
- char *pCountry, u8 RegulatoryClass)
-{
- unsigned long TempLen;
- u8 Len;
- u8 IEId = IE_AP_CHANNEL_REPORT;
- u8 *pChListPtr = NULL;
-
- Len = 1;
- if (strncmp(pCountry, "US", 2) == 0) {
- if (RegulatoryClass >= USA_REGULATORY_INFO_SIZE) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s: USA Unknow Requlatory class (%d)\n",
- __func__, RegulatoryClass));
- return;
- }
-
- Len +=
- USARegulatoryInfo[RegulatoryClass].ChannelSet.
- NumberOfChannels;
- pChListPtr =
- USARegulatoryInfo[RegulatoryClass].ChannelSet.ChannelList;
- } else if (strncmp(pCountry, "JP", 2) == 0) {
- if (RegulatoryClass >= JP_REGULATORY_INFO_SIZE) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s: JP Unknow Requlatory class (%d)\n",
- __func__, RegulatoryClass));
- return;
- }
-
- Len +=
- JapanRegulatoryInfo[RegulatoryClass].ChannelSet.
- NumberOfChannels;
- pChListPtr =
- JapanRegulatoryInfo[RegulatoryClass].ChannelSet.ChannelList;
- } else {
- DBGPRINT(RT_DEBUG_ERROR, ("%s: Unknow Country (%s)\n",
- __func__, pCountry));
- return;
- }
-
- MakeOutgoingFrame(pFrameBuf, &TempLen,
- 1, &IEId,
- 1, &Len,
- 1, &RegulatoryClass,
- Len - 1, pChListPtr, END_OF_ARGS);
-
- *pFrameLen = *pFrameLen + TempLen;
-
- return;
-}
-
-/*
- ==========================================================================
- Description:
- Insert Dialog Token into frame.
-
- Parametrs:
- 1. frame buffer pointer.
- 2. frame length.
- 3. Dialog token.
-
- Return : None.
- ==========================================================================
- */
-void InsertDialogToken(struct rt_rtmp_adapter *pAd,
- u8 *pFrameBuf,
- unsigned long *pFrameLen, u8 DialogToken)
-{
- unsigned long TempLen;
- MakeOutgoingFrame(pFrameBuf, &TempLen, 1, &DialogToken, END_OF_ARGS);
-
- *pFrameLen = *pFrameLen + TempLen;
-
- return;
-}
-
-/*
- ==========================================================================
- Description:
- Insert TPC Request IE into frame.
-
- Parametrs:
- 1. frame buffer pointer.
- 2. frame length.
-
- Return : None.
- ==========================================================================
- */
-static void InsertTpcReqIE(struct rt_rtmp_adapter *pAd,
- u8 *pFrameBuf, unsigned long *pFrameLen)
-{
- unsigned long TempLen;
- unsigned long Len = 0;
- u8 ElementID = IE_TPC_REQUEST;
-
- MakeOutgoingFrame(pFrameBuf, &TempLen,
- 1, &ElementID, 1, &Len, END_OF_ARGS);
-
- *pFrameLen = *pFrameLen + TempLen;
-
- return;
-}
-
-/*
- ==========================================================================
- Description:
- Insert TPC Report IE into frame.
-
- Parametrs:
- 1. frame buffer pointer.
- 2. frame length.
- 3. Transmit Power.
- 4. Link Margin.
-
- Return : None.
- ==========================================================================
- */
-void InsertTpcReportIE(struct rt_rtmp_adapter *pAd,
- u8 *pFrameBuf,
- unsigned long *pFrameLen,
- u8 TxPwr, u8 LinkMargin)
-{
- unsigned long TempLen;
- unsigned long Len = sizeof(struct rt_tpc_report_info);
- u8 ElementID = IE_TPC_REPORT;
- struct rt_tpc_report_info TpcReportIE;
-
- TpcReportIE.TxPwr = TxPwr;
- TpcReportIE.LinkMargin = LinkMargin;
-
- MakeOutgoingFrame(pFrameBuf, &TempLen,
- 1, &ElementID,
- 1, &Len, Len, &TpcReportIE, END_OF_ARGS);
-
- *pFrameLen = *pFrameLen + TempLen;
-
- return;
-}
-
-/*
- ==========================================================================
- Description:
- Insert Channel Switch Announcement IE into frame.
-
- Parametrs:
- 1. frame buffer pointer.
- 2. frame length.
- 3. channel switch announcement mode.
- 4. new selected channel.
- 5. channel switch announcement count.
-
- Return : None.
- ==========================================================================
- */
-static void InsertChSwAnnIE(struct rt_rtmp_adapter *pAd,
- u8 *pFrameBuf,
- unsigned long *pFrameLen,
- u8 ChSwMode,
- u8 NewChannel, u8 ChSwCnt)
-{
- unsigned long TempLen;
- unsigned long Len = sizeof(struct rt_ch_sw_ann_info);
- u8 ElementID = IE_CHANNEL_SWITCH_ANNOUNCEMENT;
- struct rt_ch_sw_ann_info ChSwAnnIE;
-
- ChSwAnnIE.ChSwMode = ChSwMode;
- ChSwAnnIE.Channel = NewChannel;
- ChSwAnnIE.ChSwCnt = ChSwCnt;
-
- MakeOutgoingFrame(pFrameBuf, &TempLen,
- 1, &ElementID, 1, &Len, Len, &ChSwAnnIE, END_OF_ARGS);
-
- *pFrameLen = *pFrameLen + TempLen;
-
- return;
-}
-
-/*
- ==========================================================================
- Description:
- Insert Measure Request IE into frame.
-
- Parametrs:
- 1. frame buffer pointer.
- 2. frame length.
- 3. Measure Token.
- 4. Measure Request Mode.
- 5. Measure Request Type.
- 6. Measure Channel.
- 7. Measure Start time.
- 8. Measure Duration.
-
- Return : None.
- ==========================================================================
- */
-static void InsertMeasureReqIE(struct rt_rtmp_adapter *pAd,
- u8 *pFrameBuf,
- unsigned long *pFrameLen,
- u8 Len, struct rt_measure_req_info * pMeasureReqIE)
-{
- unsigned long TempLen;
- u8 ElementID = IE_MEASUREMENT_REQUEST;
-
- MakeOutgoingFrame(pFrameBuf, &TempLen,
- 1, &ElementID,
- 1, &Len,
- sizeof(struct rt_measure_req_info), pMeasureReqIE, END_OF_ARGS);
-
- *pFrameLen = *pFrameLen + TempLen;
-
- return;
-}
-
-/*
- ==========================================================================
- Description:
- Insert Measure Report IE into frame.
-
- Parametrs:
- 1. frame buffer pointer.
- 2. frame length.
- 3. Measure Token.
- 4. Measure Request Mode.
- 5. Measure Request Type.
- 6. Length of Report Information
- 7. Pointer of Report Information Buffer.
-
- Return : None.
- ==========================================================================
- */
-static void InsertMeasureReportIE(struct rt_rtmp_adapter *pAd,
- u8 *pFrameBuf,
- unsigned long *pFrameLen,
- struct rt_measure_report_info * pMeasureReportIE,
- u8 ReportLnfoLen, u8 *pReportInfo)
-{
- unsigned long TempLen;
- unsigned long Len;
- u8 ElementID = IE_MEASUREMENT_REPORT;
-
- Len = sizeof(struct rt_measure_report_info) + ReportLnfoLen;
-
- MakeOutgoingFrame(pFrameBuf, &TempLen,
- 1, &ElementID,
- 1, &Len, Len, pMeasureReportIE, END_OF_ARGS);
-
- *pFrameLen = *pFrameLen + TempLen;
-
- if ((ReportLnfoLen > 0) && (pReportInfo != NULL)) {
- MakeOutgoingFrame(pFrameBuf + *pFrameLen, &TempLen,
- ReportLnfoLen, pReportInfo, END_OF_ARGS);
-
- *pFrameLen = *pFrameLen + TempLen;
- }
- return;
-}
-
-/*
- ==========================================================================
- Description:
- Prepare Measurement request action frame and enqueue it into
- management queue waiting for transmition.
-
- Parametrs:
- 1. the destination mac address of the frame.
-
- Return : None.
- ==========================================================================
- */
-void MakeMeasurementReqFrame(struct rt_rtmp_adapter *pAd,
- u8 *pOutBuffer,
- unsigned long *pFrameLen,
- u8 TotalLen,
- u8 Category,
- u8 Action,
- u8 MeasureToken,
- u8 MeasureReqMode,
- u8 MeasureReqType, u8 NumOfRepetitions)
-{
- unsigned long TempLen;
- struct rt_measure_req_info MeasureReqIE;
-
- InsertActField(pAd, (pOutBuffer + *pFrameLen), pFrameLen, Category,
- Action);
-
- /* fill Dialog Token */
- InsertDialogToken(pAd, (pOutBuffer + *pFrameLen), pFrameLen,
- MeasureToken);
-
- /* fill Number of repetitions. */
- if (Category == CATEGORY_RM) {
- MakeOutgoingFrame((pOutBuffer + *pFrameLen), &TempLen,
- 2, &NumOfRepetitions, END_OF_ARGS);
-
- *pFrameLen += TempLen;
- }
- /* prepare Measurement IE. */
- NdisZeroMemory(&MeasureReqIE, sizeof(struct rt_measure_req_info));
- MeasureReqIE.Token = MeasureToken;
- MeasureReqIE.ReqMode.word = MeasureReqMode;
- MeasureReqIE.ReqType = MeasureReqType;
- InsertMeasureReqIE(pAd, (pOutBuffer + *pFrameLen), pFrameLen,
- TotalLen, &MeasureReqIE);
-
- return;
-}
-
-/*
- ==========================================================================
- Description:
- Prepare Measurement report action frame and enqueue it into
- management queue waiting for transmition.
-
- Parametrs:
- 1. the destination mac address of the frame.
-
- Return : None.
- ==========================================================================
- */
-void EnqueueMeasurementRep(struct rt_rtmp_adapter *pAd,
- u8 *pDA,
- u8 DialogToken,
- u8 MeasureToken,
- u8 MeasureReqMode,
- u8 MeasureReqType,
- u8 ReportInfoLen, u8 *pReportInfo)
-{
- u8 *pOutBuffer = NULL;
- int NStatus;
- unsigned long FrameLen;
- struct rt_header_802_11 ActHdr;
- struct rt_measure_report_info MeasureRepIE;
-
- /* build action frame header. */
- MgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0, pDA,
- pAd->CurrentAddress);
-
- NStatus = MlmeAllocateMemory(pAd, (void *)& pOutBuffer); /*Get an unused nonpaged memory */
- if (NStatus != NDIS_STATUS_SUCCESS) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("%s() allocate memory failed \n", __func__));
- return;
- }
- NdisMoveMemory(pOutBuffer, (char *)& ActHdr, sizeof(struct rt_header_802_11));
- FrameLen = sizeof(struct rt_header_802_11);
-
- InsertActField(pAd, (pOutBuffer + FrameLen), &FrameLen,
- CATEGORY_SPECTRUM, SPEC_MRP);
-
- /* fill Dialog Token */
- InsertDialogToken(pAd, (pOutBuffer + FrameLen), &FrameLen, DialogToken);
-
- /* prepare Measurement IE. */
- NdisZeroMemory(&MeasureRepIE, sizeof(struct rt_measure_report_info));
- MeasureRepIE.Token = MeasureToken;
- MeasureRepIE.ReportMode = MeasureReqMode;
- MeasureRepIE.ReportType = MeasureReqType;
- InsertMeasureReportIE(pAd, (pOutBuffer + FrameLen), &FrameLen,
- &MeasureRepIE, ReportInfoLen, pReportInfo);
-
- MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);
- MlmeFreeMemory(pAd, pOutBuffer);
-
- return;
-}
-
-/*
- ==========================================================================
- Description:
- Prepare TPC Request action frame and enqueue it into
- management queue waiting for transmition.
-
- Parametrs:
- 1. the destination mac address of the frame.
-
- Return : None.
- ==========================================================================
- */
-void EnqueueTPCReq(struct rt_rtmp_adapter *pAd, u8 *pDA, u8 DialogToken)
-{
- u8 *pOutBuffer = NULL;
- int NStatus;
- unsigned long FrameLen;
-
- struct rt_header_802_11 ActHdr;
-
- /* build action frame header. */
- MgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0, pDA,
- pAd->CurrentAddress);
-
- NStatus = MlmeAllocateMemory(pAd, (void *)& pOutBuffer); /*Get an unused nonpaged memory */
- if (NStatus != NDIS_STATUS_SUCCESS) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("%s() allocate memory failed \n", __func__));
- return;
- }
- NdisMoveMemory(pOutBuffer, (char *)& ActHdr, sizeof(struct rt_header_802_11));
- FrameLen = sizeof(struct rt_header_802_11);
-
- InsertActField(pAd, (pOutBuffer + FrameLen), &FrameLen,
- CATEGORY_SPECTRUM, SPEC_TPCRQ);
-
- /* fill Dialog Token */
- InsertDialogToken(pAd, (pOutBuffer + FrameLen), &FrameLen, DialogToken);
-
- /* Insert TPC Request IE. */
- InsertTpcReqIE(pAd, (pOutBuffer + FrameLen), &FrameLen);
-
- MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);
- MlmeFreeMemory(pAd, pOutBuffer);
-
- return;
-}
-
-/*
- ==========================================================================
- Description:
- Prepare TPC Report action frame and enqueue it into
- management queue waiting for transmition.
-
- Parametrs:
- 1. the destination mac address of the frame.
-
- Return : None.
- ==========================================================================
- */
-void EnqueueTPCRep(struct rt_rtmp_adapter *pAd,
- u8 *pDA,
- u8 DialogToken, u8 TxPwr, u8 LinkMargin)
-{
- u8 *pOutBuffer = NULL;
- int NStatus;
- unsigned long FrameLen;
-
- struct rt_header_802_11 ActHdr;
-
- /* build action frame header. */
- MgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0, pDA,
- pAd->CurrentAddress);
-
- NStatus = MlmeAllocateMemory(pAd, (void *)& pOutBuffer); /*Get an unused nonpaged memory */
- if (NStatus != NDIS_STATUS_SUCCESS) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("%s() allocate memory failed \n", __func__));
- return;
- }
- NdisMoveMemory(pOutBuffer, (char *)& ActHdr, sizeof(struct rt_header_802_11));
- FrameLen = sizeof(struct rt_header_802_11);
-
- InsertActField(pAd, (pOutBuffer + FrameLen), &FrameLen,
- CATEGORY_SPECTRUM, SPEC_TPCRP);
-
- /* fill Dialog Token */
- InsertDialogToken(pAd, (pOutBuffer + FrameLen), &FrameLen, DialogToken);
-
- /* Insert TPC Request IE. */
- InsertTpcReportIE(pAd, (pOutBuffer + FrameLen), &FrameLen, TxPwr,
- LinkMargin);
-
- MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);
- MlmeFreeMemory(pAd, pOutBuffer);
-
- return;
-}
-
-/*
- ==========================================================================
- Description:
- Prepare Channel Switch Announcement action frame and enqueue it into
- management queue waiting for transmition.
-
- Parametrs:
- 1. the destination mac address of the frame.
- 2. Channel switch announcement mode.
- 2. a New selected channel.
-
- Return : None.
- ==========================================================================
- */
-void EnqueueChSwAnn(struct rt_rtmp_adapter *pAd,
- u8 *pDA, u8 ChSwMode, u8 NewCh)
-{
- u8 *pOutBuffer = NULL;
- int NStatus;
- unsigned long FrameLen;
-
- struct rt_header_802_11 ActHdr;
-
- /* build action frame header. */
- MgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0, pDA,
- pAd->CurrentAddress);
-
- NStatus = MlmeAllocateMemory(pAd, (void *)& pOutBuffer); /*Get an unused nonpaged memory */
- if (NStatus != NDIS_STATUS_SUCCESS) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("%s() allocate memory failed \n", __func__));
- return;
- }
- NdisMoveMemory(pOutBuffer, (char *)& ActHdr, sizeof(struct rt_header_802_11));
- FrameLen = sizeof(struct rt_header_802_11);
-
- InsertActField(pAd, (pOutBuffer + FrameLen), &FrameLen,
- CATEGORY_SPECTRUM, SPEC_CHANNEL_SWITCH);
-
- InsertChSwAnnIE(pAd, (pOutBuffer + FrameLen), &FrameLen, ChSwMode,
- NewCh, 0);
-
- MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);
- MlmeFreeMemory(pAd, pOutBuffer);
-
- return;
-}
-
-static BOOLEAN DfsRequirementCheck(struct rt_rtmp_adapter *pAd, u8 Channel)
-{
- BOOLEAN Result = FALSE;
- int i;
-
- do {
- /* check DFS procedure is running. */
- /* make sure DFS procedure won't start twice. */
- if (pAd->CommonCfg.RadarDetect.RDMode != RD_NORMAL_MODE) {
- Result = FALSE;
- break;
- }
- /* check the new channel carried from Channel Switch Announcemnet is valid. */
- for (i = 0; i < pAd->ChannelListNum; i++) {
- if ((Channel == pAd->ChannelList[i].Channel)
- && (pAd->ChannelList[i].RemainingTimeForUse == 0)) {
- /* found radar signal in the channel. the channel can't use at least for 30 minutes. */
- pAd->ChannelList[i].RemainingTimeForUse = 1800; /*30 min = 1800 sec */
- Result = TRUE;
- break;
- }
- }
- } while (FALSE);
-
- return Result;
-}
-
-void NotifyChSwAnnToPeerAPs(struct rt_rtmp_adapter *pAd,
- u8 *pRA,
- u8 *pTA, u8 ChSwMode, u8 Channel)
-{
-}
-
-static void StartDFSProcedure(struct rt_rtmp_adapter *pAd,
- u8 Channel, u8 ChSwMode)
-{
- /* start DFS procedure */
- pAd->CommonCfg.Channel = Channel;
-
- N_ChannelCheck(pAd);
-
- pAd->CommonCfg.RadarDetect.RDMode = RD_SWITCHING_MODE;
- pAd->CommonCfg.RadarDetect.CSCount = 0;
-}
-
-/*
- ==========================================================================
- Description:
- Channel Switch Announcement action frame sanity check.
-
- Parametrs:
- 1. MLME message containing the received frame
- 2. message length.
- 3. Channel switch announcement information buffer.
-
- Return : None.
- ==========================================================================
- */
-
-/*
- Channel Switch Announcement IE.
- +----+-----+-----------+------------+-----------+
- | ID | Len |Ch Sw Mode | New Ch Num | Ch Sw Cnt |
- +----+-----+-----------+------------+-----------+
- 1 1 1 1 1
-*/
-static BOOLEAN PeerChSwAnnSanity(struct rt_rtmp_adapter *pAd,
- void * pMsg,
- unsigned long MsgLen,
- struct rt_ch_sw_ann_info * pChSwAnnInfo)
-{
- struct rt_frame_802_11 * Fr = (struct rt_frame_802_11 *) pMsg;
- u8 *pFramePtr = Fr->Octet;
- BOOLEAN result = FALSE;
- struct rt_eid * eid_ptr;
-
- /* skip 802.11 header. */
- MsgLen -= sizeof(struct rt_header_802_11);
-
- /* skip category and action code. */
- pFramePtr += 2;
- MsgLen -= 2;
-
- if (pChSwAnnInfo == NULL)
- return result;
-
- eid_ptr = (struct rt_eid *) pFramePtr;
- while (((u8 *) eid_ptr + eid_ptr->Len + 1) <
- ((u8 *)pFramePtr + MsgLen)) {
- switch (eid_ptr->Eid) {
- case IE_CHANNEL_SWITCH_ANNOUNCEMENT:
- NdisMoveMemory(&pChSwAnnInfo->ChSwMode, eid_ptr->Octet,
- 1);
- NdisMoveMemory(&pChSwAnnInfo->Channel,
- eid_ptr->Octet + 1, 1);
- NdisMoveMemory(&pChSwAnnInfo->ChSwCnt,
- eid_ptr->Octet + 2, 1);
-
- result = TRUE;
- break;
-
- default:
- break;
- }
- eid_ptr = (struct rt_eid *) ((u8 *) eid_ptr + 2 + eid_ptr->Len);
- }
-
- return result;
-}
-
-/*
- ==========================================================================
- Description:
- Measurement request action frame sanity check.
-
- Parametrs:
- 1. MLME message containing the received frame
- 2. message length.
- 3. Measurement request information buffer.
-
- Return : None.
- ==========================================================================
- */
-static BOOLEAN PeerMeasureReqSanity(struct rt_rtmp_adapter *pAd,
- void * pMsg,
- unsigned long MsgLen,
- u8 *pDialogToken,
- struct rt_measure_req_info * pMeasureReqInfo,
- struct rt_measure_req * pMeasureReq)
-{
- struct rt_frame_802_11 * Fr = (struct rt_frame_802_11 *) pMsg;
- u8 *pFramePtr = Fr->Octet;
- BOOLEAN result = FALSE;
- struct rt_eid * eid_ptr;
- u8 *ptr;
- u64 MeasureStartTime;
- u16 MeasureDuration;
-
- /* skip 802.11 header. */
- MsgLen -= sizeof(struct rt_header_802_11);
-
- /* skip category and action code. */
- pFramePtr += 2;
- MsgLen -= 2;
-
- if (pMeasureReqInfo == NULL)
- return result;
-
- NdisMoveMemory(pDialogToken, pFramePtr, 1);
- pFramePtr += 1;
- MsgLen -= 1;
-
- eid_ptr = (struct rt_eid *) pFramePtr;
- while (((u8 *) eid_ptr + eid_ptr->Len + 1) <
- ((u8 *)pFramePtr + MsgLen)) {
- switch (eid_ptr->Eid) {
- case IE_MEASUREMENT_REQUEST:
- NdisMoveMemory(&pMeasureReqInfo->Token, eid_ptr->Octet,
- 1);
- NdisMoveMemory(&pMeasureReqInfo->ReqMode.word,
- eid_ptr->Octet + 1, 1);
- NdisMoveMemory(&pMeasureReqInfo->ReqType,
- eid_ptr->Octet + 2, 1);
- ptr = (u8 *)(eid_ptr->Octet + 3);
- NdisMoveMemory(&pMeasureReq->ChNum, ptr, 1);
- NdisMoveMemory(&MeasureStartTime, ptr + 1, 8);
- pMeasureReq->MeasureStartTime =
- SWAP64(MeasureStartTime);
- NdisMoveMemory(&MeasureDuration, ptr + 9, 2);
- pMeasureReq->MeasureDuration = SWAP16(MeasureDuration);
-
- result = TRUE;
- break;
-
- default:
- break;
- }
- eid_ptr = (struct rt_eid *) ((u8 *) eid_ptr + 2 + eid_ptr->Len);
- }
-
- return result;
-}
-
-/*
- ==========================================================================
- Description:
- Measurement report action frame sanity check.
-
- Parametrs:
- 1. MLME message containing the received frame
- 2. message length.
- 3. Measurement report information buffer.
- 4. basic report information buffer.
-
- Return : None.
- ==========================================================================
- */
-
-/*
- Measurement Report IE.
- +----+-----+-------+-------------+--------------+----------------+
- | ID | Len | Token | Report Mode | Measure Type | Measure Report |
- +----+-----+-------+-------------+--------------+----------------+
- 1 1 1 1 1 variable
-
- Basic Report.
- +--------+------------+----------+-----+
- | Ch Num | Start Time | Duration | Map |
- +--------+------------+----------+-----+
- 1 8 2 1
-
- Map Field Bit Format.
- +-----+---------------+---------------------+-------+------------+----------+
- | Bss | OFDM Preamble | Unidentified signal | Radar | Unmeasured | Reserved |
- +-----+---------------+---------------------+-------+------------+----------+
- 0 1 2 3 4 5-7
-*/
-static BOOLEAN PeerMeasureReportSanity(struct rt_rtmp_adapter *pAd,
- void * pMsg,
- unsigned long MsgLen,
- u8 *pDialogToken,
- struct rt_measure_report_info *
- pMeasureReportInfo,
- u8 *pReportBuf)
-{
- struct rt_frame_802_11 * Fr = (struct rt_frame_802_11 *) pMsg;
- u8 *pFramePtr = Fr->Octet;
- BOOLEAN result = FALSE;
- struct rt_eid * eid_ptr;
- u8 *ptr;
-
- /* skip 802.11 header. */
- MsgLen -= sizeof(struct rt_header_802_11);
-
- /* skip category and action code. */
- pFramePtr += 2;
- MsgLen -= 2;
-
- if (pMeasureReportInfo == NULL)
- return result;
-
- NdisMoveMemory(pDialogToken, pFramePtr, 1);
- pFramePtr += 1;
- MsgLen -= 1;
-
- eid_ptr = (struct rt_eid *) pFramePtr;
- while (((u8 *) eid_ptr + eid_ptr->Len + 1) <
- ((u8 *)pFramePtr + MsgLen)) {
- switch (eid_ptr->Eid) {
- case IE_MEASUREMENT_REPORT:
- NdisMoveMemory(&pMeasureReportInfo->Token,
- eid_ptr->Octet, 1);
- NdisMoveMemory(&pMeasureReportInfo->ReportMode,
- eid_ptr->Octet + 1, 1);
- NdisMoveMemory(&pMeasureReportInfo->ReportType,
- eid_ptr->Octet + 2, 1);
- if (pMeasureReportInfo->ReportType == RM_BASIC) {
- struct rt_measure_basic_report * pReport =
- (struct rt_measure_basic_report *) pReportBuf;
- ptr = (u8 *)(eid_ptr->Octet + 3);
- NdisMoveMemory(&pReport->ChNum, ptr, 1);
- NdisMoveMemory(&pReport->MeasureStartTime,
- ptr + 1, 8);
- NdisMoveMemory(&pReport->MeasureDuration,
- ptr + 9, 2);
- NdisMoveMemory(&pReport->Map, ptr + 11, 1);
-
- } else if (pMeasureReportInfo->ReportType == RM_CCA) {
- struct rt_measure_cca_report * pReport =
- (struct rt_measure_cca_report *) pReportBuf;
- ptr = (u8 *)(eid_ptr->Octet + 3);
- NdisMoveMemory(&pReport->ChNum, ptr, 1);
- NdisMoveMemory(&pReport->MeasureStartTime,
- ptr + 1, 8);
- NdisMoveMemory(&pReport->MeasureDuration,
- ptr + 9, 2);
- NdisMoveMemory(&pReport->CCA_Busy_Fraction,
- ptr + 11, 1);
-
- } else if (pMeasureReportInfo->ReportType ==
- RM_RPI_HISTOGRAM) {
- struct rt_measure_rpi_report * pReport =
- (struct rt_measure_rpi_report *) pReportBuf;
- ptr = (u8 *)(eid_ptr->Octet + 3);
- NdisMoveMemory(&pReport->ChNum, ptr, 1);
- NdisMoveMemory(&pReport->MeasureStartTime,
- ptr + 1, 8);
- NdisMoveMemory(&pReport->MeasureDuration,
- ptr + 9, 2);
- NdisMoveMemory(&pReport->RPI_Density, ptr + 11,
- 8);
- }
- result = TRUE;
- break;
-
- default:
- break;
- }
- eid_ptr = (struct rt_eid *) ((u8 *) eid_ptr + 2 + eid_ptr->Len);
- }
-
- return result;
-}
-
-/*
- ==========================================================================
- Description:
- TPC Request action frame sanity check.
-
- Parametrs:
- 1. MLME message containing the received frame
- 2. message length.
- 3. Dialog Token.
-
- Return : None.
- ==========================================================================
- */
-static BOOLEAN PeerTpcReqSanity(struct rt_rtmp_adapter *pAd,
- void * pMsg,
- unsigned long MsgLen, u8 *pDialogToken)
-{
- struct rt_frame_802_11 * Fr = (struct rt_frame_802_11 *) pMsg;
- u8 *pFramePtr = Fr->Octet;
- BOOLEAN result = FALSE;
- struct rt_eid * eid_ptr;
-
- MsgLen -= sizeof(struct rt_header_802_11);
-
- /* skip category and action code. */
- pFramePtr += 2;
- MsgLen -= 2;
-
- if (pDialogToken == NULL)
- return result;
-
- NdisMoveMemory(pDialogToken, pFramePtr, 1);
- pFramePtr += 1;
- MsgLen -= 1;
-
- eid_ptr = (struct rt_eid *) pFramePtr;
- while (((u8 *) eid_ptr + eid_ptr->Len + 1) <
- ((u8 *)pFramePtr + MsgLen)) {
- switch (eid_ptr->Eid) {
- case IE_TPC_REQUEST:
- result = TRUE;
- break;
-
- default:
- break;
- }
- eid_ptr = (struct rt_eid *) ((u8 *) eid_ptr + 2 + eid_ptr->Len);
- }
-
- return result;
-}
-
-/*
- ==========================================================================
- Description:
- TPC Report action frame sanity check.
-
- Parametrs:
- 1. MLME message containing the received frame
- 2. message length.
- 3. Dialog Token.
- 4. TPC Report IE.
-
- Return : None.
- ==========================================================================
- */
-static BOOLEAN PeerTpcRepSanity(struct rt_rtmp_adapter *pAd,
- void * pMsg,
- unsigned long MsgLen,
- u8 *pDialogToken,
- struct rt_tpc_report_info * pTpcRepInfo)
-{
- struct rt_frame_802_11 * Fr = (struct rt_frame_802_11 *) pMsg;
- u8 *pFramePtr = Fr->Octet;
- BOOLEAN result = FALSE;
- struct rt_eid * eid_ptr;
-
- MsgLen -= sizeof(struct rt_header_802_11);
-
- /* skip category and action code. */
- pFramePtr += 2;
- MsgLen -= 2;
-
- if (pDialogToken == NULL)
- return result;
-
- NdisMoveMemory(pDialogToken, pFramePtr, 1);
- pFramePtr += 1;
- MsgLen -= 1;
-
- eid_ptr = (struct rt_eid *) pFramePtr;
- while (((u8 *) eid_ptr + eid_ptr->Len + 1) <
- ((u8 *)pFramePtr + MsgLen)) {
- switch (eid_ptr->Eid) {
- case IE_TPC_REPORT:
- NdisMoveMemory(&pTpcRepInfo->TxPwr, eid_ptr->Octet, 1);
- NdisMoveMemory(&pTpcRepInfo->LinkMargin,
- eid_ptr->Octet + 1, 1);
- result = TRUE;
- break;
-
- default:
- break;
- }
- eid_ptr = (struct rt_eid *) ((u8 *) eid_ptr + 2 + eid_ptr->Len);
- }
-
- return result;
-}
-
-/*
- ==========================================================================
- Description:
- Channel Switch Announcement action frame handler.
-
- Parametrs:
- Elme - MLME message containing the received frame
-
- Return : None.
- ==========================================================================
- */
-static void PeerChSwAnnAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
- struct rt_ch_sw_ann_info ChSwAnnInfo;
- struct rt_frame_802_11 * pFr = (struct rt_frame_802_11 *) Elem->Msg;
- u8 index = 0, Channel = 0, NewChannel = 0;
- unsigned long Bssidx = 0;
-
- NdisZeroMemory(&ChSwAnnInfo, sizeof(struct rt_ch_sw_ann_info));
- if (!PeerChSwAnnSanity(pAd, Elem->Msg, Elem->MsgLen, &ChSwAnnInfo)) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("Invalid Channel Switch Action Frame.\n"));
- return;
- }
-
- if (pAd->OpMode == OPMODE_STA) {
- Bssidx =
- BssTableSearch(&pAd->ScanTab, pFr->Hdr.Addr3,
- pAd->CommonCfg.Channel);
- if (Bssidx == BSS_NOT_FOUND) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("PeerChSwAnnAction - Bssidx is not found\n"));
- return;
- }
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("\n****Bssidx is %d, Channel = %d\n", index,
- pAd->ScanTab.BssEntry[Bssidx].Channel));
- hex_dump("SSID", pAd->ScanTab.BssEntry[Bssidx].Bssid, 6);
-
- Channel = pAd->CommonCfg.Channel;
- NewChannel = ChSwAnnInfo.Channel;
-
- if ((pAd->CommonCfg.bIEEE80211H == 1) && (NewChannel != 0)
- && (Channel != NewChannel)) {
- /* Switching to channel 1 can prevent from rescanning the current channel immediately (by auto reconnection). */
- /* In addition, clear the MLME queue and the scan table to discard the RX packets and previous scanning results. */
- AsicSwitchChannel(pAd, 1, FALSE);
- AsicLockChannel(pAd, 1);
- LinkDown(pAd, FALSE);
- MlmeQueueInit(&pAd->Mlme.Queue);
- BssTableInit(&pAd->ScanTab);
- RTMPusecDelay(1000000); /* use delay to prevent STA do reassoc */
-
- /* channel sanity check */
- for (index = 0; index < pAd->ChannelListNum; index++) {
- if (pAd->ChannelList[index].Channel ==
- NewChannel) {
- pAd->ScanTab.BssEntry[Bssidx].Channel =
- NewChannel;
- pAd->CommonCfg.Channel = NewChannel;
- AsicSwitchChannel(pAd,
- pAd->CommonCfg.
- Channel, FALSE);
- AsicLockChannel(pAd,
- pAd->CommonCfg.Channel);
- DBGPRINT(RT_DEBUG_TRACE,
- ("&&&&&&&&&&&&&&&&PeerChSwAnnAction - STA receive channel switch announcement IE (New Channel =%d)\n",
- NewChannel));
- break;
- }
- }
-
- if (index >= pAd->ChannelListNum) {
- DBGPRINT_ERR("&&&&&&&&&&&&&&&&&&&&&&&&&&PeerChSwAnnAction(can not find New Channel=%d in ChannelList[%d]\n", pAd->CommonCfg.Channel, pAd->ChannelListNum);
- }
- }
- }
-
- return;
-}
-
-/*
- ==========================================================================
- Description:
- Measurement Request action frame handler.
-
- Parametrs:
- Elme - MLME message containing the received frame
-
- Return : None.
- ==========================================================================
- */
-static void PeerMeasureReqAction(struct rt_rtmp_adapter *pAd,
- struct rt_mlme_queue_elem *Elem)
-{
- struct rt_frame_802_11 * pFr = (struct rt_frame_802_11 *) Elem->Msg;
- u8 DialogToken;
- struct rt_measure_req_info MeasureReqInfo;
- struct rt_measure_req MeasureReq;
- MEASURE_REPORT_MODE ReportMode;
-
- if (PeerMeasureReqSanity
- (pAd, Elem->Msg, Elem->MsgLen, &DialogToken, &MeasureReqInfo,
- &MeasureReq)) {
- ReportMode.word = 0;
- ReportMode.field.Incapable = 1;
- EnqueueMeasurementRep(pAd, pFr->Hdr.Addr2, DialogToken,
- MeasureReqInfo.Token, ReportMode.word,
- MeasureReqInfo.ReqType, 0, NULL);
- }
-
- return;
-}
-
-/*
- ==========================================================================
- Description:
- Measurement Report action frame handler.
-
- Parametrs:
- Elme - MLME message containing the received frame
-
- Return : None.
- ==========================================================================
- */
-static void PeerMeasureReportAction(struct rt_rtmp_adapter *pAd,
- struct rt_mlme_queue_elem *Elem)
-{
- struct rt_measure_report_info MeasureReportInfo;
- struct rt_frame_802_11 * pFr = (struct rt_frame_802_11 *) Elem->Msg;
- u8 DialogToken;
- u8 *pMeasureReportInfo;
-
-/* if (pAd->CommonCfg.bIEEE80211H != TRUE) */
-/* return; */
-
- pMeasureReportInfo = kmalloc(sizeof(struct rt_measure_rpi_report), GFP_ATOMIC);
- if (pMeasureReportInfo == NULL) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s unable to alloc memory for measure report buffer (size=%zu).\n",
- __func__, sizeof(struct rt_measure_rpi_report)));
- return;
- }
-
- NdisZeroMemory(&MeasureReportInfo, sizeof(struct rt_measure_report_info));
- NdisZeroMemory(pMeasureReportInfo, sizeof(struct rt_measure_rpi_report));
- if (PeerMeasureReportSanity
- (pAd, Elem->Msg, Elem->MsgLen, &DialogToken, &MeasureReportInfo,
- pMeasureReportInfo)) {
- do {
- struct rt_measure_req_entry *pEntry = NULL;
-
- /* Not a autonomous measure report. */
- /* check the dialog token field. drop it if the dialog token doesn't match. */
- if ((DialogToken != 0)
- && ((pEntry = MeasureReqLookUp(pAd, DialogToken)) ==
- NULL))
- break;
-
- if (pEntry != NULL)
- MeasureReqDelete(pAd, pEntry->DialogToken);
-
- if (MeasureReportInfo.ReportType == RM_BASIC) {
- struct rt_measure_basic_report * pBasicReport =
- (struct rt_measure_basic_report *) pMeasureReportInfo;
- if ((pBasicReport->Map.field.Radar)
- &&
- (DfsRequirementCheck
- (pAd, pBasicReport->ChNum) == TRUE)) {
- NotifyChSwAnnToPeerAPs(pAd,
- pFr->Hdr.Addr1,
- pFr->Hdr.Addr2,
- 1,
- pBasicReport->
- ChNum);
- StartDFSProcedure(pAd,
- pBasicReport->ChNum,
- 1);
- }
- }
- } while (FALSE);
- } else
- DBGPRINT(RT_DEBUG_TRACE,
- ("Invalid Measurement Report Frame.\n"));
-
- kfree(pMeasureReportInfo);
-
- return;
-}
-
-/*
- ==========================================================================
- Description:
- TPC Request action frame handler.
-
- Parametrs:
- Elme - MLME message containing the received frame
-
- Return : None.
- ==========================================================================
- */
-static void PeerTpcReqAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
- struct rt_frame_802_11 * pFr = (struct rt_frame_802_11 *) Elem->Msg;
- u8 *pFramePtr = pFr->Octet;
- u8 DialogToken;
- u8 TxPwr = GetCurTxPwr(pAd, Elem->Wcid);
- u8 LinkMargin = 0;
- char RealRssi;
-
- /* link margin: Ratio of the received signal power to the minimum desired by the station (STA). The */
- /* STA may incorporate rate information and channel conditions, including interference, into its computation */
- /* of link margin. */
-
- RealRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0),
- ConvertToRssi(pAd, Elem->Rssi1, RSSI_1),
- ConvertToRssi(pAd, Elem->Rssi2, RSSI_2));
-
- /* skip Category and action code. */
- pFramePtr += 2;
-
- /* Dialog token. */
- NdisMoveMemory(&DialogToken, pFramePtr, 1);
-
- LinkMargin = (RealRssi / MIN_RCV_PWR);
- if (PeerTpcReqSanity(pAd, Elem->Msg, Elem->MsgLen, &DialogToken))
- EnqueueTPCRep(pAd, pFr->Hdr.Addr2, DialogToken, TxPwr,
- LinkMargin);
-
- return;
-}
-
-/*
- ==========================================================================
- Description:
- TPC Report action frame handler.
-
- Parametrs:
- Elme - MLME message containing the received frame
-
- Return : None.
- ==========================================================================
- */
-static void PeerTpcRepAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
- u8 DialogToken;
- struct rt_tpc_report_info TpcRepInfo;
- struct rt_tpc_req_entry *pEntry = NULL;
-
- NdisZeroMemory(&TpcRepInfo, sizeof(struct rt_tpc_report_info));
- if (PeerTpcRepSanity
- (pAd, Elem->Msg, Elem->MsgLen, &DialogToken, &TpcRepInfo)) {
- pEntry = TpcReqLookUp(pAd, DialogToken);
- if (pEntry != NULL) {
- TpcReqDelete(pAd, pEntry->DialogToken);
- DBGPRINT(RT_DEBUG_TRACE,
- ("%s: DialogToken=%x, TxPwr=%d, LinkMargin=%d\n",
- __func__, DialogToken, TpcRepInfo.TxPwr,
- TpcRepInfo.LinkMargin));
- }
- }
-
- return;
-}
-
-/*
- ==========================================================================
- Description:
- Spectrun action frames Handler such as channel switch annoucement,
- measurement report, measurement request actions frames.
-
- Parametrs:
- Elme - MLME message containing the received frame
-
- Return : None.
- ==========================================================================
- */
-void PeerSpectrumAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
-{
-
- u8 Action = Elem->Msg[LENGTH_802_11 + 1];
-
- if (pAd->CommonCfg.bIEEE80211H != TRUE)
- return;
-
- switch (Action) {
- case SPEC_MRQ:
- /* current rt2860 unable do such measure specified in Measurement Request. */
- /* reject all measurement request. */
- PeerMeasureReqAction(pAd, Elem);
- break;
-
- case SPEC_MRP:
- PeerMeasureReportAction(pAd, Elem);
- break;
-
- case SPEC_TPCRQ:
- PeerTpcReqAction(pAd, Elem);
- break;
-
- case SPEC_TPCRP:
- PeerTpcRepAction(pAd, Elem);
- break;
-
- case SPEC_CHANNEL_SWITCH:
-
- PeerChSwAnnAction(pAd, Elem);
- break;
- }
-
- return;
-}
-
-/*
- ==========================================================================
- Description:
-
- Parametrs:
-
- Return : None.
- ==========================================================================
- */
-int Set_MeasureReq_Proc(struct rt_rtmp_adapter *pAd, char *arg)
-{
- u32 Aid = 1;
- u32 ArgIdx;
- char *thisChar;
-
- MEASURE_REQ_MODE MeasureReqMode;
- u8 MeasureReqToken = RandomByte(pAd);
- u8 MeasureReqType = RM_BASIC;
- u8 MeasureCh = 1;
- u64 MeasureStartTime = GetCurrentTimeStamp(pAd);
- struct rt_measure_req MeasureReq;
- u8 TotalLen;
-
- struct rt_header_802_11 ActHdr;
- u8 *pOutBuffer = NULL;
- int NStatus;
- unsigned long FrameLen;
-
- NStatus = MlmeAllocateMemory(pAd, (void *)& pOutBuffer); /*Get an unused nonpaged memory */
- if (NStatus != NDIS_STATUS_SUCCESS) {
- DBGPRINT(RT_DEBUG_TRACE,
- ("%s() allocate memory failed \n", __func__));
- goto END_OF_MEASURE_REQ;
- }
-
- ArgIdx = 1;
- while ((thisChar = strsep((char **)&arg, "-")) != NULL) {
- switch (ArgIdx) {
- case 1: /* Aid. */
- Aid = (u8)simple_strtol(thisChar, 0, 16);
- break;
-
- case 2: /* Measurement Request Type. */
- MeasureReqType = simple_strtol(thisChar, 0, 16);
- if (MeasureReqType > 3) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s: unknow MeasureReqType(%d)\n",
- __func__, MeasureReqType));
- goto END_OF_MEASURE_REQ;
- }
- break;
-
- case 3: /* Measurement channel. */
- MeasureCh = (u8)simple_strtol(thisChar, 0, 16);
- break;
- }
- ArgIdx++;
- }
-
- DBGPRINT(RT_DEBUG_TRACE,
- ("%s::Aid = %d, MeasureReqType=%d MeasureCh=%d\n", __func__,
- Aid, MeasureReqType, MeasureCh));
- if (!VALID_WCID(Aid)) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s: unknow sta of Aid(%d)\n", __func__, Aid));
- goto END_OF_MEASURE_REQ;
- }
-
- MeasureReqMode.word = 0;
- MeasureReqMode.field.Enable = 1;
-
- MeasureReqInsert(pAd, MeasureReqToken);
-
- /* build action frame header. */
- MgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0,
- pAd->MacTab.Content[Aid].Addr, pAd->CurrentAddress);
-
- NdisMoveMemory(pOutBuffer, (char *)& ActHdr, sizeof(struct rt_header_802_11));
- FrameLen = sizeof(struct rt_header_802_11);
-
- TotalLen = sizeof(struct rt_measure_req_info) + sizeof(struct rt_measure_req);
-
- MakeMeasurementReqFrame(pAd, pOutBuffer, &FrameLen,
- sizeof(struct rt_measure_req_info), CATEGORY_RM, RM_BASIC,
- MeasureReqToken, MeasureReqMode.word,
- MeasureReqType, 0);
-
- MeasureReq.ChNum = MeasureCh;
- MeasureReq.MeasureStartTime = cpu2le64(MeasureStartTime);
- MeasureReq.MeasureDuration = cpu2le16(2000);
-
- {
- unsigned long TempLen;
- MakeOutgoingFrame(pOutBuffer + FrameLen, &TempLen,
- sizeof(struct rt_measure_req), &MeasureReq,
- END_OF_ARGS);
- FrameLen += TempLen;
- }
-
- MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, (u32)FrameLen);
-
-END_OF_MEASURE_REQ:
- MlmeFreeMemory(pAd, pOutBuffer);
-
- return TRUE;
-}
-
-int Set_TpcReq_Proc(struct rt_rtmp_adapter *pAd, char *arg)
-{
- u32 Aid;
-
- u8 TpcReqToken = RandomByte(pAd);
-
- Aid = (u32)simple_strtol(arg, 0, 16);
-
- DBGPRINT(RT_DEBUG_TRACE, ("%s::Aid = %d\n", __func__, Aid));
- if (!VALID_WCID(Aid)) {
- DBGPRINT(RT_DEBUG_ERROR,
- ("%s: unknow sta of Aid(%d)\n", __func__, Aid));
- return TRUE;
- }
-
- TpcReqInsert(pAd, TpcReqToken);
-
- EnqueueTPCReq(pAd, pAd->MacTab.Content[Aid].Addr, TpcReqToken);
-
- return TRUE;
-}