wifi: mac80211: pass the link id in start/stop ap
authorShaul Triebitz <shaul.triebitz@intel.com>
Thu, 2 Jun 2022 12:08:16 +0000 (15:08 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 20 Jun 2022 10:57:08 +0000 (12:57 +0200)
In start_ap and stop_ap mac80211 callbacks pass the link_id
to the drivers.

Signed-off-by: Shaul Triebitz <shaul.triebitz@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
drivers/net/wireless/realtek/rtw88/mac80211.c
drivers/net/wireless/realtek/rtw89/mac80211.c
drivers/net/wireless/silabs/wfx/sta.c
drivers/net/wireless/silabs/wfx/sta.h
include/net/mac80211.h
net/mac80211/cfg.c
net/mac80211/driver-ops.h
net/mac80211/trace.h
net/mac80211/util.c

index 2539dc5aaa3f3cbe60846c5c35a8ea1910e01148..eaffc3163bd13410fd4f441a1698429feda88285 100644 (file)
@@ -2396,7 +2396,8 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
 }
 
 static int iwl_mvm_start_ap_ibss(struct ieee80211_hw *hw,
-                                struct ieee80211_vif *vif)
+                                struct ieee80211_vif *vif,
+                                unsigned int link_id)
 {
        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
@@ -2522,8 +2523,22 @@ out_unlock:
        return ret;
 }
 
+static int iwl_mvm_start_ap(struct ieee80211_hw *hw,
+                           struct ieee80211_vif *vif,
+                           unsigned int link_id)
+{
+       return iwl_mvm_start_ap_ibss(hw, vif, link_id);
+}
+
+static int iwl_mvm_start_ibss(struct ieee80211_hw *hw,
+                             struct ieee80211_vif *vif)
+{
+       return iwl_mvm_start_ap_ibss(hw, vif, 0);
+}
+
 static void iwl_mvm_stop_ap_ibss(struct ieee80211_hw *hw,
-                                struct ieee80211_vif *vif)
+                                struct ieee80211_vif *vif,
+                                unsigned int link_id)
 {
        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
@@ -2586,6 +2601,19 @@ static void iwl_mvm_stop_ap_ibss(struct ieee80211_hw *hw,
        mutex_unlock(&mvm->mutex);
 }
 
+static void iwl_mvm_stop_ap(struct ieee80211_hw *hw,
+                           struct ieee80211_vif *vif,
+                           unsigned int link_id)
+{
+       iwl_mvm_stop_ap_ibss(hw, vif, link_id);
+}
+
+static void iwl_mvm_stop_ibss(struct ieee80211_hw *hw,
+                             struct ieee80211_vif *vif)
+{
+       iwl_mvm_stop_ap_ibss(hw, vif, 0);
+}
+
 static void
 iwl_mvm_bss_info_changed_ap_ibss(struct iwl_mvm *mvm,
                                 struct ieee80211_vif *vif,
@@ -5408,10 +5436,10 @@ const struct ieee80211_ops iwl_mvm_hw_ops = {
        .unassign_vif_chanctx = iwl_mvm_unassign_vif_chanctx,
        .switch_vif_chanctx = iwl_mvm_switch_vif_chanctx,
 
-       .start_ap = iwl_mvm_start_ap_ibss,
-       .stop_ap = iwl_mvm_stop_ap_ibss,
-       .join_ibss = iwl_mvm_start_ap_ibss,
-       .leave_ibss = iwl_mvm_stop_ap_ibss,
+       .start_ap = iwl_mvm_start_ap,
+       .stop_ap = iwl_mvm_stop_ap,
+       .join_ibss = iwl_mvm_start_ibss,
+       .leave_ibss = iwl_mvm_stop_ibss,
 
        .tx_last_beacon = iwl_mvm_tx_last_beacon,
 
index 9e0b5692fbab71a270c189de08d944e7bac3ddea..ba60ca7ecdbfc8cb0e15ce4ad69d99c8d0875372 100644 (file)
@@ -429,7 +429,8 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw,
        mutex_unlock(&rtwdev->mutex);
 }
 
-static int rtw_ops_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
+static int rtw_ops_start_ap(struct ieee80211_hw *hw,
+                           struct ieee80211_vif *vif, unsigned int link_id)
 {
        struct rtw_dev *rtwdev = hw->priv;
        struct rtw_chip_info *chip = rtwdev->chip;
index 5afb8fe5708ed78d8fc071949a3ef4fb1d159e55..0e3c95cf4c9990002785272a5c2192a06d266a55 100644 (file)
@@ -381,7 +381,8 @@ static void rtw89_ops_bss_info_changed(struct ieee80211_hw *hw,
        mutex_unlock(&rtwdev->mutex);
 }
 
-static int rtw89_ops_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
+static int rtw89_ops_start_ap(struct ieee80211_hw *hw,
+                             struct ieee80211_vif *vif, unsigned int link_id)
 {
        struct rtw89_dev *rtwdev = hw->priv;
        struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
@@ -401,7 +402,8 @@ static int rtw89_ops_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif
 }
 
 static
-void rtw89_ops_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
+void rtw89_ops_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+                      unsigned int link_id)
 {
        struct rtw89_dev *rtwdev = hw->priv;
        struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
index 97a631ff1bfaf78ca6a75413db76af3fe9014607..3ae93573f78769268dac3b282772036957da5bb1 100644 (file)
@@ -378,7 +378,8 @@ static void wfx_set_mfp_ap(struct wfx_vif *wvif)
        }
 }
 
-int wfx_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
+int wfx_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+                unsigned int link_id)
 {
        struct wfx_vif *wvif = (struct wfx_vif *)vif->drv_priv;
        struct wfx_dev *wdev = wvif->wdev;
@@ -396,7 +397,8 @@ int wfx_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
        return ret;
 }
 
