luckfox-pico-sdk/sysdrv/drv_ko/wifi/hichannel/hcc/hcc_host.h
2023-08-08 20:36:47 +08:00

208 lines
6.4 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (c) Hisilicon Technologies Co., Ltd. 2020-2020. All rights reserved.
* Description: hcc driver implementatioin.
* Author: Hisilicon
* Create: 2020-09-10
*/
#ifndef __HCC_HOST_H
#define __HCC_HOST_H
#include "oal_mutex.h"
#include "oal_wait.h"
#include "oal_timer.h"
#include "oal_workqueue.h"
#include "oal_wakelock.h"
#include "oal_thread.h"
#include "hcc_comm.h"
#include "oal_completion.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif
#define HCC_OFF 0
#define HCC_ON 1
#define HCC_EXCEPTION 2
#define HIBUS_HOST2DEV_SCATT_MAX 64
#define HIBUS_HOST2DEV_SCATT_SIZE 64
#define HIBUS_DEV2HOST_SCATT_MAX 64
#define HIBUS_H2D_SCATT_BUFFLEN_ALIGN 32
#define HIBUS_H2D_SCATT_BUFFLEN_ALIGN_BITS 3
/* ºê¶¨Òå */
#define HCC_TX_ASSEM_INFO_MAX_NUM (HIBUS_HOST2DEV_SCATT_MAX + 1)
#define HCC_RX_ASSEM_INFO_MAX_NUM (HIBUS_HOST2DEV_SCATT_MAX + 1)
#define HCC_FLOW_HIGH_PRI_BUFF_CNT 5
#define HCC_FLOW_LOW_PRI_BUFF_CNT 5
#define HCC_TRIG_TX_SCHED_TIMEOUT 10
/* 0~7 bits occupied by hisyslink */
#define hcc_large_pkt_get(reg) (((reg) >> 8) & 0xFF)
#define hcc_short_pkt_get(reg) (((reg) >> 16) & 0xFF)
#define hcc_mgmt_pkt_get(reg) (((reg) >> 24) & 0xFF)
#define MAX_ASSEM_DESC_CNT 2
typedef hi_s32 (*hcc_msg_cb)(hi_void *data);
typedef hi_u8 hcc_queue_type;
typedef enum {
HCC_FLOWCTRL_SDIO,
HCC_FLOWCTRL_CREDIT,
HCC_FLOWCTRL_BUTT
}hcc_flowctrl_type;
typedef enum {
TIMER_ADD,
TIMER_RUNING,
TIMER_STOP,
TIMER_DEL
}hcc_timer_status;
typedef enum {
HCC_TX,
HCC_RX,
HCC_DIR_COUNT
} hcc_chan_type;
typedef struct {
hi_u8 flowctrl_flag;
hi_u8 enable;
hi_u16 flow_type;
hi_u16 is_stopped;
hi_u16 low_waterline;
hi_u16 high_waterline;
} hcc_flow_ctrl_stru;
typedef enum {
HCC_SINGLE_SEND = 0,
HCC_ASSEM_SEND,
HCC_MODE_COUNT
} hcc_send_mode;
typedef struct {
/* transfer pkts limit every loop */
hi_u32 pool_type;
hi_u32 burst_limit;
hcc_flow_ctrl_stru flow_ctrl;
hcc_send_mode send_mode;
hi_u32 total_pkts;
hi_u32 loss_pkts;
hcc_data_queue queue_info;
} hcc_trans_queue_stru;
typedef struct {
hcc_trans_queue_stru queues[HCC_QUEUE_COUNT];
} hcc_trans_queues_stru;
typedef struct {
hi_u32 info[HCC_TX_ASSEM_INFO_MAX_NUM];
hi_u32 assemble_max_count;
hcc_data_queue assembled_head;
hcc_queue_type_enum assembled_queue_type;
} hcc_tx_assem_info_stru;
typedef struct {
hi_u32 info[HCC_RX_ASSEM_INFO_MAX_NUM];
} hcc_rx_assem_info;
typedef struct {
hi_u32 flowctrl_flag;
hi_u32 flowctrl_on_count;
hi_u32 flowctrl_off_count;
hi_u32 flowctrl_reset_count;
hi_u32 flowctrl_hipri_update_count;
hi_u8 uc_hipriority_cnt;
hi_u8 uc_lopriority_cnt;
hi_u8 des_cnt;
hi_u8 auc_resv[2]; /* resv 2 ¶ÔÆë */
oal_spin_lock_stru st_hipri_lock; /* ¶Áдuc_hipriority_cntʱҪ¼ÓËø */
oal_timer_list_stru flow_timer;
unsigned long timeout;
oal_delayed_work worker;
oal_spin_lock_stru lock;
}hcc_tx_flow_ctrl_info_stru;
typedef struct {
oal_kthread_stru *hcc_transfer_thread;
oal_kthread_stru *hcc_rx_thread;
oal_wait_queue_head_stru hcc_tx_wq;
oal_wait_queue_head_stru hcc_rx_wq;
#ifdef _PRE_HICHANNEL_DEBUG
oal_completion hcc_test_tx;
#endif
hi_u32 channel_exception_flag;
oal_timer_list_stru hcc_timer;
hcc_timer_status hcc_timer_status;
hcc_trans_queues_stru hcc_queues[HCC_DIR_COUNT];
hcc_tx_assem_info_stru tx_assem_info;
hcc_rx_assem_info rx_assem_info;
hcc_tx_flow_ctrl_info_stru tx_flow_ctrl;
} hcc_transfer_handler_stru;
typedef struct {
hi_u8 descr_num;
hcc_data_queue tx_assem_descr_hdr;
} hcc_tx_assem_descr;
struct hcc_bus_adpta_ops {
hi_u32 (*rx_proc_queue)(hcc_unc_struc *unc_buf);
hi_u32 (*tx_discard_key_frame)(hi_u32 queue_id, hcc_trans_queue_stru *hcc_queue, hcc_unc_struc *unc_buf);
hi_u32 (*tx_sort_key_frame)(hi_u32 queue_id, hcc_trans_queue_stru *hcc_queue, hcc_unc_struc *unc_buf);
hi_u32 (*tx_flow_ctrl_handle)(hi_u16 flow_type, hi_u8 dev_mem_cnt);
hi_void (*wlan_pm_set_packet_cnt)(hi_u32 cnt);
hcc_unc_struc *(*private_len_align)(hcc_unc_struc *ufc_buf, int align_len);
hcc_unc_struc *(*alloc_unc_buf)(hi_s32 len, hcc_stru_type type);
hi_void (*free_unc_buf)(hi_void *data);
hi_u32 (*wlan_pm_wakeup_dev)(hi_void);
hi_void (*channel_rx_test)(hcc_header_stru *hcc_hdr, hi_char* buf, int len);
hi_void (*stop_tcpip_tx_queue)(hcc_trans_queue_stru *hcc_queue);
hi_void (*awake_tcpip_tx_queue)(hcc_trans_queue_stru *hcc_queue);
};
typedef struct {
hi_void *hi_channel;
oal_mutex_stru tx_transfer_lock;
hcc_transfer_handler_stru hcc_transer_info;
hcc_tx_assem_descr tx_descr_info;
struct hcc_bus_adpta_ops* hcc_bus_ops;
} hcc_handler_stru;
/* inline º¯Êý¶¨Òå */
static inline void hcc_tx_transfer_lock(hcc_handler_stru *hcc)
{
if (oal_warn_on(hcc == HI_NULL)) {
return;
}
oal_mutex_lock(&hcc->tx_transfer_lock);
}
static inline void hcc_tx_transfer_unlock(hcc_handler_stru *hcc)
{
if (oal_warn_on(hcc == HI_NULL)) {
return;
}
oal_mutex_unlock(&hcc->tx_transfer_lock);
}
/* º¯ÊýÉùÃ÷ */
hi_s32 hcc_message_register(const hcc_handler_stru *hcc_handler, hi_u8 msg, hcc_msg_cb cb, hi_void *data);
hi_void hcc_message_unregister(const hcc_handler_stru *hcc_handler, hi_u8 msg);
hi_u32 hcc_host_init(struct hcc_bus_adpta_ops* hcc_bus_opt);
hi_void hcc_host_exit(hcc_handler_stru *hcc);
hi_void hcc_sched_transfer(hcc_handler_stru *hcc_handler);
hi_s32 hcc_host_proc_tx_queue(hcc_handler_stru *hcc_handler, hcc_queue_type_enum type);
hi_u32 hcc_host_proc_rx_queue(hcc_handler_stru *hcc_handler, hcc_queue_type_enum type);
hcc_handler_stru *hcc_host_get_handler(hi_void);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif
#endif /* __HCC_HOST_H */