luckfox-pico-sdk/sysdrv/drv_ko/wifi/aic8800_netdrv/rwnx_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

211 lines
6.1 KiB
C

/**
* rwnx_ipc_utils.h
*
* IPC utility function declarations
*
* Copyright (C) RivieraWaves 2012-2019
*/
#ifndef _RWNX_IPC_UTILS_H_
#define _RWNX_IPC_UTILS_H_
#include <linux/dma-mapping.h>
#include <linux/dmapool.h>
#include <linux/skbuff.h>
#include "lmac_msg.h"
#ifdef CONFIG_RWNX_DBG
/* #define RWNX_DBG(format, arg...) pr_warn(format, ## arg) */
#define RWNX_DBG printk
#else
#define RWNX_DBG(a...) do {} while (0)
#endif
#define RWNX_FN_ENTRY_STR ">>> %s()\n", __func__
enum rwnx_dev_flag {
RWNX_DEV_RESTARTING,
RWNX_DEV_STACK_RESTARTING,
RWNX_DEV_STARTED,
};
struct rwnx_hw;
struct rwnx_sta;
/**
* struct rwnx_ipc_elem - Generic IPC buffer of fixed size
*
* @addr: Host address of the buffer.
* @dma_addr: DMA address of the buffer.
*/
struct rwnx_ipc_elem {
void *addr;
dma_addr_t dma_addr;
};
/**
* struct rwnx_ipc_elem_pool - Generic pool of IPC buffers of fixed size
*
* @nb: Number of buffers currenlty allocated in the pool
* @buf: Array of buffers (size of array is @nb)
* @pool: DMA pool in which buffers have been allocated
*/
struct rwnx_ipc_elem_pool {
int nb;
struct rwnx_ipc_elem *buf;
struct dma_pool *pool;
};
/**
* struct rwnx_ipc_elem - Generic IPC buffer of variable size
*
* @addr: Host address of the buffer.
* @dma_addr: DMA address of the buffer.
* @size: Size, in bytes, of the buffer
*/
struct rwnx_ipc_elem_var {
void *addr;
dma_addr_t dma_addr;
size_t size;
};
/**
* struct rwnx_ipc_dbgdump_elem - IPC buffer for debug dump
*
* @mutex: Mutex to protect access to debug dump
* @buf: IPC buffer
*/
struct rwnx_ipc_dbgdump_elem {
struct mutex mutex;
struct rwnx_ipc_elem_var buf;
};
static const u32 rwnx_rxbuff_pattern = 0xCAFEFADE;
/*
* Maximum Length of Radiotap header vendor specific data(in bytes)
*/
#define RADIOTAP_HDR_VEND_MAX_LEN 16
/*
* Maximum Radiotap Header Length without vendor specific data (in bytes)
*/
#define RADIOTAP_HDR_MAX_LEN 80
/*
* Unsupported HT Frame data length (in bytes)
*/
#define UNSUP_RX_VEC_DATA_LEN 2
/**
* struct rwnx_ipc_skb_elem - IPC buffer for SKB element
*
* @skb: Pointer to the skb buffer allocated
* @dma_addr: DMA address of the data buffer fo skb
*
*/
struct rwnx_ipc_skb_elem {
struct sk_buff *skb;
dma_addr_t dma_addr;
};
#ifdef CONFIG_RWNX_FULLMAC
/* Maximum number of rx buffer the fw may use at the same time */
#define RWNX_RXBUFF_MAX (64 * NX_REMOTE_STA_MAX)
/**
* struct rwnx_ipc_rxbuf_elems - IPC buffers for RX
*
* @skb: Array of buffer push to FW.
* @idx: Index of the last pushed skb.(Use to find the next free entry quicker)
*
* Note: contrary to softmac version, dma_addr are stored inside skb->cb.
* (cf &struct rwnx_skb_cb)
*/
struct rwnx_ipc_rxbuf_elems {
struct sk_buff *skb[RWNX_RXBUFF_MAX];
int idx;
};
/**
* struct rwnx_skb_cb - Control Buffer structure for RX buffer
*
* @dma_addr: DMA address of the data buffer
* @pattern: Known pattern (used to check pointer on skb)
* @idx: Index in &struct rwnx_hw.rxbuff_table that contains address of this
* buffer
*/
struct rwnx_skb_cb {
dma_addr_t dma_addr;
uint32_t pattern;
uint32_t idx;
};
#define RWNX_RXBUFF_DMA_ADDR_SET(skbuff, addr) \
((struct rwnx_skb_cb *)(skbuff->cb))->dma_addr = addr
#define RWNX_RXBUFF_DMA_ADDR_GET(skbuff) \
((struct rwnx_skb_cb *)(skbuff->cb))->dma_addr
#define RWNX_RXBUFF_PATTERN_SET(skbuff, pat) \
((struct rwnx_skb_cb *)(skbuff->cb))->pattern = pat
#define RWNX_RXBUFF_PATTERN_GET(skbuff) \
((struct rwnx_skb_cb *)(skbuff->cb))->pattern
#define RWNX_RXBUFF_IDX_SET(skbuff, val) \
((struct rwnx_skb_cb *)(skbuff->cb))->idx = val
#define RWNX_RXBUFF_IDX_GET(skbuff) \
((struct rwnx_skb_cb *)(skbuff->cb))->idx
#define RWNX_RXBUFF_VALID_IDX(idx) ((idx) < RWNX_RXBUFF_MAX)
/* Used to ensure that hostid set to fw is never 0 */
#define RWNX_RXBUFF_IDX_TO_HOSTID(idx) ((idx) + 1)
#define RWNX_RXBUFF_HOSTID_TO_IDX(hostid) ((hostid) - 1)
#endif /* CONFIG_RWNX_FULLMAC */
#ifdef CONFIG_RWNX_FULLMAC
int rwnx_ipc_rxbuf_elem_allocs(struct rwnx_hw *rwnx_hw);
void rwnx_ipc_rxbuf_elem_pull(struct rwnx_hw *rwnx_hw, struct sk_buff *skb);
void rwnx_ipc_rxbuf_elem_sync(struct rwnx_hw *rwnx_hw, struct sk_buff *skb,
int len);
void rwnx_ipc_rxdesc_elem_repush(struct rwnx_hw *rwnx_hw,
struct rwnx_ipc_elem *elem);
void rwnx_ipc_rxbuf_elem_repush(struct rwnx_hw *rwnx_hw,
struct sk_buff *skb);
#endif /* CONFIG_RWNX_FULLMAC */
void rwnx_ipc_msg_push(struct rwnx_hw *rwnx_hw, void *msg_buf, uint16_t len);
void rwnx_ipc_txdesc_push(struct rwnx_hw *rwnx_hw, void *tx_desc,
void *hostid, int hw_queue, int user);
void *rwnx_ipc_fw_trace_desc_get(struct rwnx_hw *rwnx_hw);
int rwnx_ipc_rxbuf_init(struct rwnx_hw *rwnx_hw, uint32_t rx_bufsz);
int rwnx_ipc_init(struct rwnx_hw *rwnx_hw, u8 *shared_ram);
void rwnx_ipc_deinit(struct rwnx_hw *rwnx_hw);
void rwnx_ipc_start(struct rwnx_hw *rwnx_hw);
void rwnx_ipc_stop(struct rwnx_hw *rwnx_hw);
void rwnx_ipc_tx_drain(struct rwnx_hw *rwnx_hw);
bool rwnx_ipc_tx_pending(struct rwnx_hw *rwnx_hw);
struct ipc_host_env_tag;
int rwnx_ipc_elem_var_allocs(struct rwnx_hw *rwnx_hw,
struct rwnx_ipc_elem_var *elem, size_t elem_size,
enum dma_data_direction dir,
void *buf, const void *init,
void (*push)(struct ipc_host_env_tag *, uint32_t));
void rwnx_ipc_elem_var_deallocs(struct rwnx_hw *rwnx_hw,
struct rwnx_ipc_elem_var *elem);
int rwnx_ipc_unsup_rx_vec_elem_allocs(struct rwnx_hw *rwnx_hw,
struct rwnx_ipc_skb_elem *elem);
void rwnx_error_ind(struct rwnx_hw *rwnx_hw);
void rwnx_umh_done(struct rwnx_hw *rwnx_hw);
void rwnx_ipc_sta_buffer_init(struct rwnx_hw *rwnx_hw, int sta_idx);
void rwnx_ipc_sta_buffer(struct rwnx_hw *rwnx_hw, struct rwnx_sta *sta, int tid, int size);
#endif /* _RWNX_IPC_UTILS_H_ */