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