Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b25ad59c authored by Chaoli Zhou's avatar Chaoli Zhou Committed by Madan Koyyalamudi
Browse files

qcacld-3.0: Add vendor command support for GPIO Configuration

Add vendor command support for GPIO configuration.
It adds wma wrapper functions to send wmi command
for GPIO configuration, which are called by cfg80211
API in hdd layer
Change-Id: I9a02072afaab893d12fc9c991c8265b5aa19cd75
CRs-Fixed: 2753571
parent 3cd0525e
Loading
Loading
Loading
Loading
+33 −2
Original line number Diff line number Diff line
@@ -293,6 +293,10 @@ ifeq ($(CONFIG_WLAN_HANG_EVENT), y)
HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_hang_event.o
endif

ifeq ($(CONFIG_FEATURE_GPIO_CFG),y)
HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_gpio.o
endif

###### OSIF_SYNC ########
SYNC_DIR := os_if/sync
SYNC_INC_DIR := $(SYNC_DIR)/inc
@@ -720,7 +724,8 @@ OS_IF_DIR := $(WLAN_COMMON_ROOT)/os_if
OS_IF_INC += -I$(WLAN_COMMON_INC)/os_if/linux \
            -I$(WLAN_COMMON_INC)/os_if/linux/scan/inc \
            -I$(WLAN_COMMON_INC)/os_if/linux/spectral/inc \
            -I$(WLAN_COMMON_INC)/os_if/linux/crypto/inc
            -I$(WLAN_COMMON_INC)/os_if/linux/crypto/inc \
            -I$(WLAN_COMMON_INC)/os_if/linux/gpio/inc

OS_IF_OBJ += $(OS_IF_DIR)/linux/wlan_osif_request_manager.o \
	     $(OS_IF_DIR)/linux/crypto/src/wlan_nl_to_crypto_params.o
@@ -811,6 +816,24 @@ WLAN_CFR_OBJS := $(WLAN_CFR_CORE_DIR)/cfr_common.o \
		$(WLAN_COMMON_ROOT)/target_if/cfr/src/target_if_cfr_6018.o \
		$(WLAN_COMMON_ROOT)/target_if/cfr/src/target_if_cfr_6490.o
endif
############# GPIO_CFG ############
UMAC_GPIO_DIR := gpio
UMAC_GPIO_DISP_INC_DIR := $(UMAC_GPIO_DIR)/dispatcher/inc
UMAC_GPIO_CORE_INC_DIR := $(UMAC_GPIO_DIR)/core/inc
UMAC_GPIO_CORE_DIR := $(WLAN_COMMON_ROOT)/$(UMAC_GPIO_DIR)/core/src
UMAC_GPIO_DISP_DIR := $(WLAN_COMMON_ROOT)/$(UMAC_GPIO_DIR)/dispatcher/src
UMAC_TARGET_GPIO_INC := -I$(WLAN_COMMON_INC)/target_if/gpio

UMAC_GPIO_INC := -I$(WLAN_COMMON_INC)/$(UMAC_GPIO_DISP_INC_DIR) \
			-I$(WLAN_COMMON_INC)/$(UMAC_GPIO_CORE_INC_DIR) \
			-I$(WLAN_COMMON_INC)/$(UMAC_TARGET_GPIO_INC)
ifeq ($(CONFIG_FEATURE_GPIO_CFG),y)
UMAC_GPIO_OBJS := $(UMAC_GPIO_DISP_DIR)/wlan_gpio_tgt_api.o \
		$(UMAC_GPIO_DISP_DIR)/wlan_gpio_ucfg_api.o \
		$(UMAC_GPIO_CORE_DIR)/wlan_gpio_api.o \
		$(WLAN_COMMON_ROOT)/os_if/linux/gpio/src/wlan_cfg80211_gpio.o \
		$(WLAN_COMMON_ROOT)/target_if/gpio/target_if_gpio.o
endif
############# UMAC_GREEN_AP ############
UMAC_GREEN_AP_DIR := umac/green_ap
UMAC_GREEN_AP_DISP_INC_DIR := $(UMAC_GREEN_AP_DIR)/dispatcher/inc
@@ -1384,6 +1407,11 @@ ifeq ($(CONFIG_WLAN_HANG_EVENT), y)
WMI_OBJS += $(WMI_OBJ_DIR)/wmi_hang_event.o
endif

