Skip to content

Commit c76ab8e

Browse files
Ping-Ke ShihKalle Valo
authored andcommitted
rtlwifi: Fill ap_num field by driver
Check beacon and probe_resp frames to know ap_num Signed-off-by: Ping-Ke Shih <pkshih@realtek.com> Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> Cc: Yan-Hsuan Chuang <yhchuang@realtek.com> Cc: Birming Chiu <birming@realtek.com> Cc: Shaofu <shaofu@realtek.com> Cc: Steven Ting <steventing@realtek.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
1 parent f1cb27e commit c76ab8e

File tree

5 files changed

+123
-0
lines changed

5 files changed

+123
-0
lines changed

drivers/net/wireless/realtek/rtlwifi/base.c

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,7 @@ int rtl_init_core(struct ieee80211_hw *hw)
564564
spin_lock_init(&rtlpriv->locks.waitq_lock);
565565
spin_lock_init(&rtlpriv->locks.entry_list_lock);
566566
spin_lock_init(&rtlpriv->locks.c2hcmd_lock);
567+
spin_lock_init(&rtlpriv->locks.scan_list_lock);
567568
spin_lock_init(&rtlpriv->locks.cck_and_rw_pagea_lock);
568569
spin_lock_init(&rtlpriv->locks.check_sendpkt_lock);
569570
spin_lock_init(&rtlpriv->locks.fw_ps_lock);
@@ -572,6 +573,7 @@ int rtl_init_core(struct ieee80211_hw *hw)
572573
/* <5> init list */
573574
INIT_LIST_HEAD(&rtlpriv->entry_list);
574575
INIT_LIST_HEAD(&rtlpriv->c2hcmd_list);
576+
INIT_LIST_HEAD(&rtlpriv->scan_list.list);
575577

576578
rtlmac->link_state = MAC80211_NOLINK;
577579

@@ -582,9 +584,12 @@ int rtl_init_core(struct ieee80211_hw *hw)
582584
}
583585
EXPORT_SYMBOL_GPL(rtl_init_core);
584586

587+
static void rtl_free_entries_from_scan_list(struct ieee80211_hw *hw);
588+
585589
void rtl_deinit_core(struct ieee80211_hw *hw)
586590
{
587591
rtl_c2hcmd_launcher(hw, 0);
592+
rtl_free_entries_from_scan_list(hw);
588593
}
589594
EXPORT_SYMBOL_GPL(rtl_deinit_core);
590595

@@ -1704,6 +1709,100 @@ void rtl_beacon_statistic(struct ieee80211_hw *hw, struct sk_buff *skb)
17041709
}
17051710
EXPORT_SYMBOL_GPL(rtl_beacon_statistic);
17061711

