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_enable_egap(struct wlan_objmgr_pdev *pdev) 28 { 29 struct wlan_pdev_green_ap_ctx *green_ap_ctx; 30 struct wlan_lmac_if_green_ap_tx_ops *green_ap_tx_ops; 31 32 if (!pdev) { 33 green_ap_err("pdev context passed is NULL"); 34 return QDF_STATUS_E_INVAL; 35 } 36 37 green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj( 38 pdev, WLAN_UMAC_COMP_GREEN_AP); 39 if (!green_ap_ctx) { 40 green_ap_err("green ap context obtained is NULL"); 41 return QDF_STATUS_E_FAILURE; 42 } 43 44 green_ap_tx_ops = wlan_psoc_get_green_ap_tx_ops(green_ap_ctx); 45 if (!green_ap_tx_ops) { 46 green_ap_err("green ap tx ops obtained are NULL"); 47 return QDF_STATUS_E_FAILURE; 48 } 49 50 if (!green_ap_tx_ops->enable_egap) { 51 green_ap_err("tx op for sending enbale/disable green ap is NULL"); 52 return QDF_STATUS_E_FAILURE; 53 } 54 55 return green_ap_tx_ops->enable_egap(pdev, &green_ap_ctx->egap_params); 56 } 57 58 QDF_STATUS ucfg_green_ap_set_ps_config(struct wlan_objmgr_pdev *pdev, 59 uint8_t value) 60 { 61 struct wlan_pdev_green_ap_ctx *green_ap_ctx; 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 qdf_spin_lock_bh(&green_ap_ctx->lock); 76 if (wlan_is_egap_enabled(green_ap_ctx)) { 77 qdf_spin_unlock_bh(&green_ap_ctx->lock); 78 return QDF_STATUS_SUCCESS; 79 } 80 81 green_ap_ctx->ps_enable = value; 82 qdf_spin_unlock_bh(&green_ap_ctx->lock); 83 84 return QDF_STATUS_SUCCESS; 85 } 86 87 QDF_STATUS ucfg_green_ap_get_ps_config(struct wlan_objmgr_pdev *pdev, 88 uint8_t *ps_enable) 89 { 90 struct wlan_pdev_green_ap_ctx *green_ap_ctx; 91 92 if (!pdev) { 93 green_ap_err("pdev context passed is NULL"); 94 return QDF_STATUS_E_INVAL; 95 } 96 97 green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj( 98 pdev, WLAN_UMAC_COMP_GREEN_AP); 99 100 if (!green_ap_ctx) { 101 green_ap_err("green ap context obtained is NULL"); 102 return QDF_STATUS_E_FAILURE; 103 } 104 105 qdf_spin_lock_bh(&green_ap_ctx->lock); 106 if (wlan_is_egap_enabled(green_ap_ctx)) { 107 qdf_spin_unlock_bh(&green_ap_ctx->lock); 108 return QDF_STATUS_SUCCESS; 109 } 110 111 *ps_enable = green_ap_ctx->ps_enable; 112 qdf_spin_unlock_bh(&green_ap_ctx->lock); 113 114 return QDF_STATUS_SUCCESS; 115 } 116 117 QDF_STATUS ucfg_green_ap_set_transition_time(struct wlan_objmgr_pdev *pdev, 118 uint32_t val) 119 { 120 struct wlan_pdev_green_ap_ctx *green_ap_ctx; 121 122 if (!pdev) { 123 green_ap_err("pdev context passed is NULL"); 124 return QDF_STATUS_E_INVAL; 125 } 126 127 green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj( 128 pdev, WLAN_UMAC_COMP_GREEN_AP); 129 130 if (!green_ap_ctx) { 131 green_ap_err("green ap context obtained is NULL"); 132 return QDF_STATUS_E_FAILURE; 133 } 134 135 qdf_spin_lock_bh(&green_ap_ctx->lock); 136 if (wlan_is_egap_enabled(green_ap_ctx)) { 137 qdf_spin_unlock_bh(&green_ap_ctx->lock); 138 return QDF_STATUS_SUCCESS; 139 } 140 141 green_ap_ctx->ps_trans_time = val; 142 qdf_spin_unlock_bh(&green_ap_ctx->lock); 143 144 return QDF_STATUS_SUCCESS; 145 } 146 147 QDF_STATUS ucfg_green_ap_get_transition_time(struct wlan_objmgr_pdev *pdev, 148 uint32_t *ps_trans_time) 149 { 150 struct wlan_pdev_green_ap_ctx *green_ap_ctx; 151 152 if (!pdev) { 153 green_ap_err("pdev context passed is NULL"); 154 return QDF_STATUS_E_INVAL; 155 } 156 157 green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj( 158 pdev, WLAN_UMAC_COMP_GREEN_AP); 159 160 if (!green_ap_ctx) { 161 green_ap_err("green ap context obtained is NULL"); 162 return QDF_STATUS_E_FAILURE; 163 } 164 165 qdf_spin_lock_bh(&green_ap_ctx->lock); 166 if (wlan_is_egap_enabled(green_ap_ctx)) { 167 qdf_spin_unlock_bh(&green_ap_ctx->lock); 168 return QDF_STATUS_SUCCESS; 169 } 170 171 *ps_trans_time = green_ap_ctx->ps_trans_time; 172 qdf_spin_unlock_bh(&green_ap_ctx->lock); 173 174 return QDF_STATUS_SUCCESS; 175 } 176 177 QDF_STATUS ucfg_green_ap_config(struct wlan_objmgr_pdev *pdev, uint8_t val) 178 { 179 180 uint8_t flag; 181 182 if (wlan_green_ap_get_capab(pdev) == QDF_STATUS_E_NOSUPPORT) { 183 green_ap_err("GreenAP not supported on radio\n"); 184 return QDF_STATUS_E_NOSUPPORT; 185 } 186 187 if (val) { 188 struct wlan_pdev_green_ap_ctx *green_ap_ctx; 189 190 wlan_objmgr_pdev_iterate_obj_list(pdev, 191 WLAN_VDEV_OP, 192 wlan_green_ap_check_mode, 193 &flag, 0, WLAN_GREEN_AP_ID); 194 if (flag == 1) { 195 green_ap_err("Radio not in AP mode." 196 "Feature not supported"); 197 return QDF_STATUS_E_NOSUPPORT; 198 } 199 200 green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj(pdev, 201 WLAN_UMAC_COMP_GREEN_AP); 202 203 if (!green_ap_ctx) { 204 green_ap_err("green ap context obtained is NULL"); 205 return QDF_STATUS_E_NOSUPPORT; 206 } 207 208 ucfg_green_ap_set_ps_config(pdev, val); 209 210 if (wlan_util_is_vdev_active(pdev, WLAN_GREEN_AP_ID) == 211 QDF_STATUS_SUCCESS) 212 wlan_green_ap_start(pdev); 213 } else { 214 wlan_green_ap_stop(pdev); 215 } 216 217 return QDF_STATUS_SUCCESS; 218 } 219 220 void ucfg_green_ap_enable_debug_prints(struct wlan_objmgr_pdev *pdev, 221 uint32_t val) 222 { 223 struct wlan_pdev_green_ap_ctx *green_ap_ctx; 224 225 green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj( 226 pdev, WLAN_UMAC_COMP_GREEN_AP); 227 228 if (!green_ap_ctx) { 229 green_ap_err("green ap context obtained is NULL"); 230 return; 231 } 232 233 green_ap_ctx->dbg_enable = val; 234 } 235 236 bool ucfg_green_ap_get_debug_prints(struct wlan_objmgr_pdev *pdev) 237 { 238 struct wlan_pdev_green_ap_ctx *green_ap_ctx; 239 240 green_ap_ctx = wlan_objmgr_pdev_get_comp_private_obj( 241 pdev, WLAN_UMAC_COMP_GREEN_AP); 242 243 if (!green_ap_ctx) { 244 green_ap_err("green ap context obtained is NULL"); 245 return false; 246 } 247 248 return green_ap_ctx->dbg_enable; 249 } 250 251