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 */ 36struct 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 46struct 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 68struct 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 75struct 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 */ 84 s8 recvpower; 85 u8 BTRxRSSIPercentage; 86 u8 SignalStrength; /* in 0-100 index. */ 87 u8 RxPwr[MAX_PATH_NUM_92CS];/* per-path's pwdb */ 88 u8 RxSNR[MAX_PATH_NUM_92CS];/* per-path's SNR */ 89}; 90 91struct rx_pkt_attrib { 92 u16 pkt_len; 93 u8 physt; 94 u8 drvinfo_sz; 95 u8 shift_sz; 96 u8 hdrlen; /* the WLAN Header Len */ 97 u8 to_fr_ds; 98 u8 amsdu; 99 u8 qos; 100 u8 priority; 101 u8 pw_save; 102 u8 mdata; 103 u16 seq_num; 104 u8 frag_num; 105 u8 mfrag; 106 u8 order; 107 u8 privacy; /* in frame_ctrl field */ 108 u8 bdecrypted; 109 u8 encrypt; /* when 0 indicate no encrypt. when non-zero, 110 * indicate the encrypt algorithm 111 */ 112 u8 iv_len; 113 u8 icv_len; 114 u8 crc_err; 115 u8 icv_err; 116 117 u16 eth_type; 118 119 u8 dst[ETH_ALEN]; 120 u8 src[ETH_ALEN]; 121 u8 ta[ETH_ALEN]; 122 u8 ra[ETH_ALEN]; 123 u8 bssid[ETH_ALEN]; 124 125 u8 ack_policy; 126 127 u8 key_index; 128 129 u8 mcs_rate; 130 u8 rxht; 131 u8 sgi; 132 u8 pkt_rpt_type; 133 u32 MacIDValidEntry[2]; /* 64 bits present 64 entry. */ 134 135 struct phy_info phy_info; 136}; 137 138 139/* These definition is used for Rx packet reordering. */ 140#define SN_LESS(a, b) (((a - b) & 0x800) != 0) 141#define SN_EQUAL(a, b) (a == b) 142#define REORDER_WAIT_TIME (50) /* (ms) */ 143 144#define RXDESC_SIZE 24 145#define RXDESC_OFFSET RXDESC_SIZE 146 147struct recv_stat { 148 __le32 rxdw0; 149 __le32 rxdw1; 150 __le32 rxdw2; 151 __le32 rxdw3; 152 __le32 rxdw4; 153 __le32 rxdw5; 154}; 155 156/* 157 * accesser of recv_priv: rtw_recv_entry(dispatch / passive level); 158 * recv_thread(passive) ; returnpkt(dispatch) 159 * ; halt(passive) ; 160 * 161 * using enter_critical section to protect 162 */ 163struct recv_priv { 164 struct __queue free_recv_queue; 165 struct __queue recv_pending_queue; 166 struct __queue uc_swdec_pending_queue; 167 void *pallocated_frame_buf; 168 struct adapter *adapter; 169 u32 bIsAnyNonBEPkts; 170 u64 rx_bytes; 171 u64 rx_pkts; 172 u64 rx_drop; 173 u64 last_rx_bytes; 174 175 struct tasklet_struct irq_prepare_beacon_tasklet; 176 struct tasklet_struct recv_tasklet; 177 struct sk_buff_head free_recv_skb_queue; 178 struct sk_buff_head rx_skb_queue; 179 struct recv_buf *precv_buf; /* 4 alignment */ 180 struct __queue free_recv_buf_queue; 181 /* For display the phy information */ 182 s8 rssi; 183 s8 rxpwdb; 184 u8 signal_strength; 185 u8 signal_qual; 186 u8 noise; 187 s8 RxRssi[2]; 188 189 struct timer_list signal_stat_timer; 190 u32 signal_stat_sampling_interval; 191 struct signal_stat signal_qual_data; 192 struct signal_stat signal_strength_data; 193}; 194 195#define rtw_set_signal_stat_timer(recvpriv) \ 196 mod_timer(&(recvpriv)->signal_stat_timer, jiffies + \ 197 msecs_to_jiffies((recvpriv)->signal_stat_sampling_interval)) 198 199struct sta_recv_priv { 200 spinlock_t lock; 201 int option; 202 struct __queue defrag_q; /* keeping the fragment frame until defrag */ 203 struct stainfo_rxcache rxcache; 204}; 205 206struct recv_buf { 207 struct adapter *adapter; 208 struct urb *purb; 209 struct sk_buff *pskb; 210 u8 reuse; 211}; 212 213/* 214 * head -----> 215 * 216 * data -----> 217 * 218 * payload 219 * 220 * tail -----> 221 * 222 * 223 * end -----> 224 * 225 * len = (unsigned int )(tail - data); 226 * 227 */ 228struct recv_frame { 229 struct list_head list; 230 struct sk_buff *pkt; 231 struct adapter *adapter; 232 struct rx_pkt_attrib attrib; 233 struct sta_info *psta; 234 /* for A-MPDU Rx reordering buffer control */ 235 struct recv_reorder_ctrl *preorder_ctrl; 236}; 237 238struct recv_frame *_rtw_alloc_recvframe(struct __queue *pfree_recv_queue); 239struct recv_frame *rtw_alloc_recvframe(struct __queue *pfree_recv_queue); 240void rtw_init_recvframe(struct recv_frame *precvframe, 241 struct recv_priv *precvpriv); 242int rtw_free_recvframe(struct recv_frame *precvframe, 243 struct __queue *pfree_recv_queue); 244#define rtw_dequeue_recvframe(queue) rtw_alloc_recvframe(queue) 245int _rtw_enqueue_recvframe(struct recv_frame *precvframe, 246 struct __queue *queue); 247int rtw_enqueue_recvframe(struct recv_frame *precvframe, struct __queue *queue); 248void rtw_free_recvframe_queue(struct __queue *pframequeue, 249 struct __queue *pfree_recv_queue); 250u32 rtw_free_uc_swdec_pending_queue(struct adapter *adapter); 251 252void rtw_reordering_ctrl_timeout_handler(struct timer_list *t); 253 254static inline s32 translate_percentage_to_dbm(u32 sig_stren_index) 255{ 256 s32 power; /* in dBm. */ 257 258 /* Translate to dBm (x=0.5y-95). */ 259 power = (s32)((sig_stren_index + 1) >> 1); 260 power -= 95; 261 262 return power; 263} 264 265 266struct sta_info; 267 268void _rtw_init_sta_recv_priv(struct sta_recv_priv *psta_recvpriv); 269 270void mgt_dispatcher(struct adapter *padapter, struct recv_frame *precv_frame); 271 272#endif 273