|
@@ -1741,6 +1741,12 @@ static const struct nl80211_vendor_cmd_info wlan_hdd_cfg80211_vendor_events[] =
|
|
|
#ifdef WLAN_FEATURE_CONNECTIVITY_LOGGING
|
|
|
FEATURE_CONNECTIVITY_LOGGING_EVENT
|
|
|
#endif
|
|
|
+#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
|
|
+ [QCA_NL80211_VENDOR_SUBCMD_ROAM_EVENTS_INDEX] = {
|
|
|
+ .vendor_id = QCA_NL80211_VENDOR_ID,
|
|
|
+ .subcmd = QCA_NL80211_VENDOR_SUBCMD_ROAM_EVENTS,
|
|
|
+ },
|
|
|
+#endif
|
|
|
};
|
|
|
|
|
|
/**
|
|
@@ -15716,6 +15722,133 @@ err:
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
|
|
+/**
|
|
|
+ * enum roam_stats_set_params - Different types of params to set the roam stats
|
|
|
+ * @ROAM_RT_STATS_DISABLED: Roam stats feature disabled
|
|
|
+ * @ROAM_RT_STATS_ENABLED: Roam stats feature enabled
|
|
|
+ * @ROAM_RT_STATS_ENABLED_IN_SUSPEND_MODE: Roam stats enabled in suspend mode
|
|
|
+ */
|
|
|
+enum roam_stats_set_params {
|
|
|
+ ROAM_RT_STATS_DISABLED = 0,
|
|
|
+ ROAM_RT_STATS_ENABLED = 1,
|
|
|
+ ROAM_RT_STATS_ENABLED_IN_SUSPEND_MODE = 2,
|
|
|
+};
|
|
|
+
|
|
|
+#define EVENTS_CONFIGURE QCA_WLAN_VENDOR_ATTR_ROAM_EVENTS_CONFIGURE
|
|
|
+#define SUSPEND_STATE QCA_WLAN_VENDOR_ATTR_ROAM_EVENTS_SUSPEND_STATE
|
|
|
+
|
|
|
+static const struct nla_policy
|
|
|
+set_roam_events_policy[QCA_WLAN_VENDOR_ATTR_ROAM_EVENTS_MAX + 1] = {
|
|
|
+ [QCA_WLAN_VENDOR_ATTR_ROAM_EVENTS_CONFIGURE] = {.type = NLA_U8},
|
|
|
+ [QCA_WLAN_VENDOR_ATTR_ROAM_EVENTS_SUSPEND_STATE] = {.type = NLA_FLAG},
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * __wlan_hdd_cfg80211_set_roam_events() - set roam stats
|
|
|
+ * @wiphy: wiphy pointer
|
|
|
+ * @wdev: pointer to struct wireless_dev
|
|
|
+ * @data: pointer to incoming NL vendor data
|
|
|
+ * @data_len: length of @data
|
|
|
+ *
|
|
|
+ * Return: 0 on success; error number otherwise.
|
|
|
+ */
|
|
|
+static int __wlan_hdd_cfg80211_set_roam_events(struct wiphy *wiphy,
|
|
|
+ struct wireless_dev *wdev,
|
|
|
+ const void *data,
|
|
|
+ int data_len)
|
|
|
+{
|
|
|
+ struct hdd_context *hdd_ctx = wiphy_priv(wiphy);
|
|
|
+ struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(wdev->netdev);
|
|
|
+ struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_ROAM_EVENTS_MAX + 1];
|
|
|
+ QDF_STATUS status;
|
|
|
+ int ret;
|
|
|
+ uint8_t config, state, param = 0;
|
|
|
+
|
|
|
+ ret = wlan_hdd_validate_context(hdd_ctx);
|
|
|
+ if (ret != 0) {
|
|
|
+ hdd_err("Invalid hdd_ctx");
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = hdd_validate_adapter(adapter);
|
|
|
+ if (ret != 0) {
|
|
|
+ hdd_err("Invalid adapter");
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (adapter->device_mode != QDF_STA_MODE) {
|
|
|
+ hdd_err("STATS supported in only STA mode!");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (wlan_cfg80211_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_ROAM_EVENTS_MAX,
|
|
|
+ data, data_len, set_roam_events_policy)) {
|
|
|
+ hdd_err("Invalid ATTR");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!tb[EVENTS_CONFIGURE]) {
|
|
|
+ hdd_err("roam events configure not present");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ config = nla_get_u8(tb[EVENTS_CONFIGURE]);
|
|
|
+ hdd_debug("roam stats configured: %d", config);
|
|
|
+
|
|
|
+ if (!tb[SUSPEND_STATE]) {
|
|
|
+ hdd_debug("suspend state not present");
|
|
|
+ param = config ? ROAM_RT_STATS_ENABLED : ROAM_RT_STATS_DISABLED;
|
|
|
+ } else if (config == ROAM_RT_STATS_ENABLED) {
|
|
|
+ state = nla_get_flag(tb[SUSPEND_STATE]);
|
|
|
+ hdd_debug("Suspend state configured: %d", state);
|
|
|
+ param = ROAM_RT_STATS_ENABLED |
|
|
|
+ ROAM_RT_STATS_ENABLED_IN_SUSPEND_MODE;
|
|
|
+ }
|
|
|
+
|
|
|
+ hdd_debug("roam events param: %d", param);
|
|
|
+ ucfg_cm_update_roam_rt_stats(hdd_ctx->psoc,
|
|
|
+ param, ROAM_RT_STATS_ENABLE);
|
|
|
+
|
|
|
+ status = ucfg_cm_roam_send_rt_stats_config(hdd_ctx->pdev,
|
|
|
+ adapter->vdev_id, param);
|
|
|
+
|
|
|
+ return qdf_status_to_os_return(status);
|
|
|
+}
|
|
|
+
|
|
|
+#undef EVENTS_CONFIGURE
|
|
|
+#undef SUSPEND_STATE
|
|
|
+
|
|
|
+/**
|
|
|
+ * wlan_hdd_cfg80211_set_roam_events() - set roam stats
|
|
|
+ * @wiphy: wiphy pointer
|
|
|
+ * @wdev: pointer to struct wireless_dev
|
|
|
+ * @data: pointer to incoming NL vendor data
|
|
|
+ * @data_len: length of @data
|
|
|
+ *
|
|
|
+ * Return: 0 on success; error number otherwise.
|
|
|
+ */
|
|
|
+static int wlan_hdd_cfg80211_set_roam_events(struct wiphy *wiphy,
|
|
|
+ struct wireless_dev *wdev,
|
|
|
+ const void *data,
|
|
|
+ int data_len)
|
|
|
+{
|
|
|
+ int errno;
|
|
|
+ struct osif_vdev_sync *vdev_sync;
|
|
|
+
|
|
|
+ errno = osif_vdev_sync_op_start(wdev->netdev, &vdev_sync);
|
|
|
+ if (errno)
|
|
|
+ return errno;
|
|
|
+
|
|
|
+ errno = __wlan_hdd_cfg80211_set_roam_events(wiphy, wdev,
|
|
|
+ data, data_len);
|
|
|
+
|
|
|
+ osif_vdev_sync_op_stop(vdev_sync);
|
|
|
+
|
|
|
+ return errno;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
/**
|
|
|
* __wlan_hdd_cfg80211_get_chain_rssi() - get chain rssi
|
|
|
* @wiphy: wiphy pointer
|
|
@@ -16948,6 +17081,19 @@ const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] = {
|
|
|
#ifdef WLAN_FEATURE_PKT_CAPTURE
|
|
|
FEATURE_MONITOR_MODE_VENDOR_COMMANDS
|
|
|
#endif
|
|
|
+
|
|
|
+#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
|
|
+ {
|
|
|
+ .info.vendor_id = QCA_NL80211_VENDOR_ID,
|
|
|
+ .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_ROAM_EVENTS,
|
|
|
+ .flags = WIPHY_VENDOR_CMD_NEED_WDEV |
|
|
|
+ WIPHY_VENDOR_CMD_NEED_NETDEV |
|
|
|
+ WIPHY_VENDOR_CMD_NEED_RUNNING,
|
|
|
+ .doit = wlan_hdd_cfg80211_set_roam_events,
|
|
|
+ vendor_command_policy(set_roam_events_policy,
|
|
|
+ QCA_WLAN_VENDOR_ATTR_ROAM_EVENTS_MAX)
|
|
|
+ },
|
|
|
+#endif
|
|
|
};
|
|
|
|
|
|
struct hdd_context *hdd_cfg80211_wiphy_alloc(void)
|