diff options
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/rs.c | 91 |
1 files changed, 73 insertions, 18 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.c b/drivers/net/wireless/iwlwifi/mvm/rs.c index a0b4cc8d9c3b..f7ac485f85e1 100644 --- a/drivers/net/wireless/iwlwifi/mvm/rs.c +++ b/drivers/net/wireless/iwlwifi/mvm/rs.c | |||
@@ -2566,13 +2566,75 @@ static ssize_t rs_sta_dbgfs_scale_table_write(struct file *file, | |||
2566 | return count; | 2566 | return count; |
2567 | } | 2567 | } |
2568 | 2568 | ||
2569 | static int rs_pretty_print_rate(char *buf, const u32 rate) | ||
2570 | { | ||
2571 | static const char * const ant_name[] = { | ||
2572 | [ANT_NONE] = "None", | ||
2573 | [ANT_A] = "A", | ||
2574 | [ANT_B] = "B", | ||
2575 | [ANT_AB] = "AB", | ||
2576 | [ANT_C] = "C", | ||
2577 | [ANT_AC] = "AC", | ||
2578 | [ANT_BC] = "BC", | ||
2579 | [ANT_ABC] = "ABC", | ||
2580 | }; | ||
2581 | |||
2582 | char *type, *bw; | ||
2583 | u8 mcs = 0, nss = 0; | ||
2584 | u8 ant = (rate & RATE_MCS_ANT_ABC_MSK) >> RATE_MCS_ANT_POS; | ||
2585 | |||
2586 | if (!(rate & RATE_MCS_HT_MSK) && | ||
2587 | !(rate & RATE_MCS_VHT_MSK)) { | ||
2588 | int index = iwl_hwrate_to_plcp_idx(rate); | ||
2589 | |||
2590 | return sprintf(buf, "Legacy | ANT: %s Rate: %s Mbps\n", | ||
2591 | ant_name[ant], iwl_rate_mcs[index].mbps); | ||
2592 | } | ||
2593 | |||
2594 | if (rate & RATE_MCS_VHT_MSK) { | ||
2595 | type = "VHT"; | ||
2596 | mcs = rate & RATE_VHT_MCS_RATE_CODE_MSK; | ||
2597 | nss = ((rate & RATE_VHT_MCS_NSS_MSK) | ||
2598 | >> RATE_VHT_MCS_NSS_POS) + 1; | ||
2599 | } else if (rate & RATE_MCS_HT_MSK) { | ||
2600 | type = "HT"; | ||
2601 | mcs = rate & RATE_HT_MCS_INDEX_MSK; | ||
2602 | } else { | ||
2603 | type = "Unknown"; /* shouldn't happen */ | ||
2604 | } | ||
2605 | |||
2606 | switch (rate & RATE_MCS_CHAN_WIDTH_MSK) { | ||
2607 | case RATE_MCS_CHAN_WIDTH_20: | ||
2608 | bw = "20Mhz"; | ||
2609 | break; | ||
2610 | case RATE_MCS_CHAN_WIDTH_40: | ||
2611 | bw = "40Mhz"; | ||
2612 | break; | ||
2613 | case RATE_MCS_CHAN_WIDTH_80: | ||
2614 | bw = "80Mhz"; | ||
2615 | break; | ||
2616 | case RATE_MCS_CHAN_WIDTH_160: | ||
2617 | bw = "160Mhz"; | ||
2618 | break; | ||
2619 | default: | ||
2620 | bw = "BAD BW"; | ||
2621 | } | ||
2622 | |||
2623 | return sprintf(buf, "%s | ANT: %s BW: %s MCS: %d NSS: %d %s%s%s%s%s\n", | ||
2624 | type, ant_name[ant], bw, mcs, nss, | ||
2625 | (rate & RATE_MCS_SGI_MSK) ? "SGI " : "NGI ", | ||
2626 | (rate & RATE_MCS_STBC_MSK) ? "STBC " : "", | ||
2627 | (rate & RATE_MCS_LDPC_MSK) ? "LDPC " : "", | ||
2628 | (rate & RATE_MCS_BF_MSK) ? "BF " : "", | ||
2629 | (rate & RATE_MCS_ZLF_MSK) ? "ZLF " : ""); | ||
2630 | } | ||
2631 | |||
2569 | static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file, | 2632 | static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file, |
2570 | char __user *user_buf, size_t count, loff_t *ppos) | 2633 | char __user *user_buf, size_t count, loff_t *ppos) |
2571 | { | 2634 | { |
2572 | char *buff; | 2635 | char *buff; |
2573 | int desc = 0; | 2636 | int desc = 0; |
2574 | int i = 0; | 2637 | int i = 0; |
2575 | int index = 0; | ||
2576 | ssize_t ret; | 2638 | ssize_t ret; |
2577 | 2639 | ||
2578 | struct iwl_lq_sta *lq_sta = file->private_data; | 2640 | struct iwl_lq_sta *lq_sta = file->private_data; |
@@ -2580,7 +2642,7 @@ static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file, | |||
2580 | struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); | 2642 | struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); |
2581 | 2643 | ||
2582 | mvm = lq_sta->drv; | 2644 | mvm = lq_sta->drv; |
2583 | buff = kmalloc(1024, GFP_KERNEL); | 2645 | buff = kmalloc(2048, GFP_KERNEL); |
2584 | if (!buff) | 2646 | if (!buff) |
2585 | return -ENOMEM; | 2647 | return -ENOMEM; |
2586 | 2648 | ||
@@ -2597,7 +2659,7 @@ static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file, | |||
2597 | desc += sprintf(buff+desc, "lq type %s\n", | 2659 | desc += sprintf(buff+desc, "lq type %s\n", |
2598 | (is_legacy(tbl->lq_type)) ? "legacy" : | 2660 | (is_legacy(tbl->lq_type)) ? "legacy" : |
2599 | is_vht(tbl->lq_type) ? "VHT" : "HT"); | 2661 | is_vht(tbl->lq_type) ? "VHT" : "HT"); |
2600 | if (is_ht(tbl->lq_type)) { | 2662 | if (!is_legacy(tbl->lq_type)) { |
2601 | desc += sprintf(buff+desc, " %s", | 2663 | desc += sprintf(buff+desc, " %s", |
2602 | (is_siso(tbl->lq_type)) ? "SISO" : "MIMO2"); | 2664 | (is_siso(tbl->lq_type)) ? "SISO" : "MIMO2"); |
2603 | desc += sprintf(buff+desc, " %s", | 2665 | desc += sprintf(buff+desc, " %s", |
@@ -2605,13 +2667,13 @@ static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file, | |||
2605 | (is_ht40(tbl)) ? "40MHz" : | 2667 | (is_ht40(tbl)) ? "40MHz" : |
2606 | (is_ht80(tbl)) ? "80Mhz" : "BAD BW"); | 2668 | (is_ht80(tbl)) ? "80Mhz" : "BAD BW"); |
2607 | desc += sprintf(buff+desc, " %s %s\n", | 2669 | desc += sprintf(buff+desc, " %s %s\n", |
2608 | (tbl->is_SGI) ? "SGI" : "", | 2670 | (tbl->is_SGI) ? "SGI" : "NGI", |
2609 | (lq_sta->is_agg) ? "AGG on" : ""); | 2671 | (lq_sta->is_agg) ? "AGG on" : ""); |
2610 | } | 2672 | } |
2611 | desc += sprintf(buff+desc, "last tx rate=0x%X\n", | 2673 | desc += sprintf(buff+desc, "last tx rate=0x%X\n", |
2612 | lq_sta->last_rate_n_flags); | 2674 | lq_sta->last_rate_n_flags); |
2613 | desc += sprintf(buff+desc, | 2675 | desc += sprintf(buff+desc, |
2614 | "general: flags=0x%X mimo-d=%d s-ant0x%x d-ant=0x%x\n", | 2676 | "general: flags=0x%X mimo-d=%d s-ant=0x%x d-ant=0x%x\n", |
2615 | lq_sta->lq.flags, | 2677 | lq_sta->lq.flags, |
2616 | lq_sta->lq.mimo_delim, | 2678 | lq_sta->lq.mimo_delim, |
2617 | lq_sta->lq.single_stream_ant_msk, | 2679 | lq_sta->lq.single_stream_ant_msk, |
@@ -2631,19 +2693,12 @@ static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file, | |||
2631 | lq_sta->lq.initial_rate_index[3]); | 2693 | lq_sta->lq.initial_rate_index[3]); |
2632 | 2694 | ||
2633 | for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++) { | 2695 | for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++) { |
2634 | index = iwl_hwrate_to_plcp_idx( | 2696 | u32 rate = le32_to_cpu(lq_sta->lq.rs_table[i]); |
2635 | le32_to_cpu(lq_sta->lq.rs_table[i])); | 2697 | desc += sprintf(buff+desc, |
2636 | if (is_legacy(tbl->lq_type)) { | 2698 | " rate[%d] 0x%X ", |
2637 | desc += sprintf(buff+desc, " rate[%d] 0x%X %smbps\n", | 2699 | i, rate); |
2638 | i, le32_to_cpu(lq_sta->lq.rs_table[i]), | 2700 | |
2639 | iwl_rate_mcs[index].mbps); | 2701 | desc += rs_pretty_print_rate(buff+desc, rate); |
2640 | } else { | ||
2641 | desc += sprintf(buff+desc, | ||
2642 | " rate[%d] 0x%X %smbps (%s)\n", | ||
2643 | i, le32_to_cpu(lq_sta->lq.rs_table[i]), | ||
2644 | iwl_rate_mcs[index].mbps, | ||
2645 | iwl_rate_mcs[index].mcs); | ||
2646 | } | ||
2647 | } | 2702 | } |
2648 | 2703 | ||
2649 | ret = simple_read_from_buffer(user_buf, count, ppos, buff, desc); | 2704 | ret = simple_read_from_buffer(user_buf, count, ppos, buff, desc); |