# bcmdhd
#
# Copyright (C) 2025 Synaptics Incorporated. All rights reserved.
#
# This software is licensed to you under the terms of the
# GNU General Public License version 2 (the "GPL") with Broadcom special exception.
#
# INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
# EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
# AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
# IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
# WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
# AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
# NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
# THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION
# DOES NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES,
# SYNAPTICS' TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT
# EXCEED ONE HUNDRED U.S. DOLLARS
#
# Copyright (C) 2025, Broadcom.
#
#      Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to you
# under the terms of the GNU General Public License version 2 (the "GPL"),
# available at http://www.broadcom.com/licenses/GPLv2.php, with the
# following added to such license:
#
#      As a special exception, the copyright holders of this software give you
# permission to link this software with independent modules, and to copy and
# distribute the resulting executable under terms of your choice, provided that
# you also meet, for each linked independent module, the terms and conditions of
# the license of that module.  An independent module is a module which is not
# derived from this software.  The special exception does not apply to any
# modifications of the software.
#
#
# <<Broadcom-WL-IPTag/Open:>>
#

CONFIG_BCMDHD_AMLOGIC := y

MODULE_NAME := bcmdhd
CONFIG_BCMDHD ?= m

#CONFIG_BCMDHD_SDIO := y
#CONFIG_BCMDHD_PCIE := y
#CONFIG_BCMDHD_USB := y

CONFIG_BCMDHD_PLATFORM := y
#CONFIG_BCMDHD_DTS := y

#CONFIG_BCMDHD_ANDROID_VERSION := 12

#CONFIG_BCMDHD_OOB := y
#CONFIG_BCMDHD_STATIC_IF := y
#CONFIG_BCMDHD_NO_POWER_OFF := y

#CONFIG_BCMDHD_REQUEST_FW := y
CONFIG_BCMDHD_FW_SIGNATURE := y
CONFIG_BCMDHD_AUTO_SELECT := y

CONFIG_BCMDHD_STATIC_BUF := y
CONFIG_BCMDHD_STATIC_BUF_IN_DHD := y
#CONFIG_BCMDHD_STATIC_BUF_IN_KERNEL := y

CONFIG_BCMDHD_PCIE_MSI := y
#CONFIG_BCMDHD_PCIE_POLLING := y
#CONFIG_BCMDHD_PCIE_RPM := y

#CONFIG_BCMDHD_CUSB := y

CONFIG_BCMDHD_DEBUG := y
#CONFIG_BCMDHD_DEBUG2 := y
#CONFIG_BCMDHD_TIMESTAMP := y

CONFIG_BCMDHD_PROPTXSTATUS := y
CONFIG_BCMDHD_SYNA_PATCH := y

CONFIG_BCMDHD_COMMON := y
CONFIG_BCMDHD_AMPAK := y
CONFIG_BCMDHD_MAC_ADDR := y
CONFIG_BCMDHD_ROAM := y
CONFIG_BCMDHD_TDLS := y
#CONFIG_BCMDHD_CSI := y
#CONFIG_BCMDHD_NAN := y
#CONFIG_BCMDHD_DWDS := y
#CONFIG_BCMDHD_MONITOR := y
#CONFIG_BCMDHD_WAPI := y
#CONFIG_BCMDHD_TPUT := y

#CONFIG_BCMDHD_MULTIPLE_DRIVER := y
#CONFIG_BCMDHD_ADAPTER_INDEX ?= 0

# Amlogic
ifeq ($(CONFIG_BCMDHD_AMLOGIC),y)
	CROSS_COMPILE ?=aarch64-linux-gnu-
	KERNEL_SRC ?= $(KDIR)
	LINUXDIR := $(KERNEL_SRC)
ifeq ($(CONFIG_BCMDHD_SDIO),y)
	MODULE_NAME := dhd
else
ifeq ($(CONFIG_BCMDHD_USB),y)
	MODULE_NAME := bcmdhd
else
	MODULE_NAME := dhdpci
endif
endif
ifeq ($(CONFIG_ANDROID_14),y)
	CONFIG_BCMDHD_ANDROID_VERSION := 14
	CONFIG_BCMDHD_REQUEST_FW := y
else
	CONFIG_BCMDHD_ANDROID_VERSION := 11
endif
	CONFIG_BCMDHD_OOB := y
	CONFIG_BCMDHD_STATIC_IF := y
	CONFIG_BCMDHD_STATIC_BUF_IN_DHD := n
	CONFIG_BCMDHD_STATIC_BUF_IN_KERNEL := y
	CONFIG_BCMDHD_TPUT := y
ifndef CONFIG_KASAN
	KBUILD_CFLAGS_MODULE += -Wframe-larger-than=3000
endif
ifneq ($(CONFIG_BCMDHD_PCIE),)
	CONFIG_BCMDHD_NO_POWER_OFF := y
endif
ifneq ($(CONFIG_BCMDHD_USB),)
	CONFIG_BCMDHD_NO_POWER_OFF := y
endif
endif

DHDCFLAGS = -Wall -Wstrict-prototypes -Wno-date-time
DHDCFLAGS += -Wmaybe-uninitialized
DHDCFLAGS += -Dlinux -DLINUX -DBCMDRIVER
DHDCFLAGS += -DUSE_NEW_RSPEC_DEFS -DBCMUTILS_ERR_CODES
DHDCFLAGS += -DBCMDONGLEHOST -DBCMFILEIMAGE -DDHD_DEBUG
DHDCFLAGS += -DDHDTHREAD -DSHOW_EVENTS -DWIFI_ACT_FRAME
DHDCFLAGS += -DSUPPORT_PM2_ONLY -DOEM_ANDROID
DHDCFLAGS += -DDHD_8021X_DUMP -DEAPOL_PKT_PRIO

