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

📄 debugfs.c

📁 linux内核源码
💻 C
📖 第 1 页 / 共 4 页
字号:
				CMD_OPTION_WAITFORRSP, 0, &offval);	mdelay(10);	res = count;out_unlock:	free_page(addr);	return res;}static ssize_t libertas_rdbbp_read(struct file *file, char __user *userbuf,				  size_t count, loff_t *ppos){	wlan_private *priv = file->private_data;	wlan_adapter *adapter = priv->adapter;	struct wlan_offset_value offval;	ssize_t pos = 0;	int ret;	unsigned long addr = get_zeroed_page(GFP_KERNEL);	char *buf = (char *)addr;	offval.offset = priv->bbp_offset;	offval.value = 0;	ret = libertas_prepare_and_send_command(priv,				CMD_BBP_REG_ACCESS, 0,				CMD_OPTION_WAITFORRSP, 0, &offval);	mdelay(10);	pos += snprintf(buf+pos, len-pos, "BBP[0x%x] = 0x%08x\n",				priv->bbp_offset, adapter->offsetvalue.value);	ret = simple_read_from_buffer(userbuf, count, ppos, buf, pos);	free_page(addr);	return ret;}static ssize_t libertas_rdbbp_write(struct file *file,				    const char __user *userbuf,				    size_t count, loff_t *ppos){	wlan_private *priv = file->private_data;	ssize_t res, buf_size;	unsigned long addr = get_zeroed_page(GFP_KERNEL);	char *buf = (char *)addr;	buf_size = min(count, len - 1);	if (copy_from_user(buf, userbuf, buf_size)) {		res = -EFAULT;		goto out_unlock;	}	priv->bbp_offset = simple_strtoul((char *)buf, NULL, 16);	res = count;out_unlock:	free_page(addr);	return res;}static ssize_t libertas_wrbbp_write(struct file *file,				    const char __user *userbuf,				    size_t count, loff_t *ppos){	wlan_private *priv = file->private_data;	ssize_t res, buf_size;	u32 offset, value;	struct wlan_offset_value offval;	unsigned long addr = get_zeroed_page(GFP_KERNEL);	char *buf = (char *)addr;	buf_size = min(count, len - 1);	if (copy_from_user(buf, userbuf, buf_size)) {		res = -EFAULT;		goto out_unlock;	}	res = sscanf(buf, "%x %x", &offset, &value);	if (res != 2) {		res = -EFAULT;		goto out_unlock;	}	offval.offset = offset;	offval.value = value;	res = libertas_prepare_and_send_command(priv,				CMD_BBP_REG_ACCESS, 1,				CMD_OPTION_WAITFORRSP, 0, &offval);	mdelay(10);	res = count;out_unlock:	free_page(addr);	return res;}static ssize_t libertas_rdrf_read(struct file *file, char __user *userbuf,				  size_t count, loff_t *ppos){	wlan_private *priv = file->private_data;	wlan_adapter *adapter = priv->adapter;	struct wlan_offset_value offval;	ssize_t pos = 0;	int ret;	unsigned long addr = get_zeroed_page(GFP_KERNEL);	char *buf = (char *)addr;	offval.offset = priv->rf_offset;	offval.value = 0;	ret = libertas_prepare_and_send_command(priv,				CMD_RF_REG_ACCESS, 0,				CMD_OPTION_WAITFORRSP, 0, &offval);	mdelay(10);	pos += snprintf(buf+pos, len-pos, "RF[0x%x] = 0x%08x\n",				priv->rf_offset, adapter->offsetvalue.value);	ret = simple_read_from_buffer(userbuf, count, ppos, buf, pos);	free_page(addr);	return ret;}static ssize_t libertas_rdrf_write(struct file *file,				    const char __user *userbuf,				    size_t count, loff_t *ppos){	wlan_private *priv = file->private_data;	ssize_t res, buf_size;	unsigned long addr = get_zeroed_page(GFP_KERNEL);	char *buf = (char *)addr;	buf_size = min(count, len - 1);	if (copy_from_user(buf, userbuf, buf_size)) {		res = -EFAULT;		goto out_unlock;	}	priv->rf_offset = simple_strtoul((char *)buf, NULL, 16);	res = count;out_unlock:	free_page(addr);	return res;}static ssize_t libertas_wrrf_write(struct file *file,				    const char __user *userbuf,				    size_t count, loff_t *ppos){	wlan_private *priv = file->private_data;	ssize_t res, buf_size;	u32 offset, value;	struct wlan_offset_value offval;	unsigned long addr = get_zeroed_page(GFP_KERNEL);	char *buf = (char *)addr;	buf_size = min(count, len - 1);	if (copy_from_user(buf, userbuf, buf_size)) {		res = -EFAULT;		goto out_unlock;	}	res = sscanf(buf, "%x %x", &offset, &value);	if (res != 2) {		res = -EFAULT;		goto out_unlock;	}	offval.offset = offset;	offval.value = value;	res = libertas_prepare_and_send_command(priv,				CMD_RF_REG_ACCESS, 1,				CMD_OPTION_WAITFORRSP, 0, &offval);	mdelay(10);	res = count;out_unlock:	free_page(addr);	return res;}#define FOPS(fread, fwrite) { \	.owner = THIS_MODULE, \	.open = open_file_generic, \	.read = (fread), \	.write = (fwrite), \}struct libertas_debugfs_files {	char *name;	int perm;	struct file_operations fops;};static struct libertas_debugfs_files debugfs_files[] = {	{ "info", 0444, FOPS(libertas_dev_info, write_file_dummy), },	{ "getscantable", 0444, FOPS(libertas_getscantable,					write_file_dummy), },	{ "sleepparams", 0644, FOPS(libertas_sleepparams_read,				libertas_sleepparams_write), },	{ "extscan", 0600, FOPS(NULL, libertas_extscan), },	{ "setuserscan", 0600, FOPS(NULL, libertas_setuserscan), },};static struct libertas_debugfs_files debugfs_events_files[] = {	{"low_rssi", 0644, FOPS(libertas_lowrssi_read,				libertas_lowrssi_write), },	{"low_snr", 0644, FOPS(libertas_lowsnr_read,				libertas_lowsnr_write), },	{"failure_count", 0644, FOPS(libertas_failcount_read,				libertas_failcount_write), },	{"beacon_missed", 0644, FOPS(libertas_bcnmiss_read,				libertas_bcnmiss_write), },	{"high_rssi", 0644, FOPS(libertas_highrssi_read,				libertas_highrssi_write), },	{"high_snr", 0644, FOPS(libertas_highsnr_read,				libertas_highsnr_write), },};static struct libertas_debugfs_files debugfs_regs_files[] = {	{"rdmac", 0644, FOPS(libertas_rdmac_read, libertas_rdmac_write), },	{"wrmac", 0600, FOPS(NULL, libertas_wrmac_write), },	{"rdbbp", 0644, FOPS(libertas_rdbbp_read, libertas_rdbbp_write), },	{"wrbbp", 0600, FOPS(NULL, libertas_wrbbp_write), },	{"rdrf", 0644, FOPS(libertas_rdrf_read, libertas_rdrf_write), },	{"wrrf", 0600, FOPS(NULL, libertas_wrrf_write), },};void libertas_debugfs_init(void){	if (!libertas_dir)		libertas_dir = debugfs_create_dir("libertas_wireless", NULL);	return;}void libertas_debugfs_remove(void){	if (libertas_dir)		 debugfs_remove(libertas_dir);	return;}void libertas_debugfs_init_one(wlan_private *priv, struct net_device *dev){	int i;	struct libertas_debugfs_files *files;	if (!libertas_dir)		goto exit;	priv->debugfs_dir = debugfs_create_dir(dev->name, libertas_dir);	if (!priv->debugfs_dir)		goto exit;	for (i=0; i<ARRAY_SIZE(debugfs_files); i++) {		files = &debugfs_files[i];		priv->debugfs_files[i] = debugfs_create_file(files->name,							     files->perm,							     priv->debugfs_dir,							     priv,							     &files->fops);	}	priv->events_dir = debugfs_create_dir("subscribed_events", priv->debugfs_dir);	if (!priv->events_dir)		goto exit;	for (i=0; i<ARRAY_SIZE(debugfs_events_files); i++) {		files = &debugfs_events_files[i];		priv->debugfs_events_files[i] = debugfs_create_file(files->name,							     files->perm,							     priv->events_dir,							     priv,							     &files->fops);	}	priv->regs_dir = debugfs_create_dir("registers", priv->debugfs_dir);	if (!priv->regs_dir)		goto exit;	for (i=0; i<ARRAY_SIZE(debugfs_regs_files); i++) {		files = &debugfs_regs_files[i];		priv->debugfs_regs_files[i] = debugfs_create_file(files->name,							     files->perm,							     priv->regs_dir,							     priv,							     &files->fops);	}#ifdef PROC_DEBUG	libertas_debug_init(priv, dev);#endifexit:	return;}void libertas_debugfs_remove_one(wlan_private *priv){	int i;	for(i=0; i<ARRAY_SIZE(debugfs_regs_files); i++)		debugfs_remove(priv->debugfs_regs_files[i]);	debugfs_remove(priv->regs_dir);	for(i=0; i<ARRAY_SIZE(debugfs_events_files); i++)		debugfs_remove(priv->debugfs_events_files[i]);	debugfs_remove(priv->events_dir);#ifdef PROC_DEBUG	debugfs_remove(priv->debugfs_debug);#endif	for(i=0; i<ARRAY_SIZE(debugfs_files); i++)		debugfs_remove(priv->debugfs_files[i]);	debugfs_remove(priv->debugfs_dir);}/* debug entry */#ifdef PROC_DEBUG#define item_size(n)	(FIELD_SIZEOF(wlan_adapter, n))#define item_addr(n)	(offsetof(wlan_adapter, n))struct debug_data {	char name[32];	u32 size;	size_t addr;};/* To debug any member of wlan_adapter, simply add one line here. */static struct debug_data items[] = {	{"intcounter", item_size(intcounter), item_addr(intcounter)},	{"psmode", item_size(psmode), item_addr(psmode)},	{"psstate", item_size(psstate), item_addr(psstate)},};static int num_of_items = ARRAY_SIZE(items);/** *  @brief proc read function * *  @param page	   pointer to buffer *  @param s       read data starting position *  @param off     offset *  @param cnt     counter *  @param eof     end of file flag *  @param data    data to output *  @return 	   number of output data */static ssize_t wlan_debugfs_read(struct file *file, char __user *userbuf,			size_t count, loff_t *ppos){	int val = 0;	size_t pos = 0;	ssize_t res;	char *p;	int i;	struct debug_data *d;	unsigned long addr = get_zeroed_page(GFP_KERNEL);	char *buf = (char *)addr;	p = buf;	d = (struct debug_data *)file->private_data;	for (i = 0; i < num_of_items; i++) {		if (d[i].size == 1)			val = *((u8 *) d[i].addr);		else if (d[i].size == 2)			val = *((u16 *) d[i].addr);		else if (d[i].size == 4)			val = *((u32 *) d[i].addr);		else if (d[i].size == 8)			val = *((u64 *) d[i].addr);		pos += sprintf(p + pos, "%s=%d\n", d[i].name, val);	}	res = simple_read_from_buffer(userbuf, count, ppos, p, pos);	free_page(addr);	return res;}/** *  @brief proc write function * *  @param f	   file pointer *  @param buf     pointer to data buffer *  @param cnt     data number to write *  @param data    data to write *  @return 	   number of data */static ssize_t wlan_debugfs_write(struct file *f, const char __user *buf,			    size_t cnt, loff_t *ppos){	int r, i;	char *pdata;	char *p;	char *p0;	char *p1;	char *p2;	struct debug_data *d = (struct debug_data *)f->private_data;	pdata = kmalloc(cnt, GFP_KERNEL);	if (pdata == NULL)		return 0;	if (copy_from_user(pdata, buf, cnt)) {		lbs_deb_debugfs("Copy from user failed\n");		kfree(pdata);		return 0;	}	p0 = pdata;	for (i = 0; i < num_of_items; i++) {		do {			p = strstr(p0, d[i].name);			if (p == NULL)				break;			p1 = strchr(p, '\n');			if (p1 == NULL)				break;			p0 = p1++;			p2 = strchr(p, '=');			if (!p2)				break;			p2++;			r = simple_strtoul(p2, NULL, 0);			if (d[i].size == 1)				*((u8 *) d[i].addr) = (u8) r;			else if (d[i].size == 2)				*((u16 *) d[i].addr) = (u16) r;			else if (d[i].size == 4)				*((u32 *) d[i].addr) = (u32) r;			else if (d[i].size == 8)				*((u64 *) d[i].addr) = (u64) r;			break;		} while (1);	}	kfree(pdata);	return (ssize_t)cnt;}static struct file_operations libertas_debug_fops = {	.owner = THIS_MODULE,	.open = open_file_generic,	.write = wlan_debugfs_write,	.read = wlan_debugfs_read,};/** *  @brief create debug proc file * *  @param priv	   pointer wlan_private *  @param dev     pointer net_device *  @return 	   N/A */static void libertas_debug_init(wlan_private * priv, struct net_device *dev){	int i;	if (!priv->debugfs_dir)		return;	for (i = 0; i < num_of_items; i++)		items[i].addr += (size_t) priv->adapter;	priv->debugfs_debug = debugfs_create_file("debug", 0644,						  priv->debugfs_dir, &items[0],						  &libertas_debug_fops);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -