rt2x00lib.h revision fa69560f317d961c56e29dea788b346d2b34fb87
1/* 2 Copyright (C) 2004 - 2009 Ivo van Doorn <IvDoorn@gmail.com> 3 Copyright (C) 2004 - 2009 Gertjan van Wingerde <gwingerde@gmail.com> 4 <http://rt2x00.serialmonkey.com> 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the 18 Free Software Foundation, Inc., 19 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 20 */ 21 22/* 23 Module: rt2x00lib 24 Abstract: Data structures and definitions for the rt2x00lib module. 25 */ 26 27#ifndef RT2X00LIB_H 28#define RT2X00LIB_H 29 30/* 31 * Interval defines 32 */ 33#define WATCHDOG_INTERVAL round_jiffies_relative(HZ) 34#define LINK_TUNE_INTERVAL round_jiffies_relative(HZ) 35 36/* 37 * rt2x00_rate: Per rate device information 38 */ 39struct rt2x00_rate { 40 unsigned short flags; 41#define DEV_RATE_CCK 0x0001 42#define DEV_RATE_OFDM 0x0002 43#define DEV_RATE_SHORT_PREAMBLE 0x0004 44 45 unsigned short bitrate; /* In 100kbit/s */ 46 unsigned short ratemask; 47 48 unsigned short plcp; 49 unsigned short mcs; 50}; 51 52extern const struct rt2x00_rate rt2x00_supported_rates[12]; 53 54static inline const struct rt2x00_rate *rt2x00_get_rate(const u16 hw_value) 55{ 56 return &rt2x00_supported_rates[hw_value & 0xff]; 57} 58 59#define RATE_MCS(__mode, __mcs) \ 60 ( (((__mode) & 0x00ff) << 8) | ((__mcs) & 0x00ff) ) 61 62static inline int rt2x00_get_rate_mcs(const u16 mcs_value) 63{ 64 return (mcs_value & 0x00ff); 65} 66 67/* 68 * Radio control handlers. 69 */ 70int rt2x00lib_enable_radio(struct rt2x00_dev *rt2x00dev); 71void rt2x00lib_disable_radio(struct rt2x00_dev *rt2x00dev); 72void rt2x00lib_toggle_rx(struct rt2x00_dev *rt2x00dev, enum dev_state state); 73 74/* 75 * Initialization handlers. 76 */ 77int rt2x00lib_start(struct rt2x00_dev *rt2x00dev); 78void rt2x00lib_stop(struct rt2x00_dev *rt2x00dev); 79 80/* 81 * Configuration handlers. 82 */ 83void rt2x00lib_config_intf(struct rt2x00_dev *rt2x00dev, 84 struct rt2x00_intf *intf, 85 enum nl80211_iftype type, 86 const u8 *mac, const u8 *bssid); 87void rt2x00lib_config_erp(struct rt2x00_dev *rt2x00dev, 88 struct rt2x00_intf *intf, 89 struct ieee80211_bss_conf *conf, 90 u32 changed); 91void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev, 92 struct antenna_setup ant); 93void rt2x00lib_config(struct rt2x00_dev *rt2x00dev, 94 struct ieee80211_conf *conf, 95 const unsigned int changed_flags); 96 97/** 98 * DOC: Queue handlers 99 */ 100 101/** 102 * rt2x00queue_alloc_rxskb - allocate a skb for RX purposes. 103 * @entry: The entry for which the skb will be applicable. 104 */ 105struct sk_buff *rt2x00queue_alloc_rxskb(struct queue_entry *entry); 106 107/** 108 * rt2x00queue_free_skb - free a skb 109 * @entry: The entry for which the skb will be applicable. 110 */ 111void rt2x00queue_free_skb(struct queue_entry *entry); 112 113/** 114 * rt2x00queue_align_frame - Align 802.11 frame to 4-byte boundary 115 * @skb: The skb to align 116 * 117 * Align the start of the 802.11 frame to a 4-byte boundary, this could 118 * mean the payload is not aligned properly though. 119 */ 120void rt2x00queue_align_frame(struct sk_buff *skb); 121 122/** 123 * rt2x00queue_align_payload - Align 802.11 payload to 4-byte boundary 124 * @skb: The skb to align 125 * @header_length: Length of 802.11 header 126 * 127 * Align the 802.11 payload to a 4-byte boundary, this could 128 * mean the header is not aligned properly though. 129 */ 130void rt2x00queue_align_payload(struct sk_buff *skb, unsigned int header_length); 131 132/** 133 * rt2x00queue_insert_l2pad - Align 802.11 header & payload to 4-byte boundary 134 * @skb: The skb to align 135 * @header_length: Length of 802.11 header 136 * 137 * Apply L2 padding to align both header and payload to 4-byte boundary 138 */ 139void rt2x00queue_insert_l2pad(struct sk_buff *skb, unsigned int header_length); 140 141/** 142 * rt2x00queue_insert_l2pad - Remove L2 padding from 802.11 frame 143 * @skb: The skb to align 144 * @header_length: Length of 802.11 header 145 * 146 * Remove L2 padding used to align both header and payload to 4-byte boundary, 147 * by removing the L2 padding the header will no longer be 4-byte aligned. 148 */ 149void rt2x00queue_remove_l2pad(struct sk_buff *skb, unsigned int header_length); 150 151/** 152 * rt2x00queue_write_tx_frame - Write TX frame to hardware 153 * @queue: Queue over which the frame should be send 154 * @skb: The skb to send 155 * @local: frame is not from mac80211 156 */ 157int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, 158 bool local); 159 160/** 161 * rt2x00queue_update_beacon - Send new beacon from mac80211 to hardware 162 * @rt2x00dev: Pointer to &struct rt2x00_dev. 163 * @vif: Interface for which the beacon should be updated. 164 * @enable_beacon: Enable beaconing 165 */ 166int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev, 167 struct ieee80211_vif *vif, 168 const bool enable_beacon); 169 170/** 171 * rt2x00queue_index_inc - Index incrementation function 172 * @queue: Queue (&struct data_queue) to perform the action on. 173 * @index: Index type (&enum queue_index) to perform the action on. 174 * 175 * This function will increase the requested index on the queue, 176 * it will grab the appropriate locks and handle queue overflow events by 177 * resetting the index to the start of the queue. 178 */ 179void rt2x00queue_index_inc(struct data_queue *queue, enum queue_index index); 180 181/** 182 * rt2x00queue_stop_queues - Halt all data queues 183 * @rt2x00dev: Pointer to &struct rt2x00_dev. 184 * 185 * This function will loop through all available queues to stop 186 * any pending outgoing frames. 187 */ 188void rt2x00queue_stop_queues(struct rt2x00_dev *rt2x00dev); 189 190/** 191 * rt2x00queue_init_queues - Initialize all data queues 192 * @rt2x00dev: Pointer to &struct rt2x00_dev. 193 * 194 * This function will loop through all available queues to clear all 195 * index numbers and set the queue entry to the correct initialization 196 * state. 197 */ 198void rt2x00queue_init_queues(struct rt2x00_dev *rt2x00dev); 199 200int rt2x00queue_initialize(struct rt2x00_dev *rt2x00dev); 201void rt2x00queue_uninitialize(struct rt2x00_dev *rt2x00dev); 202int rt2x00queue_allocate(struct rt2x00_dev *rt2x00dev); 203void rt2x00queue_free(struct rt2x00_dev *rt2x00dev); 204 205/** 206 * rt2x00link_update_stats - Update link statistics from RX frame 207 * @rt2x00dev: Pointer to &struct rt2x00_dev. 208 * @skb: Received frame 209 * @rxdesc: Received frame descriptor 210 * 211 * Update link statistics based on the information from the 212 * received frame descriptor. 213 */ 214void rt2x00link_update_stats(struct rt2x00_dev *rt2x00dev, 215 struct sk_buff *skb, 216 struct rxdone_entry_desc *rxdesc); 217 218/** 219 * rt2x00link_start_tuner - Start periodic link tuner work 220 * @rt2x00dev: Pointer to &struct rt2x00_dev. 221 * 222 * This start the link tuner periodic work, this work will 223 * be executed periodically until &rt2x00link_stop_tuner has 224 * been called. 225 */ 226void rt2x00link_start_tuner(struct rt2x00_dev *rt2x00dev); 227 228/** 229 * rt2x00link_stop_tuner - Stop periodic link tuner work 230 * @rt2x00dev: Pointer to &struct rt2x00_dev. 231 * 232 * After this function completed the link tuner will not 233 * be running until &rt2x00link_start_tuner is called. 234 */ 235void rt2x00link_stop_tuner(struct rt2x00_dev *rt2x00dev); 236 237/** 238 * rt2x00link_reset_tuner - Reset periodic link tuner work 239 * @rt2x00dev: Pointer to &struct rt2x00_dev. 240 * @antenna: Should the antenna tuning also be reset 241 * 242 * The VGC limit configured in the hardware will be reset to 0 243 * which forces the driver to rediscover the correct value for 244 * the current association. This is needed when configuration 245 * options have changed which could drastically change the 246 * SNR level or link quality (i.e. changing the antenna setting). 247 * 248 * Resetting the link tuner will also cause the periodic work counter 249 * to be reset. Any driver which has a fixed limit on the number 250 * of rounds the link tuner is supposed to work will accept the 251 * tuner actions again if this limit was previously reached. 252 * 253 * If @antenna is set to true a the software antenna diversity 254 * tuning will also be reset. 255 */ 256void rt2x00link_reset_tuner(struct rt2x00_dev *rt2x00dev, bool antenna); 257 258/** 259 * rt2x00link_start_watchdog - Start periodic watchdog monitoring 260 * @rt2x00dev: Pointer to &struct rt2x00_dev. 261 * 262 * This start the watchdog periodic work, this work will 263 *be executed periodically until &rt2x00link_stop_watchdog has 264 * been called. 265 */ 266void rt2x00link_start_watchdog(struct rt2x00_dev *rt2x00dev); 267 268/** 269 * rt2x00link_stop_watchdog - Stop periodic watchdog monitoring 270 * @rt2x00dev: Pointer to &struct rt2x00_dev. 271 * 272 * After this function completed the watchdog monitoring will not 273 * be running until &rt2x00link_start_watchdog is called. 274 */ 275void rt2x00link_stop_watchdog(struct rt2x00_dev *rt2x00dev); 276 277/** 278 * rt2x00link_register - Initialize link tuning & watchdog functionality 279 * @rt2x00dev: Pointer to &struct rt2x00_dev. 280 * 281 * Initialize work structure and all link tuning and watchdog related 282 * parameters. This will not start the periodic work itself. 283 */ 284void rt2x00link_register(struct rt2x00_dev *rt2x00dev); 285 286/* 287 * Firmware handlers. 288 */ 289#ifdef CONFIG_RT2X00_LIB_FIRMWARE 290int rt2x00lib_load_firmware(struct rt2x00_dev *rt2x00dev); 291void rt2x00lib_free_firmware(struct rt2x00_dev *rt2x00dev); 292#else 293static inline int rt2x00lib_load_firmware(struct rt2x00_dev *rt2x00dev) 294{ 295 return 0; 296} 297static inline void rt2x00lib_free_firmware(struct rt2x00_dev *rt2x00dev) 298{ 299} 300#endif /* CONFIG_RT2X00_LIB_FIRMWARE */ 301 302/* 303 * Debugfs handlers. 304 */ 305#ifdef CONFIG_RT2X00_LIB_DEBUGFS 306void rt2x00debug_register(struct rt2x00_dev *rt2x00dev); 307void rt2x00debug_deregister(struct rt2x00_dev *rt2x00dev); 308void rt2x00debug_update_crypto(struct rt2x00_dev *rt2x00dev, 309 struct rxdone_entry_desc *rxdesc); 310#else 311static inline void rt2x00debug_register(struct rt2x00_dev *rt2x00dev) 312{ 313} 314 315static inline void rt2x00debug_deregister(struct rt2x00_dev *rt2x00dev) 316{ 317} 318 319static inline void rt2x00debug_update_crypto(struct rt2x00_dev *rt2x00dev, 320 struct rxdone_entry_desc *rxdesc) 321{ 322} 323#endif /* CONFIG_RT2X00_LIB_DEBUGFS */ 324 325/* 326 * Crypto handlers. 327 */ 328#ifdef CONFIG_RT2X00_LIB_CRYPTO 329enum cipher rt2x00crypto_key_to_cipher(struct ieee80211_key_conf *key); 330void rt2x00crypto_create_tx_descriptor(struct queue_entry *entry, 331 struct txentry_desc *txdesc); 332unsigned int rt2x00crypto_tx_overhead(struct rt2x00_dev *rt2x00dev, 333 struct sk_buff *skb); 334void rt2x00crypto_tx_copy_iv(struct sk_buff *skb, 335 struct txentry_desc *txdesc); 336void rt2x00crypto_tx_remove_iv(struct sk_buff *skb, 337 struct txentry_desc *txdesc); 338void rt2x00crypto_tx_insert_iv(struct sk_buff *skb, unsigned int header_length); 339void rt2x00crypto_rx_insert_iv(struct sk_buff *skb, 340 unsigned int header_length, 341 struct rxdone_entry_desc *rxdesc); 342#else 343static inline enum cipher rt2x00crypto_key_to_cipher(struct ieee80211_key_conf *key) 344{ 345 return CIPHER_NONE; 346} 347 348static inline void rt2x00crypto_create_tx_descriptor(struct queue_entry *entry, 349 struct txentry_desc *txdesc) 350{ 351} 352 353static inline unsigned int rt2x00crypto_tx_overhead(struct rt2x00_dev *rt2x00dev, 354 struct sk_buff *skb) 355{ 356 return 0; 357} 358 359static inline void rt2x00crypto_tx_copy_iv(struct sk_buff *skb, 360 struct txentry_desc *txdesc) 361{ 362} 363 364static inline void rt2x00crypto_tx_remove_iv(struct sk_buff *skb, 365 struct txentry_desc *txdesc) 366{ 367} 368 369static inline void rt2x00crypto_tx_insert_iv(struct sk_buff *skb, 370 unsigned int header_length) 371{ 372} 373 374static inline void rt2x00crypto_rx_insert_iv(struct sk_buff *skb, 375 unsigned int header_length, 376 struct rxdone_entry_desc *rxdesc) 377{ 378} 379#endif /* CONFIG_RT2X00_LIB_CRYPTO */ 380 381/* 382 * HT handlers. 383 */ 384#ifdef CONFIG_RT2X00_LIB_HT 385void rt2x00ht_create_tx_descriptor(struct queue_entry *entry, 386 struct txentry_desc *txdesc, 387 const struct rt2x00_rate *hwrate); 388 389u16 rt2x00ht_center_channel(struct rt2x00_dev *rt2x00dev, 390 struct ieee80211_conf *conf); 391#else 392static inline void rt2x00ht_create_tx_descriptor(struct queue_entry *entry, 393 struct txentry_desc *txdesc, 394 const struct rt2x00_rate *hwrate) 395{ 396} 397 398static inline u16 rt2x00ht_center_channel(struct rt2x00_dev *rt2x00dev, 399 struct ieee80211_conf *conf) 400{ 401 return conf->channel->hw_value; 402} 403#endif /* CONFIG_RT2X00_LIB_HT */ 404 405/* 406 * RFkill handlers. 407 */ 408static inline void rt2x00rfkill_register(struct rt2x00_dev *rt2x00dev) 409{ 410 if (test_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags)) 411 wiphy_rfkill_start_polling(rt2x00dev->hw->wiphy); 412} 413 414static inline void rt2x00rfkill_unregister(struct rt2x00_dev *rt2x00dev) 415{ 416 if (test_bit(CONFIG_SUPPORT_HW_BUTTON, &rt2x00dev->flags)) 417 wiphy_rfkill_stop_polling(rt2x00dev->hw->wiphy); 418} 419 420/* 421 * LED handlers 422 */ 423#ifdef CONFIG_RT2X00_LIB_LEDS 424void rt2x00leds_led_quality(struct rt2x00_dev *rt2x00dev, int rssi); 425void rt2x00led_led_activity(struct rt2x00_dev *rt2x00dev, bool enabled); 426void rt2x00leds_led_assoc(struct rt2x00_dev *rt2x00dev, bool enabled); 427void rt2x00leds_led_radio(struct rt2x00_dev *rt2x00dev, bool enabled); 428void rt2x00leds_register(struct rt2x00_dev *rt2x00dev); 429void rt2x00leds_unregister(struct rt2x00_dev *rt2x00dev); 430void rt2x00leds_suspend(struct rt2x00_dev *rt2x00dev); 431void rt2x00leds_resume(struct rt2x00_dev *rt2x00dev); 432#else 433static inline void rt2x00leds_led_quality(struct rt2x00_dev *rt2x00dev, 434 int rssi) 435{ 436} 437 438static inline void rt2x00led_led_activity(struct rt2x00_dev *rt2x00dev, 439 bool enabled) 440{ 441} 442 443static inline void rt2x00leds_led_assoc(struct rt2x00_dev *rt2x00dev, 444 bool enabled) 445{ 446} 447 448static inline void rt2x00leds_led_radio(struct rt2x00_dev *rt2x00dev, 449 bool enabled) 450{ 451} 452 453static inline void rt2x00leds_register(struct rt2x00_dev *rt2x00dev) 454{ 455} 456 457static inline void rt2x00leds_unregister(struct rt2x00_dev *rt2x00dev) 458{ 459} 460 461static inline void rt2x00leds_suspend(struct rt2x00_dev *rt2x00dev) 462{ 463} 464 465static inline void rt2x00leds_resume(struct rt2x00_dev *rt2x00dev) 466{ 467} 468#endif /* CONFIG_RT2X00_LIB_LEDS */ 469 470#endif /* RT2X00LIB_H */ 471