blob: 50734d91be960398590be3d403bac8fd76eccf32 [file] [log] [blame]
Mukul Sharmad75a6672017-06-22 15:40:53 +05301/*
Dustin Brownb2cd2e02018-03-15 11:59:45 -07002 * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
Jeff Johnsonb4c29962017-10-07 19:35:14 -07003 *
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 */
Dustin Brownb2cd2e02018-03-15 11:59:45 -070018
Mukul Sharmad75a6672017-06-22 15:40:53 +053019/**
20 * DOC: Implements public API for pmo to interact with target/WMI
21 */
22
23#include "wlan_pmo_tgt_api.h"
24#include "wlan_pmo_arp_public_struct.h"
25#include "wlan_pmo_ns_public_struct.h"
26#include "wlan_pmo_obj_mgmt_public_struct.h"
27#include "wlan_pmo_main.h"
28
29QDF_STATUS pmo_tgt_enable_arp_offload_req(struct wlan_objmgr_vdev *vdev,
30 uint8_t vdev_id)
31{
32 struct pmo_arp_offload_params *arp_offload_req = NULL;
33 struct pmo_ns_offload_params *ns_offload_req = NULL;
34 struct pmo_vdev_priv_obj *vdev_ctx;
35 struct wlan_objmgr_psoc *psoc;
36 QDF_STATUS status;
37 struct wlan_pmo_tx_ops pmo_tx_ops;
38
Dustin Brownb2cd2e02018-03-15 11:59:45 -070039 pmo_enter();
Mukul Sharmad75a6672017-06-22 15:40:53 +053040
41 vdev_ctx = pmo_vdev_get_priv(vdev);
42
43 psoc = pmo_vdev_get_psoc(vdev);
44
45 arp_offload_req = qdf_mem_malloc(sizeof(*arp_offload_req));
46 if (!arp_offload_req) {
47 pmo_err("unable to allocate arp_offload_req");
48 status = QDF_STATUS_E_NOMEM;
49 goto out;
50 }
51
52 ns_offload_req = qdf_mem_malloc(sizeof(*ns_offload_req));
53 if (!ns_offload_req) {
54 pmo_err("unable to allocate ns_offload_req");
55 status = QDF_STATUS_E_NOMEM;
56 goto out;
57 }
58
59 qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
60 qdf_mem_copy(arp_offload_req, &vdev_ctx->vdev_arp_req,
61 sizeof(*arp_offload_req));
62 qdf_mem_copy(ns_offload_req, &vdev_ctx->vdev_ns_req,
63 sizeof(*ns_offload_req));
64 qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
65
66 pmo_debug("ARP Offload vdev_id: %d enable: %d",
67 vdev_id,
68 arp_offload_req->enable);
69 pmo_debug("NS Offload vdev_id: %d enable: %d ns_count: %u",
70 vdev_id,
71 ns_offload_req->enable,
72 ns_offload_req->num_ns_offload_count);
73
74 pmo_tx_ops = GET_PMO_TX_OPS_FROM_PSOC(psoc);
75 if (!pmo_tx_ops.send_arp_offload_req) {
76 pmo_err("send_arp_offload_req is null");
77 status = QDF_STATUS_E_NULL_VALUE;
78 goto out;
79 }
80 status = pmo_tx_ops.send_arp_offload_req(
81 vdev, arp_offload_req, ns_offload_req);
Rajeev Kumar Sirasanagandla85f8b022018-03-12 12:52:59 +053082 if (status != QDF_STATUS_SUCCESS) {
Mukul Sharmad75a6672017-06-22 15:40:53 +053083 pmo_err("Failed to send ARP offload");
Rajeev Kumar Sirasanagandla85f8b022018-03-12 12:52:59 +053084 goto out;
85 }
86
87 qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
88 if (vdev_ctx->vdev_arp_req.enable)
89 vdev_ctx->vdev_arp_req.is_offload_applied = true;
90 if (vdev_ctx->vdev_ns_req.enable)
91 vdev_ctx->vdev_ns_req.is_offload_applied = true;
92 qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
93
Mukul Sharmad75a6672017-06-22 15:40:53 +053094out:
95 if (arp_offload_req)
96 qdf_mem_free(arp_offload_req);
97 if (ns_offload_req)
98 qdf_mem_free(ns_offload_req);
Dustin Brownb2cd2e02018-03-15 11:59:45 -070099 pmo_exit();
Mukul Sharmad75a6672017-06-22 15:40:53 +0530100
101 return status;
102}
103
104QDF_STATUS pmo_tgt_disable_arp_offload_req(struct wlan_objmgr_vdev *vdev,
105 uint8_t vdev_id)
106{
107 struct pmo_arp_offload_params *arp_offload_req = NULL;
108 struct pmo_ns_offload_params *ns_offload_req = NULL;
109 struct pmo_vdev_priv_obj *vdev_ctx;
110 struct wlan_objmgr_psoc *psoc;
111 QDF_STATUS status;
112 struct wlan_pmo_tx_ops pmo_tx_ops;
113
Dustin Brownb2cd2e02018-03-15 11:59:45 -0700114 pmo_enter();
Mukul Sharmad75a6672017-06-22 15:40:53 +0530115
116 vdev_ctx = pmo_vdev_get_priv(vdev);
117
118 psoc = pmo_vdev_get_psoc(vdev);
119
120 arp_offload_req = qdf_mem_malloc(sizeof(*arp_offload_req));
121 if (!arp_offload_req) {
122 pmo_err("unable to allocate arp_offload_req");
123 status = QDF_STATUS_E_NOMEM;
124 goto out;
125 }
126
127 ns_offload_req = qdf_mem_malloc(sizeof(*ns_offload_req));
128 if (!ns_offload_req) {
129 pmo_err("unable to allocate ns_offload_req");
130 status = QDF_STATUS_E_NOMEM;
131 goto out;
132 }
133
134 qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
135 qdf_mem_copy(arp_offload_req, &vdev_ctx->vdev_arp_req,
136 sizeof(*arp_offload_req));
137 qdf_mem_copy(ns_offload_req, &vdev_ctx->vdev_ns_req,
138 sizeof(*ns_offload_req));
139 qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
140
141 pmo_debug("ARP Offload vdev_id: %d enable: %d",
142 vdev_id,
143 arp_offload_req->enable);
144 pmo_debug("NS Offload vdev_id: %d enable: %d ns_count: %u",
145 vdev_id,
146 ns_offload_req->enable,
147 ns_offload_req->num_ns_offload_count);
148
149 pmo_tx_ops = GET_PMO_TX_OPS_FROM_PSOC(psoc);
150 if (!pmo_tx_ops.send_arp_offload_req) {
151 pmo_err("send_arp_offload_req is null");
152 status = QDF_STATUS_E_NULL_VALUE;
153 goto out;
154 }
155 status = pmo_tx_ops.send_arp_offload_req(
156 vdev, arp_offload_req, ns_offload_req);
157 if (status != QDF_STATUS_SUCCESS)
158 pmo_err("Failed to send ARP offload");
159
Rajeev Kumar Sirasanagandla85f8b022018-03-12 12:52:59 +0530160 qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
161 vdev_ctx->vdev_arp_req.is_offload_applied = false;
162 vdev_ctx->vdev_ns_req.is_offload_applied = false;
163 qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
164
Mukul Sharmad75a6672017-06-22 15:40:53 +0530165out:
166 if (arp_offload_req)
167 qdf_mem_free(arp_offload_req);
168 if (ns_offload_req)
169 qdf_mem_free(ns_offload_req);
Dustin Brownb2cd2e02018-03-15 11:59:45 -0700170 pmo_exit();
Mukul Sharmad75a6672017-06-22 15:40:53 +0530171
172 return status;
173}
174