📄 zdhci.c
字号:
}
else {
//FPRINT("zd_DisableProtection");
pdot11Obj->ConfigFlag &= ~ENABLE_PROTECTION_SET;
mErp.buf[2] &= ~USE_PROTECTION;
//pdot11Obj->ConfigFlag &= ~SHORT_SLOT_TIME_SET;
mCap |= CAP_SHORT_SLOT_TIME;
pdot11Obj->SetReg(reg, ZD_CWmin_CWmax, CW_SHORT_SLOT);
}
}
void zd_EnableBarker(U8 barker)
{
void *reg = pdot11Obj->reg;
if (barker){
//FPRINT("zd_EnableBarker");
pdot11Obj->ConfigFlag |= BARKER_PREAMBLE_SET;
mErp.buf[2] |= BARKER_PREAMBLE;
pdot11Obj->SetReg(reg, ZD_RTS_CTS_Rate, 0x30000);
}
else {
//FPRINT("zd_DisableBarker");
pdot11Obj->ConfigFlag &= ~BARKER_PREAMBLE_SET;
mErp.buf[2] &= ~BARKER_PREAMBLE;
pdot11Obj->SetReg(reg, ZD_RTS_CTS_Rate, 0x30000);
}
if(PURE_A_MODE == mMacMode) //Use Slowest rate when CTS/RTS,MZCai
pdot11Obj->SetReg(reg, ZD_RTS_CTS_Rate,0x01090109);
else
pdot11Obj->SetReg(reg, ZD_RTS_CTS_Rate, 0x30000);
}
void zd_EnableShortSlot(U8 slot)
{
void *reg = pdot11Obj->reg;
if (slot){
//FPRINT("zd_EnableShortSlot");
pdot11Obj->ConfigFlag |= SHORT_SLOT_TIME_SET;
pdot11Obj->SetReg(reg, ZD_IFS_Value, 0x547c00a);
pdot11Obj->SetReg(reg, ZD_CWmin_CWmax, CW_NORMAL_SLOT);
}
else {
//FPRINT("zd_DisableShortSlot");
pdot11Obj->ConfigFlag &= ~SHORT_SLOT_TIME_SET;
pdot11Obj->SetReg(reg, ZD_IFS_Value, 0x547c032);
pdot11Obj->SetReg(reg, ZD_CWmin_CWmax, CW_LONG_SLOT);
}
}
void zd_PsChange(U8 PwrState)
{
//FPRINT("zd_PsChange");
mPwrState = PwrState;
mRequestFlag |= PS_CHANGE_SET;
return;
}
void zd_EventNotify(U16 EventId, U32 parm1, U32 parm2, U32 parm3)
{
//struct zd1205_private *macp = g_dev->priv;
switch(EventId){
case EVENT_TBCN:
zd_NextBcn();
break;
case EVENT_DTIM_NOTIFY:
zd_DtimNotify();
break;
case EVENT_TX_COMPLETE:
TxCompleted(parm1, (U8)parm2, (U16)parm3);
break;
case EVENT_TCHAL_TIMEOUT:
zd_SendTChalMsg();
break;
case EVENT_SCAN_TIMEOUT:
zd_SwitchNextCH();
break;
case EVENT_UPDATE_TX_RATE:
zd_UpdateCurrTxRate((U8)parm1, (U16)parm2);
break;
case EVENT_SW_RESET:
//zd_SwReset();
break;
case EVENT_BUF_RELEASE:
zd_Release_80211_Buffer();
break;
case EVENT_AUTH_TIMEOUT:
zd_SendTAuthMsg();
break;
case EVENT_ASOC_TIMEOUT:
zd_SendTAsocMsg();
break;
case EVENT_PS_CHANGE:
zd_PsChange((U8)parm1);
break;
case EVENT_MORE_DATA:
mRequestFlag |= PS_POLL_SET;
break;
case EVENT_ENABLE_PROTECTION:
zd_EnableProtection((U8)parm1);
break;
case EVENT_ENABLE_BARKER:
zd_EnableBarker((U8)parm1);
break;
case EVENT_SHORT_SLOT:
zd_EnableShortSlot((U8)parm1);
break;
default:
break;
}
return;
}
BOOLEAN zd_CleanupTxQ(void)
{
//FPRINT("*****zd_CleanupTxQ*****");
int loopCheck = 0;
int CleanResult = 1;
while(CleanResult)
{
// To prevent unknown reason that can't clean up the txq(ex. re-queue in CleanupTxQ())
if(loopCheck++ > 100)
{
printk("infinite loop occurs in %s\n", __FUNCTION__);
loopCheck = 0;
break;
}
CleanResult = CleanupTxQ();
}
if (!pTxQ->cnt){
pdot11Obj->QueueFlag &= ~TX_QUEUE_SET;
return TRUE;
}
else
return FALSE;
}
BOOLEAN zd_CleanupAwakeQ(void)
{
//PSDEBUG("*****zd_CleanupAwakeQ*****");
int loopCheck = 0;
while(1)
{
// To prevent unknown reason that can't clean Awake Queue
if(loopCheck++ > 100)
{
printk("infinite loop occurs in %s\n", __FUNCTION__);
loopCheck = 0;
break;
}
CleanupAwakeQ();
}
if (!pAwakeQ->cnt){
pdot11Obj->QueueFlag &= ~AWAKE_QUEUE_SET;
return TRUE;
}
else{
#if 0
Signal_t *signal;
FrmInfo_t *pfrmInfo;
FrmDesc_t *pfrmDesc;
while(pAwakeQ->cnt){
signal = sigDeque(pAwakeQ);
pfrmInfo = &signal->frmInfo;
pfrmDesc = pfrmInfo->frmDesc;
freeFdesc(pfrmDesc);
pdot11Obj->ReleaseBuffer(signal->buf);
freeSignal(signal);
}
#endif
return FALSE;
}
}
void zd_ShowQInfo(void)
{
printk(KERN_DEBUG "AwakeQ = %x, MgtQ = %x, TxQ = %x, mcQ = %x\n",
pAwakeQ->cnt, pMgtQ->cnt, pTxQ->cnt, pPsQ[0]->cnt);
printk(KERN_DEBUG "PsQ1 = %x, PsQ2 = %x, PsQ3 = %x, PsQ4 = %x\n",
pPsQ[1]->cnt, pPsQ[2]->cnt, pPsQ[3]->cnt, pPsQ[4]->cnt);
}
extern U8 AuthReqState;
extern U8 AsocState;
void zd_ShowState(void)
{
printk(KERN_DEBUG "AuthReqState = %04x, AsocState = %04x\n", AuthReqState, AsocState);
printk(KERN_DEBUG "mPwrState = %04x, mAssoc = %04x\n", mPwrState, mAssoc);
printk(KERN_DEBUG "mAuthAlg = %04x, mBssIndex = %04x\n", mAuthAlg, mBssIndex);
printk(KERN_DEBUG "mBssType = %04x, ConfigFlag = %04x\n", mBssType, pdot11Obj->ConfigFlag);
}
void zd_ShowHashInfo(U8 aid)
{
Hash_t *pHash = NULL;
if (mBssType == INFRASTRUCTURE_BSS){
aid = 0;
}
pHash = sstByAid[aid];
zd1205_dump_data("Mac Addr = ", pHash->mac, 6);
FPRINT_V("Auth", pHash->auth);
FPRINT_V("Asoc", pHash->asoc);
FPRINT_V("psm", pHash->psm);
FPRINT_V("Aid", pHash->aid);
FPRINT_V("vapId", pHash->vapId);
FPRINT_V("bErpSta", pHash->bErpSta);
FPRINT_V("lsInterval", pHash->lsInterval);
FPRINT_V("encryMode", pHash->encryMode);
FPRINT_V("pkInstalled", pHash->pkInstalled);
FPRINT_V("ZydasMode", pHash->ZydasMode);
FPRINT_V("AlreadyIn", pHash->AlreadyIn);
FPRINT_V("CurrTxRate", pHash->CurrTxRate);
FPRINT_V("MaxRate", pHash->MaxRate);
FPRINT_V("Preamble", pHash->Preamble);
FPRINT_V("KeyId", pHash->KeyId);
FPRINT_V("Rx IV16", pHash->RxSeed.IV16);
FPRINT_V("Rx IV32", pHash->RxSeed.IV32);
zd1205_dump_data("TK = ", pHash->TxSeed.TK, 16);
zd1205_dump_data("Tx MIC K0 = ", (U8 *)&pHash->TxMicKey.K0, 4);
zd1205_dump_data("Tx MIC K1 = ", (U8 *)&pHash->TxMicKey.K1, 4);
zd1205_dump_data("Rx MIC K0 = ", (U8 *)&pHash->RxMicKey.K0, 4);
zd1205_dump_data("Rx MIC K1 = ", (U8 *)&pHash->RxMicKey.K1, 4);
#if 0
FPRINT_V("KeyId", mWpaBcKeyId);
FPRINT_V("GkInstalled", mGkInstalled);
FPRINT_V("IV16", mIv16);
FPRINT_V("IV32", mIv32);
zd1205_dump_data("keyContent = ", pHash->keyContent, 16);
zd1205_dump_data("TK = ", mBcSeed.TK, 16);
zd1205_dump_data("Tx MIC K0 = ", (U8 *)&mBcMicKey.K0, 4);
zd1205_dump_data("Tx MIC K1 = ", (U8 *)&mBcMicKey.K1, 4);
#endif
}
void zd_UpdateCardSetting(card_Setting_t *pSetting)
{
void *reg = pdot11Obj->reg;
static BOOLEAN InitConfig = TRUE;
U8 bcAddr[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
U32 tmpValue;
BOOLEAN bReConnect = FALSE;
//FPRINT("zd_UpdateCardSetting");
if (pSetting->AuthMode == 0){ //open system only
mAuthAlogrithms[0] = OPEN_SYSTEM;
mAuthAlogrithms[1] = NULL_AUTH;
mAuthAlg = OPEN_SYSTEM;
}
else if (pSetting->AuthMode == 1){ //shared key only
mAuthAlogrithms[0] = SHARE_KEY;
mAuthAlogrithms[1] = NULL_AUTH;
mAuthAlg = SHARE_KEY;
}
else if (pSetting->AuthMode == 2){ //auto auth mode
mAuthAlogrithms[0] = OPEN_SYSTEM;
mAuthAlogrithms[1] = SHARE_KEY;
}
if (mAuthMode != pSetting->AuthMode){
if (!InitConfig)
bReConnect = TRUE;
}
mAuthMode = pSetting->AuthMode;
if (mLimitedUser != pSetting->LimitedUser){
mLimitedUser = pSetting->LimitedUser;
}
mBlockBSS = pSetting->BlockBSS;
mSwCipher = pSetting->SwCipher;
mKeyFormat = pSetting->EncryMode;
mKeyId = pSetting->EncryKeyId;
mBcKeyId = pSetting->BcKeyId;
mDynKeyMode = pSetting->DynKeyMode;
mFragThreshold = pSetting->FragThreshold;
mRtsThreshold = pSetting->RTSThreshold;
mBeaconPeriod = pSetting->BeaconInterval;
mDtimPeriod = pSetting->DtimPeriod;
if (!InitConfig)
{
if (pSetting->BssType == INFRASTRUCTURE_BSS) // In IBSS mode, Enable beacon transmission at IBSS creation or Join.
HW_EnableBeacon(pdot11Obj, mBeaconPeriod, mDtimPeriod, pSetting->BssType);
}
//HW_EnableBeacon(pdot11Obj, mBeaconPeriod, mDtimPeriod, mBssType);
if (mRadioOn != pSetting->RadioOn){
mRadioOn = pSetting->RadioOn;
if (!InitConfig)
HW_RadioOnOff(pdot11Obj, mRadioOn);
}
if (mRfChannel != pSetting->Channel){
mRfChannel = pSetting->Channel;
mPhpm.buf[0] = EID_DSPARMS;
mPhpm.buf[1] = 1;
mPhpm.buf[2] = mRfChannel;
if (!InitConfig){
if (pSetting->BssType != INFRASTRUCTURE_BSS)
HW_SetRfChannel(pdot11Obj, mRfChannel, 0,pSetting->MacMode);
if (pSetting->BssType == INDEPENDENT_BSS){
mRequestFlag |= CHANNEL_SCAN_SET;
pdot11Obj->ConfigFlag |= SCAN_AND_CONNECT_SET;
//bReConnect = FALSE;
}
}
}
mPreambleType = pSetting->PreambleType;
if (mPreambleType)
mCap |= CAP_SHORT_PREAMBLE;
else
mCap &= ~CAP_SHORT_PREAMBLE;
mPrivacyInvoked = pSetting->EncryOnOff;
if (pSetting->DynKeyMode > 0)
mPrivacyInvoked = TRUE;
if (mPrivacyInvoked)
mCap |= CAP_PRIVACY;
else
mCap &= ~CAP_PRIVACY;
memcpy(&dot11DesiredSsid, pSetting->Info_SSID, pSetting->Info_SSID[1]+2);
if (dot11DesiredSsid.buf[1] == 0)
mProbeWithSsid = FALSE;
else
mProbeWithSsid = TRUE;
//mProbeWithSsid = FALSE; //debug for ANY connection
if ((pSetting->BssType == INFRASTRUCTURE_BSS) || (pSetting->BssType == INDEPENDENT_BSS)) {
if (!InitConfig) {
// if (memcmp(&mSsid, &dot11DesiredSsid, dot11DesiredSsid.buf[1]+2) != 0 ){
bReConnect = TRUE;
// }
}
if (pSetting->BssType == INDEPENDENT_BSS){
memcpy(&mSsid, &dot11DesiredSsid, dot11DesiredSsid.buf[1]+2);
mATIMWindow = pSetting->ATIMWindow;
}
}
mHiddenSSID = pSetting->HiddenSSID;
if (mHiddenSSID){
mSsid.buf[0] = EID_SSID;
mSsid.buf[1] = 1;
mSsid.buf[2] = 0x0;
}
memcpy(&mBrates, pSetting->Info_SupportedRates, pSetting->Info_SupportedRates[1]+2);
if (!InitConfig){
#if defined(AMAC)
pdot11Obj->SetReg(reg, ZD_BasicRateTbl, 0);
#endif
HW_SetSupportedRate(pdot11Obj, (U8 *)&mBrates);
}
#if defined(OFDM)
if (pSetting->MacMode != PURE_B_MODE){
if (pSetting->ShortSlotTime){
pdot11Obj->ConfigFlag |= SHORT_SLOT_TIME_SET;
mCap |= CAP_SHORT_SLOT_TIME;
}
else{
pdot11Obj->ConfigFlag &= ~SHORT_SLOT_TIME_SET;
mCap &= ~CAP_SHORT_SLOT_TIME;
}
mMaxTxRate = 0x0b;
if(PURE_A_MODE != pSetting->MacMode) {
memcpy(&mExtRates, pSetting->Ext_SupportedRates, pSetting->Ext_SupportedRates[1]+2);
if (!InitConfig)
HW_SetSupportedRate(pdot11Obj, (U8 *)&mExtRates);
}
}
else
mMaxTxRate = 0x03;
if (!InitConfig) {
if (mMacMode != pSetting->MacMode) { //MacMode changed
bReConnect = TRUE;
}
}
mMacMode = pSetting->MacMode;
#endif
memcpy((U8 *)&dot11MacAddress, pSetting->MacAddr, 6);
memcpy(&mKeyVector[0][0], &pSetting->keyVector[0][0], sizeof(mKeyVector));
mWepKeyLen = pSetting->WepKeyLen;
memcpy(&mBcKeyVector[0], &pSetting->BcKeyVector[0], sizeof(mBcKeyVector));
mBcKeyLen = pSetting->BcKeyLen;
/* Check if we need to copy the WPA IE */
//if ((mDynKeyMode == DYN_KEY_TKIP) || (mDynKeyMode == DYN_KEY_AES)
// || (pSetting->WPASupport == 1 && pSetting->WPAIe[1] != 0)){
if ((pSetting->WPASupport==1 || pSetting->WPAIeLen))
{
//printk(KERN_ERR "Copy WPA IE in the zd_UpdateCardSetting\n");
memcpy(&mWPAIe, pSetting->WPAIe, pSetting->WPAIeLen);
}
else
{
memset(&mWPAIe.buf[0], 0, sizeof(mWPAIe));
}
#if defined(AMAC)
mOperationMode = pSetting->OperationMode;
if (!InitConfig)
{
//HW_CAM_ResetRollTbl(pdot11Obj);
if ((mOperationMode == CAM_AP_VAP) || (mOperationMode == CAM_AP_CLIENT)){
// for Ack response
HW_CAM_ResetRollTbl(pdot11Obj);
HW_CAM_SetMAC(pdot11Obj, CAM_VAP_START_AID, (U8 *)&dot11MacAddress);
HW_CAM_UpdateRollTbl(pdot11Obj, CAM_VAP_START_AID);
// for Address1 matching
HW_CAM_SetMAC(pdot11Obj, 0, (U8 *)&bcAddr);
HW_CAM_UpdateRollTbl(pdot11Obj, 0);
}
else if (pSetting->BssType == INFRASTRUCTURE_BSS)
{// Don't clear key in AP_BSS and IBSS mode.
HW_CAM_ClearRollTbl(pdot11Obj, CAM_VAP_START_AID);
HW_CAM_ClearRollTbl(pdot11Obj, 0);
}
}
else
{// Only clear all keys in the first time.
HW_CAM_ResetRollTbl(pdot11Obj);
}
#endif
//mPwrState = pSetting->PwrState;
if (pSetting->BssType == AP_BSS){
memcpy(&mSsid, &dot11DesiredSsid, dot11DesiredSsid.buf[1]+2);
memcpy((U8 *)&mBssId, pSetting->MacAddr, 6);
// Upd
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -