static int r8180_wx_set_gen_ie(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { int ret = 0; struct r8180_priv *priv = ieee80211_priv(dev); if (priv->ieee80211->bHwRadioOff) return 0; down(&priv->wx_sem); #if 1 ret = ieee80211_wx_set_gen_ie(priv->ieee80211, extra, wrqu->data.length); #endif up(&priv->wx_sem); return ret; }
void rtl8225z2_rf_set_chan(struct net_device *dev, short ch) { struct r8180_priv *priv = ieee80211_priv(dev); short gset = (priv->ieee80211->state == IEEE80211_LINKED && ieee80211_is_54g(priv->ieee80211->current_network)) || priv->ieee80211->iw_mode == IW_MODE_MONITOR; rtl8225z2_SetTXPowerLevel(dev, ch); write_rtl8225(dev, 0x7, rtl8225_chan[ch]); force_pci_posting(dev); mdelay(10); write_nic_byte(dev,SIFS,0x22);// SIFS: 0x22 if(gset) write_nic_byte(dev,DIFS,20); //DIFS: 20 else write_nic_byte(dev,DIFS,0x24); //DIFS: 36 if(priv->ieee80211->state == IEEE80211_LINKED && ieee80211_is_shortslot(priv->ieee80211->current_network)) write_nic_byte(dev,SLOT,0x9); //SLOT: 9 else write_nic_byte(dev,SLOT,0x14); //SLOT: 20 (0x14) if(gset){ write_nic_byte(dev,EIFS,91 - 20); // EIFS: 91 (0x5B) write_nic_byte(dev,CW_VAL,0x73); //CW VALUE: 0x37 //DMESG("using G net params"); }else{ write_nic_byte(dev,EIFS,91 - 0x24); // EIFS: 91 (0x5B) write_nic_byte(dev,CW_VAL,0xa5); //CW VALUE: 0x37 //DMESG("using B net params"); } }
bool SendTxCommandPacket( struct net_device *dev, void* pData, u32 DataLen ) { bool rtStatus = true; struct r8192_priv *priv = ieee80211_priv(dev); struct sk_buff *skb; cb_desc *tcb_desc; unsigned char *ptr_buf; //bool bLastInitPacket = false; //PlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK); //Get TCB and local buffer from common pool. (It is shared by CmdQ, MgntQ, and USB coalesce DataQ) skb = dev_alloc_skb(USB_HWDESC_HEADER_LEN + DataLen + 4); memcpy((unsigned char *)(skb->cb),&dev,sizeof(dev)); tcb_desc = (cb_desc*)(skb->cb + MAX_DEV_ADDR_SIZE); tcb_desc->queue_index = TXCMD_QUEUE; tcb_desc->bCmdOrInit = DESC_PACKET_TYPE_NORMAL; tcb_desc->bLastIniPkt = 0; skb_reserve(skb, USB_HWDESC_HEADER_LEN); ptr_buf = skb_put(skb, DataLen); memset(ptr_buf,0,DataLen); memcpy(ptr_buf,pData,DataLen); tcb_desc->txbuf_size= (u16)DataLen; if(!priv->ieee80211->check_nic_enough_desc(dev,tcb_desc->queue_index)|| (!skb_queue_empty(&priv->ieee80211->skb_waitQ[tcb_desc->queue_index]))||\ (priv->ieee80211->queue_stop) ) { RT_TRACE(COMP_FIRMWARE,"===================NULL packet==================================> tx full!\n"); skb_queue_tail(&priv->ieee80211->skb_waitQ[tcb_desc->queue_index], skb); } else { priv->ieee80211->softmac_hard_start_xmit(skb,dev); } //PlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK); return rtStatus; }
static int r8180_wx_set_mlme(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { /* printk("====>%s()\n", __func__); */ int ret = 0; struct r8180_priv *priv = ieee80211_priv(dev); if (priv->ieee80211->bHwRadioOff) return 0; down(&priv->wx_sem); #if 1 ret = ieee80211_wx_set_mlme(priv->ieee80211, info, wrqu, extra); #endif up(&priv->wx_sem); return ret; }
static void cs_set_modulation(struct zd_mac *mac, struct zd_ctrlset *cs, struct ieee80211_hdr_4addr *hdr) { struct ieee80211softmac_device *softmac = ieee80211_priv(mac->netdev); u16 ftype = WLAN_FC_GET_TYPE(le16_to_cpu(hdr->frame_ctl)); u8 rate, zd_rate; int is_mgt = (ftype == IEEE80211_FTYPE_MGMT) != 0; int is_multicast = is_multicast_ether_addr(hdr->addr1); int short_preamble = ieee80211softmac_short_preamble_ok(softmac, is_multicast, is_mgt); int flags = 0; /* FIXME: 802.11a? */ rate = ieee80211softmac_suggest_txrate(softmac, is_multicast, is_mgt); if (short_preamble) flags |= R2M_SHORT_PREAMBLE; zd_rate = rate_to_zd_rate(rate); cs->modulation = zd_rate_to_modulation(zd_rate, flags); }
static int r8180_wx_set_frag(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { struct r8180_priv *priv = ieee80211_priv(dev); if (priv->ieee80211->bHwRadioOff) return 0; if (wrqu->frag.disabled) priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD; else { if (wrqu->frag.value < MIN_FRAG_THRESHOLD || wrqu->frag.value > MAX_FRAG_THRESHOLD) return -EINVAL; priv->ieee80211->fts = wrqu->frag.value & ~0x1; } return 0; }
int r8180_wx_set_key(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *key) { struct r8180_priv *priv = ieee80211_priv(dev); struct iw_point *erq = &(wrqu->encoding); if (priv->ieee80211->bHwRadioOff) return 0; if (erq->length > 0) { u32* tkey = (u32*) key; priv->key0[0] = tkey[0]; priv->key0[1] = tkey[1]; priv->key0[2] = tkey[2]; priv->key0[3] = tkey[3] & 0xff; DMESG("Setting wep key to %x %x %x %x", tkey[0], tkey[1], tkey[2], tkey[3]); rtl8180_set_hw_wep(dev); } return 0; }
static int r8180_wx_set_enc(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *key) { struct r8180_priv *priv = ieee80211_priv(dev); int ret; if (priv->ieee80211->bHwRadioOff) return 0; down(&priv->wx_sem); if (priv->hw_wep) ret = r8180_wx_set_key(dev, info, wrqu, key); else { DMESG("Setting SW wep key"); ret = ieee80211_wx_set_encode(priv->ieee80211, info, wrqu, key); } up(&priv->wx_sem); return ret; }
void timer_rate_adaptive(unsigned long data) { struct r8180_priv* priv = ieee80211_priv((struct net_device *)data); //DMESG("---->timer_rate_adaptive()\n"); if(!priv->up) { // DMESG("<----timer_rate_adaptive():driver is not up!\n"); return; } if((priv->ieee80211->iw_mode != IW_MODE_MASTER) && (priv->ieee80211->state == IEEE80211_LINKED) && (priv->ForcedDataRate == 0) ) { // DMESG("timer_rate_adaptive():schedule rate_adapter_wq\n"); queue_work(priv->ieee80211->wq, (void *)&priv->ieee80211->rate_adapter_wq); // StaRateAdaptive87SE((struct net_device *)data); } priv->rateadapter_timer.expires = jiffies + MSECS(priv->RateAdaptivePeriod); add_timer(&priv->rateadapter_timer); //DMESG("<----timer_rate_adaptive()\n"); }
static void link_led_handler(struct work_struct *work) { struct zd_mac *mac = container_of(work, struct zd_mac, housekeeping.link_led_work.work); struct zd_chip *chip = &mac->chip; struct ieee80211softmac_device *sm = ieee80211_priv(mac->netdev); int is_associated; int r; spin_lock_irq(&mac->lock); is_associated = sm->associnfo.associated != 0; spin_unlock_irq(&mac->lock); r = zd_chip_control_leds(chip, is_associated ? LED_ASSOCIATED : LED_SCANNING); if (r) dev_err(zd_mac_dev(mac), "zd_chip_control_leds error %d\n", r); queue_delayed_work(zd_workqueue, &mac->housekeeping.link_led_work, LINK_LED_WORK_DELAY); }
bool PHY_RF8225_Config(struct net_device* dev ) { struct r8192_priv *priv = ieee80211_priv(dev); bool rtStatus = true; priv->NumTotalRFPath = 2; phy_RF8225_Config_HardCode(dev); phy_RF8225_Config_ParaFile(dev); return rtStatus; }
static int r8180_wx_reset_stats(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { struct r8180_priv *priv =ieee80211_priv(dev); down(&priv->wx_sem); priv->stats.txrdu = 0; priv->stats.rxrdu = 0; priv->stats.rxnolast = 0; priv->stats.rxnodata = 0; priv->stats.rxnopointer = 0; priv->stats.txnperr = 0; priv->stats.txresumed = 0; priv->stats.rxerr = 0; priv->stats.rxoverflow = 0; priv->stats.rxint = 0; priv->stats.txnpokint = 0; priv->stats.txhpokint = 0; priv->stats.txhperr = 0; priv->stats.ints = 0; priv->stats.shints = 0; priv->stats.txoverflow = 0; priv->stats.rxdmafail = 0; priv->stats.txbeacon = 0; priv->stats.txbeaconerr = 0; priv->stats.txlpokint = 0; priv->stats.txlperr = 0; priv->stats.txretry =0;//20060601 priv->stats.rxcrcerrmin=0; priv->stats.rxcrcerrmid=0; priv->stats.rxcrcerrmax=0; priv->stats.rxicverr=0; up(&priv->wx_sem); return 0; }
static int r8192_wx_set_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { struct r8192_priv *priv = ieee80211_priv(dev); RT_RF_POWER_STATE rtState; int ret; if (priv->bHwRadioOff) return 0; rtState = priv->eRFPowerState; down(&priv->wx_sem); #ifdef ENABLE_IPS if(wrqu->mode == IW_MODE_ADHOC){ if (priv->PowerSaveControl.bInactivePs) { if(rtState == eRfOff){ if(priv->RfOffReason > RF_CHANGE_BY_IPS) { RT_TRACE(COMP_ERR, "%s(): RF is OFF.\n",__FUNCTION__); up(&priv->wx_sem); return -1; } else{ RT_TRACE(COMP_ERR, "%s(): IPSLeave\n",__FUNCTION__); down(&priv->ieee80211->ips_sem); IPSLeave(priv); up(&priv->ieee80211->ips_sem); } } } } #endif ret = ieee80211_wx_set_mode(priv->ieee80211,a,wrqu,b); //rtl8187_set_rxconf(dev); up(&priv->wx_sem); return ret; }
//just in phy bool PHY_RF8225_Config(struct net_device* dev ) { struct r8192_priv *priv = ieee80211_priv(dev); bool rtStatus = true; //RF90_RADIO_PATH_E eRFPath; //BB_REGISTER_DEFINITION_T *pPhyReg; //u32 OrgStoreRFIntSW[RF90_PATH_D+1]; // // Initialize general global value // // TODO: Extend RF_PATH_C and RF_PATH_D in the future priv->NumTotalRFPath = 2; // // Config BB and RF // //switch( Adapter->MgntInfo.bRegHwParaFile ) //{ // case 0: // phy_RF8225_Config_HardCode(dev); // break; // case 1: // rtStatus = phy_RF8225_Config_ParaFile(dev); // break; // case 2: // Partial Modify. phy_RF8225_Config_HardCode(dev); phy_RF8225_Config_ParaFile(dev); // break; // default: // phy_RF8225_Config_HardCode(dev); // break; //} return rtStatus; }
int ieee80211softmac_start_scan_implementation(struct net_device *dev) { struct ieee80211softmac_device *sm = ieee80211_priv(dev); unsigned long flags; if (!(dev->flags & IFF_UP)) return -ENODEV; assert(ieee80211softmac_scan_handlers_check_self(sm)); if (!ieee80211softmac_scan_handlers_check_self(sm)) return -EINVAL; spin_lock_irqsave(&sm->lock, flags); /* it looks like we need to hold the lock here * to make sure we don't allocate two of these... */ if (unlikely(!sm->scaninfo)) sm->scaninfo = allocate_scaninfo(sm); if (unlikely(!sm->scaninfo)) { spin_unlock_irqrestore(&sm->lock, flags); return -ENOMEM; } sm->scaninfo->skip_flags = IEEE80211_CH_INVALID; if (0 /* not scanning in IEEE802.11b */)//TODO sm->scaninfo->skip_flags |= IEEE80211_CH_B_ONLY; if (0 /* IEEE802.11a */) {//TODO sm->scaninfo->channels = sm->ieee->geo.a; sm->scaninfo->number_channels = sm->ieee->geo.a_channels; } else { sm->scaninfo->channels = sm->ieee->geo.bg; sm->scaninfo->number_channels = sm->ieee->geo.bg_channels; } sm->scaninfo->current_channel_idx = 0; sm->scaninfo->started = 1; sm->scaninfo->stop = 0; INIT_COMPLETION(sm->scaninfo->finished); schedule_delayed_work(&sm->scaninfo->softmac_scan, 0); spin_unlock_irqrestore(&sm->lock, flags); return 0; }
static int r8180_wx_set_gen_ie(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { /* printk("====>%s(), len:%d\n", __func__, data->length); */ int ret = 0; struct r8180_priv *priv = ieee80211_priv(dev); if (priv->ieee80211->bHwRadioOff) return 0; down(&priv->wx_sem); #if 1 ret = ieee80211_wx_set_gen_ie(priv->ieee80211, extra, wrqu->data.length); #endif up(&priv->wx_sem); /* printk("<======%s(), ret:%d\n", __func__, ret); */ return ret; }
/*----------------------------------------------------------------------------- * Function: cmpk_handle_tx_feedback() * * Overview: The function is responsible for extract the message inside TX * feedbck message from firmware. It will contain dedicated info in * ws-06-0063-rtl8190-command-packet-specification. * Please refer to chapter "TX Feedback Element". * We have to read 20 bytes in the command packet. * * Input: struct net_device *dev * u8 *pmsg - Msg Ptr of the command packet. * * Output: NONE * * Return: NONE * * Revised History: * When Who Remark * 05/08/2008 amy Create Version 0 porting from windows code. * *--------------------------------------------------------------------------- */ static void cmpk_handle_tx_feedback(struct net_device *dev, u8 *pmsg) { struct r8192_priv *priv = ieee80211_priv(dev); cmpk_txfb_t rx_tx_fb; priv->stats.txfeedback++; /* 1. Extract TX feedback info from RFD to temp structure buffer. */ /* It seems that FW use big endian(MIPS) and DRV use little endian in * windows OS. So we have to read the content byte by byte or transfer * endian type before copy the message copy. */ /* Use pointer to transfer structure memory. */ memcpy((u8 *)&rx_tx_fb, pmsg, sizeof(cmpk_txfb_t)); /* 2. Use tx feedback info to count TX statistics. */ cmpk_count_txstatistic(dev, &rx_tx_fb); /* Comment previous method for TX statistic function. */ /* Collect info TX feedback packet to fill TCB. */ /* We can not know the packet length and transmit type: broadcast or uni * or multicast. */ }
// // Description: // Timer callback function of SW Antenna Diversity. // void SwAntennaDiversityTimerCallback( struct net_device *dev ) { struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); RT_RF_POWER_STATE rtState; //printk("+SwAntennaDiversityTimerCallback()\n"); // // We do NOT need to switch antenna while RF is off. // 2007.05.09, added by Roger. // rtState = priv->eRFPowerState; do{ if (rtState == eRfOff) { // printk("SwAntennaDiversityTimer - RF is OFF.\n"); break; } else if (rtState == eRfSleep) { // Don't access BB/RF under Disable PLL situation. //RT_TRACE((COMP_RF|COMP_ANTENNA), DBG_LOUD, ("SwAntennaDiversityTimerCallback(): RF is Sleep => skip it\n")); break; } SwAntennaDiversity(dev); }while(false); if(priv->up) { priv->SwAntennaDiversityTimer.expires = jiffies + MSECS(ANTENNA_DIVERSITY_TIMER_PERIOD); add_timer(&priv->SwAntennaDiversityTimer); } //printk("-SwAntennaDiversityTimerCallback()\n"); }
static int r8192_wx_set_crcmon(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { struct r8192_priv *priv = ieee80211_priv(dev); int *parms = (int *)extra; int enable = (parms[0] > 0); down(&priv->wx_sem); if (enable) priv->crcmon = 1; else priv->crcmon = 0; DMESG("bad CRC in monitor mode are %s", priv->crcmon ? "accepted" : "rejected"); up(&priv->wx_sem); return 0; }
void rtl8225z2_set_gain(struct net_device *dev, short gain) { u8* rtl8225_gain; struct r8180_priv *priv = ieee80211_priv(dev); u8 mode = priv->ieee80211->mode; if(mode == IEEE_B || mode == IEEE_G) rtl8225_gain = rtl8225z2_gain_bg; else rtl8225_gain = rtl8225z2_gain_a; //write_phy_ofdm(dev, 0x0d, rtl8225_gain[gain * 3]); //write_phy_ofdm(dev, 0x19, rtl8225_gain[gain * 3 + 1]); //write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 2]); //2005.11.17, by ch-hsu write_phy_ofdm(dev, 0x0b, rtl8225_gain[gain * 3]); write_phy_ofdm(dev, 0x1b, rtl8225_gain[gain * 3 + 1]); write_phy_ofdm(dev, 0x1d, rtl8225_gain[gain * 3 + 2]); write_phy_ofdm(dev, 0x21, 0x37); }
static int r8180_wx_set_essid(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { struct r8180_priv *priv = ieee80211_priv(dev); int ret; if (priv->ieee80211->bHwRadioOff) return 0; down(&priv->wx_sem); /* printk("set essid ENABLE_IPS\n"); */ if (priv->bInactivePs) IPSLeave(dev); /* printk("haha:set essid %s essid_len = %d essid_flgs = %d\n",b, wrqu->essid.length, wrqu->essid.flags); */ ret = ieee80211_wx_set_essid(priv->ieee80211, a, wrqu, b); up(&priv->wx_sem); return ret; }
static int r8180_wx_set_preamble(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { struct r8180_priv *priv = ieee80211_priv(dev); int ret = 0; down(&priv->wx_sem); if (*extra<0||*extra>2) ret = -1; else priv->plcp_preamble_mode = *((short *)extra) ; up(&priv->wx_sem); return ret; }
static int r8180_wx_set_mode(struct net_device *dev, struct iw_request_info *a, union iwreq_data *wrqu, char *b) { struct r8180_priv *priv = ieee80211_priv(dev); int ret; if (priv->ieee80211->bHwRadioOff) return 0; down(&priv->wx_sem); /* printk("set mode ENABLE_IPS\n"); */ if (priv->bInactivePs) { if (wrqu->mode == IW_MODE_ADHOC) IPSLeave(dev); } ret = ieee80211_wx_set_mode(priv->ieee80211, a, wrqu, b); /* rtl8180_commit(dev); */ up(&priv->wx_sem); return ret; }
void rtl8225z2_rf_set_mode(struct net_device *dev) { struct r8180_priv *priv = ieee80211_priv(dev); if (priv->ieee80211->mode == IEEE_A) { write_rtl8225(dev, 0x5, 0x1865); write_nic_dword(dev, RF_PARA, 0x10084); write_nic_dword(dev, RF_TIMING, 0xa8008); write_phy_ofdm(dev, 0x0, 0x0); write_phy_ofdm(dev, 0xa, 0x6); write_phy_ofdm(dev, 0xb, 0x99); write_phy_ofdm(dev, 0xf, 0x20); write_phy_ofdm(dev, 0x11, 0x7); rtl8225z2_set_gain(dev, 4); write_phy_ofdm(dev, 0x15, 0x40); write_phy_ofdm(dev, 0x17, 0x40); write_nic_dword(dev, 0x94, 0x10000000); } else { write_rtl8225(dev, 0x5, 0x1864); write_nic_dword(dev, RF_PARA, 0x10044); write_nic_dword(dev, RF_TIMING, 0xa8008); write_phy_ofdm(dev, 0x0, 0x1); write_phy_ofdm(dev, 0xa, 0x6); write_phy_ofdm(dev, 0xb, 0x99); write_phy_ofdm(dev, 0xf, 0x20); write_phy_ofdm(dev, 0x11, 0x7); rtl8225z2_set_gain(dev, 4); write_phy_ofdm(dev, 0x15, 0x40); write_phy_ofdm(dev, 0x17, 0x40); write_nic_dword(dev, 0x94, 0x04000002); } }
int zd_mac_init(struct zd_mac *mac, struct net_device *netdev, struct usb_interface *intf) { struct ieee80211_device *ieee = zd_netdev_ieee80211(netdev); memset(mac, 0, sizeof(*mac)); spin_lock_init(&mac->lock); mac->netdev = netdev; INIT_DELAYED_WORK(&mac->set_rts_cts_work, set_rts_cts_work); INIT_DELAYED_WORK(&mac->set_basic_rates_work, set_basic_rates_work); skb_queue_head_init(&mac->rx_queue); tasklet_init(&mac->rx_tasklet, do_rx, (unsigned long)mac); tasklet_disable(&mac->rx_tasklet); ieee_init(ieee); softmac_init(ieee80211_priv(netdev)); zd_chip_init(&mac->chip, netdev, intf); housekeeping_init(mac); INIT_WORK(&mac->set_multicast_hash_work, set_multicast_hash_handler); return 0; }
static int r8192_wx_set_sens(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { struct r8192_priv *priv = ieee80211_priv(dev); short err = 0; down(&priv->wx_sem); if (priv->rf_set_sens == NULL) { err = -1; /* we have not this support for this radio */ goto exit; } if (priv->rf_set_sens(dev, wrqu->sens.value) == 0) priv->sens = wrqu->sens.value; else err = -EINVAL; exit: up(&priv->wx_sem); return err; }
static int r8180_wx_set_channelplan(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { struct r8180_priv *priv = ieee80211_priv(dev); //struct ieee80211_device *ieee = netdev_priv(dev); int *val = (int *)extra; int i; //unsigned long flags; down(&priv->wx_sem); if (DefaultChannelPlan[*val].Len != 0){ priv ->channel_plan = *val; // Clear old channel map for (i=1;i<=MAX_CHANNEL_NUMBER;i++) priv->ieee80211->channel_map[i] = 0; // Set new channel map for (i=1;i<=DefaultChannelPlan[*val].Len;i++) priv->ieee80211->channel_map[DefaultChannelPlan[*val].Channel[i-1]] = 1; } up(&priv->wx_sem); return 0; }
static int r8180_wx_get_retry(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) { struct r8180_priv *priv = ieee80211_priv(dev); wrqu->retry.disabled = 0; /* can't be disabled */ if ((wrqu->retry.flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME) return -EINVAL; if (wrqu->retry.flags & IW_RETRY_MAX) { wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_MAX; wrqu->retry.value = priv->retry_rts; } else { wrqu->retry.flags = IW_RETRY_LIMIT | IW_RETRY_MIN; wrqu->retry.value = priv->retry_data; } return 0; }
/* Timer callback function of SW Antenna Diversity. */ void SwAntennaDiversityTimerCallback(struct net_device *dev) { struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); RT_RF_POWER_STATE rtState; /* We do NOT need to switch antenna while RF is off. */ rtState = priv->eRFPowerState; do { if (rtState == eRfOff) { break; } else if (rtState == eRfSleep) { /* Don't access BB/RF under Disable PLL situation. */ break; } SwAntennaDiversity(dev); } while (false); if (priv->up) { priv->SwAntennaDiversityTimer.expires = jiffies + MSECS(ANTENNA_DIVERSITY_TIMER_PERIOD); add_timer(&priv->SwAntennaDiversityTimer); } }
void SwAntennaDiversityTimerCallback(struct net_device *dev) { struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); RT_RF_POWER_STATE rtState; rtState = priv->eRFPowerState; do { if (rtState == eRfOff) { break; } else if (rtState == eRfSleep) { break; } SwAntennaDiversity(dev); } while (false); if (priv->up) { priv->SwAntennaDiversityTimer.expires = jiffies + MSECS(ANTENNA_DIVERSITY_TIMER_PERIOD); add_timer(&priv->SwAntennaDiversityTimer); } }