1/* SPDX-License-Identifier: GPL-2.0 */ 2/****************************************************************************** 3 * 4 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. 5 * 6 ******************************************************************************/ 7#ifndef _RTW_RECV_H_ 8#define _RTW_RECV_H_ 9 10#include <osdep_service.h> 11#include <drv_types.h> 12 13#define NR_RECVFRAME 256 14 15#define RXFRAME_ALIGN 8 16#define RXFRAME_ALIGN_SZ (1 << RXFRAME_ALIGN) 17 18#define MAX_RXFRAME_CNT 512 19#define MAX_RX_NUMBLKS (32) 20#define RECVFRAME_HDR_ALIGN 128 21 22#define SNAP_SIZE sizeof(struct ieee80211_snap_hdr) 23 24#define MAX_SUBFRAME_COUNT 64 25 26/* for Rx reordering buffer control */ 27struct recv_reorder_ctrl { 28 struct adapter *padapter; 29 bool enable; 30 u16 indicate_seq;/* wstart_b, init_value=0xffff */ 31 u16 wend_b; 32 u8 wsize_b; 33 struct __queue pending_recvframe_queue; 34 struct timer_list reordering_ctrl_timer; 35}; 36 37struct stainfo_rxcache { 38 u16 tid_rxseq[16]; 39/* 40 * unsigned short tid0_rxseq; 41 * unsigned short tid1_rxseq; 42 * unsigned short tid2_rxseq; 43 * unsigned short tid3_rxseq; 44 * unsigned short tid4_rxseq; 45 * unsigned short tid5_rxseq; 46 * unsigned short tid6_rxseq; 47 * unsigned short tid7_rxseq; 48 * unsigned short tid8_rxseq; 49 * unsigned short tid9_rxseq; 50 * unsigned short tid10_rxseq; 51 * unsigned short tid11_rxseq; 52 * unsigned short tid12_rxseq; 53 * unsigned short tid13_rxseq; 54 * unsigned short tid14_rxseq; 55 * unsigned short tid15_rxseq; 56 */ 57}; 58 59struct signal_stat { 60 u8 update_req; /* used to indicate */ 61 u8 avg_val; /* avg of valid elements */ 62 u32 total_num; /* num of valid elements */ 63 u32 total_val; /* sum of valid elements */ 64}; 65 66#define MAX_PATH_NUM_92CS 3 67 68struct phy_info { 69 u8 RxPWDBAll; 70 u8 SignalQuality; /* in 0-100 index. */ 71 u8 RxMIMOSignalQuality[MAX_PATH_NUM_92CS]; /* EVM */ 72 u8 RxMIMOSignalStrength[MAX_PATH_NUM_92CS];/* in 0~100 index */ 73 s8 RxPower; /* in dBm Translate from PWdB */ 74/* Real power in dBm for this packet, no beautification and aggregation. 75 * Keep this raw info to be used for the other procedures. 76 */ 77 s8 recvpower; 78 u8 BTRxRSSIPercentage; 79 u8 SignalStrength; /* in 0-100 index. */ 80 u8 RxPwr[MAX_PATH_NUM_92CS];/* per-path's pwdb */ 81 u8 RxSNR[MAX_PATH_NUM_92CS];/* per-path's SNR */ 82}; 83 84struct rx_pkt_attrib { 85 u16 pkt_len; 86 u8 physt; 87 u8 drvinfo_sz; 88 u8 shift_sz; 89 u8 hdrlen; /* the WLAN Header Len */ 90 u8 to_fr_ds; 91 u8 amsdu; 92 u8 qos; 93 u8 priority; 94 u8 pw_save; 95 u8 mdata; 96 u16 seq_num; 97 u8 frag_num; 98 u8 mfrag; 99 u8 order; 100 u8 privacy; /* in frame_ctrl field */ 101 u8 bdecrypted; 102 u8 encrypt; /* when 0 indicate no encrypt. when non-zero, 103 * indicate the encrypt algorithm 104 */ 105 u8 iv_len; 106 u8 icv_len; 107 u8 crc_err; 108 u8 icv_err; 109 110 u16 eth_type; 111 112 u8 dst[ETH_ALEN]; 113 u8 src[ETH_ALEN]; 114 u8 ta[ETH_ALEN]; 115 u8 ra[ETH_ALEN]; 116 u8 bssid[ETH_ALEN]; 117 118 u8 ack_policy; 119 120 u8 key_index; 121 122 u8 mcs_rate; 123 u8 rxht; 124 u8 sgi; 125 u8 pkt_rpt_type; 126 u32 MacIDValidEntry[2]; /* 64 bits present 64 entry. */ 127 128 struct phy_info phy_info; 129}; 130 131/* These definition is used for Rx packet reordering. */ 132#define SN_LESS(a, b) (((a - b) & 0x800) != 0) 133#define SN_EQUAL(a, b) (a == b) 134#define REORDER_WAIT_TIME (50) /* (ms) */ 135 136#define RXDESC_SIZE 24 137#define RXDESC_OFFSET RXDESC_SIZE 138 139struct recv_stat { 140 __le32 rxdw0; 141 __le32 rxdw1; 142 __le32 rxdw2; 143 __le32 rxdw3; 144 __le32 rxdw4; 145 __le32 rxdw5; 146}; 147 148/* 149 * accesser of recv_priv: rtw_recv_entry(dispatch / passive level); 150 * recv_thread(passive) ; returnpkt(dispatch) 151 * ; halt(passive) ; 152 * 153 * using enter_critical section to protect 154 */ 155struct recv_priv { 156 struct __queue free_recv_queue; 157 struct __queue recv_pending_queue; 158 struct __queue uc_swdec_pending_queue; 159 void *pallocated_frame_buf; 160 struct adapter *adapter; 161 u32 bIsAnyNonBEPkts; 162 u64 rx_bytes; 163 u64 rx_pkts; 164 u64 rx_drop; 165 u64 last_rx_bytes; 166 167 struct tasklet_struct irq_prepare_beacon_tasklet; 168 struct tasklet_struct recv_tasklet; 169 struct sk_buff_head free_recv_skb_queue; 170 struct sk_buff_head rx_skb_queue; 171 struct recv_buf *precv_buf; /* 4 alignment */ 172 struct __queue free_recv_buf_queue; 173 /* For display the phy information */ 174 s8 rssi; 175 s8 rxpwdb; 176 u8 signal_strength; 177 u8 signal_qual; 178 u8 noise; 179 s8 RxRssi[2]; 180 181 struct timer_list signal_stat_timer; 182 u32 signal_stat_sampling_interval; 183 struct signal_stat signal_qual_data; 184 struct signal_stat signal_strength_data; 185}; 186 187#define rtw_set_signal_stat_timer(recvpriv) \ 188 mod_timer(&(recvpriv)->signal_stat_timer, jiffies + \ 189 msecs_to_jiffies((recvpriv)->signal_stat_sampling_interval)) 190 191struct sta_recv_priv { 192 spinlock_t lock; 193 int option; 194 struct __queue defrag_q; /* keeping the fragment frame until defrag */ 195 struct stainfo_rxcache rxcache; 196}; 197 198struct recv_buf { 199 struct adapter *adapter; 200 struct urb *purb; 201 struct sk_buff *pskb; 202 u8 reuse; 203}; 204 205/* 206 * head -----> 207 * 208 * data -----> 209 * 210 * payload 211 * 212 * tail -----> 213 * 214 * 215 * end -----> 216 * 217 * len = (unsigned int )(tail - data); 218 * 219 */ 220struct recv_frame { 221 struct list_head list; 222 struct sk_buff *pkt; 223 struct adapter *adapter; 224 struct rx_pkt_attrib attrib; 225 struct sta_info *psta; 226 /* for A-MPDU Rx reordering buffer control */ 227 struct recv_reorder_ctrl *preorder_ctrl; 228}; 229 230struct recv_frame *_rtw_alloc_recvframe(struct __queue *pfree_recv_queue); 231struct recv_frame *rtw_alloc_recvframe(struct __queue *pfree_recv_queue); 232void rtw_init_recvframe(struct recv_frame *precvframe, 233 struct recv_priv *precvpriv); 234void rtw_free_recvframe(struct recv_frame *precvframe, struct __queue *pfree_recv_queue); 235#define rtw_dequeue_recvframe(queue) rtw_alloc_recvframe(queue) 236int _rtw_enqueue_recvframe(struct recv_frame *precvframe, 237 struct __queue *queue); 238int rtw_enqueue_recvframe(struct recv_frame *precvframe, struct __queue *queue); 239void rtw_free_recvframe_queue(struct __queue *pframequeue, 240 struct __queue *pfree_recv_queue); 241u32 rtw_free_uc_swdec_pending_queue(struct adapter *adapter); 242 243void rtw_reordering_ctrl_timeout_handler(struct timer_list *t); 244 245static inline s32 translate_percentage_to_dbm(u32 sig_stren_index) 246{ 247 s32 power; /* in dBm. */ 248 249 /* Translate to dBm (x=0.5y-95). */ 250 power = (s32)((sig_stren_index + 1) >> 1); 251 power -= 95; 252 253 return power; 254} 255 256struct sta_info; 257 258void _rtw_init_sta_recv_priv(struct sta_recv_priv *psta_recvpriv); 259 260void mgt_dispatcher(struct adapter *padapter, struct recv_frame *precv_frame); 261 262#endif 263