Blame view

kernel/linux-rt-4.4.41/drivers/net/wireless/ath/ath9k/dynack.h 2.92 KB
5113f6f70   김현기   kernel add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
  /*
   * 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);
  #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) {}
  #endif
  
  #endif /* DYNACK_H */