]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
wifi: rtl8xxxu: Split up rtl8xxxu_identify_chip
authorBitterblue Smith <rtl8821cerfe2@gmail.com>
Sat, 5 Nov 2022 22:54:22 +0000 (00:54 +0200)
committerKalle Valo <kvalo@kernel.org>
Wed, 16 Nov 2022 09:26:10 +0000 (11:26 +0200)
Move the reusable parts into separate functions and create one
identify_chip function for each chip type.

This is preparation for supporting the RTL8710BU chip, which would
need too many ugly changes to this function. Another reason to do this
is to get rid of the long and scary if..else if..else block in the
middle of the function.

Everything should still work the same as before.

Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/b268b5cf-071c-6292-0d90-0573e4fb2228@gmail.com
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188f.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192c.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192e.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723a.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723b.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c

index 9f8b23160ed08517a78da022634d8bf07e307964..136992f0200c79498ce3aba5c1024cf499e9c86c 100644 (file)
@@ -1470,6 +1470,7 @@ struct rtl8xxxu_tx_urb {
 };
 
 struct rtl8xxxu_fileops {
+       int (*identify_chip) (struct rtl8xxxu_priv *priv);
        int (*parse_efuse) (struct rtl8xxxu_priv *priv);
        int (*load_firmware) (struct rtl8xxxu_priv *priv);
        int (*power_on) (struct rtl8xxxu_priv *priv);
@@ -1562,6 +1563,10 @@ int rtl8xxxu_init_phy_regs(struct rtl8xxxu_priv *priv,
 int rtl8xxxu_load_firmware(struct rtl8xxxu_priv *priv, char *fw_name);
 void rtl8xxxu_firmware_self_reset(struct rtl8xxxu_priv *priv);
 void rtl8xxxu_power_off(struct rtl8xxxu_priv *priv);
+void rtl8xxxu_identify_vendor_1bit(struct rtl8xxxu_priv *priv, u32 vendor);
+void rtl8xxxu_identify_vendor_2bits(struct rtl8xxxu_priv *priv, u32 vendor);
+void rtl8xxxu_config_endpoints_sie(struct rtl8xxxu_priv *priv);
+int rtl8xxxu_config_endpoints_no_sie(struct rtl8xxxu_priv *priv);
 int rtl8xxxu_read_efuse8(struct rtl8xxxu_priv *priv, u16 offset, u8 *data);
 void rtl8xxxu_reset_8051(struct rtl8xxxu_priv *priv);
 int rtl8xxxu_auto_llt_table(struct rtl8xxxu_priv *priv);
index 5eadeb02a76207fd0b26234d84a33b785da2c663..4d044a8baa30fb6bb8bea4a1e03c6774c3616779 100644 (file)
@@ -321,6 +321,37 @@ static const struct rtl8xxxu_rfregval rtl8188fu_cut_b_radioa_init_table[] = {
        {0xff, 0xffffffff}
 };
 
+static int rtl8188fu_identify_chip(struct rtl8xxxu_priv *priv)
+{
+       struct device *dev = &priv->udev->dev;
+       u32 sys_cfg, vendor;
+       int ret = 0;
+
+       sprintf(priv->chip_name, "8188FU");
+       priv->rtl_chip = RTL8188F;
+       priv->rf_paths = 1;
+       priv->rx_paths = 1;
+       priv->tx_paths = 1;
+       priv->has_wifi = 1;
+
+       sys_cfg = rtl8xxxu_read32(priv, REG_SYS_CFG);
+       priv->chip_cut = (sys_cfg & SYS_CFG_CHIP_VERSION_MASK) >>
+               SYS_CFG_CHIP_VERSION_SHIFT;
+       if (sys_cfg & SYS_CFG_TRP_VAUX_EN) {
+               dev_info(dev, "Unsupported test chip\n");
+               ret = -ENOTSUPP;
+               goto out;
+       }
+
+       vendor = sys_cfg & SYS_CFG_VENDOR_EXT_MASK;
+       rtl8xxxu_identify_vendor_2bits(priv, vendor);
+
+       ret = rtl8xxxu_config_endpoints_no_sie(priv);
+
+out:
+       return ret;
+}
+
 static void rtl8xxxu_8188f_channel_to_group(int channel, int *group, int *cck_group)
 {
        if (channel < 3)
@@ -1690,6 +1721,7 @@ static s8 rtl8188f_cck_rssi(struct rtl8xxxu_priv *priv, u8 cck_agc_rpt)
 }
 
 struct rtl8xxxu_fileops rtl8188fu_fops = {
+       .identify_chip = rtl8188fu_identify_chip,
        .parse_efuse = rtl8188fu_parse_efuse,
        .load_firmware = rtl8188fu_load_firmware,
        .power_on = rtl8188fu_power_on,
index 9dfeeaa74927b399b2eaee63f73a3b8490280b59..8f4396da0c102eb3957877ee19e175479300c949 100644 (file)
@@ -326,6 +326,65 @@ static const struct rtl8xxxu_rfregval rtl8188ru_radioa_1t_highpa_table[] = {
        {0xff, 0xffffffff}
 };
 
+static int rtl8192cu_identify_chip(struct rtl8xxxu_priv *priv)
+{
+       struct device *dev = &priv->udev->dev;
+       u32 val32, bonding, sys_cfg, vendor;
+       int ret = 0;
+
+       sys_cfg = rtl8xxxu_read32(priv, REG_SYS_CFG);
+       priv->chip_cut = (sys_cfg & SYS_CFG_CHIP_VERSION_MASK) >>
+               SYS_CFG_CHIP_VERSION_SHIFT;
+       if (sys_cfg & SYS_CFG_TRP_VAUX_EN) {
+               dev_info(dev, "Unsupported test chip\n");
+               ret = -ENOTSUPP;
+               goto out;
+       }
+
+       if (sys_cfg & SYS_CFG_TYPE_ID) {
+               bonding = rtl8xxxu_read32(priv, REG_HPON_FSM);
+               bonding &= HPON_FSM_BONDING_MASK;
+               if (bonding == HPON_FSM_BONDING_1T2R) {
+                       sprintf(priv->chip_name, "8191CU");
+                       priv->tx_paths = 1;
+                       priv->usb_interrupts = 1;
+                       priv->rtl_chip = RTL8191C;
+               } else {
+                       sprintf(priv->chip_name, "8192CU");
+                       priv->tx_paths = 2;
+                       priv->usb_interrupts = 0;
+                       priv->rtl_chip = RTL8192C;
+               }
+               priv->rf_paths = 2;
+               priv->rx_paths = 2;
+       } else {
+               sprintf(priv->chip_name, "8188CU");
+               priv->rf_paths = 1;
+               priv->rx_paths = 1;
+               priv->tx_paths = 1;
+               priv->rtl_chip = RTL8188C;
+               priv->usb_interrupts = 0;
+       }
+       priv->has_wifi = 1;
+
+       vendor = sys_cfg & SYS_CFG_VENDOR_ID;
+       rtl8xxxu_identify_vendor_1bit(priv, vendor);
+
+       val32 = rtl8xxxu_read32(priv, REG_GPIO_OUTSTS);
+       priv->rom_rev = (val32 & GPIO_RF_RL_ID) >> 28;
+
+       rtl8xxxu_config_endpoints_sie(priv);
+
+       /*
+        * Fallback for devices that do not provide REG_NORMAL_SIE_EP_TX
+        */
+       if (!priv->ep_tx_count)
+               ret = rtl8xxxu_config_endpoints_no_sie(priv);
+
+out:
+       return ret;
+}
+
 static int rtl8192cu_load_firmware(struct rtl8xxxu_priv *priv)
 {
        char *fw_name;
@@ -541,6 +600,7 @@ static int rtl8192cu_power_on(struct rtl8xxxu_priv *priv)
 }
 
 struct rtl8xxxu_fileops rtl8192cu_fops = {
+       .identify_chip = rtl8192cu_identify_chip,
        .parse_efuse = rtl8192cu_parse_efuse,
        .load_firmware = rtl8192cu_load_firmware,
        .power_on = rtl8192cu_power_on,
index 973a02afc82bd40ca339aa98b46618d8d10669b6..400810191d7602268ffe90226f40bee929aa9f2c 100644 (file)
@@ -478,6 +478,54 @@ static const struct rtl8xxxu_rfregval rtl8192eu_radiob_init_table[] = {
        {0xff, 0xffffffff}
 };
 
+static int rtl8192eu_identify_chip(struct rtl8xxxu_priv *priv)
+{
+       struct device *dev = &priv->udev->dev;
+       u32 val32, bonding, sys_cfg, vendor;
+       int ret = 0;
+
+       sys_cfg = rtl8xxxu_read32(priv, REG_SYS_CFG);
+       priv->chip_cut = (sys_cfg & SYS_CFG_CHIP_VERSION_MASK) >>
+               SYS_CFG_CHIP_VERSION_SHIFT;
+       if (sys_cfg & SYS_CFG_TRP_VAUX_EN) {
+               dev_info(dev, "Unsupported test chip\n");
+               ret = -ENOTSUPP;
+               goto out;
+       }
+
+       bonding = rtl8xxxu_read32(priv, REG_HPON_FSM);
+       bonding &= HPON_FSM_BONDING_MASK;
+       if (bonding == HPON_FSM_BONDING_1T2R) {
+               sprintf(priv->chip_name, "8191EU");
+               priv->tx_paths = 1;
+               priv->rtl_chip = RTL8191E;
+       } else {
+               sprintf(priv->chip_name, "8192EU");
+               priv->tx_paths = 2;
+               priv->rtl_chip = RTL8192E;
+       }
+       priv->rf_paths = 2;
+       priv->rx_paths = 2;
+       priv->has_wifi = 1;
+
+       vendor = sys_cfg & SYS_CFG_VENDOR_EXT_MASK;
+       rtl8xxxu_identify_vendor_2bits(priv, vendor);
+
+       val32 = rtl8xxxu_read32(priv, REG_GPIO_OUTSTS);
+       priv->rom_rev = (val32 & GPIO_RF_RL_ID) >> 28;
+
+       rtl8xxxu_config_endpoints_sie(priv);
+
+       /*
+        * Fallback for devices that do not provide REG_NORMAL_SIE_EP_TX
+        */
+       if (!priv->ep_tx_count)
+               ret = rtl8xxxu_config_endpoints_no_sie(priv);
+
+out:
+       return ret;
+}
+
 static void
 rtl8192e_set_tx_power(struct rtl8xxxu_priv *priv, int channel, bool ht40)
 {
@@ -1693,6 +1741,7 @@ static s8 rtl8192e_cck_rssi(struct rtl8xxxu_priv *priv, u8 cck_agc_rpt)
 }
 
 struct rtl8xxxu_fileops rtl8192eu_fops = {
+       .identify_chip = rtl8192eu_identify_chip,
        .parse_efuse = rtl8192eu_parse_efuse,
        .load_firmware = rtl8192eu_load_firmware,
        .power_on = rtl8192eu_power_on,
index 8d8eb16a097037bfcdf626a3b518d05954af2b3f..33a1114a58535f93e455233aedbf222287f6b723 100644 (file)
@@ -129,6 +129,56 @@ static const struct rtl8xxxu_rfregval rtl8723au_radioa_1t_init_table[] = {
        {0xff, 0xffffffff}
 };
 
+static int rtl8723au_identify_chip(struct rtl8xxxu_priv *priv)
+{
+       struct device *dev = &priv->udev->dev;
+       u32 val32, sys_cfg, vendor;
+       int ret = 0;
+
+       sys_cfg = rtl8xxxu_read32(priv, REG_SYS_CFG);
+       priv->chip_cut = (sys_cfg & SYS_CFG_CHIP_VERSION_MASK) >>
+               SYS_CFG_CHIP_VERSION_SHIFT;
+       if (sys_cfg & SYS_CFG_TRP_VAUX_EN) {
+               dev_info(dev, "Unsupported test chip\n");
+               ret = -ENOTSUPP;
+               goto out;
+       }
+
+       sprintf(priv->chip_name, "8723AU");
+       priv->usb_interrupts = 1;
+       priv->rtl_chip = RTL8723A;
+
+       priv->rf_paths = 1;
+       priv->rx_paths = 1;
+       priv->tx_paths = 1;
+
+       val32 = rtl8xxxu_read32(priv, REG_MULTI_FUNC_CTRL);
+       if (val32 & MULTI_WIFI_FUNC_EN)
+               priv->has_wifi = 1;
+       if (val32 & MULTI_BT_FUNC_EN)
+               priv->has_bluetooth = 1;
+       if (val32 & MULTI_GPS_FUNC_EN)
+               priv->has_gps = 1;
+       priv->is_multi_func = 1;
+
+       vendor = sys_cfg & SYS_CFG_VENDOR_ID;
+       rtl8xxxu_identify_vendor_1bit(priv, vendor);
+
+       val32 = rtl8xxxu_read32(priv, REG_GPIO_OUTSTS);
+       priv->rom_rev = (val32 & GPIO_RF_RL_ID) >> 28;
+
+       rtl8xxxu_config_endpoints_sie(priv);
+
+       /*
+        * Fallback for devices that do not provide REG_NORMAL_SIE_EP_TX
+        */
+       if (!priv->ep_tx_count)
+               ret = rtl8xxxu_config_endpoints_no_sie(priv);
+
+out:
+       return ret;
+}
+
 static int rtl8723au_parse_efuse(struct rtl8xxxu_priv *priv)
 {
        struct rtl8723au_efuse *efuse = &priv->efuse_wifi.efuse8723;
@@ -409,6 +459,7 @@ s8 rtl8723a_cck_rssi(struct rtl8xxxu_priv *priv, u8 cck_agc_rpt)
 }
 
 struct rtl8xxxu_fileops rtl8723au_fops = {
+       .identify_chip = rtl8723au_identify_chip,
        .parse_efuse = rtl8723au_parse_efuse,
        .load_firmware = rtl8723au_load_firmware,
        .power_on = rtl8723au_power_on,
index 27df8805cb184aa2ab9225820b3725e2215334a9..558572bdd2c8f345763147f0a3cd849b1d9060de 100644 (file)
@@ -304,6 +304,54 @@ static const struct rtl8xxxu_rfregval rtl8723bu_radioa_1t_init_table[] = {
        {0xff, 0xffffffff}
 };
 
+static int rtl8723bu_identify_chip(struct rtl8xxxu_priv *priv)
+{
+       struct device *dev = &priv->udev->dev;
+       u32 val32, sys_cfg, vendor;
+       int ret = 0;
+
+       sys_cfg = rtl8xxxu_read32(priv, REG_SYS_CFG);
+       priv->chip_cut = (sys_cfg & SYS_CFG_CHIP_VERSION_MASK) >>
+               SYS_CFG_CHIP_VERSION_SHIFT;
+       if (sys_cfg & SYS_CFG_TRP_VAUX_EN) {
+               dev_info(dev, "Unsupported test chip\n");
+               ret = -ENOTSUPP;
+               goto out;
+       }
+
+       sprintf(priv->chip_name, "8723BU");
+       priv->rtl_chip = RTL8723B;
+       priv->rf_paths = 1;
+       priv->rx_paths = 1;
+       priv->tx_paths = 1;
+
+       val32 = rtl8xxxu_read32(priv, REG_MULTI_FUNC_CTRL);
+       if (val32 & MULTI_WIFI_FUNC_EN)
+               priv->has_wifi = 1;
+       if (val32 & MULTI_BT_FUNC_EN)
+               priv->has_bluetooth = 1;
+       if (val32 & MULTI_GPS_FUNC_EN)
+               priv->has_gps = 1;
+       priv->is_multi_func = 1;
+
+       vendor = sys_cfg & SYS_CFG_VENDOR_EXT_MASK;
+       rtl8xxxu_identify_vendor_2bits(priv, vendor);
+
+       val32 = rtl8xxxu_read32(priv, REG_GPIO_OUTSTS);
+       priv->rom_rev = (val32 & GPIO_RF_RL_ID) >> 28;
+
+       rtl8xxxu_config_endpoints_sie(priv);
+
+       /*
+        * Fallback for devices that do not provide REG_NORMAL_SIE_EP_TX
+        */
+       if (!priv->ep_tx_count)
+               ret = rtl8xxxu_config_endpoints_no_sie(priv);
+
+out:
+       return ret;
+}
+
 static void rtl8723bu_write_btreg(struct rtl8xxxu_priv *priv, u8 reg, u8 data)
 {
        struct h2c_cmd h2c;
@@ -1668,6 +1716,7 @@ static s8 rtl8723b_cck_rssi(struct rtl8xxxu_priv *priv, u8 cck_agc_rpt)
 }
 
 struct rtl8xxxu_fileops rtl8723bu_fops = {
+       .identify_chip = rtl8723bu_identify_chip,
        .parse_efuse = rtl8723bu_parse_efuse,
        .load_firmware = rtl8723bu_load_firmware,
        .power_on = rtl8723bu_power_on,
index 282ad8a9b73d8dc6b1ccf1c4cc25c469b0739978..839e0546f5ec20a779316cb6fd7d24af80c75950 100644 (file)
@@ -1589,148 +1589,40 @@ static void rtl8xxxu_print_chipinfo(struct rtl8xxxu_priv *priv)
        dev_info(dev, "RTL%s MAC: %pM\n", priv->chip_name, priv->mac_addr);
 }
 
-static int rtl8xxxu_identify_chip(struct rtl8xxxu_priv *priv)
+void rtl8xxxu_identify_vendor_1bit(struct rtl8xxxu_priv *priv, u32 vendor)
 {
-       const struct usb_device_descriptor *descriptor = &priv->udev->descriptor;
-       struct device *dev = &priv->udev->dev;
-       struct ieee80211_hw *hw = priv->hw;
-       u32 val32, bonding, sys_cfg;
-       u16 val16;
-
-       sys_cfg = rtl8xxxu_read32(priv, REG_SYS_CFG);
-       priv->chip_cut = (sys_cfg & SYS_CFG_CHIP_VERSION_MASK) >>
-               SYS_CFG_CHIP_VERSION_SHIFT;
-       if (sys_cfg & SYS_CFG_TRP_VAUX_EN) {
-               dev_info(dev, "Unsupported test chip\n");
-               return -ENOTSUPP;
-       }
-
-       if (descriptor->idVendor == USB_VENDOR_ID_REALTEK &&
-           descriptor->idProduct == 0xf179) {
-               sprintf(priv->chip_name, "8188FU");
-               priv->rtl_chip = RTL8188F;
-               priv->rf_paths = 1;
-               priv->rx_paths = 1;
-               priv->tx_paths = 1;
-               priv->has_wifi = 1;
-               goto skip_complicated_chip_detection;
-       }
-
-       if (sys_cfg & SYS_CFG_BT_FUNC) {
-               if (priv->chip_cut >= 3) {
-                       sprintf(priv->chip_name, "8723BU");
-                       priv->rtl_chip = RTL8723B;
-               } else {
-                       sprintf(priv->chip_name, "8723AU");
-                       priv->usb_interrupts = 1;
-                       priv->rtl_chip = RTL8723A;
-               }
-
-               priv->rf_paths = 1;
-               priv->rx_paths = 1;
-               priv->tx_paths = 1;
-
-               val32 = rtl8xxxu_read32(priv, REG_MULTI_FUNC_CTRL);
-               if (val32 & MULTI_WIFI_FUNC_EN)
-                       priv->has_wifi = 1;
-               if (val32 & MULTI_BT_FUNC_EN)
-                       priv->has_bluetooth = 1;
-               if (val32 & MULTI_GPS_FUNC_EN)
-                       priv->has_gps = 1;
-               priv->is_multi_func = 1;
-       } else if (sys_cfg & SYS_CFG_TYPE_ID) {
-               bonding = rtl8xxxu_read32(priv, REG_HPON_FSM);
-               bonding &= HPON_FSM_BONDING_MASK;
-               if (priv->fops->tx_desc_size ==
-                   sizeof(struct rtl8xxxu_txdesc40)) {
-                       if (bonding == HPON_FSM_BONDING_1T2R) {
-                               sprintf(priv->chip_name, "8191EU");
-                               priv->rf_paths = 2;
-                               priv->rx_paths = 2;
-                               priv->tx_paths = 1;
-                               priv->rtl_chip = RTL8191E;
-                       } else {
-                               sprintf(priv->chip_name, "8192EU");
-                               priv->rf_paths = 2;
-                               priv->rx_paths = 2;
-                               priv->tx_paths = 2;
-                               priv->rtl_chip = RTL8192E;
-                       }
-               } else if (bonding == HPON_FSM_BONDING_1T2R) {
-                       sprintf(priv->chip_name, "8191CU");
-                       priv->rf_paths = 2;
-                       priv->rx_paths = 2;
-                       priv->tx_paths = 1;
-                       priv->usb_interrupts = 1;
-                       priv->rtl_chip = RTL8191C;
-               } else {
-                       sprintf(priv->chip_name, "8192CU");
-                       priv->rf_paths = 2;
-                       priv->rx_paths = 2;
-                       priv->tx_paths = 2;
-                       priv->usb_interrupts = 0;
-                       priv->rtl_chip = RTL8192C;
-               }
-               priv->has_wifi = 1;
+       if (vendor) {
+               sprintf(priv->chip_vendor, "UMC");
+               priv->vendor_umc = 1;
        } else {
-               sprintf(priv->chip_name, "8188CU");
-               priv->rf_paths = 1;
-               priv->rx_paths = 1;
-               priv->tx_paths = 1;
-               priv->rtl_chip = RTL8188C;
-               priv->usb_interrupts = 0;
-               priv->has_wifi = 1;
+               sprintf(priv->chip_vendor, "TSMC");
        }
+}
 
-skip_complicated_chip_detection:
-
-       hw->wiphy->available_antennas_tx = BIT(priv->tx_paths) - 1;
-       hw->wiphy->available_antennas_rx = BIT(priv->rx_paths) - 1;
-
-       switch (priv->rtl_chip) {
-       case RTL8188E:
-       case RTL8188F:
-       case RTL8192E:
-       case RTL8723B:
-               switch (sys_cfg & SYS_CFG_VENDOR_EXT_MASK) {
-               case SYS_CFG_VENDOR_ID_TSMC:
-                       sprintf(priv->chip_vendor, "TSMC");
-                       break;
-               case SYS_CFG_VENDOR_ID_SMIC:
-                       sprintf(priv->chip_vendor, "SMIC");
-                       priv->vendor_smic = 1;
-                       break;
-               case SYS_CFG_VENDOR_ID_UMC:
-                       sprintf(priv->chip_vendor, "UMC");
-                       priv->vendor_umc = 1;
-                       break;
-               default:
-                       sprintf(priv->chip_vendor, "unknown");
-               }
+void rtl8xxxu_identify_vendor_2bits(struct rtl8xxxu_priv *priv, u32 vendor)
+{
+       switch (vendor) {
+       case SYS_CFG_VENDOR_ID_TSMC:
+               sprintf(priv->chip_vendor, "TSMC");
+               break;
+       case SYS_CFG_VENDOR_ID_SMIC:
+               sprintf(priv->chip_vendor, "SMIC");
+               priv->vendor_smic = 1;
+               break;
+       case SYS_CFG_VENDOR_ID_UMC:
+               sprintf(priv->chip_vendor, "UMC");
+               priv->vendor_umc = 1;
                break;
        default:
-               if (sys_cfg & SYS_CFG_VENDOR_ID) {
-                       sprintf(priv->chip_vendor, "UMC");
-                       priv->vendor_umc = 1;
-               } else {
-                       sprintf(priv->chip_vendor, "TSMC");
-               }
+               sprintf(priv->chip_vendor, "unknown");
        }
+}
 
-       val32 = rtl8xxxu_read32(priv, REG_GPIO_OUTSTS);
-       priv->rom_rev = (val32 & GPIO_RF_RL_ID) >> 28;
+void rtl8xxxu_config_endpoints_sie(struct rtl8xxxu_priv *priv)
+{
+       u16 val16;
 
-       /*
-        * 8188FU vendor driver doesn't use REG_NORMAL_SIE_EP_TX,
-        * it just decides the queue mapping based on nr_out_eps.
-        * However, reading the register returns "0x321" which
-        * results in a wrong ep_tx_count of 3 and most frames
-        * not being transmitted.
-        */
-       if (priv->rtl_chip == RTL8188F)
-               val16 = 0;
-       else
-               val16 = rtl8xxxu_read16(priv, REG_NORMAL_SIE_EP_TX);
+       val16 = rtl8xxxu_read16(priv, REG_NORMAL_SIE_EP_TX);
 
        if (val16 & NORMAL_SIE_EP_TX_HIGH_MASK) {
                priv->ep_tx_high_queue = 1;
@@ -1746,29 +1638,29 @@ skip_complicated_chip_detection:
                priv->ep_tx_low_queue = 1;
                priv->ep_tx_count++;
        }
+}
 
-       /*
-        * Fallback for devices that do not provide REG_NORMAL_SIE_EP_TX
-        */
-       if (!priv->ep_tx_count) {
-               switch (priv->nr_out_eps) {
-               case 4:
-               case 3:
-                       priv->ep_tx_low_queue = 1;
-                       priv->ep_tx_count++;
-                       fallthrough;
-               case 2:
-                       priv->ep_tx_normal_queue = 1;
-                       priv->ep_tx_count++;
-                       fallthrough;
-               case 1:
-                       priv->ep_tx_high_queue = 1;
-                       priv->ep_tx_count++;
-                       break;
-               default:
-                       dev_info(dev, "Unsupported USB TX end-points\n");
-                       return -ENOTSUPP;
-               }
+int rtl8xxxu_config_endpoints_no_sie(struct rtl8xxxu_priv *priv)
+{
+       struct device *dev = &priv->udev->dev;
+
+       switch (priv->nr_out_eps) {
+       case 4:
+       case 3:
+               priv->ep_tx_low_queue = 1;
+               priv->ep_tx_count++;
+               fallthrough;
+       case 2:
+               priv->ep_tx_normal_queue = 1;
+               priv->ep_tx_count++;
+               fallthrough;
+       case 1:
+               priv->ep_tx_high_queue = 1;
+               priv->ep_tx_count++;
+               break;
+       default:
+               dev_info(dev, "Unsupported USB TX end-points\n");
+               return -ENOTSUPP;
        }
 
        return 0;
@@ -6937,12 +6829,15 @@ static int rtl8xxxu_probe(struct usb_interface *interface,
        if (ret)
                goto err_set_intfdata;
 
-       ret = rtl8xxxu_identify_chip(priv);
+       ret = priv->fops->identify_chip(priv);
        if (ret) {
                dev_err(&udev->dev, "Fatal - failed to identify chip\n");
                goto err_set_intfdata;
        }
 
+       hw->wiphy->available_antennas_tx = BIT(priv->tx_paths) - 1;
+       hw->wiphy->available_antennas_rx = BIT(priv->rx_paths) - 1;
+
        ret = rtl8xxxu_read_efuse(priv);
        if (ret) {
                dev_err(&udev->dev, "Fatal - failed to read EFuse\n");