diff --git a/power_management_offloads/core/inc/wlan_pmo_hw_bcast_fltr.h b/power_management_offloads/core/inc/wlan_pmo_hw_bcast_fltr.h new file mode 100644 index 0000000000..3fee75761d --- /dev/null +++ b/power_management_offloads/core/inc/wlan_pmo_hw_bcast_fltr.h @@ -0,0 +1,75 @@ +/* +* Copyright (c) 2017 The Linux Foundation. All rights reserved. +* +* Permission to use, copy, modify, and/or distribute this software for +* any purpose with or without fee is hereby granted, provided that the +* above copyright notice and this permission notice appear in all +* copies. +* +* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL +* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR +* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +* PERFORMANCE OF THIS SOFTWARE. +*/ +/** + * DOC: Declare arp offload feature API's + */ + +#ifndef _WLAN_PMO_NON_ARP_HW_BCAST_FILTER_H_ +#define _WLAN_PMO_NON_ARP_HW_BCAST_FILTER_H_ + +#include "wlan_pmo_non_arp_hwbcast_public_struct.h" + +/** + * pmo_core_do_enable_non_arp_bcast_filter() - API to enable + * hw broadcast filter + * @vdev: objmgr vdev + * + * API to enable hw broadcast filter in fwr from vdev priv ctx + * + * Return: QDF_STATUS_SUCCESS in case of success else return error + */ +QDF_STATUS pmo_core_do_enable_non_arp_bcast_filter( + struct wlan_objmgr_vdev *vdev, uint8_t vdev_id); + +/** + * pmo_core_do_disable_non_arp_bcast_filter() - API to enable + * hw broadcast filter + * @vdev: objmgr vdev + * + * API to enable hw broadcast filter in fwr from vdev priv ctx + * + * Return: QDF_STATUS_SUCCESS in case of success else return error + */ +QDF_STATUS pmo_core_do_disable_non_arp_bcast_filter( + struct wlan_objmgr_vdev *vdev, uint8_t vdev_id); + +/** + * pmo_core_enable_non_arp_bcast_filter_in_fwr() - API to enable + * hw broadcast filter + * @vdev: objmgr vdev + * + * API to enable hw broadcast filter in fwr from vdev priv ctx + * + * Return: QDF_STATUS_SUCCESS in case of success else return error + */ +QDF_STATUS pmo_core_enable_non_arp_bcast_filter_in_fwr( + struct wlan_objmgr_vdev *vdev); + +/** + * pmo_core_disable_non_arp_bcast_filter_in_fwr() - API to disable + * hw broadcast filter + * @vdev: objmgr vdev + * + * API to disable hw broadcast filter in fwr from vdev priv ctx + * + * Return: QQDF_STATUS_SUCCESS in case of success else return error + */ +QDF_STATUS pmo_core_disable_non_arp_bcast_filter_in_fwr( + struct wlan_objmgr_vdev *vdev); + +#endif /* end of _WLAN_PMO_NON_ARP_HW_BCAST_FILTER_H_*/ diff --git a/power_management_offloads/core/src/wlan_pmo_hw_bcast_fltr.c b/power_management_offloads/core/src/wlan_pmo_hw_bcast_fltr.c new file mode 100644 index 0000000000..2bbcc487e4 --- /dev/null +++ b/power_management_offloads/core/src/wlan_pmo_hw_bcast_fltr.c @@ -0,0 +1,148 @@ +/* +* Copyright (c) 2017 The Linux Foundation. All rights reserved. +* +* Permission to use, copy, modify, and/or distribute this software for +* any purpose with or without fee is hereby granted, provided that the +* above copyright notice and this permission notice appear in all +* copies. +* +* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL +* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR +* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +* PERFORMANCE OF THIS SOFTWARE. +*/ +/** + * DOC: Implements arp offload feature API's + */ + +#include "wlan_pmo_hw_bcast_fltr.h" +#include "wlan_pmo_tgt_api.h" +#include "wlan_pmo_main.h" +#include "wlan_pmo_obj_mgmt_public_struct.h" + +static QDF_STATUS pmo_core_non_arp_bcast_filter_sanity( + struct wlan_objmgr_vdev *vdev) +{ + struct pmo_vdev_priv_obj *vdev_ctx; + + if (!vdev) { + pmo_err("vdev is NULL"); + return QDF_STATUS_E_NULL_VALUE; + } + + vdev_ctx = pmo_get_vdev_priv_ctx(vdev); + if (!vdev_ctx) { + pmo_err("vdev_ctx is NULL"); + return QDF_STATUS_E_NULL_VALUE; + } + + if (!vdev_ctx->pmo_psoc_ctx->psoc_cfg.hw_bcast_filter) { + pmo_err("user disabled hw broadcast filter using ini"); + return QDF_STATUS_E_INVAL; + } + + if (!pmo_core_is_vdev_connected(vdev)) + return QDF_STATUS_E_INVAL; + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS pmo_core_do_enable_non_arp_bcast_filter( + struct wlan_objmgr_vdev *vdev, uint8_t vdev_id) +{ + QDF_STATUS status = QDF_STATUS_SUCCESS; + + PMO_ENTER(); + + status = pmo_tgt_enable_non_arp_bcast_filter_req(vdev, vdev_id); + + PMO_EXIT(); + + return status; +} + +QDF_STATUS pmo_core_do_disable_non_arp_bcast_filter( + struct wlan_objmgr_vdev *vdev, uint8_t vdev_id) +{ + QDF_STATUS status = QDF_STATUS_SUCCESS; + + PMO_ENTER(); + + status = pmo_tgt_enable_non_arp_bcast_filter_req(vdev, vdev_id); + + PMO_EXIT(); + + return status; +} + +QDF_STATUS pmo_core_enable_non_arp_bcast_filter_in_fwr( + struct wlan_objmgr_vdev *vdev) +{ + QDF_STATUS status; + uint8_t vdev_id; + + PMO_ENTER(); + if (!vdev) { + pmo_err("vdev is NULL"); + status = QDF_STATUS_E_NULL_VALUE; + goto out; + } + + status = wlan_objmgr_vdev_try_get_ref(vdev, WLAN_PMO_ID); + if (status != QDF_STATUS_SUCCESS) + goto out; + + status = pmo_core_non_arp_bcast_filter_sanity(vdev); + if (status != QDF_STATUS_SUCCESS) + goto def_ref; + + vdev_id = pmo_get_vdev_id(vdev); + pmo_info("Enable non arp hw bcast filter in fwr vdev id: %d vdev: %p", + vdev_id, vdev); + + status = pmo_core_do_enable_non_arp_bcast_filter(vdev, vdev_id); +def_ref: + wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID); +out: + PMO_EXIT(); + + return status; +} + +QDF_STATUS pmo_core_disable_non_arp_bcast_filter_in_fwr( + struct wlan_objmgr_vdev *vdev) +{ + QDF_STATUS status; + uint8_t vdev_id; + + PMO_ENTER(); + if (!vdev) { + pmo_err("vdev is NULL"); + status = QDF_STATUS_E_NULL_VALUE; + goto out; + } + + status = wlan_objmgr_vdev_try_get_ref(vdev, WLAN_PMO_ID); + if (status != QDF_STATUS_SUCCESS) + goto out; + + status = pmo_core_non_arp_bcast_filter_sanity(vdev); + if (status != QDF_STATUS_SUCCESS) + goto def_ref; + + vdev_id = pmo_get_vdev_id(vdev); + pmo_info("Disable non arp hw bcast filter in fwr vdev id: %d vdev: %p", + vdev_id, vdev); + + status = pmo_core_do_disable_non_arp_bcast_filter(vdev, vdev_id); +def_ref: + wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID); +out: + PMO_EXIT(); + + return status; +} diff --git a/power_management_offloads/dispatcher/inc/wlan_pmo_common_public_struct.h b/power_management_offloads/dispatcher/inc/wlan_pmo_common_public_struct.h index 1a1da8a396..c00d425895 100644 --- a/power_management_offloads/dispatcher/inc/wlan_pmo_common_public_struct.h +++ b/power_management_offloads/dispatcher/inc/wlan_pmo_common_public_struct.h @@ -243,6 +243,7 @@ enum pmo_offload_trigger { * @ptrn_match_enable_all_vdev: true when pattern match is enable for all vdev * @bpf_enable: true if psoc supports bpf else false * @arp_offload_enable: true if arp offload is supported for psoc else false + * @hw_bcast_filter: true if supports hw bcast filter in ine else flase * @ns_offload_enable_static: true if psoc supports ns offload in ini else false * @ns_offload_enable_dynamic: to enable / disable the ns offload using * ioctl or vendor command. @@ -268,6 +269,7 @@ struct pmo_psoc_cfg { bool ptrn_match_enable_all_vdev; bool bpf_enable; bool arp_offload_enable; + bool hw_bcast_filter; bool ns_offload_enable_static; bool ns_offload_enable_dynamic; bool ssdp; diff --git a/power_management_offloads/dispatcher/inc/wlan_pmo_non_arp_hwbcast_public_struct.h b/power_management_offloads/dispatcher/inc/wlan_pmo_non_arp_hwbcast_public_struct.h new file mode 100644 index 0000000000..9cac749305 --- /dev/null +++ b/power_management_offloads/dispatcher/inc/wlan_pmo_non_arp_hwbcast_public_struct.h @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2017 The Linux Foundation. All rights reserved. +* +* Permission to use, copy, modify, and/or distribute this software for +* any purpose with or without fee is hereby granted, provided that the +* above copyright notice and this permission notice appear in all +* copies. +* +* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL +* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR +* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +* PERFORMANCE OF THIS SOFTWARE. +*/ + /** + * DOC: Declare various struct, macros which shall be used in + * pmo arp offload feature. + * + * Note: This file shall not contain public API's prototype/declarations. + * + */ + +#ifndef _WLAN_PMO_NON_ARP_HW_BCAST_FILTER_PUBLIC_STRUCT_H_ +#define _WLAN_PMO_NON_ARP_HW_BCAST_FILTER_PUBLIC_STRUCT_H_ + +#include "wlan_pmo_common_public_struct.h" + +/** + * struct pmo_bcast_filter_req - pmo arp request + * @psoc: objmgr psoc + * @vdev_id: vdev id on which arp offload needed + */ +struct pmo_bcast_filter_req { + struct wlan_objmgr_psoc *psoc; + uint8_t vdev_id; +}; + +/** + * struct pmo_bcast_filter_params - For enable/disable pmo HW Broadcast Filter + * @enable: value to enable disable feature + * @bss_id: bss_id for get session. + */ +struct pmo_bcast_filter_params { + bool enable; + struct qdf_mac_addr bssid; +}; + +#endif /* end of _WLAN_PMO_NON_ARP_HW_BCAST_FILTER_PUBLIC_STRUCT_H_ */ + diff --git a/power_management_offloads/dispatcher/inc/wlan_pmo_tgt_api.h b/power_management_offloads/dispatcher/inc/wlan_pmo_tgt_api.h index 9920fdf65f..847439fb16 100644 --- a/power_management_offloads/dispatcher/inc/wlan_pmo_tgt_api.h +++ b/power_management_offloads/dispatcher/inc/wlan_pmo_tgt_api.h @@ -26,6 +26,28 @@ #define GET_PMO_TX_OPS_FROM_PSOC(psoc) (psoc->soc_cb.tx_ops.pmo_tx_ops) +/** + * pmo_tgt_enable_non_arp_bcast_filter_req() - Enable non arp + * hw bcast filter to target + * @vdev: objmgr vdev + * @vdev_id: vdev id + * + * Return: QDF status + */ +QDF_STATUS pmo_tgt_enable_non_arp_bcast_filter_req( + struct wlan_objmgr_vdev *vdev, uint8_t vdev_id); + +/** + * pmo_tgt_disable_non_arp_bcast_filter_req() - Disable non arp + * hw bcast filter to target + * @vdev: objmgr vdev + * @vdev_id: vdev id + * + * Return: QDF status + */ +QDF_STATUS pmo_tgt_disable_non_arp_bcast_filter_req( + struct wlan_objmgr_vdev *vdev, uint8_t vdev_id); + /** * pmo_tgt_enable_arp_offload_req() - Enable arp offload req to target * @vdev: objmgr vdev diff --git a/power_management_offloads/dispatcher/inc/wlan_pmo_ucfg_api.h b/power_management_offloads/dispatcher/inc/wlan_pmo_ucfg_api.h index a210784a70..157b082d0d 100644 --- a/power_management_offloads/dispatcher/inc/wlan_pmo_ucfg_api.h +++ b/power_management_offloads/dispatcher/inc/wlan_pmo_ucfg_api.h @@ -181,6 +181,30 @@ QDF_STATUS pmo_ucfg_enable_ns_offload_in_fwr(struct wlan_objmgr_vdev *vdev, QDF_STATUS pmo_ucfg_disable_ns_offload_in_fwr(struct wlan_objmgr_vdev *vdev, enum pmo_offload_trigger trigger); +/** + * pmo_ucfg_enable_non_arp_bcast_filter_in_fwr(): API to enable + * hw broadcast filter in fwr + * @vdev: objmgr vdev param + * + * API to enable hw broadcast filter from pmo vdev priv ctx + * + * Return QDF_STATUS -in case of success else return error + */ +QDF_STATUS pmo_ucfg_enable_non_arp_bcast_filter_in_fwr( + struct wlan_objmgr_vdev *vdev); + +/** + * pmo_ucfg_disable_non_arp_bcast_filter_in_fwr(): API to disable + * hw broadcast filter in fwr + * @vdev: objmgr vdev param + * + * API to disable hw broadcast filter from pmo vdev priv ctx + * + * Return QDF_STATUS -in case of success else return error + */ +QDF_STATUS pmo_ucfg_disable_non_arp_bcast_filter_in_fwr( + struct wlan_objmgr_vdev *vdev); + /** * pmo_ucfg_max_mc_addr_supported() - to get max support mc address * @psoc: objmgr psoc diff --git a/power_management_offloads/dispatcher/src/wlan_pmo_tgt_non_arp_bcast_fltr.c b/power_management_offloads/dispatcher/src/wlan_pmo_tgt_non_arp_bcast_fltr.c new file mode 100644 index 0000000000..20672ab5cf --- /dev/null +++ b/power_management_offloads/dispatcher/src/wlan_pmo_tgt_non_arp_bcast_fltr.c @@ -0,0 +1,160 @@ +/* +* Copyright (c) 2017 The Linux Foundation. All rights reserved. +* +* Permission to use, copy, modify, and/or distribute this software for +* any purpose with or without fee is hereby granted, provided that the +* above copyright notice and this permission notice appear in all +* copies. +* +* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL +* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR +* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +* PERFORMANCE OF THIS SOFTWARE. +*/ +/** + * DOC: Implements public API for pmo to interact with target/WMI + */ + +#include "wlan_pmo_tgt_api.h" +#include "wlan_pmo_non_arp_hwbcast_public_struct.h" +#include "wlan_pmo_obj_mgmt_public_struct.h" + +QDF_STATUS pmo_tgt_enable_non_arp_bcast_filter_req( + struct wlan_objmgr_vdev *vdev, + uint8_t vdev_id) +{ + struct pmo_bcast_filter_params *bcast_req = NULL; + struct pmo_vdev_priv_obj *vdev_ctx; + struct wlan_objmgr_psoc *psoc; + QDF_STATUS status; + struct wlan_lmac_if_pmo_tx_ops pmo_tx_ops; + struct qdf_mac_addr peer_bssid; + + PMO_ENTER(); + vdev_ctx = pmo_get_vdev_priv_ctx(vdev); + if (!vdev_ctx) { + pmo_err("vdev_ctx is NULL"); + status = QDF_STATUS_E_NULL_VALUE; + goto out; + } + + psoc = wlan_vdev_get_psoc(vdev); + if (!psoc) { + pmo_err("psoc unavailable for vdev %p", vdev); + status = QDF_STATUS_E_NULL_VALUE; + goto out; + } + + bcast_req = qdf_mem_malloc(sizeof(*bcast_req)); + if (!bcast_req) { + pmo_err("unable to allocate arp_offload_req"); + status = QDF_STATUS_E_NOMEM; + goto out; + } + + status = pmo_get_vdev_bss_peer_mac_addr(vdev, + &peer_bssid); + if (status != QDF_STATUS_SUCCESS) + goto out; + + qdf_mem_copy(&bcast_req->bssid.bytes, &peer_bssid.bytes, + QDF_MAC_ADDR_SIZE); + pmo_info("vdev self mac addr: %pM bss peer mac addr: %pM", + wlan_vdev_mlme_get_macaddr(vdev), + peer_bssid.bytes); + + bcast_req->enable = true; + + pmo_debug("Non ARP Broadcast filter vdev_id: %d enable: %d", + vdev_id, + bcast_req->enable); + + pmo_tx_ops = GET_PMO_TX_OPS_FROM_PSOC(psoc); + if (!pmo_tx_ops.send_non_arp_bcast_filter_req) { + pmo_err("send_non_arp_bcast_filter_req is null"); + status = QDF_STATUS_E_NULL_VALUE; + goto out; + } + + status = pmo_tx_ops.send_non_arp_bcast_filter_req( + vdev, bcast_req); + +out: + if (bcast_req) + qdf_mem_free(bcast_req); + PMO_EXIT(); + + return status; +} + +QDF_STATUS pmo_tgt_disable_non_arp_bcast_filter_req( + struct wlan_objmgr_vdev *vdev, + uint8_t vdev_id) +{ + struct pmo_bcast_filter_params *bcast_req = NULL; + struct pmo_vdev_priv_obj *vdev_ctx; + struct wlan_objmgr_psoc *psoc; + QDF_STATUS status; + struct wlan_lmac_if_pmo_tx_ops pmo_tx_ops; + struct qdf_mac_addr peer_bssid; + + PMO_ENTER(); + vdev_ctx = pmo_get_vdev_priv_ctx(vdev); + if (!vdev_ctx) { + pmo_err("vdev_ctx is NULL"); + status = QDF_STATUS_E_NULL_VALUE; + goto out; + } + + psoc = wlan_vdev_get_psoc(vdev); + if (!psoc) { + pmo_err("psoc unavailable for vdev %p", vdev); + status = QDF_STATUS_E_NULL_VALUE; + goto out; + } + + bcast_req = qdf_mem_malloc(sizeof(*bcast_req)); + if (!bcast_req) { + pmo_err("unable to allocate arp_offload_req"); + status = QDF_STATUS_E_NOMEM; + goto out; + } + + status = pmo_get_vdev_bss_peer_mac_addr(vdev, + &peer_bssid); + if (status != QDF_STATUS_SUCCESS) + goto out; + + qdf_mem_copy(&bcast_req->bssid.bytes, &peer_bssid.bytes, + QDF_MAC_ADDR_SIZE); + pmo_info("vdev self mac addr: %pM bss peer mac addr: %pM", + wlan_vdev_mlme_get_macaddr(vdev), + peer_bssid.bytes); + + bcast_req->enable = false; + + pmo_debug("Non ARP Broadcast filter vdev_id: %d enable: %d", + vdev_id, + bcast_req->enable); + + pmo_tx_ops = GET_PMO_TX_OPS_FROM_PSOC(psoc); + if (!pmo_tx_ops.send_non_arp_bcast_filter_req) { + pmo_err("send_non_arp_bcast_filter_req is null"); + status = QDF_STATUS_E_NULL_VALUE; + goto out; + } + + status = pmo_tx_ops.send_non_arp_bcast_filter_req( + vdev, bcast_req); + +out: + if (bcast_req) + qdf_mem_free(bcast_req); + PMO_EXIT(); + + return status; +} diff --git a/power_management_offloads/dispatcher/src/wlan_pmo_ucfg_api.c b/power_management_offloads/dispatcher/src/wlan_pmo_ucfg_api.c index fb2caffc59..8651d6fbb9 100644 --- a/power_management_offloads/dispatcher/src/wlan_pmo_ucfg_api.c +++ b/power_management_offloads/dispatcher/src/wlan_pmo_ucfg_api.c @@ -21,6 +21,7 @@ #include "wlan_pmo_ucfg_api.h" #include "wlan_pmo_arp.h" +#include "wlan_pmo_hw_bcast_fltr.h" #include "wlan_pmo_ns.h" #include "wlan_pmo_gtk.h" #include "wlan_pmo_wow.h" @@ -91,6 +92,18 @@ QDF_STATUS pmo_ucfg_disable_arp_offload_in_fwr(struct wlan_objmgr_vdev *vdev, return pmo_core_disable_arp_offload_in_fwr(vdev, trigger); } +QDF_STATUS pmo_ucfg_enable_non_arp_bcast_filter_in_fwr( + struct wlan_objmgr_vdev *vdev) +{ + return pmo_core_enable_non_arp_bcast_filter_in_fwr(vdev); +} + +QDF_STATUS pmo_ucfg_disable_non_arp_bcast_filter_in_fwr( + struct wlan_objmgr_vdev *vdev) +{ + return pmo_core_disable_non_arp_bcast_filter_in_fwr(vdev); +} + QDF_STATUS pmo_ucfg_cache_ns_offload_req(struct pmo_ns_req *ns_req) { return pmo_core_cache_ns_offload_req(ns_req); diff --git a/target_if/pmo/inc/target_if_pmo.h b/target_if/pmo/inc/target_if_pmo.h index 88fa2d7597..514d8c940a 100644 --- a/target_if/pmo/inc/target_if_pmo.h +++ b/target_if/pmo/inc/target_if_pmo.h @@ -124,6 +124,19 @@ QDF_STATUS target_if_pmo_send_action_frame_patterns( struct wlan_objmgr_vdev *vdev, struct pmo_action_wakeup_set_params *ip_cmd); +/** + * target_if_pmo_send_non_arp_bcast_filter_req() - Enable/Disable Broadcast + * @vdev: objmgr vdev + * @bcast_req: enable/disable hw bcast filter + * + * This functions enable/disable non arp hw bcast filter. + * + * Return: QDF_STATUS_SUCCESS for success or error code + */ +QDF_STATUS target_if_pmo_send_non_arp_bcast_filter_req( + struct wlan_objmgr_vdev *vdev, + struct pmo_bcast_filter_params *bcast_req); + /** * target_if_pmo_send_arp_offload_req() - sends arp request to fwr * @vdev: objmgr vdev diff --git a/target_if/pmo/src/target_if_pmo_main.c b/target_if/pmo/src/target_if_pmo_main.c index 735291a5b4..ee11f44cea 100644 --- a/target_if/pmo/src/target_if_pmo_main.c +++ b/target_if/pmo/src/target_if_pmo_main.c @@ -36,6 +36,8 @@ void target_if_pmo_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops) pmo_tx_ops = &tx_ops->pmo_tx_ops; pmo_tx_ops->send_arp_offload_req = target_if_pmo_send_arp_offload_req; + pmo_tx_ops->send_non_arp_bcast_filter_req = + target_if_pmo_send_non_arp_bcast_filter_req; pmo_tx_ops->send_ns_offload_req = target_if_pmo_send_ns_offload_req; pmo_tx_ops->send_enable_wow_wakeup_event_req = diff --git a/target_if/pmo/src/target_if_pmo_non_arp_bcast_fltr.c b/target_if/pmo/src/target_if_pmo_non_arp_bcast_fltr.c new file mode 100644 index 0000000000..0dcb059a23 --- /dev/null +++ b/target_if/pmo/src/target_if_pmo_non_arp_bcast_fltr.c @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2017 The Linux Foundation. All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for + * any purpose with or without fee is hereby granted, provided that the + * above copyright notice and this permission notice appear in all + * copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ +/** + * DOC: target_if_pmo_non_arp_bcast_fltr.c + * + * Target interface file for pmo component to + * send non arp hw bcast filtering related cmd and process event. + */ + +#include "target_if.h" +#include "target_if_pmo.h" +#include "wmi_unified_api.h" +#include "wlan_pmo_non_arp_hwbcast_public_struct.h" + +QDF_STATUS target_if_pmo_send_non_arp_bcast_filter_req( + struct wlan_objmgr_vdev *vdev, + struct pmo_bcast_filter_params *bcast_req) +{ + uint8_t vdev_id; + struct wlan_objmgr_psoc *psoc; + QDF_STATUS status; + + if (!vdev) { + target_if_err("vdev ptr passed is NULL"); + return QDF_STATUS_E_INVAL; + } + + wlan_vdev_obj_lock(vdev); + psoc = wlan_vdev_get_psoc(vdev); + vdev_id = wlan_vdev_get_id(vdev); + wlan_vdev_obj_unlock(vdev); + if (!psoc) { + target_if_err("psoc handle is NULL"); + return QDF_STATUS_E_INVAL; + } + + status = wmi_unified_configure_broadcast_filter_cmd( + GET_WMI_HDL_FROM_PSOC(psoc), + vdev_id, + bcast_req->enable); + + if (status != QDF_STATUS_SUCCESS) + target_if_err("Failed to enable HW Broadcast filter"); + + return status; +}