492
496
spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flag);
500
void rtl_swlps_beacon(struct ieee80211_hw *hw, void *data, unsigned int len)
502
struct rtl_priv *rtlpriv = rtl_priv(hw);
503
struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
504
struct ieee80211_hdr *hdr = (void *) data;
505
struct ieee80211_tim_ie *tim_ie;
511
if (mac->opmode != NL80211_IFTYPE_STATION)
514
if (!rtlpriv->psc.swctrl_lps)
517
if (rtlpriv->mac80211.link_state != MAC80211_LINKED)
520
if (!rtlpriv->psc.sw_ps_enabled)
523
if (rtlpriv->psc.fwctrl_lps)
526
if (likely(!(hw->conf.flags & IEEE80211_CONF_PS)))
529
/* check if this really is a beacon */
530
if (!ieee80211_is_beacon(hdr->frame_control))
533
/* min. beacon length + FCS_LEN */
534
if (len <= 40 + FCS_LEN)
537
/* and only beacons from the associated BSSID, please */
538
if (compare_ether_addr(hdr->addr3, rtlpriv->mac80211.bssid))
541
rtlpriv->psc.last_beacon = jiffies;
543
tim = rtl_find_ie(data, len - FCS_LEN, WLAN_EID_TIM);
547
if (tim[1] < sizeof(*tim_ie))
551
tim_ie = (struct ieee80211_tim_ie *) &tim[2];
553
if (!WARN_ON_ONCE(!hw->conf.ps_dtim_period))
554
rtlpriv->psc.dtim_counter = tim_ie->dtim_count;
556
/* Check whenever the PHY can be turned off again. */
558
/* 1. What about buffered unicast traffic for our AID? */
559
u_buffed = ieee80211_check_tim(tim_ie, tim_len,
560
rtlpriv->mac80211.assoc_id);
562
/* 2. Maybe the AP wants to send multicast/broadcast data? */
563
m_buffed = tim_ie->bitmap_ctrl & 0x01;
564
rtlpriv->psc.multi_buffered = m_buffed;
566
/* unicast will process by mac80211 through
567
* set ~IEEE80211_CONF_PS, So we just check
568
* multicast frames here */
570
/* back to low-power land. and delay is
571
* prevent null power save frame tx fail */
572
queue_delayed_work(rtlpriv->works.rtl_wq,
573
&rtlpriv->works.ps_work, MSECS(5));
575
RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, ("u_bufferd: %x, "
576
"m_buffered: %x\n", u_buffed, m_buffed));
580
void rtl_swlps_rf_awake(struct ieee80211_hw *hw)
582
struct rtl_priv *rtlpriv = rtl_priv(hw);
583
struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
584
struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
587
if (!rtlpriv->psc.swctrl_lps)
589
if (mac->link_state != MAC80211_LINKED)
592
if (ppsc->reg_rfps_level & RT_RF_LPS_LEVEL_ASPM &&
593
RT_IN_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM)) {
594
rtlpriv->intf_ops->disable_aspm(hw);
595
RT_CLEAR_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM);
598
spin_lock_irqsave(&rtlpriv->locks.lps_lock, flag);
599
rtl_ps_set_rf_state(hw, ERFON, RF_CHANGE_BY_PS, false);
600
spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flag);
603
void rtl_swlps_rfon_wq_callback(void *data)
605
struct rtl_works *rtlworks =
606
container_of_dwork_rtl(data, struct rtl_works, ps_rfon_wq);
607
struct ieee80211_hw *hw = rtlworks->hw;
609
rtl_swlps_rf_awake(hw);
612
void rtl_swlps_rf_sleep(struct ieee80211_hw *hw)
614
struct rtl_priv *rtlpriv = rtl_priv(hw);
615
struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
616
struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
620
if (!rtlpriv->psc.sw_ps_enabled)
623
if ((rtlpriv->sec.being_setkey) ||
624
(mac->opmode == NL80211_IFTYPE_ADHOC))
627
/*sleep after linked 10s, to let DHCP and 4-way handshake ok enough!! */
628
if ((mac->link_state != MAC80211_LINKED) || (mac->cnt_after_linked < 5))
631
if (rtlpriv->link_info.busytraffic)
634
spin_lock_irqsave(&rtlpriv->locks.rf_ps_lock, flag);
635
if (rtlpriv->psc.rfchange_inprogress) {
636
spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, flag);
639
spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, flag);
641
spin_lock_irqsave(&rtlpriv->locks.lps_lock, flag);
642
rtl_ps_set_rf_state(hw, ERFSLEEP, RF_CHANGE_BY_PS, false);
643
spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flag);
645
if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_ASPM &&
646
!RT_IN_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM)) {
647
rtlpriv->intf_ops->enable_aspm(hw);
648
RT_SET_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM);
651
/* here is power save alg, when this beacon is DTIM
652
* we will set sleep time to dtim_period * n;
653
* when this beacon is not DTIM, we will set sleep
654
* time to sleep_intv = rtlpriv->psc.dtim_counter or
655
* MAX_SW_LPS_SLEEP_INTV(default set to 5) */
657
if (rtlpriv->psc.dtim_counter == 0) {
658
if (hw->conf.ps_dtim_period == 1)
659
sleep_intv = hw->conf.ps_dtim_period * 2;
661
sleep_intv = hw->conf.ps_dtim_period;
663
sleep_intv = rtlpriv->psc.dtim_counter;
666
if (sleep_intv > MAX_SW_LPS_SLEEP_INTV)
667
sleep_intv = MAX_SW_LPS_SLEEP_INTV;
669
/* this print should always be dtim_conter = 0 &
670
* sleep = dtim_period, that meaons, we should
671
* awake before every dtim */
672
RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
673
("dtim_counter:%x will sleep :%d"
674
" beacon_intv\n", rtlpriv->psc.dtim_counter, sleep_intv));
676
/* we tested that 40ms is enough for sw & hw sw delay */
677
queue_delayed_work(rtlpriv->works.rtl_wq, &rtlpriv->works.ps_rfon_wq,
678
MSECS(sleep_intv * mac->vif->bss_conf.beacon_int - 40));
682
void rtl_swlps_wq_callback(void *data)
684
struct rtl_works *rtlworks = container_of_dwork_rtl(data,
687
struct ieee80211_hw *hw = rtlworks->hw;
688
struct rtl_priv *rtlpriv = rtl_priv(hw);
691
ps = (hw->conf.flags & IEEE80211_CONF_PS);
693
/* we can sleep after ps null send ok */
694
if (rtlpriv->psc.state_inap) {
695
rtl_swlps_rf_sleep(hw);
697
if (rtlpriv->psc.state && !ps) {
698
rtlpriv->psc.sleep_ms = jiffies_to_msecs(jiffies -
699
rtlpriv->psc.last_action);
703
rtlpriv->psc.last_slept = jiffies;
705
rtlpriv->psc.last_action = jiffies;
706
rtlpriv->psc.state = ps;