ifeq ($(CONFIG_FEATURE_GPIO_CFG), y)
WMI_OBJS += $(WMI_OBJ_DIR)/wmi_unified_gpio_api.o
WMI_OBJS += $(WMI_OBJ_DIR)/wmi_unified_gpio_tlv.o
endif

########### FWLOG ###########
FWLOG_DIR := $(WLAN_COMMON_ROOT)/utils/fwlog

@@ -2128,6 +2156,8 @@ INCS += $(UMAC_COMMON_INC)
INCS +=		$(UMAC_SPECTRAL_INC)
INCS +=		$(WLAN_CFR_INC)
INCS +=		$(UMAC_TARGET_SPECTRAL_INC)
INCS +=		$(UMAC_GPIO_INC)
INCS +=		$(UMAC_TARGET_GPIO_INC)
INCS +=		$(UMAC_DBR_INC)
INCS +=		$(UMAC_CRYPTO_INC)

@@ -2245,7 +2275,7 @@ OBJS += $(WCFG_OBJS)
OBJS +=		$(UMAC_SPECTRAL_OBJS)
OBJS +=		$(UMAC_DBR_OBJS)
OBJS +=		$(WLAN_CFR_OBJS)

OBJS +=		$(UMAC_GPIO_OBJS)
ifeq ($(CONFIG_QCACLD_FEATURE_GREEN_AP), y)
OBJS +=		$(UMAC_GREEN_AP_OBJS)
endif
@@ -2325,6 +2355,7 @@ cppflags-$(CONFIG_WLAN_FEATURE_ELNA) += -DWLAN_FEATURE_ELNA

cppflags-$(CONFIG_PLD_IPCI_ICNSS_FLAG) += -DCONFIG_PLD_IPCI_ICNSS
cppflags-$(CONFIG_PLD_SDIO_CNSS_FLAG) += -DCONFIG_PLD_SDIO_CNSS
cppflags-$(CONFIG_FEATURE_GPIO_CFG) += -DWLAN_FEATURE_GPIO_CFG

ifeq ($(CONFIG_PLD_PCIE_CNSS_FLAG), y)
ifeq ($(CONFIG_PCIE_FW_SIM), y)
+2 −0
Original line number Diff line number Diff line
@@ -1069,5 +1069,7 @@ endif

CONFIG_WLAN_HANG_EVENT := y

CONFIG_FEATURE_GPIO_CFG := y

#Enable VDEV Response wakelock feature
CONFIG_FEATURE_VDEV_RSP_WAKELOCK := y
+60 −0
Original line number Diff line number Diff line
/*
 * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

/**
 * DOC: wlan_hdd_gpio.h
 *
 * This Header file provide declaration for cfg80211 command handler API
 */

#ifndef __WLAN_HDD_GPIO_H__
#define __WLAN_HDD_GPIO_H__

#include <qdf_types.h>
#include <net/cfg80211.h>
#include <qca_vendor.h>

#ifdef WLAN_FEATURE_GPIO_CFG
#include <wlan_cfg80211_gpio.h>

#define FEATURE_GPIO_CFG_VENDOR_COMMANDS \
{ \
	.info.vendor_id = QCA_NL80211_VENDOR_ID, \
	.info.subcmd = QCA_NL80211_VENDOR_SUBCMD_GPIO_CONFIG_COMMAND, \
	.flags = WIPHY_VENDOR_CMD_NEED_WDEV | \
		 WIPHY_VENDOR_CMD_NEED_NETDEV | \
		 WIPHY_VENDOR_CMD_NEED_RUNNING, \
	.doit = wlan_hdd_cfg80211_set_gpio_config, \
	vendor_command_policy(wlan_cfg80211_gpio_config_policy, \
			      QCA_WLAN_VENDOR_ATTR_GPIO_PARAM_MAX) \
},

/**
 * wlan_hdd_cfg80211_set_gpio_config() - set GPIO config
 * @wiphy: wiphy structure pointer
 * @wdev: Wireless device structure pointer
 * @data: Pointer to the data to be passed via vendor interface
 * @data_len: Length of the data to be passed
 *
 * Return: Return the Success or Failure code
 */
