zddebug.c

来自「Atheros USB WiFi Card 驱动程序」· C语言 代码 · 共 1,670 行 · 第 1/4 页

C
1,670
字号

		p = (u32 *) bus_to_virt(zdreq->addr);
		*p = zdreq->value;
		printk(KERN_DEBUG "zd1205: write value: 0x%08x to memory addr: 0x%08x\n", zdreq->value, zdreq->addr);
		break;
        }
         	
	case ZD_IOCTL_TX_RATE:
		printk(KERN_DEBUG "zd1205: set tx rate = %d\n", zdreq->value);

		if (zdreq->value < 0x0c){
			macp->cardSetting.FixedRate = zdreq->value;
			macp->bFixedRate = 1;
		}
		else
			macp->bFixedRate = 0;    
		break;

	case ZD_IOCTL_EEPROM:
		printk(KERN_DEBUG "zd1205: dump eeprom\n");
		zd1205_dump_eeprom(macp);
		break;

	/* Generate the beacon */
	case ZD_IOCTL_BCN:
		dot11Obj.dbg_cmd |= DBG_CMD_BEACON;
		printk(KERN_DEBUG "zd1205: configuration beacon\n");
		ConfigBcnFIFO();
		break;

	case ZD_IOCTL_REG_READ16:
		tmp_value = zd1211_readl(zdreq->addr, false);
		zdreq->value = tmp_value & 0xffff;
		printk(KERN_DEBUG "zd1205 read register:  reg = %4x, value = %4x\n",
			zdreq->addr, zdreq->value);
		break;

        case ZD_IOCTL_REG_WRITE16:
		tmp_value = zdreq->value & 0xffff;
		zd1211_writel(zdreq->addr, tmp_value, false);
		printk(KERN_DEBUG "zd1205 write register: reg = %4x, value = %4x\n",
                           zdreq->addr, zdreq->value);
		break;

	case ZD_IOCTL_CAM_READ:
		printk(KERN_ERR "zd1205: cam read, addr: 0x%08x\n", zdreq->addr);
		zd1205_cam_read(macp, zdreq->addr);
		break;

	case ZD_IOCTL_CAM_WRITE:
		printk(KERN_ERR "zd1205: cam write, addr: 0x%08x value: 0x%08x\n", zdreq->addr, zdreq->value);
		zd1205_cam_write(macp, zdreq->addr, zdreq->value);
		break;
	
	case ZD_IOCTL_CAM_RESET:
		printk(KERN_ERR "zd1205: reset cam\n");
		zd1205_cam_rest(macp, zdreq->value);
		break;

#if PRODUCTION == 1
	case ZD_IOCTL_CONT_TX:
		zd1205_cont_tx(macp, zdreq->value);
		break;
#endif
    case ZD_IOCTL_STA_LIST:
        zd1205_list_STAs(macp);
        break;
    case ZD_IOCTL_SYSTEM_INFO:
        zd1205_system_info(macp);
        break;
#if ZDCONF_TR_DBG == 1
    case ZD_IOCTL_TR_DBG:
        macp->trDbg = zdreq->addr;
        sprintf(macp->zdreq.data, "We set trDbg = %d\n", zdreq->addr);
        break;
