--- /dev/null
+#include "mp_precomp.h"\r
+#include "phydm_precomp.h"\r
+\r
+#if (defined(CONFIG_BB_TXBF_API))\r
+#if (RTL8822B_SUPPORT == 1)\r
+/*Add by YuChen for 8822B MU-MIMO API*/\r
+\r
+/*this function is only used for BFer*/\r
+u1Byte\r
+phydm_get_ndpa_rate(\r
+ IN PVOID pDM_VOID\r
+ )\r
+{\r
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+ u1Byte NDPARate = ODM_RATE6M;\r
+\r
+ if (pDM_Odm->RSSI_Min >= 30) /*link RSSI > 30%*/\r
+ NDPARate = ODM_RATE24M;\r
+ else if (pDM_Odm->RSSI_Min <= 25)\r
+ NDPARate = ODM_RATE6M;\r
+\r
+ ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_TRACE, ("[%s] NDPARate = 0x%x\n", __func__, NDPARate));\r
+\r
+ return NDPARate;\r
+\r
+}\r
+\r
+/*this function is only used for BFer*/\r
+u1Byte\r
+phydm_get_beamforming_sounding_info(\r
+ IN PVOID pDM_VOID,\r
+ IN pu2Byte Troughput,\r
+ IN u1Byte Total_BFee_Num,\r
+ IN pu1Byte TxRate\r
+ )\r
+{\r
+ u1Byte idx = 0;\r
+ u1Byte soundingdecision = 0xff;\r
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+\r
+ for (idx = 0; idx < Total_BFee_Num; idx++) {\r
+ if (((TxRate[idx] >= ODM_RATEVHTSS3MCS7) && (TxRate[idx] <= ODM_RATEVHTSS3MCS9)))\r
+ soundingdecision = soundingdecision & ~(1<<idx);\r
+ }\r
+\r
+ for (idx = 0; idx < Total_BFee_Num; idx++) {\r
+ if (Troughput[idx] <= 10)\r
+ soundingdecision = soundingdecision & ~(1<<idx);\r
+ }\r
+\r
+ ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_TRACE, ("[%s] soundingdecision = 0x%x\n", __func__, soundingdecision));\r
+\r
+ return soundingdecision;\r
+\r
+}\r
+\r
+/*this function is only used for BFer*/\r
+u1Byte\r
+phydm_get_mu_bfee_snding_decision(\r
+ IN PVOID pDM_VOID,\r
+ IN u2Byte Throughput\r
+ )\r
+{\r
+ u1Byte snding_score = 0;\r
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+\r
+ /*Throughput unit is Mbps*/\r
+ if (Throughput >= 500)\r
+ snding_score = 100;\r
+ else if (Throughput >= 450)\r
+ snding_score = 90;\r
+ else if (Throughput >= 400)\r
+ snding_score = 80;\r
+ else if (Throughput >= 350)\r
+ snding_score = 70;\r
+ else if (Throughput >= 300)\r
+ snding_score = 60;\r
+ else if (Throughput >= 250)\r
+ snding_score = 50;\r
+ else if (Throughput >= 200)\r
+ snding_score = 40;\r
+ else if (Throughput >= 150)\r
+ snding_score = 30;\r
+ else if (Throughput >= 100)\r
+ snding_score = 20;\r
+ else if (Throughput >= 50)\r
+ snding_score = 10;\r
+ else\r
+ snding_score = 0;\r
+ \r
+ ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_TRACE, ("[%s] snding_score = 0x%d\n", __func__, snding_score));\r
+\r
+ return snding_score;\r
+\r
+}\r
+\r
+\r
+#endif\r
+#if (DM_ODM_SUPPORT_TYPE != ODM_AP)\r
+u1Byte\r
+Beamforming_GetHTNDPTxRate(\r
+ IN PVOID pDM_VOID,\r
+ u1Byte CompSteeringNumofBFer\r
+)\r
+{\r
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+ u1Byte Nr_index = 0;\r
+ u1Byte NDPTxRate;\r
+ /*Find Nr*/\r
+#if (RTL8814A_SUPPORT == 1) \r
+ if (pDM_Odm->SupportICType & ODM_RTL8814A)\r
+ Nr_index = TxBF_Nr(halTxbf8814A_GetNtx(pDM_Odm), CompSteeringNumofBFer);\r
+ else\r
+#endif\r
+ Nr_index = TxBF_Nr(1, CompSteeringNumofBFer);\r
+ \r
+ switch (Nr_index) {\r
+ case 1:\r
+ NDPTxRate = ODM_MGN_MCS8;\r
+ break;\r
+\r
+ case 2:\r
+ NDPTxRate = ODM_MGN_MCS16;\r
+ break;\r
+\r
+ case 3:\r
+ NDPTxRate = ODM_MGN_MCS24;\r
+ break;\r
+ \r
+ default:\r
+ NDPTxRate = ODM_MGN_MCS8;\r
+ break;\r
+ }\r
+\r
+return NDPTxRate;\r
+\r
+}\r
+\r
+u1Byte\r
+Beamforming_GetVHTNDPTxRate(\r
+ IN PVOID pDM_VOID,\r
+ u1Byte CompSteeringNumofBFer\r
+)\r
+{\r
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+ u1Byte Nr_index = 0;\r
+ u1Byte NDPTxRate;\r
+ /*Find Nr*/\r
+#if (RTL8814A_SUPPORT == 1)\r
+ if (pDM_Odm->SupportICType & ODM_RTL8814A)\r
+ Nr_index = TxBF_Nr(halTxbf8814A_GetNtx(pDM_Odm), CompSteeringNumofBFer);\r
+ else\r
+#endif\r
+ Nr_index = TxBF_Nr(1, CompSteeringNumofBFer);\r
+ \r
+ switch (Nr_index) {\r
+ case 1:\r
+ NDPTxRate = ODM_MGN_VHT2SS_MCS0;\r
+ break;\r
+\r
+ case 2:\r
+ NDPTxRate = ODM_MGN_VHT3SS_MCS0;\r
+ break;\r
+\r
+ case 3:\r
+ NDPTxRate = ODM_MGN_VHT4SS_MCS0;\r
+ break;\r
+ \r
+ default:\r
+ NDPTxRate = ODM_MGN_VHT2SS_MCS0;\r
+ break;\r
+ }\r
+\r
+return NDPTxRate;\r
+\r
+}\r
+#endif\r
+\r
+#endif\r
+\r