1 /******************************************************************************
3 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
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.
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
14 ******************************************************************************/
18 #include <osdep_service.h>
19 #include <drv_types.h>
20 #include <Hal8723APhyCfg.h>
22 #define NR_RECVFRAME 256
24 #define MAX_RXFRAME_CNT 512
25 #define MAX_RX_NUMBLKS (32)
26 #define RECVFRAME_HDR_ALIGN 128
28 #define SNAP_SIZE sizeof(struct ieee80211_snap_hdr)
30 #define MAX_SUBFRAME_COUNT 64
32 /* for Rx reordering buffer control */
33 struct recv_reorder_ctrl {
34 struct rtw_adapter *padapter;
36 u16 indicate_seq;/* wstart_b, init_value=0xffff */
39 struct rtw_queue pending_recvframe_queue;
40 struct timer_list reordering_ctrl_timer;
43 struct stainfo_rxcache {
46 unsigned short tid0_rxseq;
47 unsigned short tid1_rxseq;
48 unsigned short tid2_rxseq;
49 unsigned short tid3_rxseq;
50 unsigned short tid4_rxseq;
51 unsigned short tid5_rxseq;
52 unsigned short tid6_rxseq;
53 unsigned short tid7_rxseq;
54 unsigned short tid8_rxseq;
55 unsigned short tid9_rxseq;
56 unsigned short tid10_rxseq;
57 unsigned short tid11_rxseq;
58 unsigned short tid12_rxseq;
59 unsigned short tid13_rxseq;
60 unsigned short tid14_rxseq;
61 unsigned short tid15_rxseq;
65 struct smooth_rssi_data {
66 u32 elements[100]; /* array to store values */
67 u32 index; /* index to current array to store */
68 u32 total_num; /* num of valid elements */
69 u32 total_val; /* sum of valid elements */
73 u8 update_req; /* used to indicate */
74 u8 avg_val; /* avg of valid elements */
75 u32 total_num; /* num of valid elements */
76 u32 total_val; /* sum of valid elements */
81 u8 SignalQuality; /* in 0-100 index. */
82 u8 RxMIMOSignalQuality[RF_PATH_MAX]; /* EVM */
83 u8 RxMIMOSignalStrength[RF_PATH_MAX];/* 0~100 */
84 s8 RxPower; /* in dBm Translate from PWdB */
85 /* Real power in dBm for this packet, no beautification and aggregation.
86 * Keep this raw info to be used for the other procedures.
89 u8 BTRxRSSIPercentage;
90 u8 SignalStrength; /* in 0-100 index. */
91 u8 RxPwr[RF_PATH_MAX];/* per-path's pwdb */
92 u8 RxSNR[RF_PATH_MAX];/* per-path's SNR */
96 struct rx_pkt_attrib {
101 u8 hdrlen; /* the WLAN Header Len */
111 u8 privacy; /* in frame_ctrl field */
113 /* when 0 indicate no encrypt. when non-zero, indicate the algorith */
130 u8 tcpchk_valid; /* 0: invalid, 1: valid */
131 u8 ip_chkrpt; /* 0: incorrect, 1: correct */
132 u8 tcp_chkrpt; /* 0: incorrect, 1: correct */
139 u32 MacIDValidEntry[2]; /* 64 bits present 64 entry. */
140 struct phy_info phy_info;
143 /* These definition is used for Rx packet reordering. */
144 #define SN_LESS(a, b) (((a-b) & 0x800) != 0)
145 #define SN_EQUAL(a, b) (a == b)
146 #define REORDER_WAIT_TIME (50) /* (ms) */
148 #define RECVBUFF_ALIGN_SZ 8
150 #define RXDESC_SIZE 24
151 #define RXDESC_OFFSET RXDESC_SIZE
162 /* accesser of recv_priv: rtw_recv_entry23a(dispatch / passive level); \
163 * recv_thread(passive) ; returnpkt(dispatch) ; halt(passive) ;
165 * using enter_critical section to protect
170 struct rtw_queue free_recv_queue;
171 struct rtw_queue recv_pending_queue;
172 struct rtw_queue uc_swdec_pending_queue;
174 int free_recvframe_cnt;
176 struct rtw_adapter *adapter;
185 uint rx_largepacket_crcerr;
186 uint rx_smallpacket_crcerr;
187 uint rx_middlepacket_crcerr;
189 /* u8 *pallocated_urb_buf; */
192 struct urb *int_in_urb;
196 struct tasklet_struct irq_prepare_beacon_tasklet;
197 struct tasklet_struct recv_tasklet;
198 struct sk_buff_head free_recv_skb_queue;
199 struct sk_buff_head rx_skb_queue;
202 /* For display the phy informatiom */
203 u8 is_signal_dbg; /* for debug */
204 u8 signal_strength_dbg; /* for debug */
214 struct timer_list signal_stat_timer;
215 u32 signal_stat_sampling_interval;
216 /* u32 signal_stat_converging_constant; */
217 struct signal_stat signal_qual_data;
218 struct signal_stat signal_strength_data;
221 #define rtw_set_signal_stat_timer(recvpriv) \
222 mod_timer(&(recvpriv)->signal_stat_timer, jiffies + \
223 msecs_to_jiffies((recvpriv)->signal_stat_sampling_interval))
225 struct sta_recv_priv {
229 /* struct rtw_queue blk_strms[MAX_RX_NUMBLKS]; */
230 struct rtw_queue defrag_q; /* keeping the fragment frame until defrag */
232 struct stainfo_rxcache rxcache;
234 /* uint sta_rx_bytes; */
235 /* uint sta_rx_pkts; */
236 /* uint sta_rx_fail; */
242 struct list_head list;
244 struct rtw_adapter *adapter;
247 struct sk_buff *pskb;
260 * len = (unsigned int )(tail - data);
264 struct list_head list;
267 struct rtw_adapter *adapter;
269 struct rx_pkt_attrib attrib;
271 struct sta_info *psta;
273 /* for A-MPDU Rx reordering buffer control */
274 struct recv_reorder_ctrl *preorder_ctrl;
277 /* get a free recv_frame from pfree_recv_queue */
278 struct recv_frame *rtw_alloc_recvframe23a(struct rtw_queue *pfree_recv_queue);
279 int rtw_free_recvframe23a(struct recv_frame *precvframe);
281 int rtw_enqueue_recvframe23a(struct recv_frame *precvframe, struct rtw_queue *queue);
283 u32 rtw_free_uc_swdec_pending_queue23a(struct rtw_adapter *adapter);
285 int rtw_enqueue_recvbuf23a_to_head(struct recv_buf *precvbuf, struct rtw_queue *queue);
286 int rtw_enqueue_recvbuf23a(struct recv_buf *precvbuf, struct rtw_queue *queue);
287 struct recv_buf *rtw_dequeue_recvbuf23a(struct rtw_queue *queue);
289 void rtw_reordering_ctrl_timeout_handler23a(unsigned long pcontext);
291 static inline s32 translate_percentage_to_dbm(u32 SignalStrengthIndex)
293 s32 SignalPower; /* in dBm. */
295 /* Translate to dBm (x=0.5y-95). */
296 SignalPower = (s32)((SignalStrengthIndex + 1) >> 1);
305 void _rtw_init_sta_recv_priv23a(struct sta_recv_priv *psta_recvpriv);
307 void mgt_dispatcher23a(struct rtw_adapter *padapter,
308 struct recv_frame *precv_frame);