xref: /wlan-dirver/qcacld-3.0/core/sme/src/csr/csr_inside_api.h (revision d1e852ef3271bee3c7f0839f8bb34296970a4750)
1 /*
2  * Copyright (c) 2011-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /*
21  * DOC: csr_inside_api.h
22  *
23  * Define interface only used by CSR.
24  */
25 #ifndef CSR_INSIDE_API_H__
26 #define CSR_INSIDE_API_H__
27 
28 #include "csr_support.h"
29 #include "sme_inside.h"
30 #include "cds_reg_service.h"
31 #include "wlan_objmgr_vdev_obj.h"
32 
33 bool csr_is_supported_channel(struct mac_context *mac, uint32_t chan_freq);
34 
35 enum csr_sap_response_type {
36 	CSR_SAP_START_BSS_SUCCESS,
37 	CSR_SAP_START_BSS_FAILURE,
38 	CSR_SAP_STOP_BSS_SUCCESS,
39 	CSR_SAP_STOP_BSS_FAILURE,
40 };
41 
42 struct tag_csrscan_result {
43 	tListElem Link;
44 	/* Preferred Encryption type that matched with profile. */
45 	eCsrEncryptionType ucEncryptionType;
46 	eCsrEncryptionType mcEncryptionType;
47 	/* Preferred auth type that matched with the profile. */
48 	enum csr_akm_type authType;
49 
50 	tCsrScanResultInfo Result;
51 	/*
52 	 * WARNING - Do not add any element here
53 	 * This member Result must be the last in the structure because the end
54 	 * of struct bss_description (inside) is an array with nonknown size at
55 	 * this time.
56 	 */
57 };
58 
59 struct scan_result_list {
60 	tDblLinkList List;
61 	tListElem *pCurEntry;
62 };
63 
64 #define CSR_IS_WAIT_FOR_KEY(mac, sessionId) \
65 		 (CSR_IS_ROAM_JOINED(mac, sessionId) && \
66 		  CSR_IS_ROAM_SUBSTATE_WAITFORKEY(mac, sessionId))
67 
68 enum csr_roam_state csr_roam_state_change(struct mac_context *mac,
69 					  enum csr_roam_state NewRoamState,
70 					  uint8_t sessionId);
71 void csr_roaming_state_msg_processor(struct mac_context *mac, void *msg_buf);
72 void csr_roam_joined_state_msg_processor(struct mac_context *mac,
73 					 void *msg_buf);
74 
75 void csr_release_command_roam(struct mac_context *mac, tSmeCmd *pCommand);
76 void csr_release_command_wm_status_change(struct mac_context *mac,
77 					  tSmeCmd *pCommand);
78 QDF_STATUS csr_scan_open(struct mac_context *mac);
79 QDF_STATUS csr_scan_close(struct mac_context *mac);
80 
81 void csr_free_scan_result_entry(struct mac_context *mac, struct tag_csrscan_result
82 				*pResult);
83 
84 QDF_STATUS csr_roam_call_callback(struct mac_context *mac, uint32_t sessionId,
85 				  struct csr_roam_info *roam_info,
86 				  eRoamCmdStatus u1, eCsrRoamResult u2);
87 void csr_roam_complete(struct mac_context *mac, uint8_t session_id);
88 
89 /**
90  * csr_issue_set_context_req_helper  - Function to fill unicast/broadcast keys
91  * request to set the keys to fw
92  * @mac_ctx:     Pointer to mac context
93  * @vdev_id:     vdev id
94  * @bssid:       Connected BSSID
95  * @addkey:      Is add key request to crypto
96  * @unicast:     Unicast(1) or broadcast key(0)
97  * @key_id:      Key index
98  *
99  * Return: QDF_STATUS
100  */
101 QDF_STATUS
102 csr_issue_set_context_req_helper(struct mac_context *mac_ctx,
103 				 uint32_t vdev_id, tSirMacAddr *bssid,
104 				 bool addkey, bool unicast, uint8_t key_id);
105 
106 void csr_roam_check_for_link_status_change(struct mac_context *mac,
107 					tSirSmeRsp *pSirMsg);
108 QDF_STATUS csr_send_mb_disassoc_req_msg(struct mac_context *mac, uint32_t sessionId,
109 					tSirMacAddr bssId, uint16_t reasonCode);
110 QDF_STATUS csr_send_mb_deauth_req_msg(struct mac_context *mac, uint32_t sessionId,
111 				      tSirMacAddr bssId, uint16_t reasonCode);
112 QDF_STATUS csr_send_mb_disassoc_cnf_msg(struct mac_context *mac,
113 					struct disassoc_ind *pDisassocInd);
114 QDF_STATUS csr_send_mb_deauth_cnf_msg(struct mac_context *mac,
115 				      struct deauth_ind *pDeauthInd);
116 QDF_STATUS csr_send_assoc_cnf_msg(struct mac_context *mac,
117 				  struct assoc_ind *pAssocInd,
118 				  QDF_STATUS status,
119 				  enum wlan_status_code mac_status_code);
120 /**
121  * csr_get_cfg_valid_channels() - Get valid channel frequency list
122  * @mac: mac context
123  * @ch_freq_list: valid channel frequencies
124  * @num_ch_freq: valid channel number
125  *
126  * This function returns the valid channel frequencies.
127  *
128  * Return: QDF_STATUS_SUCCESS for success.
129  */
130 QDF_STATUS csr_get_cfg_valid_channels(struct mac_context *mac,
131 				      uint32_t *ch_freq_list,
132 				      uint32_t *num_ch_freq);
133 
134 enum csr_cfgdot11mode
135 csr_get_cfg_dot11_mode_from_csr_phy_mode(bool is_ap, eCsrPhyMode phyMode);
136 
137 uint32_t csr_translate_to_wni_cfg_dot11_mode(struct mac_context *mac,
138 				    enum csr_cfgdot11mode csrDot11Mode);
139 void csr_save_channel_power_for_band(struct mac_context *mac, bool fPopulate5GBand);
140 void csr_apply_channel_power_info_to_fw(struct mac_context *mac,
141 					struct csr_channel *pChannelList);
142 void csr_apply_power2_current(struct mac_context *mac);
143 void csr_apply_channel_power_info_wrapper(struct mac_context *mac);
144 QDF_STATUS csr_save_to_channel_power2_g_5_g(struct mac_context *mac,
145 					uint32_t tableSize,
146 					struct pwr_channel_info *channelTable);
147 
148 /*
149  * csr_prepare_vdev_delete() - CSR api to delete vdev
150  * @mac_ctx: pointer to mac context
151  * @vdev: vdev object to be prepared for deletion.
152  *
153  * Return QDF_STATUS
154  */
155 QDF_STATUS csr_prepare_vdev_delete(struct mac_context *mac_ctx,
156 				   struct wlan_objmgr_vdev *vdev);
157 
158 /*
159  * csr_cleanup_vdev_session() - CSR api to cleanup vdev
160  * @mac_ctx: pointer to mac context
161  * @vdev_id: vdev id to be deleted.
162  *
163  * This API is used to clean up vdev information gathered during
164  * vdev was enabled.
165  *
166  * Return QDF_STATUS
167  */
168 void csr_cleanup_vdev_session(struct mac_context *mac, uint8_t vdev_id);
169 
170 QDF_STATUS csr_roam_get_session_id_from_bssid(struct mac_context *mac,
171 						struct qdf_mac_addr *bssid,
172 					      uint32_t *pSessionId);
173 
174 /*
175  * csr_scan_get_result() - Return scan results based on filter
176  * @mac: Pointer to Global MAC structure
177  * @filter: If pFilter is NULL, all cached results are returned
178  * @phResult: an object for the result.
179  *
180  * Return QDF_STATUS
181  */
182 QDF_STATUS csr_scan_get_result(struct mac_context *mac,
183 			       struct scan_filter *filter,
184 			       tScanResultHandle *phResult);
185 
186 /**
187  * csr_scan_get_result_for_bssid - gets the scan result from scan cache for the
188  *      bssid specified
189  * @mac_ctx: mac context
190  * @bssid: bssid to get the scan result for
191  * @ret_list: pointer to scan results
192  *
193  * Return: QDF_STATUS
194  */
195 QDF_STATUS csr_scan_get_result_for_bssid(struct mac_context *mac_ctx,
196 					 struct qdf_mac_addr *bssid,
197 					 qdf_list_t **ret_list);
198 
199 /**
200  * csr_scan_filter_results: filter scan result based
201  * on valid channel list number.
202  * @mac_ctx: mac context
203  *
204  * Get scan result from scan list and Check Scan result channel number
205  * with 11d channel list if channel number is found in 11d channel list
206  * then do not remove scan result entry from scan list
207  *
208  * return: QDF Status
209  */
210 QDF_STATUS csr_scan_filter_results(struct mac_context *mac);
211 
212 /*
213  * csr_scan_result_get_first
214  * Returns the first element of scan result.
215  *
216  * hScanResult - returned from csr_scan_get_result
217  * tCsrScanResultInfo * - NULL if no result
218  */
219 tCsrScanResultInfo *csr_scan_result_get_first(struct mac_context *mac,
220 					      tScanResultHandle hScanResult);
221 /*
222  * csr_scan_result_get_next
223  * Returns the next element of scan result. It can be called without calling
224  * csr_scan_result_get_first first
225  *
226  * hScanResult - returned from csr_scan_get_result
227  * Return Null if no result or reach the end
228  */
229 tCsrScanResultInfo *csr_scan_result_get_next(struct mac_context *mac,
230 					     tScanResultHandle hScanResult);
231 
232 /* some support functions */
233 bool csr_is11h_supported(struct mac_context *mac);
234 bool csr_is_wmm_supported(struct mac_context *mac);
235 
236 /* Return SUCCESS is the command is queued, failed */
237 QDF_STATUS csr_queue_sme_command(struct mac_context *mac, tSmeCmd *pCommand,
238 				 bool fHighPriority);
239 tSmeCmd *csr_get_command_buffer(struct mac_context *mac);
240 void csr_release_command(struct mac_context *mac, tSmeCmd *pCommand);
241 void csr_release_command_buffer(struct mac_context *mac, tSmeCmd *pCommand);
242 
243 /**
244  * csr_get_vdev_type_nss() - gets the nss value based on vdev type
245  * @dev_mode: current device operating mode.
246  * @nss2g: Pointer to the 2G Nss parameter.
247  * @nss5g: Pointer to the 5G Nss parameter.
248  *
249  * Fills the 2G and 5G Nss values based on device mode.
250  *
251  * Return: None
252  */
253 void csr_get_vdev_type_nss(enum QDF_OPMODE dev_mode, uint8_t *nss_2g,
254 			   uint8_t *nss_5g);
255 
256 /**
257  * csr_send_set_ie  - Send Set IE request to lim
258  * @type: Vdev type
259  * @sub_type: Vdev sub type
260  * @vdev_id: Vdev id
261  *
262  * Return: None
263  */
264 void csr_send_set_ie(uint8_t type, uint8_t sub_type, uint8_t vdev_id);
265 #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
266 
267 /* Security */
268 #define WLAN_SECURITY_EVENT_MIC_ERROR       9
269 #define WLAN_SECURITY_EVENT_SET_UNICAST_RSP  11
270 #define WLAN_SECURITY_EVENT_SET_BCAST_RSP    13
271 
272 #define WLAN_SECURITY_STATUS_SUCCESS        0
273 #define WLAN_SECURITY_STATUS_FAILURE        1
274 
275 /* 11d */
276 #define WLAN_80211D_EVENT_RESET         1
277 #endif /* #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR */
278 /*
279  * csr_scan_result_purge() -
280  * Remove all items(tCsrScanResult) in the list and free memory for each item
281  * hScanResult - returned from csr_scan_get_result. hScanResult is considered
282  * gone by calling this function and even before this function returns.
283  * Return QDF_STATUS
284  */
285 QDF_STATUS csr_scan_result_purge(struct mac_context *mac,
286 				 tScanResultHandle hScanResult);
287 
288 /* /////////////////////////////////////////Common Scan ends */
289 /**
290  * csr_bss_start() - CSR API to post the start bss request to serialization
291  * module.
292  * @mac: mac context
293  * @vdev_id: vdev id
294  * @bss_config: start bss config
295  *
296  * Return: QDF_STATUS
297  */
298 QDF_STATUS csr_bss_start(struct mac_context *mac, uint32_t vdev_id,
299 			 struct start_bss_config *bss_config);
300 
301 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
302 /*
303  * csr_get_pmk_info(): store PMK in pmk_cache
304  * @mac_ctx: pointer to global structure for MAC
305  * @session_id: Sme session id
306  * @pmk_cache: pointer to a structure of Pmk
307  *
308  * This API gets the PMK from the session and
309  * stores it in the pmk_cache
310  *
311  * Return: none
312  */
313 void csr_get_pmk_info(struct mac_context *mac_ctx, uint8_t session_id,
314 		      struct wlan_crypto_pmksa *pmk_cache);
315 
316 /*
317  * csr_roam_set_psk_pmk() - store PSK/PMK in CSR session
318  * @mac  - pointer to global structure for MAC
319  * @pmksa: PMKSA entry
320  * @vdev_id - vdev id
321  * @update_to_fw - Send RSO update config command to firmware to update
322  * PMK
323  *
324  * Return QDF_STATUS - usually it succeed unless sessionId is not found
325  */
326 QDF_STATUS csr_roam_set_psk_pmk(struct mac_context *mac,
327 				struct wlan_crypto_pmksa *pmksa,
328 				uint8_t vdev_id, bool update_to_fw);
329 
330 /**
331  * csr_set_pmk_cache_ft() - store MDID in PMK cache
332  *
333  * @mac  - pointer to global structure for MAC
334  * @session_id - Sme session id
335  * @pmk_cache: pointer to a structure of PMK
336  *
337  * Return QDF_STATUS - usually it succeed unless session_id is not found
338  */
339 QDF_STATUS csr_set_pmk_cache_ft(struct mac_context *mac, uint8_t vdev_id,
340 				struct wlan_crypto_pmksa *pmk_cache);
341 #endif
342 
343 /*
344  * csr_apply_channel_and_power_list() -
345  *  HDD calls this function to set the CFG_VALID_CHANNEL_LIST base on the
346  * band/mode settings. This function must be called after CFG is downloaded
347  * and all the band/mode setting already passed into CSR.
348 
349  * Return QDF_STATUS
350  */
351 QDF_STATUS csr_apply_channel_and_power_list(struct mac_context *mac);
352 
353 /*
354  * csr_roam_ndi_stop() - stop ndi
355  * @mac: pointer to mac context
356  * @vdev_id: vdev ID
357  *
358  * Return QDF_STATUS
359  */
360 QDF_STATUS csr_roam_ndi_stop(struct mac_context *mac, uint8_t vdev_id);
361 
362 /**
363  * csr_roam_issue_stop_bss_cmd() - This API posts the stop bss command
364  * to the serialization module.
365  *
366  * @mac: Global mac context
367  * @vdev_id: Vdev id
368  * @bss_type: BSS type
369  *
370  * Return : QDF_STATUS
371  */
372 QDF_STATUS csr_roam_issue_stop_bss_cmd(struct mac_context *mac, uint8_t vdev_id,
373 				       eCsrRoamBssType bss_type);
374 
375 /**
376  * csr_roam_issue_disassociate_sta_cmd() - disassociate a associated station
377  * @mac: Pointer to global structure for MAC
378  * @vdev_id: vdev Id for Soft AP
379  * @del_sta_params: Pointer to parameters of the station to disassoc
380  *
381  * CSR function that HDD calls to issue a deauthenticate station command
382  *
383  * Return: QDF_STATUS_SUCCESS on success or another QDF_STATUS_* on error
384  */
385 QDF_STATUS
386 csr_roam_issue_disassociate_sta_cmd(struct mac_context *mac,
387 				    uint8_t vdev_id,
388 				    struct csr_del_sta_params *del_sta_params);
389 /**
390  * csr_roam_issue_deauth_sta_cmd() - issue deauthenticate station command
391  * @mac: Pointer to global structure for MAC
392  * @vdev_id: vdev Id for Soft AP
393  * @del_sta_params: Pointer to parameters of the station to deauthenticate
394  *
395  * CSR function that HDD calls to issue a deauthenticate station command
396  *
397  * Return: QDF_STATUS_SUCCESS on success or another QDF_STATUS_** on error
398  */
399 QDF_STATUS
400 csr_roam_issue_deauth_sta_cmd(struct mac_context *mac,
401 			      uint8_t vdev_id,
402 			      struct csr_del_sta_params *del_sta_params);
403 
404 /*
405  * csr_send_chng_mcc_beacon_interval() -
406  *   csr function that HDD calls to send Update beacon interval
407  *
408  * sessionId - session Id for Soft AP
409  * Return QDF_STATUS
410  */
411 QDF_STATUS
412 csr_send_chng_mcc_beacon_interval(struct mac_context *mac, uint32_t sessionId);
413 
414 #ifdef FEATURE_WLAN_ESE
415 void csr_update_prev_ap_info(struct csr_roam_session *session,
416 			     struct wlan_objmgr_vdev *vdev);
417 
418 #else
419 static inline void csr_update_prev_ap_info(struct csr_roam_session *session,
420 					   struct wlan_objmgr_vdev *vdev) {}
421 #endif
422 
423 QDF_STATUS csr_update_channel_list(struct mac_context *mac);
424 
425 #if defined(WLAN_SAE_SINGLE_PMK) && defined(WLAN_FEATURE_ROAM_OFFLOAD)
426 /**
427  * csr_clear_sae_single_pmk - API to clear single_pmk_info cache
428  * @psoc: psoc common object
429  * @vdev_id: session id
430  * @pmksa: pmk info
431  *
432  * Return : None
433  */
434 void csr_clear_sae_single_pmk(struct wlan_objmgr_psoc *psoc,
435 			      uint8_t vdev_id, struct wlan_crypto_pmksa *pmksa);
436 #else
437 static inline void
438 csr_clear_sae_single_pmk(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
439 			 struct wlan_crypto_pmksa *pmksa)
440 {
441 }
442 #endif
443 
444 QDF_STATUS csr_send_ext_change_freq(struct mac_context *mac_ctx,
445 				    qdf_freq_t ch_freq, uint8_t session_id);
446 
447 /**
448  * csr_csa_start() - request CSA IE transmission from PE
449  * @mac_ctx: handle returned by mac_open
450  * @session_id: SAP session id
451  *
452  * Return: QDF_STATUS
453  */
454 QDF_STATUS csr_csa_restart(struct mac_context *mac_ctx, uint8_t session_id);
455 
456 /**
457  * csr_sta_continue_csa() - Continue for CSA for STA after HW mode change
458  * @mac_ctx: handle returned by mac_open
459  * @vdev_id: STA VDEV ID
460  *
461  * Return: QDF_STATUS
462  */
463 QDF_STATUS csr_sta_continue_csa(struct mac_context *mac_ctx,
464 				uint8_t vdev_id);
465 
466 #ifdef QCA_HT_2040_COEX
467 QDF_STATUS csr_set_ht2040_mode(struct mac_context *mac, uint32_t sessionId,
468 			       ePhyChanBondState cbMode, bool obssEnabled);
469 #endif
470 
471 void csr_prune_channel_list_for_mode(struct mac_context *mac,
472 				     struct csr_channel *pChannelList);
473 
474 /**
475  * csr_is_pmkid_found_for_peer() - check if pmkid sent by peer is present
476 				   in PMK cache. Used in SAP mode.
477  * @mac: pointer to mac
478  * @session: sme session pointer
479  * @peer_mac_addr: mac address of the connecting peer
480  * @pmkid: pointer to pmkid(s) send by peer
481  * @pmkid_count: number of pmkids sent by peer
482  *
483  * Return: true if pmkid is found else false
484  */
485 bool csr_is_pmkid_found_for_peer(struct mac_context *mac,
486 				 struct csr_roam_session *session,
487 				 tSirMacAddr peer_mac_addr,
488 				 uint8_t *pmkid, uint16_t pmkid_count);
489 #ifdef WLAN_FEATURE_11BE
490 
491 /**
492  * csr_update_session_eht_cap() - update sme session eht capabilities
493  * @mac_ctx: pointer to mac
494  * @session: sme session pointer
495  *
496  * Return: None
497  */
498 void csr_update_session_eht_cap(struct mac_context *mac_ctx,
499 				struct csr_roam_session *session);
500 #else
501 static inline void csr_update_session_eht_cap(struct mac_context *mac_ctx,
502 					      struct csr_roam_session *session)
503 {
504 }
505 #endif
506 
507 #ifdef WLAN_FEATURE_11AX
508 void csr_update_session_he_cap(struct mac_context *mac_ctx,
509 			struct csr_roam_session *session);
510 #else
511 static inline void csr_update_session_he_cap(struct mac_context *mac_ctx,
512 			struct csr_roam_session *session)
513 {
514 }
515 #endif
516 
517 /**
518  * csr_setup_vdev_session() - API to setup vdev mac session
519  * @vdev_mlme: vdev mlme private object
520  *
521  * This API setsup the vdev session for the mac layer
522  *
523  * Returns: QDF_STATUS
524  */
525 QDF_STATUS csr_setup_vdev_session(struct vdev_mlme_obj *vdev_mlme);
526 
527 
528 #ifdef WLAN_UNIT_TEST
529 #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR
530 /**
531  * csr_cm_get_sta_cxn_info() - This function populates all the connection
532  *			    information which is formed by DUT-STA to AP
533  * @mac_ctx: pointer to mac context
534  * @vdev_id: vdev id
535  * @buf: pointer to char buffer to write all the connection information.
536  * @buf_size: maximum size of the provided buffer
537  *
538  * Returns: None (information gets populated in buffer)
539  */
540 void csr_cm_get_sta_cxn_info(struct mac_context *mac_ctx, uint8_t vdev_id,
541 			     char *buf, uint32_t buf_sz);
542 
543 #endif
544 #endif
545 
546 /**
547  * csr_process_sap_response() - Wrapper API to process the SAP
548  * response from LIM
549  * @mac_ctx: mac context
550  * @result: Response status of LIM processing
551  * @context: Response from LIM
552  * @session_id: vdev id
553  *
554  * Return: void
555  */
556 void csr_process_sap_response(struct mac_context *mac,
557 			      enum csr_sap_response_type result,
558 			      void *context, uint8_t session_id);
559 
560 /**
561  * csr_roam_roaming_state_start_bss_rsp_processor() - Handles start bss
562  * response from LIM
563  *
564  * @mac: mac context
565  * @msg: start bss response pointer
566  *
567  * Return: void
568  */
569 void
570 csr_roam_roaming_state_start_bss_rsp_processor(struct mac_context *mac,
571 					       void *msg);
572 
573 /**
574  * csr_roam_roaming_state_stop_bss_rsp_processor() - Handles stop bss
575  * response from LIM
576  *
577  * @mac: mac context
578  * @msg: stop bss response pointer
579  *
580  * Return: void
581  */
582 void csr_roam_roaming_state_stop_bss_rsp_processor(struct mac_context *mac,
583 						   void *msg);
584 
585 /**
586  * csr_roam_process_results_default() - Process the result for start bss
587  * @mac_ctx: Global MAC Context
588  * @cmd:     Command to be processed
589  *
590  * Return: None
591  */
592 void
593 csr_roam_process_results_default(struct mac_context *mac_ctx, tSmeCmd *cmd);
594 
595 #endif /* CSR_INSIDE_API_H__ */
596