| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 1 | /* | 
| Ivo van Doorn | 811aa9c | 2008-02-03 15:42:53 +0100 | [diff] [blame] | 2 | 	Copyright (C) 2004 - 2008 rt2x00 SourceForge Project | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 3 | 	<http://rt2x00.serialmonkey.com> | 
 | 4 |  | 
 | 5 | 	This program is free software; you can redistribute it and/or modify | 
 | 6 | 	it under the terms of the GNU General Public License as published by | 
 | 7 | 	the Free Software Foundation; either version 2 of the License, or | 
 | 8 | 	(at your option) any later version. | 
 | 9 |  | 
 | 10 | 	This program is distributed in the hope that it will be useful, | 
 | 11 | 	but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 | 12 | 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
 | 13 | 	GNU General Public License for more details. | 
 | 14 |  | 
 | 15 | 	You should have received a copy of the GNU General Public License | 
 | 16 | 	along with this program; if not, write to the | 
 | 17 | 	Free Software Foundation, Inc., | 
 | 18 | 	59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | 
 | 19 |  */ | 
 | 20 |  | 
 | 21 | /* | 
 | 22 | 	Module: rt2x00 | 
 | 23 | 	Abstract: rt2x00 global information. | 
 | 24 |  */ | 
 | 25 |  | 
 | 26 | #ifndef RT2X00_H | 
 | 27 | #define RT2X00_H | 
 | 28 |  | 
 | 29 | #include <linux/bitops.h> | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 30 | #include <linux/skbuff.h> | 
 | 31 | #include <linux/workqueue.h> | 
 | 32 | #include <linux/firmware.h> | 
| Ivo van Doorn | a9450b7 | 2008-02-03 15:53:40 +0100 | [diff] [blame] | 33 | #include <linux/leds.h> | 
| Adam Baker | 3d82346 | 2007-10-27 13:43:29 +0200 | [diff] [blame] | 34 | #include <linux/mutex.h> | 
| Mattias Nissler | 61af43c | 2007-11-27 21:50:26 +0100 | [diff] [blame] | 35 | #include <linux/etherdevice.h> | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 36 |  | 
 | 37 | #include <net/mac80211.h> | 
 | 38 |  | 
 | 39 | #include "rt2x00debug.h" | 
| Ivo van Doorn | a9450b7 | 2008-02-03 15:53:40 +0100 | [diff] [blame] | 40 | #include "rt2x00leds.h" | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 41 | #include "rt2x00reg.h" | 
| Ivo van Doorn | 181d690 | 2008-02-05 16:42:23 -0500 | [diff] [blame] | 42 | #include "rt2x00queue.h" | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 43 |  | 
 | 44 | /* | 
 | 45 |  * Module information. | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 46 |  */ | 
