42 #include <linux/if_ether.h>
43 #include <linux/kernel.h>
46 #include <rtwlan_io.h>
48 #define IEEE80211_1ADDR_LEN 10
49 #define IEEE80211_2ADDR_LEN 16
50 #define IEEE80211_3ADDR_LEN 24
51 #define IEEE80211_4ADDR_LEN 30
52 #define IEEE80211_FCS_LEN 4
53 #define IEEE80211_HLEN (IEEE80211_4ADDR_LEN)
54 #define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN)
56 #define MIN_FRAG_THRESHOLD 256U
57 #define MAX_FRAG_THRESHOLD 2346U
60 #define IEEE80211_FCTL_VERS 0x0003
61 #define IEEE80211_FCTL_FTYPE 0x000c
62 #define IEEE80211_FCTL_STYPE 0x00f0
63 #define IEEE80211_FCTL_TODS 0x0100
64 #define IEEE80211_FCTL_FROMDS 0x0200
65 #define IEEE80211_FCTL_MOREFRAGS 0x0400
66 #define IEEE80211_FCTL_RETRY 0x0800
67 #define IEEE80211_FCTL_PM 0x1000
68 #define IEEE80211_FCTL_MOREDATA 0x2000
69 #define IEEE80211_FCTL_PROTECTED 0x4000
70 #define IEEE80211_FCTL_ORDER 0x8000
72 #define IEEE80211_FTYPE_MGMT 0x0000
73 #define IEEE80211_FTYPE_CTL 0x0004
74 #define IEEE80211_FTYPE_DATA 0x0008
77 #define IEEE80211_STYPE_ASSOC_REQ 0x0000
78 #define IEEE80211_STYPE_ASSOC_RESP 0x0010
79 #define IEEE80211_STYPE_REASSOC_REQ 0x0020
80 #define IEEE80211_STYPE_REASSOC_RESP 0x0030
81 #define IEEE80211_STYPE_PROBE_REQ 0x0040
82 #define IEEE80211_STYPE_PROBE_RESP 0x0050
83 #define IEEE80211_STYPE_BEACON 0x0080
84 #define IEEE80211_STYPE_ATIM 0x0090
85 #define IEEE80211_STYPE_DISASSOC 0x00A0
86 #define IEEE80211_STYPE_AUTH 0x00B0
87 #define IEEE80211_STYPE_DEAUTH 0x00C0
88 #define IEEE80211_STYPE_ACTION 0x00D0
91 #define IEEE80211_STYPE_PSPOLL 0x00A0
92 #define IEEE80211_STYPE_RTS 0x00B0
93 #define IEEE80211_STYPE_CTS 0x00C0
94 #define IEEE80211_STYPE_ACK 0x00D0
95 #define IEEE80211_STYPE_CFEND 0x00E0
96 #define IEEE80211_STYPE_CFENDACK 0x00F0
99 #define IEEE80211_STYPE_DATA 0x0000
100 #define IEEE80211_STYPE_DATA_CFACK 0x0010
101 #define IEEE80211_STYPE_DATA_CFPOLL 0x0020
102 #define IEEE80211_STYPE_DATA_CFACKPOLL 0x0030
103 #define IEEE80211_STYPE_NULLFUNC 0x0040
104 #define IEEE80211_STYPE_CFACK 0x0050
105 #define IEEE80211_STYPE_CFPOLL 0x0060
106 #define IEEE80211_STYPE_CFACKPOLL 0x0070
107 #define IEEE80211_STYPE_QOS_DATA 0x0080
109 #define RTWLAN_SCTL_SEQ 0xFFF0
111 #define WLAN_FC_GET_VERS(fc) ((fc) & IEEE80211_FCTL_VERS)
112 #define WLAN_FC_GET_TYPE(fc) ((fc) & IEEE80211_FCTL_FTYPE)
113 #define WLAN_FC_GET_STYPE(fc) ((fc) & IEEE80211_FCTL_STYPE)
115 #define IEEE80211_DSSS_RATE_1MB 0x02
116 #define IEEE80211_DSSS_RATE_2MB 0x04
117 #define IEEE80211_DSSS_RATE_5MB 0x0B
118 #define IEEE80211_DSSS_RATE_11MB 0x16
119 #define IEEE80211_OFDM_RATE_6MB 0x0C
120 #define IEEE80211_OFDM_RATE_9MB 0x12
121 #define IEEE80211_OFDM_RATE_12MB 0x18
122 #define IEEE80211_OFDM_RATE_18MB 0x24
123 #define IEEE80211_OFDM_RATE_24MB 0x30
124 #define IEEE80211_OFDM_RATE_36MB 0x48
125 #define IEEE80211_OFDM_RATE_48MB 0x60
126 #define IEEE80211_OFDM_RATE_54MB 0x6C
127 #define IEEE80211_BASIC_RATE_MASK 0x80
129 #define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x"
130 #define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5]
132 #ifdef CONFIG_RTWLAN_DEBUG
133 #define RTWLAN_DEBUG_PRINTK(__message...) do{ rtdm_printk(__message); }while(0)
134 #define RTWLAN_DEBUG(__message,__args...) RTWLAN_DEBUG_PRINTK(KERN_DEBUG "rtwlan->%s: Debug - " __message,__FUNCTION__,##__args);
136 #define RTWLAN_DEBUG(__message...) do{ }while(0)
139 struct rtwlan_stats {
140 unsigned long rx_packets;
141 unsigned long tx_packets;
142 unsigned long tx_retry;
145 struct rtwlan_device {
147 struct rtwlan_stats stats;
149 struct rtskb_pool skb_pool;
153 int (*hard_start_xmit)(
struct rtskb *rtskb,
struct rtnet_device * rtnet_dev);
162 struct ieee80211_hdr {
166 } __attribute__ ((packed));
168 struct ieee80211_hdr_3addr {
176 } __attribute__ ((packed));
179 static inline int ieee80211_get_hdrlen(u16 fc)
181 int hdrlen = IEEE80211_3ADDR_LEN;
182 u16 stype = WLAN_FC_GET_STYPE(fc);
184 switch (WLAN_FC_GET_TYPE(fc)) {
185 case IEEE80211_FTYPE_DATA:
186 if ((fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS))
187 hdrlen = IEEE80211_4ADDR_LEN;
188 if (stype & IEEE80211_STYPE_QOS_DATA)
192 case IEEE80211_FTYPE_CTL:
193 switch (WLAN_FC_GET_STYPE(fc)) {
194 case IEEE80211_STYPE_CTS:
195 case IEEE80211_STYPE_ACK:
196 hdrlen = IEEE80211_1ADDR_LEN;
200 hdrlen = IEEE80211_2ADDR_LEN;
210 static inline int ieee80211_is_ofdm_rate(u8 rate)
212 switch (rate & ~IEEE80211_BASIC_RATE_MASK) {
213 case IEEE80211_OFDM_RATE_6MB:
214 case IEEE80211_OFDM_RATE_9MB:
215 case IEEE80211_OFDM_RATE_12MB:
216 case IEEE80211_OFDM_RATE_18MB:
217 case IEEE80211_OFDM_RATE_24MB:
218 case IEEE80211_OFDM_RATE_36MB:
219 case IEEE80211_OFDM_RATE_48MB:
220 case IEEE80211_OFDM_RATE_54MB:
226 static inline int ieee80211_is_dsss_rate(u8 rate)
228 switch (rate & ~IEEE80211_BASIC_RATE_MASK) {
229 case IEEE80211_DSSS_RATE_1MB:
230 case IEEE80211_DSSS_RATE_2MB:
231 case IEEE80211_DSSS_RATE_5MB:
232 case IEEE80211_DSSS_RATE_11MB:
239 static inline void * rtwlan_priv(
struct rtwlan_device *rtwlan_dev)
241 return (
void *)rtwlan_dev +
sizeof(
struct rtwlan_device);
244 struct rtnet_device * rtwlan_alloc_dev(
unsigned sizeof_priv,
unsigned rx_pool_size);
245 int rtwlan_rx(
struct rtskb * rtskb,
struct rtnet_device * rtnet_dev);
246 int rtwlan_tx(
struct rtskb * rtskb,
struct rtnet_device * rtnet_dev);
248 #ifdef CONFIG_XENO_DRIVERS_NET_RTWLAN
249 int __init rtwlan_init(
void);
250 void rtwlan_exit(
void);
252 #define rtwlan_init() 0
253 #define rtwlan_exit()