wifi: rtl8xxxu: Allow creating interface in AP mode
authorMartin Kaistra <martin.kaistra@linutronix.de>
Fri, 28 Apr 2023 15:08:21 +0000 (17:08 +0200)
committerKalle Valo <kvalo@kernel.org>
Fri, 5 May 2023 07:30:12 +0000 (10:30 +0300)
Use the sequence from the vendor driver for setting up the beacon
related registers.
Also set the MAC address register here, in case the MAC address for the
new interface should be different from what was set in
rtl8xxxu_init_device(). This happens for example with the hostapd config
option "bssid".

Signed-off-by: Martin Kaistra <martin.kaistra@linutronix.de>
Reviewed-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20230428150833.218605-7-martin.kaistra@linutronix.de
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h

index 9d08a1c..ab4a1f8 100644 (file)
@@ -6471,12 +6471,13 @@ static int rtl8xxxu_add_interface(struct ieee80211_hw *hw,
        int ret;
        u8 val8;
 
+       if (!priv->vif)
+               priv->vif = vif;
+       else
+               return -EOPNOTSUPP;
+
        switch (vif->type) {
        case NL80211_IFTYPE_STATION:
-               if (!priv->vif)
-                       priv->vif = vif;
-               else
-                       return -EOPNOTSUPP;
                rtl8xxxu_stop_tx_beacon(priv);
 
                val8 = rtl8xxxu_read8(priv, REG_BEACON_CTRL);
@@ -6485,11 +6486,33 @@ static int rtl8xxxu_add_interface(struct ieee80211_hw *hw,
                rtl8xxxu_write8(priv, REG_BEACON_CTRL, val8);
                ret = 0;
                break;
+       case NL80211_IFTYPE_AP:
+               rtl8xxxu_write8(priv, REG_BEACON_CTRL,
+                               BEACON_DISABLE_TSF_UPDATE | BEACON_CTRL_MBSSID);
+               rtl8xxxu_write8(priv, REG_ATIMWND, 0x0c); /* 12ms */
+               rtl8xxxu_write16(priv, REG_TSFTR_SYN_OFFSET, 0x7fff); /* ~32ms */
+               rtl8xxxu_write8(priv, REG_DUAL_TSF_RST, DUAL_TSF_RESET_TSF0);
+
+               /* enable BCN0 function */
+               rtl8xxxu_write8(priv, REG_BEACON_CTRL,
+                               BEACON_DISABLE_TSF_UPDATE |
+                               BEACON_FUNCTION_ENABLE | BEACON_CTRL_MBSSID |
+                               BEACON_CTRL_TX_BEACON_RPT);
+
+               /* select BCN on port 0 */
+               val8 = rtl8xxxu_read8(priv, REG_CCK_CHECK);
+               val8 &= ~BIT_BCN_PORT_SEL;
+               rtl8xxxu_write8(priv, REG_CCK_CHECK, val8);
+
+               ret = 0;
+               break;
        default:
                ret = -EOPNOTSUPP;
        }
 
        rtl8xxxu_set_linktype(priv, vif->type);
+       ether_addr_copy(priv->mac_addr, vif->addr);
+       rtl8xxxu_set_mac(priv);
 
        return ret;
 }
index ad285e4..8571d51 100644 (file)
 #define REG_ARFR1                      0x0448
 #define REG_ARFR2                      0x044c
 #define REG_ARFR3                      0x0450
+#define REG_CCK_CHECK                  0x0454
+#define BIT_BCN_PORT_SEL               BIT(5)
 #define REG_AMPDU_MAX_TIME_8723B       0x0456
 #define REG_AGGLEN_LMT                 0x0458
 #define REG_AMPDU_MIN_SPACE            0x045c