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);
 
        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;
 }
 
        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;