wifi: mac80211: change QoS settings API to take link into account
authorJohannes Berg <johannes.berg@intel.com>
Fri, 24 Jun 2022 13:40:11 +0000 (15:40 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 15 Jul 2022 09:43:15 +0000 (11:43 +0200)
Take the link into account in the QoS settings (EDCA parameters)
APIs.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
55 files changed:
drivers/net/wireless/ath/ath10k/mac.c
drivers/net/wireless/ath/ath11k/mac.c
drivers/net/wireless/ath/ath5k/mac80211-ops.c
drivers/net/wireless/ath/ath9k/htc_drv_main.c
drivers/net/wireless/ath/ath9k/main.c
drivers/net/wireless/ath/carl9170/main.c
drivers/net/wireless/broadcom/b43/main.c
drivers/net/wireless/broadcom/b43legacy/main.c
drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
drivers/net/wireless/intel/iwlegacy/common.c
drivers/net/wireless/intel/iwlegacy/common.h
drivers/net/wireless/intel/iwlwifi/dvm/mac80211.c
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
drivers/net/wireless/intersil/p54/main.c
drivers/net/wireless/mac80211_hwsim.c
drivers/net/wireless/marvell/mwl8k.c
drivers/net/wireless/mediatek/mt76/mt7603/main.c
drivers/net/wireless/mediatek/mt76/mt7615/main.c
drivers/net/wireless/mediatek/mt76/mt76x02.h
drivers/net/wireless/mediatek/mt76/mt76x02_util.c
drivers/net/wireless/mediatek/mt76/mt7915/main.c
drivers/net/wireless/mediatek/mt76/mt7921/main.c
drivers/net/wireless/mediatek/mt7601u/mt7601u.h
drivers/net/wireless/mediatek/mt7601u/tx.c
drivers/net/wireless/ralink/rt2x00/rt2400pci.c
drivers/net/wireless/ralink/rt2x00/rt2800lib.c
drivers/net/wireless/ralink/rt2x00/rt2800lib.h
drivers/net/wireless/ralink/rt2x00/rt2x00.h
drivers/net/wireless/ralink/rt2x00/rt2x00mac.c
drivers/net/wireless/ralink/rt2x00/rt61pci.c
drivers/net/wireless/ralink/rt2x00/rt73usb.c
drivers/net/wireless/realtek/rtl818x/rtl8180/dev.c
drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
drivers/net/wireless/realtek/rtlwifi/core.c
drivers/net/wireless/realtek/rtw88/mac80211.c
drivers/net/wireless/realtek/rtw89/mac80211.c
drivers/net/wireless/rsi/rsi_91x_mac80211.c
drivers/net/wireless/silabs/wfx/sta.c
drivers/net/wireless/silabs/wfx/sta.h
drivers/net/wireless/st/cw1200/sta.c
drivers/net/wireless/st/cw1200/sta.h
drivers/net/wireless/ti/wl1251/main.c
drivers/net/wireless/ti/wlcore/main.c
include/net/mac80211.h
net/mac80211/cfg.c
net/mac80211/driver-ops.c
net/mac80211/driver-ops.h
net/mac80211/ibss.c
net/mac80211/ieee80211_i.h
net/mac80211/iface.c
net/mac80211/mlme.c
net/mac80211/tdls.c
net/mac80211/trace.h
net/mac80211/util.c

index b18f322..ac54396 100644 (file)
@@ -7814,7 +7814,8 @@ exit:
 }
 
 static int ath10k_conf_tx(struct ieee80211_hw *hw,
-                         struct ieee80211_vif *vif, u16 ac,
+                         struct ieee80211_vif *vif,
+                         unsigned int link_id, u16 ac,
                          const struct ieee80211_tx_queue_params *params)
 {
        struct ath10k *ar = hw->priv;
index 1cf1e1f..ec7b3a3 100644 (file)
@@ -4822,7 +4822,8 @@ exit:
 }
 
 static int ath11k_mac_op_conf_tx(struct ieee80211_hw *hw,
-                                struct ieee80211_vif *vif, u16 ac,
+                                struct ieee80211_vif *vif,
+                                unsigned int link_id, u16 ac,
                                 const struct ieee80211_tx_queue_params *params)
 {
        struct ath11k *ar = hw->priv;
index 8da232e..acd0e1d 100644 (file)
@@ -572,7 +572,8 @@ ath5k_get_stats(struct ieee80211_hw *hw,
 
 
 static int
-ath5k_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u16 queue,
+ath5k_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+             unsigned int link_id, u16 queue,
              const struct ieee80211_tx_queue_params *params)
 {
        struct ath5k_hw *ah = hw->priv;
index 14d713e..61875c4 100644 (file)
@@ -1369,7 +1369,8 @@ static void ath9k_htc_sta_rc_update(struct ieee80211_hw *hw,
 }
 
 static int ath9k_htc_conf_tx(struct ieee80211_hw *hw,
-                            struct ieee80211_vif *vif, u16 queue,
+                            struct ieee80211_vif *vif,
+                            unsigned int link_id, u16 queue,
                             const struct ieee80211_tx_queue_params *params)
 {
        struct ath9k_htc_priv *priv = hw->priv;
index c3d5d97..d2c20c3 100644 (file)
@@ -1712,7 +1712,8 @@ static void ath9k_sta_notify(struct ieee80211_hw *hw,
 }
 
 static int ath9k_conf_tx(struct ieee80211_hw *hw,
-                        struct ieee80211_vif *vif, u16 queue,
+                        struct ieee80211_vif *vif,
+                        unsigned int link_id, u16 queue,
                         const struct ieee80211_tx_queue_params *params)
 {
        struct ath_softc *sc = hw->priv;
index 3d88102..1540e98 100644 (file)
@@ -1365,7 +1365,8 @@ static int carl9170_op_sta_remove(struct ieee80211_hw *hw,
 }
 
 static int carl9170_op_conf_tx(struct ieee80211_hw *hw,
-                              struct ieee80211_vif *vif, u16 queue,
+                              struct ieee80211_vif *vif,
+                              unsigned int link_id, u16 queue,
                               const struct ieee80211_tx_queue_params *param)
 {
        struct ar9170 *ar = hw->priv;
index 6b41880..008ee1f 100644 (file)
@@ -3783,7 +3783,8 @@ static void b43_qos_init(struct b43_wldev *dev)
 }
 
 static int b43_op_conf_tx(struct ieee80211_hw *hw,
-                         struct ieee80211_vif *vif, u16 _queue,
+                         struct ieee80211_vif *vif,
+                         unsigned int link_id, u16 _queue,
                          const struct ieee80211_tx_queue_params *params)
 {
        struct b43_wl *wl = hw_to_b43_wl(hw);
index 5320131..cbc21c7 100644 (file)
@@ -2505,7 +2505,8 @@ static void b43legacy_op_tx(struct ieee80211_hw *hw,
 }
 
 static int b43legacy_op_conf_tx(struct ieee80211_hw *hw,
-                               struct ieee80211_vif *vif, u16 queue,
+                               struct ieee80211_vif *vif,
+                               unsigned int link_id, u16 queue,
                                const struct ieee80211_tx_queue_params *params)
 {
        return 0;
index 61d7404..a4034d4 100644 (file)
@@ -787,7 +787,8 @@ static void brcms_ops_sw_scan_complete(struct ieee80211_hw *hw,
 }
 
 static int
-brcms_ops_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u16 queue,
+brcms_ops_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+                 unsigned int link_id, u16 queue,
                  const struct ieee80211_tx_queue_params *params)
 {
        struct brcms_info *wl = hw->priv;
index 6f007e6..9aa3359 100644 (file)
@@ -4480,7 +4480,8 @@ il_clear_isr_stats(struct il_priv *il)
 }
 
 int
-il_mac_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u16 queue,
+il_mac_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+              unsigned int link_id, u16 queue,
               const struct ieee80211_tx_queue_params *params)
 {
        struct il_priv *il = hw->priv;
index d1383b4..69687fc 100644 (file)
@@ -1683,7 +1683,8 @@ struct il_cfg {
  ***************************/
 
 int il_mac_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
-                  u16 queue, const struct ieee80211_tx_queue_params *params);
+                  unsigned int link_id, u16 queue,
+                  const struct ieee80211_tx_queue_params *params);
 int il_mac_tx_last_beacon(struct ieee80211_hw *hw);
 
 void il_set_rxon_hwcrypto(struct il_priv *il, int hw_decrypt);
index e8bd4f0..f4070fd 100644 (file)
@@ -2,7 +2,7 @@
 /******************************************************************************
  *
  * Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved.
- * Copyright (C) 2018 - 2019 Intel Corporation
+ * Copyright (C) 2018 - 2019, 2022 Intel Corporation
  *
  * Portions of this file are derived from the ipw3945 project, as well
  * as portions of the ieee80211 subsystem header files.
@@ -1153,7 +1153,8 @@ static int iwlagn_mac_set_tim(struct ieee80211_hw *hw,
 }
 
 static int iwlagn_mac_conf_tx(struct ieee80211_hw *hw,
-                             struct ieee80211_vif *vif, u16 queue,
+                             struct ieee80211_vif *vif,
+                             unsigned int link_id, u16 queue,
                              const struct ieee80211_tx_queue_params *params)
 {
        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
index eaffc31..3de558f 100644 (file)
@@ -3349,7 +3349,8 @@ static void iwl_mvm_sta_rc_update(struct ieee80211_hw *hw,
 }
 
 static int iwl_mvm_mac_conf_tx(struct ieee80211_hw *hw,
-                              struct ieee80211_vif *vif, u16 ac,
+                              struct ieee80211_vif *vif,
+                              unsigned int link_id, u16 ac,
                               const struct ieee80211_tx_queue_params *params)
 {
        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
index 115be1f..0f76d43 100644 (file)
@@ -404,7 +404,8 @@ static void p54_configure_filter(struct ieee80211_hw *dev,
 }
 
 static int p54_conf_tx(struct ieee80211_hw *dev,
-                      struct ieee80211_vif *vif, u16 queue,
+                      struct ieee80211_vif *vif,
+                      unsigned int link_id, u16 queue,
                       const struct ieee80211_tx_queue_params *params)
 {
        struct p54_common *priv = dev->priv;
index f437d8a..5da7a09 100644 (file)
@@ -2340,10 +2340,10 @@ static int mac80211_hwsim_set_tim(struct ieee80211_hw *hw,
        return 0;
 }
 
-static int mac80211_hwsim_conf_tx(
-       struct ieee80211_hw *hw,
-       struct ieee80211_vif *vif, u16 queue,
-       const struct ieee80211_tx_queue_params *params)
+static int mac80211_hwsim_conf_tx(struct ieee80211_hw *hw,
+                                 struct ieee80211_vif *vif,
+                                 unsigned int link_id, u16 queue,
+                                 const struct ieee80211_tx_queue_params *params)
 {
        wiphy_dbg(hw->wiphy,
                  "%s (queue=%d txop=%d cw_min=%d cw_max=%d aifs=%d)\n",
index 293bec9..c1bf899 100644 (file)
@@ -5365,7 +5365,8 @@ static int mwl8k_sta_add(struct ieee80211_hw *hw,
 }
 
 static int mwl8k_conf_tx(struct ieee80211_hw *hw,
-                        struct ieee80211_vif *vif, u16 queue,
+                        struct ieee80211_vif *vif,
+                        unsigned int link_id, u16 queue,
                         const struct ieee80211_tx_queue_params *params)
 {
        struct mwl8k_priv *priv = hw->priv;
@@ -6050,7 +6051,7 @@ static int mwl8k_reload_firmware(struct ieee80211_hw *hw, char *fw_image)
                goto fail;
 
        for (i = 0; i < MWL8K_TX_WMM_QUEUES; i++) {
-               rc = mwl8k_conf_tx(hw, NULL, i, &priv->wmm_params[i]);
+               rc = mwl8k_conf_tx(hw, NULL, 0, i, &priv->wmm_params[i]);
                if (rc)
                        goto fail;
        }
index 088c0a4..051715e 100644 (file)
@@ -527,7 +527,8 @@ mt7603_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
 }
 
 static int
-mt7603_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u16 queue,
+mt7603_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+              unsigned int link_id, u16 queue,
               const struct ieee80211_tx_queue_params *params)
 {
        struct mt7603_dev *dev = hw->priv;
index 277c22a..bf1696e 100644 (file)
@@ -494,7 +494,8 @@ static int mt7615_config(struct ieee80211_hw *hw, u32 changed)
 }
 
 static int
-mt7615_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u16 queue,
+mt7615_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+              unsigned int link_id, u16 queue,
               const struct ieee80211_tx_queue_params *params)
 {
        struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
index 74ad418..50eaeff 100644 (file)
@@ -156,7 +156,8 @@ int mt76x02_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
                    struct ieee80211_vif *vif, struct ieee80211_sta *sta,
                    struct ieee80211_key_conf *key);
 int mt76x02_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
-                   u16 queue, const struct ieee80211_tx_queue_params *params);
+                   unsigned int link_id, u16 queue,
+                   const struct ieee80211_tx_queue_params *params);
 void mt76x02_sta_rate_tbl_update(struct ieee80211_hw *hw,
                                 struct ieee80211_vif *vif,
                                 struct ieee80211_sta *sta);
index a0e2d04..604ddcc 100644 (file)
@@ -487,7 +487,8 @@ int mt76x02_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
 EXPORT_SYMBOL_GPL(mt76x02_set_key);
 
 int mt76x02_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
-                   u16 queue, const struct ieee80211_tx_queue_params *params)
+                   unsigned int link_id, u16 queue,
+                   const struct ieee80211_tx_queue_params *params)
 {
        struct mt76x02_dev *dev = hw->priv;
        u8 cw_min = 5, cw_max = 10, qid;
index fbeac9a..25323a1 100644 (file)
@@ -478,7 +478,8 @@ static int mt7915_config(struct ieee80211_hw *hw, u32 changed)
 }
 
 static int
-mt7915_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u16 queue,
+mt7915_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+              unsigned int link_id, u16 queue,
               const struct ieee80211_tx_queue_params *params)
 {
        struct mt7915_vif *mvif = (struct mt7915_vif *)vif->drv_priv;
index 6358360..1d0daa0 100644 (file)
@@ -567,7 +567,8 @@ out:
 }
 
 static int
-mt7921_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u16 queue,
+mt7921_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+              unsigned int link_id, u16 queue,
               const struct ieee80211_tx_queue_params *params)
 {
        struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
index a122f1d..118d437 100644 (file)
@@ -368,7 +368,8 @@ void mt7601u_mac_set_ampdu_factor(struct mt7601u_dev *dev);
 void mt7601u_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control,
                struct sk_buff *skb);
 int mt7601u_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
-                   u16 queue, const struct ieee80211_tx_queue_params *params);
+                   unsigned int link_id, u16 queue,
+                   const struct ieee80211_tx_queue_params *params);
 void mt7601u_tx_status(struct mt7601u_dev *dev, struct sk_buff *skb);
 void mt7601u_tx_stat(struct work_struct *work);
 
index f1fa044..51d977f 100644 (file)
@@ -258,7 +258,8 @@ void mt7601u_tx_stat(struct work_struct *work)
 }
 
 int mt7601u_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
-                   u16 queue, const struct ieee80211_tx_queue_params *params)
+                   unsigned int link_id, u16 queue,
+                   const struct ieee80211_tx_queue_params *params)
 {
        struct mt7601u_dev *dev = hw->priv;
        u8 cw_min = 5, cw_max = 10, hw_q = q2hwq(queue);
index dec6ffd..273c5ea 100644 (file)
@@ -1654,7 +1654,8 @@ static int rt2400pci_probe_hw(struct rt2x00_dev *rt2x00dev)
  * IEEE80211 stack callback functions.
  */
 static int rt2400pci_conf_tx(struct ieee80211_hw *hw,
-                            struct ieee80211_vif *vif, u16 queue,
+                            struct ieee80211_vif *vif,
+                            unsigned int link_id, u16 queue,
                             const struct ieee80211_tx_queue_params *params)
 {
        struct rt2x00_dev *rt2x00dev = hw->priv;
@@ -1667,7 +1668,7 @@ static int rt2400pci_conf_tx(struct ieee80211_hw *hw,
        if (queue != 0)
                return -EINVAL;
 
-       if (rt2x00mac_conf_tx(hw, vif, queue, params))
+       if (rt2x00mac_conf_tx(hw, vif, link_id, queue, params))
                return -EINVAL;
 
        /*
index cbdaf79..18102fb 100644 (file)
@@ -10395,7 +10395,8 @@ int rt2800_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
 EXPORT_SYMBOL_GPL(rt2800_set_rts_threshold);
 
 int rt2800_conf_tx(struct ieee80211_hw *hw,
-                  struct ieee80211_vif *vif, u16 queue_idx,
+                  struct ieee80211_vif *vif,
+                  unsigned int link_id, u16 queue_idx,
                   const struct ieee80211_tx_queue_params *params)
 {
        struct rt2x00_dev *rt2x00dev = hw->priv;
@@ -10411,7 +10412,7 @@ int rt2800_conf_tx(struct ieee80211_hw *hw,
         * we are free to update the registers based on the value
         * in the queue parameter.
         */
-       retval = rt2x00mac_conf_tx(hw, vif, queue_idx, params);
+       retval = rt2x00mac_conf_tx(hw, vif, link_id, queue_idx, params);
        if (retval)
                return retval;
 
index 1139405..e1761f4 100644 (file)
@@ -245,7 +245,8 @@ void rt2800_get_key_seq(struct ieee80211_hw *hw,
                        struct ieee80211_key_seq *seq);
 int rt2800_set_rts_threshold(struct ieee80211_hw *hw, u32 value);
 int rt2800_conf_tx(struct ieee80211_hw *hw,
-                  struct ieee80211_vif *vif, u16 queue_idx,
+                  struct ieee80211_vif *vif,
+                  unsigned int link_id, u16 queue_idx,
                   const struct ieee80211_tx_queue_params *params);
 u64 rt2800_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
 int rt2800_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
index 918e047..f7ef2ca 100644 (file)
@@ -1481,7 +1481,8 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw,
                                struct ieee80211_bss_conf *bss_conf,
                                u64 changes);
 int rt2x00mac_conf_tx(struct ieee80211_hw *hw,
-                     struct ieee80211_vif *vif, u16 queue,
+                     struct ieee80211_vif *vif,
+                     unsigned int link_id, u16 queue,
                      const struct ieee80211_tx_queue_params *params);
 void rt2x00mac_rfkill_poll(struct ieee80211_hw *hw);
 void rt2x00mac_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
index 6205d22..c0ab2e6 100644 (file)
@@ -665,7 +665,8 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw,
 EXPORT_SYMBOL_GPL(rt2x00mac_bss_info_changed);
 
 int rt2x00mac_conf_tx(struct ieee80211_hw *hw,
-                     struct ieee80211_vif *vif, u16 queue_idx,
+                     struct ieee80211_vif *vif,
+                     unsigned int link_id, u16 queue_idx,
                      const struct ieee80211_tx_queue_params *params)
 {
        struct rt2x00_dev *rt2x00dev = hw->priv;
index 82cfc2a..d92f9eb 100644 (file)
@@ -2799,7 +2799,8 @@ static int rt61pci_probe_hw(struct rt2x00_dev *rt2x00dev)
  * IEEE80211 stack callback functions.
  */
 static int rt61pci_conf_tx(struct ieee80211_hw *hw,
-                          struct ieee80211_vif *vif, u16 queue_idx,
+                          struct ieee80211_vif *vif,
+                          unsigned int link_id, u16 queue_idx,
                           const struct ieee80211_tx_queue_params *params)
 {
        struct rt2x00_dev *rt2x00dev = hw->priv;
@@ -2815,7 +2816,7 @@ static int rt61pci_conf_tx(struct ieee80211_hw *hw,
         * we are free to update the registers based on the value
         * in the queue parameter.
         */
-       retval = rt2x00mac_conf_tx(hw, vif, queue_idx, params);
+       retval = rt2x00mac_conf_tx(hw, vif, link_id, queue_idx, params);
        if (retval)
                return retval;
 
index 5ff2c74..e3269fd 100644 (file)
@@ -2218,7 +2218,8 @@ static int rt73usb_probe_hw(struct rt2x00_dev *rt2x00dev)
  * IEEE80211 stack callback functions.
  */
 static int rt73usb_conf_tx(struct ieee80211_hw *hw,
-                          struct ieee80211_vif *vif, u16 queue_idx,
+                          struct ieee80211_vif *vif,
+                          unsigned int link_id, u16 queue_idx,
                           const struct ieee80211_tx_queue_params *params)
 {
        struct rt2x00_dev *rt2x00dev = hw->priv;
@@ -2234,7 +2235,7 @@ static int rt73usb_conf_tx(struct ieee80211_hw *hw,
         * we are free to update the registers based on the value
         * in the queue parameter.
         */
-       retval = rt2x00mac_conf_tx(hw, vif, queue_idx, params);
+       retval = rt2x00mac_conf_tx(hw, vif, link_id, queue_idx, params);
        if (retval)
                return retval;
 
index f66cc90..cdfe080 100644 (file)
@@ -1424,7 +1424,8 @@ static void rtl8187se_conf_ac_parm(struct ieee80211_hw *dev, u8 queue)
 }
 
 static int rtl8180_conf_tx(struct ieee80211_hw *dev,
-                           struct ieee80211_vif *vif, u16 queue,
+                           struct ieee80211_vif *vif,
+                           unsigned int link_id, u16 queue,
                            const struct ieee80211_tx_queue_params *params)
 {
        struct rtl8180_priv *priv = dev->priv;
index edc84f9..c0f6e9c 100644 (file)
@@ -1338,7 +1338,8 @@ static void rtl8187_configure_filter(struct ieee80211_hw *dev,
 }
 
 static int rtl8187_conf_tx(struct ieee80211_hw *dev,
-                          struct ieee80211_vif *vif, u16 queue,
+                          struct ieee80211_vif *vif,
+                          unsigned int link_id, u16 queue,
                           const struct ieee80211_tx_queue_params *params)
 {
        struct rtl8187_priv *priv = dev->priv;
index 65c4cb1..33a1d91 100644 (file)
@@ -5957,7 +5957,8 @@ exit:
 }
 
 static int rtl8xxxu_conf_tx(struct ieee80211_hw *hw,
-                           struct ieee80211_vif *vif, u16 queue,
+                           struct ieee80211_vif *vif,
+                           unsigned int link_id, u16 queue,
                            const struct ieee80211_tx_queue_params *param)
 {
        struct rtl8xxxu_priv *priv = hw->priv;
index 8537cc6..519b264 100644 (file)
@@ -982,7 +982,8 @@ static int _rtl_get_hal_qnum(u16 queue)
  *for rtl819x  BE = 0, BK = 1, VI = 2, VO = 3
  */
 static int rtl_op_conf_tx(struct ieee80211_hw *hw,
-                         struct ieee80211_vif *vif, u16 queue,
+                         struct ieee80211_vif *vif,
+                         unsigned int link_id, u16 queue,
                          const struct ieee80211_tx_queue_params *param)
 {
        struct rtl_priv *rtlpriv = rtl_priv(hw);
index ba60ca7..bb72916 100644 (file)
@@ -443,7 +443,8 @@ static int rtw_ops_start_ap(struct ieee80211_hw *hw,
 }
 
 static int rtw_ops_conf_tx(struct ieee80211_hw *hw,
-                          struct ieee80211_vif *vif, u16 ac,
+                          struct ieee80211_vif *vif,
+                          unsigned int link_id, u16 ac,
                           const struct ieee80211_tx_queue_params *params)
 {
        struct rtw_dev *rtwdev = hw->priv;
index 20fb4c5..f40569c 100644 (file)
@@ -427,7 +427,8 @@ static int rtw89_ops_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
 }
 
 static int rtw89_ops_conf_tx(struct ieee80211_hw *hw,
-                            struct ieee80211_vif *vif, u16 ac,
+                            struct ieee80211_vif *vif,
+                            unsigned int link_id, u16 ac,
                             const struct ieee80211_tx_queue_params *params)
 {
        struct rtw89_dev *rtwdev = hw->priv;
index 1dff3d2..bf39c4b 100644 (file)
@@ -895,7 +895,8 @@ static void rsi_mac80211_conf_filter(struct ieee80211_hw *hw,
  * Return: 0 on success, negative error code on failure.
  */
 static int rsi_mac80211_conf_tx(struct ieee80211_hw *hw,
-                               struct ieee80211_vif *vif, u16 queue,
+                               struct ieee80211_vif *vif,
+                               unsigned int link_id, u16 queue,
                                const struct ieee80211_tx_queue_params *params)
 {
        struct rsi_hw *adapter = hw->priv;
index 47fd887..89402af 100644 (file)
@@ -216,7 +216,8 @@ int wfx_update_pm(struct wfx_vif *wvif)
 }
 
 int wfx_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
-               u16 queue, const struct ieee80211_tx_queue_params *params)
+               unsigned int link_id, u16 queue,
+               const struct ieee80211_tx_queue_params *params)
 {
        struct wfx_dev *wdev = hw->priv;
        struct wfx_vif *wvif = (struct wfx_vif *)vif->drv_priv;
index 93ea992..6558c56 100644 (file)
@@ -36,7 +36,8 @@ void wfx_stop_ap(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 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,
-               u16 queue, const struct ieee80211_tx_queue_params *params);
+               unsigned int link_id, u16 queue,
+               const struct ieee80211_tx_queue_params *params);
 void wfx_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                          struct ieee80211_bss_conf *info, u64 changed);
 int wfx_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct ieee80211_sta *sta);
index a3f6942..26d3614 100644 (file)
@@ -606,7 +606,8 @@ void cw1200_configure_filter(struct ieee80211_hw *dev,
 }
 
 int cw1200_conf_tx(struct ieee80211_hw *dev, struct ieee80211_vif *vif,
-                  u16 queue, const struct ieee80211_tx_queue_params *params)
+                  unsigned int link_id, u16 queue,
+                  const struct ieee80211_tx_queue_params *params)
 {
        struct cw1200_common *priv = dev->priv;
        int ret = 0;
index 05e3ab7..a49f187 100644 (file)
@@ -28,7 +28,8 @@ void cw1200_configure_filter(struct ieee80211_hw *dev,
                             unsigned int *total_flags,
                             u64 multicast);
 int cw1200_conf_tx(struct ieee80211_hw *dev, struct ieee80211_vif *vif,
-                  u16 queue, const struct ieee80211_tx_queue_params *params);
+                  unsigned int link_id, u16 queue,
+                  const struct ieee80211_tx_queue_params *params);
 int cw1200_get_stats(struct ieee80211_hw *dev,
                     struct ieee80211_low_level_stats *stats);
 int cw1200_set_key(struct ieee80211_hw *dev, enum set_key_cmd cmd,
index d765589..9144ef5 100644 (file)
@@ -1282,7 +1282,8 @@ static struct ieee80211_channel wl1251_channels[] = {
 };
 
 static int wl1251_op_conf_tx(struct ieee80211_hw *hw,
-                            struct ieee80211_vif *vif, u16 queue,
+                            struct ieee80211_vif *vif,
+                            unsigned int link_id, u16 queue,
                             const struct ieee80211_tx_queue_params *params)
 {
        enum wl1251_acx_ps_scheme ps_scheme;
index d120008..1edec9f 100644 (file)
@@ -4864,7 +4864,8 @@ out:
 }
 
 static int wl1271_op_conf_tx(struct ieee80211_hw *hw,
-                            struct ieee80211_vif *vif, u16 queue,
+                            struct ieee80211_vif *vif,
+                            unsigned int link_id, u16 queue,
                             const struct ieee80211_tx_queue_params *params)
 {
        struct wl1271 *wl = hw->priv;
index fba06d7..7cf8d58 100644 (file)
@@ -4174,7 +4174,8 @@ struct ieee80211_ops {
                               struct ieee80211_sta *sta,
                               struct station_info *sinfo);
        int (*conf_tx)(struct ieee80211_hw *hw,
-                      struct ieee80211_vif *vif, u16 ac,
+                      struct ieee80211_vif *vif,
+                      unsigned int link_id, u16 ac,
                       const struct ieee80211_tx_queue_params *params);
        u64 (*get_tsf)(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
        void (*set_tsf)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
index aa3a156..fa3b6cc 100644 (file)
@@ -2570,6 +2570,7 @@ static int ieee80211_set_txq_params(struct wiphy *wiphy,
 {
        struct ieee80211_local *local = wiphy_priv(wiphy);
        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+       struct ieee80211_link_data *link = &sdata->deflink;
        struct ieee80211_tx_queue_params p;
 
        if (!local->ops->conf_tx)
@@ -2592,15 +2593,15 @@ static int ieee80211_set_txq_params(struct wiphy *wiphy,
 
        ieee80211_regulatory_limit_wmm_params(sdata, &p, params->ac);
 
-       sdata->tx_conf[params->ac] = p;
-       if (drv_conf_tx(local, sdata, params->ac, &p)) {
+       link->tx_conf[params->ac] = p;
+       if (drv_conf_tx(local, link, params->ac, &p)) {
                wiphy_debug(local->hw.wiphy,
                            "failed to set TX queue parameters for AC %d\n",
                            params->ac);
                return -EINVAL;
        }
 
-       ieee80211_link_info_change_notify(sdata, &sdata->deflink,
+       ieee80211_link_info_change_notify(sdata, link,
                                          BSS_CHANGED_QOS);
 
        return 0;
index 48322e4..9b61dc7 100644 (file)
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
  * Copyright 2015 Intel Deutschland GmbH
+ * Copyright (C) 2022 Intel Corporation
  */
 #include <net/mac80211.h>
 #include "ieee80211_i.h"
@@ -180,9 +181,10 @@ void drv_sta_rc_update(struct ieee80211_local *local,
 }
 
 int drv_conf_tx(struct ieee80211_local *local,
-               struct ieee80211_sub_if_data *sdata, u16 ac,
+               struct ieee80211_link_data *link, u16 ac,
                const struct ieee80211_tx_queue_params *params)
 {
+       struct ieee80211_sub_if_data *sdata = link->sdata;
        int ret = -EOPNOTSUPP;
 
        might_sleep();
@@ -201,10 +203,10 @@ int drv_conf_tx(struct ieee80211_local *local,
                return -EINVAL;
        }
 
-       trace_drv_conf_tx(local, sdata, ac, params);
+       trace_drv_conf_tx(local, sdata, link->link_id, ac, params);
        if (local->ops->conf_tx)
                ret = local->ops->conf_tx(&local->hw, &sdata->vif,
-                                         ac, params);
+                                         link->link_id, ac, params);
        trace_drv_return_int(local, ret);
        return ret;
 }
index ee3ac1a..eb16a35 100644 (file)
@@ -590,7 +590,7 @@ static inline void drv_sta_statistics(struct ieee80211_local *local,
 }
 
 int drv_conf_tx(struct ieee80211_local *local,
-               struct ieee80211_sub_if_data *sdata, u16 ac,
+               struct ieee80211_link_data *link, u16 ac,
                const struct ieee80211_tx_queue_params *params);
 
 u64 drv_get_tsf(struct ieee80211_local *local,
index 561abcf..0a1d51c 100644 (file)
@@ -356,7 +356,7 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
        else
                sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE;
 
-       ieee80211_set_wmm_default(sdata, true, false);
+       ieee80211_set_wmm_default(&sdata->deflink, true, false);
 
        sdata->vif.cfg.ibss_joined = true;
        sdata->vif.cfg.ibss_creator = creator;
index 05996df..699daba 100644 (file)
@@ -969,6 +969,8 @@ struct ieee80211_link_data {
                struct ieee80211_link_data_ap ap;
        } u;
 
+       struct ieee80211_tx_queue_params tx_conf[IEEE80211_NUM_ACS];
+
        struct ieee80211_bss_conf *conf;
 };
 
@@ -1012,7 +1014,6 @@ struct ieee80211_sub_if_data {
        bool control_port_over_nl80211;
 
        atomic_t num_tx_queued;
-       struct ieee80211_tx_queue_params tx_conf[IEEE80211_NUM_ACS];
        struct mac80211_qos_map __rcu *qos_map;
 
        /* used to reconfigure hardware SM PS */
@@ -2101,7 +2102,7 @@ int ieee80211_frame_duration(enum nl80211_band band, size_t len,
 void ieee80211_regulatory_limit_wmm_params(struct ieee80211_sub_if_data *sdata,
                                           struct ieee80211_tx_queue_params *qparam,
                                           int ac);
-void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata,
+void ieee80211_set_wmm_default(struct ieee80211_link_data *link,
                               bool bss_notify, bool enable_qos);
 void ieee80211_xmit(struct ieee80211_sub_if_data *sdata,
                    struct sta_info *sta, struct sk_buff *skb);
index 312a812..f297649 100644 (file)
@@ -1539,7 +1539,7 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)
                 * doesn't start up with sane defaults.
                 * Enable QoS for anything but station interfaces.
                 */
-               ieee80211_set_wmm_default(sdata, true,
+               ieee80211_set_wmm_default(&sdata->deflink, true,
                        sdata->vif.type != NL80211_IFTYPE_STATION);
        }
 
index 5400b3e..44f76a8 100644 (file)
@@ -2018,10 +2018,11 @@ __ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata)
                switch (tx_tspec->action) {
                case TX_TSPEC_ACTION_STOP_DOWNGRADE:
                        /* take the original parameters */
-                       if (drv_conf_tx(local, sdata, ac, &sdata->tx_conf[ac]))
-                               sdata_err(sdata,
-                                         "failed to set TX queue parameters for queue %d\n",
-                                         ac);
+                       if (drv_conf_tx(local, &sdata->deflink, ac,
+                                       &sdata->deflink.tx_conf[ac]))
+                               link_err(&sdata->deflink,
+                                        "failed to set TX queue parameters for queue %d\n",
+                                        ac);
                        tx_tspec->action = TX_TSPEC_ACTION_NONE;
                        tx_tspec->downgraded = false;
                        ret = true;
@@ -2047,11 +2048,11 @@ __ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata)
                         */
                        if (non_acm_ac >= IEEE80211_NUM_ACS)
                                non_acm_ac = IEEE80211_AC_BK;
-                       if (drv_conf_tx(local, sdata, ac,
-                                       &sdata->tx_conf[non_acm_ac]))
-                               sdata_err(sdata,
-                                         "failed to set TX queue parameters for queue %d\n",
-                                         ac);
+                       if (drv_conf_tx(local, &sdata->deflink, ac,
+                                       &sdata->deflink.tx_conf[non_acm_ac]))
+                               link_err(&sdata->deflink,
+                                        "failed to set TX queue parameters for queue %d\n",
+                                        ac);
                        tx_tspec->action = TX_TSPEC_ACTION_NONE;
                        ret = true;
                        schedule_delayed_work(&ifmgd->tx_tspec_wk,
@@ -2085,10 +2086,11 @@ static void ieee80211_sta_handle_tspec_ac_params_wk(struct work_struct *work)
 /* MLME */
 static bool
 ieee80211_sta_wmm_params(struct ieee80211_local *local,
-                        struct ieee80211_sub_if_data *sdata,
+                        struct ieee80211_link_data *link,
                         const u8 *wmm_param, size_t wmm_param_len,
                         const struct ieee80211_mu_edca_param_set *mu_edca)
 {
+       struct ieee80211_sub_if_data *sdata = link->sdata;
        struct ieee80211_tx_queue_params params[IEEE80211_NUM_ACS];
        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
        size_t left;
@@ -2117,11 +2119,11 @@ ieee80211_sta_wmm_params(struct ieee80211_local *local,
         * the driver about it.
         */
        mu_edca_count = mu_edca ? mu_edca->mu_qos_info & 0x0f : -1;
-       if (count == sdata->deflink.u.mgd.wmm_last_param_set &&
-           mu_edca_count == sdata->deflink.u.mgd.mu_edca_last_param_set)
+       if (count == link->u.mgd.wmm_last_param_set &&
+           mu_edca_count == link->u.mgd.mu_edca_last_param_set)
                return false;
-       sdata->deflink.u.mgd.wmm_last_param_set = count;
-       sdata->deflink.u.mgd.mu_edca_last_param_set = mu_edca_count;
+       link->u.mgd.wmm_last_param_set = count;
+       link->u.mgd.mu_edca_last_param_set = mu_edca_count;
 
        pos = wmm_param + 8;
        left = wmm_param_len - 8;
@@ -2219,16 +2221,16 @@ ieee80211_sta_wmm_params(struct ieee80211_local *local,
                         params[ac].aifs, params[ac].cw_min, params[ac].cw_max,
                         params[ac].txop, params[ac].uapsd,
                         ifmgd->tx_tspec[ac].downgraded);
-               sdata->tx_conf[ac] = params[ac];
+               link->tx_conf[ac] = params[ac];
                if (!ifmgd->tx_tspec[ac].downgraded &&
-                   drv_conf_tx(local, sdata, ac, &params[ac]))
-                       sdata_err(sdata,
-                                 "failed to set TX queue parameters for AC %d\n",
-                                 ac);
+                   drv_conf_tx(local, link, ac, &params[ac]))
+                       link_err(link,
+                                "failed to set TX queue parameters for AC %d\n",
+                                ac);
        }
 
        /* enable WMM or activate new settings */
-       sdata->vif.bss_conf.qos = true;
+       link->conf->qos = true;
        return true;
 }
 
@@ -2508,7 +2510,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
        ieee80211_bss_info_change_notify(sdata, changed);
 
        /* disassociated - set to defaults now */
-       ieee80211_set_wmm_default(sdata, false, false);
+       ieee80211_set_wmm_default(&sdata->deflink, false, false);
 
        del_timer_sync(&sdata->u.mgd.conn_mon_timer);
        del_timer_sync(&sdata->u.mgd.bcn_mon_timer);
@@ -3766,12 +3768,13 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
        sdata->deflink.u.mgd.mu_edca_last_param_set = -1;
 
        if (ifmgd->flags & IEEE80211_STA_DISABLE_WMM) {
-               ieee80211_set_wmm_default(sdata, false, false);
-       } else if (!ieee80211_sta_wmm_params(local, sdata, elems->wmm_param,
+               ieee80211_set_wmm_default(&sdata->deflink, false, false);
+       } else if (!ieee80211_sta_wmm_params(local, &sdata->deflink,
+                                            elems->wmm_param,
                                             elems->wmm_param_len,
                                             elems->mu_edca_param_set)) {
                /* still enable QoS since we might have HT/VHT */
-               ieee80211_set_wmm_default(sdata, false, true);
+               ieee80211_set_wmm_default(&sdata->deflink, false, true);
                /* set the disable-WMM flag in this case to disable
                 * tracking WMM parameter changes in the beacon if
                 * the parameters weren't actually valid. Doing so
@@ -3938,7 +3941,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
                /* get uapsd queues configuration */
                uapsd_queues = 0;
                for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
-                       if (sdata->tx_conf[ac].uapsd)
+                       if (sdata->deflink.tx_conf[ac].uapsd)
                                uapsd_queues |= ieee80211_ac_to_qos_mask[ac];
 
                info.success = 1;
@@ -4363,7 +4366,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
                                         elems, true);
 
        if (!(ifmgd->flags & IEEE80211_STA_DISABLE_WMM) &&
-           ieee80211_sta_wmm_params(local, sdata, elems->wmm_param,
+           ieee80211_sta_wmm_params(local, &sdata->deflink, elems->wmm_param,
                                     elems->wmm_param_len,
                                     elems->mu_edca_param_set))
                changed |= BSS_CHANGED_QOS;
index 30f2b34..e7bdcdb 100644 (file)
@@ -293,7 +293,7 @@ static void ieee80211_tdls_add_wmm_param_ie(struct ieee80211_sub_if_data *sdata,
         * doesn't support it, as mandated by 802.11-2012 section 10.22.4
         */
        for (i = 0; i < IEEE80211_NUM_ACS; i++) {
-               txq = &sdata->tx_conf[ieee80211_ac_from_wmm(i)];
+               txq = &sdata->deflink.tx_conf[ieee80211_ac_from_wmm(i)];
                wmm->ac[i].aci_aifsn = ieee80211_wmm_aci_aifsn(txq->aifs,
                                                               txq->acm, i);
                wmm->ac[i].cw = ieee80211_wmm_ecw(txq->cw_min, txq->cw_max);
index 751f08b..b6f12ac 100644 (file)
@@ -1003,13 +1003,15 @@ DEFINE_EVENT(sta_event, drv_sta_rate_tbl_update,
 TRACE_EVENT(drv_conf_tx,
        TP_PROTO(struct ieee80211_local *local,
                 struct ieee80211_sub_if_data *sdata,
+                unsigned int link_id,
                 u16 ac, const struct ieee80211_tx_queue_params *params),
 
-       TP_ARGS(local, sdata, ac, params),
+       TP_ARGS(local, sdata, link_id, ac, params),
 
        TP_STRUCT__entry(
                LOCAL_ENTRY
                VIF_ENTRY
+               __field(unsigned int, link_id)
                __field(u16, ac)
                __field(u16, txop)
                __field(u16, cw_min)
@@ -1021,6 +1023,7 @@ TRACE_EVENT(drv_conf_tx,
        TP_fast_assign(
                LOCAL_ASSIGN;
                VIF_ASSIGN;
+               __entry->link_id = link_id;
                __entry->ac = ac;
                __entry->txop = params->txop;
                __entry->cw_max = params->cw_max;
@@ -1030,8 +1033,8 @@ TRACE_EVENT(drv_conf_tx,
        ),
 
        TP_printk(
-               LOCAL_PR_FMT  VIF_PR_FMT  " AC:%d",
-               LOCAL_PR_ARG, VIF_PR_ARG, __entry->ac
+               LOCAL_PR_FMT  VIF_PR_FMT  " link_id: %d, AC:%d",
+               LOCAL_PR_ARG, VIF_PR_ARG, __entry->link_id, __entry->ac
        )
 );
 
index f065140..2b2c8e1 100644 (file)
@@ -1596,9 +1596,10 @@ void ieee80211_regulatory_limit_wmm_params(struct ieee80211_sub_if_data *sdata,
        rcu_read_unlock();
 }
 
-void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata,
+void ieee80211_set_wmm_default(struct ieee80211_link_data *link,
                               bool bss_notify, bool enable_qos)
 {
+       struct ieee80211_sub_if_data *sdata = link->sdata;
        struct ieee80211_local *local = sdata->local;
        struct ieee80211_tx_queue_params qparam;
        struct ieee80211_chanctx_conf *chanctx_conf;
@@ -1616,7 +1617,7 @@ void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata,
        memset(&qparam, 0, sizeof(qparam));
 
        rcu_read_lock();
-       chanctx_conf = rcu_dereference(sdata->vif.bss_conf.chanctx_conf);
+       chanctx_conf = rcu_dereference(link->conf->chanctx_conf);
        use_11b = (chanctx_conf &&
                   chanctx_conf->def.chan->band == NL80211_BAND_2GHZ) &&
                 !(sdata->flags & IEEE80211_SDATA_OPERATING_GMODE);
@@ -1693,17 +1694,16 @@ void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata,
 
                qparam.uapsd = false;
 
-               sdata->tx_conf[ac] = qparam;
-               drv_conf_tx(local, sdata, ac, &qparam);
+               link->tx_conf[ac] = qparam;
+               drv_conf_tx(local, link, ac, &qparam);
        }
 
        if (sdata->vif.type != NL80211_IFTYPE_MONITOR &&
            sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
            sdata->vif.type != NL80211_IFTYPE_NAN) {
-               sdata->vif.bss_conf.qos = enable_qos;
+               link->conf->qos = enable_qos;
                if (bss_notify)
-                       ieee80211_link_info_change_notify(sdata,
-                                                         &sdata->deflink,
+                       ieee80211_link_info_change_notify(sdata, link,
                                                          BSS_CHANGED_QOS);
        }
 }
@@ -2520,8 +2520,8 @@ int ieee80211_reconfig(struct ieee80211_local *local)
                        fallthrough;
                case NL80211_IFTYPE_AP: /* AP stations are handled later */
                        for (i = 0; i < IEEE80211_NUM_ACS; i++)
-                               drv_conf_tx(local, sdata, i,
-                                           &sdata->tx_conf[i]);
+                               drv_conf_tx(local, &sdata->deflink, i,
+                                           &sdata->deflink.tx_conf[i]);
                        break;
                }