| /* |
| * Copyright (c) 2014, Lorenzo Bianconi <lorenzo.bianconi83@gmail.com> |
| * |
| * 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. |
| */ |
| |
| #ifndef DYNACK_H |
| #define DYNACK_H |
| |
| #define ATH_DYN_BUF 64 |
| |
| struct ath_hw; |
| struct ath_node; |
| |
| /** |
| * struct ath_dyn_rxbuf - ACK frame ring buffer |
| * @h_rb: ring buffer head |
| * @t_rb: ring buffer tail |
| * @tstamp: ACK RX timestamp buffer |
| */ |
| struct ath_dyn_rxbuf { |
| u16 h_rb, t_rb; |
| u32 tstamp[ATH_DYN_BUF]; |
| }; |
| |
| struct ts_info { |
| u32 tstamp; |
| u32 dur; |
| }; |
| |
| struct haddr_pair { |
| u8 h_dest[ETH_ALEN]; |
| u8 h_src[ETH_ALEN]; |
| }; |
| |
| /** |
| * struct ath_dyn_txbuf - tx frame ring buffer |
| * @h_rb: ring buffer head |
| * @t_rb: ring buffer tail |
| * @addr: dest/src address pair for a given TX frame |
| * @ts: TX frame timestamp buffer |
| */ |
| struct ath_dyn_txbuf { |
| u16 h_rb, t_rb; |
| struct haddr_pair addr[ATH_DYN_BUF]; |
| struct ts_info ts[ATH_DYN_BUF]; |
| }; |
| |
| /** |
| * struct ath_dynack - dynack processing info |
| * @enabled: enable dyn ack processing |
| * @ackto: current ACK timeout |
| * @lto: last ACK timeout computation |
| * @nodes: ath_node linked list |
| * @qlock: ts queue spinlock |
| * @ack_rbf: ACK ts ring buffer |
| * @st_rbf: status ts ring buffer |
| */ |
| struct ath_dynack { |
| bool enabled; |
| int ackto; |
| unsigned long lto; |
| |
| struct list_head nodes; |
| |
| /* protect timestamp queue access */ |
| spinlock_t qlock; |
| struct ath_dyn_rxbuf ack_rbf; |
| struct ath_dyn_txbuf st_rbf; |
| }; |
| |
| #if defined(CONFIG_ATH9K_DYNACK) |
| void ath_dynack_reset(struct ath_hw *ah); |
| void ath_dynack_node_init(struct ath_hw *ah, struct ath_node *an); |
| void ath_dynack_node_deinit(struct ath_hw *ah, struct ath_node *an); |
| void ath_dynack_init(struct ath_hw *ah); |
| void ath_dynack_sample_ack_ts(struct ath_hw *ah, struct sk_buff *skb, u32 ts); |
| void ath_dynack_sample_tx_ts(struct ath_hw *ah, struct sk_buff *skb, |
| struct ath_tx_status *ts, |
| struct ieee80211_sta *sta); |
| #else |
| static inline void ath_dynack_init(struct ath_hw *ah) {} |
| static inline void ath_dynack_node_init(struct ath_hw *ah, |
| struct ath_node *an) {} |
| static inline void ath_dynack_node_deinit(struct ath_hw *ah, |
| struct ath_node *an) {} |
| static inline void ath_dynack_sample_ack_ts(struct ath_hw *ah, |
| struct sk_buff *skb, u32 ts) {} |
| static inline void ath_dynack_sample_tx_ts(struct ath_hw *ah, |
| struct sk_buff *skb, |
| struct ath_tx_status *ts, |
| struct ieee80211_sta *sta) {} |
| #endif |
| |
| #endif /* DYNACK_H */ |