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

📄 zdhci.c

📁 ZD1211 source code, based on linux 2.44 or linux 2.
💻 C
📖 第 1 页 / 共 5 页
字号:
	else {
		//if (!(pdot11Obj->ConfigFlag & IBSS_CHANNEL_SCAN_SET)){ 
		//	pdot11Obj->ConfigFlag |= IBSS_CHANNEL_SCAN_SET;
		//	zd_CmdProbeReq(1);
		//}	
		//return FALSE;
        printk("We found no IBSS, and we ignore the above code");
        printk("without confirm\n");
	}	
	
	if (!bBSSFound){
		//FPRINT("IBSS not found, create it !!!");
		/****************************************************/
		/* We generate an IBSS								*/
		/****************************************************/
        if(pdot11Obj->bDeviceInSleep)
        {
            printk("In SLLLLLLLLLLLLLLLLLLP @ %s\n", __FUNCTION__);
            return FALSE;
        }
		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, zd_cpu_to_le32(*(U32 *)&mBssId.mac[0]));
		pdot11Obj->SetReg(reg, ZD_BSSID_P2, zd_cpu_to_le32(*(U32 *)&mBssId.mac[4]));
        ChangeMacMode(macp->IBSS_DesiredMacMode, macp->IBSS_DesiredChannel);

        mMacMode = macp->cardSetting.MacMode;
        mRfChannel = macp->cardSetting.Channel;
        mPhpm.buf[0] = EID_DSPARMS;
        mPhpm.buf[1] = 1;
        mPhpm.buf[2] = mRfChannel;

        printk("Ibss Create, MAC_MODE:%d, CHANNEL:%d\n", mMacMode,mRfChannel);
		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;
}
#endif

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
    
    if(pdot11Obj->bDeviceInSleep)
    {
        printk("In SLLLLLLLLLLLLLLLLLLP @ %s\n", __FUNCTION__);
        return;
    }

	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, zd_cpu_to_le32(*(U32 *)&IBSS_BSSID[0]));
	pdot11Obj->SetReg(reg, ZD_BSSID_P2, zd_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);
	}
#if ZDCONF_ADHOC_SUPPORT == 1
	else if (bssType==INDEPENDENT_BSS)
	{
		//printk(KERN_ERR "Build IBSS\n");
		return zd_IbssConnect();
	}
#endif
#if ZDCONF_PSEUDO_SUPPORT == 1
	else if (bssType == PSEUDO_IBSS)
		return zd_PseudoIbssConnect();
#endif
	
	
	return TRUE;
}	

BOOLEAN zd_CmdDisConnect(void)
{
	mAssoc = FALSE;
	mRequestFlag |= DIS_CONNECT_SET;
	
	return TRUE;
}


BOOLEAN zd_CmdRoaming(void)
{
        if ((mRequestFlag & (ROAMING_SET | CHANNEL_SCAN_SET)) || pdot11Obj->bChScanning || (pdot11Obj->ConfigFlag & SCAN_AND_CONNECT_SET))
            return FALSE;
       

    mAssoc = FALSE;
    
#if ZDCONF_ADHOC_SUPPORT == 1
    if (mBssType == INDEPENDENT_BSS)
        mRequestFlag |= CHANNEL_SCAN_SET;
    else
#endif
        mRequestFlag |= ROAMING_SET;

    return TRUE;

}


BOOLEAN zd_CmdFlushQ(void)
{
	if (pdot11Obj->QueueFlag & TX_QUEUE_SET){
		FlushQ(pTxQ);
	}
	else if (pdot11Obj->QueueFlag & MGT_QUEUE_SET){
		FlushQ(pMgtQ);	
	}
	else if (pdot11Obj->QueueFlag & AWAKE_QUEUE_SET){
		FlushQ(pAwakeQ);	
	}	
	
	return TRUE;
}
	
