]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: ath12k: relocate a few functions in mac.c
authorAditya Kumar Singh <aditya.kumar.singh@oss.qualcomm.com>
Tue, 4 Feb 2025 17:05:12 +0000 (22:35 +0530)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Tue, 11 Feb 2025 15:27:10 +0000 (07:27 -0800)
An upcoming change will invoke ath12k_mac_init_arvif(),
ath12k_mac_assign_link_vif(), ath12k_mac_unassign_link_vif(), and
ath12k_mac_remove_link_interface() from a line located above their current
definition. Hence, relocate these functions to above so that these can be
invoked later on.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00130-QCAHKSWPL_SILICONZ-1.97421.5 # Nicolas Escande

Signed-off-by: Aditya Kumar Singh <aditya.kumar.singh@oss.qualcomm.com>
Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
Tested-by: Nicolas Escande <nico.escande@gmail.com>
Link: https://patch.msgid.link/20250204-unlink_link_arvif_from_chanctx-v2-6-764fb5973c1a@oss.qualcomm.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/mac.c

index 97d7f95a3796de9157c434002061d026a439f1ee..493d3d43b121dc6b60299f1340fb74a9776cae54 100644 (file)
@@ -3470,6 +3470,131 @@ static void ath12k_recalculate_mgmt_rate(struct ath12k *ar,
                ath12k_warn(ar->ab, "failed to set beacon tx rate %d\n", ret);
 }
 
