1 /* 2 * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 /** 18 * DOC: This file has the dcs dispatcher API implementation which is exposed 19 * to outside of dcs component. 20 */ 21 22 #include "wlan_dcs_ucfg_api.h" 23 #include "../../core/src/wlan_dcs.h" 24 25 void ucfg_dcs_register_cb( 26 struct wlan_objmgr_psoc *psoc, 27 dcs_callback cbk, 28 void *arg) 29 { 30 struct dcs_psoc_priv_obj *dcs_psoc_priv; 31 32 dcs_psoc_priv = wlan_objmgr_psoc_get_comp_private_obj( 33 psoc, 34 WLAN_UMAC_COMP_DCS); 35 if (!dcs_psoc_priv) { 36 dcs_err("dcs psoc private object is null"); 37 return; 38 } 39 40 dcs_psoc_priv->dcs_cbk.cbk = cbk; 41 dcs_psoc_priv->dcs_cbk.arg = arg; 42 } 43 44 void 45 ucfg_dcs_register_user_cb(struct wlan_objmgr_psoc *psoc, 46 uint8_t mac_id, uint8_t vdev_id, 47 void (*cb)(uint8_t vdev_id, 48 struct wlan_host_dcs_im_user_stats *stats, 49 int status)) 50 { 51 struct dcs_pdev_priv_obj *dcs_pdev_priv; 52 53 dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id); 54 if (!dcs_pdev_priv) { 55 dcs_err("dcs pdev private object is null"); 56 return; 57 } 58 59 dcs_pdev_priv->requestor_vdev_id = vdev_id; 60 dcs_pdev_priv->user_cb = cb; 61 } 62 63 QDF_STATUS ucfg_dcs_register_awgn_cb(struct wlan_objmgr_psoc *psoc, 64 dcs_switch_chan_cb cb) 65 { 66 struct dcs_psoc_priv_obj *dcs_psoc_priv; 67 68 dcs_psoc_priv = 69 wlan_objmgr_psoc_get_comp_private_obj(psoc, WLAN_UMAC_COMP_DCS); 70 if (!dcs_psoc_priv) { 71 dcs_err("dcs psoc private object is null"); 72 return QDF_STATUS_E_INVAL; 73 } 74 75 dcs_psoc_priv->switch_chan_cb = cb; 76 return QDF_STATUS_SUCCESS; 77 } 78 79 QDF_STATUS 80 ucfg_wlan_dcs_cmd(struct wlan_objmgr_psoc *psoc, 81 uint32_t mac_id, 82 bool is_host_pdev_id) 83 { 84 return wlan_dcs_cmd_send(psoc, mac_id, is_host_pdev_id); 85 } 86 87 void ucfg_config_dcs_enable(struct wlan_objmgr_psoc *psoc, 88 uint32_t mac_id, 89 uint8_t interference_type) 90 { 91 struct dcs_pdev_priv_obj *dcs_pdev_priv; 92 93 dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id); 94 if (!dcs_pdev_priv) { 95 dcs_err("dcs pdev private object is null"); 96 return; 97 } 98 99 dcs_pdev_priv->dcs_host_params.dcs_enable |= interference_type; 100 } 101 102 void ucfg_config_dcs_disable(struct wlan_objmgr_psoc *psoc, 103 uint32_t mac_id, 104 uint8_t interference_type) 105 { 106 struct dcs_pdev_priv_obj *dcs_pdev_priv; 107 108 dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id); 109 if (!dcs_pdev_priv) { 110 dcs_err("dcs pdev private object is null"); 111 return; 112 } 113 114 dcs_pdev_priv->dcs_host_params.dcs_enable &= (~interference_type); 115 } 116 117 uint8_t ucfg_get_dcs_enable(struct wlan_objmgr_psoc *psoc, uint8_t mac_id) 118 { 119 struct dcs_pdev_priv_obj *dcs_pdev_priv; 120 uint8_t enable = 0; 121 122 dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id); 123 if (!dcs_pdev_priv) { 124 dcs_err("dcs pdev private object is null"); 125 return 0; 126 } 127 128 if (dcs_pdev_priv->dcs_host_params.dcs_enable_cfg) 129 enable = dcs_pdev_priv->dcs_host_params.dcs_enable; 130 131 return enable; 132 } 133 134 void ucfg_dcs_clear(struct wlan_objmgr_psoc *psoc, uint32_t mac_id) 135 { 136 wlan_dcs_clear(psoc, mac_id); 137 } 138 139 void ucfg_config_dcs_event_data(struct wlan_objmgr_psoc *psoc, uint32_t mac_id, 140 bool dcs_algorithm_process) 141 { 142 wlan_dcs_set_algorithm_process(psoc, mac_id, dcs_algorithm_process); 143 } 144 145 void ucfg_dcs_reset_user_stats(struct wlan_objmgr_psoc *psoc, uint8_t mac_id) 146 { 147 struct dcs_pdev_priv_obj *dcs_pdev_priv; 148 struct wlan_host_dcs_im_user_stats *user_stats; 149 150 dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id); 151 if (!dcs_pdev_priv) { 152 dcs_err("dcs pdev private object is null"); 153 return; 154 } 155 156 wlan_dcs_pdev_obj_lock(dcs_pdev_priv); 157 dcs_pdev_priv->dcs_host_params.user_request_count = 0; 158 dcs_pdev_priv->dcs_host_params.notify_user = 0; 159 user_stats = &dcs_pdev_priv->dcs_im_stats.user_dcs_im_stats; 160 user_stats->cycle_count = 0; 161 user_stats->rxclr_count = 0; 162 user_stats->rx_frame_count = 0; 163 user_stats->my_bss_rx_cycle_count = 0; 164 user_stats->max_rssi = 0; 165 user_stats->min_rssi = 0; 166 wlan_dcs_pdev_obj_unlock(dcs_pdev_priv); 167 } 168 169 void ucfg_dcs_set_user_request(struct wlan_objmgr_psoc *psoc, uint8_t mac_id, 170 uint32_t user_request_count) 171 { 172 struct dcs_pdev_priv_obj *dcs_pdev_priv; 173 174 dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id); 175 if (!dcs_pdev_priv) { 176 dcs_err("dcs pdev private object is null"); 177 return; 178 } 179 180 wlan_dcs_pdev_obj_lock(dcs_pdev_priv); 181 dcs_pdev_priv->dcs_host_params.user_request_count = user_request_count; 182 wlan_dcs_pdev_obj_unlock(dcs_pdev_priv); 183 } 184