blob: a7aada93a5d8f26a0133aaea6e8576923b1af4df [file] [edit]
/******************************************************************************
*
* This file is provided under a dual license. When you use or
* distribute this software, you may choose to be licensed under
* version 2 of the GNU General Public License ("GPLv2 License")
* or BSD License.
*
* GPLv2 License
*
* Copyright(C) 2016 MediaTek Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See http://www.gnu.org/licenses/gpl-2.0.html for more details.
*
* BSD LICENSE
*
* Copyright(C) 2016 MediaTek Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*****************************************************************************/
/*
** Id: /os/linux/include/gl_kal.h
*/
/*! \file gl_kal.h
* \brief Declaration of KAL functions - kal*() which is provided
* by GLUE Layer.
*
* Any definitions in this file will be shared among GLUE Layer
* and internal Driver Stack.
*/
#ifndef _GL_KAL_H
#define _GL_KAL_H
/*******************************************************************************
* C O M P I L E R F L A G S
*******************************************************************************
*/
/*******************************************************************************
* E X T E R N A L R E F E R E N C E S
*******************************************************************************
*/
#include "config.h"
#include "gl_typedef.h"
#include "gl_wext_priv.h"
#include "link.h"
#include "nic/mac.h"
#include "nic/wlan_def.h"
#include "wlan_lib.h"
#include "wlan_oid.h"
#if CFG_ENABLE_BT_OVER_WIFI
#include "nic/bow.h"
#endif
#include "linux/kallsyms.h"
#include "linux/sched.h"
#if CFG_SUPPORT_SCAN_CACHE_RESULT
#include "wireless/core.h"
#endif
#if DBG
extern int allocatedMemSize;
#endif
extern struct semaphore g_halt_sem;
extern int g_u4HaltFlag;
extern struct delayed_work sched_workq;
#if CFG_SUPPORT_CFG80211_AUTH
#if CFG_SUPPORT_CFG80211_QUEUE
extern struct delayed_work cfg80211_workq;
#endif
#endif
extern u_int8_t wlan_fb_power_down;
extern u_int8_t wlan_perf_monitor_force_enable;
extern u_int8_t g_fgIsOid;
/*******************************************************************************
* C O N S T A N T S
*******************************************************************************
*/
/* Define how many concurrent operation networks. */
#define KAL_BSS_NUM 4
#if CFG_DUAL_P2PLIKE_INTERFACE
#define KAL_P2P_NUM 2
#else
#define KAL_P2P_NUM 1
#endif
#if CFG_SUPPORT_MULTITHREAD
#define GLUE_FLAG_MAIN_PROCESS \
(GLUE_FLAG_HALT | GLUE_FLAG_SUB_MOD_MULTICAST | \
GLUE_FLAG_TX_CMD_DONE | GLUE_FLAG_TXREQ | GLUE_FLAG_TIMEOUT | \
GLUE_FLAG_FRAME_FILTER | GLUE_FLAG_OID | GLUE_FLAG_RX)
#define GLUE_FLAG_HIF_PROCESS \
(GLUE_FLAG_HALT | GLUE_FLAG_INT | GLUE_FLAG_HIF_TX | \
GLUE_FLAG_HIF_TX_CMD | GLUE_FLAG_HIF_FW_OWN)
#define GLUE_FLAG_RX_PROCESS (GLUE_FLAG_HALT | GLUE_FLAG_RX_TO_OS)
#if CFG_SDIO_RX_DE_AGG_IN_THREAD
#define GLUE_FLAG_RX_DE_AGG_PROCESS (GLUE_FLAG_HALT | \
GLUE_FLAG_RX_DE_AGG_IN_THREAD)
#endif
#else
/* All flags for single thread driver */
#define GLUE_FLAG_TX_PROCESS 0xFFFFFFFF
#endif
#if CFG_SUPPORT_SNIFFER
#define RADIOTAP_FIELD_TSFT BIT(0)
#define RADIOTAP_FIELD_FLAGS BIT(1)
#define RADIOTAP_FIELD_RATE BIT(2)
#define RADIOTAP_FIELD_CHANNEL BIT(3)
#define RADIOTAP_FIELD_ANT_SIGNAL BIT(5)
#define RADIOTAP_FIELD_ANT_NOISE BIT(6)
#define RADIOTAP_FIELD_ANT BIT(11)
#define RADIOTAP_FIELD_MCS BIT(19)
#define RADIOTAP_FIELD_AMPDU BIT(20)
#define RADIOTAP_FIELD_VHT BIT(21)
#define RADIOTAP_FIELD_VENDOR BIT(30)
#define RADIOTAP_LEN_VHT 48
#define RADIOTAP_FIELDS_VHT (RADIOTAP_FIELD_TSFT | \
RADIOTAP_FIELD_FLAGS | \
RADIOTAP_FIELD_RATE | \
RADIOTAP_FIELD_CHANNEL | \
RADIOTAP_FIELD_ANT_SIGNAL | \
RADIOTAP_FIELD_ANT_NOISE | \
RADIOTAP_FIELD_ANT | \
RADIOTAP_FIELD_AMPDU | \
RADIOTAP_FIELD_VHT | \
RADIOTAP_FIELD_VENDOR)
#define RADIOTAP_LEN_HT 36
#define RADIOTAP_FIELDS_HT (RADIOTAP_FIELD_TSFT | \
RADIOTAP_FIELD_FLAGS | \
RADIOTAP_FIELD_RATE | \
RADIOTAP_FIELD_CHANNEL | \
RADIOTAP_FIELD_ANT_SIGNAL | \
RADIOTAP_FIELD_ANT_NOISE | \
RADIOTAP_FIELD_ANT | \
RADIOTAP_FIELD_MCS | \
RADIOTAP_FIELD_AMPDU | \
RADIOTAP_FIELD_VENDOR)
#define RADIOTAP_LEN_LEGACY 26
#define RADIOTAP_FIELDS_LEGACY (RADIOTAP_FIELD_TSFT | \
RADIOTAP_FIELD_FLAGS | \
RADIOTAP_FIELD_RATE | \
RADIOTAP_FIELD_CHANNEL | \
RADIOTAP_FIELD_ANT_SIGNAL | \
RADIOTAP_FIELD_ANT_NOISE | \
RADIOTAP_FIELD_ANT | \
RADIOTAP_FIELD_VENDOR)
#endif
#define PERF_MON_DISABLE_BIT (0)
#define PERF_MON_STOP_BIT (1)
#define PERF_MON_RUNNING_BIT (2)
#define PERF_MON_UPDATE_INTERVAL (1000)
#define PERF_MON_TP_MAX_THRESHOLD (10)
/*******************************************************************************
* D A T A T Y P E S
*******************************************************************************
*/
enum ENUM_SPIN_LOCK_CATEGORY_E {
SPIN_LOCK_FSM = 0,
#if CFG_SUPPORT_MULTITHREAD
SPIN_LOCK_TX_PORT_QUE,
SPIN_LOCK_TX_CMD_QUE,
SPIN_LOCK_TX_CMD_DONE_QUE,
SPIN_LOCK_TC_RESOURCE,
SPIN_LOCK_RX_TO_OS_QUE,
#endif
#if CFG_SUPPORT_CFG80211_AUTH
#if CFG_SUPPORT_CFG80211_QUEUE
SPIN_LOCK_CFG80211_QUE,
#endif
#endif
/* FIX ME */
SPIN_LOCK_RX_QUE,
SPIN_LOCK_RX_FREE_QUE,
SPIN_LOCK_TX_QUE,
#if CFG_SUPPORT_TPENHANCE_MODE
SPIN_LOCK_TXACK_QUE,
#endif /* CFG_SUPPORT_TPENHANCE_MODE */
SPIN_LOCK_CMD_QUE,
SPIN_LOCK_TX_RESOURCE,
SPIN_LOCK_CMD_RESOURCE,
SPIN_LOCK_QM_TX_QUEUE,
SPIN_LOCK_CMD_PENDING,
SPIN_LOCK_CMD_SEQ_NUM,
SPIN_LOCK_TX_MSDU_INFO_LIST,
SPIN_LOCK_TXING_MGMT_LIST,
SPIN_LOCK_TX_SEQ_NUM,
SPIN_LOCK_TX_COUNT,
SPIN_LOCK_TXS_COUNT,
/* end */
SPIN_LOCK_TX,
/* TX/RX Direct : BEGIN */
SPIN_LOCK_TX_DIRECT,
SPIN_LOCK_TX_DESC,
SPIN_LOCK_RX_DIRECT_REORDER,
/* TX/RX Direct : END */
SPIN_LOCK_IO_REQ,
SPIN_LOCK_INT,
SPIN_LOCK_MGT_BUF,
SPIN_LOCK_MSG_BUF,
SPIN_LOCK_STA_REC,
SPIN_LOCK_MAILBOX,
SPIN_LOCK_TIMER,
SPIN_LOCK_BOW_TABLE,
SPIN_LOCK_EHPI_BUS, /* only for EHPI */
SPIN_LOCK_NET_DEV,
SPIN_LOCK_NUM
};
enum ENUM_MUTEX_CATEGORY_E {
MUTEX_TX_CMD_CLEAR,
MUTEX_TX_DATA_DONE_QUE,
MUTEX_DEL_INF,
MUTEX_CHIP_RST,
MUTEX_SET_OWN,
#if CFG_SUPPORT_CSI
MUTEX_CSI_BUFFER,
#endif
MUTEX_NUM
};
/* event for assoc information update */
struct EVENT_ASSOC_INFO {
uint8_t ucAssocReq; /* 1 for assoc req, 0 for assoc rsp */
uint8_t ucReassoc; /* 0 for assoc, 1 for reassoc */
uint16_t u2Length;
uint8_t *pucIe;
};
enum ENUM_KAL_NETWORK_TYPE_INDEX {
KAL_NETWORK_TYPE_AIS_INDEX = 0,
#if CFG_ENABLE_WIFI_DIRECT
KAL_NETWORK_TYPE_P2P_INDEX,
#endif
#if CFG_ENABLE_BT_OVER_WIFI
KAL_NETWORK_TYPE_BOW_INDEX,
#endif
KAL_NETWORK_TYPE_INDEX_NUM
};
enum ENUM_KAL_MEM_ALLOCATION_TYPE_E {
PHY_MEM_TYPE, /* physically continuous */
VIR_MEM_TYPE, /* virtually continuous */
MEM_TYPE_NUM
};
#ifdef CONFIG_ANDROID /* Defined in Android kernel source */
#if (KERNEL_VERSION(4, 9, 0) <= CFG80211_VERSION_CODE)
#define KAL_WAKE_LOCK_T struct wakeup_source
#else
#define KAL_WAKE_LOCK_T struct wake_lock
#endif
#else
#define KAL_WAKE_LOCK_T uint32_t
#endif
#if CFG_SUPPORT_AGPS_ASSIST
enum ENUM_MTK_AGPS_ATTR {
MTK_ATTR_AGPS_INVALID,
MTK_ATTR_AGPS_CMD,
MTK_ATTR_AGPS_DATA,
MTK_ATTR_AGPS_IFINDEX,
MTK_ATTR_AGPS_IFNAME,
MTK_ATTR_AGPS_MAX
};
enum ENUM_AGPS_EVENT {
AGPS_EVENT_WLAN_ON,
AGPS_EVENT_WLAN_OFF,
AGPS_EVENT_WLAN_AP_LIST,
};
u_int8_t kalIndicateAgpsNotify(struct ADAPTER *prAdapter,
uint8_t cmd,
uint8_t *data, uint16_t dataLen);
#endif /* CFG_SUPPORT_AGPS_ASSIST */
#if CFG_SUPPORT_SNIFFER
/* Vendor Namespace
* Bit Number 30
* Required Alignment 2 bytes
*/
struct RADIOTAP_FIELD_VENDOR_ {
uint8_t aucOUI[3];
uint8_t ucSubNamespace;
uint16_t u2DataLen;
uint8_t ucData;
} __KAL_ATTRIB_PACKED__;
struct MONITOR_RADIOTAP {
/* radiotap header */
uint8_t ucItVersion; /* set to 0 */
uint8_t ucItPad;
uint16_t u2ItLen; /* entire length */
uint32_t u4ItPresent; /* fields present */
/* TSFT
* Bit Number 0
* Required Alignment 8 bytes
* Unit microseconds
*/
uint64_t u8MacTime;
/* Flags
* Bit Number 1
*/
uint8_t ucFlags;
/* Rate
* Bit Number 2
* Unit 500 Kbps
*/
uint8_t ucRate;
/* Channel
* Bit Number 3
* Required Alignment 2 bytes
*/
uint16_t u2ChFrequency;
uint16_t u2ChFlags;
/* Antenna signal
* Bit Number 5
* Unit dBm
*/
uint8_t ucAntennaSignal;
/* Antenna noise
* Bit Number 6
* Unit dBm
*/
uint8_t ucAntennaNoise;
/* Antenna
* Bit Number 11
* Unit antenna index
*/
uint8_t ucAntenna;
/* MCS
* Bit Number 19
* Required Alignment 1 byte
*/
uint8_t ucMcsKnown;
uint8_t ucMcsFlags;
uint8_t ucMcsMcs;
/* A-MPDU status
* Bit Number 20
* Required Alignment 4 bytes
*/
uint32_t u4AmpduRefNum;
uint16_t u2AmpduFlags;
uint8_t ucAmpduDelimiterCRC;
uint8_t ucAmpduReserved;
/* VHT
* Bit Number 21
* Required Alignment 2 bytes
*/
uint16_t u2VhtKnown;
uint8_t ucVhtFlags;
uint8_t ucVhtBandwidth;
uint8_t aucVhtMcsNss[4];
uint8_t ucVhtCoding;
uint8_t ucVhtGroupId;
uint16_t u2VhtPartialAid;
/* extension space */
uint8_t aucReserve[12];
} __KAL_ATTRIB_PACKED__;
#endif
struct KAL_HALT_CTRL_T {
struct semaphore lock;
struct task_struct *owner;
u_int8_t fgHalt;
u_int8_t fgHeldByKalIoctl;
OS_SYSTIME u4HoldStart;
};
struct KAL_THREAD_SCHEDSTATS {
/* when marked: the profiling start time(ms),
* when unmarked: total duration(ms)
*/
unsigned long long time;
/* time spent in exec (sum_exec_runtime) */
unsigned long long exec;
/* time spent in run-queue while not being scheduled (wait_sum) */
unsigned long long runnable;
/* time spent waiting for I/O (iowait_sum) */
unsigned long long iowait;
};
#if CFG_SUPPORT_CFG80211_AUTH
#if CFG_SUPPORT_CFG80211_QUEUE
struct PARAM_CFG80211_REQ {
struct QUE_ENTRY rQueEntry;
struct net_device *prDevHandler;
void *prFrame; /* the deauth and disassoc has the same struct */
struct cfg80211_bss *bss;
size_t frameLen;
uint8_t ucFlagTx;
uint8_t ucFrameType; /* auth deauth disassoc assoc and so on */
struct wiphy *pWiphy;
struct regulatory_request request;
};
enum ENUM_CFG80211_TX_FLAG {
CFG80211_RX,
CFG80211_TX,
REG_SET /* just use cfg80211 queue */
};
#endif
#endif
enum ENUM_PKT_PATH {
PKT_PATH_TX = 0,
PKT_PATH_RX,
PKT_PATH_ALL
};
/*******************************************************************************
* P U B L I C D A T A
*******************************************************************************
*/
/*******************************************************************************
* P R I V A T E D A T A
*******************************************************************************
*/
/*******************************************************************************
* M A C R O S
*******************************************************************************
*/
#define KAL_SET_BIT(bitOffset, value) set_bit(bitOffset, &value)
#define KAL_CLR_BIT(bitOffset, value) clear_bit(bitOffset, &value)
#define KAL_TEST_AND_CLEAR_BIT(bitOffset, value) \
test_and_clear_bit(bitOffset, &value)
#define KAL_TEST_BIT(bitOffset, value) test_bit(bitOffset, &value)
#define SUSPEND_FLAG_FOR_WAKEUP_REASON (0)
#define SUSPEND_FLAG_CLEAR_WHEN_RESUME (1)
/*----------------------------------------------------------------------------*/
/* Macros of getting current thread id */
/*----------------------------------------------------------------------------*/
#define KAL_GET_CURRENT_THREAD_ID() (current->pid)
#define KAL_GET_CURRENT_THREAD_NAME() (current->comm)
/*----------------------------------------------------------------------------*/
/* Macros of SPIN LOCK operations for using in Driver Layer */
/*----------------------------------------------------------------------------*/
#define KAL_SPIN_LOCK_DECLARATION() unsigned long __ulFlags
#define KAL_ACQUIRE_SPIN_LOCK(_prAdapter, _rLockCategory) \
kalAcquireSpinLock(((struct ADAPTER *)_prAdapter)->prGlueInfo, \
_rLockCategory, &__ulFlags)
#define KAL_RELEASE_SPIN_LOCK(_prAdapter, _rLockCategory) \
kalReleaseSpinLock(((struct ADAPTER *)_prAdapter)->prGlueInfo, \
_rLockCategory, __ulFlags)
/*----------------------------------------------------------------------------*/
/* Macros of MUTEX operations for using in Driver Layer */
/*----------------------------------------------------------------------------*/
#define KAL_ACQUIRE_MUTEX(_prAdapter, _rLockCategory) \
kalAcquireMutex(((struct ADAPTER *)_prAdapter)->prGlueInfo, \
_rLockCategory)
#define KAL_RELEASE_MUTEX(_prAdapter, _rLockCategory) \
kalReleaseMutex(((struct ADAPTER *)_prAdapter)->prGlueInfo, \
_rLockCategory)
/*----------------------------------------------------------------------------*/
/* Macros for accessing Reserved Fields of native packet */
/*----------------------------------------------------------------------------*/
#define KAL_GET_PKT_QUEUE_ENTRY(_p) GLUE_GET_PKT_QUEUE_ENTRY(_p)
#define KAL_GET_PKT_DESCRIPTOR(_prQueueEntry) \
GLUE_GET_PKT_DESCRIPTOR(_prQueueEntry)
#define KAL_GET_PKT_TID(_p) GLUE_GET_PKT_TID(_p)
#define KAL_GET_PKT_IS1X(_p) GLUE_GET_PKT_IS1X(_p)
#define KAL_GET_PKT_HEADER_LEN(_p) GLUE_GET_PKT_HEADER_LEN(_p)
#define KAL_GET_PKT_PAYLOAD_LEN(_p) GLUE_GET_PKT_PAYLOAD_LEN(_p)
#define KAL_GET_PKT_ARRIVAL_TIME(_p) GLUE_GET_PKT_ARRIVAL_TIME(_p)
/*----------------------------------------------------------------------------*/
/* Macros for kernel related defines */
/*----------------------------------------------------------------------------*/
#if KERNEL_VERSION(3, 14, 0) > CFG80211_VERSION_CODE
#define IEEE80211_CHAN_PASSIVE_FLAG IEEE80211_CHAN_PASSIVE_SCAN
#define IEEE80211_CHAN_PASSIVE_STR "PASSIVE"
#else
#define IEEE80211_CHAN_PASSIVE_FLAG IEEE80211_CHAN_NO_IR
#define IEEE80211_CHAN_PASSIVE_STR "NO_IR"
#endif
#if KERNEL_VERSION(4, 7, 0) <= CFG80211_VERSION_CODE
/**
* enum nl80211_band - Frequency band
* @NL80211_BAND_2GHZ: 2.4 GHz ISM band
* @NL80211_BAND_5GHZ: around 5 GHz band (4.9 - 5.7 GHz)
* @NL80211_BAND_60GHZ: around 60 GHz band (58.32 - 64.80 GHz)
* @NUM_NL80211_BANDS: number of bands, avoid using this in userspace
* since newer kernel versions may support more bands
*/
#define KAL_BAND_2GHZ NL80211_BAND_2GHZ
#define KAL_BAND_5GHZ NL80211_BAND_5GHZ
#define KAL_NUM_BANDS NUM_NL80211_BANDS
#else
#define KAL_BAND_2GHZ IEEE80211_BAND_2GHZ
#define KAL_BAND_5GHZ IEEE80211_BAND_5GHZ
#define KAL_NUM_BANDS IEEE80211_NUM_BANDS
#endif
/**
* enum nl80211_reg_rule_flags - regulatory rule flags
* @NL80211_RRF_NO_OFDM: OFDM modulation not allowed
* @NL80211_RRF_AUTO_BW: maximum available bandwidth should be calculated
* base on contiguous rules and wider channels will be allowed to cross
* multiple contiguous/overlapping frequency ranges.
* @NL80211_RRF_DFS: DFS support is required to be used
*/
#define KAL_RRF_NO_OFDM NL80211_RRF_NO_OFDM
#define KAL_RRF_DFS NL80211_RRF_DFS
#if KERNEL_VERSION(3, 15, 0) > CFG80211_VERSION_CODE
#define KAL_RRF_AUTO_BW 0
#else
#define KAL_RRF_AUTO_BW NL80211_RRF_AUTO_BW
#endif
/**
* kalCfg80211ScanDone - abstraction of cfg80211_scan_done
*
* @request: the corresponding scan request (sanity checked by callers!)
* @aborted: set to true if the scan was aborted for any reason,
* userspace will be notified of that
*
* Since linux-4.8.y the 2nd parameter is changed from bool to
* struct cfg80211_scan_info, but we don't use all fields yet.
*/
#if KERNEL_VERSION(4, 8, 0) <= CFG80211_VERSION_CODE
static inline void kalCfg80211ScanDone(struct cfg80211_scan_request *request,
bool aborted)
{
struct cfg80211_scan_info info = {.aborted = aborted };
cfg80211_scan_done(request, &info);
}
#else
static inline void kalCfg80211ScanDone(struct cfg80211_scan_request *request,
bool aborted)
{
cfg80211_scan_done(request, aborted);
}
#endif
/* Consider on some Android platform, using request_firmware_direct()
* may cause system failed to load firmware. So we still use
* request_firmware().
*/
#define REQUEST_FIRMWARE(_fw, _name, _dev) \
request_firmware(_fw, _name, _dev)
/*----------------------------------------------------------------------------*/
/* Macros of wake_lock operations for using in Driver Layer */
/*----------------------------------------------------------------------------*/
#if CFG_ENABLE_WAKE_LOCK
/* CFG_ENABLE_WAKE_LOCK is defined in config.h ANDROID defined */
#if (KERNEL_VERSION(5, 1, 0) <= LINUX_VERSION_CODE)
/* TODO: wakeup_source_init/wakeup_source_trash removed from v5.1
* Update KAL_WAKE_LOCK_INIT/DESTROY to equivalent ways
*/
#define KAL_WAKE_LOCK_INIT(_prAdapter, _prWakeLock, _pcName) ({ \
_prWakeLock = kalMemAlloc(sizeof(KAL_WAKE_LOCK_T), \
VIR_MEM_TYPE); \
if (!_prWakeLock) { \
DBGLOG(HAL, ERROR, \
"KAL_WAKE_LOCK_INIT init fail!\n"); \
} \
else { \
memset(_prWakeLock, 0, sizeof(*(_prWakeLock))); \
(_prWakeLock)->name = _pcName; \
wakeup_source_add(_prWakeLock); \
} \
})
#define KAL_WAKE_LOCK_DESTROY(_prAdapter, _prWakeLock) ({ \
if (_prWakeLock) { \
wakeup_source_remove(_prWakeLock); \
kalMemFree(_prWakeLock, VIR_MEM_TYPE, \
sizeof(KAL_WAKE_LOCK_T)); \
_prWakeLock = NULL; \
} \
})
#define KAL_WAKE_LOCK(_prAdapter, _prWakeLock) ({ \
u_int8_t state = 0; \
if (_prWakeLock && halIsHifStateReady(_prAdapter, &state)) { \
__pm_stay_awake(_prWakeLock); \
} \
})
#define KAL_WAKE_LOCK_TIMEOUT(_prAdapter, _prWakeLock, _u4Timeout) ({ \
u_int8_t state = 0; \
if (_prWakeLock && halIsHifStateReady(_prAdapter, &state)) { \
__pm_wakeup_event(_prWakeLock, _u4Timeout); \
} \
})
#define KAL_WAKE_UNLOCK(_prAdapter, _prWakeLock) ({\
if (_prWakeLock) \
__pm_relax(_prWakeLock); \
})
#define KAL_WAKE_LOCK_ACTIVE(_prAdapter, _prWakeLock) \
(_prWakeLock && (_prWakeLock)->active)
#elif (KERNEL_VERSION(4, 9, 0) <= LINUX_VERSION_CODE)
#if (KERNEL_VERSION(4, 14, 149) <= LINUX_VERSION_CODE)
#define KAL_WAKE_LOCK_INIT(_prAdapter, _prWakeLock, _pcName) \
(_prWakeLock = wakeup_source_register(NULL, _pcName))
#define KAL_WAKE_LOCK_DESTROY(_prAdapter, _prWakeLock) \
{ \
if (_prWakeLock) { \
wakeup_source_unregister(_prWakeLock); \
_prWakeLock = NULL; \
} \
}
#else
#define KAL_WAKE_LOCK_INIT(_prAdapter, _prWakeLock, _pcName) \
{ \
_prWakeLock = kalMemAlloc(sizeof(KAL_WAKE_LOCK_T), \
VIR_MEM_TYPE); \
if (!_prWakeLock) { \
DBGLOG(HAL, ERROR, \
"KAL_WAKE_LOCK_INIT init fail!\n"); \
} \
else { \
wakeup_source_init(_prWakeLock, _pcName); \
} \
}
#define KAL_WAKE_LOCK_DESTROY(_prAdapter, _prWakeLock) \
{ \
if (_prWakeLock) { \
wakeup_source_trash(_prWakeLock); \
kalMemFree(_prWakeLock, VIR_MEM_TYPE, \
sizeof(KAL_WAKE_LOCK_T)); \
_prWakeLock = NULL; \
} \
}
#endif
#define KAL_WAKE_LOCK(_prAdapter, _prWakeLock) ({ \
u_int8_t state = 0; \
if (_prWakeLock && halIsHifStateReady(_prAdapter, &state)) { \
__pm_stay_awake(_prWakeLock); \
} \
})
#define KAL_WAKE_LOCK_TIMEOUT(_prAdapter, _prWakeLock, _u4Timeout) ({ \
u_int8_t state = 0; \
if (_prWakeLock && halIsHifStateReady(_prAdapter, &state)) { \
__pm_wakeup_event(_prWakeLock, _u4Timeout); \
} \
})
#define KAL_WAKE_UNLOCK(_prAdapter, _prWakeLock) ({ \
if (_prWakeLock) \
__pm_relax(_prWakeLock); \
})
#define KAL_WAKE_LOCK_ACTIVE(_prAdapter, _prWakeLock) \
(_prWakeLock && (_prWakeLock)->active)
#else
#define KAL_WAKE_LOCK_INIT(_prAdapter, _prWakeLock, _pcName) ({\
_prWakeLock = kalMemAlloc(sizeof(KAL_WAKE_LOCK_T), \
VIR_MEM_TYPE); \
if (!_prWakeLock) { \
DBGLOG(HAL, ERROR, \
"KAL_WAKE_LOCK_INIT init fail!\n"); \
} \
else { \
wake_lock_init(_prWakeLock, WAKE_LOCK_SUSPEND, _pcName); \
} \
})
#define KAL_WAKE_LOCK_DESTROY(_prAdapter, _prWakeLock) ({\
if (_prWakeLock) { \
wake_lock_destroy(_prWakeLock); \
_prWakeLock = NULL; \
} \
})
#define KAL_WAKE_LOCK(_prAdapter, _prWakeLock) ({ \
u_int8_t state = 0; \
if (_prWakeLock && halIsHifStateReady(_prAdapter, &state)) { \
wake_lock(_prWakeLock); \
} \
})
#define KAL_WAKE_LOCK_TIMEOUT(_prAdapter, _prWakeLock, _u4Timeout) ({ \
u_int8_t state = 0; \
if (_prWakeLock && halIsHifStateReady(_prAdapter, &state)) { \
wake_lock_timeout(_prWakeLock, _u4Timeout); \
} \
})
#define KAL_WAKE_UNLOCK(_prAdapter, _prWakeLock) ({\
if (_prWakeLock) {\
wake_unlock(_prWakeLock); \
} \
})
#define KAL_WAKE_LOCK_ACTIVE(_prAdapter, _prWakeLock) \
(_prWakeLock && wake_lock_active(_prWakeLock))
#endif
#else
#define KAL_WAKE_LOCK_INIT(_prAdapter, _prWakeLock, _pcName)
#define KAL_WAKE_LOCK_DESTROY(_prAdapter, _prWakeLock)
#define KAL_WAKE_LOCK(_prAdapter, _prWakeLock)
#define KAL_WAKE_LOCK_TIMEOUT(_prAdapter, _prWakeLock, _u4Timeout)
#define KAL_WAKE_UNLOCK(_prAdapter, _prWakeLock)
#define KAL_WAKE_LOCK_ACTIVE(_prAdapter, _prWakeLock)
#endif
#define KAL_GFP_FLAG() \
(in_interrupt()?GFP_ATOMIC:GFP_KERNEL)
/*----------------------------------------------------------------------------*/
/*!
* \brief Cache memory allocation
*
* \param[in] u4Size Required memory size.
* \param[in] eMemType Memory allocation type
*
* \return Pointer to allocated memory
* or NULL
*/
/*----------------------------------------------------------------------------*/
#if DBG
#define kalMemAlloc(u4Size, eMemType) ({ \
void *pvAddr; \
if (eMemType == PHY_MEM_TYPE) { \
if (in_interrupt()) \
pvAddr = kmalloc(u4Size, GFP_ATOMIC); \
else \
pvAddr = kmalloc(u4Size, GFP_KERNEL); \
} \
else { \
pvAddr = vmalloc(u4Size); \
} \
if (pvAddr) { \
allocatedMemSize += u4Size; \
DBGLOG(INIT, INFO, "0x%p(%ld) allocated (%s:%s)\n", \
pvAddr, (uint32_t)u4Size, __FILE__, __func__); \
} \
pvAddr; \
})
#else
#define kalMemAlloc(u4Size, eMemType) ({ \
void *pvAddr; \
if (eMemType == PHY_MEM_TYPE) { \
if (in_interrupt()) \
pvAddr = kmalloc(u4Size, GFP_ATOMIC); \
else \
pvAddr = kmalloc(u4Size, GFP_KERNEL); \
} \
else { \
pvAddr = vmalloc(u4Size); \
} \
if (!pvAddr) \
ASSERT_NOMEM(); \
pvAddr; \
})
#endif
/*----------------------------------------------------------------------------*/
/*!
* \brief Free allocated cache memory
*
* \param[in] pvAddr Required memory size.
* \param[in] eMemType Memory allocation type
* \param[in] u4Size Allocated memory size.
*
* \return -
*/
/*----------------------------------------------------------------------------*/
#if DBG
#define kalMemFree(pvAddr, eMemType, u4Size) \
{ \
if (pvAddr) { \
allocatedMemSize -= u4Size; \
DBGLOG(INIT, INFO, "0x%p(%ld) freed (%s:%s)\n", \
pvAddr, (uint32_t)u4Size, __FILE__, __func__); \
} \
if (eMemType == PHY_MEM_TYPE) { \
kfree(pvAddr); \
pvAddr = NULL; \
} \
else { \
vfree(pvAddr); \
pvAddr = NULL; \
} \
}
#else
#define kalMemFree(pvAddr, eMemType, u4Size) \
{ \
if (eMemType == PHY_MEM_TYPE) { \
kfree(pvAddr); \
pvAddr = NULL; \
} \
else { \
vfree(pvAddr); \
pvAddr = NULL; \
} \
}
#endif
#define kalUdelay(u4USec) udelay(u4USec)
#define kalMdelay(u4MSec) mdelay(u4MSec)
#define kalMsleep(u4MSec) msleep(u4MSec)
#define kalUsleep_range(u4MinUSec, u4MaxUSec) \
usleep_range(u4MinUSec, u4MaxUSec)
/* Copy memory from user space to kernel space */
#define kalMemCopyFromUser(_pvTo, _pvFrom, _u4N) \
copy_from_user(_pvTo, _pvFrom, _u4N)
/* Copy memory from kernel space to user space */
#define kalMemCopyToUser(_pvTo, _pvFrom, _u4N) \
copy_to_user(_pvTo, _pvFrom, _u4N)
/* Copy memory block with specific size */
#define kalMemCopy(pvDst, pvSrc, u4Size) \
memcpy(pvDst, pvSrc, u4Size)
/* Set memory block with specific pattern */
#define kalMemSet(pvAddr, ucPattern, u4Size) \
memset(pvAddr, ucPattern, u4Size)
/* Compare two memory block with specific length.
* Return zero if they are the same.
*/
#define kalMemCmp(pvAddr1, pvAddr2, u4Size) \
memcmp(pvAddr1, pvAddr2, u4Size)
/* Zero specific memory block */
#define kalMemZero(pvAddr, u4Size) \
memset(pvAddr, 0, u4Size)
/* Move memory block with specific size */
#define kalMemMove(pvDst, pvSrc, u4Size) \
memmove(pvDst, pvSrc, u4Size)
#if KERNEL_VERSION(4, 0, 0) <= LINUX_VERSION_CODE
#define strnicmp(s1, s2, n) strncasecmp(s1, s2, n)
#endif
/* string operation */
#define kalStrCpy(dest, src) strcpy(dest, src)
#define kalStrnCpy(dest, src, n) strncpy(dest, src, n)
#define kalStrCmp(ct, cs) strcmp(ct, cs)
#define kalStrnCmp(ct, cs, n) strncmp(ct, cs, n)
#define kalStrChr(s, c) strchr(s, c)
#define kalStrrChr(s, c) strrchr(s, c)
#define kalStrnChr(s, n, c) strnchr(s, n, c)
#define kalStrLen(s) strlen(s)
#define kalStrnLen(s, b) strnlen(s, b)
#define kalStrniCmp(ct, cs, n) strncasecmp(ct, cs, n)
/* #define kalStrtoul(cp, endp, base) simple_strtoul(cp, endp, base) */
/* #define kalStrtol(cp, endp, base) simple_strtol(cp, endp, base) */
#define kalkStrtou8(cp, base, resp) kstrtou8(cp, base, resp)
#define kalkStrtou16(cp, base, resp) kstrtou16(cp, base, resp)
#define kalkStrtou32(cp, base, resp) kstrtou32(cp, base, resp)
#define kalkStrtos32(cp, base, resp) kstrtos32(cp, base, resp)
#define kalSnprintf(buf, size, fmt, ...) \
snprintf(buf, size, fmt, ##__VA_ARGS__)
#define kalScnprintf(buf, size, fmt, ...) \
scnprintf(buf, size, fmt, ##__VA_ARGS__)
#define kalSprintf(buf, fmt, ...) sprintf(buf, fmt, __VA_ARGS__)
/* remove for AOSP */
/* #define kalSScanf(buf, fmt, ...) sscanf(buf, fmt, __VA_ARGS__) */
#define kalStrStr(ct, cs) strstr(ct, cs)
#define kalStrSep(s, ct) strsep(s, ct)
#define kalStrCat(dest, src) strcat(dest, src)
#define kalIsXdigit(c) isxdigit(c)
/* defined for wince sdio driver only */
#if defined(_HIF_SDIO)
#define kalDevSetPowerState(prGlueInfo, ePowerMode) \
glSetPowerState(prGlueInfo, ePowerMode)
#else
#define kalDevSetPowerState(prGlueInfo, ePowerMode)
#endif
/*----------------------------------------------------------------------------*/
/*!
* \brief Notify OS with SendComplete event of the specific packet.
* Linux should free packets here.
*
* \param[in] prGlueInfo Pointer of GLUE Data Structure
* \param[in] pvPacket Pointer of Packet Handle
* \param[in] status Status Code for OS upper layer
*
* \return -
*/
/*----------------------------------------------------------------------------*/
#define kalSendComplete(prGlueInfo, pvPacket, status) \
kalSendCompleteAndAwakeQueue(prGlueInfo, pvPacket)
/*----------------------------------------------------------------------------*/
/*!
* \brief This function is used to locate the starting address of incoming
* ethernet frame for skb.
*
* \param[in] prGlueInfo Pointer of GLUE Data Structure
* \param[in] pvPacket Pointer of Packet Handle
*
* \return starting address of ethernet frame buffer.
*/
/*----------------------------------------------------------------------------*/
#define kalQueryBufferPointer(prGlueInfo, pvPacket) \
((uint8_t *)((struct sk_buff *)pvPacket)->data)
/*----------------------------------------------------------------------------*/
/*!
* \brief This function is used to query the length of valid buffer which is
* accessible during port read/write.
*
* \param[in] prGlueInfo Pointer of GLUE Data Structure
* \param[in] pvPacket Pointer of Packet Handle
*
* \return starting address of ethernet frame buffer.
*/
/*----------------------------------------------------------------------------*/
#define kalQueryValidBufferLength(prGlueInfo, pvPacket) \
((uint32_t)((struct sk_buff *)pvPacket)->end - \
(uint32_t)((struct sk_buff *)pvPacket)->data)
/*----------------------------------------------------------------------------*/
/*!
* \brief This function is used to copy the entire frame from skb to the
* destination address in the input parameter.
*
* \param[in] prGlueInfo Pointer of GLUE Data Structure
* \param[in] pvPacket Pointer of Packet Handle
* \param[in] pucDestBuffer Destination Address
*
* \return -
*/
/*----------------------------------------------------------------------------*/
#define kalCopyFrame(prGlueInfo, pvPacket, pucDestBuffer) \
do {struct sk_buff *skb = (struct sk_buff *)pvPacket; \
memcpy(pucDestBuffer, skb->data, skb->len); } while (0)
#define kalGetTimeTick() jiffies_to_msecs(jiffies)
#define WLAN_TAG "[wlan]"
#define kalPrint(_Fmt...) pr_info(WLAN_TAG _Fmt)
#define kalPrintLimited(_Fmt...) pr_info_ratelimited(WLAN_TAG _Fmt)
#define kalBreakPoint() \
do { \
WARN_ON(1); \
panic("Oops"); \
} while (0)
#if CFG_ENABLE_AEE_MSG
#define kalSendAeeException aee_kernel_exception
#define kalSendAeeWarning aee_kernel_warning
#define kalSendAeeReminding aee_kernel_reminding
#else
#define kalSendAeeException(_module, _desc, ...)
#define kalSendAeeWarning(_module, _desc, ...)
#define kalSendAeeReminding(_module, _desc, ...)
#endif
#define PRINTF_ARG(...) __VA_ARGS__
#define SPRINTF(buf, arg) {buf += sprintf((char *)(buf), PRINTF_ARG arg); }
#define USEC_TO_SYSTIME(_usec) ((_usec) / USEC_PER_MSEC)
#define MSEC_TO_SYSTIME(_msec) (_msec)
#define MSEC_TO_JIFFIES(_msec) msecs_to_jiffies(_msec)
#define KAL_TIME_INTERVAL_DECLARATION() struct timeval __rTs, __rTe
#define KAL_REC_TIME_START() do_gettimeofday(&__rTs)
#define KAL_REC_TIME_END() do_gettimeofday(&__rTe)
#define KAL_GET_TIME_INTERVAL() \
((SEC_TO_USEC(__rTe.tv_sec) + __rTe.tv_usec) - \
(SEC_TO_USEC(__rTs.tv_sec) + __rTs.tv_usec))
#define KAL_ADD_TIME_INTERVAL(_Interval) \
{ \
(_Interval) += KAL_GET_TIME_INTERVAL(); \
}
#if defined(_HIF_PCIE)
#define KAL_DMA_TO_DEVICE PCI_DMA_TODEVICE
#define KAL_DMA_FROM_DEVICE PCI_DMA_FROMDEVICE
#define KAL_DMA_ALLOC_COHERENT(_dev, _size, _handle) \
pci_alloc_consistent(_dev, _size, _handle)
#define KAL_DMA_FREE_COHERENT(_dev, _size, _addr, _handle) \
pci_free_consistent(_dev, _size, _addr, _handle)
#define KAL_DMA_MAP_SINGLE(_dev, _ptr, _size, _dir) \
pci_map_single(_dev, _ptr, _size, _dir)
#define KAL_DMA_UNMAP_SINGLE(_dev, _addr, _size, _dir) \
pci_unmap_single(_dev, _addr, _size, _dir)
#define KAL_DMA_MAPPING_ERROR(_dev, _addr) \
pci_dma_mapping_error(_dev, _addr)
#else
#define KAL_DMA_TO_DEVICE DMA_TO_DEVICE
#define KAL_DMA_FROM_DEVICE DMA_FROM_DEVICE
#define KAL_DMA_ALLOC_COHERENT(_dev, _size, _handle) \
dma_alloc_coherent(_dev, _size, _handle, GFP_DMA)
#define KAL_DMA_FREE_COHERENT(_dev, _size, _addr, _handle) \
dma_free_coherent(_dev, _size, _addr, _handle)
#define KAL_DMA_MAP_SINGLE(_dev, _ptr, _size, _dir) \
dma_map_single(_dev, _ptr, _size, _dir)
#define KAL_DMA_UNMAP_SINGLE(_dev, _addr, _size, _dir) \
dma_unmap_single(_dev, _addr, _size, _dir)
#define KAL_DMA_MAPPING_ERROR(_dev, _addr) \
dma_mapping_error(_dev, _addr)
#endif
#if defined(_HIF_AXI)
#define KAL_ARCH_SETUP_DMA_OPS(_dev, _base, _size, _iommu, _coherent) \
connectivity_arch_setup_dma_ops(_dev, _base, _size, _iommu, _coherent)
#else
#define KAL_ARCH_SETUP_DMA_OPS(_dev, _base, _size, _iommu, _coherent)
#endif
/*----------------------------------------------------------------------------*/
/* Macros of show stack operations for using in Driver Layer */
/*----------------------------------------------------------------------------*/
#ifdef CONFIG_X86
#define kal_show_stack(_adapter, _task, _sp)
#else
#define kal_show_stack(_adapter, _task, _sp) \
{ \
if (_adapter->chip_info->showTaskStack) { \
_adapter->chip_info->showTaskStack(_task, _sp); \
} \
}
#endif
#if KERNEL_VERSION(5, 6, 0) <= LINUX_VERSION_CODE
#define DEFINE_PROC_OPS_STRUCT(_n_) const struct proc_ops _n_
#define DEFINE_PROC_OPS_OWNER(_n_)
#define DEFINE_PROC_OPS_WRITE(_n_) .proc_write = _n_,
#define DEFINE_PROC_OPS_READ(_n_) .proc_read = _n_,
#define DEFINE_PROC_OPS_POLL(_n_) .proc_poll = _n_,
#define DEFINE_PROC_OPS_OPEN(_n_) .proc_open = _n_,
#define DEFINE_PROC_OPS_LSEEK(_n_) .proc_lseek = _n_,
#define DEFINE_PROC_OPS_RELEASE(_n_) .proc_release = _n_,
#else
#define DEFINE_PROC_OPS_STRUCT(_n_) const struct file_operations _n_
#define DEFINE_PROC_OPS_OWNER(_n_) .owner = _n_,
#define DEFINE_PROC_OPS_WRITE(_n_) .write = _n_,
#define DEFINE_PROC_OPS_READ(_n_) .read = _n_,
#define DEFINE_PROC_OPS_POLL(_n_) .poll = _n_,
#define DEFINE_PROC_OPS_OPEN(_n_) .open = _n_,
#define DEFINE_PROC_OPS_LSEEK(_n_) .llseek = _n_,
#define DEFINE_PROC_OPS_RELEASE(_n_) .release = _n_,
#endif
/*******************************************************************************
* F U N C T I O N D E C L A R A T I O N S
*******************************************************************************
*/
/*----------------------------------------------------------------------------*/
/* Routines in gl_kal.c */
/*----------------------------------------------------------------------------*/
void kalAcquireSpinLock(IN struct GLUE_INFO *prGlueInfo,
IN enum ENUM_SPIN_LOCK_CATEGORY_E rLockCategory,
OUT unsigned long *plFlags);
void kalReleaseSpinLock(IN struct GLUE_INFO *prGlueInfo,
IN enum ENUM_SPIN_LOCK_CATEGORY_E rLockCategory,
IN unsigned long ulFlags);
void kalUpdateMACAddress(IN struct GLUE_INFO *prGlueInfo,
IN uint8_t *pucMacAddr);
void kalAcquireMutex(IN struct GLUE_INFO *prGlueInfo,
IN enum ENUM_MUTEX_CATEGORY_E rMutexCategory);
void kalReleaseMutex(IN struct GLUE_INFO *prGlueInfo,
IN enum ENUM_MUTEX_CATEGORY_E rMutexCategory);
void kalPacketFree(IN struct GLUE_INFO *prGlueInfo,
IN void *pvPacket);
void *kalPacketAlloc(IN struct GLUE_INFO *prGlueInfo,
IN uint32_t u4Size,
OUT uint8_t **ppucData);
void *kalPacketAllocWithHeadroom(IN struct GLUE_INFO
*prGlueInfo,
IN uint32_t u4Size, OUT uint8_t **ppucData);
void kalOsTimerInitialize(IN struct GLUE_INFO *prGlueInfo,
IN void *prTimerHandler);
u_int8_t kalSetTimer(IN struct GLUE_INFO *prGlueInfo,
IN OS_SYSTIME rInterval);
uint32_t
kalProcessRxPacket(IN struct GLUE_INFO *prGlueInfo,
IN void *pvPacket,
IN uint8_t *pucPacketStart, IN uint32_t u4PacketLen,
/* IN PBOOLEAN pfgIsRetain, */
IN u_int8_t fgIsRetain, IN enum ENUM_CSUM_RESULT aeCSUM[]);
uint32_t kalRxIndicatePkts(IN struct GLUE_INFO *prGlueInfo,
IN void *apvPkts[],
IN uint8_t ucPktNum);
uint32_t kalRxIndicateOnePkt(IN struct GLUE_INFO
*prGlueInfo, IN void *pvPkt);
void
kalIndicateStatusAndComplete(IN struct GLUE_INFO
*prGlueInfo,
IN uint32_t eStatus, IN void *pvBuf,
IN uint32_t u4BufLen);
void
kalUpdateReAssocReqInfo(IN struct GLUE_INFO *prGlueInfo,
IN uint8_t *pucFrameBody, IN uint32_t u4FrameBodyLen,
IN u_int8_t fgReassocRequest);
void kalUpdateReAssocRspInfo(IN struct GLUE_INFO
*prGlueInfo,
IN uint8_t *pucFrameBody,
IN uint32_t u4FrameBodyLen);
#if CFG_TX_FRAGMENT
u_int8_t
kalQueryTxPacketHeader(IN struct GLUE_INFO *prGlueInfo,
IN void *pvPacket, OUT uint16_t *pu2EtherTypeLen,
OUT uint8_t *pucEthDestAddr);
#endif /* CFG_TX_FRAGMENT */
void kalSendCompleteAndAwakeQueue(IN struct GLUE_INFO
*prGlueInfo,
IN void *pvPacket);
#if CFG_TCP_IP_CHKSUM_OFFLOAD
void kalQueryTxChksumOffloadParam(IN void *pvPacket,
OUT uint8_t *pucFlag);
void kalUpdateRxCSUMOffloadParam(IN void *pvPacket,
IN enum ENUM_CSUM_RESULT eCSUM[]);
#endif /* CFG_TCP_IP_CHKSUM_OFFLOAD */
u_int8_t kalRetrieveNetworkAddress(IN struct GLUE_INFO *prGlueInfo,
IN OUT uint8_t *prMacAddr);
void
kalReadyOnChannel(IN struct GLUE_INFO *prGlueInfo,
IN uint64_t u8Cookie,
IN enum ENUM_BAND eBand, IN enum ENUM_CHNL_EXT eSco,
IN uint8_t ucChannelNum, IN uint32_t u4DurationMs);
void
kalRemainOnChannelExpired(IN struct GLUE_INFO *prGlueInfo,
IN uint64_t u8Cookie, IN enum ENUM_BAND eBand,
IN enum ENUM_CHNL_EXT eSco, IN uint8_t ucChannelNum);
#if CFG_SUPPORT_DFS
void
kalIndicateChannelSwitch(IN struct GLUE_INFO *prGlueInfo,
IN enum ENUM_CHNL_EXT eSco,
IN uint8_t ucChannelNum);
#endif
void
kalIndicateMgmtTxStatus(IN struct GLUE_INFO *prGlueInfo,
IN uint64_t u8Cookie, IN u_int8_t fgIsAck,
IN uint8_t *pucFrameBuf, IN uint32_t u4FrameLen);
void kalIndicateRxMgmtFrame(IN struct GLUE_INFO *prGlueInfo,
IN struct SW_RFB *prSwRfb);
/*----------------------------------------------------------------------------*/
/* Routines in interface - ehpi/sdio.c */
/*----------------------------------------------------------------------------*/
u_int8_t kalDevRegRead(IN struct GLUE_INFO *prGlueInfo,
IN uint32_t u4Register,
OUT uint32_t *pu4Value);
u_int8_t kalDevRegRead_mac(IN struct GLUE_INFO *prGlueInfo,
IN uint32_t u4Register, OUT uint32_t *pu4Value);
u_int8_t kalDevRegWrite(struct GLUE_INFO *prGlueInfo,
IN uint32_t u4Register,
IN uint32_t u4Value);
u_int8_t kalDevRegWrite_mac(struct GLUE_INFO *prGlueInfo,
IN uint32_t u4Register, IN uint32_t u4Value);
u_int8_t
kalDevPortRead(IN struct GLUE_INFO *prGlueInfo,
IN uint16_t u2Port, IN uint32_t u2Len, OUT uint8_t *pucBuf,
IN uint32_t u2ValidOutBufSize);
u_int8_t
kalDevPortWrite(struct GLUE_INFO *prGlueInfo,
IN uint16_t u2Port, IN uint32_t u2Len, IN uint8_t *pucBuf,
IN uint32_t u2ValidInBufSize);
u_int8_t kalDevWriteData(IN struct GLUE_INFO *prGlueInfo,
IN struct MSDU_INFO *prMsduInfo);
u_int8_t kalDevWriteCmd(IN struct GLUE_INFO *prGlueInfo,
IN struct CMD_INFO *prCmdInfo, IN uint8_t ucTC);
u_int8_t kalDevKickData(IN struct GLUE_INFO *prGlueInfo);
void kalDevReadIntStatus(IN struct ADAPTER *prAdapter,
OUT uint32_t *pu4IntStatus);
u_int8_t kalDevWriteWithSdioCmd52(IN struct GLUE_INFO
*prGlueInfo,
IN uint32_t u4Addr, IN uint8_t ucData);
#if CFG_SUPPORT_EXT_CONFIG
uint32_t kalReadExtCfg(IN struct GLUE_INFO *prGlueInfo);
#endif
u_int8_t
kalQoSFrameClassifierAndPacketInfo(IN struct GLUE_INFO
*prGlueInfo,
IN void *prPacket,
OUT struct TX_PACKET_INFO *prTxPktInfo);
u_int8_t kalGetEthDestAddr(IN struct GLUE_INFO *prGlueInfo,
IN void *prPacket,
OUT uint8_t *pucEthDestAddr);
void
kalOidComplete(IN struct GLUE_INFO *prGlueInfo,
IN u_int8_t fgSetQuery, IN uint32_t u4SetQueryInfoLen,
IN uint32_t rOidStatus);
uint32_t
kalIoctl(IN struct GLUE_INFO *prGlueInfo,
IN PFN_OID_HANDLER_FUNC pfnOidHandler,
IN void *pvInfoBuf,
IN uint32_t u4InfoBufLen, IN u_int8_t fgRead,
IN u_int8_t fgWaitResp,
IN u_int8_t fgCmd, OUT uint32_t *pu4QryInfoLen);
void kalHandleAssocInfo(IN struct GLUE_INFO *prGlueInfo,
IN struct EVENT_ASSOC_INFO *prAssocInfo);
#if CFG_ENABLE_FW_DOWNLOAD
void *kalFirmwareImageMapping(IN struct GLUE_INFO
*prGlueInfo,
OUT void **ppvMapFileBuf,
OUT uint32_t *pu4FileLength,
IN enum ENUM_IMG_DL_IDX_T eDlIdx);
void kalFirmwareImageUnmapping(IN struct GLUE_INFO
*prGlueInfo,
IN void *prFwHandle, IN void *pvMapFileBuf);
#endif
#if CFG_CHIP_RESET_SUPPORT
void kalRemoveProbe(IN struct GLUE_INFO *prGlueInfo);
#endif
/*----------------------------------------------------------------------------*/
/* Card Removal Check */
/*----------------------------------------------------------------------------*/
u_int8_t kalIsCardRemoved(IN struct GLUE_INFO *prGlueInfo);
/*----------------------------------------------------------------------------*/
/* TX */
/*----------------------------------------------------------------------------*/
void kalFlushPendingTxPackets(IN struct GLUE_INFO
*prGlueInfo);
/*----------------------------------------------------------------------------*/
/* Media State Indication */
/*----------------------------------------------------------------------------*/
enum ENUM_PARAM_MEDIA_STATE kalGetMediaStateIndicated(
IN struct GLUE_INFO
*prGlueInfo);
void kalSetMediaStateIndicated(IN struct GLUE_INFO *prGlueInfo,
IN enum ENUM_PARAM_MEDIA_STATE eParamMediaStateIndicate);
/*----------------------------------------------------------------------------*/
/* OID handling */
/*----------------------------------------------------------------------------*/
void kalOidCmdClearance(IN struct GLUE_INFO *prGlueInfo);
void kalOidClearance(IN struct GLUE_INFO *prGlueInfo);
void kalEnqueueCommand(IN struct GLUE_INFO *prGlueInfo,
IN struct QUE_ENTRY *prQueueEntry);
#if CFG_ENABLE_BT_OVER_WIFI
/*----------------------------------------------------------------------------*/
/* Bluetooth over Wi-Fi handling */
/*----------------------------------------------------------------------------*/
void kalIndicateBOWEvent(IN struct GLUE_INFO *prGlueInfo,
IN struct BT_OVER_WIFI_EVENT *prEvent);
enum ENUM_BOW_DEVICE_STATE kalGetBowState(
IN struct GLUE_INFO *prGlueInfo,
IN uint8_t rPeerAddr[PARAM_MAC_ADDR_LEN]);
u_int8_t kalSetBowState(IN struct GLUE_INFO *prGlueInfo,
IN enum ENUM_BOW_DEVICE_STATE eBowState,
uint8_t rPeerAddr[PARAM_MAC_ADDR_LEN]);
enum ENUM_BOW_DEVICE_STATE kalGetBowGlobalState(
IN struct GLUE_INFO
*prGlueInfo);
uint32_t kalGetBowFreqInKHz(IN struct GLUE_INFO
*prGlueInfo);
uint8_t kalGetBowRole(IN struct GLUE_INFO *prGlueInfo,
IN uint8_t rPeerAddr[PARAM_MAC_ADDR_LEN]);
void kalSetBowRole(IN struct GLUE_INFO *prGlueInfo,
IN uint8_t ucRole,
IN uint8_t rPeerAddr[PARAM_MAC_ADDR_LEN]);
uint8_t kalGetBowAvailablePhysicalLinkCount(
IN struct GLUE_INFO *prGlueInfo);
#if CFG_BOW_SEPARATE_DATA_PATH
/*----------------------------------------------------------------------------*/
/* Bluetooth over Wi-Fi Net Device Init/Uninit */
/*----------------------------------------------------------------------------*/
u_int8_t kalInitBowDevice(IN struct GLUE_INFO *prGlueInfo,
IN const char *prDevName);
u_int8_t kalUninitBowDevice(IN struct GLUE_INFO
*prGlueInfo);
#endif /* CFG_BOW_SEPARATE_DATA_PATH */
#endif /* CFG_ENABLE_BT_OVER_WIFI */
/*----------------------------------------------------------------------------*/
/* Security Frame Clearance */
/*----------------------------------------------------------------------------*/
void kalClearSecurityFrames(IN struct GLUE_INFO
*prGlueInfo);
void kalClearSecurityFramesByBssIdx(IN struct GLUE_INFO
*prGlueInfo,
IN uint8_t ucBssIndex);
void kalSecurityFrameSendComplete(IN struct GLUE_INFO
*prGlueInfo,
IN void *pvPacket, IN uint32_t rStatus);
/*----------------------------------------------------------------------------*/
/* Management Frame Clearance */
/*----------------------------------------------------------------------------*/
void kalClearMgmtFrames(IN struct GLUE_INFO *prGlueInfo);
void kalClearMgmtFramesByBssIdx(IN struct GLUE_INFO
*prGlueInfo,
IN uint8_t ucBssIndex);
uint32_t kalGetTxPendingFrameCount(IN struct GLUE_INFO
*prGlueInfo);
uint32_t kalGetTxPendingCmdCount(IN struct GLUE_INFO
*prGlueInfo);
void kalClearCommandQueue(IN struct GLUE_INFO *prGlueInfo);
u_int8_t kalSetTimer(IN struct GLUE_INFO *prGlueInfo,
IN uint32_t u4Interval);
u_int8_t kalCancelTimer(IN struct GLUE_INFO *prGlueInfo);
void kalScanDone(IN struct GLUE_INFO *prGlueInfo,
IN enum ENUM_KAL_NETWORK_TYPE_INDEX eNetTypeIdx,
IN uint32_t status);
#if CFG_SUPPORT_SCAN_CACHE_RESULT
uint8_t kalUpdateBssTimestamp(IN struct GLUE_INFO *prGlueInfo);
#endif /* CFG_SUPPORT_SCAN_CACHE_RESULT */
uint32_t kalRandomNumber(void);
#if KERNEL_VERSION(4, 14, 0) <= LINUX_VERSION_CODE
void kalTimeoutHandler(struct timer_list *timer);
#else
void kalTimeoutHandler(unsigned long arg);
#endif
void kalSetEvent(struct GLUE_INFO *pr);
void kalSetIntEvent(struct GLUE_INFO *pr);
void kalSetHifDbgEvent(struct GLUE_INFO *pr);
#if CFG_SUPPORT_MULTITHREAD
void kalSetTxEvent2Hif(struct GLUE_INFO *pr);
void kalSetTxEvent2Rx(struct GLUE_INFO *pr);
void kalSetTxCmdEvent2Hif(struct GLUE_INFO *pr);
#endif
/*----------------------------------------------------------------------------*/
/* NVRAM/Registry Service */
/*----------------------------------------------------------------------------*/
u_int8_t kalIsConfigurationExist(IN struct GLUE_INFO
*prGlueInfo);
struct REG_INFO *kalGetConfiguration(IN struct GLUE_INFO
*prGlueInfo);
u_int8_t kalCfgDataRead(IN struct GLUE_INFO *prGlueInfo,
IN uint32_t u4Offset,
IN ssize_t len, OUT uint16_t *pu2Data);
u_int8_t kalCfgDataRead16(IN struct GLUE_INFO *prGlueInfo,
IN uint32_t u4Offset,
OUT uint16_t *pu2Data);
u_int8_t kalCfgDataWrite16(IN struct GLUE_INFO *prGlueInfo,
IN uint32_t u4Offset, IN uint16_t u2Data);
/*----------------------------------------------------------------------------*/
/* WSC Connection */
/*----------------------------------------------------------------------------*/
u_int8_t kalWSCGetActiveState(IN struct GLUE_INFO
*prGlueInfo);
/*----------------------------------------------------------------------------*/
/* RSSI Updating */
/*----------------------------------------------------------------------------*/
void
kalUpdateRSSI(IN struct GLUE_INFO *prGlueInfo,
IN enum ENUM_KAL_NETWORK_TYPE_INDEX eNetTypeIdx,
IN int8_t cRssi,
IN int8_t cLinkQuality);
/*----------------------------------------------------------------------------*/
/* I/O Buffer Pre-allocation */
/*----------------------------------------------------------------------------*/
u_int8_t kalInitIOBuffer(u_int8_t is_pre_alloc);
void kalUninitIOBuffer(void);
void *kalAllocateIOBuffer(IN uint32_t u4AllocSize);
void kalReleaseIOBuffer(IN void *pvAddr,
IN uint32_t u4Size);
void
kalGetChannelList(IN struct GLUE_INFO *prGlueInfo,
IN enum ENUM_BAND eSpecificBand,
IN uint8_t ucMaxChannelNum, IN uint8_t *pucNumOfChannel,
IN struct RF_CHANNEL_INFO *paucChannelList);
u_int8_t kalIsAPmode(IN struct GLUE_INFO *prGlueInfo);
#if CFG_SUPPORT_802_11W
/*----------------------------------------------------------------------------*/
/* 802.11W */
/*----------------------------------------------------------------------------*/
uint32_t kalGetMfpSetting(IN struct GLUE_INFO *prGlueInfo);
uint8_t kalGetRsnIeMfpCap(IN struct GLUE_INFO *prGlueInfo);
#endif
/*----------------------------------------------------------------------------*/
/* file opetation */
/*----------------------------------------------------------------------------*/
uint32_t kalWriteToFile(const uint8_t *pucPath,
u_int8_t fgDoAppend,
uint8_t *pucData, uint32_t u4Size);
uint32_t kalCheckPath(const uint8_t *pucPath);
uint32_t kalTrunkPath(const uint8_t *pucPath);
int32_t kalReadToFile(const uint8_t *pucPath,
uint8_t *pucData,
uint32_t u4Size, uint32_t *pu4ReadSize);
int32_t kalRequestFirmware(const uint8_t *pucPath,
uint8_t *pucData,
uint32_t u4Size, uint32_t *pu4ReadSize,
struct device *dev);
/*----------------------------------------------------------------------------*/
/* NL80211 */
/*----------------------------------------------------------------------------*/
void
kalIndicateBssInfo(IN struct GLUE_INFO *prGlueInfo,
IN uint8_t *pucFrameBuf, IN uint32_t u4BufLen,
IN uint8_t ucChannelNum, IN int32_t i4SignalStrength);
/*----------------------------------------------------------------------------*/
/* Net device */
/*----------------------------------------------------------------------------*/
#if (CFG_SUPPORT_TX_TSO_SW == 1)
uint32_t
kalSwTsoXmit(struct sk_buff **pprOrgSkb,
IN struct net_device *prDev, struct GLUE_INFO *prGlueInfo,
uint8_t ucBssIndex);
#endif
uint32_t
kalHardStartXmit(struct sk_buff *prSkb,
IN struct net_device *prDev,
struct GLUE_INFO *prGlueInfo, uint8_t ucBssIndex);
u_int8_t kalIsPairwiseEapolPacket(IN void *prPacket);
u_int8_t
kalGetIPv4Address(IN struct net_device *prDev,
IN uint32_t u4MaxNumOfAddr, OUT uint8_t *pucIpv4Addrs,
OUT uint32_t *pu4NumOfIpv4Addr);
#if IS_ENABLED(CONFIG_IPV6)
u_int8_t
kalGetIPv6Address(IN struct net_device *prDev,
IN uint32_t u4MaxNumOfAddr, OUT uint8_t *pucIpv6Addrs,
OUT uint32_t *pu4NumOfIpv6Addr);
#else
static inline u_int8_t
kalGetIPv6Address(IN struct net_device *prDev,
IN uint32_t u4MaxNumOfAddr, OUT uint8_t *pucIpv6Addrs,
OUT uint32_t *pu4NumOfIpv6Addr) {
/* Not support IPv6 */
*pu4NumOfIpv6Addr = 0;
return 0;
}
#endif /* IS_ENABLED(CONFIG_IPV6) */
void kalSetNetAddressFromInterface(IN struct GLUE_INFO
*prGlueInfo,
IN struct net_device *prDev,
IN u_int8_t fgSet);
uint32_t kalResetStats(IN struct net_device *prDev);
void *kalGetStats(IN struct net_device *prDev);
void kalResetPacket(IN struct GLUE_INFO *prGlueInfo,
IN void *prPacket);
#if CFG_SUPPORT_QA_TOOL
struct file *kalFileOpen(const char *path, int flags,
int rights);
void kalFileClose(struct file *file);
uint32_t kalFileRead(struct file *file,
unsigned long long offset,
unsigned char *data, unsigned int size);
#endif
#if CFG_SUPPORT_SDIO_READ_WRITE_PATTERN
/*----------------------------------------------------------------------------*/
/* SDIO Read/Write Pattern Support */
/*----------------------------------------------------------------------------*/
u_int8_t kalSetSdioTestPattern(IN struct GLUE_INFO
*prGlueInfo,
IN u_int8_t fgEn, IN u_int8_t fgRead);
#endif
/*----------------------------------------------------------------------------*/
/* PNO Support */
/*----------------------------------------------------------------------------*/
void kalSchedScanResults(IN struct GLUE_INFO *prGlueInfo);
void kalSchedScanStopped(IN struct GLUE_INFO *prGlueInfo,
u_int8_t fgDriverTriggerd);
void kalSetFwOwnEvent2Hif(struct GLUE_INFO *pr);
#if CFG_ASSERT_DUMP
/* Core Dump out put file */
uint32_t kalOpenCorDumpFile(u_int8_t fgIsN9);
uint32_t kalWriteCorDumpFile(uint8_t *pucBuffer,
uint16_t u2Size,
u_int8_t fgIsN9);
uint32_t kalCloseCorDumpFile(u_int8_t fgIsN9);
#endif
void kalAcquireWDevMutex(IN struct net_device *pDev);
void kalReleaseWDevMutex(IN struct net_device *pDev);
#if CFG_SUPPORT_CFG80211_AUTH
#if CFG_SUPPORT_CFG80211_QUEUE
void wlanSchedCfg80211WorkQueue(struct work_struct *work);
void cfg80211AddToPktQueue(struct net_device *prDevHandler, void *buf,
uint16_t u2FrameLength, struct cfg80211_bss *bss,
uint8_t ucflagTx, uint8_t ucFrameType);
#endif
void kalIndicateRxAuthToUpperLayer(struct net_device *prDevHandler,
uint8_t *prAuthFrame, uint16_t u2FrameLen);
void kalIndicateRxAssocToUpperLayer(struct net_device *prDevHandler,
uint8_t *prAssocRspFrame, struct cfg80211_bss *bss,
uint16_t u2FrameLen);
void kalIndicateRxDeauthToUpperLayer(struct net_device *prDevHandler,
uint8_t *prDeauthFrame, uint16_t u2FrameLen);
void kalIndicateRxDisassocToUpperLayer(struct net_device *prDevHandler,
uint8_t *prDisassocFrame, uint16_t u2FrameLen);
void kalIndicateTxDeauthToUpperLayer(struct net_device *prDevHandler,
uint8_t *prDeauthFrame, uint16_t u2FrameLen);
void kalIndicateTxDisassocToUpperLayer(struct net_device *prDevHandler,
uint8_t *prDisassocFrame, uint16_t u2FrameLen);
#endif
/*******************************************************************************
* F U N C T I O N S
*******************************************************************************
*/
#if CFG_WOW_SUPPORT
void kalWowInit(IN struct GLUE_INFO *prGlueInfo);
void kalWowProcess(IN struct GLUE_INFO *prGlueInfo,
uint8_t enable);
#if CFG_SUPPORT_MDNS_OFFLOAD
void kalMdnsProcess(IN struct GLUE_INFO *prGlueInfo,
IN struct MDNS_INFO_UPLAYER_T *prMdnsUplayerInfo);
void kalMdnsOffloadInit(IN struct ADAPTER *prAdapter);
struct MDNS_PARAM_ENTRY_T *mdnsAllocateParamEntry(IN struct ADAPTER *prAdapter);
void kalSendClearRecordToFw(struct GLUE_INFO *prGlueInfo);
void kalSendMdnsRecordToFw(struct GLUE_INFO *prGlueInfo);
void kalSendMdnsEnableToFw(struct GLUE_INFO *prGlueInfo);
void kalAddMdnsRecord(struct GLUE_INFO *prGlueInfo,
struct MDNS_INFO_UPLAYER_T *prMdnsUplayerInfo);
void kalShowMdnsRecord(struct GLUE_INFO *prGlueInfo);
#if CFG_SUPPORT_MDNS_OFFLOAD_GVA
void kalProcessMdnsRespPkt(struct GLUE_INFO *prGlueInfo, uint8_t *pucMdnsHdr);
#endif
#endif
#endif
int main_thread(void *data);
#if CFG_SUPPORT_MULTITHREAD
#if CFG_SDIO_RX_DE_AGG_IN_THREAD
int sdio_rx_DeAgg_thread(void *data);
#endif
int hif_thread(void *data);
int rx_thread(void *data);
#endif
uint64_t kalGetBootTime(void);
int kalMetInitProcfs(IN struct GLUE_INFO *prGlueInfo);
int kalMetRemoveProcfs(void);
uint8_t kalGetEapolKeyType(void *prPacket);
#if CFG_SUPPORT_WAKEUP_REASON_DEBUG
u_int8_t kalIsWakeupByWlan(struct ADAPTER *prAdapter);
#endif
int32_t kalHaltLock(uint32_t waitMs);
int32_t kalHaltTryLock(void);
void kalHaltUnlock(void);
void kalSetHalted(u_int8_t fgHalt);
u_int8_t kalIsHalted(void);
void kalFreeTxMsduWorker(struct work_struct *work);
void kalFreeTxMsdu(struct ADAPTER *prAdapter,
struct MSDU_INFO *prMsduInfo);
int32_t kalPerMonInit(IN struct GLUE_INFO *prGlueInfo);
int32_t kalPerMonDisable(IN struct GLUE_INFO *prGlueInfo);
int32_t kalPerMonEnable(IN struct GLUE_INFO *prGlueInfo);
int32_t kalPerMonStart(IN struct GLUE_INFO *prGlueInfo);
int32_t kalPerMonStop(IN struct GLUE_INFO *prGlueInfo);
int32_t kalPerMonDestroy(IN struct GLUE_INFO *prGlueInfo);
void kalPerMonHandler(IN struct ADAPTER *prAdapter,
unsigned long ulParam);
uint32_t kalPerMonGetInfo(IN struct ADAPTER *prAdapter,
IN uint8_t *pucBuf,
IN uint32_t u4Max);
uint32_t kalGetTpMbps(struct ADAPTER *prAdapter, uint8_t ucPath,
uint8_t ucBssIdx);
uint8_t kalIsTputMode(struct ADAPTER *prAdapter, uint8_t ucPath,
uint8_t ucBssIdx);
int32_t kalBoostCpu(IN struct ADAPTER *prAdapter,
IN uint32_t u4TarPerfLevel,
IN uint32_t u4BoostCpuTh);
#if CFG_MTK_ANDROID_EMI
void kalSetEmiMpuProtection(phys_addr_t emiPhyBase, uint32_t offset,
uint32_t size, bool enable);
void kalSetDrvEmiMpuProtection(phys_addr_t emiPhyBase, uint32_t offset,
uint32_t size);
#endif
int32_t kalSetCpuNumFreq(uint32_t u4CoreNum,
uint32_t u4Freq);
int32_t kalPerMonSetForceEnableFlag(uint8_t uFlag);
int32_t kalFbNotifierReg(IN struct GLUE_INFO *prGlueInfo);
void kalFbNotifierUnReg(void);
#if KERNEL_VERSION(3, 0, 0) <= LINUX_VERSION_CODE
/* since: 0b5c9db1b11d3175bb42b80663a9f072f801edf5 */
static inline void kal_skb_reset_mac_len(struct sk_buff
*skb)
{
skb_reset_mac_len(skb);
}
#else
static inline void kal_skb_reset_mac_len(struct sk_buff
*skb)
{
skb->mac_len = skb->network_header - skb->mac_header;
}
#endif
void kalInitDevWakeup(struct ADAPTER *prAdapter, struct device *prDev);
u_int8_t kalIsValidMacAddr(const uint8_t *addr);
u_int8_t kalScanParseRandomMac(const struct net_device *ndev,
const struct cfg80211_scan_request *request, uint8_t *pucRandomMac);
u_int8_t kalSchedScanParseRandomMac(const struct net_device *ndev,
const struct cfg80211_sched_scan_request *request,
uint8_t *pucRandomMac, uint8_t *pucRandomMacMask);
void kalScanReqLog(struct cfg80211_scan_request *request);
void kalScanChannelLog(struct cfg80211_scan_request *request,
const uint16_t logBufLen);
void kalScanSsidLog(struct cfg80211_scan_request *request,
const uint16_t logBufLen);
void kalScanResultLog(struct ADAPTER *prAdapter, struct ieee80211_mgmt *mgmt);
void kalScanLogCacheFlushBSS(struct ADAPTER *prAdapter,
const uint16_t logBufLen);
void kalRxNapiSetEnable(
IN struct GLUE_INFO *prGlueInfo,
IN uint8_t enable);
uint8_t kalRxNapiIsEnable(IN struct GLUE_INFO *prGlueInfo);
uint8_t kalRxNapiValidSkb(struct GLUE_INFO *prGlueInfo,
struct sk_buff *prSkb);
int kalRxNapiPoll(struct napi_struct *napi, int budget);
void kal_Set_Thread_SchPolicy_Priority(IN struct GLUE_INFO *prGlueInfo);
unsigned long kal_kallsyms_lookup_name(const char *name);
void kal_sched_set(struct task_struct *p, int policy,
const struct sched_param *param,
int nice);
#ifndef __has_attribute
#define __has_attribute(x) 0
#endif
#define GCC_VERSION_AT_LEAST(major, minor) (__GNUC__ > (major) || \
((__GNUC__ == (major)) && __GNUC_MINOR__ >= (minor)))
/* clone 'fallthrough' in include/linux/compiler_attributes.h */
#if GCC_VERSION_AT_LEAST(7, 0) && __has_attribute(__fallthrough__)
#define kal_fallthrough __attribute__((__fallthrough__))
#else
#define kal_fallthrough do {} while (0) /* fallthrough */
#endif
#endif /* _GL_KAL_H */