BOOLEAN zd_CmdProcess(U16 CmdId, void *parm1, U32 parm2)
{
	BOOLEAN status = TRUE;
	
	switch(CmdId){
		case CMD_RESET_80211:
			status = zd_Reset80211((zd_80211Obj_t *)parm1);
 			break;
		
		case CMD_ENABLE:
#if ZDCONF_AP_SUPPORT == 1
			if (mBssType == AP_BSS)
			    status = zd_StartAP();
			else 
#endif
                        {
                            if ((pdot11Obj->ConfigFlag & SCAN_AND_CONNECT_SET)||(mRequestFlag & CHANNEL_SCAN_SET))
                            {
                            //    printk("Scan and connect is underGoing\n");
                                break;
                            }
                	    else if (!mIfaceOpened)
                            {
            	                status = zd_StartSTA(1);
                                mIfaceOpened = TRUE;
                            }
                            else
                            {
                                pdot11Obj->ConfigFlag |= SCAN_AND_CONNECT_SET;
                                zd_ChooseAP(0);
                            }    
                        } 

			break;
			
		case CMD_DISASOC: //IAPP cth
			status = zd_CmdDisasoc((MacAddr_t*)parm1, (U8)parm2);
			break;
			
		case CMD_DEAUTH://MAC filter cth
			status = zd_CmdDeauth((MacAddr_t*)parm1, (U8)parm2);
			break;
			
#if ZDCONF_AP_SUPPORT == 1
		case CMD_PS_POLL:
			//PSDEBUG("CMD_PS_POLL");
			status = zd_HandlePsPoll((U8 *)parm1);
			break;	
#endif
		
		case CMD_PASSIVE_SCAN:
			status = zd_PassiveScan();
			break;
			
		case CMD_DISASOC_ALL:	
			status = zd_DisasocAll((U8)parm2);
			break;
			
		case CMD_CONNECT:
			{
				U8 *pBsstype=(U8*)parm1;
				status = zd_CmdConnect((U8)parm2,*pBsstype);
			}
			break;

		case CMD_PROBE_REQ:
			//FPRINT("CMD_PROBE_REQ");
			status = zd_CmdProbeReq((U8)parm2);
			pdot11Obj->ConfigFlag |= JUST_CHANNEL_SCAN;
			break;
			
		case CMD_DIS_CONNECT:
			status = zd_CmdDisConnect();
			break;		
			
		case CMD_FLUSH_QUEUE:
			status = zd_CmdFlushQ();
			break;

		case CMD_ROAMING:
			status = zd_CmdRoaming();
			break;      		
		
		default:
			status = FALSE;	
			break;		
	}	
	
	return status;
}	

//Event Nofify Functions
void zd_NextBcn(void)
{   
#if ZDCONF_AP_SUPPORT == 1
	if (mBssType == AP_BSS){
		if (mDtimCount == 0)
			mDtimCount = mDtimPeriod;
		mDtimCount--;
	}
#endif

	ConfigBcnFIFO();
	
	if (pTxQ->cnt)
   		pdot11Obj->QueueFlag |= TX_QUEUE_SET;
	return;
}	
#if ZDCONF_AP_SUPPORT == 1
void zd_DtimNotify(void)
{
	SendMcPkt();
	return; 
}
#endif

extern BOOLEAN Tchal_WaitChalRsp(Signal_t *signal);
void zd_SendTChalMsg(void)
{
	Tchal_WaitChalRsp(NULL);
	return;
}	

extern BOOLEAN AuthTimeOut(Signal_t *signal);
void zd_SendTAuthMsg(void)
{
	AuthTimeOut(NULL);
	return;
}	

extern BOOLEAN AsocTimeOut(Signal_t *signal);
void zd_SendTAsocMsg(void)
{
	AsocTimeOut(NULL);
	return;
}	


