1 /* SPDX-License-Identifier: GPL-2.0 */
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2016  Realtek Corporation.
5  *
6  * Contact Information:
7  * wlanfae <wlanfae@realtek.com>
8  * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
9  * Hsinchu 300, Taiwan.
10  *
11  * Larry Finger <Larry.Finger@lwfinger.net>
12  *
13  *****************************************************************************/
14 
15 #ifndef __ODM_INTERFACE_H__
16 #define __ODM_INTERFACE_H__
17 
18 #define INTERFACE_VERSION "1.1" /*2015.07.29  YuChen*/
19 
20 /*
21  * =========== Constant/Structure/Enum/... Define
22  */
23 
24 /*
25  * =========== Macro Define
26  */
27 
28 #define _reg_all(_name) ODM_##_name
29 #define _reg_ic(_name, _ic) ODM_##_name##_ic
30 #define _bit_all(_name) BIT_##_name
31 #define _bit_ic(_name, _ic) BIT_##_name##_ic
32 
33 /* _cat: implemented by Token-Pasting Operator. */
34 
35 /*===================================
36  *
37  * #define ODM_REG_DIG_11N	0xC50
38  * #define ODM_REG_DIG_11AC	0xDDD
39  *
40  * ODM_REG(DIG,_pdm_odm)
41  * ===================================
42  */
43 
44 #define _reg_11N(_name) ODM_REG_##_name##_11N
45 #define _reg_11AC(_name) ODM_REG_##_name##_11AC
46 #define _bit_11N(_name) ODM_BIT_##_name##_11N
47 #define _bit_11AC(_name) ODM_BIT_##_name##_11AC
48 
49 #define _cat(_name, _ic_type, _func)                                           \
50 	(((_ic_type) & ODM_IC_11N_SERIES) ? _func##_11N(_name) :               \
51 					    _func##_11AC(_name))
52 
53 /* _name: name of register or bit.
54  * Example: "ODM_REG(R_A_AGC_CORE1, dm)"
55  * gets "ODM_R_A_AGC_CORE1" or "ODM_R_A_AGC_CORE1_8192C",
56  * depends on support_ic_type.
57  */
58 #define ODM_REG(_name, _pdm_odm) _cat(_name, _pdm_odm->support_ic_type, _reg)
59 #define ODM_BIT(_name, _pdm_odm) _cat(_name, _pdm_odm->support_ic_type, _bit)
60 enum phydm_h2c_cmd {
61 	PHYDM_H2C_TXBF = 0x41,
62 	ODM_H2C_RSSI_REPORT = 0x42,
63 	ODM_H2C_IQ_CALIBRATION = 0x45,
64 	ODM_H2C_RA_PARA_ADJUST = 0x47,
65 	PHYDM_H2C_DYNAMIC_TX_PATH = 0x48,
66 	PHYDM_H2C_FW_TRACE_EN = 0x49,
67 	ODM_H2C_WIFI_CALIBRATION = 0x6d,
68 	PHYDM_H2C_MU = 0x4a,
69 	ODM_MAX_H2CCMD
70 };
71 
72 enum phydm_c2h_evt {
73 	PHYDM_C2H_DBG = 0,
74 	PHYDM_C2H_LB = 1,
75 	PHYDM_C2H_XBF = 2,
76 	PHYDM_C2H_TX_REPORT = 3,
77 	PHYDM_C2H_INFO = 9,
78 	PHYDM_C2H_BT_MP = 11,
79 	PHYDM_C2H_RA_RPT = 12,
80 	PHYDM_C2H_RA_PARA_RPT = 14,
81 	PHYDM_C2H_DYNAMIC_TX_PATH_RPT = 15,
82 	PHYDM_C2H_IQK_FINISH = 17, /*0x11*/
83 	PHYDM_C2H_DBG_CODE = 0xFE,
84 	PHYDM_C2H_EXTEND = 0xFF,
85 };
86 
87 enum phydm_extend_c2h_evt {
88 	PHYDM_EXTEND_C2H_DBG_PRINT = 0
89 
90 };
91 
92 /*
93  * =========== Extern Variable ??? It should be forbidden.
94  */
95 
96 /*
97  * =========== EXtern Function Prototype
98  */
99 
100 u8 odm_read_1byte(struct phy_dm_struct *dm, u32 reg_addr);
101 
102 u16 odm_read_2byte(struct phy_dm_struct *dm, u32 reg_addr);
103 
104 u32 odm_read_4byte(struct phy_dm_struct *dm, u32 reg_addr);
105 
106 void odm_write_1byte(struct phy_dm_struct *dm, u32 reg_addr, u8 data);
107 
108 void odm_write_2byte(struct phy_dm_struct *dm, u32 reg_addr, u16 data);
109 
110 void odm_write_4byte(struct phy_dm_struct *dm, u32 reg_addr, u32 data);
111 
112 void odm_set_mac_reg(struct phy_dm_struct *dm, u32 reg_addr, u32 bit_mask,
113 		     u32 data);
114 
115 u32 odm_get_mac_reg(struct phy_dm_struct *dm, u32 reg_addr, u32 bit_mask);
116 
117 void odm_set_bb_reg(struct phy_dm_struct *dm, u32 reg_addr, u32 bit_mask,
118 		    u32 data);
119 
120 u32 odm_get_bb_reg(struct phy_dm_struct *dm, u32 reg_addr, u32 bit_mask);
121 
122 void odm_set_rf_reg(struct phy_dm_struct *dm, enum odm_rf_radio_path e_rf_path,
123 		    u32 reg_addr, u32 bit_mask, u32 data);
124 
125 u32 odm_get_rf_reg(struct phy_dm_struct *dm, enum odm_rf_radio_path e_rf_path,
126 		   u32 reg_addr, u32 bit_mask);
127 
128 /*
129  * Memory Relative Function.
130  */
131 void odm_allocate_memory(struct phy_dm_struct *dm, void **ptr, u32 length);
132 void odm_free_memory(struct phy_dm_struct *dm, void *ptr, u32 length);
133 
134 void odm_move_memory(struct phy_dm_struct *dm, void *p_dest, void *src,
135 		     u32 length);
136 
137 s32 odm_compare_memory(struct phy_dm_struct *dm, void *p_buf1, void *buf2,
138 		       u32 length);
139 
140 void odm_memory_set(struct phy_dm_struct *dm, void *pbuf, s8 value, u32 length);
141 
142 /*
143  * ODM MISC-spin lock relative API.
144  */
145 void odm_acquire_spin_lock(struct phy_dm_struct *dm,
146 			   enum rt_spinlock_type type);
147 
148 void odm_release_spin_lock(struct phy_dm_struct *dm,
149 			   enum rt_spinlock_type type);
150 
151 /*
152  * ODM Timer relative API.
153  */
154 void odm_stall_execution(u32 us_delay);
155 
156 void ODM_delay_ms(u32 ms);
157 
158 void ODM_delay_us(u32 us);
159 
160 void ODM_sleep_ms(u32 ms);
161 
162 void ODM_sleep_us(u32 us);
163 
164 /*
165  * ODM FW relative API.
166  */
167 void odm_fill_h2c_cmd(struct phy_dm_struct *dm, u8 element_id, u32 cmd_len,
168 		      u8 *cmd_buffer);
169 
170 u8 phydm_c2H_content_parsing(void *dm_void, u8 c2h_cmd_id, u8 c2h_cmd_len,
171 			     u8 *tmp_buf);
172 
173 u64 odm_get_current_time(struct phy_dm_struct *dm);
174 u64 odm_get_progressing_time(struct phy_dm_struct *dm, u64 start_time);
175 
176 void odm_set_tx_power_index_by_rate_section(struct phy_dm_struct *dm,
177 					    u8 rf_path, u8 channel,
178 					    u8 rate_section);
179 
180 u8 odm_get_tx_power_index(struct phy_dm_struct *dm, u8 rf_path, u8 tx_rate,
181 			  u8 band_width, u8 channel);
182 
183 #endif /* __ODM_INTERFACE_H__ */
184