debugfs.c

来自「linux 内核源代码」· C语言 代码 · 共 1,914 行 · 第 1/4 页

C
1,914
字号
}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 + =
减小字号Ctrl + -
显示快捷键?