ifeq ($(CONFIG_BCMDHD_COMMON),y)
# Open/Stop
	DHDCFLAGS += -DENABLE_INSMOD_NO_FW_LOAD
	DHDCFLAGS += -DPOWERUP_MAX_RETRY=1 -DWIFI_TURNOFF_DELAY=10
	DHDCFLAGS += -DIFACE_HANG_FORCE_DEV_CLOSE
# TPUT Enhancement
	DHDCFLAGS += -DDHDTCPACK_SUPPRESS
	DHDCFLAGS += -DTSQ_MULTIPLIER=10
# Keep alive
	DHDCFLAGS += -DKEEP_ALIVE -DCUSTOM_KEEP_ALIVE_SETTING=30000
# Packet filter
	DHDCFLAGS += -DPKT_FILTER_SUPPORT -DBLOCK_IPV6_PACKET
	DHDCFLAGS += -DPKTPRIO_OVERRIDE
# ARP
	DHDCFLAGS += -DARP_OFFLOAD_SUPPORT
# Wakeup
	DHDCFLAGS += -DDHD_PACKET_TIMEOUT_MS=50 -DMAX_TX_TIMEOUT=50
	DHDCFLAGS += -DCUSTOM_EVENT_PM_WAKE=20
# Misc feature
	DHDCFLAGS += -DCUSTOM_LONG_RETRY_LIMIT=12
	DHDCFLAGS += -DIOCTL_RESP_TIMEOUT=5000
endif

DHDOFILES = aiutils.o siutils.o sbutils.o
DHDOFILES += hndpmu.o hndjtag.o
DHDOFILES += hnd_pktq.o hnd_pktpool.o
DHDOFILES += bcmutils.o bcmxtlv.o bcm_app_utils.o bcmstdlib_s.o frag.o
DHDOFILES += bcmevent.o bcmwifi_channels.o
DHDOFILES += dhd_linux.o dhd_linux_tx.o dhd_linux_rx.o dhd_ip.o dhd_pno.o
DHDOFILES += dhd_linux_wq.o dhd_linux_pktdump.o
DHDOFILES += dhd_linux_platdev.o dhd_custom_gpio.o dhd_common.o
DHDOFILES += dhd_linux_exportfs.o linuxerrmap.o
DHDOFILES += dhd_debug_linux.o dhd_debug.o dhd_mschdbg.o dhd_dbg_ring.o
DHDOFILES += linux_osl.o linux_pkt.o dhd_linux_sched.o
DHDOFILES += wldev_common.o wl_android.o
DHDOFILES += fwpkg_utils.o

# Ampak patch
ifeq ($(CONFIG_BCMDHD_AMPAK),y)
	DHDCFLAGS += -DGET_OTP_MAC_ENABLE
	DHDCFLAGS += -DWL_EXT_IAPSTA -DCCODE_LIST -DSUSPEND_EVENT
	DHDCFLAGS += -DWL_ESCAN
	DHDCFLAGS += -DKEY_INSTALL_CHECK
	DHDOFILES += dhd_config.o dhd_ccode.o
	DHDOFILES += wl_event.o wl_android_ext.o wl_iapsta.o wl_escan.o wl_timer.o
endif

ifneq ($(CONFIG_CFG80211),)
	DHDCFLAGS += -DWL_CFG80211
	DHDCFLAGS += -DCONFIG_CFG80211_INTERNAL_REGDB #-DEXT_REG_INFO
	DHDCFLAGS += -DWL_CAP_HE -DWL_6G_BAND -DWL_5P9G -DWL_P2P_6G
#	DHDCFLAGS += -DCONFIG_6GHZ_BKPORT
	DHDCFLAGS += -DWL_SUPPORT_BACKPORTED_KPATCHES
	DHDCFLAGS += -DSUPPORT_RSSI_SUM_REPORT
	DHDCFLAGS += -DWL_CFGVENDOR_SEND_HANG_EVENT
# Interface
	DHDCFLAGS += -DWL_IFACE_COMB_NUM_CHANNELS
	DHDCFLAGS += -DWL_IFACE_MGMT
# Connection
#	DHDCFLAGS += -DWL_SKIP_CONNECT_HINTS
	DHDCFLAGS += -DCONNECT_INFO_WAR -DVNDR_IE_WAR
	DHDCFLAGS += -DRXF0OVFL_REINIT_WAR
# Security
	DHDCFLAGS += -DWL_CLIENT_SAE
	DHDCFLAGS += -DWL11U -DWLFBT -DMFP -DWL_GCMP_SUPPORT -DWL_OWE -DWL_SAE_FT
	DHDCFLAGS += -DGTK_OFFLOAD_SUPPORT
# Scan
	DHDCFLAGS += -DESCAN_RESULT_PATCH
	DHDCFLAGS += -DESCAN_BUF_OVERFLOW_MGMT
	DHDCFLAGS += -DVSDB -DWL_CFG80211_VSDB_PRIORITIZE_SCAN_REQUEST
	DHDCFLAGS += -DDHD_USE_SCAN_WAKELOCK #-DDHD_DEBUG_SCAN_WAKELOCK
