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

📄 wlan_debug.c

📁 marvell wifi driver GSPI-8385-LINUX-OMAP1510-5.0.10.p0-144-src.rar
💻 C
字号:
/*
 *  /proc/net/wlan debug counters 
 */

#include  "include.h"

struct debug_data {
  char  name[32];
  u32   size;
  u32   addr;
};

#define item_size(n) (sizeof ((wlan_adapter *)0)->n)
#define item_addr(n) ((u32) &((wlan_adapter *)0)->n)

// 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 = sizeof(items)/sizeof(items[0]);

int string_to_number(char *s)
{
  int r = 0;
  int base = 0;

  if ((strncmp(s, "0x", 2) == 0) || (strncmp(s, "0X", 2) == 0))
    base = 16;
  else
    base = 10;

  if (base == 16)
    s += 2;

  for (s = s; *s !=0; s++)
  {
    if ((*s >= 48) && (*s <= 57))
      r = (r * base) + (*s - 48);
    else if ((*s >= 65) && (*s <= 70))
      r = (r * base) + (*s - 55);
    else if ((*s >= 97) && (*s <= 102))
      r = (r * base) + (*s - 87);
    else
      break;
  }

	return r;
}

int wlan_debug_read(char *page, char **s, off_t off, int cnt, int *eof, void *data)
{
  int val = 0;
  char *p = page;
  int i;
  
  struct debug_data *d = (struct debug_data *)data;

  MOD_INC_USE_COUNT;

  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);

	p += sprintf(p, "%s=%d\n", d[i].name, val);

  }

   MOD_DEC_USE_COUNT;
  return p-page;
}

int wlan_debug_write(struct file *f, const char *buf, unsigned long cnt, void *data)
{
  int r,i;
  char *pdata;
  char *p;
  char *p0;
  char *p1;
  char *p2;
  struct debug_data *d = (struct debug_data *)data;

  MOD_INC_USE_COUNT;
  
  pdata = (char *)kmalloc(cnt, GFP_KERNEL);
  if(pdata == NULL)
	  return 0;
  copy_from_user(pdata, buf, cnt);
  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 = string_to_number(p2);
		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;
		break;
	  }while (TRUE);
  }
  kfree(pdata);
  MOD_DEC_USE_COUNT;
  return cnt;
  
}

void wlan_debug_entry(wlan_private *priv, struct net_device *dev)
{
  int i;

  if (priv->proc_entry == NULL)
    return;

  for (i = 0; i < num_of_items; i++)
  {
    items[i].addr += (u32)priv->adapter;
  }
  struct proc_dir_entry *r;
  r = create_proc_entry("debug", 0644, priv->proc_entry);

  if (r == NULL)
      return;

    r->data       = &items[0];
    r->read_proc  = wlan_debug_read;
    r->write_proc = wlan_debug_write;
    r->owner      = THIS_MODULE;

}

void wlan_debug_remove(wlan_private *priv)
{
	remove_proc_entry("debug", priv->proc_entry);
}

⌨️ 快捷键说明

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