📄 debugfs.c
字号:
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_beaconsmissed *bcnmiss; case __constant_cpu_to_le16(TLV_TYPE_BCNMISS): bcnmiss = (void *)(response_buf + cmd_len); pos += snprintf(buf+pos, len-pos, "%d N/A %d\n", bcnmiss->beaconmissed, (event->events & cpu_to_le16(0x0008))?1:0); default: cmd_len += sizeof(struct mrvlietypes_beaconsmissed); break; } } kfree(response_buf); res = simple_read_from_buffer(userbuf, count, ppos, buf, pos); free_page(addr); return res;}static ssize_t libertas_bcnmiss_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_beaconsmissed *bcnmiss; 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_beaconsmissed)); cmd_len = S_DS_GEN + sizeof(struct cmd_ds_802_11_subscribe_event); ptr = (u8*) pcmdptr+cmd_len; bcnmiss = (struct mrvlietypes_beaconsmissed *)(ptr); bcnmiss->header.type = cpu_to_le16(TLV_TYPE_BCNMISS); bcnmiss->header.len = cpu_to_le16(2); bcnmiss->beaconmissed = value; event_bitmap |= subscribed ? 0x0008 : 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"); free_page(addr); kfree(response_buf); return 0; } res = count;out_unlock: free_page(addr); return res;}static ssize_t libertas_highrssi_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_rssithreshold *Highrssi; case __constant_cpu_to_le16(TLV_TYPE_RSSI_HIGH): Highrssi = (void *)(response_buf + cmd_len); pos += snprintf(buf+pos, len-pos, "%d %d %d\n", Highrssi->rssivalue, Highrssi->rssifreq, (event->events & cpu_to_le16(0x0010))?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_highrssi_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(TLV_TYPE_RSSI_HIGH); rssi_threshold->header.len = cpu_to_le16(2); rssi_threshold->rssivalue = value; rssi_threshold->rssifreq = freq; event_bitmap |= subscribed ? 0x0010 : 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); 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); return 0; } res = count;out_unlock: free_page(addr); return res;}static ssize_t libertas_highsnr_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 *HighSnr; case __constant_cpu_to_le16(TLV_TYPE_SNR_HIGH): HighSnr = (void *)(response_buf + cmd_len); pos += snprintf(buf+pos, len-pos, "%d %d %d\n", HighSnr->snrvalue, HighSnr->snrfreq, (event->events & cpu_to_le16(0x0020))?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_highsnr_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_HIGH); snr_threshold->header.len = cpu_to_le16(2); snr_threshold->snrvalue = value; snr_threshold->snrfreq = freq; event_bitmap |= subscribed ? 0x0020 : 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_rdmac_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->mac_offset; offval.value = 0; ret = libertas_prepare_and_send_command(priv, CMD_MAC_REG_ACCESS, 0, CMD_OPTION_WAITFORRSP, 0, &offval); mdelay(10); pos += snprintf(buf+pos, len-pos, "MAC[0x%x] = 0x%08x\n", priv->mac_offset, adapter->offsetvalue.value); ret = simple_read_from_buffer(userbuf, count, ppos, buf, pos); free_page(addr); return ret;}static ssize_t libertas_rdmac_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->mac_offset = simple_strtoul((char *)buf, NULL, 16); res = count;out_unlock: free_page(addr); return res;}static ssize_t libertas_wrmac_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_MAC_REG_ACCESS, 1,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -