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 * DOC: Implement API's specific to PMO component. 20 */ 21 22 #include "ol_if_athvar.h" 23 #include "ol_defines.h" 24 #include "wmi_unified_priv.h" 25 #include "wmi_unified_pmo_api.h" 26 #include "wlan_pmo_hw_filter_public_struct.h" 27 28 QDF_STATUS wmi_unified_add_wow_wakeup_event_cmd(void *wmi_hdl, 29 uint32_t vdev_id, 30 uint32_t *bitmap, 31 bool enable) 32 { 33 struct wmi_unified *wmi_handle = (struct wmi_unified *) wmi_hdl; 34 35 if (wmi_handle->ops->send_add_wow_wakeup_event_cmd) 36 return wmi_handle->ops->send_add_wow_wakeup_event_cmd( 37 wmi_handle, vdev_id, bitmap, enable); 38 39 return QDF_STATUS_E_FAILURE; 40 } 41 42 QDF_STATUS wmi_unified_wow_patterns_to_fw_cmd(void *wmi_hdl, 43 uint8_t vdev_id, uint8_t ptrn_id, 44 const uint8_t *ptrn, uint8_t ptrn_len, 45 uint8_t ptrn_offset, const uint8_t *mask, 46 uint8_t mask_len, bool user, 47 uint8_t default_patterns) 48 { 49 struct wmi_unified *wmi_handle = (struct wmi_unified *) wmi_hdl; 50 51 if (wmi_handle->ops->send_wow_patterns_to_fw_cmd) 52 return wmi_handle->ops->send_wow_patterns_to_fw_cmd(wmi_handle, 53 vdev_id, ptrn_id, ptrn, 54 ptrn_len, ptrn_offset, mask, 55 mask_len, user, default_patterns); 56 57 return QDF_STATUS_E_FAILURE; 58 } 59 60 QDF_STATUS wmi_unified_add_clear_mcbc_filter_cmd(void *wmi_hdl, 61 uint8_t vdev_id, 62 struct qdf_mac_addr multicast_addr, 63 bool clearList) 64 { 65 struct wmi_unified *wmi_handle = (struct wmi_unified *)wmi_hdl; 66 67 if (wmi_handle->ops->send_add_clear_mcbc_filter_cmd) 68 return wmi_handle->ops->send_add_clear_mcbc_filter_cmd( 69 wmi_handle, vdev_id, multicast_addr, clearList); 70 71 return QDF_STATUS_E_FAILURE; 72 } 73 74 QDF_STATUS wmi_unified_multiple_add_clear_mcbc_filter_cmd(void *wmi_hdl, 75 uint8_t vdev_id, 76 struct pmo_mcast_filter_params *filter_param) 77 { 78 struct wmi_unified *wmi_handle = (struct wmi_unified *)wmi_hdl; 79 80 if (wmi_handle->ops->send_multiple_add_clear_mcbc_filter_cmd) 81 return wmi_handle->ops->send_multiple_add_clear_mcbc_filter_cmd( 82 wmi_handle, vdev_id, filter_param); 83 84 return QDF_STATUS_E_FAILURE; 85 } 86 87 #ifdef FEATURE_WLAN_RA_FILTERING 88 QDF_STATUS wmi_unified_wow_sta_ra_filter_cmd(void *wmi_hdl, 89 uint8_t vdev_id, uint8_t default_pattern, 90 uint16_t rate_limit_interval) 91 { 92 93 struct wmi_unified *wmi_handle = (struct wmi_unified *)wmi_hdl; 94 95 if (wmi_handle->ops->send_wow_sta_ra_filter_cmd) 96 return wmi_handle->ops->send_wow_sta_ra_filter_cmd(wmi_handle, 97 vdev_id, default_pattern, rate_limit_interval); 98 99 return QDF_STATUS_E_FAILURE; 100 101 } 102 #endif /* FEATURE_WLAN_RA_FILTERING */ 103 104 QDF_STATUS wmi_unified_enable_enhance_multicast_offload_cmd( 105 void *wmi_hdl, uint8_t vdev_id, bool action) 106 { 107 struct wmi_unified *wmi_handle = (struct wmi_unified *)wmi_hdl; 108 struct wmi_ops *ops; 109 110 ops = wmi_handle->ops; 111 if (ops && ops->send_enable_enhance_multicast_offload_cmd) 112 return ops->send_enable_enhance_multicast_offload_cmd( 113 wmi_handle, vdev_id, action); 114 115 return QDF_STATUS_E_FAILURE; 116 } 117 118 QDF_STATUS wmi_extract_gtk_rsp_event(void *wmi_hdl, void *evt_buf, 119 struct pmo_gtk_rsp_params *gtk_rsp_param, uint32_t len) 120 { 121 struct wmi_unified *wmi_handle = (struct wmi_unified *)wmi_hdl; 122 123 if (wmi_handle->ops->extract_gtk_rsp_event) 124 return wmi_handle->ops->extract_gtk_rsp_event(wmi_handle, 125 evt_buf, gtk_rsp_param, len); 126 127 return QDF_STATUS_E_FAILURE; 128 } 129 130 131 QDF_STATUS wmi_unified_process_gtk_offload_getinfo_cmd(void *wmi_hdl, 132 uint8_t vdev_id, 133 uint64_t offload_req_opcode) 134 { 135 struct wmi_unified *wmi_handle = (struct wmi_unified *)wmi_hdl; 136 137 if (wmi_handle->ops->send_process_gtk_offload_getinfo_cmd) 138 return wmi_handle->ops->send_process_gtk_offload_getinfo_cmd( 139 wmi_handle, vdev_id, offload_req_opcode); 140 141 return QDF_STATUS_E_FAILURE; 142 } 143 144 QDF_STATUS wmi_unified_action_frame_patterns_cmd(void *wmi_hdl, 145 struct pmo_action_wakeup_set_params *action_params) 146 { 147 struct wmi_unified *wmi_handle = (struct wmi_unified *)wmi_hdl; 148 149 if (wmi_handle->ops->send_action_frame_patterns_cmd) 150 return wmi_handle->ops->send_action_frame_patterns_cmd( 151 wmi_handle, action_params); 152 153 return QDF_STATUS_E_FAILURE; 154 } 155 156 QDF_STATUS wmi_unified_send_gtk_offload_cmd(void *wmi_hdl, uint8_t vdev_id, 157 struct pmo_gtk_req *params, 158 bool enable_offload, 159 uint32_t gtk_offload_opcode) 160 { 161 struct wmi_unified *wmi_handle = (struct wmi_unified *)wmi_hdl; 162 163 if (wmi_handle->ops->send_gtk_offload_cmd) 164 return wmi_handle->ops->send_gtk_offload_cmd(wmi_handle, 165 vdev_id, params, enable_offload, 166 gtk_offload_opcode); 167 168 return QDF_STATUS_E_FAILURE; 169 } 170 171 #ifdef WLAN_FEATURE_PACKET_FILTERING 172 QDF_STATUS wmi_unified_enable_disable_packet_filter_cmd(void *wmi_hdl, 173 uint8_t vdev_id, bool enable) 174 { 175 wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl; 176 177 if (wmi_handle->ops->send_enable_disable_packet_filter_cmd) 178 return wmi_handle->ops->send_enable_disable_packet_filter_cmd( 179 wmi_handle, vdev_id, enable); 180 181 return QDF_STATUS_E_FAILURE; 182 } 183 184 QDF_STATUS wmi_unified_config_packet_filter_cmd(void *wmi_hdl, 185 uint8_t vdev_id, struct pmo_rcv_pkt_fltr_cfg *rcv_filter_param, 186 uint8_t filter_id, bool enable) 187 { 188 wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl; 189 190 if (wmi_handle->ops->send_config_packet_filter_cmd) 191 return wmi_handle->ops->send_config_packet_filter_cmd( 192 wmi_handle, vdev_id, rcv_filter_param, filter_id, enable); 193 194 return QDF_STATUS_E_FAILURE; 195 } 196 #endif 197 198 QDF_STATUS wmi_unified_enable_arp_ns_offload_cmd(void *wmi_hdl, 199 struct pmo_arp_offload_params *arp_offload_req, 200 struct pmo_ns_offload_params *ns_offload_req, 201 uint8_t vdev_id) 202 { 203 struct wmi_unified *wmi_handle = (struct wmi_unified *)wmi_hdl; 204 205 if (wmi_handle->ops->send_enable_arp_ns_offload_cmd) 206 return wmi_handle->ops->send_enable_arp_ns_offload_cmd( 207 wmi_handle, 208 arp_offload_req, ns_offload_req, vdev_id); 209 210 return QDF_STATUS_E_FAILURE; 211 } 212 213 QDF_STATUS wmi_unified_conf_hw_filter_cmd(void *opaque_wmi, 214 struct pmo_hw_filter_params *req) 215 { 216 struct wmi_unified *wmi = opaque_wmi; 217 218 if (!wmi->ops->send_conf_hw_filter_cmd) 219 return QDF_STATUS_E_NOSUPPORT; 220 221 return wmi->ops->send_conf_hw_filter_cmd(wmi, req); 222 } 223 224 #ifdef FEATURE_WLAN_LPHB 225 QDF_STATUS wmi_unified_lphb_config_hbenable_cmd(void *wmi_hdl, 226 wmi_hb_set_enable_cmd_fixed_param *params) 227 { 228 struct wmi_unified *wmi_handle = (struct wmi_unified *)wmi_hdl; 229 230 if (wmi_handle->ops->send_lphb_config_hbenable_cmd) 231 return wmi_handle->ops->send_lphb_config_hbenable_cmd( 232 wmi_handle, params); 233 234 return QDF_STATUS_E_FAILURE; 235 } 236 237 QDF_STATUS wmi_unified_lphb_config_tcp_params_cmd(void *wmi_hdl, 238 wmi_hb_set_tcp_params_cmd_fixed_param *lphb_conf_req) 239 { 240 struct wmi_unified *wmi_handle = (struct wmi_unified *)wmi_hdl; 241 242 if (wmi_handle->ops->send_lphb_config_tcp_params_cmd) 243 return wmi_handle->ops->send_lphb_config_tcp_params_cmd( 244 wmi_handle, lphb_conf_req); 245 246 return QDF_STATUS_E_FAILURE; 247 } 248 249 QDF_STATUS wmi_unified_lphb_config_tcp_pkt_filter_cmd(void *wmi_hdl, 250 wmi_hb_set_tcp_pkt_filter_cmd_fixed_param *g_hb_tcp_filter_fp) 251 { 252 struct wmi_unified *wmi_handle = (struct wmi_unified *)wmi_hdl; 253 254 if (wmi_handle->ops->send_lphb_config_tcp_pkt_filter_cmd) 255 return wmi_handle->ops->send_lphb_config_tcp_pkt_filter_cmd( 256 wmi_handle, g_hb_tcp_filter_fp); 257 258 return QDF_STATUS_E_FAILURE; 259 } 260 261 QDF_STATUS wmi_unified_lphb_config_udp_params_cmd(void *wmi_hdl, 262 wmi_hb_set_udp_params_cmd_fixed_param *lphb_conf_req) 263 { 264 struct wmi_unified *wmi_handle = (struct wmi_unified *)wmi_hdl; 265 266 if (wmi_handle->ops->send_lphb_config_udp_params_cmd) 267 return wmi_handle->ops->send_lphb_config_udp_params_cmd( 268 wmi_handle, lphb_conf_req); 269 270 return QDF_STATUS_E_FAILURE; 271 } 272 273 QDF_STATUS wmi_unified_lphb_config_udp_pkt_filter_cmd(void *wmi_hdl, 274 wmi_hb_set_udp_pkt_filter_cmd_fixed_param *lphb_conf_req) 275 { 276 struct wmi_unified *wmi_handle = (struct wmi_unified *)wmi_hdl; 277 278 if (wmi_handle->ops->send_lphb_config_udp_pkt_filter_cmd) 279 return wmi_handle->ops->send_lphb_config_udp_pkt_filter_cmd( 280 wmi_handle, lphb_conf_req); 281 282 return QDF_STATUS_E_FAILURE; 283 } 284 #endif /* FEATURE_WLAN_LPHB */ 285