rs.c (110b32f065f3c66a7a1626ca57b64641ed6a578e) rs.c (f6f046f0c0b74bb45ba990a632033f77c1202a82)
1/******************************************************************************
2 *
3 * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
4 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
5 * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as

--- 3565 unchanged lines hidden (view full) ---

3574 struct iwl_op_mode *op_mode __maybe_unused = mvm_r;
3575 struct iwl_mvm *mvm __maybe_unused = IWL_OP_MODE_GET_MVM(op_mode);
3576
3577 IWL_DEBUG_RATE(mvm, "enter\n");
3578 IWL_DEBUG_RATE(mvm, "leave\n");
3579}
3580
3581#ifdef CONFIG_MAC80211_DEBUGFS
1/******************************************************************************
2 *
3 * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
4 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
5 * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as

--- 3565 unchanged lines hidden (view full) ---

3574 struct iwl_op_mode *op_mode __maybe_unused = mvm_r;
3575 struct iwl_mvm *mvm __maybe_unused = IWL_OP_MODE_GET_MVM(op_mode);
3576
3577 IWL_DEBUG_RATE(mvm, "enter\n");
3578 IWL_DEBUG_RATE(mvm, "leave\n");
3579}
3580
3581#ifdef CONFIG_MAC80211_DEBUGFS
3582int rs_pretty_print_rate(char *buf, const u32 rate)
3582int rs_pretty_print_rate(char *buf, int bufsz, const u32 rate)
3583{
3584
3585 char *type, *bw;
3586 u8 mcs = 0, nss = 0;
3587 u8 ant = (rate & RATE_MCS_ANT_ABC_MSK) >> RATE_MCS_ANT_POS;
3588
3589 if (!(rate & RATE_MCS_HT_MSK) &&
3590 !(rate & RATE_MCS_VHT_MSK)) {
3591 int index = iwl_hwrate_to_plcp_idx(rate);
3592
3583{
3584
3585 char *type, *bw;
3586 u8 mcs = 0, nss = 0;
3587 u8 ant = (rate & RATE_MCS_ANT_ABC_MSK) >> RATE_MCS_ANT_POS;
3588
3589 if (!(rate & RATE_MCS_HT_MSK) &&
3590 !(rate & RATE_MCS_VHT_MSK)) {
3591 int index = iwl_hwrate_to_plcp_idx(rate);
3592
3593 return sprintf(buf, "Legacy | ANT: %s Rate: %s Mbps\n",
3594 rs_pretty_ant(ant),
3595 index == IWL_RATE_INVALID ? "BAD" :
3596 iwl_rate_mcs[index].mbps);
3593 return scnprintf(buf, bufsz, "Legacy | ANT: %s Rate: %s Mbps\n",
3594 rs_pretty_ant(ant),
3595 index == IWL_RATE_INVALID ? "BAD" :
3596 iwl_rate_mcs[index].mbps);
3597 }
3598
3599 if (rate & RATE_MCS_VHT_MSK) {
3600 type = "VHT";
3601 mcs = rate & RATE_VHT_MCS_RATE_CODE_MSK;
3602 nss = ((rate & RATE_VHT_MCS_NSS_MSK)
3603 >> RATE_VHT_MCS_NSS_POS) + 1;
3604 } else if (rate & RATE_MCS_HT_MSK) {

--- 17 unchanged lines hidden (view full) ---

3622 break;
3623 case RATE_MCS_CHAN_WIDTH_160:
3624 bw = "160Mhz";
3625 break;
3626 default:
3627 bw = "BAD BW";
3628 }
3629
3597 }
3598
3599 if (rate & RATE_MCS_VHT_MSK) {
3600 type = "VHT";
3601 mcs = rate & RATE_VHT_MCS_RATE_CODE_MSK;
3602 nss = ((rate & RATE_VHT_MCS_NSS_MSK)
3603 >> RATE_VHT_MCS_NSS_POS) + 1;
3604 } else if (rate & RATE_MCS_HT_MSK) {

--- 17 unchanged lines hidden (view full) ---

3622 break;
3623 case RATE_MCS_CHAN_WIDTH_160:
3624 bw = "160Mhz";
3625 break;
3626 default:
3627 bw = "BAD BW";
3628 }
3629
3630 return sprintf(buf, "%s | ANT: %s BW: %s MCS: %d NSS: %d %s%s%s%s\n",
3631 type, rs_pretty_ant(ant), bw, mcs, nss,
3632 (rate & RATE_MCS_SGI_MSK) ? "SGI " : "NGI ",
3633 (rate & RATE_MCS_STBC_MSK) ? "STBC " : "",
3634 (rate & RATE_MCS_LDPC_MSK) ? "LDPC " : "",
3635 (rate & RATE_MCS_BF_MSK) ? "BF " : "");
3630 return scnprintf(buf, bufsz,
3631 "%s | ANT: %s BW: %s MCS: %d NSS: %d %s%s%s%s\n",
3632 type, rs_pretty_ant(ant), bw, mcs, nss,
3633 (rate & RATE_MCS_SGI_MSK) ? "SGI " : "NGI ",
3634 (rate & RATE_MCS_STBC_MSK) ? "STBC " : "",
3635 (rate & RATE_MCS_LDPC_MSK) ? "LDPC " : "",
3636 (rate & RATE_MCS_BF_MSK) ? "BF " : "");
3636}
3637
3638/**
3639 * Program the device to use fixed rate for frame transmit
3640 * This is for debugging/testing only
3641 * once the device start use fixed rate, we need to reload the module
3642 * to being back the normal operation.
3643 */

