📄 debugfs.c
字号:
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 + -