xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8189fs/hal/hal_halmac.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright(c) 2015 - 2019 Realtek Corporation.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or modify it
6*4882a593Smuzhiyun  * under the terms of version 2 of the GNU General Public License as
7*4882a593Smuzhiyun  * published by the Free Software Foundation.
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * This program is distributed in the hope that it will be useful, but WITHOUT
10*4882a593Smuzhiyun  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12*4882a593Smuzhiyun  * more details.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  *****************************************************************************/
15*4882a593Smuzhiyun #ifndef _HAL_HALMAC_H_
16*4882a593Smuzhiyun #define _HAL_HALMAC_H_
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #include <drv_types.h>		/* adapter_to_dvobj(), struct intf_hdl and etc. */
19*4882a593Smuzhiyun #include <hal_data.h>		/* struct hal_spec_t */
20*4882a593Smuzhiyun #include "halmac/halmac_api.h"	/* struct halmac_adapter* and etc. */
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun /* HALMAC Definition for Driver */
23*4882a593Smuzhiyun #define RTW_HALMAC_H2C_MAX_SIZE		8
24*4882a593Smuzhiyun #define RTW_HALMAC_BA_SSN_RPT_SIZE	4
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #define dvobj_set_halmac(d, mac)	((d)->halmac = (mac))
27*4882a593Smuzhiyun #define dvobj_to_halmac(d)		((struct halmac_adapter *)((d)->halmac))
28*4882a593Smuzhiyun #define adapter_to_halmac(p)		dvobj_to_halmac(adapter_to_dvobj(p))
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun /* for H2C cmd */
31*4882a593Smuzhiyun #define MAX_H2C_BOX_NUMS 4
32*4882a593Smuzhiyun #define MESSAGE_BOX_SIZE 4
33*4882a593Smuzhiyun #define EX_MESSAGE_BOX_SIZE 4
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun typedef enum _RTW_HALMAC_MODE {
36*4882a593Smuzhiyun 	RTW_HALMAC_MODE_NORMAL,
37*4882a593Smuzhiyun 	RTW_HALMAC_MODE_WIFI_TEST,
38*4882a593Smuzhiyun } RTW_HALMAC_MODE;
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun union rtw_phy_para_data {
41*4882a593Smuzhiyun 	struct _mac {
42*4882a593Smuzhiyun 		u32	value;	/* value to be set in bit mask(msk) */
43*4882a593Smuzhiyun 		u32	msk;	/* bit mask */
44*4882a593Smuzhiyun 		u16	offset; /* address */
45*4882a593Smuzhiyun 		u8	msk_en;	/* 0/1 for msk invalid/valid */
46*4882a593Smuzhiyun 		u8	size;	/* Unit is bytes, and value should be 1/2/4 */
47*4882a593Smuzhiyun 	} mac;
48*4882a593Smuzhiyun 	struct _bb {
49*4882a593Smuzhiyun 		u32	value;
50*4882a593Smuzhiyun 		u32	msk;
51*4882a593Smuzhiyun 		u16	offset;
52*4882a593Smuzhiyun 		u8	msk_en;
53*4882a593Smuzhiyun 		u8	size;
54*4882a593Smuzhiyun 	} bb;
55*4882a593Smuzhiyun 	struct _rf {
56*4882a593Smuzhiyun 		u32	value;
57*4882a593Smuzhiyun 		u32	msk;
58*4882a593Smuzhiyun 		u8	offset;
59*4882a593Smuzhiyun 		u8	msk_en;
60*4882a593Smuzhiyun 		/*
61*4882a593Smuzhiyun 		 * 0: path A
62*4882a593Smuzhiyun 		 * 1: path B
63*4882a593Smuzhiyun 		 * 2: path C
64*4882a593Smuzhiyun 		 * 3: path D
65*4882a593Smuzhiyun 		 */
66*4882a593Smuzhiyun 		u8	path;
67*4882a593Smuzhiyun 	} rf;
68*4882a593Smuzhiyun 	struct _delay {
69*4882a593Smuzhiyun 		/*
70*4882a593Smuzhiyun 		 * 0: microsecond (us)
71*4882a593Smuzhiyun 		 * 1: millisecond (ms)
72*4882a593Smuzhiyun 		 */
73*4882a593Smuzhiyun 		u8	unit;
74*4882a593Smuzhiyun 		u16	value;
75*4882a593Smuzhiyun 	} delay;
76*4882a593Smuzhiyun };
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun struct rtw_phy_parameter {
79*4882a593Smuzhiyun 	/*
80*4882a593Smuzhiyun 	 * 0: MAC register
81*4882a593Smuzhiyun 	 * 1: BB register
82*4882a593Smuzhiyun 	 * 2: RF register
83*4882a593Smuzhiyun 	 * 3: Delay
84*4882a593Smuzhiyun 	 * 0xFF: Latest(End) command
85*4882a593Smuzhiyun 	 */
86*4882a593Smuzhiyun 	u8 cmd;
87*4882a593Smuzhiyun 	union rtw_phy_para_data data;
88*4882a593Smuzhiyun };
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun struct rtw_halmac_bcn_ctrl {
91*4882a593Smuzhiyun 	u8 rx_bssid_fit:1;	/* 0:HW handle beacon, 1:ignore */
92*4882a593Smuzhiyun 	u8 txbcn_rpt:1;		/* Enable TXBCN report in ad hoc and AP mode */
93*4882a593Smuzhiyun 	u8 tsf_update:1;	/* Update TSF when beacon or probe response */
94*4882a593Smuzhiyun 	u8 enable_bcn:1;	/* Enable beacon related functions */
95*4882a593Smuzhiyun 	u8 rxbcn_rpt:1;		/* Enable RXBCNOK report */
96*4882a593Smuzhiyun 	u8 p2p_ctwin:1;		/* Enable P2P CTN WINDOWS function */
97*4882a593Smuzhiyun 	u8 p2p_bcn_area:1;	/* Enable P2P BCN area on function */
98*4882a593Smuzhiyun };
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun extern struct halmac_platform_api rtw_halmac_platform_api;
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun /* HALMAC API for Driver(HAL) */
103*4882a593Smuzhiyun u8 rtw_halmac_read8(struct intf_hdl *, u32 addr);
104*4882a593Smuzhiyun u16 rtw_halmac_read16(struct intf_hdl *, u32 addr);
105*4882a593Smuzhiyun u32 rtw_halmac_read32(struct intf_hdl *, u32 addr);
106*4882a593Smuzhiyun void rtw_halmac_read_mem(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);
107*4882a593Smuzhiyun #ifdef CONFIG_SDIO_INDIRECT_ACCESS
108*4882a593Smuzhiyun u8 rtw_halmac_iread8(struct intf_hdl *pintfhdl, u32 addr);
109*4882a593Smuzhiyun u16 rtw_halmac_iread16(struct intf_hdl *pintfhdl, u32 addr);
110*4882a593Smuzhiyun u32 rtw_halmac_iread32(struct intf_hdl *pintfhdl, u32 addr);
111*4882a593Smuzhiyun #endif /* CONFIG_SDIO_INDIRECT_ACCESS */
112*4882a593Smuzhiyun int rtw_halmac_write8(struct intf_hdl *, u32 addr, u8 value);
113*4882a593Smuzhiyun int rtw_halmac_write16(struct intf_hdl *, u32 addr, u16 value);
114*4882a593Smuzhiyun int rtw_halmac_write32(struct intf_hdl *, u32 addr, u32 value);
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun /* Software Information */
117*4882a593Smuzhiyun void rtw_halmac_get_version(char *str, u32 len);
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun /* Software setting before Initialization */
120*4882a593Smuzhiyun int rtw_halmac_preinit_sdio_io_indirect(struct dvobj_priv *d, bool enable);
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun /* Software Initialization */
123*4882a593Smuzhiyun int rtw_halmac_init_adapter(struct dvobj_priv *d, struct halmac_platform_api *pf_api);
124*4882a593Smuzhiyun int rtw_halmac_deinit_adapter(struct dvobj_priv *);
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun /* Get operations */
127*4882a593Smuzhiyun int rtw_halmac_get_hw_value(struct dvobj_priv *d, enum halmac_hw_id hw_id, void *pvalue);
128*4882a593Smuzhiyun int rtw_halmac_get_tx_fifo_size(struct dvobj_priv *d, u32 *size);
129*4882a593Smuzhiyun int rtw_halmac_get_rx_fifo_size(struct dvobj_priv *d, u32 *size);
130*4882a593Smuzhiyun int rtw_halmac_get_rsvd_drv_pg_bndy(struct dvobj_priv *d, u16 *bndy);
131*4882a593Smuzhiyun int rtw_halmac_get_page_size(struct dvobj_priv *d, u32 *size);
132*4882a593Smuzhiyun int rtw_halmac_get_tx_agg_align_size(struct dvobj_priv *d, u16 *size);
133*4882a593Smuzhiyun int rtw_halmac_get_rx_agg_align_size(struct dvobj_priv *d, u8 *size);
134*4882a593Smuzhiyun int rtw_halmac_get_rx_drv_info_sz(struct dvobj_priv *, u8 *sz);
135*4882a593Smuzhiyun int rtw_halmac_get_tx_desc_size(struct dvobj_priv *d, u32 *size);
136*4882a593Smuzhiyun int rtw_halmac_get_rx_desc_size(struct dvobj_priv *d, u32 *size);
137*4882a593Smuzhiyun int rtw_halmac_get_tx_dma_ch_map(struct dvobj_priv *d, u8 *dma_ch_map, u8 map_size);
138*4882a593Smuzhiyun int rtw_halmac_get_ori_h2c_size(struct dvobj_priv *d, u32 *size);
139*4882a593Smuzhiyun int rtw_halmac_get_oqt_size(struct dvobj_priv *d, u8 *size);
140*4882a593Smuzhiyun int rtw_halmac_get_ac_queue_number(struct dvobj_priv *d, u8 *num);
141*4882a593Smuzhiyun int rtw_halmac_get_mac_address(struct dvobj_priv *d, enum _hw_port hwport, u8 *addr);
142*4882a593Smuzhiyun int rtw_halmac_get_network_type(struct dvobj_priv *d, enum _hw_port hwport, u8 *type);
143*4882a593Smuzhiyun int rtw_halmac_get_bcn_ctrl(struct dvobj_priv *d, enum _hw_port hwport, struct rtw_halmac_bcn_ctrl *bcn_ctrl);
144*4882a593Smuzhiyun /*int rtw_halmac_get_wow_reason(struct dvobj_priv *, u8 *reason);*/
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun /* Set operations */
147*4882a593Smuzhiyun int rtw_halmac_config_rx_info(struct dvobj_priv *d, enum halmac_drv_info info);
148*4882a593Smuzhiyun int rtw_halmac_set_max_dl_fw_size(struct dvobj_priv *d, u32 size);
149*4882a593Smuzhiyun int rtw_halmac_set_mac_address(struct dvobj_priv *d, enum _hw_port hwport, u8 *addr);
150*4882a593Smuzhiyun int rtw_halmac_set_bssid(struct dvobj_priv *d, enum _hw_port hwport, u8 *addr);
151*4882a593Smuzhiyun int rtw_halmac_set_tx_address(struct dvobj_priv *d, enum _hw_port hwport, u8 *addr);
152*4882a593Smuzhiyun int rtw_halmac_set_network_type(struct dvobj_priv *d, enum _hw_port hwport, u8 type);
153*4882a593Smuzhiyun int rtw_halmac_reset_tsf(struct dvobj_priv *d, enum _hw_port hwport);
154*4882a593Smuzhiyun int rtw_halmac_set_bcn_interval(struct dvobj_priv *d, enum _hw_port hwport, u32 space);
155*4882a593Smuzhiyun int rtw_halmac_set_bcn_ctrl(struct dvobj_priv *d, enum _hw_port hwport, struct rtw_halmac_bcn_ctrl *bcn_ctrl);
156*4882a593Smuzhiyun int rtw_halmac_set_aid(struct dvobj_priv *d, enum _hw_port hwport, u16 aid);
157*4882a593Smuzhiyun int rtw_halmac_set_bandwidth(struct dvobj_priv *d, u8 channel, u8 pri_ch_idx, u8 bw);
158*4882a593Smuzhiyun int rtw_halmac_set_edca(struct dvobj_priv *d, u8 queue, u8 aifs, u8 cw, u16 txop);
159*4882a593Smuzhiyun int rtw_halmac_set_rts_full_bw(struct dvobj_priv *d, u8 enable);
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun /* Functions */
162*4882a593Smuzhiyun int rtw_halmac_poweron(struct dvobj_priv *);
163*4882a593Smuzhiyun int rtw_halmac_poweroff(struct dvobj_priv *);
164*4882a593Smuzhiyun int rtw_halmac_init_hal(struct dvobj_priv *);
165*4882a593Smuzhiyun int rtw_halmac_init_hal_fw(struct dvobj_priv *, u8 *fw, u32 fwsize);
166*4882a593Smuzhiyun int rtw_halmac_init_hal_fw_file(struct dvobj_priv *, u8 *fwpath);
167*4882a593Smuzhiyun int rtw_halmac_deinit_hal(struct dvobj_priv *);
168*4882a593Smuzhiyun int rtw_halmac_self_verify(struct dvobj_priv *);
169*4882a593Smuzhiyun int rtw_halmac_txfifo_wait_empty(struct dvobj_priv *d, u32 timeout);
170*4882a593Smuzhiyun int rtw_halmac_dlfw(struct dvobj_priv *, u8 *fw, u32 fwsize);
171*4882a593Smuzhiyun int rtw_halmac_dlfw_from_file(struct dvobj_priv *, u8 *fwpath);
172*4882a593Smuzhiyun int rtw_halmac_dlfw_mem(struct dvobj_priv *d, u8 *fw, u32 fwsize, enum fw_mem mem);
173*4882a593Smuzhiyun int rtw_halmac_dlfw_mem_from_file(struct dvobj_priv *d, u8 *fwpath, enum fw_mem mem);
174*4882a593Smuzhiyun int rtw_halmac_phy_power_switch(struct dvobj_priv *, u8 enable);
175*4882a593Smuzhiyun int rtw_halmac_send_h2c(struct dvobj_priv *, u8 *h2c);
176*4882a593Smuzhiyun int rtw_halmac_c2h_handle(struct dvobj_priv *, u8 *c2h, u32 size);
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun /* eFuse */
179*4882a593Smuzhiyun int rtw_halmac_get_available_efuse_size(struct dvobj_priv *d, u32 *size);
180*4882a593Smuzhiyun int rtw_halmac_get_physical_efuse_size(struct dvobj_priv *, u32 *size);
181*4882a593Smuzhiyun int rtw_halmac_read_physical_efuse_map(struct dvobj_priv *, u8 *map, u32 size);
182*4882a593Smuzhiyun int rtw_halmac_read_physical_efuse(struct dvobj_priv *, u32 offset, u32 cnt, u8 *data);
183*4882a593Smuzhiyun int rtw_halmac_write_physical_efuse(struct dvobj_priv *, u32 offset, u32 cnt, u8 *data);
184*4882a593Smuzhiyun int rtw_halmac_get_logical_efuse_size(struct dvobj_priv *, u32 *size);
185*4882a593Smuzhiyun int rtw_halmac_read_logical_efuse_map(struct dvobj_priv *, u8 *map, u32 size, u8 *maskmap, u32 masksize);
186*4882a593Smuzhiyun int rtw_halmac_write_logical_efuse_map(struct dvobj_priv *, u8 *map, u32 size, u8 *maskmap, u32 masksize);
187*4882a593Smuzhiyun int rtw_halmac_read_logical_efuse(struct dvobj_priv *, u32 offset, u32 cnt, u8 *data);
188*4882a593Smuzhiyun int rtw_halmac_write_logical_efuse(struct dvobj_priv *, u32 offset, u32 cnt, u8 *data);
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun int rtw_halmac_write_bt_physical_efuse(struct dvobj_priv *, u32 offset, u32 cnt, u8 *data);
191*4882a593Smuzhiyun int rtw_halmac_read_bt_physical_efuse_map(struct dvobj_priv *, u8 *map, u32 size);
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun int rtw_halmac_dump_fifo(struct dvobj_priv *d, u8 fifo_sel, u32 addr, u32 size, u8 *buffer);
194*4882a593Smuzhiyun int rtw_halmac_rx_agg_switch(struct dvobj_priv *, u8 enable);
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun /* Specific function APIs*/
197*4882a593Smuzhiyun int rtw_halmac_download_rsvd_page(struct dvobj_priv *dvobj, u8 pg_offset, u8 *pbuf, u32 size);
198*4882a593Smuzhiyun int rtw_halmac_fill_hal_spec(struct dvobj_priv *, struct hal_spec_t *);
199*4882a593Smuzhiyun int rtw_halmac_p2pps(struct dvobj_priv *dvobj, PHAL_P2P_PS_PARA pp2p_ps_para);
200*4882a593Smuzhiyun int rtw_halmac_iqk(struct dvobj_priv *d, u8 clear, u8 segment);
201*4882a593Smuzhiyun int rtw_halmac_dpk(struct dvobj_priv *d, u8 *buf, u32 bufsz);
202*4882a593Smuzhiyun int rtw_halmac_cfg_phy_para(struct dvobj_priv *d, struct rtw_phy_parameter *para);
203*4882a593Smuzhiyun int rtw_halmac_led_cfg(struct dvobj_priv *d, u8 enable, u8 mode);
204*4882a593Smuzhiyun void rtw_halmac_led_switch(struct dvobj_priv *d, u8 on);
205*4882a593Smuzhiyun int rtw_halmac_bt_wake_cfg(struct dvobj_priv *d, u8 enable);
206*4882a593Smuzhiyun int rtw_halmac_rfe_ctrl_cfg(struct dvobj_priv *d, u8 gpio);
207*4882a593Smuzhiyun #ifdef CONFIG_PNO_SUPPORT
208*4882a593Smuzhiyun int rtw_halmac_pno_scanoffload(struct dvobj_priv *d, u32 enable);
209*4882a593Smuzhiyun #endif
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun #ifdef CONFIG_SDIO_HCI
212*4882a593Smuzhiyun int rtw_halmac_query_tx_page_num(struct dvobj_priv *);
213*4882a593Smuzhiyun int rtw_halmac_get_tx_queue_page_num(struct dvobj_priv *, u8 queue, u32 *page);
214*4882a593Smuzhiyun u32 rtw_halmac_sdio_get_tx_addr(struct dvobj_priv *, u8 *desc, u32 size);
215*4882a593Smuzhiyun int rtw_halmac_sdio_tx_allowed(struct dvobj_priv *, u8 *buf, u32 size);
216*4882a593Smuzhiyun u32 rtw_halmac_sdio_get_rx_addr(struct dvobj_priv *, u8 *seq);
217*4882a593Smuzhiyun int rtw_halmac_sdio_set_tx_format(struct dvobj_priv *d, enum halmac_sdio_tx_format format);
218*4882a593Smuzhiyun #endif /* CONFIG_SDIO_HCI */
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun #ifdef CONFIG_USB_HCI
221*4882a593Smuzhiyun u8 rtw_halmac_usb_get_bulkout_id(struct dvobj_priv *, u8 *buf, u32 size);
222*4882a593Smuzhiyun int rtw_halmac_usb_get_txagg_desc_num(struct dvobj_priv *d, u8 *num);
223*4882a593Smuzhiyun u8 rtw_halmac_switch_usb_mode(struct dvobj_priv *d, enum RTW_USB_SPEED usb_mode);
224*4882a593Smuzhiyun #endif /* CONFIG_USB_HCI */
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun #ifdef CONFIG_SUPPORT_TRX_SHARED
227*4882a593Smuzhiyun void dump_trx_share_mode(void *sel, _adapter *adapter);
228*4882a593Smuzhiyun #endif
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun #ifdef CONFIG_BEAMFORMING
231*4882a593Smuzhiyun #ifdef RTW_BEAMFORMING_VERSION_2
232*4882a593Smuzhiyun int rtw_halmac_bf_add_mu_bfer(struct dvobj_priv *d, u16 paid, u16 csi_para,
233*4882a593Smuzhiyun 		u16 my_aid, enum halmac_csi_seg_len sel, u8 *addr);
234*4882a593Smuzhiyun int rtw_halmac_bf_del_mu_bfer(struct dvobj_priv *d);
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun int rtw_halmac_bf_cfg_sounding(struct dvobj_priv *d, enum halmac_snd_role role,
237*4882a593Smuzhiyun 		enum halmac_data_rate rate);
238*4882a593Smuzhiyun int rtw_halmac_bf_del_sounding(struct dvobj_priv *d, enum halmac_snd_role role);
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun int rtw_halmac_bf_cfg_csi_rate(struct dvobj_priv *d, u8 rssi, u8 current_rate,
241*4882a593Smuzhiyun 		u8 fixrate_en, u8 *new_rate, u8 *bmp_ofdm54);
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun int rtw_halmac_bf_cfg_mu_mimo(struct dvobj_priv *d, enum halmac_snd_role role,
244*4882a593Smuzhiyun 		u8 *sounding_sts, u16 grouping_bitmap, u8 mu_tx_en,
245*4882a593Smuzhiyun 		u32 *given_gid_tab, u32 *given_user_pos);
246*4882a593Smuzhiyun #define rtw_halmac_bf_cfg_mu_bfee(d, gid_tab, user_pos) \
247*4882a593Smuzhiyun 	rtw_halmac_bf_cfg_mu_mimo(d, HAL_BFEE, NULL, 0, 0, gid_tab, user_pos)
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun #endif /* RTW_BEAMFORMING_VERSION_2 */
250*4882a593Smuzhiyun #endif /* CONFIG_BEAMFORMING */
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun #endif /* _HAL_HALMAC_H_ */
253