xref: /openwifi/driver/sysfs_intf.c (revision 61a639784b623950d5bc4502cd2ce17bbcb361a9)
1*61a63978SXianjun Jiao // Author: Xianjun Jiao, Michael Mehari, Wei Liu
2*61a63978SXianjun Jiao // SPDX-FileCopyrightText: 2019 UGent
3*61a63978SXianjun Jiao // SPDX-License-Identifier: AGPL-3.0-or-later
4*61a63978SXianjun Jiao 
5*61a63978SXianjun Jiao // #define TX_INTF_IQ_WRITE_TXT_FORMAT 1//while using TXT format, the txt file size should <= 4096!!!
6*61a63978SXianjun Jiao #define TX_INTF_IQ_WRITE_BIN_FORMAT 1
7*61a63978SXianjun Jiao 
8*61a63978SXianjun Jiao #ifdef TX_INTF_IQ_WRITE_TXT_FORMAT
9*61a63978SXianjun Jiao static int is_valid_iq_number(int c) {
10*61a63978SXianjun Jiao 	if (c==32 || (c>=44 && c<=57))
11*61a63978SXianjun Jiao 		return(1);
12*61a63978SXianjun Jiao 	else
13*61a63978SXianjun Jiao 		return(0);
14*61a63978SXianjun Jiao }
15*61a63978SXianjun Jiao 
16*61a63978SXianjun Jiao static ssize_t openwifi_tx_intf_bin_iq_write(struct file *filp, struct kobject *kobj,
17*61a63978SXianjun Jiao 		       struct bin_attribute *bin_attr,
18*61a63978SXianjun Jiao 		       char *buf, loff_t off, size_t count)
19*61a63978SXianjun Jiao {
20*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(kobj_to_dev(kobj));
21*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
22*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
23*61a63978SXianjun Jiao 	int ret, i, q, num_iq;
24*61a63978SXianjun Jiao 	char *line;
25*61a63978SXianjun Jiao 	char *ptr = buf;
26*61a63978SXianjun Jiao 
27*61a63978SXianjun Jiao 	printk("%s openwifi_tx_intf_bin_iq_write: count %d\n", sdr_compatible_str, (int)count);
28*61a63978SXianjun Jiao 
29*61a63978SXianjun Jiao 	num_iq = 0;
30*61a63978SXianjun Jiao 	line = ptr;
31*61a63978SXianjun Jiao 	while (1) {
32*61a63978SXianjun Jiao 		ret = sscanf(line, "%d,%d\n", &i, &q);
33*61a63978SXianjun Jiao 		if (ret == 0) {
34*61a63978SXianjun Jiao 			printk("%s openwifi_tx_intf_bin_iq_write: sscanf ret 0\n", sdr_compatible_str);
35*61a63978SXianjun Jiao 			break;
36*61a63978SXianjun Jiao 		} else if (ret != 2) {
37*61a63978SXianjun 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);
38*61a63978SXianjun Jiao 			return -EINVAL;
39*61a63978SXianjun Jiao 		}
40*61a63978SXianjun Jiao 
41*61a63978SXianjun Jiao 		priv->tx_intf_arbitrary_iq[num_iq] = ( (q<<16)|(i&0xFFFF) );
42*61a63978SXianjun Jiao 		num_iq++;
43*61a63978SXianjun Jiao 		if (num_iq == 512) {
44*61a63978SXianjun Jiao 			printk("%s openwifi_tx_intf_bin_iq_write: num_iq reach 512\n", sdr_compatible_str);
45*61a63978SXianjun Jiao 			break;
46*61a63978SXianjun Jiao 		}
47*61a63978SXianjun Jiao 
48*61a63978SXianjun Jiao 		//go to the next line
49*61a63978SXianjun Jiao 		while(is_valid_iq_number(ptr[0]))
50*61a63978SXianjun Jiao 			ptr++;
51*61a63978SXianjun Jiao 		while( (is_valid_iq_number(ptr[0])==0)&&(ptr[0]!=0) )
52*61a63978SXianjun Jiao 			ptr++;
53*61a63978SXianjun Jiao 		if (ptr[0] == 0) {
54*61a63978SXianjun Jiao 			printk("%s openwifi_tx_intf_bin_iq_write: ptr[0] == 0\n", sdr_compatible_str);
55*61a63978SXianjun Jiao 			break;
56*61a63978SXianjun Jiao 		}
57*61a63978SXianjun Jiao 		line = ptr;
58*61a63978SXianjun Jiao 	}
59*61a63978SXianjun Jiao 	priv->tx_intf_arbitrary_iq_num = num_iq;
60*61a63978SXianjun Jiao 
61*61a63978SXianjun Jiao 	printk("%s openwifi_tx_intf_bin_iq_write: num_iq %d\n", sdr_compatible_str, num_iq);
62*61a63978SXianjun Jiao 	//print i/q
63*61a63978SXianjun Jiao 	for (i=0; i<num_iq; i++)
64*61a63978SXianjun Jiao 		printk("%d %d\n", (short)(priv->tx_intf_arbitrary_iq[i]&0xffff), (short)((priv->tx_intf_arbitrary_iq[i]>>16)&0xffff) );
65*61a63978SXianjun Jiao 
66*61a63978SXianjun Jiao 	return count;
67*61a63978SXianjun Jiao }
68*61a63978SXianjun Jiao #else
69*61a63978SXianjun Jiao static ssize_t openwifi_tx_intf_bin_iq_write(struct file *filp, struct kobject *kobj,
70*61a63978SXianjun Jiao 		       struct bin_attribute *bin_attr,
71*61a63978SXianjun Jiao 		       char *buf, loff_t off, size_t count)
72*61a63978SXianjun Jiao {
73*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(kobj_to_dev(kobj));
74*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
75*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
76*61a63978SXianjun Jiao 	int num_iq, i;
77*61a63978SXianjun Jiao 
78*61a63978SXianjun Jiao 	printk("%s openwifi_tx_intf_bin_iq_write: count %d\n", sdr_compatible_str, (int)count);
79*61a63978SXianjun Jiao 
80*61a63978SXianjun Jiao 	if ((count%4) != 0) {
81*61a63978SXianjun Jiao 		printk("%s openwifi_tx_intf_bin_iq_write: count is not integer times of 4!\n", sdr_compatible_str);
82*61a63978SXianjun Jiao 		return -EINVAL;
83*61a63978SXianjun Jiao 	}
84*61a63978SXianjun Jiao 
85*61a63978SXianjun Jiao 	num_iq = count/4;
86*61a63978SXianjun Jiao 	priv->tx_intf_arbitrary_iq_num = num_iq;
87*61a63978SXianjun Jiao 
88*61a63978SXianjun Jiao 	for (i=0; i<num_iq; i++) {
89*61a63978SXianjun Jiao 		priv->tx_intf_arbitrary_iq[i] = (*((u32*)(buf+(i*4))));
90*61a63978SXianjun Jiao 	}
91*61a63978SXianjun Jiao 
92*61a63978SXianjun Jiao 	// printk("%s openwifi_tx_intf_bin_iq_write: num_iq %d\n", sdr_compatible_str, num_iq);
93*61a63978SXianjun Jiao 	// //print i/q
94*61a63978SXianjun Jiao 	// for (i=0; i<num_iq; i++)
95*61a63978SXianjun Jiao 	// 	printk("%d %d\n", (short)(priv->tx_intf_arbitrary_iq[i]&0xffff), (short)((priv->tx_intf_arbitrary_iq[i]>>16)&0xffff) );
96*61a63978SXianjun Jiao 
97*61a63978SXianjun Jiao 	return count;
98*61a63978SXianjun Jiao }
99*61a63978SXianjun Jiao #endif
100*61a63978SXianjun Jiao 
101*61a63978SXianjun Jiao static ssize_t openwifi_tx_intf_bin_iq_read(struct file *filp, struct kobject *kobj,
102*61a63978SXianjun Jiao 		       struct bin_attribute *bin_attr,
103*61a63978SXianjun Jiao 		       char *buf, loff_t off, size_t count)
104*61a63978SXianjun Jiao {
105*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(kobj_to_dev(kobj));
106*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
107*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
108*61a63978SXianjun Jiao 	int num_iq, ret_size, i;
109*61a63978SXianjun Jiao 
110*61a63978SXianjun Jiao 	if (off)
111*61a63978SXianjun Jiao 		return 0;
112*61a63978SXianjun Jiao 
113*61a63978SXianjun Jiao 	num_iq = priv->tx_intf_arbitrary_iq_num;
114*61a63978SXianjun Jiao 
115*61a63978SXianjun Jiao 	// printk("%s openwifi_tx_intf_bin_iq_read: num_iq %d\n", sdr_compatible_str, num_iq);
116*61a63978SXianjun Jiao 	// //print i/q
117*61a63978SXianjun Jiao 	// for (i=0; i<num_iq; i++)
118*61a63978SXianjun Jiao 	// 	printk("%d %d\n", (short)(priv->tx_intf_arbitrary_iq[i]&0xffff), (short)((priv->tx_intf_arbitrary_iq[i]>>16)&0xffff) );
119*61a63978SXianjun Jiao 
120*61a63978SXianjun Jiao 	ret_size = sprintf(buf, "%d\n", num_iq);
121*61a63978SXianjun Jiao 	if (num_iq==0 || num_iq>512) {
122*61a63978SXianjun Jiao 		ret_size = ret_size + sprintf(buf+ret_size, "num_iq is wrong!\n");
123*61a63978SXianjun Jiao 		return ret_size;
124*61a63978SXianjun Jiao 	}
125*61a63978SXianjun Jiao 
126*61a63978SXianjun Jiao 	//print i
127*61a63978SXianjun Jiao 	for (i=0; i<num_iq; i++)
128*61a63978SXianjun Jiao 		ret_size = ret_size + sprintf(buf+ret_size, "%d ", (short)(priv->tx_intf_arbitrary_iq[i]&0xffff) );
129*61a63978SXianjun Jiao 	ret_size = ret_size + sprintf(buf+ret_size, "\n");
130*61a63978SXianjun Jiao 
131*61a63978SXianjun Jiao 	//print q
132*61a63978SXianjun Jiao 	for (i=0; i<num_iq; i++)
133*61a63978SXianjun Jiao 		ret_size = ret_size + sprintf(buf+ret_size, "%d ", (short)((priv->tx_intf_arbitrary_iq[i]>>16)&0xffff) );
134*61a63978SXianjun Jiao 	ret_size = ret_size + sprintf(buf+ret_size, "\n");
135*61a63978SXianjun Jiao 
136*61a63978SXianjun Jiao 	return ret_size;
137*61a63978SXianjun Jiao }
138*61a63978SXianjun Jiao 
139*61a63978SXianjun Jiao static ssize_t tx_intf_iq_ctl_show(struct device *input_dev, struct device_attribute *attr, char *buf)
140*61a63978SXianjun Jiao {
141*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
142*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
143*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
144*61a63978SXianjun Jiao 
145*61a63978SXianjun Jiao 	return sprintf(buf, "%u\n", priv->tx_intf_iq_ctl);
146*61a63978SXianjun Jiao }
147*61a63978SXianjun Jiao static ssize_t tx_intf_iq_ctl_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
148*61a63978SXianjun Jiao {
149*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
150*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
151*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
152*61a63978SXianjun Jiao 
153*61a63978SXianjun Jiao 	long readin;
154*61a63978SXianjun Jiao 	int i;
155*61a63978SXianjun Jiao 	int ret = kstrtol(buf, 10, &readin);
156*61a63978SXianjun Jiao 
157*61a63978SXianjun Jiao 	priv->tx_intf_iq_ctl = readin;
158*61a63978SXianjun Jiao 
159*61a63978SXianjun Jiao 	tx_intf_api->TX_INTF_REG_ARBITRARY_IQ_CTL_write(1); // switch to iq mode
160*61a63978SXianjun Jiao 	printk("%s tx_intf_iq_ctl_store: Will send %d I/Q\n", sdr_compatible_str, priv->tx_intf_arbitrary_iq_num);
161*61a63978SXianjun Jiao 	for (i=0; i<priv->tx_intf_arbitrary_iq_num; i++) {
162*61a63978SXianjun Jiao 		tx_intf_api->TX_INTF_REG_ARBITRARY_IQ_write(priv->tx_intf_arbitrary_iq[i]);
163*61a63978SXianjun Jiao 	}
164*61a63978SXianjun Jiao 	tx_intf_api->TX_INTF_REG_ARBITRARY_IQ_CTL_write(3); // start send
165*61a63978SXianjun Jiao 	tx_intf_api->TX_INTF_REG_ARBITRARY_IQ_CTL_write(0);
166*61a63978SXianjun Jiao 
167*61a63978SXianjun Jiao 	return ret ? ret : len;
168*61a63978SXianjun Jiao }
169*61a63978SXianjun Jiao 
170*61a63978SXianjun Jiao static DEVICE_ATTR(tx_intf_iq_ctl, S_IRUGO | S_IWUSR, tx_intf_iq_ctl_show, tx_intf_iq_ctl_store);
171*61a63978SXianjun Jiao static struct attribute *tx_intf_attributes[] = {
172*61a63978SXianjun Jiao 	&dev_attr_tx_intf_iq_ctl.attr,
173*61a63978SXianjun Jiao 	NULL,
174*61a63978SXianjun Jiao };
175*61a63978SXianjun Jiao static const struct attribute_group tx_intf_attribute_group = {
176*61a63978SXianjun Jiao 	.attrs = tx_intf_attributes,
177*61a63978SXianjun Jiao };
178*61a63978SXianjun Jiao 
179*61a63978SXianjun Jiao static ssize_t stat_enable_show(struct device *input_dev, struct device_attribute *attr, char *buf)
180*61a63978SXianjun Jiao {
181*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
182*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
183*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
184*61a63978SXianjun Jiao 
185*61a63978SXianjun Jiao 	return sprintf(buf, "%u\n", priv->stat.stat_enable);
186*61a63978SXianjun Jiao }
187*61a63978SXianjun Jiao static ssize_t stat_enable_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
188*61a63978SXianjun Jiao {
189*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
190*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
191*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
192*61a63978SXianjun Jiao 
193*61a63978SXianjun Jiao 	long readin;
194*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
195*61a63978SXianjun Jiao 
196*61a63978SXianjun Jiao 	priv->stat.stat_enable = readin;
197*61a63978SXianjun Jiao 
198*61a63978SXianjun Jiao 	return ret ? ret : len;
199*61a63978SXianjun Jiao }
200*61a63978SXianjun Jiao 
201*61a63978SXianjun Jiao static ssize_t tx_prio_queue_show(struct device *input_dev, struct device_attribute *attr, char *buf)
202*61a63978SXianjun Jiao {
203*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
204*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
205*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
206*61a63978SXianjun Jiao 
207*61a63978SXianjun Jiao 	u32 i, ret_size = 0;
208*61a63978SXianjun Jiao 
209*61a63978SXianjun Jiao 	for (i=0; i<MAX_NUM_SW_QUEUE; i++) {
210*61a63978SXianjun Jiao 		ret_size = ret_size + sprintf(buf+ret_size, "%u %u %u %u %u %u %u %u %u %u %u %u\n",
211*61a63978SXianjun Jiao 		priv->stat.tx_prio_num[i],
212*61a63978SXianjun Jiao 		priv->stat.tx_prio_interrupt_num[i],
213*61a63978SXianjun Jiao 		priv->stat.tx_prio_stop0_fake_num[i],
214*61a63978SXianjun Jiao 		priv->stat.tx_prio_stop0_real_num[i],
215*61a63978SXianjun Jiao 		priv->stat.tx_prio_stop1_num[i],
216*61a63978SXianjun Jiao 		priv->stat.tx_prio_wakeup_num[i],
217*61a63978SXianjun Jiao 		priv->stat.tx_queue_num[i],
218*61a63978SXianjun Jiao 		priv->stat.tx_queue_interrupt_num[i],
219*61a63978SXianjun Jiao 		priv->stat.tx_queue_stop0_fake_num[i],
220*61a63978SXianjun Jiao 		priv->stat.tx_queue_stop0_real_num[i],
221*61a63978SXianjun Jiao 		priv->stat.tx_queue_stop1_num[i],
222*61a63978SXianjun Jiao 		priv->stat.tx_queue_wakeup_num[i]);
223*61a63978SXianjun Jiao 	}
224*61a63978SXianjun Jiao 
225*61a63978SXianjun Jiao 	return ret_size;
226*61a63978SXianjun Jiao }
227*61a63978SXianjun Jiao static ssize_t tx_prio_queue_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
228*61a63978SXianjun Jiao {
229*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
230*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
231*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
232*61a63978SXianjun Jiao 
233*61a63978SXianjun Jiao 	u32 i;
234*61a63978SXianjun Jiao 	long readin;
235*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
236*61a63978SXianjun Jiao 
237*61a63978SXianjun Jiao 	for (i=0; i<MAX_NUM_SW_QUEUE; i++) {
238*61a63978SXianjun Jiao 		priv->stat.tx_prio_num[i] = 0;
239*61a63978SXianjun Jiao 		priv->stat.tx_prio_interrupt_num[i] = 0;
240*61a63978SXianjun Jiao 		priv->stat.tx_prio_stop0_fake_num[i] = 0;
241*61a63978SXianjun Jiao 		priv->stat.tx_prio_stop0_real_num[i] = 0;
242*61a63978SXianjun Jiao 		priv->stat.tx_prio_stop1_num[i] = 0;
243*61a63978SXianjun Jiao 		priv->stat.tx_prio_wakeup_num[i] = 0;
244*61a63978SXianjun Jiao 	}
245*61a63978SXianjun Jiao 	for (i=0; i<MAX_NUM_HW_QUEUE; i++) {
246*61a63978SXianjun Jiao 		priv->stat.tx_queue_num[i] = 0;
247*61a63978SXianjun Jiao 		priv->stat.tx_queue_interrupt_num[i] = 0;
248*61a63978SXianjun Jiao 		priv->stat.tx_queue_stop0_fake_num[i] = 0;
249*61a63978SXianjun Jiao 		priv->stat.tx_queue_stop0_real_num[i] = 0;
250*61a63978SXianjun Jiao 		priv->stat.tx_queue_stop1_num[i] = 0;
251*61a63978SXianjun Jiao 		priv->stat.tx_queue_wakeup_num[i] = 0;
252*61a63978SXianjun Jiao 	}
253*61a63978SXianjun Jiao 
254*61a63978SXianjun Jiao 	return ret ? ret : len;
255*61a63978SXianjun Jiao }
256*61a63978SXianjun Jiao 
257*61a63978SXianjun Jiao static ssize_t tx_data_pkt_need_ack_num_total_fail_show(struct device *input_dev, struct device_attribute *attr, char *buf)
258*61a63978SXianjun Jiao {
259*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
260*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
261*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
262*61a63978SXianjun Jiao 
263*61a63978SXianjun Jiao 	return sprintf(buf, "%u\n", priv->stat.tx_data_pkt_need_ack_num_total_fail);
264*61a63978SXianjun Jiao }
265*61a63978SXianjun 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)
266*61a63978SXianjun Jiao {
267*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
268*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
269*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
270*61a63978SXianjun Jiao 
271*61a63978SXianjun Jiao 	long readin;
272*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
273*61a63978SXianjun Jiao 
274*61a63978SXianjun Jiao 	priv->stat.tx_data_pkt_need_ack_num_total_fail = readin;
275*61a63978SXianjun Jiao 
276*61a63978SXianjun Jiao 	return ret ? ret : len;
277*61a63978SXianjun Jiao }
278*61a63978SXianjun Jiao 
279*61a63978SXianjun Jiao static ssize_t tx_data_pkt_need_ack_num_total_show(struct device *input_dev, struct device_attribute *attr, char *buf)
280*61a63978SXianjun Jiao {
281*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
282*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
283*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
284*61a63978SXianjun Jiao 
285*61a63978SXianjun Jiao 	return sprintf(buf, "%u\n", priv->stat.tx_data_pkt_need_ack_num_total);
286*61a63978SXianjun Jiao }
287*61a63978SXianjun 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)
288*61a63978SXianjun Jiao {
289*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
290*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
291*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
292*61a63978SXianjun Jiao 
293*61a63978SXianjun Jiao 	long readin;
294*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
295*61a63978SXianjun Jiao 
296*61a63978SXianjun Jiao 	priv->stat.tx_data_pkt_need_ack_num_total = readin;
297*61a63978SXianjun Jiao 
298*61a63978SXianjun Jiao 	return ret ? ret : len;
299*61a63978SXianjun Jiao }
300*61a63978SXianjun Jiao 
301*61a63978SXianjun Jiao static ssize_t tx_mgmt_pkt_need_ack_num_total_show(struct device *input_dev, struct device_attribute *attr, char *buf)
302*61a63978SXianjun Jiao {
303*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
304*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
305*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
306*61a63978SXianjun Jiao 
307*61a63978SXianjun Jiao 	return sprintf(buf, "%u\n", priv->stat.tx_mgmt_pkt_need_ack_num_total);
308*61a63978SXianjun Jiao }
309*61a63978SXianjun 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)
310*61a63978SXianjun Jiao {
311*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
312*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
313*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
314*61a63978SXianjun Jiao 
315*61a63978SXianjun Jiao 	long readin;
316*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
317*61a63978SXianjun Jiao 
318*61a63978SXianjun Jiao 	priv->stat.tx_mgmt_pkt_need_ack_num_total = readin;
319*61a63978SXianjun Jiao 
320*61a63978SXianjun Jiao 	return ret ? ret : len;
321*61a63978SXianjun Jiao }
322*61a63978SXianjun Jiao 
323*61a63978SXianjun Jiao static ssize_t tx_mgmt_pkt_need_ack_num_total_fail_show(struct device *input_dev, struct device_attribute *attr, char *buf)
324*61a63978SXianjun Jiao {
325*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
326*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
327*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
328*61a63978SXianjun Jiao 
329*61a63978SXianjun Jiao 	return sprintf(buf, "%u\n", priv->stat.tx_mgmt_pkt_need_ack_num_total_fail);
330*61a63978SXianjun Jiao }
331*61a63978SXianjun 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)
332*61a63978SXianjun Jiao {
333*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
334*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
335*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
336*61a63978SXianjun Jiao 
337*61a63978SXianjun Jiao 	long readin;
338*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
339*61a63978SXianjun Jiao 
340*61a63978SXianjun Jiao 	priv->stat.tx_mgmt_pkt_need_ack_num_total_fail = readin;
341*61a63978SXianjun Jiao 
342*61a63978SXianjun Jiao 	return ret ? ret : len;
343*61a63978SXianjun Jiao }
344*61a63978SXianjun Jiao 
345*61a63978SXianjun Jiao static ssize_t tx_data_pkt_need_ack_num_retx_show(struct device *input_dev, struct device_attribute *attr, char *buf)
346*61a63978SXianjun Jiao {
347*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
348*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
349*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
350*61a63978SXianjun Jiao 
351*61a63978SXianjun Jiao 	return sprintf(buf, "%u %u %u %u %u %u\n",
352*61a63978SXianjun Jiao 					priv->stat.tx_data_pkt_need_ack_num_retx[0],
353*61a63978SXianjun Jiao 					priv->stat.tx_data_pkt_need_ack_num_retx[1],
354*61a63978SXianjun Jiao 					priv->stat.tx_data_pkt_need_ack_num_retx[2],
355*61a63978SXianjun Jiao 					priv->stat.tx_data_pkt_need_ack_num_retx[3],
356*61a63978SXianjun Jiao 					priv->stat.tx_data_pkt_need_ack_num_retx[4],
357*61a63978SXianjun Jiao 					priv->stat.tx_data_pkt_need_ack_num_retx[5]);
358*61a63978SXianjun Jiao }
359*61a63978SXianjun 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)
360*61a63978SXianjun Jiao {
361*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
362*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
363*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
364*61a63978SXianjun Jiao 
365*61a63978SXianjun Jiao 	long readin;
366*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin), i;
367*61a63978SXianjun Jiao 
368*61a63978SXianjun Jiao 	for (i=0; i<6; i++)
369*61a63978SXianjun Jiao 		priv->stat.tx_data_pkt_need_ack_num_retx[i] = readin;
370*61a63978SXianjun Jiao 
371*61a63978SXianjun Jiao 	return ret ? ret : len;
372*61a63978SXianjun Jiao }
373*61a63978SXianjun Jiao 
374*61a63978SXianjun Jiao static ssize_t tx_mgmt_pkt_need_ack_num_retx_show(struct device *input_dev, struct device_attribute *attr, char *buf)
375*61a63978SXianjun Jiao {
376*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
377*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
378*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
379*61a63978SXianjun Jiao 
380*61a63978SXianjun Jiao 	return sprintf(buf, "%u %u %u\n",
381*61a63978SXianjun Jiao 				priv->stat.tx_mgmt_pkt_need_ack_num_retx[0],
382*61a63978SXianjun Jiao 				priv->stat.tx_mgmt_pkt_need_ack_num_retx[1],
383*61a63978SXianjun Jiao 				priv->stat.tx_mgmt_pkt_need_ack_num_retx[2]);
384*61a63978SXianjun Jiao }
385*61a63978SXianjun 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)
386*61a63978SXianjun Jiao {
387*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
388*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
389*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
390*61a63978SXianjun Jiao 
391*61a63978SXianjun Jiao 	long readin;
392*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin), i;
393*61a63978SXianjun Jiao 
394*61a63978SXianjun Jiao 	for (i=0; i<3; i++)
395*61a63978SXianjun Jiao 		priv->stat.tx_mgmt_pkt_need_ack_num_retx[i] = readin;
396*61a63978SXianjun Jiao 
397*61a63978SXianjun Jiao 	return ret ? ret : len;
398*61a63978SXianjun Jiao }
399*61a63978SXianjun Jiao 
400*61a63978SXianjun Jiao static ssize_t tx_data_pkt_need_ack_num_retx_fail_show(struct device *input_dev, struct device_attribute *attr, char *buf)
401*61a63978SXianjun Jiao {
402*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
403*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
404*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
405*61a63978SXianjun Jiao 
406*61a63978SXianjun Jiao 	return sprintf(buf, "%u %u %u %u %u %u\n",
407*61a63978SXianjun Jiao 				priv->stat.tx_data_pkt_need_ack_num_retx_fail[0],
408*61a63978SXianjun Jiao 				priv->stat.tx_data_pkt_need_ack_num_retx_fail[1],
409*61a63978SXianjun Jiao 				priv->stat.tx_data_pkt_need_ack_num_retx_fail[2],
410*61a63978SXianjun Jiao 				priv->stat.tx_data_pkt_need_ack_num_retx_fail[3],
411*61a63978SXianjun Jiao 				priv->stat.tx_data_pkt_need_ack_num_retx_fail[4],
412*61a63978SXianjun Jiao 				priv->stat.tx_data_pkt_need_ack_num_retx_fail[5]);
413*61a63978SXianjun Jiao }
414*61a63978SXianjun 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)
415*61a63978SXianjun Jiao {
416*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
417*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
418*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
419*61a63978SXianjun Jiao 
420*61a63978SXianjun Jiao 	long readin;
421*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin), i;
422*61a63978SXianjun Jiao 
423*61a63978SXianjun Jiao 	for (i=0; i<6; i++)
424*61a63978SXianjun Jiao 		priv->stat.tx_data_pkt_need_ack_num_retx_fail[i] = readin;
425*61a63978SXianjun Jiao 
426*61a63978SXianjun Jiao 	return ret ? ret : len;
427*61a63978SXianjun Jiao }
428*61a63978SXianjun Jiao 
429*61a63978SXianjun Jiao static ssize_t tx_mgmt_pkt_need_ack_num_retx_fail_show(struct device *input_dev, struct device_attribute *attr, char *buf)
430*61a63978SXianjun Jiao {
431*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
432*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
433*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
434*61a63978SXianjun Jiao 
435*61a63978SXianjun Jiao 	return sprintf(buf, "%u %u %u\n",
436*61a63978SXianjun Jiao 				priv->stat.tx_mgmt_pkt_need_ack_num_retx_fail[0],
437*61a63978SXianjun Jiao 				priv->stat.tx_mgmt_pkt_need_ack_num_retx_fail[1],
438*61a63978SXianjun Jiao 				priv->stat.tx_mgmt_pkt_need_ack_num_retx_fail[2]);
439*61a63978SXianjun Jiao }
440*61a63978SXianjun 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)
441*61a63978SXianjun Jiao {
442*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
443*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
444*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
445*61a63978SXianjun Jiao 
446*61a63978SXianjun Jiao 	long readin;
447*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin), i;
448*61a63978SXianjun Jiao 
449*61a63978SXianjun Jiao 	for (i=0; i<3; i++)
450*61a63978SXianjun Jiao 		priv->stat.tx_mgmt_pkt_need_ack_num_retx_fail[i] = readin;
451*61a63978SXianjun Jiao 
452*61a63978SXianjun Jiao 	return ret ? ret : len;
453*61a63978SXianjun Jiao }
454*61a63978SXianjun Jiao 
455*61a63978SXianjun Jiao static ssize_t tx_data_pkt_mcs_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
456*61a63978SXianjun Jiao {
457*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
458*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
459*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
460*61a63978SXianjun Jiao 
461*61a63978SXianjun Jiao 	bool use_ht_rate = ((priv->stat.tx_data_pkt_mcs_realtime&0x80000000)!=0);
462*61a63978SXianjun Jiao 	u32 rate_hw_value = (priv->stat.tx_data_pkt_mcs_realtime&0x7fffffff);
463*61a63978SXianjun Jiao 
464*61a63978SXianjun Jiao 	return sprintf(buf, "%uM\n", (use_ht_rate == false ? wifi_rate_all[rate_hw_value] : wifi_rate_all[rate_hw_value + 12]));
465*61a63978SXianjun Jiao }
466*61a63978SXianjun Jiao static ssize_t tx_data_pkt_mcs_realtime_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
467*61a63978SXianjun Jiao {
468*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
469*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
470*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
471*61a63978SXianjun Jiao 
472*61a63978SXianjun Jiao 	long readin;
473*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
474*61a63978SXianjun Jiao 
475*61a63978SXianjun Jiao 	priv->stat.tx_data_pkt_mcs_realtime = readin;
476*61a63978SXianjun Jiao 
477*61a63978SXianjun Jiao 	return ret ? ret : len;
478*61a63978SXianjun Jiao }
479*61a63978SXianjun Jiao 
480*61a63978SXianjun Jiao static ssize_t tx_mgmt_pkt_mcs_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
481*61a63978SXianjun Jiao {
482*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
483*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
484*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
485*61a63978SXianjun Jiao 
486*61a63978SXianjun Jiao 	bool use_ht_rate = ((priv->stat.tx_mgmt_pkt_mcs_realtime&0x80000000)!=0);
487*61a63978SXianjun Jiao 	u32 rate_hw_value = (priv->stat.tx_mgmt_pkt_mcs_realtime&0x7fffffff);
488*61a63978SXianjun Jiao 
489*61a63978SXianjun Jiao 	return sprintf(buf, "%uM\n", (use_ht_rate == false ? wifi_rate_all[rate_hw_value] : wifi_rate_all[rate_hw_value + 12]));
490*61a63978SXianjun Jiao }
491*61a63978SXianjun Jiao static ssize_t tx_mgmt_pkt_mcs_realtime_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
492*61a63978SXianjun Jiao {
493*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
494*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
495*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
496*61a63978SXianjun Jiao 
497*61a63978SXianjun Jiao 	long readin;
498*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
499*61a63978SXianjun Jiao 
500*61a63978SXianjun Jiao 	priv->stat.tx_mgmt_pkt_mcs_realtime = readin;
501*61a63978SXianjun Jiao 
502*61a63978SXianjun Jiao 	return ret ? ret : len;
503*61a63978SXianjun Jiao }
504*61a63978SXianjun Jiao 
505*61a63978SXianjun Jiao static ssize_t tx_mgmt_pkt_fail_mcs_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
506*61a63978SXianjun Jiao {
507*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
508*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
509*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
510*61a63978SXianjun Jiao 
511*61a63978SXianjun Jiao 	bool use_ht_rate = ((priv->stat.tx_mgmt_pkt_fail_mcs_realtime&0x80000000)!=0);
512*61a63978SXianjun Jiao 	u32 rate_hw_value = (priv->stat.tx_mgmt_pkt_fail_mcs_realtime&0x7fffffff);
513*61a63978SXianjun Jiao 
514*61a63978SXianjun Jiao 	return sprintf(buf, "%uM\n", (use_ht_rate == false ? wifi_rate_all[rate_hw_value] : wifi_rate_all[rate_hw_value + 12]));
515*61a63978SXianjun Jiao }
516*61a63978SXianjun 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)
517*61a63978SXianjun Jiao {
518*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
519*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
520*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
521*61a63978SXianjun Jiao 
522*61a63978SXianjun Jiao 	long readin;
523*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
524*61a63978SXianjun Jiao 
525*61a63978SXianjun Jiao 	priv->stat.tx_mgmt_pkt_fail_mcs_realtime = readin;
526*61a63978SXianjun Jiao 
527*61a63978SXianjun Jiao 	return ret ? ret : len;
528*61a63978SXianjun Jiao }
529*61a63978SXianjun Jiao 
530*61a63978SXianjun Jiao static ssize_t tx_data_pkt_fail_mcs_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
531*61a63978SXianjun Jiao {
532*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
533*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
534*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
535*61a63978SXianjun Jiao 
536*61a63978SXianjun Jiao 	bool use_ht_rate = ((priv->stat.tx_data_pkt_fail_mcs_realtime&0x80000000)!=0);
537*61a63978SXianjun Jiao 	u32 rate_hw_value = (priv->stat.tx_data_pkt_fail_mcs_realtime&0x7fffffff);
538*61a63978SXianjun Jiao 
539*61a63978SXianjun Jiao 	return sprintf(buf, "%uM\n", (use_ht_rate == false ? wifi_rate_all[rate_hw_value] : wifi_rate_all[rate_hw_value + 12]));
540*61a63978SXianjun Jiao }
541*61a63978SXianjun 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)
542*61a63978SXianjun Jiao {
543*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
544*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
545*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
546*61a63978SXianjun Jiao 
547*61a63978SXianjun Jiao 	long readin;
548*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
549*61a63978SXianjun Jiao 
550*61a63978SXianjun Jiao 	priv->stat.tx_data_pkt_fail_mcs_realtime = readin;
551*61a63978SXianjun Jiao 
552*61a63978SXianjun Jiao 	return ret ? ret : len;
553*61a63978SXianjun Jiao }
554*61a63978SXianjun Jiao 
555*61a63978SXianjun Jiao static ssize_t rx_target_sender_mac_addr_show(struct device *input_dev, struct device_attribute *attr, char *buf)
556*61a63978SXianjun Jiao {
557*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
558*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
559*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
560*61a63978SXianjun Jiao 
561*61a63978SXianjun Jiao 	return sprintf(buf, "%08x\n", reverse32(priv->stat.rx_target_sender_mac_addr));
562*61a63978SXianjun Jiao }
563*61a63978SXianjun Jiao static ssize_t rx_target_sender_mac_addr_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
564*61a63978SXianjun Jiao {
565*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
566*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
567*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
568*61a63978SXianjun Jiao 
569*61a63978SXianjun Jiao 	u32 readin;
570*61a63978SXianjun Jiao 	u32 ret = kstrtouint(buf, 16, &readin);
571*61a63978SXianjun Jiao 
572*61a63978SXianjun Jiao 	priv->stat.rx_target_sender_mac_addr = reverse32(readin);
573*61a63978SXianjun Jiao 
574*61a63978SXianjun Jiao 	return ret ? ret : len;
575*61a63978SXianjun Jiao }
576*61a63978SXianjun Jiao 
577*61a63978SXianjun Jiao static ssize_t rx_data_ok_agc_gain_value_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
578*61a63978SXianjun Jiao {
579*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
580*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
581*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
582*61a63978SXianjun Jiao 
583*61a63978SXianjun Jiao 	return sprintf(buf, "%u\n", priv->stat.rx_data_ok_agc_gain_value_realtime);
584*61a63978SXianjun Jiao }
585*61a63978SXianjun 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)
586*61a63978SXianjun Jiao {
587*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
588*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
589*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
590*61a63978SXianjun Jiao 
591*61a63978SXianjun Jiao 	long readin;
592*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
593*61a63978SXianjun Jiao 
594*61a63978SXianjun Jiao 	priv->stat.rx_data_ok_agc_gain_value_realtime = readin;
595*61a63978SXianjun Jiao 
596*61a63978SXianjun Jiao 	return ret ? ret : len;
597*61a63978SXianjun Jiao }
598*61a63978SXianjun Jiao 
599*61a63978SXianjun Jiao static ssize_t rx_mgmt_ok_agc_gain_value_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
600*61a63978SXianjun Jiao {
601*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
602*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
603*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
604*61a63978SXianjun Jiao 
605*61a63978SXianjun Jiao 	return sprintf(buf, "%u\n", priv->stat.rx_mgmt_ok_agc_gain_value_realtime);
606*61a63978SXianjun Jiao }
607*61a63978SXianjun 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)
608*61a63978SXianjun Jiao {
609*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
610*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
611*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
612*61a63978SXianjun Jiao 
613*61a63978SXianjun Jiao 	long readin;
614*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
615*61a63978SXianjun Jiao 
616*61a63978SXianjun Jiao 	priv->stat.rx_mgmt_ok_agc_gain_value_realtime = readin;
617*61a63978SXianjun Jiao 
618*61a63978SXianjun Jiao 	return ret ? ret : len;
619*61a63978SXianjun Jiao }
620*61a63978SXianjun Jiao 
621*61a63978SXianjun Jiao static ssize_t rx_data_fail_agc_gain_value_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
622*61a63978SXianjun Jiao {
623*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
624*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
625*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
626*61a63978SXianjun Jiao 
627*61a63978SXianjun Jiao 	return sprintf(buf, "%u\n", priv->stat.rx_data_fail_agc_gain_value_realtime);
628*61a63978SXianjun Jiao }
629*61a63978SXianjun 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)
630*61a63978SXianjun Jiao {
631*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
632*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
633*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
634*61a63978SXianjun Jiao 
635*61a63978SXianjun Jiao 	long readin;
636*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
637*61a63978SXianjun Jiao 
638*61a63978SXianjun Jiao 	priv->stat.rx_data_fail_agc_gain_value_realtime = readin;
639*61a63978SXianjun Jiao 
640*61a63978SXianjun Jiao 	return ret ? ret : len;
641*61a63978SXianjun Jiao }
642*61a63978SXianjun Jiao 
643*61a63978SXianjun Jiao static ssize_t rx_mgmt_fail_agc_gain_value_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
644*61a63978SXianjun Jiao {
645*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
646*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
647*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
648*61a63978SXianjun Jiao 
649*61a63978SXianjun Jiao 	return sprintf(buf, "%u\n", priv->stat.rx_mgmt_fail_agc_gain_value_realtime);
650*61a63978SXianjun Jiao }
651*61a63978SXianjun 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)
652*61a63978SXianjun Jiao {
653*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
654*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
655*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
656*61a63978SXianjun Jiao 
657*61a63978SXianjun Jiao 	long readin;
658*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
659*61a63978SXianjun Jiao 
660*61a63978SXianjun Jiao 	priv->stat.rx_mgmt_fail_agc_gain_value_realtime = readin;
661*61a63978SXianjun Jiao 
662*61a63978SXianjun Jiao 	return ret ? ret : len;
663*61a63978SXianjun Jiao }
664*61a63978SXianjun Jiao 
665*61a63978SXianjun Jiao static ssize_t rx_ack_ok_agc_gain_value_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
666*61a63978SXianjun Jiao {
667*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
668*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
669*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
670*61a63978SXianjun Jiao 
671*61a63978SXianjun Jiao 	return sprintf(buf, "%u\n", priv->stat.rx_ack_ok_agc_gain_value_realtime);
672*61a63978SXianjun Jiao }
673*61a63978SXianjun 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)
674*61a63978SXianjun Jiao {
675*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
676*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
677*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
678*61a63978SXianjun Jiao 
679*61a63978SXianjun Jiao 	long readin;
680*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
681*61a63978SXianjun Jiao 
682*61a63978SXianjun Jiao 	priv->stat.rx_ack_ok_agc_gain_value_realtime = readin;
683*61a63978SXianjun Jiao 
684*61a63978SXianjun Jiao 	return ret ? ret : len;
685*61a63978SXianjun Jiao }
686*61a63978SXianjun Jiao 
687*61a63978SXianjun Jiao static ssize_t rx_monitor_all_show(struct device *input_dev, struct device_attribute *attr, char *buf)
688*61a63978SXianjun Jiao {
689*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
690*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
691*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
692*61a63978SXianjun Jiao 
693*61a63978SXianjun Jiao 	return sprintf(buf, "%u\n", priv->stat.rx_monitor_all);
694*61a63978SXianjun Jiao }
695*61a63978SXianjun Jiao static ssize_t rx_monitor_all_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
696*61a63978SXianjun Jiao {
697*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
698*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
699*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
700*61a63978SXianjun Jiao 
701*61a63978SXianjun Jiao 	long readin;
702*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
703*61a63978SXianjun Jiao 	u32 filter_flag;
704*61a63978SXianjun Jiao 
705*61a63978SXianjun Jiao 	priv->stat.rx_monitor_all = readin;
706*61a63978SXianjun Jiao 
707*61a63978SXianjun Jiao 	filter_flag = xpu_api->XPU_REG_FILTER_FLAG_read();
708*61a63978SXianjun Jiao 	if (readin>0) {// set to fpga
709*61a63978SXianjun Jiao 		filter_flag = (filter_flag|MONITOR_ALL);
710*61a63978SXianjun Jiao 	} else {
711*61a63978SXianjun Jiao 		filter_flag = (filter_flag&(~MONITOR_ALL));
712*61a63978SXianjun Jiao 	}
713*61a63978SXianjun Jiao 	xpu_api->XPU_REG_FILTER_FLAG_write(filter_flag);
714*61a63978SXianjun Jiao 
715*61a63978SXianjun Jiao 	return ret ? ret : len;
716*61a63978SXianjun Jiao }
717*61a63978SXianjun Jiao 
718*61a63978SXianjun Jiao static ssize_t rx_data_pkt_num_total_show(struct device *input_dev, struct device_attribute *attr, char *buf)
719*61a63978SXianjun Jiao {
720*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
721*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
722*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
723*61a63978SXianjun Jiao 
724*61a63978SXianjun Jiao 	return sprintf(buf, "%u\n", priv->stat.rx_data_pkt_num_total);
725*61a63978SXianjun Jiao }
726*61a63978SXianjun Jiao static ssize_t rx_data_pkt_num_total_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
727*61a63978SXianjun Jiao {
728*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
729*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
730*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
731*61a63978SXianjun Jiao 
732*61a63978SXianjun Jiao 	long readin;
733*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
734*61a63978SXianjun Jiao 
735*61a63978SXianjun Jiao 	priv->stat.rx_data_pkt_num_total = readin;
736*61a63978SXianjun Jiao 
737*61a63978SXianjun Jiao 	return ret ? ret : len;
738*61a63978SXianjun Jiao }
739*61a63978SXianjun Jiao 
740*61a63978SXianjun Jiao static ssize_t rx_data_pkt_num_fail_show(struct device *input_dev, struct device_attribute *attr, char *buf)
741*61a63978SXianjun Jiao {
742*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
743*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
744*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
745*61a63978SXianjun Jiao 
746*61a63978SXianjun Jiao 	return sprintf(buf, "%u\n", priv->stat.rx_data_pkt_num_fail);
747*61a63978SXianjun Jiao }
748*61a63978SXianjun Jiao static ssize_t rx_data_pkt_num_fail_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
749*61a63978SXianjun Jiao {
750*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
751*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
752*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
753*61a63978SXianjun Jiao 
754*61a63978SXianjun Jiao 	long readin;
755*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
756*61a63978SXianjun Jiao 
757*61a63978SXianjun Jiao 	priv->stat.rx_data_pkt_num_fail = readin;
758*61a63978SXianjun Jiao 
759*61a63978SXianjun Jiao 	return ret ? ret : len;
760*61a63978SXianjun Jiao }
761*61a63978SXianjun Jiao 
762*61a63978SXianjun Jiao static ssize_t rx_mgmt_pkt_num_total_show(struct device *input_dev, struct device_attribute *attr, char *buf)
763*61a63978SXianjun Jiao {
764*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
765*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
766*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
767*61a63978SXianjun Jiao 
768*61a63978SXianjun Jiao 	return sprintf(buf, "%u\n", priv->stat.rx_mgmt_pkt_num_total);
769*61a63978SXianjun Jiao }
770*61a63978SXianjun Jiao static ssize_t rx_mgmt_pkt_num_total_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
771*61a63978SXianjun Jiao {
772*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
773*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
774*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
775*61a63978SXianjun Jiao 
776*61a63978SXianjun Jiao 	long readin;
777*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
778*61a63978SXianjun Jiao 
779*61a63978SXianjun Jiao 	priv->stat.rx_mgmt_pkt_num_total = readin;
780*61a63978SXianjun Jiao 
781*61a63978SXianjun Jiao 	return ret ? ret : len;
782*61a63978SXianjun Jiao }
783*61a63978SXianjun Jiao 
784*61a63978SXianjun Jiao static ssize_t rx_mgmt_pkt_num_fail_show(struct device *input_dev, struct device_attribute *attr, char *buf)
785*61a63978SXianjun Jiao {
786*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
787*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
788*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
789*61a63978SXianjun Jiao 
790*61a63978SXianjun Jiao 	return sprintf(buf, "%u\n", priv->stat.rx_mgmt_pkt_num_fail);
791*61a63978SXianjun Jiao }
792*61a63978SXianjun Jiao static ssize_t rx_mgmt_pkt_num_fail_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
793*61a63978SXianjun Jiao {
794*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
795*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
796*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
797*61a63978SXianjun Jiao 
798*61a63978SXianjun Jiao 	long readin;
799*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
800*61a63978SXianjun Jiao 
801*61a63978SXianjun Jiao 	priv->stat.rx_mgmt_pkt_num_fail = readin;
802*61a63978SXianjun Jiao 
803*61a63978SXianjun Jiao 	return ret ? ret : len;
804*61a63978SXianjun Jiao }
805*61a63978SXianjun Jiao 
806*61a63978SXianjun Jiao static ssize_t rx_ack_pkt_num_total_show(struct device *input_dev, struct device_attribute *attr, char *buf)
807*61a63978SXianjun Jiao {
808*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
809*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
810*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
811*61a63978SXianjun Jiao 
812*61a63978SXianjun Jiao 	return sprintf(buf, "%u\n", priv->stat.rx_ack_pkt_num_total);
813*61a63978SXianjun Jiao }
814*61a63978SXianjun Jiao static ssize_t rx_ack_pkt_num_total_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
815*61a63978SXianjun Jiao {
816*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
817*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
818*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
819*61a63978SXianjun Jiao 
820*61a63978SXianjun Jiao 	long readin;
821*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
822*61a63978SXianjun Jiao 
823*61a63978SXianjun Jiao 	priv->stat.rx_ack_pkt_num_total = readin;
824*61a63978SXianjun Jiao 
825*61a63978SXianjun Jiao 	return ret ? ret : len;
826*61a63978SXianjun Jiao }
827*61a63978SXianjun Jiao 
828*61a63978SXianjun Jiao static ssize_t rx_ack_pkt_num_fail_show(struct device *input_dev, struct device_attribute *attr, char *buf)
829*61a63978SXianjun Jiao {
830*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
831*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
832*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
833*61a63978SXianjun Jiao 
834*61a63978SXianjun Jiao 	return sprintf(buf, "%u\n", priv->stat.rx_ack_pkt_num_fail);
835*61a63978SXianjun Jiao }
836*61a63978SXianjun Jiao static ssize_t rx_ack_pkt_num_fail_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
837*61a63978SXianjun Jiao {
838*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
839*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
840*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
841*61a63978SXianjun Jiao 
842*61a63978SXianjun Jiao 	long readin;
843*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
844*61a63978SXianjun Jiao 
845*61a63978SXianjun Jiao 	priv->stat.rx_ack_pkt_num_fail = readin;
846*61a63978SXianjun Jiao 
847*61a63978SXianjun Jiao 	return ret ? ret : len;
848*61a63978SXianjun Jiao }
849*61a63978SXianjun Jiao 
850*61a63978SXianjun Jiao static ssize_t rx_data_pkt_mcs_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
851*61a63978SXianjun Jiao {
852*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
853*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
854*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
855*61a63978SXianjun Jiao 
856*61a63978SXianjun Jiao 	return sprintf(buf, "%uM\n", wifi_rate_table[priv->stat.rx_data_pkt_mcs_realtime]);
857*61a63978SXianjun Jiao }
858*61a63978SXianjun Jiao static ssize_t rx_data_pkt_mcs_realtime_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
859*61a63978SXianjun Jiao {
860*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
861*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
862*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
863*61a63978SXianjun Jiao 
864*61a63978SXianjun Jiao 	long readin;
865*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
866*61a63978SXianjun Jiao 
867*61a63978SXianjun Jiao 	priv->stat.rx_data_pkt_mcs_realtime = readin;
868*61a63978SXianjun Jiao 
869*61a63978SXianjun Jiao 	return ret ? ret : len;
870*61a63978SXianjun Jiao }
871*61a63978SXianjun Jiao 
872*61a63978SXianjun Jiao static ssize_t rx_data_pkt_fail_mcs_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
873*61a63978SXianjun Jiao {
874*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
875*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
876*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
877*61a63978SXianjun Jiao 
878*61a63978SXianjun Jiao 	return sprintf(buf, "%uM\n", wifi_rate_table[priv->stat.rx_data_pkt_fail_mcs_realtime]);
879*61a63978SXianjun Jiao }
880*61a63978SXianjun 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)
881*61a63978SXianjun Jiao {
882*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
883*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
884*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
885*61a63978SXianjun Jiao 
886*61a63978SXianjun Jiao 	long readin;
887*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
888*61a63978SXianjun Jiao 
889*61a63978SXianjun Jiao 	priv->stat.rx_data_pkt_fail_mcs_realtime = readin;
890*61a63978SXianjun Jiao 
891*61a63978SXianjun Jiao 	return ret ? ret : len;
892*61a63978SXianjun Jiao }
893*61a63978SXianjun Jiao 
894*61a63978SXianjun Jiao static ssize_t rx_mgmt_pkt_mcs_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
895*61a63978SXianjun Jiao {
896*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
897*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
898*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
899*61a63978SXianjun Jiao 
900*61a63978SXianjun Jiao 	return sprintf(buf, "%uM\n", wifi_rate_table[priv->stat.rx_mgmt_pkt_mcs_realtime]);
901*61a63978SXianjun Jiao }
902*61a63978SXianjun Jiao static ssize_t rx_mgmt_pkt_mcs_realtime_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
903*61a63978SXianjun Jiao {
904*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
905*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
906*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
907*61a63978SXianjun Jiao 
908*61a63978SXianjun Jiao 	long readin;
909*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
910*61a63978SXianjun Jiao 
911*61a63978SXianjun Jiao 	priv->stat.rx_mgmt_pkt_mcs_realtime = readin;
912*61a63978SXianjun Jiao 
913*61a63978SXianjun Jiao 	return ret ? ret : len;
914*61a63978SXianjun Jiao }
915*61a63978SXianjun Jiao 
916*61a63978SXianjun Jiao static ssize_t rx_mgmt_pkt_fail_mcs_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
917*61a63978SXianjun Jiao {
918*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
919*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
920*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
921*61a63978SXianjun Jiao 
922*61a63978SXianjun Jiao 	return sprintf(buf, "%uM\n", wifi_rate_table[priv->stat.rx_mgmt_pkt_fail_mcs_realtime]);
923*61a63978SXianjun Jiao }
924*61a63978SXianjun 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)
925*61a63978SXianjun Jiao {
926*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
927*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
928*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
929*61a63978SXianjun Jiao 
930*61a63978SXianjun Jiao 	long readin;
931*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
932*61a63978SXianjun Jiao 
933*61a63978SXianjun Jiao 	priv->stat.rx_mgmt_pkt_fail_mcs_realtime = readin;
934*61a63978SXianjun Jiao 
935*61a63978SXianjun Jiao 	return ret ? ret : len;
936*61a63978SXianjun Jiao }
937*61a63978SXianjun Jiao 
938*61a63978SXianjun Jiao static ssize_t rx_ack_pkt_mcs_realtime_show(struct device *input_dev, struct device_attribute *attr, char *buf)
939*61a63978SXianjun Jiao {
940*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
941*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
942*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
943*61a63978SXianjun Jiao 
944*61a63978SXianjun Jiao 	return sprintf(buf, "%uM\n", wifi_rate_table[priv->stat.rx_ack_pkt_mcs_realtime]);
945*61a63978SXianjun Jiao }
946*61a63978SXianjun Jiao static ssize_t rx_ack_pkt_mcs_realtime_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
947*61a63978SXianjun Jiao {
948*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
949*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
950*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
951*61a63978SXianjun Jiao 
952*61a63978SXianjun Jiao 	long readin;
953*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
954*61a63978SXianjun Jiao 
955*61a63978SXianjun Jiao 	priv->stat.rx_ack_pkt_mcs_realtime = readin;
956*61a63978SXianjun Jiao 
957*61a63978SXianjun Jiao 	return ret ? ret : len;
958*61a63978SXianjun Jiao }
959*61a63978SXianjun Jiao 
960*61a63978SXianjun Jiao static ssize_t restrict_freq_mhz_show(struct device *input_dev, struct device_attribute *attr, char *buf)
961*61a63978SXianjun Jiao {
962*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
963*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
964*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
965*61a63978SXianjun Jiao 
966*61a63978SXianjun Jiao 	return sprintf(buf, "%u\n", priv->stat.restrict_freq_mhz);
967*61a63978SXianjun Jiao }
968*61a63978SXianjun Jiao static ssize_t restrict_freq_mhz_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
969*61a63978SXianjun Jiao {
970*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
971*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
972*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
973*61a63978SXianjun Jiao 
974*61a63978SXianjun Jiao 	long readin;
975*61a63978SXianjun Jiao 	u32 ret = kstrtol(buf, 10, &readin);
976*61a63978SXianjun Jiao 
977*61a63978SXianjun Jiao 	priv->stat.restrict_freq_mhz = readin;
978*61a63978SXianjun Jiao 
979*61a63978SXianjun Jiao 	return ret ? ret : len;
980*61a63978SXianjun Jiao }
981*61a63978SXianjun Jiao 
982*61a63978SXianjun Jiao static ssize_t csma_cfg0_show(struct device *input_dev, struct device_attribute *attr, char *buf)
983*61a63978SXianjun Jiao {
984*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
985*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
986*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
987*61a63978SXianjun Jiao 
988*61a63978SXianjun Jiao 	u32 reg_val;
989*61a63978SXianjun Jiao 
990*61a63978SXianjun Jiao 	reg_val = xpu_api->XPU_REG_FORCE_IDLE_MISC_read();
991*61a63978SXianjun Jiao 	priv->stat.csma_cfg0 = reg_val;
992*61a63978SXianjun Jiao 
993*61a63978SXianjun Jiao 	return sprintf(buf, "nav_disable %d difs_disable %d eifs_disable %d cw_override %d cw override val %d wait_after_decode_top %d\n",
994*61a63978SXianjun Jiao 					(reg_val>>31)&1,
995*61a63978SXianjun Jiao 					(reg_val>>30)&1,
996*61a63978SXianjun Jiao 					(reg_val>>29)&1,
997*61a63978SXianjun Jiao 					(reg_val>>28)&1,
998*61a63978SXianjun Jiao 					(reg_val>>16)&0xf,
999*61a63978SXianjun Jiao 					(reg_val>>0)&0xff);
1000*61a63978SXianjun Jiao }
1001*61a63978SXianjun Jiao static ssize_t csma_cfg0_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
1002*61a63978SXianjun Jiao {
1003*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
1004*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
1005*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
1006*61a63978SXianjun Jiao 
1007*61a63978SXianjun Jiao 	u32 disable_flag, idx_from_msb, reg_val;
1008*61a63978SXianjun Jiao 	u32 readin;
1009*61a63978SXianjun Jiao 	u32 ret = kstrtouint(buf, 16, &readin);
1010*61a63978SXianjun Jiao 
1011*61a63978SXianjun Jiao 	disable_flag =  (readin&0xf);
1012*61a63978SXianjun Jiao 	idx_from_msb = ((readin>>4)&0xf);
1013*61a63978SXianjun Jiao 
1014*61a63978SXianjun Jiao 	reg_val = xpu_api->XPU_REG_FORCE_IDLE_MISC_read();
1015*61a63978SXianjun Jiao 
1016*61a63978SXianjun Jiao 	if (disable_flag)
1017*61a63978SXianjun Jiao 		reg_val = (reg_val|(1<<(31-idx_from_msb)));
1018*61a63978SXianjun Jiao 	else
1019*61a63978SXianjun Jiao 		reg_val = (reg_val&(~(1<<(31-idx_from_msb))));
1020*61a63978SXianjun Jiao 
1021*61a63978SXianjun Jiao 	xpu_api->XPU_REG_FORCE_IDLE_MISC_write(reg_val);
1022*61a63978SXianjun Jiao 
1023*61a63978SXianjun Jiao 	priv->stat.csma_cfg0 = reg_val;
1024*61a63978SXianjun Jiao 
1025*61a63978SXianjun Jiao 	return ret ? ret : len;
1026*61a63978SXianjun Jiao }
1027*61a63978SXianjun Jiao 
1028*61a63978SXianjun Jiao static ssize_t cw_max_min_cfg_show(struct device *input_dev, struct device_attribute *attr, char *buf)
1029*61a63978SXianjun Jiao {
1030*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
1031*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
1032*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
1033*61a63978SXianjun Jiao 
1034*61a63978SXianjun Jiao 	u32 ret_size, reg_val;
1035*61a63978SXianjun Jiao 
1036*61a63978SXianjun Jiao 	reg_val = xpu_api->XPU_REG_CSMA_CFG_read();
1037*61a63978SXianjun Jiao 
1038*61a63978SXianjun Jiao 	ret_size = sprintf(buf, "FPGA  cw max min for q3 to q0: %d %d; %d %d; %d %d; %d %d\n",
1039*61a63978SXianjun Jiao 						(1<<((reg_val>>28)&0xF))-1,
1040*61a63978SXianjun Jiao 						(1<<((reg_val>>24)&0xF))-1,
1041*61a63978SXianjun Jiao 						(1<<((reg_val>>20)&0xF))-1,
1042*61a63978SXianjun Jiao 						(1<<((reg_val>>16)&0xF))-1,
1043*61a63978SXianjun Jiao 						(1<<((reg_val>>12)&0xF))-1,
1044*61a63978SXianjun Jiao 						(1<<((reg_val>> 8)&0xF))-1,
1045*61a63978SXianjun Jiao 						(1<<((reg_val>> 4)&0xF))-1,
1046*61a63978SXianjun Jiao 						(1<<((reg_val>> 0)&0xF))-1);
1047*61a63978SXianjun Jiao 	ret_size = ret_size + sprintf(buf+ret_size, "FPGA  cw max min for q3 to q0: %08x\n",reg_val);
1048*61a63978SXianjun Jiao 
1049*61a63978SXianjun Jiao 	if (priv->stat.cw_max_min_cfg) {
1050*61a63978SXianjun Jiao 		reg_val = priv->stat.cw_max_min_cfg;
1051*61a63978SXianjun 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",
1052*61a63978SXianjun Jiao 						(1<<((reg_val>>28)&0xF))-1,
1053*61a63978SXianjun Jiao 						(1<<((reg_val>>24)&0xF))-1,
1054*61a63978SXianjun Jiao 						(1<<((reg_val>>20)&0xF))-1,
1055*61a63978SXianjun Jiao 						(1<<((reg_val>>16)&0xF))-1,
1056*61a63978SXianjun Jiao 						(1<<((reg_val>>12)&0xF))-1,
1057*61a63978SXianjun Jiao 						(1<<((reg_val>> 8)&0xF))-1,
1058*61a63978SXianjun Jiao 						(1<<((reg_val>> 4)&0xF))-1,
1059*61a63978SXianjun Jiao 						(1<<((reg_val>> 0)&0xF))-1);
1060*61a63978SXianjun Jiao 		ret_size = ret_size + sprintf(buf+ret_size, "SYSFS cw max min for q3 to q0: %08x\n",reg_val);
1061*61a63978SXianjun Jiao 	}
1062*61a63978SXianjun Jiao 
1063*61a63978SXianjun Jiao 	return ret_size;
1064*61a63978SXianjun Jiao }
1065*61a63978SXianjun Jiao 
1066*61a63978SXianjun Jiao static ssize_t cw_max_min_cfg_store(struct device *input_dev, struct device_attribute *attr, const char *buf, size_t len)
1067*61a63978SXianjun Jiao {
1068*61a63978SXianjun Jiao 	struct platform_device *pdev = to_platform_device(input_dev);
1069*61a63978SXianjun Jiao 	struct ieee80211_hw *dev = platform_get_drvdata(pdev);
1070*61a63978SXianjun Jiao 	struct openwifi_priv *priv = dev->priv;
1071*61a63978SXianjun Jiao 
1072*61a63978SXianjun Jiao 	u32 readin;
1073*61a63978SXianjun Jiao 	u32 ret = kstrtouint(buf, 16, &readin);
1074*61a63978SXianjun Jiao 
1075*61a63978SXianjun Jiao 	// printk("%s %d\n", buf, readin);
1076*61a63978SXianjun Jiao 
1077*61a63978SXianjun Jiao 	priv->stat.cw_max_min_cfg = readin;
1078*61a63978SXianjun Jiao 	if (readin)
1079*61a63978SXianjun Jiao 		xpu_api->XPU_REG_CSMA_CFG_write(readin);
1080*61a63978SXianjun Jiao 
1081*61a63978SXianjun Jiao 	return ret ? ret : len;
1082*61a63978SXianjun Jiao }
1083*61a63978SXianjun Jiao 
1084*61a63978SXianjun Jiao static DEVICE_ATTR(stat_enable, S_IRUGO | S_IWUSR, stat_enable_show, stat_enable_store);
1085*61a63978SXianjun Jiao static DEVICE_ATTR(tx_prio_queue, S_IRUGO | S_IWUSR, tx_prio_queue_show, tx_prio_queue_store);
1086*61a63978SXianjun 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);
1087*61a63978SXianjun 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);
1088*61a63978SXianjun 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);
1089*61a63978SXianjun 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);
1090*61a63978SXianjun Jiao 
1091*61a63978SXianjun 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);
1092*61a63978SXianjun 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);
1093*61a63978SXianjun Jiao 
1094*61a63978SXianjun 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);
1095*61a63978SXianjun 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);
1096*61a63978SXianjun 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);
1097*61a63978SXianjun 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);
1098*61a63978SXianjun Jiao 
1099*61a63978SXianjun 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);
1100*61a63978SXianjun 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);
1101*61a63978SXianjun Jiao 
1102*61a63978SXianjun 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);
1103*61a63978SXianjun 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);
1104*61a63978SXianjun 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);
1105*61a63978SXianjun 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);
1106*61a63978SXianjun 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);
1107*61a63978SXianjun 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);
1108*61a63978SXianjun Jiao 
1109*61a63978SXianjun Jiao static DEVICE_ATTR(rx_monitor_all, S_IRUGO | S_IWUSR, rx_monitor_all_show, rx_monitor_all_store);
1110*61a63978SXianjun 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);
1111*61a63978SXianjun 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);
1112*61a63978SXianjun 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);
1113*61a63978SXianjun 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);
1114*61a63978SXianjun 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);
1115*61a63978SXianjun 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);
1116*61a63978SXianjun Jiao 
1117*61a63978SXianjun 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);
1118*61a63978SXianjun 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);
1119*61a63978SXianjun 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);
1120*61a63978SXianjun 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);
1121*61a63978SXianjun 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);
1122*61a63978SXianjun Jiao 
1123*61a63978SXianjun Jiao static DEVICE_ATTR(restrict_freq_mhz, S_IRUGO | S_IWUSR, restrict_freq_mhz_show, restrict_freq_mhz_store);
1124*61a63978SXianjun Jiao 
1125*61a63978SXianjun Jiao static DEVICE_ATTR(csma_cfg0, S_IRUGO | S_IWUSR, csma_cfg0_show, csma_cfg0_store);
1126*61a63978SXianjun Jiao static DEVICE_ATTR(cw_max_min_cfg, S_IRUGO | S_IWUSR, cw_max_min_cfg_show, cw_max_min_cfg_store);
1127*61a63978SXianjun Jiao 
1128*61a63978SXianjun Jiao static struct attribute *stat_attributes[] = {
1129*61a63978SXianjun Jiao 	&dev_attr_stat_enable.attr,
1130*61a63978SXianjun Jiao 
1131*61a63978SXianjun Jiao 	&dev_attr_tx_prio_queue.attr,
1132*61a63978SXianjun Jiao 
1133*61a63978SXianjun Jiao 	&dev_attr_tx_data_pkt_need_ack_num_total.attr,
1134*61a63978SXianjun Jiao 	&dev_attr_tx_data_pkt_need_ack_num_total_fail.attr,
1135*61a63978SXianjun Jiao 
1136*61a63978SXianjun Jiao 	&dev_attr_tx_data_pkt_need_ack_num_retx.attr,
1137*61a63978SXianjun Jiao 	&dev_attr_tx_data_pkt_need_ack_num_retx_fail.attr,
1138*61a63978SXianjun Jiao 
1139*61a63978SXianjun Jiao 	&dev_attr_tx_data_pkt_mcs_realtime.attr,
1140*61a63978SXianjun Jiao 	&dev_attr_tx_data_pkt_fail_mcs_realtime.attr,
1141*61a63978SXianjun Jiao 
1142*61a63978SXianjun Jiao 	&dev_attr_tx_mgmt_pkt_need_ack_num_total.attr,
1143*61a63978SXianjun Jiao 	&dev_attr_tx_mgmt_pkt_need_ack_num_total_fail.attr,
1144*61a63978SXianjun Jiao 
1145*61a63978SXianjun Jiao 	&dev_attr_tx_mgmt_pkt_need_ack_num_retx.attr,
1146*61a63978SXianjun Jiao 	&dev_attr_tx_mgmt_pkt_need_ack_num_retx_fail.attr,
1147*61a63978SXianjun Jiao 
1148*61a63978SXianjun Jiao 	&dev_attr_tx_mgmt_pkt_mcs_realtime.attr,
1149*61a63978SXianjun Jiao 	&dev_attr_tx_mgmt_pkt_fail_mcs_realtime.attr,
1150*61a63978SXianjun Jiao 
1151*61a63978SXianjun Jiao 	&dev_attr_rx_target_sender_mac_addr.attr,
1152*61a63978SXianjun Jiao 	&dev_attr_rx_data_ok_agc_gain_value_realtime.attr,
1153*61a63978SXianjun Jiao 	&dev_attr_rx_data_fail_agc_gain_value_realtime.attr,
1154*61a63978SXianjun Jiao 	&dev_attr_rx_mgmt_ok_agc_gain_value_realtime.attr,
1155*61a63978SXianjun Jiao 	&dev_attr_rx_mgmt_fail_agc_gain_value_realtime.attr,
1156*61a63978SXianjun Jiao 	&dev_attr_rx_ack_ok_agc_gain_value_realtime.attr,
1157*61a63978SXianjun Jiao 
1158*61a63978SXianjun Jiao 	&dev_attr_rx_monitor_all.attr,
1159*61a63978SXianjun Jiao 	&dev_attr_rx_data_pkt_num_total.attr,
1160*61a63978SXianjun Jiao 	&dev_attr_rx_data_pkt_num_fail.attr,
1161*61a63978SXianjun Jiao 	&dev_attr_rx_mgmt_pkt_num_total.attr,
1162*61a63978SXianjun Jiao 	&dev_attr_rx_mgmt_pkt_num_fail.attr,
1163*61a63978SXianjun Jiao 	&dev_attr_rx_ack_pkt_num_total.attr,
1164*61a63978SXianjun Jiao 	&dev_attr_rx_ack_pkt_num_fail.attr,
1165*61a63978SXianjun Jiao 
1166*61a63978SXianjun Jiao 	&dev_attr_rx_data_pkt_mcs_realtime.attr,
1167*61a63978SXianjun Jiao 	&dev_attr_rx_data_pkt_fail_mcs_realtime.attr,
1168*61a63978SXianjun Jiao 	&dev_attr_rx_mgmt_pkt_mcs_realtime.attr,
1169*61a63978SXianjun Jiao 	&dev_attr_rx_mgmt_pkt_fail_mcs_realtime.attr,
1170*61a63978SXianjun Jiao 	&dev_attr_rx_ack_pkt_mcs_realtime.attr,
1171*61a63978SXianjun Jiao 
1172*61a63978SXianjun Jiao 	&dev_attr_restrict_freq_mhz.attr,
1173*61a63978SXianjun Jiao 
1174*61a63978SXianjun Jiao 	&dev_attr_csma_cfg0.attr,
1175*61a63978SXianjun Jiao 	&dev_attr_cw_max_min_cfg.attr,
1176*61a63978SXianjun Jiao 
1177*61a63978SXianjun Jiao 	NULL,
1178*61a63978SXianjun Jiao };
1179*61a63978SXianjun Jiao static const struct attribute_group stat_attribute_group = {
1180*61a63978SXianjun Jiao 	.attrs = stat_attributes,
1181*61a63978SXianjun Jiao };
1182