Browse Source

qcacmn: Add PMO functionality in target interface

Add PMO functionality in target interface

Change-Id: I49d2a8cf2f6e416fce6c5360ea5e6686574bfe88
CRs-Fixed: 2002388
Mukul Sharma 8 years ago
parent
commit
33f335ad4a

+ 30 - 0
target_if/core/src/target_if_main.c

@@ -22,6 +22,9 @@
  */
 
 #include "target_if.h"
+#ifdef WLAN_PMO_ENABLE
+#include "target_if_pmo_main.h"
+#endif
 
 static struct target_if_ctx *g_target_if_ctx;
 
@@ -94,12 +97,39 @@ QDF_STATUS target_if_register_umac_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
 	return QDF_STATUS_SUCCESS;
 }
 
+#ifdef WLAN_PMO_ENABLE
+/**
+ * target_if_pmo_register_tx_ops_req() - Wrapper API to register pmo tx ops.
+ * @tx_ops: psoc's lmac if transmit operations
+ *
+ * Return: None
+ */
+static void target_if_pmo_register_tx_ops_req(
+		struct wlan_lmac_if_tx_ops *tx_ops)
+{
+	target_if_pmo_register_tx_ops(tx_ops);
+}
+#else
+/**
+ * target_if_pmo_register_tx_ops_req() - Dummy API to register pmo tx ops.
+ * @tx_ops: psoc's lmac if transmit operations
+ *
+ * Return: None
+ */
+static void target_if_pmo_register_tx_ops_req(
+		struct wlan_lmac_if_tx_ops *tx_ops)
+{
+}
+#endif /* WLAN_PMO_ENABLE */
+
 QDF_STATUS target_if_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
 {
 	/* Converged UMAC components to register their TX-ops */
 	target_if_register_umac_tx_ops(tx_ops);
 
 	/* Components parallel to UMAC to register their TX-ops here */
+	target_if_pmo_register_tx_ops_req(tx_ops);
+
 	return QDF_STATUS_SUCCESS;
 }
 

+ 188 - 0
target_if/pmo/inc/target_if_pmo.h

