374 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			374 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
/******************************************************************************
 | 
						|
 *
 | 
						|
 * Copyright(c) 2019 - 2021 Realtek Corporation.
 | 
						|
 *
 | 
						|
 * 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 the GNU General Public License for
 | 
						|
 * more details.
 | 
						|
 *
 | 
						|
 *****************************************************************************/
 | 
						|
#ifndef _PHL_STRUCT_H_
 | 
						|
#define _PHL_STRUCT_H_
 | 
						|
#define PHL_MACID_MAX_ARRAY_NUM 8 /* 8x32=256 */
 | 
						|
#define PHL_MACID_MAX_NUM (PHL_MACID_MAX_ARRAY_NUM * 32)
 | 
						|
 | 
						|
#define PHL_STA_TID_NUM (16)    /* TODO: */
 | 
						|
 | 
						|
struct hci_info_t {
 | 
						|
	/* enum rtw_hci_type hci_type; */
 | 
						|
 | 
						|
#if defined(CONFIG_PCI_HCI)
 | 
						|
 | 
						|
	u8 total_txch_num;
 | 
						|
	u8 total_rxch_num;
 | 
						|
	u8 *txbd_buf;
 | 
						|
	u8 *rxbd_buf;
 | 
						|
#if defined(PCIE_TRX_MIT_EN)
 | 
						|
	u8 fixed_mitigation; /*no watchdog dynamic setting*/
 | 
						|
#endif
 | 
						|
	void *wd_dma_pool;
 | 
						|
#elif defined(CONFIG_USB_HCI)
 | 
						|
	u16 usb_bulkout_size;
 | 
						|
#elif defined(CONFIG_SDIO_HCI)
 | 
						|
	u32 tx_drop_cnt;	/* bit31 means overflow or not */
 | 
						|
#ifdef SDIO_TX_THREAD
 | 
						|
	_os_sema tx_thrd_sema;
 | 
						|
	_os_thread tx_thrd;
 | 
						|
#endif /* SDIO_TX_THREAD */
 | 
						|
#endif
 | 
						|
 | 
						|
	u8 *wd_ring;
 | 
						|
	u8 *txbuf_pool;
 | 
						|
	u8 *rxbuf_pool;
 | 
						|
	u8 *wp_tag;
 | 
						|
	u16 wp_seq[PHL_MACID_MAX_NUM]; 	/* maximum macid number */
 | 
						|
 | 
						|
};
 | 
						|
 | 
						|
#if defined(CONFIG_PCI_HCI)
 | 
						|
enum rx_channel_type {
 | 
						|
	RX_CH = 0,
 | 
						|
	RP_CH = 1,
 | 
						|
	RX_CH_TYPE_MAX = 0xFF
 | 
						|
};
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
#define MAX_PHL_RING_STATUS_NUMBER 64
 | 
						|
#define RX_REORDER_RING_NUMBER PHL_MACID_MAX_NUM
 | 
						|
#define PCIE_BUS_EFFICIENCY 4
 | 
						|
#define ETH_ALEN 6
 | 
						|
 | 
						|
struct phl_ring_status {
 | 
						|
	_os_list list;
 | 
						|
	u16 macid;
 | 
						|
	u8 band;/*0 or 1*/
 | 
						|
	u8 wmm;/*0 or 1*/
 | 
						|
	u8 port;
 | 
						|
	/*u8 mbssid*/
 | 
						|
	u16 req_busy;
 | 
						|
	struct rtw_phl_tx_ring *ring_ptr;
 | 
						|
};
 | 
						|
 | 
						|
