1 /* 2 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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: contains interface prototypes for OS_IF layer 19 */ 20 #include <qdf_trace.h> 21 #include <spatial_reuse_ucfg_api.h> 22 #include <spatial_reuse_api.h> 23 #include <wlan_policy_mgr_api.h> 24 ucfg_spatial_reuse_register_cb(struct wlan_objmgr_psoc * psoc,sr_osif_event_cb cb)25 void ucfg_spatial_reuse_register_cb(struct wlan_objmgr_psoc *psoc, 26 sr_osif_event_cb cb) 27 { 28 wlan_sr_register_callback(psoc, cb); 29 } 30 ucfg_spatial_reuse_get_sr_config(struct wlan_objmgr_vdev * vdev,uint8_t * sr_ctrl,uint8_t * non_srg_max_pd_offset,bool * he_spr_enabled)31 void ucfg_spatial_reuse_get_sr_config(struct wlan_objmgr_vdev *vdev, 32 uint8_t *sr_ctrl, 33 uint8_t *non_srg_max_pd_offset, 34 bool *he_spr_enabled) 35 { 36 *sr_ctrl = wlan_vdev_mlme_get_sr_ctrl(vdev); 37 *non_srg_max_pd_offset = wlan_vdev_mlme_get_non_srg_pd_offset(vdev); 38 *he_spr_enabled = wlan_vdev_mlme_get_he_spr_enabled(vdev); 39 } 40 ucfg_spatial_reuse_set_sr_config(struct wlan_objmgr_vdev * vdev,uint8_t sr_ctrl,uint8_t non_srg_max_pd_offset)41 void ucfg_spatial_reuse_set_sr_config(struct wlan_objmgr_vdev *vdev, 42 uint8_t sr_ctrl, 43 uint8_t non_srg_max_pd_offset) 44 { 45 wlan_vdev_mlme_set_sr_ctrl(vdev, sr_ctrl); 46 wlan_vdev_mlme_set_non_srg_pd_offset(vdev, non_srg_max_pd_offset); 47 } 48 ucfg_spatial_reuse_is_sr_disabled_due_conc(struct wlan_objmgr_vdev * vdev)49 bool ucfg_spatial_reuse_is_sr_disabled_due_conc(struct wlan_objmgr_vdev *vdev) 50 { 51 return wlan_vdev_mlme_is_sr_disable_due_conc(vdev); 52 } 53 ucfg_spatial_reuse_set_sr_conc_stat(struct wlan_objmgr_vdev * vdev,bool sr_conc_disabled)54 void ucfg_spatial_reuse_set_sr_conc_stat(struct wlan_objmgr_vdev *vdev, 55 bool sr_conc_disabled) 56 { 57 wlan_vdev_mlme_set_sr_disable_due_conc(vdev, sr_conc_disabled); 58 } 59 ucfg_spatial_reuse_send_sr_config(struct wlan_objmgr_vdev * vdev,bool enable)60 void ucfg_spatial_reuse_send_sr_config(struct wlan_objmgr_vdev *vdev, 61 bool enable) 62 { 63 uint8_t sr_ctrl = 0; 64 /* Disabled PD Threshold */ 65 uint8_t non_srg_max_pd_offset = 0x80; 66 67 /* SR feature itself is disabled by user */ 68 if (!wlan_vdev_mlme_get_he_spr_enabled(vdev)) 69 return; 70 /* SR is disabled due to conccurrency */ 71 if (ucfg_spatial_reuse_is_sr_disabled_due_conc(vdev)) 72 return; 73 74 if (enable) { 75 sr_ctrl = wlan_vdev_mlme_get_sr_ctrl(vdev); 76 non_srg_max_pd_offset = 77 wlan_vdev_mlme_get_non_srg_pd_offset(vdev); 78 if (sr_ctrl && non_srg_max_pd_offset) 79 wlan_spatial_reuse_config_set(vdev, sr_ctrl, 80 non_srg_max_pd_offset); 81 } else { 82 wlan_spatial_reuse_config_set(vdev, sr_ctrl, 83 non_srg_max_pd_offset); 84 } 85 } 86 ucfg_spatial_reuse_set_sr_enable(struct wlan_objmgr_vdev * vdev,bool enable)87 void ucfg_spatial_reuse_set_sr_enable(struct wlan_objmgr_vdev *vdev, 88 bool enable) 89 { 90 wlan_vdev_mlme_set_he_spr_enabled(vdev, enable); 91 } 92 ucfg_spatial_reuse_send_sr_prohibit(struct wlan_objmgr_vdev * vdev,bool enable_he_siga_val15_prohibit)93 QDF_STATUS ucfg_spatial_reuse_send_sr_prohibit( 94 struct wlan_objmgr_vdev *vdev, 95 bool enable_he_siga_val15_prohibit) 96 { 97 QDF_STATUS status = QDF_STATUS_SUCCESS; 98 bool sr_enabled = wlan_vdev_mlme_get_he_spr_enabled(vdev); 99 bool sr_prohibited = wlan_vdev_mlme_is_sr_prohibit_en(vdev); 100 uint8_t sr_ctrl = wlan_vdev_mlme_get_sr_ctrl(vdev); 101 102 /* Enable PD prohibit only when it is allowed by the AP, 103 * Check if it is not enabled already, then only enable it 104 */ 105 if (sr_enabled && (sr_ctrl & WLAN_HE_SIGA_SR_VAL15_ALLOWED) && 106 sr_prohibited != enable_he_siga_val15_prohibit) { 107 status = wlan_spatial_reuse_he_siga_val15_allowed_set 108 (vdev, 109 enable_he_siga_val15_prohibit); 110 111 if (QDF_IS_STATUS_SUCCESS(status)) 112 wlan_vdev_mlme_set_sr_prohibit_en 113 (vdev, 114 enable_he_siga_val15_prohibit); 115 } else { 116 mlme_debug("Prohibit command can not be sent sr_enabled %d, sr_ctrl %d , sr_prohibited %d", 117 sr_enabled, 118 sr_ctrl, 119 sr_prohibited); 120 121 return QDF_STATUS_E_FAILURE; 122 } 123 return status; 124 } 125 126 QDF_STATUS ucfg_spatial_reuse_setup_req(struct wlan_objmgr_vdev * vdev,struct wlan_objmgr_pdev * pdev,bool is_sr_enable,int32_t srg_pd_threshold,int32_t non_srg_pd_threshold)127 ucfg_spatial_reuse_setup_req(struct wlan_objmgr_vdev *vdev, 128 struct wlan_objmgr_pdev *pdev, 129 bool is_sr_enable, int32_t srg_pd_threshold, 130 int32_t non_srg_pd_threshold) 131 { 132 return wlan_sr_setup_req(vdev, pdev, is_sr_enable, 133 srg_pd_threshold, non_srg_pd_threshold); 134 } 135 ucfg_spatial_reuse_operation_allowed(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_vdev * vdev)136 QDF_STATUS ucfg_spatial_reuse_operation_allowed(struct wlan_objmgr_psoc *psoc, 137 struct wlan_objmgr_vdev *vdev) 138 { 139 uint32_t conc_vdev_id; 140 uint8_t vdev_id, mac_id; 141 QDF_STATUS status = QDF_STATUS_SUCCESS; 142 143 if (!vdev || !psoc) 144 return QDF_STATUS_E_NULL_VALUE; 145 146 vdev_id = wlan_vdev_get_id(vdev); 147 if (!policy_mgr_get_connection_count(psoc)) { 148 mlme_debug("No active vdev"); 149 return status; 150 } 151 status = policy_mgr_get_mac_id_by_session_id(psoc, vdev_id, &mac_id); 152 if (QDF_IS_STATUS_ERROR(status)) 153 return status; 154 conc_vdev_id = policy_mgr_get_conc_vdev_on_same_mac(psoc, vdev_id, 155 mac_id); 156 if (conc_vdev_id != WLAN_INVALID_VDEV_ID && 157 !policy_mgr_sr_same_mac_conc_enabled(psoc)) 158 return QDF_STATUS_E_NOSUPPORT; 159 return status; 160 } 161