| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- /******************************************************************************
- *
- * Copyright(c) 2007 - 2017 Realtek Corporation.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- *****************************************************************************/
- #include "mp_precomp.h"
- #include "phydm_precomp.h"
- #if (defined(CONFIG_BB_TXBF_API))
- #if (RTL8822B_SUPPORT == 1 || RTL8192F_SUPPORT == 1 ||\
- RTL8822C_SUPPORT == 1 || RTL8198F_SUPPORT == 1 || RTL8814B_SUPPORT == 1)
- /*@Add by YuChen for 8822B MU-MIMO API*/
- /*this function is only used for BFer*/
- u8 phydm_get_ndpa_rate(void *dm_void)
- {
- struct dm_struct *dm = (struct dm_struct *)dm_void;
- u8 ndpa_rate = ODM_RATE6M;
- if (dm->rssi_min >= 30) /*@link RSSI > 30%*/
- ndpa_rate = ODM_RATE24M;
- else if (dm->rssi_min <= 25)
- ndpa_rate = ODM_RATE6M;
- PHYDM_DBG(dm, DBG_TXBF, "[%s] ndpa_rate = 0x%x\n", __func__, ndpa_rate);
- return ndpa_rate;
- }
- /*this function is only used for BFer*/
- u8 phydm_get_beamforming_sounding_info(void *dm_void, u16 *throughput,
- u8 total_bfee_num, u8 *tx_rate)
- {
- u8 idx = 0;
- u8 snddecision = 0xff;
- struct dm_struct *dm = (struct dm_struct *)dm_void;
- for (idx = 0; idx < total_bfee_num; idx++) {
- if (dm->support_ic_type & (ODM_RTL8814A)) {
- if ((tx_rate[idx] >= ODM_RATEVHTSS3MCS7 &&
- tx_rate[idx] <= ODM_RATEVHTSS3MCS9))
- snddecision = snddecision & ~(1 << idx);
- } else if (dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8822C |
- ODM_RTL8812 | ODM_RTL8192F)) {
- if ((tx_rate[idx] >= ODM_RATEVHTSS2MCS7 &&
- tx_rate[idx] <= ODM_RATEVHTSS2MCS9))
- snddecision = snddecision & ~(1 << idx);
- } else if (dm->support_ic_type & (ODM_RTL8814B)) {
- if ((tx_rate[idx] >= ODM_RATEVHTSS4MCS7 &&
- tx_rate[idx] <= ODM_RATEVHTSS4MCS9))
- snddecision = snddecision & ~(1 << idx);
- }
- }
- for (idx = 0; idx < total_bfee_num; idx++) {
- if (throughput[idx] <= 10)
- snddecision = snddecision & ~(1 << idx);
- }
- PHYDM_DBG(dm, DBG_TXBF, "[%s] soundingdecision = 0x%x\n", __func__,
- snddecision);
- return snddecision;
- }
- /*this function is only used for BFer*/
- u8 phydm_get_mu_bfee_snding_decision(void *dm_void, u16 throughput)
- {
- u8 snding_score = 0;
- struct dm_struct *dm = (struct dm_struct *)dm_void;
- /*throughput unit is Mbps*/
- if (throughput >= 500)
- snding_score = 100;
- else if (throughput >= 450)
- snding_score = 90;
- else if (throughput >= 400)
- snding_score = 80;
- else if (throughput >= 350)
- snding_score = 70;
- else if (throughput >= 300)
- snding_score = 60;
- else if (throughput >= 250)
- snding_score = 50;
- else if (throughput >= 200)
- snding_score = 40;
- else if (throughput >= 150)
- snding_score = 30;
- else if (throughput >= 100)
- snding_score = 20;
- else if (throughput >= 50)
- snding_score = 10;
- else
- snding_score = 0;
- PHYDM_DBG(dm, DBG_TXBF, "[%s] snding_score = 0x%x\n", __func__,
- snding_score);
- return snding_score;
- }
- #endif
- #if (DM_ODM_SUPPORT_TYPE != ODM_AP)
- u8 beamforming_get_htndp_tx_rate(void *dm_void, u8 bfer_str_num)
- {
- struct dm_struct *dm = (struct dm_struct *)dm_void;
- u8 nr_index = 0;
- u8 ndp_tx_rate;
- /*@Find nr*/
- #if (RTL8814A_SUPPORT == 1)
- if (dm->support_ic_type & ODM_RTL8814A)
- nr_index = tx_bf_nr(hal_txbf_8814a_get_ntx(dm), bfer_str_num);
- else
- #endif
- nr_index = tx_bf_nr(1, bfer_str_num);
- switch (nr_index) {
- case 1:
- ndp_tx_rate = ODM_MGN_MCS8;
- break;
- case 2:
- ndp_tx_rate = ODM_MGN_MCS16;
- break;
- case 3:
- ndp_tx_rate = ODM_MGN_MCS24;
- break;
- default:
- ndp_tx_rate = ODM_MGN_MCS8;
- break;
- }
- return ndp_tx_rate;
- }
- u8 beamforming_get_vht_ndp_tx_rate(void *dm_void, u8 bfer_str_num)
- {
- struct dm_struct *dm = (struct dm_struct *)dm_void;
- u8 nr_index = 0;
- u8 ndp_tx_rate;
- /*@Find nr*/
- #if (RTL8814A_SUPPORT == 1)
- if (dm->support_ic_type & ODM_RTL8814A)
- nr_index = tx_bf_nr(hal_txbf_8814a_get_ntx(dm), bfer_str_num);
- else
- #endif
- nr_index = tx_bf_nr(1, bfer_str_num);
- switch (nr_index) {
- case 1:
- ndp_tx_rate = ODM_MGN_VHT2SS_MCS0;
- break;
- case 2:
- ndp_tx_rate = ODM_MGN_VHT3SS_MCS0;
- break;
- case 3:
- ndp_tx_rate = ODM_MGN_VHT4SS_MCS0;
- break;
- default:
- ndp_tx_rate = ODM_MGN_VHT2SS_MCS0;
- break;
- }
- return ndp_tx_rate;
- }
- #endif
- #endif
|