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 #include "wlan_objmgr_vdev_obj.h" 25 26 void ucfg_dcs_register_cb( 27 struct wlan_objmgr_psoc *psoc, 28 dcs_callback cbk, 29 void *arg) 30 { 31 struct dcs_psoc_priv_obj *dcs_psoc_priv; 32 33 dcs_psoc_priv = wlan_objmgr_psoc_get_comp_private_obj( 34 psoc, 35 WLAN_UMAC_COMP_DCS); 36 if (!dcs_psoc_priv) { 37 dcs_err("dcs psoc private object is null"); 38 return; 39 } 40 41 dcs_psoc_priv->dcs_cbk.cbk = cbk; 42 dcs_psoc_priv->dcs_cbk.arg = arg; 43 } 44 45 void 46 ucfg_dcs_register_user_cb(struct wlan_objmgr_psoc *psoc, 47 uint8_t mac_id, uint8_t vdev_id, 48 void (*cb)(uint8_t vdev_id, 49 struct wlan_host_dcs_im_user_stats *stats, 50 int status)) 51 { 52 struct dcs_pdev_priv_obj *dcs_pdev_priv; 53 54 dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id); 55 if (!dcs_pdev_priv) { 56 dcs_err("dcs pdev private object is null"); 57 return; 58 } 59 60 dcs_pdev_priv->requestor_vdev_id = vdev_id; 61 dcs_pdev_priv->user_cb = cb; 62 } 63 64 QDF_STATUS ucfg_dcs_register_awgn_cb(struct wlan_objmgr_psoc *psoc, 65 dcs_switch_chan_cb cb) 66 { 67 struct dcs_psoc_priv_obj *dcs_psoc_priv; 68 69 dcs_psoc_priv = 70 wlan_objmgr_psoc_get_comp_private_obj(psoc, WLAN_UMAC_COMP_DCS); 71 if (!dcs_psoc_priv) { 72 dcs_err("dcs psoc private object is null"); 73 return QDF_STATUS_E_INVAL; 74 } 75 76 dcs_psoc_priv->switch_chan_cb = cb; 77 return QDF_STATUS_SUCCESS; 78 } 79 80 QDF_STATUS 81 ucfg_wlan_dcs_cmd(struct wlan_objmgr_psoc *psoc, 82 uint32_t mac_id, 83 bool is_host_pdev_id) 84 { 85 return wlan_dcs_cmd_send(psoc, mac_id, is_host_pdev_id); 86 } 87 88 void ucfg_config_dcs_enable(struct wlan_objmgr_psoc *psoc, 89 uint32_t mac_id, 90 uint8_t interference_type) 91 { 92 struct dcs_pdev_priv_obj *dcs_pdev_priv; 93 94 dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id); 95 if (!dcs_pdev_priv) { 96 dcs_err("dcs pdev private object is null"); 97 return; 98 } 99 100 dcs_pdev_priv->dcs_host_params.dcs_enable |= interference_type; 101 } 102 103 void ucfg_config_dcs_disable(struct wlan_objmgr_psoc *psoc, 104 uint32_t mac_id, 105 uint8_t interference_type) 106 { 107 struct dcs_pdev_priv_obj *dcs_pdev_priv; 108 109 dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id); 110 if (!dcs_pdev_priv) { 111 dcs_err("dcs pdev private object is null"); 112 return; 113 } 114 115 dcs_pdev_priv->dcs_host_params.dcs_enable &= (~interference_type); 116 } 117 118 uint8_t ucfg_get_dcs_enable(struct wlan_objmgr_psoc *psoc, uint8_t mac_id) 119 { 120 struct dcs_pdev_priv_obj *dcs_pdev_priv; 121 uint8_t enable = 0; 122 123 dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id); 124 if (!dcs_pdev_priv) { 125 dcs_err("dcs pdev private object is null"); 126 return 0; 127 } 128 129 if (dcs_pdev_priv->dcs_host_params.dcs_enable_cfg) 130 enable = dcs_pdev_priv->dcs_host_params.dcs_enable; 131 132 return enable; 133 } 134 135 void ucfg_dcs_clear(struct wlan_objmgr_psoc *psoc, uint32_t mac_id) 136 { 137 wlan_dcs_clear(psoc, mac_id); 138 } 139 140 void ucfg_config_dcs_event_data(struct wlan_objmgr_psoc *psoc, uint32_t mac_id, 141 bool dcs_algorithm_process) 142 { 143 wlan_dcs_set_algorithm_process(psoc, mac_id, dcs_algorithm_process); 144 } 145 146 void ucfg_dcs_reset_user_stats(struct wlan_objmgr_psoc *psoc, uint8_t mac_id) 147 { 148 struct dcs_pdev_priv_obj *dcs_pdev_priv; 149 struct wlan_host_dcs_im_user_stats *user_stats; 150 151 dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id); 152 if (!dcs_pdev_priv) { 153 dcs_err("dcs pdev private object is null"); 154 return; 155 } 156 157 wlan_dcs_pdev_obj_lock(dcs_pdev_priv); 158 dcs_pdev_priv->dcs_host_params.user_request_count = 0; 159 dcs_pdev_priv->dcs_host_params.notify_user = 0; 160 user_stats = &dcs_pdev_priv->dcs_im_stats.user_dcs_im_stats; 161 user_stats->cycle_count = 0; 162 user_stats->rxclr_count = 0; 163 user_stats->rx_frame_count = 0; 164 user_stats->my_bss_rx_cycle_count = 0; 165 user_stats->max_rssi = 0; 166 user_stats->min_rssi = 0; 167 wlan_dcs_pdev_obj_unlock(dcs_pdev_priv); 168 } 169 170 void ucfg_dcs_set_user_request(struct wlan_objmgr_psoc *psoc, uint8_t mac_id, 171 uint32_t user_request_count) 172 { 173 struct dcs_pdev_priv_obj *dcs_pdev_priv; 174 175 dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id); 176 if (!dcs_pdev_priv) { 177 dcs_err("dcs pdev private object is null"); 178 return; 179 } 180 181 wlan_dcs_pdev_obj_lock(dcs_pdev_priv); 182 dcs_pdev_priv->dcs_host_params.user_request_count = user_request_count; 183 wlan_dcs_pdev_obj_unlock(dcs_pdev_priv); 184 } 185 186 QDF_STATUS ucfg_dcs_get_ch_util(struct wlan_objmgr_psoc *psoc, uint8_t mac_id, 187 struct wlan_host_dcs_ch_util_stats *dcs_stats) 188 { 189 struct dcs_pdev_priv_obj *dcs_pdev_priv; 190 191 dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, mac_id); 192 if (!dcs_pdev_priv) { 193 dcs_err("dcs pdev private object is null"); 194 return QDF_STATUS_E_INVAL; 195 } 196 197 wlan_dcs_pdev_obj_lock(dcs_pdev_priv); 198 qdf_mem_copy(dcs_stats, 199 &dcs_pdev_priv->dcs_im_stats.dcs_ch_util_im_stats, 200 sizeof(*dcs_stats)); 201 wlan_dcs_pdev_obj_unlock(dcs_pdev_priv); 202 203 return QDF_STATUS_SUCCESS; 204 } 205