# P2P
	DHDCFLAGS += -DWLP2P -DEXPLICIT_DISCIF_CLEANUP -DWL_CFG80211_GON_COLLISION
# SoftAP
	DHDCFLAGS += -DWL_CFG80211_STA_EVENT
	DHDCFLAGS += -DWL_VIRTUAL_APSTA -DSOFTAP_UAPSD_OFF #-DSTA_MGMT
	DHDCFLAGS += -DWL_SUPPORT_AUTO_CHANNEL -DWL_SOFTAP_ACS #-DACS_MONITOR
	DHDCFLAGS += -DNUM_SCB_MAX_PROBE=3 -DWL_SCB_TIMEOUT=10
	DHDCFLAGS += -DRESTART_AP_WAR
#	DHDCFLAGS += -DDHD_DFS_MASTER
#	DHDCFLAGS += -DHOSTAPD_BW_SUPPORT
#	DHDCFLAGS += -DWL_BEACON_RATE
#	DHDCFLAGS += -DCFG80211_INFO_CHANDEF

	DHDOFILES += wl_cfg80211.o wl_cfgscan.o wl_cfgp2p.o
	DHDOFILES += wl_linux_mon.o wl_cfg_btcoex.o wl_cfgvendor.o
	DHDOFILES += dhd_cfg80211.o wl_cfgvif.o wl_roam.o
endif

# Wireless Extension
ifneq ($(CONFIG_WIRELESS_EXT),)
	DHDCFLAGS += -DSOFTAP -DWL_WIRELESS_EXT -DUSE_IW
	DHDOFILES += wl_iw.o
endif

# Static Interface
ifeq ($(CONFIG_BCMDHD_STATIC_IF),y)
	DHDCFLAGS += -DWL_STATIC_IF #-DDHD_MAX_STATIC_IFS=2
#	DHDCFLAGS += -DWL_STATIC_IFNAME_PREFIX=\"sap%d\"
	DHDCFLAGS += -DPRIMARY_IFACE_ROLE_FIX
#	DHDCFLAGS += -DP2P_AP_CONCURRENT
endif

# SDIO bus
ifneq ($(CONFIG_BCMDHD_SDIO),)
	BUS_TYPE := sdio
	DHDCFLAGS += -DBCMSDIO -DBCMLXSDMMC -DMMC_SDIO_ABORT
	DHDCFLAGS += -DBDC -DDHD_USE_IDLECOUNT -DUSE_SDIOFIFO_IOVAR
	DHDCFLAGS += -DCUSTOM_SDIO_F2_BLKSIZE=256 -DBCMSDIOH_STATIC_COPY_BUF
	DHDCFLAGS += -DBCMSDIOH_TXGLOM -DDHDENABLE_TAILPAD
	DHDCFLAGS += -DRXFRAME_THREAD -DWAIT_DEQUEUE -DSUPPORT_P2P_GO_PS
	DHDCFLAGS += -DBCMSDIO_RXLIM_POST -DBCMSDIO_TXSEQ_SYNC -DCONSOLE_DPC
	DHDCFLAGS += -DSTATIC_MEM_BUF -DBCMSDIO_INTSTATUS_WAR -DDHD_SI_WD_RESET
	DHDCFLAGS += -DMMC_HW_RESET -DMMC_SW_RESET #-DBUS_POWER_RESTORE
#	DHDCFLAGS += -DSDIO_RETUNE_DISABLE_IN_KSO #-DMMC_RETUNE_DISABLE_IN_KSO
#	DHDCFLAGS += -DSDIO_DETECT_CHANGE
#	DHDCFLAGS += -DDEVICE_PM_CALLBACK
ifeq ($(CONFIG_BCMDHD_OOB),y)
	DHDCFLAGS += -DOOB_INTR_ONLY -DCUSTOMER_OOB -DHW_OOB
ifeq ($(CONFIG_BCMDHD_DISABLE_WOWLAN),y)
	DHDCFLAGS += -DDISABLE_WOWLAN
endif
else
	DHDCFLAGS += -DSDIO_ISR_THREAD
endif
	DHDOFILES += bcmsdh.o bcmsdh_linux.o bcmsdh_sdmmc.o bcmsdh_sdmmc_linux.o
	DHDOFILES += dhd_sdio.o dhd_cdc.o dhd_wlfc.o
endif

# PCIe bus
ifneq ($(CONFIG_BCMDHD_PCIE),)
	BUS_TYPE := pcie
	DHDCFLAGS += -DPCIE_FULL_DONGLE -DBCMPCIE -DCUSTOM_DPC_PRIO_SETTING=-1
# Open/Stop
	DHDCFLAGS += -DDONGLE_ENABLE_ISOLATION
	DHDCFLAGS += -DBCMPCIE_CTO_PREVENTION
	DHDCFLAGS += -DFORCE_DONGLE_RESET_IN_DEVRESET_ON
	DHDCFLAGS += -DDHD_SKIP_DONGLE_RESET_IN_ATTACH
	DHDCFLAGS += -DINSMOD_FW_LOAD
#	DHDCFLAGS += -DPCIE_ATU_FIXUP
#	DHDCFLAGS += -DRMMOD_POWER_DOWN_LATER
# Trap
	DHDCFLAGS += -DDHD_DONGLE_TRAP_IN_DETACH -DCHECK_TRAP_ROT
# Event
	DHDCFLAGS += -DDNGL_EVENT_SUPPORT
