xref: /wlan-driver/qca-wifi-host-cmn/target_if/init_deinit/src/init_event_handler.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name /**
21*5113495bSYour Name  * DOC: init_event_handler.c
22*5113495bSYour Name  *
23*5113495bSYour Name  * WMI common event handler implementation source file
24*5113495bSYour Name  */
25*5113495bSYour Name 
26*5113495bSYour Name #include <qdf_status.h>
27*5113495bSYour Name #include <wlan_objmgr_psoc_obj.h>
28*5113495bSYour Name #include <wlan_objmgr_pdev_obj.h>
29*5113495bSYour Name #include <target_if.h>
30*5113495bSYour Name #include <target_if_reg.h>
31*5113495bSYour Name #include <init_event_handler.h>
32*5113495bSYour Name #include <service_ready_util.h>
33*5113495bSYour Name #include <service_ready_param.h>
34*5113495bSYour Name #include <init_cmd_api.h>
35*5113495bSYour Name #include <cdp_txrx_cmn.h>
36*5113495bSYour Name #ifdef DP_TX_PACKET_INSPECT_FOR_ILP
37*5113495bSYour Name #include <cdp_txrx_misc.h>
38*5113495bSYour Name #endif
39*5113495bSYour Name #include <wlan_reg_ucfg_api.h>
40*5113495bSYour Name #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
41*5113495bSYour Name #include <wlan_mlo_mgr_cmn.h>
42*5113495bSYour Name #include <wlan_mlo_mgr_ap.h>
43*5113495bSYour Name #include <wlan_mlo_mgr_setup.h>
44*5113495bSYour Name #endif
45*5113495bSYour Name #include <target_if_twt.h>
46*5113495bSYour Name #include <target_if_scan.h>
47*5113495bSYour Name 
init_deinit_set_send_init_cmd(struct wlan_objmgr_psoc * psoc,struct target_psoc_info * tgt_hdl)48*5113495bSYour Name static void init_deinit_set_send_init_cmd(struct wlan_objmgr_psoc *psoc,
49*5113495bSYour Name 					  struct target_psoc_info *tgt_hdl)
50*5113495bSYour Name {
51*5113495bSYour Name 	tgt_hdl->info.wmi_service_ready = TRUE;
52*5113495bSYour Name 	/* send init command */
53*5113495bSYour Name 	init_deinit_prepare_send_init_cmd(psoc, tgt_hdl);
54*5113495bSYour Name }
55*5113495bSYour Name 
56*5113495bSYour Name #ifdef WLAN_FEATURE_P2P_P2P_STA
57*5113495bSYour Name static void
init_deinit_update_p2p_p2p_conc_support(struct wmi_unified * wmi_handle,struct wlan_objmgr_psoc * psoc)58*5113495bSYour Name init_deinit_update_p2p_p2p_conc_support(struct wmi_unified *wmi_handle,
59*5113495bSYour Name 					struct wlan_objmgr_psoc *psoc)
60*5113495bSYour Name {
61*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_p2p_p2p_cc_support))
62*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_set(psoc,
63*5113495bSYour Name 					     WLAN_SOC_EXT_P2P_P2P_CONC_SUPPORT);
64*5113495bSYour Name 	else
65*5113495bSYour Name 		target_if_debug("P2P + P2P conc disabled");
66*5113495bSYour Name }
67*5113495bSYour Name #else
68*5113495bSYour Name static inline void
init_deinit_update_p2p_p2p_conc_support(struct wmi_unified * wmi_handle,struct wlan_objmgr_psoc * psoc)69*5113495bSYour Name init_deinit_update_p2p_p2p_conc_support(struct wmi_unified *wmi_handle,
70*5113495bSYour Name 					struct wlan_objmgr_psoc *psoc)
71*5113495bSYour Name {}
72*5113495bSYour Name #endif
73*5113495bSYour Name 
74*5113495bSYour Name #ifdef QCA_RSSI_DB2DBM
75*5113495bSYour Name static void
init_deinit_update_rssi_dbm_conv_support(struct wmi_unified * wmi_handle,struct wlan_objmgr_psoc * psoc)76*5113495bSYour Name init_deinit_update_rssi_dbm_conv_support(struct wmi_unified *wmi_handle,
77*5113495bSYour Name 					 struct wlan_objmgr_psoc *psoc)
78*5113495bSYour Name {
79*5113495bSYour Name 	/* Send RSSI_DBM_CONV to DP layer */
80*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
81*5113495bSYour Name 				wmi_service_pdev_rssi_dbm_conv_event_support))
82*5113495bSYour Name 		cdp_soc_set_param(wlan_psoc_get_dp_handle(psoc),
83*5113495bSYour Name 				  DP_SOC_PARAM_RSSI_DBM_CONV_SUPPORT, 1);
84*5113495bSYour Name }
85*5113495bSYour Name #else
86*5113495bSYour Name static inline void
init_deinit_update_rssi_dbm_conv_support(struct wmi_unified * wmi_handle,struct wlan_objmgr_psoc * psoc)87*5113495bSYour Name init_deinit_update_rssi_dbm_conv_support(struct wmi_unified *wmi_handle,
88*5113495bSYour Name 					 struct wlan_objmgr_psoc *psoc)
89*5113495bSYour Name {}
90*5113495bSYour Name #endif
91*5113495bSYour Name 
92*5113495bSYour Name #ifdef WIFI_POS_CONVERGED
93*5113495bSYour Name static inline void
init_deinit_update_wifi_pos_caps(struct wmi_unified * wmi_handle,struct wlan_objmgr_psoc * psoc)94*5113495bSYour Name init_deinit_update_wifi_pos_caps(struct wmi_unified *wmi_handle,
95*5113495bSYour Name 				 struct wlan_objmgr_psoc *psoc)
96*5113495bSYour Name {
97*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_rtt_11az_ntb_support))
98*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_set(psoc,
99*5113495bSYour Name 					     WLAN_RTT_11AZ_NTB_SUPPORT);
100*5113495bSYour Name 
101*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_rtt_11az_tb_support))
102*5113495bSYour Name 		wlan_psoc_nif_fw_ext2_cap_set(psoc,
103*5113495bSYour Name 					      WLAN_RTT_11AZ_TB_SUPPORT);
104*5113495bSYour Name 
105*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
106*5113495bSYour Name 				wmi_service_rtt_11az_tb_rsta_support))
107*5113495bSYour Name 		wlan_psoc_nif_fw_ext2_cap_set(psoc,
108*5113495bSYour Name 					      WLAN_RTT_11AZ_TB_RSTA_SUPPORT);
109*5113495bSYour Name 
110*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
111*5113495bSYour Name 				wmi_service_rtt_11az_mac_sec_support))
112*5113495bSYour Name 		wlan_psoc_nif_fw_ext2_cap_set(psoc,
113*5113495bSYour Name 					      WLAN_RTT_11AZ_MAC_SEC_SUPPORT);
114*5113495bSYour Name 
115*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
116*5113495bSYour Name 				wmi_service_rtt_11az_mac_phy_sec_support))
117*5113495bSYour Name 		wlan_psoc_nif_fw_ext2_cap_set(
118*5113495bSYour Name 				psoc, WLAN_RTT_11AZ_MAC_PHY_SEC_SUPPORT);
119*5113495bSYour Name }
120*5113495bSYour Name #else
121*5113495bSYour Name static inline void
init_deinit_update_wifi_pos_caps(struct wmi_unified * wmi_handle,struct wlan_objmgr_psoc * psoc)122*5113495bSYour Name init_deinit_update_wifi_pos_caps(struct wmi_unified *wmi_handle,
123*5113495bSYour Name 				 struct wlan_objmgr_psoc *psoc)
124*5113495bSYour Name {}
125*5113495bSYour Name #endif
126*5113495bSYour Name 
127*5113495bSYour Name #ifdef WLAN_FEATURE_ROAM_OFFLOAD
128*5113495bSYour Name static void
init_deinit_update_roam_stats_cap(struct wmi_unified * wmi_handle,struct wlan_objmgr_psoc * psoc)129*5113495bSYour Name init_deinit_update_roam_stats_cap(struct wmi_unified *wmi_handle,
130*5113495bSYour Name 				  struct wlan_objmgr_psoc *psoc)
131*5113495bSYour Name {
132*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
133*5113495bSYour Name 				wmi_service_roam_stats_per_candidate_frame_info))
134*5113495bSYour Name 		wlan_psoc_nif_fw_ext2_cap_set(
135*5113495bSYour Name 			psoc, WLAN_ROAM_STATS_FRAME_INFO_PER_CANDIDATE);
136*5113495bSYour Name }
137*5113495bSYour Name #else
138*5113495bSYour Name static inline void
init_deinit_update_roam_stats_cap(struct wmi_unified * wmi_handle,struct wlan_objmgr_psoc * psoc)139*5113495bSYour Name init_deinit_update_roam_stats_cap(struct wmi_unified *wmi_handle,
140*5113495bSYour Name 				  struct wlan_objmgr_psoc *psoc)
141*5113495bSYour Name {}
142*5113495bSYour Name #endif
143*5113495bSYour Name 
144*5113495bSYour Name #ifdef DP_TX_PACKET_INSPECT_FOR_ILP
145*5113495bSYour Name static void
init_deinit_update_tx_ilp_cap(struct wlan_objmgr_psoc * psoc,struct tgt_info * info)146*5113495bSYour Name init_deinit_update_tx_ilp_cap(struct wlan_objmgr_psoc *psoc,
147*5113495bSYour Name 			      struct tgt_info *info)
148*5113495bSYour Name {
149*5113495bSYour Name 	ol_txrx_soc_handle soc;
150*5113495bSYour Name 
151*5113495bSYour Name 	soc = wlan_psoc_get_dp_handle(psoc);
152*5113495bSYour Name 	info->wlan_res_cfg.tx_ilp_enable =
153*5113495bSYour Name 		cdp_evaluate_update_tx_ilp_cfg(
154*5113495bSYour Name 			soc, info->service_ext2_param.num_msdu_idx_qtype_map,
155*5113495bSYour Name 			info->msdu_idx_qtype_map);
156*5113495bSYour Name }
157*5113495bSYour Name #else
158*5113495bSYour Name static void
init_deinit_update_tx_ilp_cap(struct wlan_objmgr_psoc * psoc,struct tgt_info * info)159*5113495bSYour Name init_deinit_update_tx_ilp_cap(struct wlan_objmgr_psoc *psoc,
160*5113495bSYour Name 			      struct tgt_info *info)
161*5113495bSYour Name {
162*5113495bSYour Name }
163*5113495bSYour Name #endif
164*5113495bSYour Name 
165*5113495bSYour Name #ifdef MULTI_CLIENT_LL_SUPPORT
166*5113495bSYour Name /**
167*5113495bSYour Name  * init_deinit_update_multi_client_ll_caps() - Update multi client service
168*5113495bSYour Name  * capability bit
169*5113495bSYour Name  * @wmi_handle: wmi handle
170*5113495bSYour Name  * @psoc: psoc common object
171*5113495bSYour Name  *
172*5113495bSYour Name  * Return: none
173*5113495bSYour Name  */
174*5113495bSYour Name static void
init_deinit_update_multi_client_ll_caps(struct wmi_unified * wmi_handle,struct wlan_objmgr_psoc * psoc)175*5113495bSYour Name init_deinit_update_multi_client_ll_caps(struct wmi_unified *wmi_handle,
176*5113495bSYour Name 					struct wlan_objmgr_psoc *psoc)
177*5113495bSYour Name {
178*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
179*5113495bSYour Name 				wmi_service_configure_multi_client_ll_support))
180*5113495bSYour Name 		wlan_psoc_nif_fw_ext2_cap_set(psoc,
181*5113495bSYour Name 					WLAN_SOC_WLM_MULTI_CLIENT_LL_SUPPORT);
182*5113495bSYour Name }
183*5113495bSYour Name #else
184*5113495bSYour Name static inline void
init_deinit_update_multi_client_ll_caps(struct wmi_unified * wmi_handle,struct wlan_objmgr_psoc * psoc)185*5113495bSYour Name init_deinit_update_multi_client_ll_caps(struct wmi_unified *wmi_handle,
186*5113495bSYour Name 					struct wlan_objmgr_psoc *psoc)
187*5113495bSYour Name {}
188*5113495bSYour Name #endif
189*5113495bSYour Name 
190*5113495bSYour Name #ifdef WLAN_VENDOR_HANDOFF_CONTROL
191*5113495bSYour Name /**
192*5113495bSYour Name  * init_deinit_update_vendor_handoff_control_caps() - Update vendor handoff
193*5113495bSYour Name  * control service capability bit
194*5113495bSYour Name  * @wmi_handle: wmi handle
195*5113495bSYour Name  * @psoc: psoc common object
196*5113495bSYour Name  *
197*5113495bSYour Name  * Return: none
198*5113495bSYour Name  */
199*5113495bSYour Name static void
init_deinit_update_vendor_handoff_control_caps(struct wmi_unified * wmi_handle,struct wlan_objmgr_psoc * psoc)200*5113495bSYour Name init_deinit_update_vendor_handoff_control_caps(struct wmi_unified *wmi_handle,
201*5113495bSYour Name 					       struct wlan_objmgr_psoc *psoc)
202*5113495bSYour Name {
203*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
204*5113495bSYour Name 			wmi_service_configure_vendor_handoff_control_support))
205*5113495bSYour Name 		wlan_psoc_nif_fw_ext2_cap_set(psoc,
206*5113495bSYour Name 					      WLAN_SOC_VENDOR_HANDOFF_CONTROL);
207*5113495bSYour Name }
208*5113495bSYour Name #else
209*5113495bSYour Name static inline void
init_deinit_update_vendor_handoff_control_caps(struct wmi_unified * wmi_handle,struct wlan_objmgr_psoc * psoc)210*5113495bSYour Name init_deinit_update_vendor_handoff_control_caps(struct wmi_unified *wmi_handle,
211*5113495bSYour Name 					       struct wlan_objmgr_psoc *psoc)
212*5113495bSYour Name {}
213*5113495bSYour Name #endif
214*5113495bSYour Name 
215*5113495bSYour Name #ifdef FEATURE_WLAN_TDLS
init_deinit_update_tdls_caps(struct wmi_unified * wmi,struct wlan_objmgr_psoc * psoc)216*5113495bSYour Name static void init_deinit_update_tdls_caps(struct wmi_unified *wmi,
217*5113495bSYour Name 					 struct wlan_objmgr_psoc *psoc)
218*5113495bSYour Name {
219*5113495bSYour Name 	if (wmi_service_enabled(wmi, wmi_service_tdls_concurrency_support))
220*5113495bSYour Name 		wlan_psoc_nif_fw_ext2_cap_set(psoc,
221*5113495bSYour Name 					      WLAN_TDLS_CONCURRENCIES_SUPPORT);
222*5113495bSYour Name }
223*5113495bSYour Name #else
init_deinit_update_tdls_caps(struct wmi_unified * wmi_handle,struct wlan_objmgr_psoc * psoc)224*5113495bSYour Name static inline void init_deinit_update_tdls_caps(struct wmi_unified *wmi_handle,
225*5113495bSYour Name 						struct wlan_objmgr_psoc *psoc)
226*5113495bSYour Name {}
227*5113495bSYour Name #endif
228*5113495bSYour Name static void
229*5113495bSYour Name init_deinit_pdev_wsi_stats_info_support(struct wmi_unified *wmi_handle,
230*5113495bSYour Name 					struct wlan_objmgr_psoc *psoc);
231*5113495bSYour Name 
232*5113495bSYour Name static void init_deinit_mlo_tsf_sync_support(struct wmi_unified *wmi_handle,
233*5113495bSYour Name 					     struct wlan_objmgr_psoc *psoc);
234*5113495bSYour Name 
init_deinit_service_ready_event_handler(ol_scn_t scn_handle,uint8_t * event,uint32_t data_len)235*5113495bSYour Name static int init_deinit_service_ready_event_handler(ol_scn_t scn_handle,
236*5113495bSYour Name 							uint8_t *event,
237*5113495bSYour Name 							uint32_t data_len)
238*5113495bSYour Name {
239*5113495bSYour Name 	int err_code;
240*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
241*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
242*5113495bSYour Name 	wmi_legacy_service_ready_callback legacy_callback;
243*5113495bSYour Name 	struct wmi_unified *wmi_handle;
244*5113495bSYour Name 	QDF_STATUS ret_val;
245*5113495bSYour Name 
246*5113495bSYour Name 	if (!scn_handle) {
247*5113495bSYour Name 		target_if_err("scn handle NULL in service ready handler");
248*5113495bSYour Name 		return -EINVAL;
249*5113495bSYour Name 	}
250*5113495bSYour Name 
251*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn_handle);
252*5113495bSYour Name 	if (!psoc) {
253*5113495bSYour Name 		target_if_err("psoc is null in service ready handler");
254*5113495bSYour Name 		return -EINVAL;
255*5113495bSYour Name 	}
256*5113495bSYour Name 
257*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
258*5113495bSYour Name 	if (!tgt_hdl) {
259*5113495bSYour Name 		target_if_err("target_psoc_info is null in service ready ev");
260*5113495bSYour Name 		return -EINVAL;
261*5113495bSYour Name 	}
262*5113495bSYour Name 
263*5113495bSYour Name 	ret_val = target_if_sw_version_check(psoc, tgt_hdl, event);
264*5113495bSYour Name 
265*5113495bSYour Name 	wmi_handle = target_psoc_get_wmi_hdl(tgt_hdl);
266*5113495bSYour Name 
267*5113495bSYour Name 	err_code = init_deinit_populate_service_bitmap(wmi_handle, event,
268*5113495bSYour Name 			tgt_hdl->info.service_bitmap);
269*5113495bSYour Name 	if (err_code)
270*5113495bSYour Name 		goto exit;
271*5113495bSYour Name 
272*5113495bSYour Name 	err_code = init_deinit_populate_fw_version_cmd(wmi_handle, event);
273*5113495bSYour Name 	if (err_code)
274*5113495bSYour Name 		goto exit;
275*5113495bSYour Name 
276*5113495bSYour Name 	err_code = init_deinit_populate_target_cap(wmi_handle, event,
277*5113495bSYour Name 				   &(tgt_hdl->info.target_caps));
278*5113495bSYour Name 	if (err_code)
279*5113495bSYour Name 		goto exit;
280*5113495bSYour Name 
281*5113495bSYour Name 	err_code = init_deinit_populate_phy_reg_cap(psoc, wmi_handle, event,
282*5113495bSYour Name 				    &(tgt_hdl->info), true);
283*5113495bSYour Name 	if (err_code)
284*5113495bSYour Name 		goto exit;
285*5113495bSYour Name 
286*5113495bSYour Name 	if (init_deinit_validate_160_80p80_fw_caps(psoc, tgt_hdl) !=
287*5113495bSYour Name 			QDF_STATUS_SUCCESS) {
288*5113495bSYour Name 		wlan_psoc_nif_op_flag_set(psoc, WLAN_SOC_OP_VHT_INVALID_CAP);
289*5113495bSYour Name 	}
290*5113495bSYour Name 
291*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_tt) ||
292*5113495bSYour Name 	    wmi_service_enabled(wmi_handle, wmi_service_thermal_mgmt))
293*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_set(psoc, WLAN_SOC_CEXT_TT_SUPPORT);
294*5113495bSYour Name 
295*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_widebw_scan))
296*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_set(psoc, WLAN_SOC_CEXT_WIDEBAND_SCAN);
297*5113495bSYour Name 
298*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_check_cal_version))
299*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_set(psoc, WLAN_SOC_CEXT_SW_CAL);
300*5113495bSYour Name 
301*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_twt_requestor))
302*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_set(psoc, WLAN_SOC_CEXT_TWT_REQUESTER);
303*5113495bSYour Name 
304*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_twt_responder))
305*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_set(psoc, WLAN_SOC_CEXT_TWT_RESPONDER);
306*5113495bSYour Name 
307*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_bss_color_offload))
308*5113495bSYour Name 		target_if_debug(" BSS COLOR OFFLOAD supported");
309*5113495bSYour Name 
310*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_ul_ru26_allowed))
311*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_set(psoc, WLAN_SOC_CEXT_OBSS_NBW_RU);
312*5113495bSYour Name 
313*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_infra_mbssid))
314*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_set(psoc, WLAN_SOC_CEXT_MBSS_IE);
315*5113495bSYour Name 
316*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
317*5113495bSYour Name 				wmi_service_mbss_param_in_vdev_start_support))
318*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_set(psoc,
319*5113495bSYour Name 					     WLAN_SOC_CEXT_MBSS_PARAM_IN_START);
320*5113495bSYour Name 
321*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_dynamic_hw_mode))
322*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_set(psoc, WLAN_SOC_CEXT_DYNAMIC_HW_MODE);
323*5113495bSYour Name 
324*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
325*5113495bSYour Name 				wmi_service_bw_restricted_80p80_support))
326*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_set(psoc,
327*5113495bSYour Name 					     WLAN_SOC_RESTRICTED_80P80_SUPPORT);
328*5113495bSYour Name 
329*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
330*5113495bSYour Name 				wmi_service_nss_ratio_to_host_support))
331*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_set(
332*5113495bSYour Name 				psoc, WLAN_SOC_NSS_RATIO_TO_HOST_SUPPORT);
333*5113495bSYour Name 
334*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
335*5113495bSYour Name 				wmi_service_rtt_ap_initiator_staggered_mode_supported))
336*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_set(
337*5113495bSYour Name 				psoc, WLAN_SOC_RTT_AP_INITIATOR_STAGGERED_MODE_SUPPORTED);
338*5113495bSYour Name 
339*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
340*5113495bSYour Name 				wmi_service_rtt_ap_initiator_bursted_mode_supported))
341*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_set(
342*5113495bSYour Name 				psoc, WLAN_SOC_RTT_AP_INITIATOR_BURSTED_MODE_SUPPORTED);
343*5113495bSYour Name 
344*5113495bSYour Name 	target_if_debug(" TT support %d, Wide BW Scan %d, SW cal %d",
345*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_get(psoc, WLAN_SOC_CEXT_TT_SUPPORT),
346*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_get(psoc, WLAN_SOC_CEXT_WIDEBAND_SCAN),
347*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_get(psoc, WLAN_SOC_CEXT_SW_CAL));
348*5113495bSYour Name 
349*5113495bSYour Name 	target_if_mesh_support_enable(psoc, tgt_hdl, event);
350*5113495bSYour Name 
351*5113495bSYour Name 	target_if_eapol_minrate_enable(psoc, tgt_hdl, event);
352*5113495bSYour Name 
353*5113495bSYour Name 	target_if_smart_antenna_enable(psoc, tgt_hdl, event);
354*5113495bSYour Name 
355*5113495bSYour Name 	target_if_cfr_support_enable(psoc, tgt_hdl, event);
356*5113495bSYour Name 
357*5113495bSYour Name 	target_if_peer_cfg_enable(psoc, tgt_hdl, event);
358*5113495bSYour Name 
359*5113495bSYour Name 	target_if_atf_cfg_enable(psoc, tgt_hdl, event);
360*5113495bSYour Name 
361*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
362*5113495bSYour Name 				wmi_service_mgmt_rx_reo_supported))
363*5113495bSYour Name 		wlan_psoc_nif_feat_cap_set(psoc,
364*5113495bSYour Name 					   WLAN_SOC_F_MGMT_RX_REO_CAPABLE);
365*5113495bSYour Name 
366*5113495bSYour Name 	target_if_lteu_cfg_enable(psoc, tgt_hdl, event);
367*5113495bSYour Name 
368*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_rx_fse_support))
369*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_set(psoc,
370*5113495bSYour Name 					     WLAN_SOC_CEXT_RX_FSE_SUPPORT);
371*5113495bSYour Name 
372*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
373*5113495bSYour Name 				wmi_service_scan_conf_per_ch_support))
374*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_set(psoc,
375*5113495bSYour Name 					     WLAN_SOC_CEXT_SCAN_PER_CH_CONFIG);
376*5113495bSYour Name 
377*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
378*5113495bSYour Name 				wmi_service_pno_scan_conf_per_ch_support))
379*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_set(psoc,
380*5113495bSYour Name 					WLAN_SOC_PNO_SCAN_CONFIG_PER_CHANNEL);
381*5113495bSYour Name 
382*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_csa_beacon_template))
383*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_set(psoc,
384*5113495bSYour Name 					     WLAN_SOC_CEXT_CSA_TX_OFFLOAD);
385*5113495bSYour Name 
386*5113495bSYour Name 	init_deinit_update_roam_stats_cap(wmi_handle, psoc);
387*5113495bSYour Name 
388*5113495bSYour Name 	init_deinit_update_wifi_pos_caps(wmi_handle, psoc);
389*5113495bSYour Name 	init_deinit_update_tdls_caps(wmi_handle, psoc);
390*5113495bSYour Name 
391*5113495bSYour Name 	init_deinit_pdev_wsi_stats_info_support(wmi_handle, psoc);
392*5113495bSYour Name 
393*5113495bSYour Name 	init_deinit_mlo_tsf_sync_support(wmi_handle, psoc);
394*5113495bSYour Name 
395*5113495bSYour Name 	/* override derived value, if it exceeds max peer count */
396*5113495bSYour Name 	if ((wlan_psoc_get_max_peer_count(psoc) >
397*5113495bSYour Name 		tgt_hdl->info.wlan_res_cfg.num_active_peers) &&
398*5113495bSYour Name 		(wlan_psoc_get_max_peer_count(psoc) <
399*5113495bSYour Name 			(tgt_hdl->info.wlan_res_cfg.num_peers -
400*5113495bSYour Name 				tgt_hdl->info.wlan_res_cfg.num_vdevs))) {
401*5113495bSYour Name 		tgt_hdl->info.wlan_res_cfg.num_peers =
402*5113495bSYour Name 				wlan_psoc_get_max_peer_count(psoc) +
403*5113495bSYour Name 					tgt_hdl->info.wlan_res_cfg.num_vdevs;
404*5113495bSYour Name 	}
405*5113495bSYour Name 	legacy_callback = target_if_get_psoc_legacy_service_ready_cb();
406*5113495bSYour Name 	if (!legacy_callback) {
407*5113495bSYour Name 		err_code = -EINVAL;
408*5113495bSYour Name 		goto exit;
409*5113495bSYour Name 	}
410*5113495bSYour Name 
411*5113495bSYour Name 	err_code = legacy_callback(wmi_service_ready_event_id,
412*5113495bSYour Name 				  scn_handle, event, data_len);
413*5113495bSYour Name 	init_deinit_chainmask_config(psoc, tgt_hdl);
414*5113495bSYour Name 
415*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_mgmt_tx_wmi)) {
416*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_set(psoc, WLAN_SOC_CEXT_WMI_MGMT_REF);
417*5113495bSYour Name 		target_if_debug("WMI mgmt service enabled");
418*5113495bSYour Name 	} else {
419*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_clear(psoc,
420*5113495bSYour Name 					       WLAN_SOC_CEXT_WMI_MGMT_REF);
421*5113495bSYour Name 		target_if_debug("WMI mgmt service disabled");
422*5113495bSYour Name 	}
423*5113495bSYour Name 	init_deinit_update_p2p_p2p_conc_support(wmi_handle, psoc);
424*5113495bSYour Name 
425*5113495bSYour Name 	err_code = init_deinit_handle_host_mem_req(psoc, tgt_hdl, event);
426*5113495bSYour Name 	if (err_code != QDF_STATUS_SUCCESS)
427*5113495bSYour Name 		goto exit;
428*5113495bSYour Name 
429*5113495bSYour Name 	target_if_reg_set_offloaded_info(psoc);
430*5113495bSYour Name 	target_if_reg_set_6ghz_info(psoc);
431*5113495bSYour Name 	target_if_reg_set_5dot9_ghz_info(psoc);
432*5113495bSYour Name 	target_if_twt_fill_tgt_caps(psoc, wmi_handle);
433*5113495bSYour Name 	target_if_update_aux_support(psoc);
434*5113495bSYour Name 
435*5113495bSYour Name 	/* Send num_msdu_desc to DP layer */
436*5113495bSYour Name 	cdp_soc_set_param(wlan_psoc_get_dp_handle(psoc),
437*5113495bSYour Name 			  DP_SOC_PARAM_MSDU_EXCEPTION_DESC,
438*5113495bSYour Name 			  tgt_hdl->info.target_caps.num_msdu_desc);
439*5113495bSYour Name 
440*5113495bSYour Name 	/* Send multi_peer_group support to DP layer */
441*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
442*5113495bSYour Name 				wmi_service_multi_peer_group_cmd_support))
443*5113495bSYour Name 		cdp_soc_set_param(wlan_psoc_get_dp_handle(psoc),
444*5113495bSYour Name 				  DP_SOC_PARAM_MULTI_PEER_GRP_CMD_SUPPORT, 1);
445*5113495bSYour Name 
446*5113495bSYour Name 	/* Send UMAC HW reset support to DP layer */
447*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
448*5113495bSYour Name 				wmi_service_umac_hang_recovery_support))
449*5113495bSYour Name 		cdp_soc_set_param(wlan_psoc_get_dp_handle(psoc),
450*5113495bSYour Name 				  DP_SOC_PARAM_UMAC_HW_RESET_SUPPORT, 1);
451*5113495bSYour Name 
452*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_vdev_delete_all_peer))
453*5113495bSYour Name 		wlan_psoc_nif_fw_ext2_cap_set(psoc,
454*5113495bSYour Name 					      WLAN_VDEV_DELETE_ALL_PEER_SUPPORT);
455*5113495bSYour Name 
456*5113495bSYour Name 	init_deinit_update_rssi_dbm_conv_support(wmi_handle, psoc);
457*5113495bSYour Name 
458*5113495bSYour Name 	init_deinit_update_multi_client_ll_caps(wmi_handle, psoc);
459*5113495bSYour Name 
460*5113495bSYour Name 	init_deinit_update_vendor_handoff_control_caps(wmi_handle, psoc);
461*5113495bSYour Name 
462*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
463*5113495bSYour Name 				wmi_service_cca_busy_info_for_each_20mhz))
464*5113495bSYour Name 		wlan_psoc_nif_fw_ext2_cap_set(psoc,
465*5113495bSYour Name 					WLAN_CCA_BUSY_INFO_FOREACH_20MHZ);
466*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
467*5113495bSYour Name 			wmi_service_vdev_param_chwidth_with_notify_support))
468*5113495bSYour Name 		wlan_psoc_nif_fw_ext2_cap_set(psoc,
469*5113495bSYour Name 				WLAN_VDEV_PARAM_CHWIDTH_WITH_NOTIFY_SUPPORT);
470*5113495bSYour Name 
471*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_ext_msg)) {
472*5113495bSYour Name 		target_if_debug("Wait for EXT message");
473*5113495bSYour Name 	} else {
474*5113495bSYour Name 		target_if_debug("No EXT message, send init command");
475*5113495bSYour Name 		target_psoc_set_num_radios(tgt_hdl, 1);
476*5113495bSYour Name 		init_deinit_set_send_init_cmd(psoc, tgt_hdl);
477*5113495bSYour Name 	}
478*5113495bSYour Name 
479*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
480*5113495bSYour Name 			wmi_service_multiple_reorder_queue_setup_support))
481*5113495bSYour Name 		cdp_soc_set_param(wlan_psoc_get_dp_handle(psoc),
482*5113495bSYour Name 			DP_SOC_PARAM_MULTI_RX_REORDER_SETUP_SUPPORT, 1);
483*5113495bSYour Name 
484*5113495bSYour Name exit:
485*5113495bSYour Name 	return err_code;
486*5113495bSYour Name }
487*5113495bSYour Name 
init_deinit_service_ext2_ready_event_handler(ol_scn_t scn_handle,uint8_t * event,uint32_t data_len)488*5113495bSYour Name static int init_deinit_service_ext2_ready_event_handler(ol_scn_t scn_handle,
489*5113495bSYour Name 							uint8_t *event,
490*5113495bSYour Name 							uint32_t data_len)
491*5113495bSYour Name {
492*5113495bSYour Name 	int err_code = 0;
493*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
494*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
495*5113495bSYour Name 	struct wmi_unified *wmi_handle;
496*5113495bSYour Name 	struct tgt_info *info;
497*5113495bSYour Name 	wmi_legacy_service_ready_callback legacy_callback;
498*5113495bSYour Name 
499*5113495bSYour Name 	if (!scn_handle) {
500*5113495bSYour Name 		target_if_err("scn handle NULL in service ready ext2 handler");
501*5113495bSYour Name 		return -EINVAL;
502*5113495bSYour Name 	}
503*5113495bSYour Name 
504*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn_handle);
505*5113495bSYour Name 	if (!psoc) {
506*5113495bSYour Name 		target_if_err("psoc is null in service ready ext2 handler");
507*5113495bSYour Name 		return -EINVAL;
508*5113495bSYour Name 	}
509*5113495bSYour Name 
510*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
511*5113495bSYour Name 	if (!tgt_hdl) {
512*5113495bSYour Name 		target_if_err("target_psoc_info is null in service ready ext2 handler");
513*5113495bSYour Name 		return -EINVAL;
514*5113495bSYour Name 	}
515*5113495bSYour Name 
516*5113495bSYour Name 	wmi_handle = target_psoc_get_wmi_hdl(tgt_hdl);
517*5113495bSYour Name 	if (!wmi_handle) {
518*5113495bSYour Name 		target_if_err("wmi_handle is null in service ready ext2 handler");
519*5113495bSYour Name 		return -EINVAL;
520*5113495bSYour Name 	}
521*5113495bSYour Name 
522*5113495bSYour Name 	info = (&tgt_hdl->info);
523*5113495bSYour Name 	if (info->wmi_service_status ==
524*5113495bSYour Name 			wmi_init_ext_processing_failed)
525*5113495bSYour Name 		return -EINVAL;
526*5113495bSYour Name 
527*5113495bSYour Name 	err_code = init_deinit_populate_service_ready_ext2_param(wmi_handle,
528*5113495bSYour Name 								 event, info);
529*5113495bSYour Name 	if (err_code)
530*5113495bSYour Name 		goto exit;
531*5113495bSYour Name 
532*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
533*5113495bSYour Name 				wmi_service_reg_cc_ext_event_support)) {
534*5113495bSYour Name 		target_if_set_reg_cc_ext_supp(tgt_hdl, psoc);
535*5113495bSYour Name 		wlan_psoc_nif_fw_ext_cap_set(psoc,
536*5113495bSYour Name 					     WLAN_SOC_EXT_EVENT_SUPPORTED);
537*5113495bSYour Name 	}
538*5113495bSYour Name 
539*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
540*5113495bSYour Name 				wmi_service_bang_radar_320_support)) {
541*5113495bSYour Name 		info->wlan_res_cfg.is_host_dfs_320mhz_bangradar_supported =
542*5113495bSYour Name 									   true;
543*5113495bSYour Name 	}
544*5113495bSYour Name 
545*5113495bSYour Name 	/* dbr_ring_caps could have already come as part of EXT event */
546*5113495bSYour Name 	if (info->service_ext2_param.num_dbr_ring_caps) {
547*5113495bSYour Name 		err_code = init_deinit_populate_dbr_ring_cap_ext2(psoc,
548*5113495bSYour Name 								  wmi_handle,
549*5113495bSYour Name 								  event, info);
550*5113495bSYour Name 		if (err_code)
551*5113495bSYour Name 			goto exit;
552*5113495bSYour Name 	}
553*5113495bSYour Name 
554*5113495bSYour Name 	err_code = init_deinit_populate_hal_reg_cap_ext2(wmi_handle, event,
555*5113495bSYour Name 							 info);
556*5113495bSYour Name 	if (err_code) {
557*5113495bSYour Name 		target_if_err("failed to populate hal reg cap ext2");
558*5113495bSYour Name 		goto exit;
559*5113495bSYour Name 	}
560*5113495bSYour Name 
561*5113495bSYour Name 	err_code = init_deinit_populate_mac_phy_cap_ext2(wmi_handle, event,
562*5113495bSYour Name 							 info);
563*5113495bSYour Name 	if (err_code) {
564*5113495bSYour Name 		target_if_err("failed to populate mac phy cap ext2");
565*5113495bSYour Name 		goto exit;
566*5113495bSYour Name 	}
567*5113495bSYour Name 
568*5113495bSYour Name 	target_if_add_11ax_modes(psoc, tgt_hdl);
569*5113495bSYour Name 
570*5113495bSYour Name 	err_code = init_deinit_populate_scan_radio_cap_ext2(wmi_handle, event,
571*5113495bSYour Name 							    info);
572*5113495bSYour Name 	if (err_code) {
573*5113495bSYour Name 		target_if_err("failed to populate scan radio cap ext2");
574*5113495bSYour Name 		goto exit;
575*5113495bSYour Name 	}
576*5113495bSYour Name 
577*5113495bSYour Name 	err_code = init_deinit_populate_msdu_idx_qtype_map_ext2(wmi_handle,
578*5113495bSYour Name 								event, info);
579*5113495bSYour Name 
580*5113495bSYour Name 	if (err_code) {
581*5113495bSYour Name 		target_if_err("failed to populate msdu index qtype map ext2");
582*5113495bSYour Name 		goto exit;
583*5113495bSYour Name 	}
584*5113495bSYour Name 
585*5113495bSYour Name 	init_deinit_update_tx_ilp_cap(psoc, info);
586*5113495bSYour Name 
587*5113495bSYour Name 	err_code = init_deinit_populate_twt_cap_ext2(psoc, wmi_handle, event,
588*5113495bSYour Name 						     info);
589*5113495bSYour Name 
590*5113495bSYour Name 	if (err_code)
591*5113495bSYour Name 		target_if_debug("failed to populate twt cap ext2");
592*5113495bSYour Name 
593*5113495bSYour Name 	err_code = init_deinit_populate_dbs_or_sbs_cap_ext2(psoc, wmi_handle,
594*5113495bSYour Name 							    event, info);
595*5113495bSYour Name 	if (err_code)
596*5113495bSYour Name 		target_if_debug("failed to populate dbs_or_sbs cap ext2");
597*5113495bSYour Name 
598*5113495bSYour Name 	err_code = init_deinit_populate_sap_coex_capability(psoc, wmi_handle,
599*5113495bSYour Name 							    event);
600*5113495bSYour Name 	if (err_code)
601*5113495bSYour Name 		target_if_debug("failed to populate sap_coex_capability ext2");
602*5113495bSYour Name 
603*5113495bSYour Name 	if (info->service_ext2_param.num_aux_dev_caps) {
604*5113495bSYour Name 		err_code = init_deinit_populate_aux_dev_cap_ext2(psoc,
605*5113495bSYour Name 								 wmi_handle,
606*5113495bSYour Name 								 event, info);
607*5113495bSYour Name 		if (err_code)
608*5113495bSYour Name 			target_if_debug("failed to populate aux_dev cap ext2");
609*5113495bSYour Name 	}
610*5113495bSYour Name 
611*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
612*5113495bSYour Name 				wmi_service_aoa_for_rcc_supported)) {
613*5113495bSYour Name 		err_code = init_deinit_populate_rcc_aoa_cap_ext2(psoc,
614*5113495bSYour Name 								 wmi_handle,
615*5113495bSYour Name 								 event, info);
616*5113495bSYour Name 		if (err_code)
617*5113495bSYour Name 			target_if_debug("failed to populate aoa cap ext2");
618*5113495bSYour Name 	}
619*5113495bSYour Name 
620*5113495bSYour Name 	legacy_callback = target_if_get_psoc_legacy_service_ready_cb();
621*5113495bSYour Name 	if (legacy_callback)
622*5113495bSYour Name 		if (legacy_callback(wmi_service_ready_ext2_event_id,
623*5113495bSYour Name 				    scn_handle, event, data_len)) {
624*5113495bSYour Name 			target_if_err("Legacy callback return error!");
625*5113495bSYour Name 			goto exit;
626*5113495bSYour Name 		}
627*5113495bSYour Name 
628*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_radar_flags_support)) {
629*5113495bSYour Name 		target_if_debug("Full bw nol supported");
630*5113495bSYour Name 		info->wlan_res_cfg.is_full_bw_nol_supported = true;
631*5113495bSYour Name 	}
632*5113495bSYour Name 
633*5113495bSYour Name 	target_if_regulatory_set_ext_tpc(psoc);
634*5113495bSYour Name 
635*5113495bSYour Name 	target_if_reg_set_lower_6g_edge_ch_info(psoc);
636*5113495bSYour Name 
637*5113495bSYour Name 	target_if_reg_set_disable_upper_6g_edge_ch_info(psoc);
638*5113495bSYour Name 
639*5113495bSYour Name 	target_if_reg_set_afc_dev_type(psoc, tgt_hdl);
640*5113495bSYour Name 
641*5113495bSYour Name 	target_if_set_regulatory_eirp_preferred_support(psoc);
642*5113495bSYour Name 
643*5113495bSYour Name 	tgt_if_set_reg_afc_configure(tgt_hdl, psoc);
644*5113495bSYour Name 
645*5113495bSYour Name 	/* send init command */
646*5113495bSYour Name 	init_deinit_set_send_init_cmd(psoc, tgt_hdl);
647*5113495bSYour Name 
648*5113495bSYour Name 	return 0;
649*5113495bSYour Name exit:
650*5113495bSYour Name 	info->wmi_ready = false;
651*5113495bSYour Name 	info->wmi_service_status = wmi_init_ext2_processing_failed;
652*5113495bSYour Name 	return err_code;
653*5113495bSYour Name }
654*5113495bSYour Name 
init_deinit_service_ext_ready_event_handler(ol_scn_t scn_handle,uint8_t * event,uint32_t data_len)655*5113495bSYour Name static int init_deinit_service_ext_ready_event_handler(ol_scn_t scn_handle,
656*5113495bSYour Name 						uint8_t *event,
657*5113495bSYour Name 						uint32_t data_len)
658*5113495bSYour Name {
659*5113495bSYour Name 	int err_code;
660*5113495bSYour Name 	uint8_t num_radios;
661*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
662*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
663*5113495bSYour Name 	struct wmi_unified *wmi_handle;
664*5113495bSYour Name 	struct tgt_info *info;
665*5113495bSYour Name 	wmi_legacy_service_ready_callback legacy_callback;
666*5113495bSYour Name 
667*5113495bSYour Name 	if (!scn_handle) {
668*5113495bSYour Name 		target_if_err("scn handle NULL in service ready handler");
669*5113495bSYour Name 		return -EINVAL;
670*5113495bSYour Name 	}
671*5113495bSYour Name 
672*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn_handle);
673*5113495bSYour Name 	if (!psoc) {
674*5113495bSYour Name 		target_if_err("psoc is null in service ready handler");
675*5113495bSYour Name 		return -EINVAL;
676*5113495bSYour Name 	}
677*5113495bSYour Name 
678*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
679*5113495bSYour Name 	if (!tgt_hdl) {
680*5113495bSYour Name 		target_if_err("target_psoc_info is null in service ready ev");
681*5113495bSYour Name 		return -EINVAL;
682*5113495bSYour Name 	}
683*5113495bSYour Name 
684*5113495bSYour Name 	wmi_handle = target_psoc_get_wmi_hdl(tgt_hdl);
685*5113495bSYour Name 	info = (&tgt_hdl->info);
686*5113495bSYour Name 
687*5113495bSYour Name 	err_code = init_deinit_populate_service_ready_ext_param(wmi_handle,
688*5113495bSYour Name 				event, &(info->service_ext_param));
689*5113495bSYour Name 	if (err_code)
690*5113495bSYour Name 		goto exit;
691*5113495bSYour Name 
692*5113495bSYour Name 	target_psoc_set_num_radios(tgt_hdl, 0);
693*5113495bSYour Name 	err_code =  init_deinit_populate_hw_mode_capability(wmi_handle,
694*5113495bSYour Name 					    event, tgt_hdl);
695*5113495bSYour Name 	if (err_code)
696*5113495bSYour Name 		goto exit;
697*5113495bSYour Name 
698*5113495bSYour Name 	if (init_deinit_is_preferred_hw_mode_supported(psoc, tgt_hdl)
699*5113495bSYour Name 			== FALSE) {
700*5113495bSYour Name 		target_if_err("Preferred mode %d not supported",
701*5113495bSYour Name 			      info->preferred_hw_mode);
702*5113495bSYour Name 		goto exit;
703*5113495bSYour Name 	}
704*5113495bSYour Name 
705*5113495bSYour Name 	num_radios = target_psoc_get_num_radios_for_mode(tgt_hdl,
706*5113495bSYour Name 							 info->preferred_hw_mode);
707*5113495bSYour Name 
708*5113495bSYour Name 	/* set number of radios based on current mode */
709*5113495bSYour Name 	target_psoc_set_num_radios(tgt_hdl, num_radios);
710*5113495bSYour Name 
711*5113495bSYour Name 	target_if_print_service_ready_ext_param(psoc, tgt_hdl);
712*5113495bSYour Name 
713*5113495bSYour Name 	err_code = init_deinit_populate_phy_reg_cap(psoc, wmi_handle,
714*5113495bSYour Name 					   event, info, false);
715*5113495bSYour Name 	if (err_code)
716*5113495bSYour Name 		goto exit;
717*5113495bSYour Name 
718*5113495bSYour Name 	/* Host receives 11AX wireless modes from target in service ext2
719*5113495bSYour Name 	 * message. Therefore, call target_if_add_11ax_modes() from service ext2
720*5113495bSYour Name 	 * event handler as well.
721*5113495bSYour Name 	 */
722*5113495bSYour Name 	if (!wmi_service_enabled(wmi_handle, wmi_service_ext2_msg))
723*5113495bSYour Name 		target_if_add_11ax_modes(psoc, tgt_hdl);
724*5113495bSYour Name 
725*5113495bSYour Name 	if (init_deinit_chainmask_table_alloc(
726*5113495bSYour Name 				&(info->service_ext_param)) ==
727*5113495bSYour Name 							QDF_STATUS_SUCCESS) {
728*5113495bSYour Name 		err_code = init_deinit_populate_chainmask_tables(wmi_handle,
729*5113495bSYour Name 				event,
730*5113495bSYour Name 				&(info->service_ext_param.chainmask_table[0]));
731*5113495bSYour Name 		if (err_code)
732*5113495bSYour Name 			goto exit;
733*5113495bSYour Name 	}
734*5113495bSYour Name 
735*5113495bSYour Name 	/* dbr_ring_caps can be absent if enough space is not available */
736*5113495bSYour Name 	if (info->service_ext_param.num_dbr_ring_caps) {
737*5113495bSYour Name 		err_code = init_deinit_populate_dbr_ring_cap(psoc, wmi_handle,
738*5113495bSYour Name 							     event, info);
739*5113495bSYour Name 		if (err_code)
740*5113495bSYour Name 			goto exit;
741*5113495bSYour Name 	}
742*5113495bSYour Name 
743*5113495bSYour Name 	err_code = init_deinit_populate_spectral_bin_scale_params(psoc,
744*5113495bSYour Name 								  wmi_handle,
745*5113495bSYour Name 								  event, info);
746*5113495bSYour Name 	if (err_code)
747*5113495bSYour Name 		goto exit;
748*5113495bSYour Name 
749*5113495bSYour Name 	legacy_callback = target_if_get_psoc_legacy_service_ready_cb();
750*5113495bSYour Name 	if (legacy_callback) {
751*5113495bSYour Name 		if (legacy_callback(wmi_service_ready_ext_event_id,
752*5113495bSYour Name 				    scn_handle, event, data_len)) {
753*5113495bSYour Name 			target_if_err("Error Code %d", err_code);
754*5113495bSYour Name 			goto exit;
755*5113495bSYour Name 		}
756*5113495bSYour Name 	}
757*5113495bSYour Name 
758*5113495bSYour Name 	target_if_set_twt_ap_pdev_count(info, tgt_hdl);
759*5113495bSYour Name 
760*5113495bSYour Name 	info->wlan_res_cfg.max_bssid_indicator =
761*5113495bSYour Name 				info->service_ext_param.max_bssid_indicator;
762*5113495bSYour Name 
763*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_ext2_msg)) {
764*5113495bSYour Name 		target_if_debug("Wait for EXT2 message");
765*5113495bSYour Name 	} else {
766*5113495bSYour Name 		target_if_debug("No EXT2 message, send init command");
767*5113495bSYour Name 		init_deinit_set_send_init_cmd(psoc, tgt_hdl);
768*5113495bSYour Name 	}
769*5113495bSYour Name 
770*5113495bSYour Name 	return 0;
771*5113495bSYour Name exit:
772*5113495bSYour Name 	info->wmi_ready = false;
773*5113495bSYour Name 	info->wmi_service_status = wmi_init_ext_processing_failed;
774*5113495bSYour Name 	init_deinit_wakeup_host_wait(psoc, tgt_hdl);
775*5113495bSYour Name 	return err_code;
776*5113495bSYour Name }
777*5113495bSYour Name 
init_deinit_service_available_handler(ol_scn_t scn_handle,uint8_t * event,uint32_t data_len)778*5113495bSYour Name static int init_deinit_service_available_handler(ol_scn_t scn_handle,
779*5113495bSYour Name 						uint8_t *event,
780*5113495bSYour Name 						uint32_t data_len)
781*5113495bSYour Name {
782*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
783*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
784*5113495bSYour Name 	struct wmi_unified *wmi_handle;
785*5113495bSYour Name 
786*5113495bSYour Name 	if (!scn_handle) {
787*5113495bSYour Name 		target_if_err("scn handle NULL");
788*5113495bSYour Name 		return -EINVAL;
789*5113495bSYour Name 	}
790*5113495bSYour Name 
791*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn_handle);
792*5113495bSYour Name 	if (!psoc) {
793*5113495bSYour Name 		target_if_err("psoc is null");
794*5113495bSYour Name 		return -EINVAL;
795*5113495bSYour Name 	}
796*5113495bSYour Name 
797*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
798*5113495bSYour Name 	if (!tgt_hdl) {
799*5113495bSYour Name 		target_if_err("target_psoc_info is null");
800*5113495bSYour Name 		return -EINVAL;
801*5113495bSYour Name 	}
802*5113495bSYour Name 
803*5113495bSYour Name 	wmi_handle = target_psoc_get_wmi_hdl(tgt_hdl);
804*5113495bSYour Name 
805*5113495bSYour Name 	if (wmi_save_ext_service_bitmap(wmi_handle, event, NULL) !=
806*5113495bSYour Name 					QDF_STATUS_SUCCESS) {
807*5113495bSYour Name 		target_if_err("Failed to save ext service bitmap");
808*5113495bSYour Name 		return -EINVAL;
809*5113495bSYour Name 	}
810*5113495bSYour Name 
811*5113495bSYour Name 	return 0;
812*5113495bSYour Name }
813*5113495bSYour Name 
814*5113495bSYour Name #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
init_deinit_mlo_capable(struct wlan_objmgr_psoc * psoc)815*5113495bSYour Name static bool init_deinit_mlo_capable(struct wlan_objmgr_psoc *psoc)
816*5113495bSYour Name {
817*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
818*5113495bSYour Name 
819*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
820*5113495bSYour Name 	if (!tgt_hdl) {
821*5113495bSYour Name 		target_if_err("target_psoc_info is null");
822*5113495bSYour Name 		return false;
823*5113495bSYour Name 	}
824*5113495bSYour Name 
825*5113495bSYour Name 	if ((tgt_hdl->tif_ops) &&
826*5113495bSYour Name 	    (tgt_hdl->tif_ops->mlo_capable))
827*5113495bSYour Name 		return tgt_hdl->tif_ops->mlo_capable(psoc);
828*5113495bSYour Name 
829*5113495bSYour Name 	return false;
830*5113495bSYour Name }
831*5113495bSYour Name 
init_deinit_mlo_get_group_id(struct wlan_objmgr_psoc * psoc,uint8_t * grp_id)832*5113495bSYour Name static bool init_deinit_mlo_get_group_id(struct wlan_objmgr_psoc *psoc,
833*5113495bSYour Name 					 uint8_t *grp_id)
834*5113495bSYour Name {
835*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
836*5113495bSYour Name 
837*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
838*5113495bSYour Name 	if (!tgt_hdl) {
839*5113495bSYour Name 		target_if_err("target_psoc_info is null");
840*5113495bSYour Name 		return false;
841*5113495bSYour Name 	}
842*5113495bSYour Name 
843*5113495bSYour Name 	if ((tgt_hdl->tif_ops) &&
844*5113495bSYour Name 	    (tgt_hdl->tif_ops->mlo_get_group_id)) {
845*5113495bSYour Name 		*grp_id = tgt_hdl->tif_ops->mlo_get_group_id(psoc);
846*5113495bSYour Name 		return true;
847*5113495bSYour Name 	}
848*5113495bSYour Name 
849*5113495bSYour Name 	return false;
850*5113495bSYour Name }
851*5113495bSYour Name 
init_deinit_mlo_update_soc_ready(struct wlan_objmgr_psoc * psoc)852*5113495bSYour Name static void init_deinit_mlo_update_soc_ready(struct wlan_objmgr_psoc *psoc)
853*5113495bSYour Name {
854*5113495bSYour Name 	uint8_t grp_id = 0;
855*5113495bSYour Name 
856*5113495bSYour Name 	if (init_deinit_mlo_capable(psoc)) {
857*5113495bSYour Name 		if (!init_deinit_mlo_get_group_id(psoc, &grp_id)) {
858*5113495bSYour Name 			target_if_err("Invalid MLD group id");
859*5113495bSYour Name 			return;
860*5113495bSYour Name 		}
861*5113495bSYour Name 		mlo_setup_update_soc_ready(psoc, grp_id);
862*5113495bSYour Name 	}
863*5113495bSYour Name }
864*5113495bSYour Name 
init_deinit_send_ml_link_ready(struct wlan_objmgr_psoc * psoc,void * object,void * arg)865*5113495bSYour Name static void init_deinit_send_ml_link_ready(struct wlan_objmgr_psoc *psoc,
866*5113495bSYour Name 					   void *object, void *arg)
867*5113495bSYour Name {
868*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = object;
869*5113495bSYour Name 	uint8_t grp_id = 0;
870*5113495bSYour Name 
871*5113495bSYour Name 	if (!init_deinit_mlo_capable(psoc))
872*5113495bSYour Name 		return;
873*5113495bSYour Name 
874*5113495bSYour Name 	qdf_assert_always(psoc);
875*5113495bSYour Name 	qdf_assert_always(pdev);
876*5113495bSYour Name 
877*5113495bSYour Name 	if (!init_deinit_mlo_get_group_id(psoc, &grp_id))
878*5113495bSYour Name 		qdf_assert_always(grp_id);
879*5113495bSYour Name 
880*5113495bSYour Name 	mlo_setup_link_ready(pdev, grp_id);
881*5113495bSYour Name }
882*5113495bSYour Name 
init_deinit_mlo_update_pdev_ready(struct wlan_objmgr_psoc * psoc,uint8_t num_radios)883*5113495bSYour Name static void init_deinit_mlo_update_pdev_ready(struct wlan_objmgr_psoc *psoc,
884*5113495bSYour Name 					      uint8_t num_radios)
885*5113495bSYour Name {
886*5113495bSYour Name 	if (!init_deinit_mlo_capable(psoc))
887*5113495bSYour Name 		return;
888*5113495bSYour Name 
889*5113495bSYour Name 	wlan_objmgr_iterate_obj_list(psoc, WLAN_PDEV_OP,
890*5113495bSYour Name 				     init_deinit_send_ml_link_ready,
891*5113495bSYour Name 				     NULL, 0, WLAN_INIT_DEINIT_ID);
892*5113495bSYour Name }
893*5113495bSYour Name 
894*5113495bSYour Name static void
init_deinit_pdev_wsi_stats_info_support(struct wmi_unified * wmi_handle,struct wlan_objmgr_psoc * psoc)895*5113495bSYour Name init_deinit_pdev_wsi_stats_info_support(struct wmi_unified *wmi_handle,
896*5113495bSYour Name 					struct wlan_objmgr_psoc *psoc)
897*5113495bSYour Name {
898*5113495bSYour Name 	bool wsi_stats_info_support = false;
899*5113495bSYour Name 
900*5113495bSYour Name 	if (!init_deinit_mlo_capable(psoc))
901*5113495bSYour Name 		return;
902*5113495bSYour Name 
903*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle,
904*5113495bSYour Name 				wmi_service_pdev_wsi_stats_info_support))
905*5113495bSYour Name 		wsi_stats_info_support = true;
906*5113495bSYour Name 
907*5113495bSYour Name 	mlo_update_wsi_stats_info_support(psoc, wsi_stats_info_support);
908*5113495bSYour Name }
909*5113495bSYour Name 
init_deinit_mlo_tsf_sync_support(struct wmi_unified * wmi_handle,struct wlan_objmgr_psoc * psoc)910*5113495bSYour Name static void init_deinit_mlo_tsf_sync_support(struct wmi_unified *wmi_handle,
911*5113495bSYour Name 					     struct wlan_objmgr_psoc *psoc)
912*5113495bSYour Name {
913*5113495bSYour Name 	bool mlo_tsf_sync_enab = false;
914*5113495bSYour Name 
915*5113495bSYour Name 	if (!init_deinit_mlo_capable(psoc))
916*5113495bSYour Name 		return;
917*5113495bSYour Name 
918*5113495bSYour Name 	if (wmi_service_enabled(wmi_handle, wmi_service_mlo_tsf_sync))
919*5113495bSYour Name 		mlo_tsf_sync_enab = true;
920*5113495bSYour Name 
921*5113495bSYour Name 	mlo_update_tsf_sync_support(psoc, mlo_tsf_sync_enab);
922*5113495bSYour Name }
923*5113495bSYour Name 
924*5113495bSYour Name #else
init_deinit_mlo_update_soc_ready(struct wlan_objmgr_psoc * psoc)925*5113495bSYour Name static void init_deinit_mlo_update_soc_ready(struct wlan_objmgr_psoc *psoc)
926*5113495bSYour Name {}
init_deinit_mlo_update_pdev_ready(struct wlan_objmgr_psoc * psoc,uint8_t num_radios)927*5113495bSYour Name static void init_deinit_mlo_update_pdev_ready(struct wlan_objmgr_psoc *psoc,
928*5113495bSYour Name 					      uint8_t num_radios)
929*5113495bSYour Name {}
930*5113495bSYour Name static void
init_deinit_pdev_wsi_stats_info_support(struct wmi_unified * wmi_handle,struct wlan_objmgr_psoc * psoc)931*5113495bSYour Name init_deinit_pdev_wsi_stats_info_support(struct wmi_unified *wmi_handle,
932*5113495bSYour Name 					struct wlan_objmgr_psoc *psoc)
933*5113495bSYour Name {}
init_deinit_mlo_tsf_sync_support(struct wmi_unified * wmi_handle,struct wlan_objmgr_psoc * psoc)934*5113495bSYour Name static void init_deinit_mlo_tsf_sync_support(struct wmi_unified *wmi_handle,
935*5113495bSYour Name 					     struct wlan_objmgr_psoc *psoc)
936*5113495bSYour Name {}
937*5113495bSYour Name #endif /*WLAN_FEATURE_11BE_MLO && WLAN_MLO_MULTI_CHIP*/
938*5113495bSYour Name 
939*5113495bSYour Name /* MAC address fourth byte index */
940*5113495bSYour Name #define MAC_BYTE_4 4
941*5113495bSYour Name 
init_deinit_ready_event_handler(ol_scn_t scn_handle,uint8_t * event,uint32_t data_len)942*5113495bSYour Name static int init_deinit_ready_event_handler(ol_scn_t scn_handle,
943*5113495bSYour Name 						uint8_t *event,
944*5113495bSYour Name 						uint32_t data_len)
945*5113495bSYour Name {
946*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
947*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev;
948*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
949*5113495bSYour Name 	struct wmi_unified *wmi_handle;
950*5113495bSYour Name 	struct wmi_host_fw_abi_ver fw_ver;
951*5113495bSYour Name 	uint8_t myaddr[QDF_MAC_ADDR_SIZE];
952*5113495bSYour Name 	struct tgt_info *info;
953*5113495bSYour Name 	struct wmi_host_ready_ev_param ready_ev;
954*5113495bSYour Name 	wmi_legacy_service_ready_callback legacy_callback;
955*5113495bSYour Name 	uint8_t num_radios, i;
956*5113495bSYour Name 	uint32_t max_peers;
957*5113495bSYour Name 	uint32_t max_ast_index;
958*5113495bSYour Name 	target_resource_config *tgt_cfg;
959*5113495bSYour Name 
960*5113495bSYour Name 	if (!scn_handle) {
961*5113495bSYour Name 		target_if_err("scn handle NULL");
962*5113495bSYour Name 		return -EINVAL;
963*5113495bSYour Name 	}
964*5113495bSYour Name 
965*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn_handle);
966*5113495bSYour Name 	if (!psoc) {
967*5113495bSYour Name 		target_if_err("psoc is null");
968*5113495bSYour Name 		return -EINVAL;
969*5113495bSYour Name 	}
970*5113495bSYour Name 
971*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
972*5113495bSYour Name 	if (!tgt_hdl) {
973*5113495bSYour Name 		target_if_err("target_psoc_info is null");
974*5113495bSYour Name 		return -EINVAL;
975*5113495bSYour Name 	}
976*5113495bSYour Name 
977*5113495bSYour Name 	wmi_handle = target_psoc_get_wmi_hdl(tgt_hdl);
978*5113495bSYour Name 	info = (&tgt_hdl->info);
979*5113495bSYour Name 
980*5113495bSYour Name 	if (wmi_extract_fw_abi_version(wmi_handle, event, &fw_ver) ==
981*5113495bSYour Name 				QDF_STATUS_SUCCESS) {
982*5113495bSYour Name 		info->version.wlan_ver = fw_ver.sw_version;
983*5113495bSYour Name 		info->version.wlan_ver = fw_ver.abi_version;
984*5113495bSYour Name 	}
985*5113495bSYour Name 
986*5113495bSYour Name 	if (wmi_check_and_update_fw_version(wmi_handle, event) < 0) {
987*5113495bSYour Name 		target_if_err("Version mismatch with FW");
988*5113495bSYour Name 		return -EINVAL;
989*5113495bSYour Name 	}
990*5113495bSYour Name 
991*5113495bSYour Name 	if (wmi_extract_ready_event_params(wmi_handle, event, &ready_ev) !=
992*5113495bSYour Name 				QDF_STATUS_SUCCESS) {
993*5113495bSYour Name 		target_if_err("Failed to extract ready event");
994*5113495bSYour Name 		return -EINVAL;
995*5113495bSYour Name 	}
996*5113495bSYour Name 
997*5113495bSYour Name 	if (!ready_ev.agile_capability)
998*5113495bSYour Name 		target_if_err("agile capability disabled in HW");
999*5113495bSYour Name 	else
1000*5113495bSYour Name 		info->wlan_res_cfg.agile_capability = ready_ev.agile_capability;
1001*5113495bSYour Name 
1002*5113495bSYour Name 	if (ready_ev.num_max_active_vdevs) {
1003*5113495bSYour Name 		if (ready_ev.num_max_active_vdevs <
1004*5113495bSYour Name 		    info->wlan_res_cfg.num_max_active_vdevs) {
1005*5113495bSYour Name 			target_if_err("unexpected num_max_active_vdevs fw %d host %d",
1006*5113495bSYour Name 				      ready_ev.num_max_active_vdevs,
1007*5113495bSYour Name 				      info->wlan_res_cfg.num_max_active_vdevs);
1008*5113495bSYour Name 			info->wlan_res_cfg.num_max_active_vdevs =
1009*5113495bSYour Name 					ready_ev.num_max_active_vdevs;
1010*5113495bSYour Name 		}
1011*5113495bSYour Name 	}
1012*5113495bSYour Name 
1013*5113495bSYour Name 	/* Indicate to the waiting thread that the ready
1014*5113495bSYour Name 	 * event was received
1015*5113495bSYour Name 	 */
1016*5113495bSYour Name 	info->wlan_init_status = wmi_ready_extract_init_status(
1017*5113495bSYour Name 						wmi_handle, event);
1018*5113495bSYour Name 
1019*5113495bSYour Name 	legacy_callback = target_if_get_psoc_legacy_service_ready_cb();
1020*5113495bSYour Name 	if (legacy_callback)
1021*5113495bSYour Name 		if (legacy_callback(wmi_ready_event_id,
1022*5113495bSYour Name 				    scn_handle, event, data_len)) {
1023*5113495bSYour Name 			target_if_err("Legacy callback returned error!");
1024*5113495bSYour Name 			tgt_hdl->info.wmi_ready = false;
1025*5113495bSYour Name 			goto exit;
1026*5113495bSYour Name 		}
1027*5113495bSYour Name 
1028*5113495bSYour Name 	init_deinit_mlo_update_soc_ready(psoc);
1029*5113495bSYour Name 
1030*5113495bSYour Name 	num_radios = target_psoc_get_num_radios(tgt_hdl);
1031*5113495bSYour Name 
1032*5113495bSYour Name 	if ((ready_ev.num_total_peer != 0) &&
1033*5113495bSYour Name 	    (info->wlan_res_cfg.num_peers != ready_ev.num_total_peer)) {
1034*5113495bSYour Name 		uint16_t num_peers = 0;
1035*5113495bSYour Name 		/* FW allocated number of peers is different than host
1036*5113495bSYour Name 		 * requested. Update host max with FW reported value.
1037*5113495bSYour Name 		 */
1038*5113495bSYour Name 		target_if_err("Host Requested %d peers. FW Supports %d peers",
1039*5113495bSYour Name 			       info->wlan_res_cfg.num_peers,
1040*5113495bSYour Name 			       ready_ev.num_total_peer);
1041*5113495bSYour Name 		info->wlan_res_cfg.num_peers = ready_ev.num_total_peer;
1042*5113495bSYour Name 		num_peers = info->wlan_res_cfg.num_peers / num_radios;
1043*5113495bSYour Name 
1044*5113495bSYour Name 		for (i = 0; i < num_radios; i++) {
1045*5113495bSYour Name 			pdev = wlan_objmgr_get_pdev_by_id(psoc, i,
1046*5113495bSYour Name 							  WLAN_INIT_DEINIT_ID);
1047*5113495bSYour Name 			if (!pdev) {
1048*5113495bSYour Name 				target_if_err(" PDEV %d is NULL", i);
1049*5113495bSYour Name 				return -EINVAL;
1050*5113495bSYour Name 			}
1051*5113495bSYour Name 
1052*5113495bSYour Name 			wlan_pdev_set_max_peer_count(pdev, num_peers);
1053*5113495bSYour Name 			wlan_objmgr_pdev_release_ref(pdev, WLAN_INIT_DEINIT_ID);
1054*5113495bSYour Name 		}
1055*5113495bSYour Name 
1056*5113495bSYour Name 		wlan_psoc_set_max_peer_count(psoc,
1057*5113495bSYour Name 					     info->wlan_res_cfg.num_peers);
1058*5113495bSYour Name 	}
1059*5113495bSYour Name 
1060*5113495bSYour Name 	/* for non legacy  num_total_peer will be non zero
1061*5113495bSYour Name 	 * allocate peer memory in this case
1062*5113495bSYour Name 	 */
1063*5113495bSYour Name 	if (ready_ev.num_total_peer != 0) {
1064*5113495bSYour Name 		tgt_cfg = &info->wlan_res_cfg;
1065*5113495bSYour Name 		max_peers = tgt_cfg->num_peers + ready_ev.num_extra_peer + 1;
1066*5113495bSYour Name 		max_ast_index = ready_ev.max_ast_index + 1;
1067*5113495bSYour Name 
1068*5113495bSYour Name 		if (cdp_peer_map_attach(wlan_psoc_get_dp_handle(psoc),
1069*5113495bSYour Name 					max_peers, max_ast_index,
1070*5113495bSYour Name 					tgt_cfg->peer_map_unmap_version) !=
1071*5113495bSYour Name 				QDF_STATUS_SUCCESS) {
1072*5113495bSYour Name 			target_if_err("DP peer map attach failed");
1073*5113495bSYour Name 			return -EINVAL;
1074*5113495bSYour Name 		}
1075*5113495bSYour Name 	}
1076*5113495bSYour Name 
1077*5113495bSYour Name 
1078*5113495bSYour Name 	if (ready_ev.pktlog_defs_checksum) {
1079*5113495bSYour Name 		for (i = 0; i < num_radios; i++) {
1080*5113495bSYour Name 			pdev = wlan_objmgr_get_pdev_by_id(psoc, i,
1081*5113495bSYour Name 							  WLAN_INIT_DEINIT_ID);
1082*5113495bSYour Name 			if (!pdev) {
1083*5113495bSYour Name 				target_if_err(" PDEV %d is NULL", i);
1084*5113495bSYour Name 				return -EINVAL;
1085*5113495bSYour Name 			}
1086*5113495bSYour Name 			target_if_set_pktlog_checksum(pdev, tgt_hdl,
1087*5113495bSYour Name 						      ready_ev.
1088*5113495bSYour Name 						      pktlog_defs_checksum);
1089*5113495bSYour Name 			wlan_objmgr_pdev_release_ref(pdev, WLAN_INIT_DEINIT_ID);
1090*5113495bSYour Name 		}
1091*5113495bSYour Name 	}
1092*5113495bSYour Name 
1093*5113495bSYour Name 	/*
1094*5113495bSYour Name 	 * For non-legacy HW, MAC addr list is extracted.
1095*5113495bSYour Name 	 */
1096*5113495bSYour Name 	if (num_radios > 1) {
1097*5113495bSYour Name 		uint8_t num_mac_addr;
1098*5113495bSYour Name 		wmi_host_mac_addr *addr_list;
1099*5113495bSYour Name 		int i;
1100*5113495bSYour Name 
1101*5113495bSYour Name 		addr_list = wmi_ready_extract_mac_addr_list(wmi_handle, event,
1102*5113495bSYour Name 							    &num_mac_addr);
1103*5113495bSYour Name 		if ((num_mac_addr >= num_radios) && (addr_list)) {
1104*5113495bSYour Name 			for (i = 0; i < num_radios; i++) {
1105*5113495bSYour Name 				WMI_HOST_MAC_ADDR_TO_CHAR_ARRAY(&addr_list[i],
1106*5113495bSYour Name 								myaddr);
1107*5113495bSYour Name 				pdev = wlan_objmgr_get_pdev_by_id(psoc, i,
1108*5113495bSYour Name 								  WLAN_INIT_DEINIT_ID);
1109*5113495bSYour Name 				if (!pdev) {
1110*5113495bSYour Name 					target_if_err(" PDEV %d is NULL", i);
1111*5113495bSYour Name 					return -EINVAL;
1112*5113495bSYour Name 				}
1113*5113495bSYour Name 				wlan_pdev_set_hw_macaddr(pdev, myaddr);
1114*5113495bSYour Name 				wlan_objmgr_pdev_release_ref(pdev,
1115*5113495bSYour Name 							WLAN_INIT_DEINIT_ID);
1116*5113495bSYour Name 
1117*5113495bSYour Name 				/* assign 1st radio addr to psoc */
1118*5113495bSYour Name 				if (i == 0)
1119*5113495bSYour Name 					wlan_psoc_set_hw_macaddr(psoc, myaddr);
1120*5113495bSYour Name 			}
1121*5113495bSYour Name 			goto out;
1122*5113495bSYour Name 		} else {
1123*5113495bSYour Name 			target_if_err("Using default MAC addr for all radios..");
1124*5113495bSYour Name 		}
1125*5113495bSYour Name 	}
1126*5113495bSYour Name 
1127*5113495bSYour Name 	/*
1128*5113495bSYour Name 	 * We extract single MAC address in two scenarios:
1129*5113495bSYour Name 	 * 1. In non-legacy case, if addr list is NULL or num_mac_addr < num_radios
1130*5113495bSYour Name 	 * 2. In all legacy cases
1131*5113495bSYour Name 	 */
1132*5113495bSYour Name 	for (i = 0; i < num_radios; i++) {
1133*5113495bSYour Name 		wmi_ready_extract_mac_addr(wmi_handle, event, myaddr);
1134*5113495bSYour Name 		myaddr[MAC_BYTE_4] += i;
1135*5113495bSYour Name 		pdev = wlan_objmgr_get_pdev_by_id(psoc, i, WLAN_INIT_DEINIT_ID);
1136*5113495bSYour Name 		if (!pdev) {
1137*5113495bSYour Name 			target_if_err(" PDEV %d is NULL", i);
1138*5113495bSYour Name 			return -EINVAL;
1139*5113495bSYour Name 		}
1140*5113495bSYour Name 		wlan_pdev_set_hw_macaddr(pdev, myaddr);
1141*5113495bSYour Name 		wlan_objmgr_pdev_release_ref(pdev, WLAN_INIT_DEINIT_ID);
1142*5113495bSYour Name 		/* assign 1st radio addr to psoc */
1143*5113495bSYour Name 		if (i == 0)
1144*5113495bSYour Name 			wlan_psoc_set_hw_macaddr(psoc, myaddr);
1145*5113495bSYour Name 	}
1146*5113495bSYour Name 
1147*5113495bSYour Name out:
1148*5113495bSYour Name 	target_if_btcoex_cfg_enable(psoc, tgt_hdl, event);
1149*5113495bSYour Name 	tgt_hdl->info.wmi_ready = true;
1150*5113495bSYour Name 	init_deinit_mlo_update_pdev_ready(psoc, num_radios);
1151*5113495bSYour Name exit:
1152*5113495bSYour Name 	init_deinit_wakeup_host_wait(psoc, tgt_hdl);
1153*5113495bSYour Name 
1154*5113495bSYour Name 	return 0;
1155*5113495bSYour Name }
1156*5113495bSYour Name 
1157*5113495bSYour Name #ifdef HEALTH_MON_SUPPORT
init_deinit_health_mon_event_handler(ol_scn_t scn_handle,uint8_t * event,uint32_t data_len)1158*5113495bSYour Name static int init_deinit_health_mon_event_handler(ol_scn_t scn_handle,
1159*5113495bSYour Name 						uint8_t *event,
1160*5113495bSYour Name 						uint32_t data_len)
1161*5113495bSYour Name {
1162*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
1163*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
1164*5113495bSYour Name 	struct wmi_unified *wmi_handle;
1165*5113495bSYour Name 	struct tgt_info *info;
1166*5113495bSYour Name 	struct wmi_health_mon_params *param;
1167*5113495bSYour Name 
1168*5113495bSYour Name 	if (!scn_handle) {
1169*5113495bSYour Name 		target_if_err("scn handle NULL");
1170*5113495bSYour Name 		return -EINVAL;
1171*5113495bSYour Name 	}
1172*5113495bSYour Name 
1173*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn_handle);
1174*5113495bSYour Name 	if (!psoc) {
1175*5113495bSYour Name 		target_if_err("psoc is null");
1176*5113495bSYour Name 		return -EINVAL;
1177*5113495bSYour Name 	}
1178*5113495bSYour Name 
1179*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
1180*5113495bSYour Name 	if (!tgt_hdl) {
1181*5113495bSYour Name 		target_if_err("target_psoc_info is null");
1182*5113495bSYour Name 		return -EINVAL;
1183*5113495bSYour Name 	}
1184*5113495bSYour Name 
1185*5113495bSYour Name 	wmi_handle = target_psoc_get_wmi_hdl(tgt_hdl);
1186*5113495bSYour Name 	info = (&tgt_hdl->info);
1187*5113495bSYour Name 
1188*5113495bSYour Name 	param = (&info->health_mon_param);
1189*5113495bSYour Name 	wmi_extract_health_mon_event(wmi_handle, event, param);
1190*5113495bSYour Name 
1191*5113495bSYour Name 	return 0;
1192*5113495bSYour Name }
1193*5113495bSYour Name #endif /* HEALTH_MON_SUPPORT */
1194*5113495bSYour Name 
1195*5113495bSYour Name #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
init_deinit_mlo_setup_done_event(struct wlan_objmgr_psoc * psoc)1196*5113495bSYour Name static void init_deinit_mlo_setup_done_event(struct wlan_objmgr_psoc *psoc)
1197*5113495bSYour Name {
1198*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
1199*5113495bSYour Name 
1200*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
1201*5113495bSYour Name 	if (!tgt_hdl) {
1202*5113495bSYour Name 		target_if_err("target_psoc_info is null");
1203*5113495bSYour Name 		return;
1204*5113495bSYour Name 	}
1205*5113495bSYour Name 
1206*5113495bSYour Name 	if ((tgt_hdl->tif_ops) &&
1207*5113495bSYour Name 	    (tgt_hdl->tif_ops->mlo_setup_done_event))
1208*5113495bSYour Name 		tgt_hdl->tif_ops->mlo_setup_done_event(psoc);
1209*5113495bSYour Name }
1210*5113495bSYour Name 
init_deinit_mlo_setup_comp_event_handler(ol_scn_t scn_handle,uint8_t * event,uint32_t data_len)1211*5113495bSYour Name static int init_deinit_mlo_setup_comp_event_handler(ol_scn_t scn_handle,
1212*5113495bSYour Name 						    uint8_t *event,
1213*5113495bSYour Name 						    uint32_t data_len)
1214*5113495bSYour Name {
1215*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
1216*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev;
1217*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
1218*5113495bSYour Name 	struct wmi_unified *wmi_handle;
1219*5113495bSYour Name 	struct wmi_mlo_setup_complete_params params;
1220*5113495bSYour Name 	uint8_t grp_id = 0;
1221*5113495bSYour Name 
1222*5113495bSYour Name 	if (!scn_handle) {
1223*5113495bSYour Name 		target_if_err("scn handle NULL");
1224*5113495bSYour Name 		return -EINVAL;
1225*5113495bSYour Name 	}
1226*5113495bSYour Name 
1227*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn_handle);
1228*5113495bSYour Name 
1229*5113495bSYour Name 	if (!psoc) {
1230*5113495bSYour Name 		target_if_err("psoc is null");
1231*5113495bSYour Name 		return -EINVAL;
1232*5113495bSYour Name 	}
1233*5113495bSYour Name 
1234*5113495bSYour Name 	if (!init_deinit_mlo_get_group_id(psoc, &grp_id)) {
1235*5113495bSYour Name 		target_if_err("Invalid MLD group id");
1236*5113495bSYour Name 		return -EINVAL;
1237*5113495bSYour Name 	}
1238*5113495bSYour Name 
1239*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
1240*5113495bSYour Name 
1241*5113495bSYour Name 	if (!tgt_hdl) {
1242*5113495bSYour Name 		target_if_err("target_psoc_info is null");
1243*5113495bSYour Name 		return -EINVAL;
1244*5113495bSYour Name 	}
1245*5113495bSYour Name 
1246*5113495bSYour Name 	wmi_handle = target_psoc_get_wmi_hdl(tgt_hdl);
1247*5113495bSYour Name 
1248*5113495bSYour Name 	if (wmi_extract_mlo_setup_cmpl_event(wmi_handle, event, &params) !=
1249*5113495bSYour Name 			QDF_STATUS_SUCCESS)
1250*5113495bSYour Name 		return -EINVAL;
1251*5113495bSYour Name 
1252*5113495bSYour Name 	pdev = wlan_objmgr_get_pdev_by_id(psoc, params.pdev_id,
1253*5113495bSYour Name 					  WLAN_INIT_DEINIT_ID);
1254*5113495bSYour Name 
1255*5113495bSYour Name 	if (mlo_ap_update_max_ml_peer_ids(
1256*5113495bSYour Name 				params.pdev_id, params.max_ml_peer_ids)
1257*5113495bSYour Name 			!= QDF_STATUS_SUCCESS) {
1258*5113495bSYour Name 		target_if_err("max_ml_peer_ids update failed for pdev_id: %d",
1259*5113495bSYour Name 			      params.pdev_id);
1260*5113495bSYour Name 	}
1261*5113495bSYour Name 
1262*5113495bSYour Name 	if (pdev) {
1263*5113495bSYour Name 		mlo_link_setup_complete(pdev, grp_id);
1264*5113495bSYour Name 		wlan_objmgr_pdev_release_ref(pdev, WLAN_INIT_DEINIT_ID);
1265*5113495bSYour Name 	}
1266*5113495bSYour Name 
1267*5113495bSYour Name 	init_deinit_mlo_setup_done_event(psoc);
1268*5113495bSYour Name 
1269*5113495bSYour Name 	return 0;
1270*5113495bSYour Name }
1271*5113495bSYour Name 
init_deinit_mlo_teardown_comp_event_handler(ol_scn_t scn_handle,uint8_t * event,uint32_t data_len)1272*5113495bSYour Name static int init_deinit_mlo_teardown_comp_event_handler(ol_scn_t scn_handle,
1273*5113495bSYour Name 						       uint8_t *event,
1274*5113495bSYour Name 						       uint32_t data_len)
1275*5113495bSYour Name {
1276*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
1277*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev;
1278*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
1279*5113495bSYour Name 	struct wmi_unified *wmi_handle;
1280*5113495bSYour Name 	struct wmi_mlo_teardown_cmpl_params params;
1281*5113495bSYour Name 	uint8_t grp_id = 0;
1282*5113495bSYour Name 
1283*5113495bSYour Name 	if (!scn_handle) {
1284*5113495bSYour Name 		target_if_err("scn handle NULL");
1285*5113495bSYour Name 		return -EINVAL;
1286*5113495bSYour Name 	}
1287*5113495bSYour Name 
1288*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(scn_handle);
1289*5113495bSYour Name 	if (!psoc) {
1290*5113495bSYour Name 		target_if_err("psoc is null");
1291*5113495bSYour Name 		return -EINVAL;
1292*5113495bSYour Name 	}
1293*5113495bSYour Name 
1294*5113495bSYour Name 	if (!init_deinit_mlo_get_group_id(psoc, &grp_id)) {
1295*5113495bSYour Name 		target_if_err("Invalid MLD group id");
1296*5113495bSYour Name 		return -EINVAL;
1297*5113495bSYour Name 	}
1298*5113495bSYour Name 
1299*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
1300*5113495bSYour Name 	if (!tgt_hdl) {
1301*5113495bSYour Name 		target_if_err("target_psoc_info is null");
1302*5113495bSYour Name 		return -EINVAL;
1303*5113495bSYour Name 	}
1304*5113495bSYour Name 	wmi_handle = target_psoc_get_wmi_hdl(tgt_hdl);
1305*5113495bSYour Name 
1306*5113495bSYour Name 	if (wmi_extract_mlo_teardown_cmpl_event(wmi_handle, event, &params) !=
1307*5113495bSYour Name 			QDF_STATUS_SUCCESS)
1308*5113495bSYour Name 		return -EINVAL;
1309*5113495bSYour Name 
1310*5113495bSYour Name 	pdev = wlan_objmgr_get_pdev_by_id(psoc, params.pdev_id,
1311*5113495bSYour Name 					  WLAN_INIT_DEINIT_ID);
1312*5113495bSYour Name 	if (pdev) {
1313*5113495bSYour Name 		mlo_link_teardown_complete(pdev, grp_id);
1314*5113495bSYour Name 		wlan_objmgr_pdev_release_ref(pdev, WLAN_INIT_DEINIT_ID);
1315*5113495bSYour Name 	}
1316*5113495bSYour Name 
1317*5113495bSYour Name 	return 0;
1318*5113495bSYour Name }
1319*5113495bSYour Name 
init_deinit_register_mlo_ev_handlers(wmi_unified_t wmi_handle)1320*5113495bSYour Name static QDF_STATUS init_deinit_register_mlo_ev_handlers(wmi_unified_t wmi_handle)
1321*5113495bSYour Name {
1322*5113495bSYour Name 	wmi_unified_register_event(wmi_handle,
1323*5113495bSYour Name 				   wmi_mlo_setup_complete_event_id,
1324*5113495bSYour Name 				   init_deinit_mlo_setup_comp_event_handler);
1325*5113495bSYour Name 	wmi_unified_register_event(wmi_handle,
1326*5113495bSYour Name 				   wmi_mlo_teardown_complete_event_id,
1327*5113495bSYour Name 				   init_deinit_mlo_teardown_comp_event_handler);
1328*5113495bSYour Name 
1329*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1330*5113495bSYour Name }
1331*5113495bSYour Name #else
init_deinit_register_mlo_ev_handlers(wmi_unified_t wmi_handle)1332*5113495bSYour Name static QDF_STATUS init_deinit_register_mlo_ev_handlers(wmi_unified_t wmi_handle)
1333*5113495bSYour Name {
1334*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1335*5113495bSYour Name }
1336*5113495bSYour Name #endif /*WLAN_FEATURE_11BE_MLO && WLAN_MLO_MULTI_CHIP*/
1337*5113495bSYour Name 
init_deinit_register_tgt_psoc_ev_handlers(struct wlan_objmgr_psoc * psoc)1338*5113495bSYour Name QDF_STATUS init_deinit_register_tgt_psoc_ev_handlers(
1339*5113495bSYour Name 				struct wlan_objmgr_psoc *psoc)
1340*5113495bSYour Name {
1341*5113495bSYour Name 	struct target_psoc_info *tgt_hdl;
1342*5113495bSYour Name 	wmi_unified_t wmi_handle;
1343*5113495bSYour Name 	QDF_STATUS retval = QDF_STATUS_SUCCESS;
1344*5113495bSYour Name 
1345*5113495bSYour Name 	if (!psoc) {
1346*5113495bSYour Name 		target_if_err("psoc is null in register wmi handler");
1347*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1348*5113495bSYour Name 	}
1349*5113495bSYour Name 
1350*5113495bSYour Name 	tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
1351*5113495bSYour Name 	if (!tgt_hdl) {
1352*5113495bSYour Name 		target_if_err("target_psoc_info null in register wmi hadler");
1353*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1354*5113495bSYour Name 	}
1355*5113495bSYour Name 
1356*5113495bSYour Name 	wmi_handle = (wmi_unified_t)target_psoc_get_wmi_hdl(tgt_hdl);
1357*5113495bSYour Name 
1358*5113495bSYour Name 	retval = wmi_unified_register_event_handler(wmi_handle,
1359*5113495bSYour Name 				wmi_service_ready_event_id,
1360*5113495bSYour Name 				init_deinit_service_ready_event_handler,
1361*5113495bSYour Name 				WMI_RX_WORK_CTX);
1362*5113495bSYour Name 	retval = wmi_unified_register_event_handler(wmi_handle,
1363*5113495bSYour Name 				wmi_service_ready_ext_event_id,
1364*5113495bSYour Name 				init_deinit_service_ext_ready_event_handler,
1365*5113495bSYour Name 				WMI_RX_WORK_CTX);
1366*5113495bSYour Name 	retval = wmi_unified_register_event_handler(wmi_handle,
1367*5113495bSYour Name 				wmi_service_available_event_id,
1368*5113495bSYour Name 				init_deinit_service_available_handler,
1369*5113495bSYour Name 				WMI_RX_UMAC_CTX);
1370*5113495bSYour Name 	retval = wmi_unified_register_event_handler(wmi_handle,
1371*5113495bSYour Name 				wmi_ready_event_id,
1372*5113495bSYour Name 				init_deinit_ready_event_handler,
1373*5113495bSYour Name 				WMI_RX_WORK_CTX);
1374*5113495bSYour Name 	retval = wmi_unified_register_event_handler(
1375*5113495bSYour Name 				wmi_handle,
1376*5113495bSYour Name 				wmi_service_ready_ext2_event_id,
1377*5113495bSYour Name 				init_deinit_service_ext2_ready_event_handler,
1378*5113495bSYour Name 				WMI_RX_WORK_CTX);
1379*5113495bSYour Name 	retval = init_deinit_register_mlo_ev_handlers(wmi_handle);
1380*5113495bSYour Name 
1381*5113495bSYour Name #ifdef HEALTH_MON_SUPPORT
1382*5113495bSYour Name 	retval = wmi_unified_register_event_handler(
1383*5113495bSYour Name 				wmi_handle,
1384*5113495bSYour Name 				wmi_extract_health_mon_init_done_info_eventid,
1385*5113495bSYour Name 				init_deinit_health_mon_event_handler,
1386*5113495bSYour Name 				WMI_RX_WORK_CTX);
1387*5113495bSYour Name #endif /* HEALTH_MON_SUPPORT */
1388*5113495bSYour Name 
1389*5113495bSYour Name 	return retval;
1390*5113495bSYour Name }
1391*5113495bSYour Name 
1392