⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zdhci.c

📁 ZYDAS zd1211b driver for Linux2.4
💻 C
📖 第 1 页 / 共 5 页
字号:
        bChooseAPResult=zd_ChooseAP(0);        if (!bChooseAPResult || 1) {// dot11DesiredSsid can't be found in table mBssInfo[]                if ((index+1) <= mBssCnt) {                        //printk(KERN_ERR "Desired SSID can't be found in current table\n");                        mBssIndex=index; // Can't found in the latest scan result table, use the old index.                } else {                        return FALSE; // The index exceed mBssInfo[].                }        } else {                //printk(KERN_ERR "Desired SSID found in location %d\n",mBssIndex);        }        //Disable IBSS mode        tmpvalue = pdot11Obj->GetReg(reg, ZD_BCNInterval);        tmpvalue &= ~BIT_25;        pdot11Obj->SetReg(reg, ZD_BCNInterval, tmpvalue);        mCap |= BIT_0;        mCap &= ~BIT_1;        // For IBSS Connect        if (mBssInfo[index].cap & CAP_IBSS) {        }        //mBssIndex = index;        //update beacon interval        HW_UpdateBcnInterval(pdot11Obj, mBssInfo[mBssIndex].bcnInterval);        pSsid = &mBssInfo[mBssIndex].ssid;        memcpy((U8 *)&mSsid, (U8 *)pSsid, pSsid->buf[1]+2);        pBssid = &mBssInfo[mBssIndex].bssid;        memcpy((U8 *)&mBssId, (U8 *)pBssid, 6);        //update Bssid        pdot11Obj->SetReg(reg, ZD_BSSID_P1, cpu_to_le32(*(U32 *)&mBssId.mac[0]));        pdot11Obj->SetReg(reg, ZD_BSSID_P2, cpu_to_le32(*(U32 *)&mBssId.mac[4]));        // Update channel number contained in the DS Parameter Set element of the received probe response or beacon frame.        mRfChannel = mBssInfo[mBssIndex].Phpm.buf[2];        if(PURE_A_AP == mBssInfo[mBssIndex].apMode) {                ChangeMacMode(PURE_A_MODE,mRfChannel);                zd_UpdateCardSetting(&(macp->cardSetting));                pdot11Obj->DelayUs(1000);                HW_SetRfChannel(pdot11Obj, mRfChannel, 1, PURE_A_MODE);        } else {                if(PURE_A_MODE == mMacMode)                        mMacMode = MIXED_MODE;                ChangeMacMode(mMacMode,mRfChannel);                zd_UpdateCardSetting(&(macp->cardSetting));                pdot11Obj->DelayUs(1000);                HW_SetRfChannel(pdot11Obj, mRfChannel, 1, MIXED_MODE);        }        signal->id = SIG_AUTH_REQ;        signal->block = BLOCK_AUTH_REQ;        memcpy(&signal->frmInfo.Sta, (U8 *)&mBssId, 6);        sigEnque(pMgtQ, (signal));        if (mRequestFlag & CONNECT_TOUT_SET)                mRequestFlag &= ~CONNECT_TOUT_SET;        if (mRequestFlag & BSS_CONNECT_SET)                mRequestFlag &= ~BSS_CONNECT_SET;        return TRUE;}BOOLEAN zd_IbssConnect(void){        struct zd1205_private *macp=g_dev->priv;        int i;        U8 Length;        BOOLEAN bBSSFound = FALSE;        MacAddr_t *pBssid;        BssInfo_t *pBssInfo;        void *reg = pdot11Obj->reg;        U32 tmpvalue;        //FPRINT("zd_IbssConnect");#if defined(OFDM)        pdot11Obj->SetReg(reg, ZD_CWmin_CWmax, CW_NORMAL_SLOT);        // not to use short slot time        mCap &= ~BIT_10;        pdot11Obj->ConfigFlag &= ~SHORT_SLOT_TIME_SET;        if (mMacMode == PURE_G_MODE) {                // not use protection mechanism                pdot11Obj->ConfigFlag &= ~ENABLE_PROTECTION_SET;        } else if(mMacMode != PURE_A_MODE) {                // force use protection mechanism                pdot11Obj->ConfigFlag |= ENABLE_PROTECTION_SET;        }#endif        // Recover the EIFS to 0x200.        // We need not use SleepResetDevice. In IBSS mode, we can easily        // get others traffic. (not less of Rx-Frame)        pdot11Obj->SetReg(reg, ZD_IFS_Value, 0x5200032);        if (mATIMWindow != 0) {                // Do not set macp->PwrState = PSM, otherwise                // throughput with Cirrus card (in PS mode) will down.                //macp->PwrState = PSM;                // PwrMgt = 1                tmpvalue = pdot11Obj->GetReg(reg, ZD_BCNInterval);                tmpvalue |= BIT_26;                pdot11Obj->SetReg(reg, ZD_BCNInterval, tmpvalue);        } else {                //macp->PwrState = CAM;                // PwrMgt = 0;                tmpvalue = pdot11Obj->GetReg(reg, ZD_BCNInterval);                tmpvalue &= ~BIT_26;                pdot11Obj->SetReg(reg, ZD_BCNInterval, tmpvalue);        }        mCap &= ~BIT_0;        mCap |= BIT_1;        if (mBssCnt) {	// IBSS found                for (i=0; i<mBssCnt; i++) {                        Length = dot11DesiredSsid.buf[1]+2;                        if (mBssInfo[i].cap & CAP_IBSS) {                                if (memcmp((U8 *)&dot11DesiredSsid, (U8 *)&mBssInfo[i].ssid, Length) == 0) {                                        break;                                }                        }                }                if (i < mBssCnt) {                        bBSSFound = TRUE;                        mBssIndex = i;                        //FPRINT("IBSS found, joint it !!!");                        //FPRINT_V("mBssIndex", mBssIndex);                        if (mMacMode==PURE_B_MODE) {                                if ((mBssInfo[i].cap & CAP_SHORT_PREAMBLE)==0)                                        mCap &= ~CAP_SHORT_PREAMBLE;                        }                        pBssInfo = &mBssInfo[mBssIndex];                        // Update channel number contained in the DS Parameter Set element of the received probe response or beacon frame.                        macp->cardSetting.Channel = mRfChannel = pBssInfo->Phpm.buf[2];                        mPhpm.buf[2]=mRfChannel;                        if(PURE_A_AP == mBssInfo[mBssIndex].apMode) {                                ChangeMacMode(PURE_A_MODE, mRfChannel);                                HW_SetRfChannel(pdot11Obj, mRfChannel, 1, PURE_A_MODE);                        } else {                                ChangeMacMode(MIXED_MODE,mRfChannel);                                HW_SetRfChannel(pdot11Obj, mRfChannel, 1, MIXED_MODE);                        }                        //FPRINT_V("mRfChannel", mRfChannel);                        pBssid = &pBssInfo->bssid;                        memcpy((U8 *)&mBssId, (U8 *)pBssid, 6);                        //zd1205_dump_data("mBssId = ", (U8 *)&mBssId, 6);                        //update Bssid                        pdot11Obj->SetReg(reg, ZD_BSSID_P1, cpu_to_le32(*(U32 *)&mBssId.mac[0]));                        pdot11Obj->SetReg(reg, ZD_BSSID_P2, cpu_to_le32(*(U32 *)&mBssId.mac[4]));                        //update beacon interval                        mBeaconPeriod = pBssInfo->bcnInterval;                        HW_UpdateBcnInterval(pdot11Obj, mBeaconPeriod);                        //FPRINT_V("mBeaconPeriod", mBeaconPeriod);                        //update supported rated                        memcpy((U8 *)&mBrates, (U8 *)&pBssInfo->supRates, pBssInfo->supRates.buf[1]+2);                        HW_SetSupportedRate(pdot11Obj, (U8 *)&mBrates);                        //zd1205_dump_data("mBrates = ", (U8 *)&mBrates, mBrates.buf[1]+2);#if defined(OFDM)                        if (mMacMode != PURE_B_MODE && mMacMode != PURE_A_MODE) {                                if (pBssInfo->extRates.buf[0] == EID_EXT_RATES) {                                        memcpy((U8 *)&mExtRates, (U8 *)&pBssInfo->extRates, pBssInfo->extRates.buf[1]+2);                                        HW_SetSupportedRate(pdot11Obj, (U8 *)&mExtRates);                                        //zd1205_dump_data("mExtRates = ", (U8 *)&mExtRates, mExtRates.buf[1]+2);                                }                        }#endif                        //update ATIM Window                        mATIMWindow = pBssInfo->IbssParms.buf[2] + (((U16)pBssInfo->IbssParms.buf[3]) << 8);                        memcpy((U8 *)&mIbssParms, (U8 *)&pBssInfo->IbssParms, pBssInfo->IbssParms.buf[1]+2);                        HW_UpdateATIMWindow(pdot11Obj, mATIMWindow);                        //FPRINT_V("mATIMWindow", mATIMWindow);                        ConfigBcnFIFO();                        HW_EnableBeacon(pdot11Obj, mBeaconPeriod, 0, INDEPENDENT_BSS);                        HW_RadioOnOff(pdot11Obj, mRadioOn);                        mRequestFlag &= ~IBSS_CONNECT_SET;                        //Modified for Continuous Reconnect to an existing IBSS                        //When use a existing IBSS SSID                        mRequestFlag &= ~CHANNEL_SCAN_SET;                        mAssoc = TRUE;                        memcpy(&pdot11Obj->CurrSsid[0], (U8 *)&mSsid, mSsid.buf[1]+2);                        pdot11Obj->StatusNotify(STA_ASSOCIATED, (U8 *)&mBssId);                        return TRUE;                }        } else {                if (!(pdot11Obj->ConfigFlag & IBSS_CHANNEL_SCAN_SET)) {                        pdot11Obj->ConfigFlag |= IBSS_CHANNEL_SCAN_SET;                        zd_CmdProbeReq(1);                }                return FALSE;        }        if (!bBSSFound) {                //FPRINT("IBSS not found, create it !!!");                /****************************************************/                /* We generate an IBSS								*/                /****************************************************/                U32 seed = pdot11Obj->GetReg(reg, ZD_TSF_LowPart);                mBssIndex = 0xff;                //generate random BSSID                mBssId.mac[0] = (U8)((pdot11Obj->Rand(seed) & ~0x3) | 0x2); // I/G = 0, U/L = 1                mBssId.mac[1] = (U8)pdot11Obj->Rand(seed);                mBssId.mac[2] = (U8)pdot11Obj->Rand(seed);                mBssId.mac[3] = (U8)pdot11Obj->Rand(seed);                mBssId.mac[4] = (U8)pdot11Obj->Rand(seed);                mBssId.mac[5] = (U8)pdot11Obj->Rand(seed);                //zd1205_dump_data("mBssId = ", (U8 *)&mBssId, 6);                //update Bssid                pdot11Obj->SetReg(reg, ZD_BSSID_P1, cpu_to_le32(*(U32 *)&mBssId.mac[0]));                pdot11Obj->SetReg(reg, ZD_BSSID_P2, cpu_to_le32(*(U32 *)&mBssId.mac[4]));                HW_SetRfChannel(pdot11Obj, mRfChannel, 1, mMacMode);                //FPRINT_V("mRfChannel", mRfChannel);                //update beacon interval                HW_UpdateBcnInterval(pdot11Obj, mBeaconPeriod);                //FPRINT_V("mBeaconPeriod", mBeaconPeriod);                //update supported rated                HW_SetSupportedRate(pdot11Obj, (U8 *)&mBrates);                //zd1205_dump_data("mBrates = ", (U8 *)&mBrates, mBrates.buf[1]+2);#if defined(OFDM)                if(mMacMode != PURE_A_MODE && mMacMode != PURE_B_MODE)                        if (pdot11Obj->IsUSB2_0)                                HW_SetSupportedRate(pdot11Obj, (U8 *)&mExtRates);                //zd1205_dump_data("mExtRates = ", (U8 *)&mExtRates, mExtRates.buf[1]+2);#endif                //update ATIM Window                HW_UpdateATIMWindow(pdot11Obj, mATIMWindow);                //FPRINT_V("mATIMWindow", mATIMWindow);                ConfigBcnFIFO();                HW_EnableBeacon(pdot11Obj, mBeaconPeriod, 0, INDEPENDENT_BSS);                HW_RadioOnOff(pdot11Obj, mRadioOn);                mRequestFlag &= ~IBSS_CONNECT_SET;                mAssoc = TRUE;                memcpy(&pdot11Obj->CurrSsid[0], (U8 *)&mSsid, mSsid.buf[1]+2);                pdot11Obj->StatusNotify(STA_ASSOCIATED, (U8 *)&mBssId);                return TRUE;        }        return FALSE;}void zd_ResetDevice(void){        U16	BeaconInterval = 0x2;        U32	tmpvalue;        void *reg = pdot11Obj->reg;        // Device will reset after 1ms        HW_UpdateBcnInterval(pdot11Obj, BeaconInterval);        pdot11Obj->SetReg(reg, ZD_Pre_TBTT, 0x1);        //++ Ensure the following is an atomic operation.#ifndef HOST_IF_USB        i_state = pdot11Obj->EnterCS();#endif        tmpvalue = pdot11Obj->GetReg(reg, ZD_PS_Ctrl);        pdot11Obj->SetReg(reg, ZD_PS_Ctrl, (tmpvalue | BIT_0));        pdot11Obj->bDeviceInSleep = 1;#ifndef HOST_IF_USB        pdot11Obj->ExitCS(i_state);        // Delay 1ms to ensure device had been reset        pdot11Obj->DelayUs(1000);#endif}BOOLEAN zd_PseudoIbssConnect(void){        void *reg = pdot11Obj->reg;        U8 IBSS_BSSID[6];        memset(IBSS_BSSID, 0, 6);        //++        // Set EIFS=0x32 to prevent chamber low Tx-throughput (sometimes)        // problem. In chamber environment, almost no Rx-frame, once        // we detect a CRC16/CRC32 error frame, we adopt EIFS, because of        // less of RX-frame, it's less posibility to change EIFS to DIFS        // by FA (Frame Analyzer), and therefore damage the Tx-Throughput.        // We must use SleepResetDevice to trigger FA to adpot 0x32.        pdot11Obj->SetReg(reg, ZD_IFS_Value, 0x5032032);        zd_ResetDevice();        //update Bssid        pdot11Obj->SetReg(reg, ZD_BSSID_P1, cpu_to_le32(*(U32 *)&IBSS_BSSID[0]));        pdot11Obj->SetReg(reg, ZD_BSSID_P2, cpu_to_le32(*(U32 *)&IBSS_BSSID[4]));        HW_SetRfChannel(pdot11Obj, mRfChannel, 1, mMacMode);        mAssoc = TRUE;        pdot11Obj->StatusNotify(STA_ASSOCIATED, (U8 *)IBSS_BSSID);        return TRUE;}BOOLEAN zd_CmdConnect(U8 index, U8 bssType){        if (bssType == INFRASTRUCTURE_BSS) {                //printk(KERN_ERR "Build Infra-Type BSS\n");                return zd_InfraConnect(index-1);        } else if (bssType==INDEPENDENT_BSS) {                //printk(KERN_ERR "Build IBSS\n");                return zd_IbssConnect();        } else if (bssType == PSEUDO_IBSS)                return zd_PseudoIbssConnect();        return TRUE;}BOOLEAN zd_CmdDisConnect(void){        mAssoc = FALSE;        mRequestFlag |= DIS_CONNECT_SET;        return TRUE;}BOOLEAN zd_CmdRoaming(void){        if ((mRequestFlag & ROAMING_SET) || pdot11Obj->bChScanning || (pdot11Obj->ConfigFlag & SCAN_AND_CONNECT_SET))                return FALSE;        mAssoc = FALSE;        mRequestFlag |= ROAMING_SET;        return TRUE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -