|
@@ -3,6 +3,7 @@
|
|
|
*
|
|
|
* Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
|
|
|
* Copyright 2013-2015 Intel Mobile Communications GmbH
|
|
|
+ * Copyright (C) 2015-2016 Intel Deutschland GmbH
|
|
|
*
|
|
|
* This file is GPLv2 as found in COPYING.
|
|
|
*/
|
|
@@ -152,6 +153,39 @@ static void ieee80211_stop_p2p_device(struct wiphy *wiphy,
|
|
|
ieee80211_sdata_stop(IEEE80211_WDEV_TO_SUB_IF(wdev));
|
|
|
}
|
|
|
|
|
|
+static int ieee80211_start_nan(struct wiphy *wiphy,
|
|
|
+ struct wireless_dev *wdev,
|
|
|
+ struct cfg80211_nan_conf *conf)
|
|
|
+{
|
|
|
+ struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ mutex_lock(&sdata->local->chanctx_mtx);
|
|
|
+ ret = ieee80211_check_combinations(sdata, NULL, 0, 0);
|
|
|
+ mutex_unlock(&sdata->local->chanctx_mtx);
|
|
|
+ if (ret < 0)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ ret = ieee80211_do_open(wdev, true);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ ret = drv_start_nan(sdata->local, sdata, conf);
|
|
|
+ if (ret)
|
|
|
+ ieee80211_sdata_stop(sdata);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+static void ieee80211_stop_nan(struct wiphy *wiphy,
|
|
|
+ struct wireless_dev *wdev)
|
|
|
+{
|
|
|
+ struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
|
|
+
|
|
|
+ drv_stop_nan(sdata->local, sdata);
|
|
|
+ ieee80211_sdata_stop(sdata);
|
|
|
+}
|
|
|
+
|
|
|
static int ieee80211_set_noack_map(struct wiphy *wiphy,
|
|
|
struct net_device *dev,
|
|
|
u16 noack_map)
|
|
@@ -3464,4 +3498,6 @@ const struct cfg80211_ops mac80211_config_ops = {
|
|
|
.set_ap_chanwidth = ieee80211_set_ap_chanwidth,
|
|
|
.add_tx_ts = ieee80211_add_tx_ts,
|
|
|
.del_tx_ts = ieee80211_del_tx_ts,
|
|
|
+ .start_nan = ieee80211_start_nan,
|
|
|
+ .stop_nan = ieee80211_stop_nan,
|
|
|
};
|