亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? rt2x00debug.c

?? r73模塊的無線網(wǎng)卡在Linux下的驅(qū)動程序
?? C
字號:
/*	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: rt2x00lib	Abstract: rt2x00 debugfs specific routines. */#ifdef RT2X00DEBUGFS#include <linux/debugfs.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/uaccess.h>#include "rt_config.h"#define PRINT_LINE_LEN_MAX 32struct rt2x00debug_intf {	/*	 * Pointer to driver structure where	 * this debugfs entry belongs to.	 */	struct rt2x00_dev *rt2x00dev;	/*	 * Reference to the rt2x00debug structure	 * which can be used to communicate with	 * the registers.	 */	const struct rt2x00debug *debug;	/*	 * Debugfs entries for:	 * - driver folder	 * - driver file	 * - chipset file	 * - register offset/value files	 * - eeprom offset/value files	 * - bbp offset/value files	 * - rf offset/value files	 */	struct dentry *driver_folder;	struct dentry *driver_entry;	struct dentry *chipset_entry;	struct dentry *csr_off_entry;	struct dentry *csr_val_entry;	struct dentry *eeprom_off_entry;	struct dentry *eeprom_val_entry;	struct dentry *bbp_off_entry;	struct dentry *bbp_val_entry;	struct dentry *rf_off_entry;	struct dentry *rf_val_entry;	/*	 * Driver and chipset files will use a data buffer	 * that has been created in advance. This will simplify	 * the code since we can use the debugfs functions.	 */	struct debugfs_blob_wrapper driver_blob;	struct debugfs_blob_wrapper chipset_blob;	/*	 * Requested offset for each register type.	 */	unsigned int offset_csr;	unsigned int offset_eeprom;	unsigned int offset_bbp;	unsigned int offset_rf;};static int rt2x00debug_file_open(struct inode *inode, struct file *file){	struct rt2x00debug_intf *intf = inode->i_private;	file->private_data = inode->i_private;	if (!try_module_get(intf->debug->owner))		return -EBUSY;	return 0;}static int rt2x00debug_file_release(struct inode *inode, struct file *file){	struct rt2x00debug_intf *intf = file->private_data;	module_put(intf->debug->owner);	return 0;}#define RT2X00DEBUGFS_OPS_READ(__name, __format, __type)	\static ssize_t rt2x00debug_read_##__name(struct file *file,	\					 char __user *buf,	\					 size_t length,		\					 loff_t *offset)	\{								\	struct rt2x00debug_intf *intf =	file->private_data;	\	const struct rt2x00debug *debug = intf->debug;		\	char line[16];						\	size_t size;						\	__type value;						\								\	if (*offset)						\		return 0;					\								\	if (intf->offset_##__name >= debug->__name.word_count)	\		return -EINVAL;					\								\	debug->__name.read(intf->rt2x00dev,			\			   intf->offset_##__name, &value);	\								\	size = sprintf(line, __format, value);			\								\	if (copy_to_user(buf, line, size))			\		return -EFAULT;					\								\	*offset += size;					\	return size;						\}#define RT2X00DEBUGFS_OPS_WRITE(__name, __type)			\static ssize_t rt2x00debug_write_##__name(struct file *file,	\					  const char __user *buf,\					  size_t length,	\					  loff_t *offset)	\{								\	struct rt2x00debug_intf *intf =	file->private_data;	\	const struct rt2x00debug *debug = intf->debug;		\	char line[16];						\	size_t size;						\	__type value;						\								\	if (*offset)						\		return 0;					\								\	if (!capable(CAP_NET_ADMIN))				\		return -EPERM;					\								\	if (intf->offset_##__name >= debug->__name.word_count)	\		return -EINVAL;					\								\	if (copy_from_user(line, buf, length))			\		return -EFAULT;					\								\	size = strlen(line);					\	value = simple_strtoul(line, NULL, 0);			\								\	debug->__name.write(intf->rt2x00dev,			\			    intf->offset_##__name, value);	\								\	*offset += size;					\	return size;						\}#define RT2X00DEBUGFS_OPS(__name, __format, __type)		\RT2X00DEBUGFS_OPS_READ(__name, __format, __type);		\RT2X00DEBUGFS_OPS_WRITE(__name, __type);			\								\static const struct file_operations rt2x00debug_fop_##__name = {\	.owner		= THIS_MODULE,				\	.read		= rt2x00debug_read_##__name,		\	.write		= rt2x00debug_write_##__name,		\	.open		= rt2x00debug_file_open,		\	.release	= rt2x00debug_file_release,		\};RT2X00DEBUGFS_OPS(csr, "0x%.8x\n", u32);RT2X00DEBUGFS_OPS(eeprom, "0x%.4x\n", u16);RT2X00DEBUGFS_OPS(bbp, "0x%.2x\n", u8);RT2X00DEBUGFS_OPS(rf, "0x%.8x\n", u32);static struct dentry *rt2x00debug_create_file_driver(const char *name,						     struct rt2x00debug_intf						     *intf,						     struct debugfs_blob_wrapper						     *blob){	char *data;	data = kzalloc(3 * PRINT_LINE_LEN_MAX, GFP_KERNEL);	if (!data)		return NULL;	blob->data = data;	data += sprintf(data, "driver: %s\n", DRIVER_NAME);	data += sprintf(data, "version: %s\n", DRIVER_VERSION);	data += sprintf(data, "compiled: %s %s\n", __DATE__, __TIME__);	blob->size = strlen(blob->data);	return debugfs_create_blob(name, S_IRUGO, intf->driver_folder, blob);}static struct dentry *rt2x00debug_create_file_chipset(const char *name,						      struct rt2x00debug_intf						      *intf,						      struct						      debugfs_blob_wrapper						      *blob){	const struct rt2x00debug *debug = intf->debug;	char *data;	data = kzalloc(4 * PRINT_LINE_LEN_MAX, GFP_KERNEL);	if (!data)		return NULL;	blob->data = data;	data += sprintf(data, "csr length: %d\n", debug->csr.word_count);	data += sprintf(data, "eeprom length: %d\n", debug->eeprom.word_count);	data += sprintf(data, "bbp length: %d\n", debug->bbp.word_count);	data += sprintf(data, "rf length: %d\n", debug->rf.word_count);	blob->size = strlen(blob->data);	return debugfs_create_blob(name, S_IRUGO, intf->driver_folder, blob);}void rt2x00debug_register(struct rt2x00_dev *rt2x00dev){	const struct rt2x00debug *debug = rt2x00dev->ops->debugfs;	struct rt2x00debug_intf *intf;	intf = kzalloc(sizeof(struct rt2x00debug_intf), GFP_KERNEL);	if (!intf)		return;	intf->debug = debug;	intf->rt2x00dev = rt2x00dev;	rt2x00dev->debugfs_intf = intf;	intf->driver_folder =	    debugfs_create_dir(DRIVER_NAME, NULL);	if (IS_ERR(intf->driver_folder))		goto exit;	intf->driver_entry =	    rt2x00debug_create_file_driver("driver", intf, &intf->driver_blob);	if (IS_ERR(intf->driver_entry))		goto exit;	intf->chipset_entry =	    rt2x00debug_create_file_chipset("chipset",					    intf, &intf->chipset_blob);	if (IS_ERR(intf->chipset_entry))		goto exit;#define RT2X00DEBUGFS_CREATE_ENTRY(__intf, __name)		\({								\	(__intf)->__name##_off_entry =				\	    debugfs_create_u32(__stringify(__name) "_offset",	\			       S_IRUGO | S_IWUSR,		\			       (__intf)->driver_folder,		\			       &(__intf)->offset_##__name);	\	if (IS_ERR((__intf)->__name##_off_entry))		\		goto exit;					\								\	(__intf)->__name##_val_entry =				\	    debugfs_create_file(__stringify(__name) "_value",	\				S_IRUGO | S_IWUSR,		\				(__intf)->driver_folder,	\				(__intf), &rt2x00debug_fop_##__name);\	if (IS_ERR((__intf)->__name##_val_entry))		\		goto exit;					\})	RT2X00DEBUGFS_CREATE_ENTRY(intf, csr);	RT2X00DEBUGFS_CREATE_ENTRY(intf, eeprom);	RT2X00DEBUGFS_CREATE_ENTRY(intf, bbp);	RT2X00DEBUGFS_CREATE_ENTRY(intf, rf);#undef RT2X00DEBUGFS_CREATE_ENTRY	return;exit:	rt2x00debug_deregister(rt2x00dev);	return;}void rt2x00debug_deregister(struct rt2x00_dev *rt2x00dev){	const struct rt2x00debug_intf *intf = rt2x00dev->debugfs_intf;	if (unlikely(!intf))		return;	debugfs_remove(intf->rf_val_entry);	debugfs_remove(intf->rf_off_entry);	debugfs_remove(intf->bbp_val_entry);	debugfs_remove(intf->bbp_off_entry);	debugfs_remove(intf->eeprom_val_entry);	debugfs_remove(intf->eeprom_off_entry);	debugfs_remove(intf->csr_val_entry);	debugfs_remove(intf->csr_off_entry);	debugfs_remove(intf->chipset_entry);	debugfs_remove(intf->driver_entry);	debugfs_remove(intf->driver_folder);	kfree(intf->chipset_blob.data);	kfree(intf->driver_blob.data);	kfree(intf);	rt2x00dev->debugfs_intf = NULL;}#endif /* RT2X00DEBUGFS */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲一区字幕| 亚洲自拍偷拍综合| 国产综合久久久久影院| 久久99国内精品| 日韩欧美123| 亚洲va韩国va欧美va精品| 黑人精品欧美一区二区蜜桃| 日韩你懂的电影在线观看| 亚洲色图清纯唯美| 欧美怡红院视频| 午夜成人免费电影| 日韩欧美在线1卡| 一区二区三区在线播| 欧美片网站yy| 亚洲一区二区在线免费看| 欧美一区二区三区公司| 日韩一区二区免费在线观看| 麻豆久久久久久久| 国产精品网友自拍| 国产乱人伦偷精品视频免下载| 欧美片在线播放| 国产在线播放一区| 欧美成人女星排名| 成年人网站91| 日韩成人av影视| 日本一区二区三区dvd视频在线| 99视频有精品| 亚洲欧洲另类国产综合| 在线免费观看日本一区| 亚洲免费观看高清完整版在线| 欧美精品1区2区| 大白屁股一区二区视频| 日韩精品亚洲一区| 日韩一区二区三区在线| 国产成人午夜高潮毛片| 亚洲高清在线精品| 国产欧美一区在线| 成人综合在线网站| 日韩精品电影在线观看| 国产精品色一区二区三区| 911精品国产一区二区在线| 日韩精品免费专区| 综合欧美一区二区三区| 精品久久久网站| 国产成人精品免费一区二区| 亚洲国产成人av网| 国产精品久久久久一区| 日韩美女视频在线| 欧美性猛片aaaaaaa做受| 国产成人在线免费观看| 中文字幕色av一区二区三区| 99国产精品国产精品久久| 亚洲情趣在线观看| 欧美三级电影在线看| 国产大陆亚洲精品国产| 老司机午夜精品| 偷窥少妇高潮呻吟av久久免费| 这里只有精品电影| 国产在线视频一区二区| 亚洲成av人片一区二区三区| 日韩视频一区二区在线观看| 欧美自拍偷拍午夜视频| 奇米一区二区三区av| 亚洲午夜羞羞片| 亚洲欧美日韩综合aⅴ视频| 欧美韩日一区二区三区四区| 色香蕉久久蜜桃| 麻豆精品一区二区av白丝在线| 亚洲成人激情综合网| 一区二区三区中文字幕在线观看| 91精品视频网| 成人中文字幕合集| 亚洲激情五月婷婷| 日韩免费一区二区| 91在线视频播放地址| 色先锋资源久久综合| 成人精品视频.| 日韩中文字幕不卡| 国产精品久久毛片a| 国产女人水真多18毛片18精品视频| 欧美mv和日韩mv国产网站| 色综合天天狠狠| 91一区二区在线观看| 久久精品二区亚洲w码| 免费美女久久99| 亚洲欧美一区二区三区极速播放| 欧美一级午夜免费电影| 欧美一级欧美一级在线播放| 日韩欧美中文字幕制服| 精品日韩成人av| 久久久国产午夜精品| 中文字幕久久午夜不卡| 亚洲欧美自拍偷拍| 国产无一区二区| 日韩一区二区三区在线视频| 精品美女在线观看| 欧美久久一二区| 日韩手机在线导航| 欧美日韩国产美女| 日韩精品在线一区二区| 精品视频在线看| 欧美一级日韩免费不卡| 久久―日本道色综合久久| 5566中文字幕一区二区电影| 精品日韩av一区二区| 欧美肥大bbwbbw高潮| 欧美性生活久久| 91污在线观看| 成人中文字幕合集| 成人性生交大合| 欧美亚男人的天堂| 日本伦理一区二区| 日韩久久免费av| 自拍偷自拍亚洲精品播放| 亚洲成人一区二区在线观看| 精品一二三四区| 91福利国产精品| 久久久久久久av麻豆果冻| 日韩精品一区二区三区swag | 国产v日产∨综合v精品视频| 日韩av不卡一区二区| 国产suv一区二区三区88区| 欧美视频一二三区| 欧洲另类一二三四区| 日韩色视频在线观看| 中文字幕欧美一| 久久国产三级精品| 一本色道久久加勒比精品| 精品欧美久久久| 精品福利一二区| 亚洲第一电影网| 波多野结衣中文字幕一区 | 中文字幕亚洲区| 日韩精品久久久久久| 97久久精品人人澡人人爽| 日韩一区二区影院| 一区二区欧美视频| 色欧美乱欧美15图片| 欧美电视剧在线观看完整版| 一区二区三区四区不卡视频| 国产伦理精品不卡| zzijzzij亚洲日本少妇熟睡| 日韩精品一区国产麻豆| 亚洲午夜激情网站| 精品一区二区三区在线视频| 99麻豆久久久国产精品免费| 色婷婷综合久久久中文字幕| 久久精品亚洲一区二区三区浴池| 中文字幕一区二区三区色视频| 中文字幕亚洲欧美在线不卡| 国产成人精品影院| 一本久久综合亚洲鲁鲁五月天| 欧美裸体一区二区三区| 日韩精品一区二区三区四区 | 中文字幕欧美区| 一区二区成人在线观看| 日本网站在线观看一区二区三区| 色婷婷精品久久二区二区蜜臀av| 欧美激情一区二区三区全黄| 国产一区福利在线| 色狠狠色狠狠综合| 亚洲精品午夜久久久| 日本免费新一区视频| 欧美自拍偷拍午夜视频| 伊人婷婷欧美激情| 色呦呦日韩精品| 精品国产91九色蝌蚪| 经典三级视频一区| 欧美大胆一级视频| 韩国女主播一区| 欧美三级电影一区| 欧美国产精品一区| 五月天精品一区二区三区| 国产精品综合一区二区| 欧美午夜寂寞影院| 亚洲无线码一区二区三区| 国产麻豆欧美日韩一区| 国产三级精品在线| 麻豆精品精品国产自在97香蕉| 91在线视频观看| 久久色成人在线| 国产精品一二三区| 日本一区二区三区国色天香| 天堂va蜜桃一区二区三区漫画版| 欧美蜜桃一区二区三区| 日本免费在线视频不卡一不卡二| 色综合久久精品| 亚洲国产色一区| 日韩一区二区三区免费观看| 一区二区欧美在线观看| 欧美精品久久一区| 国内精品伊人久久久久影院对白| 欧美日韩一级片网站| 人人超碰91尤物精品国产| 欧美一二三区精品| 高清国产一区二区| 亚洲已满18点击进入久久| 日韩欧美的一区| 成人av影院在线| 亚洲自拍偷拍综合|