# Traffic
	DHDCFLAGS += -DDHD_LB -DDHD_LB_RXP -DDHD_LB_STATS -DDHD_LB_TXP
	DHDCFLAGS += -DDHD_LB_PRIMARY_CPUS=0xF0 -DDHD_LB_SECONDARY_CPUS=0x0E
	DHDCFLAGS += -DENABLE_DHD_GRO
	DHDCFLAGS += -DDHD_PKTID_AUDIT_ENABLED
# Memory
	DHDCFLAGS += -DDHD_USE_COHERENT_MEM_FOR_RING
#	DHDCFLAGS += -DDHD_ALLOC_COHERENT_MEM_FROM_ATOMIC_POOL
# Wakeup
	DHDCFLAGS += -DCONFIG_HAS_WAKELOCK
	DHDCFLAGS += -DD3_ACK_RESP_TIMEOUT=4000
#	DHDCFLAGS += -DDEVICE_PM_CALLBACK
# Power saving
#	DHDCFLAGS += -DDHD_DISABLE_ASPM
ifeq ($(CONFIG_BCMDHD_PCIE_RPM),y)
	DHDCFLAGS += -DDHD_PCIE_RUNTIMEPM -DCUSTOM_DHD_RUNTIME_MS=100 -DMAX_IDLE_COUNT=11
endif
ifeq ($(CONFIG_BCMDHD),y)
	DHDCFLAGS += -DWAKEUP_KSOFTIRQD_POST_NAPI_SCHEDULE
endif
# Out of Band Interrupt
ifeq ($(CONFIG_BCMDHD_OOB),y)
	DHDCFLAGS += -DCUSTOMER_OOB -DBCMPCIE_OOB_HOST_WAKE -DHW_OOB
	DHDCFLAGS += -DDHD_USE_PCIE_OOB_THREADED_IRQ
endif
# In-band Interrupt
ifeq ($(CONFIG_BCMDHD_PCIE_MSI),y)
ifneq ($(CONFIG_PCI_MSI),)
	DHDCFLAGS += -DDHD_MSI_SUPPORT
endif
endif
ifeq ($(CONFIG_BCMDHD_PCIE_POLLING),y)
	DHDCFLAGS += -DDHD_PCIE_READ_INTSTATUS_IN_DPC
	DHDCFLAGS += -DCUSTOM_DHD_WATCHDOG_MS=10
else
	DHDCFLAGS += -DCUSTOM_DHD_WATCHDOG_MS=0
endif
	DHDOFILES += dhd_pcie.o dhd_pcie_linux.o dhd_flowring.o dhd_msgbuf.o
	DHDOFILES += dhd_linux_lb.o pcie_core.o
endif

# USB bus
ifneq ($(CONFIG_BCMDHD_USB),)
	BUS_TYPE := usb
	DHDCFLAGS += -DBCMDBUS -DBDC -DUSBOS_TX_THREAD -DBCMTRXV2
	DHDCFLAGS += -DDBUS_USB_LOOPBACK
	DHDCFLAGS += -DINSMOD_FW_LOAD
	DHDCFLAGS += -DBCM_REQUEST_FW
	DHDCFLAGS += -DSHOW_LOGTRACE
	DHDCFLAGS += -DWL_EXT_WOWL
ifneq ($(CONFIG_BCMDHD_REQUEST_FW),y)
	DHDCFLAGS += -DEXTERNAL_FW_PATH
endif
ifneq ($(CONFIG_BCMDHD_CUSB),)
	DHDCFLAGS += -DBCMUSBDEV_COMPOSITE
	CONFIG_BCMDHD_NO_POWER_OFF := y
endif
	DHDOFILES += dbus.o dbus_usb.o dbus_usb_linux.o dhd_cdc.o dhd_wlfc.o
endif

ifeq ($(CONFIG_BCMDHD_SYNA_PATCH),y)
ifneq ($(CONFIG_BCMDHD_SDIO),)
#	20250317 : merge SYN4612 patch between 101.10.361.152 and 101.10.361.96
	DHDCFLAGS += -DDHD_METADATA_DOWNLOAD
	DHDCFLAGS += -DSYN4612_FHT_PATCH
#	DHDCFLAGS += -DSYN4612_PATCH
#	DHDCFLAGS += -DSD_UHSIMODE_SYN4612=1 -DSD_DS_SYN4612=\"A\"
ifeq ($(CONFIG_BCMDHD_FW_SIGNATURE),y)
	DHDCFLAGS += -DSYNA_FW_SIGNATURE -DBL_CONS_LOG
endif
endif
endif

# WakeLock
ifneq ($(filter -DCONFIG_HAS_WAKELOCK, $(DHDCFLAGS)),)
#	DHDCFLAGS += -DDHD_DEBUG_WAKE_LOCK
#	DHDCFLAGS += -DDHD_TRACE_WAKE_LOCK
endif

# No Power OFF
ifeq ($(CONFIG_BCMDHD_NO_POWER_OFF),y)
	DHDCFLAGS += -DENABLE_INSMOD_NO_FW_LOAD
	DHDCFLAGS += -DENABLE_INSMOD_NO_POWER_OFF -DNO_POWER_OFF_AFTER_OPEN
endif

# Multiple Driver
ifeq ($(CONFIG_BCMDHD_MULTIPLE_DRIVER),y)
	DHDCFLAGS += -DBCMDHD_MDRIVER