--- 40 unchanged lines hidden (view full) ---

3684
3685static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file,
3686 char __user *user_buf, size_t count, loff_t *ppos)
3687{
3688 char *buff;
3689 int desc = 0;
3690 int i = 0;
3691 ssize_t ret;
3637}
3638
3639/**
3640 * Program the device to use fixed rate for frame transmit
3641 * This is for debugging/testing only
3642 * once the device start use fixed rate, we need to reload the module
3643 * to being back the normal operation.
3644 */

--- 40 unchanged lines hidden (view full) ---

3685
3686static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file,
3687 char __user *user_buf, size_t count, loff_t *ppos)
3688{
3689 char *buff;
3690 int desc = 0;
3691 int i = 0;
3692 ssize_t ret;
3693 static const size_t bufsz = 2048;
3692
3693 struct iwl_lq_sta *lq_sta = file->private_data;
3694 struct iwl_mvm_sta *mvmsta =
3695 container_of(lq_sta, struct iwl_mvm_sta, lq_sta.rs_drv);
3696 struct iwl_mvm *mvm;
3697 struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
3698 struct rs_rate *rate = &tbl->rate;
3699 u32 ss_params;
3700
3701 mvm = lq_sta->pers.drv;
3694
3695 struct iwl_lq_sta *lq_sta = file->private_data;
3696 struct iwl_mvm_sta *mvmsta =
3697 container_of(lq_sta, struct iwl_mvm_sta, lq_sta.rs_drv);
3698 struct iwl_mvm *mvm;
3699 struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
3700 struct rs_rate *rate = &tbl->rate;
3701 u32 ss_params;
3702
3703 mvm = lq_sta->pers.drv;
3702 buff = kmalloc(2048, GFP_KERNEL);
3704 buff = kmalloc(bufsz, GFP_KERNEL);
3703 if (!buff)
3704 return -ENOMEM;
3705
3705 if (!buff)
3706 return -ENOMEM;
3707
3706 desc += sprintf(buff+desc, "sta_id %d\n", lq_sta->lq.sta_id);
3707 desc += sprintf(buff+desc, "failed=%d success=%d rate=0%lX\n",
3708 lq_sta->total_failed, lq_sta->total_success,
3709 lq_sta->active_legacy_rate);
3710 desc += sprintf(buff+desc, "fixed rate 0x%X\n",
3711 lq_sta->pers.dbg_fixed_rate);
3712 desc += sprintf(buff+desc, "valid_tx_ant %s%s%s\n",
3708 desc += scnprintf(buff + desc, bufsz - desc,
3709 "sta_id %d\n", lq_sta->lq.sta_id);
3710 desc += scnprintf(buff + desc, bufsz - desc,
3711 "failed=%d success=%d rate=0%lX\n",
3712 lq_sta->total_failed, lq_sta->total_success,
3713 lq_sta->active_legacy_rate);
3714 desc += scnprintf(buff + desc, bufsz - desc, "fixed rate 0x%X\n",
3715 lq_sta->pers.dbg_fixed_rate);
3716 desc += scnprintf(buff + desc, bufsz - desc, "valid_tx_ant %s%s%s\n",
3713 (iwl_mvm_get_valid_tx_ant(mvm) & ANT_A) ? "ANT_A," : "",
3714 (iwl_mvm_get_valid_tx_ant(mvm) & ANT_B) ? "ANT_B," : "",
3715 (iwl_mvm_get_valid_tx_ant(mvm) & ANT_C) ? "ANT_C" : "");
3717 (iwl_mvm_get_valid_tx_ant(mvm) & ANT_A) ? "ANT_A," : "",
3718 (iwl_mvm_get_valid_tx_ant(mvm) & ANT_B) ? "ANT_B," : "",
3719 (iwl_mvm_get_valid_tx_ant(mvm) & ANT_C) ? "ANT_C" : "");
3716 desc += sprintf(buff+desc, "lq type %s\n",
3717 (is_legacy(rate)) ? "legacy" :
3718 is_vht(rate) ? "VHT" : "HT");
3720 desc += scnprintf(buff + desc, bufsz - desc, "lq type %s\n",
3721 (is_legacy(rate)) ? "legacy" :
3722 is_vht(rate) ? "VHT" : "HT");
3719 if (!is_legacy(rate)) {
3723 if (!is_legacy(rate)) {
3720 desc += sprintf(buff + desc, " %s",
3724 desc += scnprintf(buff + desc, bufsz - desc, " %s",
3721 (is_siso(rate)) ? "SISO" : "MIMO2");
3725 (is_siso(rate)) ? "SISO" : "MIMO2");
3722 desc += sprintf(buff + desc, " %s",
3726 desc += scnprintf(buff + desc, bufsz - desc, " %s",
3723 (is_ht20(rate)) ? "20MHz" :
3724 (is_ht40(rate)) ? "40MHz" :
3725 (is_ht80(rate)) ? "80MHz" :
3726 (is_ht160(rate)) ? "160MHz" : "BAD BW");
3727 (is_ht20(rate)) ? "20MHz" :
3728 (is_ht40(rate)) ? "40MHz" :
3729 (is_ht80(rate)) ? "80MHz" :
3730 (is_ht160(rate)) ? "160MHz" : "BAD BW");
3727 desc += sprintf(buff + desc, " %s %s %s %s\n",
3731 desc += scnprintf(buff + desc, bufsz - desc, " %s %s %s %s\n",
3728 (rate->sgi) ? "SGI" : "NGI",
3729 (rate->ldpc) ? "LDPC" : "BCC",
3730 (lq_sta->is_agg) ? "AGG on" : "",
3731 (mvmsta->tlc_amsdu) ? "AMSDU on" : "");
3732 }
3732 (rate->sgi) ? "SGI" : "NGI",
3733 (rate->ldpc) ? "LDPC" : "BCC",
3734 (lq_sta->is_agg) ? "AGG on" : "",
3735 (mvmsta->tlc_amsdu) ? "AMSDU on" : "");
3736 }
3733 desc += sprintf(buff+desc, "last tx rate=0x%X\n",
3737 desc += scnprintf(buff + desc, bufsz - desc, "last tx rate=0x%X\n",
3734 lq_sta->last_rate_n_flags);
3738 lq_sta->last_rate_n_flags);
3735 desc += sprintf(buff+desc,
3739 desc += scnprintf(buff + desc, bufsz - desc,
3736 "general: flags=0x%X mimo-d=%d s-ant=0x%x d-ant=0x%x\n",
3737 lq_sta->lq.flags,
3738 lq_sta->lq.mimo_delim,
3739 lq_sta->lq.single_stream_ant_msk,
3740 lq_sta->lq.dual_stream_ant_msk);
3741
3740 "general: flags=0x%X mimo-d=%d s-ant=0x%x d-ant=0x%x\n",
3741 lq_sta->lq.flags,
3742 lq_sta->lq.mimo_delim,
3743 lq_sta->lq.single_stream_ant_msk,
3744 lq_sta->lq.dual_stream_ant_msk);
3745
3742 desc += sprintf(buff+desc,
3746 desc += scnprintf(buff + desc, bufsz - desc,
3743 "agg: time_limit=%d dist_start_th=%d frame_cnt_limit=%d\n",
3744 le16_to_cpu(lq_sta->lq.agg_time_limit),
3745 lq_sta->lq.agg_disable_start_th,
3746 lq_sta->lq.agg_frame_cnt_limit);
3747
3747 "agg: time_limit=%d dist_start_th=%d frame_cnt_limit=%d\n",
3748 le16_to_cpu(lq_sta->lq.agg_time_limit),
3749 lq_sta->lq.agg_disable_start_th,
3750 lq_sta->lq.agg_frame_cnt_limit);
3751
3748 desc += sprintf(buff+desc, "reduced tpc=%d\n", lq_sta->lq.reduced_tpc);
3752 desc += scnprintf(buff + desc, bufsz - desc, "reduced tpc=%d\n",
3753 lq_sta->lq.reduced_tpc);
3749 ss_params = le32_to_cpu(lq_sta->lq.ss_params);
3754 ss_params = le32_to_cpu(lq_sta->lq.ss_params);
3750 desc += sprintf(buff+desc, "single stream params: %s%s%s%s\n",
3755 desc += scnprintf(buff + desc, bufsz - desc,
3756 "single stream params: %s%s%s%s\n",
3751 (ss_params & LQ_SS_PARAMS_VALID) ?
3752 "VALID" : "INVALID",
3753 (ss_params & LQ_SS_BFER_ALLOWED) ?
3754 ", BFER" : "",
3755 (ss_params & LQ_SS_STBC_1SS_ALLOWED) ?
3756 ", STBC" : "",
3757 (ss_params & LQ_SS_FORCE) ?
3758 ", FORCE" : "");
3757 (ss_params & LQ_SS_PARAMS_VALID) ?
3758 "VALID" : "INVALID",
3759 (ss_params & LQ_SS_BFER_ALLOWED) ?
3760 ", BFER" : "",
3761 (ss_params & LQ_SS_STBC_1SS_ALLOWED) ?
3762 ", STBC" : "",
3763 (ss_params & LQ_SS_FORCE) ?
3764 ", FORCE" : "");
3759 desc += sprintf(buff+desc,
3765 desc += scnprintf(buff + desc, bufsz - desc,
3760 "Start idx [0]=0x%x [1]=0x%x [2]=0x%x [3]=0x%x\n",
3761 lq_sta->lq.initial_rate_index[0],
3762 lq_sta->lq.initial_rate_index[1],
3763 lq_sta->lq.initial_rate_index[2],
3764 lq_sta->lq.initial_rate_index[3]);
3765
3766 for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++) {
3767 u32 r = le32_to_cpu(lq_sta->lq.rs_table[i]);
3768
3766 "Start idx [0]=0x%x [1]=0x%x [2]=0x%x [3]=0x%x\n",
3767 lq_sta->lq.initial_rate_index[0],
3768 lq_sta->lq.initial_rate_index[1],
3769 lq_sta->lq.initial_rate_index[2],
3770 lq_sta->lq.initial_rate_index[3]);
3771
3772 for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++) {
3773 u32 r = le32_to_cpu(lq_sta->lq.rs_table[i]);
3774
3769 desc += sprintf(buff+desc, " rate[%d] 0x%X ", i, r);
3770 desc += rs_pretty_print_rate(buff+desc, r);
3775 desc += scnprintf(buff + desc, bufsz - desc,
3776 " rate[%d] 0x%X ", i, r);
3777 desc += rs_pretty_print_rate(buff + desc, bufsz - desc, r);
3771 }
3772
3773 ret = simple_read_from_buffer(user_buf, count, ppos, buff, desc);
3774 kfree(buff);
3775 return ret;
3776}
3777
3778static const struct file_operations rs_sta_dbgfs_scale_table_ops = {

--- 318 unchanged lines hidden ---
3778 }
3779
3780 ret = simple_read_from_buffer(user_buf, count, ppos, buff, desc);
3781 kfree(buff);
3782 return ret;
3783}
3784
3785static const struct file_operations rs_sta_dbgfs_scale_table_ops = {

--- 318 unchanged lines hidden ---