blob: 8bd13186cc5a7921efef6d977f9350f1320cf8a6 [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -08002 * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004 * 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
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080019#if !defined(WLAN_HDD_TX_RX_H)
20#define WLAN_HDD_TX_RX_H
21
22/**
23 *
24 * DOC: wlan_hdd_tx_rx.h
25 *
26 * Linux HDD Tx/RX APIs
27 */
28
29#include <wlan_hdd_includes.h>
30#include <cds_api.h>
31#include <linux/skbuff.h>
Dhanashri Atreb08959a2016-03-01 17:28:03 -080032#include "cdp_txrx_flow_ctrl_legacy.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080033
Jeff Johnsona9dc1dc2017-08-28 11:37:48 -070034struct hdd_context;
35
Mohit Khanna70322002018-05-15 19:21:32 -070036#define hdd_dp_alert(params...) QDF_TRACE_FATAL(QDF_MODULE_ID_HDD_DATA, params)
37#define hdd_dp_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_HDD_DATA, params)
38#define hdd_dp_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_HDD_DATA, params)
39#define hdd_dp_info(params...) QDF_TRACE_INFO(QDF_MODULE_ID_HDD_DATA, params)
40#define hdd_dp_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_HDD_DATA, params)
41
42#define hdd_dp_alert_rl(params...) \
43 QDF_TRACE_FATAL_RL(QDF_MODULE_ID_HDD_DATA, params)
44#define hdd_dp_err_rl(params...) \
45 QDF_TRACE_ERROR_RL(QDF_MODULE_ID_HDD_DATA, params)
46#define hdd_dp_warn_rl(params...) \
47 QDF_TRACE_WARN_RL(QDF_MODULE_ID_HDD_DATA, params)
48#define hdd_dp_info_rl(params...) \
49 QDF_TRACE_INFO_RL(QDF_MODULE_ID_HDD_DATA, params)
50#define hdd_dp_debug_rl(params...) \
51 QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_HDD_DATA, params)
52
53#define hdd_dp_enter() hdd_dp_debug("enter")
54#define hdd_dp_enter_dev(dev) hdd_dp_debug("enter(%s)", (dev)->name)
55#define hdd_dp_exit() hdd_dp_debug("exit")
56
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080057#define HDD_ETHERTYPE_802_1_X 0x888E
58#define HDD_ETHERTYPE_802_1_X_FRAME_OFFSET 12
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080059#ifdef FEATURE_WLAN_WAPI
60#define HDD_ETHERTYPE_WAI 0x88b4
Jinwei Chen19846e52018-04-03 19:20:38 +080061#define IS_HDD_ETHERTYPE_WAI(_skb) (ntohs(_skb->protocol) == \
62 HDD_ETHERTYPE_WAI)
63#else
64#define IS_HDD_ETHERTYPE_WAI(_skb) (false)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080065#endif
66
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080067#define HDD_PSB_CFG_INVALID 0xFF
68#define HDD_PSB_CHANGED 0xFF
69#define SME_QOS_UAPSD_CFG_BK_CHANGED_MASK 0xF1
70#define SME_QOS_UAPSD_CFG_BE_CHANGED_MASK 0xF2
71#define SME_QOS_UAPSD_CFG_VI_CHANGED_MASK 0xF4
72#define SME_QOS_UAPSD_CFG_VO_CHANGED_MASK 0xF8
73
Srinivas Girigowdade28a9d2018-03-19 19:19:49 -070074netdev_tx_t hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080075void hdd_tx_timeout(struct net_device *dev);
Dhanashri Atre182b0272016-02-17 15:35:07 -080076
Jeff Johnson80486862017-10-02 13:21:29 -070077QDF_STATUS hdd_init_tx_rx(struct hdd_adapter *adapter);
78QDF_STATUS hdd_deinit_tx_rx(struct hdd_adapter *adapter);
Mohit Khanna70322002018-05-15 19:21:32 -070079
80/**
81 * hdd_rx_packet_cbk() - Receive packet handler
82 * @adapter_context: pointer to HDD adapter context
83 * @rxBuf: pointer to rx qdf_nbuf
84 *
85 * Receive callback registered with data path. DP will call this to notify
86 * the HDD when one or more packets were received for a registered
87 * STA.
88 *
89 * Return: QDF_STATUS_E_FAILURE if any errors encountered,
90 * QDF_STATUS_SUCCESS otherwise
91 */
92QDF_STATUS hdd_rx_packet_cbk(void *adapter_context, qdf_nbuf_t rxBuf);
93
94/**
95 * hdd_rx_pkt_thread_enqueue_cbk() - receive pkt handler to enqueue into thread
96 * @adapter: pointer to HDD adapter
97 * @rxBuf: pointer to rx qdf_nbuf
98 *
99 * Receive callback registered with DP layer which enqueues packets into dp rx
100 * thread
101 * Return: QDF_STATUS_E_FAILURE if any errors encountered,
102 * QDF_STATUS_SUCCESS otherwise
103 */
104QDF_STATUS hdd_rx_pkt_thread_enqueue_cbk(void *adapter_context,
105 qdf_nbuf_t nbuf_list);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800106
Manjunathappa Prakash7b0ad462018-04-15 00:37:16 -0700107/**
108 * hdd_rx_ol_init() - Initialize Rx mode(LRO or GRO) method
109 * @hdd_ctx: pointer to HDD Station Context
110 *
111 * Return: 0 on success and non zero on failure.
112 */
113int hdd_rx_ol_init(struct hdd_context *hdd_ctx);
114
115/**
116 * hdd_disable_rx_ol_in_concurrency() - Disable Rx offload due to concurrency
117 * @disable: true/false to disable/enable the Rx offload
118 *
119 * Return: none
120 */
121void hdd_disable_rx_ol_in_concurrency(bool disable);
122
123/**
124 * hdd_disable_rx_ol_for_low_tput() - Disable Rx offload in low TPUT scenario
125 * @hdd_ctx: hdd context
126 * @disable: true/false to disable/enable the Rx offload
127 *
128 * Return: none
129 */
130void hdd_disable_rx_ol_for_low_tput(struct hdd_context *hdd_ctx, bool disable);
131
Jeff Johnson40dae4e2017-08-29 14:00:25 -0700132QDF_STATUS hdd_get_peer_sta_id(struct hdd_station_ctx *sta_ctx,
Deepak Dhamdhere5872c8c2016-06-02 15:51:47 -0700133 struct qdf_mac_addr *peer_mac_addr,
134 uint8_t *sta_id);
Poddar, Siddarth31797fa2018-01-22 17:24:15 +0530135/**
jitiphilfb410612018-03-26 22:37:56 +0530136 * hdd_reset_all_adapters_connectivity_stats() - reset connectivity stats
137 * @hdd_ctx: pointer to HDD Station Context
138 *
139 * Return: None
140 */
141void hdd_reset_all_adapters_connectivity_stats(struct hdd_context *hdd_ctx);
142
143/**
Poddar, Siddarth31797fa2018-01-22 17:24:15 +0530144 * hdd_tx_rx_collect_connectivity_stats_info() - collect connectivity stats
145 * @skb: pointer to skb data
146 * @adapter: pointer to vdev apdapter
147 * @action: action done on pkt.
148 * @pkt_type: data pkt type
149 *
150 * Return: None
151 */
152void hdd_tx_rx_collect_connectivity_stats_info(struct sk_buff *skb,
153 void *adapter, enum connectivity_stats_pkt_status action,
154 uint8_t *pkt_type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800155
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -0800156/**
157 * hdd_tx_queue_cb() - Disable/Enable the Transmit Queues
Jeff Johnsonda2afa42018-07-04 10:25:42 -0700158 * @hdd_handle: HDD handle
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -0800159 * @vdev_id: vdev id
160 * @action: Action to be taken on the Tx Queues
161 * @reason: Reason for the netif action
162 *
163 * Return: None
164 */
Jeff Johnsonda2afa42018-07-04 10:25:42 -0700165void hdd_tx_queue_cb(hdd_handle_t hdd_handle, uint32_t vdev_id,
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -0800166 enum netif_action_type action,
167 enum netif_reason_type reason);
168
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800169#ifdef QCA_LL_LEGACY_TX_FLOW_CONTROL
170void hdd_tx_resume_cb(void *adapter_context, bool tx_resume);
bings284f8be2017-08-11 10:41:30 +0800171
172/**
173 * hdd_tx_flow_control_is_pause() - Is TX Q paused by flow control
174 * @adapter_context: pointer to vdev apdapter
175 *
176 * Return: true if TX Q is paused by flow control
177 */
178bool hdd_tx_flow_control_is_pause(void *adapter_context);
bings284f8be2017-08-11 10:41:30 +0800179
180/**
181 * hdd_register_tx_flow_control() - Register TX Flow control
182 * @adapter: adapter handle
183 * @timer_callback: timer callback
184 * @flow_control_fp: txrx flow control
185 * @flow_control_is_pause_fp: is txrx paused by flow control
186 *
187 * Return: none
188 */
Jeff Johnson5b76a3e2017-08-29 14:18:38 -0700189void hdd_register_tx_flow_control(struct hdd_adapter *adapter,
Anurag Chouhan210db072016-02-22 18:42:15 +0530190 qdf_mc_timer_callback_t timer_callback,
bings284f8be2017-08-11 10:41:30 +0800191 ol_txrx_tx_flow_control_fp flowControl,
192 ol_txrx_tx_flow_control_is_pause_fp flow_control_is_pause);
Jeff Johnson5b76a3e2017-08-29 14:18:38 -0700193void hdd_deregister_tx_flow_control(struct hdd_adapter *adapter);
194void hdd_get_tx_resource(struct hdd_adapter *adapter,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800195 uint8_t STAId, uint16_t timer_value);
196
197#else
198static inline void hdd_tx_resume_cb(void *adapter_context, bool tx_resume)
199{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800200}
bings284f8be2017-08-11 10:41:30 +0800201static inline bool hdd_tx_flow_control_is_pause(void *adapter_context)
202{
203 return false;
204}
Jeff Johnson5b76a3e2017-08-29 14:18:38 -0700205static inline void hdd_register_tx_flow_control(struct hdd_adapter *adapter,
Anurag Chouhan210db072016-02-22 18:42:15 +0530206 qdf_mc_timer_callback_t timer_callback,
bings284f8be2017-08-11 10:41:30 +0800207 ol_txrx_tx_flow_control_fp flowControl,
208 ol_txrx_tx_flow_control_is_pause_fp flow_control_is_pause)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800209{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800210}
Jeff Johnson5b76a3e2017-08-29 14:18:38 -0700211static inline void hdd_deregister_tx_flow_control(struct hdd_adapter *adapter)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800212{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800213}
Jeff Johnson5b76a3e2017-08-29 14:18:38 -0700214static inline void hdd_get_tx_resource(struct hdd_adapter *adapter,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800215 uint8_t STAId, uint16_t timer_value)
216{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800217}
218#endif /* QCA_LL_LEGACY_TX_FLOW_CONTROL */
219
Ajit Pal Singh106c1412018-04-18 18:08:49 +0530220#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || \
221 defined(QCA_HL_NETDEV_FLOW_CONTROL)
222void hdd_tx_resume_timer_expired_handler(void *adapter_context);
223#else
224static inline void hdd_tx_resume_timer_expired_handler(void *adapter_context)
225{
226}
227#endif
228
229#ifdef QCA_HL_NETDEV_FLOW_CONTROL
230void hdd_register_hl_netdev_fc_timer(struct hdd_adapter *adapter,
231 qdf_mc_timer_callback_t timer_callback);
232void hdd_deregister_hl_netdev_fc_timer(struct hdd_adapter *adapter);
233#else
234static inline void hdd_register_hl_netdev_fc_timer(struct hdd_adapter *adapter,
235 qdf_mc_timer_callback_t
236 timer_callback)
237{}
238
239static inline void
240 hdd_deregister_hl_netdev_fc_timer(struct hdd_adapter *adapter)
241{}
242#endif /* QCA_HL_NETDEV_FLOW_CONTROL */
243
Jeff Johnson811f47d2017-10-03 11:33:09 -0700244int hdd_get_peer_idx(struct hdd_station_ctx *sta_ctx,
245 struct qdf_mac_addr *addr);
Naveen Rawatf28315c2016-06-29 18:06:02 -0700246
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800247const char *hdd_reason_type_to_string(enum netif_reason_type reason);
248const char *hdd_action_type_to_string(enum netif_action_type action);
Jeff Johnson5b76a3e2017-08-29 14:18:38 -0700249void wlan_hdd_netif_queue_control(struct hdd_adapter *adapter,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800250 enum netif_action_type action, enum netif_reason_type reason);
Nirav Shah73713f72018-05-17 14:50:41 +0530251
252#ifdef FEATURE_MONITOR_MODE_SUPPORT
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -0700253int hdd_set_mon_rx_cb(struct net_device *dev);
Nirav Shah73713f72018-05-17 14:50:41 +0530254#else
255static inline
256int hdd_set_mon_rx_cb(struct net_device *dev)
257{
258 return 0;
259}
260#endif
261
Jeff Johnson5b76a3e2017-08-29 14:18:38 -0700262void hdd_send_rps_ind(struct hdd_adapter *adapter);
Yun Parkff6a16a2017-09-26 16:38:18 -0700263void hdd_send_rps_disable_ind(struct hdd_adapter *adapter);
Nirav Shah5e74bb82016-07-20 16:01:27 +0530264void wlan_hdd_classify_pkt(struct sk_buff *skb);
265
Ravi Joshib89e7f72016-09-07 13:43:15 -0700266#ifdef MSM_PLATFORM
Jeff Johnsona9dc1dc2017-08-28 11:37:48 -0700267void hdd_reset_tcp_delack(struct hdd_context *hdd_ctx);
Manjunathappa Prakashbfd12762018-04-29 22:44:52 -0700268#define HDD_MSM_CFG(msm_cfg) msm_cfg
Ravi Joshib89e7f72016-09-07 13:43:15 -0700269#else
Jeff Johnsona9dc1dc2017-08-28 11:37:48 -0700270static inline void hdd_reset_tcp_delack(struct hdd_context *hdd_ctx) {}
Manjunathappa Prakashbfd12762018-04-29 22:44:52 -0700271#define HDD_MSM_CFG(msm_cfg) 0
Ravi Joshib89e7f72016-09-07 13:43:15 -0700272#endif
273
Nirav Shah5e74bb82016-07-20 16:01:27 +0530274#ifdef FEATURE_WLAN_DIAG_SUPPORT
275void hdd_event_eapol_log(struct sk_buff *skb, enum qdf_proto_dir dir);
276#else
277static inline
278void hdd_event_eapol_log(struct sk_buff *skb, enum qdf_proto_dir dir)
279{}
280#endif
281
Dustin Browne0024fa2016-10-14 16:29:21 -0700282/*
283 * As of the 4.7 kernel, net_device->trans_start is removed. Create shims to
284 * support compiling against older versions of the kernel.
285 */
286#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0))
287static inline void netif_trans_update(struct net_device *dev)
288{
289 dev->trans_start = jiffies;
290}
291
292#define TX_TIMEOUT_TRACE(dev, module_id) QDF_TRACE( \
293 module_id, QDF_TRACE_LEVEL_ERROR, \
294 "%s: Transmission timeout occurred jiffies %lu trans_start %lu", \
295 __func__, jiffies, dev->trans_start)
296#else
297#define TX_TIMEOUT_TRACE(dev, module_id) QDF_TRACE( \
298 module_id, QDF_TRACE_LEVEL_ERROR, \
299 "%s: Transmission timeout occurred jiffies %lu", \
300 __func__, jiffies)
301#endif
302
Mohit Khanna87493732017-08-27 23:26:44 -0700303static inline void
Jeff Johnson450d2442017-11-07 13:58:01 -0800304hdd_skb_fill_gso_size(struct net_device *dev, struct sk_buff *skb)
305{
Mohit Khanna87493732017-08-27 23:26:44 -0700306 if (skb_cloned(skb) && skb_is_nonlinear(skb) &&
Jeff Johnson450d2442017-11-07 13:58:01 -0800307 skb_shinfo(skb)->gso_size == 0 &&
308 ip_hdr(skb)->protocol == IPPROTO_TCP) {
Mohit Khanna87493732017-08-27 23:26:44 -0700309 skb_shinfo(skb)->gso_size = dev->mtu -
310 ((skb_transport_header(skb) - skb_network_header(skb))
311 + tcp_hdrlen(skb));
312 }
313}
314
Alok Kumarb64650c2018-03-23 17:05:11 +0530315/**
316 * hdd_txrx_get_tx_ack_count() - get tx acked count
317 * @adapter: Pointer to adapter
318 *
319 * Return: tx acked count
320 */
321uint32_t hdd_txrx_get_tx_ack_count(struct hdd_adapter *adapter);
jinweic chen51046012018-04-11 16:02:22 +0800322
323#ifdef CONFIG_HL_SUPPORT
324static inline QDF_STATUS
325hdd_skb_nontso_linearize(struct sk_buff *skb)
326{
327 return QDF_STATUS_SUCCESS;
328}
329#else
330static inline QDF_STATUS
331hdd_skb_nontso_linearize(struct sk_buff *skb)
332{
333 if (qdf_nbuf_is_nonlinear(skb) && qdf_nbuf_is_tso(skb) == false) {
334 if (qdf_unlikely(skb_linearize(skb)))
335 return QDF_STATUS_E_NOMEM;
336 }
337 return QDF_STATUS_SUCCESS;
338}
339#endif
340
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800341#endif /* end #if !defined(WLAN_HDD_TX_RX_H) */