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

Unverified Commit c4d6c368 authored by derfelot's avatar derfelot
Browse files

staging: qcacld-3.0: Merge CAF tag LA.UM.8.4.r1-05300-8x98.0

* tag 'LA.UM.8.4.r1-05300-8x98.0':
  qcacld-3.0: Set power save enable directly to FW
  qcacld-3.0: Fix compilation error related to NAN
  Release 5.2.03.20Y
  qcacld-3.0: Enable 6GHz feature for WHUNT
  qcacld-3.0: Fix compile errors of WLAN_SEND_DSCP_UP_MAP_TO_FW
  Release 5.2.03.20Z
  qcacld-3.0: Log vdev id and opmode while creating pesession
  Release 5.2.03.21
  qcacld-3.0: Add new config for BTM offload
  Release 5.2.03.21A
  qcacld-3.0: Use in WLAN_MAX_VDEVS hdd_indicate_management_frames
  Release 5.2.03.21B
  qcacld-3.0: Add pld API to get the audio timestamp
  qcacld-3.0: Remove wext handler on mon mode adapter deinit
  Release 5.2.03.21C
  qcacld-3.0: Validate assoc response IE len before copy
  Release 5.2.03.21D
  qcacld-3.0: Add FTM TIME SYNC component in target_if
  Release 5.2.03.21E
  qcacld-3.0: Change default value of idle_roam_rssi_delta to 3
  Release 5.2.03.21F
  qcacld-3.0: Support coex parameter set to fw although chainmask set failure
  Release 5.2.03.21G
  qcacld-3.0: Add INI parameter for packet capture mode support
  Release 5.2.03.21H
  qcacld-3.0: Optimize logs in TX assoc req and RX assoc rsp
  Release 5.2.03.21I
  qcacld-3.0: Enable FTM time sync feature
  Release 5.2.03.21J
  qcacld-3.0: Fix compilation errors
  Release 5.2.03.21K
  qcacld-3.0: Add function to handle the FTM time sync events from target
  Release 5.2.03.21L
  qcacld-3.0: Cleanup logs in HDD APF path
  Release 5.2.03.21M
  qcacld-3.0: Optimize PMO prints
  qcacld-3.0: Optimize LL Stats prints
  Release 5.2.03.21N
  qcacld-3.0: Optimize log in roam and connect path
  Release 5.2.03.21O
  qcacld-3.0: Fix DHCP indication to FW feature for broadcast exchange
  qcacld-3.0: Add param to configure channel avoidance indication from FW
  qcacld-3.0: Clean up logs in STATS path
  qcacld-3.0: Rearrage roam code in CSR layer
  qcacld-3.0: Add support to get roam scan channels from fw
  Release 5.2.03.21P
  qcacld-3.0: Create mon thread for packet capture
  qcacld-3.0: Resume/suspend of mon thread for packet capture
  Release 5.2.03.21Q
  qcacld-3.0: Update trace dump to nofl dump
  qcacld-3.0: Log optimization for beacon report
  Release 5.2.03.21R
  qcacld-3.0: Add INI support for FIPS handshake offload feature
  Release 5.2.03.21S
  qcacld-3.0: Move disconnect ie info to a structure
  qcacld-3.0: Forward disconnect IEs from deauth roam event to kernel
  qcacld-3.0: Fill correct reason code after deauth roaming failure
  qcacld-3.0: Extract disconnect reason code from notif_params
  qcacld-3.0: Fix logging for the AUTH and Assoc frames
  Release 5.2.03.21T
  qcacld-3.0: Add support for packet capture callbacks
  qcacld-3.0: Register network interface for pktcapture mode
  qcacld-3.0: Log optimization for NCHO
  qcacld-3.0: Register/deregister packet capture callbacks
  Release 5.2.03.21U
  qcacld-3.0: Optimize logs in STA disconnect path
  Release 5.2.03.21V
  qcacld-3.0: Optimize CSA logs for SAP and STA
  Release 5.2.03.21W
  qcacld-3.0: Add reason codes for internal disconnections
  qcacld-3.0: Log enhancement in ACS
  Release 5.2.03.21X
  qcacld-3.0: Avoid sending tdls peer assoc cmd after roam start
  Release 5.2.03.21Y
  qcacld-3.0: Use session id while get roam scan ch from fw
  Release 5.2.03.21Z
  qcacld-3.0: Send vdev param command to set pkt capture mode
  qcacld-3.0: Combine and print channel for ACS and roam channels
  Release 5.2.03.22
  qcacld-3.0: Log enhancement for policy mgr
  Release 5.2.03.22A
  qcacld-3.0: Reduce regulatory logging
  Release 5.2.03.22B
  qcacld-3.0: Update bit position of the supp mode in sta info
  Release 5.2.03.22C
  qcacld-3.0: Process Mgmt Tx and Rx frames for pktcapture mode
  qcacld-3.0: Add WMI EVENT handler for offloaded mgmt data
  qcacld-3.0: Register tx and rx ops for packet capture component
  Release 5.2.03.22D
  qcacld-3.0: Clear CONFIG_CLD_HL_SDIO_CORE
  Release 5.2.03.22E
  qcacld-3.0: Send last disconnect reason in sta_info to userspace
  qcacld-3.0: Send disconnected AP beacon IEs to userspace in sta_info
  qcacld-3.0: Send all assoc request IE to hostapd in SAP mode
  qcacld-3.0: Send assoc request IEs in STA_INFO in SAP mode
  qcacld-3.0: Send proper reason code for STA kickout disconnections
  Release 5.2.03.22F
  qcacld-3.0: Process Rx data packet for pkt capture mode
  qcacld-3.0: Process Tx data packet for pkt capture mode
  Release 5.2.03.22G
  qcacld-3.0: Add ini for FTM time sync component
  Release 5.2.03.22H
  qcacld-3.0: Add support to trigger FTM time sync feature
  Release 5.2.03.22I
  qcacld-3.0: Optimize logs after connect complete
  Release 5.2.03.22J
  qcacld-3.0: suspend scan before scheduler thread suspended
  Release 5.2.03.22K
  qcacld-3.0: Add check for STA disconnect in pe disconnect cb
  qcacld-3.0: enable SMMU S1 and METERING Features in IPA
  Release 5.2.03.22L
  qcacld-3.0: Store rrm session bssid
  qcacld-3.0: Race condition handling for roam during disconnect
  Release 5.2.03.22M
  qcacld-3.0: Add sysfs entry to display ftm time sync offset
  Release 5.2.03.22N
  qcacld-3.0: Remove unnecessary enter exit from PMO functions
  qcacld-3.0: Improve logging in driver
  Release 5.2.03.22O
  qcacld-3.0: map DSCP CS6(48) to UP AC_VO(7)
  Release 5.2.03.22P
  qcacld-3.0: Set MCC quota for STA+CLI
  qcacld-3.0: Remove validate_context check from wlan_resume
  qcacld-3.0: Add support to include ACK status and tx retry count
  Release 5.2.03.22Q
  qcacld-3.0: Clear ftm_time_sync offset on disconnect and add bssid in sysfs
  qcacld-3.0: Call the cnss utils API to get audio timestamp
  qcacld-3.0: Enable the ftm_time_sync feature based on kernel defconfig
  Release 5.2.03.22R
  qcacld-3.0: Fix OUT OF SYNC for Mgmt Tx Pkts on Virtual Mon Interface
  Release 5.2.03.22S
  qcacld-3.0: Record the channel number for pktcapture mode
  qcacld-3.0: Add vdev check for ARP/NS offload in NaN mode
  Release 5.2.03.22T
  qcacld-3.0: Log disconnect reason with info level
  Release 5.2.03.22U
  qcacld-3.0: Introduce ini for roam triggers including sta kickout trigger
  Release 5.2.03.22V
  qcacld-3.0: Refactor 11kv logging
  Release 5.2.03.22W
  qcacld-3.0: Update default value of dp_proto_event_bitmap
  Release 5.2.03.22X
  qcacld-3.0: Add ini support to skip full scan after bmiss
  Release 5.2.03.22Y
  qcacld-3.0: Check pmf status while processing mgmt packets
  Release 5.2.03.22Z
  qcacld-3.0: Record the channel number for pktcapture mode
  Release 5.2.03.23
  qcacld-3.0: Enable packet capture feature
  qcacld-3.0: Update roam count in LFR3 roaming
  Release 5.2.03.23A
  qcacld-3.0: Restore default RSO configs in driver only on disconnect
  Release 5.2.03.23B
  qcacld-3.0: Query sta stats on disconnect in case of SAP
  Release 5.2.03.23C
  qcacld-3.0: Print SSID info when beacon report request is received
  Release 5.2.03.23D
  qcacld-3.0: Fix passing invalid ipa iface
  qcacld-3.0: Introduce a new compile time flag and INI
  qcacld-3.0: Add support for sae roaming with single PMK
  qcacld-3.0: Update sae_single_pmk info in RSO start command
  qcacld-3.0: Update PMK info in RSO update command
  qcacld-3.0: Clear same pmk info while processing del/flush pmk
  Release 5.2.03.23E
  qcacld-3.0: disable SMMU S1 for few helium targets
  Release 5.2.03.23F
  qcacld-3.0: Update proper copyright years
  Release 5.2.03.23G
  qcacld-3.0: Disable all roam scan in case p2p connection is present
  Release 5.2.03.23H
  qcacld-3.0: Have enum to string conversion APIs under DEBUG define
  Release 5.2.03.23I
  qcacld-3.0: Handle illegal memory access during driver unload
  Release 5.2.03.23J
  qcacld-3.0: Fix monitor mode radiotap bw and rssi info
  Release 5.2.03.23K
  qcacld-3.0: Periodically print ARP and DNS stats after STA association
  Release 5.2.03.23L
  qcacld-3.0: Optimize PMO logs
  Release 5.2.03.23M
  qcacld-3.0: Add INI support for DFS Channel Ageout Time
  Release 5.2.03.23N
  qcacld-3.0: Disable LRO/GRO when NDI peer is created
  Release 5.2.03.23O
  qcacld-3.0: Fix compilation issue
  Release 5.2.03.23P
  qcacld-3.0: Check for vendor vht ie to fill assoc ind param
  Release 5.2.03.23Q
  qcacld-3.0: Log enhancement for PNO scan
  Release 5.2.03.23R
  qcacld-3.0: Add more info in connect prints
  Release 5.2.03.23S
  qcacld-3.0: Stop bus_bw timer as part of stop_adapter for NDI
  Release 5.2.03.23T
  qcacld-3.0: Revert dot11 parser changes for beacon report err
  Release 5.2.03.23U
  qcacld-3.0: Try association with the same BSS on receiving assoc reject
  Release 5.2.03.23V
  qcacld-3.0: Stop roam timer when receiving deauth roam event
  Release 5.2.03.23W
  qcacld-3.0: Update the occupied channel list after CSA
  qcacld-3.0: Increase roam failure reason buffer size
  Release 5.2.03.23X
  qcacld-3.0: Process pkt_capture APIs based on packet capture mode
  Release 5.2.03.23Y
