Implement drv_set_tid_config api to allow TID specific configuration and drv_reset_tid_config api to reset peer specific TID configuration. This per-TID onfiguration will be applied for all the connected stations when MAC is NULL.
Unified · Split
| @@ -3776,6 +3776,9 @@ enum ieee80211_reconfig_type { · 3775 unmodified lines | ||
| 3776 | 3776 | * |
| 3777 | 3777 | * @start_pmsr: start peer measurement (e.g. FTM) (this call can sleep) |
| 3778 | 3778 | * @abort_pmsr: abort peer measurement (this call can sleep) |
| 3779 | + * @set_tid_config: Apply TID specific configurations. This callback may sleep. | |
| 3780 | + * @reset_tid_config: Reset TID specific configuration for the peer. | |
| 3781 | + * This callback may sleep. | |
| 3779 | 3782 | */ |
| 3780 | 3783 | struct ieee80211_ops { |
| 3781 | 3784 | void (*tx)(struct ieee80211_hw *hw, |
| @@ -4080,6 +4083,13 @@ struct ieee80211_ops { · 298 unmodified lines | ||
| 4080 | 4083 | struct cfg80211_pmsr_request *request); |
| 4081 | 4084 | void (*abort_pmsr)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, |
| 4082 | 4085 | struct cfg80211_pmsr_request *request); |
| 4086 | + int (*set_tid_config)(struct ieee80211_hw *hw, | |
| 4087 | + struct ieee80211_vif *vif, | |
| 4088 | + struct ieee80211_sta *sta, | |
| 4089 | + struct cfg80211_tid_config *tid_conf); | |
| 4090 | + int (*reset_tid_config)(struct ieee80211_hw *hw, | |
| 4091 | + struct ieee80211_vif *vif, | |
| 4092 | + struct ieee80211_sta *sta, u8 tids); | |
| 4083 | 4093 | }; |
| 4084 | 4094 | |
| 4085 | 4095 | /** |
| @@ -3886,6 +3886,60 @@ ieee80211_abort_pmsr(struct wiphy *wiphy, struct wireless_dev *dev, · 3885 unmodified lines | ||
| 3886 | 3886 | return drv_abort_pmsr(local, sdata, request); |
| 3887 | 3887 | } |
| 3888 | 3888 | |
| 3889 | +static int ieee80211_set_tid_config(struct wiphy *wiphy, | |
| 3890 | + struct net_device *dev, | |
| 3891 | + struct cfg80211_tid_config *tid_conf) | |
| 3892 | +{ | |
| 3893 | + struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); | |
| 3894 | + struct sta_info *sta; | |
| 3895 | + int ret; | |
| 3896 | + | |
| 3897 | + if (!sdata->local->ops->set_tid_config) | |
| 3898 | + return -EOPNOTSUPP; | |
| 3899 | + | |
| 3900 | + if (!tid_conf->peer) | |
| 3901 | + return drv_set_tid_config(sdata->local, sdata, NULL, tid_conf); | |
| 3902 | + | |
| 3903 | + mutex_lock(&sdata->local->sta_mtx); | |
| 3904 | + sta = sta_info_get_bss(sdata, tid_conf->peer); | |
| 3905 | + if (!sta) { | |
| 3906 | + mutex_unlock(&sdata->local->sta_mtx); | |
| 3907 | + return -ENOENT; | |
| 3908 | + } | |
| 3909 | + | |
| 3910 | + ret = drv_set_tid_config(sdata->local, sdata, &sta->sta, tid_conf); | |
| 3911 | + mutex_unlock(&sdata->local->sta_mtx); | |
| 3912 | + | |
| 3913 | + return ret; | |
| 3914 | +} | |
| 3915 | + | |
| 3916 | +static int ieee80211_reset_tid_config(struct wiphy *wiphy, | |
| 3917 | + struct net_device *dev, | |
| 3918 | + const u8 *peer, u8 tid) | |
| 3919 | +{ | |
| 3920 | + struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); | |
| 3921 | + struct sta_info *sta; | |
| 3922 | + int ret; | |
| 3923 | + | |
| 3924 | + if (!sdata->local->ops->reset_tid_config) | |
| 3925 | + return -EOPNOTSUPP; | |
| 3926 | + | |
| 3927 | + if (!peer) | |
| 3928 | + return drv_reset_tid_config(sdata->local, sdata, NULL, tid); | |
| 3929 | + | |
| 3930 | + mutex_lock(&sdata->local->sta_mtx); | |
| 3931 | + sta = sta_info_get_bss(sdata, peer); | |
| 3932 | + if (!sta) { | |
| 3933 | + mutex_unlock(&sdata->local->sta_mtx); | |
| 3934 | + return -ENOENT; | |
| 3935 | + } | |
| 3936 | + | |
| 3937 | + ret = drv_reset_tid_config(sdata->local, sdata, &sta->sta, tid); | |
| 3938 | + mutex_unlock(&sdata->local->sta_mtx); | |
| 3939 | + | |
| 3940 | + return ret; | |
| 3941 | +} | |
| 3942 | + | |
| 3889 | 3943 | const struct cfg80211_ops mac80211_config_ops = { |
| 3890 | 3944 | .add_virtual_intf = ieee80211_add_iface, |
| 3891 | 3945 | .del_virtual_intf = ieee80211_del_iface, |
| @@ -3986,4 +4040,6 @@ const struct cfg80211_ops mac80211_config_ops = { · 94 unmodified lines | ||
| 3986 | 4040 | .start_pmsr = ieee80211_start_pmsr, |
| 3987 | 4041 | .abort_pmsr = ieee80211_abort_pmsr, |
| 3988 | 4042 | .probe_mesh_link = ieee80211_probe_mesh_link, |
| 4043 | + .set_tid_config = ieee80211_set_tid_config, | |
| 4044 | + .reset_tid_config = ieee80211_reset_tid_config, | |
| 3989 | 4045 | }; |
| @@ -1358,4 +1358,31 @@ static inline void drv_del_nan_func(struct ieee80211_local *local, · 1357 unmodified lines | ||
| 1358 | 1358 | trace_drv_return_void(local); |
| 1359 | 1359 | } |
| 1360 | 1360 | |
| 1361 | +static inline int drv_set_tid_config(struct ieee80211_local *local, | |
| 1362 | + struct ieee80211_sub_if_data *sdata, | |
| 1363 | + struct ieee80211_sta *sta, | |
| 1364 | + struct cfg80211_tid_config *tid_conf) | |
| 1365 | +{ | |
| 1366 | + int ret; | |
| 1367 | + | |
| 1368 | + might_sleep(); | |
| 1369 | + ret = local->ops->set_tid_config(&local->hw, &sdata->vif, sta, | |
| 1370 | + tid_conf); | |
| 1371 | + trace_drv_return_int(local, ret); | |
| 1372 | + | |
| 1373 | + return ret; | |
| 1374 | +} | |
| 1375 | + | |
| 1376 | +static inline int drv_reset_tid_config(struct ieee80211_local *local, | |
| 1377 | + struct ieee80211_sub_if_data *sdata, | |
| 1378 | + struct ieee80211_sta *sta, u8 tid) | |
| 1379 | +{ | |
| 1380 | + int ret; | |
| 1381 | + | |
| 1382 | + might_sleep(); | |
| 1383 | + ret = local->ops->reset_tid_config(&local->hw, &sdata->vif, sta, tid); | |
| 1384 | + trace_drv_return_int(local, ret); | |
| 1385 | + | |
| 1386 | + return ret; | |
| 1387 | +} | |
| 1361 | 1388 | #endif /* __MAC80211_DRIVER_OPS */ |