1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
4 * Copyright(c) 2007 - 2016 Realtek Corporation.
7 * wlanfae <wlanfae@realtek.com>
8 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
11 * Larry Finger <Larry.Finger@lwfinger.net>
13 *****************************************************************************/
15 /* ************************************************************
17 * *************************************************************/
19 #include "mp_precomp.h"
20 #include "phydm_precomp.h"
23 * ODM IO Relative API.
26 u8 odm_read_1byte(struct phy_dm_struct *dm, u32 reg_addr)
28 struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
30 return rtl_read_byte(rtlpriv, reg_addr);
33 u16 odm_read_2byte(struct phy_dm_struct *dm, u32 reg_addr)
35 struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
37 return rtl_read_word(rtlpriv, reg_addr);
40 u32 odm_read_4byte(struct phy_dm_struct *dm, u32 reg_addr)
42 struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
44 return rtl_read_dword(rtlpriv, reg_addr);
47 void odm_write_1byte(struct phy_dm_struct *dm, u32 reg_addr, u8 data)
49 struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
51 rtl_write_byte(rtlpriv, reg_addr, data);
54 void odm_write_2byte(struct phy_dm_struct *dm, u32 reg_addr, u16 data)
56 struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
58 rtl_write_word(rtlpriv, reg_addr, data);
61 void odm_write_4byte(struct phy_dm_struct *dm, u32 reg_addr, u32 data)
63 struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
65 rtl_write_dword(rtlpriv, reg_addr, data);
68 void odm_set_mac_reg(struct phy_dm_struct *dm, u32 reg_addr, u32 bit_mask,
71 struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
73 rtl_set_bbreg(rtlpriv->hw, reg_addr, bit_mask, data);
76 u32 odm_get_mac_reg(struct phy_dm_struct *dm, u32 reg_addr, u32 bit_mask)
78 struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
80 return rtl_get_bbreg(rtlpriv->hw, reg_addr, bit_mask);
83 void odm_set_bb_reg(struct phy_dm_struct *dm, u32 reg_addr, u32 bit_mask,
86 struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
88 rtl_set_bbreg(rtlpriv->hw, reg_addr, bit_mask, data);
91 u32 odm_get_bb_reg(struct phy_dm_struct *dm, u32 reg_addr, u32 bit_mask)
93 struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
95 return rtl_get_bbreg(rtlpriv->hw, reg_addr, bit_mask);
98 void odm_set_rf_reg(struct phy_dm_struct *dm, enum odm_rf_radio_path e_rf_path,
99 u32 reg_addr, u32 bit_mask, u32 data)
101 struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
103 rtl_set_rfreg(rtlpriv->hw, (enum radio_path)e_rf_path, reg_addr,
107 u32 odm_get_rf_reg(struct phy_dm_struct *dm, enum odm_rf_radio_path e_rf_path,
108 u32 reg_addr, u32 bit_mask)
110 struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
112 return rtl_get_rfreg(rtlpriv->hw, (enum radio_path)e_rf_path, reg_addr,
117 * ODM Memory relative API.
119 void odm_allocate_memory(struct phy_dm_struct *dm, void **ptr, u32 length)
121 *ptr = kmalloc(length, GFP_ATOMIC);
124 /* length could be ignored, used to detect memory leakage. */
125 void odm_free_memory(struct phy_dm_struct *dm, void *ptr, u32 length)
130 void odm_move_memory(struct phy_dm_struct *dm, void *p_dest, void *src,
133 memcpy(p_dest, src, length);
136 void odm_memory_set(struct phy_dm_struct *dm, void *pbuf, s8 value, u32 length)
138 memset(pbuf, value, length);
141 s32 odm_compare_memory(struct phy_dm_struct *dm, void *p_buf1, void *buf2,
144 return memcmp(p_buf1, buf2, length);
148 * ODM MISC relative API.
150 void odm_acquire_spin_lock(struct phy_dm_struct *dm, enum rt_spinlock_type type)
154 void odm_release_spin_lock(struct phy_dm_struct *dm, enum rt_spinlock_type type)
159 * ODM Timer relative API.
161 void odm_stall_execution(u32 us_delay) { udelay(us_delay); }
163 void ODM_delay_ms(u32 ms) { mdelay(ms); }
165 void ODM_delay_us(u32 us) { udelay(us); }
167 void ODM_sleep_ms(u32 ms) { msleep(ms); }
169 void ODM_sleep_us(u32 us) { usleep_range(us, us + 1); }
171 static u8 phydm_trans_h2c_id(struct phy_dm_struct *dm, u8 phydm_h2c_id)
173 u8 platform_h2c_id = phydm_h2c_id;
175 switch (phydm_h2c_id) {
177 case ODM_H2C_RSSI_REPORT:
182 case ODM_H2C_WIFI_CALIBRATION:
187 case ODM_H2C_IQ_CALIBRATION:
191 case ODM_H2C_RA_PARA_ADJUST:
196 case PHYDM_H2C_DYNAMIC_TX_PATH:
201 case PHYDM_H2C_FW_TRACE_EN:
203 platform_h2c_id = 0x49;
211 platform_h2c_id = 0x4a; /*H2C_MU*/
215 platform_h2c_id = phydm_h2c_id;
219 return platform_h2c_id;
222 /*ODM FW relative API.*/
224 void odm_fill_h2c_cmd(struct phy_dm_struct *dm, u8 phydm_h2c_id, u32 cmd_len,
227 struct rtl_priv *rtlpriv = (struct rtl_priv *)dm->adapter;
230 platform_h2c_id = phydm_trans_h2c_id(dm, phydm_h2c_id);
232 ODM_RT_TRACE(dm, PHYDM_COMP_RA_DBG,
233 "[H2C] platform_h2c_id = ((0x%x))\n", platform_h2c_id);
235 rtlpriv->cfg->ops->fill_h2c_cmd(rtlpriv->hw, platform_h2c_id, cmd_len,
239 u8 phydm_c2H_content_parsing(void *dm_void, u8 c2h_cmd_id, u8 c2h_cmd_len,
242 struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
243 u8 extend_c2h_sub_id = 0;
244 u8 find_c2h_cmd = true;
246 switch (c2h_cmd_id) {
248 phydm_fw_trace_handler(dm, tmp_buf, c2h_cmd_len);
251 case PHYDM_C2H_RA_RPT:
252 phydm_c2h_ra_report_handler(dm, tmp_buf, c2h_cmd_len);
255 case PHYDM_C2H_RA_PARA_RPT:
256 odm_c2h_ra_para_report_handler(dm, tmp_buf, c2h_cmd_len);
259 case PHYDM_C2H_DYNAMIC_TX_PATH_RPT:
262 case PHYDM_C2H_IQK_FINISH:
265 case PHYDM_C2H_DBG_CODE:
266 phydm_fw_trace_handler_code(dm, tmp_buf, c2h_cmd_len);
269 case PHYDM_C2H_EXTEND:
270 extend_c2h_sub_id = tmp_buf[0];
271 if (extend_c2h_sub_id == PHYDM_EXTEND_C2H_DBG_PRINT)
272 phydm_fw_trace_handler_8051(dm, tmp_buf, c2h_cmd_len);
277 find_c2h_cmd = false;
284 u64 odm_get_current_time(struct phy_dm_struct *dm) { return jiffies; }
286 u64 odm_get_progressing_time(struct phy_dm_struct *dm, u64 start_time)
288 return jiffies_to_msecs(jiffies - (u32)start_time);
291 void odm_set_tx_power_index_by_rate_section(struct phy_dm_struct *dm,
292 u8 rf_path, u8 channel,
295 void *adapter = dm->adapter;
297 phy_set_tx_power_index_by_rs(adapter, channel, rf_path, rate_section);
300 u8 odm_get_tx_power_index(struct phy_dm_struct *dm, u8 rf_path, u8 tx_rate,
301 u8 band_width, u8 channel)
303 void *adapter = dm->adapter;
305 return phy_get_tx_power_index(adapter, (enum odm_rf_radio_path)rf_path,
306 tx_rate, band_width, channel);