ifneq ($(CONFIG_BCMDHD_ADAPTER_INDEX),)
	MODULE_NAME := dhd$(BUS_TYPE)_$(CONFIG_BCMDHD_ADAPTER_INDEX)
	DHDCFLAGS += -DADAPTER_IDX=$(CONFIG_BCMDHD_ADAPTER_INDEX)
	DHDCFLAGS += -DADAPTER_IDX_STR=\"_$(CONFIG_BCMDHD_ADAPTER_INDEX)\"
	DHDCFLAGS += -DBUS_TYPE=\"_$(BUS_TYPE)-$(CONFIG_BCMDHD_ADAPTER_INDEX)\"
	DHDCFLAGS += -DDHD_LOG_PREFIX=\"[dhd-$(BUS_TYPE)-$(CONFIG_BCMDHD_ADAPTER_INDEX)]\"
else
	MODULE_NAME := dhd$(BUS_TYPE)
	DHDCFLAGS += -DADAPTER_IDX_STR=\"_$(BUS_TYPE)\"
	DHDCFLAGS += -DBUS_TYPE=\"_$(BUS_TYPE)\"
	DHDCFLAGS += -DDHD_LOG_PREFIX=\"[dhd-$(BUS_TYPE)]\"
endif
else
	DHDCFLAGS += -DADAPTER_IDX_STR=\"\"
	DHDCFLAGS += -DBUS_TYPE=\"\"
endif

# PROPTXSTATUS
ifeq ($(CONFIG_BCMDHD_PROPTXSTATUS),y)
ifneq ($(CONFIG_BCMDHD_USB),)
	DHDCFLAGS += -DPROP_TXSTATUS
	DHDCFLAGS += -DLIMIT_BORROW -DBULK_DEQUEUE
endif
ifneq ($(CONFIG_BCMDHD_SDIO),)
	DHDCFLAGS += -DPROP_TXSTATUS -DPROPTX_MAXCOUNT
	DHDCFLAGS += -DLIMIT_BORROW -DBULK_DEQUEUE
endif
ifneq ($(CONFIG_CFG80211),)
	DHDCFLAGS += -DPROP_TXSTATUS_VSDB
endif
endif

# 64bit
ifeq ($(CONFIG_64BIT),y)
	DHDCFLAGS += -DBCMDMA64OSL
else
	DHDCFLAGS += -DBCMDMA32
endif

# Android Features
ifneq ($(CONFIG_BCMDHD_ANDROID_VERSION),)
	DHDCFLAGS += -DANDROID_VERSION=$(CONFIG_BCMDHD_ANDROID_VERSION)
	DHDCFLAGS += -DDHD_NOTIFY_MAC_CHANGED
	DHDCFLAGS += -DANDROID_BKPORT
#	DHDCFLAGS += -DSYNA_ANDROID_HAL
ifneq ($(CONFIG_CFG80211),)
	DHDCFLAGS += -DWIFI_TURNON_USE_HALINIT
	DHDCFLAGS += -DMIRACAST_AMPDU_SIZE=8
# Offload features
	DHDCFLAGS += -DAPF
	DHDCFLAGS += -DNDO_CONFIG_SUPPORT
	DHDCFLAGS += -DPNO_SUPPORT -DCUSTOM_PNO_EVENT_LOCK_xTIME=10
	DHDCFLAGS += -DWL_SCHED_SCAN
# Other features
	DHDCFLAGS += -DRTT_SUPPORT #-DRTT_DEBUG
	DHDCFLAGS += -DLINKSTAT_SUPPORT -DLINKSTAT_EXT_SUPPORT
	DHDCFLAGS += -DRSSI_MONITOR_SUPPORT
	DHDCFLAGS += -DWL_LATENCY_MODE
# Scan / Channel
	DHDCFLAGS += -DGSCAN_SUPPORT
	DHDCFLAGS += -DDHD_GET_VALID_CHANNELS
	DHDCFLAGS += -DWL_USABLE_CHAN
	DHDCFLAGS += -DWL_DYNAMIC_CHAN_POLICY
# Debug
	DHDCFLAGS += -DDEBUGABILITY -DDEBUGABILITY_DISABLE_MEMDUMP
	DHDCFLAGS += -DWL_CFGVENDOR_SEND_ALERT_EVENT
	DHDCFLAGS += -DDBG_PKT_MON
	DHDCFLAGS += -DDHD_LOG_DUMP -DDHD_FW_COREDUMP
	DHDCFLAGS += -DDHD_PKT_LOGGING -DDHD_PKT_LOGGING_DBGRING
# Wakeup
	DHDCFLAGS += -DDHD_WAKE_STATUS
	DHDCFLAGS += -DCUSTOM_COUNTRY_CODE
# Phy / System
	DHDCFLAGS += -DWL_SAR_TX_POWER

	DHDOFILES += dhd_rtt.o
	DHDOFILES += dhd_log_dump.o
	DHDOFILES += dhd_pktlog.o
endif
else
	DHDCFLAGS += -DANDROID_VERSION=0
endif

# MAC Address
ifeq ($(CONFIG_BCMDHD_MAC_ADDR),y)
#	DHDCFLAGS += -DGET_CUSTOM_MAC_ENABLE
	DHDCFLAGS += -DSPECIFIC_MAC_GEN_SCHEME
	DHDCFLAGS += -DWL_STA_ASSOC_RAND #-DWL_STA_INIT_RAND
	DHDCFLAGS += -DWL_SOFTAP_RAND
	DHDCFLAGS += -DWL_P2P_RAND #-DWL_P2P_INIT_RAND
