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