wlan: Add cfg80211_ops support for channel switch
Adds cfg80211_ops support for channel switch.
Change-Id: Iabefc33a94d72f22404f97e8fc69d3591e6e7b7f
CRs-Fixed: 2143138
diff --git a/CORE/HDD/inc/wlan_hdd_cfg80211.h b/CORE/HDD/inc/wlan_hdd_cfg80211.h
index ef99dd0..7faca82 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg80211.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg80211.h
@@ -100,6 +100,11 @@
#endif
#endif
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)) \
+ || defined(BACKPORTED_CHANNEL_SWITCH_PRESENT)
+#define CHANNEL_SWITCH_SUPPORTED
+#endif
+
#define MAX_CHANNEL NUM_2_4GHZ_CHANNELS + NUM_5GHZ_CHANNELS
#define IS_CHANNEL_VALID(channel) ((channel >= 0 && channel < 15) \
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 4a3a936..53bbdfa 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -20793,6 +20793,74 @@
}
#endif
+#ifdef CHANNEL_SWITCH_SUPPORTED
+/**
+ * __wlan_hdd_cfg80211_channel_switch()- function to switch
+ * channel in SAP/GO
+ * @wiphy: wiphy pointer
+ * @dev: dev pointer.
+ * @csa_params: Change channel params
+ *
+ * This function is called to switch channel in SAP/GO
+ *
+ * Return: 0 if success else return non zero
+ */
+static int __wlan_hdd_cfg80211_channel_switch(struct wiphy *wiphy,
+ struct net_device *dev, struct cfg80211_csa_settings *csa_params)
+{
+ hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
+ hdd_context_t *hdd_ctx;
+ uint8_t channel;
+ int ret;
+ v_CONTEXT_t vos_ctx;
+
+ hddLog(LOGE, FL("Set Freq %d"), csa_params->chandef.chan->center_freq);
+
+ hdd_ctx = WLAN_HDD_GET_CTX(adapter);
+ ret = wlan_hdd_validate_context(hdd_ctx);
+ if (ret)
+ return ret;
+
+ vos_ctx = (WLAN_HDD_GET_CTX(adapter))->pvosContext;
+ if (!vos_ctx) {
+ hddLog(LOGE, FL("Vos ctx is null"));
+ return -EINVAL;
+ }
+
+ if ((WLAN_HDD_SOFTAP != adapter->device_mode) &&
+ (WLAN_HDD_P2P_GO != adapter->device_mode))
+ return -ENOTSUPP;
+
+ channel = vos_freq_to_chan(csa_params->chandef.chan->center_freq);
+ ret = wlansap_set_channel_change(vos_ctx, channel);
+
+ return ret;
+}
+
+/**
+ * wlan_hdd_cfg80211_channel_switch()- function to switch
+ * channel in SAP/GO
+ * @wiphy: wiphy pointer
+ * @dev: dev pointer.
+ * @csa_params: Change channel params
+ *
+ * This function is called to switch channel in SAP/GO
+ *
+ * Return: 0 if success else return non zero
+ */
+static int wlan_hdd_cfg80211_channel_switch(struct wiphy *wiphy,
+ struct net_device *dev, struct cfg80211_csa_settings *csa_params)
+{
+ int ret;
+
+ vos_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_channel_switch(wiphy, dev, csa_params);
+ vos_ssr_unprotect(__func__);
+
+ return ret;
+}
+#endif
+
/* cfg80211_ops */
static struct cfg80211_ops wlan_hdd_cfg80211_ops =
{
@@ -20867,5 +20935,9 @@
defined(CFG80211_ABORT_SCAN)
.abort_scan = wlan_hdd_cfg80211_abort_scan,
#endif
+#ifdef CHANNEL_SWITCH_SUPPORTED
+ .channel_switch = wlan_hdd_cfg80211_channel_switch,
+#endif
+
};