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