endif

# Scan random MAC
ifneq ($(CONFIG_BCMDHD_RANDOM_MAC),)
ifneq ($(CONFIG_CFG80211),)
	DHDCFLAGS += -DWL_USE_RANDOMIZED_SCAN
#	DHDCFLAGS += -DSUPPORT_RANDOM_MAC_SCAN
endif
endif

# Debug
ifeq ($(CONFIG_BCMDHD_DEBUG),y)
	DHDCFLAGS += -DTAG_INFO_FW_VER
	DHDCFLAGS += -DDHD_ARP_DUMP -DDHD_DHCP_DUMP -DDHD_ICMP_DUMP
	DHDCFLAGS += -DDHD_DNS_DUMP -DDHD_TRX_DUMP
	DHDCFLAGS += -DTPUT_MONITOR
#	DHDCFLAGS += -DSCAN_SUPPRESS -DBSSCACHE
	DHDCFLAGS += -DCHECK_DOWNLOAD_FW
	DHDCFLAGS += -DPKT_STATICS
	DHDCFLAGS += -DKSO_DEBUG
#	DHDCFLAGS += -DDHD_PKTDUMP_TOFW
#	DHDCFLAGS += -DDHD_DUMP_FILE_WRITE_FROM_KERNEL
endif

# Debug2
ifeq ($(CONFIG_BCMDHD_DEBUG2),y)
	DHDCFLAGS += -DSHOW_LOGTRACE -DDHD_LOG_DUMP -DDHD_FW_COREDUMP
	DHDCFLAGS += -DBCMASSERT_LOG -DSI_ERROR_ENFORCE
ifneq ($(CONFIG_BCMDHD_PCIE),)
	DHDCFLAGS += -DEWP_EDL
	DHDCFLAGS += -DDHD_SSSR_DUMP
	DHDCFLAGS += -DDHD_MEM_STATS
	DHDCFLAGS += -DDHD_FLOW_RING_STATUS_TRACE
	DHDCFLAGS += -DDNGL_AXI_ERROR_LOGGING
endif
	DHDOFILES += dhd_log_dump.o
endif

# Timestamp
ifeq ($(CONFIG_BCMDHD_TIMESTAMP),y)
	DHDCFLAGS += -DKERNEL_TIMESTAMP
	DHDCFLAGS += -DSYSTEM_TIMESTAMP
endif

# MESH support for kernel 3.10 later
ifeq ($(CONFIG_BCMDHD_WLMESH),y)
	DHDCFLAGS += -DWLMESH
ifneq ($(CONFIG_CFG80211),)
	DHDCFLAGS += -DWLMESH_CFG80211
endif
ifneq ($(CONFIG_BCMDHD_PCIE),)
	DHDCFLAGS += -DBCM_HOST_BUF -DDMA_HOST_BUFFER_LEN=0x80000
endif
	DHDCFLAGS += -DDHD_UPDATE_INTF_MAC
	DHDCFLAGS :=$(filter-out -DDHD_FW_COREDUMP,$(DHDCFLAGS))
	DHDCFLAGS :=$(filter-out -DWL_STATIC_IF,$(DHDCFLAGS))
endif

# EasyMesh
ifeq ($(CONFIG_BCMDHD_EASYMESH),y)
	DHDCFLAGS :=$(filter-out -DDHD_FW_COREDUMP,$(DHDCFLAGS))
	DHDCFLAGS :=$(filter-out -DDHD_LOG_DUMP,$(DHDCFLAGS))
	DHDCFLAGS += -DWLEASYMESH
	CONFIG_BCMDHD_DWDS := y
endif

# Roam
ifeq ($(CONFIG_BCMDHD_ROAM),y)
	DHDCFLAGS += -DROAM_CHANNEL_CACHE -DDHD_LOSSLESS_ROAMING
	DHDCFLAGS += -DWBTEXT
	DHDCFLAGS += -DWL_ROAM_WAR
endif

# TDLS
ifeq ($(CONFIG_BCMDHD_TDLS),y)
	DHDCFLAGS += -DWLTDLS
endif

# DWDS
ifeq ($(CONFIG_BCMDHD_DWDS),y)
ifneq ($(CONFIG_CFG80211),)
	DHDCFLAGS += -DWLDWDS -DFOURADDR_AUTO_BRG
ifneq ($(CONFIG_BCMDHD_SDIO),)
	DHDCFLAGS += -DRXF_DEQUEUE_ON_BUSY
endif
	DHDCFLAGS += -DWL_STATIC_IF
endif
endif

# CSI
ifeq ($(CONFIG_BCMDHD_CSI),y)
	DHDCFLAGS += -DCSI_SUPPORT
	DHDOFILES += dhd_csi.o
endif

# Monitor mode
ifeq ($(CONFIG_BCMDHD_MONITOR),y)
	DHDCFLAGS += -DWL_MONITOR
#	DHDCFLAGS += -DWL_CFG80211_MONITOR
endif

# Reconnect
ifeq ($(CONFIG_BCMDHD_RECONNECT),y)
	DHDCFLAGS += -DEAPOL_RESEND -DEAPOL_RESEND_M4
ifneq ($(CONFIG_CFG80211),)
	DHDCFLAGS += -DWL_EXT_RECONNECT -DWL_REASSOC_BCAST
	DHDCFLAGS += -DWL_EXT_DISCONNECT_RECONNECT
