📄 rt2x00.h
字号:
/* Copyright (C) 2004 - 2007 rt2x00 SourceForge Project <http://rt2x00.serialmonkey.com> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *//* Module: rt2x00 Abstract: rt2x00 global information. */#ifndef RT2X00_H#define RT2X00_H#include <linux/bitops.h>#include <linux/prefetch.h>#include <linux/skbuff.h>#include <linux/workqueue.h>#include <linux/firmware.h>#include <net/mac80211.h>#include "rt2x00debug.h"#include "rt2x00reg.h"#include "rt2x00ring.h"/* * Module information. * DRV_NAME should be set within the individual module source files. */#define DRV_VERSION "2.0.10"#define DRV_PROJECT "http://rt2x00.serialmonkey.com"/* * Debug definitions. * Debug output has to be enabled during compile time. */#define DEBUG_PRINTK_MSG(__dev, __kernlvl, __lvl, __msg, __args...) \ printk(__kernlvl "%s -> %s: %s - " __msg, \ wiphy_name((__dev)->hw->wiphy), __FUNCTION__, __lvl, ##__args)#define DEBUG_PRINTK_PROBE(__kernlvl, __lvl, __msg, __args...) \ printk(__kernlvl "%s -> %s: %s - " __msg, \ DRV_NAME, __FUNCTION__, __lvl, ##__args)#ifdef CONFIG_RT2X00_DEBUG#define DEBUG_PRINTK(__dev, __kernlvl, __lvl, __msg, __args...) \ DEBUG_PRINTK_MSG(__dev, __kernlvl, __lvl, __msg, ##__args);#else#define DEBUG_PRINTK(__dev, __kernlvl, __lvl, __msg, __args...) \ do { } while (0)#endif /* CONFIG_RT2X00_DEBUG *//* * Various debug levels. * The debug levels PANIC and ERROR both indicate serious problems, * for this reason they should never be ignored. * The special ERROR_PROBE message is for messages that are generated * when the rt2x00_dev is not yet initialized. */#define PANIC(__dev, __msg, __args...) \ DEBUG_PRINTK_MSG(__dev, KERN_CRIT, "Panic", __msg, ##__args)#define ERROR(__dev, __msg, __args...) \ DEBUG_PRINTK_MSG(__dev, KERN_ERR, "Error", __msg, ##__args)#define ERROR_PROBE(__msg, __args...) \ DEBUG_PRINTK_PROBE(KERN_ERR, "Error", __msg, ##__args)#define WARNING(__dev, __msg, __args...) \ DEBUG_PRINTK(__dev, KERN_WARNING, "Warning", __msg, ##__args)#define NOTICE(__dev, __msg, __args...) \ DEBUG_PRINTK(__dev, KERN_NOTICE, "Notice", __msg, ##__args)#define INFO(__dev, __msg, __args...) \ DEBUG_PRINTK(__dev, KERN_INFO, "Info", __msg, ##__args)#define DEBUG(__dev, __msg, __args...) \ DEBUG_PRINTK(__dev, KERN_DEBUG, "Debug", __msg, ##__args)#define EEPROM(__dev, __msg, __args...) \ DEBUG_PRINTK(__dev, KERN_DEBUG, "EEPROM recovery", __msg, ##__args)/* * Ring sizes. * Ralink PCI devices demand the Frame size to be a multiple of 128 bytes. * DATA_FRAME_SIZE is used for TX, RX, ATIM and PRIO rings. * MGMT_FRAME_SIZE is used for the BEACON ring. */#define DATA_FRAME_SIZE 2432#define MGMT_FRAME_SIZE 256/* * Number of entries in a packet ring. * PCI devices only need 1 Beacon entry, * but USB devices require a second because they * have to send a Guardian byte first. */#define RX_ENTRIES 12#define TX_ENTRIES 12#define ATIM_ENTRIES 1#define BEACON_ENTRIES 2/* * Standard timing and size defines. * These values should follow the ieee80211 specifications. */#define ACK_SIZE 14#define IEEE80211_HEADER 24#define PLCP 48#define BEACON 100#define PREAMBLE 144#define SHORT_PREAMBLE 72#define SLOT_TIME 20#define SHORT_SLOT_TIME 9#define SIFS 10#define PIFS ( SIFS + SLOT_TIME )#define SHORT_PIFS ( SIFS + SHORT_SLOT_TIME )#define DIFS ( PIFS + SLOT_TIME )#define SHORT_DIFS ( SHORT_PIFS + SHORT_SLOT_TIME )#define EIFS ( SIFS + (8 * (IEEE80211_HEADER + ACK_SIZE)) )/* * IEEE802.11 header defines */static inline int is_rts_frame(u16 fc){ return !!(((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) && ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_RTS));}static inline int is_cts_frame(u16 fc){ return !!(((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) && ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_CTS));}static inline int is_probe_resp(u16 fc){ return !!(((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) && ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PROBE_RESP));}/* * Chipset identification * The chipset on the device is composed of a RT and RF chip. * The chipset combination is important for determining device capabilities. */struct rt2x00_chip { u16 rt;#define RT2460 0x0101#define RT2560 0x0201#define RT2570 0x1201#define RT2561s 0x0301 /* Turbo */#define RT2561 0x0302#define RT2661 0x0401#define RT2571 0x1300 u16 rf; u32 rev;};/* * RF register values that belong to a particular channel. */struct rf_channel { int channel; u32 rf1; u32 rf2; u32 rf3; u32 rf4;};/* * To optimize the quality of the link we need to store * the quality of received frames and periodically * optimize the link. */struct link { /* * Link tuner counter * The number of times the link has been tuned * since the radio has been switched on. */ u32 count; /* * Statistics required for Link tuning. * For the average RSSI value we use the "Walking average" approach. * When adding RSSI to the average value the following calculation * is needed: * * avg_rssi = ((avg_rssi * 7) + rssi) / 8; * * The advantage of this approach is that we only need 1 variable * to store the average in (No need for a count and a total). * But more importantly, normal average values will over time * move less and less towards newly added values this results * that with link tuning, the device can have a very good RSSI * for a few minutes but when the device is moved away from the AP * the average will not decrease fast enough to compensate. * The walking average compensates this and will move towards * the new values correctly allowing a effective link tuning. */ int avg_rssi; int vgc_level; int false_cca; /* * Statistics required for Signal quality calculation. * For calculating the Signal quality we have to determine * the total number of success and failed RX and TX frames. * After that we also use the average RSSI value to help * determining the signal quality. * For the calculation we will use the following algorithm: * * rssi_percentage = (avg_rssi * 100) / rssi_offset * rx_percentage = (rx_success * 100) / rx_total * tx_percentage = (tx_success * 100) / tx_total * avg_signal = ((WEIGHT_RSSI * avg_rssi) + * (WEIGHT_TX * tx_percentage) + * (WEIGHT_RX * rx_percentage)) / 100 * * This value should then be checked to not be greated then 100. */ int rx_percentage; int rx_success; int rx_failed; int tx_percentage; int tx_success; int tx_failed;#define WEIGHT_RSSI 20#define WEIGHT_RX 40#define WEIGHT_TX 40 /* * Work structure for scheduling periodic link tuning. */ struct delayed_work work;};/* * Clear all counters inside the link structure. * This can be easiest achieved by memsetting everything * except for the work structure at the end. */static inline void rt2x00_clear_link(struct link *link){ memset(link, 0x00, sizeof(*link) - sizeof(link->work)); link->rx_percentage = 50; link->tx_percentage = 50;}/* * Update the rssi using the walking average approach. */static inline void rt2x00_update_link_rssi(struct link *link, int rssi){ if (!link->avg_rssi) link->avg_rssi = rssi; else link->avg_rssi = ((link->avg_rssi * 7) + rssi) / 8;}/* * When the avg_rssi is unset or no frames have been received), * we need to return the default value which needs to be less * than -80 so the device will select the maximum sensitivity. */static inline int rt2x00_get_link_rssi(struct link *link){ return (link->avg_rssi && link->rx_success) ? link->avg_rssi : -128;}/* * Interface structure * Configuration details about the current interface. */struct interface { /* * Interface identification. The value is assigned * to us by the 80211 stack, and is used to request * new beacons. */ int id; /* * Current working type (IEEE80211_IF_TYPE_*). * When set to INVALID_INTERFACE, no interface is configured. */ int type;#define INVALID_INTERFACE IEEE80211_IF_TYPE_INVALID /* * MAC of the device. */ u8 mac[ETH_ALEN]; /* * BBSID of the AP to associate with. */ u8 bssid[ETH_ALEN]; /* * Store the packet filter mode for the current interface. */ unsigned int filter;};static inline int is_interface_present(struct interface *intf){ return !!intf->id;}static inline int is_interface_type(struct interface *intf, int type){ return intf->type == type;}/* * Details about the supported modes, rates and channels * of a particular chipset. This is used by rt2x00lib * to build the ieee80211_hw_mode array for mac80211. */struct hw_mode_spec { /* * Number of modes, rates and channels. */ int num_modes; int num_rates; int num_channels; /* * txpower values. */ const u8 *tx_power_a; const u8 *tx_power_bg; u8 tx_power_default; /* * Device/chipset specific value. */ const struct rf_channel *channels;};/* * Configuration structure wrapper around the * mac80211 configuration structure. * When mac80211 configures the driver, rt2x00lib * can precalculate values which are equal for all * rt2x00 drivers. Those values can be stored in here. */struct rt2x00lib_conf { struct ieee80211_conf *conf; struct rf_channel rf; int phymode; int basic_rates; int slot_time; short sifs; short pifs; short difs; short eifs;};/* * rt2x00lib callback functions. */struct rt2x00lib_ops { /* * Interrupt handlers. */ irq_handler_t irq_handler; /* * Device init handlers. */ int (*probe_hw) (struct rt2x00_dev *rt2x00dev); char *(*get_firmware_name) (struct rt2x00_dev *rt2x00dev); int (*load_firmware) (struct rt2x00_dev *rt2x00dev, void *data, const size_t len); /* * Device initialization/deinitialization handlers. */ int (*initialize) (struct rt2x00_dev *rt2x00dev); void (*uninitialize) (struct rt2x00_dev *rt2x00dev); /* * Radio control handlers. */ int (*set_device_state) (struct rt2x00_dev *rt2x00dev, enum dev_state state); int (*rfkill_poll) (struct rt2x00_dev *rt2x00dev); void (*link_stats) (struct rt2x00_dev *rt2x00dev); void (*reset_tuner) (struct rt2x00_dev *rt2x00dev); void (*link_tuner) (struct rt2x00_dev *rt2x00dev); /* * TX control handlers */ void (*write_tx_desc) (struct rt2x00_dev *rt2x00dev, struct data_desc *txd, struct txdata_entry_desc *desc, struct ieee80211_hdr *ieee80211hdr, unsigned int length, struct ieee80211_tx_control *control); int (*write_tx_data) (struct rt2x00_dev *rt2x00dev, struct data_ring *ring, struct sk_buff *skb, struct ieee80211_tx_control *control); int (*get_tx_data_len) (struct rt2x00_dev *rt2x00dev, struct sk_buff *skb); void (*kick_tx_queue) (struct rt2x00_dev *rt2x00dev,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -