···11-/*22- *************************************************************************33- * Ralink Tech Inc.44- * 5F., No.36, Taiyuan St., Jhubei City,55- * Hsinchu County 302,66- * Taiwan, R.O.C.77- *88- * (c) Copyright 2002-2007, Ralink Technology, Inc.99- *1010- * This program is free software; you can redistribute it and/or modify *1111- * it under the terms of the GNU General Public License as published by *1212- * the Free Software Foundation; either version 2 of the License, or *1313- * (at your option) any later version. *1414- * *1515- * This program is distributed in the hope that it will be useful, *1616- * but WITHOUT ANY WARRANTY; without even the implied warranty of *1717- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *1818- * GNU General Public License for more details. *1919- * *2020- * You should have received a copy of the GNU General Public License *2121- * along with this program; if not, write to the *2222- * Free Software Foundation, Inc., *2323- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *2424- * *2525- *************************************************************************2626-2727- Module Name:2828- action.c2929-3030- Abstract:3131- Handle association related requests either from WSTA or from local MLME3232-3333- Revision History:3434- Who When What3535- -------- ---------- ----------------------------------------------3636- Jan Lee 2006 created for rt28603737- */3838-3939-#include "../rt_config.h"4040-#include "action.h"4141-4242-4343-static VOID ReservedAction(4444- IN PRTMP_ADAPTER pAd,4545- IN MLME_QUEUE_ELEM *Elem);4646-4747-/*4848- ==========================================================================4949- Description:5050- association state machine init, including state transition and timer init5151- Parameters:5252- S - pointer to the association state machine5353- Note:5454- The state machine looks like the following5555-5656- ASSOC_IDLE5757- MT2_MLME_DISASSOC_REQ mlme_disassoc_req_action5858- MT2_PEER_DISASSOC_REQ peer_disassoc_action5959- MT2_PEER_ASSOC_REQ drop6060- MT2_PEER_REASSOC_REQ drop6161- MT2_CLS3ERR cls3err_action6262- ==========================================================================6363- */6464-VOID ActionStateMachineInit(6565- IN PRTMP_ADAPTER pAd,6666- IN STATE_MACHINE *S,6767- OUT STATE_MACHINE_FUNC Trans[])6868-{6969- StateMachineInit(S, (STATE_MACHINE_FUNC *)Trans, MAX_ACT_STATE, MAX_ACT_MSG, (STATE_MACHINE_FUNC)Drop, ACT_IDLE, ACT_MACHINE_BASE);7070-7171- StateMachineSetAction(S, ACT_IDLE, MT2_PEER_SPECTRUM_CATE, (STATE_MACHINE_FUNC)PeerSpectrumAction);7272- StateMachineSetAction(S, ACT_IDLE, MT2_PEER_QOS_CATE, (STATE_MACHINE_FUNC)PeerQOSAction);7373-7474- StateMachineSetAction(S, ACT_IDLE, MT2_PEER_DLS_CATE, (STATE_MACHINE_FUNC)ReservedAction);7575-7676- StateMachineSetAction(S, ACT_IDLE, MT2_PEER_BA_CATE, (STATE_MACHINE_FUNC)PeerBAAction);7777- StateMachineSetAction(S, ACT_IDLE, MT2_PEER_HT_CATE, (STATE_MACHINE_FUNC)PeerHTAction);7878- StateMachineSetAction(S, ACT_IDLE, MT2_MLME_ADD_BA_CATE, (STATE_MACHINE_FUNC)MlmeADDBAAction);7979- StateMachineSetAction(S, ACT_IDLE, MT2_MLME_ORI_DELBA_CATE, (STATE_MACHINE_FUNC)MlmeDELBAAction);8080- StateMachineSetAction(S, ACT_IDLE, MT2_MLME_REC_DELBA_CATE, (STATE_MACHINE_FUNC)MlmeDELBAAction);8181-8282- StateMachineSetAction(S, ACT_IDLE, MT2_PEER_PUBLIC_CATE, (STATE_MACHINE_FUNC)PeerPublicAction);8383- StateMachineSetAction(S, ACT_IDLE, MT2_PEER_RM_CATE, (STATE_MACHINE_FUNC)PeerRMAction);8484-8585- StateMachineSetAction(S, ACT_IDLE, MT2_MLME_QOS_CATE, (STATE_MACHINE_FUNC)MlmeQOSAction);8686- StateMachineSetAction(S, ACT_IDLE, MT2_MLME_DLS_CATE, (STATE_MACHINE_FUNC)MlmeDLSAction);8787- StateMachineSetAction(S, ACT_IDLE, MT2_ACT_INVALID, (STATE_MACHINE_FUNC)MlmeInvalidAction);8888-}8989-9090-VOID MlmeADDBAAction(9191- IN PRTMP_ADAPTER pAd,9292- IN MLME_QUEUE_ELEM *Elem)9393-9494-{9595- MLME_ADDBA_REQ_STRUCT *pInfo;9696- UCHAR Addr[6];9797- PUCHAR pOutBuffer = NULL;9898- NDIS_STATUS NStatus;9999- ULONG Idx;100100- FRAME_ADDBA_REQ Frame;101101- ULONG FrameLen;102102- BA_ORI_ENTRY *pBAEntry = NULL;103103-104104- pInfo = (MLME_ADDBA_REQ_STRUCT *)Elem->Msg;105105- NdisZeroMemory(&Frame, sizeof(FRAME_ADDBA_REQ));106106-107107- if(MlmeAddBAReqSanity(pAd, Elem->Msg, Elem->MsgLen, Addr))108108- {109109- NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory110110- if(NStatus != NDIS_STATUS_SUCCESS)111111- {112112- DBGPRINT(RT_DEBUG_TRACE,("BA - MlmeADDBAAction() allocate memory failed \n"));113113- return;114114- }115115- // 1. find entry116116- Idx = pAd->MacTab.Content[pInfo->Wcid].BAOriWcidArray[pInfo->TID];117117- if (Idx == 0)118118- {119119- MlmeFreeMemory(pAd, pOutBuffer);120120- DBGPRINT(RT_DEBUG_ERROR,("BA - MlmeADDBAAction() can't find BAOriEntry \n"));121121- return;122122- }123123- else124124- {125125- pBAEntry =&pAd->BATable.BAOriEntry[Idx];126126- }127127-128128- {129129- if (ADHOC_ON(pAd))130130- ActHeaderInit(pAd, &Frame.Hdr, pInfo->pAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);131131- else132132- ActHeaderInit(pAd, &Frame.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pInfo->pAddr);133133- }134134-135135- Frame.Category = CATEGORY_BA;136136- Frame.Action = ADDBA_REQ;137137- Frame.BaParm.AMSDUSupported = 0;138138- Frame.BaParm.BAPolicy = IMMED_BA;139139- Frame.BaParm.TID = pInfo->TID;140140- Frame.BaParm.BufSize = pInfo->BaBufSize;141141- Frame.Token = pInfo->Token;142142- Frame.TimeOutValue = pInfo->TimeOutValue;143143- Frame.BaStartSeq.field.FragNum = 0;144144- Frame.BaStartSeq.field.StartSeq = pAd->MacTab.Content[pInfo->Wcid].TxSeq[pInfo->TID];145145-146146- *(USHORT *)(&Frame.BaParm) = cpu2le16(*(USHORT *)(&Frame.BaParm));147147- Frame.TimeOutValue = cpu2le16(Frame.TimeOutValue);148148- Frame.BaStartSeq.word = cpu2le16(Frame.BaStartSeq.word);149149-150150- MakeOutgoingFrame(pOutBuffer, &FrameLen,151151- sizeof(FRAME_ADDBA_REQ), &Frame,152152- END_OF_ARGS);153153- MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);154154- MlmeFreeMemory(pAd, pOutBuffer);155155-156156- DBGPRINT(RT_DEBUG_TRACE, ("BA - Send ADDBA request. StartSeq = %x, FrameLen = %ld. BufSize = %d\n", Frame.BaStartSeq.field.StartSeq, FrameLen, Frame.BaParm.BufSize));157157- }158158-}159159-160160-/*161161- ==========================================================================162162- Description:163163- send DELBA and delete BaEntry if any164164- Parametrs:165165- Elem - MLME message MLME_DELBA_REQ_STRUCT166166-167167- IRQL = DISPATCH_LEVEL168168-169169- ==========================================================================170170- */171171-VOID MlmeDELBAAction(172172- IN PRTMP_ADAPTER pAd,173173- IN MLME_QUEUE_ELEM *Elem)174174-{175175- MLME_DELBA_REQ_STRUCT *pInfo;176176- PUCHAR pOutBuffer = NULL;177177- PUCHAR pOutBuffer2 = NULL;178178- NDIS_STATUS NStatus;179179- ULONG Idx;180180- FRAME_DELBA_REQ Frame;181181- ULONG FrameLen;182182- FRAME_BAR FrameBar;183183-184184- pInfo = (MLME_DELBA_REQ_STRUCT *)Elem->Msg;185185- // must send back DELBA186186- NdisZeroMemory(&Frame, sizeof(FRAME_DELBA_REQ));187187- DBGPRINT(RT_DEBUG_TRACE, ("==> MlmeDELBAAction(), Initiator(%d) \n", pInfo->Initiator));188188-189189- if(MlmeDelBAReqSanity(pAd, Elem->Msg, Elem->MsgLen))190190- {191191- NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory192192- if(NStatus != NDIS_STATUS_SUCCESS)193193- {194194- DBGPRINT(RT_DEBUG_ERROR,("BA - MlmeDELBAAction() allocate memory failed 1. \n"));195195- return;196196- }197197-198198- NStatus = MlmeAllocateMemory(pAd, &pOutBuffer2); //Get an unused nonpaged memory199199- if(NStatus != NDIS_STATUS_SUCCESS)200200- {201201- MlmeFreeMemory(pAd, pOutBuffer);202202- DBGPRINT(RT_DEBUG_ERROR, ("BA - MlmeDELBAAction() allocate memory failed 2. \n"));203203- return;204204- }205205-206206- // SEND BAR (Send BAR to refresh peer reordering buffer.)207207- Idx = pAd->MacTab.Content[pInfo->Wcid].BAOriWcidArray[pInfo->TID];208208-209209- BarHeaderInit(pAd, &FrameBar, pAd->MacTab.Content[pInfo->Wcid].Addr, pAd->CurrentAddress);210210-211211- FrameBar.StartingSeq.field.FragNum = 0; // make sure sequence not clear in DEL funciton.212212- FrameBar.StartingSeq.field.StartSeq = pAd->MacTab.Content[pInfo->Wcid].TxSeq[pInfo->TID]; // make sure sequence not clear in DEL funciton.213213- FrameBar.BarControl.TID = pInfo->TID; // make sure sequence not clear in DEL funciton.214214- FrameBar.BarControl.ACKPolicy = IMMED_BA; // make sure sequence not clear in DEL funciton.215215- FrameBar.BarControl.Compressed = 1; // make sure sequence not clear in DEL funciton.216216- FrameBar.BarControl.MTID = 0; // make sure sequence not clear in DEL funciton.217217-218218- MakeOutgoingFrame(pOutBuffer2, &FrameLen,219219- sizeof(FRAME_BAR), &FrameBar,220220- END_OF_ARGS);221221- MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer2, FrameLen);222222- MlmeFreeMemory(pAd, pOutBuffer2);223223- DBGPRINT(RT_DEBUG_TRACE,("BA - MlmeDELBAAction() . Send BAR to refresh peer reordering buffer \n"));224224-225225- // SEND DELBA FRAME226226- FrameLen = 0;227227-228228- {229229- if (ADHOC_ON(pAd))230230- ActHeaderInit(pAd, &Frame.Hdr, pAd->MacTab.Content[pInfo->Wcid].Addr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);231231- else232232- ActHeaderInit(pAd, &Frame.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAd->MacTab.Content[pInfo->Wcid].Addr);233233- }234234-235235- Frame.Category = CATEGORY_BA;236236- Frame.Action = DELBA;237237- Frame.DelbaParm.Initiator = pInfo->Initiator;238238- Frame.DelbaParm.TID = pInfo->TID;239239- Frame.ReasonCode = 39; // Time Out240240- *(USHORT *)(&Frame.DelbaParm) = cpu2le16(*(USHORT *)(&Frame.DelbaParm));241241- Frame.ReasonCode = cpu2le16(Frame.ReasonCode);242242-243243- MakeOutgoingFrame(pOutBuffer, &FrameLen,244244- sizeof(FRAME_DELBA_REQ), &Frame,245245- END_OF_ARGS);246246- MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);247247- MlmeFreeMemory(pAd, pOutBuffer);248248- DBGPRINT(RT_DEBUG_TRACE, ("BA - MlmeDELBAAction() . 3 DELBA sent. Initiator(%d)\n", pInfo->Initiator));249249- }250250-}251251-252252-VOID MlmeQOSAction(253253- IN PRTMP_ADAPTER pAd,254254- IN MLME_QUEUE_ELEM *Elem)255255-{256256-}257257-258258-VOID MlmeDLSAction(259259- IN PRTMP_ADAPTER pAd,260260- IN MLME_QUEUE_ELEM *Elem)261261-{262262-}263263-264264-VOID MlmeInvalidAction(265265- IN PRTMP_ADAPTER pAd,266266- IN MLME_QUEUE_ELEM *Elem)267267-{268268- //PUCHAR pOutBuffer = NULL;269269- //Return the receiving frame except the MSB of category filed set to 1. 7.3.1.11270270-}271271-272272-VOID PeerQOSAction(273273- IN PRTMP_ADAPTER pAd,274274- IN MLME_QUEUE_ELEM *Elem)275275-{276276-}277277-278278-VOID PeerBAAction(279279- IN PRTMP_ADAPTER pAd,280280- IN MLME_QUEUE_ELEM *Elem)281281-{282282- UCHAR Action = Elem->Msg[LENGTH_802_11+1];283283-284284- switch(Action)285285- {286286- case ADDBA_REQ:287287- PeerAddBAReqAction(pAd,Elem);288288- break;289289- case ADDBA_RESP:290290- PeerAddBARspAction(pAd,Elem);291291- break;292292- case DELBA:293293- PeerDelBAAction(pAd,Elem);294294- break;295295- }296296-}297297-298298-VOID PeerPublicAction(299299- IN PRTMP_ADAPTER pAd,300300- IN MLME_QUEUE_ELEM *Elem)301301-{302302- if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE)303303- return;304304-}305305-306306-307307-static VOID ReservedAction(308308- IN PRTMP_ADAPTER pAd,309309- IN MLME_QUEUE_ELEM *Elem)310310-{311311- UCHAR Category;312312-313313- if (Elem->MsgLen <= LENGTH_802_11)314314- {315315- return;316316- }317317-318318- Category = Elem->Msg[LENGTH_802_11];319319- DBGPRINT(RT_DEBUG_TRACE,("Rcv reserved category(%d) Action Frame\n", Category));320320- hex_dump("Reserved Action Frame", &Elem->Msg[0], Elem->MsgLen);321321-}322322-323323-VOID PeerRMAction(324324- IN PRTMP_ADAPTER pAd,325325- IN MLME_QUEUE_ELEM *Elem)326326-327327-{328328- return;329329-}330330-331331-static VOID respond_ht_information_exchange_action(332332- IN PRTMP_ADAPTER pAd,333333- IN MLME_QUEUE_ELEM *Elem)334334-{335335- PUCHAR pOutBuffer = NULL;336336- NDIS_STATUS NStatus;337337- ULONG FrameLen;338338- FRAME_HT_INFO HTINFOframe, *pFrame;339339- UCHAR *pAddr;340340-341341-342342- // 2. Always send back ADDBA Response343343- NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory344344-345345- if (NStatus != NDIS_STATUS_SUCCESS)346346- {347347- DBGPRINT(RT_DEBUG_TRACE,("ACTION - respond_ht_information_exchange_action() allocate memory failed \n"));348348- return;349349- }350350-351351- // get RA352352- pFrame = (FRAME_HT_INFO *) &Elem->Msg[0];353353- pAddr = pFrame->Hdr.Addr2;354354-355355- NdisZeroMemory(&HTINFOframe, sizeof(FRAME_HT_INFO));356356- // 2-1. Prepare ADDBA Response frame.357357- {358358- if (ADHOC_ON(pAd))359359- ActHeaderInit(pAd, &HTINFOframe.Hdr, pAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);360360- else361361- ActHeaderInit(pAd, &HTINFOframe.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAddr);362362- }363363-364364- HTINFOframe.Category = CATEGORY_HT;365365- HTINFOframe.Action = HT_INFO_EXCHANGE;366366- HTINFOframe.HT_Info.Request = 0;367367- HTINFOframe.HT_Info.Forty_MHz_Intolerant = pAd->CommonCfg.HtCapability.HtCapInfo.Forty_Mhz_Intolerant;368368- HTINFOframe.HT_Info.STA_Channel_Width = pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth;369369-370370- MakeOutgoingFrame(pOutBuffer, &FrameLen,371371- sizeof(FRAME_HT_INFO), &HTINFOframe,372372- END_OF_ARGS);373373-374374- MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);375375- MlmeFreeMemory(pAd, pOutBuffer);376376-}377377-378378-VOID PeerHTAction(379379- IN PRTMP_ADAPTER pAd,380380- IN MLME_QUEUE_ELEM *Elem)381381-{382382- UCHAR Action = Elem->Msg[LENGTH_802_11+1];383383-384384- if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE)385385- return;386386-387387- switch(Action)388388- {389389- case NOTIFY_BW_ACTION:390390- DBGPRINT(RT_DEBUG_TRACE,("ACTION - HT Notify Channel bandwidth action----> \n"));391391-392392- if(pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE)393393- {394394- // Note, this is to patch DIR-1353 AP. When the AP set to Wep, it will use legacy mode. But AP still keeps395395- // sending BW_Notify Action frame, and cause us to linkup and linkdown.396396- // In legacy mode, don't need to parse HT action frame.397397- DBGPRINT(RT_DEBUG_TRACE,("ACTION -Ignore HT Notify Channel BW when link as legacy mode. BW = %d---> \n",398398- Elem->Msg[LENGTH_802_11+2] ));399399- break;400400- }401401-402402- if (Elem->Msg[LENGTH_802_11+2] == 0) // 7.4.8.2. if value is 1, keep the same as supported channel bandwidth.403403- pAd->MacTab.Content[Elem->Wcid].HTPhyMode.field.BW = 0;404404-405405- break;406406-407407- case SMPS_ACTION:408408- // 7.3.1.25409409- DBGPRINT(RT_DEBUG_TRACE,("ACTION - SMPS action----> \n"));410410- if (((Elem->Msg[LENGTH_802_11+2]&0x1) == 0))411411- {412412- pAd->MacTab.Content[Elem->Wcid].MmpsMode = MMPS_ENABLE;413413- }414414- else if (((Elem->Msg[LENGTH_802_11+2]&0x2) == 0))415415- {416416- pAd->MacTab.Content[Elem->Wcid].MmpsMode = MMPS_STATIC;417417- }418418- else419419- {420420- pAd->MacTab.Content[Elem->Wcid].MmpsMode = MMPS_DYNAMIC;421421- }422422-423423- DBGPRINT(RT_DEBUG_TRACE,("Aid(%d) MIMO PS = %d\n", Elem->Wcid, pAd->MacTab.Content[Elem->Wcid].MmpsMode));424424- // rt2860c : add something for smps change.425425- break;426426-427427- case SETPCO_ACTION:428428- break;429429-430430- case MIMO_CHA_MEASURE_ACTION:431431- break;432432-433433- case HT_INFO_EXCHANGE:434434- {435435- HT_INFORMATION_OCTET *pHT_info;436436-437437- pHT_info = (HT_INFORMATION_OCTET *) &Elem->Msg[LENGTH_802_11+2];438438- // 7.4.8.10439439- DBGPRINT(RT_DEBUG_TRACE,("ACTION - HT Information Exchange action----> \n"));440440- if (pHT_info->Request)441441- {442442- respond_ht_information_exchange_action(pAd, Elem);443443- }444444- }445445- break;446446- }447447-}448448-449449-450450-/*451451- ==========================================================================452452- Description:453453- Retry sending ADDBA Reqest.454454-455455- IRQL = DISPATCH_LEVEL456456-457457- Parametrs:458458- p8023Header: if this is already 802.3 format, p8023Header is NULL459459-460460- Return : TRUE if put into rx reordering buffer, shouldn't indicaterxhere.461461- FALSE , then continue indicaterx at this moment.462462- ==========================================================================463463- */464464-VOID ORIBATimerTimeout(465465- IN PRTMP_ADAPTER pAd)466466-{467467- MAC_TABLE_ENTRY *pEntry;468468- INT i, total;469469- UCHAR TID;470470-471471- total = pAd->MacTab.Size * NUM_OF_TID;472472-473473- for (i = 1; ((i <MAX_LEN_OF_BA_ORI_TABLE) && (total > 0)) ; i++)474474- {475475- if (pAd->BATable.BAOriEntry[i].ORI_BA_Status == Originator_Done)476476- {477477- pEntry = &pAd->MacTab.Content[pAd->BATable.BAOriEntry[i].Wcid];478478- TID = pAd->BATable.BAOriEntry[i].TID;479479-480480- ASSERT(pAd->BATable.BAOriEntry[i].Wcid < MAX_LEN_OF_MAC_TABLE);481481- }482482- total --;483483- }484484-}485485-486486-487487-VOID SendRefreshBAR(488488- IN PRTMP_ADAPTER pAd,489489- IN MAC_TABLE_ENTRY *pEntry)490490-{491491- FRAME_BAR FrameBar;492492- ULONG FrameLen;493493- NDIS_STATUS NStatus;494494- PUCHAR pOutBuffer = NULL;495495- USHORT Sequence;496496- UCHAR i, TID;497497- USHORT idx;498498- BA_ORI_ENTRY *pBAEntry;499499-500500- for (i = 0; i <NUM_OF_TID; i++)501501- {502502- idx = pEntry->BAOriWcidArray[i];503503- if (idx == 0)504504- {505505- continue;506506- }507507- pBAEntry = &pAd->BATable.BAOriEntry[idx];508508-509509- if (pBAEntry->ORI_BA_Status == Originator_Done)510510- {511511- TID = pBAEntry->TID;512512-513513- ASSERT(pBAEntry->Wcid < MAX_LEN_OF_MAC_TABLE);514514-515515- NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory516516- if(NStatus != NDIS_STATUS_SUCCESS)517517- {518518- DBGPRINT(RT_DEBUG_ERROR,("BA - MlmeADDBAAction() allocate memory failed \n"));519519- return;520520- }521521-522522- Sequence = pEntry->TxSeq[TID];523523-524524- BarHeaderInit(pAd, &FrameBar, pEntry->Addr, pAd->CurrentAddress);525525-526526- FrameBar.StartingSeq.field.FragNum = 0; // make sure sequence not clear in DEL function.527527- FrameBar.StartingSeq.field.StartSeq = Sequence; // make sure sequence not clear in DEL funciton.528528- FrameBar.BarControl.TID = TID; // make sure sequence not clear in DEL funciton.529529-530530- MakeOutgoingFrame(pOutBuffer, &FrameLen,531531- sizeof(FRAME_BAR), &FrameBar,532532- END_OF_ARGS);533533-534534- if (1) // Now we always send BAR.535535- {536536-#ifndef RT30xx537537- MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);538538-#endif539539-#ifdef RT30xx540540- MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);541541-#endif542542- }543543- MlmeFreeMemory(pAd, pOutBuffer);544544- }545545- }546546-}547547-548548-VOID ActHeaderInit(549549- IN PRTMP_ADAPTER pAd,550550- IN OUT PHEADER_802_11 pHdr80211,551551- IN PUCHAR Addr1,552552- IN PUCHAR Addr2,553553- IN PUCHAR Addr3)554554-{555555- NdisZeroMemory(pHdr80211, sizeof(HEADER_802_11));556556- pHdr80211->FC.Type = BTYPE_MGMT;557557- pHdr80211->FC.SubType = SUBTYPE_ACTION;558558-559559- COPY_MAC_ADDR(pHdr80211->Addr1, Addr1);560560- COPY_MAC_ADDR(pHdr80211->Addr2, Addr2);561561- COPY_MAC_ADDR(pHdr80211->Addr3, Addr3);562562-}563563-564564-VOID BarHeaderInit(565565- IN PRTMP_ADAPTER pAd,566566- IN OUT PFRAME_BAR pCntlBar,567567- IN PUCHAR pDA,568568- IN PUCHAR pSA)569569-{570570- NdisZeroMemory(pCntlBar, sizeof(FRAME_BAR));571571- pCntlBar->FC.Type = BTYPE_CNTL;572572- pCntlBar->FC.SubType = SUBTYPE_BLOCK_ACK_REQ;573573- pCntlBar->BarControl.MTID = 0;574574- pCntlBar->BarControl.Compressed = 1;575575- pCntlBar->BarControl.ACKPolicy = 0;576576-577577-578578- pCntlBar->Duration = 16 + RTMPCalcDuration(pAd, RATE_1, sizeof(FRAME_BA));579579-580580- COPY_MAC_ADDR(pCntlBar->Addr1, pDA);581581- COPY_MAC_ADDR(pCntlBar->Addr2, pSA);582582-}583583-584584-585585-/*586586- ==========================================================================587587- Description:588588- Insert Category and action code into the action frame.589589-590590- Parametrs:591591- 1. frame buffer pointer.592592- 2. frame length.593593- 3. category code of the frame.594594- 4. action code of the frame.595595-596596- Return : None.597597- ==========================================================================598598- */599599-VOID InsertActField(600600- IN PRTMP_ADAPTER pAd,601601- OUT PUCHAR pFrameBuf,602602- OUT PULONG pFrameLen,603603- IN UINT8 Category,604604- IN UINT8 ActCode)605605-{606606- ULONG TempLen;607607-608608- MakeOutgoingFrame( pFrameBuf, &TempLen,609609- 1, &Category,610610- 1, &ActCode,611611- END_OF_ARGS);612612-613613- *pFrameLen = *pFrameLen + TempLen;614614-615615- return;616616-}11+#include "../../rt2860/common/action.c"
+1-61
drivers/staging/rt2870/common/action.h
···11-/*22- *************************************************************************33- * Ralink Tech Inc.44- * 5F., No.36, Taiyuan St., Jhubei City,55- * Hsinchu County 302,66- * Taiwan, R.O.C.77- *88- * (c) Copyright 2002-2007, Ralink Technology, Inc.99- *1010- * This program is free software; you can redistribute it and/or modify *1111- * it under the terms of the GNU General Public License as published by *1212- * the Free Software Foundation; either version 2 of the License, or *1313- * (at your option) any later version. *1414- * *1515- * This program is distributed in the hope that it will be useful, *1616- * but WITHOUT ANY WARRANTY; without even the implied warranty of *1717- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *1818- * GNU General Public License for more details. *1919- * *2020- * You should have received a copy of the GNU General Public License *2121- * along with this program; if not, write to the *2222- * Free Software Foundation, Inc., *2323- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *2424- * *2525- *************************************************************************2626-2727- Module Name:2828- aironet.h2929-3030- Abstract:3131-3232- Revision History:3333- Who When What3434- -------- ---------- ----------------------------------------------3535- Name Date Modification logs3636- Paul Lin 04-06-15 Initial3737-*/3838-3939-#ifndef __ACTION_H__4040-#define __ACTION_H__4141-4242-typedef struct PACKED __HT_INFO_OCTET4343-{4444- UCHAR Request:1;4545- UCHAR Forty_MHz_Intolerant:1;4646- UCHAR STA_Channel_Width:1;4747- UCHAR Reserved:5;4848-} HT_INFORMATION_OCTET;4949-5050-5151-typedef struct PACKED __FRAME_HT_INFO5252-{5353- HEADER_802_11 Hdr;5454- UCHAR Category;5555- UCHAR Action;5656- HT_INFORMATION_OCTET HT_Info;5757-} FRAME_HT_INFO, *PFRAME_HT_INFO;5858-5959-#endif /* __ACTION_H__ */6060-6161-11+#include "../../rt2860/common/action.h"
+1-1770
drivers/staging/rt2870/common/ba_action.c
···11-/*22- *************************************************************************33- * Ralink Tech Inc.44- * 5F., No.36, Taiyuan St., Jhubei City,55- * Hsinchu County 302,66- * Taiwan, R.O.C.77- *88- * (c) Copyright 2002-2007, Ralink Technology, Inc.99- *1010- * This program is free software; you can redistribute it and/or modify *1111- * it under the terms of the GNU General Public License as published by *1212- * the Free Software Foundation; either version 2 of the License, or *1313- * (at your option) any later version. *1414- * *1515- * This program is distributed in the hope that it will be useful, *1616- * but WITHOUT ANY WARRANTY; without even the implied warranty of *1717- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *1818- * GNU General Public License for more details. *1919- * *2020- * You should have received a copy of the GNU General Public License *2121- * along with this program; if not, write to the *2222- * Free Software Foundation, Inc., *2323- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *2424- * *2525- *************************************************************************2626- */2727-2828-2929-#include "../rt_config.h"3030-3131-3232-3333-#define BA_ORI_INIT_SEQ (pEntry->TxSeq[TID]) //1 // inital sequence number of BA session3434-3535-#define ORI_SESSION_MAX_RETRY 83636-#define ORI_BA_SESSION_TIMEOUT (2000) // ms3737-#define REC_BA_SESSION_IDLE_TIMEOUT (1000) // ms3838-3939-#define REORDERING_PACKET_TIMEOUT ((100 * HZ)/1000) // system ticks -- 100 ms4040-#define MAX_REORDERING_PACKET_TIMEOUT ((3000 * HZ)/1000) // system ticks -- 100 ms4141-4242-#define RESET_RCV_SEQ (0xFFFF)4343-4444-static void ba_mpdu_blk_free(PRTMP_ADAPTER pAd, struct reordering_mpdu *mpdu_blk);4545-4646-4747-BA_ORI_ENTRY *BATableAllocOriEntry(4848- IN PRTMP_ADAPTER pAd,4949- OUT USHORT *Idx);5050-5151-BA_REC_ENTRY *BATableAllocRecEntry(5252- IN PRTMP_ADAPTER pAd,5353- OUT USHORT *Idx);5454-5555-VOID BAOriSessionSetupTimeout(5656- IN PVOID SystemSpecific1,5757- IN PVOID FunctionContext,5858- IN PVOID SystemSpecific2,5959- IN PVOID SystemSpecific3);6060-6161-VOID BARecSessionIdleTimeout(6262- IN PVOID SystemSpecific1,6363- IN PVOID FunctionContext,6464- IN PVOID SystemSpecific2,6565- IN PVOID SystemSpecific3);6666-6767-6868-BUILD_TIMER_FUNCTION(BAOriSessionSetupTimeout);6969-BUILD_TIMER_FUNCTION(BARecSessionIdleTimeout);7070-7171-#define ANNOUNCE_REORDERING_PACKET(_pAd, _mpdu_blk) \7272- Announce_Reordering_Packet(_pAd, _mpdu_blk);7373-7474-VOID BA_MaxWinSizeReasign(7575- IN PRTMP_ADAPTER pAd,7676- IN MAC_TABLE_ENTRY *pEntryPeer,7777- OUT UCHAR *pWinSize)7878-{7979- UCHAR MaxSize;8080-8181-8282- if (pAd->MACVersion >= RALINK_2883_VERSION) // 3*38383- {8484- if (pAd->MACVersion >= RALINK_3070_VERSION)8585- {8686- if (pEntryPeer->WepStatus != Ndis802_11EncryptionDisabled)8787- MaxSize = 7; // for non-open mode8888- else8989- MaxSize = 13;9090- }9191- else9292- MaxSize = 31;9393- }9494- else if (pAd->MACVersion >= RALINK_2880E_VERSION) // 2880 e9595- {9696- if (pEntryPeer->WepStatus != Ndis802_11EncryptionDisabled)9797- MaxSize = 7; // for non-open mode9898- else9999- MaxSize = 13;100100- }101101- else102102- MaxSize = 7;103103-104104- DBGPRINT(RT_DEBUG_TRACE, ("ba> Win Size = %d, Max Size = %d\n",105105- *pWinSize, MaxSize));106106-107107- if ((*pWinSize) > MaxSize)108108- {109109- DBGPRINT(RT_DEBUG_TRACE, ("ba> reassign max win size from %d to %d\n",110110- *pWinSize, MaxSize));111111-112112- *pWinSize = MaxSize;113113- }114114-}115115-116116-void Announce_Reordering_Packet(IN PRTMP_ADAPTER pAd,117117- IN struct reordering_mpdu *mpdu)118118-{119119- PNDIS_PACKET pPacket;120120-121121- pPacket = mpdu->pPacket;122122-123123- if (mpdu->bAMSDU)124124- {125125- ASSERT(0);126126- BA_Reorder_AMSDU_Annnounce(pAd, pPacket);127127- }128128- else129129- {130130- //131131- // pass this 802.3 packet to upper layer or forward this packet to WM directly132132- //133133-134134- ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pPacket, RTMP_GET_PACKET_IF(pPacket));135135- }136136-}137137-138138-/*139139- * Insert a reordering mpdu into sorted linked list by sequence no.140140- */141141-BOOLEAN ba_reordering_mpdu_insertsorted(struct reordering_list *list, struct reordering_mpdu *mpdu)142142-{143143-144144- struct reordering_mpdu **ppScan = &list->next;145145-146146- while (*ppScan != NULL)147147- {148148- if (SEQ_SMALLER((*ppScan)->Sequence, mpdu->Sequence, MAXSEQ))149149- {150150- ppScan = &(*ppScan)->next;151151- }152152- else if ((*ppScan)->Sequence == mpdu->Sequence)153153- {154154- /* give up this duplicated frame */155155- return(FALSE);156156- }157157- else158158- {159159- /* find position */160160- break;161161- }162162- }163163-164164- mpdu->next = *ppScan;165165- *ppScan = mpdu;166166- list->qlen++;167167- return TRUE;168168-}169169-170170-171171-/*172172- * caller lock critical section if necessary173173- */174174-static inline void ba_enqueue(struct reordering_list *list, struct reordering_mpdu *mpdu_blk)175175-{176176- list->qlen++;177177- mpdu_blk->next = list->next;178178- list->next = mpdu_blk;179179-}180180-181181-/*182182- * caller lock critical section if necessary183183- */184184-static inline struct reordering_mpdu * ba_dequeue(struct reordering_list *list)185185-{186186- struct reordering_mpdu *mpdu_blk = NULL;187187-188188- ASSERT(list);189189-190190- if (list->qlen)191191- {192192- list->qlen--;193193- mpdu_blk = list->next;194194- if (mpdu_blk)195195- {196196- list->next = mpdu_blk->next;197197- mpdu_blk->next = NULL;198198- }199199- }200200- return mpdu_blk;201201-}202202-203203-204204-static inline struct reordering_mpdu *ba_reordering_mpdu_dequeue(struct reordering_list *list)205205-{206206- return(ba_dequeue(list));207207-}208208-209209-210210-static inline struct reordering_mpdu *ba_reordering_mpdu_probe(struct reordering_list *list)211211- {212212- ASSERT(list);213213-214214- return(list->next);215215- }216216-217217-218218-/*219219- * free all resource for reordering mechanism220220- */221221-void ba_reordering_resource_release(PRTMP_ADAPTER pAd)222222-{223223- BA_TABLE *Tab;224224- PBA_REC_ENTRY pBAEntry;225225- struct reordering_mpdu *mpdu_blk;226226- int i;227227-228228- Tab = &pAd->BATable;229229-230230- /* I. release all pending reordering packet */231231- NdisAcquireSpinLock(&pAd->BATabLock);232232- for (i = 0; i < MAX_LEN_OF_BA_REC_TABLE; i++)233233- {234234- pBAEntry = &Tab->BARecEntry[i];235235- if (pBAEntry->REC_BA_Status != Recipient_NONE)236236- {237237- while ((mpdu_blk = ba_reordering_mpdu_dequeue(&pBAEntry->list)))238238- {239239- ASSERT(mpdu_blk->pPacket);240240- RELEASE_NDIS_PACKET(pAd, mpdu_blk->pPacket, NDIS_STATUS_FAILURE);241241- ba_mpdu_blk_free(pAd, mpdu_blk);242242- }243243- }244244- }245245- NdisReleaseSpinLock(&pAd->BATabLock);246246-247247- ASSERT(pBAEntry->list.qlen == 0);248248- /* II. free memory of reordering mpdu table */249249- NdisAcquireSpinLock(&pAd->mpdu_blk_pool.lock);250250- os_free_mem(pAd, pAd->mpdu_blk_pool.mem);251251- NdisReleaseSpinLock(&pAd->mpdu_blk_pool.lock);252252-}253253-254254-255255-256256-/*257257- * Allocate all resource for reordering mechanism258258- */259259-BOOLEAN ba_reordering_resource_init(PRTMP_ADAPTER pAd, int num)260260-{261261- int i;262262- PUCHAR mem;263263- struct reordering_mpdu *mpdu_blk;264264- struct reordering_list *freelist;265265-266266- /* allocate spinlock */267267- NdisAllocateSpinLock(&pAd->mpdu_blk_pool.lock);268268-269269- /* initialize freelist */270270- freelist = &pAd->mpdu_blk_pool.freelist;271271- freelist->next = NULL;272272- freelist->qlen = 0;273273-274274- DBGPRINT(RT_DEBUG_TRACE, ("Allocate %d memory for BA reordering\n", (UINT32)(num*sizeof(struct reordering_mpdu))));275275-276276- /* allocate number of mpdu_blk memory */277277- os_alloc_mem(pAd, (PUCHAR *)&mem, (num*sizeof(struct reordering_mpdu)));278278-279279- pAd->mpdu_blk_pool.mem = mem;280280-281281- if (mem == NULL)282282- {283283- DBGPRINT(RT_DEBUG_ERROR, ("Can't Allocate Memory for BA Reordering\n"));284284- return(FALSE);285285- }286286-287287- /* build mpdu_blk free list */288288- for (i=0; i<num; i++)289289- {290290- /* get mpdu_blk */291291- mpdu_blk = (struct reordering_mpdu *) mem;292292- /* initial mpdu_blk */293293- NdisZeroMemory(mpdu_blk, sizeof(struct reordering_mpdu));294294- /* next mpdu_blk */295295- mem += sizeof(struct reordering_mpdu);296296- /* insert mpdu_blk into freelist */297297- ba_enqueue(freelist, mpdu_blk);298298- }299299-300300- return(TRUE);301301-}302302-303303-//static int blk_count=0; // sample take off, no use304304-305305-static struct reordering_mpdu *ba_mpdu_blk_alloc(PRTMP_ADAPTER pAd)306306-{307307- struct reordering_mpdu *mpdu_blk;308308-309309- NdisAcquireSpinLock(&pAd->mpdu_blk_pool.lock);310310- mpdu_blk = ba_dequeue(&pAd->mpdu_blk_pool.freelist);311311- if (mpdu_blk)312312- {313313-// blk_count++;314314- /* reset mpdu_blk */315315- NdisZeroMemory(mpdu_blk, sizeof(struct reordering_mpdu));316316- }317317- NdisReleaseSpinLock(&pAd->mpdu_blk_pool.lock);318318- return mpdu_blk;319319-}320320-321321-static void ba_mpdu_blk_free(PRTMP_ADAPTER pAd, struct reordering_mpdu *mpdu_blk)322322-{323323- ASSERT(mpdu_blk);324324-325325- NdisAcquireSpinLock(&pAd->mpdu_blk_pool.lock);326326-// blk_count--;327327- ba_enqueue(&pAd->mpdu_blk_pool.freelist, mpdu_blk);328328- NdisReleaseSpinLock(&pAd->mpdu_blk_pool.lock);329329-}330330-331331-332332-static USHORT ba_indicate_reordering_mpdus_in_order(333333- IN PRTMP_ADAPTER pAd,334334- IN PBA_REC_ENTRY pBAEntry,335335- IN USHORT StartSeq)336336-{337337- struct reordering_mpdu *mpdu_blk;338338- USHORT LastIndSeq = RESET_RCV_SEQ;339339-340340- NdisAcquireSpinLock(&pBAEntry->RxReRingLock);341341-342342- while ((mpdu_blk = ba_reordering_mpdu_probe(&pBAEntry->list)))343343- {344344- /* find in-order frame */345345- if (!SEQ_STEPONE(mpdu_blk->Sequence, StartSeq, MAXSEQ))346346- {347347- break;348348- }349349- /* dequeue in-order frame from reodering list */350350- mpdu_blk = ba_reordering_mpdu_dequeue(&pBAEntry->list);351351- /* pass this frame up */352352- ANNOUNCE_REORDERING_PACKET(pAd, mpdu_blk);353353- /* move to next sequence */354354- StartSeq = mpdu_blk->Sequence;355355- LastIndSeq = StartSeq;356356- /* free mpdu_blk */357357- ba_mpdu_blk_free(pAd, mpdu_blk);358358- }359359-360360- NdisReleaseSpinLock(&pBAEntry->RxReRingLock);361361-362362- /* update last indicated sequence */363363- return LastIndSeq;364364-}365365-366366-static void ba_indicate_reordering_mpdus_le_seq(367367- IN PRTMP_ADAPTER pAd,368368- IN PBA_REC_ENTRY pBAEntry,369369- IN USHORT Sequence)370370-{371371- struct reordering_mpdu *mpdu_blk;372372-373373- NdisAcquireSpinLock(&pBAEntry->RxReRingLock);374374- while ((mpdu_blk = ba_reordering_mpdu_probe(&pBAEntry->list)))375375- {376376- /* find in-order frame */377377- if ((mpdu_blk->Sequence == Sequence) || SEQ_SMALLER(mpdu_blk->Sequence, Sequence, MAXSEQ))378378- {379379- /* dequeue in-order frame from reodering list */380380- mpdu_blk = ba_reordering_mpdu_dequeue(&pBAEntry->list);381381- /* pass this frame up */382382- ANNOUNCE_REORDERING_PACKET(pAd, mpdu_blk);383383- /* free mpdu_blk */384384- ba_mpdu_blk_free(pAd, mpdu_blk);385385- }386386- else387387- {388388- break;389389- }390390- }391391- NdisReleaseSpinLock(&pBAEntry->RxReRingLock);392392-}393393-394394-395395-static void ba_refresh_reordering_mpdus(396396- IN PRTMP_ADAPTER pAd,397397- PBA_REC_ENTRY pBAEntry)398398-{399399- struct reordering_mpdu *mpdu_blk;400400-401401- NdisAcquireSpinLock(&pBAEntry->RxReRingLock);402402-403403- /* dequeue in-order frame from reodering list */404404- while ((mpdu_blk = ba_reordering_mpdu_dequeue(&pBAEntry->list)))405405- {406406- /* pass this frame up */407407- ANNOUNCE_REORDERING_PACKET(pAd, mpdu_blk);408408-409409- pBAEntry->LastIndSeq = mpdu_blk->Sequence;410410- ba_mpdu_blk_free(pAd, mpdu_blk);411411-412412- /* update last indicated sequence */413413- }414414- ASSERT(pBAEntry->list.qlen == 0);415415- pBAEntry->LastIndSeq = RESET_RCV_SEQ;416416- NdisReleaseSpinLock(&pBAEntry->RxReRingLock);417417-}418418-419419-420420-//static421421-void ba_flush_reordering_timeout_mpdus(422422- IN PRTMP_ADAPTER pAd,423423- IN PBA_REC_ENTRY pBAEntry,424424- IN ULONG Now32)425425-426426-{427427- USHORT Sequence;428428-429429-// if ((RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer+REORDERING_PACKET_TIMEOUT)) &&430430-// (pBAEntry->list.qlen > ((pBAEntry->BAWinSize*7)/8))) //||431431-// (RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer+(10*REORDERING_PACKET_TIMEOUT))) &&432432-// (pBAEntry->list.qlen > (pBAEntry->BAWinSize/8)))433433- if (RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer+(MAX_REORDERING_PACKET_TIMEOUT/6)))434434- &&(pBAEntry->list.qlen > 1)435435- )436436- {437437- DBGPRINT(RT_DEBUG_TRACE,("timeout[%d] (%08lx-%08lx = %d > %d): %x, flush all!\n ", pBAEntry->list.qlen, Now32, (pBAEntry->LastIndSeqAtTimer),438438- (int)((long) Now32 - (long)(pBAEntry->LastIndSeqAtTimer)), MAX_REORDERING_PACKET_TIMEOUT,439439- pBAEntry->LastIndSeq));440440- ba_refresh_reordering_mpdus(pAd, pBAEntry);441441- pBAEntry->LastIndSeqAtTimer = Now32;442442- }443443- else444444- if (RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer+(REORDERING_PACKET_TIMEOUT)))445445- && (pBAEntry->list.qlen > 0)446446- )447447- {448448- //449449- // force LastIndSeq to shift to LastIndSeq+1450450- //451451- Sequence = (pBAEntry->LastIndSeq+1) & MAXSEQ;452452- ba_indicate_reordering_mpdus_le_seq(pAd, pBAEntry, Sequence);453453- pBAEntry->LastIndSeqAtTimer = Now32;454454- pBAEntry->LastIndSeq = Sequence;455455- //456456- // indicate in-order mpdus457457- //458458- Sequence = ba_indicate_reordering_mpdus_in_order(pAd, pBAEntry, Sequence);459459- if (Sequence != RESET_RCV_SEQ)460460- {461461- pBAEntry->LastIndSeq = Sequence;462462- }463463-464464- }465465-}466466-467467-468468-/*469469- * generate ADDBA request to470470- * set up BA agreement471471- */472472-VOID BAOriSessionSetUp(473473- IN PRTMP_ADAPTER pAd,474474- IN MAC_TABLE_ENTRY *pEntry,475475- IN UCHAR TID,476476- IN USHORT TimeOut,477477- IN ULONG DelayTime,478478- IN BOOLEAN isForced)479479-480480-{481481- //MLME_ADDBA_REQ_STRUCT AddbaReq;482482- BA_ORI_ENTRY *pBAEntry = NULL;483483- USHORT Idx;484484- BOOLEAN Cancelled;485485-486486- if ((pAd->CommonCfg.BACapability.field.AutoBA != TRUE) && (isForced == FALSE))487487- return;488488-489489- // if this entry is limited to use legacy tx mode, it doesn't generate BA.490490- if (RTMPStaFixedTxMode(pAd, pEntry) != FIXED_TXMODE_HT)491491- return;492492-493493- if ((pEntry->BADeclineBitmap & (1<<TID)) && (isForced == FALSE))494494- {495495- // try again after 3 secs496496- DelayTime = 3000;497497-// printk("DeCline BA from Peer\n");498498-// return;499499- }500500-501501-502502- Idx = pEntry->BAOriWcidArray[TID];503503- if (Idx == 0)504504- {505505- // allocate a BA session506506- pBAEntry = BATableAllocOriEntry(pAd, &Idx);507507- if (pBAEntry == NULL)508508- {509509- DBGPRINT(RT_DEBUG_TRACE,("ADDBA - MlmeADDBAAction() allocate BA session failed \n"));510510- return;511511- }512512- }513513- else514514- {515515- pBAEntry =&pAd->BATable.BAOriEntry[Idx];516516- }517517-518518- if (pBAEntry->ORI_BA_Status >= Originator_WaitRes)519519- {520520- return;521521- }522522-523523- pEntry->BAOriWcidArray[TID] = Idx;524524-525525- // Initialize BA session526526- pBAEntry->ORI_BA_Status = Originator_WaitRes;527527- pBAEntry->Wcid = pEntry->Aid;528528- pBAEntry->BAWinSize = pAd->CommonCfg.BACapability.field.RxBAWinLimit;529529- pBAEntry->Sequence = BA_ORI_INIT_SEQ;530530- pBAEntry->Token = 1; // (2008-01-21) Jan Lee recommends it - this token can't be 0531531- pBAEntry->TID = TID;532532- pBAEntry->TimeOutValue = TimeOut;533533- pBAEntry->pAdapter = pAd;534534-535535-#ifdef RT30xx536536- DBGPRINT(RT_DEBUG_TRACE,("Send AddBA to %02x:%02x:%02x:%02x:%02x:%02x Tid:%d isForced:%d Wcid:%d\n"537537- ,pEntry->Addr[0],pEntry->Addr[1],pEntry->Addr[2]538538- ,pEntry->Addr[3],pEntry->Addr[4],pEntry->Addr[5]539539- ,TID,isForced,pEntry->Aid));540540-#endif541541-542542- if (!(pEntry->TXBAbitmap & (1<<TID)))543543- {544544- RTMPInitTimer(pAd, &pBAEntry->ORIBATimer, GET_TIMER_FUNCTION(BAOriSessionSetupTimeout), pBAEntry, FALSE);545545- }546546- else547547- RTMPCancelTimer(&pBAEntry->ORIBATimer, &Cancelled);548548-549549- // set timer to send ADDBA request550550- RTMPSetTimer(&pBAEntry->ORIBATimer, DelayTime);551551-}552552-553553-VOID BAOriSessionAdd(554554- IN PRTMP_ADAPTER pAd,555555- IN MAC_TABLE_ENTRY *pEntry,556556- IN PFRAME_ADDBA_RSP pFrame)557557-{558558- BA_ORI_ENTRY *pBAEntry = NULL;559559- BOOLEAN Cancelled;560560- UCHAR TID;561561- USHORT Idx;562562- PUCHAR pOutBuffer2 = NULL;563563- NDIS_STATUS NStatus;564564- ULONG FrameLen;565565- FRAME_BAR FrameBar;566566-567567- TID = pFrame->BaParm.TID;568568- Idx = pEntry->BAOriWcidArray[TID];569569- pBAEntry =&pAd->BATable.BAOriEntry[Idx];570570-571571- // Start fill in parameters.572572- if ((Idx !=0) && (pBAEntry->TID == TID) && (pBAEntry->ORI_BA_Status == Originator_WaitRes))573573- {574574- pBAEntry->BAWinSize = min(pBAEntry->BAWinSize, ((UCHAR)pFrame->BaParm.BufSize));575575- BA_MaxWinSizeReasign(pAd, pEntry, &pBAEntry->BAWinSize);576576-577577- pBAEntry->TimeOutValue = pFrame->TimeOutValue;578578- pBAEntry->ORI_BA_Status = Originator_Done;579579- // reset sequence number580580- pBAEntry->Sequence = BA_ORI_INIT_SEQ;581581- // Set Bitmap flag.582582- pEntry->TXBAbitmap |= (1<<TID);583583- RTMPCancelTimer(&pBAEntry->ORIBATimer, &Cancelled);584584-585585- pBAEntry->ORIBATimer.TimerValue = 0; //pFrame->TimeOutValue;586586-587587- DBGPRINT(RT_DEBUG_TRACE,("%s : TXBAbitmap = %x, BAWinSize = %d, TimeOut = %ld\n", __func__, pEntry->TXBAbitmap,588588- pBAEntry->BAWinSize, pBAEntry->ORIBATimer.TimerValue));589589-590590- // SEND BAR ;591591- NStatus = MlmeAllocateMemory(pAd, &pOutBuffer2); //Get an unused nonpaged memory592592- if (NStatus != NDIS_STATUS_SUCCESS)593593- {594594- DBGPRINT(RT_DEBUG_TRACE,("BA - BAOriSessionAdd() allocate memory failed \n"));595595- return;596596- }597597-598598- BarHeaderInit(pAd, &FrameBar, pAd->MacTab.Content[pBAEntry->Wcid].Addr, pAd->CurrentAddress);599599-600600- FrameBar.StartingSeq.field.FragNum = 0; // make sure sequence not clear in DEL function.601601- FrameBar.StartingSeq.field.StartSeq = pBAEntry->Sequence; // make sure sequence not clear in DEL funciton.602602- FrameBar.BarControl.TID = pBAEntry->TID; // make sure sequence not clear in DEL funciton.603603- MakeOutgoingFrame(pOutBuffer2, &FrameLen,604604- sizeof(FRAME_BAR), &FrameBar,605605- END_OF_ARGS);606606- MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer2, FrameLen);607607- MlmeFreeMemory(pAd, pOutBuffer2);608608-609609-610610- if (pBAEntry->ORIBATimer.TimerValue)611611- RTMPSetTimer(&pBAEntry->ORIBATimer, pBAEntry->ORIBATimer.TimerValue); // in mSec612612- }613613-}614614-615615-BOOLEAN BARecSessionAdd(616616- IN PRTMP_ADAPTER pAd,617617- IN MAC_TABLE_ENTRY *pEntry,618618- IN PFRAME_ADDBA_REQ pFrame)619619-{620620- BA_REC_ENTRY *pBAEntry = NULL;621621- BOOLEAN Status = TRUE;622622- BOOLEAN Cancelled;623623- USHORT Idx;624624- UCHAR TID;625625- UCHAR BAWinSize;626626- //UINT32 Value;627627- //UINT offset;628628-629629-630630- ASSERT(pEntry);631631-632632- // find TID633633- TID = pFrame->BaParm.TID;634634-635635- BAWinSize = min(((UCHAR)pFrame->BaParm.BufSize), (UCHAR)pAd->CommonCfg.BACapability.field.RxBAWinLimit);636636-637637- // Intel patch638638- if (BAWinSize == 0)639639- {640640- BAWinSize = 64;641641- }642642-643643- Idx = pEntry->BARecWcidArray[TID];644644-645645-646646- if (Idx == 0)647647- {648648- pBAEntry = BATableAllocRecEntry(pAd, &Idx);649649- }650650- else651651- {652652- pBAEntry = &pAd->BATable.BARecEntry[Idx];653653- // flush all pending reordering mpdus654654- ba_refresh_reordering_mpdus(pAd, pBAEntry);655655- }656656-657657- DBGPRINT(RT_DEBUG_TRACE,("%s(%ld): Idx = %d, BAWinSize(req %d) = %d\n", __func__, pAd->BATable.numAsRecipient, Idx,658658- pFrame->BaParm.BufSize, BAWinSize));659659-660660- // Start fill in parameters.661661- if (pBAEntry != NULL)662662- {663663- ASSERT(pBAEntry->list.qlen == 0);664664-665665- pBAEntry->REC_BA_Status = Recipient_HandleRes;666666- pBAEntry->BAWinSize = BAWinSize;667667- pBAEntry->Wcid = pEntry->Aid;668668- pBAEntry->TID = TID;669669- pBAEntry->TimeOutValue = pFrame->TimeOutValue;670670- pBAEntry->REC_BA_Status = Recipient_Accept;671671- // initial sequence number672672- pBAEntry->LastIndSeq = RESET_RCV_SEQ; //pFrame->BaStartSeq.field.StartSeq;673673-674674- printk("Start Seq = %08x\n", pFrame->BaStartSeq.field.StartSeq);675675-676676- if (pEntry->RXBAbitmap & (1<<TID))677677- {678678- RTMPCancelTimer(&pBAEntry->RECBATimer, &Cancelled);679679- }680680- else681681- {682682- RTMPInitTimer(pAd, &pBAEntry->RECBATimer, GET_TIMER_FUNCTION(BARecSessionIdleTimeout), pBAEntry, TRUE);683683- }684684-685685- // Set Bitmap flag.686686- pEntry->RXBAbitmap |= (1<<TID);687687- pEntry->BARecWcidArray[TID] = Idx;688688-689689- pEntry->BADeclineBitmap &= ~(1<<TID);690690-691691- // Set BA session mask in WCID table.692692- RT28XX_ADD_BA_SESSION_TO_ASIC(pAd, pEntry->Aid, TID);693693-694694- DBGPRINT(RT_DEBUG_TRACE,("MACEntry[%d]RXBAbitmap = 0x%x. BARecWcidArray=%d\n",695695- pEntry->Aid, pEntry->RXBAbitmap, pEntry->BARecWcidArray[TID]));696696- }697697- else698698- {699699- Status = FALSE;700700- DBGPRINT(RT_DEBUG_TRACE,("Can't Accept ADDBA for %02x:%02x:%02x:%02x:%02x:%02x TID = %d\n",701701- PRINT_MAC(pEntry->Addr), TID));702702- }703703- return(Status);704704-}705705-706706-707707-BA_REC_ENTRY *BATableAllocRecEntry(708708- IN PRTMP_ADAPTER pAd,709709- OUT USHORT *Idx)710710-{711711- int i;712712- BA_REC_ENTRY *pBAEntry = NULL;713713-714714-715715- NdisAcquireSpinLock(&pAd->BATabLock);716716-717717- if (pAd->BATable.numAsRecipient >= MAX_BARECI_SESSION)718718- {719719- printk("BA Recipeint Session (%ld) > %d\n", pAd->BATable.numAsRecipient,720720- MAX_BARECI_SESSION);721721- goto done;722722- }723723-724724- // reserve idx 0 to identify BAWcidArray[TID] as empty725725- for (i=1; i < MAX_LEN_OF_BA_REC_TABLE; i++)726726- {727727- pBAEntry =&pAd->BATable.BARecEntry[i];728728- if ((pBAEntry->REC_BA_Status == Recipient_NONE))729729- {730730- // get one731731- pAd->BATable.numAsRecipient++;732732- pBAEntry->REC_BA_Status = Recipient_USED;733733- *Idx = i;734734- break;735735- }736736- }737737-738738-done:739739- NdisReleaseSpinLock(&pAd->BATabLock);740740- return pBAEntry;741741-}742742-743743-BA_ORI_ENTRY *BATableAllocOriEntry(744744- IN PRTMP_ADAPTER pAd,745745- OUT USHORT *Idx)746746-{747747- int i;748748- BA_ORI_ENTRY *pBAEntry = NULL;749749-750750- NdisAcquireSpinLock(&pAd->BATabLock);751751-752752- if (pAd->BATable.numAsOriginator >= (MAX_LEN_OF_BA_ORI_TABLE))753753- {754754- goto done;755755- }756756-757757- // reserve idx 0 to identify BAWcidArray[TID] as empty758758- for (i=1; i<MAX_LEN_OF_BA_ORI_TABLE; i++)759759- {760760- pBAEntry =&pAd->BATable.BAOriEntry[i];761761- if ((pBAEntry->ORI_BA_Status == Originator_NONE))762762- {763763- // get one764764- pAd->BATable.numAsOriginator++;765765- pBAEntry->ORI_BA_Status = Originator_USED;766766- pBAEntry->pAdapter = pAd;767767- *Idx = i;768768- break;769769- }770770- }771771-772772-done:773773- NdisReleaseSpinLock(&pAd->BATabLock);774774- return pBAEntry;775775-}776776-777777-778778-VOID BATableFreeOriEntry(779779- IN PRTMP_ADAPTER pAd,780780- IN ULONG Idx)781781-{782782- BA_ORI_ENTRY *pBAEntry = NULL;783783- MAC_TABLE_ENTRY *pEntry;784784-785785-786786- if ((Idx == 0) || (Idx >= MAX_LEN_OF_BA_ORI_TABLE))787787- return;788788-789789- pBAEntry =&pAd->BATable.BAOriEntry[Idx];790790-791791- if (pBAEntry->ORI_BA_Status != Originator_NONE)792792- {793793- pEntry = &pAd->MacTab.Content[pBAEntry->Wcid];794794- pEntry->BAOriWcidArray[pBAEntry->TID] = 0;795795-796796-797797- NdisAcquireSpinLock(&pAd->BATabLock);798798- if (pBAEntry->ORI_BA_Status == Originator_Done)799799- {800800- pEntry->TXBAbitmap &= (~(1<<(pBAEntry->TID) ));801801- DBGPRINT(RT_DEBUG_TRACE, ("BATableFreeOriEntry numAsOriginator= %ld\n", pAd->BATable.numAsRecipient));802802- // Erase Bitmap flag.803803- }804804-805805- ASSERT(pAd->BATable.numAsOriginator != 0);806806-807807- pAd->BATable.numAsOriginator -= 1;808808-809809- pBAEntry->ORI_BA_Status = Originator_NONE;810810- pBAEntry->Token = 0;811811- NdisReleaseSpinLock(&pAd->BATabLock);812812- }813813-}814814-815815-816816-VOID BATableFreeRecEntry(817817- IN PRTMP_ADAPTER pAd,818818- IN ULONG Idx)819819-{820820- BA_REC_ENTRY *pBAEntry = NULL;821821- MAC_TABLE_ENTRY *pEntry;822822-823823-824824- if ((Idx == 0) || (Idx >= MAX_LEN_OF_BA_REC_TABLE))825825- return;826826-827827- pBAEntry =&pAd->BATable.BARecEntry[Idx];828828-829829- if (pBAEntry->REC_BA_Status != Recipient_NONE)830830- {831831- pEntry = &pAd->MacTab.Content[pBAEntry->Wcid];832832- pEntry->BARecWcidArray[pBAEntry->TID] = 0;833833-834834- NdisAcquireSpinLock(&pAd->BATabLock);835835-836836- ASSERT(pAd->BATable.numAsRecipient != 0);837837-838838- pAd->BATable.numAsRecipient -= 1;839839-840840- pBAEntry->REC_BA_Status = Recipient_NONE;841841- NdisReleaseSpinLock(&pAd->BATabLock);842842- }843843-}844844-845845-846846-VOID BAOriSessionTearDown(847847- IN OUT PRTMP_ADAPTER pAd,848848- IN UCHAR Wcid,849849- IN UCHAR TID,850850- IN BOOLEAN bPassive,851851- IN BOOLEAN bForceSend)852852-{853853- ULONG Idx = 0;854854- BA_ORI_ENTRY *pBAEntry;855855- BOOLEAN Cancelled;856856-857857- if (Wcid >= MAX_LEN_OF_MAC_TABLE)858858- {859859- return;860860- }861861-862862- //863863- // Locate corresponding BA Originator Entry in BA Table with the (pAddr,TID).864864- //865865- Idx = pAd->MacTab.Content[Wcid].BAOriWcidArray[TID];866866- if ((Idx == 0) || (Idx >= MAX_LEN_OF_BA_ORI_TABLE))867867- {868868- if (bForceSend == TRUE)869869- {870870- // force send specified TID DelBA871871- MLME_DELBA_REQ_STRUCT DelbaReq;872872- MLME_QUEUE_ELEM *Elem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);873873-874874- NdisZeroMemory(&DelbaReq, sizeof(DelbaReq));875875- NdisZeroMemory(Elem, sizeof(MLME_QUEUE_ELEM));876876-877877- COPY_MAC_ADDR(DelbaReq.Addr, pAd->MacTab.Content[Wcid].Addr);878878- DelbaReq.Wcid = Wcid;879879- DelbaReq.TID = TID;880880- DelbaReq.Initiator = ORIGINATOR;881881-#if 1882882- Elem->MsgLen = sizeof(DelbaReq);883883- NdisMoveMemory(Elem->Msg, &DelbaReq, sizeof(DelbaReq));884884- MlmeDELBAAction(pAd, Elem);885885- kfree(Elem);886886-#else887887- MlmeEnqueue(pAd, ACTION_STATE_MACHINE, MT2_MLME_ORI_DELBA_CATE, sizeof(MLME_DELBA_REQ_STRUCT), (PVOID)&DelbaReq);888888- RT28XX_MLME_HANDLER(pAd);889889-#endif890890- }891891-892892- return;893893- }894894-895895- DBGPRINT(RT_DEBUG_TRACE,("%s===>Wcid=%d.TID=%d \n", __func__, Wcid, TID));896896-897897- pBAEntry = &pAd->BATable.BAOriEntry[Idx];898898- DBGPRINT(RT_DEBUG_TRACE,("\t===>Idx = %ld, Wcid=%d.TID=%d, ORI_BA_Status = %d \n", Idx, Wcid, TID, pBAEntry->ORI_BA_Status));899899- //900900- // Prepare DelBA action frame and send to the peer.901901- //902902- if ((bPassive == FALSE) && (TID == pBAEntry->TID) && (pBAEntry->ORI_BA_Status == Originator_Done))903903- {904904- MLME_DELBA_REQ_STRUCT DelbaReq;905905- MLME_QUEUE_ELEM *Elem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);906906-907907- NdisZeroMemory(&DelbaReq, sizeof(DelbaReq));908908- NdisZeroMemory(Elem, sizeof(MLME_QUEUE_ELEM));909909-910910- COPY_MAC_ADDR(DelbaReq.Addr, pAd->MacTab.Content[Wcid].Addr);911911- DelbaReq.Wcid = Wcid;912912- DelbaReq.TID = pBAEntry->TID;913913- DelbaReq.Initiator = ORIGINATOR;914914-#if 1915915- Elem->MsgLen = sizeof(DelbaReq);916916- NdisMoveMemory(Elem->Msg, &DelbaReq, sizeof(DelbaReq));917917- MlmeDELBAAction(pAd, Elem);918918- kfree(Elem);919919-#else920920- MlmeEnqueue(pAd, ACTION_STATE_MACHINE, MT2_MLME_ORI_DELBA_CATE, sizeof(MLME_DELBA_REQ_STRUCT), (PVOID)&DelbaReq);921921- RT28XX_MLME_HANDLER(pAd);922922-#endif923923- }924924- RTMPCancelTimer(&pBAEntry->ORIBATimer, &Cancelled);925925- BATableFreeOriEntry(pAd, Idx);926926-927927- if (bPassive)928928- {929929- //BAOriSessionSetUp(pAd, &pAd->MacTab.Content[Wcid], TID, 0, 10000, TRUE);930930- }931931-}932932-933933-VOID BARecSessionTearDown(934934- IN OUT PRTMP_ADAPTER pAd,935935- IN UCHAR Wcid,936936- IN UCHAR TID,937937- IN BOOLEAN bPassive)938938-{939939- ULONG Idx = 0;940940- BA_REC_ENTRY *pBAEntry;941941-942942- if (Wcid >= MAX_LEN_OF_MAC_TABLE)943943- {944944- return;945945- }946946-947947- //948948- // Locate corresponding BA Originator Entry in BA Table with the (pAddr,TID).949949- //950950- Idx = pAd->MacTab.Content[Wcid].BARecWcidArray[TID];951951- if (Idx == 0)952952- return;953953-954954- DBGPRINT(RT_DEBUG_TRACE,("%s===>Wcid=%d.TID=%d \n", __func__, Wcid, TID));955955-956956-957957- pBAEntry = &pAd->BATable.BARecEntry[Idx];958958- DBGPRINT(RT_DEBUG_TRACE,("\t===>Idx = %ld, Wcid=%d.TID=%d, REC_BA_Status = %d \n", Idx, Wcid, TID, pBAEntry->REC_BA_Status));959959- //960960- // Prepare DelBA action frame and send to the peer.961961- //962962- if ((TID == pBAEntry->TID) && (pBAEntry->REC_BA_Status == Recipient_Accept))963963- {964964- MLME_DELBA_REQ_STRUCT DelbaReq;965965- BOOLEAN Cancelled;966966- MLME_QUEUE_ELEM *Elem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);967967- //ULONG offset;968968- //UINT32 VALUE;969969-970970- RTMPCancelTimer(&pBAEntry->RECBATimer, &Cancelled);971971-972972- //973973- // 1. Send DELBA Action Frame974974- //975975- if (bPassive == FALSE)976976- {977977- NdisZeroMemory(&DelbaReq, sizeof(DelbaReq));978978- NdisZeroMemory(Elem, sizeof(MLME_QUEUE_ELEM));979979-980980- COPY_MAC_ADDR(DelbaReq.Addr, pAd->MacTab.Content[Wcid].Addr);981981- DelbaReq.Wcid = Wcid;982982- DelbaReq.TID = TID;983983- DelbaReq.Initiator = RECIPIENT;984984-#if 1985985- Elem->MsgLen = sizeof(DelbaReq);986986- NdisMoveMemory(Elem->Msg, &DelbaReq, sizeof(DelbaReq));987987- MlmeDELBAAction(pAd, Elem);988988- kfree(Elem);989989-#else990990- MlmeEnqueue(pAd, ACTION_STATE_MACHINE, MT2_MLME_ORI_DELBA_CATE, sizeof(MLME_DELBA_REQ_STRUCT), (PVOID)&DelbaReq);991991- RT28XX_MLME_HANDLER(pAd);992992-#endif993993- }994994-995995-996996- //997997- // 2. Free resource of BA session998998- //999999- // flush all pending reordering mpdus10001000- ba_refresh_reordering_mpdus(pAd, pBAEntry);10011001-10021002- NdisAcquireSpinLock(&pAd->BATabLock);10031003-10041004- // Erase Bitmap flag.10051005- pBAEntry->LastIndSeq = RESET_RCV_SEQ;10061006- pBAEntry->BAWinSize = 0;10071007- // Erase Bitmap flag at software mactable10081008- pAd->MacTab.Content[Wcid].RXBAbitmap &= (~(1<<(pBAEntry->TID)));10091009- pAd->MacTab.Content[Wcid].BARecWcidArray[TID] = 0;10101010-10111011- RT28XX_DEL_BA_SESSION_FROM_ASIC(pAd, Wcid, TID);10121012-10131013- NdisReleaseSpinLock(&pAd->BATabLock);10141014-10151015- }10161016-10171017- BATableFreeRecEntry(pAd, Idx);10181018-}10191019-10201020-VOID BASessionTearDownALL(10211021- IN OUT PRTMP_ADAPTER pAd,10221022- IN UCHAR Wcid)10231023-{10241024- int i;10251025-10261026- for (i=0; i<NUM_OF_TID; i++)10271027- {10281028- BAOriSessionTearDown(pAd, Wcid, i, FALSE, FALSE);10291029- BARecSessionTearDown(pAd, Wcid, i, FALSE);10301030- }10311031-}10321032-10331033-10341034-/*10351035- ==========================================================================10361036- Description:10371037- Retry sending ADDBA Reqest.10381038-10391039- IRQL = DISPATCH_LEVEL10401040-10411041- Parametrs:10421042- p8023Header: if this is already 802.3 format, p8023Header is NULL10431043-10441044- Return : TRUE if put into rx reordering buffer, shouldn't indicaterxhere.10451045- FALSE , then continue indicaterx at this moment.10461046- ==========================================================================10471047- */10481048-VOID BAOriSessionSetupTimeout(10491049- IN PVOID SystemSpecific1,10501050- IN PVOID FunctionContext,10511051- IN PVOID SystemSpecific2,10521052- IN PVOID SystemSpecific3)10531053-{10541054- BA_ORI_ENTRY *pBAEntry = (BA_ORI_ENTRY *)FunctionContext;10551055- MAC_TABLE_ENTRY *pEntry;10561056- PRTMP_ADAPTER pAd;10571057-10581058- if (pBAEntry == NULL)10591059- return;10601060-10611061- pAd = pBAEntry->pAdapter;10621062-10631063- // Do nothing if monitor mode is on10641064- if (MONITOR_ON(pAd))10651065- return;10661066-10671067- pEntry = &pAd->MacTab.Content[pBAEntry->Wcid];10681068-10691069- if ((pBAEntry->ORI_BA_Status == Originator_WaitRes) && (pBAEntry->Token < ORI_SESSION_MAX_RETRY))10701070- {10711071- MLME_ADDBA_REQ_STRUCT AddbaReq;10721072-10731073- NdisZeroMemory(&AddbaReq, sizeof(AddbaReq));10741074- COPY_MAC_ADDR(AddbaReq.pAddr, pEntry->Addr);10751075- AddbaReq.Wcid = (UCHAR)(pEntry->Aid);10761076- AddbaReq.TID = pBAEntry->TID;10771077- AddbaReq.BaBufSize = pAd->CommonCfg.BACapability.field.RxBAWinLimit;10781078- AddbaReq.TimeOutValue = 0;10791079- AddbaReq.Token = pBAEntry->Token;10801080- MlmeEnqueue(pAd, ACTION_STATE_MACHINE, MT2_MLME_ADD_BA_CATE, sizeof(MLME_ADDBA_REQ_STRUCT), (PVOID)&AddbaReq);10811081- RT28XX_MLME_HANDLER(pAd);10821082-#ifndef RT30xx10831083- DBGPRINT(RT_DEBUG_TRACE,("BA Ori Session Timeout(%d) : Send ADD BA again\n", pBAEntry->Token));10841084-#endif10851085-#ifdef RT30xx10861086- DBGPRINT(RT_DEBUG_TRACE,("BA Ori Session Timeout(%d) to %02x:%02x:%02x:%02x:%02x:%02x Tid:%d Wcid:%d\n"10871087- ,pBAEntry->Token10881088- ,pEntry->Addr[0],pEntry->Addr[1],pEntry->Addr[2]10891089- ,pEntry->Addr[3],pEntry->Addr[4],pEntry->Addr[5]10901090- ,pBAEntry->TID,pEntry->Aid));10911091-#endif10921092- pBAEntry->Token++;10931093- RTMPSetTimer(&pBAEntry->ORIBATimer, ORI_BA_SESSION_TIMEOUT);10941094- }10951095- else10961096- {10971097- BATableFreeOriEntry(pAd, pEntry->BAOriWcidArray[pBAEntry->TID]);10981098- }10991099-}11001100-11011101-/*11021102- ==========================================================================11031103- Description:11041104- Retry sending ADDBA Reqest.11051105-11061106- IRQL = DISPATCH_LEVEL11071107-11081108- Parametrs:11091109- p8023Header: if this is already 802.3 format, p8023Header is NULL11101110-11111111- Return : TRUE if put into rx reordering buffer, shouldn't indicaterxhere.11121112- FALSE , then continue indicaterx at this moment.11131113- ==========================================================================11141114- */11151115-VOID BARecSessionIdleTimeout(11161116- IN PVOID SystemSpecific1,11171117- IN PVOID FunctionContext,11181118- IN PVOID SystemSpecific2,11191119- IN PVOID SystemSpecific3)11201120-{11211121-11221122- BA_REC_ENTRY *pBAEntry = (BA_REC_ENTRY *)FunctionContext;11231123- PRTMP_ADAPTER pAd;11241124- ULONG Now32;11251125-11261126- if (pBAEntry == NULL)11271127- return;11281128-11291129- if ((pBAEntry->REC_BA_Status == Recipient_Accept))11301130- {11311131- NdisGetSystemUpTime(&Now32);11321132-11331133- if (RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer + REC_BA_SESSION_IDLE_TIMEOUT)))11341134- {11351135- pAd = pBAEntry->pAdapter;11361136- // flush all pending reordering mpdus11371137- ba_refresh_reordering_mpdus(pAd, pBAEntry);11381138- printk("%ld: REC BA session Timeout\n", Now32);11391139- }11401140- }11411141-}11421142-11431143-11441144-VOID PeerAddBAReqAction(11451145- IN PRTMP_ADAPTER pAd,11461146- IN MLME_QUEUE_ELEM *Elem)11471147-11481148-{11491149- // 7.4.4.111501150- //ULONG Idx;11511151- UCHAR Status = 1;11521152- UCHAR pAddr[6];11531153- FRAME_ADDBA_RSP ADDframe;11541154- PUCHAR pOutBuffer = NULL;11551155- NDIS_STATUS NStatus;11561156- PFRAME_ADDBA_REQ pAddreqFrame = NULL;11571157- //UCHAR BufSize;11581158- ULONG FrameLen;11591159- PULONG ptemp;11601160- PMAC_TABLE_ENTRY pMacEntry;11611161-11621162- DBGPRINT(RT_DEBUG_TRACE, ("%s ==> (Wcid = %d)\n", __func__, Elem->Wcid));11631163-11641164- //hex_dump("AddBAReq", Elem->Msg, Elem->MsgLen);11651165-11661166- //ADDBA Request from unknown peer, ignore this.11671167- if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE)11681168- return;11691169-11701170- pMacEntry = &pAd->MacTab.Content[Elem->Wcid];11711171- DBGPRINT(RT_DEBUG_TRACE,("BA - PeerAddBAReqAction----> \n"));11721172- ptemp = (PULONG)Elem->Msg;11731173- //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)));11741174-11751175- if (PeerAddBAReqActionSanity(pAd, Elem->Msg, Elem->MsgLen, pAddr))11761176- {11771177-11781178- if ((pAd->CommonCfg.bBADecline == FALSE) && IS_HT_STA(pMacEntry))11791179- {11801180- pAddreqFrame = (PFRAME_ADDBA_REQ)(&Elem->Msg[0]);11811181- printk("Rcv Wcid(%d) AddBAReq\n", Elem->Wcid);11821182- if (BARecSessionAdd(pAd, &pAd->MacTab.Content[Elem->Wcid], pAddreqFrame))11831183- Status = 0;11841184- else11851185- Status = 38; // more parameters have invalid values11861186- }11871187- else11881188- {11891189- Status = 37; // the request has been declined.11901190- }11911191- }11921192-11931193- if (pAd->MacTab.Content[Elem->Wcid].ValidAsCLI)11941194- ASSERT(pAd->MacTab.Content[Elem->Wcid].Sst == SST_ASSOC);11951195-11961196- pAddreqFrame = (PFRAME_ADDBA_REQ)(&Elem->Msg[0]);11971197- // 2. Always send back ADDBA Response11981198- NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory11991199- if (NStatus != NDIS_STATUS_SUCCESS)12001200- {12011201- DBGPRINT(RT_DEBUG_TRACE,("ACTION - PeerBAAction() allocate memory failed \n"));12021202- return;12031203- }12041204-12051205- NdisZeroMemory(&ADDframe, sizeof(FRAME_ADDBA_RSP));12061206-12071207- // 2-1. Prepare ADDBA Response frame.12081208- {12091209- if (ADHOC_ON(pAd))12101210- ActHeaderInit(pAd, &ADDframe.Hdr, pAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);12111211- else12121212- ActHeaderInit(pAd, &ADDframe.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAddr);12131213- }12141214-12151215- ADDframe.Category = CATEGORY_BA;12161216- ADDframe.Action = ADDBA_RESP;12171217- ADDframe.Token = pAddreqFrame->Token;12181218- // What is the Status code?? need to check.12191219- ADDframe.StatusCode = Status;12201220- ADDframe.BaParm.BAPolicy = IMMED_BA;12211221- ADDframe.BaParm.AMSDUSupported = 0;12221222- ADDframe.BaParm.TID = pAddreqFrame->BaParm.TID;12231223- ADDframe.BaParm.BufSize = min(((UCHAR)pAddreqFrame->BaParm.BufSize), (UCHAR)pAd->CommonCfg.BACapability.field.RxBAWinLimit);12241224- if (ADDframe.BaParm.BufSize == 0)12251225- {12261226- ADDframe.BaParm.BufSize = 64;12271227- }12281228- ADDframe.TimeOutValue = 0; //pAddreqFrame->TimeOutValue;12291229-12301230- *(USHORT *)(&ADDframe.BaParm) = cpu2le16(*(USHORT *)(&ADDframe.BaParm));12311231- ADDframe.StatusCode = cpu2le16(ADDframe.StatusCode);12321232- ADDframe.TimeOutValue = cpu2le16(ADDframe.TimeOutValue);12331233-12341234- MakeOutgoingFrame(pOutBuffer, &FrameLen,12351235- sizeof(FRAME_ADDBA_RSP), &ADDframe,12361236- END_OF_ARGS);12371237- MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);12381238- MlmeFreeMemory(pAd, pOutBuffer);12391239-12401240- DBGPRINT(RT_DEBUG_TRACE, ("%s(%d): TID(%d), BufSize(%d) <== \n", __func__, Elem->Wcid, ADDframe.BaParm.TID,12411241- ADDframe.BaParm.BufSize));12421242-}12431243-12441244-12451245-VOID PeerAddBARspAction(12461246- IN PRTMP_ADAPTER pAd,12471247- IN MLME_QUEUE_ELEM *Elem)12481248-12491249-{12501250- //UCHAR Idx, i;12511251- //PUCHAR pOutBuffer = NULL;12521252- PFRAME_ADDBA_RSP pFrame = NULL;12531253- //PBA_ORI_ENTRY pBAEntry;12541254-12551255- //ADDBA Response from unknown peer, ignore this.12561256- if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE)12571257- return;12581258-12591259- DBGPRINT(RT_DEBUG_TRACE, ("%s ==> Wcid(%d)\n", __func__, Elem->Wcid));12601260-12611261- //hex_dump("PeerAddBARspAction()", Elem->Msg, Elem->MsgLen);12621262-12631263- if (PeerAddBARspActionSanity(pAd, Elem->Msg, Elem->MsgLen))12641264- {12651265- pFrame = (PFRAME_ADDBA_RSP)(&Elem->Msg[0]);12661266-12671267- DBGPRINT(RT_DEBUG_TRACE, ("\t\t StatusCode = %d\n", pFrame->StatusCode));12681268- switch (pFrame->StatusCode)12691269- {12701270- case 0:12711271- // I want a BAsession with this peer as an originator.12721272- BAOriSessionAdd(pAd, &pAd->MacTab.Content[Elem->Wcid], pFrame);12731273- break;12741274- default:12751275- // check status == USED ???12761276- BAOriSessionTearDown(pAd, Elem->Wcid, pFrame->BaParm.TID, TRUE, FALSE);12771277- break;12781278- }12791279- // Rcv Decline StatusCode12801280- if ((pFrame->StatusCode == 37)12811281- || ((pAd->OpMode == OPMODE_STA) && STA_TGN_WIFI_ON(pAd) && (pFrame->StatusCode != 0))12821282- )12831283- {12841284- pAd->MacTab.Content[Elem->Wcid].BADeclineBitmap |= 1<<pFrame->BaParm.TID;12851285- }12861286- }12871287-}12881288-12891289-VOID PeerDelBAAction(12901290- IN PRTMP_ADAPTER pAd,12911291- IN MLME_QUEUE_ELEM *Elem)12921292-12931293-{12941294- //UCHAR Idx;12951295- //PUCHAR pOutBuffer = NULL;12961296- PFRAME_DELBA_REQ pDelFrame = NULL;12971297-12981298- DBGPRINT(RT_DEBUG_TRACE,("%s ==>\n", __func__));12991299- //DELBA Request from unknown peer, ignore this.13001300- if (PeerDelBAActionSanity(pAd, Elem->Wcid, Elem->Msg, Elem->MsgLen))13011301- {13021302- pDelFrame = (PFRAME_DELBA_REQ)(&Elem->Msg[0]);13031303- if (pDelFrame->DelbaParm.Initiator == ORIGINATOR)13041304- {13051305- DBGPRINT(RT_DEBUG_TRACE,("BA - PeerDelBAAction----> ORIGINATOR\n"));13061306- BARecSessionTearDown(pAd, Elem->Wcid, pDelFrame->DelbaParm.TID, TRUE);13071307- }13081308- else13091309- {13101310- DBGPRINT(RT_DEBUG_TRACE,("BA - PeerDelBAAction----> RECIPIENT, Reason = %d\n", pDelFrame->ReasonCode));13111311- //hex_dump("DelBA Frame", pDelFrame, Elem->MsgLen);13121312- BAOriSessionTearDown(pAd, Elem->Wcid, pDelFrame->DelbaParm.TID, TRUE, FALSE);13131313- }13141314- }13151315-}13161316-13171317-13181318-BOOLEAN CntlEnqueueForRecv(13191319- IN PRTMP_ADAPTER pAd,13201320- IN ULONG Wcid,13211321- IN ULONG MsgLen,13221322- IN PFRAME_BA_REQ pMsg)13231323-{13241324- PFRAME_BA_REQ pFrame = pMsg;13251325- //PRTMP_REORDERBUF pBuffer;13261326- //PRTMP_REORDERBUF pDmaBuf;13271327- PBA_REC_ENTRY pBAEntry;13281328- //BOOLEAN Result;13291329- ULONG Idx;13301330- //UCHAR NumRxPkt;13311331- UCHAR TID;//, i;13321332-13331333- TID = (UCHAR)pFrame->BARControl.TID;13341334-13351335- DBGPRINT(RT_DEBUG_TRACE, ("%s(): BAR-Wcid(%ld), Tid (%d)\n", __func__, Wcid, TID));13361336- //hex_dump("BAR", (PCHAR) pFrame, MsgLen);13371337- // Do nothing if the driver is starting halt state.13381338- // This might happen when timer already been fired before cancel timer with mlmehalt13391339- if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))13401340- return FALSE;13411341-13421342- // First check the size, it MUST not exceed the mlme queue size13431343- if (MsgLen > MGMT_DMA_BUFFER_SIZE)13441344- {13451345- DBGPRINT_ERR(("CntlEnqueueForRecv: frame too large, size = %ld \n", MsgLen));13461346- return FALSE;13471347- }13481348- else if (MsgLen != sizeof(FRAME_BA_REQ))13491349- {13501350- DBGPRINT_ERR(("CntlEnqueueForRecv: BlockAck Request frame length size = %ld incorrect\n", MsgLen));13511351- return FALSE;13521352- }13531353- else if (MsgLen != sizeof(FRAME_BA_REQ))13541354- {13551355- DBGPRINT_ERR(("CntlEnqueueForRecv: BlockAck Request frame length size = %ld incorrect\n", MsgLen));13561356- return FALSE;13571357- }13581358-13591359- if ((Wcid < MAX_LEN_OF_MAC_TABLE) && (TID < 8))13601360- {13611361- // if this receiving packet is from SA that is in our OriEntry. Since WCID <9 has direct mapping. no need search.13621362- Idx = pAd->MacTab.Content[Wcid].BARecWcidArray[TID];13631363- pBAEntry = &pAd->BATable.BARecEntry[Idx];13641364- }13651365- else13661366- {13671367- return FALSE;13681368- }13691369-13701370- DBGPRINT(RT_DEBUG_TRACE, ("BAR(%ld) : Tid (%d) - %04x:%04x\n", Wcid, TID, pFrame->BAStartingSeq.field.StartSeq, pBAEntry->LastIndSeq ));13711371-13721372- if (SEQ_SMALLER(pBAEntry->LastIndSeq, pFrame->BAStartingSeq.field.StartSeq, MAXSEQ))13731373- {13741374- //printk("BAR Seq = %x, LastIndSeq = %x\n", pFrame->BAStartingSeq.field.StartSeq, pBAEntry->LastIndSeq);13751375- ba_indicate_reordering_mpdus_le_seq(pAd, pBAEntry, pFrame->BAStartingSeq.field.StartSeq);13761376- pBAEntry->LastIndSeq = (pFrame->BAStartingSeq.field.StartSeq == 0) ? MAXSEQ :(pFrame->BAStartingSeq.field.StartSeq -1);13771377- }13781378- //ba_refresh_reordering_mpdus(pAd, pBAEntry);13791379- return TRUE;13801380-}13811381-13821382-/*13831383-Description : Send PSMP Action frame If PSMP mode switches.13841384-*/13851385-VOID SendPSMPAction(13861386- IN PRTMP_ADAPTER pAd,13871387- IN UCHAR Wcid,13881388- IN UCHAR Psmp)13891389-{13901390- PUCHAR pOutBuffer = NULL;13911391- NDIS_STATUS NStatus;13921392- //ULONG Idx;13931393- FRAME_PSMP_ACTION Frame;13941394- ULONG FrameLen;13951395-#ifdef RT30xx13961396- UCHAR bbpdata=0;13971397- UINT32 macdata;13981398-#endif // RT30xx //13991399-14001400- NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory14011401- if (NStatus != NDIS_STATUS_SUCCESS)14021402- {14031403- DBGPRINT(RT_DEBUG_ERROR,("BA - MlmeADDBAAction() allocate memory failed \n"));14041404- return;14051405- }14061406-14071407- ActHeaderInit(pAd, &Frame.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAd->MacTab.Content[Wcid].Addr);14081408-14091409- Frame.Category = CATEGORY_HT;14101410- Frame.Action = SMPS_ACTION;14111411- switch (Psmp)14121412- {14131413- case MMPS_ENABLE:14141414-#ifdef RT30xx14151415- if (IS_RT3090(pAd))14161416- {14171417- // disable MMPS BBP control register14181418- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &bbpdata);14191419- bbpdata &= ~(0x04); //bit 214201420- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, bbpdata);14211421-14221422- // disable MMPS MAC control register14231423- RTMP_IO_READ32(pAd, 0x1210, &macdata);14241424- macdata &= ~(0x09); //bit 0, 314251425- RTMP_IO_WRITE32(pAd, 0x1210, macdata);14261426- }14271427-#endif // RT30xx //14281428- Frame.Psmp = 0;14291429- break;14301430- case MMPS_DYNAMIC:14311431-#ifdef RT30xx14321432- if (IS_RT3090(pAd))14331433- {14341434- // enable MMPS BBP control register14351435- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &bbpdata);14361436- bbpdata |= 0x04; //bit 214371437- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, bbpdata);14381438-14391439- // enable MMPS MAC control register14401440- RTMP_IO_READ32(pAd, 0x1210, &macdata);14411441- macdata |= 0x09; //bit 0, 314421442- RTMP_IO_WRITE32(pAd, 0x1210, macdata);14431443- }14441444-#endif // RT30xx //14451445- Frame.Psmp = 3;14461446- break;14471447- case MMPS_STATIC:14481448-#ifdef RT30xx14491449- if (IS_RT3090(pAd))14501450- {14511451- // enable MMPS BBP control register14521452- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &bbpdata);14531453- bbpdata |= 0x04; //bit 214541454- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, bbpdata);14551455-14561456- // enable MMPS MAC control register14571457- RTMP_IO_READ32(pAd, 0x1210, &macdata);14581458- macdata |= 0x09; //bit 0, 314591459- RTMP_IO_WRITE32(pAd, 0x1210, macdata);14601460- }14611461-#endif // RT30xx //14621462- Frame.Psmp = 1;14631463- break;14641464- }14651465- MakeOutgoingFrame(pOutBuffer, &FrameLen,14661466- sizeof(FRAME_PSMP_ACTION), &Frame,14671467- END_OF_ARGS);14681468- MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);14691469- MlmeFreeMemory(pAd, pOutBuffer);14701470- DBGPRINT(RT_DEBUG_ERROR,("HT - SendPSMPAction( %d ) \n", Frame.Psmp));14711471-}14721472-14731473-14741474-#define RADIO_MEASUREMENT_REQUEST_ACTION 014751475-14761476-typedef struct PACKED14771477-{14781478- UCHAR RegulatoryClass;14791479- UCHAR ChannelNumber;14801480- USHORT RandomInterval;14811481- USHORT MeasurementDuration;14821482- UCHAR MeasurementMode;14831483- UCHAR BSSID[MAC_ADDR_LEN];14841484- UCHAR ReportingCondition;14851485- UCHAR Threshold;14861486- UCHAR SSIDIE[2]; // 2 byte14871487-} BEACON_REQUEST;14881488-14891489-typedef struct PACKED14901490-{14911491- UCHAR ID;14921492- UCHAR Length;14931493- UCHAR Token;14941494- UCHAR RequestMode;14951495- UCHAR Type;14961496-} MEASUREMENT_REQ;14971497-14981498-14991499-15001500-15011501-void convert_reordering_packet_to_preAMSDU_or_802_3_packet(15021502- IN PRTMP_ADAPTER pAd,15031503- IN RX_BLK *pRxBlk,15041504- IN UCHAR FromWhichBSSID)15051505-{15061506- PNDIS_PACKET pRxPkt;15071507- UCHAR Header802_3[LENGTH_802_3];15081508-15091509- // 1. get 802.3 Header15101510- // 2. remove LLC15111511- // a. pointer pRxBlk->pData to payload15121512- // b. modify pRxBlk->DataSize15131513-15141514- RTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3);15151515-15161516- ASSERT(pRxBlk->pRxPacket);15171517- pRxPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);15181518-15191519- RTPKT_TO_OSPKT(pRxPkt)->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);15201520- RTPKT_TO_OSPKT(pRxPkt)->data = pRxBlk->pData;15211521- RTPKT_TO_OSPKT(pRxPkt)->len = pRxBlk->DataSize;15221522- RTPKT_TO_OSPKT(pRxPkt)->tail = RTPKT_TO_OSPKT(pRxPkt)->data + RTPKT_TO_OSPKT(pRxPkt)->len;15231523-15241524- //15251525- // copy 802.3 header, if necessary15261526- //15271527- if (!RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU))15281528- {15291529-#ifdef LINUX15301530- NdisMoveMemory(skb_push(pRxPkt, LENGTH_802_3), Header802_3, LENGTH_802_3);15311531-#endif15321532- }15331533-}15341534-15351535-15361536-#define INDICATE_LEGACY_OR_AMSDU(_pAd, _pRxBlk, _fromWhichBSSID) \15371537- do \15381538- { \15391539- if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_AMSDU)) \15401540- { \15411541- Indicate_AMSDU_Packet(_pAd, _pRxBlk, _fromWhichBSSID); \15421542- } \15431543- else if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_EAP)) \15441544- { \15451545- Indicate_EAPOL_Packet(_pAd, _pRxBlk, _fromWhichBSSID); \15461546- } \15471547- else \15481548- { \15491549- Indicate_Legacy_Packet(_pAd, _pRxBlk, _fromWhichBSSID); \15501550- } \15511551- } while (0);15521552-15531553-15541554-15551555-static VOID ba_enqueue_reordering_packet(15561556- IN PRTMP_ADAPTER pAd,15571557- IN PBA_REC_ENTRY pBAEntry,15581558- IN RX_BLK *pRxBlk,15591559- IN UCHAR FromWhichBSSID)15601560-{15611561- struct reordering_mpdu *mpdu_blk;15621562- UINT16 Sequence = (UINT16) pRxBlk->pHeader->Sequence;15631563-15641564- mpdu_blk = ba_mpdu_blk_alloc(pAd);15651565- if (mpdu_blk != NULL)15661566- {15671567- // Write RxD buffer address & allocated buffer length15681568- NdisAcquireSpinLock(&pBAEntry->RxReRingLock);15691569-15701570- mpdu_blk->Sequence = Sequence;15711571-15721572- mpdu_blk->bAMSDU = RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU);15731573-15741574- convert_reordering_packet_to_preAMSDU_or_802_3_packet(pAd, pRxBlk, FromWhichBSSID);15751575-15761576- STATS_INC_RX_PACKETS(pAd, FromWhichBSSID);15771577-15781578- //15791579- // it is necessary for reordering packet to record15801580- // which BSS it come from15811581- //15821582- RTMP_SET_PACKET_IF(pRxBlk->pRxPacket, FromWhichBSSID);15831583-15841584- mpdu_blk->pPacket = pRxBlk->pRxPacket;15851585-15861586- if (ba_reordering_mpdu_insertsorted(&pBAEntry->list, mpdu_blk) == FALSE)15871587- {15881588- // had been already within reordering list15891589- // don't indicate15901590- RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_SUCCESS);15911591- ba_mpdu_blk_free(pAd, mpdu_blk);15921592- }15931593-15941594- ASSERT((0<= pBAEntry->list.qlen) && (pBAEntry->list.qlen <= pBAEntry->BAWinSize));15951595- NdisReleaseSpinLock(&pBAEntry->RxReRingLock);15961596- }15971597- else15981598- {15991599- DBGPRINT(RT_DEBUG_ERROR, ("!!! (%d) Can't allocate reordering mpdu blk\n",16001600- pBAEntry->list.qlen));16011601-16021602- /*16031603- * flush all pending reordering mpdus16041604- * and receving mpdu to upper layer16051605- * make tcp/ip to take care reordering mechanism16061606- */16071607- //ba_refresh_reordering_mpdus(pAd, pBAEntry);16081608- ba_indicate_reordering_mpdus_le_seq(pAd, pBAEntry, Sequence);16091609-16101610- pBAEntry->LastIndSeq = Sequence;16111611- INDICATE_LEGACY_OR_AMSDU(pAd, pRxBlk, FromWhichBSSID);16121612- }16131613-}16141614-16151615-16161616-/*16171617- ==========================================================================16181618- Description:16191619- Indicate this packet to upper layer or put it into reordering buffer16201620-16211621- Parametrs:16221622- pRxBlk : carry necessary packet info 802.11 format16231623- FromWhichBSSID : the packet received from which BSS16241624-16251625- Return :16261626- none16271627-16281628- Note :16291629- the packet queued into reordering buffer need to cover to 802.3 format16301630- or pre_AMSDU format16311631- ==========================================================================16321632- */16331633-16341634-VOID Indicate_AMPDU_Packet(16351635- IN PRTMP_ADAPTER pAd,16361636- IN RX_BLK *pRxBlk,16371637- IN UCHAR FromWhichBSSID)16381638-{16391639- USHORT Idx;16401640- PBA_REC_ENTRY pBAEntry = NULL;16411641- UINT16 Sequence = pRxBlk->pHeader->Sequence;16421642- ULONG Now32;16431643- UCHAR Wcid = pRxBlk->pRxWI->WirelessCliID;16441644- UCHAR TID = pRxBlk->pRxWI->TID;16451645-16461646-16471647- if (!RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU) && (pRxBlk->DataSize > MAX_RX_PKT_LEN))16481648- {16491649- // release packet16501650- RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);16511651- return;16521652- }16531653-16541654- if (Wcid < MAX_LEN_OF_MAC_TABLE)16551655- {16561656- Idx = pAd->MacTab.Content[Wcid].BARecWcidArray[TID];16571657- if (Idx == 0)16581658- {16591659- /* Rec BA Session had been torn down */16601660- INDICATE_LEGACY_OR_AMSDU(pAd, pRxBlk, FromWhichBSSID);16611661- return;16621662- }16631663- pBAEntry = &pAd->BATable.BARecEntry[Idx];16641664- }16651665- else16661666- {16671667- // impossible !!!16681668- ASSERT(0);16691669- // release packet16701670- RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);16711671- return;16721672- }16731673-16741674- ASSERT(pBAEntry);16751675-16761676- // update last rx time16771677- NdisGetSystemUpTime(&Now32);16781678-16791679- pBAEntry->rcvSeq = Sequence;16801680-16811681-16821682- ba_flush_reordering_timeout_mpdus(pAd, pBAEntry, Now32);16831683- pBAEntry->LastIndSeqAtTimer = Now32;16841684-16851685- //16861686- // Reset Last Indicate Sequence16871687- //16881688- if (pBAEntry->LastIndSeq == RESET_RCV_SEQ)16891689- {16901690- ASSERT((pBAEntry->list.qlen == 0) && (pBAEntry->list.next == NULL));16911691-16921692- // reset rcv sequence of BA session16931693- pBAEntry->LastIndSeq = Sequence;16941694- pBAEntry->LastIndSeqAtTimer = Now32;16951695- INDICATE_LEGACY_OR_AMSDU(pAd, pRxBlk, FromWhichBSSID);16961696- return;16971697- }16981698-16991699-17001700- //17011701- // I. Check if in order.17021702- //17031703- if (SEQ_STEPONE(Sequence, pBAEntry->LastIndSeq, MAXSEQ))17041704- {17051705- USHORT LastIndSeq;17061706-17071707- pBAEntry->LastIndSeq = Sequence;17081708- INDICATE_LEGACY_OR_AMSDU(pAd, pRxBlk, FromWhichBSSID);17091709- LastIndSeq = ba_indicate_reordering_mpdus_in_order(pAd, pBAEntry, pBAEntry->LastIndSeq);17101710- if (LastIndSeq != RESET_RCV_SEQ)17111711- {17121712- pBAEntry->LastIndSeq = LastIndSeq;17131713- }17141714- pBAEntry->LastIndSeqAtTimer = Now32;17151715- }17161716- //17171717- // II. Drop Duplicated Packet17181718- //17191719- else if (Sequence == pBAEntry->LastIndSeq)17201720- {17211721-17221722- // drop and release packet17231723- pBAEntry->nDropPacket++;17241724- RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);17251725- }17261726- //17271727- // III. Drop Old Received Packet17281728- //17291729- else if (SEQ_SMALLER(Sequence, pBAEntry->LastIndSeq, MAXSEQ))17301730- {17311731-17321732- // drop and release packet17331733- pBAEntry->nDropPacket++;17341734- RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);17351735- }17361736- //17371737- // IV. Receive Sequence within Window Size17381738- //17391739- else if (SEQ_SMALLER(Sequence, (((pBAEntry->LastIndSeq+pBAEntry->BAWinSize+1)) & MAXSEQ), MAXSEQ))17401740- {17411741- ba_enqueue_reordering_packet(pAd, pBAEntry, pRxBlk, FromWhichBSSID);17421742- }17431743- //17441744- // V. Receive seq surpasses Win(lastseq + nMSDU). So refresh all reorder buffer17451745- //17461746- else17471747- {17481748- LONG WinStartSeq, TmpSeq;17491749-17501750-17511751- TmpSeq = Sequence - (pBAEntry->BAWinSize) -1;17521752- if (TmpSeq < 0)17531753- {17541754- TmpSeq = (MAXSEQ+1) + TmpSeq;17551755- }17561756- WinStartSeq = (TmpSeq+1) & MAXSEQ;17571757- ba_indicate_reordering_mpdus_le_seq(pAd, pBAEntry, WinStartSeq);17581758- pBAEntry->LastIndSeq = WinStartSeq; //TmpSeq;17591759-17601760- pBAEntry->LastIndSeqAtTimer = Now32;17611761-17621762- ba_enqueue_reordering_packet(pAd, pBAEntry, pRxBlk, FromWhichBSSID);17631763-17641764- TmpSeq = ba_indicate_reordering_mpdus_in_order(pAd, pBAEntry, pBAEntry->LastIndSeq);17651765- if (TmpSeq != RESET_RCV_SEQ)17661766- {17671767- pBAEntry->LastIndSeq = TmpSeq;17681768- }17691769- }17701770-}11+#include "../../rt2860/common/ba_action.c"
+1-2585
drivers/staging/rt2870/common/cmm_data.c
···11-/*22- *************************************************************************33- * Ralink Tech Inc.44- * 5F., No.36, Taiyuan St., Jhubei City,55- * Hsinchu County 302,66- * Taiwan, R.O.C.77- *88- * (c) Copyright 2002-2007, Ralink Technology, Inc.99- *1010- * This program is free software; you can redistribute it and/or modify *1111- * it under the terms of the GNU General Public License as published by *1212- * the Free Software Foundation; either version 2 of the License, or *1313- * (at your option) any later version. *1414- * *1515- * This program is distributed in the hope that it will be useful, *1616- * but WITHOUT ANY WARRANTY; without even the implied warranty of *1717- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *1818- * GNU General Public License for more details. *1919- * *2020- * You should have received a copy of the GNU General Public License *2121- * along with this program; if not, write to the *2222- * Free Software Foundation, Inc., *2323- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *2424- * *2525- *************************************************************************2626-*/2727-2828-#include "../rt_config.h"2929-3030-#define MAX_TX_IN_TBTT (16)3131-3232-3333-UCHAR SNAP_802_1H[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00};3434-UCHAR SNAP_BRIDGE_TUNNEL[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8};3535-// Add Cisco Aironet SNAP heade for CCX2 support3636-UCHAR SNAP_AIRONET[] = {0xaa, 0xaa, 0x03, 0x00, 0x40, 0x96, 0x00, 0x00};3737-UCHAR CKIP_LLC_SNAP[] = {0xaa, 0xaa, 0x03, 0x00, 0x40, 0x96, 0x00, 0x02};3838-UCHAR EAPOL_LLC_SNAP[]= {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, 0x88, 0x8e};3939-UCHAR EAPOL[] = {0x88, 0x8e};4040-UCHAR TPID[] = {0x81, 0x00}; /* VLAN related */4141-4242-UCHAR IPX[] = {0x81, 0x37};4343-UCHAR APPLE_TALK[] = {0x80, 0xf3};4444-UCHAR RateIdToPlcpSignal[12] = {4545- 0, /* RATE_1 */ 1, /* RATE_2 */ 2, /* RATE_5_5 */ 3, /* RATE_11 */ // see BBP spec4646- 11, /* RATE_6 */ 15, /* RATE_9 */ 10, /* RATE_12 */ 14, /* RATE_18 */ // see IEEE802.11a-1999 p.144747- 9, /* RATE_24 */ 13, /* RATE_36 */ 8, /* RATE_48 */ 12 /* RATE_54 */ }; // see IEEE802.11a-1999 p.144848-4949-UCHAR OfdmSignalToRateId[16] = {5050- RATE_54, RATE_54, RATE_54, RATE_54, // OFDM PLCP Signal = 0, 1, 2, 3 respectively5151- RATE_54, RATE_54, RATE_54, RATE_54, // OFDM PLCP Signal = 4, 5, 6, 7 respectively5252- RATE_48, RATE_24, RATE_12, RATE_6, // OFDM PLCP Signal = 8, 9, 10, 11 respectively5353- RATE_54, RATE_36, RATE_18, RATE_9, // OFDM PLCP Signal = 12, 13, 14, 15 respectively5454-};5555-5656-UCHAR OfdmRateToRxwiMCS[12] = {5757- 0, 0, 0, 0,5858- 0, 1, 2, 3, // OFDM rate 6,9,12,18 = rxwi mcs 0,1,2,35959- 4, 5, 6, 7, // OFDM rate 24,36,48,54 = rxwi mcs 4,5,6,76060-};6161-UCHAR RxwiMCSToOfdmRate[12] = {6262- RATE_6, RATE_9, RATE_12, RATE_18,6363- RATE_24, RATE_36, RATE_48, RATE_54, // OFDM rate 6,9,12,18 = rxwi mcs 0,1,2,36464- 4, 5, 6, 7, // OFDM rate 24,36,48,54 = rxwi mcs 4,5,6,76565-};6666-6767-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"};6868-6969-UCHAR default_cwmin[]={CW_MIN_IN_BITS, CW_MIN_IN_BITS, CW_MIN_IN_BITS-1, CW_MIN_IN_BITS-2};7070-UCHAR default_sta_aifsn[]={3,7,2,2};7171-7272-UCHAR 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};7373-7474-7575-/*7676- ========================================================================7777-7878- Routine Description:7979- API for MLME to transmit management frame to AP (BSS Mode)8080- or station (IBSS Mode)8181-8282- Arguments:8383- pAd Pointer to our adapter8484- pData Pointer to the outgoing 802.11 frame8585- Length Size of outgoing management frame8686-8787- Return Value:8888- NDIS_STATUS_FAILURE8989- NDIS_STATUS_PENDING9090- NDIS_STATUS_SUCCESS9191-9292- IRQL = PASSIVE_LEVEL9393- IRQL = DISPATCH_LEVEL9494-9595- Note:9696-9797- ========================================================================9898-*/9999-NDIS_STATUS MiniportMMRequest(100100- IN PRTMP_ADAPTER pAd,101101- IN UCHAR QueIdx,102102- IN PUCHAR pData,103103- IN UINT Length)104104-{105105- PNDIS_PACKET pPacket;106106- NDIS_STATUS Status = NDIS_STATUS_SUCCESS;107107- ULONG FreeNum;108108- UCHAR IrqState;109109- UCHAR rtmpHwHdr[TXINFO_SIZE + TXWI_SIZE]; //RTMP_HW_HDR_LEN];110110-111111- ASSERT(Length <= MGMT_DMA_BUFFER_SIZE);112112-113113- QueIdx=3;114114-115115- // 2860C use Tx Ring116116-117117- IrqState = pAd->irq_disabled;118118-119119- do120120- {121121- // Reset is in progress, stop immediately122122- if ( RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS) ||123123- RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)||124124- !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP))125125- {126126- Status = NDIS_STATUS_FAILURE;127127- break;128128- }129129-130130- // Check Free priority queue131131- // Since we use PBF Queue2 for management frame. Its corresponding DMA ring should be using TxRing.132132-133133- // 2860C use Tx Ring134134- if (pAd->MACVersion == 0x28600100)135135- {136136- FreeNum = GET_TXRING_FREENO(pAd, QueIdx);137137- }138138- else139139- {140140- FreeNum = GET_MGMTRING_FREENO(pAd);141141- }142142-143143- if ((FreeNum > 0))144144- {145145- // We need to reserve space for rtmp hardware header. i.e., TxWI for RT2860 and TxInfo+TxWI for RT2870146146- NdisZeroMemory(&rtmpHwHdr, (TXINFO_SIZE + TXWI_SIZE));147147- Status = RTMPAllocateNdisPacket(pAd, &pPacket, (PUCHAR)&rtmpHwHdr, (TXINFO_SIZE + TXWI_SIZE), pData, Length);148148- if (Status != NDIS_STATUS_SUCCESS)149149- {150150- DBGPRINT(RT_DEBUG_WARN, ("MiniportMMRequest (error:: can't allocate NDIS PACKET)\n"));151151- break;152152- }153153-154154- //pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_CCK;155155- //pAd->CommonCfg.MlmeRate = RATE_2;156156-157157-158158- Status = MlmeHardTransmit(pAd, QueIdx, pPacket);159159- if (Status != NDIS_STATUS_SUCCESS)160160- RTMPFreeNdisPacket(pAd, pPacket);161161- }162162- else163163- {164164- pAd->RalinkCounters.MgmtRingFullCount++;165165- DBGPRINT(RT_DEBUG_ERROR, ("Qidx(%d), not enough space in MgmtRing, MgmtRingFullCount=%ld!\n",166166- QueIdx, pAd->RalinkCounters.MgmtRingFullCount));167167- }168168-169169- } while (FALSE);170170-171171-172172- return Status;173173-}174174-175175-#ifdef RT30xx176176-NDIS_STATUS MlmeDataHardTransmit(177177- IN PRTMP_ADAPTER pAd,178178- IN UCHAR QueIdx,179179- IN PNDIS_PACKET pPacket);180180-181181-#define MAX_DATAMM_RETRY 3182182-/*183183- ========================================================================184184-185185- Routine Description:186186- API for MLME to transmit management frame to AP (BSS Mode)187187- or station (IBSS Mode)188188-189189- Arguments:190190- pAd Pointer to our adapter191191- pData Pointer to the outgoing 802.11 frame192192- Length Size of outgoing management frame193193-194194- Return Value:195195- NDIS_STATUS_FAILURE196196- NDIS_STATUS_PENDING197197- NDIS_STATUS_SUCCESS198198-199199- IRQL = PASSIVE_LEVEL200200- IRQL = DISPATCH_LEVEL201201-202202- Note:203203-204204- ========================================================================205205-*/206206-NDIS_STATUS MiniportDataMMRequest(207207- IN PRTMP_ADAPTER pAd,208208- IN UCHAR QueIdx,209209- IN PUCHAR pData,210210- IN UINT Length)211211-{212212- PNDIS_PACKET pPacket;213213- NDIS_STATUS Status = NDIS_STATUS_SUCCESS;214214- ULONG FreeNum;215215- int retry = 0;216216- UCHAR IrqState;217217- UCHAR rtmpHwHdr[TXINFO_SIZE + TXWI_SIZE]; //RTMP_HW_HDR_LEN];218218-219219- ASSERT(Length <= MGMT_DMA_BUFFER_SIZE);220220-221221- // 2860C use Tx Ring222222- IrqState = pAd->irq_disabled;223223-224224- do225225- {226226- // Reset is in progress, stop immediately227227- if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS) ||228228- RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)||229229- !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP))230230- {231231- Status = NDIS_STATUS_FAILURE;232232- break;233233- }234234-235235- // Check Free priority queue236236- // Since we use PBF Queue2 for management frame. Its corresponding DMA ring should be using TxRing.237237-238238- // 2860C use Tx Ring239239-240240- // free Tx(QueIdx) resources241241- FreeNum = GET_TXRING_FREENO(pAd, QueIdx);242242-243243- if ((FreeNum > 0))244244- {245245- // We need to reserve space for rtmp hardware header. i.e., TxWI for RT2860 and TxInfo+TxWI for RT2870246246- NdisZeroMemory(&rtmpHwHdr, (TXINFO_SIZE + TXWI_SIZE));247247- Status = RTMPAllocateNdisPacket(pAd, &pPacket, (PUCHAR)&rtmpHwHdr, (TXINFO_SIZE + TXWI_SIZE), pData, Length);248248- if (Status != NDIS_STATUS_SUCCESS)249249- {250250- DBGPRINT(RT_DEBUG_WARN, ("MiniportMMRequest (error:: can't allocate NDIS PACKET)\n"));251251- break;252252- }253253-254254- //pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_CCK;255255- //pAd->CommonCfg.MlmeRate = RATE_2;256256-257257-258258- Status = MlmeDataHardTransmit(pAd, QueIdx, pPacket);259259- if (Status != NDIS_STATUS_SUCCESS)260260- RTMPFreeNdisPacket(pAd, pPacket);261261- retry = MAX_DATAMM_RETRY;262262- }263263- else264264- {265265- retry ++;266266-267267- printk("retry %d\n", retry);268268- pAd->RalinkCounters.MgmtRingFullCount++;269269-270270- if (retry >= MAX_DATAMM_RETRY)271271- {272272- DBGPRINT(RT_DEBUG_ERROR, ("Qidx(%d), not enough space in DataRing, MgmtRingFullCount=%ld!\n",273273- QueIdx, pAd->RalinkCounters.MgmtRingFullCount));274274- }275275- }276276-277277- } while (retry < MAX_DATAMM_RETRY);278278-279279-280280- return Status;281281-}282282-#endif /* RT30xx */283283-284284-285285-/*286286- ========================================================================287287-288288- Routine Description:289289- Copy frame from waiting queue into relative ring buffer and set290290- appropriate ASIC register to kick hardware transmit function291291-292292- Arguments:293293- pAd Pointer to our adapter294294- pBuffer Pointer to memory of outgoing frame295295- Length Size of outgoing management frame296296-297297- Return Value:298298- NDIS_STATUS_FAILURE299299- NDIS_STATUS_PENDING300300- NDIS_STATUS_SUCCESS301301-302302- IRQL = PASSIVE_LEVEL303303- IRQL = DISPATCH_LEVEL304304-305305- Note:306306-307307- ========================================================================308308-*/309309-NDIS_STATUS MlmeHardTransmit(310310- IN PRTMP_ADAPTER pAd,311311- IN UCHAR QueIdx,312312- IN PNDIS_PACKET pPacket)313313-{314314- if ((pAd->CommonCfg.RadarDetect.RDMode != RD_NORMAL_MODE)315315- )316316- {317317- return NDIS_STATUS_FAILURE;318318- }319319-320320- return MlmeHardTransmitMgmtRing(pAd,QueIdx,pPacket);321321-322322-}323323-324324-#ifdef RT30xx325325-NDIS_STATUS MlmeDataHardTransmit(326326- IN PRTMP_ADAPTER pAd,327327- IN UCHAR QueIdx,328328- IN PNDIS_PACKET pPacket)329329-{330330- if ((pAd->CommonCfg.RadarDetect.RDMode != RD_NORMAL_MODE)331331- )332332- {333333- return NDIS_STATUS_FAILURE;334334- }335335-336336-#ifdef RT2870337337- return MlmeHardTransmitMgmtRing(pAd,QueIdx,pPacket);338338-#endif // RT2870 //339339-}340340-#endif /* RT30xx */341341-342342-NDIS_STATUS MlmeHardTransmitMgmtRing(343343- IN PRTMP_ADAPTER pAd,344344- IN UCHAR QueIdx,345345- IN PNDIS_PACKET pPacket)346346-{347347- PACKET_INFO PacketInfo;348348- PUCHAR pSrcBufVA;349349- UINT SrcBufLen;350350- PHEADER_802_11 pHeader_802_11;351351- BOOLEAN bAckRequired, bInsertTimestamp;352352- UCHAR MlmeRate;353353- PTXWI_STRUC pFirstTxWI;354354- MAC_TABLE_ENTRY *pMacEntry = NULL;355355-356356- RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen);357357-358358- RTMP_SEM_LOCK(&pAd->MgmtRingLock);359359-360360-361361- if (pSrcBufVA == NULL)362362- {363363- RTMP_SEM_UNLOCK(&pAd->MgmtRingLock);364364- return NDIS_STATUS_FAILURE;365365- }366366-367367- // outgoing frame always wakeup PHY to prevent frame lost368368- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))369369- AsicForceWakeup(pAd, TRUE);370370-371371- pFirstTxWI = (PTXWI_STRUC)(pSrcBufVA + TXINFO_SIZE);372372- pHeader_802_11 = (PHEADER_802_11) (pSrcBufVA + TXINFO_SIZE + TXWI_SIZE); //TXWI_SIZE);373373-374374- if (pHeader_802_11->Addr1[0] & 0x01)375375- {376376- MlmeRate = pAd->CommonCfg.BasicMlmeRate;377377- }378378- else379379- {380380- MlmeRate = pAd->CommonCfg.MlmeRate;381381- }382382-383383- // Verify Mlme rate for a / g bands.384384- if ((pAd->LatchRfRegs.Channel > 14) && (MlmeRate < RATE_6)) // 11A band385385- MlmeRate = RATE_6;386386-387387- if ((pHeader_802_11->FC.Type == BTYPE_DATA) &&388388- (pHeader_802_11->FC.SubType == SUBTYPE_QOS_NULL))389389- {390390- pMacEntry = MacTableLookup(pAd, pHeader_802_11->Addr1);391391- }392392-393393- {394394- // Fixed W52 with Activity scan issue in ABG_MIXED and ABGN_MIXED mode.395395- if (pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED396396- || pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED397397- )398398- {399399- if (pAd->LatchRfRegs.Channel > 14)400400- pAd->CommonCfg.MlmeTransmit.field.MODE = 1;401401- else402402- pAd->CommonCfg.MlmeTransmit.field.MODE = 0;403403- }404404- }405405-406406- //407407- // Should not be hard code to set PwrMgmt to 0 (PWR_ACTIVE)408408- // Snice it's been set to 0 while on MgtMacHeaderInit409409- // By the way this will cause frame to be send on PWR_SAVE failed.410410- //411411- // pHeader_802_11->FC.PwrMgmt = 0; // (pAd->StaCfg.Psm == PWR_SAVE);412412- //413413- // In WMM-UAPSD, mlme frame should be set psm as power saving but probe request frame414414-415415- // Data-Null packets alse pass through MMRequest in RT2860, however, we hope control the psm bit to pass APSD416416- if ((pHeader_802_11->FC.Type != BTYPE_DATA) && (pHeader_802_11->FC.Type != BTYPE_CNTL))417417- {418418- if ((pAd->StaCfg.Psm == PWR_SAVE) &&419419- (pHeader_802_11->FC.SubType == SUBTYPE_ACTION))420420- pHeader_802_11->FC.PwrMgmt = PWR_SAVE;421421- else422422- pHeader_802_11->FC.PwrMgmt = PWR_ACTIVE;423423- }424424-425425- bInsertTimestamp = FALSE;426426- if (pHeader_802_11->FC.Type == BTYPE_CNTL) // must be PS-POLL427427- {428428- //Set PM bit in ps-poll, to fix WLK 1.2 PowerSaveMode_ext failure issue.429429- if ((pAd->OpMode == OPMODE_STA) && (pHeader_802_11->FC.SubType == SUBTYPE_PS_POLL))430430- {431431- pHeader_802_11->FC.PwrMgmt = PWR_SAVE;432432- }433433- bAckRequired = FALSE;434434- }435435- else // BTYPE_MGMT or BTYPE_DATA(must be NULL frame)436436- {437437- if (pHeader_802_11->Addr1[0] & 0x01) // MULTICAST, BROADCAST438438- {439439- bAckRequired = FALSE;440440- pHeader_802_11->Duration = 0;441441- }442442- else443443- {444444- bAckRequired = TRUE;445445- pHeader_802_11->Duration = RTMPCalcDuration(pAd, MlmeRate, 14);446446- if (pHeader_802_11->FC.SubType == SUBTYPE_PROBE_RSP)447447- {448448- bInsertTimestamp = TRUE;449449- }450450- }451451- }452452-453453- pHeader_802_11->Sequence = pAd->Sequence++;454454- if (pAd->Sequence >0xfff)455455- pAd->Sequence = 0;456456-457457- // Before radar detection done, mgmt frame can not be sent but probe req458458- // Because we need to use probe req to trigger driver to send probe req in passive scan459459- if ((pHeader_802_11->FC.SubType != SUBTYPE_PROBE_REQ)460460- && (pAd->CommonCfg.bIEEE80211H == 1)461461- && (pAd->CommonCfg.RadarDetect.RDMode != RD_NORMAL_MODE))462462- {463463- DBGPRINT(RT_DEBUG_ERROR,("MlmeHardTransmit --> radar detect not in normal mode !!!\n"));464464- RTMP_SEM_UNLOCK(&pAd->MgmtRingLock);465465- return (NDIS_STATUS_FAILURE);466466- }467467-468468- //469469- // fill scatter-and-gather buffer list into TXD. Internally created NDIS PACKET470470- // should always has only one ohysical buffer, and the whole frame size equals471471- // to the first scatter buffer size472472- //473473-474474- // Initialize TX Descriptor475475- // For inter-frame gap, the number is for this frame and next frame476476- // For MLME rate, we will fix as 2Mb to match other vendor's implement477477-478478-// management frame doesn't need encryption. so use RESERVED_WCID no matter u are sending to specific wcid or not.479479- if (pMacEntry == NULL)480480- {481481- RTMPWriteTxWI(pAd, pFirstTxWI, FALSE, FALSE, bInsertTimestamp, FALSE, bAckRequired, FALSE,482482- 0, RESERVED_WCID, (SrcBufLen - TXINFO_SIZE - TXWI_SIZE), PID_MGMT, 0, (UCHAR)pAd->CommonCfg.MlmeTransmit.field.MCS, IFS_BACKOFF, FALSE, &pAd->CommonCfg.MlmeTransmit);483483- }484484- else485485- {486486- RTMPWriteTxWI(pAd, pFirstTxWI, FALSE, FALSE,487487- bInsertTimestamp, FALSE, bAckRequired, FALSE,488488- 0, pMacEntry->Aid, (SrcBufLen - TXINFO_SIZE - TXWI_SIZE),489489- pMacEntry->MaxHTPhyMode.field.MCS, 0,490490- (UCHAR)pMacEntry->MaxHTPhyMode.field.MCS,491491- IFS_BACKOFF, FALSE, &pMacEntry->MaxHTPhyMode);492492- }493493-494494- // Now do hardware-depened kick out.495495- HAL_KickOutMgmtTx(pAd, QueIdx, pPacket, pSrcBufVA, SrcBufLen);496496-497497- // Make sure to release MGMT ring resource498498- RTMP_SEM_UNLOCK(&pAd->MgmtRingLock);499499- return NDIS_STATUS_SUCCESS;500500-}501501-502502-503503-/********************************************************************************504504-505505- New DeQueue Procedures.506506-507507- ********************************************************************************/508508-509509-#define DEQUEUE_LOCK(lock, bIntContext, IrqFlags) \510510- do{ \511511- if (bIntContext == FALSE) \512512- RTMP_IRQ_LOCK((lock), IrqFlags); \513513- }while(0)514514-515515-#define DEQUEUE_UNLOCK(lock, bIntContext, IrqFlags) \516516- do{ \517517- if (bIntContext == FALSE) \518518- RTMP_IRQ_UNLOCK((lock), IrqFlags); \519519- }while(0)520520-521521-/*522522- ========================================================================523523- Tx Path design algorithm:524524- Basically, we divide the packets into four types, Broadcast/Multicast, 11N Rate(AMPDU, AMSDU, Normal), B/G Rate(ARALINK, Normal),525525- Specific Packet Type. Following show the classification rule and policy for each kinds of packets.526526- Classification Rule=>527527- Multicast: (*addr1 & 0x01) == 0x01528528- Specific : bDHCPFrame, bARPFrame, bEAPOLFrame, etc.529529- 11N Rate : If peer support HT530530- (1).AMPDU -- If TXBA is negotiated.531531- (2).AMSDU -- If AMSDU is capable for both peer and ourself.532532- *). AMSDU can embedded in a AMPDU, but now we didn't support it.533533- (3).Normal -- Other packets which send as 11n rate.534534-535535- B/G Rate : If peer is b/g only.536536- (1).ARALINK-- If both of peer/us supprot Ralink proprietary Aggregation and the TxRate is large than RATE_6537537- (2).Normal -- Other packets which send as b/g rate.538538- Fragment:539539- The packet must be unicast, NOT A-RALINK, NOT A-MSDU, NOT 11n, then can consider about fragment.540540-541541- Classified Packet Handle Rule=>542542- Multicast:543543- No ACK, //pTxBlk->bAckRequired = FALSE;544544- No WMM, //pTxBlk->bWMM = FALSE;545545- No piggyback, //pTxBlk->bPiggyBack = FALSE;546546- Force LowRate, //pTxBlk->bForceLowRate = TRUE;547547- Specific : Basically, for specific packet, we should handle it specifically, but now all specific packets are use548548- the same policy to handle it.549549- Force LowRate, //pTxBlk->bForceLowRate = TRUE;550550-551551- 11N Rate :552552- No piggyback, //pTxBlk->bPiggyBack = FALSE;553553-554554- (1).AMSDU555555- pTxBlk->bWMM = TRUE;556556- (2).AMPDU557557- pTxBlk->bWMM = TRUE;558558- (3).Normal559559-560560- B/G Rate :561561- (1).ARALINK562562-563563- (2).Normal564564- ========================================================================565565-*/566566-static UCHAR TxPktClassification(567567- IN RTMP_ADAPTER *pAd,568568- IN PNDIS_PACKET pPacket)569569-{570570- UCHAR TxFrameType = TX_UNKOWN_FRAME;571571- UCHAR Wcid;572572- MAC_TABLE_ENTRY *pMacEntry = NULL;573573- BOOLEAN bHTRate = FALSE;574574-575575- Wcid = RTMP_GET_PACKET_WCID(pPacket);576576- if (Wcid == MCAST_WCID)577577- { // Handle for RA is Broadcast/Multicast Address.578578- return TX_MCAST_FRAME;579579- }580580-581581- // Handle for unicast packets582582- pMacEntry = &pAd->MacTab.Content[Wcid];583583- if (RTMP_GET_PACKET_LOWRATE(pPacket))584584- { // It's a specific packet need to force low rate, i.e., bDHCPFrame, bEAPOLFrame, bWAIFrame585585- TxFrameType = TX_LEGACY_FRAME;586586- }587587- else if (IS_HT_RATE(pMacEntry))588588- { // it's a 11n capable packet589589-590590- // Depends on HTPhyMode to check if the peer support the HTRate transmission.591591- // Currently didn't support A-MSDU embedded in A-MPDU592592- bHTRate = TRUE;593593- if (RTMP_GET_PACKET_MOREDATA(pPacket) || (pMacEntry->PsMode == PWR_SAVE))594594- TxFrameType = TX_LEGACY_FRAME;595595-#ifdef UAPSD_AP_SUPPORT596596- else if (RTMP_GET_PACKET_EOSP(pPacket))597597- TxFrameType = TX_LEGACY_FRAME;598598-#endif // UAPSD_AP_SUPPORT //599599- else if((pMacEntry->TXBAbitmap & (1<<(RTMP_GET_PACKET_UP(pPacket)))) != 0)600600- return TX_AMPDU_FRAME;601601- else if(CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_AMSDU_INUSED))602602- return TX_AMSDU_FRAME;603603- else604604- TxFrameType = TX_LEGACY_FRAME;605605- }606606- else607607- { // it's a legacy b/g packet.608608- if ((CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE) && pAd->CommonCfg.bAggregationCapable) &&609609- (RTMP_GET_PACKET_TXRATE(pPacket) >= RATE_6) &&610610- (!(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) && CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE))))611611- { // if peer support Ralink Aggregation, we use it.612612- TxFrameType = TX_RALINK_FRAME;613613- }614614- else615615- {616616- TxFrameType = TX_LEGACY_FRAME;617617- }618618- }619619-620620- // Currently, our fragment only support when a unicast packet send as NOT-ARALINK, NOT-AMSDU and NOT-AMPDU.621621- if ((RTMP_GET_PACKET_FRAGMENTS(pPacket) > 1) && (TxFrameType == TX_LEGACY_FRAME))622622- TxFrameType = TX_FRAG_FRAME;623623-624624- return TxFrameType;625625-}626626-627627-628628-BOOLEAN RTMP_FillTxBlkInfo(629629- IN RTMP_ADAPTER *pAd,630630- IN TX_BLK *pTxBlk)631631-{632632- PACKET_INFO PacketInfo;633633- PNDIS_PACKET pPacket;634634- PMAC_TABLE_ENTRY pMacEntry = NULL;635635-636636- pPacket = pTxBlk->pPacket;637637- RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pTxBlk->pSrcBufHeader, &pTxBlk->SrcBufLen);638638-639639- pTxBlk->Wcid = RTMP_GET_PACKET_WCID(pPacket);640640- pTxBlk->apidx = RTMP_GET_PACKET_IF(pPacket);641641- pTxBlk->UserPriority = RTMP_GET_PACKET_UP(pPacket);642642- pTxBlk->FrameGap = IFS_HTTXOP; // ASIC determine Frame Gap643643-644644- if (RTMP_GET_PACKET_CLEAR_EAP_FRAME(pTxBlk->pPacket))645645- TX_BLK_SET_FLAG(pTxBlk, fTX_bClearEAPFrame);646646- else647647- TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bClearEAPFrame);648648-649649- // Default to clear this flag650650- TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bForceNonQoS);651651-652652-653653- if (pTxBlk->Wcid == MCAST_WCID)654654- {655655- pTxBlk->pMacEntry = NULL;656656- {657657-#ifdef MCAST_RATE_SPECIFIC658658- PUCHAR pDA = GET_OS_PKT_DATAPTR(pPacket);659659- if (((*pDA & 0x01) == 0x01) && (*pDA != 0xff))660660- pTxBlk->pTransmit = &pAd->CommonCfg.MCastPhyMode;661661- else662662-#endif // MCAST_RATE_SPECIFIC //663663- pTxBlk->pTransmit = &pAd->MacTab.Content[MCAST_WCID].HTPhyMode;664664- }665665-666666- TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bAckRequired); // AckRequired = FALSE, when broadcast packet in Adhoc mode.667667- //TX_BLK_SET_FLAG(pTxBlk, fTX_bForceLowRate);668668- TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bAllowFrag);669669- TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bWMM);670670- if (RTMP_GET_PACKET_MOREDATA(pPacket))671671- {672672- TX_BLK_SET_FLAG(pTxBlk, fTX_bMoreData);673673- }674674-675675- }676676- else677677- {678678- pTxBlk->pMacEntry = &pAd->MacTab.Content[pTxBlk->Wcid];679679- pTxBlk->pTransmit = &pTxBlk->pMacEntry->HTPhyMode;680680-681681- pMacEntry = pTxBlk->pMacEntry;682682-683683-684684- // For all unicast packets, need Ack unless the Ack Policy is not set as NORMAL_ACK.685685- if (pAd->CommonCfg.AckPolicy[pTxBlk->QueIdx] != NORMAL_ACK)686686- TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bAckRequired);687687- else688688- TX_BLK_SET_FLAG(pTxBlk, fTX_bAckRequired);689689-690690- {691691- // If support WMM, enable it.692692- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) &&693693- CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE))694694- TX_BLK_SET_FLAG(pTxBlk, fTX_bWMM);695695- }696696-697697- if (pTxBlk->TxFrameType == TX_LEGACY_FRAME)698698- {699699- if ( (RTMP_GET_PACKET_LOWRATE(pPacket)) ||700700- ((pAd->OpMode == OPMODE_AP) && (pMacEntry->MaxHTPhyMode.field.MODE == MODE_CCK) && (pMacEntry->MaxHTPhyMode.field.MCS == RATE_1)))701701- { // Specific packet, i.e., bDHCPFrame, bEAPOLFrame, bWAIFrame, need force low rate.702702- pTxBlk->pTransmit = &pAd->MacTab.Content[MCAST_WCID].HTPhyMode;703703-704704- // Modify the WMM bit for ICV issue. If we have a packet with EOSP field need to set as 1, how to handle it???705705- if (IS_HT_STA(pTxBlk->pMacEntry) &&706706- (CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_RALINK_CHIPSET)) &&707707- ((pAd->CommonCfg.bRdg == TRUE) && CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_RDG_CAPABLE)))708708- {709709- TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bWMM);710710- TX_BLK_SET_FLAG(pTxBlk, fTX_bForceNonQoS);711711- }712712- }713713-714714- if ( (IS_HT_RATE(pMacEntry) == FALSE) &&715715- (CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_PIGGYBACK_CAPABLE)))716716- { // Currently piggy-back only support when peer is operate in b/g mode.717717- TX_BLK_SET_FLAG(pTxBlk, fTX_bPiggyBack);718718- }719719-720720- if (RTMP_GET_PACKET_MOREDATA(pPacket))721721- {722722- TX_BLK_SET_FLAG(pTxBlk, fTX_bMoreData);723723- }724724-#ifdef UAPSD_AP_SUPPORT725725- if (RTMP_GET_PACKET_EOSP(pPacket))726726- {727727- TX_BLK_SET_FLAG(pTxBlk, fTX_bWMM_UAPSD_EOSP);728728- }729729-#endif // UAPSD_AP_SUPPORT //730730- }731731- else if (pTxBlk->TxFrameType == TX_FRAG_FRAME)732732- {733733- TX_BLK_SET_FLAG(pTxBlk, fTX_bAllowFrag);734734- }735735-736736- pMacEntry->DebugTxCount++;737737- }738738-739739- return TRUE;740740-741741-#ifdef RT30xx742742-FillTxBlkErr:743743- return FALSE;744744-#endif745745-}746746-747747-748748-BOOLEAN CanDoAggregateTransmit(749749- IN RTMP_ADAPTER *pAd,750750- IN NDIS_PACKET *pPacket,751751- IN TX_BLK *pTxBlk)752752-{753753-754754- //printk("Check if can do aggregation! TxFrameType=%d!\n", pTxBlk->TxFrameType);755755-756756- if (RTMP_GET_PACKET_WCID(pPacket) == MCAST_WCID)757757- return FALSE;758758-759759- if (RTMP_GET_PACKET_DHCP(pPacket) ||760760- RTMP_GET_PACKET_EAPOL(pPacket) ||761761- RTMP_GET_PACKET_WAI(pPacket))762762- return FALSE;763763-764764- if ((pTxBlk->TxFrameType == TX_AMSDU_FRAME) &&765765- ((pTxBlk->TotalFrameLen + GET_OS_PKT_LEN(pPacket))> (RX_BUFFER_AGGRESIZE - 100)))766766- { // For AMSDU, allow the packets with total length < max-amsdu size767767- return FALSE;768768- }769769-770770- if ((pTxBlk->TxFrameType == TX_RALINK_FRAME) &&771771- (pTxBlk->TxPacketList.Number == 2))772772- { // For RALINK-Aggregation, allow two frames in one batch.773773- return FALSE;774774- }775775-776776- if ((INFRA_ON(pAd)) && (pAd->OpMode == OPMODE_STA)) // must be unicast to AP777777- return TRUE;778778- else779779- return FALSE;780780-}781781-782782-783783-/*784784- ========================================================================785785-786786- Routine Description:787787- To do the enqueue operation and extract the first item of waiting788788- list. If a number of available shared memory segments could meet789789- the request of extracted item, the extracted item will be fragmented790790- into shared memory segments.791791-792792- Arguments:793793- pAd Pointer to our adapter794794- pQueue Pointer to Waiting Queue795795-796796- Return Value:797797- None798798-799799- IRQL = DISPATCH_LEVEL800800-801801- Note:802802-803803- ========================================================================804804-*/805805-VOID RTMPDeQueuePacket(806806- IN PRTMP_ADAPTER pAd,807807- IN BOOLEAN bIntContext,808808- IN UCHAR QIdx, /* BulkOutPipeId */809809- IN UCHAR Max_Tx_Packets)810810-{811811- PQUEUE_ENTRY pEntry = NULL;812812- PNDIS_PACKET pPacket;813813- NDIS_STATUS Status = NDIS_STATUS_SUCCESS;814814- UCHAR Count=0;815815- PQUEUE_HEADER pQueue;816816- ULONG FreeNumber[NUM_OF_TX_RING];817817- UCHAR QueIdx, sQIdx, eQIdx;818818- unsigned long IrqFlags = 0;819819- BOOLEAN hasTxDesc = FALSE;820820- TX_BLK TxBlk;821821- TX_BLK *pTxBlk;822822-823823-#ifdef DBG_DIAGNOSE824824- BOOLEAN firstRound;825825- RtmpDiagStruct *pDiagStruct = &pAd->DiagStruct;826826-#endif827827-828828-829829- if (QIdx == NUM_OF_TX_RING)830830- {831831- sQIdx = 0;832832-//PS packets use HCCA queue when dequeue from PS unicast queue (WiFi WPA2 MA9_DT1 for Marvell B STA)833833- eQIdx = 3; // 4 ACs, start from 0.834834- }835835- else836836- {837837- sQIdx = eQIdx = QIdx;838838- }839839-840840- for (QueIdx=sQIdx; QueIdx <= eQIdx; QueIdx++)841841- {842842- Count=0;843843-844844- RT28XX_START_DEQUEUE(pAd, QueIdx, IrqFlags);845845-846846-#ifdef DBG_DIAGNOSE847847- firstRound = ((QueIdx == 0) ? TRUE : FALSE);848848-#endif // DBG_DIAGNOSE //849849-850850- while (1)851851- {852852- if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS |853853- fRTMP_ADAPTER_RADIO_OFF |854854- fRTMP_ADAPTER_RESET_IN_PROGRESS |855855- fRTMP_ADAPTER_HALT_IN_PROGRESS |856856- fRTMP_ADAPTER_NIC_NOT_EXIST))))857857- {858858- RT28XX_STOP_DEQUEUE(pAd, QueIdx, IrqFlags);859859- return;860860- }861861-862862- if (Count >= Max_Tx_Packets)863863- break;864864-865865- DEQUEUE_LOCK(&pAd->irq_lock, bIntContext, IrqFlags);866866- if (&pAd->TxSwQueue[QueIdx] == NULL)867867- {868868-#ifdef DBG_DIAGNOSE869869- if (firstRound == TRUE)870870- pDiagStruct->TxSWQueCnt[pDiagStruct->ArrayCurIdx][0]++;871871-#endif // DBG_DIAGNOSE //872872- DEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags);873873- break;874874- }875875-876876-877877- // probe the Queue Head878878- pQueue = &pAd->TxSwQueue[QueIdx];879879- if ((pEntry = pQueue->Head) == NULL)880880- {881881- DEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags);882882- break;883883- }884884-885885- pTxBlk = &TxBlk;886886- NdisZeroMemory((PUCHAR)pTxBlk, sizeof(TX_BLK));887887- pTxBlk->QueIdx = QueIdx;888888-889889- pPacket = QUEUE_ENTRY_TO_PKT(pEntry);890890-891891- // Early check to make sure we have enoguh Tx Resource.892892- hasTxDesc = RT28XX_HAS_ENOUGH_FREE_DESC(pAd, pTxBlk, FreeNumber[QueIdx], pPacket);893893- if (!hasTxDesc)894894- {895895- pAd->PrivateInfo.TxRingFullCnt++;896896-897897- DEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags);898898-899899- break;900900- }901901-902902- pTxBlk->TxFrameType = TxPktClassification(pAd, pPacket);903903- pEntry = RemoveHeadQueue(pQueue);904904- pTxBlk->TotalFrameNum++;905905- pTxBlk->TotalFragNum += RTMP_GET_PACKET_FRAGMENTS(pPacket); // The real fragment number maybe vary906906- pTxBlk->TotalFrameLen += GET_OS_PKT_LEN(pPacket);907907- pTxBlk->pPacket = pPacket;908908- InsertTailQueue(&pTxBlk->TxPacketList, PACKET_TO_QUEUE_ENTRY(pPacket));909909-910910- if (pTxBlk->TxFrameType == TX_RALINK_FRAME || pTxBlk->TxFrameType == TX_AMSDU_FRAME)911911- {912912- // Enhance SW Aggregation Mechanism913913- if (NEED_QUEUE_BACK_FOR_AGG(pAd, QueIdx, FreeNumber[QueIdx], pTxBlk->TxFrameType))914914- {915915- InsertHeadQueue(pQueue, PACKET_TO_QUEUE_ENTRY(pPacket));916916- DEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags);917917- break;918918- }919919-920920- do{921921- if((pEntry = pQueue->Head) == NULL)922922- break;923923-924924- // For TX_AMSDU_FRAME/TX_RALINK_FRAME, Need to check if next pakcet can do aggregation.925925- pPacket = QUEUE_ENTRY_TO_PKT(pEntry);926926- FreeNumber[QueIdx] = GET_TXRING_FREENO(pAd, QueIdx);927927- hasTxDesc = RT28XX_HAS_ENOUGH_FREE_DESC(pAd, pTxBlk, FreeNumber[QueIdx], pPacket);928928- if ((hasTxDesc == FALSE) || (CanDoAggregateTransmit(pAd, pPacket, pTxBlk) == FALSE))929929- break;930930-931931- //Remove the packet from the TxSwQueue and insert into pTxBlk932932- pEntry = RemoveHeadQueue(pQueue);933933- ASSERT(pEntry);934934- pPacket = QUEUE_ENTRY_TO_PKT(pEntry);935935- pTxBlk->TotalFrameNum++;936936- pTxBlk->TotalFragNum += RTMP_GET_PACKET_FRAGMENTS(pPacket); // The real fragment number maybe vary937937- pTxBlk->TotalFrameLen += GET_OS_PKT_LEN(pPacket);938938- InsertTailQueue(&pTxBlk->TxPacketList, PACKET_TO_QUEUE_ENTRY(pPacket));939939- }while(1);940940-941941- if (pTxBlk->TxPacketList.Number == 1)942942- pTxBlk->TxFrameType = TX_LEGACY_FRAME;943943- }944944-945945-#ifdef RT2870946946- DEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags);947947-#endif // RT2870 //948948-949949- Count += pTxBlk->TxPacketList.Number;950950-951951- // Do HardTransmit now.952952- Status = STAHardTransmit(pAd, pTxBlk, QueIdx);953953- }954954-955955- RT28XX_STOP_DEQUEUE(pAd, QueIdx, IrqFlags);956956-957957-#ifdef RT2870958958- if (!hasTxDesc)959959- RTUSBKickBulkOut(pAd);960960-#endif // RT2870 //961961- }962962-963963-}964964-965965-966966-/*967967- ========================================================================968968-969969- Routine Description:970970- Calculates the duration which is required to transmit out frames971971- with given size and specified rate.972972-973973- Arguments:974974- pAd Pointer to our adapter975975- Rate Transmit rate976976- Size Frame size in units of byte977977-978978- Return Value:979979- Duration number in units of usec980980-981981- IRQL = PASSIVE_LEVEL982982- IRQL = DISPATCH_LEVEL983983-984984- Note:985985-986986- ========================================================================987987-*/988988-USHORT RTMPCalcDuration(989989- IN PRTMP_ADAPTER pAd,990990- IN UCHAR Rate,991991- IN ULONG Size)992992-{993993- ULONG Duration = 0;994994-995995- if (Rate < RATE_FIRST_OFDM_RATE) // CCK996996- {997997- if ((Rate > RATE_1) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED))998998- Duration = 96; // 72+24 preamble+plcp999999- else10001000- Duration = 192; // 144+48 preamble+plcp10011001-10021002- Duration += (USHORT)((Size << 4) / RateIdTo500Kbps[Rate]);10031003- if ((Size << 4) % RateIdTo500Kbps[Rate])10041004- Duration ++;10051005- }10061006- else if (Rate <= RATE_LAST_OFDM_RATE)// OFDM rates10071007- {10081008- Duration = 20 + 6; // 16+4 preamble+plcp + Signal Extension10091009- Duration += 4 * (USHORT)((11 + Size * 4) / RateIdTo500Kbps[Rate]);10101010- if ((11 + Size * 4) % RateIdTo500Kbps[Rate])10111011- Duration += 4;10121012- }10131013- else //mimo rate10141014- {10151015- Duration = 20 + 6; // 16+4 preamble+plcp + Signal Extension10161016- }10171017-10181018- return (USHORT)Duration;10191019-}10201020-10211021-10221022-/*10231023- ========================================================================10241024-10251025- Routine Description:10261026- Calculates the duration which is required to transmit out frames10271027- with given size and specified rate.10281028-10291029- Arguments:10301030- pTxWI Pointer to head of each MPDU to HW.10311031- Ack Setting for Ack requirement bit10321032- Fragment Setting for Fragment bit10331033- RetryMode Setting for retry mode10341034- Ifs Setting for IFS gap10351035- Rate Setting for transmit rate10361036- Service Setting for service10371037- Length Frame length10381038- TxPreamble Short or Long preamble when using CCK rates10391039- QueIdx - 0-3, according to 802.11e/d4.4 June/200310401040-10411041- Return Value:10421042- None10431043-10441044- IRQL = PASSIVE_LEVEL10451045- IRQL = DISPATCH_LEVEL10461046-10471047- See also : BASmartHardTransmit() !!!10481048-10491049- ========================================================================10501050-*/10511051-VOID RTMPWriteTxWI(10521052- IN PRTMP_ADAPTER pAd,10531053- IN PTXWI_STRUC pOutTxWI,10541054- IN BOOLEAN FRAG,10551055- IN BOOLEAN CFACK,10561056- IN BOOLEAN InsTimestamp,10571057- IN BOOLEAN AMPDU,10581058- IN BOOLEAN Ack,10591059- IN BOOLEAN NSeq, // HW new a sequence.10601060- IN UCHAR BASize,10611061- IN UCHAR WCID,10621062- IN ULONG Length,10631063- IN UCHAR PID,10641064- IN UCHAR TID,10651065- IN UCHAR TxRate,10661066- IN UCHAR Txopmode,10671067- IN BOOLEAN CfAck,10681068- IN HTTRANSMIT_SETTING *pTransmit)10691069-{10701070- PMAC_TABLE_ENTRY pMac = NULL;10711071- TXWI_STRUC TxWI;10721072- PTXWI_STRUC pTxWI;10731073-10741074- if (WCID < MAX_LEN_OF_MAC_TABLE)10751075- pMac = &pAd->MacTab.Content[WCID];10761076-10771077- //10781078- // Always use Long preamble before verifiation short preamble functionality works well.10791079- // Todo: remove the following line if short preamble functionality works10801080- //10811081- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED);10821082- NdisZeroMemory(&TxWI, TXWI_SIZE);10831083- pTxWI = &TxWI;10841084-10851085- pTxWI->FRAG= FRAG;10861086-10871087- pTxWI->CFACK = CFACK;10881088- pTxWI->TS= InsTimestamp;10891089- pTxWI->AMPDU = AMPDU;10901090- pTxWI->ACK = Ack;10911091- pTxWI->txop= Txopmode;10921092-10931093- pTxWI->NSEQ = NSeq;10941094- // John tune the performace with Intel Client in 20 MHz performance10951095- BASize = pAd->CommonCfg.TxBASize;10961096-10971097- if( BASize >7 )10981098- BASize =7;10991099- pTxWI->BAWinSize = BASize;11001100- pTxWI->ShortGI = pTransmit->field.ShortGI;11011101- pTxWI->STBC = pTransmit->field.STBC;11021102-11031103- pTxWI->WirelessCliID = WCID;11041104- pTxWI->MPDUtotalByteCount = Length;11051105- pTxWI->PacketId = PID;11061106-11071107- // If CCK or OFDM, BW must be 2011081108- pTxWI->BW = (pTransmit->field.MODE <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW);11091109-11101110- pTxWI->MCS = pTransmit->field.MCS;11111111- pTxWI->PHYMODE = pTransmit->field.MODE;11121112- pTxWI->CFACK = CfAck;11131113-11141114- if (pMac)11151115- {11161116- if (pAd->CommonCfg.bMIMOPSEnable)11171117- {11181118- if ((pMac->MmpsMode == MMPS_DYNAMIC) && (pTransmit->field.MCS > 7))11191119- {11201120- // Dynamic MIMO Power Save Mode11211121- pTxWI->MIMOps = 1;11221122- }11231123- else if (pMac->MmpsMode == MMPS_STATIC)11241124- {11251125- // Static MIMO Power Save Mode11261126- if (pTransmit->field.MODE >= MODE_HTMIX && pTransmit->field.MCS > 7)11271127- {11281128- pTxWI->MCS = 7;11291129- pTxWI->MIMOps = 0;11301130- }11311131- }11321132- }11331133- //pTxWI->MIMOps = (pMac->PsMode == PWR_MMPS)? 1:0;11341134- if (pMac->bIAmBadAtheros && (pMac->WepStatus != Ndis802_11WEPDisabled))11351135- {11361136- pTxWI->MpduDensity = 7;11371137- }11381138- else11391139- {11401140- pTxWI->MpduDensity = pMac->MpduDensity;11411141- }11421142- }11431143-11441144- pTxWI->PacketId = pTxWI->MCS;11451145- NdisMoveMemory(pOutTxWI, &TxWI, sizeof(TXWI_STRUC));11461146-}11471147-11481148-11491149-VOID RTMPWriteTxWI_Data(11501150- IN PRTMP_ADAPTER pAd,11511151- IN OUT PTXWI_STRUC pTxWI,11521152- IN TX_BLK *pTxBlk)11531153-{11541154- HTTRANSMIT_SETTING *pTransmit;11551155- PMAC_TABLE_ENTRY pMacEntry;11561156- UCHAR BASize;11571157-11581158- ASSERT(pTxWI);11591159-11601160- pTransmit = pTxBlk->pTransmit;11611161- pMacEntry = pTxBlk->pMacEntry;11621162-11631163-11641164- //11651165- // Always use Long preamble before verifiation short preamble functionality works well.11661166- // Todo: remove the following line if short preamble functionality works11671167- //11681168- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED);11691169- NdisZeroMemory(pTxWI, TXWI_SIZE);11701170-11711171- pTxWI->FRAG = TX_BLK_TEST_FLAG(pTxBlk, fTX_bAllowFrag);11721172- pTxWI->ACK = TX_BLK_TEST_FLAG(pTxBlk, fTX_bAckRequired);11731173- pTxWI->txop = pTxBlk->FrameGap;11741174-11751175- pTxWI->WirelessCliID = pTxBlk->Wcid;11761176-11771177- pTxWI->MPDUtotalByteCount = pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen;11781178- pTxWI->CFACK = TX_BLK_TEST_FLAG(pTxBlk, fTX_bPiggyBack);11791179-11801180- // If CCK or OFDM, BW must be 2011811181- pTxWI->BW = (pTransmit->field.MODE <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW);11821182- pTxWI->AMPDU = ((pTxBlk->TxFrameType == TX_AMPDU_FRAME) ? TRUE : FALSE);11831183-11841184- // John tune the performace with Intel Client in 20 MHz performance11851185- BASize = pAd->CommonCfg.TxBASize;11861186- if((pTxBlk->TxFrameType == TX_AMPDU_FRAME) && (pMacEntry))11871187- {11881188- UCHAR RABAOriIdx = 0; //The RA's BA Originator table index.11891189-11901190- RABAOriIdx = pTxBlk->pMacEntry->BAOriWcidArray[pTxBlk->UserPriority];11911191- BASize = pAd->BATable.BAOriEntry[RABAOriIdx].BAWinSize;11921192- }11931193-11941194- pTxWI->TxBF = pTransmit->field.TxBF;11951195- pTxWI->BAWinSize = BASize;11961196- pTxWI->ShortGI = pTransmit->field.ShortGI;11971197- pTxWI->STBC = pTransmit->field.STBC;11981198-11991199- pTxWI->MCS = pTransmit->field.MCS;12001200- pTxWI->PHYMODE = pTransmit->field.MODE;12011201-12021202- if (pMacEntry)12031203- {12041204- if ((pMacEntry->MmpsMode == MMPS_DYNAMIC) && (pTransmit->field.MCS > 7))12051205- {12061206- // Dynamic MIMO Power Save Mode12071207- pTxWI->MIMOps = 1;12081208- }12091209- else if (pMacEntry->MmpsMode == MMPS_STATIC)12101210- {12111211- // Static MIMO Power Save Mode12121212- if (pTransmit->field.MODE >= MODE_HTMIX && pTransmit->field.MCS > 7)12131213- {12141214- pTxWI->MCS = 7;12151215- pTxWI->MIMOps = 0;12161216- }12171217- }12181218-12191219- if (pMacEntry->bIAmBadAtheros && (pMacEntry->WepStatus != Ndis802_11WEPDisabled))12201220- {12211221- pTxWI->MpduDensity = 7;12221222- }12231223- else12241224- {12251225- pTxWI->MpduDensity = pMacEntry->MpduDensity;12261226- }12271227- }12281228-12291229-#ifdef DBG_DIAGNOSE12301230- if (pTxBlk->QueIdx== 0)12311231- {12321232- pAd->DiagStruct.TxDataCnt[pAd->DiagStruct.ArrayCurIdx]++;12331233- pAd->DiagStruct.TxMcsCnt[pAd->DiagStruct.ArrayCurIdx][pTxWI->MCS]++;12341234- }12351235-#endif // DBG_DIAGNOSE //12361236-12371237- // for rate adapation12381238- pTxWI->PacketId = pTxWI->MCS;12391239-}12401240-12411241-12421242-VOID RTMPWriteTxWI_Cache(12431243- IN PRTMP_ADAPTER pAd,12441244- IN OUT PTXWI_STRUC pTxWI,12451245- IN TX_BLK *pTxBlk)12461246-{12471247- PHTTRANSMIT_SETTING pTransmit;12481248- PMAC_TABLE_ENTRY pMacEntry;12491249-12501250- //12511251- // update TXWI12521252- //12531253- pMacEntry = pTxBlk->pMacEntry;12541254- pTransmit = pTxBlk->pTransmit;12551255-12561256- if (pMacEntry->bAutoTxRateSwitch)12571257- {12581258- pTxWI->txop = IFS_HTTXOP;12591259-12601260- // If CCK or OFDM, BW must be 2012611261- pTxWI->BW = (pTransmit->field.MODE <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW);12621262- pTxWI->ShortGI = pTransmit->field.ShortGI;12631263- pTxWI->STBC = pTransmit->field.STBC;12641264-12651265- pTxWI->MCS = pTransmit->field.MCS;12661266- pTxWI->PHYMODE = pTransmit->field.MODE;12671267-12681268- // set PID for TxRateSwitching12691269- pTxWI->PacketId = pTransmit->field.MCS;12701270- }12711271-12721272- pTxWI->AMPDU = ((pMacEntry->NoBADataCountDown == 0) ? TRUE: FALSE);12731273- pTxWI->MIMOps = 0;12741274-12751275- if (pAd->CommonCfg.bMIMOPSEnable)12761276- {12771277- // MIMO Power Save Mode12781278- if ((pMacEntry->MmpsMode == MMPS_DYNAMIC) && (pTransmit->field.MCS > 7))12791279- {12801280- // Dynamic MIMO Power Save Mode12811281- pTxWI->MIMOps = 1;12821282- }12831283- else if (pMacEntry->MmpsMode == MMPS_STATIC)12841284- {12851285- // Static MIMO Power Save Mode12861286- if ((pTransmit->field.MODE >= MODE_HTMIX) && (pTransmit->field.MCS > 7))12871287- {12881288- pTxWI->MCS = 7;12891289- pTxWI->MIMOps = 0;12901290- }12911291- }12921292- }12931293-12941294-#ifdef DBG_DIAGNOSE12951295- if (pTxBlk->QueIdx== 0)12961296- {12971297- pAd->DiagStruct.TxDataCnt[pAd->DiagStruct.ArrayCurIdx]++;12981298- pAd->DiagStruct.TxMcsCnt[pAd->DiagStruct.ArrayCurIdx][pTxWI->MCS]++;12991299- }13001300-#endif // DBG_DIAGNOSE //13011301-13021302- pTxWI->MPDUtotalByteCount = pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen;13031303-13041304-}13051305-13061306-13071307-/*13081308- ========================================================================13091309-13101310- Routine Description:13111311- Calculates the duration which is required to transmit out frames13121312- with given size and specified rate.13131313-13141314- Arguments:13151315- pTxD Pointer to transmit descriptor13161316- Ack Setting for Ack requirement bit13171317- Fragment Setting for Fragment bit13181318- RetryMode Setting for retry mode13191319- Ifs Setting for IFS gap13201320- Rate Setting for transmit rate13211321- Service Setting for service13221322- Length Frame length13231323- TxPreamble Short or Long preamble when using CCK rates13241324- QueIdx - 0-3, according to 802.11e/d4.4 June/200313251325-13261326- Return Value:13271327- None13281328-13291329- IRQL = PASSIVE_LEVEL13301330- IRQL = DISPATCH_LEVEL13311331-13321332- ========================================================================13331333-*/13341334-VOID RTMPWriteTxDescriptor(13351335- IN PRTMP_ADAPTER pAd,13361336- IN PTXD_STRUC pTxD,13371337- IN BOOLEAN bWIV,13381338- IN UCHAR QueueSEL)13391339-{13401340- //13411341- // Always use Long preamble before verifiation short preamble functionality works well.13421342- // Todo: remove the following line if short preamble functionality works13431343- //13441344- OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED);13451345-13461346- pTxD->WIV = (bWIV) ? 1: 0;13471347- pTxD->QSEL= (QueueSEL);13481348- if (pAd->bGenOneHCCA == TRUE)13491349- pTxD->QSEL= FIFO_HCCA;13501350- pTxD->DMADONE = 0;13511351-}13521352-13531353-13541354-// should be called only when -13551355-// 1. MEADIA_CONNECTED13561356-// 2. AGGREGATION_IN_USED13571357-// 3. Fragmentation not in used13581358-// 4. either no previous frame (pPrevAddr1=NULL) .OR. previoud frame is aggregatible13591359-BOOLEAN TxFrameIsAggregatible(13601360- IN PRTMP_ADAPTER pAd,13611361- IN PUCHAR pPrevAddr1,13621362- IN PUCHAR p8023hdr)13631363-{13641364-13651365- // can't aggregate EAPOL (802.1x) frame13661366- if ((p8023hdr[12] == 0x88) && (p8023hdr[13] == 0x8e))13671367- return FALSE;13681368-13691369- // can't aggregate multicast/broadcast frame13701370- if (p8023hdr[0] & 0x01)13711371- return FALSE;13721372-13731373- if (INFRA_ON(pAd)) // must be unicast to AP13741374- return TRUE;13751375- else if ((pPrevAddr1 == NULL) || MAC_ADDR_EQUAL(pPrevAddr1, p8023hdr)) // unicast to same STA13761376- return TRUE;13771377- else13781378- return FALSE;13791379-}13801380-13811381-13821382-/*13831383- ========================================================================13841384-13851385- Routine Description:13861386- Check the MSDU Aggregation policy13871387- 1.HT aggregation is A-MSDU13881388- 2.legaacy rate aggregation is software aggregation by Ralink.13891389-13901390- Arguments:13911391-13921392- Return Value:13931393-13941394- Note:13951395-13961396- ========================================================================13971397-*/13981398-BOOLEAN PeerIsAggreOn(13991399- IN PRTMP_ADAPTER pAd,14001400- IN ULONG TxRate,14011401- IN PMAC_TABLE_ENTRY pMacEntry)14021402-{14031403- ULONG AFlags = (fCLIENT_STATUS_AMSDU_INUSED | fCLIENT_STATUS_AGGREGATION_CAPABLE);14041404-14051405- if (pMacEntry != NULL && CLIENT_STATUS_TEST_FLAG(pMacEntry, AFlags))14061406- {14071407- if (pMacEntry->HTPhyMode.field.MODE >= MODE_HTMIX)14081408- {14091409- return TRUE;14101410- }14111411-14121412-#ifdef AGGREGATION_SUPPORT14131413- if (TxRate >= RATE_6 && pAd->CommonCfg.bAggregationCapable && (!(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) && CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE))))14141414- { // legacy Ralink Aggregation support14151415- return TRUE;14161416- }14171417-#endif // AGGREGATION_SUPPORT //14181418- }14191419-14201420- return FALSE;14211421-14221422-}14231423-14241424-/*14251425- ========================================================================14261426-14271427- Routine Description:14281428- Check and fine the packet waiting in SW queue with highest priority14291429-14301430- Arguments:14311431- pAd Pointer to our adapter14321432-14331433- Return Value:14341434- pQueue Pointer to Waiting Queue14351435-14361436- IRQL = DISPATCH_LEVEL14371437-14381438- Note:14391439-14401440- ========================================================================14411441-*/14421442-PQUEUE_HEADER RTMPCheckTxSwQueue(14431443- IN PRTMP_ADAPTER pAd,14441444- OUT PUCHAR pQueIdx)14451445-{14461446- ULONG Number;14471447-14481448- Number = pAd->TxSwQueue[QID_AC_BK].Number14491449- + pAd->TxSwQueue[QID_AC_BE].Number14501450- + pAd->TxSwQueue[QID_AC_VI].Number14511451- + pAd->TxSwQueue[QID_AC_VO].Number14521452- + pAd->TxSwQueue[QID_HCCA].Number;14531453-14541454- if (pAd->TxSwQueue[QID_AC_VO].Head != NULL)14551455- {14561456- *pQueIdx = QID_AC_VO;14571457- return (&pAd->TxSwQueue[QID_AC_VO]);14581458- }14591459- else if (pAd->TxSwQueue[QID_AC_VI].Head != NULL)14601460- {14611461- *pQueIdx = QID_AC_VI;14621462- return (&pAd->TxSwQueue[QID_AC_VI]);14631463- }14641464- else if (pAd->TxSwQueue[QID_AC_BE].Head != NULL)14651465- {14661466- *pQueIdx = QID_AC_BE;14671467- return (&pAd->TxSwQueue[QID_AC_BE]);14681468- }14691469- else if (pAd->TxSwQueue[QID_AC_BK].Head != NULL)14701470- {14711471- *pQueIdx = QID_AC_BK;14721472- return (&pAd->TxSwQueue[QID_AC_BK]);14731473- }14741474- else if (pAd->TxSwQueue[QID_HCCA].Head != NULL)14751475- {14761476- *pQueIdx = QID_HCCA;14771477- return (&pAd->TxSwQueue[QID_HCCA]);14781478- }14791479-14801480- // No packet pending in Tx Sw queue14811481- *pQueIdx = QID_AC_BK;14821482-14831483- return (NULL);14841484-}14851485-14861486-14871487-14881488-/*14891489- ========================================================================14901490-14911491- Routine Description:14921492- Suspend MSDU transmission14931493-14941494- Arguments:14951495- pAd Pointer to our adapter14961496-14971497- Return Value:14981498- None14991499-15001500- Note:15011501-15021502- ========================================================================15031503-*/15041504-VOID RTMPSuspendMsduTransmission(15051505- IN PRTMP_ADAPTER pAd)15061506-{15071507- DBGPRINT(RT_DEBUG_TRACE,("SCANNING, suspend MSDU transmission ...\n"));15081508-15091509-15101510- //15111511- // Before BSS_SCAN_IN_PROGRESS, we need to keep Current R66 value and15121512- // use Lowbound as R66 value on ScanNextChannel(...)15131513- //15141514- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R66, &pAd->BbpTuning.R66CurrentValue);15151515-15161516- // set BBP_R66 to 0x30/0x40 when scanning (AsicSwitchChannel will set R66 according to channel when scanning)15171517- RTMPSetAGCInitValue(pAd, BW_20);15181518-15191519- RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);15201520-}15211521-15221522-/*15231523- ========================================================================15241524-15251525- Routine Description:15261526- Resume MSDU transmission15271527-15281528- Arguments:15291529- pAd Pointer to our adapter15301530-15311531- Return Value:15321532- None15331533-15341534- IRQL = DISPATCH_LEVEL15351535-15361536- Note:15371537-15381538- ========================================================================15391539-*/15401540-VOID RTMPResumeMsduTransmission(15411541- IN PRTMP_ADAPTER pAd)15421542-{15431543- DBGPRINT(RT_DEBUG_TRACE,("SCAN done, resume MSDU transmission ...\n"));15441544-15451545-#ifdef RT30xx15461546- // After finish BSS_SCAN_IN_PROGRESS, we need to restore Current R66 value15471547- // R66 should not be 015481548- if (pAd->BbpTuning.R66CurrentValue == 0)15491549- {15501550- pAd->BbpTuning.R66CurrentValue = 0x38;15511551- DBGPRINT_ERR(("RTMPResumeMsduTransmission, R66CurrentValue=0...\n"));15521552- }15531553-#endif15541554- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, pAd->BbpTuning.R66CurrentValue);15551555-15561556- RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);15571557- RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);15581558-}15591559-15601560-15611561-UINT deaggregate_AMSDU_announce(15621562- IN PRTMP_ADAPTER pAd,15631563- PNDIS_PACKET pPacket,15641564- IN PUCHAR pData,15651565- IN ULONG DataSize)15661566-{15671567- USHORT PayloadSize;15681568- USHORT SubFrameSize;15691569- PHEADER_802_3 pAMSDUsubheader;15701570- UINT nMSDU;15711571- UCHAR Header802_3[14];15721572-15731573- PUCHAR pPayload, pDA, pSA, pRemovedLLCSNAP;15741574- PNDIS_PACKET pClonePacket;15751575-15761576-15771577-15781578- nMSDU = 0;15791579-15801580- while (DataSize > LENGTH_802_3)15811581- {15821582-15831583- nMSDU++;15841584-15851585- pAMSDUsubheader = (PHEADER_802_3)pData;15861586- PayloadSize = pAMSDUsubheader->Octet[1] + (pAMSDUsubheader->Octet[0]<<8);15871587- SubFrameSize = PayloadSize + LENGTH_802_3;15881588-15891589-15901590- if ((DataSize < SubFrameSize) || (PayloadSize > 1518 ))15911591- {15921592- break;15931593- }15941594-15951595- pPayload = pData + LENGTH_802_3;15961596- pDA = pData;15971597- pSA = pData + MAC_ADDR_LEN;15981598-15991599- // convert to 802.3 header16001600- CONVERT_TO_802_3(Header802_3, pDA, pSA, pPayload, PayloadSize, pRemovedLLCSNAP);16011601-16021602- if ((Header802_3[12] == 0x88) && (Header802_3[13] == 0x8E) )16031603- {16041604- // avoid local heap overflow, use dyanamic allocation16051605- MLME_QUEUE_ELEM *Elem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);16061606- memmove(Elem->Msg+(LENGTH_802_11 + LENGTH_802_1_H), pPayload, PayloadSize);16071607- Elem->MsgLen = LENGTH_802_11 + LENGTH_802_1_H + PayloadSize;16081608- WpaEAPOLKeyAction(pAd, Elem);16091609- kfree(Elem);16101610- }16111611-16121612- {16131613- if (pRemovedLLCSNAP)16141614- {16151615- pPayload -= LENGTH_802_3;16161616- PayloadSize += LENGTH_802_3;16171617- NdisMoveMemory(pPayload, &Header802_3[0], LENGTH_802_3);16181618- }16191619- }16201620-16211621- pClonePacket = ClonePacket(pAd, pPacket, pPayload, PayloadSize);16221622- if (pClonePacket)16231623- {16241624- ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pClonePacket, RTMP_GET_PACKET_IF(pPacket));16251625- }16261626-16271627-16281628- // A-MSDU has padding to multiple of 4 including subframe header.16291629- // align SubFrameSize up to multiple of 416301630- SubFrameSize = (SubFrameSize+3)&(~0x3);16311631-16321632-16331633- if (SubFrameSize > 1528 || SubFrameSize < 32)16341634- {16351635- break;16361636- }16371637-16381638- if (DataSize > SubFrameSize)16391639- {16401640- pData += SubFrameSize;16411641- DataSize -= SubFrameSize;16421642- }16431643- else16441644- {16451645- // end of A-MSDU16461646- DataSize = 0;16471647- }16481648- }16491649-16501650- // finally release original rx packet16511651- RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS);16521652-16531653- return nMSDU;16541654-}16551655-16561656-16571657-UINT BA_Reorder_AMSDU_Annnounce(16581658- IN PRTMP_ADAPTER pAd,16591659- IN PNDIS_PACKET pPacket)16601660-{16611661- PUCHAR pData;16621662- USHORT DataSize;16631663- UINT nMSDU = 0;16641664-16651665- pData = (PUCHAR) GET_OS_PKT_DATAPTR(pPacket);16661666- DataSize = (USHORT) GET_OS_PKT_LEN(pPacket);16671667-16681668- nMSDU = deaggregate_AMSDU_announce(pAd, pPacket, pData, DataSize);16691669-16701670- return nMSDU;16711671-}16721672-16731673-16741674-/*16751675- ==========================================================================16761676- Description:16771677- Look up the MAC address in the MAC table. Return NULL if not found.16781678- Return:16791679- pEntry - pointer to the MAC entry; NULL is not found16801680- ==========================================================================16811681-*/16821682-MAC_TABLE_ENTRY *MacTableLookup(16831683- IN PRTMP_ADAPTER pAd,16841684- PUCHAR pAddr)16851685-{16861686- ULONG HashIdx;16871687- MAC_TABLE_ENTRY *pEntry = NULL;16881688-16891689- HashIdx = MAC_ADDR_HASH_INDEX(pAddr);16901690- pEntry = pAd->MacTab.Hash[HashIdx];16911691-16921692- while (pEntry && (pEntry->ValidAsCLI || pEntry->ValidAsWDS || pEntry->ValidAsApCli || pEntry->ValidAsMesh))16931693- {16941694- if (MAC_ADDR_EQUAL(pEntry->Addr, pAddr))16951695- {16961696- break;16971697- }16981698- else16991699- pEntry = pEntry->pNext;17001700- }17011701-17021702- return pEntry;17031703-}17041704-17051705-MAC_TABLE_ENTRY *MacTableInsertEntry(17061706- IN PRTMP_ADAPTER pAd,17071707- IN PUCHAR pAddr,17081708- IN UCHAR apidx,17091709- IN BOOLEAN CleanAll)17101710-{17111711- UCHAR HashIdx;17121712- int i, FirstWcid;17131713- MAC_TABLE_ENTRY *pEntry = NULL, *pCurrEntry;17141714-17151715- // if FULL, return17161716- if (pAd->MacTab.Size >= MAX_LEN_OF_MAC_TABLE)17171717- return NULL;17181718-17191719- FirstWcid = 1;17201720-17211721- if (pAd->StaCfg.BssType == BSS_INFRA)17221722- FirstWcid = 2;17231723-17241724- // allocate one MAC entry17251725- NdisAcquireSpinLock(&pAd->MacTabLock);17261726- for (i = FirstWcid; i< MAX_LEN_OF_MAC_TABLE; i++) // skip entry#0 so that "entry index == AID" for fast lookup17271727- {17281728- // pick up the first available vacancy17291729- if ((pAd->MacTab.Content[i].ValidAsCLI == FALSE) &&17301730- (pAd->MacTab.Content[i].ValidAsWDS == FALSE) &&17311731- (pAd->MacTab.Content[i].ValidAsApCli== FALSE) &&17321732- (pAd->MacTab.Content[i].ValidAsMesh == FALSE)17331733- )17341734- {17351735- pEntry = &pAd->MacTab.Content[i];17361736- if (CleanAll == TRUE)17371737- {17381738- pEntry->MaxSupportedRate = RATE_11;17391739- pEntry->CurrTxRate = RATE_11;17401740- NdisZeroMemory(pEntry, sizeof(MAC_TABLE_ENTRY));17411741- pEntry->PairwiseKey.KeyLen = 0;17421742- pEntry->PairwiseKey.CipherAlg = CIPHER_NONE;17431743- }17441744- {17451745- {17461746- pEntry->ValidAsCLI = TRUE;17471747- pEntry->ValidAsWDS = FALSE;17481748- pEntry->ValidAsApCli = FALSE;17491749- pEntry->ValidAsMesh = FALSE;17501750- pEntry->ValidAsDls = FALSE;17511751- }17521752- }17531753-17541754- pEntry->bIAmBadAtheros = FALSE;17551755- pEntry->pAd = pAd;17561756- pEntry->CMTimerRunning = FALSE;17571757- pEntry->EnqueueEapolStartTimerRunning = EAPOL_START_DISABLE;17581758- pEntry->RSNIE_Len = 0;17591759- NdisZeroMemory(pEntry->R_Counter, sizeof(pEntry->R_Counter));17601760- pEntry->ReTryCounter = PEER_MSG1_RETRY_TIMER_CTR;17611761-17621762- if (pEntry->ValidAsMesh)17631763- pEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_MESH);17641764- else if (pEntry->ValidAsApCli)17651765- pEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_APCLI);17661766- else if (pEntry->ValidAsWDS)17671767- pEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_WDS);17681768- else17691769- pEntry->apidx = apidx;17701770-17711771- {17721772- {17731773- pEntry->AuthMode = pAd->StaCfg.AuthMode;17741774- pEntry->WepStatus = pAd->StaCfg.WepStatus;17751775- pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;17761776- }17771777- }17781778-17791779- pEntry->GTKState = REKEY_NEGOTIATING;17801780- pEntry->PairwiseKey.KeyLen = 0;17811781- pEntry->PairwiseKey.CipherAlg = CIPHER_NONE;17821782- pEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;17831783- pEntry->PMKID_CacheIdx = ENTRY_NOT_FOUND;17841784- COPY_MAC_ADDR(pEntry->Addr, pAddr);17851785- pEntry->Sst = SST_NOT_AUTH;17861786- pEntry->AuthState = AS_NOT_AUTH;17871787- pEntry->Aid = (USHORT)i; //0;17881788- pEntry->CapabilityInfo = 0;17891789- pEntry->PsMode = PWR_ACTIVE;17901790- pEntry->PsQIdleCount = 0;17911791- pEntry->NoDataIdleCount = 0;17921792- pEntry->ContinueTxFailCnt = 0;17931793- InitializeQueueHeader(&pEntry->PsQueue);17941794-17951795-17961796- pAd->MacTab.Size ++;17971797- // Add this entry into ASIC RX WCID search table17981798- RT28XX_STA_ENTRY_ADD(pAd, pEntry);17991799-18001800- DBGPRINT(RT_DEBUG_TRACE, ("MacTableInsertEntry - allocate entry #%d, Total= %d\n",i, pAd->MacTab.Size));18011801- break;18021802- }18031803- }18041804-18051805- // add this MAC entry into HASH table18061806- if (pEntry)18071807- {18081808- HashIdx = MAC_ADDR_HASH_INDEX(pAddr);18091809- if (pAd->MacTab.Hash[HashIdx] == NULL)18101810- {18111811- pAd->MacTab.Hash[HashIdx] = pEntry;18121812- }18131813- else18141814- {18151815- pCurrEntry = pAd->MacTab.Hash[HashIdx];18161816- while (pCurrEntry->pNext != NULL)18171817- pCurrEntry = pCurrEntry->pNext;18181818- pCurrEntry->pNext = pEntry;18191819- }18201820- }18211821-18221822- NdisReleaseSpinLock(&pAd->MacTabLock);18231823- return pEntry;18241824-}18251825-18261826-/*18271827- ==========================================================================18281828- Description:18291829- Delete a specified client from MAC table18301830- ==========================================================================18311831- */18321832-BOOLEAN MacTableDeleteEntry(18331833- IN PRTMP_ADAPTER pAd,18341834- IN USHORT wcid,18351835- IN PUCHAR pAddr)18361836-{18371837- USHORT HashIdx;18381838- MAC_TABLE_ENTRY *pEntry, *pPrevEntry, *pProbeEntry;18391839- BOOLEAN Cancelled;18401840-18411841- if (wcid >= MAX_LEN_OF_MAC_TABLE)18421842- return FALSE;18431843-18441844- NdisAcquireSpinLock(&pAd->MacTabLock);18451845-18461846- HashIdx = MAC_ADDR_HASH_INDEX(pAddr);18471847- pEntry = &pAd->MacTab.Content[wcid];18481848-18491849- if (pEntry && (pEntry->ValidAsCLI || pEntry->ValidAsApCli || pEntry->ValidAsWDS || pEntry->ValidAsMesh18501850- ))18511851- {18521852- if (MAC_ADDR_EQUAL(pEntry->Addr, pAddr))18531853- {18541854-18551855- // Delete this entry from ASIC on-chip WCID Table18561856- RT28XX_STA_ENTRY_MAC_RESET(pAd, wcid);18571857-18581858- // free resources of BA18591859- BASessionTearDownALL(pAd, pEntry->Aid);18601860-18611861- pPrevEntry = NULL;18621862- pProbeEntry = pAd->MacTab.Hash[HashIdx];18631863- ASSERT(pProbeEntry);18641864-18651865- // update Hash list18661866- do18671867- {18681868- if (pProbeEntry == pEntry)18691869- {18701870- if (pPrevEntry == NULL)18711871- {18721872- pAd->MacTab.Hash[HashIdx] = pEntry->pNext;18731873- }18741874- else18751875- {18761876- pPrevEntry->pNext = pEntry->pNext;18771877- }18781878- break;18791879- }18801880-18811881- pPrevEntry = pProbeEntry;18821882- pProbeEntry = pProbeEntry->pNext;18831883- } while (pProbeEntry);18841884-18851885- // not found !!!18861886- ASSERT(pProbeEntry != NULL);18871887-18881888- RT28XX_STA_ENTRY_KEY_DEL(pAd, BSS0, wcid);18891889-18901890-18911891- if (pEntry->EnqueueEapolStartTimerRunning != EAPOL_START_DISABLE)18921892- {18931893- RTMPCancelTimer(&pEntry->EnqueueStartForPSKTimer, &Cancelled);18941894- pEntry->EnqueueEapolStartTimerRunning = EAPOL_START_DISABLE;18951895- }18961896-18971897-18981898- NdisZeroMemory(pEntry, sizeof(MAC_TABLE_ENTRY));18991899- pAd->MacTab.Size --;19001900- DBGPRINT(RT_DEBUG_TRACE, ("MacTableDeleteEntry1 - Total= %d\n", pAd->MacTab.Size));19011901- }19021902- else19031903- {19041904- printk("\n%s: Impossible Wcid = %d !!!!!\n", __func__, wcid);19051905- }19061906- }19071907-19081908- NdisReleaseSpinLock(&pAd->MacTabLock);19091909-19101910- //Reset operating mode when no Sta.19111911- if (pAd->MacTab.Size == 0)19121912- {19131913- pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode = 0;19141914-#ifndef RT30xx19151915- AsicUpdateProtect(pAd, 0 /*pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode*/, (ALLN_SETPROTECT), TRUE, 0 /*pAd->MacTab.fAnyStationNonGF*/);19161916-#endif19171917-#ifdef RT30xx19181918- RT28XX_UPDATE_PROTECT(pAd); // edit by johnli, fix "in_interrupt" error when call "MacTableDeleteEntry" in Rx tasklet19191919-#endif19201920- }19211921-19221922- return TRUE;19231923-}19241924-19251925-19261926-/*19271927- ==========================================================================19281928- Description:19291929- This routine reset the entire MAC table. All packets pending in19301930- the power-saving queues are freed here.19311931- ==========================================================================19321932- */19331933-VOID MacTableReset(19341934- IN PRTMP_ADAPTER pAd)19351935-{19361936- int i;19371937-19381938- DBGPRINT(RT_DEBUG_TRACE, ("MacTableReset\n"));19391939- //NdisAcquireSpinLock(&pAd->MacTabLock);19401940-19411941- for (i=1; i<MAX_LEN_OF_MAC_TABLE; i++)19421942- {19431943- if (pAd->MacTab.Content[i].ValidAsCLI == TRUE)19441944- {19451945- // free resources of BA19461946- BASessionTearDownALL(pAd, i);19471947-19481948- pAd->MacTab.Content[i].ValidAsCLI = FALSE;19491949-19501950-19511951-19521952-#ifdef RT287019531953- NdisZeroMemory(pAd->MacTab.Content[i].Addr, 6);19541954- RT28XX_STA_ENTRY_MAC_RESET(pAd, i);19551955-#endif // RT2870 //19561956-19571957- //AsicDelWcidTab(pAd, i);19581958- }19591959- }19601960-19611961- return;19621962-}19631963-19641964-/*19651965- ==========================================================================19661966- Description:19671967-19681968- IRQL = DISPATCH_LEVEL19691969-19701970- ==========================================================================19711971-*/19721972-VOID AssocParmFill(19731973- IN PRTMP_ADAPTER pAd,19741974- IN OUT MLME_ASSOC_REQ_STRUCT *AssocReq,19751975- IN PUCHAR pAddr,19761976- IN USHORT CapabilityInfo,19771977- IN ULONG Timeout,19781978- IN USHORT ListenIntv)19791979-{19801980- COPY_MAC_ADDR(AssocReq->Addr, pAddr);19811981- // Add mask to support 802.11b mode only19821982- AssocReq->CapabilityInfo = CapabilityInfo & SUPPORTED_CAPABILITY_INFO; // not cf-pollable, not cf-poll-request19831983- AssocReq->Timeout = Timeout;19841984- AssocReq->ListenIntv = ListenIntv;19851985-}19861986-19871987-19881988-/*19891989- ==========================================================================19901990- Description:19911991-19921992- IRQL = DISPATCH_LEVEL19931993-19941994- ==========================================================================19951995-*/19961996-VOID DisassocParmFill(19971997- IN PRTMP_ADAPTER pAd,19981998- IN OUT MLME_DISASSOC_REQ_STRUCT *DisassocReq,19991999- IN PUCHAR pAddr,20002000- IN USHORT Reason)20012001-{20022002- COPY_MAC_ADDR(DisassocReq->Addr, pAddr);20032003- DisassocReq->Reason = Reason;20042004-}20052005-20062006-20072007-/*20082008- ========================================================================20092009-20102010- Routine Description:20112011- Check the out going frame, if this is an DHCP or ARP datagram20122012- will be duplicate another frame at low data rate transmit.20132013-20142014- Arguments:20152015- pAd Pointer to our adapter20162016- pPacket Pointer to outgoing Ndis frame20172017-20182018- Return Value:20192019- TRUE To be duplicate at Low data rate transmit. (1mb)20202020- FALSE Do nothing.20212021-20222022- IRQL = DISPATCH_LEVEL20232023-20242024- Note:20252025-20262026- MAC header + IP Header + UDP Header20272027- 14 Bytes 20 Bytes20282028-20292029- UDP Header20302030- 00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|20312031- Source Port20322032- 16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|20332033- Destination Port20342034-20352035- port 0x43 means Bootstrap Protocol, server.20362036- Port 0x44 means Bootstrap Protocol, client.20372037-20382038- ========================================================================20392039-*/20402040-20412041-BOOLEAN RTMPCheckDHCPFrame(20422042- IN PRTMP_ADAPTER pAd,20432043- IN PNDIS_PACKET pPacket)20442044-{20452045- PACKET_INFO PacketInfo;20462046- ULONG NumberOfBytesRead = 0;20472047- ULONG CurrentOffset = 0;20482048- PVOID pVirtualAddress = NULL;20492049- UINT NdisBufferLength;20502050- PUCHAR pSrc;20512051- USHORT Protocol;20522052- UCHAR ByteOffset36 = 0;20532053- UCHAR ByteOffset38 = 0;20542054- BOOLEAN ReadFirstParm = TRUE;20552055-20562056- RTMP_QueryPacketInfo(pPacket, &PacketInfo, (PUCHAR *)&pVirtualAddress, &NdisBufferLength);20572057-20582058- NumberOfBytesRead += NdisBufferLength;20592059- pSrc = (PUCHAR) pVirtualAddress;20602060- Protocol = *(pSrc + 12) * 256 + *(pSrc + 13);20612061-20622062- //20632063- // Check DHCP & BOOTP protocol20642064- //20652065- while (NumberOfBytesRead <= PacketInfo.TotalPacketLength)20662066- {20672067- if ((NumberOfBytesRead >= 35) && (ReadFirstParm == TRUE))20682068- {20692069- CurrentOffset = 35 - (NumberOfBytesRead - NdisBufferLength);20702070- ByteOffset36 = *(pSrc + CurrentOffset);20712071- ReadFirstParm = FALSE;20722072- }20732073-20742074- if (NumberOfBytesRead >= 37)20752075- {20762076- CurrentOffset = 37 - (NumberOfBytesRead - NdisBufferLength);20772077- ByteOffset38 = *(pSrc + CurrentOffset);20782078- //End of Read20792079- break;20802080- }20812081- return FALSE;20822082- }20832083-20842084- // Check for DHCP & BOOTP protocol20852085- if ((ByteOffset36 != 0x44) || (ByteOffset38 != 0x43))20862086- {20872087- //20882088- // 2054 (hex 0806) for ARP datagrams20892089- // if this packet is not ARP datagrams, then do nothing20902090- // ARP datagrams will also be duplicate at 1mb broadcast frames20912091- //20922092- if (Protocol != 0x0806 )20932093- return FALSE;20942094- }20952095-20962096- return TRUE;20972097-}20982098-20992099-21002100-BOOLEAN RTMPCheckEtherType(21012101- IN PRTMP_ADAPTER pAd,21022102- IN PNDIS_PACKET pPacket)21032103-{21042104- USHORT TypeLen;21052105- UCHAR Byte0, Byte1;21062106- PUCHAR pSrcBuf;21072107- UINT32 pktLen;21082108- UINT16 srcPort, dstPort;21092109- BOOLEAN status = TRUE;21102110-21112111-21122112- pSrcBuf = GET_OS_PKT_DATAPTR(pPacket);21132113- pktLen = GET_OS_PKT_LEN(pPacket);21142114-21152115- ASSERT(pSrcBuf);21162116-21172117- RTMP_SET_PACKET_SPECIFIC(pPacket, 0);21182118-21192119- // get Ethernet protocol field21202120- TypeLen = (pSrcBuf[12] << 8) + pSrcBuf[13];21212121-21222122- pSrcBuf += LENGTH_802_3; // Skip the Ethernet Header.21232123-21242124- if (TypeLen <= 1500)21252125- { // 802.3, 802.3 LLC21262126- /*21272127- DestMAC(6) + SrcMAC(6) + Lenght(2) +21282128- DSAP(1) + SSAP(1) + Control(1) +21292129- if the DSAP = 0xAA, SSAP=0xAA, Contorl = 0x03, it has a 5-bytes SNAP header.21302130- => + SNAP (5, OriginationID(3) + etherType(2))21312131- */21322132- if (pSrcBuf[0] == 0xAA && pSrcBuf[1] == 0xAA && pSrcBuf[2] == 0x03)21332133- {21342134- Sniff2BytesFromNdisBuffer(pSrcBuf, 6, &Byte0, &Byte1);21352135- RTMP_SET_PACKET_LLCSNAP(pPacket, 1);21362136- TypeLen = (USHORT)((Byte0 << 8) + Byte1);21372137- pSrcBuf += 8; // Skip this LLC/SNAP header21382138- }21392139- else21402140- {21412141- //It just has 3-byte LLC header, maybe a legacy ether type frame. we didn't handle it.21422142- }21432143- }21442144-21452145- // If it's a VLAN packet, get the real Type/Length field.21462146- if (TypeLen == 0x8100)21472147- {21482148- /* 0x8100 means VLAN packets */21492149-21502150- /* Dest. MAC Address (6-bytes) +21512151- Source MAC Address (6-bytes) +21522152- Length/Type = 802.1Q Tag Type (2-byte) +21532153- Tag Control Information (2-bytes) +21542154- Length / Type (2-bytes) +21552155- data payload (0-n bytes) +21562156- Pad (0-p bytes) +21572157- Frame Check Sequence (4-bytes) */21582158-21592159- RTMP_SET_PACKET_VLAN(pPacket, 1);21602160- Sniff2BytesFromNdisBuffer(pSrcBuf, 2, &Byte0, &Byte1);21612161- TypeLen = (USHORT)((Byte0 << 8) + Byte1);21622162-21632163- pSrcBuf += 4; // Skip the VLAN Header.21642164- }21652165-21662166- switch (TypeLen)21672167- {21682168- case 0x0800:21692169- {21702170- ASSERT((pktLen > 34));21712171- if (*(pSrcBuf + 9) == 0x11)21722172- { // udp packet21732173- ASSERT((pktLen > 34)); // 14 for ethernet header, 20 for IP header21742174-21752175- pSrcBuf += 20; // Skip the IP header21762176- srcPort = OS_NTOHS(*((UINT16 *)pSrcBuf));21772177- dstPort = OS_NTOHS(*((UINT16 *)(pSrcBuf +2)));21782178-21792179- if ((srcPort==0x44 && dstPort==0x43) || (srcPort==0x43 && dstPort==0x44))21802180- { //It's a BOOTP/DHCP packet21812181- RTMP_SET_PACKET_DHCP(pPacket, 1);21822182- }21832183- }21842184- }21852185- break;21862186- case 0x0806:21872187- {21882188- //ARP Packet.21892189- RTMP_SET_PACKET_DHCP(pPacket, 1);21902190- }21912191- break;21922192- case 0x888e:21932193- {21942194- // EAPOL Packet.21952195- RTMP_SET_PACKET_EAPOL(pPacket, 1);21962196- }21972197- break;21982198- default:21992199- status = FALSE;22002200- break;22012201- }22022202-22032203- return status;22042204-22052205-}22062206-22072207-22082208-22092209-VOID Update_Rssi_Sample(22102210- IN PRTMP_ADAPTER pAd,22112211- IN RSSI_SAMPLE *pRssi,22122212- IN PRXWI_STRUC pRxWI)22132213- {22142214- CHAR rssi0 = pRxWI->RSSI0;22152215- CHAR rssi1 = pRxWI->RSSI1;22162216- CHAR rssi2 = pRxWI->RSSI2;22172217-22182218- if (rssi0 != 0)22192219- {22202220- pRssi->LastRssi0 = ConvertToRssi(pAd, (CHAR)rssi0, RSSI_0);22212221- pRssi->AvgRssi0X8 = (pRssi->AvgRssi0X8 - pRssi->AvgRssi0) + pRssi->LastRssi0;22222222- pRssi->AvgRssi0 = pRssi->AvgRssi0X8 >> 3;22232223- }22242224-22252225- if (rssi1 != 0)22262226- {22272227- pRssi->LastRssi1 = ConvertToRssi(pAd, (CHAR)rssi1, RSSI_1);22282228- pRssi->AvgRssi1X8 = (pRssi->AvgRssi1X8 - pRssi->AvgRssi1) + pRssi->LastRssi1;22292229- pRssi->AvgRssi1 = pRssi->AvgRssi1X8 >> 3;22302230- }22312231-22322232- if (rssi2 != 0)22332233- {22342234- pRssi->LastRssi2 = ConvertToRssi(pAd, (CHAR)rssi2, RSSI_2);22352235- pRssi->AvgRssi2X8 = (pRssi->AvgRssi2X8 - pRssi->AvgRssi2) + pRssi->LastRssi2;22362236- pRssi->AvgRssi2 = pRssi->AvgRssi2X8 >> 3;22372237- }22382238-}22392239-22402240-22412241-22422242-// Normal legacy Rx packet indication22432243-VOID Indicate_Legacy_Packet(22442244- IN PRTMP_ADAPTER pAd,22452245- IN RX_BLK *pRxBlk,22462246- IN UCHAR FromWhichBSSID)22472247-{22482248- PNDIS_PACKET pRxPacket = pRxBlk->pRxPacket;22492249- UCHAR Header802_3[LENGTH_802_3];22502250-22512251- // 1. get 802.3 Header22522252- // 2. remove LLC22532253- // a. pointer pRxBlk->pData to payload22542254- // b. modify pRxBlk->DataSize22552255- RTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3);22562256-22572257- if (pRxBlk->DataSize > MAX_RX_PKT_LEN)22582258- {22592259-22602260- // release packet22612261- RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);22622262- return;22632263- }22642264-22652265-22662266- STATS_INC_RX_PACKETS(pAd, FromWhichBSSID);22672267-22682268-#ifdef RT287022692269- if (pAd->CommonCfg.bDisableReordering == 0)22702270- {22712271- PBA_REC_ENTRY pBAEntry;22722272- ULONG Now32;22732273- UCHAR Wcid = pRxBlk->pRxWI->WirelessCliID;22742274- UCHAR TID = pRxBlk->pRxWI->TID;22752275- USHORT Idx;22762276-22772277-#define REORDERING_PACKET_TIMEOUT ((100 * HZ)/1000) // system ticks -- 100 ms22782278-22792279- if (Wcid < MAX_LEN_OF_MAC_TABLE)22802280- {22812281- Idx = pAd->MacTab.Content[Wcid].BARecWcidArray[TID];22822282- if (Idx != 0)22832283- {22842284- pBAEntry = &pAd->BATable.BARecEntry[Idx];22852285- // update last rx time22862286- NdisGetSystemUpTime(&Now32);22872287- if ((pBAEntry->list.qlen > 0) &&22882288- RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer+(REORDERING_PACKET_TIMEOUT)))22892289- )22902290- {22912291- printk("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);22922292- hex_dump("Dump the legacy Packet:", GET_OS_PKT_DATAPTR(pRxBlk->pRxPacket), 64);22932293- ba_flush_reordering_timeout_mpdus(pAd, pBAEntry, Now32);22942294- }22952295- }22962296- }22972297- }22982298-#endif // RT2870 //22992299-23002300- wlan_802_11_to_802_3_packet(pAd, pRxBlk, Header802_3, FromWhichBSSID);23012301-23022302- //23032303- // pass this 802.3 packet to upper layer or forward this packet to WM directly23042304- //23052305- ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pRxPacket, FromWhichBSSID);23062306-}23072307-23082308-23092309-// Normal, AMPDU or AMSDU23102310-VOID CmmRxnonRalinkFrameIndicate(23112311- IN PRTMP_ADAPTER pAd,23122312- IN RX_BLK *pRxBlk,23132313- IN UCHAR FromWhichBSSID)23142314-{23152315- if (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMPDU) && (pAd->CommonCfg.bDisableReordering == 0))23162316- {23172317- Indicate_AMPDU_Packet(pAd, pRxBlk, FromWhichBSSID);23182318- }23192319- else23202320- {23212321- if (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU))23222322- {23232323- // handle A-MSDU23242324- Indicate_AMSDU_Packet(pAd, pRxBlk, FromWhichBSSID);23252325- }23262326- else23272327- {23282328- Indicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID);23292329- }23302330- }23312331-}23322332-23332333-23342334-VOID CmmRxRalinkFrameIndicate(23352335- IN PRTMP_ADAPTER pAd,23362336- IN MAC_TABLE_ENTRY *pEntry,23372337- IN RX_BLK *pRxBlk,23382338- IN UCHAR FromWhichBSSID)23392339-{23402340- UCHAR Header802_3[LENGTH_802_3];23412341- UINT16 Msdu2Size;23422342- UINT16 Payload1Size, Payload2Size;23432343- PUCHAR pData2;23442344- PNDIS_PACKET pPacket2 = NULL;23452345-23462346-23472347-23482348- Msdu2Size = *(pRxBlk->pData) + (*(pRxBlk->pData+1) << 8);23492349-23502350- if ((Msdu2Size <= 1536) && (Msdu2Size < pRxBlk->DataSize))23512351- {23522352- /* skip two byte MSDU2 len */23532353- pRxBlk->pData += 2;23542354- pRxBlk->DataSize -= 2;23552355- }23562356- else23572357- {23582358- // release packet23592359- RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);23602360- return;23612361- }23622362-23632363- // get 802.3 Header and remove LLC23642364- RTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3);23652365-23662366- ASSERT(pRxBlk->pRxPacket);23672367-23682368- // Ralink Aggregation frame23692369- pAd->RalinkCounters.OneSecRxAggregationCount ++;23702370- Payload1Size = pRxBlk->DataSize - Msdu2Size;23712371- Payload2Size = Msdu2Size - LENGTH_802_3;23722372-23732373- pData2 = pRxBlk->pData + Payload1Size + LENGTH_802_3;23742374-23752375- pPacket2 = duplicate_pkt(pAd, (pData2-LENGTH_802_3), LENGTH_802_3, pData2, Payload2Size, FromWhichBSSID);23762376-23772377- if (!pPacket2)23782378- {23792379- // release packet23802380- RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);23812381- return;23822382- }23832383-23842384- // update payload size of 1st packet23852385- pRxBlk->DataSize = Payload1Size;23862386- wlan_802_11_to_802_3_packet(pAd, pRxBlk, Header802_3, FromWhichBSSID);23872387-23882388- ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pRxBlk->pRxPacket, FromWhichBSSID);23892389-23902390- if (pPacket2)23912391- {23922392- ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pPacket2, FromWhichBSSID);23932393- }23942394-}23952395-23962396-23972397-#define RESET_FRAGFRAME(_fragFrame) \23982398- { \23992399- _fragFrame.RxSize = 0; \24002400- _fragFrame.Sequence = 0; \24012401- _fragFrame.LastFrag = 0; \24022402- _fragFrame.Flags = 0; \24032403- }24042404-24052405-24062406-PNDIS_PACKET RTMPDeFragmentDataFrame(24072407- IN PRTMP_ADAPTER pAd,24082408- IN RX_BLK *pRxBlk)24092409-{24102410- PHEADER_802_11 pHeader = pRxBlk->pHeader;24112411- PNDIS_PACKET pRxPacket = pRxBlk->pRxPacket;24122412- UCHAR *pData = pRxBlk->pData;24132413- USHORT DataSize = pRxBlk->DataSize;24142414- PNDIS_PACKET pRetPacket = NULL;24152415- UCHAR *pFragBuffer = NULL;24162416- BOOLEAN bReassDone = FALSE;24172417- UCHAR HeaderRoom = 0;24182418-24192419-24202420- ASSERT(pHeader);24212421-24222422- HeaderRoom = pData - (UCHAR *)pHeader;24232423-24242424- // Re-assemble the fragmented packets24252425- if (pHeader->Frag == 0) // Frag. Number is 0 : First frag or only one pkt24262426- {24272427- // the first pkt of fragment, record it.24282428- if (pHeader->FC.MoreFrag)24292429- {24302430- ASSERT(pAd->FragFrame.pFragPacket);24312431- pFragBuffer = GET_OS_PKT_DATAPTR(pAd->FragFrame.pFragPacket);24322432- pAd->FragFrame.RxSize = DataSize + HeaderRoom;24332433- NdisMoveMemory(pFragBuffer, pHeader, pAd->FragFrame.RxSize);24342434- pAd->FragFrame.Sequence = pHeader->Sequence;24352435- pAd->FragFrame.LastFrag = pHeader->Frag; // Should be 024362436- ASSERT(pAd->FragFrame.LastFrag == 0);24372437- goto done; // end of processing this frame24382438- }24392439- }24402440- else //Middle & End of fragment24412441- {24422442- if ((pHeader->Sequence != pAd->FragFrame.Sequence) ||24432443- (pHeader->Frag != (pAd->FragFrame.LastFrag + 1)))24442444- {24452445- // Fragment is not the same sequence or out of fragment number order24462446- // Reset Fragment control blk24472447- RESET_FRAGFRAME(pAd->FragFrame);24482448- DBGPRINT(RT_DEBUG_ERROR, ("Fragment is not the same sequence or out of fragment number order.\n"));24492449- goto done; // give up this frame24502450- }24512451- else if ((pAd->FragFrame.RxSize + DataSize) > MAX_FRAME_SIZE)24522452- {24532453- // Fragment frame is too large, it exeeds the maximum frame size.24542454- // Reset Fragment control blk24552455- RESET_FRAGFRAME(pAd->FragFrame);24562456- DBGPRINT(RT_DEBUG_ERROR, ("Fragment frame is too large, it exeeds the maximum frame size.\n"));24572457- goto done; // give up this frame24582458- }24592459-24602460- //24612461- // Broadcom AP(BCM94704AGR) will send out LLC in fragment's packet, LLC only can accpet at first fragment.24622462- // In this case, we will dropt it.24632463- //24642464- if (NdisEqualMemory(pData, SNAP_802_1H, sizeof(SNAP_802_1H)))24652465- {24662466- DBGPRINT(RT_DEBUG_ERROR, ("Find another LLC at Middle or End fragment(SN=%d, Frag=%d)\n", pHeader->Sequence, pHeader->Frag));24672467- goto done; // give up this frame24682468- }24692469-24702470- pFragBuffer = GET_OS_PKT_DATAPTR(pAd->FragFrame.pFragPacket);24712471-24722472- // concatenate this fragment into the re-assembly buffer24732473- NdisMoveMemory((pFragBuffer + pAd->FragFrame.RxSize), pData, DataSize);24742474- pAd->FragFrame.RxSize += DataSize;24752475- pAd->FragFrame.LastFrag = pHeader->Frag; // Update fragment number24762476-24772477- // Last fragment24782478- if (pHeader->FC.MoreFrag == FALSE)24792479- {24802480- bReassDone = TRUE;24812481- }24822482- }24832483-24842484-done:24852485- // always release rx fragmented packet24862486- RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);24872487-24882488- // return defragmented packet if packet is reassembled completely24892489- // otherwise return NULL24902490- if (bReassDone)24912491- {24922492- PNDIS_PACKET pNewFragPacket;24932493-24942494- // allocate a new packet buffer for fragment24952495- pNewFragPacket = RTMP_AllocateFragPacketBuffer(pAd, RX_BUFFER_NORMSIZE);24962496- if (pNewFragPacket)24972497- {24982498- // update RxBlk24992499- pRetPacket = pAd->FragFrame.pFragPacket;25002500- pAd->FragFrame.pFragPacket = pNewFragPacket;25012501- pRxBlk->pHeader = (PHEADER_802_11) GET_OS_PKT_DATAPTR(pRetPacket);25022502- pRxBlk->pData = (UCHAR *)pRxBlk->pHeader + HeaderRoom;25032503- pRxBlk->DataSize = pAd->FragFrame.RxSize - HeaderRoom;25042504- pRxBlk->pRxPacket = pRetPacket;25052505- }25062506- else25072507- {25082508- RESET_FRAGFRAME(pAd->FragFrame);25092509- }25102510- }25112511-25122512- return pRetPacket;25132513-}25142514-25152515-25162516-VOID Indicate_AMSDU_Packet(25172517- IN PRTMP_ADAPTER pAd,25182518- IN RX_BLK *pRxBlk,25192519- IN UCHAR FromWhichBSSID)25202520-{25212521- UINT nMSDU;25222522-25232523- update_os_packet_info(pAd, pRxBlk, FromWhichBSSID);25242524- RTMP_SET_PACKET_IF(pRxBlk->pRxPacket, FromWhichBSSID);25252525- nMSDU = deaggregate_AMSDU_announce(pAd, pRxBlk->pRxPacket, pRxBlk->pData, pRxBlk->DataSize);25262526-}25272527-25282528-VOID Indicate_EAPOL_Packet(25292529- IN PRTMP_ADAPTER pAd,25302530- IN RX_BLK *pRxBlk,25312531- IN UCHAR FromWhichBSSID)25322532-{25332533- MAC_TABLE_ENTRY *pEntry = NULL;25342534-25352535- {25362536- pEntry = &pAd->MacTab.Content[BSSID_WCID];25372537- STARxEAPOLFrameIndicate(pAd, pEntry, pRxBlk, FromWhichBSSID);25382538- return;25392539- }25402540-25412541- if (pEntry == NULL)25422542- {25432543- DBGPRINT(RT_DEBUG_WARN, ("Indicate_EAPOL_Packet: drop and release the invalid packet.\n"));25442544- // release packet25452545- RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);25462546- return;25472547- }25482548-}25492549-25502550-#define BCN_TBTT_OFFSET 64 //defer 64 us25512551-VOID ReSyncBeaconTime(25522552- IN PRTMP_ADAPTER pAd)25532553-{25542554-25552555- UINT32 Offset;25562556-25572557-25582558- Offset = (pAd->TbttTickCount) % (BCN_TBTT_OFFSET);25592559-25602560- pAd->TbttTickCount++;25612561-25622562- //25632563- // The updated BeaconInterval Value will affect Beacon Interval after two TBTT25642564- // beacasue the original BeaconInterval had been loaded into next TBTT_TIMER25652565- //25662566- if (Offset == (BCN_TBTT_OFFSET-2))25672567- {25682568- BCN_TIME_CFG_STRUC csr;25692569- RTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr.word);25702570- csr.field.BeaconInterval = (pAd->CommonCfg.BeaconPeriod << 4) - 1 ; // ASIC register in units of 1/16 TU = 64us25712571- RTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr.word);25722572- }25732573- else25742574- {25752575- if (Offset == (BCN_TBTT_OFFSET-1))25762576- {25772577- BCN_TIME_CFG_STRUC csr;25782578-25792579- RTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr.word);25802580- csr.field.BeaconInterval = (pAd->CommonCfg.BeaconPeriod) << 4; // ASIC register in units of 1/16 TU25812581- RTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr.word);25822582- }25832583- }25842584-}25852585-11+#include "../../rt2860/common/cmm_data.c"
+1-3238
drivers/staging/rt2870/common/cmm_info.c
···11-/*22- *************************************************************************33- * Ralink Tech Inc.44- * 5F., No.36, Taiyuan St., Jhubei City,55- * Hsinchu County 302,66- * Taiwan, R.O.C.77- *88- * (c) Copyright 2002-2007, Ralink Technology, Inc.99- *1010- * This program is free software; you can redistribute it and/or modify *1111- * it under the terms of the GNU General Public License as published by *1212- * the Free Software Foundation; either version 2 of the License, or *1313- * (at your option) any later version. *1414- * *1515- * This program is distributed in the hope that it will be useful, *1616- * but WITHOUT ANY WARRANTY; without even the implied warranty of *1717- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *1818- * GNU General Public License for more details. *1919- * *2020- * You should have received a copy of the GNU General Public License *2121- * along with this program; if not, write to the *2222- * Free Software Foundation, Inc., *2323- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *2424- * *2525- *************************************************************************2626-*/2727-2828-#include "../rt_config.h"2929-3030-INT Show_SSID_Proc(3131- IN PRTMP_ADAPTER pAd,3232- OUT PUCHAR pBuf);3333-3434-INT Show_WirelessMode_Proc(3535- IN PRTMP_ADAPTER pAd,3636- OUT PUCHAR pBuf);3737-3838-INT Show_TxBurst_Proc(3939- IN PRTMP_ADAPTER pAd,4040- OUT PUCHAR pBuf);4141-4242-INT Show_TxPreamble_Proc(4343- IN PRTMP_ADAPTER pAd,4444- OUT PUCHAR pBuf);4545-4646-INT Show_TxPower_Proc(4747- IN PRTMP_ADAPTER pAd,4848- OUT PUCHAR pBuf);4949-5050-INT Show_Channel_Proc(5151- IN PRTMP_ADAPTER pAd,5252- OUT PUCHAR pBuf);5353-5454-INT Show_BGProtection_Proc(5555- IN PRTMP_ADAPTER pAd,5656- OUT PUCHAR pBuf);5757-5858-INT Show_RTSThreshold_Proc(5959- IN PRTMP_ADAPTER pAd,6060- OUT PUCHAR pBuf);6161-6262-INT Show_FragThreshold_Proc(6363- IN PRTMP_ADAPTER pAd,6464- OUT PUCHAR pBuf);6565-6666-INT Show_HtBw_Proc(6767- IN PRTMP_ADAPTER pAd,6868- OUT PUCHAR pBuf);6969-7070-INT Show_HtMcs_Proc(7171- IN PRTMP_ADAPTER pAd,7272- OUT PUCHAR pBuf);7373-7474-INT Show_HtGi_Proc(7575- IN PRTMP_ADAPTER pAd,7676- OUT PUCHAR pBuf);7777-7878-INT Show_HtOpMode_Proc(7979- IN PRTMP_ADAPTER pAd,8080- OUT PUCHAR pBuf);8181-8282-INT Show_HtExtcha_Proc(8383- IN PRTMP_ADAPTER pAd,8484- OUT PUCHAR pBuf);8585-8686-INT Show_HtMpduDensity_Proc(8787- IN PRTMP_ADAPTER pAd,8888- OUT PUCHAR pBuf);8989-9090-INT Show_HtBaWinSize_Proc(9191- IN PRTMP_ADAPTER pAd,9292- OUT PUCHAR pBuf);9393-9494-INT Show_HtRdg_Proc(9595- IN PRTMP_ADAPTER pAd,9696- OUT PUCHAR pBuf);9797-9898-INT Show_HtAmsdu_Proc(9999- IN PRTMP_ADAPTER pAd,100100- OUT PUCHAR pBuf);101101-102102-INT Show_HtAutoBa_Proc(103103- IN PRTMP_ADAPTER pAd,104104- OUT PUCHAR pBuf);105105-106106-INT Show_CountryRegion_Proc(107107- IN PRTMP_ADAPTER pAd,108108- OUT PUCHAR pBuf);109109-110110-INT Show_CountryRegionABand_Proc(111111- IN PRTMP_ADAPTER pAd,112112- OUT PUCHAR pBuf);113113-114114-INT Show_CountryCode_Proc(115115- IN PRTMP_ADAPTER pAd,116116- OUT PUCHAR pBuf);117117-118118-#ifdef AGGREGATION_SUPPORT119119-INT Show_PktAggregate_Proc(120120- IN PRTMP_ADAPTER pAd,121121- OUT PUCHAR pBuf);122122-#endif // AGGREGATION_SUPPORT //123123-124124-#ifdef WMM_SUPPORT125125-INT Show_WmmCapable_Proc(126126- IN PRTMP_ADAPTER pAd,127127- OUT PUCHAR pBuf);128128-#endif // WMM_SUPPORT //129129-130130-INT Show_IEEE80211H_Proc(131131- IN PRTMP_ADAPTER pAd,132132- OUT PUCHAR pBuf);133133-134134-INT Show_NetworkType_Proc(135135- IN PRTMP_ADAPTER pAd,136136- OUT PUCHAR pBuf);137137-138138-INT Show_AuthMode_Proc(139139- IN PRTMP_ADAPTER pAd,140140- OUT PUCHAR pBuf);141141-142142-INT Show_EncrypType_Proc(143143- IN PRTMP_ADAPTER pAd,144144- OUT PUCHAR pBuf);145145-146146-INT Show_DefaultKeyID_Proc(147147- IN PRTMP_ADAPTER pAd,148148- OUT PUCHAR pBuf);149149-150150-INT Show_Key1_Proc(151151- IN PRTMP_ADAPTER pAd,152152- OUT PUCHAR pBuf);153153-154154-INT Show_Key2_Proc(155155- IN PRTMP_ADAPTER pAd,156156- OUT PUCHAR pBuf);157157-158158-INT Show_Key3_Proc(159159- IN PRTMP_ADAPTER pAd,160160- OUT PUCHAR pBuf);161161-162162-INT Show_Key4_Proc(163163- IN PRTMP_ADAPTER pAd,164164- OUT PUCHAR pBuf);165165-166166-INT Show_WPAPSK_Proc(167167- IN PRTMP_ADAPTER pAd,168168- OUT PUCHAR pBuf);169169-170170-static struct {171171- CHAR *name;172172- INT (*show_proc)(PRTMP_ADAPTER pAdapter, PUCHAR arg);173173-} *PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC, RTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC[] = {174174- {"SSID", Show_SSID_Proc},175175- {"WirelessMode", Show_WirelessMode_Proc},176176- {"TxBurst", Show_TxBurst_Proc},177177- {"TxPreamble", Show_TxPreamble_Proc},178178- {"TxPower", Show_TxPower_Proc},179179- {"Channel", Show_Channel_Proc},180180- {"BGProtection", Show_BGProtection_Proc},181181- {"RTSThreshold", Show_RTSThreshold_Proc},182182- {"FragThreshold", Show_FragThreshold_Proc},183183- {"HtBw", Show_HtBw_Proc},184184- {"HtMcs", Show_HtMcs_Proc},185185- {"HtGi", Show_HtGi_Proc},186186- {"HtOpMode", Show_HtOpMode_Proc},187187- {"HtExtcha", Show_HtExtcha_Proc},188188- {"HtMpduDensity", Show_HtMpduDensity_Proc},189189- {"HtBaWinSize", Show_HtBaWinSize_Proc},190190- {"HtRdg", Show_HtRdg_Proc},191191- {"HtAmsdu", Show_HtAmsdu_Proc},192192- {"HtAutoBa", Show_HtAutoBa_Proc},193193- {"CountryRegion", Show_CountryRegion_Proc},194194- {"CountryRegionABand", Show_CountryRegionABand_Proc},195195- {"CountryCode", Show_CountryCode_Proc},196196-#ifdef AGGREGATION_SUPPORT197197- {"PktAggregate", Show_PktAggregate_Proc},198198-#endif199199-200200-#ifdef WMM_SUPPORT201201- {"WmmCapable", Show_WmmCapable_Proc},202202-#endif203203- {"IEEE80211H", Show_IEEE80211H_Proc},204204- {"NetworkType", Show_NetworkType_Proc},205205- {"AuthMode", Show_AuthMode_Proc},206206- {"EncrypType", Show_EncrypType_Proc},207207- {"DefaultKeyID", Show_DefaultKeyID_Proc},208208- {"Key1", Show_Key1_Proc},209209- {"Key2", Show_Key2_Proc},210210- {"Key3", Show_Key3_Proc},211211- {"Key4", Show_Key4_Proc},212212- {"WPAPSK", Show_WPAPSK_Proc},213213- {NULL, NULL}214214-};215215-216216-/*217217- ==========================================================================218218- Description:219219- Get Driver version.220220-221221- Return:222222- ==========================================================================223223-*/224224-INT Set_DriverVersion_Proc(225225- IN PRTMP_ADAPTER pAd,226226- IN PUCHAR arg)227227-{228228- DBGPRINT(RT_DEBUG_TRACE, ("Driver version-%s\n", STA_DRIVER_VERSION));229229-230230- return TRUE;231231-}232232-233233-/*234234- ==========================================================================235235- Description:236236- Set Country Region.237237- This command will not work, if the field of CountryRegion in eeprom is programmed.238238- Return:239239- TRUE if all parameters are OK, FALSE otherwise240240- ==========================================================================241241-*/242242-INT Set_CountryRegion_Proc(243243- IN PRTMP_ADAPTER pAd,244244- IN PUCHAR arg)245245-{246246- ULONG region;247247-248248- region = simple_strtol(arg, 0, 10);249249-250250- // Country can be set only when EEPROM not programmed251251- if (pAd->CommonCfg.CountryRegion & 0x80)252252- {253253- DBGPRINT(RT_DEBUG_ERROR, ("Set_CountryRegion_Proc::parameter of CountryRegion in eeprom is programmed \n"));254254- return FALSE;255255- }256256-257257- if((region >= 0) && (region <= REGION_MAXIMUM_BG_BAND))258258- {259259- pAd->CommonCfg.CountryRegion = (UCHAR) region;260260- }261261- else if (region == REGION_31_BG_BAND)262262- {263263- pAd->CommonCfg.CountryRegion = (UCHAR) region;264264- }265265- else266266- {267267- DBGPRINT(RT_DEBUG_ERROR, ("Set_CountryRegion_Proc::parameters out of range\n"));268268- return FALSE;269269- }270270-271271- // if set country region, driver needs to be reset272272- BuildChannelList(pAd);273273-274274- DBGPRINT(RT_DEBUG_TRACE, ("Set_CountryRegion_Proc::(CountryRegion=%d)\n", pAd->CommonCfg.CountryRegion));275275-276276- return TRUE;277277-}278278-279279-/*280280- ==========================================================================281281- Description:282282- Set Country Region for A band.283283- This command will not work, if the field of CountryRegion in eeprom is programmed.284284- Return:285285- TRUE if all parameters are OK, FALSE otherwise286286- ==========================================================================287287-*/288288-INT Set_CountryRegionABand_Proc(289289- IN PRTMP_ADAPTER pAd,290290- IN PUCHAR arg)291291-{292292- ULONG region;293293-294294- region = simple_strtol(arg, 0, 10);295295-296296- // Country can be set only when EEPROM not programmed297297- if (pAd->CommonCfg.CountryRegionForABand & 0x80)298298- {299299- DBGPRINT(RT_DEBUG_ERROR, ("Set_CountryRegionABand_Proc::parameter of CountryRegion in eeprom is programmed \n"));300300- return FALSE;301301- }302302-303303- if((region >= 0) && (region <= REGION_MAXIMUM_A_BAND))304304- {305305- pAd->CommonCfg.CountryRegionForABand = (UCHAR) region;306306- }307307- else308308- {309309- DBGPRINT(RT_DEBUG_ERROR, ("Set_CountryRegionABand_Proc::parameters out of range\n"));310310- return FALSE;311311- }312312-313313- // if set country region, driver needs to be reset314314- BuildChannelList(pAd);315315-316316- DBGPRINT(RT_DEBUG_TRACE, ("Set_CountryRegionABand_Proc::(CountryRegion=%d)\n", pAd->CommonCfg.CountryRegionForABand));317317-318318- return TRUE;319319-}320320-321321-/*322322- ==========================================================================323323- Description:324324- Set Wireless Mode325325- Return:326326- TRUE if all parameters are OK, FALSE otherwise327327- ==========================================================================328328-*/329329-INT Set_WirelessMode_Proc(330330- IN PRTMP_ADAPTER pAd,331331- IN PUCHAR arg)332332-{333333- ULONG WirelessMode;334334- INT success = TRUE;335335-336336- WirelessMode = simple_strtol(arg, 0, 10);337337-338338- {339339- INT MaxPhyMode = PHY_11G;340340-341341- MaxPhyMode = PHY_11N_5G;342342-343343- if (WirelessMode <= MaxPhyMode)344344- {345345- RTMPSetPhyMode(pAd, WirelessMode);346346-347347- if (WirelessMode >= PHY_11ABGN_MIXED)348348- {349349- pAd->CommonCfg.BACapability.field.AutoBA = TRUE;350350- pAd->CommonCfg.REGBACapability.field.AutoBA = TRUE;351351- }352352- else353353- {354354- pAd->CommonCfg.BACapability.field.AutoBA = FALSE;355355- pAd->CommonCfg.REGBACapability.field.AutoBA = FALSE;356356- }357357-358358- // Set AdhocMode rates359359- if (pAd->StaCfg.BssType == BSS_ADHOC)360360- {361361- MlmeUpdateTxRates(pAd, FALSE, 0);362362- MakeIbssBeacon(pAd); // re-build BEACON frame363363- AsicEnableIbssSync(pAd); // copy to on-chip memory364364- }365365- }366366- else367367- {368368- success = FALSE;369369- }370370- }371371-372372- // it is needed to set SSID to take effect373373- if (success == TRUE)374374- {375375- SetCommonHT(pAd);376376- DBGPRINT(RT_DEBUG_TRACE, ("Set_WirelessMode_Proc::(=%ld)\n", WirelessMode));377377- }378378- else379379- {380380- DBGPRINT(RT_DEBUG_ERROR, ("Set_WirelessMode_Proc::parameters out of range\n"));381381- }382382-383383- return success;384384-}385385-386386-/*387387- ==========================================================================388388- Description:389389- Set Channel390390- Return:391391- TRUE if all parameters are OK, FALSE otherwise392392- ==========================================================================393393-*/394394-INT Set_Channel_Proc(395395- IN PRTMP_ADAPTER pAd,396396- IN PUCHAR arg)397397-{398398- INT success = TRUE;399399- UCHAR Channel;400400-401401- Channel = (UCHAR) simple_strtol(arg, 0, 10);402402-403403- // check if this channel is valid404404- if (ChannelSanity(pAd, Channel) == TRUE)405405- {406406- {407407- pAd->CommonCfg.Channel = Channel;408408-409409- if (MONITOR_ON(pAd))410410- {411411- N_ChannelCheck(pAd);412412- if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED &&413413- pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)414414- {415415- N_SetCenCh(pAd);416416- AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);417417- AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);418418- DBGPRINT(RT_DEBUG_TRACE, ("BW_40, control_channel(%d), CentralChannel(%d) \n",419419- pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel));420420- }421421- else422422- {423423- AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);424424- AsicLockChannel(pAd, pAd->CommonCfg.Channel);425425- DBGPRINT(RT_DEBUG_TRACE, ("BW_20, Channel(%d)\n", pAd->CommonCfg.Channel));426426- }427427- }428428- }429429- success = TRUE;430430- }431431- else432432- {433433- success = FALSE;434434- }435435-436436-437437- if (success == TRUE)438438- DBGPRINT(RT_DEBUG_TRACE, ("Set_Channel_Proc::(Channel=%d)\n", pAd->CommonCfg.Channel));439439-440440- return success;441441-}442442-443443-/*444444- ==========================================================================445445- Description:446446- Set Short Slot Time Enable or Disable447447- Return:448448- TRUE if all parameters are OK, FALSE otherwise449449- ==========================================================================450450-*/451451-INT Set_ShortSlot_Proc(452452- IN PRTMP_ADAPTER pAd,453453- IN PUCHAR arg)454454-{455455- ULONG ShortSlot;456456-457457- ShortSlot = simple_strtol(arg, 0, 10);458458-459459- if (ShortSlot == 1)460460- pAd->CommonCfg.bUseShortSlotTime = TRUE;461461- else if (ShortSlot == 0)462462- pAd->CommonCfg.bUseShortSlotTime = FALSE;463463- else464464- return FALSE; //Invalid argument465465-466466- DBGPRINT(RT_DEBUG_TRACE, ("Set_ShortSlot_Proc::(ShortSlot=%d)\n", pAd->CommonCfg.bUseShortSlotTime));467467-468468- return TRUE;469469-}470470-471471-/*472472- ==========================================================================473473- Description:474474- Set Tx power475475- Return:476476- TRUE if all parameters are OK, FALSE otherwise477477- ==========================================================================478478-*/479479-INT Set_TxPower_Proc(480480- IN PRTMP_ADAPTER pAd,481481- IN PUCHAR arg)482482-{483483- ULONG TxPower;484484- INT success = FALSE;485485-486486- TxPower = (ULONG) simple_strtol(arg, 0, 10);487487- if (TxPower <= 100)488488- {489489- {490490- pAd->CommonCfg.TxPowerDefault = TxPower;491491- pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault;492492- }493493- success = TRUE;494494- }495495- else496496- success = FALSE;497497-498498- DBGPRINT(RT_DEBUG_TRACE, ("Set_TxPower_Proc::(TxPowerPercentage=%ld)\n", pAd->CommonCfg.TxPowerPercentage));499499-500500- return success;501501-}502502-503503-/*504504- ==========================================================================505505- Description:506506- Set 11B/11G Protection507507- Return:508508- TRUE if all parameters are OK, FALSE otherwise509509- ==========================================================================510510-*/511511-INT Set_BGProtection_Proc(512512- IN PRTMP_ADAPTER pAd,513513- IN PUCHAR arg)514514-{515515- switch (simple_strtol(arg, 0, 10))516516- {517517- case 0: //AUTO518518- pAd->CommonCfg.UseBGProtection = 0;519519- break;520520- case 1: //Always On521521- pAd->CommonCfg.UseBGProtection = 1;522522- break;523523- case 2: //Always OFF524524- pAd->CommonCfg.UseBGProtection = 2;525525- break;526526- default: //Invalid argument527527- return FALSE;528528- }529529-530530-531531- DBGPRINT(RT_DEBUG_TRACE, ("Set_BGProtection_Proc::(BGProtection=%ld)\n", pAd->CommonCfg.UseBGProtection));532532-533533- return TRUE;534534-}535535-536536-/*537537- ==========================================================================538538- Description:539539- Set TxPreamble540540- Return:541541- TRUE if all parameters are OK, FALSE otherwise542542- ==========================================================================543543-*/544544-INT Set_TxPreamble_Proc(545545- IN PRTMP_ADAPTER pAd,546546- IN PUCHAR arg)547547-{548548- RT_802_11_PREAMBLE Preamble;549549-550550- Preamble = simple_strtol(arg, 0, 10);551551-552552-553553- switch (Preamble)554554- {555555- case Rt802_11PreambleShort:556556- pAd->CommonCfg.TxPreamble = Preamble;557557-558558- MlmeSetTxPreamble(pAd, Rt802_11PreambleShort);559559- break;560560- case Rt802_11PreambleLong:561561- case Rt802_11PreambleAuto:562562- // if user wants AUTO, initialize to LONG here, then change according to AP's563563- // capability upon association.564564- pAd->CommonCfg.TxPreamble = Preamble;565565-566566- MlmeSetTxPreamble(pAd, Rt802_11PreambleLong);567567- break;568568- default: //Invalid argument569569- return FALSE;570570- }571571-572572- DBGPRINT(RT_DEBUG_TRACE, ("Set_TxPreamble_Proc::(TxPreamble=%ld)\n", pAd->CommonCfg.TxPreamble));573573-574574- return TRUE;575575-}576576-577577-/*578578- ==========================================================================579579- Description:580580- Set RTS Threshold581581- Return:582582- TRUE if all parameters are OK, FALSE otherwise583583- ==========================================================================584584-*/585585-INT Set_RTSThreshold_Proc(586586- IN PRTMP_ADAPTER pAd,587587- IN PUCHAR arg)588588-{589589- NDIS_802_11_RTS_THRESHOLD RtsThresh;590590-591591- RtsThresh = simple_strtol(arg, 0, 10);592592-593593- if((RtsThresh > 0) && (RtsThresh <= MAX_RTS_THRESHOLD))594594- pAd->CommonCfg.RtsThreshold = (USHORT)RtsThresh;595595- else if (RtsThresh == 0)596596- pAd->CommonCfg.RtsThreshold = MAX_RTS_THRESHOLD;597597- else598598- return FALSE; //Invalid argument599599-600600- DBGPRINT(RT_DEBUG_TRACE, ("Set_RTSThreshold_Proc::(RTSThreshold=%d)\n", pAd->CommonCfg.RtsThreshold));601601-602602- return TRUE;603603-}604604-605605-/*606606- ==========================================================================607607- Description:608608- Set Fragment Threshold609609- Return:610610- TRUE if all parameters are OK, FALSE otherwise611611- ==========================================================================612612-*/613613-INT Set_FragThreshold_Proc(614614- IN PRTMP_ADAPTER pAd,615615- IN PUCHAR arg)616616-{617617- NDIS_802_11_FRAGMENTATION_THRESHOLD FragThresh;618618-619619- FragThresh = simple_strtol(arg, 0, 10);620620-621621- if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD)622622- {623623- //Illegal FragThresh so we set it to default624624- pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD;625625- }626626- else if (FragThresh % 2 == 1)627627- {628628- // The length of each fragment shall always be an even number of octets, except for the last fragment629629- // of an MSDU or MMPDU, which may be either an even or an odd number of octets.630630- pAd->CommonCfg.FragmentThreshold = (USHORT)(FragThresh - 1);631631- }632632- else633633- {634634- pAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh;635635- }636636-637637- {638638- if (pAd->CommonCfg.FragmentThreshold == MAX_FRAG_THRESHOLD)639639- pAd->CommonCfg.bUseZeroToDisableFragment = TRUE;640640- else641641- pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;642642- }643643-644644- DBGPRINT(RT_DEBUG_TRACE, ("Set_FragThreshold_Proc::(FragThreshold=%d)\n", pAd->CommonCfg.FragmentThreshold));645645-646646- return TRUE;647647-}648648-649649-/*650650- ==========================================================================651651- Description:652652- Set TxBurst653653- Return:654654- TRUE if all parameters are OK, FALSE otherwise655655- ==========================================================================656656-*/657657-INT Set_TxBurst_Proc(658658- IN PRTMP_ADAPTER pAd,659659- IN PUCHAR arg)660660-{661661- ULONG TxBurst;662662-663663- TxBurst = simple_strtol(arg, 0, 10);664664- if (TxBurst == 1)665665- pAd->CommonCfg.bEnableTxBurst = TRUE;666666- else if (TxBurst == 0)667667- pAd->CommonCfg.bEnableTxBurst = FALSE;668668- else669669- return FALSE; //Invalid argument670670-671671- DBGPRINT(RT_DEBUG_TRACE, ("Set_TxBurst_Proc::(TxBurst=%d)\n", pAd->CommonCfg.bEnableTxBurst));672672-673673- return TRUE;674674-}675675-676676-#ifdef AGGREGATION_SUPPORT677677-/*678678- ==========================================================================679679- Description:680680- Set TxBurst681681- Return:682682- TRUE if all parameters are OK, FALSE otherwise683683- ==========================================================================684684-*/685685-INT Set_PktAggregate_Proc(686686- IN PRTMP_ADAPTER pAd,687687- IN PUCHAR arg)688688-{689689- ULONG aggre;690690-691691- aggre = simple_strtol(arg, 0, 10);692692-693693- if (aggre == 1)694694- pAd->CommonCfg.bAggregationCapable = TRUE;695695- else if (aggre == 0)696696- pAd->CommonCfg.bAggregationCapable = FALSE;697697- else698698- return FALSE; //Invalid argument699699-700700-701701- DBGPRINT(RT_DEBUG_TRACE, ("Set_PktAggregate_Proc::(AGGRE=%d)\n", pAd->CommonCfg.bAggregationCapable));702702-703703- return TRUE;704704-}705705-#endif706706-707707-/*708708- ==========================================================================709709- Description:710710- Set IEEE80211H.711711- This parameter is 1 when needs radar detection, otherwise 0712712- Return:713713- TRUE if all parameters are OK, FALSE otherwise714714- ==========================================================================715715-*/716716-INT Set_IEEE80211H_Proc(717717- IN PRTMP_ADAPTER pAd,718718- IN PUCHAR arg)719719-{720720- ULONG ieee80211h;721721-722722- ieee80211h = simple_strtol(arg, 0, 10);723723-724724- if (ieee80211h == 1)725725- pAd->CommonCfg.bIEEE80211H = TRUE;726726- else if (ieee80211h == 0)727727- pAd->CommonCfg.bIEEE80211H = FALSE;728728- else729729- return FALSE; //Invalid argument730730-731731- DBGPRINT(RT_DEBUG_TRACE, ("Set_IEEE80211H_Proc::(IEEE80211H=%d)\n", pAd->CommonCfg.bIEEE80211H));732732-733733- return TRUE;734734-}735735-736736-737737-#ifdef DBG738738-/*739739- ==========================================================================740740- Description:741741- For Debug information742742- Return:743743- TRUE if all parameters are OK, FALSE otherwise744744- ==========================================================================745745-*/746746-INT Set_Debug_Proc(747747- IN PRTMP_ADAPTER pAd,748748- IN PUCHAR arg)749749-{750750- DBGPRINT(RT_DEBUG_TRACE, ("==> Set_Debug_Proc *******************\n"));751751-752752- if(simple_strtol(arg, 0, 10) <= RT_DEBUG_LOUD)753753- RTDebugLevel = simple_strtol(arg, 0, 10);754754-755755- DBGPRINT(RT_DEBUG_TRACE, ("<== Set_Debug_Proc(RTDebugLevel = %ld)\n", RTDebugLevel));756756-757757- return TRUE;758758-}759759-#endif760760-761761-INT Show_DescInfo_Proc(762762- IN PRTMP_ADAPTER pAd,763763- IN PUCHAR arg)764764-{765765-766766- return TRUE;767767-}768768-769769-/*770770- ==========================================================================771771- Description:772772- Reset statistics counter773773-774774- Arguments:775775- pAdapter Pointer to our adapter776776- arg777777-778778- Return:779779- TRUE if all parameters are OK, FALSE otherwise780780- ==========================================================================781781-*/782782-INT Set_ResetStatCounter_Proc(783783- IN PRTMP_ADAPTER pAd,784784- IN PUCHAR arg)785785-{786786- DBGPRINT(RT_DEBUG_TRACE, ("==>Set_ResetStatCounter_Proc\n"));787787-788788- // add the most up-to-date h/w raw counters into software counters789789- NICUpdateRawCounters(pAd);790790-791791- NdisZeroMemory(&pAd->WlanCounters, sizeof(COUNTER_802_11));792792- NdisZeroMemory(&pAd->Counters8023, sizeof(COUNTER_802_3));793793- NdisZeroMemory(&pAd->RalinkCounters, sizeof(COUNTER_RALINK));794794-795795- return TRUE;796796-}797797-798798-BOOLEAN RTMPCheckStrPrintAble(799799- IN CHAR *pInPutStr,800800- IN UCHAR strLen)801801-{802802- UCHAR i=0;803803-804804- for (i=0; i<strLen; i++)805805- {806806- if ((pInPutStr[i] < 0x21) ||807807- (pInPutStr[i] > 0x7E))808808- return FALSE;809809- }810810-811811- return TRUE;812812-}813813-814814-/*815815- ========================================================================816816-817817- Routine Description:818818- Remove WPA Key process819819-820820- Arguments:821821- pAd Pointer to our adapter822822- pBuf Pointer to the where the key stored823823-824824- Return Value:825825- NDIS_SUCCESS Add key successfully826826-827827- IRQL = DISPATCH_LEVEL828828-829829- Note:830830-831831- ========================================================================832832-*/833833-VOID RTMPSetDesiredRates(834834- IN PRTMP_ADAPTER pAdapter,835835- IN LONG Rates)836836-{837837- NDIS_802_11_RATES aryRates;838838-839839- memset(&aryRates, 0x00, sizeof(NDIS_802_11_RATES));840840- switch (pAdapter->CommonCfg.PhyMode)841841- {842842- case PHY_11A: // A only843843- switch (Rates)844844- {845845- case 6000000: //6M846846- aryRates[0] = 0x0c; // 6M847847- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_0;848848- break;849849- case 9000000: //9M850850- aryRates[0] = 0x12; // 9M851851- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_1;852852- break;853853- case 12000000: //12M854854- aryRates[0] = 0x18; // 12M855855- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_2;856856- break;857857- case 18000000: //18M858858- aryRates[0] = 0x24; // 18M859859- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_3;860860- break;861861- case 24000000: //24M862862- aryRates[0] = 0x30; // 24M863863- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_4;864864- break;865865- case 36000000: //36M866866- aryRates[0] = 0x48; // 36M867867- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_5;868868- break;869869- case 48000000: //48M870870- aryRates[0] = 0x60; // 48M871871- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_6;872872- break;873873- case 54000000: //54M874874- aryRates[0] = 0x6c; // 54M875875- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_7;876876- break;877877- case -1: //Auto878878- default:879879- aryRates[0] = 0x6c; // 54Mbps880880- aryRates[1] = 0x60; // 48Mbps881881- aryRates[2] = 0x48; // 36Mbps882882- aryRates[3] = 0x30; // 24Mbps883883- aryRates[4] = 0x24; // 18M884884- aryRates[5] = 0x18; // 12M885885- aryRates[6] = 0x12; // 9M886886- aryRates[7] = 0x0c; // 6M887887- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;888888- break;889889- }890890- break;891891- case PHY_11BG_MIXED: // B/G Mixed892892- case PHY_11B: // B only893893- case PHY_11ABG_MIXED: // A/B/G Mixed894894- default:895895- switch (Rates)896896- {897897- case 1000000: //1M898898- aryRates[0] = 0x02;899899- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_0;900900- break;901901- case 2000000: //2M902902- aryRates[0] = 0x04;903903- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_1;904904- break;905905- case 5000000: //5.5M906906- aryRates[0] = 0x0b; // 5.5M907907- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_2;908908- break;909909- case 11000000: //11M910910- aryRates[0] = 0x16; // 11M911911- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_3;912912- break;913913- case 6000000: //6M914914- aryRates[0] = 0x0c; // 6M915915- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_0;916916- break;917917- case 9000000: //9M918918- aryRates[0] = 0x12; // 9M919919- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_1;920920- break;921921- case 12000000: //12M922922- aryRates[0] = 0x18; // 12M923923- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_2;924924- break;925925- case 18000000: //18M926926- aryRates[0] = 0x24; // 18M927927- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_3;928928- break;929929- case 24000000: //24M930930- aryRates[0] = 0x30; // 24M931931- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_4;932932- break;933933- case 36000000: //36M934934- aryRates[0] = 0x48; // 36M935935- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_5;936936- break;937937- case 48000000: //48M938938- aryRates[0] = 0x60; // 48M939939- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_6;940940- break;941941- case 54000000: //54M942942- aryRates[0] = 0x6c; // 54M943943- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_7;944944- break;945945- case -1: //Auto946946- default:947947- if (pAdapter->CommonCfg.PhyMode == PHY_11B)948948- { //B Only949949- aryRates[0] = 0x16; // 11Mbps950950- aryRates[1] = 0x0b; // 5.5Mbps951951- aryRates[2] = 0x04; // 2Mbps952952- aryRates[3] = 0x02; // 1Mbps953953- }954954- else955955- { //(B/G) Mixed or (A/B/G) Mixed956956- aryRates[0] = 0x6c; // 54Mbps957957- aryRates[1] = 0x60; // 48Mbps958958- aryRates[2] = 0x48; // 36Mbps959959- aryRates[3] = 0x30; // 24Mbps960960- aryRates[4] = 0x16; // 11Mbps961961- aryRates[5] = 0x0b; // 5.5Mbps962962- aryRates[6] = 0x04; // 2Mbps963963- aryRates[7] = 0x02; // 1Mbps964964- }965965- pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;966966- break;967967- }968968- break;969969- }970970-971971- NdisZeroMemory(pAdapter->CommonCfg.DesireRate, MAX_LEN_OF_SUPPORTED_RATES);972972- NdisMoveMemory(pAdapter->CommonCfg.DesireRate, &aryRates, sizeof(NDIS_802_11_RATES));973973- DBGPRINT(RT_DEBUG_TRACE, (" RTMPSetDesiredRates (%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x)\n",974974- pAdapter->CommonCfg.DesireRate[0],pAdapter->CommonCfg.DesireRate[1],975975- pAdapter->CommonCfg.DesireRate[2],pAdapter->CommonCfg.DesireRate[3],976976- pAdapter->CommonCfg.DesireRate[4],pAdapter->CommonCfg.DesireRate[5],977977- pAdapter->CommonCfg.DesireRate[6],pAdapter->CommonCfg.DesireRate[7] ));978978- // Changing DesiredRate may affect the MAX TX rate we used to TX frames out979979- MlmeUpdateTxRates(pAdapter, FALSE, 0);980980-}981981-982982-NDIS_STATUS RTMPWPARemoveKeyProc(983983- IN PRTMP_ADAPTER pAd,984984- IN PVOID pBuf)985985-{986986- PNDIS_802_11_REMOVE_KEY pKey;987987- ULONG KeyIdx;988988- NDIS_STATUS Status = NDIS_STATUS_FAILURE;989989- BOOLEAN bTxKey; // Set the key as transmit key990990- BOOLEAN bPairwise; // Indicate the key is pairwise key991991- BOOLEAN bKeyRSC; // indicate the receive SC set by KeyRSC value.992992- // Otherwise, it will set by the NIC.993993- BOOLEAN bAuthenticator; // indicate key is set by authenticator.994994- INT i;995995-996996- DBGPRINT(RT_DEBUG_TRACE,("---> RTMPWPARemoveKeyProc\n"));997997-998998- pKey = (PNDIS_802_11_REMOVE_KEY) pBuf;999999- KeyIdx = pKey->KeyIndex & 0xff;10001000- // Bit 31 of Add-key, Tx Key10011001- bTxKey = (pKey->KeyIndex & 0x80000000) ? TRUE : FALSE;10021002- // Bit 30 of Add-key PairwiseKey10031003- bPairwise = (pKey->KeyIndex & 0x40000000) ? TRUE : FALSE;10041004- // Bit 29 of Add-key KeyRSC10051005- bKeyRSC = (pKey->KeyIndex & 0x20000000) ? TRUE : FALSE;10061006- // Bit 28 of Add-key Authenticator10071007- bAuthenticator = (pKey->KeyIndex & 0x10000000) ? TRUE : FALSE;10081008-10091009- // 1. If bTx is TRUE, return failure information10101010- if (bTxKey == TRUE)10111011- return(NDIS_STATUS_INVALID_DATA);10121012-10131013- // 2. Check Pairwise Key10141014- if (bPairwise)10151015- {10161016- // a. If BSSID is broadcast, remove all pairwise keys.10171017- // b. If not broadcast, remove the pairwise specified by BSSID10181018- for (i = 0; i < SHARE_KEY_NUM; i++)10191019- {10201020- if (MAC_ADDR_EQUAL(pAd->SharedKey[BSS0][i].BssId, pKey->BSSID))10211021- {10221022- DBGPRINT(RT_DEBUG_TRACE,("RTMPWPARemoveKeyProc(KeyIdx=%d)\n", i));10231023- pAd->SharedKey[BSS0][i].KeyLen = 0;10241024- pAd->SharedKey[BSS0][i].CipherAlg = CIPHER_NONE;10251025- AsicRemoveSharedKeyEntry(pAd, BSS0, (UCHAR)i);10261026- Status = NDIS_STATUS_SUCCESS;10271027- break;10281028- }10291029- }10301030- }10311031- // 3. Group Key10321032- else10331033- {10341034- // a. If BSSID is broadcast, remove all group keys indexed10351035- // b. If BSSID matched, delete the group key indexed.10361036- DBGPRINT(RT_DEBUG_TRACE,("RTMPWPARemoveKeyProc(KeyIdx=%ld)\n", KeyIdx));10371037- pAd->SharedKey[BSS0][KeyIdx].KeyLen = 0;10381038- pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CIPHER_NONE;10391039- AsicRemoveSharedKeyEntry(pAd, BSS0, (UCHAR)KeyIdx);10401040- Status = NDIS_STATUS_SUCCESS;10411041- }10421042-10431043- return (Status);10441044-}10451045-10461046-/*10471047- ========================================================================10481048-10491049- Routine Description:10501050- Remove All WPA Keys10511051-10521052- Arguments:10531053- pAd Pointer to our adapter10541054-10551055- Return Value:10561056- None10571057-10581058- IRQL = DISPATCH_LEVEL10591059-10601060- Note:10611061-10621062- ========================================================================10631063-*/10641064-VOID RTMPWPARemoveAllKeys(10651065- IN PRTMP_ADAPTER pAd)10661066-{10671067-10681068- UCHAR i;10691069-10701070- DBGPRINT(RT_DEBUG_TRACE,("RTMPWPARemoveAllKeys(AuthMode=%d, WepStatus=%d)\n", pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus));10711071-10721072- // For WEP/CKIP, there is no need to remove it, since WinXP won't set it again after10731073- // Link up. And it will be replaced if user changed it.10741074- if (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA)10751075- return;10761076-10771077- // For WPA-None, there is no need to remove it, since WinXP won't set it again after10781078- // Link up. And it will be replaced if user changed it.10791079- if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)10801080- return;10811081-10821082- // set BSSID wcid entry of the Pair-wise Key table as no-security mode10831083- AsicRemovePairwiseKeyEntry(pAd, BSS0, BSSID_WCID);10841084-10851085- // set all shared key mode as no-security.10861086- for (i = 0; i < SHARE_KEY_NUM; i++)10871087- {10881088- DBGPRINT(RT_DEBUG_TRACE,("remove %s key #%d\n", CipherName[pAd->SharedKey[BSS0][i].CipherAlg], i));10891089- NdisZeroMemory(&pAd->SharedKey[BSS0][i], sizeof(CIPHER_KEY));10901090-10911091- AsicRemoveSharedKeyEntry(pAd, BSS0, i);10921092- }10931093-10941094-}10951095-10961096-/*10971097- ========================================================================10981098- Routine Description:10991099- Change NIC PHY mode. Re-association may be necessary. possible settings11001100- include - PHY_11B, PHY_11BG_MIXED, PHY_11A, and PHY_11ABG_MIXED11011101-11021102- Arguments:11031103- pAd - Pointer to our adapter11041104- phymode -11051105-11061106- IRQL = PASSIVE_LEVEL11071107- IRQL = DISPATCH_LEVEL11081108-11091109- ========================================================================11101110-*/11111111-VOID RTMPSetPhyMode(11121112- IN PRTMP_ADAPTER pAd,11131113- IN ULONG phymode)11141114-{11151115- INT i;11161116- // the selected phymode must be supported by the RF IC encoded in E2PROM11171117-11181118- pAd->CommonCfg.PhyMode = (UCHAR)phymode;11191119-11201120- DBGPRINT(RT_DEBUG_TRACE,("RTMPSetPhyMode : PhyMode=%d, channel=%d \n", pAd->CommonCfg.PhyMode, pAd->CommonCfg.Channel));11211121-11221122- BuildChannelList(pAd);11231123-11241124- // sanity check user setting11251125- for (i = 0; i < pAd->ChannelListNum; i++)11261126- {11271127- if (pAd->CommonCfg.Channel == pAd->ChannelList[i].Channel)11281128- break;11291129- }11301130-11311131- if (i == pAd->ChannelListNum)11321132- {11331133- pAd->CommonCfg.Channel = FirstChannel(pAd);11341134- DBGPRINT(RT_DEBUG_ERROR, ("RTMPSetPhyMode: channel is out of range, use first channel=%d \n", pAd->CommonCfg.Channel));11351135- }11361136-11371137- NdisZeroMemory(pAd->CommonCfg.SupRate, MAX_LEN_OF_SUPPORTED_RATES);11381138- NdisZeroMemory(pAd->CommonCfg.ExtRate, MAX_LEN_OF_SUPPORTED_RATES);11391139- NdisZeroMemory(pAd->CommonCfg.DesireRate, MAX_LEN_OF_SUPPORTED_RATES);11401140- switch (phymode) {11411141- case PHY_11B:11421142- pAd->CommonCfg.SupRate[0] = 0x82; // 1 mbps, in units of 0.5 Mbps, basic rate11431143- pAd->CommonCfg.SupRate[1] = 0x84; // 2 mbps, in units of 0.5 Mbps, basic rate11441144- pAd->CommonCfg.SupRate[2] = 0x8B; // 5.5 mbps, in units of 0.5 Mbps, basic rate11451145- pAd->CommonCfg.SupRate[3] = 0x96; // 11 mbps, in units of 0.5 Mbps, basic rate11461146- pAd->CommonCfg.SupRateLen = 4;11471147- pAd->CommonCfg.ExtRateLen = 0;11481148- pAd->CommonCfg.DesireRate[0] = 2; // 1 mbps, in units of 0.5 Mbps11491149- pAd->CommonCfg.DesireRate[1] = 4; // 2 mbps, in units of 0.5 Mbps11501150- pAd->CommonCfg.DesireRate[2] = 11; // 5.5 mbps, in units of 0.5 Mbps11511151- pAd->CommonCfg.DesireRate[3] = 22; // 11 mbps, in units of 0.5 Mbps11521152- //pAd->CommonCfg.HTPhyMode.field.MODE = MODE_CCK; // This MODE is only FYI. not use11531153- break;11541154-11551155- case PHY_11G:11561156- case PHY_11BG_MIXED:11571157- case PHY_11ABG_MIXED:11581158- case PHY_11N_2_4G:11591159- case PHY_11ABGN_MIXED:11601160- case PHY_11BGN_MIXED:11611161- case PHY_11GN_MIXED:11621162- pAd->CommonCfg.SupRate[0] = 0x82; // 1 mbps, in units of 0.5 Mbps, basic rate11631163- pAd->CommonCfg.SupRate[1] = 0x84; // 2 mbps, in units of 0.5 Mbps, basic rate11641164- pAd->CommonCfg.SupRate[2] = 0x8B; // 5.5 mbps, in units of 0.5 Mbps, basic rate11651165- pAd->CommonCfg.SupRate[3] = 0x96; // 11 mbps, in units of 0.5 Mbps, basic rate11661166- pAd->CommonCfg.SupRate[4] = 0x12; // 9 mbps, in units of 0.5 Mbps11671167- pAd->CommonCfg.SupRate[5] = 0x24; // 18 mbps, in units of 0.5 Mbps11681168- pAd->CommonCfg.SupRate[6] = 0x48; // 36 mbps, in units of 0.5 Mbps11691169- pAd->CommonCfg.SupRate[7] = 0x6c; // 54 mbps, in units of 0.5 Mbps11701170- pAd->CommonCfg.SupRateLen = 8;11711171- pAd->CommonCfg.ExtRate[0] = 0x0C; // 6 mbps, in units of 0.5 Mbps11721172- pAd->CommonCfg.ExtRate[1] = 0x18; // 12 mbps, in units of 0.5 Mbps11731173- pAd->CommonCfg.ExtRate[2] = 0x30; // 24 mbps, in units of 0.5 Mbps11741174- pAd->CommonCfg.ExtRate[3] = 0x60; // 48 mbps, in units of 0.5 Mbps11751175- pAd->CommonCfg.ExtRateLen = 4;11761176- pAd->CommonCfg.DesireRate[0] = 2; // 1 mbps, in units of 0.5 Mbps11771177- pAd->CommonCfg.DesireRate[1] = 4; // 2 mbps, in units of 0.5 Mbps11781178- pAd->CommonCfg.DesireRate[2] = 11; // 5.5 mbps, in units of 0.5 Mbps11791179- pAd->CommonCfg.DesireRate[3] = 22; // 11 mbps, in units of 0.5 Mbps11801180- pAd->CommonCfg.DesireRate[4] = 12; // 6 mbps, in units of 0.5 Mbps11811181- pAd->CommonCfg.DesireRate[5] = 18; // 9 mbps, in units of 0.5 Mbps11821182- pAd->CommonCfg.DesireRate[6] = 24; // 12 mbps, in units of 0.5 Mbps11831183- pAd->CommonCfg.DesireRate[7] = 36; // 18 mbps, in units of 0.5 Mbps11841184- pAd->CommonCfg.DesireRate[8] = 48; // 24 mbps, in units of 0.5 Mbps11851185- pAd->CommonCfg.DesireRate[9] = 72; // 36 mbps, in units of 0.5 Mbps11861186- pAd->CommonCfg.DesireRate[10] = 96; // 48 mbps, in units of 0.5 Mbps11871187- pAd->CommonCfg.DesireRate[11] = 108; // 54 mbps, in units of 0.5 Mbps11881188- break;11891189-11901190- case PHY_11A:11911191- case PHY_11AN_MIXED:11921192- case PHY_11AGN_MIXED:11931193- case PHY_11N_5G:11941194- pAd->CommonCfg.SupRate[0] = 0x8C; // 6 mbps, in units of 0.5 Mbps, basic rate11951195- pAd->CommonCfg.SupRate[1] = 0x12; // 9 mbps, in units of 0.5 Mbps11961196- pAd->CommonCfg.SupRate[2] = 0x98; // 12 mbps, in units of 0.5 Mbps, basic rate11971197- pAd->CommonCfg.SupRate[3] = 0x24; // 18 mbps, in units of 0.5 Mbps11981198- pAd->CommonCfg.SupRate[4] = 0xb0; // 24 mbps, in units of 0.5 Mbps, basic rate11991199- pAd->CommonCfg.SupRate[5] = 0x48; // 36 mbps, in units of 0.5 Mbps12001200- pAd->CommonCfg.SupRate[6] = 0x60; // 48 mbps, in units of 0.5 Mbps12011201- pAd->CommonCfg.SupRate[7] = 0x6c; // 54 mbps, in units of 0.5 Mbps12021202- pAd->CommonCfg.SupRateLen = 8;12031203- pAd->CommonCfg.ExtRateLen = 0;12041204- pAd->CommonCfg.DesireRate[0] = 12; // 6 mbps, in units of 0.5 Mbps12051205- pAd->CommonCfg.DesireRate[1] = 18; // 9 mbps, in units of 0.5 Mbps12061206- pAd->CommonCfg.DesireRate[2] = 24; // 12 mbps, in units of 0.5 Mbps12071207- pAd->CommonCfg.DesireRate[3] = 36; // 18 mbps, in units of 0.5 Mbps12081208- pAd->CommonCfg.DesireRate[4] = 48; // 24 mbps, in units of 0.5 Mbps12091209- pAd->CommonCfg.DesireRate[5] = 72; // 36 mbps, in units of 0.5 Mbps12101210- pAd->CommonCfg.DesireRate[6] = 96; // 48 mbps, in units of 0.5 Mbps12111211- pAd->CommonCfg.DesireRate[7] = 108; // 54 mbps, in units of 0.5 Mbps12121212- //pAd->CommonCfg.HTPhyMode.field.MODE = MODE_OFDM; // This MODE is only FYI. not use12131213- break;12141214-12151215- default:12161216- break;12171217- }12181218-12191219-12201220- pAd->CommonCfg.BandState = UNKNOWN_BAND;12211221-}12221222-12231223-/*12241224- ========================================================================12251225- Routine Description:12261226- Caller ensures we has 802.11n support.12271227- Calls at setting HT from AP/STASetinformation12281228-12291229- Arguments:12301230- pAd - Pointer to our adapter12311231- phymode -12321232-12331233- ========================================================================12341234-*/12351235-VOID RTMPSetHT(12361236- IN PRTMP_ADAPTER pAd,12371237- IN OID_SET_HT_PHYMODE *pHTPhyMode)12381238-{12391239- //ULONG *pmcs;12401240- UINT32 Value = 0;12411241- UCHAR BBPValue = 0;12421242- UCHAR BBP3Value = 0;12431243- UCHAR RxStream = pAd->CommonCfg.RxStream;12441244-12451245- DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetHT : HT_mode(%d), ExtOffset(%d), MCS(%d), BW(%d), STBC(%d), SHORTGI(%d)\n",12461246- pHTPhyMode->HtMode, pHTPhyMode->ExtOffset,12471247- pHTPhyMode->MCS, pHTPhyMode->BW,12481248- pHTPhyMode->STBC, pHTPhyMode->SHORTGI));12491249-12501250- // Don't zero supportedHyPhy structure.12511251- RTMPZeroMemory(&pAd->CommonCfg.HtCapability, sizeof(pAd->CommonCfg.HtCapability));12521252- RTMPZeroMemory(&pAd->CommonCfg.AddHTInfo, sizeof(pAd->CommonCfg.AddHTInfo));12531253- RTMPZeroMemory(&pAd->CommonCfg.NewExtChanOffset, sizeof(pAd->CommonCfg.NewExtChanOffset));12541254- RTMPZeroMemory(&pAd->CommonCfg.DesiredHtPhy, sizeof(pAd->CommonCfg.DesiredHtPhy));12551255-12561256- if (pAd->CommonCfg.bRdg)12571257- {12581258- pAd->CommonCfg.HtCapability.ExtHtCapInfo.PlusHTC = 1;12591259- pAd->CommonCfg.HtCapability.ExtHtCapInfo.RDGSupport = 1;12601260- }12611261- else12621262- {12631263- pAd->CommonCfg.HtCapability.ExtHtCapInfo.PlusHTC = 0;12641264- pAd->CommonCfg.HtCapability.ExtHtCapInfo.RDGSupport = 0;12651265- }12661266-12671267- pAd->CommonCfg.HtCapability.HtCapParm.MaxRAmpduFactor = 3;12681268- pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor = 3;12691269-12701270- DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetHT : RxBAWinLimit = %d\n", pAd->CommonCfg.BACapability.field.RxBAWinLimit));12711271-12721272- // Mimo power save, A-MSDU size,12731273- pAd->CommonCfg.DesiredHtPhy.AmsduEnable = (USHORT)pAd->CommonCfg.BACapability.field.AmsduEnable;12741274- pAd->CommonCfg.DesiredHtPhy.AmsduSize = (UCHAR)pAd->CommonCfg.BACapability.field.AmsduSize;12751275- pAd->CommonCfg.DesiredHtPhy.MimoPs = (UCHAR)pAd->CommonCfg.BACapability.field.MMPSmode;12761276- pAd->CommonCfg.DesiredHtPhy.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity;12771277-12781278- pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize = (USHORT)pAd->CommonCfg.BACapability.field.AmsduSize;12791279- pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs = (USHORT)pAd->CommonCfg.BACapability.field.MMPSmode;12801280- pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity;12811281-12821282- DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetHT : AMsduSize = %d, MimoPs = %d, MpduDensity = %d, MaxRAmpduFactor = %d\n",12831283- pAd->CommonCfg.DesiredHtPhy.AmsduSize,12841284- pAd->CommonCfg.DesiredHtPhy.MimoPs,12851285- pAd->CommonCfg.DesiredHtPhy.MpduDensity,12861286- pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor));12871287-12881288- if(pHTPhyMode->HtMode == HTMODE_GF)12891289- {12901290- pAd->CommonCfg.HtCapability.HtCapInfo.GF = 1;12911291- pAd->CommonCfg.DesiredHtPhy.GF = 1;12921292- }12931293- else12941294- pAd->CommonCfg.DesiredHtPhy.GF = 0;12951295-12961296- // Decide Rx MCSSet12971297- switch (RxStream)12981298- {12991299- case 1:13001300- pAd->CommonCfg.HtCapability.MCSSet[0] = 0xff;13011301- pAd->CommonCfg.HtCapability.MCSSet[1] = 0x00;13021302- break;13031303-13041304- case 2:13051305- pAd->CommonCfg.HtCapability.MCSSet[0] = 0xff;13061306- pAd->CommonCfg.HtCapability.MCSSet[1] = 0xff;13071307- break;13081308-13091309- case 3: // 3*313101310- pAd->CommonCfg.HtCapability.MCSSet[0] = 0xff;13111311- pAd->CommonCfg.HtCapability.MCSSet[1] = 0xff;13121312- pAd->CommonCfg.HtCapability.MCSSet[2] = 0xff;13131313- break;13141314- }13151315-13161316- if (pAd->CommonCfg.bForty_Mhz_Intolerant && (pAd->CommonCfg.Channel <= 14) && (pHTPhyMode->BW == BW_40) )13171317- {13181318- pHTPhyMode->BW = BW_20;13191319- pAd->CommonCfg.HtCapability.HtCapInfo.Forty_Mhz_Intolerant = 1;13201320- }13211321-13221322- if(pHTPhyMode->BW == BW_40)13231323- {13241324- pAd->CommonCfg.HtCapability.MCSSet[4] = 0x1; // MCS 3213251325- pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth = 1;13261326- if (pAd->CommonCfg.Channel <= 14)13271327- pAd->CommonCfg.HtCapability.HtCapInfo.CCKmodein40 = 1;13281328-13291329- pAd->CommonCfg.DesiredHtPhy.ChannelWidth = 1;13301330- pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 1;13311331- pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = (pHTPhyMode->ExtOffset == EXTCHA_BELOW)? (EXTCHA_BELOW): EXTCHA_ABOVE;13321332- // Set Regsiter for extension channel position.13331333- RTMP_IO_READ32(pAd, TX_BAND_CFG, &Value);13341334- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBP3Value);13351335- if ((pHTPhyMode->ExtOffset == EXTCHA_BELOW))13361336- {13371337- Value |= 0x1;13381338- BBP3Value |= (0x20);13391339- RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value);13401340- }13411341- else if ((pHTPhyMode->ExtOffset == EXTCHA_ABOVE))13421342- {13431343- Value &= 0xfe;13441344- BBP3Value &= (~0x20);13451345- RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value);13461346- }13471347-13481348- // Turn on BBP 40MHz mode now only as AP .13491349- // Sta can turn on BBP 40MHz after connection with 40MHz AP. Sta only broadcast 40MHz capability before connection.13501350- if ((pAd->OpMode == OPMODE_AP) || INFRA_ON(pAd) || ADHOC_ON(pAd)13511351- )13521352- {13531353- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);13541354- BBPValue &= (~0x18);13551355- BBPValue |= 0x10;13561356- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);13571357-13581358- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBP3Value);13591359- pAd->CommonCfg.BBPCurrentBW = BW_40;13601360- }13611361- }13621362- else13631363- {13641364- pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth = 0;13651365- pAd->CommonCfg.DesiredHtPhy.ChannelWidth = 0;13661366- pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 0;13671367- pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = EXTCHA_NONE;13681368- pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;13691369- // Turn on BBP 20MHz mode by request here.13701370- {13711371- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);13721372- BBPValue &= (~0x18);13731373- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);13741374- pAd->CommonCfg.BBPCurrentBW = BW_20;13751375- }13761376- }13771377-13781378- if(pHTPhyMode->STBC == STBC_USE)13791379- {13801380- pAd->CommonCfg.HtCapability.HtCapInfo.TxSTBC = 1;13811381- pAd->CommonCfg.DesiredHtPhy.TxSTBC = 1;13821382- pAd->CommonCfg.HtCapability.HtCapInfo.RxSTBC = 1;13831383- pAd->CommonCfg.DesiredHtPhy.RxSTBC = 1;13841384- }13851385- else13861386- {13871387- pAd->CommonCfg.DesiredHtPhy.TxSTBC = 0;13881388- pAd->CommonCfg.DesiredHtPhy.RxSTBC = 0;13891389- }13901390-13911391-#ifndef RT30xx13921392-#ifdef RT287013931393- /* Frank recommend ,If not, Tx maybe block in high power. Rx has no problem*/13941394- if(IS_RT3070(pAd) && ((pAd->RfIcType == RFIC_3020) || (pAd->RfIcType == RFIC_2020)))13951395- {13961396- pAd->CommonCfg.HtCapability.HtCapInfo.TxSTBC = 0;13971397- pAd->CommonCfg.DesiredHtPhy.TxSTBC = 0;13981398- }13991399-#endif // RT2870 //14001400-#endif14011401-14021402- if(pHTPhyMode->SHORTGI == GI_400)14031403- {14041404- pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor20 = 1;14051405- pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor40 = 1;14061406- pAd->CommonCfg.DesiredHtPhy.ShortGIfor20 = 1;14071407- pAd->CommonCfg.DesiredHtPhy.ShortGIfor40 = 1;14081408- }14091409- else14101410- {14111411- pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor20 = 0;14121412- pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor40 = 0;14131413- pAd->CommonCfg.DesiredHtPhy.ShortGIfor20 = 0;14141414- pAd->CommonCfg.DesiredHtPhy.ShortGIfor40 = 0;14151415- }14161416-14171417- // We support link adaptation for unsolicit MCS feedback, set to 2.14181418- pAd->CommonCfg.HtCapability.ExtHtCapInfo.MCSFeedback = MCSFBK_NONE; //MCSFBK_UNSOLICIT;14191419- pAd->CommonCfg.AddHTInfo.ControlChan = pAd->CommonCfg.Channel;14201420- // 1, the extension channel above the control channel.14211421-14221422- // EDCA parameters used for AP's own transmission14231423- if (pAd->CommonCfg.APEdcaParm.bValid == FALSE)14241424- {14251425- pAd->CommonCfg.APEdcaParm.bValid = TRUE;14261426- pAd->CommonCfg.APEdcaParm.Aifsn[0] = 3;14271427- pAd->CommonCfg.APEdcaParm.Aifsn[1] = 7;14281428- pAd->CommonCfg.APEdcaParm.Aifsn[2] = 1;14291429- pAd->CommonCfg.APEdcaParm.Aifsn[3] = 1;14301430-14311431- pAd->CommonCfg.APEdcaParm.Cwmin[0] = 4;14321432- pAd->CommonCfg.APEdcaParm.Cwmin[1] = 4;14331433- pAd->CommonCfg.APEdcaParm.Cwmin[2] = 3;14341434- pAd->CommonCfg.APEdcaParm.Cwmin[3] = 2;14351435-14361436- pAd->CommonCfg.APEdcaParm.Cwmax[0] = 6;14371437- pAd->CommonCfg.APEdcaParm.Cwmax[1] = 10;14381438- pAd->CommonCfg.APEdcaParm.Cwmax[2] = 4;14391439- pAd->CommonCfg.APEdcaParm.Cwmax[3] = 3;14401440-14411441- pAd->CommonCfg.APEdcaParm.Txop[0] = 0;14421442- pAd->CommonCfg.APEdcaParm.Txop[1] = 0;14431443- pAd->CommonCfg.APEdcaParm.Txop[2] = 94;14441444- pAd->CommonCfg.APEdcaParm.Txop[3] = 47;14451445- }14461446- AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);14471447-14481448- RTMPSetIndividualHT(pAd, 0);14491449-}14501450-14511451-/*14521452- ========================================================================14531453- Routine Description:14541454- Caller ensures we has 802.11n support.14551455- Calls at setting HT from AP/STASetinformation14561456-14571457- Arguments:14581458- pAd - Pointer to our adapter14591459- phymode -14601460-14611461- ========================================================================14621462-*/14631463-VOID RTMPSetIndividualHT(14641464- IN PRTMP_ADAPTER pAd,14651465- IN UCHAR apidx)14661466-{14671467- PRT_HT_PHY_INFO pDesired_ht_phy = NULL;14681468- UCHAR TxStream = pAd->CommonCfg.TxStream;14691469- UCHAR DesiredMcs = MCS_AUTO;14701470-14711471- do14721472- {14731473- {14741474- pDesired_ht_phy = &pAd->StaCfg.DesiredHtPhyInfo;14751475- DesiredMcs = pAd->StaCfg.DesiredTransmitSetting.field.MCS;14761476- //pAd->StaCfg.bAutoTxRateSwitch = (DesiredMcs == MCS_AUTO) ? TRUE : FALSE;14771477- break;14781478- }14791479- } while (FALSE);14801480-14811481- if (pDesired_ht_phy == NULL)14821482- {14831483- DBGPRINT(RT_DEBUG_ERROR, ("RTMPSetIndividualHT: invalid apidx(%d)\n", apidx));14841484- return;14851485- }14861486- RTMPZeroMemory(pDesired_ht_phy, sizeof(RT_HT_PHY_INFO));14871487-14881488- DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetIndividualHT : Desired MCS = %d\n", DesiredMcs));14891489- // Check the validity of MCS14901490- if ((TxStream == 1) && ((DesiredMcs >= MCS_8) && (DesiredMcs <= MCS_15)))14911491- {14921492- DBGPRINT(RT_DEBUG_WARN, ("RTMPSetIndividualHT: MCS(%d) is invalid in 1S, reset it as MCS_7\n", DesiredMcs));14931493- DesiredMcs = MCS_7;14941494- }14951495-14961496- if ((pAd->CommonCfg.DesiredHtPhy.ChannelWidth == BW_20) && (DesiredMcs == MCS_32))14971497- {14981498- DBGPRINT(RT_DEBUG_WARN, ("RTMPSetIndividualHT: MCS_32 is only supported in 40-MHz, reset it as MCS_0\n"));14991499- DesiredMcs = MCS_0;15001500- }15011501-15021502- pDesired_ht_phy->bHtEnable = TRUE;15031503-15041504- // Decide desired Tx MCS15051505- switch (TxStream)15061506- {15071507- case 1:15081508- if (DesiredMcs == MCS_AUTO)15091509- {15101510- pDesired_ht_phy->MCSSet[0]= 0xff;15111511- pDesired_ht_phy->MCSSet[1]= 0x00;15121512- }15131513- else if (DesiredMcs <= MCS_7)15141514- {15151515- pDesired_ht_phy->MCSSet[0]= 1<<DesiredMcs;15161516- pDesired_ht_phy->MCSSet[1]= 0x00;15171517- }15181518- break;15191519-15201520- case 2:15211521- if (DesiredMcs == MCS_AUTO)15221522- {15231523- pDesired_ht_phy->MCSSet[0]= 0xff;15241524- pDesired_ht_phy->MCSSet[1]= 0xff;15251525- }15261526- else if (DesiredMcs <= MCS_15)15271527- {15281528- ULONG mode;15291529-15301530- mode = DesiredMcs / 8;15311531- if (mode < 2)15321532- pDesired_ht_phy->MCSSet[mode] = (1 << (DesiredMcs - mode * 8));15331533- }15341534- break;15351535-15361536- case 3: // 3*315371537- if (DesiredMcs == MCS_AUTO)15381538- {15391539- /* MCS0 ~ MCS23, 3 bytes */15401540- pDesired_ht_phy->MCSSet[0]= 0xff;15411541- pDesired_ht_phy->MCSSet[1]= 0xff;15421542- pDesired_ht_phy->MCSSet[2]= 0xff;15431543- }15441544- else if (DesiredMcs <= MCS_23)15451545- {15461546- ULONG mode;15471547-15481548- mode = DesiredMcs / 8;15491549- if (mode < 3)15501550- pDesired_ht_phy->MCSSet[mode] = (1 << (DesiredMcs - mode * 8));15511551- }15521552- break;15531553- }15541554-15551555- if(pAd->CommonCfg.DesiredHtPhy.ChannelWidth == BW_40)15561556- {15571557- if (DesiredMcs == MCS_AUTO || DesiredMcs == MCS_32)15581558- pDesired_ht_phy->MCSSet[4] = 0x1;15591559- }15601560-15611561- // update HT Rate setting15621562- if (pAd->OpMode == OPMODE_STA)15631563- MlmeUpdateHtTxRates(pAd, BSS0);15641564- else15651565- MlmeUpdateHtTxRates(pAd, apidx);15661566-}15671567-15681568-15691569-/*15701570- ========================================================================15711571- Routine Description:15721572- Update HT IE from our capability.15731573-15741574- Arguments:15751575- Send all HT IE in beacon/probe rsp/assoc rsp/action frame.15761576-15771577-15781578- ========================================================================15791579-*/15801580-VOID RTMPUpdateHTIE(15811581- IN RT_HT_CAPABILITY *pRtHt,15821582- IN UCHAR *pMcsSet,15831583- OUT HT_CAPABILITY_IE *pHtCapability,15841584- OUT ADD_HT_INFO_IE *pAddHtInfo)15851585-{15861586- RTMPZeroMemory(pHtCapability, sizeof(HT_CAPABILITY_IE));15871587- RTMPZeroMemory(pAddHtInfo, sizeof(ADD_HT_INFO_IE));15881588-15891589- pHtCapability->HtCapInfo.ChannelWidth = pRtHt->ChannelWidth;15901590- pHtCapability->HtCapInfo.MimoPs = pRtHt->MimoPs;15911591- pHtCapability->HtCapInfo.GF = pRtHt->GF;15921592- pHtCapability->HtCapInfo.ShortGIfor20 = pRtHt->ShortGIfor20;15931593- pHtCapability->HtCapInfo.ShortGIfor40 = pRtHt->ShortGIfor40;15941594- pHtCapability->HtCapInfo.TxSTBC = pRtHt->TxSTBC;15951595- pHtCapability->HtCapInfo.RxSTBC = pRtHt->RxSTBC;15961596- pHtCapability->HtCapInfo.AMsduSize = pRtHt->AmsduSize;15971597- pHtCapability->HtCapParm.MaxRAmpduFactor = pRtHt->MaxRAmpduFactor;15981598- pHtCapability->HtCapParm.MpduDensity = pRtHt->MpduDensity;15991599-16001600- pAddHtInfo->AddHtInfo.ExtChanOffset = pRtHt->ExtChanOffset ;16011601- pAddHtInfo->AddHtInfo.RecomWidth = pRtHt->RecomWidth;16021602- pAddHtInfo->AddHtInfo2.OperaionMode = pRtHt->OperaionMode;16031603- pAddHtInfo->AddHtInfo2.NonGfPresent = pRtHt->NonGfPresent;16041604- RTMPMoveMemory(pAddHtInfo->MCSSet, /*pRtHt->MCSSet*/pMcsSet, 4); // rt2860 only support MCS max=32, no need to copy all 16 uchar.16051605-16061606- DBGPRINT(RT_DEBUG_TRACE,("RTMPUpdateHTIE <== \n"));16071607-}16081608-16091609-/*16101610- ========================================================================16111611- Description:16121612- Add Client security information into ASIC WCID table and IVEIV table.16131613- Return:16141614- ========================================================================16151615-*/16161616-VOID RTMPAddWcidAttributeEntry(16171617- IN PRTMP_ADAPTER pAd,16181618- IN UCHAR BssIdx,16191619- IN UCHAR KeyIdx,16201620- IN UCHAR CipherAlg,16211621- IN MAC_TABLE_ENTRY *pEntry)16221622-{16231623- UINT32 WCIDAttri = 0;16241624- USHORT offset;16251625- UCHAR IVEIV = 0;16261626- USHORT Wcid = 0;16271627-16281628- {16291629- {16301630- if (BssIdx > BSS0)16311631- {16321632- DBGPRINT(RT_DEBUG_ERROR, ("RTMPAddWcidAttributeEntry: The BSS-index(%d) is out of range for Infra link. \n", BssIdx));16331633- return;16341634- }16351635-16361636- // 1. In ADHOC mode, the AID is wcid number. And NO mesh link exists.16371637- // 2. In Infra mode, the AID:1 MUST be wcid of infra STA.16381638- // the AID:2~ assign to mesh link entry.16391639- if (pEntry && ADHOC_ON(pAd))16401640- Wcid = pEntry->Aid;16411641- else if (pEntry && INFRA_ON(pAd))16421642- {16431643- Wcid = BSSID_WCID;16441644- }16451645- else16461646- Wcid = MCAST_WCID;16471647- }16481648- }16491649-16501650- // Update WCID attribute table16511651- offset = MAC_WCID_ATTRIBUTE_BASE + (Wcid * HW_WCID_ATTRI_SIZE);16521652-16531653- {16541654- if (pEntry && pEntry->ValidAsMesh)16551655- WCIDAttri = (CipherAlg<<1) | PAIRWISEKEYTABLE;16561656- else16571657- WCIDAttri = (CipherAlg<<1) | SHAREDKEYTABLE;16581658- }16591659-16601660- RTMP_IO_WRITE32(pAd, offset, WCIDAttri);16611661-16621662-16631663- // Update IV/EIV table16641664- offset = MAC_IVEIV_TABLE_BASE + (Wcid * HW_IVEIV_ENTRY_SIZE);16651665-16661666- // WPA mode16671667- if ((CipherAlg == CIPHER_TKIP) || (CipherAlg == CIPHER_TKIP_NO_MIC) || (CipherAlg == CIPHER_AES))16681668- {16691669- // Eiv bit on. keyid always is 0 for pairwise key16701670- IVEIV = (KeyIdx <<6) | 0x20;16711671- }16721672- else16731673- {16741674- // WEP KeyIdx is default tx key.16751675- IVEIV = (KeyIdx << 6);16761676- }16771677-16781678- // For key index and ext IV bit, so only need to update the position(offset+3).16791679-#ifdef RT287016801680- RTUSBMultiWrite_OneByte(pAd, offset+3, &IVEIV);16811681-#endif // RT2870 //16821682-16831683- DBGPRINT(RT_DEBUG_TRACE,("RTMPAddWcidAttributeEntry: WCID #%d, KeyIndex #%d, Alg=%s\n",Wcid, KeyIdx, CipherName[CipherAlg]));16841684- DBGPRINT(RT_DEBUG_TRACE,(" WCIDAttri = 0x%x \n", WCIDAttri));16851685-16861686-}16871687-16881688-/*16891689- ==========================================================================16901690- Description:16911691- Parse encryption type16921692-Arguments:16931693- pAdapter Pointer to our adapter16941694- wrq Pointer to the ioctl argument16951695-16961696- Return Value:16971697- None16981698-16991699- Note:17001700- ==========================================================================17011701-*/17021702-CHAR *GetEncryptType(CHAR enc)17031703-{17041704- if(enc == Ndis802_11WEPDisabled)17051705- return "NONE";17061706- if(enc == Ndis802_11WEPEnabled)17071707- return "WEP";17081708- if(enc == Ndis802_11Encryption2Enabled)17091709- return "TKIP";17101710- if(enc == Ndis802_11Encryption3Enabled)17111711- return "AES";17121712- if(enc == Ndis802_11Encryption4Enabled)17131713- return "TKIPAES";17141714- else17151715- return "UNKNOW";17161716-}17171717-17181718-CHAR *GetAuthMode(CHAR auth)17191719-{17201720- if(auth == Ndis802_11AuthModeOpen)17211721- return "OPEN";17221722- if(auth == Ndis802_11AuthModeShared)17231723- return "SHARED";17241724- if(auth == Ndis802_11AuthModeAutoSwitch)17251725- return "AUTOWEP";17261726- if(auth == Ndis802_11AuthModeWPA)17271727- return "WPA";17281728- if(auth == Ndis802_11AuthModeWPAPSK)17291729- return "WPAPSK";17301730- if(auth == Ndis802_11AuthModeWPANone)17311731- return "WPANONE";17321732- if(auth == Ndis802_11AuthModeWPA2)17331733- return "WPA2";17341734- if(auth == Ndis802_11AuthModeWPA2PSK)17351735- return "WPA2PSK";17361736- if(auth == Ndis802_11AuthModeWPA1WPA2)17371737- return "WPA1WPA2";17381738- if(auth == Ndis802_11AuthModeWPA1PSKWPA2PSK)17391739- return "WPA1PSKWPA2PSK";17401740-17411741- return "UNKNOW";17421742-}17431743-17441744-/*17451745- ==========================================================================17461746- Description:17471747- Get site survey results17481748- Arguments:17491749- pAdapter Pointer to our adapter17501750- wrq Pointer to the ioctl argument17511751-17521752- Return Value:17531753- None17541754-17551755- Note:17561756- Usage:17571757- 1.) UI needs to wait 4 seconds after issue a site survey command17581758- 2.) iwpriv ra0 get_site_survey17591759- 3.) UI needs to prepare at least 4096bytes to get the results17601760- ==========================================================================17611761-*/17621762-#define LINE_LEN (4+33+20+8+10+9+7+3) // Channel+SSID+Bssid+WepStatus+AuthMode+Signal+WiressMode+NetworkType17631763-VOID RTMPIoctlGetSiteSurvey(17641764- IN PRTMP_ADAPTER pAdapter,17651765- IN struct iwreq *wrq)17661766-{17671767- CHAR *msg;17681768- INT i=0;17691769- INT WaitCnt;17701770- INT Status=0;17711771- CHAR Ssid[MAX_LEN_OF_SSID +1];17721772- INT Rssi = 0, max_len = LINE_LEN;17731773- UINT Rssi_Quality = 0;17741774- NDIS_802_11_NETWORK_TYPE wireless_mode;17751775-17761776- os_alloc_mem(NULL, (PUCHAR *)&msg, sizeof(CHAR)*((MAX_LEN_OF_BSS_TABLE)*max_len));17771777-17781778- if (msg == NULL)17791779- {17801780- DBGPRINT(RT_DEBUG_TRACE, ("RTMPIoctlGetSiteSurvey - msg memory alloc fail.\n"));17811781- return;17821782- }17831783-17841784- memset(msg, 0 ,(MAX_LEN_OF_BSS_TABLE)*max_len );17851785- memset(Ssid, 0 ,(MAX_LEN_OF_SSID +1));17861786- sprintf(msg,"%s","\n");17871787- sprintf(msg+strlen(msg),"%-4s%-33s%-20s%-8s%-10s%-9s%-7s%-3s\n",17881788- "Ch", "SSID", "BSSID", "Enc", "Auth", "Siganl(%)", "W-Mode", " NT");17891789-17901790-17911791- WaitCnt = 0;17921792- pAdapter->StaCfg.bScanReqIsFromWebUI = TRUE;17931793-17941794- while ((ScanRunning(pAdapter) == TRUE) && (WaitCnt++ < 200))17951795- OS_WAIT(500);17961796-17971797- for(i=0; i<pAdapter->ScanTab.BssNr ;i++)17981798- {17991799- if( pAdapter->ScanTab.BssEntry[i].Channel==0)18001800- break;18011801-18021802- if((strlen(msg)+max_len ) >= IW_SCAN_MAX_DATA)18031803- break;18041804-18051805- //Channel18061806- sprintf(msg+strlen(msg),"%-4d", pAdapter->ScanTab.BssEntry[i].Channel);18071807- //SSID18081808- memcpy(Ssid, pAdapter->ScanTab.BssEntry[i].Ssid, pAdapter->ScanTab.BssEntry[i].SsidLen);18091809- Ssid[pAdapter->ScanTab.BssEntry[i].SsidLen] = '\0';18101810- sprintf(msg+strlen(msg),"%-33s", Ssid);18111811- //BSSID18121812- sprintf(msg+strlen(msg),"%02x:%02x:%02x:%02x:%02x:%02x ",18131813- pAdapter->ScanTab.BssEntry[i].Bssid[0],18141814- pAdapter->ScanTab.BssEntry[i].Bssid[1],18151815- pAdapter->ScanTab.BssEntry[i].Bssid[2],18161816- pAdapter->ScanTab.BssEntry[i].Bssid[3],18171817- pAdapter->ScanTab.BssEntry[i].Bssid[4],18181818- pAdapter->ScanTab.BssEntry[i].Bssid[5]);18191819- //Encryption Type18201820- sprintf(msg+strlen(msg),"%-8s",GetEncryptType(pAdapter->ScanTab.BssEntry[i].WepStatus));18211821- //Authentication Mode18221822- if (pAdapter->ScanTab.BssEntry[i].WepStatus == Ndis802_11WEPEnabled)18231823- sprintf(msg+strlen(msg),"%-10s", "UNKNOW");18241824- else18251825- sprintf(msg+strlen(msg),"%-10s",GetAuthMode(pAdapter->ScanTab.BssEntry[i].AuthMode));18261826- // Rssi18271827- Rssi = (INT)pAdapter->ScanTab.BssEntry[i].Rssi;18281828- if (Rssi >= -50)18291829- Rssi_Quality = 100;18301830- else if (Rssi >= -80) // between -50 ~ -80dbm18311831- Rssi_Quality = (UINT)(24 + ((Rssi + 80) * 26)/10);18321832- else if (Rssi >= -90) // between -80 ~ -90dbm18331833- Rssi_Quality = (UINT)(((Rssi + 90) * 26)/10);18341834- else // < -84 dbm18351835- Rssi_Quality = 0;18361836- sprintf(msg+strlen(msg),"%-9d", Rssi_Quality);18371837- // Wireless Mode18381838- wireless_mode = NetworkTypeInUseSanity(&pAdapter->ScanTab.BssEntry[i]);18391839- if (wireless_mode == Ndis802_11FH ||18401840- wireless_mode == Ndis802_11DS)18411841- sprintf(msg+strlen(msg),"%-7s", "11b");18421842- else if (wireless_mode == Ndis802_11OFDM5)18431843- sprintf(msg+strlen(msg),"%-7s", "11a");18441844- else if (wireless_mode == Ndis802_11OFDM5_N)18451845- sprintf(msg+strlen(msg),"%-7s", "11a/n");18461846- else if (wireless_mode == Ndis802_11OFDM24)18471847- sprintf(msg+strlen(msg),"%-7s", "11b/g");18481848- else if (wireless_mode == Ndis802_11OFDM24_N)18491849- sprintf(msg+strlen(msg),"%-7s", "11b/g/n");18501850- else18511851- sprintf(msg+strlen(msg),"%-7s", "unknow");18521852- //Network Type18531853- if (pAdapter->ScanTab.BssEntry[i].BssType == BSS_ADHOC)18541854- sprintf(msg+strlen(msg),"%-3s", " Ad");18551855- else18561856- sprintf(msg+strlen(msg),"%-3s", " In");18571857-18581858- sprintf(msg+strlen(msg),"\n");18591859- }18601860-18611861- pAdapter->StaCfg.bScanReqIsFromWebUI = FALSE;18621862- wrq->u.data.length = strlen(msg);18631863- Status = copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);18641864-18651865- DBGPRINT(RT_DEBUG_TRACE, ("RTMPIoctlGetSiteSurvey - wrq->u.data.length = %d\n", wrq->u.data.length));18661866- os_free_mem(NULL, (PUCHAR)msg);18671867-}18681868-18691869-18701870-#define MAC_LINE_LEN (14+4+4+10+10+10+6+6) // Addr+aid+psm+datatime+rxbyte+txbyte+current tx rate+last tx rate18711871-VOID RTMPIoctlGetMacTable(18721872- IN PRTMP_ADAPTER pAd,18731873- IN struct iwreq *wrq)18741874-{18751875- INT i;18761876- RT_802_11_MAC_TABLE MacTab;18771877- char *msg;18781878-18791879- MacTab.Num = 0;18801880- for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)18811881- {18821882- if (pAd->MacTab.Content[i].ValidAsCLI && (pAd->MacTab.Content[i].Sst == SST_ASSOC))18831883- {18841884- COPY_MAC_ADDR(MacTab.Entry[MacTab.Num].Addr, &pAd->MacTab.Content[i].Addr);18851885- MacTab.Entry[MacTab.Num].Aid = (UCHAR)pAd->MacTab.Content[i].Aid;18861886- MacTab.Entry[MacTab.Num].Psm = pAd->MacTab.Content[i].PsMode;18871887- MacTab.Entry[MacTab.Num].MimoPs = pAd->MacTab.Content[i].MmpsMode;18881888-18891889- // Fill in RSSI per entry18901890- MacTab.Entry[MacTab.Num].AvgRssi0 = pAd->MacTab.Content[i].RssiSample.AvgRssi0;18911891- MacTab.Entry[MacTab.Num].AvgRssi1 = pAd->MacTab.Content[i].RssiSample.AvgRssi1;18921892- MacTab.Entry[MacTab.Num].AvgRssi2 = pAd->MacTab.Content[i].RssiSample.AvgRssi2;18931893-18941894- // the connected time per entry18951895- MacTab.Entry[MacTab.Num].ConnectedTime = pAd->MacTab.Content[i].StaConnectTime;18961896- MacTab.Entry[MacTab.Num].TxRate.field.MCS = pAd->MacTab.Content[i].HTPhyMode.field.MCS;18971897- MacTab.Entry[MacTab.Num].TxRate.field.BW = pAd->MacTab.Content[i].HTPhyMode.field.BW;18981898- MacTab.Entry[MacTab.Num].TxRate.field.ShortGI = pAd->MacTab.Content[i].HTPhyMode.field.ShortGI;18991899- MacTab.Entry[MacTab.Num].TxRate.field.STBC = pAd->MacTab.Content[i].HTPhyMode.field.STBC;19001900- MacTab.Entry[MacTab.Num].TxRate.field.rsv = pAd->MacTab.Content[i].HTPhyMode.field.rsv;19011901- MacTab.Entry[MacTab.Num].TxRate.field.MODE = pAd->MacTab.Content[i].HTPhyMode.field.MODE;19021902- MacTab.Entry[MacTab.Num].TxRate.word = pAd->MacTab.Content[i].HTPhyMode.word;19031903-19041904- MacTab.Num += 1;19051905- }19061906- }19071907- wrq->u.data.length = sizeof(RT_802_11_MAC_TABLE);19081908- if (copy_to_user(wrq->u.data.pointer, &MacTab, wrq->u.data.length))19091909- {19101910- DBGPRINT(RT_DEBUG_TRACE, ("%s: copy_to_user() fail\n", __func__));19111911- }19121912-19131913- msg = (CHAR *) kmalloc(sizeof(CHAR)*(MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN), MEM_ALLOC_FLAG);19141914- memset(msg, 0 ,MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN );19151915- sprintf(msg,"%s","\n");19161916- sprintf(msg+strlen(msg),"%-14s%-4s%-4s%-10s%-10s%-10s%-6s%-6s\n",19171917- "MAC", "AID", "PSM", "LDT", "RxB", "TxB","CTxR", "LTxR");19181918-19191919- for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++)19201920- {19211921- PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i];19221922- if (pEntry->ValidAsCLI && (pEntry->Sst == SST_ASSOC))19231923- {19241924- if((strlen(msg)+MAC_LINE_LEN ) >= (MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN) )19251925- break;19261926- sprintf(msg+strlen(msg),"%02x%02x%02x%02x%02x%02x ",19271927- pEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],19281928- pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]);19291929- sprintf(msg+strlen(msg),"%-4d", (int)pEntry->Aid);19301930- sprintf(msg+strlen(msg),"%-4d", (int)pEntry->PsMode);19311931- sprintf(msg+strlen(msg),"%-10d",0/*pAd->MacTab.Content[i].HSCounter.LastDataPacketTime*/); // ToDo19321932- sprintf(msg+strlen(msg),"%-10d",0/*pAd->MacTab.Content[i].HSCounter.TotalRxByteCount*/); // ToDo19331933- sprintf(msg+strlen(msg),"%-10d",0/*pAd->MacTab.Content[i].HSCounter.TotalTxByteCount*/); // ToDo19341934- sprintf(msg+strlen(msg),"%-6d",RateIdToMbps[pAd->MacTab.Content[i].CurrTxRate]);19351935- sprintf(msg+strlen(msg),"%-6d\n",0/*RateIdToMbps[pAd->MacTab.Content[i].LastTxRate]*/); // ToDo19361936- }19371937- }19381938- // for compatible with old API just do the printk to console19391939- //wrq->u.data.length = strlen(msg);19401940- //if (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length))19411941- {19421942- DBGPRINT(RT_DEBUG_TRACE, ("%s", msg));19431943- }19441944-19451945- kfree(msg);19461946-}19471947-19481948-INT Set_BASetup_Proc(19491949- IN PRTMP_ADAPTER pAd,19501950- IN PUCHAR arg)19511951-{19521952- UCHAR mac[6], tid;19531953- char *token, sepValue[] = ":", DASH = '-';19541954- INT i;19551955- MAC_TABLE_ENTRY *pEntry;19561956-19571957-/*19581958- The BASetup inupt string format should be xx:xx:xx:xx:xx:xx-d,19591959- =>The six 2 digit hex-decimal number previous are the Mac address,19601960- =>The seventh decimal number is the tid value.19611961-*/19621962-19631963- if(strlen(arg) < 19) //Mac address acceptable format 01:02:03:04:05:06 length 17 plus the "-" and tid value in decimal format.19641964- return FALSE;19651965-19661966- token = strchr(arg, DASH);19671967- if ((token != NULL) && (strlen(token)>1))19681968- {19691969- tid = simple_strtol((token+1), 0, 10);19701970- if (tid > 15)19711971- return FALSE;19721972-19731973- *token = '\0';19741974- for (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++)19751975- {19761976- if((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1))))19771977- return FALSE;19781978- AtoH(token, (PUCHAR)(&mac[i]), 1);19791979- }19801980- if(i != 6)19811981- return FALSE;19821982-19831983- printk("\n%02x:%02x:%02x:%02x:%02x:%02x-%02x\n", mac[0], mac[1],19841984- mac[2], mac[3], mac[4], mac[5], tid);19851985-19861986- pEntry = MacTableLookup(pAd, mac);19871987-19881988- if (pEntry) {19891989- printk("\nSetup BA Session: Tid = %d\n", tid);19901990- BAOriSessionSetUp(pAd, pEntry, tid, 0, 100, TRUE);19911991- }19921992-19931993- return TRUE;19941994- }19951995-19961996- return FALSE;19971997-19981998-}19991999-20002000-INT Set_BADecline_Proc(20012001- IN PRTMP_ADAPTER pAd,20022002- IN PUCHAR arg)20032003-{20042004- ULONG bBADecline;20052005-20062006- bBADecline = simple_strtol(arg, 0, 10);20072007-20082008- if (bBADecline == 0)20092009- {20102010- pAd->CommonCfg.bBADecline = FALSE;20112011- }20122012- else if (bBADecline == 1)20132013- {20142014- pAd->CommonCfg.bBADecline = TRUE;20152015- }20162016- else20172017- {20182018- return FALSE; //Invalid argument20192019- }20202020-20212021- DBGPRINT(RT_DEBUG_TRACE, ("Set_BADecline_Proc::(BADecline=%d)\n", pAd->CommonCfg.bBADecline));20222022-20232023- return TRUE;20242024-}20252025-20262026-INT Set_BAOriTearDown_Proc(20272027- IN PRTMP_ADAPTER pAd,20282028- IN PUCHAR arg)20292029-{20302030- UCHAR mac[6], tid;20312031- char *token, sepValue[] = ":", DASH = '-';20322032- INT i;20332033- MAC_TABLE_ENTRY *pEntry;20342034-20352035-/*20362036- The BAOriTearDown inupt string format should be xx:xx:xx:xx:xx:xx-d,20372037- =>The six 2 digit hex-decimal number previous are the Mac address,20382038- =>The seventh decimal number is the tid value.20392039-*/20402040- if(strlen(arg) < 19) //Mac address acceptable format 01:02:03:04:05:06 length 17 plus the "-" and tid value in decimal format.20412041- return FALSE;20422042-20432043- token = strchr(arg, DASH);20442044- if ((token != NULL) && (strlen(token)>1))20452045- {20462046- tid = simple_strtol((token+1), 0, 10);20472047- if (tid > NUM_OF_TID)20482048- return FALSE;20492049-20502050- *token = '\0';20512051- for (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++)20522052- {20532053- if((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1))))20542054- return FALSE;20552055- AtoH(token, (PUCHAR)(&mac[i]), 1);20562056- }20572057- if(i != 6)20582058- return FALSE;20592059-20602060- printk("\n%02x:%02x:%02x:%02x:%02x:%02x-%02x", mac[0], mac[1],20612061- mac[2], mac[3], mac[4], mac[5], tid);20622062-20632063- pEntry = MacTableLookup(pAd, mac);20642064-20652065- if (pEntry) {20662066- printk("\nTear down Ori BA Session: Tid = %d\n", tid);20672067- BAOriSessionTearDown(pAd, pEntry->Aid, tid, FALSE, TRUE);20682068- }20692069-20702070- return TRUE;20712071- }20722072-20732073- return FALSE;20742074-20752075-}20762076-20772077-INT Set_BARecTearDown_Proc(20782078- IN PRTMP_ADAPTER pAd,20792079- IN PUCHAR arg)20802080-{20812081- UCHAR mac[6], tid;20822082- char *token, sepValue[] = ":", DASH = '-';20832083- INT i;20842084- MAC_TABLE_ENTRY *pEntry;20852085-20862086- //printk("\n%s\n", arg);20872087-/*20882088- The BARecTearDown inupt string format should be xx:xx:xx:xx:xx:xx-d,20892089- =>The six 2 digit hex-decimal number previous are the Mac address,20902090- =>The seventh decimal number is the tid value.20912091-*/20922092- if(strlen(arg) < 19) //Mac address acceptable format 01:02:03:04:05:06 length 17 plus the "-" and tid value in decimal format.20932093- return FALSE;20942094-20952095- token = strchr(arg, DASH);20962096- if ((token != NULL) && (strlen(token)>1))20972097- {20982098- tid = simple_strtol((token+1), 0, 10);20992099- if (tid > NUM_OF_TID)21002100- return FALSE;21012101-21022102- *token = '\0';21032103- for (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++)21042104- {21052105- if((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1))))21062106- return FALSE;21072107- AtoH(token, (PUCHAR)(&mac[i]), 1);21082108- }21092109- if(i != 6)21102110- return FALSE;21112111-21122112- printk("\n%02x:%02x:%02x:%02x:%02x:%02x-%02x", mac[0], mac[1],21132113- mac[2], mac[3], mac[4], mac[5], tid);21142114-21152115- pEntry = MacTableLookup(pAd, mac);21162116-21172117- if (pEntry) {21182118- printk("\nTear down Rec BA Session: Tid = %d\n", tid);21192119- BARecSessionTearDown(pAd, pEntry->Aid, tid, FALSE);21202120- }21212121-21222122- return TRUE;21232123- }21242124-21252125- return FALSE;21262126-21272127-}21282128-21292129-INT Set_HtBw_Proc(21302130- IN PRTMP_ADAPTER pAd,21312131- IN PUCHAR arg)21322132-{21332133- ULONG HtBw;21342134-21352135- HtBw = simple_strtol(arg, 0, 10);21362136- if (HtBw == BW_40)21372137- pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;21382138- else if (HtBw == BW_20)21392139- pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20;21402140- else21412141- return FALSE; //Invalid argument21422142-21432143- SetCommonHT(pAd);21442144-21452145- DBGPRINT(RT_DEBUG_TRACE, ("Set_HtBw_Proc::(HtBw=%d)\n", pAd->CommonCfg.RegTransmitSetting.field.BW));21462146-21472147- return TRUE;21482148-}21492149-21502150-INT Set_HtMcs_Proc(21512151- IN PRTMP_ADAPTER pAd,21522152- IN PUCHAR arg)21532153-{21542154- ULONG HtMcs, Mcs_tmp;21552155- BOOLEAN bAutoRate = FALSE;21562156-21572157- Mcs_tmp = simple_strtol(arg, 0, 10);21582158-21592159- if (Mcs_tmp <= 15 || Mcs_tmp == 32)21602160- HtMcs = Mcs_tmp;21612161- else21622162- HtMcs = MCS_AUTO;21632163-21642164- {21652165- pAd->StaCfg.DesiredTransmitSetting.field.MCS = HtMcs;21662166- pAd->StaCfg.bAutoTxRateSwitch = (HtMcs == MCS_AUTO) ? TRUE:FALSE;21672167- DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMcs_Proc::(HtMcs=%d, bAutoTxRateSwitch = %d)\n",21682168- pAd->StaCfg.DesiredTransmitSetting.field.MCS, pAd->StaCfg.bAutoTxRateSwitch));21692169-21702170- if ((pAd->CommonCfg.PhyMode < PHY_11ABGN_MIXED) ||21712171- (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE < MODE_HTMIX))21722172- {21732173- if ((pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO) &&21742174- (HtMcs >= 0 && HtMcs <= 3) &&21752175- (pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode == FIXED_TXMODE_CCK))21762176- {21772177- RTMPSetDesiredRates(pAd, (LONG) (RateIdToMbps[HtMcs] * 1000000));21782178- }21792179- else if ((pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO) &&21802180- (HtMcs >= 0 && HtMcs <= 7) &&21812181- (pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode == FIXED_TXMODE_OFDM))21822182- {21832183- RTMPSetDesiredRates(pAd, (LONG) (RateIdToMbps[HtMcs+4] * 1000000));21842184- }21852185- else21862186- bAutoRate = TRUE;21872187-21882188- if (bAutoRate)21892189- {21902190- pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;21912191- RTMPSetDesiredRates(pAd, -1);21922192- }21932193- DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMcs_Proc::(FixedTxMode=%d)\n",pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode));21942194- }21952195- if (ADHOC_ON(pAd))21962196- return TRUE;21972197- }21982198-21992199- SetCommonHT(pAd);22002200-22012201- return TRUE;22022202-}22032203-22042204-INT Set_HtGi_Proc(22052205- IN PRTMP_ADAPTER pAd,22062206- IN PUCHAR arg)22072207-{22082208- ULONG HtGi;22092209-22102210- HtGi = simple_strtol(arg, 0, 10);22112211-22122212- if ( HtGi == GI_400)22132213- pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400;22142214- else if ( HtGi == GI_800 )22152215- pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800;22162216- else22172217- return FALSE; //Invalid argument22182218-22192219- SetCommonHT(pAd);22202220-22212221- DBGPRINT(RT_DEBUG_TRACE, ("Set_HtGi_Proc::(ShortGI=%d)\n",pAd->CommonCfg.RegTransmitSetting.field.ShortGI));22222222-22232223- return TRUE;22242224-}22252225-22262226-22272227-INT Set_HtTxBASize_Proc(22282228- IN PRTMP_ADAPTER pAd,22292229- IN PUCHAR arg)22302230-{22312231- UCHAR Size;22322232-22332233- Size = simple_strtol(arg, 0, 10);22342234-22352235- if (Size <=0 || Size >=64)22362236- {22372237- Size = 8;22382238- }22392239- pAd->CommonCfg.TxBASize = Size-1;22402240- DBGPRINT(RT_DEBUG_ERROR, ("Set_HtTxBASize ::(TxBASize= %d)\n", Size));22412241-22422242- return TRUE;22432243-}22442244-22452245-22462246-INT Set_HtOpMode_Proc(22472247- IN PRTMP_ADAPTER pAd,22482248- IN PUCHAR arg)22492249-{22502250-22512251- ULONG Value;22522252-22532253- Value = simple_strtol(arg, 0, 10);22542254-22552255- if (Value == HTMODE_GF)22562256- pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_GF;22572257- else if ( Value == HTMODE_MM )22582258- pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_MM;22592259- else22602260- return FALSE; //Invalid argument22612261-22622262- SetCommonHT(pAd);22632263-22642264- DBGPRINT(RT_DEBUG_TRACE, ("Set_HtOpMode_Proc::(HtOpMode=%d)\n",pAd->CommonCfg.RegTransmitSetting.field.HTMODE));22652265-22662266- return TRUE;22672267-22682268-}22692269-22702270-INT Set_HtStbc_Proc(22712271- IN PRTMP_ADAPTER pAd,22722272- IN PUCHAR arg)22732273-{22742274-22752275- ULONG Value;22762276-22772277- Value = simple_strtol(arg, 0, 10);22782278-22792279- if (Value == STBC_USE)22802280- pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE;22812281- else if ( Value == STBC_NONE )22822282- pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE;22832283- else22842284- return FALSE; //Invalid argument22852285-22862286- SetCommonHT(pAd);22872287-22882288- DBGPRINT(RT_DEBUG_TRACE, ("Set_Stbc_Proc::(HtStbc=%d)\n",pAd->CommonCfg.RegTransmitSetting.field.STBC));22892289-22902290- return TRUE;22912291-}22922292-22932293-INT Set_HtHtc_Proc(22942294- IN PRTMP_ADAPTER pAd,22952295- IN PUCHAR arg)22962296-{22972297-22982298- ULONG Value;22992299-23002300- Value = simple_strtol(arg, 0, 10);23012301- if (Value == 0)23022302- pAd->HTCEnable = FALSE;23032303- else if ( Value ==1 )23042304- pAd->HTCEnable = TRUE;23052305- else23062306- return FALSE; //Invalid argument23072307-23082308- DBGPRINT(RT_DEBUG_TRACE, ("Set_HtHtc_Proc::(HtHtc=%d)\n",pAd->HTCEnable));23092309-23102310- return TRUE;23112311-}23122312-23132313-INT Set_HtExtcha_Proc(23142314- IN PRTMP_ADAPTER pAd,23152315- IN PUCHAR arg)23162316-{23172317-23182318- ULONG Value;23192319-23202320- Value = simple_strtol(arg, 0, 10);23212321-23222322- if (Value == 0)23232323- pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;23242324- else if ( Value ==1 )23252325- pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;23262326- else23272327- return FALSE; //Invalid argument23282328-23292329- SetCommonHT(pAd);23302330-23312331- DBGPRINT(RT_DEBUG_TRACE, ("Set_HtExtcha_Proc::(HtExtcha=%d)\n",pAd->CommonCfg.RegTransmitSetting.field.EXTCHA));23322332-23332333- return TRUE;23342334-}23352335-23362336-INT Set_HtMpduDensity_Proc(23372337- IN PRTMP_ADAPTER pAd,23382338- IN PUCHAR arg)23392339-{23402340- ULONG Value;23412341-23422342- Value = simple_strtol(arg, 0, 10);23432343-23442344- if (Value <=7 && Value >= 0)23452345- pAd->CommonCfg.BACapability.field.MpduDensity = Value;23462346- else23472347- pAd->CommonCfg.BACapability.field.MpduDensity = 4;23482348-23492349- SetCommonHT(pAd);23502350-23512351- DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMpduDensity_Proc::(HtMpduDensity=%d)\n",pAd->CommonCfg.BACapability.field.MpduDensity));23522352-23532353- return TRUE;23542354-}23552355-23562356-INT Set_HtBaWinSize_Proc(23572357- IN PRTMP_ADAPTER pAd,23582358- IN PUCHAR arg)23592359-{23602360- ULONG Value;23612361-23622362- Value = simple_strtol(arg, 0, 10);23632363-23642364-23652365- if (Value >=1 && Value <= 64)23662366- {23672367- pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;23682368- pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value;23692369- }23702370- else23712371- {23722372- pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64;23732373- pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64;23742374- }23752375-23762376- SetCommonHT(pAd);23772377-23782378- DBGPRINT(RT_DEBUG_TRACE, ("Set_HtBaWinSize_Proc::(HtBaWinSize=%d)\n",pAd->CommonCfg.BACapability.field.RxBAWinLimit));23792379-23802380- return TRUE;23812381-}23822382-23832383-INT Set_HtRdg_Proc(23842384- IN PRTMP_ADAPTER pAd,23852385- IN PUCHAR arg)23862386-{23872387- ULONG Value;23882388-23892389- Value = simple_strtol(arg, 0, 10);23902390-23912391- if (Value == 0)23922392- pAd->CommonCfg.bRdg = FALSE;23932393- else if ( Value ==1 )23942394- {23952395- pAd->HTCEnable = TRUE;23962396- pAd->CommonCfg.bRdg = TRUE;23972397- }23982398- else23992399- return FALSE; //Invalid argument24002400-24012401- SetCommonHT(pAd);24022402-24032403- DBGPRINT(RT_DEBUG_TRACE, ("Set_HtRdg_Proc::(HtRdg=%d)\n",pAd->CommonCfg.bRdg));24042404-24052405- return TRUE;24062406-}24072407-24082408-INT Set_HtLinkAdapt_Proc(24092409- IN PRTMP_ADAPTER pAd,24102410- IN PUCHAR arg)24112411-{24122412- ULONG Value;24132413-24142414- Value = simple_strtol(arg, 0, 10);24152415- if (Value == 0)24162416- pAd->bLinkAdapt = FALSE;24172417- else if ( Value ==1 )24182418- {24192419- pAd->HTCEnable = TRUE;24202420- pAd->bLinkAdapt = TRUE;24212421- }24222422- else24232423- return FALSE; //Invalid argument24242424-24252425- DBGPRINT(RT_DEBUG_TRACE, ("Set_HtLinkAdapt_Proc::(HtLinkAdapt=%d)\n",pAd->bLinkAdapt));24262426-24272427- return TRUE;24282428-}24292429-24302430-INT Set_HtAmsdu_Proc(24312431- IN PRTMP_ADAPTER pAd,24322432- IN PUCHAR arg)24332433-{24342434- ULONG Value;24352435-24362436- Value = simple_strtol(arg, 0, 10);24372437- if (Value == 0)24382438- pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE;24392439- else if ( Value == 1 )24402440- pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE;24412441- else24422442- return FALSE; //Invalid argument24432443-24442444- SetCommonHT(pAd);24452445-24462446- DBGPRINT(RT_DEBUG_TRACE, ("Set_HtAmsdu_Proc::(HtAmsdu=%d)\n",pAd->CommonCfg.BACapability.field.AmsduEnable));24472447-24482448- return TRUE;24492449-}24502450-24512451-INT Set_HtAutoBa_Proc(24522452- IN PRTMP_ADAPTER pAd,24532453- IN PUCHAR arg)24542454-{24552455- ULONG Value;24562456-24572457- Value = simple_strtol(arg, 0, 10);24582458- if (Value == 0)24592459- {24602460- pAd->CommonCfg.BACapability.field.AutoBA = FALSE;24612461-#ifdef RT30xx24622462- pAd->CommonCfg.BACapability.field.Policy = BA_NOTUSE;24632463-#endif24642464- }24652465- else if (Value == 1)24662466- {24672467- pAd->CommonCfg.BACapability.field.AutoBA = TRUE;24682468-#ifdef RT30xx24692469- pAd->CommonCfg.BACapability.field.Policy = IMMED_BA;24702470-#endif24712471- }24722472- else24732473- return FALSE; //Invalid argument24742474-24752475- pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA;24762476-#ifdef RT30xx24772477- pAd->CommonCfg.REGBACapability.field.Policy = pAd->CommonCfg.BACapability.field.Policy;24782478-#endif24792479- SetCommonHT(pAd);24802480-24812481- DBGPRINT(RT_DEBUG_TRACE, ("Set_HtAutoBa_Proc::(HtAutoBa=%d)\n",pAd->CommonCfg.BACapability.field.AutoBA));24822482-24832483- return TRUE;24842484-24852485-}24862486-24872487-INT Set_HtProtect_Proc(24882488- IN PRTMP_ADAPTER pAd,24892489- IN PUCHAR arg)24902490-{24912491- ULONG Value;24922492-24932493- Value = simple_strtol(arg, 0, 10);24942494- if (Value == 0)24952495- pAd->CommonCfg.bHTProtect = FALSE;24962496- else if (Value == 1)24972497- pAd->CommonCfg.bHTProtect = TRUE;24982498- else24992499- return FALSE; //Invalid argument25002500-25012501- DBGPRINT(RT_DEBUG_TRACE, ("Set_HtProtect_Proc::(HtProtect=%d)\n",pAd->CommonCfg.bHTProtect));25022502-25032503- return TRUE;25042504-}25052505-25062506-INT Set_SendPSMPAction_Proc(25072507- IN PRTMP_ADAPTER pAd,25082508- IN PUCHAR arg)25092509-{25102510- UCHAR mac[6], mode;25112511- char *token, sepValue[] = ":", DASH = '-';25122512- INT i;25132513- MAC_TABLE_ENTRY *pEntry;25142514-25152515- //printk("\n%s\n", arg);25162516-/*25172517- The BARecTearDown inupt string format should be xx:xx:xx:xx:xx:xx-d,25182518- =>The six 2 digit hex-decimal number previous are the Mac address,25192519- =>The seventh decimal number is the mode value.25202520-*/25212521- if(strlen(arg) < 19) //Mac address acceptable format 01:02:03:04:05:06 length 17 plus the "-" and mode value in decimal format.25222522- return FALSE;25232523-25242524- token = strchr(arg, DASH);25252525- if ((token != NULL) && (strlen(token)>1))25262526- {25272527- mode = simple_strtol((token+1), 0, 10);25282528- if (mode > MMPS_ENABLE)25292529- return FALSE;25302530-25312531- *token = '\0';25322532- for (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++)25332533- {25342534- if((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1))))25352535- return FALSE;25362536- AtoH(token, (PUCHAR)(&mac[i]), 1);25372537- }25382538- if(i != 6)25392539- return FALSE;25402540-25412541- printk("\n%02x:%02x:%02x:%02x:%02x:%02x-%02x", mac[0], mac[1],25422542- mac[2], mac[3], mac[4], mac[5], mode);25432543-25442544- pEntry = MacTableLookup(pAd, mac);25452545-25462546- if (pEntry) {25472547- printk("\nSendPSMPAction MIPS mode = %d\n", mode);25482548- SendPSMPAction(pAd, pEntry->Aid, mode);25492549- }25502550-25512551- return TRUE;25522552- }25532553-25542554- return FALSE;25552555-25562556-25572557-}25582558-25592559-INT Set_HtMIMOPSmode_Proc(25602560- IN PRTMP_ADAPTER pAd,25612561- IN PUCHAR arg)25622562-{25632563- ULONG Value;25642564-25652565- Value = simple_strtol(arg, 0, 10);25662566-25672567- if (Value <=3 && Value >= 0)25682568- pAd->CommonCfg.BACapability.field.MMPSmode = Value;25692569- else25702570- pAd->CommonCfg.BACapability.field.MMPSmode = 3;25712571-25722572- SetCommonHT(pAd);25732573-25742574- DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMIMOPSmode_Proc::(MIMOPS mode=%d)\n",pAd->CommonCfg.BACapability.field.MMPSmode));25752575-25762576- return TRUE;25772577-}25782578-25792579-25802580-INT Set_ForceShortGI_Proc(25812581- IN PRTMP_ADAPTER pAd,25822582- IN PUCHAR arg)25832583-{25842584- ULONG Value;25852585-25862586- Value = simple_strtol(arg, 0, 10);25872587- if (Value == 0)25882588- pAd->WIFItestbed.bShortGI = FALSE;25892589- else if (Value == 1)25902590- pAd->WIFItestbed.bShortGI = TRUE;25912591- else25922592- return FALSE; //Invalid argument25932593-25942594- SetCommonHT(pAd);25952595-25962596- DBGPRINT(RT_DEBUG_TRACE, ("Set_ForceShortGI_Proc::(ForceShortGI=%d)\n", pAd->WIFItestbed.bShortGI));25972597-25982598- return TRUE;25992599-}26002600-26012601-26022602-26032603-INT Set_ForceGF_Proc(26042604- IN PRTMP_ADAPTER pAd,26052605- IN PUCHAR arg)26062606-{26072607- ULONG Value;26082608-26092609- Value = simple_strtol(arg, 0, 10);26102610- if (Value == 0)26112611- pAd->WIFItestbed.bGreenField = FALSE;26122612- else if (Value == 1)26132613- pAd->WIFItestbed.bGreenField = TRUE;26142614- else26152615- return FALSE; //Invalid argument26162616-26172617- SetCommonHT(pAd);26182618-26192619- DBGPRINT(RT_DEBUG_TRACE, ("Set_ForceGF_Proc::(ForceGF=%d)\n", pAd->WIFItestbed.bGreenField));26202620-26212621- return TRUE;26222622-}26232623-26242624-INT Set_HtMimoPs_Proc(26252625- IN PRTMP_ADAPTER pAd,26262626- IN PUCHAR arg)26272627-{26282628- ULONG Value;26292629-26302630- Value = simple_strtol(arg, 0, 10);26312631- if (Value == 0)26322632- pAd->CommonCfg.bMIMOPSEnable = FALSE;26332633- else if (Value == 1)26342634- pAd->CommonCfg.bMIMOPSEnable = TRUE;26352635- else26362636- return FALSE; //Invalid argument26372637-26382638- DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMimoPs_Proc::(HtMimoPs=%d)\n",pAd->CommonCfg.bMIMOPSEnable));26392639-26402640- return TRUE;26412641-}26422642-26432643-INT SetCommonHT(26442644- IN PRTMP_ADAPTER pAd)26452645-{26462646- OID_SET_HT_PHYMODE SetHT;26472647-26482648- if (pAd->CommonCfg.PhyMode < PHY_11ABGN_MIXED)26492649- return FALSE;26502650-26512651- SetHT.PhyMode = pAd->CommonCfg.PhyMode;26522652- SetHT.TransmitNo = ((UCHAR)pAd->Antenna.field.TxPath);26532653- SetHT.HtMode = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.HTMODE;26542654- SetHT.ExtOffset = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.EXTCHA;26552655- SetHT.MCS = MCS_AUTO;26562656- SetHT.BW = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.BW;26572657- SetHT.STBC = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.STBC;26582658- SetHT.SHORTGI = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.ShortGI;26592659-26602660- RTMPSetHT(pAd, &SetHT);26612661-26622662- return TRUE;26632663-}26642664-26652665-INT Set_FixedTxMode_Proc(26662666- IN PRTMP_ADAPTER pAd,26672667- IN PUCHAR arg)26682668-{26692669- UCHAR fix_tx_mode = FIXED_TXMODE_HT;26702670-26712671- if (strcmp(arg, "OFDM") == 0 || strcmp(arg, "ofdm") == 0)26722672- {26732673- fix_tx_mode = FIXED_TXMODE_OFDM;26742674- }26752675- else if (strcmp(arg, "CCK") == 0 || strcmp(arg, "cck") == 0)26762676- {26772677- fix_tx_mode = FIXED_TXMODE_CCK;26782678- }26792679-26802680- pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode;26812681-26822682- DBGPRINT(RT_DEBUG_TRACE, ("Set_FixedTxMode_Proc::(FixedTxMode=%d)\n", fix_tx_mode));26832683-26842684- return TRUE;26852685-}26862686-26872687-/////////////////////////////////////////////////////////////////////////26882688-PCHAR RTMPGetRalinkAuthModeStr(26892689- IN NDIS_802_11_AUTHENTICATION_MODE authMode)26902690-{26912691- switch(authMode)26922692- {26932693- case Ndis802_11AuthModeOpen:26942694- return "OPEN";26952695-#ifdef RT30xx26962696- default:26972697-#endif26982698- case Ndis802_11AuthModeWPAPSK:26992699- return "WPAPSK";27002700- case Ndis802_11AuthModeShared:27012701- return "SHARED";27022702- case Ndis802_11AuthModeWPA:27032703- return "WPA";27042704- case Ndis802_11AuthModeWPA2:27052705- return "WPA2";27062706- case Ndis802_11AuthModeWPA2PSK:27072707- return "WPA2PSK";27082708- case Ndis802_11AuthModeWPA1PSKWPA2PSK:27092709- return "WPAPSKWPA2PSK";27102710- case Ndis802_11AuthModeWPA1WPA2:27112711- return "WPA1WPA2";27122712-#ifndef RT30xx27132713- case Ndis802_11AuthModeWPANone:27142714- return "WPANONE";27152715- default:27162716- return "UNKNOW";27172717-#endif27182718- }27192719-}27202720-27212721-PCHAR RTMPGetRalinkEncryModeStr(27222722- IN USHORT encryMode)27232723-{27242724- switch(encryMode)27252725- {27262726-#ifdef RT30xx27272727- default:27282728-#endif27292729- case Ndis802_11WEPDisabled:27302730- return "NONE";27312731- case Ndis802_11WEPEnabled:27322732- return "WEP";27332733- case Ndis802_11Encryption2Enabled:27342734- return "TKIP";27352735- case Ndis802_11Encryption3Enabled:27362736- return "AES";27372737- case Ndis802_11Encryption4Enabled:27382738- return "TKIPAES";27392739-#ifndef RT30xx27402740- default:27412741- return "UNKNOW";27422742-#endif27432743- }27442744-}27452745-27462746-INT RTMPShowCfgValue(27472747- IN PRTMP_ADAPTER pAd,27482748- IN PUCHAR pName,27492749- IN PUCHAR pBuf)27502750-{27512751- INT Status = 0;27522752-27532753- for (PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC = RTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC; PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name; PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC++)27542754- {27552755- if (!strcmp(pName, PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name))27562756- {27572757- if(PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->show_proc(pAd, pBuf))27582758- Status = -EINVAL;27592759- break; //Exit for loop.27602760- }27612761- }27622762-27632763- if(PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name == NULL)27642764- {27652765- sprintf(pBuf, "\n");27662766- for (PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC = RTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC; PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name; PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC++)27672767-#ifndef RT30xx27682768- sprintf(pBuf + strlen(pBuf), "%s\n", PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name);27692769-#endif27702770-#ifdef RT30xx27712771- sprintf(pBuf, "%s%s\n", pBuf, PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name);27722772-#endif27732773- }27742774-27752775- return Status;27762776-}27772777-27782778-INT Show_SSID_Proc(27792779- IN PRTMP_ADAPTER pAd,27802780- OUT PUCHAR pBuf)27812781-{27822782- sprintf(pBuf, "\t%s", pAd->CommonCfg.Ssid);27832783- return 0;27842784-}27852785-27862786-INT Show_WirelessMode_Proc(27872787- IN PRTMP_ADAPTER pAd,27882788- OUT PUCHAR pBuf)27892789-{27902790- switch(pAd->CommonCfg.PhyMode)27912791- {27922792- case PHY_11BG_MIXED:27932793- sprintf(pBuf, "\t11B/G");27942794- break;27952795- case PHY_11B:27962796- sprintf(pBuf, "\t11B");27972797- break;27982798- case PHY_11A:27992799- sprintf(pBuf, "\t11A");28002800- break;28012801- case PHY_11ABG_MIXED:28022802- sprintf(pBuf, "\t11A/B/G");28032803- break;28042804- case PHY_11G:28052805- sprintf(pBuf, "\t11G");28062806- break;28072807- case PHY_11ABGN_MIXED:28082808- sprintf(pBuf, "\t11A/B/G/N");28092809- break;28102810- case PHY_11N_2_4G:28112811- sprintf(pBuf, "\t11N only with 2.4G");28122812- break;28132813- case PHY_11GN_MIXED:28142814- sprintf(pBuf, "\t11G/N");28152815- break;28162816- case PHY_11AN_MIXED:28172817- sprintf(pBuf, "\t11A/N");28182818- break;28192819- case PHY_11BGN_MIXED:28202820- sprintf(pBuf, "\t11B/G/N");28212821- break;28222822- case PHY_11AGN_MIXED:28232823- sprintf(pBuf, "\t11A/G/N");28242824- break;28252825- case PHY_11N_5G:28262826- sprintf(pBuf, "\t11N only with 5G");28272827- break;28282828- default:28292829- sprintf(pBuf, "\tUnknow Value(%d)", pAd->CommonCfg.PhyMode);28302830- break;28312831- }28322832- return 0;28332833-}28342834-28352835-28362836-INT Show_TxBurst_Proc(28372837- IN PRTMP_ADAPTER pAd,28382838- OUT PUCHAR pBuf)28392839-{28402840- sprintf(pBuf, "\t%s", pAd->CommonCfg.bEnableTxBurst ? "TRUE":"FALSE");28412841- return 0;28422842-}28432843-28442844-INT Show_TxPreamble_Proc(28452845- IN PRTMP_ADAPTER pAd,28462846- OUT PUCHAR pBuf)28472847-{28482848- switch(pAd->CommonCfg.TxPreamble)28492849- {28502850- case Rt802_11PreambleShort:28512851- sprintf(pBuf, "\tShort");28522852- break;28532853- case Rt802_11PreambleLong:28542854- sprintf(pBuf, "\tLong");28552855- break;28562856- case Rt802_11PreambleAuto:28572857- sprintf(pBuf, "\tAuto");28582858- break;28592859- default:28602860- sprintf(pBuf, "\tUnknow Value(%lu)", pAd->CommonCfg.TxPreamble);28612861- break;28622862- }28632863-28642864- return 0;28652865-}28662866-28672867-INT Show_TxPower_Proc(28682868- IN PRTMP_ADAPTER pAd,28692869- OUT PUCHAR pBuf)28702870-{28712871- sprintf(pBuf, "\t%lu", pAd->CommonCfg.TxPowerPercentage);28722872- return 0;28732873-}28742874-28752875-INT Show_Channel_Proc(28762876- IN PRTMP_ADAPTER pAd,28772877- OUT PUCHAR pBuf)28782878-{28792879- sprintf(pBuf, "\t%d", pAd->CommonCfg.Channel);28802880- return 0;28812881-}28822882-28832883-INT Show_BGProtection_Proc(28842884- IN PRTMP_ADAPTER pAd,28852885- OUT PUCHAR pBuf)28862886-{28872887- switch(pAd->CommonCfg.UseBGProtection)28882888- {28892889- case 1: //Always On28902890- sprintf(pBuf, "\tON");28912891- break;28922892- case 2: //Always OFF28932893- sprintf(pBuf, "\tOFF");28942894- break;28952895- case 0: //AUTO28962896- sprintf(pBuf, "\tAuto");28972897- break;28982898- default:28992899- sprintf(pBuf, "\tUnknow Value(%lu)", pAd->CommonCfg.UseBGProtection);29002900- break;29012901- }29022902- return 0;29032903-}29042904-29052905-INT Show_RTSThreshold_Proc(29062906- IN PRTMP_ADAPTER pAd,29072907- OUT PUCHAR pBuf)29082908-{29092909- sprintf(pBuf, "\t%u", pAd->CommonCfg.RtsThreshold);29102910- return 0;29112911-}29122912-29132913-INT Show_FragThreshold_Proc(29142914- IN PRTMP_ADAPTER pAd,29152915- OUT PUCHAR pBuf)29162916-{29172917- sprintf(pBuf, "\t%u", pAd->CommonCfg.FragmentThreshold);29182918- return 0;29192919-}29202920-29212921-INT Show_HtBw_Proc(29222922- IN PRTMP_ADAPTER pAd,29232923- OUT PUCHAR pBuf)29242924-{29252925- if (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)29262926- {29272927- sprintf(pBuf, "\t40 MHz");29282928- }29292929- else29302930- {29312931- sprintf(pBuf, "\t20 MHz");29322932- }29332933- return 0;29342934-}29352935-29362936-INT Show_HtMcs_Proc(29372937- IN PRTMP_ADAPTER pAd,29382938- OUT PUCHAR pBuf)29392939-{29402940- sprintf(pBuf, "\t%u", pAd->StaCfg.DesiredTransmitSetting.field.MCS);29412941- return 0;29422942-}29432943-29442944-INT Show_HtGi_Proc(29452945- IN PRTMP_ADAPTER pAd,29462946- OUT PUCHAR pBuf)29472947-{29482948- switch(pAd->CommonCfg.RegTransmitSetting.field.ShortGI)29492949- {29502950- case GI_400:29512951- sprintf(pBuf, "\tGI_400");29522952- break;29532953- case GI_800:29542954- sprintf(pBuf, "\tGI_800");29552955- break;29562956- default:29572957- sprintf(pBuf, "\tUnknow Value(%u)", pAd->CommonCfg.RegTransmitSetting.field.ShortGI);29582958- break;29592959- }29602960- return 0;29612961-}29622962-29632963-INT Show_HtOpMode_Proc(29642964- IN PRTMP_ADAPTER pAd,29652965- OUT PUCHAR pBuf)29662966-{29672967- switch(pAd->CommonCfg.RegTransmitSetting.field.HTMODE)29682968- {29692969- case HTMODE_GF:29702970- sprintf(pBuf, "\tGF");29712971- break;29722972- case HTMODE_MM:29732973- sprintf(pBuf, "\tMM");29742974- break;29752975- default:29762976- sprintf(pBuf, "\tUnknow Value(%u)", pAd->CommonCfg.RegTransmitSetting.field.HTMODE);29772977- break;29782978- }29792979- return 0;29802980-}29812981-29822982-INT Show_HtExtcha_Proc(29832983- IN PRTMP_ADAPTER pAd,29842984- OUT PUCHAR pBuf)29852985-{29862986- switch(pAd->CommonCfg.RegTransmitSetting.field.EXTCHA)29872987- {29882988- case EXTCHA_BELOW:29892989- sprintf(pBuf, "\tBelow");29902990- break;29912991- case EXTCHA_ABOVE:29922992- sprintf(pBuf, "\tAbove");29932993- break;29942994- default:29952995- sprintf(pBuf, "\tUnknow Value(%u)", pAd->CommonCfg.RegTransmitSetting.field.EXTCHA);29962996- break;29972997- }29982998- return 0;29992999-}30003000-30013001-30023002-INT Show_HtMpduDensity_Proc(30033003- IN PRTMP_ADAPTER pAd,30043004- OUT PUCHAR pBuf)30053005-{30063006- sprintf(pBuf, "\t%u", pAd->CommonCfg.BACapability.field.MpduDensity);30073007- return 0;30083008-}30093009-30103010-INT Show_HtBaWinSize_Proc(30113011- IN PRTMP_ADAPTER pAd,30123012- OUT PUCHAR pBuf)30133013-{30143014- sprintf(pBuf, "\t%u", pAd->CommonCfg.BACapability.field.RxBAWinLimit);30153015- return 0;30163016-}30173017-30183018-INT Show_HtRdg_Proc(30193019- IN PRTMP_ADAPTER pAd,30203020- OUT PUCHAR pBuf)30213021-{30223022- sprintf(pBuf, "\t%s", pAd->CommonCfg.bRdg ? "TRUE":"FALSE");30233023- return 0;30243024-}30253025-30263026-INT Show_HtAmsdu_Proc(30273027- IN PRTMP_ADAPTER pAd,30283028- OUT PUCHAR pBuf)30293029-{30303030- sprintf(pBuf, "\t%s", pAd->CommonCfg.BACapability.field.AmsduEnable ? "TRUE":"FALSE");30313031- return 0;30323032-}30333033-30343034-INT Show_HtAutoBa_Proc(30353035- IN PRTMP_ADAPTER pAd,30363036- OUT PUCHAR pBuf)30373037-{30383038- sprintf(pBuf, "\t%s", pAd->CommonCfg.BACapability.field.AutoBA ? "TRUE":"FALSE");30393039- return 0;30403040-}30413041-30423042-INT Show_CountryRegion_Proc(30433043- IN PRTMP_ADAPTER pAd,30443044- OUT PUCHAR pBuf)30453045-{30463046- sprintf(pBuf, "\t%d", pAd->CommonCfg.CountryRegion);30473047- return 0;30483048-}30493049-30503050-INT Show_CountryRegionABand_Proc(30513051- IN PRTMP_ADAPTER pAd,30523052- OUT PUCHAR pBuf)30533053-{30543054- sprintf(pBuf, "\t%d", pAd->CommonCfg.CountryRegionForABand);30553055- return 0;30563056-}30573057-30583058-INT Show_CountryCode_Proc(30593059- IN PRTMP_ADAPTER pAd,30603060- OUT PUCHAR pBuf)30613061-{30623062- sprintf(pBuf, "\t%s", pAd->CommonCfg.CountryCode);30633063- return 0;30643064-}30653065-30663066-#ifdef AGGREGATION_SUPPORT30673067-INT Show_PktAggregate_Proc(30683068- IN PRTMP_ADAPTER pAd,30693069- OUT PUCHAR pBuf)30703070-{30713071- sprintf(pBuf, "\t%s", pAd->CommonCfg.bAggregationCapable ? "TRUE":"FALSE");30723072- return 0;30733073-}30743074-#endif // AGGREGATION_SUPPORT //30753075-30763076-#ifdef WMM_SUPPORT30773077-INT Show_WmmCapable_Proc(30783078- IN PRTMP_ADAPTER pAd,30793079- OUT PUCHAR pBuf)30803080-{30813081- sprintf(pBuf, "\t%s", pAd->CommonCfg.bWmmCapable ? "TRUE":"FALSE");30823082-30833083- return 0;30843084-}30853085-#endif // WMM_SUPPORT //30863086-30873087-INT Show_IEEE80211H_Proc(30883088- IN PRTMP_ADAPTER pAd,30893089- OUT PUCHAR pBuf)30903090-{30913091- sprintf(pBuf, "\t%s", pAd->CommonCfg.bIEEE80211H ? "TRUE":"FALSE");30923092- return 0;30933093-}30943094-30953095-INT Show_NetworkType_Proc(30963096- IN PRTMP_ADAPTER pAd,30973097- OUT PUCHAR pBuf)30983098-{30993099- switch(pAd->StaCfg.BssType)31003100- {31013101- case BSS_ADHOC:31023102- sprintf(pBuf, "\tAdhoc");31033103- break;31043104- case BSS_INFRA:31053105- sprintf(pBuf, "\tInfra");31063106- break;31073107- case BSS_ANY:31083108- sprintf(pBuf, "\tAny");31093109- break;31103110- case BSS_MONITOR:31113111- sprintf(pBuf, "\tMonitor");31123112- break;31133113- default:31143114- sprintf(pBuf, "\tUnknow Value(%d)", pAd->StaCfg.BssType);31153115- break;31163116- }31173117- return 0;31183118-}31193119-31203120-INT Show_AuthMode_Proc(31213121- IN PRTMP_ADAPTER pAd,31223122- OUT PUCHAR pBuf)31233123-{31243124- NDIS_802_11_AUTHENTICATION_MODE AuthMode = Ndis802_11AuthModeOpen;31253125-31263126- AuthMode = pAd->StaCfg.AuthMode;31273127-31283128- if ((AuthMode >= Ndis802_11AuthModeOpen) &&31293129- (AuthMode <= Ndis802_11AuthModeWPA1PSKWPA2PSK))31303130- sprintf(pBuf, "\t%s", RTMPGetRalinkAuthModeStr(AuthMode));31313131- else31323132- sprintf(pBuf, "\tUnknow Value(%d)", AuthMode);31333133-31343134- return 0;31353135-}31363136-31373137-INT Show_EncrypType_Proc(31383138- IN PRTMP_ADAPTER pAd,31393139- OUT PUCHAR pBuf)31403140-{31413141- NDIS_802_11_WEP_STATUS WepStatus = Ndis802_11WEPDisabled;31423142-31433143- WepStatus = pAd->StaCfg.WepStatus;31443144-31453145- if ((WepStatus >= Ndis802_11WEPEnabled) &&31463146- (WepStatus <= Ndis802_11Encryption4KeyAbsent))31473147- sprintf(pBuf, "\t%s", RTMPGetRalinkEncryModeStr(WepStatus));31483148- else31493149- sprintf(pBuf, "\tUnknow Value(%d)", WepStatus);31503150-31513151- return 0;31523152-}31533153-31543154-INT Show_DefaultKeyID_Proc(31553155- IN PRTMP_ADAPTER pAd,31563156- OUT PUCHAR pBuf)31573157-{31583158- UCHAR DefaultKeyId = 0;31593159-31603160- DefaultKeyId = pAd->StaCfg.DefaultKeyId;31613161-31623162- sprintf(pBuf, "\t%d", DefaultKeyId);31633163-31643164- return 0;31653165-}31663166-31673167-INT Show_WepKey_Proc(31683168- IN PRTMP_ADAPTER pAd,31693169- IN INT KeyIdx,31703170- OUT PUCHAR pBuf)31713171-{31723172- UCHAR Key[16] = {0}, KeyLength = 0;31733173- INT index = BSS0;31743174-31753175- KeyLength = pAd->SharedKey[index][KeyIdx].KeyLen;31763176- NdisMoveMemory(Key, pAd->SharedKey[index][KeyIdx].Key, KeyLength);31773177-31783178- //check key string is ASCII or not31793179- if (RTMPCheckStrPrintAble(Key, KeyLength))31803180- sprintf(pBuf, "\t%s", Key);31813181- else31823182- {31833183- int idx;31843184- sprintf(pBuf, "\t");31853185- for (idx = 0; idx < KeyLength; idx++)31863186- sprintf(pBuf+strlen(pBuf), "%02X", Key[idx]);31873187- }31883188- return 0;31893189-}31903190-31913191-INT Show_Key1_Proc(31923192- IN PRTMP_ADAPTER pAd,31933193- OUT PUCHAR pBuf)31943194-{31953195- Show_WepKey_Proc(pAd, 0, pBuf);31963196- return 0;31973197-}31983198-31993199-INT Show_Key2_Proc(32003200- IN PRTMP_ADAPTER pAd,32013201- OUT PUCHAR pBuf)32023202-{32033203- Show_WepKey_Proc(pAd, 1, pBuf);32043204- return 0;32053205-}32063206-32073207-INT Show_Key3_Proc(32083208- IN PRTMP_ADAPTER pAd,32093209- OUT PUCHAR pBuf)32103210-{32113211- Show_WepKey_Proc(pAd, 2, pBuf);32123212- return 0;32133213-}32143214-32153215-INT Show_Key4_Proc(32163216- IN PRTMP_ADAPTER pAd,32173217- OUT PUCHAR pBuf)32183218-{32193219- Show_WepKey_Proc(pAd, 3, pBuf);32203220- return 0;32213221-}32223222-32233223-INT Show_WPAPSK_Proc(32243224- IN PRTMP_ADAPTER pAd,32253225- OUT PUCHAR pBuf)32263226-{32273227- INT idx;32283228- UCHAR PMK[32] = {0};32293229-32303230- NdisMoveMemory(PMK, pAd->StaCfg.PMK, 32);32313231-32323232- sprintf(pBuf, "\tPMK = ");32333233- for (idx = 0; idx < 32; idx++)32343234- sprintf(pBuf+strlen(pBuf), "%02X", PMK[idx]);32353235-32363236- return 0;32373237-}32383238-11+#include "../../rt2860/common/cmm_info.c"
+1-1238
drivers/staging/rt2870/common/cmm_sanity.c
···11-/*22- *************************************************************************33- * Ralink Tech Inc.44- * 5F., No.36, Taiyuan St., Jhubei City,55- * Hsinchu County 302,66- * Taiwan, R.O.C.77- *88- * (c) Copyright 2002-2007, Ralink Technology, Inc.99- *1010- * This program is free software; you can redistribute it and/or modify *1111- * it under the terms of the GNU General Public License as published by *1212- * the Free Software Foundation; either version 2 of the License, or *1313- * (at your option) any later version. *1414- * *1515- * This program is distributed in the hope that it will be useful, *1616- * but WITHOUT ANY WARRANTY; without even the implied warranty of *1717- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *1818- * GNU General Public License for more details. *1919- * *2020- * You should have received a copy of the GNU General Public License *2121- * along with this program; if not, write to the *2222- * Free Software Foundation, Inc., *2323- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *2424- * *2525- *************************************************************************2626-2727- Module Name:2828- sanity.c2929-3030- Abstract:3131-3232- Revision History:3333- Who When What3434- -------- ---------- ----------------------------------------------3535- John Chang 2004-09-01 add WMM support3636-*/3737-#include "../rt_config.h"3838-3939-4040-extern UCHAR CISCO_OUI[];4141-4242-extern UCHAR WPA_OUI[];4343-extern UCHAR RSN_OUI[];4444-extern UCHAR WME_INFO_ELEM[];4545-extern UCHAR WME_PARM_ELEM[];4646-extern UCHAR Ccx2QosInfo[];4747-extern UCHAR RALINK_OUI[];4848-extern UCHAR BROADCOM_OUI[];4949-extern UCHAR WPS_OUI[];5050-5151-/*5252- ==========================================================================5353- Description:5454- MLME message sanity check5555- Return:5656- TRUE if all parameters are OK, FALSE otherwise5757-5858- IRQL = DISPATCH_LEVEL5959-6060- ==========================================================================6161- */6262-BOOLEAN MlmeAddBAReqSanity(6363- IN PRTMP_ADAPTER pAd,6464- IN VOID *Msg,6565- IN ULONG MsgLen,6666- OUT PUCHAR pAddr2)6767-{6868- PMLME_ADDBA_REQ_STRUCT pInfo;6969-7070- pInfo = (MLME_ADDBA_REQ_STRUCT *)Msg;7171-7272- if ((MsgLen != sizeof(MLME_ADDBA_REQ_STRUCT)))7373- {7474- DBGPRINT(RT_DEBUG_TRACE, ("MlmeAddBAReqSanity fail - message lenght not correct.\n"));7575- return FALSE;7676- }7777-7878- if ((pInfo->Wcid >= MAX_LEN_OF_MAC_TABLE))7979- {8080- DBGPRINT(RT_DEBUG_TRACE, ("MlmeAddBAReqSanity fail - The peer Mac is not associated yet.\n"));8181- return FALSE;8282- }8383-8484- if ((pInfo->pAddr[0]&0x01) == 0x01)8585- {8686- DBGPRINT(RT_DEBUG_TRACE, ("MlmeAddBAReqSanity fail - broadcast address not support BA\n"));8787- return FALSE;8888- }8989-9090- return TRUE;9191-}9292-9393-/*9494- ==========================================================================9595- Description:9696- MLME message sanity check9797- Return:9898- TRUE if all parameters are OK, FALSE otherwise9999-100100- IRQL = DISPATCH_LEVEL101101-102102- ==========================================================================103103- */104104-BOOLEAN MlmeDelBAReqSanity(105105- IN PRTMP_ADAPTER pAd,106106- IN VOID *Msg,107107- IN ULONG MsgLen)108108-{109109- MLME_DELBA_REQ_STRUCT *pInfo;110110- pInfo = (MLME_DELBA_REQ_STRUCT *)Msg;111111-112112- if ((MsgLen != sizeof(MLME_DELBA_REQ_STRUCT)))113113- {114114- DBGPRINT(RT_DEBUG_ERROR, ("MlmeDelBAReqSanity fail - message lenght not correct.\n"));115115- return FALSE;116116- }117117-118118- if ((pInfo->Wcid >= MAX_LEN_OF_MAC_TABLE))119119- {120120- DBGPRINT(RT_DEBUG_ERROR, ("MlmeDelBAReqSanity fail - The peer Mac is not associated yet.\n"));121121- return FALSE;122122- }123123-124124- if ((pInfo->TID & 0xf0))125125- {126126- DBGPRINT(RT_DEBUG_ERROR, ("MlmeDelBAReqSanity fail - The peer TID is incorrect.\n"));127127- return FALSE;128128- }129129-130130- if (NdisEqualMemory(pAd->MacTab.Content[pInfo->Wcid].Addr, pInfo->Addr, MAC_ADDR_LEN) == 0)131131- {132132- DBGPRINT(RT_DEBUG_ERROR, ("MlmeDelBAReqSanity fail - the peer addr dosen't exist.\n"));133133- return FALSE;134134- }135135-136136- return TRUE;137137-}138138-139139-BOOLEAN PeerAddBAReqActionSanity(140140- IN PRTMP_ADAPTER pAd,141141- IN VOID *pMsg,142142- IN ULONG MsgLen,143143- OUT PUCHAR pAddr2)144144-{145145- PFRAME_802_11 pFrame = (PFRAME_802_11)pMsg;146146- PFRAME_ADDBA_REQ pAddFrame;147147- pAddFrame = (PFRAME_ADDBA_REQ)(pMsg);148148- if (MsgLen < (sizeof(FRAME_ADDBA_REQ)))149149- {150150- DBGPRINT(RT_DEBUG_ERROR,("PeerAddBAReqActionSanity: ADDBA Request frame length size = %ld incorrect\n", MsgLen));151151- return FALSE;152152- }153153- // we support immediate BA.154154- *(USHORT *)(&pAddFrame->BaParm) = cpu2le16(*(USHORT *)(&pAddFrame->BaParm));155155- pAddFrame->TimeOutValue = cpu2le16(pAddFrame->TimeOutValue);156156- pAddFrame->BaStartSeq.word = cpu2le16(pAddFrame->BaStartSeq.word);157157-158158- if (pAddFrame->BaParm.BAPolicy != IMMED_BA)159159- {160160- DBGPRINT(RT_DEBUG_ERROR,("PeerAddBAReqActionSanity: ADDBA Request Ba Policy[%d] not support\n", pAddFrame->BaParm.BAPolicy));161161- DBGPRINT(RT_DEBUG_ERROR,("ADDBA Request. tid=%x, Bufsize=%x, AMSDUSupported=%x \n", pAddFrame->BaParm.TID, pAddFrame->BaParm.BufSize, pAddFrame->BaParm.AMSDUSupported));162162- return FALSE;163163- }164164-165165- // we support immediate BA.166166- if (pAddFrame->BaParm.TID &0xfff0)167167- {168168- DBGPRINT(RT_DEBUG_ERROR,("PeerAddBAReqActionSanity: ADDBA Request incorrect TID = %d\n", pAddFrame->BaParm.TID));169169- return FALSE;170170- }171171- COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);172172- return TRUE;173173-}174174-175175-BOOLEAN PeerAddBARspActionSanity(176176- IN PRTMP_ADAPTER pAd,177177- IN VOID *pMsg,178178- IN ULONG MsgLen)179179-{180180- PFRAME_ADDBA_RSP pAddFrame;181181-182182- pAddFrame = (PFRAME_ADDBA_RSP)(pMsg);183183- if (MsgLen < (sizeof(FRAME_ADDBA_RSP)))184184- {185185- DBGPRINT(RT_DEBUG_ERROR,("PeerAddBARspActionSanity: ADDBA Response frame length size = %ld incorrect\n", MsgLen));186186- return FALSE;187187- }188188- // we support immediate BA.189189- *(USHORT *)(&pAddFrame->BaParm) = cpu2le16(*(USHORT *)(&pAddFrame->BaParm));190190- pAddFrame->StatusCode = cpu2le16(pAddFrame->StatusCode);191191- pAddFrame->TimeOutValue = cpu2le16(pAddFrame->TimeOutValue);192192-193193- if (pAddFrame->BaParm.BAPolicy != IMMED_BA)194194- {195195- DBGPRINT(RT_DEBUG_ERROR,("PeerAddBAReqActionSanity: ADDBA Response Ba Policy[%d] not support\n", pAddFrame->BaParm.BAPolicy));196196- return FALSE;197197- }198198-199199- // we support immediate BA.200200- if (pAddFrame->BaParm.TID &0xfff0)201201- {202202- DBGPRINT(RT_DEBUG_ERROR,("PeerAddBARspActionSanity: ADDBA Response incorrect TID = %d\n", pAddFrame->BaParm.TID));203203- return FALSE;204204- }205205- return TRUE;206206-207207-}208208-209209-BOOLEAN PeerDelBAActionSanity(210210- IN PRTMP_ADAPTER pAd,211211- IN UCHAR Wcid,212212- IN VOID *pMsg,213213- IN ULONG MsgLen )214214-{215215- //PFRAME_802_11 pFrame = (PFRAME_802_11)pMsg;216216- PFRAME_DELBA_REQ pDelFrame;217217- if (MsgLen != (sizeof(FRAME_DELBA_REQ)))218218- return FALSE;219219-220220- if (Wcid >= MAX_LEN_OF_MAC_TABLE)221221- return FALSE;222222-223223- pDelFrame = (PFRAME_DELBA_REQ)(pMsg);224224-225225- *(USHORT *)(&pDelFrame->DelbaParm) = cpu2le16(*(USHORT *)(&pDelFrame->DelbaParm));226226- pDelFrame->ReasonCode = cpu2le16(pDelFrame->ReasonCode);227227-228228- if (pDelFrame->DelbaParm.TID &0xfff0)229229- return FALSE;230230-231231- return TRUE;232232-}233233-234234-/*235235- ==========================================================================236236- Description:237237- MLME message sanity check238238- Return:239239- TRUE if all parameters are OK, FALSE otherwise240240-241241- IRQL = DISPATCH_LEVEL242242-243243- ==========================================================================244244- */245245-BOOLEAN PeerBeaconAndProbeRspSanity(246246- IN PRTMP_ADAPTER pAd,247247- IN VOID *Msg,248248- IN ULONG MsgLen,249249- IN UCHAR MsgChannel,250250- OUT PUCHAR pAddr2,251251- OUT PUCHAR pBssid,252252- OUT CHAR Ssid[],253253- OUT UCHAR *pSsidLen,254254- OUT UCHAR *pBssType,255255- OUT USHORT *pBeaconPeriod,256256- OUT UCHAR *pChannel,257257- OUT UCHAR *pNewChannel,258258- OUT LARGE_INTEGER *pTimestamp,259259- OUT CF_PARM *pCfParm,260260- OUT USHORT *pAtimWin,261261- OUT USHORT *pCapabilityInfo,262262- OUT UCHAR *pErp,263263- OUT UCHAR *pDtimCount,264264- OUT UCHAR *pDtimPeriod,265265- OUT UCHAR *pBcastFlag,266266- OUT UCHAR *pMessageToMe,267267- OUT UCHAR SupRate[],268268- OUT UCHAR *pSupRateLen,269269- OUT UCHAR ExtRate[],270270- OUT UCHAR *pExtRateLen,271271- OUT UCHAR *pCkipFlag,272272- OUT UCHAR *pAironetCellPowerLimit,273273- OUT PEDCA_PARM pEdcaParm,274274- OUT PQBSS_LOAD_PARM pQbssLoad,275275- OUT PQOS_CAPABILITY_PARM pQosCapability,276276- OUT ULONG *pRalinkIe,277277- OUT UCHAR *pHtCapabilityLen,278278- OUT UCHAR *pPreNHtCapabilityLen,279279- OUT HT_CAPABILITY_IE *pHtCapability,280280- OUT UCHAR *AddHtInfoLen,281281- OUT ADD_HT_INFO_IE *AddHtInfo,282282- OUT UCHAR *NewExtChannelOffset, // Ht extension channel offset(above or below)283283- OUT USHORT *LengthVIE,284284- OUT PNDIS_802_11_VARIABLE_IEs pVIE)285285-{286286- CHAR *Ptr;287287- CHAR TimLen;288288- PFRAME_802_11 pFrame;289289- PEID_STRUCT pEid;290290- UCHAR SubType;291291- UCHAR Sanity;292292- //UCHAR ECWMin, ECWMax;293293- //MAC_CSR9_STRUC Csr9;294294- ULONG Length = 0;295295-296296- // For some 11a AP which didn't have DS_IE, we use two conditions to decide the channel297297- // 1. If the AP is 11n enabled, then check the control channel.298298- // 2. If the AP didn't have any info about channel, use the channel we received this frame as the channel. (May inaccuracy!!)299299- UCHAR CtrlChannel = 0;300300-301301- // Add for 3 necessary EID field check302302- Sanity = 0;303303-304304- *pAtimWin = 0;305305- *pErp = 0;306306- *pDtimCount = 0;307307- *pDtimPeriod = 0;308308- *pBcastFlag = 0;309309- *pMessageToMe = 0;310310- *pExtRateLen = 0;311311- *pCkipFlag = 0; // Default of CkipFlag is 0312312- *pAironetCellPowerLimit = 0xFF; // Default of AironetCellPowerLimit is 0xFF313313- *LengthVIE = 0; // Set the length of VIE to init value 0314314- *pHtCapabilityLen = 0; // Set the length of VIE to init value 0315315- if (pAd->OpMode == OPMODE_STA)316316- *pPreNHtCapabilityLen = 0; // Set the length of VIE to init value 0317317- *AddHtInfoLen = 0; // Set the length of VIE to init value 0318318- *pRalinkIe = 0;319319- *pNewChannel = 0;320320- *NewExtChannelOffset = 0xff; //Default 0xff means no such IE321321- pCfParm->bValid = FALSE; // default: no IE_CF found322322- pQbssLoad->bValid = FALSE; // default: no IE_QBSS_LOAD found323323- pEdcaParm->bValid = FALSE; // default: no IE_EDCA_PARAMETER found324324- pQosCapability->bValid = FALSE; // default: no IE_QOS_CAPABILITY found325325-326326- pFrame = (PFRAME_802_11)Msg;327327-328328- // get subtype from header329329- SubType = (UCHAR)pFrame->Hdr.FC.SubType;330330-331331- // get Addr2 and BSSID from header332332- COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);333333- COPY_MAC_ADDR(pBssid, pFrame->Hdr.Addr3);334334-335335- Ptr = pFrame->Octet;336336- Length += LENGTH_802_11;337337-338338- // get timestamp from payload and advance the pointer339339- NdisMoveMemory(pTimestamp, Ptr, TIMESTAMP_LEN);340340-341341- pTimestamp->u.LowPart = cpu2le32(pTimestamp->u.LowPart);342342- pTimestamp->u.HighPart = cpu2le32(pTimestamp->u.HighPart);343343-344344- Ptr += TIMESTAMP_LEN;345345- Length += TIMESTAMP_LEN;346346-347347- // get beacon interval from payload and advance the pointer348348- NdisMoveMemory(pBeaconPeriod, Ptr, 2);349349- Ptr += 2;350350- Length += 2;351351-352352- // get capability info from payload and advance the pointer353353- NdisMoveMemory(pCapabilityInfo, Ptr, 2);354354- Ptr += 2;355355- Length += 2;356356-357357- if (CAP_IS_ESS_ON(*pCapabilityInfo))358358- *pBssType = BSS_INFRA;359359- else360360- *pBssType = BSS_ADHOC;361361-362362- pEid = (PEID_STRUCT) Ptr;363363-364364- // get variable fields from payload and advance the pointer365365- while ((Length + 2 + pEid->Len) <= MsgLen)366366- {367367- //368368- // Secure copy VIE to VarIE[MAX_VIE_LEN] didn't overflow.369369- //370370- if ((*LengthVIE + pEid->Len + 2) >= MAX_VIE_LEN)371371- {372372- DBGPRINT(RT_DEBUG_WARN, ("PeerBeaconAndProbeRspSanity - Variable IEs out of resource [len(=%d) > MAX_VIE_LEN(=%d)]\n",373373- (*LengthVIE + pEid->Len + 2), MAX_VIE_LEN));374374- break;375375- }376376-377377- switch(pEid->Eid)378378- {379379- case IE_SSID:380380- // Already has one SSID EID in this beacon, ignore the second one381381- if (Sanity & 0x1)382382- break;383383- if(pEid->Len <= MAX_LEN_OF_SSID)384384- {385385- NdisMoveMemory(Ssid, pEid->Octet, pEid->Len);386386- *pSsidLen = pEid->Len;387387- Sanity |= 0x1;388388- }389389- else390390- {391391- DBGPRINT(RT_DEBUG_TRACE, ("PeerBeaconAndProbeRspSanity - wrong IE_SSID (len=%d)\n",pEid->Len));392392- return FALSE;393393- }394394- break;395395-396396- case IE_SUPP_RATES:397397- if(pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES)398398- {399399- Sanity |= 0x2;400400- NdisMoveMemory(SupRate, pEid->Octet, pEid->Len);401401- *pSupRateLen = pEid->Len;402402-403403- // TODO: 2004-09-14 not a good design here, cause it exclude extra rates404404- // from ScanTab. We should report as is. And filter out unsupported405405- // rates in MlmeAux.406406- // Check against the supported rates407407- // RTMPCheckRates(pAd, SupRate, pSupRateLen);408408- }409409- else410410- {411411- DBGPRINT(RT_DEBUG_TRACE, ("PeerBeaconAndProbeRspSanity - wrong IE_SUPP_RATES (len=%d)\n",pEid->Len));412412- return FALSE;413413- }414414- break;415415-416416- case IE_HT_CAP:417417- if (pEid->Len >= SIZE_HT_CAP_IE) //Note: allow extension.!!418418- {419419- NdisMoveMemory(pHtCapability, pEid->Octet, sizeof(HT_CAPABILITY_IE));420420- *pHtCapabilityLen = SIZE_HT_CAP_IE; // Nnow we only support 26 bytes.421421-422422- *(USHORT *)(&pHtCapability->HtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->HtCapInfo));423423- *(USHORT *)(&pHtCapability->ExtHtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->ExtHtCapInfo));424424-425425- {426426- *pPreNHtCapabilityLen = 0; // Nnow we only support 26 bytes.427427-428428- Ptr = (PUCHAR) pVIE;429429- NdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2);430430- *LengthVIE += (pEid->Len + 2);431431- }432432- }433433- else434434- {435435- DBGPRINT(RT_DEBUG_WARN, ("PeerBeaconAndProbeRspSanity - wrong IE_HT_CAP. pEid->Len = %d\n", pEid->Len));436436- }437437-438438- break;439439- case IE_ADD_HT:440440- if (pEid->Len >= sizeof(ADD_HT_INFO_IE))441441- {442442- // This IE allows extension, but we can ignore extra bytes beyond our knowledge , so only443443- // copy first sizeof(ADD_HT_INFO_IE)444444- NdisMoveMemory(AddHtInfo, pEid->Octet, sizeof(ADD_HT_INFO_IE));445445- *AddHtInfoLen = SIZE_ADD_HT_INFO_IE;446446-447447- CtrlChannel = AddHtInfo->ControlChan;448448-449449- *(USHORT *)(&AddHtInfo->AddHtInfo2) = cpu2le16(*(USHORT *)(&AddHtInfo->AddHtInfo2));450450- *(USHORT *)(&AddHtInfo->AddHtInfo3) = cpu2le16(*(USHORT *)(&AddHtInfo->AddHtInfo3));451451-452452- {453453- Ptr = (PUCHAR) pVIE;454454- NdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2);455455- *LengthVIE += (pEid->Len + 2);456456- }457457- }458458- else459459- {460460- DBGPRINT(RT_DEBUG_WARN, ("PeerBeaconAndProbeRspSanity - wrong IE_ADD_HT. \n"));461461- }462462-463463- break;464464- case IE_SECONDARY_CH_OFFSET:465465- if (pEid->Len == 1)466466- {467467- *NewExtChannelOffset = pEid->Octet[0];468468- }469469- else470470- {471471- DBGPRINT(RT_DEBUG_WARN, ("PeerBeaconAndProbeRspSanity - wrong IE_SECONDARY_CH_OFFSET. \n"));472472- }473473-474474- break;475475- case IE_FH_PARM:476476- DBGPRINT(RT_DEBUG_TRACE, ("PeerBeaconAndProbeRspSanity(IE_FH_PARM) \n"));477477- break;478478-479479- case IE_DS_PARM:480480- if(pEid->Len == 1)481481- {482482- *pChannel = *pEid->Octet;483483-484484- {485485- if (ChannelSanity(pAd, *pChannel) == 0)486486- {487487-488488- return FALSE;489489- }490490- }491491-492492- Sanity |= 0x4;493493- }494494- else495495- {496496- DBGPRINT(RT_DEBUG_TRACE, ("PeerBeaconAndProbeRspSanity - wrong IE_DS_PARM (len=%d)\n",pEid->Len));497497- return FALSE;498498- }499499- break;500500-501501- case IE_CF_PARM:502502- if(pEid->Len == 6)503503- {504504- pCfParm->bValid = TRUE;505505- pCfParm->CfpCount = pEid->Octet[0];506506- pCfParm->CfpPeriod = pEid->Octet[1];507507- pCfParm->CfpMaxDuration = pEid->Octet[2] + 256 * pEid->Octet[3];508508- pCfParm->CfpDurRemaining = pEid->Octet[4] + 256 * pEid->Octet[5];509509- }510510- else511511- {512512- DBGPRINT(RT_DEBUG_TRACE, ("PeerBeaconAndProbeRspSanity - wrong IE_CF_PARM\n"));513513- return FALSE;514514- }515515- break;516516-517517- case IE_IBSS_PARM:518518- if(pEid->Len == 2)519519- {520520- NdisMoveMemory(pAtimWin, pEid->Octet, pEid->Len);521521- }522522- else523523- {524524- DBGPRINT(RT_DEBUG_TRACE, ("PeerBeaconAndProbeRspSanity - wrong IE_IBSS_PARM\n"));525525- return FALSE;526526- }527527- break;528528-529529- case IE_TIM:530530- if(INFRA_ON(pAd) && SubType == SUBTYPE_BEACON)531531- {532532- GetTimBit((PUCHAR)pEid, pAd->StaActive.Aid, &TimLen, pBcastFlag, pDtimCount, pDtimPeriod, pMessageToMe);533533- }534534- break;535535-536536- case IE_CHANNEL_SWITCH_ANNOUNCEMENT:537537- if(pEid->Len == 3)538538- {539539- *pNewChannel = pEid->Octet[1]; //extract new channel number540540- }541541- break;542542-543543- // New for WPA544544- // CCX v2 has the same IE, we need to parse that too545545- // Wifi WMM use the same IE vale, need to parse that too546546- // case IE_WPA:547547- case IE_VENDOR_SPECIFIC:548548- // Check the OUI version, filter out non-standard usage549549- if (NdisEqualMemory(pEid->Octet, RALINK_OUI, 3) && (pEid->Len == 7))550550- {551551- //*pRalinkIe = pEid->Octet[3];552552- if (pEid->Octet[3] != 0)553553- *pRalinkIe = pEid->Octet[3];554554- else555555- *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.556556- }557557- // This HT IE is before IEEE draft set HT IE value.2006-09-28 by Jan.558558-559559- // Other vendors had production before IE_HT_CAP value is assigned. To backward support those old-firmware AP,560560- // Check broadcom-defiend pre-802.11nD1.0 OUI for HT related IE, including HT Capatilities IE and HT Information IE561561- else if ((*pHtCapabilityLen == 0) && NdisEqualMemory(pEid->Octet, PRE_N_HT_OUI, 3) && (pEid->Len >= 4) && (pAd->OpMode == OPMODE_STA))562562- {563563- if ((pEid->Octet[3] == OUI_PREN_HT_CAP) && (pEid->Len >= 30) && (*pHtCapabilityLen == 0))564564- {565565- NdisMoveMemory(pHtCapability, &pEid->Octet[4], sizeof(HT_CAPABILITY_IE));566566- *pPreNHtCapabilityLen = SIZE_HT_CAP_IE;567567- }568568-569569- if ((pEid->Octet[3] == OUI_PREN_ADD_HT) && (pEid->Len >= 26))570570- {571571- NdisMoveMemory(AddHtInfo, &pEid->Octet[4], sizeof(ADD_HT_INFO_IE));572572- *AddHtInfoLen = SIZE_ADD_HT_INFO_IE;573573- }574574- }575575- else if (NdisEqualMemory(pEid->Octet, WPA_OUI, 4))576576- {577577- // Copy to pVIE which will report to microsoft bssid list.578578- Ptr = (PUCHAR) pVIE;579579- NdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2);580580- *LengthVIE += (pEid->Len + 2);581581- }582582- else if (NdisEqualMemory(pEid->Octet, WME_PARM_ELEM, 6) && (pEid->Len == 24))583583- {584584- PUCHAR ptr;585585- int i;586586-587587- // parsing EDCA parameters588588- pEdcaParm->bValid = TRUE;589589- pEdcaParm->bQAck = FALSE; // pEid->Octet[0] & 0x10;590590- pEdcaParm->bQueueRequest = FALSE; // pEid->Octet[0] & 0x20;591591- pEdcaParm->bTxopRequest = FALSE; // pEid->Octet[0] & 0x40;592592- pEdcaParm->EdcaUpdateCount = pEid->Octet[6] & 0x0f;593593- pEdcaParm->bAPSDCapable = (pEid->Octet[6] & 0x80) ? 1 : 0;594594- ptr = &pEid->Octet[8];595595- for (i=0; i<4; i++)596596- {597597- UCHAR aci = (*ptr & 0x60) >> 5; // b5~6 is AC INDEX598598- pEdcaParm->bACM[aci] = (((*ptr) & 0x10) == 0x10); // b5 is ACM599599- pEdcaParm->Aifsn[aci] = (*ptr) & 0x0f; // b0~3 is AIFSN600600- pEdcaParm->Cwmin[aci] = *(ptr+1) & 0x0f; // b0~4 is Cwmin601601- pEdcaParm->Cwmax[aci] = *(ptr+1) >> 4; // b5~8 is Cwmax602602- pEdcaParm->Txop[aci] = *(ptr+2) + 256 * (*(ptr+3)); // in unit of 32-us603603- ptr += 4; // point to next AC604604- }605605- }606606- else if (NdisEqualMemory(pEid->Octet, WME_INFO_ELEM, 6) && (pEid->Len == 7))607607- {608608- // parsing EDCA parameters609609- pEdcaParm->bValid = TRUE;610610- pEdcaParm->bQAck = FALSE; // pEid->Octet[0] & 0x10;611611- pEdcaParm->bQueueRequest = FALSE; // pEid->Octet[0] & 0x20;612612- pEdcaParm->bTxopRequest = FALSE; // pEid->Octet[0] & 0x40;613613- pEdcaParm->EdcaUpdateCount = pEid->Octet[6] & 0x0f;614614- pEdcaParm->bAPSDCapable = (pEid->Octet[6] & 0x80) ? 1 : 0;615615-616616- // use default EDCA parameter617617- pEdcaParm->bACM[QID_AC_BE] = 0;618618- pEdcaParm->Aifsn[QID_AC_BE] = 3;619619- pEdcaParm->Cwmin[QID_AC_BE] = CW_MIN_IN_BITS;620620- pEdcaParm->Cwmax[QID_AC_BE] = CW_MAX_IN_BITS;621621- pEdcaParm->Txop[QID_AC_BE] = 0;622622-623623- pEdcaParm->bACM[QID_AC_BK] = 0;624624- pEdcaParm->Aifsn[QID_AC_BK] = 7;625625- pEdcaParm->Cwmin[QID_AC_BK] = CW_MIN_IN_BITS;626626- pEdcaParm->Cwmax[QID_AC_BK] = CW_MAX_IN_BITS;627627- pEdcaParm->Txop[QID_AC_BK] = 0;628628-629629- pEdcaParm->bACM[QID_AC_VI] = 0;630630- pEdcaParm->Aifsn[QID_AC_VI] = 2;631631- pEdcaParm->Cwmin[QID_AC_VI] = CW_MIN_IN_BITS-1;632632- pEdcaParm->Cwmax[QID_AC_VI] = CW_MAX_IN_BITS;633633- pEdcaParm->Txop[QID_AC_VI] = 96; // AC_VI: 96*32us ~= 3ms634634-635635- pEdcaParm->bACM[QID_AC_VO] = 0;636636- pEdcaParm->Aifsn[QID_AC_VO] = 2;637637- pEdcaParm->Cwmin[QID_AC_VO] = CW_MIN_IN_BITS-2;638638- pEdcaParm->Cwmax[QID_AC_VO] = CW_MAX_IN_BITS-1;639639- pEdcaParm->Txop[QID_AC_VO] = 48; // AC_VO: 48*32us ~= 1.5ms640640- }641641- break;642642-643643- case IE_EXT_SUPP_RATES:644644- if (pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES)645645- {646646- NdisMoveMemory(ExtRate, pEid->Octet, pEid->Len);647647- *pExtRateLen = pEid->Len;648648-649649- // TODO: 2004-09-14 not a good design here, cause it exclude extra rates650650- // from ScanTab. We should report as is. And filter out unsupported651651- // rates in MlmeAux.652652- // Check against the supported rates653653- // RTMPCheckRates(pAd, ExtRate, pExtRateLen);654654- }655655- break;656656-657657- case IE_ERP:658658- if (pEid->Len == 1)659659- {660660- *pErp = (UCHAR)pEid->Octet[0];661661- }662662- break;663663-664664- case IE_AIRONET_CKIP:665665- // 0. Check Aironet IE length, it must be larger or equal to 28666666- // Cisco AP350 used length as 28667667- // Cisco AP12XX used length as 30668668- if (pEid->Len < (CKIP_NEGOTIATION_LENGTH - 2))669669- break;670670-671671- // 1. Copy CKIP flag byte to buffer for process672672- *pCkipFlag = *(pEid->Octet + 8);673673- break;674674-675675- case IE_AP_TX_POWER:676676- // AP Control of Client Transmit Power677677- //0. Check Aironet IE length, it must be 6678678- if (pEid->Len != 0x06)679679- break;680680-681681- // Get cell power limit in dBm682682- if (NdisEqualMemory(pEid->Octet, CISCO_OUI, 3) == 1)683683- *pAironetCellPowerLimit = *(pEid->Octet + 4);684684- break;685685-686686- // WPA2 & 802.11i RSN687687- case IE_RSN:688688- // There is no OUI for version anymore, check the group cipher OUI before copying689689- if (RTMPEqualMemory(pEid->Octet + 2, RSN_OUI, 3))690690- {691691- // Copy to pVIE which will report to microsoft bssid list.692692- Ptr = (PUCHAR) pVIE;693693- NdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2);694694- *LengthVIE += (pEid->Len + 2);695695- }696696- break;697697-698698- default:699699- break;700700- }701701-702702- Length = Length + 2 + pEid->Len; // Eid[1] + Len[1]+ content[Len]703703- pEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len);704704- }705705-706706- // For some 11a AP. it did not have the channel EID, patch here707707- {708708- UCHAR LatchRfChannel = MsgChannel;709709- if ((pAd->LatchRfRegs.Channel > 14) && ((Sanity & 0x4) == 0))710710- {711711- if (CtrlChannel != 0)712712- *pChannel = CtrlChannel;713713- else714714- *pChannel = LatchRfChannel;715715- Sanity |= 0x4;716716- }717717- }718718-719719- if (Sanity != 0x7)720720- {721721- DBGPRINT(RT_DEBUG_WARN, ("PeerBeaconAndProbeRspSanity - missing field, Sanity=0x%02x\n", Sanity));722722- return FALSE;723723- }724724- else725725- {726726- return TRUE;727727- }728728-729729-}730730-731731-/*732732- ==========================================================================733733- Description:734734- MLME message sanity check735735- Return:736736- TRUE if all parameters are OK, FALSE otherwise737737- ==========================================================================738738- */739739-BOOLEAN MlmeScanReqSanity(740740- IN PRTMP_ADAPTER pAd,741741- IN VOID *Msg,742742- IN ULONG MsgLen,743743- OUT UCHAR *pBssType,744744- OUT CHAR Ssid[],745745- OUT UCHAR *pSsidLen,746746- OUT UCHAR *pScanType)747747-{748748- MLME_SCAN_REQ_STRUCT *Info;749749-750750- Info = (MLME_SCAN_REQ_STRUCT *)(Msg);751751- *pBssType = Info->BssType;752752- *pSsidLen = Info->SsidLen;753753- NdisMoveMemory(Ssid, Info->Ssid, *pSsidLen);754754- *pScanType = Info->ScanType;755755-756756- if ((*pBssType == BSS_INFRA || *pBssType == BSS_ADHOC || *pBssType == BSS_ANY)757757- && (*pScanType == SCAN_ACTIVE || *pScanType == SCAN_PASSIVE758758- || *pScanType == SCAN_CISCO_PASSIVE || *pScanType == SCAN_CISCO_ACTIVE759759- || *pScanType == SCAN_CISCO_CHANNEL_LOAD || *pScanType == SCAN_CISCO_NOISE760760- ))761761- {762762- return TRUE;763763- }764764- else765765- {766766- DBGPRINT(RT_DEBUG_TRACE, ("MlmeScanReqSanity fail - wrong BssType or ScanType\n"));767767- return FALSE;768768- }769769-}770770-771771-// IRQL = DISPATCH_LEVEL772772-UCHAR ChannelSanity(773773- IN PRTMP_ADAPTER pAd,774774- IN UCHAR channel)775775-{776776- int i;777777-778778- for (i = 0; i < pAd->ChannelListNum; i ++)779779- {780780- if (channel == pAd->ChannelList[i].Channel)781781- return 1;782782- }783783- return 0;784784-}785785-786786-/*787787- ==========================================================================788788- Description:789789- MLME message sanity check790790- Return:791791- TRUE if all parameters are OK, FALSE otherwise792792-793793- IRQL = DISPATCH_LEVEL794794-795795- ==========================================================================796796- */797797-BOOLEAN PeerDeauthSanity(798798- IN PRTMP_ADAPTER pAd,799799- IN VOID *Msg,800800- IN ULONG MsgLen,801801- OUT PUCHAR pAddr2,802802- OUT USHORT *pReason)803803-{804804- PFRAME_802_11 pFrame = (PFRAME_802_11)Msg;805805-806806- COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);807807- NdisMoveMemory(pReason, &pFrame->Octet[0], 2);808808-809809- return TRUE;810810-}811811-812812-/*813813- ==========================================================================814814- Description:815815- MLME message sanity check816816- Return:817817- TRUE if all parameters are OK, FALSE otherwise818818-819819- IRQL = DISPATCH_LEVEL820820-821821- ==========================================================================822822- */823823-BOOLEAN PeerAuthSanity(824824- IN PRTMP_ADAPTER pAd,825825- IN VOID *Msg,826826- IN ULONG MsgLen,827827- OUT PUCHAR pAddr,828828- OUT USHORT *pAlg,829829- OUT USHORT *pSeq,830830- OUT USHORT *pStatus,831831- CHAR *pChlgText)832832-{833833- PFRAME_802_11 pFrame = (PFRAME_802_11)Msg;834834-835835- COPY_MAC_ADDR(pAddr, pFrame->Hdr.Addr2);836836- NdisMoveMemory(pAlg, &pFrame->Octet[0], 2);837837- NdisMoveMemory(pSeq, &pFrame->Octet[2], 2);838838- NdisMoveMemory(pStatus, &pFrame->Octet[4], 2);839839-840840- if ((*pAlg == Ndis802_11AuthModeOpen)841841- )842842- {843843- if (*pSeq == 1 || *pSeq == 2)844844- {845845- return TRUE;846846- }847847- else848848- {849849- DBGPRINT(RT_DEBUG_TRACE, ("PeerAuthSanity fail - wrong Seg#\n"));850850- return FALSE;851851- }852852- }853853- else if (*pAlg == Ndis802_11AuthModeShared)854854- {855855- if (*pSeq == 1 || *pSeq == 4)856856- {857857- return TRUE;858858- }859859- else if (*pSeq == 2 || *pSeq == 3)860860- {861861- NdisMoveMemory(pChlgText, &pFrame->Octet[8], CIPHER_TEXT_LEN);862862- return TRUE;863863- }864864- else865865- {866866- DBGPRINT(RT_DEBUG_TRACE, ("PeerAuthSanity fail - wrong Seg#\n"));867867- return FALSE;868868- }869869- }870870- else871871- {872872- DBGPRINT(RT_DEBUG_TRACE, ("PeerAuthSanity fail - wrong algorithm\n"));873873- return FALSE;874874- }875875-}876876-877877-/*878878- ==========================================================================879879- Description:880880- MLME message sanity check881881- Return:882882- TRUE if all parameters are OK, FALSE otherwise883883- ==========================================================================884884- */885885-BOOLEAN MlmeAuthReqSanity(886886- IN PRTMP_ADAPTER pAd,887887- IN VOID *Msg,888888- IN ULONG MsgLen,889889- OUT PUCHAR pAddr,890890- OUT ULONG *pTimeout,891891- OUT USHORT *pAlg)892892-{893893- MLME_AUTH_REQ_STRUCT *pInfo;894894-895895- pInfo = (MLME_AUTH_REQ_STRUCT *)Msg;896896- COPY_MAC_ADDR(pAddr, pInfo->Addr);897897- *pTimeout = pInfo->Timeout;898898- *pAlg = pInfo->Alg;899899-900900- if (((*pAlg == Ndis802_11AuthModeShared) ||(*pAlg == Ndis802_11AuthModeOpen)901901- ) &&902902- ((*pAddr & 0x01) == 0))903903- {904904- return TRUE;905905- }906906- else907907- {908908- DBGPRINT(RT_DEBUG_TRACE, ("MlmeAuthReqSanity fail - wrong algorithm\n"));909909- return FALSE;910910- }911911-}912912-913913-/*914914- ==========================================================================915915- Description:916916- MLME message sanity check917917- Return:918918- TRUE if all parameters are OK, FALSE otherwise919919-920920- IRQL = DISPATCH_LEVEL921921-922922- ==========================================================================923923- */924924-BOOLEAN MlmeAssocReqSanity(925925- IN PRTMP_ADAPTER pAd,926926- IN VOID *Msg,927927- IN ULONG MsgLen,928928- OUT PUCHAR pApAddr,929929- OUT USHORT *pCapabilityInfo,930930- OUT ULONG *pTimeout,931931- OUT USHORT *pListenIntv)932932-{933933- MLME_ASSOC_REQ_STRUCT *pInfo;934934-935935- pInfo = (MLME_ASSOC_REQ_STRUCT *)Msg;936936- *pTimeout = pInfo->Timeout; // timeout937937- COPY_MAC_ADDR(pApAddr, pInfo->Addr); // AP address938938- *pCapabilityInfo = pInfo->CapabilityInfo; // capability info939939- *pListenIntv = pInfo->ListenIntv;940940-941941- return TRUE;942942-}943943-944944-/*945945- ==========================================================================946946- Description:947947- MLME message sanity check948948- Return:949949- TRUE if all parameters are OK, FALSE otherwise950950-951951- IRQL = DISPATCH_LEVEL952952-953953- ==========================================================================954954- */955955-BOOLEAN PeerDisassocSanity(956956- IN PRTMP_ADAPTER pAd,957957- IN VOID *Msg,958958- IN ULONG MsgLen,959959- OUT PUCHAR pAddr2,960960- OUT USHORT *pReason)961961-{962962- PFRAME_802_11 pFrame = (PFRAME_802_11)Msg;963963-964964- COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);965965- NdisMoveMemory(pReason, &pFrame->Octet[0], 2);966966-967967- return TRUE;968968-}969969-970970-/*971971- ========================================================================972972- Routine Description:973973- Sanity check NetworkType (11b, 11g or 11a)974974-975975- Arguments:976976- pBss - Pointer to BSS table.977977-978978- Return Value:979979- Ndis802_11DS .......(11b)980980- Ndis802_11OFDM24....(11g)981981- Ndis802_11OFDM5.....(11a)982982-983983- IRQL = DISPATCH_LEVEL984984-985985- ========================================================================986986-*/987987-NDIS_802_11_NETWORK_TYPE NetworkTypeInUseSanity(988988- IN PBSS_ENTRY pBss)989989-{990990- NDIS_802_11_NETWORK_TYPE NetWorkType;991991- UCHAR rate, i;992992-993993- NetWorkType = Ndis802_11DS;994994-995995- if (pBss->Channel <= 14)996996- {997997- //998998- // First check support Rate.999999- //10001000- for (i = 0; i < pBss->SupRateLen; i++)10011001- {10021002- rate = pBss->SupRate[i] & 0x7f; // Mask out basic rate set bit10031003- if ((rate == 2) || (rate == 4) || (rate == 11) || (rate == 22))10041004- {10051005- continue;10061006- }10071007- else10081008- {10091009- //10101010- // Otherwise (even rate > 108) means Ndis802_11OFDM2410111011- //10121012- NetWorkType = Ndis802_11OFDM24;10131013- break;10141014- }10151015- }10161016-10171017- //10181018- // Second check Extend Rate.10191019- //10201020- if (NetWorkType != Ndis802_11OFDM24)10211021- {10221022- for (i = 0; i < pBss->ExtRateLen; i++)10231023- {10241024- rate = pBss->SupRate[i] & 0x7f; // Mask out basic rate set bit10251025- if ((rate == 2) || (rate == 4) || (rate == 11) || (rate == 22))10261026- {10271027- continue;10281028- }10291029- else10301030- {10311031- //10321032- // Otherwise (even rate > 108) means Ndis802_11OFDM2410331033- //10341034- NetWorkType = Ndis802_11OFDM24;10351035- break;10361036- }10371037- }10381038- }10391039- }10401040- else10411041- {10421042- NetWorkType = Ndis802_11OFDM5;10431043- }10441044-10451045- if (pBss->HtCapabilityLen != 0)10461046- {10471047- if (NetWorkType == Ndis802_11OFDM5)10481048- NetWorkType = Ndis802_11OFDM5_N;10491049- else10501050- NetWorkType = Ndis802_11OFDM24_N;10511051- }10521052-10531053- return NetWorkType;10541054-}10551055-10561056-/*10571057- ==========================================================================10581058- Description:10591059- WPA message sanity check10601060- Return:10611061- TRUE if all parameters are OK, FALSE otherwise10621062- ==========================================================================10631063- */10641064-BOOLEAN PeerWpaMessageSanity(10651065- IN PRTMP_ADAPTER pAd,10661066- IN PEAPOL_PACKET pMsg,10671067- IN ULONG MsgLen,10681068- IN UCHAR MsgType,10691069- IN MAC_TABLE_ENTRY *pEntry)10701070-{10711071- UCHAR mic[LEN_KEY_DESC_MIC], digest[80], KEYDATA[MAX_LEN_OF_RSNIE];10721072- BOOLEAN bReplayDiff = FALSE;10731073- BOOLEAN bWPA2 = FALSE;10741074- KEY_INFO EapolKeyInfo;10751075- UCHAR GroupKeyIndex = 0;10761076-10771077-10781078- NdisZeroMemory(mic, sizeof(mic));10791079- NdisZeroMemory(digest, sizeof(digest));10801080- NdisZeroMemory(KEYDATA, sizeof(KEYDATA));10811081- NdisZeroMemory((PUCHAR)&EapolKeyInfo, sizeof(EapolKeyInfo));10821082-10831083- NdisMoveMemory((PUCHAR)&EapolKeyInfo, (PUCHAR)&pMsg->KeyDesc.KeyInfo, sizeof(KEY_INFO));10841084-10851085- *((USHORT *)&EapolKeyInfo) = cpu2le16(*((USHORT *)&EapolKeyInfo));10861086-10871087- // Choose WPA2 or not10881088- if ((pEntry->AuthMode == Ndis802_11AuthModeWPA2) || (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK))10891089- bWPA2 = TRUE;10901090-10911091- // 0. Check MsgType10921092- if ((MsgType > EAPOL_GROUP_MSG_2) || (MsgType < EAPOL_PAIR_MSG_1))10931093- {10941094- DBGPRINT(RT_DEBUG_ERROR, ("The message type is invalid(%d)! \n", MsgType));10951095- return FALSE;10961096- }10971097-10981098- // 1. Replay counter check10991099- if (MsgType == EAPOL_PAIR_MSG_1 || MsgType == EAPOL_PAIR_MSG_3 || MsgType == EAPOL_GROUP_MSG_1) // For supplicant11001100- {11011101- // First validate replay counter, only accept message with larger replay counter.11021102- // Let equal pass, some AP start with all zero replay counter11031103- UCHAR ZeroReplay[LEN_KEY_DESC_REPLAY];11041104-11051105- NdisZeroMemory(ZeroReplay, LEN_KEY_DESC_REPLAY);11061106- if ((RTMPCompareMemory(pMsg->KeyDesc.ReplayCounter, pEntry->R_Counter, LEN_KEY_DESC_REPLAY) != 1) &&11071107- (RTMPCompareMemory(pMsg->KeyDesc.ReplayCounter, ZeroReplay, LEN_KEY_DESC_REPLAY) != 0))11081108- {11091109- bReplayDiff = TRUE;11101110- }11111111- }11121112- else if (MsgType == EAPOL_PAIR_MSG_2 || MsgType == EAPOL_PAIR_MSG_4 || MsgType == EAPOL_GROUP_MSG_2) // For authenticator11131113- {11141114- // check Replay Counter coresponds to MSG from authenticator, otherwise discard11151115- if (!NdisEqualMemory(pMsg->KeyDesc.ReplayCounter, pEntry->R_Counter, LEN_KEY_DESC_REPLAY))11161116- {11171117- bReplayDiff = TRUE;11181118- }11191119- }11201120-11211121- // Replay Counter different condition11221122- if (bReplayDiff)11231123- {11241124- // send wireless event - for replay counter different11251125- if (pAd->CommonCfg.bWirelessEvent)11261126- RTMPSendWirelessEvent(pAd, IW_REPLAY_COUNTER_DIFF_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0);11271127-11281128- if (MsgType < EAPOL_GROUP_MSG_1)11291129- {11301130- DBGPRINT(RT_DEBUG_ERROR, ("Replay Counter Different in pairwise msg %d of 4-way handshake!\n", MsgType));11311131- }11321132- else11331133- {11341134- DBGPRINT(RT_DEBUG_ERROR, ("Replay Counter Different in group msg %d of 2-way handshake!\n", (MsgType - EAPOL_PAIR_MSG_4)));11351135- }11361136-11371137- hex_dump("Receive replay counter ", pMsg->KeyDesc.ReplayCounter, LEN_KEY_DESC_REPLAY);11381138- hex_dump("Current replay counter ", pEntry->R_Counter, LEN_KEY_DESC_REPLAY);11391139- return FALSE;11401140- }11411141-11421142- // 2. Verify MIC except Pairwise Msg111431143- if (MsgType != EAPOL_PAIR_MSG_1)11441144- {11451145- UCHAR rcvd_mic[LEN_KEY_DESC_MIC];11461146-11471147- // Record the received MIC for check later11481148- NdisMoveMemory(rcvd_mic, pMsg->KeyDesc.KeyMic, LEN_KEY_DESC_MIC);11491149- NdisZeroMemory(pMsg->KeyDesc.KeyMic, LEN_KEY_DESC_MIC);11501150-11511151- if (pEntry->WepStatus == Ndis802_11Encryption2Enabled) // TKIP11521152- {11531153- hmac_md5(pEntry->PTK, LEN_EAP_MICK, (PUCHAR)pMsg, MsgLen, mic);11541154- }11551155- else if (pEntry->WepStatus == Ndis802_11Encryption3Enabled) // AES11561156- {11571157- HMAC_SHA1((PUCHAR)pMsg, MsgLen, pEntry->PTK, LEN_EAP_MICK, digest);11581158- NdisMoveMemory(mic, digest, LEN_KEY_DESC_MIC);11591159- }11601160-11611161- if (!NdisEqualMemory(rcvd_mic, mic, LEN_KEY_DESC_MIC))11621162- {11631163- // send wireless event - for MIC different11641164- if (pAd->CommonCfg.bWirelessEvent)11651165- RTMPSendWirelessEvent(pAd, IW_MIC_DIFF_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0);11661166-11671167- if (MsgType < EAPOL_GROUP_MSG_1)11681168- {11691169- DBGPRINT(RT_DEBUG_ERROR, ("MIC Different in pairwise msg %d of 4-way handshake!\n", MsgType));11701170- }11711171- else11721172- {11731173- DBGPRINT(RT_DEBUG_ERROR, ("MIC Different in group msg %d of 2-way handshake!\n", (MsgType - EAPOL_PAIR_MSG_4)));11741174- }11751175-11761176- hex_dump("Received MIC", rcvd_mic, LEN_KEY_DESC_MIC);11771177- hex_dump("Desired MIC", mic, LEN_KEY_DESC_MIC);11781178-11791179- return FALSE;11801180- }11811181- }11821182-11831183- // Extract the context of the Key Data field if it exist11841184- // The field in pairwise_msg_2_WPA1(WPA2) & pairwise_msg_3_WPA1 is un-encrypted.11851185- // The field in group_msg_1_WPA1(WPA2) & pairwise_msg_3_WPA2 is encrypted.11861186- if (pMsg->KeyDesc.KeyDataLen[1] > 0)11871187- {11881188- // Decrypt this field11891189- if ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2) || (MsgType == EAPOL_GROUP_MSG_1))11901190- {11911191- if(pEntry->WepStatus == Ndis802_11Encryption3Enabled)11921192- {11931193- // AES11941194- AES_GTK_KEY_UNWRAP(&pEntry->PTK[16], KEYDATA, pMsg->KeyDesc.KeyDataLen[1],pMsg->KeyDesc.KeyData);11951195- }11961196- else11971197- {11981198- INT i;11991199- UCHAR Key[32];12001200- // Decrypt TKIP GTK12011201- // Construct 32 bytes RC4 Key12021202- NdisMoveMemory(Key, pMsg->KeyDesc.KeyIv, 16);12031203- NdisMoveMemory(&Key[16], &pEntry->PTK[16], 16);12041204- ARCFOUR_INIT(&pAd->PrivateInfo.WEPCONTEXT, Key, 32);12051205- //discard first 256 bytes12061206- for(i = 0; i < 256; i++)12071207- ARCFOUR_BYTE(&pAd->PrivateInfo.WEPCONTEXT);12081208- // Decrypt GTK. Becareful, there is no ICV to check the result is correct or not12091209- ARCFOUR_DECRYPT(&pAd->PrivateInfo.WEPCONTEXT, KEYDATA, pMsg->KeyDesc.KeyData, pMsg->KeyDesc.KeyDataLen[1]);12101210- }12111211-12121212- if (!bWPA2 && (MsgType == EAPOL_GROUP_MSG_1))12131213- GroupKeyIndex = EapolKeyInfo.KeyIndex;12141214-12151215- }12161216- else if ((MsgType == EAPOL_PAIR_MSG_2) || (MsgType == EAPOL_PAIR_MSG_3 && !bWPA2))12171217- {12181218- NdisMoveMemory(KEYDATA, pMsg->KeyDesc.KeyData, pMsg->KeyDesc.KeyDataLen[1]);12191219- }12201220- else12211221- {12221222-12231223- return TRUE;12241224- }12251225-12261226- // Parse Key Data field to12271227- // 1. verify RSN IE for pairwise_msg_2_WPA1(WPA2) ,pairwise_msg_3_WPA1(WPA2)12281228- // 2. verify KDE format for pairwise_msg_3_WPA2, group_msg_1_WPA212291229- // 3. update shared key for pairwise_msg_3_WPA2, group_msg_1_WPA1(WPA2)12301230- if (!RTMPParseEapolKeyData(pAd, KEYDATA, pMsg->KeyDesc.KeyDataLen[1], GroupKeyIndex, MsgType, bWPA2, pEntry))12311231- {12321232- return FALSE;12331233- }12341234- }12351235-12361236- return TRUE;12371237-12381238-}11+#include "../../rt2860/common/cmm_sanity.c"
+1-617
drivers/staging/rt2870/common/cmm_sync.c
···11-/*22- *************************************************************************33- * Ralink Tech Inc.44- * 5F., No.36, Taiyuan St., Jhubei City,55- * Hsinchu County 302,66- * Taiwan, R.O.C.77- *88- * (c) Copyright 2002-2007, Ralink Technology, Inc.99- *1010- * This program is free software; you can redistribute it and/or modify *1111- * it under the terms of the GNU General Public License as published by *1212- * the Free Software Foundation; either version 2 of the License, or *1313- * (at your option) any later version. *1414- * *1515- * This program is distributed in the hope that it will be useful, *1616- * but WITHOUT ANY WARRANTY; without even the implied warranty of *1717- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *1818- * GNU General Public License for more details. *1919- * *2020- * You should have received a copy of the GNU General Public License *2121- * along with this program; if not, write to the *2222- * Free Software Foundation, Inc., *2323- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *2424- * *2525- *************************************************************************2626-2727- Module Name:2828- sync.c2929-3030- Abstract:3131-3232- Revision History:3333- Who When What3434- -------- ---------- ----------------------------------------------3535- John Chang 2004-09-01 modified for rt2561/26613636-*/3737-#include "../rt_config.h"3838-3939-// 2.4 Ghz channel plan index in the TxPower arrays.4040-#define BG_BAND_REGION_0_START 0 // 1,2,3,4,5,6,7,8,9,10,114141-#define BG_BAND_REGION_0_SIZE 114242-#define BG_BAND_REGION_1_START 0 // 1,2,3,4,5,6,7,8,9,10,11,12,134343-#define BG_BAND_REGION_1_SIZE 134444-#define BG_BAND_REGION_2_START 9 // 10,114545-#define BG_BAND_REGION_2_SIZE 24646-#define BG_BAND_REGION_3_START 9 // 10,11,12,134747-#define BG_BAND_REGION_3_SIZE 44848-#define BG_BAND_REGION_4_START 13 // 144949-#define BG_BAND_REGION_4_SIZE 15050-#define BG_BAND_REGION_5_START 0 // 1,2,3,4,5,6,7,8,9,10,11,12,13,145151-#define BG_BAND_REGION_5_SIZE 145252-#define BG_BAND_REGION_6_START 2 // 3,4,5,6,7,8,95353-#define BG_BAND_REGION_6_SIZE 75454-#define BG_BAND_REGION_7_START 4 // 5,6,7,8,9,10,11,12,135555-#define BG_BAND_REGION_7_SIZE 95656-#define BG_BAND_REGION_31_START 0 // 1,2,3,4,5,6,7,8,9,10,11,12,13,145757-#define BG_BAND_REGION_31_SIZE 145858-5959-// 5 Ghz channel plan index in the TxPower arrays.6060-UCHAR A_BAND_REGION_0_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165};6161-UCHAR 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};6262-UCHAR A_BAND_REGION_2_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64};6363-UCHAR A_BAND_REGION_3_CHANNEL_LIST[]={52, 56, 60, 64, 149, 153, 157, 161};6464-UCHAR A_BAND_REGION_4_CHANNEL_LIST[]={149, 153, 157, 161, 165};6565-UCHAR A_BAND_REGION_5_CHANNEL_LIST[]={149, 153, 157, 161};6666-UCHAR A_BAND_REGION_6_CHANNEL_LIST[]={36, 40, 44, 48};6767-UCHAR 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};6868-UCHAR A_BAND_REGION_8_CHANNEL_LIST[]={52, 56, 60, 64};6969-UCHAR 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};7070-UCHAR A_BAND_REGION_10_CHANNEL_LIST[]={36, 40, 44, 48, 149, 153, 157, 161, 165};7171-UCHAR A_BAND_REGION_11_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 149, 153, 157, 161};7272-7373-//BaSizeArray follows the 802.11n definition as MaxRxFactor. 2^(13+factor) bytes. When factor =0, it's about Ba buffer size =8.7474-UCHAR BaSizeArray[4] = {8,16,32,64};7575-7676-/*7777- ==========================================================================7878- Description:7979- Update StaCfg->ChannelList[] according to 1) Country Region 2) RF IC type,8080- and 3) PHY-mode user selected.8181- The outcome is used by driver when doing site survey.8282-8383- IRQL = PASSIVE_LEVEL8484- IRQL = DISPATCH_LEVEL8585-8686- ==========================================================================8787- */8888-VOID BuildChannelList(8989- IN PRTMP_ADAPTER pAd)9090-{9191- UCHAR i, j, index=0, num=0;9292- PUCHAR pChannelList = NULL;9393-9494- NdisZeroMemory(pAd->ChannelList, MAX_NUM_OF_CHANNELS * sizeof(CHANNEL_TX_POWER));9595-9696- // if not 11a-only mode, channel list starts from 2.4Ghz band9797- if ((pAd->CommonCfg.PhyMode != PHY_11A)9898- && (pAd->CommonCfg.PhyMode != PHY_11AN_MIXED) && (pAd->CommonCfg.PhyMode != PHY_11N_5G)9999- )100100- {101101- switch (pAd->CommonCfg.CountryRegion & 0x7f)102102- {103103- case REGION_0_BG_BAND: // 1 -11104104- NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_0_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_0_SIZE);105105- index += BG_BAND_REGION_0_SIZE;106106- break;107107- case REGION_1_BG_BAND: // 1 - 13108108- NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_1_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_1_SIZE);109109- index += BG_BAND_REGION_1_SIZE;110110- break;111111- case REGION_2_BG_BAND: // 10 - 11112112- NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_2_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_2_SIZE);113113- index += BG_BAND_REGION_2_SIZE;114114- break;115115- case REGION_3_BG_BAND: // 10 - 13116116- NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_3_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_3_SIZE);117117- index += BG_BAND_REGION_3_SIZE;118118- break;119119- case REGION_4_BG_BAND: // 14120120- NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_4_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_4_SIZE);121121- index += BG_BAND_REGION_4_SIZE;122122- break;123123- case REGION_5_BG_BAND: // 1 - 14124124- NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_5_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_5_SIZE);125125- index += BG_BAND_REGION_5_SIZE;126126- break;127127- case REGION_6_BG_BAND: // 3 - 9128128- NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_6_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_6_SIZE);129129- index += BG_BAND_REGION_6_SIZE;130130- break;131131- case REGION_7_BG_BAND: // 5 - 13132132- NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_7_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_7_SIZE);133133- index += BG_BAND_REGION_7_SIZE;134134- break;135135- case REGION_31_BG_BAND: // 1 - 14136136- NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_31_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_31_SIZE);137137- index += BG_BAND_REGION_31_SIZE;138138- break;139139- default: // Error. should never happen140140- break;141141- }142142- for (i=0; i<index; i++)143143- pAd->ChannelList[i].MaxTxPwr = 20;144144- }145145-146146- if ((pAd->CommonCfg.PhyMode == PHY_11A) || (pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED)147147- || (pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11AN_MIXED)148148- || (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11N_5G)149149- )150150- {151151- switch (pAd->CommonCfg.CountryRegionForABand & 0x7f)152152- {153153- case REGION_0_A_BAND:154154- num = sizeof(A_BAND_REGION_0_CHANNEL_LIST)/sizeof(UCHAR);155155- pChannelList = A_BAND_REGION_0_CHANNEL_LIST;156156- break;157157- case REGION_1_A_BAND:158158- num = sizeof(A_BAND_REGION_1_CHANNEL_LIST)/sizeof(UCHAR);159159- pChannelList = A_BAND_REGION_1_CHANNEL_LIST;160160- break;161161- case REGION_2_A_BAND:162162- num = sizeof(A_BAND_REGION_2_CHANNEL_LIST)/sizeof(UCHAR);163163- pChannelList = A_BAND_REGION_2_CHANNEL_LIST;164164- break;165165- case REGION_3_A_BAND:166166- num = sizeof(A_BAND_REGION_3_CHANNEL_LIST)/sizeof(UCHAR);167167- pChannelList = A_BAND_REGION_3_CHANNEL_LIST;168168- break;169169- case REGION_4_A_BAND:170170- num = sizeof(A_BAND_REGION_4_CHANNEL_LIST)/sizeof(UCHAR);171171- pChannelList = A_BAND_REGION_4_CHANNEL_LIST;172172- break;173173- case REGION_5_A_BAND:174174- num = sizeof(A_BAND_REGION_5_CHANNEL_LIST)/sizeof(UCHAR);175175- pChannelList = A_BAND_REGION_5_CHANNEL_LIST;176176- break;177177- case REGION_6_A_BAND:178178- num = sizeof(A_BAND_REGION_6_CHANNEL_LIST)/sizeof(UCHAR);179179- pChannelList = A_BAND_REGION_6_CHANNEL_LIST;180180- break;181181- case REGION_7_A_BAND:182182- num = sizeof(A_BAND_REGION_7_CHANNEL_LIST)/sizeof(UCHAR);183183- pChannelList = A_BAND_REGION_7_CHANNEL_LIST;184184- break;185185- case REGION_8_A_BAND:186186- num = sizeof(A_BAND_REGION_8_CHANNEL_LIST)/sizeof(UCHAR);187187- pChannelList = A_BAND_REGION_8_CHANNEL_LIST;188188- break;189189- case REGION_9_A_BAND:190190- num = sizeof(A_BAND_REGION_9_CHANNEL_LIST)/sizeof(UCHAR);191191- pChannelList = A_BAND_REGION_9_CHANNEL_LIST;192192- break;193193-194194- case REGION_10_A_BAND:195195- num = sizeof(A_BAND_REGION_10_CHANNEL_LIST)/sizeof(UCHAR);196196- pChannelList = A_BAND_REGION_10_CHANNEL_LIST;197197- break;198198-199199- case REGION_11_A_BAND:200200- num = sizeof(A_BAND_REGION_11_CHANNEL_LIST)/sizeof(UCHAR);201201- pChannelList = A_BAND_REGION_11_CHANNEL_LIST;202202- break;203203-204204- default: // Error. should never happen205205- DBGPRINT(RT_DEBUG_WARN,("countryregion=%d not support", pAd->CommonCfg.CountryRegionForABand));206206- break;207207- }208208-209209- if (num != 0)210210- {211211- UCHAR RadarCh[15]={52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140};212212- for (i=0; i<num; i++)213213- {214214- for (j=0; j<MAX_NUM_OF_CHANNELS; j++)215215- {216216- if (pChannelList[i] == pAd->TxPower[j].Channel)217217- NdisMoveMemory(&pAd->ChannelList[index+i], &pAd->TxPower[j], sizeof(CHANNEL_TX_POWER));218218- }219219- for (j=0; j<15; j++)220220- {221221- if (pChannelList[i] == RadarCh[j])222222- pAd->ChannelList[index+i].DfsReq = TRUE;223223- }224224- pAd->ChannelList[index+i].MaxTxPwr = 20;225225- }226226- index += num;227227- }228228- }229229-230230- pAd->ChannelListNum = index;231231- DBGPRINT(RT_DEBUG_TRACE,("country code=%d/%d, RFIC=%d, PHY mode=%d, support %d channels\n",232232- pAd->CommonCfg.CountryRegion, pAd->CommonCfg.CountryRegionForABand, pAd->RfIcType, pAd->CommonCfg.PhyMode, pAd->ChannelListNum));233233-#ifdef DBG234234- for (i=0;i<pAd->ChannelListNum;i++)235235- {236236- DBGPRINT_RAW(RT_DEBUG_TRACE,("BuildChannel # %d :: Pwr0 = %d, Pwr1 =%d, \n ", pAd->ChannelList[i].Channel, pAd->ChannelList[i].Power, pAd->ChannelList[i].Power2));237237- }238238-#endif239239-}240240-241241-/*242242- ==========================================================================243243- Description:244244- This routine return the first channel number according to the country245245- code selection and RF IC selection (signal band or dual band). It is called246246- whenever driver need to start a site survey of all supported channels.247247- Return:248248- ch - the first channel number of current country code setting249249-250250- IRQL = PASSIVE_LEVEL251251-252252- ==========================================================================253253- */254254-UCHAR FirstChannel(255255- IN PRTMP_ADAPTER pAd)256256-{257257- return pAd->ChannelList[0].Channel;258258-}259259-260260-/*261261- ==========================================================================262262- Description:263263- This routine returns the next channel number. This routine is called264264- during driver need to start a site survey of all supported channels.265265- Return:266266- next_channel - the next channel number valid in current country code setting.267267- Note:268268- return 0 if no more next channel269269- ==========================================================================270270- */271271-UCHAR NextChannel(272272- IN PRTMP_ADAPTER pAd,273273- IN UCHAR channel)274274-{275275- int i;276276- UCHAR next_channel = 0;277277-278278- for (i = 0; i < (pAd->ChannelListNum - 1); i++)279279- if (channel == pAd->ChannelList[i].Channel)280280- {281281- next_channel = pAd->ChannelList[i+1].Channel;282282- break;283283- }284284- return next_channel;285285-}286286-287287-/*288288- ==========================================================================289289- Description:290290- This routine is for Cisco Compatible Extensions 2.X291291- Spec31. AP Control of Client Transmit Power292292- Return:293293- None294294- Note:295295- Required by Aironet dBm(mW)296296- 0dBm(1mW), 1dBm(5mW), 13dBm(20mW), 15dBm(30mW),297297- 17dBm(50mw), 20dBm(100mW)298298-299299- We supported300300- 3dBm(Lowest), 6dBm(10%), 9dBm(25%), 12dBm(50%),301301- 14dBm(75%), 15dBm(100%)302302-303303- The client station's actual transmit power shall be within +/- 5dB of304304- the minimum value or next lower value.305305- ==========================================================================306306- */307307-VOID ChangeToCellPowerLimit(308308- IN PRTMP_ADAPTER pAd,309309- IN UCHAR AironetCellPowerLimit)310310-{311311- //valud 0xFF means that hasn't found power limit information312312- //from the AP's Beacon/Probe response.313313- if (AironetCellPowerLimit == 0xFF)314314- return;315315-316316- if (AironetCellPowerLimit < 6) //Used Lowest Power Percentage.317317- pAd->CommonCfg.TxPowerPercentage = 6;318318- else if (AironetCellPowerLimit < 9)319319- pAd->CommonCfg.TxPowerPercentage = 10;320320- else if (AironetCellPowerLimit < 12)321321- pAd->CommonCfg.TxPowerPercentage = 25;322322- else if (AironetCellPowerLimit < 14)323323- pAd->CommonCfg.TxPowerPercentage = 50;324324- else if (AironetCellPowerLimit < 15)325325- pAd->CommonCfg.TxPowerPercentage = 75;326326- else327327- pAd->CommonCfg.TxPowerPercentage = 100; //else used maximum328328-329329- if (pAd->CommonCfg.TxPowerPercentage > pAd->CommonCfg.TxPowerDefault)330330- pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault;331331-332332-}333333-334334-CHAR ConvertToRssi(335335- IN PRTMP_ADAPTER pAd,336336- IN CHAR Rssi,337337- IN UCHAR RssiNumber)338338-{339339- UCHAR RssiOffset, LNAGain;340340-341341- // Rssi equals to zero should be an invalid value342342- if (Rssi == 0)343343- return -99;344344-345345- LNAGain = GET_LNA_GAIN(pAd);346346- if (pAd->LatchRfRegs.Channel > 14)347347- {348348- if (RssiNumber == 0)349349- RssiOffset = pAd->ARssiOffset0;350350- else if (RssiNumber == 1)351351- RssiOffset = pAd->ARssiOffset1;352352- else353353- RssiOffset = pAd->ARssiOffset2;354354- }355355- else356356- {357357- if (RssiNumber == 0)358358- RssiOffset = pAd->BGRssiOffset0;359359- else if (RssiNumber == 1)360360- RssiOffset = pAd->BGRssiOffset1;361361- else362362- RssiOffset = pAd->BGRssiOffset2;363363- }364364-365365- return (-12 - RssiOffset - LNAGain - Rssi);366366-}367367-368368-/*369369- ==========================================================================370370- Description:371371- Scan next channel372372- ==========================================================================373373- */374374-VOID ScanNextChannel(375375- IN PRTMP_ADAPTER pAd)376376-{377377- HEADER_802_11 Hdr80211;378378- PUCHAR pOutBuffer = NULL;379379- NDIS_STATUS NStatus;380380- ULONG FrameLen = 0;381381- UCHAR SsidLen = 0, ScanType = pAd->MlmeAux.ScanType, BBPValue = 0;382382- USHORT Status;383383- PHEADER_802_11 pHdr80211;384384- UINT ScanTimeIn5gChannel = SHORT_CHANNEL_TIME;385385-386386- if (MONITOR_ON(pAd))387387- return;388388-389389- if (pAd->MlmeAux.Channel == 0)390390- {391391- if ((pAd->CommonCfg.BBPCurrentBW == BW_40)392392- && (INFRA_ON(pAd)393393- || (pAd->OpMode == OPMODE_AP))394394- )395395- {396396- AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);397397- AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);398398- RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);399399- BBPValue &= (~0x18);400400- BBPValue |= 0x10;401401- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);402402- DBGPRINT(RT_DEBUG_TRACE, ("SYNC - End of SCAN, restore to 40MHz channel %d, Total BSS[%02d]\n",pAd->CommonCfg.CentralChannel, pAd->ScanTab.BssNr));403403- }404404- else405405- {406406- AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);407407- AsicLockChannel(pAd, pAd->CommonCfg.Channel);408408- DBGPRINT(RT_DEBUG_TRACE, ("SYNC - End of SCAN, restore to channel %d, Total BSS[%02d]\n",pAd->CommonCfg.Channel, pAd->ScanTab.BssNr));409409- }410410-411411- {412412- //413413- // To prevent data lost.414414- // Send an NULL data with turned PSM bit on to current associated AP before SCAN progress.415415- // Now, we need to send an NULL data with turned PSM bit off to AP, when scan progress done416416- //417417- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && (INFRA_ON(pAd)))418418- {419419- NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer);420420- if (NStatus == NDIS_STATUS_SUCCESS)421421- {422422- pHdr80211 = (PHEADER_802_11) pOutBuffer;423423- MgtMacHeaderInit(pAd, pHdr80211, SUBTYPE_NULL_FUNC, 1, pAd->CommonCfg.Bssid, pAd->CommonCfg.Bssid);424424- pHdr80211->Duration = 0;425425- pHdr80211->FC.Type = BTYPE_DATA;426426- pHdr80211->FC.PwrMgmt = (pAd->StaCfg.Psm == PWR_SAVE);427427-428428- // Send using priority queue429429- MiniportMMRequest(pAd, 0, pOutBuffer, sizeof(HEADER_802_11));430430- DBGPRINT(RT_DEBUG_TRACE, ("MlmeScanReqAction -- Send PSM Data frame\n"));431431- MlmeFreeMemory(pAd, pOutBuffer);432432- RTMPusecDelay(5000);433433- }434434- }435435-436436- pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;437437- Status = MLME_SUCCESS;438438- MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status);439439- }440440-441441- RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);442442- }443443-#ifdef RT2870444444- else if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST) && (pAd->OpMode == OPMODE_STA))445445- {446446- pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;447447- MlmeCntlConfirm(pAd, MT2_SCAN_CONF, MLME_FAIL_NO_RESOURCE);448448- }449449-#endif // RT2870 //450450- else451451- {452452- {453453- // BBP and RF are not accessible in PS mode, we has to wake them up first454454- if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))455455- AsicForceWakeup(pAd, TRUE);456456-457457- // leave PSM during scanning. otherwise we may lost ProbeRsp & BEACON458458- if (pAd->StaCfg.Psm == PWR_SAVE)459459- MlmeSetPsmBit(pAd, PWR_ACTIVE);460460- }461461-462462- AsicSwitchChannel(pAd, pAd->MlmeAux.Channel, TRUE);463463- AsicLockChannel(pAd, pAd->MlmeAux.Channel);464464-465465- {466466- if (pAd->MlmeAux.Channel > 14)467467- {468468- if ((pAd->CommonCfg.bIEEE80211H == 1) && RadarChannelCheck(pAd, pAd->MlmeAux.Channel))469469- {470470- ScanType = SCAN_PASSIVE;471471- ScanTimeIn5gChannel = MIN_CHANNEL_TIME;472472- }473473- }474474- }475475-476476- //Global country domain(ch1-11:active scan, ch12-14 passive scan)477477- if ((pAd->MlmeAux.Channel <= 14) && (pAd->MlmeAux.Channel >= 12) && ((pAd->CommonCfg.CountryRegion & 0x7f) == REGION_31_BG_BAND))478478- {479479- ScanType = SCAN_PASSIVE;480480- }481481-482482- // We need to shorten active scan time in order for WZC connect issue483483- // Chnage the channel scan time for CISCO stuff based on its IAPP announcement484484- if (ScanType == FAST_SCAN_ACTIVE)485485- RTMPSetTimer(&pAd->MlmeAux.ScanTimer, FAST_ACTIVE_SCAN_TIME);486486- else if (((ScanType == SCAN_CISCO_ACTIVE) ||487487- (ScanType == SCAN_CISCO_PASSIVE) ||488488- (ScanType == SCAN_CISCO_CHANNEL_LOAD) ||489489- (ScanType == SCAN_CISCO_NOISE)) && (pAd->OpMode == OPMODE_STA))490490- {491491- if (pAd->StaCfg.CCXScanTime < 25)492492- RTMPSetTimer(&pAd->MlmeAux.ScanTimer, pAd->StaCfg.CCXScanTime * 2);493493- else494494- RTMPSetTimer(&pAd->MlmeAux.ScanTimer, pAd->StaCfg.CCXScanTime);495495- }496496- else // must be SCAN_PASSIVE or SCAN_ACTIVE497497- {498498- if ((pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED)499499- || (pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED)500500- )501501- {502502- if (pAd->MlmeAux.Channel > 14)503503- RTMPSetTimer(&pAd->MlmeAux.ScanTimer, ScanTimeIn5gChannel);504504- else505505- RTMPSetTimer(&pAd->MlmeAux.ScanTimer, MIN_CHANNEL_TIME);506506- }507507- else508508- RTMPSetTimer(&pAd->MlmeAux.ScanTimer, MAX_CHANNEL_TIME);509509- }510510-511511- if ((ScanType == SCAN_ACTIVE) || (ScanType == FAST_SCAN_ACTIVE) ||512512- (ScanType == SCAN_CISCO_ACTIVE))513513- {514514- NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory515515- if (NStatus != NDIS_STATUS_SUCCESS)516516- {517517- DBGPRINT(RT_DEBUG_TRACE, ("SYNC - ScanNextChannel() allocate memory fail\n"));518518-519519- {520520- pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;521521- Status = MLME_FAIL_NO_RESOURCE;522522- MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status);523523- }524524-525525- return;526526- }527527-528528- // There is no need to send broadcast probe request if active scan is in effect.529529- if ((ScanType == SCAN_ACTIVE) || (ScanType == FAST_SCAN_ACTIVE)530530- )531531- SsidLen = pAd->MlmeAux.SsidLen;532532- else533533- SsidLen = 0;534534-535535- MgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, BROADCAST_ADDR, BROADCAST_ADDR);536536- MakeOutgoingFrame(pOutBuffer, &FrameLen,537537- sizeof(HEADER_802_11), &Hdr80211,538538- 1, &SsidIe,539539- 1, &SsidLen,540540- SsidLen, pAd->MlmeAux.Ssid,541541- 1, &SupRateIe,542542- 1, &pAd->CommonCfg.SupRateLen,543543- pAd->CommonCfg.SupRateLen, pAd->CommonCfg.SupRate,544544- END_OF_ARGS);545545-546546- if (pAd->CommonCfg.ExtRateLen)547547- {548548- ULONG Tmp;549549- MakeOutgoingFrame(pOutBuffer + FrameLen, &Tmp,550550- 1, &ExtRateIe,551551- 1, &pAd->CommonCfg.ExtRateLen,552552- pAd->CommonCfg.ExtRateLen, pAd->CommonCfg.ExtRate,553553- END_OF_ARGS);554554- FrameLen += Tmp;555555- }556556-557557- if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)558558- {559559- ULONG Tmp;560560- UCHAR HtLen;561561- UCHAR BROADCOM[4] = {0x0, 0x90, 0x4c, 0x33};562562-563563- if (pAd->bBroadComHT == TRUE)564564- {565565- HtLen = pAd->MlmeAux.HtCapabilityLen + 4;566566-567567- MakeOutgoingFrame(pOutBuffer + FrameLen, &Tmp,568568- 1, &WpaIe,569569- 1, &HtLen,570570- 4, &BROADCOM[0],571571- pAd->MlmeAux.HtCapabilityLen, &pAd->MlmeAux.HtCapability,572572- END_OF_ARGS);573573- }574574- else575575- {576576- HtLen = pAd->MlmeAux.HtCapabilityLen;577577-578578- MakeOutgoingFrame(pOutBuffer + FrameLen, &Tmp,579579- 1, &HtCapIe,580580- 1, &HtLen,581581- HtLen, &pAd->CommonCfg.HtCapability,582582- END_OF_ARGS);583583- }584584- FrameLen += Tmp;585585- }586586-587587- MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);588588- MlmeFreeMemory(pAd, pOutBuffer);589589- }590590-591591- // For SCAN_CISCO_PASSIVE, do nothing and silently wait for beacon or other probe reponse592592-593593- pAd->Mlme.SyncMachine.CurrState = SCAN_LISTEN;594594- }595595-}596596-597597-VOID MgtProbReqMacHeaderInit(598598- IN PRTMP_ADAPTER pAd,599599- IN OUT PHEADER_802_11 pHdr80211,600600- IN UCHAR SubType,601601- IN UCHAR ToDs,602602- IN PUCHAR pDA,603603- IN PUCHAR pBssid)604604-{605605- NdisZeroMemory(pHdr80211, sizeof(HEADER_802_11));606606-607607- pHdr80211->FC.Type = BTYPE_MGMT;608608- pHdr80211->FC.SubType = SubType;609609- if (SubType == SUBTYPE_ACK)610610- pHdr80211->FC.Type = BTYPE_CNTL;611611- pHdr80211->FC.ToDs = ToDs;612612- COPY_MAC_ADDR(pHdr80211->Addr1, pDA);613613- COPY_MAC_ADDR(pHdr80211->Addr2, pAd->CurrentAddress);614614- COPY_MAC_ADDR(pHdr80211->Addr3, pBssid);615615-}616616-617617-11+#include "../../rt2860/common/cmm_sync.c"
+1-1638
drivers/staging/rt2870/common/cmm_wpa.c
···11-/*22- *************************************************************************33- * Ralink Tech Inc.44- * 5F., No.36, Taiyuan St., Jhubei City,55- * Hsinchu County 302,66- * Taiwan, R.O.C.77- *88- * (c) Copyright 2002-2007, Ralink Technology, Inc.99- *1010- * This program is free software; you can redistribute it and/or modify *1111- * it under the terms of the GNU General Public License as published by *1212- * the Free Software Foundation; either version 2 of the License, or *1313- * (at your option) any later version. *1414- * *1515- * This program is distributed in the hope that it will be useful, *1616- * but WITHOUT ANY WARRANTY; without even the implied warranty of *1717- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *1818- * GNU General Public License for more details. *1919- * *2020- * You should have received a copy of the GNU General Public License *2121- * along with this program; if not, write to the *2222- * Free Software Foundation, Inc., *2323- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *2424- * *2525- *************************************************************************2626-2727- Module Name:2828- wpa.c2929-3030- Abstract:3131-3232- Revision History:3333- Who When What3434- -------- ---------- ----------------------------------------------3535- Jan Lee 03-07-22 Initial3636- Paul Lin 03-11-28 Modify for supplicant3737-*/3838-#include "../rt_config.h"3939-// WPA OUI4040-UCHAR OUI_WPA_NONE_AKM[4] = {0x00, 0x50, 0xF2, 0x00};4141-UCHAR OUI_WPA_VERSION[4] = {0x00, 0x50, 0xF2, 0x01};4242-#ifndef RT30xx4343-UCHAR OUI_WPA_WEP40[4] = {0x00, 0x50, 0xF2, 0x01};4444-#endif4545-UCHAR OUI_WPA_TKIP[4] = {0x00, 0x50, 0xF2, 0x02};4646-UCHAR OUI_WPA_CCMP[4] = {0x00, 0x50, 0xF2, 0x04};4747-#ifndef RT30xx4848-UCHAR OUI_WPA_WEP104[4] = {0x00, 0x50, 0xF2, 0x05};4949-#endif5050-UCHAR OUI_WPA_8021X_AKM[4] = {0x00, 0x50, 0xF2, 0x01};5151-UCHAR OUI_WPA_PSK_AKM[4] = {0x00, 0x50, 0xF2, 0x02};5252-// WPA2 OUI5353-UCHAR OUI_WPA2_WEP40[4] = {0x00, 0x0F, 0xAC, 0x01};5454-UCHAR OUI_WPA2_TKIP[4] = {0x00, 0x0F, 0xAC, 0x02};5555-UCHAR OUI_WPA2_CCMP[4] = {0x00, 0x0F, 0xAC, 0x04};5656-UCHAR OUI_WPA2_8021X_AKM[4] = {0x00, 0x0F, 0xAC, 0x01};5757-UCHAR OUI_WPA2_PSK_AKM[4] = {0x00, 0x0F, 0xAC, 0x02};5858-#ifndef RT30xx5959-UCHAR OUI_WPA2_WEP104[4] = {0x00, 0x0F, 0xAC, 0x05};6060-#endif6161-// MSA OUI6262-UCHAR OUI_MSA_8021X_AKM[4] = {0x00, 0x0F, 0xAC, 0x05}; // Not yet final - IEEE 802.11s-D1.066363-UCHAR OUI_MSA_PSK_AKM[4] = {0x00, 0x0F, 0xAC, 0x06}; // Not yet final - IEEE 802.11s-D1.066464-6565-/*6666- ========================================================================6767-6868- Routine Description:6969- The pseudo-random function(PRF) that hashes various inputs to7070- derive a pseudo-random value. To add liveness to the pseudo-random7171- value, a nonce should be one of the inputs.7272-7373- It is used to generate PTK, GTK or some specific random value.7474-7575- Arguments:7676- UCHAR *key, - the key material for HMAC_SHA1 use7777- INT key_len - the length of key7878- UCHAR *prefix - a prefix label7979- INT prefix_len - the length of the label8080- UCHAR *data - a specific data with variable length8181- INT data_len - the length of a specific data8282- INT len - the output lenght8383-8484- Return Value:8585- UCHAR *output - the calculated result8686-8787- Note:8888- 802.11i-2004 Annex H.38989-9090- ========================================================================9191-*/9292-VOID PRF(9393- IN UCHAR *key,9494- IN INT key_len,9595- IN UCHAR *prefix,9696- IN INT prefix_len,9797- IN UCHAR *data,9898- IN INT data_len,9999- OUT UCHAR *output,100100- IN INT len)101101-{102102- INT i;103103- UCHAR *input;104104- INT currentindex = 0;105105- INT total_len;106106-107107- // Allocate memory for input108108- os_alloc_mem(NULL, (PUCHAR *)&input, 1024);109109-110110- if (input == NULL)111111- {112112- DBGPRINT(RT_DEBUG_ERROR, ("!!!PRF: no memory!!!\n"));113113- return;114114- }115115-116116- // Generate concatenation input117117- NdisMoveMemory(input, prefix, prefix_len);118118-119119- // Concatenate a single octet containing 0120120- input[prefix_len] = 0;121121-122122- // Concatenate specific data123123- NdisMoveMemory(&input[prefix_len + 1], data, data_len);124124- total_len = prefix_len + 1 + data_len;125125-126126- // Concatenate a single octet containing 0127127- // This octet shall be update later128128- input[total_len] = 0;129129- total_len++;130130-131131- // Iterate to calculate the result by hmac-sha-1132132- // Then concatenate to last result133133- for (i = 0; i < (len + 19) / 20; i++)134134- {135135- HMAC_SHA1(input, total_len, key, key_len, &output[currentindex]);136136- currentindex += 20;137137-138138- // update the last octet139139- input[total_len - 1]++;140140- }141141- os_free_mem(NULL, input);142142-}143143-144144-/*145145- ========================================================================146146-147147- Routine Description:148148- It utilizes PRF-384 or PRF-512 to derive session-specific keys from a PMK.149149- It shall be called by 4-way handshake processing.150150-151151- Arguments:152152- pAd - pointer to our pAdapter context153153- PMK - pointer to PMK154154- ANonce - pointer to ANonce155155- AA - pointer to Authenticator Address156156- SNonce - pointer to SNonce157157- SA - pointer to Supplicant Address158158- len - indicate the length of PTK (octet)159159-160160- Return Value:161161- Output pointer to the PTK162162-163163- Note:164164- Refer to IEEE 802.11i-2004 8.5.1.2165165-166166- ========================================================================167167-*/168168-VOID WpaCountPTK(169169- IN PRTMP_ADAPTER pAd,170170- IN UCHAR *PMK,171171- IN UCHAR *ANonce,172172- IN UCHAR *AA,173173- IN UCHAR *SNonce,174174- IN UCHAR *SA,175175- OUT UCHAR *output,176176- IN UINT len)177177-{178178- UCHAR concatenation[76];179179- UINT CurrPos = 0;180180- UCHAR temp[32];181181- UCHAR Prefix[] = {'P', 'a', 'i', 'r', 'w', 'i', 's', 'e', ' ', 'k', 'e', 'y', ' ',182182- 'e', 'x', 'p', 'a', 'n', 's', 'i', 'o', 'n'};183183-184184- // initiate the concatenation input185185- NdisZeroMemory(temp, sizeof(temp));186186- NdisZeroMemory(concatenation, 76);187187-188188- // Get smaller address189189- if (RTMPCompareMemory(SA, AA, 6) == 1)190190- NdisMoveMemory(concatenation, AA, 6);191191- else192192- NdisMoveMemory(concatenation, SA, 6);193193- CurrPos += 6;194194-195195- // Get larger address196196- if (RTMPCompareMemory(SA, AA, 6) == 1)197197- NdisMoveMemory(&concatenation[CurrPos], SA, 6);198198- else199199- NdisMoveMemory(&concatenation[CurrPos], AA, 6);200200-201201- // store the larger mac address for backward compatible of202202- // ralink proprietary STA-key issue203203- NdisMoveMemory(temp, &concatenation[CurrPos], MAC_ADDR_LEN);204204- CurrPos += 6;205205-206206- // Get smaller Nonce207207- if (RTMPCompareMemory(ANonce, SNonce, 32) == 0)208208- NdisMoveMemory(&concatenation[CurrPos], temp, 32); // patch for ralink proprietary STA-key issue209209- else if (RTMPCompareMemory(ANonce, SNonce, 32) == 1)210210- NdisMoveMemory(&concatenation[CurrPos], SNonce, 32);211211- else212212- NdisMoveMemory(&concatenation[CurrPos], ANonce, 32);213213- CurrPos += 32;214214-215215- // Get larger Nonce216216- if (RTMPCompareMemory(ANonce, SNonce, 32) == 0)217217- NdisMoveMemory(&concatenation[CurrPos], temp, 32); // patch for ralink proprietary STA-key issue218218- else if (RTMPCompareMemory(ANonce, SNonce, 32) == 1)219219- NdisMoveMemory(&concatenation[CurrPos], ANonce, 32);220220- else221221- NdisMoveMemory(&concatenation[CurrPos], SNonce, 32);222222- CurrPos += 32;223223-224224- hex_dump("concatenation=", concatenation, 76);225225-226226- // Use PRF to generate PTK227227- PRF(PMK, LEN_MASTER_KEY, Prefix, 22, concatenation, 76, output, len);228228-229229-}230230-231231-/*232232- ========================================================================233233-234234- Routine Description:235235- Generate random number by software.236236-237237- Arguments:238238- pAd - pointer to our pAdapter context239239- macAddr - pointer to local MAC address240240-241241- Return Value:242242-243243- Note:244244- 802.1ii-2004 Annex H.5245245-246246- ========================================================================247247-*/248248-VOID GenRandom(249249- IN PRTMP_ADAPTER pAd,250250- IN UCHAR *macAddr,251251- OUT UCHAR *random)252252-{253253- INT i, curr;254254- UCHAR local[80], KeyCounter[32];255255- UCHAR result[80];256256- ULONG CurrentTime;257257- UCHAR prefix[] = {'I', 'n', 'i', 't', ' ', 'C', 'o', 'u', 'n', 't', 'e', 'r'};258258-259259- // Zero the related information260260- NdisZeroMemory(result, 80);261261- NdisZeroMemory(local, 80);262262- NdisZeroMemory(KeyCounter, 32);263263-264264- for (i = 0; i < 32; i++)265265- {266266- // copy the local MAC address267267- COPY_MAC_ADDR(local, macAddr);268268- curr = MAC_ADDR_LEN;269269-270270- // concatenate the current time271271- NdisGetSystemUpTime(&CurrentTime);272272- NdisMoveMemory(&local[curr], &CurrentTime, sizeof(CurrentTime));273273- curr += sizeof(CurrentTime);274274-275275- // concatenate the last result276276- NdisMoveMemory(&local[curr], result, 32);277277- curr += 32;278278-279279- // concatenate a variable280280- NdisMoveMemory(&local[curr], &i, 2);281281- curr += 2;282282-283283- // calculate the result284284- PRF(KeyCounter, 32, prefix,12, local, curr, result, 32);285285- }286286-287287- NdisMoveMemory(random, result, 32);288288-}289289-290290-/*291291- ========================================================================292292-293293- Routine Description:294294- Build cipher suite in RSN-IE.295295- It only shall be called by RTMPMakeRSNIE.296296-297297- Arguments:298298- pAd - pointer to our pAdapter context299299- ElementID - indicate the WPA1 or WPA2300300- WepStatus - indicate the encryption type301301- bMixCipher - a boolean to indicate the pairwise cipher and group302302- cipher are the same or not303303-304304- Return Value:305305-306306- Note:307307-308308- ========================================================================309309-*/310310-static VOID RTMPInsertRsnIeCipher(311311- IN PRTMP_ADAPTER pAd,312312- IN UCHAR ElementID,313313- IN UINT WepStatus,314314- IN BOOLEAN bMixCipher,315315- IN UCHAR FlexibleCipher,316316- OUT PUCHAR pRsnIe,317317- OUT UCHAR *rsn_len)318318-{319319- UCHAR PairwiseCnt;320320-321321- *rsn_len = 0;322322-323323- // decide WPA2 or WPA1324324- if (ElementID == Wpa2Ie)325325- {326326- RSNIE2 *pRsnie_cipher = (RSNIE2*)pRsnIe;327327-328328- // Assign the verson as 1329329- pRsnie_cipher->version = 1;330330-331331- switch (WepStatus)332332- {333333- // TKIP mode334334- case Ndis802_11Encryption2Enabled:335335- NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_TKIP, 4);336336- pRsnie_cipher->ucount = 1;337337- NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA2_TKIP, 4);338338- *rsn_len = sizeof(RSNIE2);339339- break;340340-341341- // AES mode342342- case Ndis802_11Encryption3Enabled:343343- if (bMixCipher)344344- NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_TKIP, 4);345345- else346346- NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_CCMP, 4);347347- pRsnie_cipher->ucount = 1;348348- NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA2_CCMP, 4);349349- *rsn_len = sizeof(RSNIE2);350350- break;351351-352352- // TKIP-AES mix mode353353- case Ndis802_11Encryption4Enabled:354354- NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_TKIP, 4);355355-356356- PairwiseCnt = 1;357357- // Insert WPA2 TKIP as the first pairwise cipher358358- if (MIX_CIPHER_WPA2_TKIP_ON(FlexibleCipher))359359- {360360- NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA2_TKIP, 4);361361- // Insert WPA2 AES as the secondary pairwise cipher362362- if (MIX_CIPHER_WPA2_AES_ON(FlexibleCipher))363363- {364364- NdisMoveMemory(pRsnie_cipher->ucast[0].oui + 4, OUI_WPA2_CCMP, 4);365365- PairwiseCnt = 2;366366- }367367- }368368- else369369- {370370- // Insert WPA2 AES as the first pairwise cipher371371- NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA2_CCMP, 4);372372- }373373-374374- pRsnie_cipher->ucount = PairwiseCnt;375375- *rsn_len = sizeof(RSNIE2) + (4 * (PairwiseCnt - 1));376376- break;377377- }378378-379379-#ifndef RT30xx380380- if ((pAd->OpMode == OPMODE_STA) &&381381- (pAd->StaCfg.GroupCipher != Ndis802_11Encryption2Enabled) &&382382- (pAd->StaCfg.GroupCipher != Ndis802_11Encryption3Enabled))383383- {384384- UINT GroupCipher = pAd->StaCfg.GroupCipher;385385- switch(GroupCipher)386386- {387387- case Ndis802_11GroupWEP40Enabled:388388- NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_WEP40, 4);389389- break;390390- case Ndis802_11GroupWEP104Enabled:391391- NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_WEP104, 4);392392- break;393393- }394394- }395395-#endif396396- // swap for big-endian platform397397- pRsnie_cipher->version = cpu2le16(pRsnie_cipher->version);398398- pRsnie_cipher->ucount = cpu2le16(pRsnie_cipher->ucount);399399- }400400- else401401- {402402- RSNIE *pRsnie_cipher = (RSNIE*)pRsnIe;403403-404404- // Assign OUI and version405405- NdisMoveMemory(pRsnie_cipher->oui, OUI_WPA_VERSION, 4);406406- pRsnie_cipher->version = 1;407407-408408- switch (WepStatus)409409- {410410- // TKIP mode411411- case Ndis802_11Encryption2Enabled:412412- NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_TKIP, 4);413413- pRsnie_cipher->ucount = 1;414414- NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA_TKIP, 4);415415- *rsn_len = sizeof(RSNIE);416416- break;417417-418418- // AES mode419419- case Ndis802_11Encryption3Enabled:420420- if (bMixCipher)421421- NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_TKIP, 4);422422- else423423- NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_CCMP, 4);424424- pRsnie_cipher->ucount = 1;425425- NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA_CCMP, 4);426426- *rsn_len = sizeof(RSNIE);427427- break;428428-429429- // TKIP-AES mix mode430430- case Ndis802_11Encryption4Enabled:431431- NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_TKIP, 4);432432-433433- PairwiseCnt = 1;434434- // Insert WPA TKIP as the first pairwise cipher435435- if (MIX_CIPHER_WPA_TKIP_ON(FlexibleCipher))436436- {437437- NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA_TKIP, 4);438438- // Insert WPA AES as the secondary pairwise cipher439439- if (MIX_CIPHER_WPA_AES_ON(FlexibleCipher))440440- {441441- NdisMoveMemory(pRsnie_cipher->ucast[0].oui + 4, OUI_WPA_CCMP, 4);442442- PairwiseCnt = 2;443443- }444444- }445445- else446446- {447447- // Insert WPA AES as the first pairwise cipher448448- NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA_CCMP, 4);449449- }450450-451451- pRsnie_cipher->ucount = PairwiseCnt;452452- *rsn_len = sizeof(RSNIE) + (4 * (PairwiseCnt - 1));453453- break;454454- }455455-456456-#ifndef RT30xx457457- if ((pAd->OpMode == OPMODE_STA) &&458458- (pAd->StaCfg.GroupCipher != Ndis802_11Encryption2Enabled) &&459459- (pAd->StaCfg.GroupCipher != Ndis802_11Encryption3Enabled))460460- {461461- UINT GroupCipher = pAd->StaCfg.GroupCipher;462462- switch(GroupCipher)463463- {464464- case Ndis802_11GroupWEP40Enabled:465465- NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_WEP40, 4);466466- break;467467- case Ndis802_11GroupWEP104Enabled:468468- NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_WEP104, 4);469469- break;470470- }471471- }472472-#endif473473- // swap for big-endian platform474474- pRsnie_cipher->version = cpu2le16(pRsnie_cipher->version);475475- pRsnie_cipher->ucount = cpu2le16(pRsnie_cipher->ucount);476476- }477477-}478478-479479-/*480480- ========================================================================481481-482482- Routine Description:483483- Build AKM suite in RSN-IE.484484- It only shall be called by RTMPMakeRSNIE.485485-486486- Arguments:487487- pAd - pointer to our pAdapter context488488- ElementID - indicate the WPA1 or WPA2489489- AuthMode - indicate the authentication mode490490- apidx - indicate the interface index491491-492492- Return Value:493493-494494- Note:495495-496496- ========================================================================497497-*/498498-static VOID RTMPInsertRsnIeAKM(499499- IN PRTMP_ADAPTER pAd,500500- IN UCHAR ElementID,501501- IN UINT AuthMode,502502- IN UCHAR apidx,503503- OUT PUCHAR pRsnIe,504504- OUT UCHAR *rsn_len)505505-{506506- RSNIE_AUTH *pRsnie_auth;507507-508508- pRsnie_auth = (RSNIE_AUTH*)(pRsnIe + (*rsn_len));509509-510510- // decide WPA2 or WPA1511511- if (ElementID == Wpa2Ie)512512- {513513- switch (AuthMode)514514- {515515- case Ndis802_11AuthModeWPA2:516516- case Ndis802_11AuthModeWPA1WPA2:517517- pRsnie_auth->acount = 1;518518- NdisMoveMemory(pRsnie_auth->auth[0].oui, OUI_WPA2_8021X_AKM, 4);519519- break;520520-521521- case Ndis802_11AuthModeWPA2PSK:522522- case Ndis802_11AuthModeWPA1PSKWPA2PSK:523523- pRsnie_auth->acount = 1;524524- NdisMoveMemory(pRsnie_auth->auth[0].oui, OUI_WPA2_PSK_AKM, 4);525525- break;526526- }527527- }528528- else529529- {530530- switch (AuthMode)531531- {532532- case Ndis802_11AuthModeWPA:533533- case Ndis802_11AuthModeWPA1WPA2:534534- pRsnie_auth->acount = 1;535535- NdisMoveMemory(pRsnie_auth->auth[0].oui, OUI_WPA_8021X_AKM, 4);536536- break;537537-538538- case Ndis802_11AuthModeWPAPSK:539539- case Ndis802_11AuthModeWPA1PSKWPA2PSK:540540- pRsnie_auth->acount = 1;541541- NdisMoveMemory(pRsnie_auth->auth[0].oui, OUI_WPA_PSK_AKM, 4);542542- break;543543-544544- case Ndis802_11AuthModeWPANone:545545- pRsnie_auth->acount = 1;546546- NdisMoveMemory(pRsnie_auth->auth[0].oui, OUI_WPA_NONE_AKM, 4);547547- break;548548- }549549- }550550-551551- pRsnie_auth->acount = cpu2le16(pRsnie_auth->acount);552552-553553- (*rsn_len) += sizeof(RSNIE_AUTH); // update current RSNIE length554554-555555-}556556-557557-/*558558- ========================================================================559559-560560- Routine Description:561561- Build capability in RSN-IE.562562- It only shall be called by RTMPMakeRSNIE.563563-564564- Arguments:565565- pAd - pointer to our pAdapter context566566- ElementID - indicate the WPA1 or WPA2567567- apidx - indicate the interface index568568-569569- Return Value:570570-571571- Note:572572-573573- ========================================================================574574-*/575575-static VOID RTMPInsertRsnIeCap(576576- IN PRTMP_ADAPTER pAd,577577- IN UCHAR ElementID,578578- IN UCHAR apidx,579579- OUT PUCHAR pRsnIe,580580- OUT UCHAR *rsn_len)581581-{582582- RSN_CAPABILITIES *pRSN_Cap;583583-584584- // it could be ignored in WPA1 mode585585- if (ElementID == WpaIe)586586- return;587587-588588- pRSN_Cap = (RSN_CAPABILITIES*)(pRsnIe + (*rsn_len));589589-590590-591591- pRSN_Cap->word = cpu2le16(pRSN_Cap->word);592592-593593- (*rsn_len) += sizeof(RSN_CAPABILITIES); // update current RSNIE length594594-595595-}596596-597597-598598-/*599599- ========================================================================600600-601601- Routine Description:602602- Build RSN IE context. It is not included element-ID and length.603603-604604- Arguments:605605- pAd - pointer to our pAdapter context606606- AuthMode - indicate the authentication mode607607- WepStatus - indicate the encryption type608608- apidx - indicate the interface index609609-610610- Return Value:611611-612612- Note:613613-614614- ========================================================================615615-*/616616-VOID RTMPMakeRSNIE(617617- IN PRTMP_ADAPTER pAd,618618- IN UINT AuthMode,619619- IN UINT WepStatus,620620- IN UCHAR apidx)621621-{622622- PUCHAR pRsnIe = NULL; // primary RSNIE623623- UCHAR *rsnielen_cur_p = 0; // the length of the primary RSNIE624624- UCHAR *rsnielen_ex_cur_p = 0; // the length of the secondary RSNIE625625- UCHAR PrimaryRsnie;626626- BOOLEAN bMixCipher = FALSE; // indicate the pairwise and group cipher are different627627- UCHAR p_offset;628628- WPA_MIX_PAIR_CIPHER FlexibleCipher = MIX_CIPHER_NOTUSE; // it provide the more flexible cipher combination in WPA-WPA2 and TKIPAES mode629629-630630- rsnielen_cur_p = NULL;631631- rsnielen_ex_cur_p = NULL;632632-633633- {634634- {635635- if (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE)636636- {637637- if (AuthMode < Ndis802_11AuthModeWPA)638638- return;639639- }640640- else641641- {642642- // Support WPAPSK or WPA2PSK in STA-Infra mode643643- // Support WPANone in STA-Adhoc mode644644- if ((AuthMode != Ndis802_11AuthModeWPAPSK) &&645645- (AuthMode != Ndis802_11AuthModeWPA2PSK) &&646646- (AuthMode != Ndis802_11AuthModeWPANone)647647- )648648- return;649649- }650650-651651- DBGPRINT(RT_DEBUG_TRACE,("==> RTMPMakeRSNIE(STA)\n"));652652-653653- // Zero RSNIE context654654- pAd->StaCfg.RSNIE_Len = 0;655655- NdisZeroMemory(pAd->StaCfg.RSN_IE, MAX_LEN_OF_RSNIE);656656-657657- // Pointer to RSNIE658658- rsnielen_cur_p = &pAd->StaCfg.RSNIE_Len;659659- pRsnIe = pAd->StaCfg.RSN_IE;660660-661661- bMixCipher = pAd->StaCfg.bMixCipher;662662- }663663- }664664-665665- // indicate primary RSNIE as WPA or WPA2666666- if ((AuthMode == Ndis802_11AuthModeWPA) ||667667- (AuthMode == Ndis802_11AuthModeWPAPSK) ||668668- (AuthMode == Ndis802_11AuthModeWPANone) ||669669- (AuthMode == Ndis802_11AuthModeWPA1WPA2) ||670670- (AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK))671671- PrimaryRsnie = WpaIe;672672- else673673- PrimaryRsnie = Wpa2Ie;674674-675675- {676676- // Build the primary RSNIE677677- // 1. insert cipher suite678678- RTMPInsertRsnIeCipher(pAd, PrimaryRsnie, WepStatus, bMixCipher, FlexibleCipher, pRsnIe, &p_offset);679679-680680- // 2. insert AKM681681- RTMPInsertRsnIeAKM(pAd, PrimaryRsnie, AuthMode, apidx, pRsnIe, &p_offset);682682-683683- // 3. insert capability684684- RTMPInsertRsnIeCap(pAd, PrimaryRsnie, apidx, pRsnIe, &p_offset);685685- }686686-687687- // 4. update the RSNIE length688688- *rsnielen_cur_p = p_offset;689689-690690- hex_dump("The primary RSNIE", pRsnIe, (*rsnielen_cur_p));691691-692692-693693-}694694-695695-/*696696- ==========================================================================697697- Description:698698- Check whether the received frame is EAP frame.699699-700700- Arguments:701701- pAd - pointer to our pAdapter context702702- pEntry - pointer to active entry703703- pData - the received frame704704- DataByteCount - the received frame's length705705- FromWhichBSSID - indicate the interface index706706-707707- Return:708708- TRUE - This frame is EAP frame709709- FALSE - otherwise710710- ==========================================================================711711-*/712712-BOOLEAN RTMPCheckWPAframe(713713- IN PRTMP_ADAPTER pAd,714714- IN PMAC_TABLE_ENTRY pEntry,715715- IN PUCHAR pData,716716- IN ULONG DataByteCount,717717- IN UCHAR FromWhichBSSID)718718-{719719- ULONG Body_len;720720- BOOLEAN Cancelled;721721-722722-723723- if(DataByteCount < (LENGTH_802_1_H + LENGTH_EAPOL_H))724724- return FALSE;725725-726726-727727- // Skip LLC header728728- if (NdisEqualMemory(SNAP_802_1H, pData, 6) ||729729- // Cisco 1200 AP may send packet with SNAP_BRIDGE_TUNNEL730730- NdisEqualMemory(SNAP_BRIDGE_TUNNEL, pData, 6))731731- {732732- pData += 6;733733- }734734- // Skip 2-bytes EAPoL type735735- if (NdisEqualMemory(EAPOL, pData, 2))736736- {737737- pData += 2;738738- }739739- else740740- return FALSE;741741-742742- switch (*(pData+1))743743- {744744- case EAPPacket:745745- Body_len = (*(pData+2)<<8) | (*(pData+3));746746- DBGPRINT(RT_DEBUG_TRACE, ("Receive EAP-Packet frame, TYPE = 0, Length = %ld\n", Body_len));747747- break;748748- case EAPOLStart:749749- DBGPRINT(RT_DEBUG_TRACE, ("Receive EAPOL-Start frame, TYPE = 1 \n"));750750- if (pEntry->EnqueueEapolStartTimerRunning != EAPOL_START_DISABLE)751751- {752752- DBGPRINT(RT_DEBUG_TRACE, ("Cancel the EnqueueEapolStartTimerRunning \n"));753753- RTMPCancelTimer(&pEntry->EnqueueStartForPSKTimer, &Cancelled);754754- pEntry->EnqueueEapolStartTimerRunning = EAPOL_START_DISABLE;755755- }756756- break;757757- case EAPOLLogoff:758758- DBGPRINT(RT_DEBUG_TRACE, ("Receive EAPOLLogoff frame, TYPE = 2 \n"));759759- break;760760- case EAPOLKey:761761- Body_len = (*(pData+2)<<8) | (*(pData+3));762762- DBGPRINT(RT_DEBUG_TRACE, ("Receive EAPOL-Key frame, TYPE = 3, Length = %ld\n", Body_len));763763- break;764764- case EAPOLASFAlert:765765- DBGPRINT(RT_DEBUG_TRACE, ("Receive EAPOLASFAlert frame, TYPE = 4 \n"));766766- break;767767- default:768768- return FALSE;769769-770770- }771771- return TRUE;772772-}773773-774774-775775-/*776776- ==========================================================================777777- Description:778778- ENCRYPT AES GTK before sending in EAPOL frame.779779- AES GTK length = 128 bit, so fix blocks for aes-key-wrap as 2 in this function.780780- This function references to RFC 3394 for aes key wrap algorithm.781781- Return:782782- ==========================================================================783783-*/784784-VOID AES_GTK_KEY_WRAP(785785- IN UCHAR *key,786786- IN UCHAR *plaintext,787787- IN UCHAR p_len,788788- OUT UCHAR *ciphertext)789789-{790790- UCHAR A[8], BIN[16], BOUT[16];791791- UCHAR R[512];792792- INT num_blocks = p_len/8; // unit:64bits793793- INT i, j;794794- aes_context aesctx;795795- UCHAR xor;796796-797797- rtmp_aes_set_key(&aesctx, key, 128);798798-799799- // Init IA800800- for (i = 0; i < 8; i++)801801- A[i] = 0xa6;802802-803803- //Input plaintext804804- for (i = 0; i < num_blocks; i++)805805- {806806- for (j = 0 ; j < 8; j++)807807- R[8 * (i + 1) + j] = plaintext[8 * i + j];808808- }809809-810810- // Key Mix811811- for (j = 0; j < 6; j++)812812- {813813- for(i = 1; i <= num_blocks; i++)814814- {815815- //phase 1816816- NdisMoveMemory(BIN, A, 8);817817- NdisMoveMemory(&BIN[8], &R[8 * i], 8);818818- rtmp_aes_encrypt(&aesctx, BIN, BOUT);819819-820820- NdisMoveMemory(A, &BOUT[0], 8);821821- xor = num_blocks * j + i;822822- A[7] = BOUT[7] ^ xor;823823- NdisMoveMemory(&R[8 * i], &BOUT[8], 8);824824- }825825- }826826-827827- // Output ciphertext828828- NdisMoveMemory(ciphertext, A, 8);829829-830830- for (i = 1; i <= num_blocks; i++)831831- {832832- for (j = 0 ; j < 8; j++)833833- ciphertext[8 * i + j] = R[8 * i + j];834834- }835835-}836836-837837-838838-/*839839- ========================================================================840840-841841- Routine Description:842842- Misc function to decrypt AES body843843-844844- Arguments:845845-846846- Return Value:847847-848848- Note:849849- This function references to RFC 3394 for aes key unwrap algorithm.850850-851851- ========================================================================852852-*/853853-VOID AES_GTK_KEY_UNWRAP(854854- IN UCHAR *key,855855- OUT UCHAR *plaintext,856856- IN UCHAR c_len,857857- IN UCHAR *ciphertext)858858-859859-{860860- UCHAR A[8], BIN[16], BOUT[16];861861- UCHAR xor;862862- INT i, j;863863- aes_context aesctx;864864- UCHAR *R;865865- INT num_blocks = c_len/8; // unit:64bits866866-867867-868868- os_alloc_mem(NULL, (PUCHAR *)&R, 512);869869-870870- if (R == NULL)871871- {872872- DBGPRINT(RT_DEBUG_ERROR, ("!!!AES_GTK_KEY_UNWRAP: no memory!!!\n"));873873- return;874874- } /* End of if */875875-876876- // Initialize877877- NdisMoveMemory(A, ciphertext, 8);878878- //Input plaintext879879- for(i = 0; i < (c_len-8); i++)880880- {881881- R[ i] = ciphertext[i + 8];882882- }883883-884884- rtmp_aes_set_key(&aesctx, key, 128);885885-886886- for(j = 5; j >= 0; j--)887887- {888888- for(i = (num_blocks-1); i > 0; i--)889889- {890890- xor = (num_blocks -1 )* j + i;891891- NdisMoveMemory(BIN, A, 8);892892- BIN[7] = A[7] ^ xor;893893- NdisMoveMemory(&BIN[8], &R[(i-1)*8], 8);894894- rtmp_aes_decrypt(&aesctx, BIN, BOUT);895895- NdisMoveMemory(A, &BOUT[0], 8);896896- NdisMoveMemory(&R[(i-1)*8], &BOUT[8], 8);897897- }898898- }899899-900900- // OUTPUT901901- for(i = 0; i < c_len; i++)902902- {903903- plaintext[i] = R[i];904904- }905905-906906-907907- os_free_mem(NULL, R);908908-}909909-910910-/*911911- ==========================================================================912912- Description:913913- Report the EAP message type914914-915915- Arguments:916916- msg - EAPOL_PAIR_MSG_1917917- EAPOL_PAIR_MSG_2918918- EAPOL_PAIR_MSG_3919919- EAPOL_PAIR_MSG_4920920- EAPOL_GROUP_MSG_1921921- EAPOL_GROUP_MSG_2922922-923923- Return:924924- message type string925925-926926- ==========================================================================927927-*/928928-CHAR *GetEapolMsgType(CHAR msg)929929-{930930- if(msg == EAPOL_PAIR_MSG_1)931931- return "Pairwise Message 1";932932- else if(msg == EAPOL_PAIR_MSG_2)933933- return "Pairwise Message 2";934934- else if(msg == EAPOL_PAIR_MSG_3)935935- return "Pairwise Message 3";936936- else if(msg == EAPOL_PAIR_MSG_4)937937- return "Pairwise Message 4";938938- else if(msg == EAPOL_GROUP_MSG_1)939939- return "Group Message 1";940940- else if(msg == EAPOL_GROUP_MSG_2)941941- return "Group Message 2";942942- else943943- return "Invalid Message";944944-}945945-946946-947947-/*948948- ========================================================================949949-950950- Routine Description:951951- Check Sanity RSN IE of EAPoL message952952-953953- Arguments:954954-955955- Return Value:956956-957957-958958- ========================================================================959959-*/960960-BOOLEAN RTMPCheckRSNIE(961961- IN PRTMP_ADAPTER pAd,962962- IN PUCHAR pData,963963- IN UCHAR DataLen,964964- IN MAC_TABLE_ENTRY *pEntry,965965- OUT UCHAR *Offset)966966-{967967- PUCHAR pVIE;968968- UCHAR len;969969- PEID_STRUCT pEid;970970- BOOLEAN result = FALSE;971971-972972- pVIE = pData;973973- len = DataLen;974974- *Offset = 0;975975-976976- while (len > sizeof(RSNIE2))977977- {978978- pEid = (PEID_STRUCT) pVIE;979979- // WPA RSN IE980980- if ((pEid->Eid == IE_WPA) && (NdisEqualMemory(pEid->Octet, WPA_OUI, 4)))981981- {982982- if ((pEntry->AuthMode == Ndis802_11AuthModeWPA || pEntry->AuthMode == Ndis802_11AuthModeWPAPSK) &&983983- (NdisEqualMemory(pVIE, pEntry->RSN_IE, pEntry->RSNIE_Len)) &&984984- (pEntry->RSNIE_Len == (pEid->Len + 2)))985985- {986986- result = TRUE;987987- }988988-989989- *Offset += (pEid->Len + 2);990990- }991991- // WPA2 RSN IE992992- else if ((pEid->Eid == IE_RSN) && (NdisEqualMemory(pEid->Octet + 2, RSN_OUI, 3)))993993- {994994- if ((pEntry->AuthMode == Ndis802_11AuthModeWPA2 || pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK) &&995995- (NdisEqualMemory(pVIE, pEntry->RSN_IE, pEntry->RSNIE_Len)) &&996996- (pEntry->RSNIE_Len == (pEid->Len + 2))/* ToDo-AlbertY for mesh*/)997997- {998998- result = TRUE;999999- }10001000-10011001- *Offset += (pEid->Len + 2);10021002- }10031003- else10041004- {10051005- break;10061006- }10071007-10081008- pVIE += (pEid->Len + 2);10091009- len -= (pEid->Len + 2);10101010- }10111011-10121012-10131013- return result;10141014-10151015-}10161016-10171017-10181018-/*10191019- ========================================================================10201020-10211021- Routine Description:10221022- Parse KEYDATA field. KEYDATA[] May contain 2 RSN IE and optionally GTK.10231023- GTK is encaptulated in KDE format at p.83 802.11i D1010241024-10251025- Arguments:10261026-10271027- Return Value:10281028-10291029- Note:10301030- 802.11i D1010311031-10321032- ========================================================================10331033-*/10341034-BOOLEAN RTMPParseEapolKeyData(10351035- IN PRTMP_ADAPTER pAd,10361036- IN PUCHAR pKeyData,10371037- IN UCHAR KeyDataLen,10381038- IN UCHAR GroupKeyIndex,10391039- IN UCHAR MsgType,10401040- IN BOOLEAN bWPA2,10411041- IN MAC_TABLE_ENTRY *pEntry)10421042-{10431043- PKDE_ENCAP pKDE = NULL;10441044- PUCHAR pMyKeyData = pKeyData;10451045- UCHAR KeyDataLength = KeyDataLen;10461046- UCHAR GTKLEN = 0;10471047- UCHAR DefaultIdx = 0;10481048- UCHAR skip_offset;10491049-10501050- // Verify The RSN IE contained in pairewise_msg_2 && pairewise_msg_3 and skip it10511051- if (MsgType == EAPOL_PAIR_MSG_2 || MsgType == EAPOL_PAIR_MSG_3)10521052- {10531053- // Check RSN IE whether it is WPA2/WPA2PSK10541054- if (!RTMPCheckRSNIE(pAd, pKeyData, KeyDataLen, pEntry, &skip_offset))10551055- {10561056- // send wireless event - for RSN IE different10571057- if (pAd->CommonCfg.bWirelessEvent)10581058- RTMPSendWirelessEvent(pAd, IW_RSNIE_DIFF_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0);10591059-10601060- DBGPRINT(RT_DEBUG_ERROR, ("RSN_IE Different in msg %d of 4-way handshake!\n", MsgType));10611061- hex_dump("Receive RSN_IE ", pKeyData, KeyDataLen);10621062- hex_dump("Desired RSN_IE ", pEntry->RSN_IE, pEntry->RSNIE_Len);10631063-10641064- return FALSE;10651065- }10661066- else10671067- {10681068- if (bWPA2 && MsgType == EAPOL_PAIR_MSG_3)10691069- {10701070- // skip RSN IE10711071- pMyKeyData += skip_offset;10721072- KeyDataLength -= skip_offset;10731073- DBGPRINT(RT_DEBUG_TRACE, ("RTMPParseEapolKeyData ==> WPA2/WPA2PSK RSN IE matched in Msg 3, Length(%d) \n", skip_offset));10741074- }10751075- else10761076- return TRUE;10771077- }10781078- }10791079-10801080- DBGPRINT(RT_DEBUG_TRACE,("RTMPParseEapolKeyData ==> KeyDataLength %d without RSN_IE \n", KeyDataLength));10811081-10821082- // Parse EKD format in pairwise_msg_3_WPA2 && group_msg_1_WPA210831083- if (bWPA2 && (MsgType == EAPOL_PAIR_MSG_3 || MsgType == EAPOL_GROUP_MSG_1))10841084- {10851085- if (KeyDataLength >= 8) // KDE format exclude GTK length10861086- {10871087- pKDE = (PKDE_ENCAP) pMyKeyData;10881088-10891089-10901090- DefaultIdx = pKDE->GTKEncap.Kid;10911091-10921092- // Sanity check - KED length10931093- if (KeyDataLength < (pKDE->Len + 2))10941094- {10951095- DBGPRINT(RT_DEBUG_ERROR, ("ERROR: The len from KDE is too short \n"));10961096- return FALSE;10971097- }10981098-10991099- // Get GTK length - refer to IEEE 802.11i-2004 p.8211001100- GTKLEN = pKDE->Len -6;11011101- if (GTKLEN < LEN_AES_KEY)11021102- {11031103- DBGPRINT(RT_DEBUG_ERROR, ("ERROR: GTK Key length is too short (%d) \n", GTKLEN));11041104- return FALSE;11051105- }11061106-11071107- }11081108- else11091109- {11101110- DBGPRINT(RT_DEBUG_ERROR, ("ERROR: KDE format length is too short \n"));11111111- return FALSE;11121112- }11131113-11141114- DBGPRINT(RT_DEBUG_TRACE, ("GTK in KDE format ,DefaultKeyID=%d, KeyLen=%d \n", DefaultIdx, GTKLEN));11151115- // skip it11161116- pMyKeyData += 8;11171117- KeyDataLength -= 8;11181118-11191119- }11201120- else if (!bWPA2 && MsgType == EAPOL_GROUP_MSG_1)11211121- {11221122- DefaultIdx = GroupKeyIndex;11231123- DBGPRINT(RT_DEBUG_TRACE, ("GTK DefaultKeyID=%d \n", DefaultIdx));11241124- }11251125-11261126- // Sanity check - shared key index must be 1 ~ 311271127- if (DefaultIdx < 1 || DefaultIdx > 3)11281128- {11291129- DBGPRINT(RT_DEBUG_ERROR, ("ERROR: GTK Key index(%d) is invalid in %s %s \n", DefaultIdx, ((bWPA2) ? "WPA2" : "WPA"), GetEapolMsgType(MsgType)));11301130- return FALSE;11311131- }11321132-11331133- return TRUE;11341134-11351135-}11361136-11371137-11381138-/*11391139- ========================================================================11401140-11411141- Routine Description:11421142- Construct EAPoL message for WPA handshaking11431143- Its format is below,11441144-11451145- +--------------------+11461146- | Protocol Version | 1 octet11471147- +--------------------+11481148- | Protocol Type | 1 octet11491149- +--------------------+11501150- | Body Length | 2 octets11511151- +--------------------+11521152- | Descriptor Type | 1 octet11531153- +--------------------+11541154- | Key Information | 2 octets11551155- +--------------------+11561156- | Key Length | 1 octet11571157- +--------------------+11581158- | Key Repaly Counter | 8 octets11591159- +--------------------+11601160- | Key Nonce | 32 octets11611161- +--------------------+11621162- | Key IV | 16 octets11631163- +--------------------+11641164- | Key RSC | 8 octets11651165- +--------------------+11661166- | Key ID or Reserved | 8 octets11671167- +--------------------+11681168- | Key MIC | 16 octets11691169- +--------------------+11701170- | Key Data Length | 2 octets11711171- +--------------------+11721172- | Key Data | n octets11731173- +--------------------+11741174-11751175-11761176- Arguments:11771177- pAd Pointer to our adapter11781178-11791179- Return Value:11801180- None11811181-11821182- Note:11831183-11841184- ========================================================================11851185-*/11861186-VOID ConstructEapolMsg(11871187- IN PRTMP_ADAPTER pAd,11881188- IN UCHAR AuthMode,11891189- IN UCHAR WepStatus,11901190- IN UCHAR GroupKeyWepStatus,11911191- IN UCHAR MsgType,11921192- IN UCHAR DefaultKeyIdx,11931193- IN UCHAR *ReplayCounter,11941194- IN UCHAR *KeyNonce,11951195- IN UCHAR *TxRSC,11961196- IN UCHAR *PTK,11971197- IN UCHAR *GTK,11981198- IN UCHAR *RSNIE,11991199- IN UCHAR RSNIE_Len,12001200- OUT PEAPOL_PACKET pMsg)12011201-{12021202- BOOLEAN bWPA2 = FALSE;12031203-12041204- // Choose WPA2 or not12051205- if ((AuthMode == Ndis802_11AuthModeWPA2) || (AuthMode == Ndis802_11AuthModeWPA2PSK))12061206- bWPA2 = TRUE;12071207-12081208- // Init Packet and Fill header12091209- pMsg->ProVer = EAPOL_VER;12101210- pMsg->ProType = EAPOLKey;12111211-12121212- // Default 95 bytes, the EAPoL-Key descriptor exclude Key-data field12131213- pMsg->Body_Len[1] = LEN_EAPOL_KEY_MSG;12141214-12151215- // Fill in EAPoL descriptor12161216- if (bWPA2)12171217- pMsg->KeyDesc.Type = WPA2_KEY_DESC;12181218- else12191219- pMsg->KeyDesc.Type = WPA1_KEY_DESC;12201220-12211221- // Fill in Key information, refer to IEEE Std 802.11i-2004 page 7812221222- // When either the pairwise or the group cipher is AES, the DESC_TYPE_AES(2) shall be used.12231223- pMsg->KeyDesc.KeyInfo.KeyDescVer =12241224- (((WepStatus == Ndis802_11Encryption3Enabled) || (GroupKeyWepStatus == Ndis802_11Encryption3Enabled)) ? (DESC_TYPE_AES) : (DESC_TYPE_TKIP));12251225-12261226- // Specify Key Type as Group(0) or Pairwise(1)12271227- if (MsgType >= EAPOL_GROUP_MSG_1)12281228- pMsg->KeyDesc.KeyInfo.KeyType = GROUPKEY;12291229- else12301230- pMsg->KeyDesc.KeyInfo.KeyType = PAIRWISEKEY;12311231-12321232- // Specify Key Index, only group_msg1_WPA112331233- if (!bWPA2 && (MsgType >= EAPOL_GROUP_MSG_1))12341234- pMsg->KeyDesc.KeyInfo.KeyIndex = DefaultKeyIdx;12351235-12361236- if (MsgType == EAPOL_PAIR_MSG_3)12371237- pMsg->KeyDesc.KeyInfo.Install = 1;12381238-12391239- if ((MsgType == EAPOL_PAIR_MSG_1) || (MsgType == EAPOL_PAIR_MSG_3) || (MsgType == EAPOL_GROUP_MSG_1))12401240- pMsg->KeyDesc.KeyInfo.KeyAck = 1;12411241-12421242- if (MsgType != EAPOL_PAIR_MSG_1)12431243- pMsg->KeyDesc.KeyInfo.KeyMic = 1;12441244-12451245- if ((bWPA2 && (MsgType >= EAPOL_PAIR_MSG_3)) || (!bWPA2 && (MsgType >= EAPOL_GROUP_MSG_1)))12461246- {12471247- pMsg->KeyDesc.KeyInfo.Secure = 1;12481248- }12491249-12501250- if (bWPA2 && ((MsgType == EAPOL_PAIR_MSG_3) || (MsgType == EAPOL_GROUP_MSG_1)))12511251- {12521252- pMsg->KeyDesc.KeyInfo.EKD_DL = 1;12531253- }12541254-12551255- // key Information element has done.12561256- *(USHORT *)(&pMsg->KeyDesc.KeyInfo) = cpu2le16(*(USHORT *)(&pMsg->KeyDesc.KeyInfo));12571257-12581258- // Fill in Key Length12591259- {12601260- if (MsgType >= EAPOL_GROUP_MSG_1)12611261- {12621262- // the length of group key cipher12631263- pMsg->KeyDesc.KeyLength[1] = ((GroupKeyWepStatus == Ndis802_11Encryption2Enabled) ? TKIP_GTK_LENGTH : LEN_AES_KEY);12641264- }12651265- else12661266- {12671267- // the length of pairwise key cipher12681268- pMsg->KeyDesc.KeyLength[1] = ((WepStatus == Ndis802_11Encryption2Enabled) ? LEN_TKIP_KEY : LEN_AES_KEY);12691269- }12701270- }12711271-12721272- // Fill in replay counter12731273- NdisMoveMemory(pMsg->KeyDesc.ReplayCounter, ReplayCounter, LEN_KEY_DESC_REPLAY);12741274-12751275- // Fill Key Nonce field12761276- // ANonce : pairwise_msg1 & pairwise_msg312771277- // SNonce : pairwise_msg212781278- // GNonce : group_msg1_wpa112791279- if ((MsgType <= EAPOL_PAIR_MSG_3) || ((!bWPA2 && (MsgType == EAPOL_GROUP_MSG_1))))12801280- NdisMoveMemory(pMsg->KeyDesc.KeyNonce, KeyNonce, LEN_KEY_DESC_NONCE);12811281-12821282- // Fill key IV - WPA2 as 0, WPA1 as random12831283- if (!bWPA2 && (MsgType == EAPOL_GROUP_MSG_1))12841284- {12851285- // Suggest IV be random number plus some number,12861286- NdisMoveMemory(pMsg->KeyDesc.KeyIv, &KeyNonce[16], LEN_KEY_DESC_IV);12871287- pMsg->KeyDesc.KeyIv[15] += 2;12881288- }12891289-12901290- // Fill Key RSC field12911291- // It contains the RSC for the GTK being installed.12921292- if ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2) || (MsgType == EAPOL_GROUP_MSG_1))12931293- {12941294- NdisMoveMemory(pMsg->KeyDesc.KeyRsc, TxRSC, 6);12951295- }12961296-12971297- // Clear Key MIC field for MIC calculation later12981298- NdisZeroMemory(pMsg->KeyDesc.KeyMic, LEN_KEY_DESC_MIC);12991299-13001300- ConstructEapolKeyData(pAd,13011301- AuthMode,13021302- WepStatus,13031303- GroupKeyWepStatus,13041304- MsgType,13051305- DefaultKeyIdx,13061306- bWPA2,13071307- PTK,13081308- GTK,13091309- RSNIE,13101310- RSNIE_Len,13111311- pMsg);13121312-13131313- // Calculate MIC and fill in KeyMic Field except Pairwise Msg 1.13141314- if (MsgType != EAPOL_PAIR_MSG_1)13151315- {13161316- CalculateMIC(pAd, WepStatus, PTK, pMsg);13171317- }13181318-13191319- DBGPRINT(RT_DEBUG_TRACE, ("===> ConstructEapolMsg for %s %s\n", ((bWPA2) ? "WPA2" : "WPA"), GetEapolMsgType(MsgType)));13201320- DBGPRINT(RT_DEBUG_TRACE, (" Body length = %d \n", pMsg->Body_Len[1]));13211321- DBGPRINT(RT_DEBUG_TRACE, (" Key length = %d \n", pMsg->KeyDesc.KeyLength[1]));13221322-13231323-13241324-}13251325-13261326-/*13271327- ========================================================================13281328-13291329- Routine Description:13301330- Construct the Key Data field of EAPoL message13311331-13321332- Arguments:13331333- pAd Pointer to our adapter13341334- Elem Message body13351335-13361336- Return Value:13371337- None13381338-13391339- Note:13401340-13411341- ========================================================================13421342-*/13431343-VOID ConstructEapolKeyData(13441344- IN PRTMP_ADAPTER pAd,13451345- IN UCHAR AuthMode,13461346- IN UCHAR WepStatus,13471347- IN UCHAR GroupKeyWepStatus,13481348- IN UCHAR MsgType,13491349- IN UCHAR DefaultKeyIdx,13501350- IN BOOLEAN bWPA2Capable,13511351- IN UCHAR *PTK,13521352- IN UCHAR *GTK,13531353- IN UCHAR *RSNIE,13541354- IN UCHAR RSNIE_LEN,13551355- OUT PEAPOL_PACKET pMsg)13561356-{13571357- UCHAR *mpool, *Key_Data, *Rc4GTK;13581358- UCHAR ekey[(LEN_KEY_DESC_IV+LEN_EAP_EK)];13591359- UCHAR data_offset;13601360-13611361-13621362- if (MsgType == EAPOL_PAIR_MSG_1 || MsgType == EAPOL_PAIR_MSG_4 || MsgType == EAPOL_GROUP_MSG_2)13631363- return;13641364-13651365- // allocate memory pool13661366- os_alloc_mem(pAd, (PUCHAR *)&mpool, 1500);13671367-13681368- if (mpool == NULL)13691369- return;13701370-13711371- /* Rc4GTK Len = 512 */13721372- Rc4GTK = (UCHAR *) ROUND_UP(mpool, 4);13731373- /* Key_Data Len = 512 */13741374- Key_Data = (UCHAR *) ROUND_UP(Rc4GTK + 512, 4);13751375-13761376- NdisZeroMemory(Key_Data, 512);13771377- pMsg->KeyDesc.KeyDataLen[1] = 0;13781378- data_offset = 0;13791379-13801380- // Encapsulate RSNIE in pairwise_msg2 & pairwise_msg313811381- if (RSNIE_LEN && ((MsgType == EAPOL_PAIR_MSG_2) || (MsgType == EAPOL_PAIR_MSG_3)))13821382- {13831383- if (bWPA2Capable)13841384- Key_Data[data_offset + 0] = IE_WPA2;13851385- else13861386- Key_Data[data_offset + 0] = IE_WPA;13871387-13881388- Key_Data[data_offset + 1] = RSNIE_LEN;13891389- NdisMoveMemory(&Key_Data[data_offset + 2], RSNIE, RSNIE_LEN);13901390- data_offset += (2 + RSNIE_LEN);13911391- }13921392-13931393- // Encapsulate KDE format in pairwise_msg3_WPA2 & group_msg1_WPA213941394- if (bWPA2Capable && ((MsgType == EAPOL_PAIR_MSG_3) || (MsgType == EAPOL_GROUP_MSG_1)))13951395- {13961396- // Key Data Encapsulation (KDE) format - 802.11i-2004 Figure-43w and Table-20h13971397- Key_Data[data_offset + 0] = 0xDD;13981398-13991399- if (GroupKeyWepStatus == Ndis802_11Encryption3Enabled)14001400- {14011401- Key_Data[data_offset + 1] = 0x16;// 4+2+16(OUI+DataType+DataField)14021402- }14031403- else14041404- {14051405- Key_Data[data_offset + 1] = 0x26;// 4+2+32(OUI+DataType+DataField)14061406- }14071407-14081408- Key_Data[data_offset + 2] = 0x00;14091409- Key_Data[data_offset + 3] = 0x0F;14101410- Key_Data[data_offset + 4] = 0xAC;14111411- Key_Data[data_offset + 5] = 0x01;14121412-14131413- // GTK KDE format - 802.11i-2004 Figure-43x14141414- Key_Data[data_offset + 6] = (DefaultKeyIdx & 0x03);14151415- Key_Data[data_offset + 7] = 0x00; // Reserved Byte14161416-14171417- data_offset += 8;14181418- }14191419-14201420-14211421- // Encapsulate GTK and encrypt the key-data field with KEK.14221422- // Only for pairwise_msg3_WPA2 and group_msg114231423- if ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2Capable) || (MsgType == EAPOL_GROUP_MSG_1))14241424- {14251425- // Fill in GTK14261426- if (GroupKeyWepStatus == Ndis802_11Encryption3Enabled)14271427- {14281428- NdisMoveMemory(&Key_Data[data_offset], GTK, LEN_AES_KEY);14291429- data_offset += LEN_AES_KEY;14301430- }14311431- else14321432- {14331433- NdisMoveMemory(&Key_Data[data_offset], GTK, TKIP_GTK_LENGTH);14341434- data_offset += TKIP_GTK_LENGTH;14351435- }14361436-14371437- // Still dont know why, but if not append will occur "GTK not include in MSG3"14381438- // Patch for compatibility between zero config and funk14391439- if (MsgType == EAPOL_PAIR_MSG_3 && bWPA2Capable)14401440- {14411441- if (GroupKeyWepStatus == Ndis802_11Encryption3Enabled)14421442- {14431443- Key_Data[data_offset + 0] = 0xDD;14441444- Key_Data[data_offset + 1] = 0;14451445- data_offset += 2;14461446- }14471447- else14481448- {14491449- Key_Data[data_offset + 0] = 0xDD;14501450- Key_Data[data_offset + 1] = 0;14511451- Key_Data[data_offset + 2] = 0;14521452- Key_Data[data_offset + 3] = 0;14531453- Key_Data[data_offset + 4] = 0;14541454- Key_Data[data_offset + 5] = 0;14551455- data_offset += 6;14561456- }14571457- }14581458-14591459- // Encrypt the data material in key data field14601460- if (WepStatus == Ndis802_11Encryption3Enabled)14611461- {14621462- AES_GTK_KEY_WRAP(&PTK[16], Key_Data, data_offset, Rc4GTK);14631463- // AES wrap function will grow 8 bytes in length14641464- data_offset += 8;14651465- }14661466- else14671467- {14681468- // PREPARE Encrypted "Key DATA" field. (Encrypt GTK with RC4, usinf PTK[16]->[31] as Key, IV-field as IV)14691469- // put TxTsc in Key RSC field14701470- pAd->PrivateInfo.FCSCRC32 = PPPINITFCS32; //Init crc32.14711471-14721472- // ekey is the contanetion of IV-field, and PTK[16]->PTK[31]14731473- NdisMoveMemory(ekey, pMsg->KeyDesc.KeyIv, LEN_KEY_DESC_IV);14741474- NdisMoveMemory(&ekey[LEN_KEY_DESC_IV], &PTK[16], LEN_EAP_EK);14751475- ARCFOUR_INIT(&pAd->PrivateInfo.WEPCONTEXT, ekey, sizeof(ekey)); //INIT SBOX, KEYLEN+3(IV)14761476- pAd->PrivateInfo.FCSCRC32 = RTMP_CALC_FCS32(pAd->PrivateInfo.FCSCRC32, Key_Data, data_offset);14771477- WPAARCFOUR_ENCRYPT(&pAd->PrivateInfo.WEPCONTEXT, Rc4GTK, Key_Data, data_offset);14781478- }14791479-14801480- NdisMoveMemory(pMsg->KeyDesc.KeyData, Rc4GTK, data_offset);14811481- }14821482- else14831483- {14841484- NdisMoveMemory(pMsg->KeyDesc.KeyData, Key_Data, data_offset);14851485- }14861486-14871487- // set key data length field and total length14881488- pMsg->KeyDesc.KeyDataLen[1] = data_offset;14891489- pMsg->Body_Len[1] += data_offset;14901490-14911491- os_free_mem(pAd, mpool);14921492-14931493-}14941494-14951495-/*14961496- ========================================================================14971497-14981498- Routine Description:14991499- Calcaulate MIC. It is used during 4-ways handsharking.15001500-15011501- Arguments:15021502- pAd - pointer to our pAdapter context15031503- PeerWepStatus - indicate the encryption type15041504-15051505- Return Value:15061506-15071507- Note:15081508-15091509- ========================================================================15101510-*/15111511-VOID CalculateMIC(15121512- IN PRTMP_ADAPTER pAd,15131513- IN UCHAR PeerWepStatus,15141514- IN UCHAR *PTK,15151515- OUT PEAPOL_PACKET pMsg)15161516-{15171517- UCHAR *OutBuffer;15181518- ULONG FrameLen = 0;15191519- UCHAR mic[LEN_KEY_DESC_MIC];15201520- UCHAR digest[80];15211521-15221522- // allocate memory for MIC calculation15231523- os_alloc_mem(pAd, (PUCHAR *)&OutBuffer, 512);15241524-15251525- if (OutBuffer == NULL)15261526- {15271527- DBGPRINT(RT_DEBUG_ERROR, ("!!!CalculateMIC: no memory!!!\n"));15281528- return;15291529- }15301530-15311531- // make a frame for calculating MIC.15321532- MakeOutgoingFrame(OutBuffer, &FrameLen,15331533- pMsg->Body_Len[1] + 4, pMsg,15341534- END_OF_ARGS);15351535-15361536- NdisZeroMemory(mic, sizeof(mic));15371537-15381538- // Calculate MIC15391539- if (PeerWepStatus == Ndis802_11Encryption3Enabled)15401540- {15411541- HMAC_SHA1(OutBuffer, FrameLen, PTK, LEN_EAP_MICK, digest);15421542- NdisMoveMemory(mic, digest, LEN_KEY_DESC_MIC);15431543- }15441544- else15451545- {15461546- hmac_md5(PTK, LEN_EAP_MICK, OutBuffer, FrameLen, mic);15471547- }15481548-15491549- // store the calculated MIC15501550- NdisMoveMemory(pMsg->KeyDesc.KeyMic, mic, LEN_KEY_DESC_MIC);15511551-15521552- os_free_mem(pAd, OutBuffer);15531553-}15541554-15551555-/*15561556- ========================================================================15571557-15581558- Routine Description:15591559- Some received frames can't decrypt by Asic, so decrypt them by software.15601560-15611561- Arguments:15621562- pAd - pointer to our pAdapter context15631563- PeerWepStatus - indicate the encryption type15641564-15651565- Return Value:15661566- NDIS_STATUS_SUCCESS - decryption successful15671567- NDIS_STATUS_FAILURE - decryption failure15681568-15691569- ========================================================================15701570-*/15711571-NDIS_STATUS RTMPSoftDecryptBroadCastData(15721572- IN PRTMP_ADAPTER pAd,15731573- IN RX_BLK *pRxBlk,15741574- IN NDIS_802_11_ENCRYPTION_STATUS GroupCipher,15751575- IN PCIPHER_KEY pShard_key)15761576-{15771577- PRXWI_STRUC pRxWI = pRxBlk->pRxWI;15781578-15791579-15801580-15811581- // handle WEP decryption15821582- if (GroupCipher == Ndis802_11Encryption1Enabled)15831583- {15841584- if (RTMPSoftDecryptWEP(pAd, pRxBlk->pData, pRxWI->MPDUtotalByteCount, pShard_key))15851585- {15861586-15871587- //Minus IV[4] & ICV[4]15881588- pRxWI->MPDUtotalByteCount -= 8;15891589- }15901590- else15911591- {15921592- DBGPRINT(RT_DEBUG_ERROR, ("ERROR : Software decrypt WEP data fails.\n"));15931593- // give up this frame15941594- return NDIS_STATUS_FAILURE;15951595- }15961596- }15971597- // handle TKIP decryption15981598- else if (GroupCipher == Ndis802_11Encryption2Enabled)15991599- {16001600- if (RTMPSoftDecryptTKIP(pAd, pRxBlk->pData, pRxWI->MPDUtotalByteCount, 0, pShard_key))16011601- {16021602-16031603- //Minus 8 bytes MIC, 8 bytes IV/EIV, 4 bytes ICV16041604- pRxWI->MPDUtotalByteCount -= 20;16051605- }16061606- else16071607- {16081608- DBGPRINT(RT_DEBUG_ERROR, ("ERROR : RTMPSoftDecryptTKIP Failed\n"));16091609- // give up this frame16101610- return NDIS_STATUS_FAILURE;16111611- }16121612- }16131613- // handle AES decryption16141614- else if (GroupCipher == Ndis802_11Encryption3Enabled)16151615- {16161616- if (RTMPSoftDecryptAES(pAd, pRxBlk->pData, pRxWI->MPDUtotalByteCount , pShard_key))16171617- {16181618-16191619- //8 bytes MIC, 8 bytes IV/EIV (CCMP Header)16201620- pRxWI->MPDUtotalByteCount -= 16;16211621- }16221622- else16231623- {16241624- DBGPRINT(RT_DEBUG_ERROR, ("ERROR : RTMPSoftDecryptAES Failed\n"));16251625- // give up this frame16261626- return NDIS_STATUS_FAILURE;16271627- }16281628- }16291629- else16301630- {16311631- // give up this frame16321632- return NDIS_STATUS_FAILURE;16331633- }16341634-16351635- return NDIS_STATUS_SUCCESS;16361636-16371637-}16381638-11+#include "../../rt2860/common/cmm_wpa.c"
+1-432
drivers/staging/rt2870/common/dfs.c
···11-/*22- *************************************************************************33- * Ralink Tech Inc.44- * 5F., No.36, Taiyuan St., Jhubei City,55- * Hsinchu County 302,66- * Taiwan, R.O.C.77- *88- * (c) Copyright 2002-2007, Ralink Technology, Inc.99- *1010- * This program is free software; you can redistribute it and/or modify *1111- * it under the terms of the GNU General Public License as published by *1212- * the Free Software Foundation; either version 2 of the License, or *1313- * (at your option) any later version. *1414- * *1515- * This program is distributed in the hope that it will be useful, *1616- * but WITHOUT ANY WARRANTY; without even the implied warranty of *1717- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *1818- * GNU General Public License for more details. *1919- * *2020- * You should have received a copy of the GNU General Public License *2121- * along with this program; if not, write to the *2222- * Free Software Foundation, Inc., *2323- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *2424- * *2525- *************************************************************************2626-2727- Module Name:2828- ap_dfs.c2929-3030- Abstract:3131- Support DFS function.3232-3333- Revision History:3434- Who When What3535- -------- ---------- ----------------------------------------------3636- Fonchi 03-12-2007 created3737-*/3838-3939-#include "../rt_config.h"4040-4141-typedef struct _RADAR_DURATION_TABLE4242-{4343- ULONG RDDurRegion;4444- ULONG RadarSignalDuration;4545- ULONG Tolerance;4646-} RADAR_DURATION_TABLE, *PRADAR_DURATION_TABLE;4747-4848-4949-static UCHAR RdIdleTimeTable[MAX_RD_REGION][4] =5050-{5151- {9, 250, 250, 250}, // CE5252- {4, 250, 250, 250}, // FCC5353- {4, 250, 250, 250}, // JAP5454- {15, 250, 250, 250}, // JAP_W535555- {4, 250, 250, 250} // JAP_W565656-};5757-5858-/*5959- ========================================================================6060-6161- Routine Description:6262- Bbp Radar detection routine6363-6464- Arguments:6565- pAd Pointer to our adapter6666-6767- Return Value:6868-6969- ========================================================================7070-*/7171-VOID BbpRadarDetectionStart(7272- IN PRTMP_ADAPTER pAd)7373-{7474- UINT8 RadarPeriod;7575-7676- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 114, 0x02);7777- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 121, 0x20);7878- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 122, 0x00);7979- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 123, 0x08/*0x80*/);8080- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 124, 0x28);8181- RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 125, 0xff);8282-8383- RadarPeriod = ((UINT)RdIdleTimeTable[pAd->CommonCfg.RadarDetect.RDDurRegion][0] + (UINT)pAd->CommonCfg.RadarDetect.DfsSessionTime) < 250 ?8484- (RdIdleTimeTable[pAd->CommonCfg.RadarDetect.RDDurRegion][0] + pAd->CommonCfg.RadarDetect.DfsSessionTime) : 250;8585-8686- RTMP_IO_WRITE8(pAd, 0x7020, 0x1d);8787- RTMP_IO_WRITE8(pAd, 0x7021, 0x40);8888-8989- RadarDetectionStart(pAd, 0, RadarPeriod);9090- return;9191-}9292-9393-/*9494- ========================================================================9595-9696- Routine Description:9797- Bbp Radar detection routine9898-9999- Arguments:100100- pAd Pointer to our adapter101101-102102- Return Value:103103-104104- ========================================================================105105-*/106106-VOID BbpRadarDetectionStop(107107- IN PRTMP_ADAPTER pAd)108108-{109109- RTMP_IO_WRITE8(pAd, 0x7020, 0x1d);110110- RTMP_IO_WRITE8(pAd, 0x7021, 0x60);111111-112112- RadarDetectionStop(pAd);113113- return;114114-}115115-116116-/*117117- ========================================================================118118-119119- Routine Description:120120- Radar detection routine121121-122122- Arguments:123123- pAd Pointer to our adapter124124-125125- Return Value:126126-127127- ========================================================================128128-*/129129-VOID RadarDetectionStart(130130- IN PRTMP_ADAPTER pAd,131131- IN BOOLEAN CTSProtect,132132- IN UINT8 CTSPeriod)133133-{134134- UINT8 DfsActiveTime = (pAd->CommonCfg.RadarDetect.DfsSessionTime & 0x1f);135135- UINT8 CtsProtect = (CTSProtect == 1) ? 0x02 : 0x01; // CTS protect.136136-137137- if (CTSProtect != 0)138138- {139139- switch(pAd->CommonCfg.RadarDetect.RDDurRegion)140140- {141141- case FCC:142142- case JAP_W56:143143- CtsProtect = 0x03;144144- break;145145-146146- case CE:147147- case JAP_W53:148148- default:149149- CtsProtect = 0x02;150150- break;151151- }152152- }153153- else154154- CtsProtect = 0x01;155155-156156-157157- // send start-RD with CTS protection command to MCU158158- // highbyte [7] reserve159159- // highbyte [6:5] 0x: stop Carrier/Radar detection160160- // highbyte [10]: Start Carrier/Radar detection without CTS protection, 11: Start Carrier/Radar detection with CTS protection161161- // highbyte [4:0] Radar/carrier detection duration. In 1ms.162162-163163- // lowbyte [7:0] Radar/carrier detection period, in 1ms.164164- AsicSendCommandToMcu(pAd, 0x60, 0xff, CTSPeriod, DfsActiveTime | (CtsProtect << 5));165165- //AsicSendCommandToMcu(pAd, 0x63, 0xff, 10, 0);166166-167167- return;168168-}169169-170170-/*171171- ========================================================================172172-173173- Routine Description:174174- Radar detection routine175175-176176- Arguments:177177- pAd Pointer to our adapter178178-179179- Return Value:180180- TRUE Found radar signal181181- FALSE Not found radar signal182182-183183- ========================================================================184184-*/185185-VOID RadarDetectionStop(186186- IN PRTMP_ADAPTER pAd)187187-{188188- DBGPRINT(RT_DEBUG_TRACE,("RadarDetectionStop.\n"));189189- AsicSendCommandToMcu(pAd, 0x60, 0xff, 0x00, 0x00); // send start-RD with CTS protection command to MCU190190-191191- return;192192-}193193-194194-/*195195- ========================================================================196196-197197- Routine Description:198198- Radar channel check routine199199-200200- Arguments:201201- pAd Pointer to our adapter202202-203203- Return Value:204204- TRUE need to do radar detect205205- FALSE need not to do radar detect206206-207207- ========================================================================208208-*/209209-BOOLEAN RadarChannelCheck(210210- IN PRTMP_ADAPTER pAd,211211- IN UCHAR Ch)212212-{213213-#if 1214214- INT i;215215- BOOLEAN result = FALSE;216216-217217- for (i=0; i<pAd->ChannelListNum; i++)218218- {219219- if (Ch == pAd->ChannelList[i].Channel)220220- {221221- result = pAd->ChannelList[i].DfsReq;222222- break;223223- }224224- }225225-226226- return result;227227-#else228228- INT i;229229- UCHAR Channel[15]={52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140};230230-231231- for (i=0; i<15; i++)232232- {233233- if (Ch == Channel[i])234234- {235235- break;236236- }237237- }238238-239239- if (i != 15)240240- return TRUE;241241- else242242- return FALSE;243243-#endif244244-}245245-246246-ULONG JapRadarType(247247- IN PRTMP_ADAPTER pAd)248248-{249249- ULONG i;250250- const UCHAR Channel[15]={52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140};251251-252252- if (pAd->CommonCfg.RadarDetect.RDDurRegion != JAP)253253- {254254- return pAd->CommonCfg.RadarDetect.RDDurRegion;255255- }256256-257257- for (i=0; i<15; i++)258258- {259259- if (pAd->CommonCfg.Channel == Channel[i])260260- {261261- break;262262- }263263- }264264-265265- if (i < 4)266266- return JAP_W53;267267- else if (i < 15)268268- return JAP_W56;269269- else270270- return JAP; // W52271271-272272-}273273-274274-ULONG RTMPBbpReadRadarDuration(275275- IN PRTMP_ADAPTER pAd)276276-{277277- UINT8 byteValue = 0;278278- ULONG result;279279-280280- BBP_IO_READ8_BY_REG_ID(pAd, BBP_R115, &byteValue);281281-282282- result = 0;283283- switch (byteValue)284284- {285285- case 1: // radar signal detected by pulse mode.286286- case 2: // radar signal detected by width mode.287287- result = RTMPReadRadarDuration(pAd);288288- break;289289-290290- case 0: // No radar signal.291291- default:292292-293293- result = 0;294294- break;295295- }296296-297297- return result;298298-}299299-300300-ULONG RTMPReadRadarDuration(301301- IN PRTMP_ADAPTER pAd)302302-{303303- ULONG result = 0;304304-305305- return result;306306-307307-}308308-309309-VOID RTMPCleanRadarDuration(310310- IN PRTMP_ADAPTER pAd)311311-{312312- return;313313-}314314-315315-/*316316- ========================================================================317317- Routine Description:318318- Radar wave detection. The API should be invoke each second.319319-320320- Arguments:321321- pAd - Adapter pointer322322-323323- Return Value:324324- None325325-326326- ========================================================================327327-*/328328-VOID ApRadarDetectPeriodic(329329- IN PRTMP_ADAPTER pAd)330330-{331331- INT i;332332-333333- pAd->CommonCfg.RadarDetect.InServiceMonitorCount++;334334-335335- for (i=0; i<pAd->ChannelListNum; i++)336336- {337337- if (pAd->ChannelList[i].RemainingTimeForUse > 0)338338- {339339- pAd->ChannelList[i].RemainingTimeForUse --;340340- if ((pAd->Mlme.PeriodicRound%5) == 0)341341- {342342- DBGPRINT(RT_DEBUG_TRACE, ("RadarDetectPeriodic - ch=%d, RemainingTimeForUse=%d\n", pAd->ChannelList[i].Channel, pAd->ChannelList[i].RemainingTimeForUse));343343- }344344- }345345- }346346-347347- //radar detect348348- if ((pAd->CommonCfg.Channel > 14)349349- && (pAd->CommonCfg.bIEEE80211H == 1)350350- && RadarChannelCheck(pAd, pAd->CommonCfg.Channel))351351- {352352- RadarDetectPeriodic(pAd);353353- }354354-355355- return;356356-}357357-358358-// Periodic Radar detection, switch channel will occur in RTMPHandleTBTTInterrupt()359359-// Before switch channel, driver needs doing channel switch announcement.360360-VOID RadarDetectPeriodic(361361- IN PRTMP_ADAPTER pAd)362362-{363363- // need to check channel availability, after switch channel364364- if (pAd->CommonCfg.RadarDetect.RDMode != RD_SILENCE_MODE)365365- return;366366-367367- // channel availability check time is 60sec, use 65 for assurance368368- if (pAd->CommonCfg.RadarDetect.RDCount++ > pAd->CommonCfg.RadarDetect.ChMovingTime)369369- {370370- DBGPRINT(RT_DEBUG_TRACE, ("Not found radar signal, start send beacon and radar detection in service monitor\n\n"));371371- BbpRadarDetectionStop(pAd);372372- AsicEnableBssSync(pAd);373373- pAd->CommonCfg.RadarDetect.RDMode = RD_NORMAL_MODE;374374-375375-376376- return;377377- }378378-379379- return;380380-}381381-382382-383383-/*384384- ==========================================================================385385- Description:386386- change channel moving time for DFS testing.387387-388388- Arguments:389389- pAdapter Pointer to our adapter390390- wrq Pointer to the ioctl argument391391-392392- Return Value:393393- None394394-395395- Note:396396- Usage:397397- 1.) iwpriv ra0 set ChMovTime=[value]398398- ==========================================================================399399-*/400400-INT Set_ChMovingTime_Proc(401401- IN PRTMP_ADAPTER pAd,402402- IN PUCHAR arg)403403-{404404- UINT8 Value;405405-406406- Value = simple_strtol(arg, 0, 10);407407-408408- pAd->CommonCfg.RadarDetect.ChMovingTime = Value;409409-410410- DBGPRINT(RT_DEBUG_TRACE, ("%s:: %d\n", __func__,411411- pAd->CommonCfg.RadarDetect.ChMovingTime));412412-413413- return TRUE;414414-}415415-416416-INT Set_LongPulseRadarTh_Proc(417417- IN PRTMP_ADAPTER pAd,418418- IN PUCHAR arg)419419-{420420- UINT8 Value;421421-422422- Value = simple_strtol(arg, 0, 10) > 10 ? 10 : simple_strtol(arg, 0, 10);423423-424424- pAd->CommonCfg.RadarDetect.LongPulseRadarTh = Value;425425-426426- DBGPRINT(RT_DEBUG_TRACE, ("%s:: %d\n", __func__,427427- pAd->CommonCfg.RadarDetect.LongPulseRadarTh));428428-429429- return TRUE;430430-}431431-432432-11+#include "../../rt2860/common/dfs.c"
+1-1510
drivers/staging/rt2870/common/eeprom.c
···11-/*22- *************************************************************************33- * Ralink Tech Inc.44- * 5F., No.36, Taiyuan St., Jhubei City,55- * Hsinchu County 302,66- * Taiwan, R.O.C.77- *88- * (c) Copyright 2002-2007, Ralink Technology, Inc.99- *1010- * This program is free software; you can redistribute it and/or modify *1111- * it under the terms of the GNU General Public License as published by *1212- * the Free Software Foundation; either version 2 of the License, or *1313- * (at your option) any later version. *1414- * *1515- * This program is distributed in the hope that it will be useful, *1616- * but WITHOUT ANY WARRANTY; without even the implied warranty of *1717- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *1818- * GNU General Public License for more details. *1919- * *2020- * You should have received a copy of the GNU General Public License *2121- * along with this program; if not, write to the *2222- * Free Software Foundation, Inc., *2323- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *2424- * *2525- *************************************************************************2626-2727- Module Name:2828- eeprom.c2929-3030- Abstract:3131-3232- Revision History:3333- Who When What3434- -------- ---------- ----------------------------------------------3535- Name Date Modification logs3636-*/3737-#include "../rt_config.h"3838-3939-// IRQL = PASSIVE_LEVEL4040-VOID RaiseClock(4141- IN PRTMP_ADAPTER pAd,4242- IN UINT32 *x)4343-{4444- *x = *x | EESK;4545- RTMP_IO_WRITE32(pAd, E2PROM_CSR, *x);4646- RTMPusecDelay(1); // Max frequency = 1MHz in Spec. definition4747-}4848-4949-// IRQL = PASSIVE_LEVEL5050-VOID LowerClock(5151- IN PRTMP_ADAPTER pAd,5252- IN UINT32 *x)5353-{5454- *x = *x & ~EESK;5555- RTMP_IO_WRITE32(pAd, E2PROM_CSR, *x);5656- RTMPusecDelay(1);5757-}5858-5959-// IRQL = PASSIVE_LEVEL6060-USHORT ShiftInBits(6161- IN PRTMP_ADAPTER pAd)6262-{6363- UINT32 x,i;6464- USHORT data=0;6565-6666- RTMP_IO_READ32(pAd, E2PROM_CSR, &x);6767-6868- x &= ~( EEDO | EEDI);6969-7070- for(i=0; i<16; i++)7171- {7272- data = data << 1;7373- RaiseClock(pAd, &x);7474-7575- RTMP_IO_READ32(pAd, E2PROM_CSR, &x);7676-#ifdef RT30xx7777- LowerClock(pAd, &x); //prevent read failed7878-#endif7979- x &= ~(EEDI);8080- if(x & EEDO)8181- data |= 1;8282-8383-#ifndef RT30xx8484- LowerClock(pAd, &x);8585-#endif8686- }8787-8888- return data;8989-}9090-9191-// IRQL = PASSIVE_LEVEL9292-VOID ShiftOutBits(9393- IN PRTMP_ADAPTER pAd,9494- IN USHORT data,9595- IN USHORT count)9696-{9797- UINT32 x,mask;9898-9999- mask = 0x01 << (count - 1);100100- RTMP_IO_READ32(pAd, E2PROM_CSR, &x);101101-102102- x &= ~(EEDO | EEDI);103103-104104- do105105- {106106- x &= ~EEDI;107107- if(data & mask) x |= EEDI;108108-109109- RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);110110-111111- RaiseClock(pAd, &x);112112- LowerClock(pAd, &x);113113-114114- mask = mask >> 1;115115- } while(mask);116116-117117- x &= ~EEDI;118118- RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);119119-}120120-121121-// IRQL = PASSIVE_LEVEL122122-VOID EEpromCleanup(123123- IN PRTMP_ADAPTER pAd)124124-{125125- UINT32 x;126126-127127- RTMP_IO_READ32(pAd, E2PROM_CSR, &x);128128-129129- x &= ~(EECS | EEDI);130130- RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);131131-132132- RaiseClock(pAd, &x);133133- LowerClock(pAd, &x);134134-}135135-136136-VOID EWEN(137137- IN PRTMP_ADAPTER pAd)138138-{139139- UINT32 x;140140-141141- // reset bits and set EECS142142- RTMP_IO_READ32(pAd, E2PROM_CSR, &x);143143- x &= ~(EEDI | EEDO | EESK);144144- x |= EECS;145145- RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);146146-147147- // kick a pulse148148- RaiseClock(pAd, &x);149149- LowerClock(pAd, &x);150150-151151- // output the read_opcode and six pulse in that order152152- ShiftOutBits(pAd, EEPROM_EWEN_OPCODE, 5);153153- ShiftOutBits(pAd, 0, 6);154154-155155- EEpromCleanup(pAd);156156-}157157-158158-VOID EWDS(159159- IN PRTMP_ADAPTER pAd)160160-{161161- UINT32 x;162162-163163- // reset bits and set EECS164164- RTMP_IO_READ32(pAd, E2PROM_CSR, &x);165165- x &= ~(EEDI | EEDO | EESK);166166- x |= EECS;167167- RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);168168-169169- // kick a pulse170170- RaiseClock(pAd, &x);171171- LowerClock(pAd, &x);172172-173173- // output the read_opcode and six pulse in that order174174- ShiftOutBits(pAd, EEPROM_EWDS_OPCODE, 5);175175- ShiftOutBits(pAd, 0, 6);176176-177177- EEpromCleanup(pAd);178178-}179179-180180-// IRQL = PASSIVE_LEVEL181181-USHORT RTMP_EEPROM_READ16(182182- IN PRTMP_ADAPTER pAd,183183- IN USHORT Offset)184184-{185185- UINT32 x;186186- USHORT data;187187-188188-#ifdef RT30xx189189- if (pAd->NicConfig2.field.AntDiversity)190190- {191191- pAd->EepromAccess = TRUE;192192- }193193-//2008/09/11:KH add to support efuse<--194194-//2008/09/11:KH add to support efuse-->195195-{196196-#endif197197- Offset /= 2;198198- // reset bits and set EECS199199- RTMP_IO_READ32(pAd, E2PROM_CSR, &x);200200- x &= ~(EEDI | EEDO | EESK);201201- x |= EECS;202202- RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);203203-204204-#ifdef RT30xx205205- // patch can not access e-Fuse issue206206- if (!IS_RT3090(pAd))207207- {208208-#endif209209- // kick a pulse210210- RaiseClock(pAd, &x);211211- LowerClock(pAd, &x);212212-#ifdef RT30xx213213- }214214-#endif215215-216216- // output the read_opcode and register number in that order217217- ShiftOutBits(pAd, EEPROM_READ_OPCODE, 3);218218- ShiftOutBits(pAd, Offset, pAd->EEPROMAddressNum);219219-220220- // Now read the data (16 bits) in from the selected EEPROM word221221- data = ShiftInBits(pAd);222222-223223- EEpromCleanup(pAd);224224-225225-#ifdef RT30xx226226- // Antenna and EEPROM access are both using EESK pin,227227- // Therefor we should avoid accessing EESK at the same time228228- // Then restore antenna after EEPROM access229229- if ((pAd->NicConfig2.field.AntDiversity) || (pAd->RfIcType == RFIC_3020))230230- {231231- pAd->EepromAccess = FALSE;232232- AsicSetRxAnt(pAd, pAd->RxAnt.Pair1PrimaryRxAnt);233233- }234234-}235235-#endif236236- return data;237237-} //ReadEEprom238238-239239-VOID RTMP_EEPROM_WRITE16(240240- IN PRTMP_ADAPTER pAd,241241- IN USHORT Offset,242242- IN USHORT Data)243243-{244244- UINT32 x;245245-246246-#ifdef RT30xx247247- if (pAd->NicConfig2.field.AntDiversity)248248- {249249- pAd->EepromAccess = TRUE;250250- }251251- //2008/09/11:KH add to support efuse<--252252-//2008/09/11:KH add to support efuse-->253253- {254254-#endif255255- Offset /= 2;256256-257257- EWEN(pAd);258258-259259- // reset bits and set EECS260260- RTMP_IO_READ32(pAd, E2PROM_CSR, &x);261261- x &= ~(EEDI | EEDO | EESK);262262- x |= EECS;263263- RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);264264-265265-#ifdef RT30xx266266- // patch can not access e-Fuse issue267267- if (!IS_RT3090(pAd))268268- {269269-#endif270270- // kick a pulse271271- RaiseClock(pAd, &x);272272- LowerClock(pAd, &x);273273-#ifdef RT30xx274274- }275275-#endif276276-277277- // output the read_opcode ,register number and data in that order278278- ShiftOutBits(pAd, EEPROM_WRITE_OPCODE, 3);279279- ShiftOutBits(pAd, Offset, pAd->EEPROMAddressNum);280280- ShiftOutBits(pAd, Data, 16); // 16-bit access281281-282282- // read DO status283283- RTMP_IO_READ32(pAd, E2PROM_CSR, &x);284284-285285- EEpromCleanup(pAd);286286-287287- RTMPusecDelay(10000); //delay for twp(MAX)=10ms288288-289289- EWDS(pAd);290290-291291- EEpromCleanup(pAd);292292-293293-#ifdef RT30xx294294- // Antenna and EEPROM access are both using EESK pin,295295- // Therefor we should avoid accessing EESK at the same time296296- // Then restore antenna after EEPROM access297297- if ((pAd->NicConfig2.field.AntDiversity) || (pAd->RfIcType == RFIC_3020))298298- {299299- pAd->EepromAccess = FALSE;300300- AsicSetRxAnt(pAd, pAd->RxAnt.Pair1PrimaryRxAnt);301301- }302302-}303303-#endif304304-}305305-306306-//2008/09/11:KH add to support efuse<--307307-#ifdef RT30xx308308-/*309309- ========================================================================310310-311311- Routine Description:312312-313313- Arguments:314314-315315- Return Value:316316-317317- IRQL =318318-319319- Note:320320-321321- ========================================================================322322-*/323323-UCHAR eFuseReadRegisters(324324- IN PRTMP_ADAPTER pAd,325325- IN USHORT Offset,326326- IN USHORT Length,327327- OUT USHORT* pData)328328-{329329- EFUSE_CTRL_STRUC eFuseCtrlStruc;330330- int i;331331- USHORT efuseDataOffset;332332- UINT32 data;333333-334334- RTMP_IO_READ32(pAd, EFUSE_CTRL, (PUINT32) &eFuseCtrlStruc);335335-336336- //Step0. Write 10-bit of address to EFSROM_AIN (0x580, bit25:bit16). The address must be 16-byte alignment.337337- //Use the eeprom logical address and covert to address to block number338338- eFuseCtrlStruc.field.EFSROM_AIN = Offset & 0xfff0;339339-340340- //Step1. Write EFSROM_MODE (0x580, bit7:bit6) to 0.341341- eFuseCtrlStruc.field.EFSROM_MODE = 0;342342-343343- //Step2. Write EFSROM_KICK (0x580, bit30) to 1 to kick-off physical read procedure.344344- eFuseCtrlStruc.field.EFSROM_KICK = 1;345345-346346- NdisMoveMemory(&data, &eFuseCtrlStruc, 4);347347- RTMP_IO_WRITE32(pAd, EFUSE_CTRL, data);348348-349349- //Step3. Polling EFSROM_KICK(0x580, bit30) until it become 0 again.350350- i = 0;351351- while(i < 100)352352- {353353- //rtmp.HwMemoryReadDword(EFUSE_CTRL, (DWORD *) &eFuseCtrlStruc, 4);354354- RTMP_IO_READ32(pAd, EFUSE_CTRL, (PUINT32) &eFuseCtrlStruc);355355- if(eFuseCtrlStruc.field.EFSROM_KICK == 0)356356- {357357- break;358358- }359359- RTMPusecDelay(2);360360- i++;361361- }362362-363363- //if EFSROM_AOUT is not found in physical address, write 0xffff364364- if (eFuseCtrlStruc.field.EFSROM_AOUT == 0x3f)365365- {366366- for(i=0; i<Length/2; i++)367367- *(pData+2*i) = 0xffff;368368- }369369- else370370- {371371- //Step4. Read 16-byte of data from EFUSE_DATA0-3 (0x590-0x59C)372372- efuseDataOffset = EFUSE_DATA3 - (Offset & 0xC) ;373373- //data hold 4 bytes data.374374- //In RTMP_IO_READ32 will automatically execute 32-bytes swapping375375- RTMP_IO_READ32(pAd, efuseDataOffset, &data);376376- //Decide the upper 2 bytes or the bottom 2 bytes.377377- // Little-endian S | S Big-endian378378- // addr 3 2 1 0 | 0 1 2 3379379- // Ori-V D C B A | A B C D380380- //After swapping381381- // D C B A | D C B A382382- //Return 2-bytes383383- //The return byte statrs from S. Therefore, the little-endian will return BA, the Big-endian will return DC.384384- //For returning the bottom 2 bytes, the Big-endian should shift right 2-bytes.385385- data = data >> (8*(Offset & 0x3));386386-387387- NdisMoveMemory(pData, &data, Length);388388- }389389-390390- return (UCHAR) eFuseCtrlStruc.field.EFSROM_AOUT;391391-392392-}393393-394394-/*395395- ========================================================================396396-397397- Routine Description:398398-399399- Arguments:400400-401401- Return Value:402402-403403- IRQL =404404-405405- Note:406406-407407- ========================================================================408408-*/409409-VOID eFusePhysicalReadRegisters(410410- IN PRTMP_ADAPTER pAd,411411- IN USHORT Offset,412412- IN USHORT Length,413413- OUT USHORT* pData)414414-{415415- EFUSE_CTRL_STRUC eFuseCtrlStruc;416416- int i;417417- USHORT efuseDataOffset;418418- UINT32 data;419419-420420- RTMP_IO_READ32(pAd, EFUSE_CTRL, (PUINT32) &eFuseCtrlStruc);421421-422422- //Step0. Write 10-bit of address to EFSROM_AIN (0x580, bit25:bit16). The address must be 16-byte alignment.423423- eFuseCtrlStruc.field.EFSROM_AIN = Offset & 0xfff0;424424-425425- //Step1. Write EFSROM_MODE (0x580, bit7:bit6) to 1.426426- //Read in physical view427427- eFuseCtrlStruc.field.EFSROM_MODE = 1;428428-429429- //Step2. Write EFSROM_KICK (0x580, bit30) to 1 to kick-off physical read procedure.430430- eFuseCtrlStruc.field.EFSROM_KICK = 1;431431-432432- NdisMoveMemory(&data, &eFuseCtrlStruc, 4);433433- RTMP_IO_WRITE32(pAd, EFUSE_CTRL, data);434434-435435- //Step3. Polling EFSROM_KICK(0x580, bit30) until it become 0 again.436436- i = 0;437437- while(i < 100)438438- {439439- RTMP_IO_READ32(pAd, EFUSE_CTRL, (PUINT32) &eFuseCtrlStruc);440440- if(eFuseCtrlStruc.field.EFSROM_KICK == 0)441441- break;442442- RTMPusecDelay(2);443443- i++;444444- }445445-446446- //Step4. Read 16-byte of data from EFUSE_DATA0-3 (0x59C-0x590)447447- //Because the size of each EFUSE_DATA is 4 Bytes, the size of address of each is 2 bits.448448- //The previous 2 bits is the EFUSE_DATA number, the last 2 bits is used to decide which bytes449449- //Decide which EFUSE_DATA to read450450- //590:F E D C451451- //594:B A 9 8452452- //598:7 6 5 4453453- //59C:3 2 1 0454454- efuseDataOffset = EFUSE_DATA3 - (Offset & 0xC) ;455455-456456- RTMP_IO_READ32(pAd, efuseDataOffset, &data);457457-458458- data = data >> (8*(Offset & 0x3));459459-460460- NdisMoveMemory(pData, &data, Length);461461-462462-}463463-464464-/*465465- ========================================================================466466-467467- Routine Description:468468-469469- Arguments:470470-471471- Return Value:472472-473473- IRQL =474474-475475- Note:476476-477477- ========================================================================478478-*/479479-VOID eFuseReadPhysical(480480- IN PRTMP_ADAPTER pAd,481481- IN PUSHORT lpInBuffer,482482- IN ULONG nInBufferSize,483483- OUT PUSHORT lpOutBuffer,484484- IN ULONG nOutBufferSize485485-)486486-{487487- USHORT* pInBuf = (USHORT*)lpInBuffer;488488- USHORT* pOutBuf = (USHORT*)lpOutBuffer;489489-490490- USHORT Offset = pInBuf[0]; //addr491491- USHORT Length = pInBuf[1]; //length492492- int i;493493-494494- for(i=0; i<Length; i+=2)495495- {496496- eFusePhysicalReadRegisters(pAd,Offset+i, 2, &pOutBuf[i/2]);497497- }498498-}499499-500500-/*501501- ========================================================================502502-503503- Routine Description:504504-505505- Arguments:506506-507507- Return Value:508508-509509- IRQL =510510-511511- Note:512512-513513- ========================================================================514514-*/515515-NTSTATUS eFuseRead(516516- IN PRTMP_ADAPTER pAd,517517- IN USHORT Offset,518518- OUT PUCHAR pData,519519- IN USHORT Length)520520-{521521- USHORT* pOutBuf = (USHORT*)pData;522522- NTSTATUS Status = STATUS_SUCCESS;523523- UCHAR EFSROM_AOUT;524524- int i;525525-526526- for(i=0; i<Length; i+=2)527527- {528528- EFSROM_AOUT = eFuseReadRegisters(pAd, Offset+i, 2, &pOutBuf[i/2]);529529- }530530- return Status;531531-}532532-533533-/*534534- ========================================================================535535-536536- Routine Description:537537-538538- Arguments:539539-540540- Return Value:541541-542542- IRQL =543543-544544- Note:545545-546546- ========================================================================547547-*/548548-VOID eFusePhysicalWriteRegisters(549549- IN PRTMP_ADAPTER pAd,550550- IN USHORT Offset,551551- IN USHORT Length,552552- OUT USHORT* pData)553553-{554554- EFUSE_CTRL_STRUC eFuseCtrlStruc;555555- int i;556556- USHORT efuseDataOffset;557557- UINT32 data, eFuseDataBuffer[4];558558-559559- //Step0. Write 16-byte of data to EFUSE_DATA0-3 (0x590-0x59C), where EFUSE_DATA0 is the LSB DW, EFUSE_DATA3 is the MSB DW.560560-561561- /////////////////////////////////////////////////////////////////562562- //read current values of 16-byte block563563- RTMP_IO_READ32(pAd, EFUSE_CTRL, (PUINT32) &eFuseCtrlStruc);564564-565565- //Step0. Write 10-bit of address to EFSROM_AIN (0x580, bit25:bit16). The address must be 16-byte alignment.566566- eFuseCtrlStruc.field.EFSROM_AIN = Offset & 0xfff0;567567-568568- //Step1. Write EFSROM_MODE (0x580, bit7:bit6) to 1.569569- eFuseCtrlStruc.field.EFSROM_MODE = 1;570570-571571- //Step2. Write EFSROM_KICK (0x580, bit30) to 1 to kick-off physical read procedure.572572- eFuseCtrlStruc.field.EFSROM_KICK = 1;573573-574574- NdisMoveMemory(&data, &eFuseCtrlStruc, 4);575575- RTMP_IO_WRITE32(pAd, EFUSE_CTRL, data);576576-577577- //Step3. Polling EFSROM_KICK(0x580, bit30) until it become 0 again.578578- i = 0;579579- while(i < 100)580580- {581581- RTMP_IO_READ32(pAd, EFUSE_CTRL, (PUINT32) &eFuseCtrlStruc);582582-583583- if(eFuseCtrlStruc.field.EFSROM_KICK == 0)584584- break;585585- RTMPusecDelay(2);586586- i++;587587- }588588-589589- //Step4. Read 16-byte of data from EFUSE_DATA0-3 (0x59C-0x590)590590- efuseDataOffset = EFUSE_DATA3;591591- for(i=0; i< 4; i++)592592- {593593- RTMP_IO_READ32(pAd, efuseDataOffset, (PUINT32) &eFuseDataBuffer[i]);594594- efuseDataOffset -= 4;595595- }596596-597597- //Update the value, the offset is multiple of 2, length is 2598598- efuseDataOffset = (Offset & 0xc) >> 2;599599- data = pData[0] & 0xffff;600600- //The offset should be 0x***10 or 0x***00601601- if((Offset % 4) != 0)602602- {603603- eFuseDataBuffer[efuseDataOffset] = (eFuseDataBuffer[efuseDataOffset] & 0xffff) | (data << 16);604604- }605605- else606606- {607607- eFuseDataBuffer[efuseDataOffset] = (eFuseDataBuffer[efuseDataOffset] & 0xffff0000) | data;608608- }609609-610610- efuseDataOffset = EFUSE_DATA3;611611- for(i=0; i< 4; i++)612612- {613613- RTMP_IO_WRITE32(pAd, efuseDataOffset, eFuseDataBuffer[i]);614614- efuseDataOffset -= 4;615615- }616616- /////////////////////////////////////////////////////////////////617617-618618- //Step1. Write 10-bit of address to EFSROM_AIN (0x580, bit25:bit16). The address must be 16-byte alignment.619619- eFuseCtrlStruc.field.EFSROM_AIN = Offset & 0xfff0;620620-621621- //Step2. Write EFSROM_MODE (0x580, bit7:bit6) to 3.622622- eFuseCtrlStruc.field.EFSROM_MODE = 3;623623-624624- //Step3. Write EFSROM_KICK (0x580, bit30) to 1 to kick-off physical write procedure.625625- eFuseCtrlStruc.field.EFSROM_KICK = 1;626626-627627- NdisMoveMemory(&data, &eFuseCtrlStruc, 4);628628- RTMP_IO_WRITE32(pAd, EFUSE_CTRL, data);629629-630630- //Step4. Polling EFSROM_KICK(0x580, bit30) until it become 0 again. It��s done.631631- i = 0;632632- while(i < 100)633633- {634634- RTMP_IO_READ32(pAd, EFUSE_CTRL, (PUINT32) &eFuseCtrlStruc);635635-636636- if(eFuseCtrlStruc.field.EFSROM_KICK == 0)637637- break;638638-639639- RTMPusecDelay(2);640640- i++;641641- }642642-}643643-644644-/*645645- ========================================================================646646-647647- Routine Description:648648-649649- Arguments:650650-651651- Return Value:652652-653653- IRQL =654654-655655- Note:656656-657657- ========================================================================658658-*/659659-NTSTATUS eFuseWriteRegisters(660660- IN PRTMP_ADAPTER pAd,661661- IN USHORT Offset,662662- IN USHORT Length,663663- IN USHORT* pData)664664-{665665- USHORT i;666666- USHORT eFuseData;667667- USHORT LogicalAddress, BlkNum = 0xffff;668668- UCHAR EFSROM_AOUT;669669-670670- USHORT addr,tmpaddr, InBuf[3], tmpOffset;671671- USHORT buffer[8];672672- BOOLEAN bWriteSuccess = TRUE;673673-674674- DBGPRINT(RT_DEBUG_TRACE, ("eFuseWriteRegisters Offset=%x, pData=%x\n", Offset, *pData));675675-676676- //Step 0. find the entry in the mapping table677677- //The address of EEPROM is 2-bytes alignment.678678- //The last bit is used for alignment, so it must be 0.679679- tmpOffset = Offset & 0xfffe;680680- EFSROM_AOUT = eFuseReadRegisters(pAd, tmpOffset, 2, &eFuseData);681681-682682- if( EFSROM_AOUT == 0x3f)683683- { //find available logical address pointer684684- //the logical address does not exist, find an empty one685685- //from the first address of block 45=16*45=0x2d0 to the last address of block 47686686- //==>48*16-3(reserved)=2FC687687- for (i=EFUSE_USAGE_MAP_START; i<=EFUSE_USAGE_MAP_END; i+=2)688688- {689689- //Retrive the logical block nubmer form each logical address pointer690690- //It will access two logical address pointer each time.691691- eFusePhysicalReadRegisters(pAd, i, 2, &LogicalAddress);692692- if( (LogicalAddress & 0xff) == 0)693693- {//Not used logical address pointer694694- BlkNum = i-EFUSE_USAGE_MAP_START;695695- break;696696- }697697- else if(( (LogicalAddress >> 8) & 0xff) == 0)698698- {//Not used logical address pointer699699- if (i != EFUSE_USAGE_MAP_END)700700- {701701- BlkNum = i-EFUSE_USAGE_MAP_START+1;702702- }703703- break;704704- }705705- }706706- }707707- else708708- {709709- BlkNum = EFSROM_AOUT;710710- }711711-712712- DBGPRINT(RT_DEBUG_TRACE, ("eFuseWriteRegisters BlkNum = %d \n", BlkNum));713713-714714- if(BlkNum == 0xffff)715715- {716716- DBGPRINT(RT_DEBUG_TRACE, ("eFuseWriteRegisters: out of free E-fuse space!!!\n"));717717- return FALSE;718718- }719719-720720- //Step 1. Save data of this block which is pointed by the avaible logical address pointer721721- // read and save the original block data722722- for(i =0; i<8; i++)723723- {724724- addr = BlkNum * 0x10 ;725725-726726- InBuf[0] = addr+2*i;727727- InBuf[1] = 2;728728- InBuf[2] = 0x0;729729-730730- eFuseReadPhysical(pAd, &InBuf[0], 4, &InBuf[2], 2);731731-732732- buffer[i] = InBuf[2];733733- }734734-735735- //Step 2. Update the data in buffer, and write the data to Efuse736736- buffer[ (Offset >> 1) % 8] = pData[0];737737-738738- do739739- {740740- //Step 3. Write the data to Efuse741741- if(!bWriteSuccess)742742- {743743- for(i =0; i<8; i++)744744- {745745- addr = BlkNum * 0x10 ;746746-747747- InBuf[0] = addr+2*i;748748- InBuf[1] = 2;749749- InBuf[2] = buffer[i];750750-751751- eFuseWritePhysical(pAd, &InBuf[0], 6, NULL, 2);752752- }753753- }754754- else755755- {756756- addr = BlkNum * 0x10 ;757757-758758- InBuf[0] = addr+(Offset % 16);759759- InBuf[1] = 2;760760- InBuf[2] = pData[0];761761-762762- eFuseWritePhysical(pAd, &InBuf[0], 6, NULL, 2);763763- }764764-765765- //Step 4. Write mapping table766766- addr = EFUSE_USAGE_MAP_START+BlkNum;767767-768768- tmpaddr = addr;769769-770770- if(addr % 2 != 0)771771- addr = addr -1;772772- InBuf[0] = addr;773773- InBuf[1] = 2;774774-775775- //convert the address from 10 to 8 bit ( bit7, 6 = parity and bit5 ~ 0 = bit9~4), and write to logical map entry776776- tmpOffset = Offset;777777- tmpOffset >>= 4;778778- tmpOffset |= ((~((tmpOffset & 0x01) ^ ( tmpOffset >> 1 & 0x01) ^ (tmpOffset >> 2 & 0x01) ^ (tmpOffset >> 3 & 0x01))) << 6) & 0x40;779779- tmpOffset |= ((~( (tmpOffset >> 2 & 0x01) ^ (tmpOffset >> 3 & 0x01) ^ (tmpOffset >> 4 & 0x01) ^ ( tmpOffset >> 5 & 0x01))) << 7) & 0x80;780780-781781- // write the logical address782782- if(tmpaddr%2 != 0)783783- InBuf[2] = tmpOffset<<8;784784- else785785- InBuf[2] = tmpOffset;786786-787787- eFuseWritePhysical(pAd,&InBuf[0], 6, NULL, 0);788788-789789- //Step 5. Compare data if not the same, invalidate the mapping entry, then re-write the data until E-fuse is exhausted790790- bWriteSuccess = TRUE;791791- for(i =0; i<8; i++)792792- {793793- addr = BlkNum * 0x10 ;794794-795795- InBuf[0] = addr+2*i;796796- InBuf[1] = 2;797797- InBuf[2] = 0x0;798798-799799- eFuseReadPhysical(pAd, &InBuf[0], 4, &InBuf[2], 2);800800-801801- if(buffer[i] != InBuf[2])802802- {803803- bWriteSuccess = FALSE;804804- break;805805- }806806- }807807-808808- //Step 6. invlidate mapping entry and find a free mapping entry if not succeed809809- if (!bWriteSuccess)810810- {811811- DBGPRINT(RT_DEBUG_TRACE, ("Not bWriteSuccess BlkNum = %d\n", BlkNum));812812-813813- // the offset of current mapping entry814814- addr = EFUSE_USAGE_MAP_START+BlkNum;815815-816816- //find a new mapping entry817817- BlkNum = 0xffff;818818- for (i=EFUSE_USAGE_MAP_START; i<=EFUSE_USAGE_MAP_END; i+=2)819819- {820820- eFusePhysicalReadRegisters(pAd, i, 2, &LogicalAddress);821821- if( (LogicalAddress & 0xff) == 0)822822- {823823- BlkNum = i-EFUSE_USAGE_MAP_START;824824- break;825825- }826826- else if(( (LogicalAddress >> 8) & 0xff) == 0)827827- {828828- if (i != EFUSE_USAGE_MAP_END)829829- {830830- BlkNum = i+1-EFUSE_USAGE_MAP_START;831831- }832832- break;833833- }834834- }835835- DBGPRINT(RT_DEBUG_TRACE, ("Not bWriteSuccess new BlkNum = %d\n", BlkNum));836836- if(BlkNum == 0xffff)837837- {838838- DBGPRINT(RT_DEBUG_TRACE, ("eFuseWriteRegisters: out of free E-fuse space!!!\n"));839839- return FALSE;840840- }841841-842842- //invalidate the original mapping entry if new entry is not found843843- tmpaddr = addr;844844-845845- if(addr % 2 != 0)846846- addr = addr -1;847847- InBuf[0] = addr;848848- InBuf[1] = 2;849849-850850- eFuseReadPhysical(pAd, &InBuf[0], 4, &InBuf[2], 2);851851-852852- // write the logical address853853- if(tmpaddr%2 != 0)854854- {855855- // Invalidate the high byte856856- for (i=8; i<15; i++)857857- {858858- if( ( (InBuf[2] >> i) & 0x01) == 0)859859- {860860- InBuf[2] |= (0x1 <<i);861861- break;862862- }863863- }864864- }865865- else866866- {867867- // invalidate the low byte868868- for (i=0; i<8; i++)869869- {870870- if( ( (InBuf[2] >> i) & 0x01) == 0)871871- {872872- InBuf[2] |= (0x1 <<i);873873- break;874874- }875875- }876876- }877877- eFuseWritePhysical(pAd, &InBuf[0], 6, NULL, 0);878878- }879879- }880880- while(!bWriteSuccess);881881-882882- return TRUE;883883-}884884-885885-/*886886- ========================================================================887887-888888- Routine Description:889889-890890- Arguments:891891-892892- Return Value:893893-894894- IRQL =895895-896896- Note:897897-898898- ========================================================================899899-*/900900-VOID eFuseWritePhysical(901901- IN PRTMP_ADAPTER pAd,902902- PUSHORT lpInBuffer,903903- ULONG nInBufferSize,904904- PUCHAR lpOutBuffer,905905- ULONG nOutBufferSize906906-)907907-{908908- USHORT* pInBuf = (USHORT*)lpInBuffer;909909- int i;910910- //USHORT* pOutBuf = (USHORT*)ioBuffer;911911-912912- USHORT Offset = pInBuf[0]; //addr913913- USHORT Length = pInBuf[1]; //length914914- USHORT* pValueX = &pInBuf[2]; //value ...915915- // Little-endian S | S Big-endian916916- // addr 3 2 1 0 | 0 1 2 3917917- // Ori-V D C B A | A B C D918918- //After swapping919919- // D C B A | D C B A920920- //Both the little and big-endian use the same sequence to write data.921921- //Therefore, we only need swap data when read the data.922922- for(i=0; i<Length; i+=2)923923- {924924- eFusePhysicalWriteRegisters(pAd, Offset+i, 2, &pValueX[i/2]);925925- }926926-}927927-928928-929929-/*930930- ========================================================================931931-932932- Routine Description:933933-934934- Arguments:935935-936936- Return Value:937937-938938- IRQL =939939-940940- Note:941941-942942- ========================================================================943943-*/944944-NTSTATUS eFuseWrite(945945- IN PRTMP_ADAPTER pAd,946946- IN USHORT Offset,947947- IN PUCHAR pData,948948- IN USHORT length)949949-{950950- int i;951951-952952- USHORT* pValueX = (PUSHORT) pData; //value ...953953- //The input value=3070 will be stored as following954954- // Little-endian S | S Big-endian955955- // addr 1 0 | 0 1956956- // Ori-V 30 70 | 30 70957957- //After swapping958958- // 30 70 | 70 30959959- //Casting960960- // 3070 | 7030 (x)961961- //The swapping should be removed for big-endian962962- for(i=0; i<length; i+=2)963963- {964964- eFuseWriteRegisters(pAd, Offset+i, 2, &pValueX[i/2]);965965- }966966-967967- return TRUE;968968-}969969-970970-/*971971- ========================================================================972972-973973- Routine Description:974974-975975- Arguments:976976-977977- Return Value:978978-979979- IRQL =980980-981981- Note:982982-983983- ========================================================================984984-*/985985-INT set_eFuseGetFreeBlockCount_Proc(986986- IN PRTMP_ADAPTER pAd,987987- IN PUCHAR arg)988988-{989989- USHORT i;990990- USHORT LogicalAddress;991991- USHORT efusefreenum=0;992992- if(!pAd->bUseEfuse)993993- return FALSE;994994- for (i = EFUSE_USAGE_MAP_START; i <= EFUSE_USAGE_MAP_END; i+=2)995995- {996996- eFusePhysicalReadRegisters(pAd, i, 2, &LogicalAddress);997997- if( (LogicalAddress & 0xff) == 0)998998- {999999- efusefreenum= (UCHAR) (EFUSE_USAGE_MAP_END-i+1);10001000- break;10011001- }10021002- else if(( (LogicalAddress >> 8) & 0xff) == 0)10031003- {10041004- efusefreenum = (UCHAR) (EFUSE_USAGE_MAP_END-i);10051005- break;10061006- }10071007-10081008- if(i == EFUSE_USAGE_MAP_END)10091009- efusefreenum = 0;10101010- }10111011- printk("efuseFreeNumber is %d\n",efusefreenum);10121012- return TRUE;10131013-}10141014-INT set_eFusedump_Proc(10151015- IN PRTMP_ADAPTER pAd,10161016- IN PUCHAR arg)10171017-{10181018-USHORT InBuf[3];10191019- INT i=0;10201020- if(!pAd->bUseEfuse)10211021- return FALSE;10221022- for(i =0; i<EFUSE_USAGE_MAP_END/2; i++)10231023- {10241024- InBuf[0] = 2*i;10251025- InBuf[1] = 2;10261026- InBuf[2] = 0x0;10271027-10281028- eFuseReadPhysical(pAd, &InBuf[0], 4, &InBuf[2], 2);10291029- if(i%4==0)10301030- printk("\nBlock %x:",i/8);10311031- printk("%04x ",InBuf[2]);10321032- }10331033- return TRUE;10341034-}10351035-INT set_eFuseLoadFromBin_Proc(10361036- IN PRTMP_ADAPTER pAd,10371037- IN PUCHAR arg)10381038-{10391039- CHAR *src;10401040- struct file *srcf;10411041- INT retval, orgfsuid, orgfsgid;10421042- mm_segment_t orgfs;10431043- UCHAR *buffer;10441044- UCHAR BinFileSize=0;10451045- INT i = 0,j=0,k=1;10461046- USHORT *PDATA;10471047- USHORT DATA;10481048- BinFileSize=strlen("RT30xxEEPROM.bin");10491049- src = kmalloc(128, MEM_ALLOC_FLAG);10501050- NdisZeroMemory(src, 128);10511051-10521052- if(strlen(arg)>0)10531053- {10541054-10551055- NdisMoveMemory(src, arg, strlen(arg));10561056- }10571057-10581058- else10591059- {10601060-10611061- NdisMoveMemory(src, "RT30xxEEPROM.bin", BinFileSize);10621062- }10631063-10641064- DBGPRINT(RT_DEBUG_TRACE, ("FileName=%s\n",src));10651065- buffer = kmalloc(MAX_EEPROM_BIN_FILE_SIZE, MEM_ALLOC_FLAG);10661066-10671067- if(buffer == NULL)10681068- {10691069- kfree(src);10701070- return FALSE;10711071-}10721072- PDATA=kmalloc(sizeof(USHORT)*8,MEM_ALLOC_FLAG);10731073-10741074- if(PDATA==NULL)10751075- {10761076- kfree(src);10771077-10781078- kfree(buffer);10791079- return FALSE;10801080- }10811081- /* Don't change to uid 0, let the file be opened as the "normal" user */10821082-#if 010831083- orgfsuid = current->fsuid;10841084- orgfsgid = current->fsgid;10851085- current->fsuid=current->fsgid = 0;10861086-#endif10871087- orgfs = get_fs();10881088- set_fs(KERNEL_DS);10891089-10901090- if (src && *src)10911091- {10921092- srcf = filp_open(src, O_RDONLY, 0);10931093- if (IS_ERR(srcf))10941094- {10951095- DBGPRINT(RT_DEBUG_ERROR, ("--> Error %ld opening %s\n", -PTR_ERR(srcf),src));10961096- return FALSE;10971097- }10981098- else10991099- {11001100- // The object must have a read method11011101- if (srcf->f_op && srcf->f_op->read)11021102- {11031103- memset(buffer, 0x00, MAX_EEPROM_BIN_FILE_SIZE);11041104- while(srcf->f_op->read(srcf, &buffer[i], 1, &srcf->f_pos)==1)11051105- {11061106- DBGPRINT(RT_DEBUG_TRACE, ("%02X ",buffer[i]));11071107- if((i+1)%8==0)11081108- DBGPRINT(RT_DEBUG_TRACE, ("\n"));11091109- i++;11101110- if(i>=MAX_EEPROM_BIN_FILE_SIZE)11111111- {11121112- DBGPRINT(RT_DEBUG_ERROR, ("--> Error %ld reading %s, The file is too large[1024]\n", -PTR_ERR(srcf),src));11131113- kfree(PDATA);11141114- kfree(buffer);11151115- kfree(src);11161116- return FALSE;11171117- }11181118- }11191119- }11201120- else11211121- {11221122- DBGPRINT(RT_DEBUG_ERROR, ("--> Error!! System doest not support read function\n"));11231123- kfree(PDATA);11241124- kfree(buffer);11251125- kfree(src);11261126- return FALSE;11271127- }11281128- }11291129-11301130-11311131- }11321132- else11331133- {11341134- DBGPRINT(RT_DEBUG_ERROR, ("--> Error src or srcf is null\n"));11351135- kfree(PDATA);11361136- kfree(buffer);11371137- return FALSE;11381138-11391139- }11401140-11411141-11421142- retval=filp_close(srcf,NULL);11431143-11441144- if (retval)11451145- {11461146- DBGPRINT(RT_DEBUG_TRACE, ("--> Error %d closing %s\n", -retval, src));11471147- }11481148- set_fs(orgfs);11491149-#if 011501150- current->fsuid = orgfsuid;11511151- current->fsgid = orgfsgid;11521152-#endif11531153- for(j=0;j<i;j++)11541154- {11551155- DBGPRINT(RT_DEBUG_TRACE, ("%02X ",buffer[j]));11561156- if((j+1)%2==0)11571157- PDATA[j/2%8]=((buffer[j]<<8)&0xff00)|(buffer[j-1]&0xff);11581158- if(j%16==0)11591159- {11601160- k=buffer[j];11611161- }11621162- else11631163- {11641164- k&=buffer[j];11651165- if((j+1)%16==0)11661166- {11671167-11681168- DBGPRINT(RT_DEBUG_TRACE, (" result=%02X,blk=%02x\n",k,j/16));11691169-11701170- if(k!=0xff)11711171- eFuseWriteRegistersFromBin(pAd,(USHORT)j-15, 16, PDATA);11721172- else11731173- {11741174- if(eFuseReadRegisters(pAd,j, 2,(PUSHORT)&DATA)!=0x3f)11751175- eFuseWriteRegistersFromBin(pAd,(USHORT)j-15, 16, PDATA);11761176- }11771177- /*11781178- for(l=0;l<8;l++)11791179- printk("%04x ",PDATA[l]);11801180- printk("\n");11811181- */11821182- NdisZeroMemory(PDATA,16);11831183-11841184-11851185- }11861186- }11871187-11881188-11891189- }11901190-11911191-11921192- kfree(PDATA);11931193- kfree(buffer);11941194- kfree(src);11951195- return TRUE;11961196-}11971197-NTSTATUS eFuseWriteRegistersFromBin(11981198- IN PRTMP_ADAPTER pAd,11991199- IN USHORT Offset,12001200- IN USHORT Length,12011201- IN USHORT* pData)12021202-{12031203- USHORT i;12041204- USHORT eFuseData;12051205- USHORT LogicalAddress, BlkNum = 0xffff;12061206- UCHAR EFSROM_AOUT,Loop=0;12071207- EFUSE_CTRL_STRUC eFuseCtrlStruc;12081208- USHORT efuseDataOffset;12091209- UINT32 data,tempbuffer;12101210- USHORT addr,tmpaddr, InBuf[3], tmpOffset;12111211- UINT32 buffer[4];12121212- BOOLEAN bWriteSuccess = TRUE;12131213- BOOLEAN bNotWrite=TRUE;12141214- BOOLEAN bAllocateNewBlk=TRUE;12151215-12161216- DBGPRINT(RT_DEBUG_TRACE, ("eFuseWriteRegistersFromBin Offset=%x, pData=%04x:%04x:%04x:%04x\n", Offset, *pData,*(pData+1),*(pData+2),*(pData+3)));12171217-12181218- do12191219- {12201220- //Step 0. find the entry in the mapping table12211221- //The address of EEPROM is 2-bytes alignment.12221222- //The last bit is used for alignment, so it must be 0.12231223- Loop++;12241224- tmpOffset = Offset & 0xfffe;12251225- EFSROM_AOUT = eFuseReadRegisters(pAd, tmpOffset, 2, &eFuseData);12261226-12271227- if( EFSROM_AOUT == 0x3f)12281228- { //find available logical address pointer12291229- //the logical address does not exist, find an empty one12301230- //from the first address of block 45=16*45=0x2d0 to the last address of block 4712311231- //==>48*16-3(reserved)=2FC12321232- bAllocateNewBlk=TRUE;12331233- for (i=EFUSE_USAGE_MAP_START; i<=EFUSE_USAGE_MAP_END; i+=2)12341234- {12351235- //Retrive the logical block nubmer form each logical address pointer12361236- //It will access two logical address pointer each time.12371237- eFusePhysicalReadRegisters(pAd, i, 2, &LogicalAddress);12381238- if( (LogicalAddress & 0xff) == 0)12391239- {//Not used logical address pointer12401240- BlkNum = i-EFUSE_USAGE_MAP_START;12411241- break;12421242- }12431243- else if(( (LogicalAddress >> 8) & 0xff) == 0)12441244- {//Not used logical address pointer12451245- if (i != EFUSE_USAGE_MAP_END)12461246- {12471247- BlkNum = i-EFUSE_USAGE_MAP_START+1;12481248- }12491249- break;12501250- }12511251- }12521252- }12531253- else12541254- {12551255- bAllocateNewBlk=FALSE;12561256- BlkNum = EFSROM_AOUT;12571257- }12581258-12591259- DBGPRINT(RT_DEBUG_TRACE, ("eFuseWriteRegisters BlkNum = %d \n", BlkNum));12601260-12611261- if(BlkNum == 0xffff)12621262- {12631263- DBGPRINT(RT_DEBUG_TRACE, ("eFuseWriteRegisters: out of free E-fuse space!!!\n"));12641264- return FALSE;12651265- }12661266- //Step 1.1.012671267- //If the block is not existing in mapping table, create one12681268- //and write down the 16-bytes data to the new block12691269- if(bAllocateNewBlk)12701270- {12711271- DBGPRINT(RT_DEBUG_TRACE, ("Allocate New Blk\n"));12721272- efuseDataOffset = EFUSE_DATA3;12731273- for(i=0; i< 4; i++)12741274- {12751275- DBGPRINT(RT_DEBUG_TRACE, ("Allocate New Blk, Data%d=%04x%04x\n",3-i,pData[2*i+1],pData[2*i]));12761276- tempbuffer=((pData[2*i+1]<<16)&0xffff0000)|pData[2*i];12771277-12781278-12791279- RTMP_IO_WRITE32(pAd, efuseDataOffset,tempbuffer);12801280- efuseDataOffset -= 4;12811281-12821282- }12831283- /////////////////////////////////////////////////////////////////12841284-12851285- //Step1.1.1. Write 10-bit of address to EFSROM_AIN (0x580, bit25:bit16). The address must be 16-byte alignment.12861286- eFuseCtrlStruc.field.EFSROM_AIN = BlkNum* 0x10 ;12871287-12881288- //Step1.1.2. Write EFSROM_MODE (0x580, bit7:bit6) to 3.12891289- eFuseCtrlStruc.field.EFSROM_MODE = 3;12901290-12911291- //Step1.1.3. Write EFSROM_KICK (0x580, bit30) to 1 to kick-off physical write procedure.12921292- eFuseCtrlStruc.field.EFSROM_KICK = 1;12931293-12941294- NdisMoveMemory(&data, &eFuseCtrlStruc, 4);12951295-12961296- RTMP_IO_WRITE32(pAd, EFUSE_CTRL, data);12971297-12981298- //Step1.1.4. Polling EFSROM_KICK(0x580, bit30) until it become 0 again. It��s done.12991299- i = 0;13001300- while(i < 100)13011301- {13021302- RTMP_IO_READ32(pAd, EFUSE_CTRL, (PUINT32) &eFuseCtrlStruc);13031303-13041304- if(eFuseCtrlStruc.field.EFSROM_KICK == 0)13051305- break;13061306-13071307- RTMPusecDelay(2);13081308- i++;13091309- }13101310-13111311- }13121312- else13131313- { //Step1.2.13141314- //If the same logical number is existing, check if the writting data and the data13151315- //saving in this block are the same.13161316- /////////////////////////////////////////////////////////////////13171317- //read current values of 16-byte block13181318- RTMP_IO_READ32(pAd, EFUSE_CTRL, (PUINT32) &eFuseCtrlStruc);13191319-13201320- //Step1.2.0. Write 10-bit of address to EFSROM_AIN (0x580, bit25:bit16). The address must be 16-byte alignment.13211321- eFuseCtrlStruc.field.EFSROM_AIN = Offset & 0xfff0;13221322-13231323- //Step1.2.1. Write EFSROM_MODE (0x580, bit7:bit6) to 1.13241324- eFuseCtrlStruc.field.EFSROM_MODE = 0;13251325-13261326- //Step1.2.2. Write EFSROM_KICK (0x580, bit30) to 1 to kick-off physical read procedure.13271327- eFuseCtrlStruc.field.EFSROM_KICK = 1;13281328-13291329- NdisMoveMemory(&data, &eFuseCtrlStruc, 4);13301330- RTMP_IO_WRITE32(pAd, EFUSE_CTRL, data);13311331-13321332- //Step1.2.3. Polling EFSROM_KICK(0x580, bit30) until it become 0 again.13331333- i = 0;13341334- while(i < 100)13351335- {13361336- RTMP_IO_READ32(pAd, EFUSE_CTRL, (PUINT32) &eFuseCtrlStruc);13371337-13381338- if(eFuseCtrlStruc.field.EFSROM_KICK == 0)13391339- break;13401340- RTMPusecDelay(2);13411341- i++;13421342- }13431343-13441344- //Step1.2.4. Read 16-byte of data from EFUSE_DATA0-3 (0x59C-0x590)13451345- efuseDataOffset = EFUSE_DATA3;13461346- for(i=0; i< 4; i++)13471347- {13481348- RTMP_IO_READ32(pAd, efuseDataOffset, (PUINT32) &buffer[i]);13491349- efuseDataOffset -= 4;13501350- }13511351- //Step1.2.5. Check if the data of efuse and the writing data are the same.13521352- for(i =0; i<4; i++)13531353- {13541354- tempbuffer=((pData[2*i+1]<<16)&0xffff0000)|pData[2*i];13551355- DBGPRINT(RT_DEBUG_TRACE, ("buffer[%d]=%x,pData[%d]=%x,pData[%d]=%x,tempbuffer=%x\n",i,buffer[i],2*i,pData[2*i],2*i+1,pData[2*i+1],tempbuffer));13561356-13571357- if(((buffer[i]&0xffff0000)==(pData[2*i+1]<<16))&&((buffer[i]&0xffff)==pData[2*i]))13581358- bNotWrite&=TRUE;13591359- else13601360- {13611361- bNotWrite&=FALSE;13621362- break;13631363- }13641364- }13651365- if(!bNotWrite)13661366- {13671367- printk("The data is not the same\n");13681368-13691369- for(i =0; i<8; i++)13701370- {13711371- addr = BlkNum * 0x10 ;13721372-13731373- InBuf[0] = addr+2*i;13741374- InBuf[1] = 2;13751375- InBuf[2] = pData[i];13761376-13771377- eFuseWritePhysical(pAd, &InBuf[0], 6, NULL, 2);13781378- }13791379-13801380- }13811381- else13821382- return TRUE;13831383- }13841384-13851385-13861386-13871387- //Step 2. Write mapping table13881388- addr = EFUSE_USAGE_MAP_START+BlkNum;13891389-13901390- tmpaddr = addr;13911391-13921392- if(addr % 2 != 0)13931393- addr = addr -1;13941394- InBuf[0] = addr;13951395- InBuf[1] = 2;13961396-13971397- //convert the address from 10 to 8 bit ( bit7, 6 = parity and bit5 ~ 0 = bit9~4), and write to logical map entry13981398- tmpOffset = Offset;13991399- tmpOffset >>= 4;14001400- tmpOffset |= ((~((tmpOffset & 0x01) ^ ( tmpOffset >> 1 & 0x01) ^ (tmpOffset >> 2 & 0x01) ^ (tmpOffset >> 3 & 0x01))) << 6) & 0x40;14011401- tmpOffset |= ((~( (tmpOffset >> 2 & 0x01) ^ (tmpOffset >> 3 & 0x01) ^ (tmpOffset >> 4 & 0x01) ^ ( tmpOffset >> 5 & 0x01))) << 7) & 0x80;14021402-14031403- // write the logical address14041404- if(tmpaddr%2 != 0)14051405- InBuf[2] = tmpOffset<<8;14061406- else14071407- InBuf[2] = tmpOffset;14081408-14091409- eFuseWritePhysical(pAd,&InBuf[0], 6, NULL, 0);14101410-14111411- //Step 3. Compare data if not the same, invalidate the mapping entry, then re-write the data until E-fuse is exhausted14121412- bWriteSuccess = TRUE;14131413- for(i =0; i<8; i++)14141414- {14151415- addr = BlkNum * 0x10 ;14161416-14171417- InBuf[0] = addr+2*i;14181418- InBuf[1] = 2;14191419- InBuf[2] = 0x0;14201420-14211421- eFuseReadPhysical(pAd, &InBuf[0], 4, &InBuf[2], 2);14221422- DBGPRINT(RT_DEBUG_TRACE, ("addr=%x, buffer[i]=%x,InBuf[2]=%x\n",InBuf[0],pData[i],InBuf[2]));14231423- if(pData[i] != InBuf[2])14241424- {14251425- bWriteSuccess = FALSE;14261426- break;14271427- }14281428- }14291429-14301430- //Step 4. invlidate mapping entry and find a free mapping entry if not succeed14311431-14321432- if (!bWriteSuccess&&Loop<2)14331433- {14341434- DBGPRINT(RT_DEBUG_TRACE, ("eFuseWriteRegistersFromBin::Not bWriteSuccess BlkNum = %d\n", BlkNum));14351435-14361436- // the offset of current mapping entry14371437- addr = EFUSE_USAGE_MAP_START+BlkNum;14381438-14391439- //find a new mapping entry14401440- BlkNum = 0xffff;14411441- for (i=EFUSE_USAGE_MAP_START; i<=EFUSE_USAGE_MAP_END; i+=2)14421442- {14431443- eFusePhysicalReadRegisters(pAd, i, 2, &LogicalAddress);14441444- if( (LogicalAddress & 0xff) == 0)14451445- {14461446- BlkNum = i-EFUSE_USAGE_MAP_START;14471447- break;14481448- }14491449- else if(( (LogicalAddress >> 8) & 0xff) == 0)14501450- {14511451- if (i != EFUSE_USAGE_MAP_END)14521452- {14531453- BlkNum = i+1-EFUSE_USAGE_MAP_START;14541454- }14551455- break;14561456- }14571457- }14581458- DBGPRINT(RT_DEBUG_TRACE, ("eFuseWriteRegistersFromBin::Not bWriteSuccess new BlkNum = %d\n", BlkNum));14591459- if(BlkNum == 0xffff)14601460- {14611461- DBGPRINT(RT_DEBUG_TRACE, ("eFuseWriteRegistersFromBin: out of free E-fuse space!!!\n"));14621462- return FALSE;14631463- }14641464-14651465- //invalidate the original mapping entry if new entry is not found14661466- tmpaddr = addr;14671467-14681468- if(addr % 2 != 0)14691469- addr = addr -1;14701470- InBuf[0] = addr;14711471- InBuf[1] = 2;14721472-14731473- eFuseReadPhysical(pAd, &InBuf[0], 4, &InBuf[2], 2);14741474-14751475- // write the logical address14761476- if(tmpaddr%2 != 0)14771477- {14781478- // Invalidate the high byte14791479- for (i=8; i<15; i++)14801480- {14811481- if( ( (InBuf[2] >> i) & 0x01) == 0)14821482- {14831483- InBuf[2] |= (0x1 <<i);14841484- break;14851485- }14861486- }14871487- }14881488- else14891489- {14901490- // invalidate the low byte14911491- for (i=0; i<8; i++)14921492- {14931493- if( ( (InBuf[2] >> i) & 0x01) == 0)14941494- {14951495- InBuf[2] |= (0x1 <<i);14961496- break;14971497- }14981498- }14991499- }15001500- eFuseWritePhysical(pAd, &InBuf[0], 6, NULL, 0);15011501- }15021502-15031503- }15041504- while(!bWriteSuccess&&Loop<2);15051505-15061506- return TRUE;15071507-}15081508-15091509-#endif // RT30xx //15101510-//2008/09/11:KH add to support efuse-->11+#include "../../rt2860/common/eeprom.c"