endif
endif

# TPUT improve
ifeq ($(CONFIG_BCMDHD_TPUT),y)
	DHDCFLAGS += -DDHD_TPUT_PATCH
	DHDCFLAGS += -DTCPACK_INFO_MAXNUM=40 -DTCPDATA_INFO_MAXNUM=40
	DHDCFLAGS += -DSET_RPS_CPUS -DSET_XPS_CPUS
ifneq ($(CONFIG_BCMDHD_SDIO),)
	DHDCFLAGS += -DDYNAMIC_MAX_HDR_READ
	DHDCFLAGS :=$(filter-out -DSDTEST,$(DHDCFLAGS))
endif
ifneq ($(CONFIG_BCMDHD_PCIE),)
	DHDCFLAGS += -DDHD_LB_TXP_DEFAULT_ENAB
	DHDCFLAGS += -DDHD_LB_PRIMARY_CPUS=0xF0 -DDHD_LB_SECONDARY_CPUS=0x0E
endif
endif

# Zero configure
ifeq ($(CONFIG_BCMDHD_ZEROCONFIG),y)
	DHDCFLAGS += -DWL_EXT_GENL -DSENDPROB
	DHDOFILES += wl_ext_genl.o
endif

# WAPI
ifeq ($(CONFIG_BCMDHD_WAPI),y)
	DHDCFLAGS += -DBCMWAPI_WPI -DBCMWAPI_WAI
	DHDCFLAGS += -DCFG80211_WAPI_BKPORT
endif

# NAN
ifneq ($(CONFIG_BCMDHD_NAN),)
	DHDCFLAGS += -DWL_NAN -DWL_NAN_DISC_CACHE -DWL_NANP2P -DWL_NAN_ENABLE_MERGE
	DHDOFILES += wl_cfgnan.o bcmbloom.o
endif

# Module auto-selection
ifeq ($(CONFIG_BCMDHD_AUTO_SELECT),y)
	DHDCFLAGS += -DUPDATE_MODULE_NAME
ifeq ($(CONFIG_BCMDHD_REQUEST_FW),y)
#	DHDCFLAGS += -DFW_AMPAK_PATH="\"ampak\""
#	DHDCFLAGS += -DMODULE_PATH
endif
ifneq ($(CONFIG_BCMDHD_SDIO),)
	DHDCFLAGS += -DGET_OTP_MODULE_NAME -DCOMPAT_OLD_MODULE
endif
endif

ifeq ($(CONFIG_BCMDHD_PLATFORM),y)
	DHDOFILES += dhd_gpio.o
ifeq ($(CONFIG_BCMDHD_DTS),y)
	DHDCFLAGS += -DBCMDHD_DTS
endif
	DHDCFLAGS += -DCUSTOMER_HW -DDHD_OF_SUPPORT
endif

ifeq ($(CONFIG_BCMDHD_REQUEST_FW),y)
	DHDCFLAGS += -DDHD_LINUX_STD_FW_API
	DHDCFLAGS += -DDHD_REQUEST_FW_PATH
# CoreELEC: firmware and nvram files are installed to /usr/lib/firmware/brcm
# (SDIO) and /usr/lib/firmware/brcm/pcie (PCIe), file names are selected by chip
ifneq ($(CONFIG_BCMDHD_SDIO),)
	BCMDHD_FW_DIR ?= /usr/lib/firmware/brcm/
else ifneq ($(CONFIG_BCMDHD_PCIE),)
	BCMDHD_FW_DIR ?= /usr/lib/firmware/brcm/pcie/
endif
ifneq ($(BCMDHD_FW_DIR),)
	DHDCFLAGS += -DDHD_FW_NAME="\"$(BCMDHD_FW_DIR)\""
	DHDCFLAGS += -DDHD_NVRAM_NAME="\"$(BCMDHD_FW_DIR)\""
else
	DHDCFLAGS += -DDHD_FW_NAME="\"fw_bcmdhd.bin\""
	DHDCFLAGS += -DDHD_NVRAM_NAME="\"nvram.txt\""
endif
	DHDCFLAGS += -DDHD_CLM_NAME="\"clm_bcmdhd.blob\""
	DHDCFLAGS += -DDHD_CONFIG_NAME="\"config.txt\""
else
	DHDCFLAGS += -DDHD_SUPPORT_VFS_CALL
ifeq ($(CONFIG_BCMDHD_FW_PATH),)
	DHDCFLAGS += -DCONFIG_BCMDHD_FW_PATH="\"/lib/firmware/fw_bcmdhd.bin\""
	DHDCFLAGS += -DCONFIG_BCMDHD_NVRAM_PATH="\"/lib/firmware/nvram.txt\""
	DHDCFLAGS += -DCONFIG_BCMDHD_CLM_PATH="\"/lib/firmware/clm_bcmdhd.blob\""
endif
	DHDCFLAGS += -DCONFIG_BCMDHD_CONFIG_PATH="\"/lib/firmware/config.txt\""
endif

ifeq ($(CONFIG_BCMDHD_FW_SIGNATURE),y)
	DHDCFLAGS += -DFW_SIGNATURE
	DHDCFLAGS += -DBL_HEAP_START_GAP_SIZE=0x1000 -DBL_HEAP_SIZE=0x10000
endif

# Static buffer
ifeq ($(CONFIG_BCMDHD_STATIC_BUF),y)
ifeq ($(CONFIG_BCMDHD_STATIC_BUF_IN_DHD),y)
	DHDOFILES += dhd_static_buf.o
	DHDCFLAGS += -DDHD_STATIC_IN_DRIVER