@@ -0,0 +1,188 @@
+/*
+* 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 api/struct which shall be used
+* by pmo component for wmi cmd (tx path) and
+* event (rx) handling.
+*/
+
+#ifndef _TARGET_IF_PMO_H_
+#define _TARGET_IF_PMO_H_
+
+#include "target_if.h"
+#include "wlan_pmo_tgt_api.h"
+
+/**
+ * target_if_pmo_enable_wow_wakeup_event() - Enable wow wakeup events.
+ * @vdev:objmgr vdev handle
+ * @bitmap: Event bitmap
+ * @enable: enable/disable
+ *
+ * Return: QDF status
+ */
+QDF_STATUS target_if_pmo_enable_wow_wakeup_event(struct wlan_objmgr_vdev *vdev,
+		uint32_t bitmap);
+
+/**
+ * target_if_pmo_disable_wow_wakeup_event() -  Disable wow wakeup events.
+ * @vdev:objmgr vdev handle
+ * @bitmap: Event bitmap
+ * @enable: enable/disable
+ *
+ * Return: QDF status
+ */
+QDF_STATUS target_if_pmo_disable_wow_wakeup_event(
+		struct wlan_objmgr_vdev *vdev, uint32_t bitmap);
+
+/**
+ * target_if_pmo_send_wow_patterns_to_fw() - Sends WOW patterns to FW.
+ * @vdev: objmgr vdev handle
+ * @ptrn_id: pattern id
+ * @ptrn: pattern
+ * @ptrn_len: pattern length
+ * @ptrn_offset: pattern offset
+ * @mask: mask
+ * @mask_len: mask length
+ * @user: true for user configured pattern and false for default pattern
+ *
+ * Return: QDF status
+ */
+QDF_STATUS target_if_pmo_send_wow_patterns_to_fw(struct wlan_objmgr_vdev *vdev,
+		uint8_t ptrn_id,
+		const uint8_t *ptrn, uint8_t ptrn_len,
+		uint8_t ptrn_offset, const uint8_t *mask,
+		uint8_t mask_len, bool user);
+
+/**
+ * target_if_pmo_send_enhance_mc_offload_req() - send enhance mc offload req
+ * @vdev: objmgr vdev
+ * @action: enable or disable enhance multicast offload
+ *
+ * Return: QDF_STATUS_SUCCESS on success else error code
+ */
+QDF_STATUS target_if_pmo_send_enhance_mc_offload_req(
+		struct wlan_objmgr_vdev *vdev,
+		bool enable);
+
+/**
+ * target_if_pmo_set_mc_filter_req() - set mcast filter command to fw
+ * @vdev: objmgr vdev handle
+ * @multicastAddr: mcast address
+ *
+ * Return: 0 for success or error code
+ */
+QDF_STATUS target_if_pmo_set_mc_filter_req(struct wlan_objmgr_vdev *vdev,
+		struct qdf_mac_addr multicast_addr);
+
+/**
+ * target_if_pmo_clear_mc_filter_req() - clear mcast filter command to fw
+ * @vdev: objmgr vdev handle
+ * @multicastAddr: mcast address
+ *
+ * Return: 0 for success or error code
+ */
+QDF_STATUS target_if_pmo_clear_mc_filter_req(struct wlan_objmgr_vdev *vdev,
+		struct qdf_mac_addr multicast_addr);
+
+/**
+ * target_if_pmo_send_ra_filter_req() - set RA filter pattern in fw
+ * @vdev: objmgr vdev handle
+ * @default_pattern: default pattern id
+ * @rate_limit_interval: ra rate limit interval
+ *
+ * Return: QDF status
+ */
+QDF_STATUS target_if_pmo_send_ra_filter_req(struct wlan_objmgr_vdev *vdev,
+		uint8_t default_pattern, uint16_t rate_limit_interval);
+
+/**
+ * target_if_pmo_send_action_frame_patterns() - register action frame map to fw
+ * @handle: Pointer to wma handle
+ * @vdev_id: VDEV ID
+ *
+ * This is called to push action frames wow patterns from local
+ * cache to firmware.
+ *
+ * Return: QDF_STATUS
+ */
+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_arp_offload_req() - sends arp request to fwr
+ * @vdev: objmgr vdev
+ * @arp_offload_req: arp offload req
+ * @ns_offload_req: ns offload request
+ *
+ * This functions sends arp request to fwr.
+ *
+ * Return: QDF_STATUS_SUCCESS for success or error code
+ */
+QDF_STATUS target_if_pmo_send_arp_offload_req(
+		struct wlan_objmgr_vdev *vdev,
+		struct pmo_arp_offload_params *arp_offload_req,
+		struct pmo_ns_offload_params *ns_offload_req);
+
+/**
+ * target_if_pmo_send_ns_offload_req() - sends ns request to fwr
+ * @vdev: objmgr vdev
+ * @arp_offload_req: arp offload req
+ * @ns_offload_req: ns offload request
+ *
+ * This functions sends ns request to fwr.
+ *
+ * Return: QDF_STATUS_SUCCESS for success or error code
+ */
+QDF_STATUS target_if_pmo_send_ns_offload_req(
+		struct wlan_objmgr_vdev *vdev,
+		struct pmo_arp_offload_params *arp_offload_req,
+		struct pmo_ns_offload_params *ns_offload_req);
+
+/**
+ * target_if_pmo_send_gtk_offload_req() - send gtk offload request in fwr
+ * @vdev: objmgr vdev handle
+ * @gtk_offload_req: gtk offload request
+ *
+ * Return: QDF status
+ */
+QDF_STATUS target_if_pmo_send_gtk_offload_req(struct wlan_objmgr_vdev *vdev,
+		struct pmo_gtk_req *gtk_offload_req);
+
+/**
+ * target_if_pmo_send_gtk_response_req() - send gtk response request in fwr
+ * @vdev: objmgr vdev handle
+ *
+ * Return: QDF status
+ */
+QDF_STATUS target_if_pmo_send_gtk_response_req(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * target_if_pmo_gtk_offload_status_event() - GTK offload status event handler
+ * @scn_handle: scn handle
+ * @event: event buffer
+ * @len: buffer length
+ *
+ * Return: 0 for success or error code
+ */
+int target_if_pmo_gtk_offload_status_event(void *scn_handle,
+	uint8_t *event, uint32_t len);
+
+
+#endif
+

+ 38 - 0
target_if/pmo/inc/target_if_pmo_main.h

@@ -0,0 +1,38 @@
+/*
+* 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 interface file for pmo component to
+ * Declare api's which shall be used by pmo component
+ * in target if internally.
+ */
+
+#ifndef _TARGET_IF_PMO_MAIN_H_
+#define _TARGET_IF_PMO_MAIN_H_
+
+#include "wlan_lmac_if_def.h"
+
+/**
+ * target_if_pmo_register_tx_ops() - Register PMO component TX OPS
+ * @tx_ops: lmac if transmit ops
+ *
+ * Return: None
+ */
+void target_if_pmo_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops);
+
+#endif
+