struct phl_ring_sts_pool {
 | 
						|
	struct phl_ring_status ring_sts[MAX_PHL_RING_STATUS_NUMBER];
 | 
						|
	_os_list idle;
 | 
						|
	_os_list busy;
 | 
						|
	_os_lock idle_lock;
 | 
						|
	_os_lock busy_lock;
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 * struct phl_hci_trx_ops - interface specific operations
 | 
						|
 *
 | 
						|
 * @hci_trx_init: the function for HCI trx init
 | 
						|
 * @hci_trx_deinit: the function for HCI trx deinit
 | 
						|
 * @prepare_tx: prepare packets for hal transmission
 | 
						|
 * @recycle_rx_buf: recycle rx buffer
 | 
						|
 * @tx: tx packet to hw
 | 
						|
 * @rx: rx packet to sw
 | 
						|
 */
 | 
						|
struct phl_info_t;
 | 
						|
struct phl_hci_trx_ops {
 | 
						|
	enum rtw_phl_status (*hci_trx_init)(struct phl_info_t *phl);
 | 
						|
	void (*hci_trx_deinit)(struct phl_info_t *phl);
 | 
						|
	enum rtw_phl_status (*prepare_tx)(struct phl_info_t *phl,
 | 
						|
					struct rtw_xmit_req *tx_req);
 | 
						|
	enum rtw_phl_status (*recycle_rx_buf)(struct phl_info_t *phl,
 | 
						|
					void *r, u8 ch, enum rtw_rx_type type);
 | 
						|
	enum rtw_phl_status (*tx)(struct phl_info_t *phl);
 | 
						|
	enum rtw_phl_status (*rx)(struct phl_info_t *phl);
 | 
						|
	enum rtw_phl_status (*trx_cfg)(struct phl_info_t *phl);
 | 
						|
	void (*trx_stop)(struct phl_info_t *phl);
 | 
						|
	enum rtw_phl_status (*pltfm_tx)(struct phl_info_t *phl, void *pkt);
 | 
						|
	void (*free_h2c_pkt_buf)(struct phl_info_t *phl_info,
 | 
						|
				   struct rtw_h2c_pkt *_h2c_pkt);
 | 
						|
	enum rtw_phl_status (*alloc_h2c_pkt_buf)(struct phl_info_t *phl_info,
 | 
						|
		struct rtw_h2c_pkt *_h2c_pkt, u32 buf_len);
 | 
						|
	void (*trx_reset)(struct phl_info_t *phl, u8 type);
 | 
						|
	void (*trx_resume)(struct phl_info_t *phl, u8 type);
 | 
						|
	void (*req_tx_stop)(struct phl_info_t *phl);
 | 
						|
	void (*req_rx_stop)(struct phl_info_t *phl);
 | 
						|
	bool (*is_tx_pause)(struct phl_info_t *phl);
 | 
						|
	bool (*is_rx_pause)(struct phl_info_t *phl);
 | 
						|
	void *(*get_txbd_buf)(struct phl_info_t *phl);
 | 
						|
	void *(*get_rxbd_buf)(struct phl_info_t *phl);
 | 
						|
	void (*recycle_rx_pkt)(struct phl_info_t *phl,
 | 
						|
			       struct rtw_phl_rx_pkt *phl_rx);
 | 
						|
	enum rtw_phl_status (*register_trx_hdlr)(struct phl_info_t *phl);
 | 
						|
	void (*rx_handle_normal)(struct phl_info_t *phl_info,
 | 
						|
						struct rtw_phl_rx_pkt *phl_rx);
 | 
						|
	void (*tx_watchdog)(struct phl_info_t *phl_info);
 | 
						|
 | 
						|
#ifdef CONFIG_PCI_HCI
 | 
						|
	enum rtw_phl_status (*recycle_busy_wd)(struct phl_info_t *phl);
 | 
						|
	enum rtw_phl_status (*recycle_busy_h2c)(struct phl_info_t *phl);
 | 
						|
	void (*read_hw_rx)(struct phl_info_t *phl, enum rx_channel_type rx_ch);
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef CONFIG_USB_HCI
 | 
						|
	enum rtw_phl_status (*pend_rxbuf)(struct phl_info_t *phl, void *rxobj,
 | 
						|
						u32 inbuf_len, u8 status_code);
 | 
						|
	enum rtw_phl_status (*recycle_tx_buf)(void *phl, u8 *tx_buf_ptr);
 | 
						|
#endif
 | 
						|
 | 
						|
#if defined(CONFIG_SDIO_HCI) && defined(CONFIG_PHL_SDIO_READ_RXFF_IN_INT)
 | 
						|
	enum rtw_phl_status (*recv_rxfifo)(struct phl_info_t *phl);
 | 
						|
#endif
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 * struct phl_tid_ampdu_rx - TID aggregation information (Rx).
 | 
						|
 *
 | 
						|
 * @reorder_buf: buffer to reorder incoming aggregated MPDUs.
 | 
						|
 * @reorder_time: time when frame was added
 | 
						|
 * @sta: station we are attached to
 | 
						|
 * @head_seq_num: head sequence number in reordering buffer.
 | 
						|
 * @stored_mpdu_num: number of MPDUs in reordering buffer
 | 
						|
 * @ssn: Starting Sequence Number expected to be aggregated.
 | 
						|
 * @buf_size: buffer size for incoming A-MPDUs
 | 
						|
 * @timeout: reset timer value (in TUs).
 | 
						|
 * @tid: TID number
 | 
						|
 * @started: this session has started (head ssn or higher was received)
 | 
						|
 */
 | 
						|
struct phl_tid_ampdu_rx {
 | 
						|
	struct rtw_phl_rx_pkt **reorder_buf;
 | 
						|
	u32 *reorder_time;
 | 
						|
	struct rtw_phl_stainfo_t *sta;
 | 
						|
	u16 head_seq_num;
 | 
						|
	u16 stored_mpdu_num;
 | 
						|
	u16 ssn;
 | 
						|
	u16 buf_size;
 | 
						|
	u16 tid;
 | 
						|
	u8 started:1,
 | 
						|
 	   removed:1,
 | 
						|
	   sleep:1;
 | 
						|
 | 
						|
	void *drv_priv;
 | 
						|
	struct phl_info_t *phl_info;
 | 
						|
};
 | 
						|
 | 
						|
struct macid_ctl_t {
 | 
						|
	_os_lock lock;
 | 
						|
	/*  used macid bitmap share for all wifi role */
 | 
						|
	u32 used_map[PHL_MACID_MAX_ARRAY_NUM];
 | 
						|
	/* record bmc macid bitmap for all wifi role */
 | 
						|
	u32 bmc_map[PHL_MACID_MAX_ARRAY_NUM];
 | 
						|
	/* record used macid bitmap for each wifi role */
 | 
						|
	u32 wifi_role_usedmap[MAX_WIFI_ROLE_NUMBER][PHL_MACID_MAX_ARRAY_NUM];
 | 
						|
	/* record bmc TX macid for wifi role */
 | 
						|
	u16 wrole_bmc[MAX_WIFI_ROLE_NUMBER];
 | 
						|
	/* record total stainfo by macid */
 | 
						|
	struct rtw_phl_stainfo_t *sta[PHL_MACID_MAX_NUM];
 | 
						|
	u16 max_num;
 | 
						|
};
 | 
						|
 | 
						|
struct stainfo_ctl_t {
 | 
						|
	struct phl_info_t *phl_info;
 | 
						|
	u8 *allocated_stainfo_buf;
 | 
						|
	int allocated_stainfo_sz;
 | 
						|
	u8 *stainfo_buf;
 | 
						|
	struct phl_queue free_sta_queue;
 | 
						|
};
 | 
						|
 | 
						|
struct phl_h2c_pkt_pool {
 | 
						|
	struct rtw_h2c_pkt *h2c_pkt_buf;
 | 
						|
	struct phl_queue idle_h2c_pkt_cmd_list;
 | 
						|
	struct phl_queue idle_h2c_pkt_data_list;
 | 
						|
	struct phl_queue idle_h2c_pkt_ldata_list;
 | 
						|
	struct phl_queue busy_h2c_pkt_list;
 | 
						|
	_os_lock recycle_lock;
 | 
						|
};
 | 
						|
 | 
						|
#ifdef CONFIG_RTW_ACS
 | 
						|
 | 
						|
#ifndef MAX_CHANNEL_NUM
 | 
						|
#define	MAX_CHANNEL_NUM		42
 | 
						|
#endif
 | 
						|
 | 
						|
struct auto_chan_sel {
 | 
						|
	u8 clm_ratio[MAX_CHANNEL_NUM];
 | 
						|
	u8 nhm_pwr[MAX_CHANNEL_NUM];
 | 
						|
	u8 curr_idx;
 | 
						|
	u16 chset[MAX_CHANNEL_NUM];
 | 
						|
};
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
enum phl_tx_status {
 | 
						|
	PHL_TX_STATUS_IDLE = 0,
 | 
						|
	PHL_TX_STATUS_RUNNING = 1,
 | 
						|
	PHL_TX_STATUS_STOP_INPROGRESS = 2,
 | 
						|
	PHL_TX_STATUS_SW_PAUSE = 3,
 | 
						|
	PHL_TX_STATUS_MAX = 0xFF
 | 
						|
};
 | 
						|
 | 
						|
enum phl_rx_status {
 | 
						|
	PHL_RX_STATUS_IDLE = 0,
 | 
						|
	PHL_RX_STATUS_RUNNING = 1,
 | 
						|
	PHL_RX_STATUS_STOP_INPROGRESS = 2,
 | 
						|
	PHL_RX_STATUS_SW_PAUSE = 3,
 | 
						|
	PHL_RX_STATUS_MAX = 0xFF
 | 
						|
};
 | 
						|
 | 
						|
enum data_ctrl_mdl {
 | 
						|
	DATA_CTRL_MDL_NONE = 0,
 | 
						|
	DATA_CTRL_MDL_CMD_CTRLER = BIT0,
 | 
						|
	DATA_CTRL_MDL_SER = BIT1,
 | 
						|
	DATA_CTRL_MDL_PS = BIT2,
 | 
						|
	DATA_CTRL_MDL_MAX = BIT7
 | 
						|
};
 | 
						|
 | 
						|
enum data_ctrl_err_code {
 | 
						|
	CTRL_ERR_SW_TX_PAUSE_POLLTO = 1,
 | 
						|
	CTRL_ERR_SW_TX_PAUSE_FAIL = 2,
 | 
						|
	CTRL_ERR_SW_TX_RESUME_FAIL = 3,
 | 
						|
	CTRL_ERR_SW_RX_PAUSE_POLLTO = 4,
 | 
						|
	CTRL_ERR_SW_RX_PAUSE_FAIL = 5,
 | 
						|
	CTRL_ERR_SW_RX_RESUME_FAIL = 6,
 | 
						|
	CTRL_ERR_HW_TRX_PAUSE_FAIL = 7,
 | 
						|
	CTRL_ERR_HW_TRX_RESUME_FAIL = 8,
 | 
						|
	CTRL_ERR_MAX = 0xFF
 | 
						|
};
 | 
						|
 | 
						|
#ifdef CONFIG_POWER_SAVE
 | 
						|
struct phl_ps_info {
 | 
						|
	bool init;
 | 
						|
	_os_atomic tx_ntfy;
 | 
						|
};
 | 
						|
#endif
 | 
						|
 | 
						|
#define PHL_CTRL_TX BIT0
 | 
						|
#define PHL_CTRL_RX BIT1
 | 
						|
#define POLL_SW_TX_PAUSE_CNT 100
 | 
						|
#define POLL_SW_TX_PAUSE_MS 5
 | 
						|
#define POLL_SW_RX_PAUSE_CNT 100
 | 
						|
#define POLL_SW_RX_PAUSE_MS 5
 | 
						|
 | 
						|
struct phl_info_t {
 | 
						|
	struct macid_ctl_t macid_ctrl;
 | 
						|
	struct stainfo_ctl_t sta_ctrl;
 | 
						|
 | 
						|
	struct rtw_regulation regulation;
 | 
						|
 | 
						|
	struct rtw_phl_com_t *phl_com;
 | 
						|
	struct rtw_phl_handler phl_tx_handler;
 | 
						|
	struct rtw_phl_handler phl_rx_handler;
 | 
						|
	struct rtw_phl_handler phl_ser_handler;
 | 
						|
	struct rtw_phl_handler phl_event_handler;
 | 
						|
	struct rtw_phl_rx_ring phl_rx_ring;
 | 
						|
	_os_atomic phl_sw_tx_sts;
 | 
						|
	_os_atomic phl_sw_tx_more;
 | 
						|
	_os_atomic phl_sw_tx_req_pwr;
 | 
						|
	_os_atomic phl_sw_rx_sts;
 | 
						|
	_os_atomic phl_sw_rx_more;
 | 
						|
	_os_atomic phl_sw_rx_req_pwr;
 | 
						|
	_os_atomic is_hw_trx_pause;
 | 
						|
	enum data_ctrl_mdl pause_tx_id;
 | 
						|
	enum data_ctrl_mdl pause_rx_id;
 | 
						|
	_os_lock t_ring_list_lock;
 | 
						|
	_os_lock rx_ring_lock;
 | 
						|
	_os_lock t_fctrl_result_lock;
 | 
						|
	_os_lock t_ring_free_list_lock;
 | 
						|
	_os_list t_ring_list;
 | 
						|
	_os_list t_fctrl_result;
 | 
						|
	_os_list t_ring_free_list;
 | 
						|
	void *ring_sts_pool;
 | 
						|
	void *rx_pkt_pool;
 | 
						|
	struct phl_h2c_pkt_pool *h2c_pool;
 | 
						|
 | 
						|
	struct hci_info_t *hci;
 | 
						|
	struct phl_hci_trx_ops *hci_trx_ops;
 | 
						|
 | 
						|
	struct pkt_ofld_obj *pkt_ofld;
 | 
						|
 | 
						|
	struct phl_cmd_dispatch_engine disp_eng;
 | 
						|
	struct phl_watchdog wdog;
 | 
						|
	void *msg_hub;
 | 
						|
	void *cmd_que;
 | 
						|
	void *hal;
 | 
						|
 | 
						|
#ifdef CONFIG_FSM
 | 
						|
	void *fsm_root;
 | 
						|
	void *cmd_fsm;
 | 
						|
	void *cmd_obj;
 | 
						|
 | 
						|
	void *scan_fsm;
 | 
						|
	void *scan_obj;
 | 
						|
 | 
						|
	void *ser_fsm;
 | 
						|
	void *ser_obj;
 | 
						|
 | 
						|
	void *btc_fsm;
 | 
						|
	void *btc_obj;
 | 
						|
 | 
						|
	void *snd_fsm;
 | 
						|
#endif /*CONFIG_FSM*/
 | 
						|
	void *snd_obj;
 | 
						|
 | 
						|
	void *ps_obj;
 | 
						|
 | 
						|
	void *led_ctrl;
 | 
						|
 | 
						|
	void *ecsa_ctrl;
 | 
						|
	void *phl_twt_info; /* struct phl_twt_info */
 | 
						|
#ifdef PHL_RX_BATCH_IND
 | 
						|
	u8 rx_new_pending;
 | 
						|
#endif
 | 
						|
 | 
						|
	struct phl_wow_info wow_info;
 | 
						|
 | 
						|
#ifdef CONFIG_POWER_SAVE
 | 
						|
	struct phl_ps_info ps_info;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef CONFIG_RTW_ACS
 | 
						|
	struct auto_chan_sel acs;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef CONFIG_PHL_TEST_SUITE
 | 
						|
	void *trx_test;
 | 
						|
#endif
 | 
						|
};
 | 
						|
 | 
						|
#define phl_to_drvpriv(_phl)		(_phl->phl_com->drv_priv)
 | 
						|
 | 
						|
#define phlcom_to_test_mgnt(_phl_com)	((_phl_com)->test_mgnt)
 | 
						|
#define phlcom_to_mr_ctrl(_phl_com)	(&(_phl_com->mr_ctrl))
 | 
						|
 | 
						|
#define phl_to_mr_ctrl(_phl)	(&(((struct phl_info_t *)_phl)->phl_com->mr_ctrl))
 | 
						|
#define phl_to_mac_ctrl(_phlinfo)	(&(_phlinfo->macid_ctrl))
 | 
						|
#define phl_to_sta_ctrl(_phlinfo)	(&(_phlinfo->sta_ctrl))
 | 
						|
 | 
						|
#define get_band_ctrl(_phl, _band)	(&(phl_to_mr_ctrl(_phl)->band_ctrl[_band]))
 | 
						|
 | 
						|
#define phl_to_p2pps_info(_phl)	(((_phl)->phl_com->p2pps_info))
 | 
						|
#define get_role_idx(_wrole) (_wrole->id)
 | 
						|
 | 
						|
#endif /*_PHL_STRUCT_H_*/
 |