Commit 4bac10f2 authored by Chin-Yen Lee's avatar Chin-Yen Lee Committed by Kalle Valo
Browse files

rtw88: wow: report wow reason through mac80211 api



After waking up from WoWLAN, call ieee80211_report_wowlan_wakeup
function call to report wakeup reason to userspace via nl80211.

Signed-off-by: default avatarChin-Yen Lee <timlee@realtek.com>
Signed-off-by: default avatarPing-Ke Shih <pkshih@realtek.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20210728014335.8785-5-pkshih@realtek.com
parent 05e45887
Loading
Loading
Loading
Loading
+37 −9
Original line number Original line Diff line number Diff line
@@ -12,26 +12,54 @@


static void rtw_wow_show_wakeup_reason(struct rtw_dev *rtwdev)
static void rtw_wow_show_wakeup_reason(struct rtw_dev *rtwdev)
{
{
	struct cfg80211_wowlan_nd_info nd_info;
	struct cfg80211_wowlan_wakeup wakeup = {
		.pattern_idx = -1,
	};
	u8 reason;
	u8 reason;


	reason = rtw_read8(rtwdev, REG_WOWLAN_WAKE_REASON);
	reason = rtw_read8(rtwdev, REG_WOWLAN_WAKE_REASON);


	if (reason == RTW_WOW_RSN_RX_DEAUTH)
	switch (reason) {
	case RTW_WOW_RSN_RX_DEAUTH:
		wakeup.disconnect = true;
		rtw_dbg(rtwdev, RTW_DBG_WOW, "WOW: Rx deauth\n");
		rtw_dbg(rtwdev, RTW_DBG_WOW, "WOW: Rx deauth\n");
	else if (reason == RTW_WOW_RSN_DISCONNECT)
		break;
	case RTW_WOW_RSN_DISCONNECT:
		wakeup.disconnect = true;
		rtw_dbg(rtwdev, RTW_DBG_WOW, "WOW: AP is off\n");
		rtw_dbg(rtwdev, RTW_DBG_WOW, "WOW: AP is off\n");
	else if (reason == RTW_WOW_RSN_RX_MAGIC_PKT)
		break;
	case RTW_WOW_RSN_RX_MAGIC_PKT:
		wakeup.magic_pkt = true;
		rtw_dbg(rtwdev, RTW_DBG_WOW, "WOW: Rx magic packet\n");
		rtw_dbg(rtwdev, RTW_DBG_WOW, "WOW: Rx magic packet\n");
	else if (reason == RTW_WOW_RSN_RX_GTK_REKEY)
		break;
	case RTW_WOW_RSN_RX_GTK_REKEY:
		wakeup.gtk_rekey_failure = true;
		rtw_dbg(rtwdev, RTW_DBG_WOW, "WOW: Rx gtk rekey\n");
		rtw_dbg(rtwdev, RTW_DBG_WOW, "WOW: Rx gtk rekey\n");
	else if (reason == RTW_WOW_RSN_RX_PTK_REKEY)
		break;
		rtw_dbg(rtwdev, RTW_DBG_WOW, "WOW: Rx ptk rekey\n");
	case RTW_WOW_RSN_RX_PATTERN_MATCH:
	else if (reason == RTW_WOW_RSN_RX_PATTERN_MATCH)
		/* Current firmware and driver don't report pattern index
		 * Use pattern_idx to 0 defaultly.
		 */
		wakeup.pattern_idx = 0;
		rtw_dbg(rtwdev, RTW_DBG_WOW, "WOW: Rx pattern match packet\n");
		rtw_dbg(rtwdev, RTW_DBG_WOW, "WOW: Rx pattern match packet\n");
	else if (reason == RTW_WOW_RSN_RX_NLO)
		break;
	case RTW_WOW_RSN_RX_NLO:
		/* Current firmware and driver don't report ssid index.
		 * Use 0 for n_matches based on its comment.
		 */
		nd_info.n_matches = 0;
		wakeup.net_detect = &nd_info;
		rtw_dbg(rtwdev, RTW_DBG_WOW, "Rx NLO\n");
		rtw_dbg(rtwdev, RTW_DBG_WOW, "Rx NLO\n");
	else
		break;
	default:
		rtw_warn(rtwdev, "Unknown wakeup reason %x\n", reason);
		rtw_warn(rtwdev, "Unknown wakeup reason %x\n", reason);
		ieee80211_report_wowlan_wakeup(rtwdev->wow.wow_vif, NULL,
					       GFP_KERNEL);
		return;
	}
	ieee80211_report_wowlan_wakeup(rtwdev->wow.wow_vif, &wakeup,
				       GFP_KERNEL);
}
}


static void rtw_wow_pattern_write_cam(struct rtw_dev *rtwdev, u8 addr,
static void rtw_wow_pattern_write_cam(struct rtw_dev *rtwdev, u8 addr,