161a63978SXianjun Jiao // Author: Xianjun Jiao, Michael Mehari, Wei Liu
261a63978SXianjun Jiao // SPDX-FileCopyrightText: 2019 UGent
361a63978SXianjun Jiao // SPDX-License-Identifier: AGPL-3.0-or-later
461a63978SXianjun Jiao
561a63978SXianjun Jiao // #define TX_INTF_IQ_WRITE_TXT_FORMAT 1//while using TXT format, the txt file size should <= 4096!!!
661a63978SXianjun Jiao #define TX_INTF_IQ_WRITE_BIN_FORMAT 1
761a63978SXianjun Jiao
861a63978SXianjun Jiao #ifdef TX_INTF_IQ_WRITE_TXT_FORMAT
is_valid_iq_number(int c)961a63978SXianjun Jiao static int is_valid_iq_number(int c) {
1061a63978SXianjun Jiao if (c==32 || (c>=44 && c<=57))
1161a63978SXianjun Jiao return(1);
1261a63978SXianjun Jiao else
1361a63978SXianjun Jiao return(0);
1461a63978SXianjun Jiao }
1561a63978SXianjun Jiao
openwifi_tx_intf_bin_iq_write(struct file * filp,struct kobject * kobj,struct bin_attribute * bin_attr,char * buf,loff_t off,size_t count)1661a63978SXianjun Jiao static ssize_t openwifi_tx_intf_bin_iq_write(struct file *filp, struct kobject *kobj,
1761a63978SXianjun Jiao struct bin_attribute *bin_attr,
1861a63978SXianjun Jiao char *buf, loff_t off, size_t count)
1961a63978SXianjun Jiao {
2061a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(kobj_to_dev(kobj));
2161a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
2261a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
2361a63978SXianjun Jiao int ret, i, q, num_iq;
2461a63978SXianjun Jiao char *line;
2561a63978SXianjun Jiao char *ptr = buf;
2661a63978SXianjun Jiao
2761a63978SXianjun Jiao printk("%s openwifi_tx_intf_bin_iq_write: count %d\n", sdr_compatible_str, (int)count);
2861a63978SXianjun Jiao
2961a63978SXianjun Jiao num_iq = 0;
3061a63978SXianjun Jiao line = ptr;
3161a63978SXianjun Jiao while (1) {
3261a63978SXianjun Jiao ret = sscanf(line, "%d,%d\n", &i, &q);
3361a63978SXianjun Jiao if (ret == 0) {
3461a63978SXianjun Jiao printk("%s openwifi_tx_intf_bin_iq_write: sscanf ret 0\n", sdr_compatible_str);
3561a63978SXianjun Jiao break;
3661a63978SXianjun Jiao } else if (ret != 2) {
3761a63978SXianjun Jiao printk("%s openwifi_tx_intf_bin_iq_write: sscanf ret %d i %d q %d num_iq %d\n", sdr_compatible_str, ret, i, q, num_iq);
3861a63978SXianjun Jiao return -EINVAL;
3961a63978SXianjun Jiao }
4061a63978SXianjun Jiao
4161a63978SXianjun Jiao priv->tx_intf_arbitrary_iq[num_iq] = ( (q<<16)|(i&0xFFFF) );
4261a63978SXianjun Jiao num_iq++;
4361a63978SXianjun Jiao if (num_iq == 512) {
4461a63978SXianjun Jiao printk("%s openwifi_tx_intf_bin_iq_write: num_iq reach 512\n", sdr_compatible_str);
4561a63978SXianjun Jiao break;
4661a63978SXianjun Jiao }
4761a63978SXianjun Jiao
4861a63978SXianjun Jiao //go to the next line
4961a63978SXianjun Jiao while(is_valid_iq_number(ptr[0]))
5061a63978SXianjun Jiao ptr++;
5161a63978SXianjun Jiao while( (is_valid_iq_number(ptr[0])==0)&&(ptr[0]!=0) )
5261a63978SXianjun Jiao ptr++;
5361a63978SXianjun Jiao if (ptr[0] == 0) {
5461a63978SXianjun Jiao printk("%s openwifi_tx_intf_bin_iq_write: ptr[0] == 0\n", sdr_compatible_str);
5561a63978SXianjun Jiao break;
5661a63978SXianjun Jiao }
5761a63978SXianjun Jiao line = ptr;
5861a63978SXianjun Jiao }
5961a63978SXianjun Jiao priv->tx_intf_arbitrary_iq_num = num_iq;
6061a63978SXianjun Jiao
6161a63978SXianjun Jiao printk("%s openwifi_tx_intf_bin_iq_write: num_iq %d\n", sdr_compatible_str, num_iq);
6261a63978SXianjun Jiao //print i/q
6361a63978SXianjun Jiao for (i=0; i<num_iq; i++)
6461a63978SXianjun Jiao printk("%d %d\n", (short)(priv->tx_intf_arbitrary_iq[i]&0xffff), (short)((priv->tx_intf_arbitrary_iq[i]>>16)&0xffff) );
6561a63978SXianjun Jiao
6661a63978SXianjun Jiao return count;
6761a63978SXianjun Jiao }
6861a63978SXianjun Jiao #else
openwifi_tx_intf_bin_iq_write(struct file * filp,struct kobject * kobj,struct bin_attribute * bin_attr,char * buf,loff_t off,size_t count)6961a63978SXianjun Jiao static ssize_t openwifi_tx_intf_bin_iq_write(struct file *filp, struct kobject *kobj,
7061a63978SXianjun Jiao struct bin_attribute *bin_attr,
7161a63978SXianjun Jiao char *buf, loff_t off, size_t count)
7261a63978SXianjun Jiao {
7361a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(kobj_to_dev(kobj));
7461a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
7561a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
7661a63978SXianjun Jiao int num_iq, i;
7761a63978SXianjun Jiao
7861a63978SXianjun Jiao printk("%s openwifi_tx_intf_bin_iq_write: count %d\n", sdr_compatible_str, (int)count);
7961a63978SXianjun Jiao
8061a63978SXianjun Jiao if ((count%4) != 0) {
8161a63978SXianjun Jiao printk("%s openwifi_tx_intf_bin_iq_write: count is not integer times of 4!\n", sdr_compatible_str);
8261a63978SXianjun Jiao return -EINVAL;
8361a63978SXianjun Jiao }
8461a63978SXianjun Jiao
8561a63978SXianjun Jiao num_iq = count/4;
8661a63978SXianjun Jiao priv->tx_intf_arbitrary_iq_num = num_iq;
8761a63978SXianjun Jiao
8861a63978SXianjun Jiao for (i=0; i<num_iq; i++) {
8961a63978SXianjun Jiao priv->tx_intf_arbitrary_iq[i] = (*((u32*)(buf+(i*4))));
9061a63978SXianjun Jiao }
9161a63978SXianjun Jiao
9261a63978SXianjun Jiao // printk("%s openwifi_tx_intf_bin_iq_write: num_iq %d\n", sdr_compatible_str, num_iq);
9361a63978SXianjun Jiao // //print i/q
9461a63978SXianjun Jiao // for (i=0; i<num_iq; i++)
9561a63978SXianjun Jiao // printk("%d %d\n", (short)(priv->tx_intf_arbitrary_iq[i]&0xffff), (short)((priv->tx_intf_arbitrary_iq[i]>>16)&0xffff) );
9661a63978SXianjun Jiao
9761a63978SXianjun Jiao return count;
9861a63978SXianjun Jiao }
9961a63978SXianjun Jiao #endif
10061a63978SXianjun Jiao
openwifi_tx_intf_bin_iq_read(struct file * filp,struct kobject * kobj,struct bin_attribute * bin_attr,char * buf,loff_t off,size_t count)10161a63978SXianjun Jiao static ssize_t openwifi_tx_intf_bin_iq_read(struct file *filp, struct kobject *kobj,
10261a63978SXianjun Jiao struct bin_attribute *bin_attr,
10361a63978SXianjun Jiao char *buf, loff_t off, size_t count)
10461a63978SXianjun Jiao {
10561a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(kobj_to_dev(kobj));
10661a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
10761a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
10861a63978SXianjun Jiao int num_iq, ret_size, i;
10961a63978SXianjun Jiao
11061a63978SXianjun Jiao if (off)
11161a63978SXianjun Jiao return 0;
11261a63978SXianjun Jiao
11361a63978SXianjun Jiao num_iq = priv->tx_intf_arbitrary_iq_num;
11461a63978SXianjun Jiao
11561a63978SXianjun Jiao // printk("%s openwifi_tx_intf_bin_iq_read: num_iq %d\n", sdr_compatible_str, num_iq);
11661a63978SXianjun Jiao // //print i/q
11761a63978SXianjun Jiao // for (i=0; i<num_iq; i++)
11861a63978SXianjun Jiao // printk("%d %d\n", (short)(priv->tx_intf_arbitrary_iq[i]&0xffff), (short)((priv->tx_intf_arbitrary_iq[i]>>16)&0xffff) );
11961a63978SXianjun Jiao
12061a63978SXianjun Jiao ret_size = sprintf(buf, "%d\n", num_iq);
12161a63978SXianjun Jiao if (num_iq==0 || num_iq>512) {
12261a63978SXianjun Jiao ret_size = ret_size + sprintf(buf+ret_size, "num_iq is wrong!\n");
12361a63978SXianjun Jiao return ret_size;
12461a63978SXianjun Jiao }
12561a63978SXianjun Jiao
12661a63978SXianjun Jiao //print i
12761a63978SXianjun Jiao for (i=0; i<num_iq; i++)
12861a63978SXianjun Jiao ret_size = ret_size + sprintf(buf+ret_size, "%d ", (short)(priv->tx_intf_arbitrary_iq[i]&0xffff) );
12961a63978SXianjun Jiao ret_size = ret_size + sprintf(buf+ret_size, "\n");
13061a63978SXianjun Jiao
13161a63978SXianjun Jiao //print q
13261a63978SXianjun Jiao for (i=0; i<num_iq; i++)
13361a63978SXianjun Jiao ret_size = ret_size + sprintf(buf+ret_size, "%d ", (short)((priv->tx_intf_arbitrary_iq[i]>>16)&0xffff) );
13461a63978SXianjun Jiao ret_size = ret_size + sprintf(buf+ret_size, "\n");
13561a63978SXianjun Jiao
13661a63978SXianjun Jiao return ret_size;
13761a63978SXianjun Jiao }
13861a63978SXianjun Jiao
tx_intf_iq_ctl_show(struct device * input_dev,struct device_attribute * attr,char * buf)13961a63978SXianjun Jiao static ssize_t tx_intf_iq_ctl_show(struct device *input_dev, struct device_attribute *attr, char *buf)
14061a63978SXianjun Jiao {
14161a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
14261a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
14361a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
14461a63978SXianjun Jiao
14561a63978SXianjun Jiao return sprintf(buf, "%u\n", priv->tx_intf_iq_ctl);
14661a63978SXianjun Jiao }
tx_intf_iq_ctl_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)14761a63978SXianjun Jiao static ssize_t tx_intf_iq_ctl_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
14861a63978SXianjun Jiao {
14961a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
15061a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
15161a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
15261a63978SXianjun Jiao
15361a63978SXianjun Jiao long readin;
15461a63978SXianjun Jiao int i;
15561a63978SXianjun Jiao int ret = kstrtol(buf, 10, &readin);
15661a63978SXianjun Jiao
15761a63978SXianjun Jiao priv->tx_intf_iq_ctl = readin;
15861a63978SXianjun Jiao
15961a63978SXianjun Jiao tx_intf_api->TX_INTF_REG_ARBITRARY_IQ_CTL_write(1); // switch to iq mode
16061a63978SXianjun Jiao printk("%s tx_intf_iq_ctl_store: Will send %d I/Q\n", sdr_compatible_str, priv->tx_intf_arbitrary_iq_num);
16161a63978SXianjun Jiao for (i=0; i<priv->tx_intf_arbitrary_iq_num; i++) {
16261a63978SXianjun Jiao tx_intf_api->TX_INTF_REG_ARBITRARY_IQ_write(priv->tx_intf_arbitrary_iq[i]);
16361a63978SXianjun Jiao }
16461a63978SXianjun Jiao tx_intf_api->TX_INTF_REG_ARBITRARY_IQ_CTL_write(3); // start send
16561a63978SXianjun Jiao tx_intf_api->TX_INTF_REG_ARBITRARY_IQ_CTL_write(0);
16661a63978SXianjun Jiao
16761a63978SXianjun Jiao return ret ? ret : len;
16861a63978SXianjun Jiao }
16961a63978SXianjun Jiao
17061a63978SXianjun Jiao static DEVICE_ATTR(tx_intf_iq_ctl, S_IRUGO | S_IWUSR, tx_intf_iq_ctl_show, tx_intf_iq_ctl_store);
17161a63978SXianjun Jiao static struct attribute *tx_intf_attributes[] = {
17261a63978SXianjun Jiao &dev_attr_tx_intf_iq_ctl.attr,
17361a63978SXianjun Jiao NULL,
17461a63978SXianjun Jiao };
17561a63978SXianjun Jiao static const struct attribute_group tx_intf_attribute_group = {
17661a63978SXianjun Jiao .attrs = tx_intf_attributes,
17761a63978SXianjun Jiao };
17861a63978SXianjun Jiao
stat_enable_show(struct device * input_dev,struct device_attribute * attr,char * buf)17961a63978SXianjun Jiao static ssize_t stat_enable_show(struct device *input_dev, struct device_attribute *attr, char *buf)
18061a63978SXianjun Jiao {
18161a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
18261a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
18361a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
18461a63978SXianjun Jiao
18561a63978SXianjun Jiao return sprintf(buf, "%u\n", priv->stat.stat_enable);
18661a63978SXianjun Jiao }
stat_enable_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)18761a63978SXianjun Jiao static ssize_t stat_enable_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
18861a63978SXianjun Jiao {
18961a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
19061a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
19161a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
19261a63978SXianjun Jiao
19361a63978SXianjun Jiao long readin;
19461a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
19561a63978SXianjun Jiao
19661a63978SXianjun Jiao priv->stat.stat_enable = readin;
19761a63978SXianjun Jiao
19861a63978SXianjun Jiao return ret ? ret : len;
19961a63978SXianjun Jiao }
20061a63978SXianjun Jiao
tx_prio_queue_show(struct device * input_dev,struct device_attribute * attr,char * buf)20161a63978SXianjun Jiao static ssize_t tx_prio_queue_show(struct device *input_dev, struct device_attribute *attr, char *buf)
20261a63978SXianjun Jiao {
20361a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
20461a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
20561a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
20661a63978SXianjun Jiao
20761a63978SXianjun Jiao u32 i, ret_size = 0;
20861a63978SXianjun Jiao
20961a63978SXianjun Jiao for (i=0; i<MAX_NUM_SW_QUEUE; i++) {
21061a63978SXianjun Jiao ret_size = ret_size + sprintf(buf+ret_size, "%u %u %u %u %u %u %u %u %u %u %u %u\n",
21161a63978SXianjun Jiao priv->stat.tx_prio_num[i],
21261a63978SXianjun Jiao priv->stat.tx_prio_interrupt_num[i],
21361a63978SXianjun Jiao priv->stat.tx_prio_stop0_fake_num[i],
21461a63978SXianjun Jiao priv->stat.tx_prio_stop0_real_num[i],
21561a63978SXianjun Jiao priv->stat.tx_prio_stop1_num[i],
21661a63978SXianjun Jiao priv->stat.tx_prio_wakeup_num[i],
21761a63978SXianjun Jiao priv->stat.tx_queue_num[i],
21861a63978SXianjun Jiao priv->stat.tx_queue_interrupt_num[i],
21961a63978SXianjun Jiao priv->stat.tx_queue_stop0_fake_num[i],
22061a63978SXianjun Jiao priv->stat.tx_queue_stop0_real_num[i],
22161a63978SXianjun Jiao priv->stat.tx_queue_stop1_num[i],
22261a63978SXianjun Jiao priv->stat.tx_queue_wakeup_num[i]);
22361a63978SXianjun Jiao }
22461a63978SXianjun Jiao
22561a63978SXianjun Jiao return ret_size;
22661a63978SXianjun Jiao }
tx_prio_queue_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)22761a63978SXianjun Jiao static ssize_t tx_prio_queue_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
22861a63978SXianjun Jiao {
22961a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
23061a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
23161a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
23261a63978SXianjun Jiao
23361a63978SXianjun Jiao u32 i;
23461a63978SXianjun Jiao long readin;
23561a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
23661a63978SXianjun Jiao
23761a63978SXianjun Jiao for (i=0; i<MAX_NUM_SW_QUEUE; i++) {
23861a63978SXianjun Jiao priv->stat.tx_prio_num[i] = 0;
23961a63978SXianjun Jiao priv->stat.tx_prio_interrupt_num[i] = 0;
24061a63978SXianjun Jiao priv->stat.tx_prio_stop0_fake_num[i] = 0;
24161a63978SXianjun Jiao priv->stat.tx_prio_stop0_real_num[i] = 0;
24261a63978SXianjun Jiao priv->stat.tx_prio_stop1_num[i] = 0;
24361a63978SXianjun Jiao priv->stat.tx_prio_wakeup_num[i] = 0;
24461a63978SXianjun Jiao }
24561a63978SXianjun Jiao for (i=0; i<MAX_NUM_HW_QUEUE; i++) {
24661a63978SXianjun Jiao priv->stat.tx_queue_num[i] = 0;
24761a63978SXianjun Jiao priv->stat.tx_queue_interrupt_num[i] = 0;
24861a63978SXianjun Jiao priv->stat.tx_queue_stop0_fake_num[i] = 0;
24961a63978SXianjun Jiao priv->stat.tx_queue_stop0_real_num[i] = 0;
25061a63978SXianjun Jiao priv->stat.tx_queue_stop1_num[i] = 0;
25161a63978SXianjun Jiao priv->stat.tx_queue_wakeup_num[i] = 0;
25261a63978SXianjun Jiao }
25361a63978SXianjun Jiao
25461a63978SXianjun Jiao return ret ? ret : len;
25561a63978SXianjun Jiao }
25661a63978SXianjun Jiao
tx_data_pkt_need_ack_num_total_fail_show(struct device * input_dev,struct device_attribute * attr,char * buf)25761a63978SXianjun Jiao static ssize_t tx_data_pkt_need_ack_num_total_fail_show(struct device *input_dev, struct device_attribute *attr, char *buf)
25861a63978SXianjun Jiao {
25961a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
26061a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
26161a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
26261a63978SXianjun Jiao
26361a63978SXianjun Jiao return sprintf(buf, "%u\n", priv->stat.tx_data_pkt_need_ack_num_total_fail);
26461a63978SXianjun Jiao }
tx_data_pkt_need_ack_num_total_fail_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)26561a63978SXianjun Jiao static ssize_t tx_data_pkt_need_ack_num_total_fail_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
26661a63978SXianjun Jiao {
26761a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
26861a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
26961a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
27061a63978SXianjun Jiao
27161a63978SXianjun Jiao long readin;
27261a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
27361a63978SXianjun Jiao
27461a63978SXianjun Jiao priv->stat.tx_data_pkt_need_ack_num_total_fail = readin;
27561a63978SXianjun Jiao
27661a63978SXianjun Jiao return ret ? ret : len;
27761a63978SXianjun Jiao }
27861a63978SXianjun Jiao
tx_data_pkt_need_ack_num_total_show(struct device * input_dev,struct device_attribute * attr,char * buf)27961a63978SXianjun Jiao static ssize_t tx_data_pkt_need_ack_num_total_show(struct device *input_dev, struct device_attribute *attr, char *buf)
28061a63978SXianjun Jiao {
28161a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
28261a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
28361a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
28461a63978SXianjun Jiao
28561a63978SXianjun Jiao return sprintf(buf, "%u\n", priv->stat.tx_data_pkt_need_ack_num_total);
28661a63978SXianjun Jiao }
tx_data_pkt_need_ack_num_total_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)28761a63978SXianjun Jiao static ssize_t tx_data_pkt_need_ack_num_total_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
28861a63978SXianjun Jiao {
28961a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
29061a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
29161a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
29261a63978SXianjun Jiao
29361a63978SXianjun Jiao long readin;
29461a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
29561a63978SXianjun Jiao
29661a63978SXianjun Jiao priv->stat.tx_data_pkt_need_ack_num_total = readin;
29761a63978SXianjun Jiao
29861a63978SXianjun Jiao return ret ? ret : len;
29961a63978SXianjun Jiao }
30061a63978SXianjun Jiao
tx_mgmt_pkt_need_ack_num_total_show(struct device * input_dev,struct device_attribute * attr,char * buf)30161a63978SXianjun Jiao static ssize_t tx_mgmt_pkt_need_ack_num_total_show(struct device *input_dev, struct device_attribute *attr, char *buf)
30261a63978SXianjun Jiao {
30361a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
30461a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
30561a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
30661a63978SXianjun Jiao
30761a63978SXianjun Jiao return sprintf(buf, "%u\n", priv->stat.tx_mgmt_pkt_need_ack_num_total);
30861a63978SXianjun Jiao }
tx_mgmt_pkt_need_ack_num_total_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)30961a63978SXianjun Jiao static ssize_t tx_mgmt_pkt_need_ack_num_total_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
31061a63978SXianjun Jiao {
31161a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
31261a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
31361a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
31461a63978SXianjun Jiao
31561a63978SXianjun Jiao long readin;
31661a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
31761a63978SXianjun Jiao
31861a63978SXianjun Jiao priv->stat.tx_mgmt_pkt_need_ack_num_total = readin;
31961a63978SXianjun Jiao
32061a63978SXianjun Jiao return ret ? ret : len;
32161a63978SXianjun Jiao }
32261a63978SXianjun Jiao
tx_mgmt_pkt_need_ack_num_total_fail_show(struct device * input_dev,struct device_attribute * attr,char * buf)32361a63978SXianjun Jiao static ssize_t tx_mgmt_pkt_need_ack_num_total_fail_show(struct device *input_dev, struct device_attribute *attr, char *buf)
32461a63978SXianjun Jiao {
32561a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
32661a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
32761a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
32861a63978SXianjun Jiao
32961a63978SXianjun Jiao return sprintf(buf, "%u\n", priv->stat.tx_mgmt_pkt_need_ack_num_total_fail);
33061a63978SXianjun Jiao }
tx_mgmt_pkt_need_ack_num_total_fail_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)33161a63978SXianjun Jiao static ssize_t tx_mgmt_pkt_need_ack_num_total_fail_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
33261a63978SXianjun Jiao {
33361a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
33461a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
33561a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
33661a63978SXianjun Jiao
33761a63978SXianjun Jiao long readin;
33861a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
33961a63978SXianjun Jiao
34061a63978SXianjun Jiao priv->stat.tx_mgmt_pkt_need_ack_num_total_fail = readin;
34161a63978SXianjun Jiao
34261a63978SXianjun Jiao return ret ? ret : len;
34361a63978SXianjun Jiao }
34461a63978SXianjun Jiao
tx_data_pkt_need_ack_num_retx_show(struct device * input_dev,struct device_attribute * attr,char * buf)34561a63978SXianjun Jiao static ssize_t tx_data_pkt_need_ack_num_retx_show(struct device *input_dev, struct device_attribute *attr, char *buf)
34661a63978SXianjun Jiao {
34761a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
34861a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
34961a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
35061a63978SXianjun Jiao
35161a63978SXianjun Jiao return sprintf(buf, "%u %u %u %u %u %u\n",
35261a63978SXianjun Jiao priv->stat.tx_data_pkt_need_ack_num_retx[0],
35361a63978SXianjun Jiao priv->stat.tx_data_pkt_need_ack_num_retx[1],
35461a63978SXianjun Jiao priv->stat.tx_data_pkt_need_ack_num_retx[2],
35561a63978SXianjun Jiao priv->stat.tx_data_pkt_need_ack_num_retx[3],
35661a63978SXianjun Jiao priv->stat.tx_data_pkt_need_ack_num_retx[4],
35761a63978SXianjun Jiao priv->stat.tx_data_pkt_need_ack_num_retx[5]);
35861a63978SXianjun Jiao }
tx_data_pkt_need_ack_num_retx_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)35961a63978SXianjun Jiao static ssize_t tx_data_pkt_need_ack_num_retx_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
36061a63978SXianjun Jiao {
36161a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
36261a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
36361a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
36461a63978SXianjun Jiao
36561a63978SXianjun Jiao long readin;
36661a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin), i;
36761a63978SXianjun Jiao
36861a63978SXianjun Jiao for (i=0; i<6; i++)
36961a63978SXianjun Jiao priv->stat.tx_data_pkt_need_ack_num_retx[i] = readin;
37061a63978SXianjun Jiao
37161a63978SXianjun Jiao return ret ? ret : len;
37261a63978SXianjun Jiao }
37361a63978SXianjun Jiao
tx_mgmt_pkt_need_ack_num_retx_show(struct device * input_dev,struct device_attribute * attr,char * buf)37461a63978SXianjun Jiao static ssize_t tx_mgmt_pkt_need_ack_num_retx_show(struct device *input_dev, struct device_attribute *attr, char *buf)
37561a63978SXianjun Jiao {
37661a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
37761a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
37861a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
37961a63978SXianjun Jiao
38061a63978SXianjun Jiao return sprintf(buf, "%u %u %u\n",
38161a63978SXianjun Jiao priv->stat.tx_mgmt_pkt_need_ack_num_retx[0],
38261a63978SXianjun Jiao priv->stat.tx_mgmt_pkt_need_ack_num_retx[1],
38361a63978SXianjun Jiao priv->stat.tx_mgmt_pkt_need_ack_num_retx[2]);
38461a63978SXianjun Jiao }
tx_mgmt_pkt_need_ack_num_retx_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)38561a63978SXianjun Jiao static ssize_t tx_mgmt_pkt_need_ack_num_retx_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
38661a63978SXianjun Jiao {
38761a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
38861a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
38961a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
39061a63978SXianjun Jiao
39161a63978SXianjun Jiao long readin;
39261a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin), i;
39361a63978SXianjun Jiao
39461a63978SXianjun Jiao for (i=0; i<3; i++)
39561a63978SXianjun Jiao priv->stat.tx_mgmt_pkt_need_ack_num_retx[i] = readin;
39661a63978SXianjun Jiao
39761a63978SXianjun Jiao return ret ? ret : len;
39861a63978SXianjun Jiao }
39961a63978SXianjun Jiao
tx_data_pkt_need_ack_num_retx_fail_show(struct device * input_dev,struct device_attribute * attr,char * buf)40061a63978SXianjun Jiao static ssize_t tx_data_pkt_need_ack_num_retx_fail_show(struct device *input_dev, struct device_attribute *attr, char *buf)
40161a63978SXianjun Jiao {
40261a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
40361a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
40461a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
40561a63978SXianjun Jiao
40661a63978SXianjun Jiao return sprintf(buf, "%u %u %u %u %u %u\n",
40761a63978SXianjun Jiao priv->stat.tx_data_pkt_need_ack_num_retx_fail[0],
40861a63978SXianjun Jiao priv->stat.tx_data_pkt_need_ack_num_retx_fail[1],
40961a63978SXianjun Jiao priv->stat.tx_data_pkt_need_ack_num_retx_fail[2],
41061a63978SXianjun Jiao priv->stat.tx_data_pkt_need_ack_num_retx_fail[3],
41161a63978SXianjun Jiao priv->stat.tx_data_pkt_need_ack_num_retx_fail[4],
41261a63978SXianjun Jiao priv->stat.tx_data_pkt_need_ack_num_retx_fail[5]);
41361a63978SXianjun Jiao }
tx_data_pkt_need_ack_num_retx_fail_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)41461a63978SXianjun Jiao static ssize_t tx_data_pkt_need_ack_num_retx_fail_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
41561a63978SXianjun Jiao {
41661a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
41761a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
41861a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
41961a63978SXianjun Jiao
42061a63978SXianjun Jiao long readin;
42161a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin), i;
42261a63978SXianjun Jiao
42361a63978SXianjun Jiao for (i=0; i<6; i++)
42461a63978SXianjun Jiao priv->stat.tx_data_pkt_need_ack_num_retx_fail[i] = readin;
42561a63978SXianjun Jiao
42661a63978SXianjun Jiao return ret ? ret : len;
42761a63978SXianjun Jiao }
42861a63978SXianjun Jiao
tx_mgmt_pkt_need_ack_num_retx_fail_show(struct device * input_dev,struct device_attribute * attr,char * buf)42961a63978SXianjun Jiao static ssize_t tx_mgmt_pkt_need_ack_num_retx_fail_show(struct device *input_dev, struct device_attribute *attr, char *buf)
43061a63978SXianjun Jiao {
43161a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
43261a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
43361a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
43461a63978SXianjun Jiao
43561a63978SXianjun Jiao return sprintf(buf, "%u %u %u\n",
43661a63978SXianjun Jiao priv->stat.tx_mgmt_pkt_need_ack_num_retx_fail[0],
43761a63978SXianjun Jiao priv->stat.tx_mgmt_pkt_need_ack_num_retx_fail[1],
43861a63978SXianjun Jiao priv->stat.tx_mgmt_pkt_need_ack_num_retx_fail[2]);
43961a63978SXianjun Jiao }
tx_mgmt_pkt_need_ack_num_retx_fail_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)44061a63978SXianjun Jiao static ssize_t tx_mgmt_pkt_need_ack_num_retx_fail_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
44161a63978SXianjun Jiao {
44261a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
44361a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
44461a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
44561a63978SXianjun Jiao
44661a63978SXianjun Jiao long readin;
44761a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin), i;
44861a63978SXianjun Jiao
44961a63978SXianjun Jiao for (i=0; i<3; i++)
45061a63978SXianjun Jiao priv->stat.tx_mgmt_pkt_need_ack_num_retx_fail[i] = readin;
45161a63978SXianjun Jiao
45261a63978SXianjun Jiao return ret ? ret : len;
45361a63978SXianjun Jiao }
45461a63978SXianjun Jiao
tx_data_pkt_mcs_realtime_show(struct device * input_dev,struct device_attribute * attr,char * buf)45561a63978SXianjun Jiao static ssize_t tx_data_pkt_mcs_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
45661a63978SXianjun Jiao {
45761a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
45861a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
45961a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
46061a63978SXianjun Jiao
46161a63978SXianjun Jiao bool use_ht_rate = ((priv->stat.tx_data_pkt_mcs_realtime&0x80000000)!=0);
46261a63978SXianjun Jiao u32 rate_hw_value = (priv->stat.tx_data_pkt_mcs_realtime&0x7fffffff);
46361a63978SXianjun Jiao
46461a63978SXianjun Jiao return sprintf(buf, "%uM\n", (use_ht_rate == false ? wifi_rate_all[rate_hw_value] : wifi_rate_all[rate_hw_value + 12]));
46561a63978SXianjun Jiao }
tx_data_pkt_mcs_realtime_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)46661a63978SXianjun Jiao static ssize_t tx_data_pkt_mcs_realtime_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
46761a63978SXianjun Jiao {
46861a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
46961a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
47061a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
47161a63978SXianjun Jiao
47261a63978SXianjun Jiao long readin;
47361a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
47461a63978SXianjun Jiao
47561a63978SXianjun Jiao priv->stat.tx_data_pkt_mcs_realtime = readin;
47661a63978SXianjun Jiao
47761a63978SXianjun Jiao return ret ? ret : len;
47861a63978SXianjun Jiao }
47961a63978SXianjun Jiao
tx_mgmt_pkt_mcs_realtime_show(struct device * input_dev,struct device_attribute * attr,char * buf)48061a63978SXianjun Jiao static ssize_t tx_mgmt_pkt_mcs_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
48161a63978SXianjun Jiao {
48261a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
48361a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
48461a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
48561a63978SXianjun Jiao
48661a63978SXianjun Jiao bool use_ht_rate = ((priv->stat.tx_mgmt_pkt_mcs_realtime&0x80000000)!=0);
48761a63978SXianjun Jiao u32 rate_hw_value = (priv->stat.tx_mgmt_pkt_mcs_realtime&0x7fffffff);
48861a63978SXianjun Jiao
48961a63978SXianjun Jiao return sprintf(buf, "%uM\n", (use_ht_rate == false ? wifi_rate_all[rate_hw_value] : wifi_rate_all[rate_hw_value + 12]));
49061a63978SXianjun Jiao }
tx_mgmt_pkt_mcs_realtime_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)49161a63978SXianjun Jiao static ssize_t tx_mgmt_pkt_mcs_realtime_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
49261a63978SXianjun Jiao {
49361a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
49461a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
49561a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
49661a63978SXianjun Jiao
49761a63978SXianjun Jiao long readin;
49861a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
49961a63978SXianjun Jiao
50061a63978SXianjun Jiao priv->stat.tx_mgmt_pkt_mcs_realtime = readin;
50161a63978SXianjun Jiao
50261a63978SXianjun Jiao return ret ? ret : len;
50361a63978SXianjun Jiao }
50461a63978SXianjun Jiao
tx_mgmt_pkt_fail_mcs_realtime_show(struct device * input_dev,struct device_attribute * attr,char * buf)50561a63978SXianjun Jiao static ssize_t tx_mgmt_pkt_fail_mcs_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
50661a63978SXianjun Jiao {
50761a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
50861a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
50961a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
51061a63978SXianjun Jiao
51161a63978SXianjun Jiao bool use_ht_rate = ((priv->stat.tx_mgmt_pkt_fail_mcs_realtime&0x80000000)!=0);
51261a63978SXianjun Jiao u32 rate_hw_value = (priv->stat.tx_mgmt_pkt_fail_mcs_realtime&0x7fffffff);
51361a63978SXianjun Jiao
51461a63978SXianjun Jiao return sprintf(buf, "%uM\n", (use_ht_rate == false ? wifi_rate_all[rate_hw_value] : wifi_rate_all[rate_hw_value + 12]));
51561a63978SXianjun Jiao }
tx_mgmt_pkt_fail_mcs_realtime_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)51661a63978SXianjun Jiao static ssize_t tx_mgmt_pkt_fail_mcs_realtime_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
51761a63978SXianjun Jiao {
51861a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
51961a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
52061a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
52161a63978SXianjun Jiao
52261a63978SXianjun Jiao long readin;
52361a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
52461a63978SXianjun Jiao
52561a63978SXianjun Jiao priv->stat.tx_mgmt_pkt_fail_mcs_realtime = readin;
52661a63978SXianjun Jiao
52761a63978SXianjun Jiao return ret ? ret : len;
52861a63978SXianjun Jiao }
52961a63978SXianjun Jiao
tx_data_pkt_fail_mcs_realtime_show(struct device * input_dev,struct device_attribute * attr,char * buf)53061a63978SXianjun Jiao static ssize_t tx_data_pkt_fail_mcs_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
53161a63978SXianjun Jiao {
53261a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
53361a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
53461a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
53561a63978SXianjun Jiao
53661a63978SXianjun Jiao bool use_ht_rate = ((priv->stat.tx_data_pkt_fail_mcs_realtime&0x80000000)!=0);
53761a63978SXianjun Jiao u32 rate_hw_value = (priv->stat.tx_data_pkt_fail_mcs_realtime&0x7fffffff);
53861a63978SXianjun Jiao
53961a63978SXianjun Jiao return sprintf(buf, "%uM\n", (use_ht_rate == false ? wifi_rate_all[rate_hw_value] : wifi_rate_all[rate_hw_value + 12]));
54061a63978SXianjun Jiao }
tx_data_pkt_fail_mcs_realtime_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)54161a63978SXianjun Jiao static ssize_t tx_data_pkt_fail_mcs_realtime_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
54261a63978SXianjun Jiao {
54361a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
54461a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
54561a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
54661a63978SXianjun Jiao
54761a63978SXianjun Jiao long readin;
54861a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
54961a63978SXianjun Jiao
55061a63978SXianjun Jiao priv->stat.tx_data_pkt_fail_mcs_realtime = readin;
55161a63978SXianjun Jiao
55261a63978SXianjun Jiao return ret ? ret : len;
55361a63978SXianjun Jiao }
55461a63978SXianjun Jiao
rx_target_sender_mac_addr_show(struct device * input_dev,struct device_attribute * attr,char * buf)55561a63978SXianjun Jiao static ssize_t rx_target_sender_mac_addr_show(struct device *input_dev, struct device_attribute *attr, char *buf)
55661a63978SXianjun Jiao {
55761a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
55861a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
55961a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
56061a63978SXianjun Jiao
56161a63978SXianjun Jiao return sprintf(buf, "%08x\n", reverse32(priv->stat.rx_target_sender_mac_addr));
56261a63978SXianjun Jiao }
rx_target_sender_mac_addr_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)56361a63978SXianjun Jiao static ssize_t rx_target_sender_mac_addr_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
56461a63978SXianjun Jiao {
56561a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
56661a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
56761a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
56861a63978SXianjun Jiao
56961a63978SXianjun Jiao u32 readin;
57061a63978SXianjun Jiao u32 ret = kstrtouint(buf, 16, &readin);
57161a63978SXianjun Jiao
57261a63978SXianjun Jiao priv->stat.rx_target_sender_mac_addr = reverse32(readin);
57361a63978SXianjun Jiao
57461a63978SXianjun Jiao return ret ? ret : len;
57561a63978SXianjun Jiao }
57661a63978SXianjun Jiao
rx_data_ok_agc_gain_value_realtime_show(struct device * input_dev,struct device_attribute * attr,char * buf)57761a63978SXianjun Jiao static ssize_t rx_data_ok_agc_gain_value_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
57861a63978SXianjun Jiao {
57961a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
58061a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
58161a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
58261a63978SXianjun Jiao
58361a63978SXianjun Jiao return sprintf(buf, "%u\n", priv->stat.rx_data_ok_agc_gain_value_realtime);
58461a63978SXianjun Jiao }
rx_data_ok_agc_gain_value_realtime_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)58561a63978SXianjun Jiao static ssize_t rx_data_ok_agc_gain_value_realtime_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
58661a63978SXianjun Jiao {
58761a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
58861a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
58961a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
59061a63978SXianjun Jiao
59161a63978SXianjun Jiao long readin;
59261a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
59361a63978SXianjun Jiao
59461a63978SXianjun Jiao priv->stat.rx_data_ok_agc_gain_value_realtime = readin;
59561a63978SXianjun Jiao
59661a63978SXianjun Jiao return ret ? ret : len;
59761a63978SXianjun Jiao }
59861a63978SXianjun Jiao
rx_mgmt_ok_agc_gain_value_realtime_show(struct device * input_dev,struct device_attribute * attr,char * buf)59961a63978SXianjun Jiao static ssize_t rx_mgmt_ok_agc_gain_value_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
60061a63978SXianjun Jiao {
60161a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
60261a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
60361a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
60461a63978SXianjun Jiao
60561a63978SXianjun Jiao return sprintf(buf, "%u\n", priv->stat.rx_mgmt_ok_agc_gain_value_realtime);
60661a63978SXianjun Jiao }
rx_mgmt_ok_agc_gain_value_realtime_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)60761a63978SXianjun Jiao static ssize_t rx_mgmt_ok_agc_gain_value_realtime_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
60861a63978SXianjun Jiao {
60961a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
61061a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
61161a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
61261a63978SXianjun Jiao
61361a63978SXianjun Jiao long readin;
61461a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
61561a63978SXianjun Jiao
61661a63978SXianjun Jiao priv->stat.rx_mgmt_ok_agc_gain_value_realtime = readin;
61761a63978SXianjun Jiao
61861a63978SXianjun Jiao return ret ? ret : len;
61961a63978SXianjun Jiao }
62061a63978SXianjun Jiao
rx_data_fail_agc_gain_value_realtime_show(struct device * input_dev,struct device_attribute * attr,char * buf)62161a63978SXianjun Jiao static ssize_t rx_data_fail_agc_gain_value_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
62261a63978SXianjun Jiao {
62361a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
62461a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
62561a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
62661a63978SXianjun Jiao
62761a63978SXianjun Jiao return sprintf(buf, "%u\n", priv->stat.rx_data_fail_agc_gain_value_realtime);
62861a63978SXianjun Jiao }
rx_data_fail_agc_gain_value_realtime_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)62961a63978SXianjun Jiao static ssize_t rx_data_fail_agc_gain_value_realtime_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
63061a63978SXianjun Jiao {
63161a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
63261a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
63361a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
63461a63978SXianjun Jiao
63561a63978SXianjun Jiao long readin;
63661a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
63761a63978SXianjun Jiao
63861a63978SXianjun Jiao priv->stat.rx_data_fail_agc_gain_value_realtime = readin;
63961a63978SXianjun Jiao
64061a63978SXianjun Jiao return ret ? ret : len;
64161a63978SXianjun Jiao }
64261a63978SXianjun Jiao
rx_mgmt_fail_agc_gain_value_realtime_show(struct device * input_dev,struct device_attribute * attr,char * buf)64361a63978SXianjun Jiao static ssize_t rx_mgmt_fail_agc_gain_value_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
64461a63978SXianjun Jiao {
64561a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
64661a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
64761a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
64861a63978SXianjun Jiao
64961a63978SXianjun Jiao return sprintf(buf, "%u\n", priv->stat.rx_mgmt_fail_agc_gain_value_realtime);
65061a63978SXianjun Jiao }
rx_mgmt_fail_agc_gain_value_realtime_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)65161a63978SXianjun Jiao static ssize_t rx_mgmt_fail_agc_gain_value_realtime_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
65261a63978SXianjun Jiao {
65361a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
65461a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
65561a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
65661a63978SXianjun Jiao
65761a63978SXianjun Jiao long readin;
65861a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
65961a63978SXianjun Jiao
66061a63978SXianjun Jiao priv->stat.rx_mgmt_fail_agc_gain_value_realtime = readin;
66161a63978SXianjun Jiao
66261a63978SXianjun Jiao return ret ? ret : len;
66361a63978SXianjun Jiao }
66461a63978SXianjun Jiao
rx_ack_ok_agc_gain_value_realtime_show(struct device * input_dev,struct device_attribute * attr,char * buf)66561a63978SXianjun Jiao static ssize_t rx_ack_ok_agc_gain_value_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
66661a63978SXianjun Jiao {
66761a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
66861a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
66961a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
67061a63978SXianjun Jiao
67161a63978SXianjun Jiao return sprintf(buf, "%u\n", priv->stat.rx_ack_ok_agc_gain_value_realtime);
67261a63978SXianjun Jiao }
rx_ack_ok_agc_gain_value_realtime_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)67361a63978SXianjun Jiao static ssize_t rx_ack_ok_agc_gain_value_realtime_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
67461a63978SXianjun Jiao {
67561a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
67661a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
67761a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
67861a63978SXianjun Jiao
67961a63978SXianjun Jiao long readin;
68061a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
68161a63978SXianjun Jiao
68261a63978SXianjun Jiao priv->stat.rx_ack_ok_agc_gain_value_realtime = readin;
68361a63978SXianjun Jiao
68461a63978SXianjun Jiao return ret ? ret : len;
68561a63978SXianjun Jiao }
68661a63978SXianjun Jiao
rx_monitor_all_show(struct device * input_dev,struct device_attribute * attr,char * buf)68761a63978SXianjun Jiao static ssize_t rx_monitor_all_show(struct device *input_dev, struct device_attribute *attr, char *buf)
68861a63978SXianjun Jiao {
68961a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
69061a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
69161a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
69261a63978SXianjun Jiao
69361a63978SXianjun Jiao return sprintf(buf, "%u\n", priv->stat.rx_monitor_all);
69461a63978SXianjun Jiao }
rx_monitor_all_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)69561a63978SXianjun Jiao static ssize_t rx_monitor_all_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
69661a63978SXianjun Jiao {
69761a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
69861a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
69961a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
70061a63978SXianjun Jiao
70161a63978SXianjun Jiao long readin;
70261a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
70361a63978SXianjun Jiao u32 filter_flag;
70461a63978SXianjun Jiao
70561a63978SXianjun Jiao priv->stat.rx_monitor_all = readin;
70661a63978SXianjun Jiao
70761a63978SXianjun Jiao filter_flag = xpu_api->XPU_REG_FILTER_FLAG_read();
70861a63978SXianjun Jiao if (readin>0) {// set to fpga
70961a63978SXianjun Jiao filter_flag = (filter_flag|MONITOR_ALL);
71061a63978SXianjun Jiao } else {
71161a63978SXianjun Jiao filter_flag = (filter_flag&(~MONITOR_ALL));
71261a63978SXianjun Jiao }
71361a63978SXianjun Jiao xpu_api->XPU_REG_FILTER_FLAG_write(filter_flag);
71461a63978SXianjun Jiao
71561a63978SXianjun Jiao return ret ? ret : len;
71661a63978SXianjun Jiao }
71761a63978SXianjun Jiao
rx_data_pkt_num_total_show(struct device * input_dev,struct device_attribute * attr,char * buf)71861a63978SXianjun Jiao static ssize_t rx_data_pkt_num_total_show(struct device *input_dev, struct device_attribute *attr, char *buf)
71961a63978SXianjun Jiao {
72061a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
72161a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
72261a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
72361a63978SXianjun Jiao
72461a63978SXianjun Jiao return sprintf(buf, "%u\n", priv->stat.rx_data_pkt_num_total);
72561a63978SXianjun Jiao }
rx_data_pkt_num_total_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)72661a63978SXianjun Jiao static ssize_t rx_data_pkt_num_total_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
72761a63978SXianjun Jiao {
72861a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
72961a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
73061a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
73161a63978SXianjun Jiao
73261a63978SXianjun Jiao long readin;
73361a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
73461a63978SXianjun Jiao
73561a63978SXianjun Jiao priv->stat.rx_data_pkt_num_total = readin;
73661a63978SXianjun Jiao
73761a63978SXianjun Jiao return ret ? ret : len;
73861a63978SXianjun Jiao }
73961a63978SXianjun Jiao
rx_data_pkt_num_fail_show(struct device * input_dev,struct device_attribute * attr,char * buf)74061a63978SXianjun Jiao static ssize_t rx_data_pkt_num_fail_show(struct device *input_dev, struct device_attribute *attr, char *buf)
74161a63978SXianjun Jiao {
74261a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
74361a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
74461a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
74561a63978SXianjun Jiao
74661a63978SXianjun Jiao return sprintf(buf, "%u\n", priv->stat.rx_data_pkt_num_fail);
74761a63978SXianjun Jiao }
rx_data_pkt_num_fail_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)74861a63978SXianjun Jiao static ssize_t rx_data_pkt_num_fail_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
74961a63978SXianjun Jiao {
75061a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
75161a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
75261a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
75361a63978SXianjun Jiao
75461a63978SXianjun Jiao long readin;
75561a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
75661a63978SXianjun Jiao
75761a63978SXianjun Jiao priv->stat.rx_data_pkt_num_fail = readin;
75861a63978SXianjun Jiao
75961a63978SXianjun Jiao return ret ? ret : len;
76061a63978SXianjun Jiao }
76161a63978SXianjun Jiao
rx_mgmt_pkt_num_total_show(struct device * input_dev,struct device_attribute * attr,char * buf)76261a63978SXianjun Jiao static ssize_t rx_mgmt_pkt_num_total_show(struct device *input_dev, struct device_attribute *attr, char *buf)
76361a63978SXianjun Jiao {
76461a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
76561a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
76661a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
76761a63978SXianjun Jiao
76861a63978SXianjun Jiao return sprintf(buf, "%u\n", priv->stat.rx_mgmt_pkt_num_total);
76961a63978SXianjun Jiao }
rx_mgmt_pkt_num_total_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)77061a63978SXianjun Jiao static ssize_t rx_mgmt_pkt_num_total_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
77161a63978SXianjun Jiao {
77261a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
77361a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
77461a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
77561a63978SXianjun Jiao
77661a63978SXianjun Jiao long readin;
77761a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
77861a63978SXianjun Jiao
77961a63978SXianjun Jiao priv->stat.rx_mgmt_pkt_num_total = readin;
78061a63978SXianjun Jiao
78161a63978SXianjun Jiao return ret ? ret : len;
78261a63978SXianjun Jiao }
78361a63978SXianjun Jiao
rx_mgmt_pkt_num_fail_show(struct device * input_dev,struct device_attribute * attr,char * buf)78461a63978SXianjun Jiao static ssize_t rx_mgmt_pkt_num_fail_show(struct device *input_dev, struct device_attribute *attr, char *buf)
78561a63978SXianjun Jiao {
78661a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
78761a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
78861a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
78961a63978SXianjun Jiao
79061a63978SXianjun Jiao return sprintf(buf, "%u\n", priv->stat.rx_mgmt_pkt_num_fail);
79161a63978SXianjun Jiao }
rx_mgmt_pkt_num_fail_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)79261a63978SXianjun Jiao static ssize_t rx_mgmt_pkt_num_fail_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
79361a63978SXianjun Jiao {
79461a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
79561a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
79661a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
79761a63978SXianjun Jiao
79861a63978SXianjun Jiao long readin;
79961a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
80061a63978SXianjun Jiao
80161a63978SXianjun Jiao priv->stat.rx_mgmt_pkt_num_fail = readin;
80261a63978SXianjun Jiao
80361a63978SXianjun Jiao return ret ? ret : len;
80461a63978SXianjun Jiao }
80561a63978SXianjun Jiao
rx_ack_pkt_num_total_show(struct device * input_dev,struct device_attribute * attr,char * buf)80661a63978SXianjun Jiao static ssize_t rx_ack_pkt_num_total_show(struct device *input_dev, struct device_attribute *attr, char *buf)
80761a63978SXianjun Jiao {
80861a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
80961a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
81061a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
81161a63978SXianjun Jiao
81261a63978SXianjun Jiao return sprintf(buf, "%u\n", priv->stat.rx_ack_pkt_num_total);
81361a63978SXianjun Jiao }
rx_ack_pkt_num_total_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)81461a63978SXianjun Jiao static ssize_t rx_ack_pkt_num_total_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
81561a63978SXianjun Jiao {
81661a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
81761a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
81861a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
81961a63978SXianjun Jiao
82061a63978SXianjun Jiao long readin;
82161a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
82261a63978SXianjun Jiao
82361a63978SXianjun Jiao priv->stat.rx_ack_pkt_num_total = readin;
82461a63978SXianjun Jiao
82561a63978SXianjun Jiao return ret ? ret : len;
82661a63978SXianjun Jiao }
82761a63978SXianjun Jiao
rx_ack_pkt_num_fail_show(struct device * input_dev,struct device_attribute * attr,char * buf)82861a63978SXianjun Jiao static ssize_t rx_ack_pkt_num_fail_show(struct device *input_dev, struct device_attribute *attr, char *buf)
82961a63978SXianjun Jiao {
83061a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
83161a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
83261a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
83361a63978SXianjun Jiao
83461a63978SXianjun Jiao return sprintf(buf, "%u\n", priv->stat.rx_ack_pkt_num_fail);
83561a63978SXianjun Jiao }
rx_ack_pkt_num_fail_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)83661a63978SXianjun Jiao static ssize_t rx_ack_pkt_num_fail_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
83761a63978SXianjun Jiao {
83861a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
83961a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
84061a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
84161a63978SXianjun Jiao
84261a63978SXianjun Jiao long readin;
84361a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
84461a63978SXianjun Jiao
84561a63978SXianjun Jiao priv->stat.rx_ack_pkt_num_fail = readin;
84661a63978SXianjun Jiao
84761a63978SXianjun Jiao return ret ? ret : len;
84861a63978SXianjun Jiao }
84961a63978SXianjun Jiao
rx_data_pkt_mcs_realtime_show(struct device * input_dev,struct device_attribute * attr,char * buf)85061a63978SXianjun Jiao static ssize_t rx_data_pkt_mcs_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
85161a63978SXianjun Jiao {
85261a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
85361a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
85461a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
85561a63978SXianjun Jiao
85661a63978SXianjun Jiao return sprintf(buf, "%uM\n", wifi_rate_table[priv->stat.rx_data_pkt_mcs_realtime]);
85761a63978SXianjun Jiao }
rx_data_pkt_mcs_realtime_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)85861a63978SXianjun Jiao static ssize_t rx_data_pkt_mcs_realtime_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
85961a63978SXianjun Jiao {
86061a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
86161a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
86261a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
86361a63978SXianjun Jiao
86461a63978SXianjun Jiao long readin;
86561a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
86661a63978SXianjun Jiao
86761a63978SXianjun Jiao priv->stat.rx_data_pkt_mcs_realtime = readin;
86861a63978SXianjun Jiao
86961a63978SXianjun Jiao return ret ? ret : len;
87061a63978SXianjun Jiao }
87161a63978SXianjun Jiao
rx_data_pkt_fail_mcs_realtime_show(struct device * input_dev,struct device_attribute * attr,char * buf)87261a63978SXianjun Jiao static ssize_t rx_data_pkt_fail_mcs_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
87361a63978SXianjun Jiao {
87461a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
87561a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
87661a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
87761a63978SXianjun Jiao
87861a63978SXianjun Jiao return sprintf(buf, "%uM\n", wifi_rate_table[priv->stat.rx_data_pkt_fail_mcs_realtime]);
87961a63978SXianjun Jiao }
rx_data_pkt_fail_mcs_realtime_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)88061a63978SXianjun Jiao static ssize_t rx_data_pkt_fail_mcs_realtime_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
88161a63978SXianjun Jiao {
88261a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
88361a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
88461a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
88561a63978SXianjun Jiao
88661a63978SXianjun Jiao long readin;
88761a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
88861a63978SXianjun Jiao
88961a63978SXianjun Jiao priv->stat.rx_data_pkt_fail_mcs_realtime = readin;
89061a63978SXianjun Jiao
89161a63978SXianjun Jiao return ret ? ret : len;
89261a63978SXianjun Jiao }
89361a63978SXianjun Jiao
rx_mgmt_pkt_mcs_realtime_show(struct device * input_dev,struct device_attribute * attr,char * buf)89461a63978SXianjun Jiao static ssize_t rx_mgmt_pkt_mcs_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
89561a63978SXianjun Jiao {
89661a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
89761a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
89861a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
89961a63978SXianjun Jiao
90061a63978SXianjun Jiao return sprintf(buf, "%uM\n", wifi_rate_table[priv->stat.rx_mgmt_pkt_mcs_realtime]);
90161a63978SXianjun Jiao }
rx_mgmt_pkt_mcs_realtime_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)90261a63978SXianjun Jiao static ssize_t rx_mgmt_pkt_mcs_realtime_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
90361a63978SXianjun Jiao {
90461a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
90561a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
90661a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
90761a63978SXianjun Jiao
90861a63978SXianjun Jiao long readin;
90961a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
91061a63978SXianjun Jiao
91161a63978SXianjun Jiao priv->stat.rx_mgmt_pkt_mcs_realtime = readin;
91261a63978SXianjun Jiao
91361a63978SXianjun Jiao return ret ? ret : len;
91461a63978SXianjun Jiao }
91561a63978SXianjun Jiao
rx_mgmt_pkt_fail_mcs_realtime_show(struct device * input_dev,struct device_attribute * attr,char * buf)91661a63978SXianjun Jiao static ssize_t rx_mgmt_pkt_fail_mcs_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
91761a63978SXianjun Jiao {
91861a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
91961a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
92061a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
92161a63978SXianjun Jiao
92261a63978SXianjun Jiao return sprintf(buf, "%uM\n", wifi_rate_table[priv->stat.rx_mgmt_pkt_fail_mcs_realtime]);
92361a63978SXianjun Jiao }
rx_mgmt_pkt_fail_mcs_realtime_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)92461a63978SXianjun Jiao static ssize_t rx_mgmt_pkt_fail_mcs_realtime_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
92561a63978SXianjun Jiao {
92661a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
92761a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
92861a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
92961a63978SXianjun Jiao
93061a63978SXianjun Jiao long readin;
93161a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
93261a63978SXianjun Jiao
93361a63978SXianjun Jiao priv->stat.rx_mgmt_pkt_fail_mcs_realtime = readin;
93461a63978SXianjun Jiao
93561a63978SXianjun Jiao return ret ? ret : len;
93661a63978SXianjun Jiao }
93761a63978SXianjun Jiao
rx_ack_pkt_mcs_realtime_show(struct device * input_dev,struct device_attribute * attr,char * buf)93861a63978SXianjun Jiao static ssize_t rx_ack_pkt_mcs_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
93961a63978SXianjun Jiao {
94061a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
94161a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
94261a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
94361a63978SXianjun Jiao
94461a63978SXianjun Jiao return sprintf(buf, "%uM\n", wifi_rate_table[priv->stat.rx_ack_pkt_mcs_realtime]);
94561a63978SXianjun Jiao }
rx_ack_pkt_mcs_realtime_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)94661a63978SXianjun Jiao static ssize_t rx_ack_pkt_mcs_realtime_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
94761a63978SXianjun Jiao {
94861a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
94961a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
95061a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
95161a63978SXianjun Jiao
95261a63978SXianjun Jiao long readin;
95361a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
95461a63978SXianjun Jiao
95561a63978SXianjun Jiao priv->stat.rx_ack_pkt_mcs_realtime = readin;
95661a63978SXianjun Jiao
95761a63978SXianjun Jiao return ret ? ret : len;
95861a63978SXianjun Jiao }
95961a63978SXianjun Jiao
restrict_freq_mhz_show(struct device * input_dev,struct device_attribute * attr,char * buf)96061a63978SXianjun Jiao static ssize_t restrict_freq_mhz_show(struct device *input_dev, struct device_attribute *attr, char *buf)
96161a63978SXianjun Jiao {
96261a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
96361a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
96461a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
96561a63978SXianjun Jiao
96661a63978SXianjun Jiao return sprintf(buf, "%u\n", priv->stat.restrict_freq_mhz);
96761a63978SXianjun Jiao }
restrict_freq_mhz_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)96861a63978SXianjun Jiao static ssize_t restrict_freq_mhz_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
96961a63978SXianjun Jiao {
97061a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
97161a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
97261a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
97361a63978SXianjun Jiao
97461a63978SXianjun Jiao long readin;
97561a63978SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
97661a63978SXianjun Jiao
97761a63978SXianjun Jiao priv->stat.restrict_freq_mhz = readin;
97861a63978SXianjun Jiao
97961a63978SXianjun Jiao return ret ? ret : len;
98061a63978SXianjun Jiao }
98161a63978SXianjun Jiao
csma_cfg0_show(struct device * input_dev,struct device_attribute * attr,char * buf)98261a63978SXianjun Jiao static ssize_t csma_cfg0_show(struct device *input_dev, struct device_attribute *attr, char *buf)
98361a63978SXianjun Jiao {
98461a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
98561a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
98661a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
98761a63978SXianjun Jiao
98861a63978SXianjun Jiao u32 reg_val;
98961a63978SXianjun Jiao
99061a63978SXianjun Jiao reg_val = xpu_api->XPU_REG_FORCE_IDLE_MISC_read();
99161a63978SXianjun Jiao priv->stat.csma_cfg0 = reg_val;
99261a63978SXianjun Jiao
993*aaceb807SXianjun Jiao return sprintf(buf, "nav_disable %d difs_disable %d eifs_disable %d eifs_by_rx_fail_disable %d eifs_by_tx_fail_disable %d cw_override %d cw override val %d wait_after_decode_top %d\n",
99461a63978SXianjun Jiao (reg_val>>31)&1,
99561a63978SXianjun Jiao (reg_val>>30)&1,
99661a63978SXianjun Jiao (reg_val>>29)&1,
997*aaceb807SXianjun Jiao (reg_val>>27)&1,
998*aaceb807SXianjun Jiao (reg_val>>26)&1,
99961a63978SXianjun Jiao (reg_val>>28)&1,
100061a63978SXianjun Jiao (reg_val>>16)&0xf,
100161a63978SXianjun Jiao (reg_val>>0)&0xff);
100261a63978SXianjun Jiao }
csma_cfg0_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)100361a63978SXianjun Jiao static ssize_t csma_cfg0_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
100461a63978SXianjun Jiao {
100561a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
100661a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
100761a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
100861a63978SXianjun Jiao
100961a63978SXianjun Jiao u32 disable_flag, idx_from_msb, reg_val;
101061a63978SXianjun Jiao u32 readin;
101161a63978SXianjun Jiao u32 ret = kstrtouint(buf, 16, &readin);
101261a63978SXianjun Jiao
101361a63978SXianjun Jiao disable_flag = (readin&0xf);
101461a63978SXianjun Jiao idx_from_msb = ((readin>>4)&0xf);
101561a63978SXianjun Jiao
101661a63978SXianjun Jiao reg_val = xpu_api->XPU_REG_FORCE_IDLE_MISC_read();
101761a63978SXianjun Jiao
101861a63978SXianjun Jiao if (disable_flag)
101961a63978SXianjun Jiao reg_val = (reg_val|(1<<(31-idx_from_msb)));
102061a63978SXianjun Jiao else
102161a63978SXianjun Jiao reg_val = (reg_val&(~(1<<(31-idx_from_msb))));
102261a63978SXianjun Jiao
102361a63978SXianjun Jiao xpu_api->XPU_REG_FORCE_IDLE_MISC_write(reg_val);
102461a63978SXianjun Jiao
102561a63978SXianjun Jiao priv->stat.csma_cfg0 = reg_val;
102661a63978SXianjun Jiao
102761a63978SXianjun Jiao return ret ? ret : len;
102861a63978SXianjun Jiao }
102961a63978SXianjun Jiao
cw_max_min_cfg_show(struct device * input_dev,struct device_attribute * attr,char * buf)103061a63978SXianjun Jiao static ssize_t cw_max_min_cfg_show(struct device *input_dev, struct device_attribute *attr, char *buf)
103161a63978SXianjun Jiao {
103261a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
103361a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
103461a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
103561a63978SXianjun Jiao
103661a63978SXianjun Jiao u32 ret_size, reg_val;
103761a63978SXianjun Jiao
103861a63978SXianjun Jiao reg_val = xpu_api->XPU_REG_CSMA_CFG_read();
103961a63978SXianjun Jiao
104061a63978SXianjun Jiao ret_size = sprintf(buf, "FPGA cw max min for q3 to q0: %d %d; %d %d; %d %d; %d %d\n",
104161a63978SXianjun Jiao (1<<((reg_val>>28)&0xF))-1,
104261a63978SXianjun Jiao (1<<((reg_val>>24)&0xF))-1,
104361a63978SXianjun Jiao (1<<((reg_val>>20)&0xF))-1,
104461a63978SXianjun Jiao (1<<((reg_val>>16)&0xF))-1,
104561a63978SXianjun Jiao (1<<((reg_val>>12)&0xF))-1,
104661a63978SXianjun Jiao (1<<((reg_val>> 8)&0xF))-1,
104761a63978SXianjun Jiao (1<<((reg_val>> 4)&0xF))-1,
104861a63978SXianjun Jiao (1<<((reg_val>> 0)&0xF))-1);
104961a63978SXianjun Jiao ret_size = ret_size + sprintf(buf+ret_size, "FPGA cw max min for q3 to q0: %08x\n",reg_val);
105061a63978SXianjun Jiao
105161a63978SXianjun Jiao if (priv->stat.cw_max_min_cfg) {
105261a63978SXianjun Jiao reg_val = priv->stat.cw_max_min_cfg;
105361a63978SXianjun Jiao ret_size = ret_size + sprintf(buf+ret_size, "SYSFS cw max min for q3 to q0: %d %d; %d %d; %d %d; %d %d\n",
105461a63978SXianjun Jiao (1<<((reg_val>>28)&0xF))-1,
105561a63978SXianjun Jiao (1<<((reg_val>>24)&0xF))-1,
105661a63978SXianjun Jiao (1<<((reg_val>>20)&0xF))-1,
105761a63978SXianjun Jiao (1<<((reg_val>>16)&0xF))-1,
105861a63978SXianjun Jiao (1<<((reg_val>>12)&0xF))-1,
105961a63978SXianjun Jiao (1<<((reg_val>> 8)&0xF))-1,
106061a63978SXianjun Jiao (1<<((reg_val>> 4)&0xF))-1,
106161a63978SXianjun Jiao (1<<((reg_val>> 0)&0xF))-1);
106261a63978SXianjun Jiao ret_size = ret_size + sprintf(buf+ret_size, "SYSFS cw max min for q3 to q0: %08x\n",reg_val);
106361a63978SXianjun Jiao }
106461a63978SXianjun Jiao
106561a63978SXianjun Jiao return ret_size;
106661a63978SXianjun Jiao }
106761a63978SXianjun Jiao
cw_max_min_cfg_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)106861a63978SXianjun Jiao static ssize_t cw_max_min_cfg_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
106961a63978SXianjun Jiao {
107061a63978SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
107161a63978SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
107261a63978SXianjun Jiao struct openwifi_priv *priv = dev->priv;
107361a63978SXianjun Jiao
107461a63978SXianjun Jiao u32 readin;
107561a63978SXianjun Jiao u32 ret = kstrtouint(buf, 16, &readin);
107661a63978SXianjun Jiao
107761a63978SXianjun Jiao // printk("%s %d\n", buf, readin);
107861a63978SXianjun Jiao
107961a63978SXianjun Jiao priv->stat.cw_max_min_cfg = readin;
108061a63978SXianjun Jiao if (readin)
108161a63978SXianjun Jiao xpu_api->XPU_REG_CSMA_CFG_write(readin);
108261a63978SXianjun Jiao
108361a63978SXianjun Jiao return ret ? ret : len;
108461a63978SXianjun Jiao }
108561a63978SXianjun Jiao
dbg_ch0_show(struct device * input_dev,struct device_attribute * attr,char * buf)10866bb9ef71SXianjun Jiao static ssize_t dbg_ch0_show(struct device *input_dev, struct device_attribute *attr, char *buf)
10876bb9ef71SXianjun Jiao {
10886bb9ef71SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
10896bb9ef71SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
10906bb9ef71SXianjun Jiao struct openwifi_priv *priv = dev->priv;
10916bb9ef71SXianjun Jiao
10926bb9ef71SXianjun Jiao return sprintf(buf, "%u\n", priv->stat.dbg_ch0);
10936bb9ef71SXianjun Jiao }
dbg_ch0_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)10946bb9ef71SXianjun Jiao static ssize_t dbg_ch0_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
10956bb9ef71SXianjun Jiao {
10966bb9ef71SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
10976bb9ef71SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
10986bb9ef71SXianjun Jiao struct openwifi_priv *priv = dev->priv;
10996bb9ef71SXianjun Jiao
11006bb9ef71SXianjun Jiao long readin;
11016bb9ef71SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
11026bb9ef71SXianjun Jiao
11036bb9ef71SXianjun Jiao priv->stat.dbg_ch0 = readin;
11046bb9ef71SXianjun Jiao
11056bb9ef71SXianjun Jiao // xpu_api->XPU_REG_DIFS_ADVANCE_write((readin<<16)|2); //us. bit31~16 max pkt length threshold
11066bb9ef71SXianjun Jiao // rx_intf_api->RX_INTF_REG_START_TRANS_TO_PS_write(readin<<16); //bit31~16 max pkt length threshold
11076bb9ef71SXianjun Jiao // openofdm_rx_api->OPENOFDM_RX_REG_SOFT_DECODING_write((readin<<16)|1); //bit1 enable soft decoding; bit31~16 max pkt length threshold
11086bb9ef71SXianjun Jiao
11096bb9ef71SXianjun Jiao return ret ? ret : len;
11106bb9ef71SXianjun Jiao }
11116bb9ef71SXianjun Jiao
dbg_ch1_show(struct device * input_dev,struct device_attribute * attr,char * buf)11126bb9ef71SXianjun Jiao static ssize_t dbg_ch1_show(struct device *input_dev, struct device_attribute *attr, char *buf)
11136bb9ef71SXianjun Jiao {
11146bb9ef71SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
11156bb9ef71SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
11166bb9ef71SXianjun Jiao struct openwifi_priv *priv = dev->priv;
11176bb9ef71SXianjun Jiao
11186bb9ef71SXianjun Jiao return sprintf(buf, "%u\n", priv->stat.dbg_ch1);
11196bb9ef71SXianjun Jiao }
dbg_ch1_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)11206bb9ef71SXianjun Jiao static ssize_t dbg_ch1_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
11216bb9ef71SXianjun Jiao {
11226bb9ef71SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
11236bb9ef71SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
11246bb9ef71SXianjun Jiao struct openwifi_priv *priv = dev->priv;
11256bb9ef71SXianjun Jiao
11266bb9ef71SXianjun Jiao long readin;
11276bb9ef71SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
11286bb9ef71SXianjun Jiao
11296bb9ef71SXianjun Jiao priv->stat.dbg_ch1 = readin;
11306bb9ef71SXianjun Jiao
11316bb9ef71SXianjun Jiao return ret ? ret : len;
11326bb9ef71SXianjun Jiao }
11336bb9ef71SXianjun Jiao
dbg_ch2_show(struct device * input_dev,struct device_attribute * attr,char * buf)11346bb9ef71SXianjun Jiao static ssize_t dbg_ch2_show(struct device *input_dev, struct device_attribute *attr, char *buf)
11356bb9ef71SXianjun Jiao {
11366bb9ef71SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
11376bb9ef71SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
11386bb9ef71SXianjun Jiao struct openwifi_priv *priv = dev->priv;
11396bb9ef71SXianjun Jiao
11406bb9ef71SXianjun Jiao return sprintf(buf, "%u\n", priv->stat.dbg_ch2);
11416bb9ef71SXianjun Jiao }
dbg_ch2_store(struct device * input_dev,struct device_attribute * attr,const char * buf,size_t len)11426bb9ef71SXianjun Jiao static ssize_t dbg_ch2_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
11436bb9ef71SXianjun Jiao {
11446bb9ef71SXianjun Jiao struct platform_device *pdev = to_platform_device(input_dev);
11456bb9ef71SXianjun Jiao struct ieee80211_hw *dev = platform_get_drvdata(pdev);
11466bb9ef71SXianjun Jiao struct openwifi_priv *priv = dev->priv;
11476bb9ef71SXianjun Jiao
11486bb9ef71SXianjun Jiao long readin;
11496bb9ef71SXianjun Jiao u32 ret = kstrtol(buf, 10, &readin);
11506bb9ef71SXianjun Jiao
11516bb9ef71SXianjun Jiao priv->stat.dbg_ch2 = readin;
11526bb9ef71SXianjun Jiao
11536bb9ef71SXianjun Jiao return ret ? ret : len;
11546bb9ef71SXianjun Jiao }
11556bb9ef71SXianjun Jiao
115661a63978SXianjun Jiao static DEVICE_ATTR(stat_enable, S_IRUGO | S_IWUSR, stat_enable_show, stat_enable_store);
115761a63978SXianjun Jiao static DEVICE_ATTR(tx_prio_queue, S_IRUGO | S_IWUSR, tx_prio_queue_show, tx_prio_queue_store);
115861a63978SXianjun Jiao static DEVICE_ATTR(tx_data_pkt_need_ack_num_total, S_IRUGO | S_IWUSR, tx_data_pkt_need_ack_num_total_show, tx_data_pkt_need_ack_num_total_store);
115961a63978SXianjun Jiao static DEVICE_ATTR(tx_data_pkt_need_ack_num_total_fail, S_IRUGO | S_IWUSR, tx_data_pkt_need_ack_num_total_fail_show, tx_data_pkt_need_ack_num_total_fail_store);
116061a63978SXianjun Jiao static DEVICE_ATTR(tx_data_pkt_need_ack_num_retx, S_IRUGO | S_IWUSR, tx_data_pkt_need_ack_num_retx_show, tx_data_pkt_need_ack_num_retx_store);
116161a63978SXianjun Jiao static DEVICE_ATTR(tx_data_pkt_need_ack_num_retx_fail, S_IRUGO | S_IWUSR, tx_data_pkt_need_ack_num_retx_fail_show, tx_data_pkt_need_ack_num_retx_fail_store);
116261a63978SXianjun Jiao
116361a63978SXianjun Jiao static DEVICE_ATTR(tx_data_pkt_mcs_realtime, S_IRUGO | S_IWUSR, tx_data_pkt_mcs_realtime_show, tx_data_pkt_mcs_realtime_store);
116461a63978SXianjun Jiao static DEVICE_ATTR(tx_data_pkt_fail_mcs_realtime, S_IRUGO | S_IWUSR, tx_data_pkt_fail_mcs_realtime_show, tx_data_pkt_fail_mcs_realtime_store);
116561a63978SXianjun Jiao
116661a63978SXianjun Jiao static DEVICE_ATTR(tx_mgmt_pkt_need_ack_num_total, S_IRUGO | S_IWUSR, tx_mgmt_pkt_need_ack_num_total_show, tx_mgmt_pkt_need_ack_num_total_store);
116761a63978SXianjun Jiao static DEVICE_ATTR(tx_mgmt_pkt_need_ack_num_total_fail, S_IRUGO | S_IWUSR, tx_mgmt_pkt_need_ack_num_total_fail_show, tx_mgmt_pkt_need_ack_num_total_fail_store);
116861a63978SXianjun Jiao static DEVICE_ATTR(tx_mgmt_pkt_need_ack_num_retx, S_IRUGO | S_IWUSR, tx_mgmt_pkt_need_ack_num_retx_show, tx_mgmt_pkt_need_ack_num_retx_store);
116961a63978SXianjun Jiao static DEVICE_ATTR(tx_mgmt_pkt_need_ack_num_retx_fail, S_IRUGO | S_IWUSR, tx_mgmt_pkt_need_ack_num_retx_fail_show, tx_mgmt_pkt_need_ack_num_retx_fail_store);
117061a63978SXianjun Jiao
117161a63978SXianjun Jiao static DEVICE_ATTR(tx_mgmt_pkt_mcs_realtime, S_IRUGO | S_IWUSR, tx_mgmt_pkt_mcs_realtime_show, tx_mgmt_pkt_mcs_realtime_store);
117261a63978SXianjun Jiao static DEVICE_ATTR(tx_mgmt_pkt_fail_mcs_realtime, S_IRUGO | S_IWUSR, tx_mgmt_pkt_fail_mcs_realtime_show, tx_mgmt_pkt_fail_mcs_realtime_store);
117361a63978SXianjun Jiao
117461a63978SXianjun Jiao static DEVICE_ATTR(rx_target_sender_mac_addr, S_IRUGO | S_IWUSR, rx_target_sender_mac_addr_show, rx_target_sender_mac_addr_store);
117561a63978SXianjun Jiao static DEVICE_ATTR(rx_data_ok_agc_gain_value_realtime, S_IRUGO | S_IWUSR, rx_data_ok_agc_gain_value_realtime_show, rx_data_ok_agc_gain_value_realtime_store);
117661a63978SXianjun Jiao static DEVICE_ATTR(rx_data_fail_agc_gain_value_realtime, S_IRUGO | S_IWUSR, rx_data_fail_agc_gain_value_realtime_show, rx_data_fail_agc_gain_value_realtime_store);
117761a63978SXianjun Jiao static DEVICE_ATTR(rx_mgmt_ok_agc_gain_value_realtime, S_IRUGO | S_IWUSR, rx_mgmt_ok_agc_gain_value_realtime_show, rx_mgmt_ok_agc_gain_value_realtime_store);
117861a63978SXianjun Jiao static DEVICE_ATTR(rx_mgmt_fail_agc_gain_value_realtime, S_IRUGO | S_IWUSR, rx_mgmt_fail_agc_gain_value_realtime_show, rx_mgmt_fail_agc_gain_value_realtime_store);
117961a63978SXianjun Jiao static DEVICE_ATTR(rx_ack_ok_agc_gain_value_realtime, S_IRUGO | S_IWUSR, rx_ack_ok_agc_gain_value_realtime_show, rx_ack_ok_agc_gain_value_realtime_store);
118061a63978SXianjun Jiao
118161a63978SXianjun Jiao static DEVICE_ATTR(rx_monitor_all, S_IRUGO | S_IWUSR, rx_monitor_all_show, rx_monitor_all_store);
118261a63978SXianjun Jiao static DEVICE_ATTR(rx_data_pkt_num_total, S_IRUGO | S_IWUSR, rx_data_pkt_num_total_show, rx_data_pkt_num_total_store);
118361a63978SXianjun Jiao static DEVICE_ATTR(rx_data_pkt_num_fail, S_IRUGO | S_IWUSR, rx_data_pkt_num_fail_show, rx_data_pkt_num_fail_store);
118461a63978SXianjun Jiao static DEVICE_ATTR(rx_mgmt_pkt_num_total, S_IRUGO | S_IWUSR, rx_mgmt_pkt_num_total_show, rx_mgmt_pkt_num_total_store);
118561a63978SXianjun Jiao static DEVICE_ATTR(rx_mgmt_pkt_num_fail, S_IRUGO | S_IWUSR, rx_mgmt_pkt_num_fail_show, rx_mgmt_pkt_num_fail_store);
118661a63978SXianjun Jiao static DEVICE_ATTR(rx_ack_pkt_num_total, S_IRUGO | S_IWUSR, rx_ack_pkt_num_total_show, rx_ack_pkt_num_total_store);
118761a63978SXianjun Jiao static DEVICE_ATTR(rx_ack_pkt_num_fail, S_IRUGO | S_IWUSR, rx_ack_pkt_num_fail_show, rx_ack_pkt_num_fail_store);
118861a63978SXianjun Jiao
118961a63978SXianjun Jiao static DEVICE_ATTR(rx_data_pkt_mcs_realtime, S_IRUGO | S_IWUSR, rx_data_pkt_mcs_realtime_show, rx_data_pkt_mcs_realtime_store);
119061a63978SXianjun Jiao static DEVICE_ATTR(rx_data_pkt_fail_mcs_realtime, S_IRUGO | S_IWUSR, rx_data_pkt_fail_mcs_realtime_show, rx_data_pkt_fail_mcs_realtime_store);
119161a63978SXianjun Jiao static DEVICE_ATTR(rx_mgmt_pkt_mcs_realtime, S_IRUGO | S_IWUSR, rx_mgmt_pkt_mcs_realtime_show, rx_mgmt_pkt_mcs_realtime_store);
119261a63978SXianjun Jiao static DEVICE_ATTR(rx_mgmt_pkt_fail_mcs_realtime, S_IRUGO | S_IWUSR, rx_mgmt_pkt_fail_mcs_realtime_show, rx_mgmt_pkt_fail_mcs_realtime_store);
119361a63978SXianjun Jiao static DEVICE_ATTR(rx_ack_pkt_mcs_realtime, S_IRUGO | S_IWUSR, rx_ack_pkt_mcs_realtime_show, rx_ack_pkt_mcs_realtime_store);
119461a63978SXianjun Jiao
119561a63978SXianjun Jiao static DEVICE_ATTR(restrict_freq_mhz, S_IRUGO | S_IWUSR, restrict_freq_mhz_show, restrict_freq_mhz_store);
119661a63978SXianjun Jiao
119761a63978SXianjun Jiao static DEVICE_ATTR(csma_cfg0, S_IRUGO | S_IWUSR, csma_cfg0_show, csma_cfg0_store);
119861a63978SXianjun Jiao static DEVICE_ATTR(cw_max_min_cfg, S_IRUGO | S_IWUSR, cw_max_min_cfg_show, cw_max_min_cfg_store);
119961a63978SXianjun Jiao
12006bb9ef71SXianjun Jiao static DEVICE_ATTR(dbg_ch0, S_IRUGO | S_IWUSR, dbg_ch0_show, dbg_ch0_store);
12016bb9ef71SXianjun Jiao static DEVICE_ATTR(dbg_ch1, S_IRUGO | S_IWUSR, dbg_ch1_show, dbg_ch1_store);
12026bb9ef71SXianjun Jiao static DEVICE_ATTR(dbg_ch2, S_IRUGO | S_IWUSR, dbg_ch2_show, dbg_ch2_store);
12036bb9ef71SXianjun Jiao
120461a63978SXianjun Jiao static struct attribute *stat_attributes[] = {
120561a63978SXianjun Jiao &dev_attr_stat_enable.attr,
120661a63978SXianjun Jiao
120761a63978SXianjun Jiao &dev_attr_tx_prio_queue.attr,
120861a63978SXianjun Jiao
120961a63978SXianjun Jiao &dev_attr_tx_data_pkt_need_ack_num_total.attr,
121061a63978SXianjun Jiao &dev_attr_tx_data_pkt_need_ack_num_total_fail.attr,
121161a63978SXianjun Jiao
121261a63978SXianjun Jiao &dev_attr_tx_data_pkt_need_ack_num_retx.attr,
121361a63978SXianjun Jiao &dev_attr_tx_data_pkt_need_ack_num_retx_fail.attr,
121461a63978SXianjun Jiao
121561a63978SXianjun Jiao &dev_attr_tx_data_pkt_mcs_realtime.attr,
121661a63978SXianjun Jiao &dev_attr_tx_data_pkt_fail_mcs_realtime.attr,
121761a63978SXianjun Jiao
121861a63978SXianjun Jiao &dev_attr_tx_mgmt_pkt_need_ack_num_total.attr,
121961a63978SXianjun Jiao &dev_attr_tx_mgmt_pkt_need_ack_num_total_fail.attr,
122061a63978SXianjun Jiao
122161a63978SXianjun Jiao &dev_attr_tx_mgmt_pkt_need_ack_num_retx.attr,
122261a63978SXianjun Jiao &dev_attr_tx_mgmt_pkt_need_ack_num_retx_fail.attr,
122361a63978SXianjun Jiao
122461a63978SXianjun Jiao &dev_attr_tx_mgmt_pkt_mcs_realtime.attr,
122561a63978SXianjun Jiao &dev_attr_tx_mgmt_pkt_fail_mcs_realtime.attr,
122661a63978SXianjun Jiao
122761a63978SXianjun Jiao &dev_attr_rx_target_sender_mac_addr.attr,
122861a63978SXianjun Jiao &dev_attr_rx_data_ok_agc_gain_value_realtime.attr,
122961a63978SXianjun Jiao &dev_attr_rx_data_fail_agc_gain_value_realtime.attr,
123061a63978SXianjun Jiao &dev_attr_rx_mgmt_ok_agc_gain_value_realtime.attr,
123161a63978SXianjun Jiao &dev_attr_rx_mgmt_fail_agc_gain_value_realtime.attr,
123261a63978SXianjun Jiao &dev_attr_rx_ack_ok_agc_gain_value_realtime.attr,
123361a63978SXianjun Jiao
123461a63978SXianjun Jiao &dev_attr_rx_monitor_all.attr,
123561a63978SXianjun Jiao &dev_attr_rx_data_pkt_num_total.attr,
123661a63978SXianjun Jiao &dev_attr_rx_data_pkt_num_fail.attr,
123761a63978SXianjun Jiao &dev_attr_rx_mgmt_pkt_num_total.attr,
123861a63978SXianjun Jiao &dev_attr_rx_mgmt_pkt_num_fail.attr,
123961a63978SXianjun Jiao &dev_attr_rx_ack_pkt_num_total.attr,
124061a63978SXianjun Jiao &dev_attr_rx_ack_pkt_num_fail.attr,
124161a63978SXianjun Jiao
124261a63978SXianjun Jiao &dev_attr_rx_data_pkt_mcs_realtime.attr,
124361a63978SXianjun Jiao &dev_attr_rx_data_pkt_fail_mcs_realtime.attr,
124461a63978SXianjun Jiao &dev_attr_rx_mgmt_pkt_mcs_realtime.attr,
124561a63978SXianjun Jiao &dev_attr_rx_mgmt_pkt_fail_mcs_realtime.attr,
124661a63978SXianjun Jiao &dev_attr_rx_ack_pkt_mcs_realtime.attr,
124761a63978SXianjun Jiao
124861a63978SXianjun Jiao &dev_attr_restrict_freq_mhz.attr,
124961a63978SXianjun Jiao
125061a63978SXianjun Jiao &dev_attr_csma_cfg0.attr,
125161a63978SXianjun Jiao &dev_attr_cw_max_min_cfg.attr,
125261a63978SXianjun Jiao
12536bb9ef71SXianjun Jiao &dev_attr_dbg_ch0.attr,
12546bb9ef71SXianjun Jiao &dev_attr_dbg_ch1.attr,
12556bb9ef71SXianjun Jiao &dev_attr_dbg_ch2.attr,
12566bb9ef71SXianjun Jiao
125761a63978SXianjun Jiao NULL,
125861a63978SXianjun Jiao };
125961a63978SXianjun Jiao static const struct attribute_group stat_attribute_group = {
126061a63978SXianjun Jiao .attrs = stat_attributes,
126161a63978SXianjun Jiao };
1262