From: Mohammed Shafi Shajakhan <moham...@qca.qualcomm.com>

In ath9k we make sure the following two things
*if the first interface is ADHOC we cannot have any other interface.
*we cannot add an ADHOC interface if there is already an interface
is present.

when drv_add_interface is called during resume we got to consider
number of vifs already present in addition to checking the drivers
'opmode' information about ADHOC, otherwise during suspend/resume
we incorrectly assume an ADHOC interface is already present.
Then we may miss some driver specific data for the ADHOC
interface after resume.

        ath: phy0: Cannot create ADHOC interface when other
        interfaces already exist.
        WARNING: at net/mac80211/driver-ops.h:12
        ieee80211_reconfig+0x1882/0x1ca0 [mac80211]()
        Hardware name: 2842RK1
        wlan2:  Failed check-sdata-in-driver check, flags: 0x0

        Call Trace:
        [<c01361b2>] warn_slowpath_common+0x72/0xa0
        [<f8aaa7c2>] ? ieee80211_reconfig+0x1882/0x1ca0
        [mac80211]
        [<f8aaa7c2>] ? ieee80211_reconfig+0x1882/0x1ca0
        [mac80211]
        [<c0136283>] warn_slowpath_fmt+0x33/0x40
        [<f8aaa7c2>] ieee80211_reconfig+0x1882/0x1ca0 [mac80211]
        [<c06c1d1a>] ? mutex_lock_nested+0x23a/0x2f0
        [<f8a95097>] ieee80211_resume+0x27/0x70 [mac80211]
        [<fd177edf>] wiphy_resume+0x8f/0xa0 [cfg80211]

Cc: sta...@vger.kernel.org
Cc: Rajkumar Manoharan <rmano...@qca.qualcomm.com>
Signed-off-by: Mohammed Shafi Shajakhan <moham...@qca.qualcomm.com>
---
 drivers/net/wireless/ath/ath9k/main.c |   13 ++++++++-----
 1 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/ath/ath9k/main.c 
b/drivers/net/wireless/ath/ath9k/main.c
index 4de4473..c26497d 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -1443,11 +1443,14 @@ static int ath9k_add_interface(struct ieee80211_hw *hw,
                }
        }
 
-       if ((ah->opmode == NL80211_IFTYPE_ADHOC) ||
-           ((vif->type == NL80211_IFTYPE_ADHOC) &&
-            sc->nvifs > 0)) {
-               ath_err(common, "Cannot create ADHOC interface when other"
-                       " interfaces already exist.\n");
+       if ((ah->opmode == NL80211_IFTYPE_ADHOC) && (sc->nvifs > 0)) {
+               ath_err(common, "Cannot create any other interface when an 
ADHOC interface already exists.\n");
+               ret = -EINVAL;
+               goto out;
+       }
+
+       if ((vif->type == NL80211_IFTYPE_ADHOC) && (sc->nvifs > 0)) {
+               ath_err(common, "Cannot create ADHOC interface when other 
interfaces already exist.\n");
                ret = -EINVAL;
                goto out;
        }
-- 
1.7.0.4

_______________________________________________
ath9k-devel mailing list
ath9k-devel@lists.ath9k.org
https://lists.ath9k.org/mailman/listinfo/ath9k-devel

Reply via email to