blob: c3e9826036220bfd2b393c98d459850f8ca61c09 [file] [log] [blame]
Mukul Sharmad75a6672017-06-22 15:40:53 +05301/*
2* Copyright (c) 2017 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: Implements public API for pmo to interact with target/WMI
20 */
21
22#include "wlan_pmo_tgt_api.h"
23#include "wlan_pmo_wow.h"
24#include "wlan_pmo_obj_mgmt_public_struct.h"
25#include "wlan_pmo_main.h"
26
27QDF_STATUS pmo_tgt_enable_wow_wakeup_event(
28 struct wlan_objmgr_vdev *vdev,
29 uint32_t *bitmap)
30{
31 QDF_STATUS status;
32 struct wlan_objmgr_psoc *psoc;
33 struct wlan_pmo_tx_ops pmo_tx_ops;
34
35 PMO_ENTER();
36
37 psoc = pmo_vdev_get_psoc(vdev);
38
39 pmo_tx_ops = GET_PMO_TX_OPS_FROM_PSOC(psoc);
40 if (!pmo_tx_ops.send_enable_wow_wakeup_event_req) {
41 pmo_err("send_enable_wow_wakeup_event_req is null");
42 status = QDF_STATUS_E_NULL_VALUE;
43 goto out;
44 }
45 status = pmo_tx_ops.send_enable_wow_wakeup_event_req(vdev, bitmap);
46 if (status != QDF_STATUS_SUCCESS)
47 pmo_err("Failed to enable wow wakeup event");
48out:
49 PMO_EXIT();
50
51 return status;
52}
53
54QDF_STATUS pmo_tgt_disable_wow_wakeup_event(
55 struct wlan_objmgr_vdev *vdev,
56 uint32_t *bitmap)
57{
58 QDF_STATUS status;
59 struct wlan_objmgr_psoc *psoc;
60 struct wlan_pmo_tx_ops pmo_tx_ops;
61
62 PMO_ENTER();
63
64 psoc = pmo_vdev_get_psoc(vdev);
65
66 pmo_tx_ops = GET_PMO_TX_OPS_FROM_PSOC(psoc);
67 if (!pmo_tx_ops.send_disable_wow_wakeup_event_req) {
68 pmo_err("send_disable_wow_wakeup_event_req is null");
69 status = QDF_STATUS_E_NULL_VALUE;
70 goto out;
71 }
72 status = pmo_tx_ops.send_disable_wow_wakeup_event_req(vdev, bitmap);
73 if (status != QDF_STATUS_SUCCESS)
74 pmo_err("Failed to disable wow wakeup event");
75out:
76 PMO_EXIT();
77
78 return status;
79}
80
81QDF_STATUS pmo_tgt_send_wow_patterns_to_fw(
82 struct wlan_objmgr_vdev *vdev, uint8_t ptrn_id,
83 const uint8_t *ptrn, uint8_t ptrn_len,
84 uint8_t ptrn_offset, const uint8_t *mask,
85 uint8_t mask_len, bool user)
86{
87 QDF_STATUS status;
88 struct pmo_vdev_priv_obj *vdev_ctx;
89 struct wlan_objmgr_psoc *psoc;
90 struct wlan_pmo_tx_ops pmo_tx_ops;
91
92 PMO_ENTER();
93 psoc = pmo_vdev_get_psoc(vdev);
94
95 vdev_ctx = pmo_vdev_get_priv(vdev);
96
97 pmo_tx_ops = GET_PMO_TX_OPS_FROM_PSOC(psoc);
98 if (!pmo_tx_ops.send_add_wow_pattern) {
99 pmo_err("send_add_wow_pattern is null");
100 status = QDF_STATUS_E_NULL_VALUE;
101 goto out;
102 }
103 status = pmo_tx_ops.send_add_wow_pattern(
104 vdev, ptrn_id, ptrn,
105 ptrn_len, ptrn_offset, mask,
106 mask_len, user);
107 if (status != QDF_STATUS_SUCCESS) {
108 if (!user)
109 pmo_decrement_wow_default_ptrn(vdev_ctx);
110 pmo_err("Failed to sen wow pattern event");
111 goto out;
112 }
113
114 if (user)
115 pmo_increment_wow_user_ptrn(vdev_ctx);
116out:
117 PMO_EXIT();
118
119 return status;
120}
121