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

📄 debugfs.c

📁 linux内核源码
💻 C
📖 第 1 页 / 共 4 页
字号:
}static u16 libertas_get_events_bitmap(wlan_private *priv){	wlan_adapter *adapter = priv->adapter;	struct cmd_ctrl_node *pcmdnode;	struct cmd_ds_command *pcmdptr;	struct cmd_ds_802_11_subscribe_event *event;	void *response_buf;	int res;	u16 event_bitmap;	res = libertas_event_initcmd(priv, &response_buf, &pcmdnode, &pcmdptr);	if (res < 0)		return res;	event = &pcmdptr->params.subscribe_event;	event->action = cpu_to_le16(CMD_ACT_GET);	pcmdptr->size = cpu_to_le16(sizeof(*event) + S_DS_GEN);	libertas_queue_cmd(adapter, pcmdnode, 1);	wake_up_interruptible(&priv->waitq);	/* Sleep until response is generated by FW */	wait_event_interruptible(pcmdnode->cmdwait_q,				 pcmdnode->cmdwaitqwoken);	pcmdptr = response_buf;	if (pcmdptr->result) {		lbs_pr_err("%s: fail, result=%d\n", __func__,			   le16_to_cpu(pcmdptr->result));		kfree(response_buf);		return 0;	}	if (le16_to_cpu(pcmdptr->command) != CMD_RET(CMD_802_11_SUBSCRIBE_EVENT)) {		lbs_pr_err("command response incorrect!\n");		kfree(response_buf);		return 0;	}	event = (struct cmd_ds_802_11_subscribe_event *)(response_buf + S_DS_GEN);	event_bitmap = le16_to_cpu(event->events);	kfree(response_buf);	return event_bitmap;}static ssize_t libertas_lowrssi_write(struct file *file,				    const char __user *userbuf,				    size_t count, loff_t *ppos){	wlan_private *priv = file->private_data;	wlan_adapter *adapter = priv->adapter;	ssize_t res, buf_size;	int value, freq, subscribed, cmd_len;	struct cmd_ctrl_node *pcmdnode;	struct cmd_ds_command *pcmdptr;	struct cmd_ds_802_11_subscribe_event *event;	struct mrvlietypes_rssithreshold *rssi_threshold;	void *response_buf;	u16 event_bitmap;	u8 *ptr;	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, "%d %d %d", &value, &freq, &subscribed);	if (res != 3) {		res = -EFAULT;		goto out_unlock;	}	event_bitmap = libertas_get_events_bitmap(priv);	res = libertas_event_initcmd(priv, &response_buf, &pcmdnode, &pcmdptr);	if (res < 0)		goto out_unlock;	event = &pcmdptr->params.subscribe_event;	event->action = cpu_to_le16(CMD_ACT_SET);	pcmdptr->size = cpu_to_le16(S_DS_GEN +		sizeof(struct cmd_ds_802_11_subscribe_event) +		sizeof(struct mrvlietypes_rssithreshold));	cmd_len = S_DS_GEN + sizeof(struct cmd_ds_802_11_subscribe_event);	ptr = (u8*) pcmdptr+cmd_len;	rssi_threshold = (struct mrvlietypes_rssithreshold *)(ptr);	rssi_threshold->header.type = cpu_to_le16(0x0104);	rssi_threshold->header.len = cpu_to_le16(2);	rssi_threshold->rssivalue = value;	rssi_threshold->rssifreq = freq;	event_bitmap |= subscribed ? 0x0001 : 0x0;	event->events = cpu_to_le16(event_bitmap);	libertas_queue_cmd(adapter, pcmdnode, 1);	wake_up_interruptible(&priv->waitq);	/* Sleep until response is generated by FW */	wait_event_interruptible(pcmdnode->cmdwait_q,				 pcmdnode->cmdwaitqwoken);	pcmdptr = response_buf;	if (pcmdptr->result) {		lbs_pr_err("%s: fail, result=%d\n", __func__,			   le16_to_cpu(pcmdptr->result));		kfree(response_buf);		free_page(addr);		return 0;	}	if (pcmdptr->command != cpu_to_le16(CMD_RET(CMD_802_11_SUBSCRIBE_EVENT))) {		lbs_pr_err("command response incorrect!\n");		kfree(response_buf);		free_page(addr);		return 0;	}	res = count;out_unlock:	free_page(addr);	return res;}static ssize_t libertas_lowsnr_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 cmd_ctrl_node *pcmdnode;	struct cmd_ds_command *pcmdptr;	struct cmd_ds_802_11_subscribe_event *event;	void *response_buf;	int res, cmd_len;	ssize_t pos = 0;	unsigned long addr = get_zeroed_page(GFP_KERNEL);	char *buf = (char *)addr;	res = libertas_event_initcmd(priv, &response_buf, &pcmdnode, &pcmdptr);	if (res < 0) {		free_page(addr);		return res;	}	event = &pcmdptr->params.subscribe_event;	event->action = cpu_to_le16(CMD_ACT_GET);	pcmdptr->size = cpu_to_le16(sizeof(*event) + S_DS_GEN);	libertas_queue_cmd(adapter, pcmdnode, 1);	wake_up_interruptible(&priv->waitq);	/* Sleep until response is generated by FW */	wait_event_interruptible(pcmdnode->cmdwait_q,				 pcmdnode->cmdwaitqwoken);	pcmdptr = response_buf;	if (pcmdptr->result) {		lbs_pr_err("%s: fail, result=%d\n", __func__,			   le16_to_cpu(pcmdptr->result));		kfree(response_buf);		free_page(addr);		return 0;	}	if (pcmdptr->command != cpu_to_le16(CMD_RET(CMD_802_11_SUBSCRIBE_EVENT))) {		lbs_pr_err("command response incorrect!\n");		kfree(response_buf);		free_page(addr);		return 0;	}	cmd_len = S_DS_GEN + sizeof(struct cmd_ds_802_11_subscribe_event);	event = (void *)(response_buf + S_DS_GEN);	while (cmd_len < le16_to_cpu(pcmdptr->size)) {		struct mrvlietypesheader *header = (void *)(response_buf + cmd_len);		switch (header->type) {		struct mrvlietypes_snrthreshold *LowSnr;		case __constant_cpu_to_le16(TLV_TYPE_SNR_LOW):			LowSnr = (void *)(response_buf + cmd_len);			pos += snprintf(buf+pos, len-pos, "%d %d %d\n",					LowSnr->snrvalue,					LowSnr->snrfreq,					(event->events & cpu_to_le16(0x0002))?1:0);		default:			cmd_len += sizeof(struct mrvlietypes_snrthreshold);			break;		}	}	kfree(response_buf);	res = simple_read_from_buffer(userbuf, count, ppos, buf, pos);	free_page(addr);	return res;}static ssize_t libertas_lowsnr_write(struct file *file,				    const char __user *userbuf,				    size_t count, loff_t *ppos){	wlan_private *priv = file->private_data;	wlan_adapter *adapter = priv->adapter;	ssize_t res, buf_size;	int value, freq, subscribed, cmd_len;	struct cmd_ctrl_node *pcmdnode;	struct cmd_ds_command *pcmdptr;	struct cmd_ds_802_11_subscribe_event *event;	struct mrvlietypes_snrthreshold *snr_threshold;	void *response_buf;	u16 event_bitmap;	u8 *ptr;	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, "%d %d %d", &value, &freq, &subscribed);	if (res != 3) {		res = -EFAULT;		goto out_unlock;	}	event_bitmap = libertas_get_events_bitmap(priv);	res = libertas_event_initcmd(priv, &response_buf, &pcmdnode, &pcmdptr);	if (res < 0)		goto out_unlock;	event = &pcmdptr->params.subscribe_event;	event->action = cpu_to_le16(CMD_ACT_SET);	pcmdptr->size = cpu_to_le16(S_DS_GEN +		sizeof(struct cmd_ds_802_11_subscribe_event) +		sizeof(struct mrvlietypes_snrthreshold));	cmd_len = S_DS_GEN + sizeof(struct cmd_ds_802_11_subscribe_event);	ptr = (u8*) pcmdptr+cmd_len;	snr_threshold = (struct mrvlietypes_snrthreshold *)(ptr);	snr_threshold->header.type = cpu_to_le16(TLV_TYPE_SNR_LOW);	snr_threshold->header.len = cpu_to_le16(2);	snr_threshold->snrvalue = value;	snr_threshold->snrfreq = freq;	event_bitmap |= subscribed ? 0x0002 : 0x0;	event->events = cpu_to_le16(event_bitmap);	libertas_queue_cmd(adapter, pcmdnode, 1);	wake_up_interruptible(&priv->waitq);	/* Sleep until response is generated by FW */	wait_event_interruptible(pcmdnode->cmdwait_q,				 pcmdnode->cmdwaitqwoken);	pcmdptr = response_buf;	if (pcmdptr->result) {		lbs_pr_err("%s: fail, result=%d\n", __func__,			   le16_to_cpu(pcmdptr->result));		kfree(response_buf);		free_page(addr);		return 0;	}	if (pcmdptr->command != cpu_to_le16(CMD_RET(CMD_802_11_SUBSCRIBE_EVENT))) {		lbs_pr_err("command response incorrect!\n");		kfree(response_buf);		free_page(addr);		return 0;	}	res = count;out_unlock:	free_page(addr);	return res;}static ssize_t libertas_failcount_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 cmd_ctrl_node *pcmdnode;	struct cmd_ds_command *pcmdptr;	struct cmd_ds_802_11_subscribe_event *event;	void *response_buf;	int res, cmd_len;	ssize_t pos = 0;	unsigned long addr = get_zeroed_page(GFP_KERNEL);	char *buf = (char *)addr;	res = libertas_event_initcmd(priv, &response_buf, &pcmdnode, &pcmdptr);	if (res < 0) {		free_page(addr);		return res;	}	event = &pcmdptr->params.subscribe_event;	event->action = cpu_to_le16(CMD_ACT_GET);	pcmdptr->size =	cpu_to_le16(sizeof(*event) + S_DS_GEN);	libertas_queue_cmd(adapter, pcmdnode, 1);	wake_up_interruptible(&priv->waitq);	/* Sleep until response is generated by FW */	wait_event_interruptible(pcmdnode->cmdwait_q,				 pcmdnode->cmdwaitqwoken);	pcmdptr = response_buf;	if (pcmdptr->result) {		lbs_pr_err("%s: fail, result=%d\n", __func__,			   le16_to_cpu(pcmdptr->result));		kfree(response_buf);		free_page(addr);		return 0;	}	if (pcmdptr->command != cpu_to_le16(CMD_RET(CMD_802_11_SUBSCRIBE_EVENT))) {		lbs_pr_err("command response incorrect!\n");		kfree(response_buf);		free_page(addr);		return 0;	}	cmd_len = S_DS_GEN + sizeof(struct cmd_ds_802_11_subscribe_event);	event = (void *)(response_buf + S_DS_GEN);	while (cmd_len < le16_to_cpu(pcmdptr->size)) {		struct mrvlietypesheader *header = (void *)(response_buf + cmd_len);		switch (header->type) {		struct mrvlietypes_failurecount *failcount;		case __constant_cpu_to_le16(TLV_TYPE_FAILCOUNT):			failcount = (void *)(response_buf + cmd_len);			pos += snprintf(buf+pos, len-pos, "%d %d %d\n",					failcount->failvalue,					failcount->Failfreq,					(event->events & cpu_to_le16(0x0004))?1:0);		default:			cmd_len += sizeof(struct mrvlietypes_failurecount);			break;		}	}	kfree(response_buf);	res = simple_read_from_buffer(userbuf, count, ppos, buf, pos);	free_page(addr);	return res;}static ssize_t libertas_failcount_write(struct file *file,				    const char __user *userbuf,				    size_t count, loff_t *ppos){	wlan_private *priv = file->private_data;	wlan_adapter *adapter = priv->adapter;	ssize_t res, buf_size;	int value, freq, subscribed, cmd_len;	struct cmd_ctrl_node *pcmdnode;	struct cmd_ds_command *pcmdptr;	struct cmd_ds_802_11_subscribe_event *event;	struct mrvlietypes_failurecount *failcount;	void *response_buf;	u16 event_bitmap;	u8 *ptr;	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, "%d %d %d", &value, &freq, &subscribed);	if (res != 3) {		res = -EFAULT;		goto out_unlock;	}	event_bitmap = libertas_get_events_bitmap(priv);	res = libertas_event_initcmd(priv, &response_buf, &pcmdnode, &pcmdptr);	if (res < 0)		goto out_unlock;	event = &pcmdptr->params.subscribe_event;	event->action = cpu_to_le16(CMD_ACT_SET);	pcmdptr->size = cpu_to_le16(S_DS_GEN +		sizeof(struct cmd_ds_802_11_subscribe_event) +		sizeof(struct mrvlietypes_failurecount));	cmd_len = S_DS_GEN + sizeof(struct cmd_ds_802_11_subscribe_event);	ptr = (u8*) pcmdptr+cmd_len;	failcount = (struct mrvlietypes_failurecount *)(ptr);	failcount->header.type = cpu_to_le16(TLV_TYPE_FAILCOUNT);	failcount->header.len = cpu_to_le16(2);	failcount->failvalue = value;	failcount->Failfreq = freq;	event_bitmap |= subscribed ? 0x0004 : 0x0;	event->events = cpu_to_le16(event_bitmap);	libertas_queue_cmd(adapter, pcmdnode, 1);	wake_up_interruptible(&priv->waitq);	/* Sleep until response is generated by FW */	wait_event_interruptible(pcmdnode->cmdwait_q,				 pcmdnode->cmdwaitqwoken);	pcmdptr = (struct cmd_ds_command *)response_buf;	if (pcmdptr->result) {		lbs_pr_err("%s: fail, result=%d\n", __func__,			   le16_to_cpu(pcmdptr->result));		kfree(response_buf);		free_page(addr);		return 0;	}	if (pcmdptr->command != cpu_to_le16(CMD_RET(CMD_802_11_SUBSCRIBE_EVENT))) {		lbs_pr_err("command response incorrect!\n");		kfree(response_buf);		free_page(addr);		return 0;	}	res = count;out_unlock:	free_page(addr);	return res;}static ssize_t libertas_bcnmiss_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 cmd_ctrl_node *pcmdnode;	struct cmd_ds_command *pcmdptr;	struct cmd_ds_802_11_subscribe_event *event;	void *response_buf;	int res, cmd_len;	ssize_t pos = 0;	unsigned long addr = get_zeroed_page(GFP_KERNEL);	char *buf = (char *)addr;	res = libertas_event_initcmd(priv, &response_buf, &pcmdnode, &pcmdptr);	if (res < 0) {		free_page(addr);		return res;	}	event = &pcmdptr->params.subscribe_event;	event->action = cpu_to_le16(CMD_ACT_GET);	pcmdptr->size = cpu_to_le16(sizeof(*event) + S_DS_GEN);	libertas_queue_cmd(adapter, pcmdnode, 1);	wake_up_interruptible(&priv->waitq);	/* Sleep until response is generated by FW */	wait_event_interruptible(pcmdnode->cmdwait_q,				 pcmdnode->cmdwaitqwoken);	pcmdptr = response_buf;	if (pcmdptr->result) {		lbs_pr_err("%s: fail, result=%d\n", __func__,			   le16_to_cpu(pcmdptr->result));		free_page(addr);		kfree(response_buf);		return 0;	}	if (pcmdptr->command != cpu_to_le16(CMD_RET(CMD_802_11_SUBSCRIBE_EVENT))) {		lbs_pr_err("command response incorrect!\n");		free_page(addr);		kfree(response_buf);		return 0;	}

⌨️ 快捷键说明

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