static int r8192_wx_set_wap(struct net_device *dev, struct iw_request_info *info, union iwreq_data *awrq, char *extra) { int ret; struct r8192_priv *priv = rtllib_priv(dev); if ((rtllib_act_scanning(priv->rtllib, false)) && !(priv->rtllib->softmac_features & IEEE_SOFTMAC_SCAN)) { ; /* TODO - get rid of if */ } if (priv->bHwRadioOff == true) return 0; down(&priv->wx_sem); ret = rtllib_wx_set_wap(priv->rtllib, info, awrq, extra); up(&priv->wx_sem); return ret; }
extern void PHY_RF6052SetCckTxPower(struct net_device* dev, u8 powerlevel) { struct r8192_priv *priv = rtllib_priv(dev); u32 TxAGC=0; bool dontIncCCKOrTurboScanOff=false; if (((priv->eeprom_version >= 2) && (priv->TxPwrSafetyFlag == 1)) || ((priv->eeprom_version >= 2) && (priv->EEPROMRegulatory != 0))) { dontIncCCKOrTurboScanOff = true; } if(rtllib_act_scanning(priv->rtllib,true) == true){ TxAGC = 0x3f; if(dontIncCCKOrTurboScanOff ) TxAGC = powerlevel; } else { TxAGC = powerlevel; if(priv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1) TxAGC = 0x10; else if(priv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2) TxAGC = 0x0; } if(TxAGC > RF6052_MAX_TX_PWR) TxAGC = RF6052_MAX_TX_PWR; rtl8192_setBBreg(dev, rTxAGC_CCK_Mcs32, bTxAGCRateCCK, TxAGC); } /* PHY_RF6052SetCckTxPower */
static int r8192_wx_set_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { struct r8192_priv *priv = rtllib_priv(dev); int ret; if ((rtllib_act_scanning(priv->rtllib, false)) && !(priv->rtllib->softmac_features & IEEE_SOFTMAC_SCAN)) { ; /* TODO - get rid of if */ } if (priv->bHwRadioOff == true) { printk(KERN_INFO "=========>%s():hw radio off,or Rf state is " "eRfOff, return\n", __func__); return 0; } down(&priv->wx_sem); ret = rtllib_wx_set_essid(priv->rtllib, a, wrqu, b); up(&priv->wx_sem); return ret; }
static void rtllib_tx_query_agg_cap(struct rtllib_device *ieee, struct sk_buff *skb, struct cb_desc *tcb_desc) { struct rt_hi_throughput *pHTInfo = ieee->pHTInfo; struct tx_ts_record *pTxTs = NULL; struct rtllib_hdr_1addr *hdr = (struct rtllib_hdr_1addr *)skb->data; if (rtllib_act_scanning(ieee, false)) return; if (!pHTInfo->bCurrentHTSupport || !pHTInfo->bEnableHT) return; if (!IsQoSDataFrame(skb->data)) return; if (is_multicast_ether_addr(hdr->addr1)) return; if (tcb_desc->bdhcp || ieee->CntAfterLink < 2) return; if (pHTInfo->IOTAction & HT_IOT_ACT_TX_NO_AGGREGATION) return; if (!ieee->GetNmodeSupportBySecCfg(ieee->dev)) return; if (pHTInfo->bCurrentAMPDUEnable) { if (!GetTs(ieee, (struct ts_common_info **)(&pTxTs), hdr->addr1, skb->priority, TX_DIR, true)) { printk(KERN_INFO "%s: can't get TS\n", __func__); return; } if (pTxTs->TxAdmittedBARecord.bValid == false) { if (ieee->wpa_ie_len && (ieee->pairwise_key_type == KEY_TYPE_NA)) { ; } else if (tcb_desc->bdhcp == 1) { ; } else if (!pTxTs->bDisable_AddBa) { TsStartAddBaProcess(ieee, pTxTs); } goto FORCED_AGG_SETTING; } else if (pTxTs->bUsingBa == false) { if (SN_LESS(pTxTs->TxAdmittedBARecord.BaStartSeqCtrl.field.SeqNum, (pTxTs->TxCurSeq+1)%4096)) pTxTs->bUsingBa = true; else goto FORCED_AGG_SETTING; } if (ieee->iw_mode == IW_MODE_INFRA) { tcb_desc->bAMPDUEnable = true; tcb_desc->ampdu_factor = pHTInfo->CurrentAMPDUFactor; tcb_desc->ampdu_density = pHTInfo->CurrentMPDUDensity; } } FORCED_AGG_SETTING: switch (pHTInfo->ForcedAMPDUMode) { case HT_AGG_AUTO: break; case HT_AGG_FORCE_ENABLE: tcb_desc->bAMPDUEnable = true; tcb_desc->ampdu_density = pHTInfo->ForcedMPDUDensity; tcb_desc->ampdu_factor = pHTInfo->ForcedAMPDUFactor; break; case HT_AGG_FORCE_DISABLE: tcb_desc->bAMPDUEnable = false; tcb_desc->ampdu_density = 0; tcb_desc->ampdu_factor = 0; break; } return; }
void rtllib_tx_query_agg_cap(struct rtllib_device* ieee, struct sk_buff* skb, cb_desc* tcb_desc) { PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo; PTX_TS_RECORD pTxTs = NULL; struct rtllib_hdr_1addr* hdr = (struct rtllib_hdr_1addr*)skb->data; if(tcb_desc->bBTTxPacket) return; if(rtllib_act_scanning(ieee,false)) return; if (!pHTInfo->bCurrentHTSupport||!pHTInfo->bEnableHT){ return; } if (!IsQoSDataFrame(skb->data)){ return; } if (is_multicast_ether_addr(hdr->addr1) || is_broadcast_ether_addr(hdr->addr1)){ return; } #ifdef TO_DO_LIST if(pTcb->PacketLength >= 4096) return; if(!Adapter->HalFunc.GetNmodeSupportBySecCfgHandler(Adapter)) return; #endif if(tcb_desc->bdhcp || ieee->CntAfterLink<2){ return; } if(pHTInfo->IOTAction & HT_IOT_ACT_TX_NO_AGGREGATION){ return; } if(!ieee->GetNmodeSupportBySecCfg(ieee->dev)){ return; } if(pHTInfo->bCurrentAMPDUEnable){ if (!GetTs(ieee, (PTS_COMMON_INFO*)(&pTxTs), hdr->addr1, skb->priority, TX_DIR, true)){ printk("%s: can't get TS\n", __func__); return; } if (pTxTs->TxAdmittedBARecord.bValid == false){ if (ieee->wpa_ie_len && (ieee->pairwise_key_type == KEY_TYPE_NA)) { ; } else if (tcb_desc->bdhcp == 1){ ; } else if (!pTxTs->bDisable_AddBa){ TsStartAddBaProcess(ieee, pTxTs); } goto FORCED_AGG_SETTING; } else if (pTxTs->bUsingBa == false) { if (SN_LESS(pTxTs->TxAdmittedBARecord.BaStartSeqCtrl.field.SeqNum, (pTxTs->TxCurSeq+1)%4096)) pTxTs->bUsingBa = true; else goto FORCED_AGG_SETTING; } #ifndef _RTL8192_EXT_PATCH_ #ifndef RTL8192S_WAPI_SUPPORT if (ieee->iw_mode == IW_MODE_INFRA #ifdef ASL || (ieee->iw_mode == IW_MODE_APSTA && ieee->state == RTLLIB_LINKED) #endif ) #endif #endif { tcb_desc->bAMPDUEnable = true; tcb_desc->ampdu_factor = pHTInfo->CurrentAMPDUFactor; tcb_desc->ampdu_density = pHTInfo->CurrentMPDUDensity; } } FORCED_AGG_SETTING: switch(pHTInfo->ForcedAMPDUMode ) { case HT_AGG_AUTO: break; case HT_AGG_FORCE_ENABLE: tcb_desc->bAMPDUEnable = true; tcb_desc->ampdu_density = pHTInfo->ForcedMPDUDensity; tcb_desc->ampdu_factor = pHTInfo->ForcedAMPDUFactor; break; case HT_AGG_FORCE_DISABLE: tcb_desc->bAMPDUEnable = false; tcb_desc->ampdu_density = 0; tcb_desc->ampdu_factor = 0; break; } return; }
static int r8192_wx_set_enc(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *key) { struct r8192_priv *priv = rtllib_priv(dev); int ret; struct rtllib_device *ieee = priv->rtllib; u32 hwkey[4] = {0, 0, 0, 0}; u8 mask = 0xff; u32 key_idx = 0; u8 zero_addr[4][6] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x02}, {0x00, 0x00, 0x00, 0x00, 0x00, 0x03} }; int i; if ((rtllib_act_scanning(priv->rtllib, false)) && !(priv->rtllib->softmac_features & IEEE_SOFTMAC_SCAN)) ; /* TODO - get rid of if */ if (priv->bHwRadioOff == true) return 0; if (!priv->up) return -ENETDOWN; priv->rtllib->wx_set_enc = 1; down(&priv->rtllib->ips_sem); IPSLeave(dev); up(&priv->rtllib->ips_sem); down(&priv->wx_sem); RT_TRACE(COMP_SEC, "Setting SW wep key"); ret = rtllib_wx_set_encode(priv->rtllib, info, wrqu, key); up(&priv->wx_sem); if (wrqu->encoding.flags & IW_ENCODE_DISABLED) { ieee->pairwise_key_type = ieee->group_key_type = KEY_TYPE_NA; CamResetAllEntry(dev); memset(priv->rtllib->swcamtable, 0, sizeof(struct sw_cam_table) * 32); goto end_hw_sec; } if (wrqu->encoding.length != 0) { for (i = 0; i < 4; i++) { hwkey[i] |= key[4*i+0]&mask; if (i == 1 && (4 * i + 1) == wrqu->encoding.length) mask = 0x00; if (i == 3 && (4 * i + 1) == wrqu->encoding.length) mask = 0x00; hwkey[i] |= (key[4 * i + 1] & mask) << 8; hwkey[i] |= (key[4 * i + 2] & mask) << 16; hwkey[i] |= (key[4 * i + 3] & mask) << 24; } #define CONF_WEP40 0x4 #define CONF_WEP104 0x14 switch (wrqu->encoding.flags & IW_ENCODE_INDEX) { case 0: key_idx = ieee->tx_keyidx; break; case 1: key_idx = 0; break; case 2: key_idx = 1; break; case 3: key_idx = 2; break; case 4: key_idx = 3; break; default: break; } if (wrqu->encoding.length == 0x5) { ieee->pairwise_key_type = KEY_TYPE_WEP40; EnableHWSecurityConfig8192(dev); } else if (wrqu->encoding.length == 0xd) { ieee->pairwise_key_type = KEY_TYPE_WEP104; EnableHWSecurityConfig8192(dev); setKey(dev, key_idx, key_idx, KEY_TYPE_WEP104, zero_addr[key_idx], 0, hwkey); set_swcam(dev, key_idx, key_idx, KEY_TYPE_WEP104, zero_addr[key_idx], 0, hwkey, 0); } else { printk(KERN_INFO "wrong type in WEP, not WEP40 and WEP104\n"); } } end_hw_sec: priv->rtllib->wx_set_enc = 0; return ret; }
void SwLedBlink(PLED_8190 pLed) { struct net_device *dev = (struct net_device *)pLed->dev; struct r8192_priv *priv = rtllib_priv(dev); bool bStopBlinking = false; if( pLed->BlinkingLedState == LED_ON ) { SwLedOn(dev, pLed); RT_TRACE(COMP_LED, "Blinktimes (%d): turn on\n", pLed->BlinkTimes); } else { SwLedOff(dev, pLed); RT_TRACE(COMP_LED, "Blinktimes (%d): turn off\n", pLed->BlinkTimes); } pLed->BlinkTimes--; switch(pLed->CurrLedState) { case LED_BLINK_NORMAL: case LED_BLINK_TXRX: case LED_BLINK_RUNTOP: if(pLed->BlinkTimes == 0) { bStopBlinking = true; } break; case LED_SCAN_BLINK: if( (priv->rtllib->state == RTLLIB_LINKED) && (!rtllib_act_scanning(priv->rtllib,true))&& (pLed->BlinkTimes % 2 == 0)) { bStopBlinking = true; } break; case LED_NO_LINK_BLINK: case LED_BLINK_StartToBlink: if( (priv->rtllib->state == RTLLIB_LINKED) && (priv->rtllib->iw_mode == IW_MODE_INFRA)) { bStopBlinking = true; } else if((priv->rtllib->state == RTLLIB_LINKED) && (priv->rtllib->iw_mode == IW_MODE_ADHOC)) { bStopBlinking = true; } else if(pLed->BlinkTimes == 0) { bStopBlinking = true; } break; case LED_BLINK_CAMEO: if((priv->rtllib->state == RTLLIB_LINKED) && (priv->rtllib->iw_mode == IW_MODE_INFRA)) { bStopBlinking = true; } else if((priv->rtllib->state == RTLLIB_LINKED) && (priv->rtllib->iw_mode == IW_MODE_ADHOC) ) { bStopBlinking = true; } break; default: bStopBlinking = true; break; } if(bStopBlinking) { if( priv->rtllib->eRFPowerState != eRfOn ) { SwLedOff(dev, pLed); } else if(pLed->CurrLedState == LED_BLINK_TXRX) { SwLedOff(dev, pLed); } else if(pLed->CurrLedState == LED_BLINK_RUNTOP) { SwLedOff(dev, pLed); } else if( (priv->rtllib->state == RTLLIB_LINKED) && (pLed->bLedOn == false)) { SwLedOn(dev, pLed); } else if( (priv->rtllib->state != RTLLIB_LINKED) && pLed->bLedOn == true) { SwLedOff(dev, pLed); } pLed->BlinkTimes = 0; pLed->bLedBlinkInProgress = false; } else { if( pLed->BlinkingLedState == LED_ON ) pLed->BlinkingLedState = LED_OFF; else pLed->BlinkingLedState = LED_ON; switch( pLed->CurrLedState ) { case LED_BLINK_NORMAL: case LED_BLINK_TXRX: case LED_BLINK_StartToBlink: mod_timer(&(pLed->BlinkTimer), jiffies + MSECS(LED_BLINK_NORMAL_INTERVAL)); break; case LED_BLINK_SLOWLY: mod_timer(&(pLed->BlinkTimer), jiffies + MSECS(LED_BLINK_SLOWLY_INTERVAL)); break; case LED_SCAN_BLINK: case LED_NO_LINK_BLINK: if( pLed->bLedOn ) mod_timer(&(pLed->BlinkTimer), jiffies + MSECS(LED_CM2_BLINK_ON_INTERVAL)); else mod_timer(&(pLed->BlinkTimer), jiffies + MSECS(LED_CM2_BLINK_OFF_INTERVAL)); break; case LED_BLINK_RUNTOP: mod_timer(&(pLed->BlinkTimer),jiffies + MSECS(LED_RunTop_BLINK_INTERVAL)); break; case LED_BLINK_CAMEO: mod_timer(&(pLed->BlinkTimer), jiffies + MSECS(LED_BLINK_SLOWLY_INTERVAL_PORNET)); break; default: RT_TRACE(COMP_ERR, "SwLedCm2Blink(): unexpected state!\n"); mod_timer(&(pLed->BlinkTimer), jiffies + MSECS(LED_BLINK_SLOWLY_INTERVAL)); break; } } }
extern void PHY_RF6052SetCckTxPower( struct net_device* dev, u8* pPowerlevel) { struct r8192_priv *priv = rtllib_priv(dev); u32 TxAGC[2]={0, 0}, tmpval=0; bool TurboScanOff=false; u8 idx1, idx2; u8* ptr; if (priv->EEPROMRegulatory != 0) TurboScanOff = true; if(rtllib_act_scanning(priv->rtllib,true) == true) { TxAGC[RF90_PATH_A] = 0x3f3f3f3f; TxAGC[RF90_PATH_B] = 0x3f3f3f3f; if(TurboScanOff) { for(idx1=RF90_PATH_A; idx1<=RF90_PATH_B; idx1++) { TxAGC[idx1] = pPowerlevel[idx1] | (pPowerlevel[idx1]<<8) | (pPowerlevel[idx1]<<16) | (pPowerlevel[idx1]<<24); } } } else { #ifdef ENABLE_DYNAMIC_TXPOWER if(priv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1) { TxAGC[RF90_PATH_A] = 0x10101010; TxAGC[RF90_PATH_B] = 0x10101010; } else if(priv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1) { TxAGC[RF90_PATH_A] = 0x00000000; TxAGC[RF90_PATH_B] = 0x00000000; } else #endif { for(idx1=RF90_PATH_A; idx1<=RF90_PATH_B; idx1++) { TxAGC[idx1] = pPowerlevel[idx1] | (pPowerlevel[idx1]<<8) | (pPowerlevel[idx1]<<16) | (pPowerlevel[idx1]<<24); } if(priv->EEPROMRegulatory==0) { tmpval = (priv->MCSTxPowerLevelOriginalOffset[0][6]) + (priv->MCSTxPowerLevelOriginalOffset[0][7]<<8); TxAGC[RF90_PATH_A] += tmpval; tmpval = (priv->MCSTxPowerLevelOriginalOffset[0][14]) + (priv->MCSTxPowerLevelOriginalOffset[0][15]<<24); TxAGC[RF90_PATH_B] += tmpval; } } } for(idx1=RF90_PATH_A; idx1<=RF90_PATH_B; idx1++) { ptr = (u8*)(&(TxAGC[idx1])); for(idx2=0; idx2<4; idx2++) { if(*ptr > RF6052_MAX_TX_PWR) *ptr = RF6052_MAX_TX_PWR; ptr++; } } tmpval = TxAGC[RF90_PATH_A]&0xff; PHY_SetBBReg(dev, rTxAGC_A_CCK1_Mcs32, bMaskByte1, tmpval); RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_A_CCK1_Mcs32)); tmpval = TxAGC[RF90_PATH_A]>>8; if(priv->rtllib->mode == WIRELESS_MODE_B) tmpval = tmpval & 0xff00ffff; PHY_SetBBReg(dev, rTxAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval); RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK11_A_CCK2_11)); tmpval = TxAGC[RF90_PATH_B]>>24; PHY_SetBBReg(dev, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, tmpval); RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK11_A_CCK2_11)); tmpval = TxAGC[RF90_PATH_B]&0x00ffffff; PHY_SetBBReg(dev, rTxAGC_B_CCK1_55_Mcs32, 0xffffff00, tmpval); RTPRINT(FPHY, PHY_TXPWR, ("CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n", tmpval, rTxAGC_B_CCK1_55_Mcs32)); } /* PHY_RF6052SetCckTxPower */