⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rt2x00.h

📁 linux内核源码
💻 H
📖 第 1 页 / 共 2 页
字号:
/*	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 + -