#endif
#if ZDCONF_DBGMSG_NORMAL == 1
    case ZD_IOCTL_CAM_DUMP:
        {
            int idx,idx2;
            U32 tmp;
            U64 cam_valid_bits;
            U8 mac[100];
            char buf[128];
            int target = macp->zdreq.addr;
            tmp = dot11Obj.GetReg(dot11Obj.reg, 0x708);
            cam_valid_bits = tmp ;
            cam_valid_bits = cam_valid_bits << 32;
            cam_valid_bits += dot11Obj.GetReg(dot11Obj.reg, 0x704);

            for(idx=target;idx<=target;idx++)
            {
                if(idx<40)
                    if(! (cam_valid_bits & (BIT_0 << idx)))
                        continue;
                HW_CAM_GetMAC(&dot11Obj,idx, mac);
                if(idx<40)
                    sprintf(buf,"%02d-", idx);
                else
                    sprintf(buf,"DEF%d-", idx-40);

                strcat(macp->zdreq.data, buf);
                tmp = HW_CAM_GetEncryType(&dot11Obj, idx);
                if(tmp == NO_WEP)
                    sprintf(buf,"%6s-", "NO_WEP");
                else if(tmp == WEP128)
                    sprintf(buf,"%6s-", "WEP128");
                else if(tmp == WEP64)
                    sprintf(buf,"%6s-", "WEP64");
                else if(tmp == TKIP)
                    sprintf(buf,"%6s-", "TKIP");
                else if(tmp == AES)
                    sprintf(buf,"%6s-", "AES");
                else
                    sprintf(buf,"? ? ? -");
                strcat(macp->zdreq.data,buf);

                    if(idx<40)
                    {
                        for(idx2=0;idx2<6;idx2++)
                        {
                            sprintf(buf,"%02x", mac[idx2]);
                            strcat(macp->zdreq.data,buf);
                            if(idx2!=5)     
                            {
                                sprintf(buf,":");
                                strcat(macp->zdreq.data,buf);
                            }
                        }
                    }
                    strcat(macp->zdreq.data," ");
                    memset(mac,0,sizeof(mac));
                    HW_CAM_GetKey(&dot11Obj, idx,16, mac);
                    for(idx2=0;idx2<16;idx2++)
                    {
                        sprintf(buf,"%02x ",  mac[idx2]);
                        strcat(macp->zdreq.data, buf);
                    }
                    sprintf(buf,"\n");
                    strcat(macp->zdreq.data, buf);
                }
            }
            break;

#endif
	case ZD_IOCTL_SET_MIC_CNT_ENABLE:
		dot11Obj.MIC_CNT = zdreq->value>0?1:0;
        sprintf(macp->zdreq.data, "WPA MIC Counter Measure Feature : %s\n",
                dot11Obj.MIC_CNT ? "Enable":"Disalbe");


		break;
	case ZD_IOCTL_GET_MIC_CNT_ENABLE:
        sprintf(macp->zdreq.data,"WPA MIC Counter Measure Feature : %s\n",
                dot11Obj.MIC_CNT ? "Enable":"Disalbe");

		break;
#if ZDCONF_RF_UW2453_SUPPORT == 1 || ZDCONF_RF_AR2124_SUPPORT == 1
    case ZD_IOCTL_UW_PWR :
        if(zdreq->addr == 0)
            sprintf(macp->zdreq.data, "Current Level : %d\n",dot11Obj.UWCurrentTxLevel);
        else if(zdreq->addr == 1)
        {
            sprintf(macp->zdreq.data, "Set Current Level : %d\n", zdreq->value);
            if(zdreq->value < 19 && zdreq->value >= 0)
            {
                dot11Obj.UWCurrentTxLevel = zdreq->value;
                dot11Obj.UWDefaulTxLevel  = zdreq->value;
                PHY_UWTxPower(&dot11Obj, dot11Obj.UWDefaulTxLevel);
            }
        }
        else
            sprintf(macp->zdreq.data, "Unknown Command : %d\n", zdreq->addr);

        break;
#endif
#if ZDCONF_APC == 1
    case ZD_IOCTL_APC:
        if(zdreq->addr == 0)
        {
            U8 NULL_MAC[]={0,0,0,0,0,0};
            int i,j;
            for(i=0;i<sizeof(APC_NT)/6;i++)
            {
                if(memcmp(APC_NT[i], NULL_MAC,6) != 0)
                {
                    for(j=0;j<6;j++)
                        printk("%02x ", (U8)APC_NT[i][j]);
                    printk("\n");
                }
            }
        }
        else if(zdreq->addr == 1)
        {
            macp->wds = zdreq->value;
            if(macp->wds) 
            {
                printk("Turn On WDS\n");
                dot11Obj.SetReg(&dot11Obj, 0x700, 3); 
            }
            else
            {
                printk("Turn Off WDS\n");
                dot11Obj.SetReg(&dot11Obj, 0x700, 1); 
            }
        }
        break; 
