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