blob: 193cb158f1ed7b90e5828a5448aacb2f41c984ce [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
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080036#define HDD_ETHERTYPE_802_1_X 0x888E
37#define HDD_ETHERTYPE_802_1_X_FRAME_OFFSET 12
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080038#ifdef FEATURE_WLAN_WAPI
39#define HDD_ETHERTYPE_WAI 0x88b4
Jinwei Chen19846e52018-04-03 19:20:38 +080040#define IS_HDD_ETHERTYPE_WAI(_skb) (ntohs(_skb->protocol) == \
41 HDD_ETHERTYPE_WAI)
42#else
43#define IS_HDD_ETHERTYPE_WAI(_skb) (false)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080044#endif
45
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080046#define HDD_PSB_CFG_INVALID 0xFF
47#define HDD_PSB_CHANGED 0xFF
48#define SME_QOS_UAPSD_CFG_BK_CHANGED_MASK 0xF1
49#define SME_QOS_UAPSD_CFG_BE_CHANGED_MASK 0xF2
50#define SME_QOS_UAPSD_CFG_VI_CHANGED_MASK 0xF4
51#define SME_QOS_UAPSD_CFG_VO_CHANGED_MASK 0xF8
52
Srinivas Girigowdade28a9d2018-03-19 19:19:49 -070053netdev_tx_t hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080054void hdd_tx_timeout(struct net_device *dev);
Dhanashri Atre182b0272016-02-17 15:35:07 -080055
Jeff Johnson80486862017-10-02 13:21:29 -070056QDF_STATUS hdd_init_tx_rx(struct hdd_adapter *adapter);
57QDF_STATUS hdd_deinit_tx_rx(struct hdd_adapter *adapter);
Dhanashri Atre182b0272016-02-17 15:35:07 -080058QDF_STATUS hdd_rx_packet_cbk(void *context, qdf_nbuf_t rxBuf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080059
Manjunathappa Prakash7b0ad462018-04-15 00:37:16 -070060/**
61 * hdd_rx_ol_init() - Initialize Rx mode(LRO or GRO) method
62 * @hdd_ctx: pointer to HDD Station Context
63 *
64 * Return: 0 on success and non zero on failure.
65 */
66int hdd_rx_ol_init(struct hdd_context *hdd_ctx);
67
68/**
69 * hdd_disable_rx_ol_in_concurrency() - Disable Rx offload due to concurrency
70 * @disable: true/false to disable/enable the Rx offload
71 *
72 * Return: none
73 */
74void hdd_disable_rx_ol_in_concurrency(bool disable);
75
76/**
77 * hdd_disable_rx_ol_for_low_tput() - Disable Rx offload in low TPUT scenario
78 * @hdd_ctx: hdd context
79 * @disable: true/false to disable/enable the Rx offload
80 *
81 * Return: none
82 */
83void hdd_disable_rx_ol_for_low_tput(struct hdd_context *hdd_ctx, bool disable);
84
Jeff Johnson40dae4e2017-08-29 14:00:25 -070085QDF_STATUS hdd_get_peer_sta_id(struct hdd_station_ctx *sta_ctx,
Deepak Dhamdhere5872c8c2016-06-02 15:51:47 -070086 struct qdf_mac_addr *peer_mac_addr,
87 uint8_t *sta_id);
Poddar, Siddarth31797fa2018-01-22 17:24:15 +053088/**
jitiphilfb410612018-03-26 22:37:56 +053089 * hdd_reset_all_adapters_connectivity_stats() - reset connectivity stats
90 * @hdd_ctx: pointer to HDD Station Context
91 *
92 * Return: None
93 */
94void hdd_reset_all_adapters_connectivity_stats(struct hdd_context *hdd_ctx);
95
96/**
Poddar, Siddarth31797fa2018-01-22 17:24:15 +053097 * hdd_tx_rx_collect_connectivity_stats_info() - collect connectivity stats
98 * @skb: pointer to skb data
99 * @adapter: pointer to vdev apdapter
100 * @action: action done on pkt.
101 * @pkt_type: data pkt type
102 *
103 * Return: None
104 */
105void hdd_tx_rx_collect_connectivity_stats_info(struct sk_buff *skb,
106 void *adapter, enum connectivity_stats_pkt_status action,
107 uint8_t *pkt_type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800108
Varun Reddy Yeturu076eaa82018-01-16 12:16:14 -0800109/**
110 * hdd_tx_queue_cb() - Disable/Enable the Transmit Queues
111 * @context: HDD context
112 * @vdev_id: vdev id
113 * @action: Action to be taken on the Tx Queues
114 * @reason: Reason for the netif action
115 *
116 * Return: None
117 */
118void hdd_tx_queue_cb(void *context, uint32_t vdev_id,
119 enum netif_action_type action,
120 enum netif_reason_type reason);
121
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800122#ifdef QCA_LL_LEGACY_TX_FLOW_CONTROL
123void hdd_tx_resume_cb(void *adapter_context, bool tx_resume);
bings284f8be2017-08-11 10:41:30 +0800124
125/**
126 * hdd_tx_flow_control_is_pause() - Is TX Q paused by flow control
127 * @adapter_context: pointer to vdev apdapter
128 *
129 * Return: true if TX Q is paused by flow control
130 */
131bool hdd_tx_flow_control_is_pause(void *adapter_context);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800132void hdd_tx_resume_timer_expired_handler(void *adapter_context);
bings284f8be2017-08-11 10:41:30 +0800133
134/**
135 * hdd_register_tx_flow_control() - Register TX Flow control
136 * @adapter: adapter handle
137 * @timer_callback: timer callback
138 * @flow_control_fp: txrx flow control
139 * @flow_control_is_pause_fp: is txrx paused by flow control
140 *
141 * Return: none
142 */
Jeff Johnson5b76a3e2017-08-29 14:18:38 -0700143void hdd_register_tx_flow_control(struct hdd_adapter *adapter,
Anurag Chouhan210db072016-02-22 18:42:15 +0530144 qdf_mc_timer_callback_t timer_callback,
bings284f8be2017-08-11 10:41:30 +0800145 ol_txrx_tx_flow_control_fp flowControl,
146 ol_txrx_tx_flow_control_is_pause_fp flow_control_is_pause);
Jeff Johnson5b76a3e2017-08-29 14:18:38 -0700147void hdd_deregister_tx_flow_control(struct hdd_adapter *adapter);
148void hdd_get_tx_resource(struct hdd_adapter *adapter,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800149 uint8_t STAId, uint16_t timer_value);
150
151#else
152static inline void hdd_tx_resume_cb(void *adapter_context, bool tx_resume)
153{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800154}
bings284f8be2017-08-11 10:41:30 +0800155static inline bool hdd_tx_flow_control_is_pause(void *adapter_context)
156{
157 return false;
158}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800159static inline void hdd_tx_resume_timer_expired_handler(void *adapter_context)
160{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800161}
Jeff Johnson5b76a3e2017-08-29 14:18:38 -0700162static inline void hdd_register_tx_flow_control(struct hdd_adapter *adapter,
Anurag Chouhan210db072016-02-22 18:42:15 +0530163 qdf_mc_timer_callback_t timer_callback,
bings284f8be2017-08-11 10:41:30 +0800164 ol_txrx_tx_flow_control_fp flowControl,
165 ol_txrx_tx_flow_control_is_pause_fp flow_control_is_pause)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800166{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800167}
Jeff Johnson5b76a3e2017-08-29 14:18:38 -0700168static inline void hdd_deregister_tx_flow_control(struct hdd_adapter *adapter)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800169{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800170}
Jeff Johnson5b76a3e2017-08-29 14:18:38 -0700171static inline void hdd_get_tx_resource(struct hdd_adapter *adapter,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800172 uint8_t STAId, uint16_t timer_value)
173{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800174}
175#endif /* QCA_LL_LEGACY_TX_FLOW_CONTROL */
176
Jeff Johnson811f47d2017-10-03 11:33:09 -0700177int hdd_get_peer_idx(struct hdd_station_ctx *sta_ctx,
178 struct qdf_mac_addr *addr);
Naveen Rawatf28315c2016-06-29 18:06:02 -0700179
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800180const char *hdd_reason_type_to_string(enum netif_reason_type reason);
181const char *hdd_action_type_to_string(enum netif_action_type action);
Jeff Johnson5b76a3e2017-08-29 14:18:38 -0700182void wlan_hdd_netif_queue_control(struct hdd_adapter *adapter,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800183 enum netif_action_type action, enum netif_reason_type reason);
Nirav Shah73713f72018-05-17 14:50:41 +0530184
185#ifdef FEATURE_MONITOR_MODE_SUPPORT
Manjunathappa Prakash59f861d2016-04-21 10:33:31 -0700186int hdd_set_mon_rx_cb(struct net_device *dev);
Nirav Shah73713f72018-05-17 14:50:41 +0530187#else
188static inline
189int hdd_set_mon_rx_cb(struct net_device *dev)
190{
191 return 0;
192}
193#endif
194
Jeff Johnson5b76a3e2017-08-29 14:18:38 -0700195void hdd_send_rps_ind(struct hdd_adapter *adapter);
Yun Parkff6a16a2017-09-26 16:38:18 -0700196void hdd_send_rps_disable_ind(struct hdd_adapter *adapter);
Nirav Shah5e74bb82016-07-20 16:01:27 +0530197void wlan_hdd_classify_pkt(struct sk_buff *skb);
198
Ravi Joshib89e7f72016-09-07 13:43:15 -0700199#ifdef MSM_PLATFORM
Jeff Johnsona9dc1dc2017-08-28 11:37:48 -0700200void hdd_reset_tcp_delack(struct hdd_context *hdd_ctx);
Manjunathappa Prakashbfd12762018-04-29 22:44:52 -0700201#define HDD_MSM_CFG(msm_cfg) msm_cfg
Ravi Joshib89e7f72016-09-07 13:43:15 -0700202#else
Jeff Johnsona9dc1dc2017-08-28 11:37:48 -0700203static inline void hdd_reset_tcp_delack(struct hdd_context *hdd_ctx) {}
Manjunathappa Prakashbfd12762018-04-29 22:44:52 -0700204#define HDD_MSM_CFG(msm_cfg) 0
Ravi Joshib89e7f72016-09-07 13:43:15 -0700205#endif
206
Nirav Shah5e74bb82016-07-20 16:01:27 +0530207#ifdef FEATURE_WLAN_DIAG_SUPPORT
208void hdd_event_eapol_log(struct sk_buff *skb, enum qdf_proto_dir dir);
209#else
210static inline
211void hdd_event_eapol_log(struct sk_buff *skb, enum qdf_proto_dir dir)
212{}
213#endif
214
Dustin Browne0024fa2016-10-14 16:29:21 -0700215/*
216 * As of the 4.7 kernel, net_device->trans_start is removed. Create shims to
217 * support compiling against older versions of the kernel.
218 */
219#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0))
220static inline void netif_trans_update(struct net_device *dev)
221{
222 dev->trans_start = jiffies;
223}
224
225#define TX_TIMEOUT_TRACE(dev, module_id) QDF_TRACE( \
226 module_id, QDF_TRACE_LEVEL_ERROR, \
227 "%s: Transmission timeout occurred jiffies %lu trans_start %lu", \
228 __func__, jiffies, dev->trans_start)
229#else
230#define TX_TIMEOUT_TRACE(dev, module_id) QDF_TRACE( \
231 module_id, QDF_TRACE_LEVEL_ERROR, \
232 "%s: Transmission timeout occurred jiffies %lu", \
233 __func__, jiffies)
234#endif
235
Mohit Khanna87493732017-08-27 23:26:44 -0700236static inline void
Jeff Johnson450d2442017-11-07 13:58:01 -0800237hdd_skb_fill_gso_size(struct net_device *dev, struct sk_buff *skb)
238{
Mohit Khanna87493732017-08-27 23:26:44 -0700239 if (skb_cloned(skb) && skb_is_nonlinear(skb) &&
Jeff Johnson450d2442017-11-07 13:58:01 -0800240 skb_shinfo(skb)->gso_size == 0 &&
241 ip_hdr(skb)->protocol == IPPROTO_TCP) {
Mohit Khanna87493732017-08-27 23:26:44 -0700242 skb_shinfo(skb)->gso_size = dev->mtu -
243 ((skb_transport_header(skb) - skb_network_header(skb))
244 + tcp_hdrlen(skb));
245 }
246}
247
Alok Kumarb64650c2018-03-23 17:05:11 +0530248/**
249 * hdd_txrx_get_tx_ack_count() - get tx acked count
250 * @adapter: Pointer to adapter
251 *
252 * Return: tx acked count
253 */
254uint32_t hdd_txrx_get_tx_ack_count(struct hdd_adapter *adapter);
jinweic chen51046012018-04-11 16:02:22 +0800255
256#ifdef CONFIG_HL_SUPPORT
257static inline QDF_STATUS
258hdd_skb_nontso_linearize(struct sk_buff *skb)
259{
260 return QDF_STATUS_SUCCESS;
261}
262#else
263static inline QDF_STATUS
264hdd_skb_nontso_linearize(struct sk_buff *skb)
265{
266 if (qdf_nbuf_is_nonlinear(skb) && qdf_nbuf_is_tso(skb) == false) {
267 if (qdf_unlikely(skb_linearize(skb)))
268 return QDF_STATUS_E_NOMEM;
269 }
270 return QDF_STATUS_SUCCESS;
271}
272#endif
273
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800274#endif /* end #if !defined(WLAN_HDD_TX_RX_H) */