1712+
static void rtl_free_entries_from_scan_list(struct ieee80211_hw *hw)
1713+
{
1714+
struct rtl_priv *rtlpriv = rtl_priv(hw);
1715+
struct rtl_bssid_entry *entry, *next;
1716+
1717+
list_for_each_entry_safe(entry, next, &rtlpriv->scan_list.list, list) {
1718+
list_del(&entry->list);
1719+
kfree(entry);
1720+
rtlpriv->scan_list.num--;
1721+
}
1722+
}
1723+
1724+
void rtl_scan_list_expire(struct ieee80211_hw *hw)
1725+
{
1726+
struct rtl_priv *rtlpriv = rtl_priv(hw);
1727+
struct rtl_bssid_entry *entry, *next;
1728+
unsigned long flags;
1729+
1730+
spin_lock_irqsave(&rtlpriv->locks.scan_list_lock, flags);
1731+
1732+
list_for_each_entry_safe(entry, next, &rtlpriv->scan_list.list, list) {
1733+
/* 180 seconds */
1734+
if (jiffies_to_msecs(jiffies - entry->age) < 180000)
1735+
continue;
1736+
1737+
list_del(&entry->list);
1738+
kfree(entry);
1739+
rtlpriv->scan_list.num--;
1740+
1741+
RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
1742+
"BSSID=%pM is expire in scan list (total=%d)\n",
1743+
entry->bssid, rtlpriv->scan_list.num);
1744+
}
1745+
1746+
spin_unlock_irqrestore(&rtlpriv->locks.scan_list_lock, flags);
1747+
1748+
rtlpriv->btcoexist.btc_info.ap_num = rtlpriv->scan_list.num;
1749+
}
1750+
1751+
void rtl_collect_scan_list(struct ieee80211_hw *hw, struct sk_buff *skb)
1752+
{
1753+
struct rtl_priv *rtlpriv = rtl_priv(hw);
1754+
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1755+
struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1756+
unsigned long flags;
1757+
1758+
struct rtl_bssid_entry *entry;
1759+
bool entry_found = false;
1760+
1761+
/* check if it is scanning */
1762+
if (!mac->act_scanning)
1763+
return;
1764+
1765+
/* check if this really is a beacon */
1766+
if (!ieee80211_is_beacon(hdr->frame_control) &&
1767+
!ieee80211_is_probe_resp(hdr->frame_control))
1768+
return;
1769+
1770+
spin_lock_irqsave(&rtlpriv->locks.scan_list_lock, flags);
1771+
1772+
list_for_each_entry(entry, &rtlpriv->scan_list.list, list) {
1773+
if (memcmp(entry->bssid, hdr->addr3, ETH_ALEN) == 0) {
1774+
list_del_init(&entry->list);
1775+
entry_found = true;
1776+
RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
1777+
"Update BSSID=%pM to scan list (total=%d)\n",
1778+
hdr->addr3, rtlpriv->scan_list.num);
1779+
break;
1780+
}
1781+
}
1782+
1783+
if (!entry_found) {
1784+
entry = kmalloc(sizeof(*entry), GFP_ATOMIC);
1785+
1786+
if (!entry)
1787+
goto label_err;
1788+
1789+
memcpy(entry->bssid, hdr->addr3, ETH_ALEN);
1790+
rtlpriv->scan_list.num++;
1791+
1792+
RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
1793+
"Add BSSID=%pM to scan list (total=%d)\n",
1794+
hdr->addr3, rtlpriv->scan_list.num);
1795+
}
1796+
1797+
entry->age = jiffies;
1798+
1799+
list_add_tail(&entry->list, &rtlpriv->scan_list.list);
1800+
1801+
label_err:
1802+
spin_unlock_irqrestore(&rtlpriv->locks.scan_list_lock, flags);
1803+
}
1804+
EXPORT_SYMBOL(rtl_collect_scan_list);
1805+
17071806
void rtl_watchdog_wq_callback(void *data)
17081807
{
17091808
struct rtl_works *rtlworks = container_of_dwork_rtl(data,
@@ -1861,6 +1960,9 @@ void rtl_watchdog_wq_callback(void *data)
18611960
rtlpriv->btcoexist.btc_ops->btc_periodical(rtlpriv);
18621961

18631962
rtlpriv->link_info.bcn_rx_inperiod = 0;
1963+
1964+
/* <6> scan list */
1965+
rtl_scan_list_expire(hw);
18641966
}
18651967

18661968
void rtl_watch_dog_timer_callback(unsigned long data)

drivers/net/wireless/realtek/rtlwifi/base.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,8 @@ bool rtl_check_tx_report_acked(struct ieee80211_hw *hw);
137137
void rtl_wait_tx_report_acked(struct ieee80211_hw *hw, u32 wait_ms);
138138

139139
void rtl_beacon_statistic(struct ieee80211_hw *hw, struct sk_buff *skb);
140+
void rtl_collect_scan_list(struct ieee80211_hw *hw, struct sk_buff *skb);
141+
void rtl_scan_list_expire(struct ieee80211_hw *hw);
140142
int rtl_tx_agg_start(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
141143
struct ieee80211_sta *sta, u16 tid, u16 *ssn);
142144
int rtl_tx_agg_stop(struct ieee80211_hw *hw, struct ieee80211_vif *vif,

drivers/net/wireless/realtek/rtlwifi/core.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1464,6 +1464,9 @@ static void rtl_op_sw_scan_complete(struct ieee80211_hw *hw,
14641464
RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, "\n");
14651465
mac->act_scanning = false;
14661466
mac->skip_scan = false;
1467+
1468+
rtlpriv->btcoexist.btc_info.ap_num = rtlpriv->scan_list.num;
1469+
14671470
if (rtlpriv->link_info.higher_busytraffic)
14681471
return;
14691472

drivers/net/wireless/realtek/rtlwifi/pci.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -879,6 +879,9 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
879879
if (unicast)
880880
rtlpriv->link_info.num_rx_inperiod++;
881881
}
882+
883+
rtl_collect_scan_list(hw, skb);
884+
882885
/* static bcn for roaming */
883886
rtl_beacon_statistic(hw, skb);
884887
rtl_p2p_info(hw, (void *)skb->data, skb->len);

drivers/net/wireless/realtek/rtlwifi/wifi.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2333,6 +2333,7 @@ struct rtl_locks {
23332333
spinlock_t entry_list_lock;
23342334
spinlock_t usb_lock;
23352335
spinlock_t c2hcmd_lock;
2336+
spinlock_t scan_list_lock; /* lock for the scan list */
23362337

23372338
/*FW clock change */
23382339
spinlock_t fw_ps_lock;
@@ -2587,6 +2588,17 @@ struct rtl_c2hcmd {
25872588
u8 *val;
25882589
};
25892590

2591+
struct rtl_bssid_entry {
2592+
struct list_head list;
2593+
u8 bssid[ETH_ALEN];
2594+
u32 age;
2595+
};
2596+
2597+
struct rtl_scan_list {
2598+
int num;
2599+
struct list_head list; /* sort by age */
2600+
};
2601+
25902602
struct rtl_priv {
25912603
struct ieee80211_hw *hw;
25922604
struct completion firmware_loading_complete;
@@ -2608,6 +2620,7 @@ struct rtl_priv {
26082620
struct rtl_efuse efuse;
26092621
struct rtl_led_ctl ledctl;
26102622
struct rtl_tx_report tx_report;
2623+
struct rtl_scan_list scan_list;
26112624

26122625
struct rtl_ps_ctl psc;
26132626
struct rate_adaptive ra;

0 commit comments

Comments
 (0)