parents 30ca91cd f1d82018
Loading
Loading
Loading
Loading
+29 −3
Original line number Diff line number Diff line
@@ -69,6 +69,10 @@ HDD_OBJS := $(HDD_SRC_DIR)/wlan_hdd_assoc.o \
		$(HDD_SRC_DIR)/wlan_hdd_wmm.o \
		$(HDD_SRC_DIR)/wlan_hdd_wowl.o

ifeq ($(CONFIG_WLAN_FEATURE_PERIODIC_STA_STATS), y)
HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_periodic_sta_stats.o
endif

ifeq ($(CONFIG_WLAN_DEBUGFS), y)
HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_debugfs.o
HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_debugfs_llstat.o
@@ -193,6 +197,10 @@ ifeq ($(CONFIG_QCACLD_FEATURE_HW_CAPABILITY), y)
HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_hw_capability.o
endif

ifeq ($(CONFIG_FEATURE_WLAN_TIME_SYNC_FTM), y)
HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_ftm_time_sync.o
endif

#Flag to enable SAR Safety Feature
cppflags-$(CONFIG_SAR_SAFETY_FEATURE) += -DSAR_SAFETY_FEATURE

@@ -779,12 +787,19 @@ endif
######## PACKET CAPTURE ########

PKT_CAPTURE_DIR := components/pkt_capture
PKT_CAPTURE_TARGET_IF_DIR := components/target_if/pkt_capture/
PKT_CAPTURE_INC := -I$(WLAN_ROOT)/$(PKT_CAPTURE_DIR)/core/inc \
		  -I$(WLAN_ROOT)/$(PKT_CAPTURE_DIR)/dispatcher/inc
		  -I$(WLAN_ROOT)/$(PKT_CAPTURE_DIR)/dispatcher/inc \
		  -I$(WLAN_ROOT)/$(PKT_CAPTURE_TARGET_IF_DIR)/inc

