wifi: rtw89: parse phycap of TX/RX antenna number
authorPing-Ke Shih <pkshih@realtek.com>
Thu, 8 Sep 2022 07:41:37 +0000 (15:41 +0800)
committerKalle Valo <kvalo@kernel.org>
Mon, 12 Sep 2022 11:51:44 +0000 (14:51 +0300)
Two fields, TX/RX ANT NUM, are introduced to address variant TX/RX antenna
number of hardware. For example, a 1x1 chip with TX diversity, TX NSS = 1
and TX/RX ANT NUM = 2.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220908074140.39776-3-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/mac.c
drivers/net/wireless/realtek/rtw89/mac80211.c

index b5fa61eb24f067574761fbbda8cfff52c37a87ef..3f944e631ee23c04eca0d269ec1d3b65695968f8 100644 (file)
@@ -2823,6 +2823,7 @@ struct rtw89_hal {
        u32 antenna_rx;
        u8 tx_nss;
        u8 rx_nss;
+       bool tx_path_diversity;
        bool support_cckpd;
        bool support_igi;
 
index a84557512448635db45b2209014f4999e03e7ac2..f7b30b767c3dc9a74e6ef81b21934f46e28c489d 100644 (file)
@@ -2264,6 +2264,8 @@ int rtw89_mac_setup_phycap(struct rtw89_dev *rtwdev)
        struct rtw89_mac_c2h_info c2h_info = {0};
        u8 tx_nss;
        u8 rx_nss;
+       u8 tx_ant;
+       u8 rx_ant;
        u32 ret;
 
        ret = rtw89_mac_read_phycap(rtwdev, &c2h_info);
@@ -2272,14 +2274,30 @@ int rtw89_mac_setup_phycap(struct rtw89_dev *rtwdev)
 
        tx_nss = RTW89_GET_C2H_PHYCAP_TX_NSS(c2h_info.c2hreg);
        rx_nss = RTW89_GET_C2H_PHYCAP_RX_NSS(c2h_info.c2hreg);
+       tx_ant = RTW89_GET_C2H_PHYCAP_ANT_TX_NUM(c2h_info.c2hreg);
+       rx_ant = RTW89_GET_C2H_PHYCAP_ANT_RX_NUM(c2h_info.c2hreg);
 
        hal->tx_nss = tx_nss ? min_t(u8, tx_nss, chip->tx_nss) : chip->tx_nss;
        hal->rx_nss = rx_nss ? min_t(u8, rx_nss, chip->rx_nss) : chip->rx_nss;
 
+       if (tx_ant == 1)
+               hal->antenna_tx = RF_B;
+       if (rx_ant == 1)
+               hal->antenna_rx = RF_B;
+
+       if (tx_nss == 1 && tx_ant == 2 && rx_ant == 2) {
+               hal->antenna_tx = RF_B;
+               hal->tx_path_diversity = true;
+       }
+
        rtw89_debug(rtwdev, RTW89_DBG_FW,
                    "phycap hal/phy/chip: tx_nss=0x%x/0x%x/0x%x rx_nss=0x%x/0x%x/0x%x\n",
                    hal->tx_nss, tx_nss, chip->tx_nss,
                    hal->rx_nss, rx_nss, chip->rx_nss);
+       rtw89_debug(rtwdev, RTW89_DBG_FW,
+                   "ant num/bitmap: tx=%d/0x%x rx=%d/0x%x\n",
+                   tx_ant, hal->antenna_tx, rx_ant, hal->antenna_rx);
+       rtw89_debug(rtwdev, RTW89_DBG_FW, "TX path diversity=%d\n", hal->tx_path_diversity);
 
        return 0;
 }
index 668370cf8158a4d8ae3b4fb6238795b0bb9950b9..a8c711ea5d456c63aadc5689e413810dd3323be7 100644 (file)
@@ -674,12 +674,13 @@ int rtw89_ops_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
        struct rtw89_dev *rtwdev = hw->priv;
        struct rtw89_hal *hal = &rtwdev->hal;
 
-       if (rx_ant != hw->wiphy->available_antennas_rx)
+       if (rx_ant != hw->wiphy->available_antennas_rx && rx_ant != hal->antenna_rx)
                return -EINVAL;
 
        mutex_lock(&rtwdev->mutex);
        hal->antenna_tx = tx_ant;
        hal->antenna_rx = rx_ant;
+       hal->tx_path_diversity = false;
        mutex_unlock(&rtwdev->mutex);
 
        return 0;