void zd_SwitchNextCH(void)
{
	void *reg = pdot11Obj->reg;
	static u8 LastScanMacMode;
	static u8 ScanAround = 0;
	//static u8 ScanWait = 0;
	static u8 initMAC_Mode = 0xff;
    struct zd1205_private *macp = (struct zd1205_priviate *)g_dev->priv;

    if(initMAC_Mode == 0xff)
        initMAC_Mode = mMacMode;
	//FPRINT("zd_SwitchNextCH");

	if ((PURE_A_MODE != mMacMode && CurrScanCH > MAX_CHANNEL_ALLOW) 
#if ZDCONF_80211A_SUPPORT == 1
            || (PURE_A_MODE == mMacMode && CurrScanCH > dot11A_Channel_Amount - 1) 
#endif
		//In 11a, channel array index 0 is also meaningful.
	   ){ //Scan Finish...
#ifdef HMAC_DEBUG
	U8 i, j; 	
	U16 cap;
#endif

#if ZDCONF_AP_SUPPORT == 1
	if (mBssType == AP_BSS)
	    pdot11Obj->SetReg(reg, ZD_Rx_Filter, AP_RX_FILTER);
	else 
#endif
	    pdot11Obj->SetReg(reg, ZD_Rx_Filter, STA_RX_FILTER);
				
	if (pdot11Obj->ConfigFlag & PASSIVE_CHANNEL_SCAN_SET)
	    pdot11Obj->ConfigFlag &= ~PASSIVE_CHANNEL_SCAN_SET;
			
	if (pdot11Obj->ConfigFlag & IBSS_CHANNEL_SCAN_SET)
        {
	    pdot11Obj->ConfigFlag &= ~IBSS_CHANNEL_SCAN_SET;
	    //mRequestFlag |= IBSS_CONNECT_SET;
	}

	CurrScanCH = 1;
	pdot11Obj->bChScanning = 0;
    zd1205_notify_scan_done(macp);
    set_bit(CTX_FLAG_ESSID_WAS_SET, (void *)&macp->flags);
	ScanAround=0;
		
	if (pdot11Obj->ConfigFlag & ACTIVE_CHANNEL_SCAN_SET)
        {
#ifdef HMAC_DEBUG			
	    printk("\nSSID          BSSID            CH  Signal  Mode     Basic-Rates  Ext-Rates    b/g AP");
	    printk("\n------------------------------------------------------------------------------------");
	    for (i=0; i<mBssNum; i++) 
            {
	        printk("\n");                                              
		for (j=0; j<mBssInfo[i].ssid.buf[1]; j++) {
		    printk("%c", mBssInfo[i].ssid.buf[2+j]);
		}
			
		for (j=mBssInfo[i].ssid.buf[1]; j<12; j++) {
		    printk(" ");
		}
			
		printk("%02x:%02x:%02x:%02x:%02x:%02x",
			mBssInfo[i].bssid.mac[0], mBssInfo[i].bssid.mac[1], mBssInfo[i].bssid.mac[2],
			mBssInfo[i].bssid.mac[3], mBssInfo[i].bssid.mac[4], mBssInfo[i].bssid.mac[5]);

		printk("  %2d", mBssInfo[i].Phpm.buf[2]);
		printk("   %2d", mBssInfo[i].signalStrength);
			
		cap = mBssInfo[i].cap;
		cap &= (CAP_PRIVACY | CAP_IBSS | CAP_ESS);

		switch(cap) {
           	    case 0x01:
			printk("   Infra   ");
			break;
		    case 0x02:
			printk("   Ad_Hoc  ");
			break;
		    case 0x11:
			printk("   Infra, W");
			break;
		    case 0x12:
			printk("   Ad_Hoc,W");
			break;
	            default :
			break;
		}
				
		printk("  ");

		for (j=0; j<mBssInfo[i].supRates.buf[1]; j++) {
		    printk(" %x", mBssInfo[i].supRates.buf[2+j]);
		}
                
		printk("  ");
		for (j=0; j<mBssInfo[i].extRates.buf[1]; j++) {
                    printk(" %x", mBssInfo[i].extRates.buf[2+j]);
		}

		if (mBssInfo[i].apMode == PURE_B_AP)
		    printk("   B-AP");
		else if (mBssInfo[i].apMode == PURE_G_AP)
		    printk("   G-AP");
		else if  (mBssInfo[i].apMode == MIXED_AP)
		    printk("   M-AP");      
		}
		else if (mBssInfo[i].apMode == PURE_A_AP)
			printk("   A_AP");
		else
			VerAssert();


		printk("\n");

		FPRINT("****** Scan Finished ******");
#endif		
		pdot11Obj->ConfigFlag &= ~ACTIVE_CHANNEL_SCAN_SET;
		mBssCnt = mBssNum;
	}//End of ACTIVE_CHANNEL_SCAN_SET
	
	if (pdot11Obj->ConfigFlag & JUST_CHANNEL_SCAN){
	    pdot11Obj->ConfigFlag &= ~JUST_CHANNEL_SCAN;

        if (mAssoc || (mBssType == AP_BSS))
        {
            mMacMode = initMAC_Mode;
            HW_SetRfChannel(pdot11Obj, mRfChannel, 1, initMAC_Mode);
        }
    }
	else 
    {    
	    if (mBssType == INFRASTRUCTURE_BSS)
            zd_ChooseAP(0);
#if ZDCONF_ADHOC_SUPPORT == 1
	    if (mBssType == INDEPENDENT_BSS)
            zd_IbssConnect();
#endif
	}

	if (pdot11Obj->ConfigFlag & SCAN_AND_CONNECT_SET)
    {
        pdot11Obj->ConfigFlag &= ~SCAN_AND_CONNECT_SET;
	}
	initMAC_Mode = 0xff;

⌨️ 快捷键说明

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