luckfox-pico-sdk/sysdrv/drv_ko/wifi/ssv6115/hci/hctrl.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

127 lines
4.4 KiB
C

/*
* Copyright (c) 2015 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.
*/
#ifndef _HCTRL_H_
#define _HCTRL_H_
#define IFDEV(_ct) ((_ct)->dev)
#define IFOPS(_ct) ((_ct)->if_ops)
#define HCI_REG_READ(_ct, _adr, _val) IFOPS(_ct)->readreg(IFDEV(_ct), _adr, _val)
#define HCI_REG_WRITE(_ct,_adr, _val) IFOPS(_ct)->writereg(IFDEV(_ct), _adr, _val)
#define IF_SEND(_ct, _bf, _len, _qid) IFOPS(_ct)->write(IFDEV(_ct), _bf, _len, _qid)
#define IF_RECV(_ct, _bf, _len, _mode) IFOPS(_ct)->read(IFDEV(_ct), _bf, _len, _mode)
#define IF_RESET(_ct) IFOPS(_ct)->fw_reset(IFDEV(_ct))
#ifdef SSV_PERFORMANCE_WATCH
#define IF_GET_INFO(_ct) IFOPS(_ct)->get_info(IFDEV(_ct), _info)
#define IF_CLR_INFO(_ct) IFOPS(_ct)->clr_info(IFDEV(_ct))
#endif
#define HCI_TX_AGGR_SKB_LEN (32 * 1024)
/**
* Define flags for enqueue API
*/
#define HCI_FLAGS_ENQUEUE_HEAD 0x00000001
struct ssv_sw_txq {
u32 txq_no;
struct mutex txq_lock;
struct sk_buff_head qhead;
bool inactive; ///< Inactive status, true: drop packets; false: not to drop packets
bool paused; ///< Pasued status, true: keep packets(do nothing); false: process packets
/* statistic counters: */
u32 tx_pkt;
u32 tx_flags;
};
struct ssv6xxx_hci_ctrl {
struct ssv6xxx_hci_info *shi;
struct device *dev;
struct ssv6xxx_hwif_ops *if_ops;
struct mutex hci_mutex;
struct ssv_sw_txq sw_txq[SSV_SW_TXQ_NUM];
/* hardware tx queue packet counter */
atomic_t sw_txq_cnt;
wait_queue_head_t tx_wait_q;
struct task_struct *hci_tx_task;
unsigned long tx_timestamp;
unsigned long rx_timestamp;
bool tx_trigger_en;
u32 tx_trigger_qlen;
u32 rx_pkt; // receive rx packet
u32 post_rx_pkt; // de-aggr rx packet
wait_queue_head_t rx_wait_q;
struct sk_buff_head rx_skb_q;
struct task_struct *hci_rx_task;
bool hw_tx_resource_full;
u32 hw_tx_resource_full_cnt;
#ifdef CONFIG_SDIO_FAVOR_RX
volatile bool hw_sdio_rx_available;
#endif
/* capability inherit from smac */
u32 hci_cap;
/* hci tx aggr pre-alloc skb */
struct sk_buff *p_tx_aggr_skb;
/* Post Tx callback function */
void (*hci_post_tx_cb)(struct sk_buff_head *, void *);
void *hci_post_tx_cb_args;
/* check resource */
int (*check_resource_cb)(void *app_param, struct sk_buff_head *, int reserved_page, int *p_max_count);
void *check_resource_cb_args;
/* proc_rx */
proc_rx_cb rx_cb[MAX_RX_CB_NUM];
void *rx_cb_args[MAX_RX_CB_NUM];
#ifdef SSV_PERFORMANCE_WATCH
unsigned long skip_fmac_to_hci;
unsigned long skip_hci_to_hwif;
unsigned long tx_run_time;
unsigned long tx_run_size;
unsigned long tx_run_cnt;
unsigned long no_tx_resource_cnt;
unsigned long zero_resource_cnt;
unsigned long less_resource_10percent_cnt;
unsigned long over_resource_10percent_cnt;
#endif
};
static inline void ssv6xxx_hwif_rx_task(struct ssv6xxx_hci_ctrl *hctrl, int (*rx_cb)(struct sk_buff *rx_skb, void *args),
int (*is_rx_q_full)(void *args), u32 recv_cnt)
{
if(hctrl->if_ops->hwif_rx_task)
hctrl->if_ops->hwif_rx_task(IFDEV(hctrl), rx_cb, is_rx_q_full, (void *)hctrl, recv_cnt);
}
static inline void ssv6xxx_hwif_get_tx_req_cnt(struct ssv6xxx_hci_ctrl *hctrl, int *tx_reg_cnt)
{
if(hctrl->if_ops->get_tx_req_cnt)
hctrl->if_ops->get_tx_req_cnt(IFDEV(hctrl), tx_reg_cnt);
}
#define HCI_RX_TASK(ct, rx_cb, is_rx_q_full, recv_cnt) ssv6xxx_hwif_rx_task(ct, rx_cb, is_rx_q_full, recv_cnt)
#define HCI_HWIF_GET_TX_REQ_CNT(ct, value) ssv6xxx_hwif_get_tx_req_cnt(ct, value)
#endif