1 /* 2 * Copyright (c) 2020, 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 pdev_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, pdev_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 64 ucfg_wlan_dcs_cmd(struct wlan_objmgr_psoc *psoc, 65 uint32_t pdev_id, 66 bool is_host_pdev_id) 67 { 68 return wlan_dcs_cmd_send(psoc, pdev_id, is_host_pdev_id); 69 } 70 71 void ucfg_config_dcs_enable(struct wlan_objmgr_psoc *psoc, 72 uint32_t pdev_id, 73 uint8_t interference_type) 74 { 75 struct dcs_pdev_priv_obj *dcs_pdev_priv; 76 77 dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, pdev_id); 78 if (!dcs_pdev_priv) { 79 dcs_err("dcs pdev private object is null"); 80 return; 81 } 82 83 dcs_pdev_priv->dcs_host_params.dcs_enable |= interference_type; 84 } 85 86 void ucfg_config_dcs_disable(struct wlan_objmgr_psoc *psoc, 87 uint32_t pdev_id, 88 uint8_t interference_type) 89 { 90 struct dcs_pdev_priv_obj *dcs_pdev_priv; 91 92 dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, pdev_id); 93 if (!dcs_pdev_priv) { 94 dcs_err("dcs pdev private object is null"); 95 return; 96 } 97 98 dcs_pdev_priv->dcs_host_params.dcs_enable &= (~interference_type); 99 } 100 101 uint8_t ucfg_get_dcs_enable(struct wlan_objmgr_psoc *psoc, uint8_t pdev_id) 102 { 103 struct dcs_pdev_priv_obj *dcs_pdev_priv; 104 uint8_t enable = 0; 105 106 dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, pdev_id); 107 if (!dcs_pdev_priv) { 108 dcs_err("dcs pdev private object is null"); 109 return 0; 110 } 111 112 if (dcs_pdev_priv->dcs_host_params.dcs_enable_cfg) 113 enable = dcs_pdev_priv->dcs_host_params.dcs_enable; 114 115 return enable; 116 } 117 118 void ucfg_dcs_clear(struct wlan_objmgr_psoc *psoc, uint32_t pdev_id) 119 { 120 wlan_dcs_clear(psoc, pdev_id); 121 } 122 123 void ucfg_config_dcs_event_data(struct wlan_objmgr_psoc *psoc, uint32_t pdev_id, 124 bool dcs_algorithm_process) 125 { 126 wlan_dcs_set_algorithm_process(psoc, pdev_id, dcs_algorithm_process); 127 } 128 129 void ucfg_dcs_reset_user_stats(struct wlan_objmgr_psoc *psoc, uint8_t pdev_id) 130 { 131 struct dcs_pdev_priv_obj *dcs_pdev_priv; 132 struct wlan_host_dcs_im_user_stats *user_stats; 133 134 dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, pdev_id); 135 if (!dcs_pdev_priv) { 136 dcs_err("dcs pdev private object is null"); 137 return; 138 } 139 140 wlan_dcs_pdev_obj_lock(dcs_pdev_priv); 141 dcs_pdev_priv->dcs_host_params.user_request_count = 0; 142 dcs_pdev_priv->dcs_host_params.notify_user = 0; 143 user_stats = &dcs_pdev_priv->dcs_im_stats.user_dcs_im_stats; 144 user_stats->cycle_count = 0; 145 user_stats->rxclr_count = 0; 146 user_stats->rx_frame_count = 0; 147 user_stats->my_bss_rx_cycle_count = 0; 148 user_stats->max_rssi = 0; 149 user_stats->min_rssi = 0; 150 wlan_dcs_pdev_obj_unlock(dcs_pdev_priv); 151 } 152 153 void ucfg_dcs_set_user_request(struct wlan_objmgr_psoc *psoc, uint8_t pdev_id, 154 uint32_t user_request_count) 155 { 156 struct dcs_pdev_priv_obj *dcs_pdev_priv; 157 158 dcs_pdev_priv = wlan_dcs_get_pdev_private_obj(psoc, pdev_id); 159 if (!dcs_pdev_priv) { 160 dcs_err("dcs pdev private object is null"); 161 return; 162 } 163 164 wlan_dcs_pdev_obj_lock(dcs_pdev_priv); 165 dcs_pdev_priv->dcs_host_params.user_request_count = user_request_count; 166 wlan_dcs_pdev_obj_unlock(dcs_pdev_priv); 167 } 168