]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: mac80211: update the rx_chains after set_antenna()
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Wed, 20 Sep 2023 18:25:13 +0000 (21:25 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 25 Sep 2023 07:12:32 +0000 (09:12 +0200)
rx_chains was set only upon registration and it we rely on it for the
active chains upon SMPS configuration after association.

When we use the set_antenna() API to limit the rx_chains from 2 to 1,
this caused issues with iwlwifi since we still had 2 active_chains
requested.

Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230920211508.2dde4da246b2.I904223c868c77cf2ba132a3088fe6506fcbb443b@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/cfg.c

index e1a64a154287277f5b2ffe2ba478bc6292ad428c..5bc6b13294654d0de42311de1a6a0b75937e93f3 100644 (file)
@@ -4044,11 +4044,17 @@ ieee80211_update_mgmt_frame_registrations(struct wiphy *wiphy,
 static int ieee80211_set_antenna(struct wiphy *wiphy, u32 tx_ant, u32 rx_ant)
 {
        struct ieee80211_local *local = wiphy_priv(wiphy);
+       int ret;
 
        if (local->started)
                return -EOPNOTSUPP;
 
-       return drv_set_antenna(local, tx_ant, rx_ant);
+       ret = drv_set_antenna(local, tx_ant, rx_ant);
+       if (ret)
+               return ret;
+
+       local->rx_chains = hweight8(rx_ant);
+       return 0;
 }
 
 static int ieee80211_get_antenna(struct wiphy *wiphy, u32 *tx_ant, u32 *rx_ant)