/* * Copyright (c) 2014, Lorenzo Bianconi <[email protected]> * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "ath9k.h" #include "hw.h" #include "dynack.h" #define COMPUTE_TO … #define LATEACK_DELAY … #define EWMA_LEVEL … #define EWMA_DIV … /** * ath_dynack_get_max_to - set max timeout according to channel width * @ah: ath hw * */ static u32 ath_dynack_get_max_to(struct ath_hw *ah) { … } /* * ath_dynack_ewma - EWMA (Exponentially Weighted Moving Average) calculation */ static inline int ath_dynack_ewma(int old, int new) { … } /** * ath_dynack_get_sifs - get sifs time based on phy used * @ah: ath hw * @phy: phy used * */ static inline u32 ath_dynack_get_sifs(struct ath_hw *ah, int phy) { … } /** * ath_dynack_bssidmask - filter out ACK frames based on BSSID mask * @ah: ath hw * @mac: receiver address */ static inline bool ath_dynack_bssidmask(struct ath_hw *ah, const u8 *mac) { … } /** * ath_dynack_set_timeout - configure timeouts/slottime registers * @ah: ath hw * @to: timeout value * */ static void ath_dynack_set_timeout(struct ath_hw *ah, int to) { … } /** * ath_dynack_compute_ackto - compute ACK timeout as the maximum STA timeout * @ah: ath hw * * should be called while holding qlock */ static void ath_dynack_compute_ackto(struct ath_hw *ah) { … } /** * ath_dynack_compute_to - compute STA ACK timeout * @ah: ath hw * * should be called while holding qlock */ static void ath_dynack_compute_to(struct ath_hw *ah) { … } /** * ath_dynack_sample_tx_ts - status timestamp sampling method * @ah: ath hw * @skb: socket buffer * @ts: tx status info * @sta: station pointer * */ void ath_dynack_sample_tx_ts(struct ath_hw *ah, struct sk_buff *skb, struct ath_tx_status *ts, struct ieee80211_sta *sta) { … } EXPORT_SYMBOL(…); /** * ath_dynack_sample_ack_ts - ACK timestamp sampling method * @ah: ath hw * @skb: socket buffer * @ts: rx timestamp * */ void ath_dynack_sample_ack_ts(struct ath_hw *ah, struct sk_buff *skb, u32 ts) { … } EXPORT_SYMBOL(…); /** * ath_dynack_node_init - init ath_node related info * @ah: ath hw * @an: ath node * */ void ath_dynack_node_init(struct ath_hw *ah, struct ath_node *an) { … } EXPORT_SYMBOL(…); /** * ath_dynack_node_deinit - deinit ath_node related info * @ah: ath hw * @an: ath node * */ void ath_dynack_node_deinit(struct ath_hw *ah, struct ath_node *an) { … } EXPORT_SYMBOL(…); /** * ath_dynack_reset - reset dynack processing * @ah: ath hw * */ void ath_dynack_reset(struct ath_hw *ah) { … } EXPORT_SYMBOL(…); /** * ath_dynack_init - init dynack data structure * @ah: ath hw * */ void ath_dynack_init(struct ath_hw *ah) { … }