GNU Linux-libre 4.9.309-gnu1
[releases.git] / drivers / staging / rtl8188eu / include / rtw_recv.h
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  ******************************************************************************/
15 #ifndef _RTW_RECV_H_
16 #define _RTW_RECV_H_
17
18 #include <osdep_service.h>
19 #include <drv_types.h>
20
21
22 #define NR_RECVFRAME 256
23
24 #define RXFRAME_ALIGN   8
25 #define RXFRAME_ALIGN_SZ        (1<<RXFRAME_ALIGN)
26
27 #define MAX_RXFRAME_CNT 512
28 #define MAX_RX_NUMBLKS          (32)
29 #define RECVFRAME_HDR_ALIGN 128
30
31 #define SNAP_SIZE sizeof(struct ieee80211_snap_hdr)
32
33 #define MAX_SUBFRAME_COUNT      64
34
35 /* for Rx reordering buffer control */
36 struct recv_reorder_ctrl {
37         struct adapter  *padapter;
38         u8 enable;
39         u16 indicate_seq;/* wstart_b, init_value=0xffff */
40         u16 wend_b;
41         u8 wsize_b;
42         struct __queue pending_recvframe_queue;
43         struct timer_list reordering_ctrl_timer;
44 };
45
46 struct  stainfo_rxcache {
47         u16     tid_rxseq[16];
48 /*
49         unsigned short  tid0_rxseq;
50         unsigned short  tid1_rxseq;
51         unsigned short  tid2_rxseq;
52         unsigned short  tid3_rxseq;
53         unsigned short  tid4_rxseq;
54         unsigned short  tid5_rxseq;
55         unsigned short  tid6_rxseq;
56         unsigned short  tid7_rxseq;
57         unsigned short  tid8_rxseq;
58         unsigned short  tid9_rxseq;
59         unsigned short  tid10_rxseq;
60         unsigned short  tid11_rxseq;
61         unsigned short  tid12_rxseq;
62         unsigned short  tid13_rxseq;
63         unsigned short  tid14_rxseq;
64         unsigned short  tid15_rxseq;
65 */
66 };
67
68 struct signal_stat {
69         u8      update_req;             /* used to indicate */
70         u8      avg_val;                /* avg of valid elements */
71         u32     total_num;              /* num of valid elements */
72         u32     total_val;              /* sum of valid elements */
73 };
74 #define MAX_PATH_NUM_92CS               3
75 struct phy_info {
76         u8      RxPWDBAll;
77         u8      SignalQuality;   /*  in 0-100 index. */
78         u8      RxMIMOSignalQuality[MAX_PATH_NUM_92CS]; /* EVM */
79         u8      RxMIMOSignalStrength[MAX_PATH_NUM_92CS];/*  in 0~100 index */
80         s8      RxPower; /*  in dBm Translate from PWdB */
81 /*  Real power in dBm for this packet, no beautification and aggregation.
82  * Keep this raw info to be used for the other procedures. */
83         s8      recvpower;
84         u8      BTRxRSSIPercentage;
85         u8      SignalStrength; /*  in 0-100 index. */
86         u8      RxPwr[MAX_PATH_NUM_92CS];/* per-path's pwdb */
87         u8      RxSNR[MAX_PATH_NUM_92CS];/* per-path's SNR */
88 };
89
90 struct rx_pkt_attrib {
91         u16     pkt_len;
92         u8      physt;
93         u8      drvinfo_sz;
94         u8      shift_sz;
95         u8      hdrlen; /* the WLAN Header Len */
96         u8      to_fr_ds;
97         u8      amsdu;
98         u8      qos;
99         u8      priority;
100         u8      pw_save;
101         u8      mdata;
102         u16     seq_num;
103         u8      frag_num;
104         u8      mfrag;
105         u8      order;
106         u8      privacy; /* in frame_ctrl field */
107         u8      bdecrypted;
108         u8      encrypt; /* when 0 indicate no encrypt. when non-zero,
109                           * indicate the encrypt algorith */
110         u8      iv_len;
111         u8      icv_len;
112         u8      crc_err;
113         u8      icv_err;
114
115         u16 eth_type;
116
117         u8      dst[ETH_ALEN];
118         u8      src[ETH_ALEN];
119         u8      ta[ETH_ALEN];
120         u8      ra[ETH_ALEN];
121         u8      bssid[ETH_ALEN];
122
123         u8 ack_policy;
124
125         u8      key_index;
126
127         u8      mcs_rate;
128         u8      rxht;
129         u8      sgi;
130         u8      pkt_rpt_type;
131         u32     MacIDValidEntry[2];     /*  64 bits present 64 entry. */
132
133         struct phy_info phy_info;
134 };
135
136
137 /* These definition is used for Rx packet reordering. */
138 #define SN_LESS(a, b)           (((a - b) & 0x800) != 0)
139 #define SN_EQUAL(a, b)  (a == b)
140 #define REORDER_WAIT_TIME       (50) /*  (ms) */
141
142 #define RECVBUFF_ALIGN_SZ 8
143
144 #define RXDESC_SIZE     24
145 #define RXDESC_OFFSET RXDESC_SIZE
146
147 struct recv_stat {
148         __le32 rxdw0;
149         __le32 rxdw1;
150         __le32 rxdw2;
151         __le32 rxdw3;
152         __le32 rxdw4;
153         __le32 rxdw5;
154 };
155
156 #define EOR BIT(30)
157
158 /*
159 accesser of recv_priv: rtw_recv_entry(dispatch / passive level);
160 recv_thread(passive) ; returnpkt(dispatch)
161 ; halt(passive) ;
162
163 using enter_critical section to protect
164 */
165 struct recv_priv {
166         struct __queue free_recv_queue;
167         struct __queue recv_pending_queue;
168         struct __queue uc_swdec_pending_queue;
169         u8 *pallocated_frame_buf;
170         u8 *precv_frame_buf;
171         uint free_recvframe_cnt;
172         struct adapter  *adapter;
173         u32     bIsAnyNonBEPkts;
174         u64     rx_bytes;
175         u64     rx_pkts;
176         u64     rx_drop;
177         u64     last_rx_bytes;
178
179         uint    ff_hwaddr;
180         u8      rx_pending_cnt;
181
182         struct tasklet_struct irq_prepare_beacon_tasklet;
183         struct tasklet_struct recv_tasklet;
184         struct sk_buff_head free_recv_skb_queue;
185         struct sk_buff_head rx_skb_queue;
186         u8 *pallocated_recv_buf;
187         u8 *precv_buf;    /*  4 alignment */
188         struct __queue free_recv_buf_queue;
189         u32     free_recv_buf_queue_cnt;
190         /* For display the phy informatiom */
191         u8 is_signal_dbg;       /*  for debug */
192         u8 signal_strength_dbg; /*  for debug */
193         s8 rssi;
194         s8 rxpwdb;
195         u8 signal_strength;
196         u8 signal_qual;
197         u8 noise;
198         s8 RxRssi[2];
199
200         struct timer_list signal_stat_timer;
201         u32 signal_stat_sampling_interval;
202         struct signal_stat signal_qual_data;
203         struct signal_stat signal_strength_data;
204 };
205
206 #define rtw_set_signal_stat_timer(recvpriv)                     \
207         mod_timer(&(recvpriv)->signal_stat_timer, jiffies +     \
208                   msecs_to_jiffies((recvpriv)->signal_stat_sampling_interval))
209
210 struct sta_recv_priv {
211         spinlock_t lock;
212         int     option;
213         struct __queue defrag_q; /* keeping the fragment frame until defrag */
214         struct  stainfo_rxcache rxcache;
215 };
216
217 struct recv_buf {
218         struct adapter *adapter;
219         struct urb *purb;
220         struct sk_buff *pskb;
221         u8      reuse;
222 };
223
224 /*
225         head  ----->
226
227                 data  ----->
228
229                         payload
230
231                 tail  ----->
232
233
234         end   ----->
235
236         len = (unsigned int )(tail - data);
237
238 */
239 struct recv_frame {
240         struct list_head list;
241         struct sk_buff   *pkt;
242         struct adapter  *adapter;
243         struct rx_pkt_attrib attrib;
244         uint  len;
245         u8 *rx_head;
246         u8 *rx_data;
247         u8 *rx_tail;
248         u8 *rx_end;
249         struct sta_info *psta;
250         /* for A-MPDU Rx reordering buffer control */
251         struct recv_reorder_ctrl *preorder_ctrl;
252 };
253
254 struct recv_frame *_rtw_alloc_recvframe(struct __queue *pfree_recv_queue);
255 struct recv_frame *rtw_alloc_recvframe(struct __queue *pfree_recv_queue);
256 void rtw_init_recvframe(struct recv_frame *precvframe,
257                         struct recv_priv *precvpriv);
258 int  rtw_free_recvframe(struct recv_frame *precvframe,
259                         struct __queue *pfree_recv_queue);
260 #define rtw_dequeue_recvframe(queue) rtw_alloc_recvframe(queue)
261 int _rtw_enqueue_recvframe(struct recv_frame *precvframe,
262                            struct __queue *queue);
263 int rtw_enqueue_recvframe(struct recv_frame *precvframe, struct __queue *queue);
264 void rtw_free_recvframe_queue(struct __queue *pframequeue,
265                               struct __queue *pfree_recv_queue);
266 u32 rtw_free_uc_swdec_pending_queue(struct adapter *adapter);
267
268 void rtw_reordering_ctrl_timeout_handler(unsigned long data);
269
270 static inline u8 *get_rxmem(struct recv_frame *precvframe)
271 {
272         /* always return rx_head... */
273         if (precvframe == NULL)
274                 return NULL;
275         return precvframe->rx_head;
276 }
277
278 static inline u8 *recvframe_pull(struct recv_frame *precvframe, int sz)
279 {
280         /*  rx_data += sz; move rx_data sz bytes  hereafter */
281
282         /* used for extract sz bytes from rx_data, update rx_data and return
283          * the updated rx_data to the caller */
284
285         if (precvframe == NULL)
286                 return NULL;
287         precvframe->rx_data += sz;
288         if (precvframe->rx_data > precvframe->rx_tail) {
289                 precvframe->rx_data -= sz;
290                 return NULL;
291         }
292         precvframe->len -= sz;
293         return precvframe->rx_data;
294 }
295
296 static inline u8 *recvframe_put(struct recv_frame *precvframe, int sz)
297 {
298         /* used for append sz bytes from ptr to rx_tail, update rx_tail
299          * and return the updated rx_tail to the caller */
300         /* after putting, rx_tail must be still larger than rx_end. */
301
302         if (precvframe == NULL)
303                 return NULL;
304
305         precvframe->rx_tail += sz;
306
307         if (precvframe->rx_tail > precvframe->rx_end) {
308                 precvframe->rx_tail -= sz;
309                 return NULL;
310         }
311         precvframe->len += sz;
312         return precvframe->rx_tail;
313 }
314
315 static inline u8 *recvframe_pull_tail(struct recv_frame *precvframe, int sz)
316 {
317         /*  rmv data from rx_tail (by yitsen) */
318
319         /* used for extract sz bytes from rx_end, update rx_end and return
320          * the updated rx_end to the caller */
321         /* after pulling, rx_end must be still larger than rx_data. */
322
323         if (precvframe == NULL)
324                 return NULL;
325         precvframe->rx_tail -= sz;
326         if (precvframe->rx_tail < precvframe->rx_data) {
327                 precvframe->rx_tail += sz;
328                 return NULL;
329         }
330         precvframe->len -= sz;
331         return precvframe->rx_tail;
332 }
333
334 static inline s32 translate_percentage_to_dbm(u32 sig_stren_index)
335 {
336         s32     power; /*  in dBm. */
337
338         /*  Translate to dBm (x=0.5y-95). */
339         power = (s32)((sig_stren_index + 1) >> 1);
340         power -= 95;
341
342         return power;
343 }
344
345
346 struct sta_info;
347
348 void _rtw_init_sta_recv_priv(struct sta_recv_priv *psta_recvpriv);
349
350 void  mgt_dispatcher(struct adapter *padapter, struct recv_frame *precv_frame);
351
352 #endif