| Ivo van Doorn | 9344e86 | 2008-10-29 17:19:29 +0100 | [diff] [blame] | 47 | #define DRV_VERSION	"2.2.2" | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 48 | #define DRV_PROJECT	"http://rt2x00.serialmonkey.com" | 
 | 49 |  | 
 | 50 | /* | 
 | 51 |  * Debug definitions. | 
 | 52 |  * Debug output has to be enabled during compile time. | 
 | 53 |  */ | 
 | 54 | #define DEBUG_PRINTK_MSG(__dev, __kernlvl, __lvl, __msg, __args...)	\ | 
 | 55 | 	printk(__kernlvl "%s -> %s: %s - " __msg,			\ | 
| Harvey Harrison | c94c93d | 2008-07-28 23:01:34 -0700 | [diff] [blame] | 56 | 	       wiphy_name((__dev)->hw->wiphy), __func__, __lvl, ##__args) | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 57 |  | 
 | 58 | #define DEBUG_PRINTK_PROBE(__kernlvl, __lvl, __msg, __args...)	\ | 
 | 59 | 	printk(__kernlvl "%s -> %s: %s - " __msg,		\ | 
| Harvey Harrison | c94c93d | 2008-07-28 23:01:34 -0700 | [diff] [blame] | 60 | 	       KBUILD_MODNAME, __func__, __lvl, ##__args) | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 61 |  | 
 | 62 | #ifdef CONFIG_RT2X00_DEBUG | 
 | 63 | #define DEBUG_PRINTK(__dev, __kernlvl, __lvl, __msg, __args...)	\ | 
 | 64 | 	DEBUG_PRINTK_MSG(__dev, __kernlvl, __lvl, __msg, ##__args); | 
 | 65 | #else | 
 | 66 | #define DEBUG_PRINTK(__dev, __kernlvl, __lvl, __msg, __args...)	\ | 
 | 67 | 	do { } while (0) | 
 | 68 | #endif /* CONFIG_RT2X00_DEBUG */ | 
 | 69 |  | 
 | 70 | /* | 
 | 71 |  * Various debug levels. | 
 | 72 |  * The debug levels PANIC and ERROR both indicate serious problems, | 
 | 73 |  * for this reason they should never be ignored. | 
 | 74 |  * The special ERROR_PROBE message is for messages that are generated | 
 | 75 |  * when the rt2x00_dev is not yet initialized. | 
 | 76 |  */ | 
 | 77 | #define PANIC(__dev, __msg, __args...) \ | 
 | 78 | 	DEBUG_PRINTK_MSG(__dev, KERN_CRIT, "Panic", __msg, ##__args) | 
 | 79 | #define ERROR(__dev, __msg, __args...)	\ | 
 | 80 | 	DEBUG_PRINTK_MSG(__dev, KERN_ERR, "Error", __msg, ##__args) | 
 | 81 | #define ERROR_PROBE(__msg, __args...) \ | 
 | 82 | 	DEBUG_PRINTK_PROBE(KERN_ERR, "Error", __msg, ##__args) | 
 | 83 | #define WARNING(__dev, __msg, __args...) \ | 
 | 84 | 	DEBUG_PRINTK(__dev, KERN_WARNING, "Warning", __msg, ##__args) | 
 | 85 | #define NOTICE(__dev, __msg, __args...) \ | 
 | 86 | 	DEBUG_PRINTK(__dev, KERN_NOTICE, "Notice", __msg, ##__args) | 
 | 87 | #define INFO(__dev, __msg, __args...) \ | 
 | 88 | 	DEBUG_PRINTK(__dev, KERN_INFO, "Info", __msg, ##__args) | 
 | 89 | #define DEBUG(__dev, __msg, __args...) \ | 
 | 90 | 	DEBUG_PRINTK(__dev, KERN_DEBUG, "Debug", __msg, ##__args) | 
 | 91 | #define EEPROM(__dev, __msg, __args...) \ | 
 | 92 | 	DEBUG_PRINTK(__dev, KERN_DEBUG, "EEPROM recovery", __msg, ##__args) | 
 | 93 |  | 
 | 94 | /* | 
| Ivo van Doorn | bad1363 | 2008-11-09 20:47:00 +0100 | [diff] [blame] | 95 |  * Duration calculations | 
 | 96 |  * The rate variable passed is: 100kbs. | 
 | 97 |  * To convert from bytes to bits we multiply size with 8, | 
 | 98 |  * then the size is multiplied with 10 to make the | 
 | 99 |  * real rate -> rate argument correction. | 
 | 100 |  */ | 
 | 101 | #define GET_DURATION(__size, __rate)	(((__size) * 8 * 10) / (__rate)) | 
 | 102 | #define GET_DURATION_RES(__size, __rate)(((__size) * 8 * 10) % (__rate)) | 
 | 103 |  | 
 | 104 | /* | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 105 |  * Standard timing and size defines. | 
 | 106 |  * These values should follow the ieee80211 specifications. | 
 | 107 |  */ | 
 | 108 | #define ACK_SIZE		14 | 
 | 109 | #define IEEE80211_HEADER	24 | 
 | 110 | #define PLCP			48 | 
 | 111 | #define BEACON			100 | 
 | 112 | #define PREAMBLE		144 | 
 | 113 | #define SHORT_PREAMBLE		72 | 
 | 114 | #define SLOT_TIME		20 | 
 | 115 | #define SHORT_SLOT_TIME		9 | 
 | 116 | #define SIFS			10 | 
 | 117 | #define PIFS			( SIFS + SLOT_TIME ) | 
 | 118 | #define SHORT_PIFS		( SIFS + SHORT_SLOT_TIME ) | 
 | 119 | #define DIFS			( PIFS + SLOT_TIME ) | 
 | 120 | #define SHORT_DIFS		( SHORT_PIFS + SHORT_SLOT_TIME ) | 
| Ivo van Doorn | f2fdbc4 | 2008-07-19 16:16:12 +0200 | [diff] [blame] | 121 | #define EIFS			( SIFS + DIFS + \ | 
| Ivo van Doorn | bad1363 | 2008-11-09 20:47:00 +0100 | [diff] [blame] | 122 | 				  GET_DURATION(IEEE80211_HEADER + ACK_SIZE, 10) ) | 
| Ivo van Doorn | f2fdbc4 | 2008-07-19 16:16:12 +0200 | [diff] [blame] | 123 | #define SHORT_EIFS		( SIFS + SHORT_DIFS + \ | 
| Ivo van Doorn | bad1363 | 2008-11-09 20:47:00 +0100 | [diff] [blame] | 124 | 				  GET_DURATION(IEEE80211_HEADER + ACK_SIZE, 10) ) | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 125 |  | 
 | 126 | /* | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 127 |  * Chipset identification | 
 | 128 |  * The chipset on the device is composed of a RT and RF chip. | 
 | 129 |  * The chipset combination is important for determining device capabilities. | 
 | 130 |  */ | 
 | 131 | struct rt2x00_chip { | 
 | 132 | 	u16 rt; | 
 | 133 | #define RT2460		0x0101 | 
 | 134 | #define RT2560		0x0201 | 
 | 135 | #define RT2570		0x1201 | 
| Ivo van Doorn | 12dadb9 | 2007-09-25 20:54:44 +0200 | [diff] [blame] | 136 | #define RT2561s		0x0301	/* Turbo */ | 
 | 137 | #define RT2561		0x0302 | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 138 | #define RT2661		0x0401 | 
 | 139 | #define RT2571		0x1300 | 
 | 140 |  | 
 | 141 | 	u16 rf; | 
 | 142 | 	u32 rev; | 
 | 143 | }; | 
 | 144 |  | 
 | 145 | /* | 
 | 146 |  * RF register values that belong to a particular channel. | 
 | 147 |  */ | 
 | 148 | struct rf_channel { | 
 | 149 | 	int channel; | 
 | 150 | 	u32 rf1; | 
 | 151 | 	u32 rf2; | 
 | 152 | 	u32 rf3; | 
 | 153 | 	u32 rf4; | 
 | 154 | }; | 
 | 155 |  | 
 | 156 | /* | 
| Ivo van Doorn | 8c5e7a5 | 2008-08-04 16:38:47 +0200 | [diff] [blame] | 157 |  * Channel information structure | 
 | 158 |  */ | 
 | 159 | struct channel_info { | 
 | 160 | 	unsigned int flags; | 
 | 161 | #define GEOGRAPHY_ALLOWED	0x00000001 | 
 | 162 |  | 
 | 163 | 	short tx_power1; | 
 | 164 | 	short tx_power2; | 
 | 165 | }; | 
 | 166 |  | 
 | 167 | /* | 
| Ivo van Doorn | addc81b | 2007-10-13 16:26:23 +0200 | [diff] [blame] | 168 |  * Antenna setup values. | 
 | 169 |  */ | 
 | 170 | struct antenna_setup { | 
 | 171 | 	enum antenna rx; | 
 | 172 | 	enum antenna tx; | 
 | 173 | }; | 
 | 174 |  | 
 | 175 | /* | 
| Ivo van Doorn | ebcf26d | 2007-10-13 16:26:12 +0200 | [diff] [blame] | 176 |  * Quality statistics about the currently active link. | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 177 |  */ | 
| Ivo van Doorn | ebcf26d | 2007-10-13 16:26:12 +0200 | [diff] [blame] | 178 | struct link_qual { | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 179 | 	/* | 
 | 180 | 	 * Statistics required for Link tuning. | 
 | 181 | 	 * For the average RSSI value we use the "Walking average" approach. | 
 | 182 | 	 * When adding RSSI to the average value the following calculation | 
 | 183 | 	 * is needed: | 
 | 184 | 	 * | 
 | 185 | 	 *        avg_rssi = ((avg_rssi * 7) + rssi) / 8; | 
 | 186 | 	 * | 
 | 187 | 	 * The advantage of this approach is that we only need 1 variable | 
 | 188 | 	 * to store the average in (No need for a count and a total). | 
 | 189 | 	 * But more importantly, normal average values will over time | 
 | 190 | 	 * move less and less towards newly added values this results | 
 | 191 | 	 * that with link tuning, the device can have a very good RSSI | 
 | 192 | 	 * for a few minutes but when the device is moved away from the AP | 
 | 193 | 	 * the average will not decrease fast enough to compensate. | 
 | 194 | 	 * The walking average compensates this and will move towards | 
 | 195 | 	 * the new values correctly allowing a effective link tuning. | 
 | 196 | 	 */ | 
 | 197 | 	int avg_rssi; | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 198 | 	int false_cca; | 
 | 199 |  | 
 | 200 | 	/* | 
 | 201 | 	 * Statistics required for Signal quality calculation. | 
 | 202 | 	 * For calculating the Signal quality we have to determine | 
 | 203 | 	 * the total number of success and failed RX and TX frames. | 
 | 204 | 	 * After that we also use the average RSSI value to help | 
 | 205 | 	 * determining the signal quality. | 
 | 206 | 	 * For the calculation we will use the following algorithm: | 
 | 207 | 	 * | 
 | 208 | 	 *         rssi_percentage = (avg_rssi * 100) / rssi_offset | 
 | 209 | 	 *         rx_percentage = (rx_success * 100) / rx_total | 
 | 210 | 	 *         tx_percentage = (tx_success * 100) / tx_total | 
 | 211 | 	 *         avg_signal = ((WEIGHT_RSSI * avg_rssi) + | 
 | 212 | 	 *                       (WEIGHT_TX * tx_percentage) + | 
 | 213 | 	 *                       (WEIGHT_RX * rx_percentage)) / 100 | 
 | 214 | 	 * | 
 | 215 | 	 * This value should then be checked to not be greated then 100. | 
 | 216 | 	 */ | 
 | 217 | 	int rx_percentage; | 
 | 218 | 	int rx_success; | 
 | 219 | 	int rx_failed; | 
 | 220 | 	int tx_percentage; | 
 | 221 | 	int tx_success; | 
 | 222 | 	int tx_failed; | 
 | 223 | #define WEIGHT_RSSI	20 | 
 | 224 | #define WEIGHT_RX	40 | 
 | 225 | #define WEIGHT_TX	40 | 
| Ivo van Doorn | ebcf26d | 2007-10-13 16:26:12 +0200 | [diff] [blame] | 226 | }; | 
 | 227 |  | 
 | 228 | /* | 
| Ivo van Doorn | 69f81a2 | 2007-10-13 16:26:36 +0200 | [diff] [blame] | 229 |  * Antenna settings about the currently active link. | 
 | 230 |  */ | 
 | 231 | struct link_ant { | 
 | 232 | 	/* | 
 | 233 | 	 * Antenna flags | 
 | 234 | 	 */ | 
 | 235 | 	unsigned int flags; | 
 | 236 | #define ANTENNA_RX_DIVERSITY	0x00000001 | 
 | 237 | #define ANTENNA_TX_DIVERSITY	0x00000002 | 
 | 238 | #define ANTENNA_MODE_SAMPLE	0x00000004 | 
 | 239 |  | 
 | 240 | 	/* | 
 | 241 | 	 * Currently active TX/RX antenna setup. | 
 | 242 | 	 * When software diversity is used, this will indicate | 
 | 243 | 	 * which antenna is actually used at this time. | 
 | 244 | 	 */ | 
 | 245 | 	struct antenna_setup active; | 
 | 246 |  | 
 | 247 | 	/* | 
 | 248 | 	 * RSSI information for the different antenna's. | 
 | 249 | 	 * These statistics are used to determine when | 
 | 250 | 	 * to switch antenna when using software diversity. | 
 | 251 | 	 * | 
 | 252 | 	 *        rssi[0] -> Antenna A RSSI | 
 | 253 | 	 *        rssi[1] -> Antenna B RSSI | 
 | 254 | 	 */ | 
 | 255 | 	int rssi_history[2]; | 
 | 256 |  | 
 | 257 | 	/* | 
 | 258 | 	 * Current RSSI average of the currently active antenna. | 
 | 259 | 	 * Similar to the avg_rssi in the link_qual structure | 
 | 260 | 	 * this value is updated by using the walking average. | 
 | 261 | 	 */ | 
 | 262 | 	int rssi_ant; | 
 | 263 | }; | 
 | 264 |  | 
 | 265 | /* | 
| Ivo van Doorn | ebcf26d | 2007-10-13 16:26:12 +0200 | [diff] [blame] | 266 |  * To optimize the quality of the link we need to store | 
 | 267 |  * the quality of received frames and periodically | 
 | 268 |  * optimize the link. | 
 | 269 |  */ | 
 | 270 | struct link { | 
 | 271 | 	/* | 
 | 272 | 	 * Link tuner counter | 
 | 273 | 	 * The number of times the link has been tuned | 
 | 274 | 	 * since the radio has been switched on. | 
 | 275 | 	 */ | 
 | 276 | 	u32 count; | 
 | 277 |  | 
 | 278 | 	/* | 
 | 279 | 	 * Quality measurement values. | 
 | 280 | 	 */ | 
 | 281 | 	struct link_qual qual; | 
 | 282 |  | 
 | 283 | 	/* | 
| Ivo van Doorn | 69f81a2 | 2007-10-13 16:26:36 +0200 | [diff] [blame] | 284 | 	 * TX/RX antenna setup. | 
| Ivo van Doorn | addc81b | 2007-10-13 16:26:23 +0200 | [diff] [blame] | 285 | 	 */ | 
| Ivo van Doorn | 69f81a2 | 2007-10-13 16:26:36 +0200 | [diff] [blame] | 286 | 	struct link_ant ant; | 
| Ivo van Doorn | addc81b | 2007-10-13 16:26:23 +0200 | [diff] [blame] | 287 |  | 
 | 288 | 	/* | 
| Ivo van Doorn | ebcf26d | 2007-10-13 16:26:12 +0200 | [diff] [blame] | 289 | 	 * Active VGC level | 
 | 290 | 	 */ | 
 | 291 | 	int vgc_level; | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 292 |  | 
 | 293 | 	/* | 
 | 294 | 	 * Work structure for scheduling periodic link tuning. | 
 | 295 | 	 */ | 
 | 296 | 	struct delayed_work work; | 
 | 297 | }; | 
 | 298 |  | 
 | 299 | /* | 
| Ivo van Doorn | 69f81a2 | 2007-10-13 16:26:36 +0200 | [diff] [blame] | 300 |  * Small helper macro to work with moving/walking averages. | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 301 |  */ | 
| Ivo van Doorn | 69f81a2 | 2007-10-13 16:26:36 +0200 | [diff] [blame] | 302 | #define MOVING_AVERAGE(__avg, __val, __samples) \ | 
 | 303 | 	( (((__avg) * ((__samples) - 1)) + (__val)) / (__samples) ) | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 304 |  | 
 | 305 | /* | 
| Ivo van Doorn | 69f81a2 | 2007-10-13 16:26:36 +0200 | [diff] [blame] | 306 |  * When we lack RSSI information return something less then -80 to | 
 | 307 |  * tell the driver to tune the device to maximum sensitivity. | 
 | 308 |  */ | 
 | 309 | #define DEFAULT_RSSI	( -128 ) | 
 | 310 |  | 
 | 311 | /* | 
 | 312 |  * Link quality access functions. | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 313 |  */ | 
 | 314 | static inline int rt2x00_get_link_rssi(struct link *link) | 
 | 315 | { | 
| Ivo van Doorn | ebcf26d | 2007-10-13 16:26:12 +0200 | [diff] [blame] | 316 | 	if (link->qual.avg_rssi && link->qual.rx_success) | 
 | 317 | 		return link->qual.avg_rssi; | 
| Ivo van Doorn | 69f81a2 | 2007-10-13 16:26:36 +0200 | [diff] [blame] | 318 | 	return DEFAULT_RSSI; | 
 | 319 | } | 
 | 320 |  | 
 | 321 | static inline int rt2x00_get_link_ant_rssi(struct link *link) | 
 | 322 | { | 
 | 323 | 	if (link->ant.rssi_ant && link->qual.rx_success) | 
 | 324 | 		return link->ant.rssi_ant; | 
 | 325 | 	return DEFAULT_RSSI; | 
 | 326 | } | 
 | 327 |  | 
| Ivo van Doorn | f06a0f4 | 2008-05-23 18:13:56 +0200 | [diff] [blame] | 328 | static inline void rt2x00_reset_link_ant_rssi(struct link *link) | 
 | 329 | { | 
 | 330 | 	link->ant.rssi_ant = 0; | 
 | 331 | } | 
 | 332 |  | 
| Ivo van Doorn | 69f81a2 | 2007-10-13 16:26:36 +0200 | [diff] [blame] | 333 | static inline int rt2x00_get_link_ant_rssi_history(struct link *link, | 
 | 334 | 						   enum antenna ant) | 
 | 335 | { | 
 | 336 | 	if (link->ant.rssi_history[ant - ANTENNA_A]) | 
 | 337 | 		return link->ant.rssi_history[ant - ANTENNA_A]; | 
 | 338 | 	return DEFAULT_RSSI; | 
 | 339 | } | 
 | 340 |  | 
 | 341 | static inline int rt2x00_update_ant_rssi(struct link *link, int rssi) | 
 | 342 | { | 
 | 343 | 	int old_rssi = link->ant.rssi_history[link->ant.active.rx - ANTENNA_A]; | 
 | 344 | 	link->ant.rssi_history[link->ant.active.rx - ANTENNA_A] = rssi; | 
 | 345 | 	return old_rssi; | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 346 | } | 
 | 347 |  | 
 | 348 | /* | 
 | 349 |  * Interface structure | 
| Ivo van Doorn | 6bb40dd | 2008-02-03 15:49:59 +0100 | [diff] [blame] | 350 |  * Per interface configuration details, this structure | 
 | 351 |  * is allocated as the private data for ieee80211_vif. | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 352 |  */ | 
| Ivo van Doorn | 6bb40dd | 2008-02-03 15:49:59 +0100 | [diff] [blame] | 353 | struct rt2x00_intf { | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 354 | 	/* | 
| Ivo van Doorn | 6bb40dd | 2008-02-03 15:49:59 +0100 | [diff] [blame] | 355 | 	 * All fields within the rt2x00_intf structure | 
 | 356 | 	 * must be protected with a spinlock. | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 357 | 	 */ | 
| Ivo van Doorn | 6bb40dd | 2008-02-03 15:49:59 +0100 | [diff] [blame] | 358 | 	spinlock_t lock; | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 359 |  | 
 | 360 | 	/* | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 361 | 	 * MAC of the device. | 
 | 362 | 	 */ | 
 | 363 | 	u8 mac[ETH_ALEN]; | 
 | 364 |  | 
 | 365 | 	/* | 
 | 366 | 	 * BBSID of the AP to associate with. | 
 | 367 | 	 */ | 
 | 368 | 	u8 bssid[ETH_ALEN]; | 
| Ivo van Doorn | 6bb40dd | 2008-02-03 15:49:59 +0100 | [diff] [blame] | 369 |  | 
 | 370 | 	/* | 
 | 371 | 	 * Entry in the beacon queue which belongs to | 
 | 372 | 	 * this interface. Each interface has its own | 
 | 373 | 	 * dedicated beacon entry. | 
 | 374 | 	 */ | 
 | 375 | 	struct queue_entry *beacon; | 
 | 376 |  | 
 | 377 | 	/* | 
 | 378 | 	 * Actions that needed rescheduling. | 
 | 379 | 	 */ | 
 | 380 | 	unsigned int delayed_flags; | 
 | 381 | #define DELAYED_UPDATE_BEACON		0x00000001 | 
| Ivo van Doorn | 7281037 | 2008-03-09 22:46:18 +0100 | [diff] [blame] | 382 | #define DELAYED_CONFIG_ERP		0x00000002 | 
| Ivo van Doorn | a2e1d52 | 2008-03-31 15:53:44 +0200 | [diff] [blame] | 383 | #define DELAYED_LED_ASSOC		0x00000004 | 
| Johannes Berg | f591fa5 | 2008-07-10 11:21:26 +0200 | [diff] [blame] | 384 |  | 
| Ivo van Doorn | d4764b2 | 2008-07-28 10:21:16 +0200 | [diff] [blame] | 385 | 	/* | 
 | 386 | 	 * Software sequence counter, this is only required | 
 | 387 | 	 * for hardware which doesn't support hardware | 
 | 388 | 	 * sequence counting. | 
 | 389 | 	 */ | 
 | 390 | 	spinlock_t seqlock; | 
| Johannes Berg | f591fa5 | 2008-07-10 11:21:26 +0200 | [diff] [blame] | 391 | 	u16 seqno; | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 392 | }; | 
 | 393 |  | 
| Ivo van Doorn | 6bb40dd | 2008-02-03 15:49:59 +0100 | [diff] [blame] | 394 | static inline struct rt2x00_intf* vif_to_intf(struct ieee80211_vif *vif) | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 395 | { | 
| Ivo van Doorn | 6bb40dd | 2008-02-03 15:49:59 +0100 | [diff] [blame] | 396 | 	return (struct rt2x00_intf *)vif->drv_priv; | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 397 | } | 
 | 398 |  | 
| Ivo van Doorn | 31562e8 | 2008-02-17 17:35:05 +0100 | [diff] [blame] | 399 | /** | 
 | 400 |  * struct hw_mode_spec: Hardware specifications structure | 
 | 401 |  * | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 402 |  * Details about the supported modes, rates and channels | 
 | 403 |  * of a particular chipset. This is used by rt2x00lib | 
 | 404 |  * to build the ieee80211_hw_mode array for mac80211. | 
| Ivo van Doorn | 31562e8 | 2008-02-17 17:35:05 +0100 | [diff] [blame] | 405 |  * | 
 | 406 |  * @supported_bands: Bitmask contained the supported bands (2.4GHz, 5.2GHz). | 
 | 407 |  * @supported_rates: Rate types which are supported (CCK, OFDM). | 
 | 408 |  * @num_channels: Number of supported channels. This is used as array size | 
 | 409 |  *	for @tx_power_a, @tx_power_bg and @channels. | 
| Ivo van Doorn | 9a46d44 | 2008-04-21 19:02:17 +0200 | [diff] [blame] | 410 |  * @channels: Device/chipset specific channel values (See &struct rf_channel). | 
| Ivo van Doorn | 8c5e7a5 | 2008-08-04 16:38:47 +0200 | [diff] [blame] | 411 |  * @channels_info: Additional information for channels (See &struct channel_info). | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 412 |  */ | 
 | 413 | struct hw_mode_spec { | 
| Ivo van Doorn | 31562e8 | 2008-02-17 17:35:05 +0100 | [diff] [blame] | 414 | 	unsigned int supported_bands; | 
 | 415 | #define SUPPORT_BAND_2GHZ	0x00000001 | 
 | 416 | #define SUPPORT_BAND_5GHZ	0x00000002 | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 417 |  | 
| Ivo van Doorn | 31562e8 | 2008-02-17 17:35:05 +0100 | [diff] [blame] | 418 | 	unsigned int supported_rates; | 
 | 419 | #define SUPPORT_RATE_CCK	0x00000001 | 
 | 420 | #define SUPPORT_RATE_OFDM	0x00000002 | 
 | 421 |  | 
 | 422 | 	unsigned int num_channels; | 
 | 423 | 	const struct rf_channel *channels; | 
| Ivo van Doorn | 8c5e7a5 | 2008-08-04 16:38:47 +0200 | [diff] [blame] | 424 | 	const struct channel_info *channels_info; | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 425 | }; | 
 | 426 |  | 
 | 427 | /* | 
| Ivo van Doorn | 5c58ee5 | 2007-10-06 13:34:52 +0200 | [diff] [blame] | 428 |  * Configuration structure wrapper around the | 
 | 429 |  * mac80211 configuration structure. | 
 | 430 |  * When mac80211 configures the driver, rt2x00lib | 
 | 431 |  * can precalculate values which are equal for all | 
 | 432 |  * rt2x00 drivers. Those values can be stored in here. | 
 | 433 |  */ | 
 | 434 | struct rt2x00lib_conf { | 
 | 435 | 	struct ieee80211_conf *conf; | 
| Ivo van Doorn | 8c5e7a5 | 2008-08-04 16:38:47 +0200 | [diff] [blame] | 436 |  | 
| Ivo van Doorn | 5c58ee5 | 2007-10-06 13:34:52 +0200 | [diff] [blame] | 437 | 	struct rf_channel rf; | 
| Ivo van Doorn | 8c5e7a5 | 2008-08-04 16:38:47 +0200 | [diff] [blame] | 438 | 	struct channel_info channel; | 
| Ivo van Doorn | 5c58ee5 | 2007-10-06 13:34:52 +0200 | [diff] [blame] | 439 | }; | 
 | 440 |  | 
 | 441 | /* | 
| Ivo van Doorn | 7281037 | 2008-03-09 22:46:18 +0100 | [diff] [blame] | 442 |  * Configuration structure for erp settings. | 
 | 443 |  */ | 
 | 444 | struct rt2x00lib_erp { | 
 | 445 | 	int short_preamble; | 
| Ivo van Doorn | e360c4c | 2008-07-09 15:12:06 +0200 | [diff] [blame] | 446 | 	int cts_protection; | 
| Ivo van Doorn | 7281037 | 2008-03-09 22:46:18 +0100 | [diff] [blame] | 447 |  | 
 | 448 | 	int ack_timeout; | 
 | 449 | 	int ack_consume_time; | 
| Ivo van Doorn | e4ea1c4 | 2008-10-29 17:17:57 +0100 | [diff] [blame] | 450 |  | 
 | 451 | 	u64 basic_rates; | 
 | 452 |  | 
 | 453 | 	int slot_time; | 
 | 454 |  | 
 | 455 | 	short sifs; | 
 | 456 | 	short pifs; | 
 | 457 | 	short difs; | 
 | 458 | 	short eifs; | 
| Ivo van Doorn | 7281037 | 2008-03-09 22:46:18 +0100 | [diff] [blame] | 459 | }; | 
 | 460 |  | 
 | 461 | /* | 
| Ivo van Doorn | 2bb057d | 2008-08-04 16:37:44 +0200 | [diff] [blame] | 462 |  * Configuration structure for hardware encryption. | 
 | 463 |  */ | 
 | 464 | struct rt2x00lib_crypto { | 
 | 465 | 	enum cipher cipher; | 
 | 466 |  | 
 | 467 | 	enum set_key_cmd cmd; | 
 | 468 | 	const u8 *address; | 
 | 469 |  | 
 | 470 | 	u32 bssidx; | 
 | 471 | 	u32 aid; | 
 | 472 |  | 
 | 473 | 	u8 key[16]; | 
 | 474 | 	u8 tx_mic[8]; | 
 | 475 | 	u8 rx_mic[8]; | 
 | 476 | }; | 
 | 477 |  | 
 | 478 | /* | 
| Ivo van Doorn | 6bb40dd | 2008-02-03 15:49:59 +0100 | [diff] [blame] | 479 |  * Configuration structure wrapper around the | 
 | 480 |  * rt2x00 interface configuration handler. | 
 | 481 |  */ | 
 | 482 | struct rt2x00intf_conf { | 
 | 483 | 	/* | 
 | 484 | 	 * Interface type | 
 | 485 | 	 */ | 
| Johannes Berg | 05c914f | 2008-09-11 00:01:58 +0200 | [diff] [blame] | 486 | 	enum nl80211_iftype type; | 
| Ivo van Doorn | 6bb40dd | 2008-02-03 15:49:59 +0100 | [diff] [blame] | 487 |  | 
 | 488 | 	/* | 
 | 489 | 	 * TSF sync value, this is dependant on the operation type. | 
 | 490 | 	 */ | 
 | 491 | 	enum tsf_sync sync; | 
 | 492 |  | 
 | 493 | 	/* | 
 | 494 | 	 * The MAC and BSSID addressess are simple array of bytes, | 
 | 495 | 	 * these arrays are little endian, so when sending the addressess | 
 | 496 | 	 * to the drivers, copy the it into a endian-signed variable. | 
 | 497 | 	 * | 
 | 498 | 	 * Note that all devices (except rt2500usb) have 32 bits | 
 | 499 | 	 * register word sizes. This means that whatever variable we | 
 | 500 | 	 * pass _must_ be a multiple of 32 bits. Otherwise the device | 
 | 501 | 	 * might not accept what we are sending to it. | 
 | 502 | 	 * This will also make it easier for the driver to write | 
 | 503 | 	 * the data to the device. | 
 | 504 | 	 */ | 
 | 505 | 	__le32 mac[2]; | 
 | 506 | 	__le32 bssid[2]; | 
 | 507 | }; | 
 | 508 |  | 
 | 509 | /* | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 510 |  * rt2x00lib callback functions. | 
 | 511 |  */ | 
 | 512 | struct rt2x00lib_ops { | 
 | 513 | 	/* | 
 | 514 | 	 * Interrupt handlers. | 
 | 515 | 	 */ | 
 | 516 | 	irq_handler_t irq_handler; | 
 | 517 |  | 
 | 518 | 	/* | 
 | 519 | 	 * Device init handlers. | 
 | 520 | 	 */ | 
 | 521 | 	int (*probe_hw) (struct rt2x00_dev *rt2x00dev); | 
 | 522 | 	char *(*get_firmware_name) (struct rt2x00_dev *rt2x00dev); | 
| David Woodhouse | f160ebc | 2008-05-24 00:08:39 +0100 | [diff] [blame] | 523 | 	u16 (*get_firmware_crc) (const void *data, const size_t len); | 
 | 524 | 	int (*load_firmware) (struct rt2x00_dev *rt2x00dev, const void *data, | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 525 | 			      const size_t len); | 
 | 526 |  | 
 | 527 | 	/* | 
 | 528 | 	 * Device initialization/deinitialization handlers. | 
 | 529 | 	 */ | 
 | 530 | 	int (*initialize) (struct rt2x00_dev *rt2x00dev); | 
 | 531 | 	void (*uninitialize) (struct rt2x00_dev *rt2x00dev); | 
 | 532 |  | 
 | 533 | 	/* | 
| Ivo van Doorn | 181d690 | 2008-02-05 16:42:23 -0500 | [diff] [blame] | 534 | 	 * queue initialization handlers | 
| Ivo van Doorn | 837e7f2 | 2008-01-06 23:41:45 +0100 | [diff] [blame] | 535 | 	 */ | 
| Ivo van Doorn | 798b7ad | 2008-11-08 15:25:33 +0100 | [diff] [blame] | 536 | 	bool (*get_entry_state) (struct queue_entry *entry); | 
 | 537 | 	void (*clear_entry) (struct queue_entry *entry); | 
| Ivo van Doorn | 837e7f2 | 2008-01-06 23:41:45 +0100 | [diff] [blame] | 538 |  | 
 | 539 | 	/* | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 540 | 	 * Radio control handlers. | 
 | 541 | 	 */ | 
 | 542 | 	int (*set_device_state) (struct rt2x00_dev *rt2x00dev, | 
 | 543 | 				 enum dev_state state); | 
 | 544 | 	int (*rfkill_poll) (struct rt2x00_dev *rt2x00dev); | 
| Ivo van Doorn | ebcf26d | 2007-10-13 16:26:12 +0200 | [diff] [blame] | 545 | 	void (*link_stats) (struct rt2x00_dev *rt2x00dev, | 
 | 546 | 			    struct link_qual *qual); | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 547 | 	void (*reset_tuner) (struct rt2x00_dev *rt2x00dev); | 
 | 548 | 	void (*link_tuner) (struct rt2x00_dev *rt2x00dev); | 
 | 549 |  | 
 | 550 | 	/* | 
 | 551 | 	 * TX control handlers | 
 | 552 | 	 */ | 
 | 553 | 	void (*write_tx_desc) (struct rt2x00_dev *rt2x00dev, | 
| Ivo van Doorn | dd3193e | 2008-01-06 23:41:10 +0100 | [diff] [blame] | 554 | 			       struct sk_buff *skb, | 
| Ivo van Doorn | 61486e0 | 2008-05-10 13:42:31 +0200 | [diff] [blame] | 555 | 			       struct txentry_desc *txdesc); | 
| Ivo van Doorn | 6db3786 | 2008-06-06 22:50:28 +0200 | [diff] [blame] | 556 | 	int (*write_tx_data) (struct queue_entry *entry); | 
| Ivo van Doorn | bd88a78 | 2008-07-09 15:12:44 +0200 | [diff] [blame] | 557 | 	void (*write_beacon) (struct queue_entry *entry); | 
| Ivo van Doorn | f1ca216 | 2008-11-13 23:07:33 +0100 | [diff] [blame] | 558 | 	int (*get_tx_data_len) (struct queue_entry *entry); | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 559 | 	void (*kick_tx_queue) (struct rt2x00_dev *rt2x00dev, | 
| Ivo van Doorn | e58c6ac | 2008-04-21 19:00:47 +0200 | [diff] [blame] | 560 | 			       const enum data_queue_qid queue); | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 561 |  | 
 | 562 | 	/* | 
 | 563 | 	 * RX control handlers | 
 | 564 | 	 */ | 
| Ivo van Doorn | 181d690 | 2008-02-05 16:42:23 -0500 | [diff] [blame] | 565 | 	void (*fill_rxdone) (struct queue_entry *entry, | 
 | 566 | 			     struct rxdone_entry_desc *rxdesc); | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 567 |  | 
 | 568 | 	/* | 
 | 569 | 	 * Configuration handlers. | 
 | 570 | 	 */ | 
| Ivo van Doorn | 2bb057d | 2008-08-04 16:37:44 +0200 | [diff] [blame] | 571 | 	int (*config_shared_key) (struct rt2x00_dev *rt2x00dev, | 
 | 572 | 				  struct rt2x00lib_crypto *crypto, | 
 | 573 | 				  struct ieee80211_key_conf *key); | 
 | 574 | 	int (*config_pairwise_key) (struct rt2x00_dev *rt2x00dev, | 
 | 575 | 				    struct rt2x00lib_crypto *crypto, | 
 | 576 | 				    struct ieee80211_key_conf *key); | 
| Ivo van Doorn | 3a643d2 | 2008-03-25 14:13:18 +0100 | [diff] [blame] | 577 | 	void (*config_filter) (struct rt2x00_dev *rt2x00dev, | 
 | 578 | 			       const unsigned int filter_flags); | 
| Ivo van Doorn | 6bb40dd | 2008-02-03 15:49:59 +0100 | [diff] [blame] | 579 | 	void (*config_intf) (struct rt2x00_dev *rt2x00dev, | 
 | 580 | 			     struct rt2x00_intf *intf, | 
 | 581 | 			     struct rt2x00intf_conf *conf, | 
 | 582 | 			     const unsigned int flags); | 
 | 583 | #define CONFIG_UPDATE_TYPE		( 1 << 1 ) | 
 | 584 | #define CONFIG_UPDATE_MAC		( 1 << 2 ) | 
 | 585 | #define CONFIG_UPDATE_BSSID		( 1 << 3 ) | 
 | 586 |  | 
| Ivo van Doorn | 3a643d2 | 2008-03-25 14:13:18 +0100 | [diff] [blame] | 587 | 	void (*config_erp) (struct rt2x00_dev *rt2x00dev, | 
 | 588 | 			    struct rt2x00lib_erp *erp); | 
| Ivo van Doorn | e4ea1c4 | 2008-10-29 17:17:57 +0100 | [diff] [blame] | 589 | 	void (*config_ant) (struct rt2x00_dev *rt2x00dev, | 
 | 590 | 			    struct antenna_setup *ant); | 
| Ivo van Doorn | 6bb40dd | 2008-02-03 15:49:59 +0100 | [diff] [blame] | 591 | 	void (*config) (struct rt2x00_dev *rt2x00dev, | 
 | 592 | 			struct rt2x00lib_conf *libconf, | 
| Ivo van Doorn | e4ea1c4 | 2008-10-29 17:17:57 +0100 | [diff] [blame] | 593 | 			const unsigned int changed_flags); | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 594 | }; | 
 | 595 |  | 
 | 596 | /* | 
 | 597 |  * rt2x00 driver callback operation structure. | 
 | 598 |  */ | 
 | 599 | struct rt2x00_ops { | 
 | 600 | 	const char *name; | 
| Ivo van Doorn | 6bb40dd | 2008-02-03 15:49:59 +0100 | [diff] [blame] | 601 | 	const unsigned int max_sta_intf; | 
 | 602 | 	const unsigned int max_ap_intf; | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 603 | 	const unsigned int eeprom_size; | 
 | 604 | 	const unsigned int rf_size; | 
| Gertjan van Wingerde | 61448f8 | 2008-05-10 13:43:33 +0200 | [diff] [blame] | 605 | 	const unsigned int tx_queues; | 
| Ivo van Doorn | 181d690 | 2008-02-05 16:42:23 -0500 | [diff] [blame] | 606 | 	const struct data_queue_desc *rx; | 
 | 607 | 	const struct data_queue_desc *tx; | 
 | 608 | 	const struct data_queue_desc *bcn; | 
 | 609 | 	const struct data_queue_desc *atim; | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 610 | 	const struct rt2x00lib_ops *lib; | 
 | 611 | 	const struct ieee80211_ops *hw; | 
 | 612 | #ifdef CONFIG_RT2X00_LIB_DEBUGFS | 
 | 613 | 	const struct rt2x00debug *debugfs; | 
 | 614 | #endif /* CONFIG_RT2X00_LIB_DEBUGFS */ | 
 | 615 | }; | 
 | 616 |  | 
 | 617 | /* | 
| Ivo van Doorn | 483272f | 2007-10-06 14:13:06 +0200 | [diff] [blame] | 618 |  * rt2x00 device flags | 
 | 619 |  */ | 
 | 620 | enum rt2x00_flags { | 
 | 621 | 	/* | 
 | 622 | 	 * Device state flags | 
 | 623 | 	 */ | 
| Ivo van Doorn | 0262ab0 | 2008-08-29 21:04:26 +0200 | [diff] [blame] | 624 | 	DEVICE_STATE_PRESENT, | 
 | 625 | 	DEVICE_STATE_REGISTERED_HW, | 
 | 626 | 	DEVICE_STATE_INITIALIZED, | 
 | 627 | 	DEVICE_STATE_STARTED, | 
 | 628 | 	DEVICE_STATE_STARTED_SUSPEND, | 
 | 629 | 	DEVICE_STATE_ENABLED_RADIO, | 
 | 630 | 	DEVICE_STATE_DISABLED_RADIO_HW, | 
| Ivo van Doorn | 483272f | 2007-10-06 14:13:06 +0200 | [diff] [blame] | 631 |  | 
 | 632 | 	/* | 
| Ivo van Doorn | 2bb057d | 2008-08-04 16:37:44 +0200 | [diff] [blame] | 633 | 	 * Driver requirements | 
| Ivo van Doorn | 483272f | 2007-10-06 14:13:06 +0200 | [diff] [blame] | 634 | 	 */ | 
 | 635 | 	DRIVER_REQUIRE_FIRMWARE, | 
| Ivo van Doorn | 181d690 | 2008-02-05 16:42:23 -0500 | [diff] [blame] | 636 | 	DRIVER_REQUIRE_BEACON_GUARD, | 
 | 637 | 	DRIVER_REQUIRE_ATIM_QUEUE, | 
| Ivo van Doorn | 3a643d2 | 2008-03-25 14:13:18 +0100 | [diff] [blame] | 638 | 	DRIVER_REQUIRE_SCHEDULED, | 
| Gertjan van Wingerde | c4da004 | 2008-06-16 19:56:31 +0200 | [diff] [blame] | 639 | 	DRIVER_REQUIRE_DMA, | 
| Ivo van Doorn | 483272f | 2007-10-06 14:13:06 +0200 | [diff] [blame] | 640 |  | 
 | 641 | 	/* | 
| Ivo van Doorn | 2bb057d | 2008-08-04 16:37:44 +0200 | [diff] [blame] | 642 | 	 * Driver features | 
| Ivo van Doorn | 483272f | 2007-10-06 14:13:06 +0200 | [diff] [blame] | 643 | 	 */ | 
 | 644 | 	CONFIG_SUPPORT_HW_BUTTON, | 
| Ivo van Doorn | 2bb057d | 2008-08-04 16:37:44 +0200 | [diff] [blame] | 645 | 	CONFIG_SUPPORT_HW_CRYPTO, | 
 | 646 |  | 
 | 647 | 	/* | 
 | 648 | 	 * Driver configuration | 
 | 649 | 	 */ | 
| Ivo van Doorn | 483272f | 2007-10-06 14:13:06 +0200 | [diff] [blame] | 650 | 	CONFIG_FRAME_TYPE, | 
 | 651 | 	CONFIG_RF_SEQUENCE, | 
 | 652 | 	CONFIG_EXTERNAL_LNA_A, | 
 | 653 | 	CONFIG_EXTERNAL_LNA_BG, | 
 | 654 | 	CONFIG_DOUBLE_ANTENNA, | 
 | 655 | 	CONFIG_DISABLE_LINK_TUNING, | 
 | 656 | }; | 
 | 657 |  | 
 | 658 | /* | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 659 |  * rt2x00 device structure. | 
 | 660 |  */ | 
 | 661 | struct rt2x00_dev { | 
 | 662 | 	/* | 
 | 663 | 	 * Device structure. | 
 | 664 | 	 * The structure stored in here depends on the | 
 | 665 | 	 * system bus (PCI or USB). | 
 | 666 | 	 * When accessing this variable, the rt2x00dev_{pci,usb} | 
 | 667 | 	 * macro's should be used for correct typecasting. | 
 | 668 | 	 */ | 
| Gertjan van Wingerde | 14a3bf8 | 2008-06-16 19:55:43 +0200 | [diff] [blame] | 669 | 	struct device *dev; | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 670 |  | 
 | 671 | 	/* | 
 | 672 | 	 * Callback functions. | 
 | 673 | 	 */ | 
 | 674 | 	const struct rt2x00_ops *ops; | 
 | 675 |  | 
 | 676 | 	/* | 
 | 677 | 	 * IEEE80211 control structure. | 
 | 678 | 	 */ | 
 | 679 | 	struct ieee80211_hw *hw; | 
| Johannes Berg | 8318d78 | 2008-01-24 19:38:38 +0100 | [diff] [blame] | 680 | 	struct ieee80211_supported_band bands[IEEE80211_NUM_BANDS]; | 
 | 681 | 	enum ieee80211_band curr_band; | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 682 |  | 
 | 683 | 	/* | 
 | 684 | 	 * rfkill structure for RF state switching support. | 
 | 685 | 	 * This will only be compiled in when required. | 
 | 686 | 	 */ | 
 | 687 | #ifdef CONFIG_RT2X00_LIB_RFKILL | 
| John W. Linville | 3480a58 | 2008-03-27 19:54:13 -0400 | [diff] [blame] | 688 | 	unsigned long rfkill_state; | 
| Ivo van Doorn | 1682fe6 | 2008-03-13 15:38:03 +0100 | [diff] [blame] | 689 | #define RFKILL_STATE_ALLOCATED		1 | 
 | 690 | #define RFKILL_STATE_REGISTERED		2 | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 691 | 	struct rfkill *rfkill; | 
| Ivo van Doorn | 50db787 | 2008-07-04 14:51:39 +0200 | [diff] [blame] | 692 | 	struct delayed_work rfkill_work; | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 693 | #endif /* CONFIG_RT2X00_LIB_RFKILL */ | 
 | 694 |  | 
 | 695 | 	/* | 
 | 696 | 	 * If enabled, the debugfs interface structures | 
 | 697 | 	 * required for deregistration of debugfs. | 
 | 698 | 	 */ | 
 | 699 | #ifdef CONFIG_RT2X00_LIB_DEBUGFS | 
| Ivo van Doorn | 4d8dd66 | 2007-11-27 21:49:29 +0100 | [diff] [blame] | 700 | 	struct rt2x00debug_intf *debugfs_intf; | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 701 | #endif /* CONFIG_RT2X00_LIB_DEBUGFS */ | 
 | 702 |  | 
 | 703 | 	/* | 
| Ivo van Doorn | a9450b7 | 2008-02-03 15:53:40 +0100 | [diff] [blame] | 704 | 	 * LED structure for changing the LED status | 
 | 705 | 	 * by mac8011 or the kernel. | 
 | 706 | 	 */ | 
 | 707 | #ifdef CONFIG_RT2X00_LIB_LEDS | 
| Ivo van Doorn | a9450b7 | 2008-02-03 15:53:40 +0100 | [diff] [blame] | 708 | 	struct rt2x00_led led_radio; | 
 | 709 | 	struct rt2x00_led led_assoc; | 
 | 710 | 	struct rt2x00_led led_qual; | 
 | 711 | 	u16 led_mcu_reg; | 
 | 712 | #endif /* CONFIG_RT2X00_LIB_LEDS */ | 
 | 713 |  | 
 | 714 | 	/* | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 715 | 	 * Device flags. | 
 | 716 | 	 * In these flags the current status and some | 
 | 717 | 	 * of the device capabilities are stored. | 
 | 718 | 	 */ | 
 | 719 | 	unsigned long flags; | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 720 |  | 
 | 721 | 	/* | 
 | 722 | 	 * Chipset identification. | 
 | 723 | 	 */ | 
 | 724 | 	struct rt2x00_chip chip; | 
 | 725 |  | 
 | 726 | 	/* | 
 | 727 | 	 * hw capability specifications. | 
 | 728 | 	 */ | 
 | 729 | 	struct hw_mode_spec spec; | 
 | 730 |  | 
 | 731 | 	/* | 
| Ivo van Doorn | addc81b | 2007-10-13 16:26:23 +0200 | [diff] [blame] | 732 | 	 * This is the default TX/RX antenna setup as indicated | 
| Ivo van Doorn | 6d64360 | 2008-11-02 00:38:10 +0100 | [diff] [blame] | 733 | 	 * by the device's EEPROM. | 
| Ivo van Doorn | addc81b | 2007-10-13 16:26:23 +0200 | [diff] [blame] | 734 | 	 */ | 
 | 735 | 	struct antenna_setup default_ant; | 
 | 736 |  | 
 | 737 | 	/* | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 738 | 	 * Register pointers | 
| Ivo van Doorn | 2179509 | 2008-02-10 22:49:13 +0100 | [diff] [blame] | 739 | 	 * csr.base: CSR base register address. (PCI) | 
 | 740 | 	 * csr.cache: CSR cache for usb_control_msg. (USB) | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 741 | 	 */ | 
| Ivo van Doorn | 2179509 | 2008-02-10 22:49:13 +0100 | [diff] [blame] | 742 | 	union csr { | 
 | 743 | 		void __iomem *base; | 
 | 744 | 		void *cache; | 
 | 745 | 	} csr; | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 746 |  | 
 | 747 | 	/* | 
| Ivo van Doorn | 8ff48a8 | 2008-11-09 23:40:46 +0100 | [diff] [blame] | 748 | 	 * Mutex to protect register accesses. | 
 | 749 | 	 * For PCI and USB devices it protects against concurrent indirect | 
 | 750 | 	 * register access (BBP, RF, MCU) since accessing those | 
 | 751 | 	 * registers require multiple calls to the CSR registers. | 
 | 752 | 	 * For USB devices it also protects the csr_cache since that | 
 | 753 | 	 * field is used for normal CSR access and it cannot support | 
 | 754 | 	 * multiple callers simultaneously. | 
| Adam Baker | 3d82346 | 2007-10-27 13:43:29 +0200 | [diff] [blame] | 755 | 	 */ | 
| Ivo van Doorn | 8ff48a8 | 2008-11-09 23:40:46 +0100 | [diff] [blame] | 756 | 	struct mutex csr_mutex; | 
| Adam Baker | 3d82346 | 2007-10-27 13:43:29 +0200 | [diff] [blame] | 757 |  | 
 | 758 | 	/* | 
| Ivo van Doorn | 3c4f208 | 2008-01-06 23:40:49 +0100 | [diff] [blame] | 759 | 	 * Current packet filter configuration for the device. | 
 | 760 | 	 * This contains all currently active FIF_* flags send | 
 | 761 | 	 * to us by mac80211 during configure_filter(). | 
 | 762 | 	 */ | 
 | 763 | 	unsigned int packet_filter; | 
 | 764 |  | 
 | 765 | 	/* | 
| Ivo van Doorn | 6bb40dd | 2008-02-03 15:49:59 +0100 | [diff] [blame] | 766 | 	 * Interface details: | 
 | 767 | 	 *  - Open ap interface count. | 
 | 768 | 	 *  - Open sta interface count. | 
 | 769 | 	 *  - Association count. | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 770 | 	 */ | 
| Ivo van Doorn | 6bb40dd | 2008-02-03 15:49:59 +0100 | [diff] [blame] | 771 | 	unsigned int intf_ap_count; | 
 | 772 | 	unsigned int intf_sta_count; | 
 | 773 | 	unsigned int intf_associated; | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 774 |  | 
 | 775 | 	/* | 
 | 776 | 	 * Link quality | 
 | 777 | 	 */ | 
 | 778 | 	struct link link; | 
 | 779 |  | 
 | 780 | 	/* | 
 | 781 | 	 * EEPROM data. | 
 | 782 | 	 */ | 
 | 783 | 	__le16 *eeprom; | 
 | 784 |  | 
 | 785 | 	/* | 
 | 786 | 	 * Active RF register values. | 
 | 787 | 	 * These are stored here so we don't need | 
 | 788 | 	 * to read the rf registers and can directly | 
 | 789 | 	 * use this value instead. | 
 | 790 | 	 * This field should be accessed by using | 
 | 791 | 	 * rt2x00_rf_read() and rt2x00_rf_write(). | 
 | 792 | 	 */ | 
 | 793 | 	u32 *rf; | 
 | 794 |  | 
 | 795 | 	/* | 
| Ivo van Doorn | ba2ab47 | 2008-08-06 16:22:17 +0200 | [diff] [blame] | 796 | 	 * LNA gain | 
 | 797 | 	 */ | 
 | 798 | 	short lna_gain; | 
 | 799 |  | 
 | 800 | 	/* | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 801 | 	 * Current TX power value. | 
 | 802 | 	 */ | 
 | 803 | 	u16 tx_power; | 
 | 804 |  | 
 | 805 | 	/* | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 806 | 	 * Rssi <-> Dbm offset | 
 | 807 | 	 */ | 
 | 808 | 	u8 rssi_offset; | 
 | 809 |  | 
 | 810 | 	/* | 
 | 811 | 	 * Frequency offset (for rt61pci & rt73usb). | 
 | 812 | 	 */ | 
 | 813 | 	u8 freq_offset; | 
 | 814 |  | 
 | 815 | 	/* | 
 | 816 | 	 * Low level statistics which will have | 
 | 817 | 	 * to be kept up to date while device is running. | 
 | 818 | 	 */ | 
 | 819 | 	struct ieee80211_low_level_stats low_level_stats; | 
 | 820 |  | 
 | 821 | 	/* | 
 | 822 | 	 * RX configuration information. | 
 | 823 | 	 */ | 
 | 824 | 	struct ieee80211_rx_status rx_status; | 
 | 825 |  | 
 | 826 | 	/* | 
| Johannes Berg | 4150c57 | 2007-09-17 01:29:23 -0400 | [diff] [blame] | 827 | 	 * Scheduled work. | 
| Ivo van Doorn | 8e260c2 | 2008-07-04 13:41:31 +0200 | [diff] [blame] | 828 | 	 * NOTE: intf_work will use ieee80211_iterate_active_interfaces() | 
 | 829 | 	 * which means it cannot be placed on the hw->workqueue | 
 | 830 | 	 * due to RTNL locking requirements. | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 831 | 	 */ | 
| Ivo van Doorn | 6bb40dd | 2008-02-03 15:49:59 +0100 | [diff] [blame] | 832 | 	struct work_struct intf_work; | 
| Johannes Berg | 4150c57 | 2007-09-17 01:29:23 -0400 | [diff] [blame] | 833 | 	struct work_struct filter_work; | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 834 |  | 
 | 835 | 	/* | 
| Ivo van Doorn | 181d690 | 2008-02-05 16:42:23 -0500 | [diff] [blame] | 836 | 	 * Data queue arrays for RX, TX and Beacon. | 
 | 837 | 	 * The Beacon array also contains the Atim queue | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 838 | 	 * if that is supported by the device. | 
 | 839 | 	 */ | 
| Ivo van Doorn | b869767 | 2008-06-06 22:53:14 +0200 | [diff] [blame] | 840 | 	unsigned int data_queues; | 
| Ivo van Doorn | 181d690 | 2008-02-05 16:42:23 -0500 | [diff] [blame] | 841 | 	struct data_queue *rx; | 
 | 842 | 	struct data_queue *tx; | 
 | 843 | 	struct data_queue *bcn; | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 844 |  | 
 | 845 | 	/* | 
 | 846 | 	 * Firmware image. | 
 | 847 | 	 */ | 
 | 848 | 	const struct firmware *fw; | 
 | 849 | }; | 
 | 850 |  | 
 | 851 | /* | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 852 |  * Generic RF access. | 
 | 853 |  * The RF is being accessed by word index. | 
 | 854 |  */ | 
| Adam Baker | 0e14f6d | 2007-10-27 13:41:25 +0200 | [diff] [blame] | 855 | static inline void rt2x00_rf_read(struct rt2x00_dev *rt2x00dev, | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 856 | 				  const unsigned int word, u32 *data) | 
 | 857 | { | 
 | 858 | 	*data = rt2x00dev->rf[word]; | 
 | 859 | } | 
 | 860 |  | 
| Adam Baker | 0e14f6d | 2007-10-27 13:41:25 +0200 | [diff] [blame] | 861 | static inline void rt2x00_rf_write(struct rt2x00_dev *rt2x00dev, | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 862 | 				   const unsigned int word, u32 data) | 
 | 863 | { | 
 | 864 | 	rt2x00dev->rf[word] = data; | 
 | 865 | } | 
 | 866 |  | 
 | 867 | /* | 
 | 868 |  *  Generic EEPROM access. | 
 | 869 |  * The EEPROM is being accessed by word index. | 
 | 870 |  */ | 
| Adam Baker | 0e14f6d | 2007-10-27 13:41:25 +0200 | [diff] [blame] | 871 | static inline void *rt2x00_eeprom_addr(struct rt2x00_dev *rt2x00dev, | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 872 | 				       const unsigned int word) | 
 | 873 | { | 
 | 874 | 	return (void *)&rt2x00dev->eeprom[word]; | 
 | 875 | } | 
 | 876 |  | 
| Adam Baker | 0e14f6d | 2007-10-27 13:41:25 +0200 | [diff] [blame] | 877 | static inline void rt2x00_eeprom_read(struct rt2x00_dev *rt2x00dev, | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 878 | 				      const unsigned int word, u16 *data) | 
 | 879 | { | 
 | 880 | 	*data = le16_to_cpu(rt2x00dev->eeprom[word]); | 
 | 881 | } | 
 | 882 |  | 
| Adam Baker | 0e14f6d | 2007-10-27 13:41:25 +0200 | [diff] [blame] | 883 | static inline void rt2x00_eeprom_write(struct rt2x00_dev *rt2x00dev, | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 884 | 				       const unsigned int word, u16 data) | 
 | 885 | { | 
 | 886 | 	rt2x00dev->eeprom[word] = cpu_to_le16(data); | 
 | 887 | } | 
 | 888 |  | 
 | 889 | /* | 
 | 890 |  * Chipset handlers | 
 | 891 |  */ | 
 | 892 | static inline void rt2x00_set_chip(struct rt2x00_dev *rt2x00dev, | 
 | 893 | 				   const u16 rt, const u16 rf, const u32 rev) | 
 | 894 | { | 
 | 895 | 	INFO(rt2x00dev, | 
 | 896 | 	     "Chipset detected - rt: %04x, rf: %04x, rev: %08x.\n", | 
 | 897 | 	     rt, rf, rev); | 
 | 898 |  | 
 | 899 | 	rt2x00dev->chip.rt = rt; | 
 | 900 | 	rt2x00dev->chip.rf = rf; | 
 | 901 | 	rt2x00dev->chip.rev = rev; | 
 | 902 | } | 
 | 903 |  | 
 | 904 | static inline char rt2x00_rt(const struct rt2x00_chip *chipset, const u16 chip) | 
 | 905 | { | 
 | 906 | 	return (chipset->rt == chip); | 
 | 907 | } | 
 | 908 |  | 
 | 909 | static inline char rt2x00_rf(const struct rt2x00_chip *chipset, const u16 chip) | 
 | 910 | { | 
 | 911 | 	return (chipset->rf == chip); | 
 | 912 | } | 
 | 913 |  | 
| Ivo van Doorn | 755a957 | 2007-11-12 15:02:22 +0100 | [diff] [blame] | 914 | static inline u16 rt2x00_rev(const struct rt2x00_chip *chipset) | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 915 | { | 
 | 916 | 	return chipset->rev; | 
 | 917 | } | 
 | 918 |  | 
| Ivo van Doorn | 755a957 | 2007-11-12 15:02:22 +0100 | [diff] [blame] | 919 | static inline u16 rt2x00_check_rev(const struct rt2x00_chip *chipset, | 
 | 920 | 				   const u32 rev) | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 921 | { | 
| Ivo van Doorn | 755a957 | 2007-11-12 15:02:22 +0100 | [diff] [blame] | 922 | 	return (((chipset->rev & 0xffff0) == rev) && | 
 | 923 | 		!!(chipset->rev & 0x0000f)); | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 924 | } | 
 | 925 |  | 
| Ivo van Doorn | 181d690 | 2008-02-05 16:42:23 -0500 | [diff] [blame] | 926 | /** | 
| Gertjan van Wingerde | c4da004 | 2008-06-16 19:56:31 +0200 | [diff] [blame] | 927 |  * rt2x00queue_map_txskb - Map a skb into DMA for TX purposes. | 
 | 928 |  * @rt2x00dev: Pointer to &struct rt2x00_dev. | 
 | 929 |  * @skb: The skb to map. | 
| Gertjan van Wingerde | 239c249 | 2008-06-06 22:54:12 +0200 | [diff] [blame] | 930 |  */ | 
| Gertjan van Wingerde | c4da004 | 2008-06-16 19:56:31 +0200 | [diff] [blame] | 931 | void rt2x00queue_map_txskb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb); | 
| Gertjan van Wingerde | 239c249 | 2008-06-06 22:54:12 +0200 | [diff] [blame] | 932 |  | 
 | 933 | /** | 
| Ivo van Doorn | e58c6ac | 2008-04-21 19:00:47 +0200 | [diff] [blame] | 934 |  * rt2x00queue_get_queue - Convert queue index to queue pointer | 
| Ivo van Doorn | 181d690 | 2008-02-05 16:42:23 -0500 | [diff] [blame] | 935 |  * @rt2x00dev: Pointer to &struct rt2x00_dev. | 
| Ivo van Doorn | e58c6ac | 2008-04-21 19:00:47 +0200 | [diff] [blame] | 936 |  * @queue: rt2x00 queue index (see &enum data_queue_qid). | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 937 |  */ | 
| Ivo van Doorn | 181d690 | 2008-02-05 16:42:23 -0500 | [diff] [blame] | 938 | struct data_queue *rt2x00queue_get_queue(struct rt2x00_dev *rt2x00dev, | 
| Ivo van Doorn | e58c6ac | 2008-04-21 19:00:47 +0200 | [diff] [blame] | 939 | 					 const enum data_queue_qid queue); | 
| Ivo van Doorn | 181d690 | 2008-02-05 16:42:23 -0500 | [diff] [blame] | 940 |  | 
 | 941 | /** | 
 | 942 |  * rt2x00queue_get_entry - Get queue entry where the given index points to. | 
| Ivo van Doorn | 9a46d44 | 2008-04-21 19:02:17 +0200 | [diff] [blame] | 943 |  * @queue: Pointer to &struct data_queue from where we obtain the entry. | 
| Ivo van Doorn | 181d690 | 2008-02-05 16:42:23 -0500 | [diff] [blame] | 944 |  * @index: Index identifier for obtaining the correct index. | 
 | 945 |  */ | 
 | 946 | struct queue_entry *rt2x00queue_get_entry(struct data_queue *queue, | 
 | 947 | 					  enum queue_index index); | 
 | 948 |  | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 949 | /* | 
 | 950 |  * Interrupt context handlers. | 
 | 951 |  */ | 
 | 952 | void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev); | 
| Ivo van Doorn | 181d690 | 2008-02-05 16:42:23 -0500 | [diff] [blame] | 953 | void rt2x00lib_txdone(struct queue_entry *entry, | 
 | 954 | 		      struct txdone_entry_desc *txdesc); | 
| Gertjan van Wingerde | c4da004 | 2008-06-16 19:56:31 +0200 | [diff] [blame] | 955 | void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev, | 
 | 956 | 		      struct queue_entry *entry); | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 957 |  | 
 | 958 | /* | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 959 |  * mac80211 handlers. | 
 | 960 |  */ | 
| Johannes Berg | e039fa4 | 2008-05-15 12:55:29 +0200 | [diff] [blame] | 961 | int rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb); | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 962 | int rt2x00mac_start(struct ieee80211_hw *hw); | 
 | 963 | void rt2x00mac_stop(struct ieee80211_hw *hw); | 
 | 964 | int rt2x00mac_add_interface(struct ieee80211_hw *hw, | 
 | 965 | 			    struct ieee80211_if_init_conf *conf); | 
 | 966 | void rt2x00mac_remove_interface(struct ieee80211_hw *hw, | 
 | 967 | 				struct ieee80211_if_init_conf *conf); | 
| Johannes Berg | e897558 | 2008-10-09 12:18:51 +0200 | [diff] [blame] | 968 | int rt2x00mac_config(struct ieee80211_hw *hw, u32 changed); | 
| Johannes Berg | 32bfd35 | 2007-12-19 01:31:26 +0100 | [diff] [blame] | 969 | int rt2x00mac_config_interface(struct ieee80211_hw *hw, | 
 | 970 | 			       struct ieee80211_vif *vif, | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 971 | 			       struct ieee80211_if_conf *conf); | 
| Ivo van Doorn | 3a643d2 | 2008-03-25 14:13:18 +0100 | [diff] [blame] | 972 | void rt2x00mac_configure_filter(struct ieee80211_hw *hw, | 
 | 973 | 				unsigned int changed_flags, | 
 | 974 | 				unsigned int *total_flags, | 
 | 975 | 				int mc_count, struct dev_addr_list *mc_list); | 
| Ivo van Doorn | 2bb057d | 2008-08-04 16:37:44 +0200 | [diff] [blame] | 976 | #ifdef CONFIG_RT2X00_LIB_CRYPTO | 
 | 977 | int rt2x00mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, | 
 | 978 | 		      const u8 *local_address, const u8 *address, | 
 | 979 | 		      struct ieee80211_key_conf *key); | 
 | 980 | #else | 
 | 981 | #define rt2x00mac_set_key	NULL | 
 | 982 | #endif /* CONFIG_RT2X00_LIB_CRYPTO */ | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 983 | int rt2x00mac_get_stats(struct ieee80211_hw *hw, | 
 | 984 | 			struct ieee80211_low_level_stats *stats); | 
 | 985 | int rt2x00mac_get_tx_stats(struct ieee80211_hw *hw, | 
 | 986 | 			   struct ieee80211_tx_queue_stats *stats); | 
| Johannes Berg | 471b3ef | 2007-12-28 14:32:58 +0100 | [diff] [blame] | 987 | void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw, | 
 | 988 | 				struct ieee80211_vif *vif, | 
 | 989 | 				struct ieee80211_bss_conf *bss_conf, | 
 | 990 | 				u32 changes); | 
| Johannes Berg | e100bb6 | 2008-04-30 18:51:21 +0200 | [diff] [blame] | 991 | int rt2x00mac_conf_tx(struct ieee80211_hw *hw, u16 queue, | 
| Ivo van Doorn | 95ea362 | 2007-09-25 17:57:13 -0700 | [diff] [blame] | 992 | 		      const struct ieee80211_tx_queue_params *params); | 
 | 993 |  | 
 | 994 | /* | 
 | 995 |  * Driver allocation handlers. | 
 | 996 |  */ | 
 | 997 | int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev); | 
 | 998 | void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev); | 
 | 999 | #ifdef CONFIG_PM | 
 | 1000 | int rt2x00lib_suspend(struct rt2x00_dev *rt2x00dev, pm_message_t state); | 
 | 1001 | int rt2x00lib_resume(struct rt2x00_dev *rt2x00dev); | 
 | 1002 | #endif /* CONFIG_PM */ | 
 | 1003 |  | 
 | 1004 | #endif /* RT2X00_H */ |