Search Linux Wireless

[RFC PATCH] rtl8192cu: Fix beacon support in AP mode

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



When using the rtl8192cu in AP mode a few devices (an android phone,
iphone and ipad) were unable to associate, where as the laptops I tried
could. Using wireshark to sniff the wlan traffic, it appears that the
rtl8192cu is not beaconing, however, it is responding to broadcast
probe requests and so devices are able to detect the AP.

Searching the archives the same issue was reported for this WLAN device
and a fix to send an initial beacon frame was proposed [1]. This was
rejected as it was modifying the rtlwifi core. This change does the
same but from within the rtl8192cu driver and appears to fix the problem.

Please note that although this does fix the problem, I don't know if this
is the best way or correct way to fix the problem, hence the request for
comment.

[1] http://permalink.gmane.org/gmane.linux.kernel.wireless.general/96770

Signed-off-by: Jon Hunter <jgchunter@xxxxxxxxx>

Cc: Larry Finger <Larry.Finger@xxxxxxxxxxxx>
Cc: Chaoming Li <chaoming_li@xxxxxxxxxxxxxx>
Cc: coekbe@xxxxxxxxx
---
 drivers/net/wireless/rtlwifi/rtl8192cu/hw.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
index fe4b699..4fbca80 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
@@ -1520,6 +1520,22 @@ void rtl92cu_set_beacon_related_registers(struct ieee80211_hw *hw)
 	_beacon_function_enable(hw, true, true);
 }
 
+static void _beacon_send_frame(struct ieee80211_hw *hw)
+{
+	struct rtl_priv *rtlpriv = rtl_priv(hw);
+	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
+	struct ieee80211_sta *sta;
+	struct rtl_tcb_desc tcb_desc;
+	struct sk_buff *skb;
+	memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc));
+
+	skb = ieee80211_beacon_get(hw, mac->vif);
+	sta = rtl_find_sta(hw, mac->bssid);
+
+	if (!rtlpriv->intf_ops->waitq_insert(hw, sta, skb))
+		rtlpriv->intf_ops->adapter_tx(hw, sta, skb, &tcb_desc);
+}
+
 void rtl92cu_set_beacon_interval(struct ieee80211_hw *hw)
 {
 	struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -1529,6 +1545,9 @@ void rtl92cu_set_beacon_interval(struct ieee80211_hw *hw)
 	RT_TRACE(rtlpriv, COMP_BEACON, DBG_DMESG, "beacon_interval:%d\n",
 		 bcn_interval);
 	rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
+
+        /* Send initial beacon frame to start beaconing */
+	_beacon_send_frame(hw);
 }
 
 void rtl92cu_update_interrupt_mask(struct ieee80211_hw *hw,
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux