aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/rt3090/sta_ioctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/rt3090/sta_ioctl.c')
-rw-r--r--drivers/staging/rt3090/sta_ioctl.c2285
1 files changed, 2 insertions, 2283 deletions
diff --git a/drivers/staging/rt3090/sta_ioctl.c b/drivers/staging/rt3090/sta_ioctl.c
index 8f54cca89d1..e419fb1d5ee 100644
--- a/drivers/staging/rt3090/sta_ioctl.c
+++ b/drivers/staging/rt3090/sta_ioctl.c
@@ -3119,2279 +3119,6 @@ const struct iw_handler_def rt28xx_iw_handler_def =
3119#endif 3119#endif
3120}; 3120};
3121 3121
3122INT RTMPSetInformation(
3123 IN PRTMP_ADAPTER pAd,
3124 IN OUT struct ifreq *rq,
3125 IN INT cmd)
3126{
3127 struct iwreq *wrq = (struct iwreq *) rq;
3128 NDIS_802_11_SSID Ssid;
3129 NDIS_802_11_MAC_ADDRESS Bssid;
3130 RT_802_11_PHY_MODE PhyMode;
3131 RT_802_11_STA_CONFIG StaConfig;
3132 NDIS_802_11_RATES aryRates;
3133 RT_802_11_PREAMBLE Preamble;
3134 NDIS_802_11_WEP_STATUS WepStatus;
3135 NDIS_802_11_AUTHENTICATION_MODE AuthMode = Ndis802_11AuthModeMax;
3136 NDIS_802_11_NETWORK_INFRASTRUCTURE BssType;
3137 NDIS_802_11_RTS_THRESHOLD RtsThresh;
3138 NDIS_802_11_FRAGMENTATION_THRESHOLD FragThresh;
3139 NDIS_802_11_POWER_MODE PowerMode;
3140 PNDIS_802_11_KEY pKey = NULL;
3141 PNDIS_802_11_WEP pWepKey =NULL;
3142 PNDIS_802_11_REMOVE_KEY pRemoveKey = NULL;
3143 NDIS_802_11_CONFIGURATION Config, *pConfig = NULL;
3144 NDIS_802_11_NETWORK_TYPE NetType;
3145 ULONG Now;
3146 UINT KeyIdx = 0;
3147 INT Status = NDIS_STATUS_SUCCESS, MaxPhyMode = PHY_11G;
3148 ULONG PowerTemp;
3149 BOOLEAN RadioState;
3150 BOOLEAN StateMachineTouched = FALSE;
3151 PNDIS_802_11_PASSPHRASE ppassphrase = NULL;
3152#ifdef DOT11_N_SUPPORT
3153 OID_SET_HT_PHYMODE HT_PhyMode; //11n ,kathy
3154#endif // DOT11_N_SUPPORT //
3155#ifdef WPA_SUPPLICANT_SUPPORT
3156 PNDIS_802_11_PMKID pPmkId = NULL;
3157 BOOLEAN IEEE8021xState = FALSE;
3158 BOOLEAN IEEE8021x_required_keys = FALSE;
3159 UCHAR wpa_supplicant_enable = 0;
3160#endif // WPA_SUPPLICANT_SUPPORT //
3161
3162#ifdef SNMP_SUPPORT
3163 TX_RTY_CFG_STRUC tx_rty_cfg;
3164 ULONG ShortRetryLimit, LongRetryLimit;
3165 UCHAR ctmp;
3166#endif // SNMP_SUPPORT //
3167
3168
3169
3170
3171#ifdef DOT11_N_SUPPORT
3172 MaxPhyMode = PHY_11N_5G;
3173#endif // DOT11_N_SUPPORT //
3174
3175 DBGPRINT(RT_DEBUG_TRACE, ("-->RTMPSetInformation(), 0x%08x\n", cmd&0x7FFF));
3176 switch(cmd & 0x7FFF) {
3177 case RT_OID_802_11_COUNTRY_REGION:
3178 if (wrq->u.data.length < sizeof(UCHAR))
3179 Status = -EINVAL;
3180 // Only avaliable when EEPROM not programming
3181 else if (!(pAd->CommonCfg.CountryRegion & 0x80) && !(pAd->CommonCfg.CountryRegionForABand & 0x80))
3182 {
3183 ULONG Country;
3184 UCHAR TmpPhy;
3185
3186 Status = copy_from_user(&Country, wrq->u.data.pointer, wrq->u.data.length);
3187 pAd->CommonCfg.CountryRegion = (UCHAR)(Country & 0x000000FF);
3188 pAd->CommonCfg.CountryRegionForABand = (UCHAR)((Country >> 8) & 0x000000FF);
3189 TmpPhy = pAd->CommonCfg.PhyMode;
3190 pAd->CommonCfg.PhyMode = 0xff;
3191 // Build all corresponding channel information
3192 RTMPSetPhyMode(pAd, TmpPhy);
3193#ifdef DOT11_N_SUPPORT
3194 SetCommonHT(pAd);
3195#endif // DOT11_N_SUPPORT //
3196 DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_COUNTRY_REGION (A:%d B/G:%d)\n", pAd->CommonCfg.CountryRegionForABand,
3197 pAd->CommonCfg.CountryRegion));
3198 }
3199 break;
3200 case OID_802_11_BSSID_LIST_SCAN:
3201 Now = jiffies;
3202 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_BSSID_LIST_SCAN, TxCnt = %d \n", pAd->RalinkCounters.LastOneSecTotalTxCount));
3203
3204 if (MONITOR_ON(pAd))
3205 {
3206 DBGPRINT(RT_DEBUG_TRACE, ("!!! Driver is in Monitor Mode now !!!\n"));
3207 break;
3208 }
3209
3210 //Benson add 20080527, when radio off, sta don't need to scan
3211 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))
3212 break;
3213
3214 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
3215 {
3216 DBGPRINT(RT_DEBUG_TRACE, ("!!! Driver is scanning now !!!\n"));
3217 pAd->StaCfg.bScanReqIsFromWebUI = TRUE;
3218 Status = NDIS_STATUS_SUCCESS;
3219 break;
3220 }
3221
3222 if (pAd->RalinkCounters.LastOneSecTotalTxCount > 100)
3223 {
3224 DBGPRINT(RT_DEBUG_TRACE, ("!!! Link UP, ignore this set::OID_802_11_BSSID_LIST_SCAN\n"));
3225 Status = NDIS_STATUS_SUCCESS;
3226 pAd->StaCfg.ScanCnt = 99; // Prevent auto scan triggered by this OID
3227 break;
3228 }
3229
3230 if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) &&
3231 ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) ||
3232 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
3233 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) ||
3234 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) &&
3235 (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED))
3236 {
3237 DBGPRINT(RT_DEBUG_TRACE, ("!!! Link UP, Port Not Secured! ignore this set::OID_802_11_BSSID_LIST_SCAN\n"));
3238 Status = NDIS_STATUS_SUCCESS;
3239 pAd->StaCfg.ScanCnt = 99; // Prevent auto scan triggered by this OID
3240 break;
3241 }
3242
3243
3244 if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE)
3245 {
3246 RTMP_MLME_RESET_STATE_MACHINE(pAd);
3247 DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n"));
3248 }
3249
3250 // tell CNTL state machine to call NdisMSetInformationComplete() after completing
3251 // this request, because this request is initiated by NDIS.
3252 pAd->MlmeAux.CurrReqIsFromNdis = FALSE;
3253 // Reset allowed scan retries
3254 pAd->StaCfg.ScanCnt = 0;
3255 pAd->StaCfg.LastScanTime = Now;
3256
3257 pAd->StaCfg.bScanReqIsFromWebUI = TRUE;
3258 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);
3259 MlmeEnqueue(pAd,
3260 MLME_CNTL_STATE_MACHINE,
3261 OID_802_11_BSSID_LIST_SCAN,
3262 0,
3263 NULL);
3264
3265 Status = NDIS_STATUS_SUCCESS;
3266 StateMachineTouched = TRUE;
3267 break;
3268 case OID_802_11_SSID:
3269 if (wrq->u.data.length != sizeof(NDIS_802_11_SSID))
3270 Status = -EINVAL;
3271 else
3272 {
3273 PSTRING pSsidString = NULL;
3274 Status = copy_from_user(&Ssid, wrq->u.data.pointer, wrq->u.data.length);
3275
3276 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SSID (Len=%d,Ssid=%s)\n", Ssid.SsidLength, Ssid.Ssid));
3277 if (Ssid.SsidLength > MAX_LEN_OF_SSID)
3278 Status = -EINVAL;
3279 else
3280 {
3281 if (Ssid.SsidLength == 0)
3282 {
3283 Set_SSID_Proc(pAd, "");
3284 }
3285 else
3286 {
3287 pSsidString = (PSTRING)kmalloc(MAX_LEN_OF_SSID+1, MEM_ALLOC_FLAG);
3288 if (pSsidString)
3289 {
3290 NdisZeroMemory(pSsidString, MAX_LEN_OF_SSID+1);
3291 NdisMoveMemory(pSsidString, Ssid.Ssid, Ssid.SsidLength);
3292 Set_SSID_Proc(pAd, pSsidString);
3293 kfree(pSsidString);
3294 }
3295 else
3296 Status = -ENOMEM;
3297 }
3298 }
3299 }
3300 break;
3301 case OID_802_11_SET_PASSPHRASE:
3302 ppassphrase= kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG);
3303
3304 if(ppassphrase== NULL)
3305 {
3306 Status = -ENOMEM;
3307 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SET_PASSPHRASE, Failed!!\n"));
3308 break;
3309 }
3310 else
3311 {
3312 Status = copy_from_user(ppassphrase, wrq->u.data.pointer, wrq->u.data.length);
3313
3314 if (Status)
3315 {
3316 Status = -EINVAL;
3317 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SET_PASSPHRASE, Failed (length mismatch)!!\n"));
3318 }
3319 else
3320 {
3321 if(ppassphrase->KeyLength < 8 || ppassphrase->KeyLength > 64)
3322 {
3323 Status = -EINVAL;
3324 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SET_PASSPHRASE, Failed (len less than 8 or greater than 64)!!\n"));
3325 }
3326 else
3327 {
3328 // set key passphrase and length
3329 NdisZeroMemory(pAd->StaCfg.WpaPassPhrase, 64);
3330 NdisMoveMemory(pAd->StaCfg.WpaPassPhrase, &ppassphrase->KeyMaterial, ppassphrase->KeyLength);
3331 pAd->StaCfg.WpaPassPhraseLen = ppassphrase->KeyLength;
3332 hex_dump("pAd->StaCfg.WpaPassPhrase", pAd->StaCfg.WpaPassPhrase, 64);
3333 printk("WpaPassPhrase=%s\n",pAd->StaCfg.WpaPassPhrase);
3334 }
3335 }
3336 }
3337 kfree(ppassphrase);
3338 break;
3339
3340 case OID_802_11_BSSID:
3341 if (wrq->u.data.length != sizeof(NDIS_802_11_MAC_ADDRESS))
3342 Status = -EINVAL;
3343 else
3344 {
3345 Status = copy_from_user(&Bssid, wrq->u.data.pointer, wrq->u.data.length);
3346
3347 // tell CNTL state machine to call NdisMSetInformationComplete() after completing
3348 // this request, because this request is initiated by NDIS.
3349 pAd->MlmeAux.CurrReqIsFromNdis = FALSE;
3350
3351 // Prevent to connect AP again in STAMlmePeriodicExec
3352 pAd->MlmeAux.AutoReconnectSsidLen= 32;
3353
3354 // Reset allowed scan retries
3355 pAd->StaCfg.ScanCnt = 0;
3356
3357 if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE)
3358 {
3359 RTMP_MLME_RESET_STATE_MACHINE(pAd);
3360 DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n"));
3361 }
3362 MlmeEnqueue(pAd,
3363 MLME_CNTL_STATE_MACHINE,
3364 OID_802_11_BSSID,
3365 sizeof(NDIS_802_11_MAC_ADDRESS),
3366 (VOID *)&Bssid);
3367 Status = NDIS_STATUS_SUCCESS;
3368 StateMachineTouched = TRUE;
3369
3370 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_BSSID %02x:%02x:%02x:%02x:%02x:%02x\n",
3371 Bssid[0], Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5]));
3372 }
3373 break;
3374 case RT_OID_802_11_RADIO:
3375 if (wrq->u.data.length != sizeof(BOOLEAN))
3376 Status = -EINVAL;
3377 else
3378 {
3379 Status = copy_from_user(&RadioState, wrq->u.data.pointer, wrq->u.data.length);
3380 DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_RADIO (=%d)\n", RadioState));
3381 if (pAd->StaCfg.bSwRadio != RadioState)
3382 {
3383 pAd->StaCfg.bSwRadio = RadioState;
3384 if (pAd->StaCfg.bRadio != (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio))
3385 {
3386 pAd->StaCfg.bRadio = (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio);
3387 if (pAd->StaCfg.bRadio == TRUE)
3388 {
3389 MlmeRadioOn(pAd);
3390 // Update extra information
3391 pAd->ExtraInfo = EXTRA_INFO_CLEAR;
3392 }
3393 else
3394 {
3395 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
3396 {
3397 if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE)
3398 {
3399 RTMP_MLME_RESET_STATE_MACHINE(pAd);
3400 DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n"));
3401 }
3402 }
3403
3404 MlmeRadioOff(pAd);
3405 // Update extra information
3406 pAd->ExtraInfo = SW_RADIO_OFF;
3407 }
3408 }
3409 }
3410 }
3411 break;
3412 case RT_OID_802_11_PHY_MODE:
3413 if (wrq->u.data.length != sizeof(RT_802_11_PHY_MODE))
3414 Status = -EINVAL;
3415 else
3416 {
3417 Status = copy_from_user(&PhyMode, wrq->u.data.pointer, wrq->u.data.length);
3418 if (PhyMode <= MaxPhyMode)
3419 {
3420 RTMPSetPhyMode(pAd, PhyMode);
3421#ifdef DOT11_N_SUPPORT
3422 SetCommonHT(pAd);
3423#endif // DOT11_N_SUPPORT //
3424 }
3425 DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_PHY_MODE (=%d)\n", PhyMode));
3426 }
3427 break;
3428 case RT_OID_802_11_STA_CONFIG:
3429 if (wrq->u.data.length != sizeof(RT_802_11_STA_CONFIG))
3430 Status = -EINVAL;
3431 else
3432 {
3433 UINT32 Value;
3434
3435 Status = copy_from_user(&StaConfig, wrq->u.data.pointer, wrq->u.data.length);
3436 pAd->CommonCfg.bEnableTxBurst = StaConfig.EnableTxBurst;
3437 pAd->CommonCfg.UseBGProtection = StaConfig.UseBGProtection;
3438 pAd->CommonCfg.bUseShortSlotTime = 1; // 2003-10-30 always SHORT SLOT capable
3439 if ((pAd->CommonCfg.PhyMode != StaConfig.AdhocMode) &&
3440 (StaConfig.AdhocMode <= MaxPhyMode))
3441 {
3442 // allow dynamic change of "USE OFDM rate or not" in ADHOC mode
3443 // if setting changed, need to reset current TX rate as well as BEACON frame format
3444 if (pAd->StaCfg.BssType == BSS_ADHOC)
3445 {
3446 pAd->CommonCfg.PhyMode = StaConfig.AdhocMode;
3447 RTMPSetPhyMode(pAd, PhyMode);
3448 MlmeUpdateTxRates(pAd, FALSE, 0);
3449 MakeIbssBeacon(pAd); // re-build BEACON frame
3450 AsicEnableIbssSync(pAd); // copy to on-chip memory
3451 }
3452 }
3453 DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_SET_STA_CONFIG (Burst=%d, Protection=%ld,ShortSlot=%d\n",
3454 pAd->CommonCfg.bEnableTxBurst,
3455 pAd->CommonCfg.UseBGProtection,
3456 pAd->CommonCfg.bUseShortSlotTime));
3457
3458 if (pAd->CommonCfg.PSPXlink)
3459 Value = PSPXLINK;
3460 else
3461 Value = STANORMAL;
3462 RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, Value);
3463 Value = 0;
3464 RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
3465 Value &= (~0x80);
3466 RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
3467 }
3468 break;
3469 case OID_802_11_DESIRED_RATES:
3470 if (wrq->u.data.length != sizeof(NDIS_802_11_RATES))
3471 Status = -EINVAL;
3472 else
3473 {
3474 Status = copy_from_user(&aryRates, wrq->u.data.pointer, wrq->u.data.length);
3475 NdisZeroMemory(pAd->CommonCfg.DesireRate, MAX_LEN_OF_SUPPORTED_RATES);
3476 NdisMoveMemory(pAd->CommonCfg.DesireRate, &aryRates, sizeof(NDIS_802_11_RATES));
3477 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_DESIRED_RATES (%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x)\n",
3478 pAd->CommonCfg.DesireRate[0],pAd->CommonCfg.DesireRate[1],
3479 pAd->CommonCfg.DesireRate[2],pAd->CommonCfg.DesireRate[3],
3480 pAd->CommonCfg.DesireRate[4],pAd->CommonCfg.DesireRate[5],
3481 pAd->CommonCfg.DesireRate[6],pAd->CommonCfg.DesireRate[7] ));
3482 // Changing DesiredRate may affect the MAX TX rate we used to TX frames out
3483 MlmeUpdateTxRates(pAd, FALSE, 0);
3484 }
3485 break;
3486 case RT_OID_802_11_PREAMBLE:
3487 if (wrq->u.data.length != sizeof(RT_802_11_PREAMBLE))
3488 Status = -EINVAL;
3489 else
3490 {
3491 Status = copy_from_user(&Preamble, wrq->u.data.pointer, wrq->u.data.length);
3492 if (Preamble == Rt802_11PreambleShort)
3493 {
3494 pAd->CommonCfg.TxPreamble = Preamble;
3495 MlmeSetTxPreamble(pAd, Rt802_11PreambleShort);
3496 }
3497 else if ((Preamble == Rt802_11PreambleLong) || (Preamble == Rt802_11PreambleAuto))
3498 {
3499 // if user wants AUTO, initialize to LONG here, then change according to AP's
3500 // capability upon association.
3501 pAd->CommonCfg.TxPreamble = Preamble;
3502 MlmeSetTxPreamble(pAd, Rt802_11PreambleLong);
3503 }
3504 else
3505 {
3506 Status = -EINVAL;
3507 break;
3508 }
3509 DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_PREAMBLE (=%d)\n", Preamble));
3510 }
3511 break;
3512 case OID_802_11_WEP_STATUS:
3513 if (wrq->u.data.length != sizeof(NDIS_802_11_WEP_STATUS))
3514 Status = -EINVAL;
3515 else
3516 {
3517 Status = copy_from_user(&WepStatus, wrq->u.data.pointer, wrq->u.data.length);
3518 // Since TKIP, AES, WEP are all supported. It should not have any invalid setting
3519 if (WepStatus <= Ndis802_11Encryption3KeyAbsent)
3520 {
3521 if (pAd->StaCfg.WepStatus != WepStatus)
3522 {
3523 // Config has changed
3524 pAd->bConfigChanged = TRUE;
3525 }
3526 pAd->StaCfg.WepStatus = WepStatus;
3527 pAd->StaCfg.OrigWepStatus = WepStatus;
3528 pAd->StaCfg.PairCipher = WepStatus;
3529 pAd->StaCfg.GroupCipher = WepStatus;
3530 }
3531 else
3532 {
3533 Status = -EINVAL;
3534 break;
3535 }
3536 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_WEP_STATUS (=%d)\n",WepStatus));
3537 }
3538 break;
3539 case OID_802_11_AUTHENTICATION_MODE:
3540 if (wrq->u.data.length != sizeof(NDIS_802_11_AUTHENTICATION_MODE))
3541 Status = -EINVAL;
3542 else
3543 {
3544 Status = copy_from_user(&AuthMode, wrq->u.data.pointer, wrq->u.data.length);
3545 if (AuthMode > Ndis802_11AuthModeMax)
3546 {
3547 Status = -EINVAL;
3548 break;
3549 }
3550 else
3551 {
3552 if (pAd->StaCfg.AuthMode != AuthMode)
3553 {
3554 // Config has changed
3555 pAd->bConfigChanged = TRUE;
3556 }
3557 pAd->StaCfg.AuthMode = AuthMode;
3558 }
3559 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
3560 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_AUTHENTICATION_MODE (=%d) \n",pAd->StaCfg.AuthMode));
3561 }
3562 break;
3563 case OID_802_11_INFRASTRUCTURE_MODE:
3564 if (wrq->u.data.length != sizeof(NDIS_802_11_NETWORK_INFRASTRUCTURE))
3565 Status = -EINVAL;
3566 else
3567 {
3568 Status = copy_from_user(&BssType, wrq->u.data.pointer, wrq->u.data.length);
3569
3570 if (BssType == Ndis802_11IBSS)
3571 Set_NetworkType_Proc(pAd, "Adhoc");
3572 else if (BssType == Ndis802_11Infrastructure)
3573 Set_NetworkType_Proc(pAd, "Infra");
3574 else if (BssType == Ndis802_11Monitor)
3575 Set_NetworkType_Proc(pAd, "Monitor");
3576 else
3577 {
3578 Status = -EINVAL;
3579 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_INFRASTRUCTURE_MODE (unknown)\n"));
3580 }
3581 }
3582 break;
3583 case OID_802_11_REMOVE_WEP:
3584 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_WEP\n"));
3585 if (wrq->u.data.length != sizeof(NDIS_802_11_KEY_INDEX))
3586 {
3587 Status = -EINVAL;
3588 }
3589 else
3590 {
3591 KeyIdx = *(NDIS_802_11_KEY_INDEX *) wrq->u.data.pointer;
3592
3593 if (KeyIdx & 0x80000000)
3594 {
3595 // Should never set default bit when remove key
3596 Status = -EINVAL;
3597 }
3598 else
3599 {
3600 KeyIdx = KeyIdx & 0x0fffffff;
3601 if (KeyIdx >= 4){
3602 Status = -EINVAL;
3603 }
3604 else
3605 {
3606 pAd->SharedKey[BSS0][KeyIdx].KeyLen = 0;
3607 pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CIPHER_NONE;
3608 AsicRemoveSharedKeyEntry(pAd, 0, (UCHAR)KeyIdx);
3609 }
3610 }
3611 }
3612 break;
3613 case RT_OID_802_11_RESET_COUNTERS:
3614 NdisZeroMemory(&pAd->WlanCounters, sizeof(COUNTER_802_11));
3615 NdisZeroMemory(&pAd->Counters8023, sizeof(COUNTER_802_3));
3616 NdisZeroMemory(&pAd->RalinkCounters, sizeof(COUNTER_RALINK));
3617 pAd->Counters8023.RxNoBuffer = 0;
3618 pAd->Counters8023.GoodReceives = 0;
3619 pAd->Counters8023.RxNoBuffer = 0;
3620 DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_RESET_COUNTERS \n"));
3621 break;
3622 case OID_802_11_RTS_THRESHOLD:
3623 if (wrq->u.data.length != sizeof(NDIS_802_11_RTS_THRESHOLD))
3624 Status = -EINVAL;
3625 else
3626 {
3627 Status = copy_from_user(&RtsThresh, wrq->u.data.pointer, wrq->u.data.length);
3628 if (RtsThresh > MAX_RTS_THRESHOLD)
3629 Status = -EINVAL;
3630 else
3631 pAd->CommonCfg.RtsThreshold = (USHORT)RtsThresh;
3632 }
3633 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_RTS_THRESHOLD (=%ld)\n",RtsThresh));
3634 break;
3635 case OID_802_11_FRAGMENTATION_THRESHOLD:
3636 if (wrq->u.data.length != sizeof(NDIS_802_11_FRAGMENTATION_THRESHOLD))
3637 Status = -EINVAL;
3638 else
3639 {
3640 Status = copy_from_user(&FragThresh, wrq->u.data.pointer, wrq->u.data.length);
3641 pAd->CommonCfg.bUseZeroToDisableFragment = FALSE;
3642 if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD)
3643 {
3644 if (FragThresh == 0)
3645 {
3646 pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD;
3647 pAd->CommonCfg.bUseZeroToDisableFragment = TRUE;
3648 }
3649 else
3650 Status = -EINVAL;
3651 }
3652 else
3653 pAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh;
3654 }
3655 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_FRAGMENTATION_THRESHOLD (=%ld) \n",FragThresh));
3656 break;
3657 case OID_802_11_POWER_MODE:
3658 if (wrq->u.data.length != sizeof(NDIS_802_11_POWER_MODE))
3659 Status = -EINVAL;
3660 else
3661 {
3662 Status = copy_from_user(&PowerMode, wrq->u.data.pointer, wrq->u.data.length);
3663 if (PowerMode == Ndis802_11PowerModeCAM)
3664 Set_PSMode_Proc(pAd, "CAM");
3665 else if (PowerMode == Ndis802_11PowerModeMAX_PSP)
3666 Set_PSMode_Proc(pAd, "Max_PSP");
3667 else if (PowerMode == Ndis802_11PowerModeFast_PSP)
3668 Set_PSMode_Proc(pAd, "Fast_PSP");
3669 else if (PowerMode == Ndis802_11PowerModeLegacy_PSP)
3670 Set_PSMode_Proc(pAd, "Legacy_PSP");
3671 else
3672 Status = -EINVAL;
3673 }
3674 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_POWER_MODE (=%d)\n",PowerMode));
3675 break;
3676 case RT_OID_802_11_TX_POWER_LEVEL_1:
3677 if (wrq->u.data.length < sizeof(ULONG))
3678 Status = -EINVAL;
3679 else
3680 {
3681 Status = copy_from_user(&PowerTemp, wrq->u.data.pointer, wrq->u.data.length);
3682 if (PowerTemp > 100)
3683 PowerTemp = 0xffffffff; // AUTO
3684 pAd->CommonCfg.TxPowerDefault = PowerTemp; //keep current setting.
3685 pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault;
3686 DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_TX_POWER_LEVEL_1 (=%ld)\n", pAd->CommonCfg.TxPowerPercentage));
3687 }
3688 break;
3689 case OID_802_11_NETWORK_TYPE_IN_USE:
3690 if (wrq->u.data.length != sizeof(NDIS_802_11_NETWORK_TYPE))
3691 Status = -EINVAL;
3692 else
3693 {
3694 Status = copy_from_user(&NetType, wrq->u.data.pointer, wrq->u.data.length);
3695
3696 if (NetType == Ndis802_11DS)
3697 RTMPSetPhyMode(pAd, PHY_11B);
3698 else if (NetType == Ndis802_11OFDM24)
3699 RTMPSetPhyMode(pAd, PHY_11BG_MIXED);
3700 else if (NetType == Ndis802_11OFDM5)
3701 RTMPSetPhyMode(pAd, PHY_11A);
3702 else
3703 Status = -EINVAL;
3704#ifdef DOT11_N_SUPPORT
3705 if (Status == NDIS_STATUS_SUCCESS)
3706 SetCommonHT(pAd);
3707#endif // DOT11_N_SUPPORT //
3708 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_NETWORK_TYPE_IN_USE (=%d)\n",NetType));
3709 }
3710 break;
3711 // For WPA PSK PMK key
3712 case RT_OID_802_11_ADD_WPA:
3713 pKey = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG);
3714 if(pKey == NULL)
3715 {
3716 Status = -ENOMEM;
3717 break;
3718 }
3719
3720 Status = copy_from_user(pKey, wrq->u.data.pointer, wrq->u.data.length);
3721 if (pKey->Length != wrq->u.data.length)
3722 {
3723 Status = -EINVAL;
3724 DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_ADD_WPA, Failed!!\n"));
3725 }
3726 else
3727 {
3728 if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&
3729 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&
3730 (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone) )
3731 {
3732 Status = -EOPNOTSUPP;
3733 DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_ADD_WPA, Failed!! [AuthMode != WPAPSK/WPA2PSK/WPANONE]\n"));
3734 }
3735 else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
3736 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) ||
3737 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) ) // Only for WPA PSK mode
3738 {
3739 NdisMoveMemory(pAd->StaCfg.PMK, &pKey->KeyMaterial, pKey->KeyLength);
3740 // Use RaConfig as PSK agent.
3741 // Start STA supplicant state machine
3742 if (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone)
3743 pAd->StaCfg.WpaState = SS_START;
3744
3745 DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_ADD_WPA (id=0x%x, Len=%d-byte)\n", pKey->KeyIndex, pKey->KeyLength));
3746 }
3747 else
3748 {
3749 pAd->StaCfg.WpaState = SS_NOTUSE;
3750 DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_ADD_WPA (id=0x%x, Len=%d-byte)\n", pKey->KeyIndex, pKey->KeyLength));
3751 }
3752 }
3753 kfree(pKey);
3754 break;
3755 case OID_802_11_REMOVE_KEY:
3756 pRemoveKey = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG);
3757 if(pRemoveKey == NULL)
3758 {
3759 Status = -ENOMEM;
3760 break;
3761 }
3762
3763 Status = copy_from_user(pRemoveKey, wrq->u.data.pointer, wrq->u.data.length);
3764 if (pRemoveKey->Length != wrq->u.data.length)
3765 {
3766 Status = -EINVAL;
3767 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY, Failed!!\n"));
3768 }
3769 else
3770 {
3771 if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)
3772 {
3773 RTMPWPARemoveKeyProc(pAd, pRemoveKey);
3774 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY, Remove WPA Key!!\n"));
3775 }
3776 else
3777 {
3778 KeyIdx = pRemoveKey->KeyIndex;
3779
3780 if (KeyIdx & 0x80000000)
3781 {
3782 // Should never set default bit when remove key
3783 Status = -EINVAL;
3784 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY, Failed!!(Should never set default bit when remove key)\n"));
3785 }
3786 else
3787 {
3788 KeyIdx = KeyIdx & 0x0fffffff;
3789 if (KeyIdx > 3)
3790 {
3791 Status = -EINVAL;
3792 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY, Failed!!(KeyId[%d] out of range)\n", KeyIdx));
3793 }
3794 else
3795 {
3796 pAd->SharedKey[BSS0][KeyIdx].KeyLen = 0;
3797 pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CIPHER_NONE;
3798 AsicRemoveSharedKeyEntry(pAd, 0, (UCHAR)KeyIdx);
3799 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY (id=0x%x, Len=%d-byte)\n", pRemoveKey->KeyIndex, pRemoveKey->Length));
3800 }
3801 }
3802 }
3803 }
3804 kfree(pRemoveKey);
3805 break;
3806 // New for WPA
3807 case OID_802_11_ADD_KEY:
3808 pKey = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG);
3809 if(pKey == NULL)
3810 {
3811 Status = -ENOMEM;
3812 break;
3813 }
3814 Status = copy_from_user(pKey, wrq->u.data.pointer, wrq->u.data.length);
3815 if (pKey->Length != wrq->u.data.length)
3816 {
3817 Status = -EINVAL;
3818 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_KEY, Failed!!\n"));
3819 }
3820 else
3821 {
3822 RTMPAddKey(pAd, pKey);
3823 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_KEY (id=0x%x, Len=%d-byte)\n", pKey->KeyIndex, pKey->KeyLength));
3824 }
3825 kfree(pKey);
3826 break;
3827 case OID_802_11_CONFIGURATION:
3828 if (wrq->u.data.length != sizeof(NDIS_802_11_CONFIGURATION))
3829 Status = -EINVAL;
3830 else
3831 {
3832 Status = copy_from_user(&Config, wrq->u.data.pointer, wrq->u.data.length);
3833 pConfig = &Config;
3834
3835 if ((pConfig->BeaconPeriod >= 20) && (pConfig->BeaconPeriod <=400))
3836 pAd->CommonCfg.BeaconPeriod = (USHORT) pConfig->BeaconPeriod;
3837
3838 pAd->StaActive.AtimWin = (USHORT) pConfig->ATIMWindow;
3839 MAP_KHZ_TO_CHANNEL_ID(pConfig->DSConfig, pAd->CommonCfg.Channel);
3840 //
3841 // Save the channel on MlmeAux for CntlOidRTBssidProc used.
3842 //
3843 pAd->MlmeAux.Channel = pAd->CommonCfg.Channel;
3844
3845 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_CONFIGURATION (BeacnPeriod=%ld,AtimW=%ld,Ch=%d)\n",
3846 pConfig->BeaconPeriod, pConfig->ATIMWindow, pAd->CommonCfg.Channel));
3847 // Config has changed
3848 pAd->bConfigChanged = TRUE;
3849 }
3850 break;
3851#ifdef DOT11_N_SUPPORT
3852 case RT_OID_802_11_SET_HT_PHYMODE:
3853 if (wrq->u.data.length != sizeof(OID_SET_HT_PHYMODE))
3854 Status = -EINVAL;
3855 else
3856 {
3857 POID_SET_HT_PHYMODE pHTPhyMode = &HT_PhyMode;
3858
3859 Status = copy_from_user(&HT_PhyMode, wrq->u.data.pointer, wrq->u.data.length);
3860 DBGPRINT(RT_DEBUG_TRACE, ("Set::pHTPhyMode (PhyMode = %d,TransmitNo = %d, HtMode = %d, ExtOffset = %d , MCS = %d, BW = %d, STBC = %d, SHORTGI = %d) \n",
3861 pHTPhyMode->PhyMode, pHTPhyMode->TransmitNo,pHTPhyMode->HtMode,pHTPhyMode->ExtOffset,
3862 pHTPhyMode->MCS, pHTPhyMode->BW, pHTPhyMode->STBC, pHTPhyMode->SHORTGI));
3863 if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)
3864 RTMPSetHT(pAd, pHTPhyMode);
3865 }
3866 DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_SET_HT_PHYMODE(MCS=%d,BW=%d,SGI=%d,STBC=%d)\n",
3867 pAd->StaCfg.HTPhyMode.field.MCS, pAd->StaCfg.HTPhyMode.field.BW, pAd->StaCfg.HTPhyMode.field.ShortGI,
3868 pAd->StaCfg.HTPhyMode.field.STBC));
3869 break;
3870#endif // DOT11_N_SUPPORT //
3871 case RT_OID_802_11_SET_APSD_SETTING:
3872 if (wrq->u.data.length != sizeof(ULONG))
3873 Status = -EINVAL;
3874 else
3875 {
3876 ULONG apsd ;
3877 Status = copy_from_user(&apsd, wrq->u.data.pointer, wrq->u.data.length);
3878
3879 /*-------------------------------------------------------------------
3880 |B31~B7 | B6~B5 | B4 | B3 | B2 | B1 | B0 |
3881 ---------------------------------------------------------------------
3882 | Rsvd | Max SP Len | AC_VO | AC_VI | AC_BK | AC_BE | APSD Capable |
3883 ---------------------------------------------------------------------*/
3884 pAd->CommonCfg.bAPSDCapable = (apsd & 0x00000001) ? TRUE : FALSE;
3885 pAd->CommonCfg.bAPSDAC_BE = ((apsd & 0x00000002) >> 1) ? TRUE : FALSE;
3886 pAd->CommonCfg.bAPSDAC_BK = ((apsd & 0x00000004) >> 2) ? TRUE : FALSE;
3887 pAd->CommonCfg.bAPSDAC_VI = ((apsd & 0x00000008) >> 3) ? TRUE : FALSE;
3888 pAd->CommonCfg.bAPSDAC_VO = ((apsd & 0x00000010) >> 4) ? TRUE : FALSE;
3889 pAd->CommonCfg.MaxSPLength = (UCHAR)((apsd & 0x00000060) >> 5);
3890
3891 DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_SET_APSD_SETTING (apsd=0x%lx, APSDCap=%d, [BE,BK,VI,VO]=[%d/%d/%d/%d], MaxSPLen=%d)\n", apsd, pAd->CommonCfg.bAPSDCapable,
3892 pAd->CommonCfg.bAPSDAC_BE, pAd->CommonCfg.bAPSDAC_BK, pAd->CommonCfg.bAPSDAC_VI, pAd->CommonCfg.bAPSDAC_VO, pAd->CommonCfg.MaxSPLength));
3893 }
3894 break;
3895
3896 case RT_OID_802_11_SET_APSD_PSM:
3897 if (wrq->u.data.length != sizeof(ULONG))
3898 Status = -EINVAL;
3899 else
3900 {
3901 // Driver needs to notify AP when PSM changes
3902 Status = copy_from_user(&pAd->CommonCfg.bAPSDForcePowerSave, wrq->u.data.pointer, wrq->u.data.length);
3903 if (pAd->CommonCfg.bAPSDForcePowerSave != pAd->StaCfg.Psm)
3904 {
3905 RTMP_SET_PSM_BIT(pAd, pAd->CommonCfg.bAPSDForcePowerSave);
3906 RTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE);
3907 }
3908 DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_SET_APSD_PSM (bAPSDForcePowerSave:%d)\n", pAd->CommonCfg.bAPSDForcePowerSave));
3909 }
3910 break;
3911#ifdef QOS_DLS_SUPPORT
3912 case RT_OID_802_11_SET_DLS:
3913 if (wrq->u.data.length != sizeof(ULONG))
3914 Status = -EINVAL;
3915 else
3916 {
3917 BOOLEAN oldvalue = pAd->CommonCfg.bDLSCapable;
3918 Status = copy_from_user(&pAd->CommonCfg.bDLSCapable, wrq->u.data.pointer, wrq->u.data.length);
3919 if (oldvalue && !pAd->CommonCfg.bDLSCapable)
3920 {
3921 int i;
3922 // tear down local dls table entry
3923 for (i=0; i<MAX_NUM_OF_INIT_DLS_ENTRY; i++)
3924 {
3925 if (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH))
3926 {
3927 pAd->StaCfg.DLSEntry[i].Status = DLS_NONE;
3928 pAd->StaCfg.DLSEntry[i].Valid = FALSE;
3929 RTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr);
3930 }
3931 }
3932
3933 // tear down peer dls table entry
3934 for (i=MAX_NUM_OF_INIT_DLS_ENTRY; i<MAX_NUM_OF_DLS_ENTRY; i++)
3935 {
3936 if (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH))
3937 {
3938 pAd->StaCfg.DLSEntry[i].Status = DLS_NONE;
3939 pAd->StaCfg.DLSEntry[i].Valid = FALSE;
3940 RTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr);
3941 }
3942 }
3943 }
3944
3945 DBGPRINT(RT_DEBUG_TRACE,("Set::RT_OID_802_11_SET_DLS (=%d)\n", pAd->CommonCfg.bDLSCapable));
3946 }
3947 break;
3948
3949 case RT_OID_802_11_SET_DLS_PARAM:
3950 if (wrq->u.data.length != sizeof(RT_802_11_DLS_UI))
3951 Status = -EINVAL;
3952 else
3953 {
3954 RT_802_11_DLS Dls;
3955
3956 NdisZeroMemory(&Dls, sizeof(RT_802_11_DLS));
3957 RTMPMoveMemory(&Dls, wrq->u.data.pointer, sizeof(RT_802_11_DLS_UI));
3958 MlmeEnqueue(pAd,
3959 MLME_CNTL_STATE_MACHINE,
3960 RT_OID_802_11_SET_DLS_PARAM,
3961 sizeof(RT_802_11_DLS),
3962 &Dls);
3963 DBGPRINT(RT_DEBUG_TRACE,("Set::RT_OID_802_11_SET_DLS_PARAM \n"));
3964 }
3965 break;
3966#endif // QOS_DLS_SUPPORT //
3967 case RT_OID_802_11_SET_WMM:
3968 if (wrq->u.data.length != sizeof(BOOLEAN))
3969 Status = -EINVAL;
3970 else
3971 {
3972 Status = copy_from_user(&pAd->CommonCfg.bWmmCapable, wrq->u.data.pointer, wrq->u.data.length);
3973 DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_SET_WMM (=%d) \n", pAd->CommonCfg.bWmmCapable));
3974 }
3975 break;
3976
3977 case OID_802_11_DISASSOCIATE:
3978 //
3979 // Set NdisRadioStateOff to TRUE, instead of called MlmeRadioOff.
3980 // Later on, NDIS_802_11_BSSID_LIST_EX->NumberOfItems should be 0
3981 // when query OID_802_11_BSSID_LIST.
3982 //
3983 // TRUE: NumberOfItems will set to 0.
3984 // FALSE: NumberOfItems no change.
3985 //
3986 pAd->CommonCfg.NdisRadioStateOff = TRUE;
3987 // Set to immediately send the media disconnect event
3988 pAd->MlmeAux.CurrReqIsFromNdis = TRUE;
3989 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_DISASSOCIATE \n"));
3990
3991
3992 if (INFRA_ON(pAd))
3993 {
3994 if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE)
3995 {
3996 RTMP_MLME_RESET_STATE_MACHINE(pAd);
3997 DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n"));
3998 }
3999
4000 MlmeEnqueue(pAd,
4001 MLME_CNTL_STATE_MACHINE,
4002 OID_802_11_DISASSOCIATE,
4003 0,
4004 NULL);
4005
4006 StateMachineTouched = TRUE;
4007 }
4008 break;
4009
4010#ifdef DOT11_N_SUPPORT
4011 case RT_OID_802_11_SET_IMME_BA_CAP:
4012 if (wrq->u.data.length != sizeof(OID_BACAP_STRUC))
4013 Status = -EINVAL;
4014 else
4015 {
4016 OID_BACAP_STRUC Orde ;
4017 Status = copy_from_user(&Orde, wrq->u.data.pointer, wrq->u.data.length);
4018 if (Orde.Policy > BA_NOTUSE)
4019 {
4020 Status = NDIS_STATUS_INVALID_DATA;
4021 }
4022 else if (Orde.Policy == BA_NOTUSE)
4023 {
4024 pAd->CommonCfg.BACapability.field.Policy = BA_NOTUSE;
4025 pAd->CommonCfg.BACapability.field.MpduDensity = Orde.MpduDensity;
4026 pAd->CommonCfg.DesiredHtPhy.MpduDensity = Orde.MpduDensity;
4027 pAd->CommonCfg.DesiredHtPhy.AmsduEnable = Orde.AmsduEnable;
4028 pAd->CommonCfg.DesiredHtPhy.AmsduSize= Orde.AmsduSize;
4029 pAd->CommonCfg.DesiredHtPhy.MimoPs= Orde.MMPSmode;
4030 pAd->CommonCfg.BACapability.field.MMPSmode = Orde.MMPSmode;
4031 // UPdata to HT IE
4032 pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs = Orde.MMPSmode;
4033 pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize = Orde.AmsduSize;
4034 pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity = Orde.MpduDensity;
4035 }
4036 else
4037 {
4038 pAd->CommonCfg.BACapability.field.AutoBA = Orde.AutoBA;
4039 pAd->CommonCfg.BACapability.field.Policy = IMMED_BA; // we only support immediate BA.
4040 pAd->CommonCfg.BACapability.field.MpduDensity = Orde.MpduDensity;
4041 pAd->CommonCfg.DesiredHtPhy.MpduDensity = Orde.MpduDensity;
4042 pAd->CommonCfg.DesiredHtPhy.AmsduEnable = Orde.AmsduEnable;
4043 pAd->CommonCfg.DesiredHtPhy.AmsduSize= Orde.AmsduSize;
4044 pAd->CommonCfg.DesiredHtPhy.MimoPs = Orde.MMPSmode;
4045 pAd->CommonCfg.BACapability.field.MMPSmode = Orde.MMPSmode;
4046
4047 // UPdata to HT IE
4048 pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs = Orde.MMPSmode;
4049 pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize = Orde.AmsduSize;
4050 pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity = Orde.MpduDensity;
4051
4052 if (pAd->CommonCfg.BACapability.field.RxBAWinLimit > MAX_RX_REORDERBUF)
4053 pAd->CommonCfg.BACapability.field.RxBAWinLimit = MAX_RX_REORDERBUF;
4054
4055 }
4056
4057 pAd->CommonCfg.REGBACapability.word = pAd->CommonCfg.BACapability.word;
4058 DBGPRINT(RT_DEBUG_TRACE, ("Set::(Orde.AutoBA = %d) (Policy=%d)(ReBAWinLimit=%d)(TxBAWinLimit=%d)(AutoMode=%d)\n",Orde.AutoBA, pAd->CommonCfg.BACapability.field.Policy,
4059 pAd->CommonCfg.BACapability.field.RxBAWinLimit,pAd->CommonCfg.BACapability.field.TxBAWinLimit, pAd->CommonCfg.BACapability.field.AutoBA));
4060 DBGPRINT(RT_DEBUG_TRACE, ("Set::(MimoPs = %d)(AmsduEnable = %d) (AmsduSize=%d)(MpduDensity=%d)\n",pAd->CommonCfg.DesiredHtPhy.MimoPs, pAd->CommonCfg.DesiredHtPhy.AmsduEnable,
4061 pAd->CommonCfg.DesiredHtPhy.AmsduSize, pAd->CommonCfg.DesiredHtPhy.MpduDensity));
4062 }
4063
4064 break;
4065 case RT_OID_802_11_ADD_IMME_BA:
4066 DBGPRINT(RT_DEBUG_TRACE, (" Set :: RT_OID_802_11_ADD_IMME_BA \n"));
4067 if (wrq->u.data.length != sizeof(OID_ADD_BA_ENTRY))
4068 Status = -EINVAL;
4069 else
4070 {
4071 UCHAR index;
4072 OID_ADD_BA_ENTRY BA;
4073 MAC_TABLE_ENTRY *pEntry;
4074
4075 Status = copy_from_user(&BA, wrq->u.data.pointer, wrq->u.data.length);
4076 if (BA.TID > 15)
4077 {
4078 Status = NDIS_STATUS_INVALID_DATA;
4079 break;
4080 }
4081 else
4082 {
4083 //BATableInsertEntry
4084 //As ad-hoc mode, BA pair is not limited to only BSSID. so add via OID.
4085 index = BA.TID;
4086 // in ad hoc mode, when adding BA pair, we should insert this entry into MACEntry too
4087 pEntry = MacTableLookup(pAd, BA.MACAddr);
4088 if (!pEntry)
4089 {
4090 DBGPRINT(RT_DEBUG_TRACE, ("RT_OID_802_11_ADD_IMME_BA. break on no connection.----:%x:%x\n", BA.MACAddr[4], BA.MACAddr[5]));
4091 break;
4092 }
4093 if (BA.IsRecipient == FALSE)
4094 {
4095 if (pEntry->bIAmBadAtheros == TRUE)
4096 pAd->CommonCfg.BACapability.field.RxBAWinLimit = 0x10;
4097
4098 BAOriSessionSetUp(pAd, pEntry, index, 0, 100, TRUE);
4099 }
4100 else
4101 {
4102 //BATableInsertEntry(pAd, pEntry->Aid, BA.MACAddr, 0, 0xffff, BA.TID, BA.nMSDU, BA.IsRecipient);
4103 }
4104
4105 DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_ADD_IMME_BA. Rec = %d. Mac = %x:%x:%x:%x:%x:%x . \n",
4106 BA.IsRecipient, BA.MACAddr[0], BA.MACAddr[1], BA.MACAddr[2], BA.MACAddr[2]
4107 , BA.MACAddr[4], BA.MACAddr[5]));
4108 }
4109 }
4110 break;
4111
4112 case RT_OID_802_11_TEAR_IMME_BA:
4113 DBGPRINT(RT_DEBUG_TRACE, ("Set :: RT_OID_802_11_TEAR_IMME_BA \n"));
4114 if (wrq->u.data.length != sizeof(OID_ADD_BA_ENTRY))
4115 Status = -EINVAL;
4116 else
4117 {
4118 POID_ADD_BA_ENTRY pBA;
4119 MAC_TABLE_ENTRY *pEntry;
4120
4121 pBA = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG);
4122
4123 if (pBA == NULL)
4124 {
4125 DBGPRINT(RT_DEBUG_TRACE, ("Set :: RT_OID_802_11_TEAR_IMME_BA kmalloc() can't allocate enough memory\n"));
4126 Status = NDIS_STATUS_FAILURE;
4127 }
4128 else
4129 {
4130 Status = copy_from_user(pBA, wrq->u.data.pointer, wrq->u.data.length);
4131 DBGPRINT(RT_DEBUG_TRACE, ("Set :: RT_OID_802_11_TEAR_IMME_BA(TID=%d, bAllTid=%d)\n", pBA->TID, pBA->bAllTid));
4132
4133 if (!pBA->bAllTid && (pBA->TID > NUM_OF_TID))
4134 {
4135 Status = NDIS_STATUS_INVALID_DATA;
4136 break;
4137 }
4138
4139 if (pBA->IsRecipient == FALSE)
4140 {
4141 pEntry = MacTableLookup(pAd, pBA->MACAddr);
4142 DBGPRINT(RT_DEBUG_TRACE, (" pBA->IsRecipient == FALSE\n"));
4143 if (pEntry)
4144 {
4145 DBGPRINT(RT_DEBUG_TRACE, (" pBA->pEntry\n"));
4146 BAOriSessionTearDown(pAd, pEntry->Aid, pBA->TID, FALSE, TRUE);
4147 }
4148 else
4149 DBGPRINT(RT_DEBUG_TRACE, ("Set :: Not found pEntry \n"));
4150 }
4151 else
4152 {
4153 pEntry = MacTableLookup(pAd, pBA->MACAddr);
4154 if (pEntry)
4155 {
4156 BARecSessionTearDown( pAd, (UCHAR)pEntry->Aid, pBA->TID, TRUE);
4157 }
4158 else
4159 DBGPRINT(RT_DEBUG_TRACE, ("Set :: Not found pEntry \n"));
4160 }
4161 kfree(pBA);
4162 }
4163 }
4164 break;
4165#endif // DOT11_N_SUPPORT //
4166
4167 // For WPA_SUPPLICANT to set static wep key
4168 case OID_802_11_ADD_WEP:
4169 pWepKey = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG);
4170
4171 if(pWepKey == NULL)
4172 {
4173 Status = -ENOMEM;
4174 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_WEP, Failed!!\n"));
4175 break;
4176 }
4177 Status = copy_from_user(pWepKey, wrq->u.data.pointer, wrq->u.data.length);
4178 if (Status)
4179 {
4180 Status = -EINVAL;
4181 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_WEP, Failed (length mismatch)!!\n"));
4182 }
4183 else
4184 {
4185 KeyIdx = pWepKey->KeyIndex & 0x0fffffff;
4186 // KeyIdx must be 0 ~ 3
4187 if (KeyIdx > 4)
4188 {
4189 Status = -EINVAL;
4190 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_WEP, Failed (KeyIdx must be smaller than 4)!!\n"));
4191 }
4192 else
4193 {
4194 UCHAR CipherAlg = 0;
4195 PUCHAR Key;
4196
4197 // set key material and key length
4198 NdisZeroMemory(pAd->SharedKey[BSS0][KeyIdx].Key, 16);
4199 pAd->SharedKey[BSS0][KeyIdx].KeyLen = (UCHAR) pWepKey->KeyLength;
4200 NdisMoveMemory(pAd->SharedKey[BSS0][KeyIdx].Key, &pWepKey->KeyMaterial, pWepKey->KeyLength);
4201
4202 switch(pWepKey->KeyLength)
4203 {
4204 case 5:
4205 CipherAlg = CIPHER_WEP64;
4206 break;
4207 case 13:
4208 CipherAlg = CIPHER_WEP128;
4209 break;
4210 default:
4211 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_WEP, only support CIPHER_WEP64(len:5) & CIPHER_WEP128(len:13)!!\n"));
4212 Status = -EINVAL;
4213 break;
4214 }
4215 pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CipherAlg;
4216
4217 // Default key for tx (shared key)
4218 if (pWepKey->KeyIndex & 0x80000000)
4219 {
4220#ifdef WPA_SUPPLICANT_SUPPORT
4221 // set key material and key length
4222 NdisZeroMemory(pAd->StaCfg.DesireSharedKey[KeyIdx].Key, 16);
4223 pAd->StaCfg.DesireSharedKey[KeyIdx].KeyLen = (UCHAR) pWepKey->KeyLength;
4224 NdisMoveMemory(pAd->StaCfg.DesireSharedKey[KeyIdx].Key, &pWepKey->KeyMaterial, pWepKey->KeyLength);
4225 pAd->StaCfg.DesireSharedKeyId = KeyIdx;
4226 pAd->StaCfg.DesireSharedKey[KeyIdx].CipherAlg = CipherAlg;
4227#endif // WPA_SUPPLICANT_SUPPORT //
4228 pAd->StaCfg.DefaultKeyId = (UCHAR) KeyIdx;
4229 }
4230
4231#ifdef WPA_SUPPLICANT_SUPPORT
4232 if ((pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) &&
4233 (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA))
4234 {
4235 Key = pWepKey->KeyMaterial;
4236
4237 // Set Group key material to Asic
4238 AsicAddSharedKeyEntry(pAd, BSS0, KeyIdx, CipherAlg, Key, NULL, NULL);
4239
4240 // Update WCID attribute table and IVEIV table for this group key table
4241 RTMPAddWcidAttributeEntry(pAd, BSS0, KeyIdx, CipherAlg, NULL);
4242
4243 STA_PORT_SECURED(pAd);
4244
4245 // Indicate Connected for GUI
4246 pAd->IndicateMediaState = NdisMediaStateConnected;
4247 }
4248 else if (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED)
4249#endif // WPA_SUPPLICANT_SUPPORT
4250 {
4251 Key = pAd->SharedKey[BSS0][KeyIdx].Key;
4252
4253 // Set key material and cipherAlg to Asic
4254 AsicAddSharedKeyEntry(pAd, BSS0, KeyIdx, CipherAlg, Key, NULL, NULL);
4255
4256 if (pWepKey->KeyIndex & 0x80000000)
4257 {
4258 PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[BSSID_WCID];
4259 // Assign group key info
4260 RTMPAddWcidAttributeEntry(pAd, BSS0, KeyIdx, CipherAlg, NULL);
4261 // Assign pairwise key info
4262 RTMPAddWcidAttributeEntry(pAd, BSS0, KeyIdx, CipherAlg, pEntry);
4263 }
4264 }
4265 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_WEP (id=0x%x, Len=%d-byte), %s\n", pWepKey->KeyIndex, pWepKey->KeyLength, (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED) ? "Port Secured":"Port NOT Secured"));
4266 }
4267 }
4268 kfree(pWepKey);
4269 break;
4270#ifdef WPA_SUPPLICANT_SUPPORT
4271 case OID_SET_COUNTERMEASURES:
4272 if (wrq->u.data.length != sizeof(int))
4273 Status = -EINVAL;
4274 else
4275 {
4276 int enabled = 0;
4277 Status = copy_from_user(&enabled, wrq->u.data.pointer, wrq->u.data.length);
4278 if (enabled == 1)
4279 pAd->StaCfg.bBlockAssoc = TRUE;
4280 else
4281 // WPA MIC error should block association attempt for 60 seconds
4282 pAd->StaCfg.bBlockAssoc = FALSE;
4283 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_SET_COUNTERMEASURES bBlockAssoc=%s\n", pAd->StaCfg.bBlockAssoc ? "TRUE":"FALSE"));
4284 }
4285 break;
4286 case RT_OID_WPA_SUPPLICANT_SUPPORT:
4287 if (wrq->u.data.length != sizeof(UCHAR))
4288 Status = -EINVAL;
4289 else
4290 {
4291 Status = copy_from_user(&wpa_supplicant_enable, wrq->u.data.pointer, wrq->u.data.length);
4292 pAd->StaCfg.WpaSupplicantUP = wpa_supplicant_enable;
4293 DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_WPA_SUPPLICANT_SUPPORT (=%d)\n", pAd->StaCfg.WpaSupplicantUP));
4294 }
4295 break;
4296 case OID_802_11_DEAUTHENTICATION:
4297 if (wrq->u.data.length != sizeof(MLME_DEAUTH_REQ_STRUCT))
4298 Status = -EINVAL;
4299 else
4300 {
4301 MLME_DEAUTH_REQ_STRUCT *pInfo;
4302 MLME_QUEUE_ELEM *MsgElem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);
4303 if (MsgElem == NULL)
4304 {
4305 DBGPRINT(RT_DEBUG_ERROR, ("%s():alloc memory failed!\n", __FUNCTION__));
4306 return -EINVAL;
4307 }
4308
4309 pInfo = (MLME_DEAUTH_REQ_STRUCT *) MsgElem->Msg;
4310 Status = copy_from_user(pInfo, wrq->u.data.pointer, wrq->u.data.length);
4311 MlmeDeauthReqAction(pAd, MsgElem);
4312 kfree(MsgElem);
4313
4314 if (INFRA_ON(pAd))
4315 {
4316 LinkDown(pAd, FALSE);
4317 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
4318 }
4319 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_DEAUTHENTICATION (Reason=%d)\n", pInfo->Reason));
4320 }
4321 break;
4322 case OID_802_11_DROP_UNENCRYPTED:
4323 if (wrq->u.data.length != sizeof(int))
4324 Status = -EINVAL;
4325 else
4326 {
4327 int enabled = 0;
4328 Status = copy_from_user(&enabled, wrq->u.data.pointer, wrq->u.data.length);
4329 if (enabled == 1)
4330 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
4331 else
4332 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
4333 NdisAcquireSpinLock(&pAd->MacTabLock);
4334 pAd->MacTab.Content[BSSID_WCID].PortSecured = pAd->StaCfg.PortSecured;
4335 NdisReleaseSpinLock(&pAd->MacTabLock);
4336 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_DROP_UNENCRYPTED (=%d)\n", enabled));
4337 }
4338 break;
4339 case OID_802_11_SET_IEEE8021X:
4340 if (wrq->u.data.length != sizeof(BOOLEAN))
4341 Status = -EINVAL;
4342 else
4343 {
4344 Status = copy_from_user(&IEEE8021xState, wrq->u.data.pointer, wrq->u.data.length);
4345 pAd->StaCfg.IEEE8021X = IEEE8021xState;
4346 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SET_IEEE8021X (=%d)\n", IEEE8021xState));
4347 }
4348 break;
4349 case OID_802_11_SET_IEEE8021X_REQUIRE_KEY:
4350 if (wrq->u.data.length != sizeof(BOOLEAN))
4351 Status = -EINVAL;
4352 else
4353 {
4354 Status = copy_from_user(&IEEE8021x_required_keys, wrq->u.data.pointer, wrq->u.data.length);
4355 pAd->StaCfg.IEEE8021x_required_keys = IEEE8021x_required_keys;
4356 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SET_IEEE8021X_REQUIRE_KEY (%d)\n", IEEE8021x_required_keys));
4357 }
4358 break;
4359 case OID_802_11_PMKID:
4360 pPmkId = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG);
4361
4362 if(pPmkId == NULL) {
4363 Status = -ENOMEM;
4364 break;
4365 }
4366 Status = copy_from_user(pPmkId, wrq->u.data.pointer, wrq->u.data.length);
4367
4368 // check the PMKID information
4369 if (pPmkId->BSSIDInfoCount == 0)
4370 NdisZeroMemory(pAd->StaCfg.SavedPMK, sizeof(BSSID_INFO)*PMKID_NO);
4371 else
4372 {
4373 PBSSID_INFO pBssIdInfo;
4374 UINT BssIdx;
4375 UINT CachedIdx;
4376
4377 for (BssIdx = 0; BssIdx < pPmkId->BSSIDInfoCount; BssIdx++)
4378 {
4379 // point to the indexed BSSID_INFO structure
4380 pBssIdInfo = (PBSSID_INFO) ((PUCHAR) pPmkId + 2 * sizeof(UINT) + BssIdx * sizeof(BSSID_INFO));
4381 // Find the entry in the saved data base.
4382 for (CachedIdx = 0; CachedIdx < pAd->StaCfg.SavedPMKNum; CachedIdx++)
4383 {
4384 // compare the BSSID
4385 if (NdisEqualMemory(pBssIdInfo->BSSID, pAd->StaCfg.SavedPMK[CachedIdx].BSSID, sizeof(NDIS_802_11_MAC_ADDRESS)))
4386 break;
4387 }
4388
4389 // Found, replace it
4390 if (CachedIdx < PMKID_NO)
4391 {
4392 DBGPRINT(RT_DEBUG_OFF, ("Update OID_802_11_PMKID, idx = %d\n", CachedIdx));
4393 NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx], pBssIdInfo, sizeof(BSSID_INFO));
4394 pAd->StaCfg.SavedPMKNum++;
4395 }
4396 // Not found, replace the last one
4397 else
4398 {
4399 // Randomly replace one
4400 CachedIdx = (pBssIdInfo->BSSID[5] % PMKID_NO);
4401 DBGPRINT(RT_DEBUG_OFF, ("Update OID_802_11_PMKID, idx = %d\n", CachedIdx));
4402 NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx], pBssIdInfo, sizeof(BSSID_INFO));
4403 }
4404 }
4405 }
4406 if(pPmkId)
4407 kfree(pPmkId);
4408 break;
4409#endif // WPA_SUPPLICANT_SUPPORT //
4410
4411
4412
4413#ifdef SNMP_SUPPORT
4414 case OID_802_11_SHORTRETRYLIMIT:
4415 if (wrq->u.data.length != sizeof(ULONG))
4416 Status = -EINVAL;
4417 else
4418 {
4419 Status = copy_from_user(&ShortRetryLimit, wrq->u.data.pointer, wrq->u.data.length);
4420 RTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word);
4421 tx_rty_cfg.field.ShortRtyLimit = ShortRetryLimit;
4422 RTMP_IO_WRITE32(pAd, TX_RTY_CFG, tx_rty_cfg.word);
4423 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SHORTRETRYLIMIT (tx_rty_cfg.field.ShortRetryLimit=%d, ShortRetryLimit=%ld)\n", tx_rty_cfg.field.ShortRtyLimit, ShortRetryLimit));
4424 }
4425 break;
4426
4427 case OID_802_11_LONGRETRYLIMIT:
4428 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_LONGRETRYLIMIT \n"));
4429 if (wrq->u.data.length != sizeof(ULONG))
4430 Status = -EINVAL;
4431 else
4432 {
4433 Status = copy_from_user(&LongRetryLimit, wrq->u.data.pointer, wrq->u.data.length);
4434 RTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word);
4435 tx_rty_cfg.field.LongRtyLimit = LongRetryLimit;
4436 RTMP_IO_WRITE32(pAd, TX_RTY_CFG, tx_rty_cfg.word);
4437 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_LONGRETRYLIMIT (tx_rty_cfg.field.LongRetryLimit= %d,LongRetryLimit=%ld)\n", tx_rty_cfg.field.LongRtyLimit, LongRetryLimit));
4438 }
4439 break;
4440
4441 case OID_802_11_WEPDEFAULTKEYVALUE:
4442 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_WEPDEFAULTKEYVALUE\n"));
4443 pKey = kmalloc(wrq->u.data.length, GFP_KERNEL);
4444 Status = copy_from_user(pKey, wrq->u.data.pointer, wrq->u.data.length);
4445 //pKey = &WepKey;
4446
4447 if ( pKey->Length != wrq->u.data.length)
4448 {
4449 Status = -EINVAL;
4450 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_WEPDEFAULTKEYVALUE, Failed!!\n"));
4451 }
4452 KeyIdx = pKey->KeyIndex & 0x0fffffff;
4453 DBGPRINT(RT_DEBUG_TRACE,("pKey->KeyIndex =%d, pKey->KeyLength=%d\n", pKey->KeyIndex, pKey->KeyLength));
4454
4455 // it is a shared key
4456 if (KeyIdx > 4)
4457 Status = -EINVAL;
4458 else
4459 {
4460 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen = (UCHAR) pKey->KeyLength;
4461 NdisMoveMemory(&pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].Key, &pKey->KeyMaterial, pKey->KeyLength);
4462 if (pKey->KeyIndex & 0x80000000)
4463 {
4464 // Default key for tx (shared key)
4465 pAd->StaCfg.DefaultKeyId = (UCHAR) KeyIdx;
4466 }
4467 //RestartAPIsRequired = TRUE;
4468 }
4469 break;
4470
4471
4472 case OID_802_11_WEPDEFAULTKEYID:
4473 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_WEPDEFAULTKEYID \n"));
4474
4475 if (wrq->u.data.length != sizeof(UCHAR))
4476 Status = -EINVAL;
4477 else
4478 Status = copy_from_user(&pAd->StaCfg.DefaultKeyId, wrq->u.data.pointer, wrq->u.data.length);
4479
4480 break;
4481
4482
4483 case OID_802_11_CURRENTCHANNEL:
4484 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_CURRENTCHANNEL \n"));
4485 if (wrq->u.data.length != sizeof(UCHAR))
4486 Status = -EINVAL;
4487 else
4488 {
4489 Status = copy_from_user(&ctmp, wrq->u.data.pointer, wrq->u.data.length);
4490 sprintf((PSTRING)&ctmp,"%d", ctmp);
4491 Set_Channel_Proc(pAd, (PSTRING)&ctmp);
4492 }
4493 break;
4494#endif
4495
4496
4497
4498 case RT_OID_802_11_SET_PSPXLINK_MODE:
4499 if (wrq->u.data.length != sizeof(BOOLEAN))
4500 Status = -EINVAL;
4501 else
4502 {
4503 Status = copy_from_user(&pAd->CommonCfg.PSPXlink, wrq->u.data.pointer, wrq->u.data.length);
4504 /*if (pAd->CommonCfg.PSPXlink)
4505 RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_PROMISCUOUS)*/
4506 DBGPRINT(RT_DEBUG_TRACE,("Set::RT_OID_802_11_SET_PSPXLINK_MODE(=%d) \n", pAd->CommonCfg.PSPXlink));
4507 }
4508 break;
4509
4510
4511 default:
4512 DBGPRINT(RT_DEBUG_TRACE, ("Set::unknown IOCTL's subcmd = 0x%08x\n", cmd));
4513 Status = -EOPNOTSUPP;
4514 break;
4515 }
4516
4517
4518 return Status;
4519}
4520
4521INT RTMPQueryInformation(
4522 IN PRTMP_ADAPTER pAd,
4523 IN OUT struct ifreq *rq,
4524 IN INT cmd)
4525{
4526 struct iwreq *wrq = (struct iwreq *) rq;
4527 NDIS_802_11_BSSID_LIST_EX *pBssidList = NULL;
4528 PNDIS_WLAN_BSSID_EX pBss;
4529 NDIS_802_11_SSID Ssid;
4530 NDIS_802_11_CONFIGURATION *pConfiguration = NULL;
4531 RT_802_11_LINK_STATUS *pLinkStatus = NULL;
4532 RT_802_11_STA_CONFIG *pStaConfig = NULL;
4533 NDIS_802_11_STATISTICS *pStatistics = NULL;
4534 NDIS_802_11_RTS_THRESHOLD RtsThresh;
4535 NDIS_802_11_FRAGMENTATION_THRESHOLD FragThresh;
4536 NDIS_802_11_POWER_MODE PowerMode;
4537 NDIS_802_11_NETWORK_INFRASTRUCTURE BssType;
4538 RT_802_11_PREAMBLE PreamType;
4539 NDIS_802_11_AUTHENTICATION_MODE AuthMode;
4540 NDIS_802_11_WEP_STATUS WepStatus;
4541 NDIS_MEDIA_STATE MediaState;
4542 ULONG BssBufSize, ulInfo=0, NetworkTypeList[4], apsd = 0;
4543 USHORT BssLen = 0;
4544 PUCHAR pBuf = NULL, pPtr;
4545 INT Status = NDIS_STATUS_SUCCESS;
4546 UINT we_version_compiled;
4547 UCHAR i, Padding = 0;
4548 BOOLEAN RadioState;
4549 STRING driverVersion[8];
4550 OID_SET_HT_PHYMODE *pHTPhyMode = NULL;
4551
4552
4553#ifdef SNMP_SUPPORT
4554 //for snmp, kathy
4555 DefaultKeyIdxValue *pKeyIdxValue;
4556 INT valueLen;
4557 TX_RTY_CFG_STRUC tx_rty_cfg;
4558 ULONG ShortRetryLimit, LongRetryLimit;
4559 UCHAR tmp[64];
4560#endif //SNMP
4561
4562 switch(cmd)
4563 {
4564 case RT_OID_DEVICE_NAME:
4565 wrq->u.data.length = sizeof(pAd->nickname);
4566 Status = copy_to_user(wrq->u.data.pointer, pAd->nickname, wrq->u.data.length);
4567 break;
4568 case RT_OID_VERSION_INFO:
4569 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_VERSION_INFO \n"));
4570 wrq->u.data.length = 8*sizeof(CHAR);
4571 sprintf(&driverVersion[0], "%s", STA_DRIVER_VERSION);
4572 driverVersion[7] = '\0';
4573 if (copy_to_user(wrq->u.data.pointer, &driverVersion[0], wrq->u.data.length))
4574 {
4575 Status = -EFAULT;
4576 }
4577 break;
4578
4579 case OID_802_11_BSSID_LIST:
4580 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
4581 {
4582 /*
4583 * Still scanning, indicate the caller should try again.
4584 */
4585 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BSSID_LIST (Still scanning)\n"));
4586 return -EAGAIN;
4587 }
4588 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BSSID_LIST (%d BSS returned)\n",pAd->ScanTab.BssNr));
4589 pAd->StaCfg.bScanReqIsFromWebUI = FALSE;
4590 // Claculate total buffer size required
4591 BssBufSize = sizeof(ULONG);
4592
4593 for (i = 0; i < pAd->ScanTab.BssNr; i++)
4594 {
4595 // Align pointer to 4 bytes boundary.
4596 //Padding = 4 - (pAdapter->ScanTab.BssEntry[i].VarIELen & 0x0003);
4597 //if (Padding == 4)
4598 // Padding = 0;
4599 BssBufSize += (sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs) + pAd->ScanTab.BssEntry[i].VarIELen + Padding);
4600 }
4601
4602 // For safety issue, we add 256 bytes just in case
4603 BssBufSize += 256;
4604 // Allocate the same size as passed from higher layer
4605 pBuf = kmalloc(BssBufSize, MEM_ALLOC_FLAG);
4606 if(pBuf == NULL)
4607 {
4608 Status = -ENOMEM;
4609 break;
4610 }
4611 // Init 802_11_BSSID_LIST_EX structure
4612 NdisZeroMemory(pBuf, BssBufSize);
4613 pBssidList = (PNDIS_802_11_BSSID_LIST_EX) pBuf;
4614 pBssidList->NumberOfItems = pAd->ScanTab.BssNr;
4615
4616 // Calculate total buffer length
4617 BssLen = 4; // Consist of NumberOfItems
4618 // Point to start of NDIS_WLAN_BSSID_EX
4619 // pPtr = pBuf + sizeof(ULONG);
4620 pPtr = (PUCHAR) &pBssidList->Bssid[0];
4621 for (i = 0; i < pAd->ScanTab.BssNr; i++)
4622 {
4623 pBss = (PNDIS_WLAN_BSSID_EX) pPtr;
4624 NdisMoveMemory(&pBss->MacAddress, &pAd->ScanTab.BssEntry[i].Bssid, MAC_ADDR_LEN);
4625 if ((pAd->ScanTab.BssEntry[i].Hidden == 1) && (pAd->StaCfg.bShowHiddenSSID == FALSE))
4626 {
4627 //
4628 // We must return this SSID during 4way handshaking, otherwise Aegis will failed to parse WPA infomation
4629 // and then failed to send EAPOl farame.
4630 //
4631 if ((pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) && (pAd->StaCfg.PortSecured != WPA_802_1X_PORT_SECURED))
4632 {
4633 pBss->Ssid.SsidLength = pAd->ScanTab.BssEntry[i].SsidLen;
4634 NdisMoveMemory(pBss->Ssid.Ssid, pAd->ScanTab.BssEntry[i].Ssid, pAd->ScanTab.BssEntry[i].SsidLen);
4635 }
4636 else
4637 pBss->Ssid.SsidLength = 0;
4638 }
4639 else
4640 {
4641 pBss->Ssid.SsidLength = pAd->ScanTab.BssEntry[i].SsidLen;
4642 NdisMoveMemory(pBss->Ssid.Ssid, pAd->ScanTab.BssEntry[i].Ssid, pAd->ScanTab.BssEntry[i].SsidLen);
4643 }
4644 pBss->Privacy = pAd->ScanTab.BssEntry[i].Privacy;
4645 pBss->Rssi = pAd->ScanTab.BssEntry[i].Rssi - pAd->BbpRssiToDbmDelta;
4646 pBss->NetworkTypeInUse = NetworkTypeInUseSanity(&pAd->ScanTab.BssEntry[i]);
4647 pBss->Configuration.Length = sizeof(NDIS_802_11_CONFIGURATION);
4648 pBss->Configuration.BeaconPeriod = pAd->ScanTab.BssEntry[i].BeaconPeriod;
4649 pBss->Configuration.ATIMWindow = pAd->ScanTab.BssEntry[i].AtimWin;
4650
4651 MAP_CHANNEL_ID_TO_KHZ(pAd->ScanTab.BssEntry[i].Channel, pBss->Configuration.DSConfig);
4652
4653 if (pAd->ScanTab.BssEntry[i].BssType == BSS_INFRA)
4654 pBss->InfrastructureMode = Ndis802_11Infrastructure;
4655 else
4656 pBss->InfrastructureMode = Ndis802_11IBSS;
4657
4658 NdisMoveMemory(pBss->SupportedRates, pAd->ScanTab.BssEntry[i].SupRate, pAd->ScanTab.BssEntry[i].SupRateLen);
4659 NdisMoveMemory(pBss->SupportedRates + pAd->ScanTab.BssEntry[i].SupRateLen,
4660 pAd->ScanTab.BssEntry[i].ExtRate,
4661 pAd->ScanTab.BssEntry[i].ExtRateLen);
4662
4663 if (pAd->ScanTab.BssEntry[i].VarIELen == 0)
4664 {
4665 pBss->IELength = sizeof(NDIS_802_11_FIXED_IEs);
4666 NdisMoveMemory(pBss->IEs, &pAd->ScanTab.BssEntry[i].FixIEs, sizeof(NDIS_802_11_FIXED_IEs));
4667 pPtr = pPtr + sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs);
4668 }
4669 else
4670 {
4671 pBss->IELength = (ULONG)(sizeof(NDIS_802_11_FIXED_IEs) + pAd->ScanTab.BssEntry[i].VarIELen);
4672 pPtr = pPtr + sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs);
4673 NdisMoveMemory(pBss->IEs, &pAd->ScanTab.BssEntry[i].FixIEs, sizeof(NDIS_802_11_FIXED_IEs));
4674 NdisMoveMemory(pBss->IEs + sizeof(NDIS_802_11_FIXED_IEs), pAd->ScanTab.BssEntry[i].VarIEs, pAd->ScanTab.BssEntry[i].VarIELen);
4675 pPtr += pAd->ScanTab.BssEntry[i].VarIELen;
4676 }
4677 pBss->Length = (ULONG)(sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs) + pAd->ScanTab.BssEntry[i].VarIELen + Padding);
4678
4679#if WIRELESS_EXT < 17
4680 if ((BssLen + pBss->Length) < wrq->u.data.length)
4681 BssLen += pBss->Length;
4682 else
4683 {
4684 pBssidList->NumberOfItems = i;
4685 break;
4686 }
4687#else
4688 BssLen += pBss->Length;
4689#endif
4690 }
4691
4692#if WIRELESS_EXT < 17
4693 wrq->u.data.length = BssLen;
4694#else
4695 if (BssLen > wrq->u.data.length)
4696 {
4697 kfree(pBssidList);
4698 return -E2BIG;
4699 }
4700 else
4701 wrq->u.data.length = BssLen;
4702#endif
4703 Status = copy_to_user(wrq->u.data.pointer, pBssidList, BssLen);
4704 kfree(pBssidList);
4705 break;
4706 case OID_802_3_CURRENT_ADDRESS:
4707 wrq->u.data.length = MAC_ADDR_LEN;
4708 Status = copy_to_user(wrq->u.data.pointer, &pAd->CurrentAddress, wrq->u.data.length);
4709 break;
4710 case OID_GEN_MEDIA_CONNECT_STATUS:
4711 if (pAd->IndicateMediaState == NdisMediaStateConnected)
4712 MediaState = NdisMediaStateConnected;
4713 else
4714 MediaState = NdisMediaStateDisconnected;
4715
4716 wrq->u.data.length = sizeof(NDIS_MEDIA_STATE);
4717 Status = copy_to_user(wrq->u.data.pointer, &MediaState, wrq->u.data.length);
4718 break;
4719 case OID_802_11_BSSID:
4720 if (INFRA_ON(pAd) || ADHOC_ON(pAd))
4721 {
4722 Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.Bssid, sizeof(NDIS_802_11_MAC_ADDRESS));
4723
4724 }
4725 else
4726 {
4727 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BSSID(=EMPTY)\n"));
4728 Status = -ENOTCONN;
4729 }
4730 break;
4731 case OID_802_11_SSID:
4732 NdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID));
4733 NdisZeroMemory(Ssid.Ssid, MAX_LEN_OF_SSID);
4734 Ssid.SsidLength = pAd->CommonCfg.SsidLen;
4735 memcpy(Ssid.Ssid, pAd->CommonCfg.Ssid, Ssid.SsidLength);
4736 wrq->u.data.length = sizeof(NDIS_802_11_SSID);
4737 Status = copy_to_user(wrq->u.data.pointer, &Ssid, wrq->u.data.length);
4738 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_SSID (Len=%d, ssid=%s)\n", Ssid.SsidLength,Ssid.Ssid));
4739 break;
4740 case RT_OID_802_11_QUERY_LINK_STATUS:
4741 pLinkStatus = (RT_802_11_LINK_STATUS *) kmalloc(sizeof(RT_802_11_LINK_STATUS), MEM_ALLOC_FLAG);
4742 if (pLinkStatus)
4743 {
4744 pLinkStatus->CurrTxRate = RateIdTo500Kbps[pAd->CommonCfg.TxRate]; // unit : 500 kbps
4745 pLinkStatus->ChannelQuality = pAd->Mlme.ChannelQuality;
4746 pLinkStatus->RxByteCount = pAd->RalinkCounters.ReceivedByteCount;
4747 pLinkStatus->TxByteCount = pAd->RalinkCounters.TransmittedByteCount;
4748 pLinkStatus->CentralChannel = pAd->CommonCfg.CentralChannel;
4749 wrq->u.data.length = sizeof(RT_802_11_LINK_STATUS);
4750 Status = copy_to_user(wrq->u.data.pointer, pLinkStatus, wrq->u.data.length);
4751 kfree(pLinkStatus);
4752 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_LINK_STATUS\n"));
4753 }
4754 else
4755 {
4756 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_LINK_STATUS(kmalloc failed)\n"));
4757 Status = -EFAULT;
4758 }
4759 break;
4760 case OID_802_11_CONFIGURATION:
4761 pConfiguration = (NDIS_802_11_CONFIGURATION *) kmalloc(sizeof(NDIS_802_11_CONFIGURATION), MEM_ALLOC_FLAG);
4762 if (pConfiguration)
4763 {
4764 pConfiguration->Length = sizeof(NDIS_802_11_CONFIGURATION);
4765 pConfiguration->BeaconPeriod = pAd->CommonCfg.BeaconPeriod;
4766 pConfiguration->ATIMWindow = pAd->StaActive.AtimWin;
4767 MAP_CHANNEL_ID_TO_KHZ(pAd->CommonCfg.Channel, pConfiguration->DSConfig);
4768 wrq->u.data.length = sizeof(NDIS_802_11_CONFIGURATION);
4769 Status = copy_to_user(wrq->u.data.pointer, pConfiguration, wrq->u.data.length);
4770 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_CONFIGURATION(BeaconPeriod=%ld,AtimW=%ld,Channel=%d) \n",
4771 pConfiguration->BeaconPeriod, pConfiguration->ATIMWindow, pAd->CommonCfg.Channel));
4772 kfree(pConfiguration);
4773 }
4774 else
4775 {
4776 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_CONFIGURATION(kmalloc failed)\n"));
4777 Status = -EFAULT;
4778 }
4779 break;
4780 case RT_OID_802_11_SNR_0:
4781 if ((pAd->StaCfg.LastSNR0 > 0))
4782 {
4783 ulInfo = ((0xeb - pAd->StaCfg.LastSNR0) * 3) / 16 ;
4784 wrq->u.data.length = sizeof(ulInfo);
4785 Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
4786 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_SNR_0(0x=%lx)\n", ulInfo));
4787 }
4788 else
4789 Status = -EFAULT;
4790 break;
4791 case RT_OID_802_11_SNR_1:
4792 if ((pAd->Antenna.field.RxPath > 1) &&
4793 (pAd->StaCfg.LastSNR1 > 0))
4794 {
4795 ulInfo = ((0xeb - pAd->StaCfg.LastSNR1) * 3) / 16 ;
4796 wrq->u.data.length = sizeof(ulInfo);
4797 Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
4798 DBGPRINT(RT_DEBUG_TRACE,("Query::RT_OID_802_11_SNR_1(0x=%lx)\n",ulInfo));
4799 }
4800 else
4801 Status = -EFAULT;
4802 DBGPRINT(RT_DEBUG_TRACE,("Query::RT_OID_802_11_SNR_1(pAd->StaCfg.LastSNR1=%d)\n",pAd->StaCfg.LastSNR1));
4803 break;
4804 case OID_802_11_RSSI_TRIGGER:
4805 ulInfo = pAd->StaCfg.RssiSample.LastRssi0 - pAd->BbpRssiToDbmDelta;
4806 wrq->u.data.length = sizeof(ulInfo);
4807 Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
4808 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_RSSI_TRIGGER(=%ld)\n", ulInfo));
4809 break;
4810 case OID_802_11_RSSI:
4811 case RT_OID_802_11_RSSI:
4812 ulInfo = pAd->StaCfg.RssiSample.LastRssi0;
4813 wrq->u.data.length = sizeof(ulInfo);
4814 Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
4815 break;
4816 case RT_OID_802_11_RSSI_1:
4817 ulInfo = pAd->StaCfg.RssiSample.LastRssi1;
4818 wrq->u.data.length = sizeof(ulInfo);
4819 Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
4820 break;
4821 case RT_OID_802_11_RSSI_2:
4822 ulInfo = pAd->StaCfg.RssiSample.LastRssi2;
4823 wrq->u.data.length = sizeof(ulInfo);
4824 Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
4825 break;
4826 case OID_802_11_STATISTICS:
4827 pStatistics = (NDIS_802_11_STATISTICS *) kmalloc(sizeof(NDIS_802_11_STATISTICS), MEM_ALLOC_FLAG);
4828 if (pStatistics)
4829 {
4830 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_STATISTICS \n"));
4831 // add the most up-to-date h/w raw counters into software counters
4832 NICUpdateRawCounters(pAd);
4833
4834 // Sanity check for calculation of sucessful count
4835 if (pAd->WlanCounters.TransmittedFragmentCount.QuadPart < pAd->WlanCounters.RetryCount.QuadPart)
4836 pAd->WlanCounters.TransmittedFragmentCount.QuadPart = pAd->WlanCounters.RetryCount.QuadPart;
4837
4838 pStatistics->TransmittedFragmentCount.QuadPart = pAd->WlanCounters.TransmittedFragmentCount.QuadPart;
4839 pStatistics->MulticastTransmittedFrameCount.QuadPart = pAd->WlanCounters.MulticastTransmittedFrameCount.QuadPart;
4840 pStatistics->FailedCount.QuadPart = pAd->WlanCounters.FailedCount.QuadPart;
4841 pStatistics->RetryCount.QuadPart = pAd->WlanCounters.RetryCount.QuadPart;
4842 pStatistics->MultipleRetryCount.QuadPart = pAd->WlanCounters.MultipleRetryCount.QuadPart;
4843 pStatistics->RTSSuccessCount.QuadPart = pAd->WlanCounters.RTSSuccessCount.QuadPart;
4844 pStatistics->RTSFailureCount.QuadPart = pAd->WlanCounters.RTSFailureCount.QuadPart;
4845 pStatistics->ACKFailureCount.QuadPart = pAd->WlanCounters.ACKFailureCount.QuadPart;
4846 pStatistics->FrameDuplicateCount.QuadPart = pAd->WlanCounters.FrameDuplicateCount.QuadPart;
4847 pStatistics->ReceivedFragmentCount.QuadPart = pAd->WlanCounters.ReceivedFragmentCount.QuadPart;
4848 pStatistics->MulticastReceivedFrameCount.QuadPart = pAd->WlanCounters.MulticastReceivedFrameCount.QuadPart;
4849#ifdef DBG
4850 pStatistics->FCSErrorCount = pAd->RalinkCounters.RealFcsErrCount;
4851#else
4852 pStatistics->FCSErrorCount.QuadPart = pAd->WlanCounters.FCSErrorCount.QuadPart;
4853 pStatistics->FrameDuplicateCount.u.LowPart = pAd->WlanCounters.FrameDuplicateCount.u.LowPart / 100;
4854#endif
4855 wrq->u.data.length = sizeof(NDIS_802_11_STATISTICS);
4856 Status = copy_to_user(wrq->u.data.pointer, pStatistics, wrq->u.data.length);
4857 kfree(pStatistics);
4858 }
4859 else
4860 {
4861 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_STATISTICS(kmalloc failed)\n"));
4862 Status = -EFAULT;
4863 }
4864 break;
4865 case OID_GEN_RCV_OK:
4866 ulInfo = pAd->Counters8023.GoodReceives;
4867 wrq->u.data.length = sizeof(ulInfo);
4868 Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
4869 break;
4870 case OID_GEN_RCV_NO_BUFFER:
4871 ulInfo = pAd->Counters8023.RxNoBuffer;
4872 wrq->u.data.length = sizeof(ulInfo);
4873 Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
4874 break;
4875 case RT_OID_802_11_PHY_MODE:
4876 ulInfo = (ULONG)pAd->CommonCfg.PhyMode;
4877 wrq->u.data.length = sizeof(ulInfo);
4878 Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
4879 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_PHY_MODE (=%ld)\n", ulInfo));
4880 break;
4881 case RT_OID_802_11_STA_CONFIG:
4882 pStaConfig = (RT_802_11_STA_CONFIG *) kmalloc(sizeof(RT_802_11_STA_CONFIG), MEM_ALLOC_FLAG);
4883 if (pStaConfig)
4884 {
4885 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_STA_CONFIG\n"));
4886 pStaConfig->EnableTxBurst = pAd->CommonCfg.bEnableTxBurst;
4887 pStaConfig->EnableTurboRate = 0;
4888 pStaConfig->UseBGProtection = pAd->CommonCfg.UseBGProtection;
4889 pStaConfig->UseShortSlotTime = pAd->CommonCfg.bUseShortSlotTime;
4890 //pStaConfig->AdhocMode = pAd->StaCfg.AdhocMode;
4891 pStaConfig->HwRadioStatus = (pAd->StaCfg.bHwRadio == TRUE) ? 1 : 0;
4892 pStaConfig->Rsv1 = 0;
4893 pStaConfig->SystemErrorBitmap = pAd->SystemErrorBitmap;
4894 wrq->u.data.length = sizeof(RT_802_11_STA_CONFIG);
4895 Status = copy_to_user(wrq->u.data.pointer, pStaConfig, wrq->u.data.length);
4896 kfree(pStaConfig);
4897 }
4898 else
4899 {
4900 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_STA_CONFIG(kmalloc failed)\n"));
4901 Status = -EFAULT;
4902 }
4903 break;
4904 case OID_802_11_RTS_THRESHOLD:
4905 RtsThresh = pAd->CommonCfg.RtsThreshold;
4906 wrq->u.data.length = sizeof(RtsThresh);
4907 Status = copy_to_user(wrq->u.data.pointer, &RtsThresh, wrq->u.data.length);
4908 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_RTS_THRESHOLD(=%ld)\n", RtsThresh));
4909 break;
4910 case OID_802_11_FRAGMENTATION_THRESHOLD:
4911 FragThresh = pAd->CommonCfg.FragmentThreshold;
4912 if (pAd->CommonCfg.bUseZeroToDisableFragment == TRUE)
4913 FragThresh = 0;
4914 wrq->u.data.length = sizeof(FragThresh);
4915 Status = copy_to_user(wrq->u.data.pointer, &FragThresh, wrq->u.data.length);
4916 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_FRAGMENTATION_THRESHOLD(=%ld)\n", FragThresh));
4917 break;
4918 case OID_802_11_POWER_MODE:
4919 PowerMode = pAd->StaCfg.WindowsPowerMode;
4920 wrq->u.data.length = sizeof(PowerMode);
4921 Status = copy_to_user(wrq->u.data.pointer, &PowerMode, wrq->u.data.length);
4922 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_POWER_MODE(=%d)\n", PowerMode));
4923 break;
4924 case RT_OID_802_11_RADIO:
4925 RadioState = (BOOLEAN) pAd->StaCfg.bSwRadio;
4926 wrq->u.data.length = sizeof(RadioState);
4927 Status = copy_to_user(wrq->u.data.pointer, &RadioState, wrq->u.data.length);
4928 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_RADIO (=%d)\n", RadioState));
4929 break;
4930 case OID_802_11_INFRASTRUCTURE_MODE:
4931 if (pAd->StaCfg.BssType == BSS_ADHOC)
4932 BssType = Ndis802_11IBSS;
4933 else if (pAd->StaCfg.BssType == BSS_INFRA)
4934 BssType = Ndis802_11Infrastructure;
4935 else if (pAd->StaCfg.BssType == BSS_MONITOR)
4936 BssType = Ndis802_11Monitor;
4937 else
4938 BssType = Ndis802_11AutoUnknown;
4939
4940 wrq->u.data.length = sizeof(BssType);
4941 Status = copy_to_user(wrq->u.data.pointer, &BssType, wrq->u.data.length);
4942 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_INFRASTRUCTURE_MODE(=%d)\n", BssType));
4943 break;
4944 case RT_OID_802_11_PREAMBLE:
4945 PreamType = pAd->CommonCfg.TxPreamble;
4946 wrq->u.data.length = sizeof(PreamType);
4947 Status = copy_to_user(wrq->u.data.pointer, &PreamType, wrq->u.data.length);
4948 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_PREAMBLE(=%d)\n", PreamType));
4949 break;
4950 case OID_802_11_AUTHENTICATION_MODE:
4951 AuthMode = pAd->StaCfg.AuthMode;
4952 wrq->u.data.length = sizeof(AuthMode);
4953 Status = copy_to_user(wrq->u.data.pointer, &AuthMode, wrq->u.data.length);
4954 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_AUTHENTICATION_MODE(=%d)\n", AuthMode));
4955 break;
4956 case OID_802_11_WEP_STATUS:
4957 WepStatus = pAd->StaCfg.WepStatus;
4958 wrq->u.data.length = sizeof(WepStatus);
4959 Status = copy_to_user(wrq->u.data.pointer, &WepStatus, wrq->u.data.length);
4960 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_WEP_STATUS(=%d)\n", WepStatus));
4961 break;
4962 case OID_802_11_TX_POWER_LEVEL:
4963 wrq->u.data.length = sizeof(ULONG);
4964 Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.TxPower, wrq->u.data.length);
4965 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_TX_POWER_LEVEL %x\n",pAd->CommonCfg.TxPower));
4966 break;
4967 case RT_OID_802_11_TX_POWER_LEVEL_1:
4968 wrq->u.data.length = sizeof(ULONG);
4969 Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.TxPowerPercentage, wrq->u.data.length);
4970 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_TX_POWER_LEVEL_1 (=%ld)\n", pAd->CommonCfg.TxPowerPercentage));
4971 break;
4972 case OID_802_11_NETWORK_TYPES_SUPPORTED:
4973 if ((pAd->RfIcType == RFIC_2850) || (pAd->RfIcType == RFIC_2750) || (pAd->RfIcType == RFIC_3052))
4974 {
4975 NetworkTypeList[0] = 3; // NumberOfItems = 3
4976 NetworkTypeList[1] = Ndis802_11DS; // NetworkType[1] = 11b
4977 NetworkTypeList[2] = Ndis802_11OFDM24; // NetworkType[2] = 11g
4978 NetworkTypeList[3] = Ndis802_11OFDM5; // NetworkType[3] = 11a
4979 wrq->u.data.length = 16;
4980 Status = copy_to_user(wrq->u.data.pointer, &NetworkTypeList[0], wrq->u.data.length);
4981 }
4982 else
4983 {
4984 NetworkTypeList[0] = 2; // NumberOfItems = 2
4985 NetworkTypeList[1] = Ndis802_11DS; // NetworkType[1] = 11b
4986 NetworkTypeList[2] = Ndis802_11OFDM24; // NetworkType[2] = 11g
4987 wrq->u.data.length = 12;
4988 Status = copy_to_user(wrq->u.data.pointer, &NetworkTypeList[0], wrq->u.data.length);
4989 }
4990 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_NETWORK_TYPES_SUPPORTED\n"));
4991 break;
4992 case OID_802_11_NETWORK_TYPE_IN_USE:
4993 wrq->u.data.length = sizeof(ULONG);
4994 if (pAd->CommonCfg.PhyMode == PHY_11A)
4995 ulInfo = Ndis802_11OFDM5;
4996 else if ((pAd->CommonCfg.PhyMode == PHY_11BG_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11G))
4997 ulInfo = Ndis802_11OFDM24;
4998 else
4999 ulInfo = Ndis802_11DS;
5000 Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
5001 break;
5002 case RT_OID_802_11_QUERY_LAST_RX_RATE:
5003 ulInfo = (ULONG)pAd->LastRxRate;
5004 wrq->u.data.length = sizeof(ulInfo);
5005 Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
5006 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_LAST_RX_RATE (=%ld)\n", ulInfo));
5007 break;
5008 case RT_OID_802_11_QUERY_LAST_TX_RATE:
5009 //ulInfo = (ULONG)pAd->LastTxRate;
5010 ulInfo = (ULONG)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word;
5011 wrq->u.data.length = sizeof(ulInfo);
5012 Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
5013 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_LAST_TX_RATE (=%lx)\n", ulInfo));
5014 break;
5015 case RT_OID_802_11_QUERY_EEPROM_VERSION:
5016 wrq->u.data.length = sizeof(ULONG);
5017 Status = copy_to_user(wrq->u.data.pointer, &pAd->EepromVersion, wrq->u.data.length);
5018 break;
5019 case RT_OID_802_11_QUERY_FIRMWARE_VERSION:
5020 wrq->u.data.length = sizeof(ULONG);
5021 Status = copy_to_user(wrq->u.data.pointer, &pAd->FirmwareVersion, wrq->u.data.length);
5022 break;
5023 case RT_OID_802_11_QUERY_NOISE_LEVEL:
5024 wrq->u.data.length = sizeof(UCHAR);
5025 Status = copy_to_user(wrq->u.data.pointer, &pAd->BbpWriteLatch[66], wrq->u.data.length);
5026 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_NOISE_LEVEL (=%d)\n", pAd->BbpWriteLatch[66]));
5027 break;
5028 case RT_OID_802_11_EXTRA_INFO:
5029 wrq->u.data.length = sizeof(ULONG);
5030 Status = copy_to_user(wrq->u.data.pointer, &pAd->ExtraInfo, wrq->u.data.length);
5031 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_EXTRA_INFO (=%ld)\n", pAd->ExtraInfo));
5032 break;
5033 case RT_OID_WE_VERSION_COMPILED:
5034 wrq->u.data.length = sizeof(UINT);
5035 we_version_compiled = WIRELESS_EXT;
5036 Status = copy_to_user(wrq->u.data.pointer, &we_version_compiled, wrq->u.data.length);
5037 break;
5038 case RT_OID_802_11_QUERY_APSD_SETTING:
5039 apsd = (pAd->CommonCfg.bAPSDCapable | (pAd->CommonCfg.bAPSDAC_BE << 1) | (pAd->CommonCfg.bAPSDAC_BK << 2)
5040 | (pAd->CommonCfg.bAPSDAC_VI << 3) | (pAd->CommonCfg.bAPSDAC_VO << 4) | (pAd->CommonCfg.MaxSPLength << 5));
5041
5042 wrq->u.data.length = sizeof(ULONG);
5043 Status = copy_to_user(wrq->u.data.pointer, &apsd, wrq->u.data.length);
5044 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_APSD_SETTING (=0x%lx,APSDCap=%d,AC_BE=%d,AC_BK=%d,AC_VI=%d,AC_VO=%d,MAXSPLen=%d)\n",
5045 apsd,pAd->CommonCfg.bAPSDCapable,pAd->CommonCfg.bAPSDAC_BE,pAd->CommonCfg.bAPSDAC_BK,pAd->CommonCfg.bAPSDAC_VI,pAd->CommonCfg.bAPSDAC_VO,pAd->CommonCfg.MaxSPLength));
5046 break;
5047 case RT_OID_802_11_QUERY_APSD_PSM:
5048 wrq->u.data.length = sizeof(ULONG);
5049 Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.bAPSDForcePowerSave, wrq->u.data.length);
5050 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_APSD_PSM (=%d)\n", pAd->CommonCfg.bAPSDForcePowerSave));
5051 break;
5052 case RT_OID_802_11_QUERY_WMM:
5053 wrq->u.data.length = sizeof(BOOLEAN);
5054 Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.bWmmCapable, wrq->u.data.length);
5055 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_WMM (=%d)\n", pAd->CommonCfg.bWmmCapable));
5056 break;
5057#ifdef WPA_SUPPLICANT_SUPPORT
5058 case RT_OID_NEW_DRIVER:
5059 {
5060 UCHAR enabled = 1;
5061 wrq->u.data.length = sizeof(UCHAR);
5062 Status = copy_to_user(wrq->u.data.pointer, &enabled, wrq->u.data.length);
5063 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_NEW_DRIVER (=%d)\n", enabled));
5064 }
5065 break;
5066 case RT_OID_WPA_SUPPLICANT_SUPPORT:
5067 wrq->u.data.length = sizeof(UCHAR);
5068 Status = copy_to_user(wrq->u.data.pointer, &pAd->StaCfg.WpaSupplicantUP, wrq->u.data.length);
5069 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_WPA_SUPPLICANT_SUPPORT (=%d)\n", pAd->StaCfg.WpaSupplicantUP));
5070 break;
5071#endif // WPA_SUPPLICANT_SUPPORT //
5072
5073 case RT_OID_DRIVER_DEVICE_NAME:
5074 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_DRIVER_DEVICE_NAME \n"));
5075 wrq->u.data.length = 16;
5076 if (copy_to_user(wrq->u.data.pointer, pAd->StaCfg.dev_name, wrq->u.data.length))
5077 {
5078 Status = -EFAULT;
5079 }
5080 break;
5081 case RT_OID_802_11_QUERY_HT_PHYMODE:
5082 pHTPhyMode = (OID_SET_HT_PHYMODE *) kmalloc(sizeof(OID_SET_HT_PHYMODE), MEM_ALLOC_FLAG);
5083 if (pHTPhyMode)
5084 {
5085 pHTPhyMode->PhyMode = pAd->CommonCfg.PhyMode;
5086 pHTPhyMode->HtMode = (UCHAR)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE;
5087 pHTPhyMode->BW = (UCHAR)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.BW;
5088 pHTPhyMode->MCS= (UCHAR)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MCS;
5089 pHTPhyMode->SHORTGI= (UCHAR)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.ShortGI;
5090 pHTPhyMode->STBC= (UCHAR)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.STBC;
5091
5092 pHTPhyMode->ExtOffset = ((pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel) ? (EXTCHA_BELOW) : (EXTCHA_ABOVE));
5093 wrq->u.data.length = sizeof(OID_SET_HT_PHYMODE);
5094 if (copy_to_user(wrq->u.data.pointer, pHTPhyMode, wrq->u.data.length))
5095 {
5096 Status = -EFAULT;
5097 }
5098 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_HT_PHYMODE (PhyMode = %d, MCS =%d, BW = %d, STBC = %d, ExtOffset=%d)\n",
5099 pHTPhyMode->HtMode, pHTPhyMode->MCS, pHTPhyMode->BW, pHTPhyMode->STBC, pHTPhyMode->ExtOffset));
5100 DBGPRINT(RT_DEBUG_TRACE, (" MlmeUpdateTxRates (.word = %x )\n", pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word));
5101 }
5102 else
5103 {
5104 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_STA_CONFIG(kmalloc failed)\n"));
5105 Status = -EFAULT;
5106 }
5107 break;
5108 case RT_OID_802_11_COUNTRY_REGION:
5109 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_COUNTRY_REGION \n"));
5110 wrq->u.data.length = sizeof(ulInfo);
5111 ulInfo = pAd->CommonCfg.CountryRegionForABand;
5112 ulInfo = (ulInfo << 8)|(pAd->CommonCfg.CountryRegion);
5113 if (copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length))
5114 {
5115 Status = -EFAULT;
5116 }
5117 break;
5118 case RT_OID_802_11_QUERY_DAT_HT_PHYMODE:
5119 pHTPhyMode = (OID_SET_HT_PHYMODE *) kmalloc(sizeof(OID_SET_HT_PHYMODE), MEM_ALLOC_FLAG);
5120 if (pHTPhyMode)
5121 {
5122 pHTPhyMode->PhyMode = pAd->CommonCfg.PhyMode;
5123 pHTPhyMode->HtMode = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.HTMODE;
5124 pHTPhyMode->BW = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.BW;
5125 pHTPhyMode->MCS= (UCHAR)pAd->StaCfg.DesiredTransmitSetting.field.MCS;
5126 pHTPhyMode->SHORTGI= (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.ShortGI;
5127 pHTPhyMode->STBC= (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.STBC;
5128
5129 wrq->u.data.length = sizeof(OID_SET_HT_PHYMODE);
5130 if (copy_to_user(wrq->u.data.pointer, pHTPhyMode, wrq->u.data.length))
5131 {
5132 Status = -EFAULT;
5133 }
5134 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_HT_PHYMODE (PhyMode = %d, MCS =%d, BW = %d, STBC = %d, ExtOffset=%d)\n",
5135 pHTPhyMode->HtMode, pHTPhyMode->MCS, pHTPhyMode->BW, pHTPhyMode->STBC, pHTPhyMode->ExtOffset));
5136 DBGPRINT(RT_DEBUG_TRACE, (" MlmeUpdateTxRates (.word = %x )\n", pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word));
5137 }
5138 else
5139 {
5140 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_STA_CONFIG(kmalloc failed)\n"));
5141 Status = -EFAULT;
5142 }
5143 break;
5144 case RT_OID_QUERY_MULTIPLE_CARD_SUPPORT:
5145 wrq->u.data.length = sizeof(UCHAR);
5146 i = 0;
5147#ifdef MULTIPLE_CARD_SUPPORT
5148 i = 1;
5149#endif // MULTIPLE_CARD_SUPPORT //
5150 if (copy_to_user(wrq->u.data.pointer, &i, wrq->u.data.length))
5151 {
5152 Status = -EFAULT;
5153 }
5154 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_QUERY_MULTIPLE_CARD_SUPPORT(=%d) \n", i));
5155 break;
5156#ifdef SNMP_SUPPORT
5157 case RT_OID_802_11_MAC_ADDRESS:
5158 wrq->u.data.length = MAC_ADDR_LEN;
5159 Status = copy_to_user(wrq->u.data.pointer, &pAd->CurrentAddress, wrq->u.data.length);
5160 break;
5161
5162 case RT_OID_802_11_MANUFACTUREROUI:
5163 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_MANUFACTUREROUI \n"));
5164 wrq->u.data.length = ManufacturerOUI_LEN;
5165 Status = copy_to_user(wrq->u.data.pointer, &pAd->CurrentAddress, wrq->u.data.length);
5166 break;
5167
5168 case RT_OID_802_11_MANUFACTURERNAME:
5169 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_MANUFACTURERNAME \n"));
5170 wrq->u.data.length = strlen(ManufacturerNAME);
5171 Status = copy_to_user(wrq->u.data.pointer, ManufacturerNAME, wrq->u.data.length);
5172 break;
5173
5174 case RT_OID_802_11_RESOURCETYPEIDNAME:
5175 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_RESOURCETYPEIDNAME \n"));
5176 wrq->u.data.length = strlen(ResourceTypeIdName);
5177 Status = copy_to_user(wrq->u.data.pointer, ResourceTypeIdName, wrq->u.data.length);
5178 break;
5179
5180 case RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED:
5181 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED \n"));
5182 ulInfo = 1; // 1 is support wep else 2 is not support.
5183 wrq->u.data.length = sizeof(ulInfo);
5184 Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
5185 break;
5186
5187 case RT_OID_802_11_POWERMANAGEMENTMODE:
5188 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_POWERMANAGEMENTMODE \n"));
5189 if (pAd->StaCfg.Psm == PSMP_ACTION)
5190 ulInfo = 1; // 1 is power active else 2 is power save.
5191 else
5192 ulInfo = 2;
5193
5194 wrq->u.data.length = sizeof(ulInfo);
5195 Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
5196 break;
5197
5198 case OID_802_11_WEPDEFAULTKEYVALUE:
5199 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_WEPDEFAULTKEYVALUE \n"));
5200 //KeyIdxValue.KeyIdx = pAd->PortCfg.MBSSID[pAd->IoctlIF].DefaultKeyId;
5201 pKeyIdxValue = wrq->u.data.pointer;
5202 DBGPRINT(RT_DEBUG_TRACE,("KeyIdxValue.KeyIdx = %d, \n",pKeyIdxValue->KeyIdx));
5203 valueLen = pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen;
5204 NdisMoveMemory(pKeyIdxValue->Value,
5205 &pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].Key,
5206 valueLen);
5207 pKeyIdxValue->Value[valueLen]='\0';
5208
5209 wrq->u.data.length = sizeof(DefaultKeyIdxValue);
5210
5211 Status = copy_to_user(wrq->u.data.pointer, pKeyIdxValue, wrq->u.data.length);
5212 DBGPRINT(RT_DEBUG_TRACE,("DefaultKeyId = %d, total len = %d, str len=%d, KeyValue= %02x %02x %02x %02x \n",
5213 pAd->StaCfg.DefaultKeyId,
5214 wrq->u.data.length,
5215 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen,
5216 pAd->SharedKey[BSS0][0].Key[0],
5217 pAd->SharedKey[BSS0][1].Key[0],
5218 pAd->SharedKey[BSS0][2].Key[0],
5219 pAd->SharedKey[BSS0][3].Key[0]));
5220 break;
5221
5222 case OID_802_11_WEPDEFAULTKEYID:
5223 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_WEPDEFAULTKEYID \n"));
5224 wrq->u.data.length = sizeof(UCHAR);
5225 Status = copy_to_user(wrq->u.data.pointer, &pAd->StaCfg.DefaultKeyId, wrq->u.data.length);
5226 DBGPRINT(RT_DEBUG_TRACE, ("DefaultKeyId =%d \n", pAd->StaCfg.DefaultKeyId));
5227 break;
5228
5229 case RT_OID_802_11_WEPKEYMAPPINGLENGTH:
5230 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_WEPKEYMAPPINGLENGTH \n"));
5231 wrq->u.data.length = sizeof(UCHAR);
5232 Status = copy_to_user(wrq->u.data.pointer,
5233 &pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen,
5234 wrq->u.data.length);
5235 break;
5236
5237 case OID_802_11_SHORTRETRYLIMIT:
5238 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_SHORTRETRYLIMIT \n"));
5239 wrq->u.data.length = sizeof(ULONG);
5240 RTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word);
5241 ShortRetryLimit = tx_rty_cfg.field.ShortRtyLimit;
5242 DBGPRINT(RT_DEBUG_TRACE, ("ShortRetryLimit =%ld, tx_rty_cfg.field.ShortRetryLimit=%d\n", ShortRetryLimit, tx_rty_cfg.field.ShortRtyLimit));
5243 Status = copy_to_user(wrq->u.data.pointer, &ShortRetryLimit, wrq->u.data.length);
5244 break;
5245
5246 case OID_802_11_LONGRETRYLIMIT:
5247 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_LONGRETRYLIMIT \n"));
5248 wrq->u.data.length = sizeof(ULONG);
5249 RTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word);
5250 LongRetryLimit = tx_rty_cfg.field.LongRtyLimit;
5251 DBGPRINT(RT_DEBUG_TRACE, ("LongRetryLimit =%ld, tx_rty_cfg.field.LongRtyLimit=%d\n", LongRetryLimit, tx_rty_cfg.field.LongRtyLimit));
5252 Status = copy_to_user(wrq->u.data.pointer, &LongRetryLimit, wrq->u.data.length);
5253 break;
5254
5255 case RT_OID_802_11_PRODUCTID:
5256 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_PRODUCTID \n"));
5257
5258#ifdef RTMP_MAC_PCI
5259 {
5260
5261 USHORT device_id;
5262 if (((POS_COOKIE)pAd->OS_Cookie)->pci_dev != NULL)
5263 pci_read_config_word(((POS_COOKIE)pAd->OS_Cookie)->pci_dev, PCI_DEVICE_ID, &device_id);
5264 else
5265 DBGPRINT(RT_DEBUG_TRACE, (" pci_dev = NULL\n"));
5266 sprintf((PSTRING)tmp, "%04x %04x\n", NIC_PCI_VENDOR_ID, device_id);
5267 }
5268#endif // RTMP_MAC_PCI //
5269 wrq->u.data.length = strlen((PSTRING)tmp);
5270 Status = copy_to_user(wrq->u.data.pointer, tmp, wrq->u.data.length);
5271 break;
5272
5273 case RT_OID_802_11_MANUFACTUREID:
5274 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_MANUFACTUREID \n"));
5275 wrq->u.data.length = strlen(ManufacturerNAME);
5276 Status = copy_to_user(wrq->u.data.pointer, ManufacturerNAME, wrq->u.data.length);
5277 break;
5278
5279 case OID_802_11_CURRENTCHANNEL:
5280 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_CURRENTCHANNEL \n"));
5281 wrq->u.data.length = sizeof(UCHAR);
5282 DBGPRINT(RT_DEBUG_TRACE, ("sizeof UCHAR=%d, channel=%d \n", sizeof(UCHAR), pAd->CommonCfg.Channel));
5283 Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.Channel, wrq->u.data.length);
5284 DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status));
5285 break;
5286#endif //SNMP_SUPPORT
5287
5288 case OID_802_11_BUILD_CHANNEL_EX:
5289 {
5290 UCHAR value;
5291 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BUILD_CHANNEL_EX \n"));
5292 wrq->u.data.length = sizeof(UCHAR);
5293#ifdef EXT_BUILD_CHANNEL_LIST
5294 DBGPRINT(RT_DEBUG_TRACE, ("Support EXT_BUILD_CHANNEL_LIST.\n"));
5295 value = 1;
5296#else
5297 DBGPRINT(RT_DEBUG_TRACE, ("Doesn't support EXT_BUILD_CHANNEL_LIST.\n"));
5298 value = 0;
5299#endif // EXT_BUILD_CHANNEL_LIST //
5300 Status = copy_to_user(wrq->u.data.pointer, &value, 1);
5301 DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status));
5302 }
5303 break;
5304
5305 case OID_802_11_GET_CH_LIST:
5306 {
5307 PRT_CHANNEL_LIST_INFO pChListBuf;
5308
5309 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_GET_CH_LIST \n"));
5310 if (pAd->ChannelListNum == 0)
5311 {
5312 wrq->u.data.length = 0;
5313 break;
5314 }
5315
5316 pChListBuf = (RT_CHANNEL_LIST_INFO *) kmalloc(sizeof(RT_CHANNEL_LIST_INFO), MEM_ALLOC_FLAG);
5317 if (pChListBuf == NULL)
5318 {
5319 wrq->u.data.length = 0;
5320 break;
5321 }
5322
5323 pChListBuf->ChannelListNum = pAd->ChannelListNum;
5324 for (i = 0; i < pChListBuf->ChannelListNum; i++)
5325 pChListBuf->ChannelList[i] = pAd->ChannelList[i].Channel;
5326
5327 wrq->u.data.length = sizeof(RT_CHANNEL_LIST_INFO);
5328 Status = copy_to_user(wrq->u.data.pointer, pChListBuf, sizeof(RT_CHANNEL_LIST_INFO));
5329 DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status));
5330
5331 if (pChListBuf)
5332 kfree(pChListBuf);
5333 }
5334 break;
5335
5336 case OID_802_11_GET_COUNTRY_CODE:
5337 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_GET_COUNTRY_CODE \n"));
5338 wrq->u.data.length = 2;
5339 Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.CountryCode, 2);
5340 DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status));
5341 break;
5342
5343 case OID_802_11_GET_CHANNEL_GEOGRAPHY:
5344 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_GET_CHANNEL_GEOGRAPHY \n"));
5345 wrq->u.data.length = 1;
5346 Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.Geography, 1);
5347 DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status));
5348 break;
5349
5350
5351#ifdef QOS_DLS_SUPPORT
5352 case RT_OID_802_11_QUERY_DLS:
5353 wrq->u.data.length = sizeof(BOOLEAN);
5354 Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.bDLSCapable, wrq->u.data.length);
5355 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_DLS(=%d)\n", pAd->CommonCfg.bDLSCapable));
5356 break;
5357
5358 case RT_OID_802_11_QUERY_DLS_PARAM:
5359 {
5360 PRT_802_11_DLS_INFO pDlsInfo = kmalloc(sizeof(RT_802_11_DLS_INFO), GFP_ATOMIC);
5361 if (pDlsInfo == NULL)
5362 break;
5363
5364 for (i=0; i<MAX_NUM_OF_DLS_ENTRY; i++)
5365 {
5366 RTMPMoveMemory(&pDlsInfo->Entry[i], &pAd->StaCfg.DLSEntry[i], sizeof(RT_802_11_DLS_UI));
5367 }
5368
5369 pDlsInfo->num = MAX_NUM_OF_DLS_ENTRY;
5370 wrq->u.data.length = sizeof(RT_802_11_DLS_INFO);
5371 Status = copy_to_user(wrq->u.data.pointer, pDlsInfo, wrq->u.data.length);
5372 DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_DLS_PARAM\n"));
5373
5374 if (pDlsInfo)
5375 kfree(pDlsInfo);
5376 }
5377 break;
5378#endif // QOS_DLS_SUPPORT //
5379
5380 case OID_802_11_SET_PSPXLINK_MODE:
5381 wrq->u.data.length = sizeof(BOOLEAN);
5382 Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.PSPXlink, wrq->u.data.length);
5383 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_SET_PSPXLINK_MODE(=%d)\n", pAd->CommonCfg.PSPXlink));
5384 break;
5385
5386
5387 default:
5388 DBGPRINT(RT_DEBUG_TRACE, ("Query::unknown IOCTL's subcmd = 0x%08x\n", cmd));
5389 Status = -EOPNOTSUPP;
5390 break;
5391 }
5392 return Status;
5393}
5394
5395INT rt28xx_sta_ioctl( 3122INT rt28xx_sta_ioctl(
5396 IN struct net_device *net_dev, 3123 IN struct net_device *net_dev,
5397 IN OUT struct ifreq *rq, 3124 IN OUT struct ifreq *rq,
@@ -5402,8 +3129,6 @@ INT rt28xx_sta_ioctl(
5402 struct iwreq *wrq = (struct iwreq *) rq; 3129 struct iwreq *wrq = (struct iwreq *) rq;
5403 BOOLEAN StateMachineTouched = FALSE; 3130 BOOLEAN StateMachineTouched = FALSE;
5404 INT Status = NDIS_STATUS_SUCCESS; 3131 INT Status = NDIS_STATUS_SUCCESS;
5405 USHORT subcmd;
5406
5407 3132
5408 pAd = RTMP_OS_NETDEV_GET_PRIV(net_dev); 3133 pAd = RTMP_OS_NETDEV_GET_PRIV(net_dev);
5409 if (pAd == NULL) 3134 if (pAd == NULL)
@@ -5576,15 +3301,9 @@ INT rt28xx_sta_ioctl(
5576 case SIOCGIWRANGE: //Get range of parameters 3301 case SIOCGIWRANGE: //Get range of parameters
5577 case SIOCGIWRETRY: //get retry limits and lifetime 3302 case SIOCGIWRETRY: //get retry limits and lifetime
5578 case SIOCSIWRETRY: //set retry limits and lifetime 3303 case SIOCSIWRETRY: //set retry limits and lifetime
5579 Status = -EOPNOTSUPP;
5580 break;
5581 case RT_PRIV_IOCTL: 3304 case RT_PRIV_IOCTL:
5582 case RT_PRIV_IOCTL_EXT: 3305 case RT_PRIV_IOCTL_EXT:
5583 subcmd = wrq->u.data.flags; 3306 Status = -EOPNOTSUPP;
5584 if( subcmd & OID_GET_SET_TOGGLE)
5585 Status = RTMPSetInformation(pAd, rq, subcmd);
5586 else
5587 Status = RTMPQueryInformation(pAd, rq, subcmd);
5588 break; 3307 break;
5589 case SIOCGIWPRIV: 3308 case SIOCGIWPRIV:
5590 if (wrq->u.data.pointer) 3309 if (wrq->u.data.pointer)