#endif

	default :
		printk(KERN_ERR "zd_dbg_ioctl: error command = %x\n", zd_cmd);
		break;
	}
    macp->DataReady = 1;

	return 0;
}    

int zd1205_wpa_ioctl(struct zd1205_private *macp, struct zydas_wlan_param *zdparm)
{
    extern U8 UpdateBcn;
	card_Setting_t *pSetting = &macp->cardSetting;
	int ret = 0;
	u8 keylen;
	u8 idx;
	u8 *pkey;
	u8 CamEncryType=0;
	//u8 tmpDynKeyMode;
    u8 bTxKey;
    u8 bClrPerStaKey=0;


#ifdef HOSTAPD_SUPPORT
    u8 mac_addr[80];
#endif

//Test write permission
	switch(zdparm->cmd) {
		case ZD_CMD_SET_ENCRYPT_KEY:
				{// Dump key info:
					printk("SET_ENCRYPT_KEY: alg=%s key_idx=%d set_tx=%d key_len=%d ,WPAIeLen=%d, for " MACSTR "\n", zdparm->u.crypt.alg, zdparm->u.crypt.idx, zdparm->u.crypt.flags, zdparm->u.crypt.key_len, macp->cardSetting.WPAIeLen, MAC2STR(zdparm->sta_addr));
				}
                bTxKey = zdparm->u.crypt.flags;
				keylen = zdparm->u.crypt.key_len;
				idx = zdparm->u.crypt.idx;
				pkey = zdparm->u.crypt.key;

				if (!strcmp(zdparm->u.crypt.alg, "NONE")) 
				{
					U8 zero_mac[]={0,0,0,0,0,0};
				
                                        CamEncryType = NO_WEP;
				//	pSetting->DynKeyMode = 0;
                                  //      pSetting->EncryMode=0;
                                    //    mKeyFormat=0;
#if ZDCONF_ADHOC_SUPPORT == 1
                    if (macp->cardSetting.BssType == INDEPENDENT_BSS)
                    {
                        WPADEBUG("Ignore del key request in IBSS\n");
                        return ret;
                    }   
#endif
					
					zd_SetKeyInfo(zdparm->sta_addr, CamEncryType, keylen, idx, pkey);
					if (zdparm->sta_addr[0] & 1)//del group key
					{
                        if ((macp->cardSetting.BssType == INFRASTRUCTURE_BSS) || macp->cardSetting.WPASupport ==0 || macp->cardSetting.WPAIeLen==0)
						{//802.1x dynamic WEP
                            WPADEBUG("deleting Group key\n");
							mDynKeyMode = 0;
							mKeyFormat = 0;
							mPrivacyInvoked=FALSE;
							mCap &= ~CAP_PRIVACY;
                            macp->cardSetting.EncryOnOff=macp->cardSetting.EncryMode = 0;
                            macp->cardSetting.EncryKeyId=0;

						}
						mWpaBcKeyLen = mGkInstalled = 0;
					}
					else
					{
						if (memcmp(zero_mac,zdparm->sta_addr, 6)==0)
						{
							mDynKeyMode=0;
							mKeyFormat=0;
							pSetting->DynKeyMode=0;
							pSetting->EncryMode=0;
							mDynKeyMode=0;
						}
					}
					return ret;
				}
				else if (!strcmp(zdparm->u.crypt.alg, "TKIP")) 
				{
                                        CamEncryType = TKIP;
					//if (idx == 0)
					{// Pairwise key
						mKeyFormat = CamEncryType;
						mDynKeyMode = pSetting->DynKeyMode = DYN_KEY_TKIP;
					}
				}
				else if (!strcmp(zdparm->u.crypt.alg, "CCMP"))
				{
                                        CamEncryType = AES;
					//if (idx == 0)
					{// Pairwise key
						mKeyFormat = CamEncryType;
						mDynKeyMode = pSetting->DynKeyMode = DYN_KEY_AES;
					}
				}
				else if (!strcmp(zdparm->u.crypt.alg, "WEP"))
				{
                    WPADEBUG("**********************Set WEP key\n");
                    mPrivacyInvoked=TRUE;
                    mCap |= CAP_PRIVACY;
                    macp->cardSetting.EncryOnOff=1;

					if (keylen == 5)
					{ // WEP 64
						CamEncryType = WEP64;
						//tmpDynKeyMode=DYN_KEY_WEP64;
					}
                    else if (keylen == 13)
                    {//keylen=13, WEP 128
                        CamEncryType = WEP128;
                        //tmpDynKeyMode=DYN_KEY_WEP128;
                    }
                    else
                    {
                        CamEncryType = WEP256;
                    }

// For Dynamic WEP key (Non-WPA Radius), the key ID range: 0-3
// In WPA/RSN mode, the key ID range: 1-3, usually, a broadcast key.
// For WEP key setting: we set mDynKeyMode and mKeyFormat in following case:
//   1. For 802.1x dynamically generated WEP key method.
//   2. For WPA/RSN mode, but key id == 0. (But this is an impossible case)
// So, only check case 1.
                    if (macp->cardSetting.WPAIeLen==0)
                    //if (macp->cardSetting.WPASupport == 0)
                    {
                        WPADEBUG("set WEP Enc type =%d\n", CamEncryType); 
                        macp->cardSetting.EncryMode = CamEncryType;
                        mKeyFormat = CamEncryType;
                        //mDynKeyMode = pSetting->DynKeyMode = tmpDynKeyMode;
                        if (macp->cardSetting.BssType == INDEPENDENT_BSS)
                        {
                            mDynKeyMode = 0;
                        }
                        else if (bTxKey)
                        {
                            mDynKeyMode = 0;
                            bClrPerStaKey = 1;
                            macp->cardSetting.EncryKeyId = idx;
                        }
                    }

				}
				/* DUMP key context */
#ifdef WPA_DEBUG
				if (keylen > 0)
				{
					int ii;
					printk("zddebug:Key Context:\n");
					for(ii = 0; ii < keylen;) {
						printk("0x%02x ", pkey[ii]);
						if((++ii % 16) == 0)
							printk("\n");
					}
					printk("\n");
				}
#endif
                zd_SetKeyInfo(zdparm->sta_addr, CamEncryType, keylen, idx + (bTxKey << 7) + (bClrPerStaKey << 6), pkey);

				break;

#if 0
				WPADEBUG("zd1205_wpa_ioctl: ZD_CMD_SET_ENCRYPT_KEY\n");

				/* DUMP the Key information set by the upper layer */
				{
					WPADEBUG("alg=%s key_idx=%d set_tx=%d key_len=%d\n",
						zdparm->u.crypt.alg, zdparm->u.crypt.idx,
						zdparm->u.crypt.flags, zdparm->u.crypt.key_len);
				}

				keylen = zdparm->u.crypt.key_len;
				idx = zdparm->u.crypt.idx;
				pkey = zdparm->u.crypt.key;

				if (strcmp(zdparm->u.crypt.alg, "NONE") == 0) {
					/* Reset those settings related to WPA */
                                        mKeyFormat=0;
                                        pSetting->EncryMode=0;
					pSetting->DynKeyMode = 0;
					return ret;
				}
				else if (strcmp(zdparm->u.crypt.alg, "TKIP") == 0) {
					/* Try to change mDynKeyMode here. 4D06 */
					pSetting->DynKeyMode = DYN_KEY_TKIP;
					mDynKeyMode = DYN_KEY_TKIP;
                                        mKeyFormat = TKIP;
				}
				else if (strcmp(zdparm->u.crypt.alg, "CCMP") == 0) {
					/* Try to change mDynKeyMode here. 4D06 */
					pSetting->DynKeyMode = DYN_KEY_AES;
					mDynKeyMode = DYN_KEY_AES;
                                        mKeyFormat = AES;
				}

				/* DUMP key context */
				{
					int ii;

					WPADEBUG("Key Context: ");
					for(ii = 0; ii < keylen;) {
						WPADEBUG("0x%02x ", pkey[ii]);
						

⌨️ 快捷键说明

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