else ifneq ($(CONFIG_BCMDHD_STATIC_BUF_IN_KERNEL),y)
	obj-m += dhd_static_buf.o
endif
	DHDCFLAGS += -DSTATIC_WL_PRIV_STRUCT -DENHANCED_STATIC_BUF
	DHDCFLAGS += -DCONFIG_DHD_USE_STATIC_BUF
ifneq ($(filter -DDHD_LOG_DUMP, $(DHDCFLAGS)),)
	DHDCFLAGS += -DDHD_USE_STATIC_MEMDUMP
endif
ifneq ($(filter -DDHD_FW_COREDUMP, $(DHDCFLAGS)),)
	DHDCFLAGS += -DDHD_USE_STATIC_MEMDUMP
endif
ifneq ($(CONFIG_BCMDHD_PCIE),)
	DHDCFLAGS += -DDHD_USE_STATIC_CTRLBUF
endif
endif

ifeq ($(CONFIG_BCMDHD),y)
	DHDCFLAGS += -DUSE_LATE_INITCALL_SYNC
	DHDCFLAGS += -DBCM_USE_PLATFORM_STRLCPY
endif
ifeq ($(CONFIG_BCMDHD),m)
	DHDCFLAGS += -DBCMDHD_MODULAR
	DHDCFLAGS += -DBOARD_MODULAR_INIT
endif

# Amlogic
ifeq ($(CONFIG_BCMDHD_AMLOGIC),y)
	DHDCFLAGS += -Wno-error -Wno-format-security
	DHDCFLAGS += -Wno-implicit-fallthrough -Wno-strict-prototypes
ifdef CONFIG_CC_IS_CLANG
	DHDCFLAGS += -Wno-unknown-warning-option -Wno-sometimes-uninitialized
	DHDCFLAGS += -Wno-parentheses-equality
endif
	DHDCFLAGS += -DCUSTOMER_HW_AMLOGIC
	DHDCFLAGS := $(filter-out -DDHD_REQUEST_FW_PATH,$(DHDCFLAGS))
ifneq ($(CONFIG_BCMDHD_SDIO),)
	DHDCFLAGS += -DDEVICE_PM_CALLBACK
endif
ifneq ($(CONFIG_BCMDHD_PCIE),)
	DHDCFLAGS += -DDHD_DISABLE_ASPM
#	DHDCFLAGS += -DUSE_AML_PCIE_TEE_MEM
	DHDCFLAGS := $(filter-out -DHW_OOB,$(DHDCFLAGS))
endif
# CoreELEC: static interfaces are not used (no Android HAL)
	DHDCFLAGS := $(filter-out -DWL_STATIC_IF,$(DHDCFLAGS))
endif

# disable gcc 12 compile error
DHDCFLAGS += -Wno-address

ARCH ?= arm64
M ?= $(CURDIR)
BCMDHD_ROOT ?= $(src)
#$(warning "BCMDHD_ROOT=$(BCMDHD_ROOT)")
KERNEL_VER := $(shell cat $(LINUXDIR)/include/config/kernel.release)
EXTRA_CFLAGS = $(DHDCFLAGS)
EXTRA_CFLAGS += -DDHD_COMPILED=\"$(BCMDHD_ROOT)\"
EXTRA_CFLAGS += -I$(BCMDHD_ROOT)/include/ -I$(BCMDHD_ROOT)/
ifeq ($(CONFIG_BCMDHD),m)
EXTRA_LDFLAGS += --strip-debug
endif

obj-$(CONFIG_BCMDHD) += $(MODULE_NAME).o
$(MODULE_NAME)-objs += $(DHDOFILES)
ccflags-y := $(EXTRA_CFLAGS)
EXTRA_CFLAGS += -I$(LINUXDIR)/$(M)/include -I$(LINUXDIR)/$(M)/

#all: bcmdhd_sdio bcmdhd_usb
all: bcmdhd_sdio

modules_install:
	@$(MAKE) INSTALL_MOD_STRIP=1 M=$(M) -C $(LINUXDIR) modules_install
	mkdir -p ${OUT_DIR}/../vendor_lib/modules
	cd ${OUT_DIR}/$(M)/; find -name "*.ko" -exec cp {} ${OUT_DIR}/../vendor_lib/modules/ \;

bcmdhd_pcie:
	$(warning "building PCIe bcmdhd on kernel $(KERNEL_VER) .....")
	$(MAKE) -C $(LINUXDIR) M=$(M) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules CONFIG_BCMDHD=m CONFIG_BCMDHD_PCIE=y

bcmdhd_sdio:
	$(warning "building SDIO bcmdhd on kernel $(KERNEL_VER) .....")
	$(MAKE) -C $(LINUXDIR) M=$(M) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules CONFIG_BCMDHD=m CONFIG_BCMDHD_SDIO=y

bcmdhd_usb:
	$(warning "building USB bcmdhd on kernel $(KERNEL_VER) .....")
	$(MAKE) -C $(LINUXDIR) M=$(M) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules CONFIG_BCMDHD=m CONFIG_BCMDHD_USB=y

clean:
	rm -rf *.o *.ko .*.o.d *.mod.c *~ .*.cmd *.o.cmd .*.o.cmd *.mod \
	Module.symvers modules.order .tmp_versions modules.builtin
