1 /* 2 * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for 5 * any purpose with or without fee is hereby granted, provided that the 6 * above copyright notice and this permission notice appear in all 7 * copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16 * PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 /** 20 * DOC: This file contains green ap north bound interface definitions 21 */ 22 23 #include <qdf_status.h> 24 #include <wlan_green_ap_ucfg_api.h> 25 #include <../../core/src/wlan_green_ap_main_i.h> 26 27 QDF_STATUS ucfg_green_ap_update_user_config( 28 struct wlan_objmgr_pdev *pdev, 29 struct green_ap_user_cfg *green_ap_cfg) 30 { 31 struct wlan_pdev_green_ap_ctx *green_ap_ctx; 32 struct wlan_green_ap_egap_params *egap_params; 33 34 if (!pdev) { 35 green_ap_err("pdev context passed is NULL"); 36 return QDF_STATUS_E_INVAL; 37 } 38 39 green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj( 40 pdev, WLAN_UMAC_COMP_GREEN_AP); 41 if (!green_ap_ctx) { 42 green_ap_err("green ap context obtained is NULL"); 43 return QDF_STATUS_E_FAILURE; 44 } 45 46 qdf_spin_lock_bh(&green_ap_ctx->lock); 47 egap_params = &green_ap_ctx->egap_params; 48 49 egap_params->host_enable_egap = green_ap_cfg->host_enable_egap; 50 egap_params->egap_inactivity_time = green_ap_cfg->egap_inactivity_time; 51 egap_params->egap_wait_time = green_ap_cfg->egap_wait_time; 52 egap_params->egap_feature_flags = green_ap_cfg->egap_feature_flags; 53 qdf_spin_unlock_bh(&green_ap_ctx->lock); 54 55 return QDF_STATUS_SUCCESS; 56 } 57 58 QDF_STATUS ucfg_green_ap_enable_egap(struct wlan_objmgr_pdev *pdev) 59 { 60 struct wlan_pdev_green_ap_ctx *green_ap_ctx; 61 struct wlan_lmac_if_green_ap_tx_ops *green_ap_tx_ops; 62 63 if (!pdev) { 64 green_ap_err("pdev context passed is NULL"); 65 return QDF_STATUS_E_INVAL; 66 } 67 68 green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj( 69 pdev, WLAN_UMAC_COMP_GREEN_AP); 70 if (!green_ap_ctx) { 71 green_ap_err("green ap context obtained is NULL"); 72 return QDF_STATUS_E_FAILURE; 73 } 74 75 green_ap_tx_ops = wlan_psoc_get_green_ap_tx_ops(green_ap_ctx); 76 if (!green_ap_tx_ops) { 77 green_ap_err("green ap tx ops obtained are NULL"); 78 return QDF_STATUS_E_FAILURE; 79 } 80 81 if (!green_ap_tx_ops->enable_egap) { 82 green_ap_err("tx op for sending enbale/disable green ap is NULL"); 83 return QDF_STATUS_E_FAILURE; 84 } 85 86 return green_ap_tx_ops->enable_egap(pdev, &green_ap_ctx->egap_params); 87 } 88 89 QDF_STATUS ucfg_green_ap_set_ps_config(struct wlan_objmgr_pdev *pdev, 90 uint8_t value) 91 { 92 struct wlan_pdev_green_ap_ctx *green_ap_ctx; 93 94 if (!pdev) { 95 green_ap_err("pdev context passed is NULL"); 96 return QDF_STATUS_E_INVAL; 97 } 98 99 green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj( 100 pdev, WLAN_UMAC_COMP_GREEN_AP); 101 if (!green_ap_ctx) { 102 green_ap_err("green ap context obtained is NULL"); 103 return QDF_STATUS_E_FAILURE; 104 } 105 106 qdf_spin_lock_bh(&green_ap_ctx->lock); 107 if (wlan_is_egap_enabled(green_ap_ctx)) { 108 qdf_spin_unlock_bh(&green_ap_ctx->lock); 109 return QDF_STATUS_SUCCESS; 110 } 111 112 green_ap_ctx->ps_enable = value; 113 qdf_spin_unlock_bh(&green_ap_ctx->lock); 114 115 return QDF_STATUS_SUCCESS; 116 } 117 118 QDF_STATUS ucfg_green_ap_get_ps_config(struct wlan_objmgr_pdev *pdev, 119 uint8_t *ps_enable) 120 { 121 struct wlan_pdev_green_ap_ctx *green_ap_ctx; 122 123 if (!pdev) { 124 green_ap_err("pdev context passed is NULL"); 125 return QDF_STATUS_E_INVAL; 126 } 127 128 green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj( 129 pdev, WLAN_UMAC_COMP_GREEN_AP); 130 131 if (!green_ap_ctx) { 132 green_ap_err("green ap context obtained is NULL"); 133 return QDF_STATUS_E_FAILURE; 134 } 135 136 qdf_spin_lock_bh(&green_ap_ctx->lock); 137 if (wlan_is_egap_enabled(green_ap_ctx)) { 138 qdf_spin_unlock_bh(&green_ap_ctx->lock); 139 return QDF_STATUS_SUCCESS; 140 } 141 142 *ps_enable = green_ap_ctx->ps_enable; 143 qdf_spin_unlock_bh(&green_ap_ctx->lock); 144 145 return QDF_STATUS_SUCCESS; 146 } 147 148 QDF_STATUS ucfg_green_ap_set_transition_time(struct wlan_objmgr_pdev *pdev, 149 uint32_t val) 150 { 151 struct wlan_pdev_green_ap_ctx *green_ap_ctx; 152 153 if (!pdev) { 154 green_ap_err("pdev context passed is NULL"); 155 return QDF_STATUS_E_INVAL; 156 } 157 158 green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj( 159 pdev, WLAN_UMAC_COMP_GREEN_AP); 160 161 if (!green_ap_ctx) { 162 green_ap_err("green ap context obtained is NULL"); 163 return QDF_STATUS_E_FAILURE; 164 } 165 166 qdf_spin_lock_bh(&green_ap_ctx->lock); 167 if (wlan_is_egap_enabled(green_ap_ctx)) { 168 qdf_spin_unlock_bh(&green_ap_ctx->lock); 169 return QDF_STATUS_SUCCESS; 170 } 171 172 green_ap_ctx->ps_trans_time = val; 173 qdf_spin_unlock_bh(&green_ap_ctx->lock); 174 175 return QDF_STATUS_SUCCESS; 176 } 177 178 QDF_STATUS ucfg_green_ap_get_transition_time(struct wlan_objmgr_pdev *pdev, 179 uint32_t *ps_trans_time) 180 { 181 struct wlan_pdev_green_ap_ctx *green_ap_ctx; 182 183 if (!pdev) { 184 green_ap_err("pdev context passed is NULL"); 185 return QDF_STATUS_E_INVAL; 186 } 187 188 green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj( 189 pdev, WLAN_UMAC_COMP_GREEN_AP); 190 191 if (!green_ap_ctx) { 192 green_ap_err("green ap context obtained is NULL"); 193 return QDF_STATUS_E_FAILURE; 194 } 195 196 qdf_spin_lock_bh(&green_ap_ctx->lock); 197 if (wlan_is_egap_enabled(green_ap_ctx)) { 198 qdf_spin_unlock_bh(&green_ap_ctx->lock); 199 return QDF_STATUS_SUCCESS; 200 } 201 202 *ps_trans_time = green_ap_ctx->ps_trans_time; 203 qdf_spin_unlock_bh(&green_ap_ctx->lock); 204 205 return QDF_STATUS_SUCCESS; 206 } 207 208 QDF_STATUS ucfg_green_ap_config(struct wlan_objmgr_pdev *pdev, uint8_t val) 209 { 210 211 uint8_t flag; 212 213 if (wlan_green_ap_get_capab(pdev) == QDF_STATUS_E_NOSUPPORT) { 214 green_ap_err("GreenAP not supported on radio\n"); 215 return QDF_STATUS_E_NOSUPPORT; 216 } 217 218 if (val) { 219 struct wlan_pdev_green_ap_ctx *green_ap_ctx; 220 221 wlan_objmgr_pdev_iterate_obj_list(pdev, 222 WLAN_VDEV_OP, 223 wlan_green_ap_check_mode, 224 &flag, 0, WLAN_GREEN_AP_ID); 225 if (flag == 1) { 226 green_ap_err("Radio not in AP mode." 227 "Feature not supported"); 228 return QDF_STATUS_E_NOSUPPORT; 229 } 230 231 green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(pdev, 232 WLAN_UMAC_COMP_GREEN_AP); 233 234 if (!green_ap_ctx) { 235 green_ap_err("green ap context obtained is NULL"); 236 return QDF_STATUS_E_NOSUPPORT; 237 } 238 239 ucfg_green_ap_set_ps_config(pdev, val); 240 241 if (wlan_util_is_vdev_active(pdev, WLAN_GREEN_AP_ID) == 242 QDF_STATUS_SUCCESS) 243 wlan_green_ap_start(pdev); 244 } else { 245 wlan_green_ap_stop(pdev); 246 } 247 248 return QDF_STATUS_SUCCESS; 249 } 250 251 void ucfg_green_ap_enable_debug_prints(struct wlan_objmgr_pdev *pdev, 252 uint32_t val) 253 { 254 struct wlan_pdev_green_ap_ctx *green_ap_ctx; 255 256 green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj( 257 pdev, WLAN_UMAC_COMP_GREEN_AP); 258 259 if (!green_ap_ctx) { 260 green_ap_err("green ap context obtained is NULL"); 261 return; 262 } 263 264 green_ap_ctx->dbg_enable = val; 265 } 266 267 bool ucfg_green_ap_get_debug_prints(struct wlan_objmgr_pdev *pdev) 268 { 269 struct wlan_pdev_green_ap_ctx *green_ap_ctx; 270 271 green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj( 272 pdev, WLAN_UMAC_COMP_GREEN_AP); 273 274 if (!green_ap_ctx) { 275 green_ap_err("green ap context obtained is NULL"); 276 return false; 277 } 278 279 return green_ap_ctx->dbg_enable; 280 } 281 282