+static void ath12k_mac_init_arvif(struct ath12k_vif *ahvif,
+                                 struct ath12k_link_vif *arvif, int link_id)
+{
+       struct ath12k_hw *ah = ahvif->ah;
+       u8 _link_id;
+       int i;
+
+       lockdep_assert_wiphy(ah->hw->wiphy);
+
+       if (WARN_ON(!arvif))
+               return;
+
+       if (WARN_ON(link_id >= ATH12K_NUM_MAX_LINKS))
+               return;
+
+       if (link_id < 0)
+               _link_id = 0;
+       else
+               _link_id = link_id;
+
+       arvif->ahvif = ahvif;
+       arvif->link_id = _link_id;
+
+       INIT_LIST_HEAD(&arvif->list);
+       INIT_DELAYED_WORK(&arvif->connection_loss_work,
+                         ath12k_mac_vif_sta_connection_loss_work);
+
+       for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
+               arvif->bitrate_mask.control[i].legacy = 0xffffffff;
+               memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
+                      sizeof(arvif->bitrate_mask.control[i].ht_mcs));
+               memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
+                      sizeof(arvif->bitrate_mask.control[i].vht_mcs));
+       }
+
+       /* Handle MLO related assignments */
+       if (link_id >= 0) {
+               rcu_assign_pointer(ahvif->link[arvif->link_id], arvif);
+               ahvif->links_map |= BIT(_link_id);
+       }
+
+       ath12k_generic_dbg(ATH12K_DBG_MAC,
+                          "mac init link arvif (link_id %d%s) for vif %pM. links_map 0x%x",
+                          _link_id, (link_id < 0) ? " deflink" : "", ahvif->vif->addr,
+                          ahvif->links_map);
+}
+
+static void ath12k_mac_remove_link_interface(struct ieee80211_hw *hw,
+                                            struct ath12k_link_vif *arvif)
+{
+       struct ath12k_vif *ahvif = arvif->ahvif;
+       struct ath12k_hw *ah = hw->priv;
+       struct ath12k *ar = arvif->ar;
+       int ret;
+
+       lockdep_assert_wiphy(ah->hw->wiphy);
+
+       cancel_delayed_work_sync(&arvif->connection_loss_work);
+
+       ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac remove link interface (vdev %d link id %d)",
+                  arvif->vdev_id, arvif->link_id);
+
+       if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
+               ret = ath12k_peer_delete(ar, arvif->vdev_id, arvif->bssid);
+               if (ret)
+                       ath12k_warn(ar->ab, "failed to submit AP self-peer removal on vdev %d link id %d: %d",
+                                   arvif->vdev_id, arvif->link_id, ret);
+       }
+       ath12k_mac_vdev_delete(ar, arvif);
+}
+
+static struct ath12k_link_vif *ath12k_mac_assign_link_vif(struct ath12k_hw *ah,
+                                                         struct ieee80211_vif *vif,
+                                                         u8 link_id)
+{
+       struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
+       struct ath12k_link_vif *arvif;
+
+       lockdep_assert_wiphy(ah->hw->wiphy);
+
+       arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
+       if (arvif)
+               return arvif;
+
+       if (!vif->valid_links) {
+               /* Use deflink for Non-ML VIFs and mark the link id as 0
+                */
+               link_id = 0;
+               arvif = &ahvif->deflink;
+       } else {
+               /* If this is the first link arvif being created for an ML VIF
+                * use the preallocated deflink memory except for scan arvifs
+                */
+               if (!ahvif->links_map && link_id != ATH12K_DEFAULT_SCAN_LINK) {
+                       arvif = &ahvif->deflink;
+               } else {
+                       arvif = (struct ath12k_link_vif *)
+                       kzalloc(sizeof(struct ath12k_link_vif), GFP_KERNEL);
+                       if (!arvif)
+                               return NULL;
+               }
+       }
+
+       ath12k_mac_init_arvif(ahvif, arvif, link_id);
+
+       return arvif;
+}
+
+static void ath12k_mac_unassign_link_vif(struct ath12k_link_vif *arvif)
+{
+       struct ath12k_vif *ahvif = arvif->ahvif;
+       struct ath12k_hw *ah = ahvif->ah;
+
+       lockdep_assert_wiphy(ah->hw->wiphy);
+
+       rcu_assign_pointer(ahvif->link[arvif->link_id], NULL);
+       synchronize_rcu();
+       ahvif->links_map &= ~BIT(arvif->link_id);
+
+       if (arvif != &ahvif->deflink)
+               kfree(arvif);
+       else
+               memset(arvif, 0, sizeof(*arvif));
+}
+
 static int
 ath12k_mac_op_change_vif_links(struct ieee80211_hw *hw,
                               struct ieee80211_vif *vif,
@@ -3974,131 +4099,6 @@ static void ath12k_mac_op_link_info_changed(struct ieee80211_hw *hw,
        ath12k_mac_bss_info_changed(ar, arvif, info, changed);
 }
 
-static void ath12k_mac_init_arvif(struct ath12k_vif *ahvif,
-                                 struct ath12k_link_vif *arvif, int link_id)
-{
-       struct ath12k_hw *ah = ahvif->ah;
-       u8 _link_id;
-       int i;
-
-       lockdep_assert_wiphy(ah->hw->wiphy);
-
-       if (WARN_ON(!arvif))
-               return;
-
-       if (WARN_ON(link_id >= ATH12K_NUM_MAX_LINKS))
-               return;
-
-       if (link_id < 0)
-               _link_id = 0;
-       else
-               _link_id = link_id;
-
-       arvif->ahvif = ahvif;
-       arvif->link_id = _link_id;
-
-       INIT_LIST_HEAD(&arvif->list);
-       INIT_DELAYED_WORK(&arvif->connection_loss_work,
-                         ath12k_mac_vif_sta_connection_loss_work);
-
-       for (i = 0; i < ARRAY_SIZE(arvif->bitrate_mask.control); i++) {
-               arvif->bitrate_mask.control[i].legacy = 0xffffffff;
-               memset(arvif->bitrate_mask.control[i].ht_mcs, 0xff,
-                      sizeof(arvif->bitrate_mask.control[i].ht_mcs));
-               memset(arvif->bitrate_mask.control[i].vht_mcs, 0xff,
-                      sizeof(arvif->bitrate_mask.control[i].vht_mcs));
-       }
-
-       /* Handle MLO related assignments */
-       if (link_id >= 0) {
-               rcu_assign_pointer(ahvif->link[arvif->link_id], arvif);
-               ahvif->links_map |= BIT(_link_id);
-       }
-
-       ath12k_generic_dbg(ATH12K_DBG_MAC,
-                          "mac init link arvif (link_id %d%s) for vif %pM. links_map 0x%x",
-                          _link_id, (link_id < 0) ? " deflink" : "", ahvif->vif->addr,
-                          ahvif->links_map);
-}
-
-static struct ath12k_link_vif *ath12k_mac_assign_link_vif(struct ath12k_hw *ah,
-                                                         struct ieee80211_vif *vif,
-                                                         u8 link_id)
-{
-       struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
-       struct ath12k_link_vif *arvif;
-
-       lockdep_assert_wiphy(ah->hw->wiphy);
-
-       arvif = wiphy_dereference(ah->hw->wiphy, ahvif->link[link_id]);
-       if (arvif)
-               return arvif;
-
-       if (!vif->valid_links) {
-               /* Use deflink for Non-ML VIFs and mark the link id as 0
-                */
-               link_id = 0;
-               arvif = &ahvif->deflink;
-       } else {
-               /* If this is the first link arvif being created for an ML VIF
-                * use the preallocated deflink memory except for scan arvifs
-                */
-               if (!ahvif->links_map && link_id != ATH12K_DEFAULT_SCAN_LINK) {
-                       arvif = &ahvif->deflink;
-               } else {
-                       arvif = (struct ath12k_link_vif *)
-                       kzalloc(sizeof(struct ath12k_link_vif), GFP_KERNEL);
-                       if (!arvif)
-                               return NULL;
-               }
-       }
-
-       ath12k_mac_init_arvif(ahvif, arvif, link_id);
-
-       return arvif;
-}
-
-static void ath12k_mac_unassign_link_vif(struct ath12k_link_vif *arvif)
-{
-       struct ath12k_vif *ahvif = arvif->ahvif;
-       struct ath12k_hw *ah = ahvif->ah;
-
-       lockdep_assert_wiphy(ah->hw->wiphy);
-
-       rcu_assign_pointer(ahvif->link[arvif->link_id], NULL);
-       synchronize_rcu();
-       ahvif->links_map &= ~BIT(arvif->link_id);
-
-       if (arvif != &ahvif->deflink)
-               kfree(arvif);
-       else
-               memset(arvif, 0, sizeof(*arvif));
-}
-
-static void ath12k_mac_remove_link_interface(struct ieee80211_hw *hw,
-                                            struct ath12k_link_vif *arvif)
-{
-       struct ath12k_vif *ahvif = arvif->ahvif;
-       struct ath12k_hw *ah = hw->priv;
-       struct ath12k *ar = arvif->ar;
-       int ret;
-
-       lockdep_assert_wiphy(ah->hw->wiphy);
-
-       cancel_delayed_work_sync(&arvif->connection_loss_work);
-
-       ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac remove link interface (vdev %d link id %d)",
-                  arvif->vdev_id, arvif->link_id);
-
-       if (ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
-               ret = ath12k_peer_delete(ar, arvif->vdev_id, arvif->bssid);
-               if (ret)
-                       ath12k_warn(ar->ab, "failed to submit AP self-peer removal on vdev %d link id %d: %d",
-                                   arvif->vdev_id, arvif->link_id, ret);
-       }
-       ath12k_mac_vdev_delete(ar, arvif);
-}
-
 static struct ath12k*
 ath12k_mac_select_scan_device(struct ieee80211_hw *hw,
                              struct ieee80211_vif *vif,