blob: 08c8e55f42e2dee8b21d1d605b5e02c35e5b9eb8 [file] [log] [blame]
Ruchi, Agrawal7d32b0a2018-06-28 14:55:47 +05301/*
Amir Patelf0fa2f52019-05-31 12:52:10 +05302 * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
Ruchi, Agrawal7d32b0a2018-06-28 14:55:47 +05303 *
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#include "dp_cal_client_api.h"
20#include "qdf_module.h"
21
22/* dp_cal_client_attach - function to attach cal client timer
23 * @cal_client_ctx: cal client timer context
24 * @pdev: pdev handle
25 * @osdev: device pointer
26 * @dp_iterate_peer_list : function pointer to iterate and update peer stats
27 *
28 * return: void
29 */
Akshay Kosigi67c8bb92019-07-04 14:28:19 +053030void dp_cal_client_attach(struct cdp_cal_client **cal_client_ctx,
31 struct cdp_pdev *pdev,
Ruchi, Agrawal7d32b0a2018-06-28 14:55:47 +053032 qdf_device_t osdev,
Akshay Kosigi67c8bb92019-07-04 14:28:19 +053033 void (*dp_iterate_peer_list)(struct cdp_pdev *))
Ruchi, Agrawal7d32b0a2018-06-28 14:55:47 +053034{
35 struct cal_client *cal_cl;
36
37 *cal_client_ctx = qdf_mem_malloc(sizeof(struct cal_client));
38
39 if (!(*cal_client_ctx))
40 return;
41
42 cal_cl = (struct cal_client *)(*cal_client_ctx);
43 cal_cl->iterate_update_peer_list = dp_iterate_peer_list;
44 cal_cl->pdev_hdl = pdev;
45
46 qdf_timer_init(osdev, &cal_cl->cal_client_timer,
47 dp_cal_client_stats_timer_fn, *cal_client_ctx,
48 QDF_TIMER_TYPE_WAKE_APPS);
49}
50
51qdf_export_symbol(dp_cal_client_attach);
52
53/* dp_cal_client_detach - detach cal client timer
54 * @cal_client_ctx: cal client timer context
55 *
56 * return: void
57 */
Akshay Kosigi67c8bb92019-07-04 14:28:19 +053058void dp_cal_client_detach(struct cdp_cal_client **cal_client_ctx)
Ruchi, Agrawal7d32b0a2018-06-28 14:55:47 +053059{
60 struct cal_client *cal_cl;
61
62 if (*cal_client_ctx) {
63 cal_cl = (struct cal_client *)*cal_client_ctx;
64
65 qdf_timer_stop(&cal_cl->cal_client_timer);
66 qdf_timer_free(&cal_cl->cal_client_timer);
67 qdf_mem_free(cal_cl);
68 *cal_client_ctx = NULL;
69 }
70}
71
72qdf_export_symbol(dp_cal_client_detach);
73
74/* dp_cal_client_timer_start- api to start cal client timer
75 * @ctx: cal client timer ctx
76 *
77 * return: void
78 */
79void dp_cal_client_timer_start(void *ctx)
80{
81 struct cal_client *cal_cl;
82
83 if (ctx) {
84 cal_cl = (struct cal_client *)ctx;
85 qdf_timer_start(&cal_cl->cal_client_timer, DP_CAL_CLIENT_TIME);
86 }
87}
88
89qdf_export_symbol(dp_cal_client_timer_start);
90
91/* dp_cal_client_timer_stop- api to stop cal client timer
92 * @ctx: cal client timer ctx
93 *
94 * return: void
95 */
96void dp_cal_client_timer_stop(void *ctx)
97{
98 struct cal_client *cal_cl;
99
100 if (ctx) {
101 cal_cl = (struct cal_client *)ctx;
102 qdf_timer_sync_cancel(&cal_cl->cal_client_timer);
103 qdf_timer_stop(&cal_cl->cal_client_timer);
104 }
105}
106
107qdf_export_symbol(dp_cal_client_timer_stop);
108
109/* dp_cal_client_stats_timer_fn- function called on timer interval
110 * @ctx: cal client timer ctx
111 *
112 * return: void
113 */
114void dp_cal_client_stats_timer_fn(void *ctx)
115{
116 struct cal_client *cal_cl = (struct cal_client *)ctx;
117
118 if (!cal_cl)
119 return;
120
121 cal_cl->iterate_update_peer_list(cal_cl->pdev_hdl);
122 qdf_timer_mod(&cal_cl->cal_client_timer, DP_CAL_CLIENT_TIME);
123}
124
125qdf_export_symbol(dp_cal_client_stats_timer_fn);
126
127/*dp_cal_client_update_peer_stats - update peer stats in peer
128 * @peer_stats: cdp peer stats pointer
129 *
130 * return: void
131 */
132void dp_cal_client_update_peer_stats(struct cdp_peer_stats *peer_stats)
133{
134 uint32_t temp_rx_bytes = peer_stats->rx.to_stack.bytes;
135 uint32_t temp_rx_data = peer_stats->rx.to_stack.num;
136 uint32_t temp_tx_bytes = peer_stats->tx.tx_success.bytes;
137 uint32_t temp_tx_data = peer_stats->tx.tx_success.num;
Amir Patel3c606312018-11-13 14:29:36 +0530138 uint32_t temp_tx_ucast_pkts = peer_stats->tx.ucast.num;
Ruchi, Agrawal7d32b0a2018-06-28 14:55:47 +0530139
140 peer_stats->rx.rx_byte_rate = temp_rx_bytes -
141 peer_stats->rx.rx_bytes_success_last;
142 peer_stats->rx.rx_data_rate = temp_rx_data -
143 peer_stats->rx.rx_data_success_last;
144 peer_stats->tx.tx_byte_rate = temp_tx_bytes -
145 peer_stats->tx.tx_bytes_success_last;
146 peer_stats->tx.tx_data_rate = temp_tx_data -
147 peer_stats->tx.tx_data_success_last;
Amir Patel3c606312018-11-13 14:29:36 +0530148 peer_stats->tx.tx_data_ucast_rate = temp_tx_ucast_pkts -
149 peer_stats->tx.tx_data_ucast_last;
Ruchi, Agrawal7d32b0a2018-06-28 14:55:47 +0530150
Amir Patelf0fa2f52019-05-31 12:52:10 +0530151 /* Check tx and rx packets in last one second, and increment
152 * inactive time for peer
153 */
154 if (peer_stats->tx.tx_data_rate || peer_stats->rx.rx_data_rate)
155 peer_stats->tx.inactive_time = 0;
156 else
157 peer_stats->tx.inactive_time++;
158
Ruchi, Agrawal7d32b0a2018-06-28 14:55:47 +0530159 peer_stats->rx.rx_bytes_success_last = temp_rx_bytes;
160 peer_stats->rx.rx_data_success_last = temp_rx_data;
161 peer_stats->tx.tx_bytes_success_last = temp_tx_bytes;
162 peer_stats->tx.tx_data_success_last = temp_tx_data;
Amir Patel3c606312018-11-13 14:29:36 +0530163 peer_stats->tx.tx_data_ucast_last = temp_tx_ucast_pkts;
164
Amir Pateld577d092018-11-27 20:11:58 +0530165 if (peer_stats->tx.tx_data_ucast_rate) {
166 if (peer_stats->tx.tx_data_ucast_rate >
167 peer_stats->tx.tx_data_rate)
168 peer_stats->tx.last_per =
169 ((peer_stats->tx.tx_data_ucast_rate -
170 peer_stats->tx.tx_data_rate) * 100) /
171 peer_stats->tx.tx_data_ucast_rate;
172 else
173 peer_stats->tx.last_per = 0;
174 }
175
Ruchi, Agrawal7d32b0a2018-06-28 14:55:47 +0530176}
177
178qdf_export_symbol(dp_cal_client_update_peer_stats);
179