wifi: rtl8xxxu: Add parameter role to report_connect
authorMartin Kaistra <martin.kaistra@linutronix.de>
Fri, 28 Apr 2023 15:08:23 +0000 (17:08 +0200)
committerKalle Valo <kvalo@kernel.org>
Fri, 5 May 2023 07:30:12 +0000 (10:30 +0300)
This allows to tell the HW if a connection is made to a STA or an AP.
Add the implementation for the gen2 version.

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-9-martin.kaistra@linutronix.de
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c

index 971f1cc..2dc9b20 100644 (file)
@@ -1280,6 +1280,9 @@ struct rtl8xxxu_rfregs {
 #define  H2C_JOIN_BSS_DISCONNECT       0
 #define  H2C_JOIN_BSS_CONNECT          1
 
+#define H2C_MACID_ROLE_STA             1
+#define H2C_MACID_ROLE_AP              2
+
 /*
  * H2C (firmware) commands differ between the older generation chips
  * 8188[cr]u, 819[12]cu, and 8723au, and the more recent chips 8723bu,
@@ -1906,7 +1909,7 @@ struct rtl8xxxu_fileops {
        void (*update_rate_mask) (struct rtl8xxxu_priv *priv,
                                  u32 ramask, u8 rateid, int sgi, int txbw_40mhz);
        void (*report_connect) (struct rtl8xxxu_priv *priv,
-                               u8 macid, bool connect);
+                               u8 macid, u8 role, bool connect);
        void (*report_rssi) (struct rtl8xxxu_priv *priv, u8 macid, u8 rssi);
        void (*fill_txdesc) (struct ieee80211_hw *hw, struct ieee80211_hdr *hdr,
                             struct ieee80211_tx_info *tx_info,
@@ -2027,9 +2030,9 @@ void rtl8xxxu_update_rate_mask(struct rtl8xxxu_priv *priv,
 void rtl8xxxu_gen2_update_rate_mask(struct rtl8xxxu_priv *priv,
                                    u32 ramask, u8 rateid, int sgi, int txbw_40mhz);
 void rtl8xxxu_gen1_report_connect(struct rtl8xxxu_priv *priv,
-                                 u8 macid, bool connect);
+                                 u8 macid, u8 role, bool connect);
 void rtl8xxxu_gen2_report_connect(struct rtl8xxxu_priv *priv,
-                                 u8 macid, bool connect);
+                                 u8 macid, u8 role, bool connect);
 void rtl8xxxu_gen1_report_rssi(struct rtl8xxxu_priv *priv, u8 macid, u8 rssi);
 void rtl8xxxu_gen2_report_rssi(struct rtl8xxxu_priv *priv, u8 macid, u8 rssi);
 void rtl8xxxu_gen1_init_aggregation(struct rtl8xxxu_priv *priv);
index 66e196f..0e951de 100644 (file)
@@ -4586,7 +4586,7 @@ void rtl8xxxu_gen2_update_rate_mask(struct rtl8xxxu_priv *priv,
 }
 
 void rtl8xxxu_gen1_report_connect(struct rtl8xxxu_priv *priv,
-                                 u8 macid, bool connect)
+                                 u8 macid, u8 role, bool connect)
 {
        struct h2c_cmd h2c;
 
@@ -4603,7 +4603,7 @@ void rtl8xxxu_gen1_report_connect(struct rtl8xxxu_priv *priv,
 }
 
 void rtl8xxxu_gen2_report_connect(struct rtl8xxxu_priv *priv,
-                                 u8 macid, bool connect)
+                                 u8 macid, u8 role, bool connect)
 {
        /*
         * The firmware turns on the rate control when it knows it's
@@ -4619,6 +4619,7 @@ void rtl8xxxu_gen2_report_connect(struct rtl8xxxu_priv *priv,
        else
                h2c.media_status_rpt.parm &= ~BIT(0);
 
+       h2c.media_status_rpt.parm |= ((role << 4) & 0xf0);
        h2c.media_status_rpt.macid = macid;
 
        rtl8xxxu_gen2_h2c_cmd(priv, &h2c, sizeof(h2c.media_status_rpt));
@@ -4947,13 +4948,13 @@ rtl8xxxu_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                        rtl8xxxu_write16(priv, REG_BCN_PSR_RPT,
                                         0xc000 | vif->cfg.aid);
 
-                       priv->fops->report_connect(priv, 0, true);
+                       priv->fops->report_connect(priv, 0, H2C_MACID_ROLE_AP, true);
                } else {
                        val8 = rtl8xxxu_read8(priv, REG_BEACON_CTRL);
                        val8 |= BEACON_DISABLE_TSF_UPDATE;
                        rtl8xxxu_write8(priv, REG_BEACON_CTRL, val8);
 
-                       priv->fops->report_connect(priv, 0, false);
+                       priv->fops->report_connect(priv, 0, H2C_MACID_ROLE_AP, false);
                }
        }
 
@@ -5014,7 +5015,7 @@ static int rtl8xxxu_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
        dev_dbg(dev, "Start AP mode\n");
        rtl8xxxu_set_bssid(priv, vif->bss_conf.bssid);
        rtl8xxxu_write16(priv, REG_BCN_INTERVAL, vif->bss_conf.beacon_int);
-       priv->fops->report_connect(priv, RTL8XXXU_BC_MC_MACID, true);
+       priv->fops->report_connect(priv, RTL8XXXU_BC_MC_MACID, 0, true);
 
        return 0;
 }