xref: /wlan-dirver/qcacld-3.0/core/hdd/inc/wlan_hdd_tx_rx.h (revision 1240fc7c98a5a5c6056b3d260d6ade7605f836ed)
1 /*
2  * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved.
3  *
4  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5  *
6  *
7  * Permission to use, copy, modify, and/or distribute this software for
8  * any purpose with or without fee is hereby granted, provided that the
9  * above copyright notice and this permission notice appear in all
10  * copies.
11  *
12  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19  * PERFORMANCE OF THIS SOFTWARE.
20  */
21 
22 /*
23  * This file was originally distributed by Qualcomm Atheros, Inc.
24  * under proprietary terms before Copyright ownership was assigned
25  * to the Linux Foundation.
26  */
27 
28 #if !defined(WLAN_HDD_TX_RX_H)
29 #define WLAN_HDD_TX_RX_H
30 
31 /**
32  *
33  * DOC: wlan_hdd_tx_rx.h
34  *
35  * Linux HDD Tx/RX APIs
36  */
37 
38 #include <wlan_hdd_includes.h>
39 #include <cds_api.h>
40 #include <linux/skbuff.h>
41 #include "cdp_txrx_flow_ctrl_legacy.h"
42 
43 struct hdd_context;
44 
45 #define HDD_ETHERTYPE_802_1_X              0x888E
46 #define HDD_ETHERTYPE_802_1_X_FRAME_OFFSET 12
47 #ifdef FEATURE_WLAN_WAPI
48 #define HDD_ETHERTYPE_WAI                  0x88b4
49 #endif
50 
51 #define HDD_PSB_CFG_INVALID                   0xFF
52 #define HDD_PSB_CHANGED                       0xFF
53 #define SME_QOS_UAPSD_CFG_BK_CHANGED_MASK     0xF1
54 #define SME_QOS_UAPSD_CFG_BE_CHANGED_MASK     0xF2
55 #define SME_QOS_UAPSD_CFG_VI_CHANGED_MASK     0xF4
56 #define SME_QOS_UAPSD_CFG_VO_CHANGED_MASK     0xF8
57 
58 int hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev);
59 void hdd_tx_timeout(struct net_device *dev);
60 
61 QDF_STATUS hdd_init_tx_rx(struct hdd_adapter *adapter);
62 QDF_STATUS hdd_deinit_tx_rx(struct hdd_adapter *adapter);
63 QDF_STATUS hdd_rx_packet_cbk(void *context, qdf_nbuf_t rxBuf);
64 
65 QDF_STATUS hdd_get_peer_sta_id(struct hdd_station_ctx *sta_ctx,
66 				struct qdf_mac_addr *peer_mac_addr,
67 				uint8_t *sta_id);
68 
69 #ifdef QCA_LL_LEGACY_TX_FLOW_CONTROL
70 void hdd_tx_resume_cb(void *adapter_context, bool tx_resume);
71 
72 /**
73  * hdd_tx_flow_control_is_pause() - Is TX Q paused by flow control
74  * @adapter_context: pointer to vdev apdapter
75  *
76  * Return: true if TX Q is paused by flow control
77  */
78 bool hdd_tx_flow_control_is_pause(void *adapter_context);
79 void hdd_tx_resume_timer_expired_handler(void *adapter_context);
80 
81 /**
82  * hdd_register_tx_flow_control() - Register TX Flow control
83  * @adapter: adapter handle
84  * @timer_callback: timer callback
85  * @flow_control_fp: txrx flow control
86  * @flow_control_is_pause_fp: is txrx paused by flow control
87  *
88  * Return: none
89  */
90 void hdd_register_tx_flow_control(struct hdd_adapter *adapter,
91 		qdf_mc_timer_callback_t timer_callback,
92 		ol_txrx_tx_flow_control_fp flowControl,
93 		ol_txrx_tx_flow_control_is_pause_fp flow_control_is_pause);
94 void hdd_deregister_tx_flow_control(struct hdd_adapter *adapter);
95 void hdd_get_tx_resource(struct hdd_adapter *adapter,
96 			uint8_t STAId, uint16_t timer_value);
97 
98 #else
99 static inline void hdd_tx_resume_cb(void *adapter_context, bool tx_resume)
100 {
101 }
102 static inline bool hdd_tx_flow_control_is_pause(void *adapter_context)
103 {
104 	return false;
105 }
106 static inline void hdd_tx_resume_timer_expired_handler(void *adapter_context)
107 {
108 }
109 static inline void hdd_register_tx_flow_control(struct hdd_adapter *adapter,
110 		qdf_mc_timer_callback_t timer_callback,
111 		ol_txrx_tx_flow_control_fp flowControl,
112 		ol_txrx_tx_flow_control_is_pause_fp flow_control_is_pause)
113 {
114 }
115 static inline void hdd_deregister_tx_flow_control(struct hdd_adapter *adapter)
116 {
117 }
118 static inline void hdd_get_tx_resource(struct hdd_adapter *adapter,
119 			uint8_t STAId, uint16_t timer_value)
120 {
121 }
122 #endif /* QCA_LL_LEGACY_TX_FLOW_CONTROL */
123 
124 int hdd_get_peer_idx(struct hdd_station_ctx *sta_ctx,
125 		     struct qdf_mac_addr *addr);
126 
127 const char *hdd_reason_type_to_string(enum netif_reason_type reason);
128 const char *hdd_action_type_to_string(enum netif_action_type action);
129 void wlan_hdd_netif_queue_control(struct hdd_adapter *adapter,
130 		enum netif_action_type action, enum netif_reason_type reason);
131 int hdd_set_mon_rx_cb(struct net_device *dev);
132 void hdd_send_rps_ind(struct hdd_adapter *adapter);
133 void hdd_send_rps_disable_ind(struct hdd_adapter *adapter);
134 void wlan_hdd_classify_pkt(struct sk_buff *skb);
135 
136 #ifdef MSM_PLATFORM
137 void hdd_reset_tcp_delack(struct hdd_context *hdd_ctx);
138 #else
139 static inline void hdd_reset_tcp_delack(struct hdd_context *hdd_ctx) {}
140 #endif
141 
142 #ifdef FEATURE_WLAN_DIAG_SUPPORT
143 void hdd_event_eapol_log(struct sk_buff *skb, enum qdf_proto_dir dir);
144 #else
145 static inline
146 void hdd_event_eapol_log(struct sk_buff *skb, enum qdf_proto_dir dir)
147 {}
148 #endif
149 
150 /*
151  * As of the 4.7 kernel, net_device->trans_start is removed. Create shims to
152  * support compiling against older versions of the kernel.
153  */
154 #if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0))
155 static inline void netif_trans_update(struct net_device *dev)
156 {
157 	dev->trans_start = jiffies;
158 }
159 
160 #define TX_TIMEOUT_TRACE(dev, module_id) QDF_TRACE( \
161 	module_id, QDF_TRACE_LEVEL_ERROR, \
162 	"%s: Transmission timeout occurred jiffies %lu trans_start %lu", \
163 	__func__, jiffies, dev->trans_start)
164 #else
165 #define TX_TIMEOUT_TRACE(dev, module_id) QDF_TRACE( \
166 	module_id, QDF_TRACE_LEVEL_ERROR, \
167 	"%s: Transmission timeout occurred jiffies %lu", \
168 	__func__, jiffies)
169 #endif
170 
171 static inline void
172 hdd_skb_fill_gso_size(struct net_device *dev, struct sk_buff *skb)
173 {
174 	if (skb_cloned(skb) && skb_is_nonlinear(skb) &&
175 	    skb_shinfo(skb)->gso_size == 0 &&
176 	    ip_hdr(skb)->protocol == IPPROTO_TCP) {
177 		skb_shinfo(skb)->gso_size = dev->mtu -
178 			((skb_transport_header(skb) - skb_network_header(skb))
179 				+ tcp_hdrlen(skb));
180 	}
181 }
182 
183 #endif /* end #if !defined(WLAN_HDD_TX_RX_H) */
184