+ 63 - 0
target_if/pmo/src/target_if_pmo_arp.c

@@ -0,0 +1,63 @@
+/*
+ * 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_arp.c
+ *
+ * Target interface file for pmo component to
+ * send arp offload related cmd and process event.
+ */
+
+#include "target_if.h"
+#include "target_if_pmo.h"
+#include "wmi_unified_api.h"
+
+QDF_STATUS target_if_pmo_send_arp_offload_req(
+		struct wlan_objmgr_vdev *vdev,
+		struct pmo_arp_offload_params *arp_offload_req,
+		struct pmo_ns_offload_params *ns_offload_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_enable_arp_ns_offload_cmd(
+			GET_WMI_HDL_FROM_PSOC(psoc),
+			arp_offload_req,
+			ns_offload_req,
+			vdev_id);
+	if (status != QDF_STATUS_SUCCESS)
+		target_if_err("Failed to enable ARP NDP/NSffload");
+
+	return status;
+}
+
+

+ 149 - 0
target_if/pmo/src/target_if_pmo_gtk.c

@@ -0,0 +1,149 @@
+/*
+ * 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_gtk.c
+ *
+ * Target interface file for pmo component to
+ * send gtk offload related cmd and process event.
+ */
+
+#include "target_if.h"
+#include "target_if_pmo.h"
+#include "wmi_unified_api.h"
+
+QDF_STATUS target_if_pmo_send_gtk_offload_req(struct wlan_objmgr_vdev *vdev,
+		struct pmo_gtk_req *gtk_req)
+{
+	uint8_t vdev_id;
+	QDF_STATUS status;
+	uint32_t gtk_offload_opcode;
+	struct wlan_objmgr_psoc *psoc;
+
+	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;
+	}
+
+	if (gtk_req->flags == PMO_GTK_OFFLOAD_ENABLE)
+		gtk_offload_opcode = GTK_OFFLOAD_ENABLE_OPCODE;
+	else
+		gtk_offload_opcode = GTK_OFFLOAD_DISABLE_OPCODE;
+
+	status = wmi_unified_send_gtk_offload_cmd(
+			GET_WMI_HDL_FROM_PSOC(psoc),
+			vdev_id,
+			gtk_req,
+			gtk_req->flags,
+			gtk_offload_opcode);
+	if (status)
+		target_if_err("Failed to send gtk offload cmd to fw");
+
+	return status;
+}
+
+QDF_STATUS target_if_pmo_send_gtk_response_req(struct wlan_objmgr_vdev *vdev)
+{
+	uint8_t vdev_id;
+	struct wlan_objmgr_psoc *psoc;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	uint32_t offload_req_opcode;
+
+	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;
+	}
+
+	/* Request for GTK offload status */
+	offload_req_opcode = GTK_OFFLOAD_REQUEST_STATUS_OPCODE;
+
+	/* send the wmi command */
+	status = wmi_unified_process_gtk_offload_getinfo_cmd(
+			GET_WMI_HDL_FROM_PSOC(psoc),
+			vdev_id, offload_req_opcode);
+
+	return status;
+}
+
+int target_if_pmo_gtk_offload_status_event(void *scn_handle,
+	uint8_t *event, uint32_t len)
+{
+	struct pmo_gtk_rsp_params *gtk_rsp_param;
+	struct wlan_lmac_if_pmo_rx_ops *pmo_rx_ops;
+	struct wlan_objmgr_psoc *psoc;
+	QDF_STATUS ret;
+
+	TARGET_IF_ENTER();
+	psoc = target_if_get_psoc_from_scn_hdl(scn_handle);
+	if (!psoc) {
+		target_if_err("psoc ptr is NULL");
+		ret = -EINVAL;
+		goto out;
+	}
+
+	pmo_rx_ops = &psoc->soc_cb.rx_ops.pmo_rx_ops;
+	if (!pmo_rx_ops->rx_gtk_rsp_event) {
+		target_if_err("rx_gtk_rsp_event is NULL");
+		ret = -EINVAL;
+		goto out;
+	}
+
+	gtk_rsp_param = qdf_mem_malloc(sizeof(*gtk_rsp_param));
+	if (!gtk_rsp_param) {
+		target_if_err("memory allocation failed");
+		ret = -ENOMEM;
+		goto out;
+	}
+
+	if (wmi_extract_gtk_rsp_event(GET_WMI_HDL_FROM_PSOC(psoc),
+			event, gtk_rsp_param, len) != QDF_STATUS_SUCCESS) {
+		target_if_err("Extraction of gtk rsp event failed");
+		qdf_mem_free(gtk_rsp_param);
+		ret = -EINVAL;
+		goto out;
+	}
+
+	ret = pmo_rx_ops->rx_gtk_rsp_event(psoc, (void *)gtk_rsp_param);
+	if (ret != QDF_STATUS_SUCCESS) {
+		target_if_err("Failed to process mgmt tx completion");
+		ret = -EINVAL;
+	}
+	qdf_mem_free(gtk_rsp_param);
+out:
+	TARGET_IF_EXIT();
+
+	return ret;
+}
+