-void wfx_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
+void wfx_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+                unsigned int link_id)
 {
        struct wfx_vif *wvif = (struct wfx_vif *)vif->drv_priv;
 
index 3109d257fe94f9aae5870e3357f7bfa623d6ccd8..93ea992de1d75973fdbbec75f515e9846f26fa02 100644 (file)
@@ -29,8 +29,10 @@ void wfx_configure_filter(struct ieee80211_hw *hw, unsigned int changed_flags,
 
 int wfx_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
 void wfx_remove_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
-int wfx_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
-void wfx_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
+int wfx_start_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+                unsigned int link_id);
+void wfx_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+                unsigned int link_id);
 int wfx_join_ibss(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
 void wfx_leave_ibss(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
 int wfx_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
index 1bc9d1d9769a64800d9969cb84bac2949a7d6f44..48c688fdf23d6f75e8f500b292c186a6dddc77c0 100644 (file)
@@ -4084,8 +4084,10 @@ struct ieee80211_ops {
                                  struct ieee80211_vif *vif,
                                  unsigned int link_id, u64 changed);
 
-       int (*start_ap)(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
-       void (*stop_ap)(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
+       int (*start_ap)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+                       unsigned int link_id);
+       void (*stop_ap)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+                       unsigned int link_id);
 
        u64 (*prepare_multicast)(struct ieee80211_hw *hw,
                                 struct netdev_hw_addr_list *mc_list);
index f1ee73d96dfb0fc414c058055b0a0026a8b0fcfb..009f1723c9902e3e2feb3a154ccaa2f88973a9e8 100644 (file)
@@ -1287,7 +1287,7 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
                changed |= BSS_CHANGED_UNSOL_BCAST_PROBE_RESP;
        }
 
-       err = drv_start_ap(sdata->local, sdata);
+       err = drv_start_ap(sdata->local, sdata, link_id);
        if (err) {
                old = sdata_dereference(link->u.ap.beacon, sdata);
 
@@ -1442,7 +1442,7 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev,
                                   GFP_KERNEL);
        }
 
-       drv_stop_ap(sdata->local, sdata);
+       drv_stop_ap(sdata->local, sdata, link_id);
 
        /* free all potentially still buffered bcast frames */
        local->total_ps_buffered -= skb_queue_len(&sdata->u.ap.ps.bc_buf);
