luckfox-pico-sdk/sysdrv/drv_ko/wifi/ssv6115/fmac/fmac_utils.h
luckfox-eng29 8f34c2760d project:build.sh: Added fastboot support; custom modifications to U-Boot and kernel implemented using patches.
project:cfg:BoardConfig_IPC: Added fastboot BoardConfig file and firmware post-scripts, distinguishing between
the BoardConfigs for Luckfox Pico Pro and Luckfox Pico Max. project:app: Added fastboot_client and rk_smart_door
for quick boot applications; updated rkipc app to adapt to the latest media library. media:samples: Added more
usage examples. media:rockit: Fixed bugs; removed support for retrieving data frames from VPSS. media:isp:
Updated rkaiq library and related tools to support connection to RKISP_Tuner. sysdrv:Makefile: Added support for
compiling drv_ko on Luckfox Pico Ultra W using Ubuntu; added support for custom root filesystem.
sysdrv:tools:board: Updated Buildroot optional mirror sources, updated some software versions, and stored device
tree files and configuration files that undergo multiple modifications for U-Boot and kernel separately.
sysdrv:source:mcu: Used RISC-V MCU SDK with RT-Thread system, mainly for initializing camera AE during quick
boot. sysdrv:source:uboot: Added support for fastboot; added high baud rate DDR bin for serial firmware upgrades.
sysdrv:source:kernel: Upgraded to version 5.10.160; increased NPU frequency for RV1106G3; added support for
fastboot.

Signed-off-by: luckfox-eng29 <eng29@luckfox.com>
2024-10-14 09:47:04 +08:00

190 lines
6.8 KiB
C

/*
* Copyright (c) 2021 iComm-semi Ltd.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*
* IPC utility function declarations
*/
#ifndef __FMAC_UTILS_H__
#define __FMAC_UTILS_H__
/*******************************************************************************
* Include Files
******************************************************************************/
#include <linux/dma-mapping.h>
#include <linux/skbuff.h>
#include "lmac_msg.h"
#include "ipc_host.h"
#include "fmac_cmds.h"
/*******************************************************************************
* Defines
******************************************************************************/
/**
****************************************************************************************
* @brief This function sets a value of a bit field inside an array of bits,
* represented as an array of bytes.
* @param[in] array Array of bits
* @param[in] lsb Position of the LSB of the field inside the array of bits
* @param[in] width Width of the field
* @param[in] val Value to be set
****************************************************************************************
*/
__INLINE void _ssv_co_val_set(u8 array[], int lsb, int width, u8 val)
{
int msb = lsb + width - 1;
int l_byte_idx = lsb/8;
int m_byte_idx = msb/8;
if (m_byte_idx == l_byte_idx)
{
u8 mask = CO_BIT(width) - 1;
int shift = lsb % 8;
array[l_byte_idx] &= ~(mask << shift);
array[l_byte_idx] |= (val & mask) << shift;
}
else
{
u8 l_bits_cnt = m_byte_idx * 8 - lsb;
u8 l_mask = CO_BIT(l_bits_cnt) - 1;
u8 m_mask = CO_BIT(width - l_bits_cnt) - 1;
int l_shift = lsb % 8;
array[l_byte_idx] &= ~(l_mask << l_shift);
array[m_byte_idx] &= ~m_mask;
array[l_byte_idx] |= (val & l_mask) << l_shift;
array[m_byte_idx] |= (val >> l_bits_cnt) & m_mask;
}
}
/**
****************************************************************************************
* @brief This function sets a specific bit position inside an array of bits, represented
* as an array of bytes.
* @param[in] array Array of bits
* @param[in] pos Bit position to be set
****************************************************************************************
*/
__INLINE void _ssv_co_bit_set(u8 array[], u8 pos)
{
array[pos / 8] |= CO_BIT(pos % 8);
}
/*******************************************************************************
* Enumerations
******************************************************************************/
enum ssv_dev_flag {
SSV_DEV_RESTARTING,
SSV_DEV_STACK_RESTARTING,
SSV_DEV_STARTED,
};
/*******************************************************************************
* Structures
******************************************************************************/
struct ssv_dbginfo {
struct mutex mutex;
struct dbg_debug_dump_tag *buf;
dma_addr_t dma_addr;
int bufsz;
};
/*
* Structure used to store information regarding Debug msg buffers in the driver
*/
struct ssv_dbg_elem {
struct ipc_dbg_msg *dbgbuf_ptr;
dma_addr_t dma_addr;
};
/*******************************************************************************
* Variables
******************************************************************************/
/*******************************************************************************
* Functions
******************************************************************************/
/**
******************************************************************************
* @brief Initialize IPC interface.
*
* This function initializes IPC interface by registering callbacks, setting
* shared memory area and calling IPC Init function.
*
* This function should be called only once during driver's lifetime.
*
* @param[in] sc Pointer to main structure storing all the
* relevant information
* @param[in] ipc_shared_mem
*
******************************************************************************
*/
int ssv_ipc_init(struct ssv_softc *sc);
/**
******************************************************************************
* @brief Release IPC interface.
*
* @param[in] sc Pointer to main structure storing all the relevant
* information
*
******************************************************************************
*/
void ssv_ipc_deinit(struct ssv_softc *sc);
/**
******************************************************************************
* @brief Function called upon DBG_ERROR_IND message reception.
* This function triggers the UMH script call that will indicate to the user
* space the error that occurred and stored the debug dump. Once the UMH script
* is executed, the ssv_umh_done function has to be called.
*
* @param[in] sc Pointer to main structure storing all the relevant
* information
*
******************************************************************************
*/
void ssv_error_ind(struct ssv_softc *sc);
void ssv_chanctx_link(struct ssv_vif *vif, u8 idx,
struct cfg80211_chan_def *chandef);
void ssv_chanctx_unlink(struct ssv_vif *vif);
int ssv_chanctx_valid(struct ssv_softc *sc, u8 idx);
struct ssv_sta *ssv_get_sta(struct ssv_softc *sc, const u8 *mac_addr);
void ssv_rxtput_calculation(struct ssv_softc *sc, u32 len, u32 seq_no);
void ssv_hex_dump(unsigned char *data, int len);
int ssv_xmit_deauth_frame(struct ssv_softc *sc, struct ssv_vif *vif, struct ssv_sta *sta,
u8 *da, u8 *sa, u8 *bssid, u16 reason);
struct sk_buff *ssv_build_nulldata_frame(u8 *da, u8 *sa, u8 *bssid, bool qos, bool fromds);
int ssv_fmac_hci_tx(struct ssv_softc *sc, struct sk_buff *skb, int txqid,
bool force_trigger,u32 tx_flags);
enum data_frame_types ssv_get_data_frame_type(struct sk_buff *skb);
#ifdef CONFIG_SSV_CHANNEL_FOLLOW
void ssv_channel_switch_check(struct ssv_softc *sc, u16 freq, enum nl80211_channel_type chann_type);
#endif /*CONFIG_SSV_CHANNEL_FOLLOW */
void ssv6xxx_fw_reset_send_deauth_check(struct ssv_softc *sc, struct ssv_vif *vif);
#endif /* __FMAC_UTILS_H__ */