mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-10-29 17:42:41 +00:00
170 lines
5.5 KiB
Diff
170 lines
5.5 KiB
Diff
From d62db23d46d1887aff58c76b0eb9960a46afb9bf Mon Sep 17 00:00:00 2001
|
|
From: Sujuan Chen <sujuan.chen@mediatek.com>
|
|
Date: Tue, 28 Mar 2023 10:53:31 +0800
|
|
Subject: [PATCH 9902/9902] mac80211: mtk: add support for letting drivers
|
|
register tc offload support
|
|
|
|
On newer MediaTek SoCs (e.g. MT7986), WLAN->WLAN or WLAN->Ethernet flows can
|
|
be offloaded by the SoC. In order to support that, the .ndo_setup_tc op is
|
|
needed.
|
|
|
|
Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com>
|
|
---
|
|
include/net/mac80211.h | 9 +++++++++
|
|
net/mac80211/driver-ops.h | 17 +++++++++++++++++
|
|
net/mac80211/ieee80211_i.h | 3 ++-
|
|
net/mac80211/iface.c | 17 +++++++++++++++++
|
|
net/mac80211/trace.h | 25 +++++++++++++++++++++++++
|
|
5 files changed, 70 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
|
|
index cb8b28d..6104072 100755
|
|
--- a/include/net/mac80211.h
|
|
+++ b/include/net/mac80211.h
|
|
@@ -3991,6 +3991,10 @@ struct ieee80211_prep_tx_info {
|
|
* resolve a path for hardware flow offloading
|
|
* @net_fill_receive_path: Called from .ndo_fill_receive_path in order to
|
|
* get a path for hardware flow offloading
|
|
+ * @net_setup_tc: Called from .ndo_setup_tc in order to prepare hardware
|
|
+ * flow offloading for flows originating from the vif.
|
|
+ * Note that the driver must not assume that the vif driver_data is valid
|
|
+ * at this point, since the callback can be called during netdev teardown.
|
|
* @set_qos_map: Set QoS mapping information to driver.
|
|
*/
|
|
struct ieee80211_ops {
|
|
@@ -4332,6 +4336,11 @@ struct ieee80211_ops {
|
|
int (*net_fill_receive_path)(struct ieee80211_hw *hw,
|
|
struct net_device_path_ctx *ctx,
|
|
struct net_device_path *path);
|
|
+ int (*net_setup_tc)(struct ieee80211_hw *hw,
|
|
+ struct ieee80211_vif *vif,
|
|
+ struct net_device *dev,
|
|
+ enum tc_setup_type type,
|
|
+ void *type_data);
|
|
int (*set_qos_map)(struct ieee80211_vif *vif,
|
|
struct cfg80211_qos_map *qos_map);
|
|
};
|
|
diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h
|
|
index 348f815..f56a71f 100644
|
|
--- a/net/mac80211/driver-ops.h
|
|
+++ b/net/mac80211/driver-ops.h
|
|
@@ -1536,6 +1536,23 @@ static inline int drv_net_fill_receive_path(struct ieee80211_local *local,
|
|
return ret;
|
|
}
|
|
|
|
+static inline int drv_net_setup_tc(struct ieee80211_local *local,
|
|
+ struct ieee80211_sub_if_data *sdata,
|
|
+ struct net_device *dev,
|
|
+ enum tc_setup_type type, void *type_data)
|
|
+{
|
|
+ int ret = -EOPNOTSUPP;
|
|
+
|
|
+ sdata = get_bss_sdata(sdata);
|
|
+ trace_drv_net_setup_tc(local, sdata, type);
|
|
+ if (local->ops->net_setup_tc)
|
|
+ ret = local->ops->net_setup_tc(&local->hw, &sdata->vif, dev,
|
|
+ type, type_data);
|
|
+ trace_drv_return_int(local, ret);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
static inline int drv_set_qos_map(struct ieee80211_local *local,
|
|
struct ieee80211_sub_if_data *sdata,
|
|
struct cfg80211_qos_map *qos_map)
|
|
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
|
|
index bb5906d..b02ca21 100644
|
|
--- a/net/mac80211/ieee80211_i.h
|
|
+++ b/net/mac80211/ieee80211_i.h
|
|
@@ -1824,7 +1824,8 @@ void ieee80211_color_aging_work(struct work_struct *work);
|
|
/* interface handling */
|
|
#define MAC80211_SUPPORTED_FEATURES_TX (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | \
|
|
NETIF_F_HW_CSUM | NETIF_F_SG | \
|
|
- NETIF_F_HIGHDMA | NETIF_F_GSO_SOFTWARE)
|
|
+ NETIF_F_HIGHDMA | NETIF_F_GSO_SOFTWARE | \
|
|
+ NETIF_F_HW_TC)
|
|
#define MAC80211_SUPPORTED_FEATURES_RX (NETIF_F_RXCSUM)
|
|
#define MAC80211_SUPPORTED_FEATURES (MAC80211_SUPPORTED_FEATURES_TX | \
|
|
MAC80211_SUPPORTED_FEATURES_RX)
|
|
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
|
|
index c08bfbe..ddeaa8f 100644
|
|
--- a/net/mac80211/iface.c
|
|
+++ b/net/mac80211/iface.c
|
|
@@ -795,6 +795,21 @@ static int __change_mtu(struct net_device *ndev, int new_mtu){
|
|
}
|
|
#endif
|
|
|
|
+static int ieee80211_netdev_setup_tc(struct net_device *dev,
|
|
+ enum tc_setup_type type, void *type_data)
|
|
+{
|
|
+ struct ieee80211_sub_if_data *sdata;
|
|
+ struct ieee80211_local *local;
|
|
+
|
|
+ sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
|
+ local = sdata->local;
|
|
+
|
|
+ if (!local->ops->net_setup_tc)
|
|
+ return -EOPNOTSUPP;
|
|
+
|
|
+ return drv_net_setup_tc(local, sdata, dev, type, type_data);
|
|
+}
|
|
+
|
|
static const struct net_device_ops ieee80211_dataif_ops = {
|
|
#if LINUX_VERSION_IS_LESS(4,10,0)
|
|
.ndo_change_mtu = __change_mtu,
|
|
@@ -812,6 +827,7 @@ static const struct net_device_ops ieee80211_dataif_ops = {
|
|
#else
|
|
.ndo_get_stats64 = bp_ieee80211_get_stats64,
|
|
#endif
|
|
+ .ndo_setup_tc = ieee80211_netdev_setup_tc,
|
|
|
|
};
|
|
|
|
@@ -975,6 +991,7 @@ static const struct net_device_ops ieee80211_dataif_8023_ops = {
|
|
#endif
|
|
.ndo_fill_forward_path = ieee80211_netdev_fill_forward_path,
|
|
.ndo_fill_receive_path = ieee80211_netdev_fill_receive_path,
|
|
+ .ndo_setup_tc = ieee80211_netdev_setup_tc,
|
|
};
|
|
|
|
static bool ieee80211_iftype_supports_hdr_offload(enum nl80211_iftype iftype)
|
|
diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h
|
|
index 6b7b46b..5aea24a 100644
|
|
--- a/net/mac80211/trace.h
|
|
+++ b/net/mac80211/trace.h
|
|
@@ -2906,6 +2906,31 @@ DEFINE_EVENT(sta_event, drv_net_fill_forward_path,
|
|
TP_ARGS(local, sdata, sta)
|
|
);
|
|
|
|
+TRACE_EVENT(drv_net_setup_tc,
|
|
+ TP_PROTO(struct ieee80211_local *local,
|
|
+ struct ieee80211_sub_if_data *sdata,
|
|
+ u8 type),
|
|
+
|
|
+ TP_ARGS(local, sdata, type),
|
|
+
|
|
+ TP_STRUCT__entry(
|
|
+ LOCAL_ENTRY
|
|
+ VIF_ENTRY
|
|
+ __field(u8, type)
|
|
+ ),
|
|
+
|
|
+ TP_fast_assign(
|
|
+ LOCAL_ASSIGN;
|
|
+ VIF_ASSIGN;
|
|
+ __entry->type = type;
|
|
+ ),
|
|
+
|
|
+ TP_printk(
|
|
+ LOCAL_PR_FMT VIF_PR_FMT " type:%d\n",
|
|
+ LOCAL_PR_ARG, VIF_PR_ARG, __entry->type
|
|
+ )
|
|
+);
|
|
+
|
|
TRACE_EVENT(bss_color_bitmap,
|
|
TP_PROTO(u8 color,
|
|
u64 color_bitmap),
|
|
--
|
|
2.18.0
|
|
|