ifeq ($(CONFIG_WLAN_FEATURE_PKT_CAPTURE), y)
PKT_CAPTURE_OBJS := $(PKT_CAPTURE_DIR)/core/src/wlan_pkt_capture_main.o \
		$(PKT_CAPTURE_DIR)/dispatcher/src/wlan_pkt_capture_ucfg_api.o
		$(PKT_CAPTURE_DIR)/core/src/wlan_pkt_capture_mon_thread.o \
		$(PKT_CAPTURE_DIR)/dispatcher/src/wlan_pkt_capture_ucfg_api.o \
		$(PKT_CAPTURE_DIR)/core/src/wlan_pkt_capture_mgmt_txrx.o \
		$(PKT_CAPTURE_DIR)/core/src/wlan_pkt_capture_data_txrx.o \
		$(PKT_CAPTURE_DIR)/dispatcher/src/wlan_pkt_capture_ucfg_api.o \
		$(PKT_CAPTURE_TARGET_IF_DIR)/src/target_if_pkt_capture.o
endif

########## FTM TIME SYNC ##########
@@ -795,7 +810,8 @@ FTM_TIME_SYNC_INC := -I$(WLAN_ROOT)/$(FTM_TIME_SYNC_DIR)/core/inc \

ifeq ($(CONFIG_FEATURE_WLAN_TIME_SYNC_FTM), y)
FTM_TIME_SYNC_OBJS := $(FTM_TIME_SYNC_DIR)/core/src/ftm_time_sync_main.o \
		$(FTM_TIME_SYNC_DIR)/dispatcher/src/ftm_time_sync_ucfg_api.o
		$(FTM_TIME_SYNC_DIR)/dispatcher/src/ftm_time_sync_ucfg_api.o \
		$(FTM_TIME_SYNC_DIR)/dispatcher/src/wlan_ftm_time_sync_tgt_api.o
endif

########## CLD TARGET_IF #######
@@ -838,6 +854,11 @@ CLD_TARGET_IF_INC += -I$(WLAN_ROOT)/$(CLD_TARGET_IF_DIR)/action_oui/inc
CLD_TARGET_IF_OBJ += $(CLD_TARGET_IF_DIR)/action_oui/src/target_if_action_oui.o
endif

ifeq ($(CONFIG_FEATURE_WLAN_TIME_SYNC_FTM), y)
CLD_TARGET_IF_INC += -I$(WLAN_ROOT)/$(CLD_TARGET_IF_DIR)/ftm_time_sync/inc
CLD_TARGET_IF_OBJ += $(CLD_TARGET_IF_DIR)/ftm_time_sync/src/target_if_ftm_time_sync.o
endif

############## UMAC P2P ###########
P2P_DIR := umac/p2p
P2P_CORE_DIR := $(P2P_DIR)/core
@@ -1661,6 +1682,8 @@ cppflags-$(CONFIG_FEATURE_FW_LOG_PARSING) += -DFEATURE_FW_LOG_PARSING
cppflags-$(CONFIG_WLAN_RECORD_RX_PADDR) += -DHIF_RECORD_RX_PADDR
cppflags-$(CONFIG_FEATURE_OEM_DATA) += -DFEATURE_OEM_DATA

cppflags-$(CONFIG_WLAN_FEATURE_PERIODIC_STA_STATS) += -DWLAN_FEATURE_PERIODIC_STA_STATS

ifeq ($(CONFIG_CNSS), y)
ifeq ($(CONFIG_CNSS_SDIO), y)
cppflags-y += -DCONFIG_PLD_SDIO_CNSS
@@ -2127,6 +2150,9 @@ cppflags-$(CONFIG_ENABLE_MTRACE_LOG) += -DENABLE_MTRACE_LOG
#Flag to enable/disable Adaptive 11r feature
cppflags-$(CONFIG_ADAPTIVE_11R) += -DWLAN_ADAPTIVE_11R

#Flag to enable/disable sae single pmk feature feature
cppflags-$(CONFIG_SAE_SINGLE_PMK) += -DWLAN_SAE_SINGLE_PMK