+ 63 - 0
target_if/pmo/src/target_if_pmo_main.c

@@ -0,0 +1,63 @@
+/*
+ * 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 interface file for pmo component to
+ * Implement api's which shall be used by pmo component
+ * in target if internally.
+ */
+
+#include "target_if_pmo.h"
+#include "target_if_pmo_main.h"
+
+void target_if_pmo_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
+{
+	struct wlan_lmac_if_pmo_tx_ops *pmo_tx_ops;
+
+	if (!tx_ops) {
+		target_if_err("lmac tx_ops is null");
+		return;
+	}
+
+	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_ns_offload_req =
+		target_if_pmo_send_ns_offload_req;
+	pmo_tx_ops->send_enable_wow_wakeup_event_req =
+		target_if_pmo_enable_wow_wakeup_event;
+	pmo_tx_ops->send_disable_wow_wakeup_event_req =
+		target_if_pmo_disable_wow_wakeup_event;
+	pmo_tx_ops->send_add_wow_pattern =
+		target_if_pmo_send_wow_patterns_to_fw;
+	pmo_tx_ops->send_enhance_mc_offload_req =
+		target_if_pmo_send_enhance_mc_offload_req;
+	pmo_tx_ops->send_set_mc_filter_req =
+		target_if_pmo_set_mc_filter_req;
+	pmo_tx_ops->send_clear_mc_filter_req =
+		target_if_pmo_clear_mc_filter_req;
+	pmo_tx_ops->send_ra_filter_req =
+		target_if_pmo_send_ra_filter_req;
+	pmo_tx_ops->send_gtk_offload_req =
+		target_if_pmo_send_gtk_offload_req;
+	pmo_tx_ops->send_get_gtk_rsp_cmd =
+		target_if_pmo_send_gtk_response_req;
+	pmo_tx_ops->send_action_frame_pattern_req =
+		target_if_pmo_send_action_frame_patterns;
+
+}
+

+ 95 - 0
target_if/pmo/src/target_if_pmo_mc_addr_filtering.c

@@ -0,0 +1,95 @@
+/*
+ * 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_mc_addr_filtering.c
+ *
+ * Target interface file for pmo component to
+ * send mc address filtering offload related cmd and process event.
+ */
+
+
+#include "target_if.h"
+#include "target_if_pmo.h"
+#include "wmi_unified_api.h"
+
+QDF_STATUS target_if_pmo_set_mc_filter_req(
+		struct wlan_objmgr_vdev *vdev,
+		struct qdf_mac_addr multicast_addr)
+{
+	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_add_clear_mcbc_filter_cmd(
+			GET_WMI_HDL_FROM_PSOC(psoc),
+			vdev_id,
+			multicast_addr, false);
+	if (status)
+		target_if_err("Failed to send add/clear mcbc filter cmd");
+
+	return status;
+}
+
+QDF_STATUS target_if_pmo_clear_mc_filter_req(
+		struct wlan_objmgr_vdev *vdev,
+		struct qdf_mac_addr multicast_addr)
+{
+	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_add_clear_mcbc_filter_cmd(
+			GET_WMI_HDL_FROM_PSOC(psoc),
+			vdev_id,
+			multicast_addr, true);
+	if (status)
+		target_if_err("Failed to send add/clear mcbc filter cmd");
+
+	return status;
+
+}
+
+

+ 62 - 0
target_if/pmo/src/target_if_pmo_ns.c