index 52be89f8f0bce8feeafc1e789faec21574667a88..db38c8cc9d8fa37dbf791a0b6cdf0832cbbdcb77 100644 (file)
@@ -985,7 +985,8 @@ int drv_switch_vif_chanctx(struct ieee80211_local *local,
                           int n_vifs, enum ieee80211_chanctx_switch_mode mode);
 
 static inline int drv_start_ap(struct ieee80211_local *local,
-                              struct ieee80211_sub_if_data *sdata)
+                              struct ieee80211_sub_if_data *sdata,
+                              unsigned int link_id)
 {
        int ret = 0;
 
@@ -994,22 +995,24 @@ static inline int drv_start_ap(struct ieee80211_local *local,
        if (!check_sdata_in_driver(sdata))
                return -EIO;
 
-       trace_drv_start_ap(local, sdata, &sdata->vif.bss_conf);
+       trace_drv_start_ap(local, sdata, sdata->vif.link_conf[link_id],
+                          link_id);
        if (local->ops->start_ap)
-               ret = local->ops->start_ap(&local->hw, &sdata->vif);
+               ret = local->ops->start_ap(&local->hw, &sdata->vif, link_id);
        trace_drv_return_int(local, ret);
        return ret;
 }
 
 static inline void drv_stop_ap(struct ieee80211_local *local,
-                              struct ieee80211_sub_if_data *sdata)
+                              struct ieee80211_sub_if_data *sdata,
+                              unsigned int link_id)
 {
        if (!check_sdata_in_driver(sdata))
                return;
 
-       trace_drv_stop_ap(local, sdata);
+       trace_drv_stop_ap(local, sdata, link_id);
        if (local->ops->stop_ap)
-               local->ops->stop_ap(&local->hw, &sdata->vif);
+               local->ops->stop_ap(&local->hw, &sdata->vif, link_id);
        trace_drv_return_void(local);
 }
 
index 9804634e7d99de26fe787faa5ad2a0be23abc099..f96e7cdca4c2fd249e9833695eb272d8cbd0c734 100644 (file)
@@ -1752,13 +1752,15 @@ DEFINE_EVENT(local_sdata_chanctx, drv_unassign_vif_chanctx,
 TRACE_EVENT(drv_start_ap,
        TP_PROTO(struct ieee80211_local *local,
                 struct ieee80211_sub_if_data *sdata,
-                struct ieee80211_bss_conf *info),
+                struct ieee80211_bss_conf *info,
+                unsigned int link_id),
 
-       TP_ARGS(local, sdata, info),
+       TP_ARGS(local, sdata, info, link_id),
 
        TP_STRUCT__entry(
                LOCAL_ENTRY
                VIF_ENTRY
+               __field(u32, link_id)
                __field(u8, dtimper)
                __field(u16, bcnint)
                __dynamic_array(u8, ssid, sdata->vif.cfg.ssid_len)
@@ -1768,6 +1770,7 @@ TRACE_EVENT(drv_start_ap,
        TP_fast_assign(
                LOCAL_ASSIGN;
                VIF_ASSIGN;
+               __entry->link_id = link_id;
                __entry->dtimper = info->dtim_period;
                __entry->bcnint = info->beacon_int;
                memcpy(__get_dynamic_array(ssid),
@@ -1777,15 +1780,34 @@ TRACE_EVENT(drv_start_ap,
        ),
 
        TP_printk(
-               LOCAL_PR_FMT  VIF_PR_FMT,
-               LOCAL_PR_ARG, VIF_PR_ARG
+               LOCAL_PR_FMT  VIF_PR_FMT " link id %u",
+               LOCAL_PR_ARG, VIF_PR_ARG, __entry->link_id
        )
 );
 
-DEFINE_EVENT(local_sdata_evt, drv_stop_ap,
+TRACE_EVENT(drv_stop_ap,
        TP_PROTO(struct ieee80211_local *local,
-                struct ieee80211_sub_if_data *sdata),
-       TP_ARGS(local, sdata)
+                struct ieee80211_sub_if_data *sdata,
+                unsigned int link_id),
+
+       TP_ARGS(local, sdata, link_id),
+
+       TP_STRUCT__entry(
+               LOCAL_ENTRY
+               VIF_ENTRY
+               __field(u32, link_id)
+       ),
+
+       TP_fast_assign(
+               LOCAL_ASSIGN;
+               VIF_ASSIGN;
+               __entry->link_id = link_id;
+       ),
+
+       TP_printk(
+               LOCAL_PR_FMT  VIF_PR_FMT " link id %u",
+               LOCAL_PR_ARG, VIF_PR_ARG, __entry->link_id
+       )
 );
 
 TRACE_EVENT(drv_reconfig_complete,
index ecda655e748146613ee64e3f77678e241e984bc1..bccc3a309ed084591f10806354470653aea84094 100644 (file)
@@ -2568,7 +2568,7 @@ int ieee80211_reconfig(struct ieee80211_local *local)
                                changed |= BSS_CHANGED_AP_PROBE_RESP;
 
                                if (rcu_access_pointer(sdata->deflink.u.ap.beacon))
-                                       drv_start_ap(local, sdata);
+                                       drv_start_ap(local, sdata, 0);
                        }
                        fallthrough;
                case NL80211_IFTYPE_MESH_POINT: