From 363255f86a78850699f936635569d8b2963248e7 Mon Sep 17 00:00:00 2001
From: nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Date: Tue, 14 May 2013 11:01:54 +0000
Subject: mac80211: fix client mode state handling issues

Signed-off-by: Felix Fietkau <nbd@openwrt.org>

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@36632 3c298f89-4303-0410-b956-a3cf2f4a3e73
---
 package/mac80211/patches/300-pending_work.patch | 62 +++++++++++++++++++++++++
 1 file changed, 62 insertions(+)

diff --git a/package/mac80211/patches/300-pending_work.patch b/package/mac80211/patches/300-pending_work.patch
index 5d946ca10..fd7417b44 100644
--- a/package/mac80211/patches/300-pending_work.patch
+++ b/package/mac80211/patches/300-pending_work.patch
@@ -1921,6 +1921,39 @@
  	}
  	mutex_unlock(&ifmgd->mtx);
  
+@@ -4197,7 +4344,7 @@ int ieee80211_mgd_deauth(struct ieee8021
+ 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
+ 	u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN];
+ 	bool tx = !req->local_state_change;
+-	bool sent_frame = false;
++	bool report_frame = false;
+ 
+ 	mutex_lock(&ifmgd->mtx);
+ 
+@@ -4214,7 +4361,7 @@ int ieee80211_mgd_deauth(struct ieee8021
+ 		ieee80211_destroy_auth_data(sdata, false);
+ 		mutex_unlock(&ifmgd->mtx);
+ 
+-		sent_frame = tx;
++		report_frame = true;
+ 		goto out;
+ 	}
+ 
+@@ -4222,12 +4369,12 @@ int ieee80211_mgd_deauth(struct ieee8021
+ 	    ether_addr_equal(ifmgd->associated->bssid, req->bssid)) {
+ 		ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
+ 				       req->reason_code, tx, frame_buf);
+-		sent_frame = tx;
++		report_frame = true;
+ 	}
+ 	mutex_unlock(&ifmgd->mtx);
+ 
+  out:
+-	if (sent_frame)
++	if (report_frame)
+ 		__cfg80211_send_deauth(sdata->dev, frame_buf,
+ 				       IEEE80211_DEAUTH_FRAME_LEN);
+ 
 --- a/net/mac80211/pm.c
 +++ b/net/mac80211/pm.c
 @@ -38,8 +38,8 @@ int __ieee80211_suspend(struct ieee80211
@@ -3836,3 +3869,32 @@
  		skb_put(skb, rs.rs_datalen + ah->caps.rx_status_len);
  		if (ah->caps.rx_status_len)
  			skb_pull(skb, ah->caps.rx_status_len);
+--- a/net/wireless/core.c
++++ b/net/wireless/core.c
+@@ -885,7 +885,6 @@ void cfg80211_leave(struct cfg80211_regi
+ #endif
+ 		__cfg80211_disconnect(rdev, dev,
+ 				      WLAN_REASON_DEAUTH_LEAVING, true);
+-		cfg80211_mlme_down(rdev, dev);
+ 		wdev_unlock(wdev);
+ 		break;
+ 	case NL80211_IFTYPE_MESH_POINT:
+--- a/net/wireless/sme.c
++++ b/net/wireless/sme.c
+@@ -961,7 +961,7 @@ int __cfg80211_disconnect(struct cfg8021
+ 		/* was it connected by userspace SME? */
+ 		if (!wdev->conn) {
+ 			cfg80211_mlme_down(rdev, dev);
+-			return 0;
++			goto disconnect;
+ 		}
+ 
+ 		if (wdev->sme_state == CFG80211_SME_CONNECTING &&
+@@ -987,6 +987,7 @@ int __cfg80211_disconnect(struct cfg8021
+ 			return err;
+ 	}
+ 
++ disconnect:
+ 	if (wdev->sme_state == CFG80211_SME_CONNECTED)
+ 		__cfg80211_disconnected(dev, NULL, 0, 0, false);
+ 	else if (wdev->sme_state == CFG80211_SME_CONNECTING)
-- 
cgit v1.2.3