#Flag to enable NUD tracking
cppflags-$(CONFIG_WLAN_NUD_TRACKING) += -DWLAN_NUD_TRACKING

+116 −9
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@
#define _FTM_TIME_SYNC_MAIN_H_

#include <qdf_types.h>
#include <qdf_defer.h>
#include "ftm_time_sync_priv.h"
#include "ftm_time_sync_objmgr.h"

@@ -50,28 +51,134 @@
#define FTM_TIME_SYNC_EXIT() ftm_time_sync_debug("exit")

/**
 * ftm_time_sync_vdev_create_notification(): Handler for vdev create notify.
 * ftm_time_sync_vdev_create_notification() - Handler for vdev create notify.
 * @vdev: vdev which is going to be created by objmgr
 * @arg: argument for notification handler.
 * @arg: argument for notification handler
 *
 * Allocate and attach vdev private object.
 *
 * Return: QDF_STATUS status in case of success else return error.
 * Return: QDF_STATUS
 */
QDF_STATUS ftm_timesync_vdev_create_notification(struct wlan_objmgr_vdev *vdev,
QDF_STATUS ftm_time_sync_vdev_create_notification(struct wlan_objmgr_vdev *vdev,
						  void *arg);

/**
 * ftm_time_sync_vdev_destroy_notification(): Handler for vdev destroy notify.
 * ftm_time_sync_vdev_destroy_notification() - Handler for vdev destroy notify.
 * @vdev: vdev which is going to be destroyed by objmgr
 * @arg: argument for notification handler.
 * @arg: argument for notification handler
 *
 * Deallocate and detach vdev private object.
 *
 * Return QDF_STATUS status in case of success else return error
 * Return QDF_STATUS
 */
QDF_STATUS
ftm_timesync_vdev_destroy_notification(struct wlan_objmgr_vdev *vdev,
ftm_time_sync_vdev_destroy_notification(struct wlan_objmgr_vdev *vdev,
					void *arg);

/**
 * ftm_time_sync_psoc_create_notification() - Handler for psoc create notify.
 * @psoc: psoc which is going to be created by objmgr
 * @arg: argument for notification handler
 *
 * Allocate and attach psoc private object.
 *
 * Return: QDF_STATUS
 */
QDF_STATUS
ftm_time_sync_psoc_create_notification(struct wlan_objmgr_psoc *psoc,
				       void *arg);

/**
 * ftm_time_sync_psoc_destroy_notification() -  Handler for psoc destroy notify.
 * @psoc: psoc which is going to be destroyed by objmgr
 * @arg: argument for notification handler
 *
 * Deallocate and detach psoc private object.
 *
 * Return: QDF_STATUS
 */
QDF_STATUS
ftm_time_sync_psoc_destroy_notification(struct wlan_objmgr_psoc *psoc,
					void *arg);

QDF_STATUS ftm_time_sync_psoc_config(struct wlan_objmgr_psoc *psoc,
				     struct ftm_time_sync_cfg *cfg);
/**
 * ftm_time_sync_is_enable() - Function to advertise feature is enabled or not
 * @psoc: psoc context
 *
 * This function advertises whether the feature is enabled or not.
 *
 * Return: true if enable, false if disable
 */
bool ftm_time_sync_is_enable(struct wlan_objmgr_psoc *psoc);

/**
 * ftm_time_sync_set_enable() - Handler to enable the feature
 * @psoc: psoc context
 * @value: value to be set
 *
 * This function is used to enable the ftm time sync feature.
 * The feature is enabled iff both ini and wmi service is advertised by
 * firmware.
 *
 * Return: None
 */
void ftm_time_sync_set_enable(struct wlan_objmgr_psoc *psoc, bool value);

/**
 * ftm_time_sync_get_mode() - API to get the ftm time sync mode
 * @psoc: psoc context
 *
 * Return: enum ftm_time_sync_mode
 */
enum ftm_time_sync_mode ftm_time_sync_get_mode(struct wlan_objmgr_psoc *psoc);

/**
 * ftm_time_sync_get_role() -  API to get the ftm time sync role
 * @psoc: psoc context
 *
 * Return: enum ftm_time_sync_role
 */
enum ftm_time_sync_role ftm_time_sync_get_role(struct wlan_objmgr_psoc *psoc);

/**
 * ftm_time_sync_send_trigger() - Handler for sending trigger cmd to FW
 * @vdev: vdev for which FTM time_sync trigger cmd to be send
 *
 * This function sends the ftm trigger cmd to target.
 *
 * Return: QDF_STATUS
 */
QDF_STATUS ftm_time_sync_send_trigger(struct wlan_objmgr_vdev *vdev);

/**
 * ftm_time_sync_stop() - Handler for stopping the FTM time sync
 * @vdev: vdev for which FTM time_sync feature to be stopped
 *
 * This function stops the ftm time sync functionality.
 *
 * Return: QDF_STATUS
 */
QDF_STATUS ftm_time_sync_stop(struct wlan_objmgr_vdev *vdev);

/**
 * ftm_time_sync_show() - Handler to print the offset derived
 * @vdev: vdev for which offset is to be shown
 * @buf: buffer in which the values to be printed
 *
 * Return: the number of bytes written in buf
 */
ssize_t ftm_time_sync_show(struct wlan_objmgr_vdev *vdev, char *buf);

/**
 * ftm_time_sync_update_bssid() - Update the bssid info
 * @vdev: vdev context
 * @bssid: bssid of connected AP
 *
 * Return: None
 */
void ftm_time_sync_update_bssid(struct wlan_objmgr_vdev *vdev,
				struct qdf_mac_addr bssid);

#endif /* end of _FTM_TIME_SYNC_MAIN_H_ */
+59 −11
Original line number Diff line number Diff line
@@ -27,46 +27,46 @@
#include "wlan_objmgr_global_obj.h"

/**
 * ftm_timesync_vdev_get_ref() - Wrapper to increment ftm_timesync ref count
 * ftm_time_sync_vdev_get_ref() - Wrapper to increment ftm_time_sync ref count
 * @vdev: vdev object
 *
 * Wrapper for ftm_timesync to increment ref count after checking valid
 * Wrapper for ftm_time_sync to increment ref count after checking valid
 * object state.
 *
 * Return: SUCCESS/FAILURE
 */
static inline
QDF_STATUS ftm_timesync_vdev_get_ref(struct wlan_objmgr_vdev *vdev)
QDF_STATUS ftm_time_sync_vdev_get_ref(struct wlan_objmgr_vdev *vdev)
{
	return wlan_objmgr_vdev_try_get_ref(vdev, FTM_TIME_SYNC_ID);
}

/**
 * ftm_timesync_vdev_put_ref() - Wrapper to decrement ftm_timesync ref count
 * ftm_time_sync_vdev_put_ref() - Wrapper to decrement ftm_time_sync ref count
 * @vdev: vdev object
 *
 * Wrapper for ftm_timesync to decrement ref count of vdev.
 * Wrapper for ftm_time_sync to decrement ref count of vdev.
 *
 * Return: SUCCESS/FAILURE
 */
static inline
void ftm_timesync_vdev_put_ref(struct wlan_objmgr_vdev *vdev)
void ftm_time_sync_vdev_put_ref(struct wlan_objmgr_vdev *vdev)
{
	return wlan_objmgr_vdev_release_ref(vdev, FTM_TIME_SYNC_ID);
}

/**
 * ftm_timesync_vdev_get_priv(): Wrapper to retrieve vdev priv obj
 * ftm_time_sync_vdev_get_priv() - Wrapper to retrieve vdev priv obj
 * @vdev: vdev pointer
 *
 * Wrapper for ftm_timesync to get vdev private object pointer.
 * Wrapper for ftm_time_sync to get vdev private object pointer.
 *
 * Return: Private object of vdev
 */
static inline struct ftm_timesync_vdev_priv *
ftm_timesync_vdev_get_priv(struct wlan_objmgr_vdev *vdev)
static inline struct ftm_time_sync_vdev_priv *
ftm_time_sync_vdev_get_priv(struct wlan_objmgr_vdev *vdev)
{
	struct ftm_timesync_vdev_priv *vdev_priv;
	struct ftm_time_sync_vdev_priv *vdev_priv;

	vdev_priv = wlan_objmgr_vdev_get_comp_private_obj(
					vdev, WLAN_UMAC_COMP_FTM_TIME_SYNC);
@@ -75,4 +75,52 @@ ftm_timesync_vdev_get_priv(struct wlan_objmgr_vdev *vdev)
	return vdev_priv;
}

/**
 * ftm_time_sync_psoc_get_ref() - Wrapper to increment ftm_time sync ref count
 * @psoc: psoc object
 *
 * Wrapper for ftm time sync to increment ref count after checking valid
 * object state.
 *
 * Return: QDF_STATUS
 */
static inline
QDF_STATUS ftm_time_sync_psoc_get_ref(struct wlan_objmgr_psoc *psoc)
{
	return wlan_objmgr_psoc_try_get_ref(psoc, FTM_TIME_SYNC_ID);
}

/**
 * ftm_time_sync_psoc_put_ref() - Wrapper to decrement ftm time sync ref count
 * @psoc: psoc object
 *
 * Wrapper for ftm time sync to decrement ref count of psoc.
 *
 * Return: None
 */
static inline
void ftm_time_sync_psoc_put_ref(struct wlan_objmgr_psoc *psoc)
{
	wlan_objmgr_psoc_release_ref(psoc, FTM_TIME_SYNC_ID);
}

/**
 * ftm_time_sync_psoc_get_priv() - Wrapper to retrieve psoc priv obj
 * @psoc: psoc pointer
 *
 * Wrapper for ftm time sync to get psoc private object pointer.
 *
 * Return: ftm time sync psoc private object
 */
static inline struct ftm_time_sync_psoc_priv *
ftm_time_sync_psoc_get_priv(struct wlan_objmgr_psoc *psoc)
{
	struct ftm_time_sync_psoc_priv *psoc_priv;

	psoc_priv = wlan_objmgr_psoc_get_comp_private_obj(
				psoc, WLAN_UMAC_COMP_FTM_TIME_SYNC);
	QDF_BUG(psoc_priv);

	return psoc_priv;
}
#endif /* _FTM_TIME_SYNC_OBJMGR_H */
+37 −8
Original line number Diff line number Diff line
@@ -16,10 +16,10 @@

/**
 * DOC: Declare private API which shall be used internally only
 * in ftm_timesync component. This file shall include prototypes of
 * ftm_timesync parsing and send logic.
 * in ftm_time_sync component. This file shall include prototypes of
 * ftm_time_sync parsing and send logic.
 *
 * Note: This API should be never accessed out of ftm_timesync component.
 * Note: This API should be never accessed out of ftm_time_sync component.
 */

#ifndef _FTM_TIME_SYNC_PRIV_STRUCT_H_
@@ -28,6 +28,7 @@
#include <qdf_list.h>
#include <qdf_types.h>
#include "ftm_time_sync_objmgr.h"
#include "wlan_ftm_time_sync_public_struct.h"

#define WLAN_FTM_TIME_SYNC_PAIR_MAX 32

@@ -42,26 +43,54 @@ struct wlan_time_sync_pair {
};

/**
 * struct ftm_timesync_vdev_priv - Private object to be stored in vdev
 * struct ftm_time_sync_vdev_priv - Private object to be stored in vdev
 * @qtime_ref: qtime ref
 * @mac_ref: mac time ref
 * @time_pair: array of master/slave qtime pair
 */

struct ftm_timesync_priv {
struct ftm_time_sync_priv {
	uint64_t qtime_ref;
	uint64_t mac_ref;
	struct wlan_time_sync_pair time_pair[WLAN_FTM_TIME_SYNC_PAIR_MAX];
};

/**
 * struct ftm_timesync_vdev_priv - Private object to be stored in vdev
 * struct ftm_time_sync_psoc_priv - Private object to be stored in psoc
 * @psoc: pointer to psoc object
 * @cfg_param: INI config param for ftm time sync
 */
struct ftm_time_sync_psoc_priv {
	struct wlan_objmgr_psoc *psoc;
	struct ftm_time_sync_cfg cfg_param;
};

/**
 * struct ftm_time_sync_vdev_priv - Private object to be stored in vdev
 * @vdev: pointer to vdev object
 * @ftm_ts_priv: time sync private struct
 * @rx_ops: rx operations for ftm time sync
 * @tx_ops: tx operations for ftm time sync
 * @ftm_time_sync_mutex: mutex to access ftm time sync priv members
 * @ftm_time_sync_work: work to capture audio qtime and send it to FW
 * @time_sync_interval: interval between two qtime capture
 * @num_qtime_pair: number of qmaster and qslave pair derived
 * @num_reads: number of times the qtime to be captured
 * @valid: send qtime to FW only if this is true
 * @bssid: bssid of connected AP
 */
struct ftm_timesync_vdev_priv {
struct ftm_time_sync_vdev_priv {
	struct wlan_objmgr_vdev *vdev;
	struct ftm_timesync_priv ftm_ts_priv;
	struct ftm_time_sync_priv ftm_ts_priv;
	struct wlan_ftm_time_sync_rx_ops rx_ops;
	struct wlan_ftm_time_sync_tx_ops tx_ops;
	qdf_mutex_t ftm_time_sync_mutex;
	qdf_delayed_work_t ftm_time_sync_work;
	uint32_t time_sync_interval;
	int num_qtime_pair;
	int num_reads;
	bool valid;
	struct qdf_mac_addr bssid;
};

#endif /* End  of _FTM_TIME_SYNC_PRIV_STRUCT_H_ */
+358 −6
Original line number Diff line number Diff line
@@ -16,17 +16,174 @@

/**
 * DOC: Implement various notification handlers which are accessed
 * internally in ftm_timesync component only.
 * internally in ftm_time_sync component only.
 */

#include "ftm_time_sync_main.h"
#include "target_if_ftm_time_sync.h"
#include "wlan_objmgr_vdev_obj.h"
#include <pld_common.h>

void ftm_time_sync_set_enable(struct wlan_objmgr_psoc *psoc, bool value)
{
	struct ftm_time_sync_psoc_priv *psoc_priv;

	if (!psoc) {
		ftm_time_sync_err("psoc is NULL");
		return;
	}

	psoc_priv = ftm_time_sync_psoc_get_priv(psoc);
	if (!psoc_priv) {
		ftm_time_sync_err("psoc priv is NULL");
		return;
	}

	psoc_priv->cfg_param.enable &= value;
}

bool ftm_time_sync_is_enable(struct wlan_objmgr_psoc *psoc)
{
	struct ftm_time_sync_psoc_priv *psoc_priv;

	if (!psoc) {
		ftm_time_sync_err("psoc is NULL");
		return false;
	}

	psoc_priv = ftm_time_sync_psoc_get_priv(psoc);
	if (!psoc_priv) {
		ftm_time_sync_err("psoc priv is NULL");
		return false;
	}

	return psoc_priv->cfg_param.enable;
}

QDF_STATUS ftm_time_sync_psoc_config(struct wlan_objmgr_psoc *psoc,
				     struct ftm_time_sync_cfg *cfg)
{
	struct ftm_time_sync_psoc_priv *psoc_priv;

	if (!psoc) {
		ftm_time_sync_err("psoc is NULL");
		return QDF_STATUS_E_FAILURE;
	}

	psoc_priv = ftm_time_sync_psoc_get_priv(psoc);
	if (!psoc_priv) {
		ftm_time_sync_err("psoc priv is NULL");
		return QDF_STATUS_E_FAILURE;
	}

	psoc_priv->cfg_param.enable = cfg->enable;
	psoc_priv->cfg_param.role = cfg->role;
	psoc_priv->cfg_param.mode = cfg->mode;

	return QDF_STATUS_SUCCESS;
}

enum ftm_time_sync_mode ftm_time_sync_get_mode(struct wlan_objmgr_psoc *psoc)
{
	struct ftm_time_sync_psoc_priv *psoc_priv;

	if (!psoc) {
		ftm_time_sync_err("psoc is NULL");
		return FTM_TIMESYNC_AGGREGATED_MODE;
	}

	psoc_priv = ftm_time_sync_psoc_get_priv(psoc);
	if (!psoc_priv) {
		ftm_time_sync_err("psoc priv is NULL");
		return FTM_TIMESYNC_AGGREGATED_MODE;
	}

	return psoc_priv->cfg_param.mode;
}

enum ftm_time_sync_role ftm_time_sync_get_role(struct wlan_objmgr_psoc *psoc)
{
	struct ftm_time_sync_psoc_priv *psoc_priv;

	if (!psoc) {
		ftm_time_sync_err("psoc is NULL");
		return FTM_TIMESYNC_SLAVE_ROLE;
	}

	psoc_priv = ftm_time_sync_psoc_get_priv(psoc);
	if (!psoc_priv) {
		ftm_time_sync_err("psoc priv is NULL");
		return FTM_TIMESYNC_SLAVE_ROLE;
	}

	return psoc_priv->cfg_param.role;
}

static void ftm_time_sync_work_handler(void *arg)
{
	struct ftm_time_sync_vdev_priv *vdev_priv = arg;
	struct wlan_objmgr_psoc *psoc;
	qdf_device_t qdf_dev;
	QDF_STATUS status;
	uint8_t vdev_id;
	uint64_t lpass_ts;

	if (!vdev_priv) {
		ftm_time_sync_err("ftm vdev priv is Null");
		return;
	}

	psoc = wlan_vdev_get_psoc(vdev_priv->vdev);
	if (!psoc) {
		ftm_time_sync_err("Failed to get psoc");
		return;
	}

	vdev_id = wlan_vdev_get_id(vdev_priv->vdev);

	qdf_dev = wlan_psoc_get_qdf_dev(psoc);
	pld_get_audio_wlan_timestamp(qdf_dev->dev, PLD_TRIGGER_NEGATIVE_EDGE,
				     &lpass_ts);

	qdf_mutex_acquire(&vdev_priv->ftm_time_sync_mutex);

	if (vdev_priv->num_reads) {
		vdev_priv->num_reads--;
		qdf_mutex_release(&vdev_priv->ftm_time_sync_mutex);
		qdf_sched_delayed_work(&vdev_priv->ftm_time_sync_work,
				       vdev_priv->time_sync_interval);
	} else {
		qdf_mutex_release(&vdev_priv->ftm_time_sync_mutex);
	}

	if (vdev_priv->valid) {
		status = vdev_priv->tx_ops.ftm_time_sync_send_qtime(
						psoc, vdev_id, lpass_ts);
		if (status != QDF_STATUS_SUCCESS)
			ftm_time_sync_err("send_ftm_time_sync_qtime failed %d",
					  status);
		vdev_priv->valid = false;
	} else {
		vdev_priv->valid = true;
	}
}

QDF_STATUS
ftm_timesync_vdev_create_notification(struct wlan_objmgr_vdev *vdev, void *arg)
ftm_time_sync_vdev_create_notification(struct wlan_objmgr_vdev *vdev, void *arg)
{
	struct ftm_timesync_vdev_priv *vdev_priv;
	struct ftm_time_sync_vdev_priv *vdev_priv;
	struct wlan_objmgr_psoc *psoc;
	QDF_STATUS status;

	psoc = wlan_vdev_get_psoc(vdev);
	if (!psoc) {
		ftm_time_sync_err("Failed to get psoc");
		return QDF_STATUS_E_INVAL;
	}

	if (!ftm_time_sync_is_enable(psoc))
		return QDF_STATUS_SUCCESS;

	vdev_priv = qdf_mem_malloc(sizeof(*vdev_priv));
	if (!vdev_priv) {
		status = QDF_STATUS_E_NOMEM;
@@ -42,6 +199,20 @@ ftm_timesync_vdev_create_notification(struct wlan_objmgr_vdev *vdev, void *arg)
	}

	vdev_priv->vdev = vdev;

	qdf_create_delayed_work(&vdev_priv->ftm_time_sync_work,
				ftm_time_sync_work_handler, vdev_priv);

	qdf_mutex_create(&vdev_priv->ftm_time_sync_mutex);

	target_if_ftm_time_sync_register_tx_ops(&vdev_priv->tx_ops);
	target_if_ftm_time_sync_register_rx_ops(&vdev_priv->rx_ops);

	vdev_priv->rx_ops.ftm_time_sync_register_start_stop(psoc);
	vdev_priv->rx_ops.ftm_time_sync_regiser_master_slave_offset(psoc);

	vdev_priv->valid = true;

	goto exit;

free_vdev_priv:
@@ -51,18 +222,50 @@ exit:
	return status;
}

static QDF_STATUS
ftm_time_sync_deregister_wmi_events(struct wlan_objmgr_vdev *vdev)
{
	struct wlan_objmgr_psoc *psoc;
	QDF_STATUS status;

	psoc = wlan_vdev_get_psoc(vdev);
	if (!psoc) {
		ftm_time_sync_err("Failed to get psoc");
		return QDF_STATUS_E_INVAL;
	}

	status = target_if_ftm_time_sync_unregister_ev_handlers(psoc);
	return status;
}

QDF_STATUS
ftm_timesync_vdev_destroy_notification(struct wlan_objmgr_vdev *vdev, void *arg)
ftm_time_sync_vdev_destroy_notification(struct wlan_objmgr_vdev *vdev,
					void *arg)
{
	struct ftm_timesync_vdev_priv *vdev_priv = NULL;
	struct ftm_time_sync_vdev_priv *vdev_priv = NULL;
	struct wlan_objmgr_psoc *psoc;
	QDF_STATUS status = QDF_STATUS_E_FAILURE;

	vdev_priv = ftm_timesync_vdev_get_priv(vdev);
	psoc = wlan_vdev_get_psoc(vdev);
	if (!psoc) {
		ftm_time_sync_err("Failed to get psoc");
		return QDF_STATUS_E_INVAL;
	}

	if (!ftm_time_sync_is_enable(psoc))
		return QDF_STATUS_SUCCESS;

	vdev_priv = ftm_time_sync_vdev_get_priv(vdev);
	if (!vdev_priv) {
		ftm_time_sync_err("vdev priv is NULL");
		goto exit;
	}

	qdf_mutex_destroy(&vdev_priv->ftm_time_sync_mutex);
	qdf_cancel_delayed_work(&vdev_priv->ftm_time_sync_work);

	ftm_time_sync_deregister_wmi_events(vdev);

	status = wlan_objmgr_vdev_component_obj_detach(
					vdev, WLAN_UMAC_COMP_FTM_TIME_SYNC,
					(void *)vdev_priv);
@@ -75,3 +278,152 @@ ftm_timesync_vdev_destroy_notification(struct wlan_objmgr_vdev *vdev, void *arg)
exit:
	return status;
}

QDF_STATUS
ftm_time_sync_psoc_create_notification(struct wlan_objmgr_psoc *psoc, void *arg)
{
	struct ftm_time_sync_psoc_priv *psoc_priv;
	QDF_STATUS status;

	psoc_priv = qdf_mem_malloc(sizeof(*psoc_priv));
	if (!psoc_priv)
		return QDF_STATUS_E_NOMEM;

	status = wlan_objmgr_psoc_component_obj_attach(
				psoc, WLAN_UMAC_COMP_FTM_TIME_SYNC,
				psoc_priv, QDF_STATUS_SUCCESS);
	if (QDF_IS_STATUS_ERROR(status)) {
		ftm_time_sync_err("Failed to attach psoc component obj");
		goto free_psoc_priv;
	}

	psoc_priv->psoc = psoc;

	return status;

free_psoc_priv:
	qdf_mem_free(psoc_priv);
	return status;
}

QDF_STATUS
ftm_time_sync_psoc_destroy_notification(struct wlan_objmgr_psoc *psoc,
					void *arg)
{
	struct ftm_time_sync_psoc_priv *psoc_priv;
	QDF_STATUS status;

	psoc_priv = ftm_time_sync_psoc_get_priv(psoc);
	if (!psoc_priv) {
		ftm_time_sync_err("psoc priv is NULL");
		return QDF_STATUS_E_FAILURE;
	}

	status = wlan_objmgr_psoc_component_obj_detach(
					psoc, WLAN_UMAC_COMP_FTM_TIME_SYNC,
					psoc_priv);
	if (QDF_IS_STATUS_ERROR(status)) {
		ftm_time_sync_err("Failed to detach psoc component obj");
		return status;
	}

	qdf_mem_free(psoc_priv);
	return status;
}

QDF_STATUS ftm_time_sync_send_trigger(struct wlan_objmgr_vdev *vdev)
{
	struct ftm_time_sync_vdev_priv *vdev_priv;
	struct wlan_objmgr_psoc *psoc;
	enum ftm_time_sync_mode mode;
	uint8_t vdev_id;
	QDF_STATUS status;

	psoc = wlan_vdev_get_psoc(vdev);
	if (!psoc) {
		ftm_time_sync_err("Failed to get psoc");
		return QDF_STATUS_E_INVAL;
	}

	vdev_priv = ftm_time_sync_vdev_get_priv(vdev);
	if (!vdev_priv) {
		ftm_time_sync_err("Failed to get ftm time sync vdev_priv");
		return QDF_STATUS_E_INVAL;
	}

	vdev_id = wlan_vdev_get_id(vdev_priv->vdev);
	mode = ftm_time_sync_get_mode(psoc);

	status = vdev_priv->tx_ops.ftm_time_sync_send_trigger(psoc,
							      vdev_id, mode);
	if (QDF_IS_STATUS_ERROR(status))
		ftm_time_sync_err("send_ftm_time_sync_trigger failed %d",
				  status);

	return QDF_STATUS_SUCCESS;
}

QDF_STATUS ftm_time_sync_stop(struct wlan_objmgr_vdev *vdev)
{
	struct ftm_time_sync_vdev_priv *vdev_priv;
	int iter;

	vdev_priv = ftm_time_sync_vdev_get_priv(vdev);
	if (!vdev_priv) {
		ftm_time_sync_err("Failed to get ftm time sync vdev_priv");
		return QDF_STATUS_E_INVAL;
	}

	qdf_cancel_delayed_work(&vdev_priv->ftm_time_sync_work);

	for (iter = 0; iter < vdev_priv->num_qtime_pair; iter++) {
		vdev_priv->ftm_ts_priv.time_pair[iter].qtime_master = 0;
		vdev_priv->ftm_ts_priv.time_pair[iter].qtime_slave = 0;
	}

	vdev_priv->num_qtime_pair = 0;

	return QDF_STATUS_SUCCESS;
}

ssize_t ftm_time_sync_show(struct wlan_objmgr_vdev *vdev, char *buf)
{
	struct ftm_time_sync_vdev_priv *vdev_priv;
	uint64_t q_master, q_slave;
	ssize_t size = 0;
	int iter;

	vdev_priv = ftm_time_sync_vdev_get_priv(vdev);
	if (!vdev_priv) {
		ftm_time_sync_debug("Failed to get ftm time sync vdev_priv");
		return 0;
	}

	size = qdf_scnprintf(buf, PAGE_SIZE, "%s %pM\n", "BSSID", vdev_priv->bssid.bytes);

	for (iter = 0; iter < vdev_priv->num_qtime_pair; iter++) {
		q_master = vdev_priv->ftm_ts_priv.time_pair[iter].qtime_master;
		q_slave = vdev_priv->ftm_ts_priv.time_pair[iter].qtime_slave;

		size += qdf_scnprintf(buf + size, PAGE_SIZE,
				      "%s %llu %s %llu %s %lld\n",
				      "Qtime_master", q_master, "Qtime_slave",
				      q_slave, "Offset", q_slave > q_master ?
				      q_slave - q_master : q_master - q_slave);
	}
	return size;
}

void ftm_time_sync_update_bssid(struct wlan_objmgr_vdev *vdev,
				struct qdf_mac_addr bssid)
{
	struct ftm_time_sync_vdev_priv *vdev_priv;

	vdev_priv = ftm_time_sync_vdev_get_priv(vdev);
	if (!vdev_priv) {
		ftm_time_sync_debug("Failed to get ftm time sync vdev_priv");
		return;
	}

	vdev_priv->bssid = bssid;
}
Loading