int wlan_hdd_cfg80211_set_gpio_config(struct wiphy *wiphy,
				      struct wireless_dev *wdev,
				      const void *data, int data_len);
#else
#define FEATURE_GPIO_CFG_VENDOR_COMMANDS
#endif /* WLAN_FEATURE_GPIO_CFG */
#endif /* __WLAN_CFG80211_GPIO_CFG_H__ */
+2 −0
Original line number Diff line number Diff line
@@ -153,6 +153,7 @@
#include <qdf_hang_event_notifier.h>
#include "hif.h"
#include "wlan_hdd_ioctl.h"
#include "wlan_hdd_gpio.h"
#define g_mode_rates_size (12)
#define a_mode_rates_size (8)
@@ -15685,6 +15686,7 @@ const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] = {
	FEATURE_MPTA_HELPER_COMMANDS
	FEATURE_HW_CAPABILITY_COMMANDS
	FEATURE_THERMAL_VENDOR_COMMANDS
	FEATURE_GPIO_CFG_VENDOR_COMMANDS
};
struct hdd_context *hdd_cfg80211_wiphy_alloc(void)
+108 −0
Original line number Diff line number Diff line
/*
 * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

/**
 * DOC: defines driver functions interfacing with linux kernel
 */
#include <qdf_list.h>
#include <qdf_status.h>
#include <linux/wireless.h>
#include <linux/netdevice.h>
#include <wlan_cfg80211.h>
#include <wlan_osif_priv.h>
#include <osif_psoc_sync.h>
#include <qdf_mem.h>
#include <wlan_utility.h>
#include "wlan_hdd_main.h"
#include "cfg_ucfg_api.h"
#include <wlan_hdd_gpio.h>

/**
 * wlan_cfg80211_set_gpio_config - Set the gpio configuration
 * @wiphy: pointer to wiphy
 * @wdev: pointer to wireless_wdev
 * @data: pointer to data
 * @data_len: data length
 *
 * __wlan_cfg80211_set_gpio_config will forward the GPIO setting to FW by
 * WMI_GPIO_CONFIG/OUTPUT_CMDID
 *
 * Return: 0 on success; errno on failure
 */
static int
__wlan_hdd_cfg80211_set_gpio_config(struct wiphy *wiphy,
				    struct wireless_dev *wdev,
				    const void *data,
				    int data_len)
{
	int ret;
	struct hdd_context *hdd_ctx = wiphy_priv(wiphy);
	struct net_device *dev = wdev->netdev;
	struct hdd_adapter *adapter;

	hdd_enter();

	ret = wlan_hdd_validate_context(hdd_ctx);
	if (ret)
		return ret;

	if (hdd_get_conparam() == QDF_GLOBAL_FTM_MODE) {
		hdd_err("Command not allowed in FTM mode");
		return -EPERM;
	}

	adapter = WLAN_HDD_GET_PRIV_PTR(dev);
	if (wlan_hdd_validate_vdev_id(adapter->vdev_id))
		return -EINVAL;

	ret = wlan_cfg80211_start_gpio_config(wiphy,
					      hdd_ctx->psoc,
					      data, data_len);
	hdd_exit();

	return ret;
}

/**
 * wlan_hdd_cfg80211_set_gpio_config() - Set GPIO Configuration
 * @wiphy: wiphy structure pointer
 * @wdev: Wireless device structure pointer
 * @data: Pointer to the data received
 * @data_len: Length of @data
 *
 * Return: 0 on success; errno on failure
 */
int wlan_hdd_cfg80211_set_gpio_config(struct wiphy *wiphy,
				      struct wireless_dev *wdev,
				      const void *data, int data_len)
{
	struct osif_psoc_sync *psoc_sync;
	int errno;

	errno = osif_psoc_sync_op_start(wiphy_dev(wiphy), &psoc_sync);
	if (errno)
		return errno;

	hdd_err("__DEBUG__");
	errno = __wlan_hdd_cfg80211_set_gpio_config(wiphy,
						    wdev,
						    data,
						    data_len);

	osif_psoc_sync_op_stop(psoc_sync);

	return errno;
}
Loading