@@ -0,0 +1,62 @@
+/*
+ * 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_ns.c
+ *
+ * Target interface file for pmo component to
+ * send ns offload related cmd and process event.
+ */
+
+#include "target_if.h"
+#include "target_if_pmo.h"
+#include "wmi_unified_api.h"
+
+QDF_STATUS target_if_pmo_send_ns_offload_req(
+		struct wlan_objmgr_vdev *vdev,
+		struct pmo_arp_offload_params *arp_offload_req,
+		struct pmo_ns_offload_params *ns_offload_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_enable_arp_ns_offload_cmd(
+			GET_WMI_HDL_FROM_PSOC(psoc),
+			arp_offload_req,
+			ns_offload_req,
+			vdev_id);
+	if (status != QDF_STATUS_SUCCESS)
+		target_if_err("Failed to enable ARP NDP/NSffload");
+
+	return status;
+}
+

+ 119 - 0
target_if/pmo/src/target_if_pmo_static_config.c

@@ -0,0 +1,119 @@
+/*
+ * 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_static.c
+ *
+ * Target interface file for pmo component to
+ * send wow related cmd and process event.
+ */
+
+
+#include "target_if.h"
+#include "target_if_pmo.h"
+#include "wmi_unified_api.h"
+
+QDF_STATUS target_if_pmo_send_ra_filter_req(struct wlan_objmgr_vdev *vdev,
+		uint8_t default_pattern, uint16_t rate_limit_interval)
+{
+	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_wow_sta_ra_filter_cmd(
+			GET_WMI_HDL_FROM_PSOC(psoc), vdev_id,
+			default_pattern, rate_limit_interval);
+	if (status)
+		target_if_err("Failed to send RA rate limit to fw");
+
+	return status;
+}
+
+QDF_STATUS target_if_pmo_send_action_frame_patterns(
+		struct wlan_objmgr_vdev *vdev,
+		struct pmo_action_wakeup_set_params *ip_cmd)
+{
+	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_action_frame_patterns_cmd(
+			GET_WMI_HDL_FROM_PSOC(psoc), ip_cmd);
+	if (status != QDF_STATUS_SUCCESS)
+		target_if_err("Failed to config wow action frame map, ret %d",
+			status);
+
+	return status;
+}
+
+QDF_STATUS target_if_pmo_send_enhance_mc_offload_req(
+		struct wlan_objmgr_vdev *vdev, bool enable)
+{
+	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_enable_enhance_multicast_offload_cmd(
+			GET_WMI_HDL_FROM_PSOC(psoc), vdev_id, enable);
+	if (status)
+		target_if_err("Failed to config wow wakeup event");
+
+	return status;
+}
+

+ 120 - 0
target_if/pmo/src/target_if_pmo_wow.c

@@ -0,0 +1,120 @@
+/*
+ * 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_wow.c
+ *
+ * Target interface file for pmo component to
+ * send wow related cmd and process event.
+ */
+
+
+#include "target_if.h"
+#include "target_if_pmo.h"
+#include "wmi_unified_api.h"
+
+QDF_STATUS target_if_pmo_enable_wow_wakeup_event(struct wlan_objmgr_vdev *vdev,
+		uint32_t bitmap)
+{
+	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_add_wow_wakeup_event_cmd(
+			GET_WMI_HDL_FROM_PSOC(psoc), vdev_id, bitmap, true);
+	if (status)
+		target_if_err("Failed to config wow wakeup event");
+
+	return status;
+}
+
+QDF_STATUS target_if_pmo_disable_wow_wakeup_event(struct wlan_objmgr_vdev *vdev,
+		uint32_t bitmap)
+{
+	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_add_wow_wakeup_event_cmd(
+			GET_WMI_HDL_FROM_PSOC(psoc), vdev_id, bitmap, false);
+	if (status)
+		target_if_err("Failed to config wow wakeup event");
+
+	return status;
+}
+
+QDF_STATUS target_if_pmo_send_wow_patterns_to_fw(struct wlan_objmgr_vdev *vdev,
+		uint8_t ptrn_id,
+		const uint8_t *ptrn, uint8_t ptrn_len,
+		uint8_t ptrn_offset, const uint8_t *mask,
+		uint8_t mask_len, bool user)
+{
+	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_wow_patterns_to_fw_cmd(
+				GET_WMI_HDL_FROM_PSOC(psoc),
+				vdev_id, ptrn_id, ptrn,
+				ptrn_len, ptrn_offset, mask,
+				mask_len, user, 0);
+
+	return status;
+}
+