From: Johannes Berg <johannes.b...@intel.com>

[ Upstream commit 2f0282db41194c0099a019b2761911d6c69cbdb9 ]

Shaul reported that when iwlmvm was sending beacons, it didn't properly
also take ownership of the probe responses. This is because the whole
mac80211 callback (tx_last_beacon) wasn't implemented. Fix that to make
IBSS discovery work better.

Reported-by: Shaul Triebitz <shaul.trieb...@intel.com>
Signed-off-by: Luca Coelho <luciano.coe...@intel.com>
Signed-off-by: Sasha Levin <alexander.le...@microsoft.com>
---
 drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c | 1 +
 drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 9 +++++++++
 drivers/net/wireless/intel/iwlwifi/mvm/mvm.h      | 3 +++
 3 files changed, 13 insertions(+)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c 
b/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c
index 6b962d6b067a..ee8b12424d03 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c
@@ -1434,6 +1434,7 @@ void iwl_mvm_rx_beacon_notif(struct iwl_mvm *mvm,
 
        beacon_notify_hdr = &beacon->beacon_notify_hdr;
        mvm->ap_last_beacon_gp2 = le32_to_cpu(beacon->gp2);
+       mvm->ibss_manager = beacon->ibss_mgr_status != 0;
 
        status = le16_to_cpu(beacon_notify_hdr->status.status) & TX_STATUS_MSK;
        IWL_DEBUG_RX(mvm,
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c 
b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
index f1231c0ea336..3d6401eafe52 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
@@ -3621,6 +3621,13 @@ static int iwl_mvm_switch_vif_chanctx(struct 
ieee80211_hw *hw,
        return ret;
 }
 
+static int iwl_mvm_tx_last_beacon(struct ieee80211_hw *hw)
+{
+       struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
+
+       return mvm->ibss_manager;
+}
+
 static int iwl_mvm_set_tim(struct ieee80211_hw *hw,
                           struct ieee80211_sta *sta,
                           bool set)
@@ -4218,6 +4225,8 @@ const struct ieee80211_ops iwl_mvm_hw_ops = {
        .join_ibss = iwl_mvm_start_ap_ibss,
        .leave_ibss = iwl_mvm_stop_ap_ibss,
 
+       .tx_last_beacon = iwl_mvm_tx_last_beacon,
+
        .set_tim = iwl_mvm_set_tim,
 
        .channel_switch = iwl_mvm_channel_switch,
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h 
b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
index c60703e0c246..49e84efbbb0e 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
@@ -989,6 +989,9 @@ struct iwl_mvm {
        /* system time of last beacon (for AP/GO interface) */
        u32 ap_last_beacon_gp2;
 
+       /* indicates that we transmitted the last beacon */
+       bool ibss_manager;
+
        bool lar_regdom_set;
        enum iwl_mcc_source mcc_src;
 
-- 
2.15.1

Reply via email to