From e82fddcf0e51ecb9475d79fddce33bf96b7a2a8d Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Thu, 8 Jul 2021 12:27:04 +0800 Subject: [PATCH] mac80211: add support for NSS firmware --- package/kernel/mac80211/Makefile | 14 +- ...-mac80211-add-option-for-NSS-support.patch | 234 ++++++++++++++++++ target/linux/mvebu/image/cortexa9.mk | 2 +- 3 files changed, 247 insertions(+), 3 deletions(-) create mode 100644 package/kernel/mac80211/patches/subsys/999-mac80211-add-option-for-NSS-support.patch diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile index 6fb6de56a..fc892c507 100644 --- a/package/kernel/mac80211/Makefile +++ b/package/kernel/mac80211/Makefile @@ -84,6 +84,7 @@ config-$(CONFIG_PACKAGE_CFG80211_TESTMODE) += NL80211_TESTMODE config-$(call config_package,mac80211) += MAC80211 config-$(CONFIG_PACKAGE_MAC80211_MESH) += MAC80211_MESH +config-$(CONFIG_PACKAGE_MAC80211_NSS_SUPPORT) += MAC80211_NSS_SUPPORT include ath.mk include broadcom.mk @@ -127,7 +128,7 @@ define KernelPackage/mac80211 $(call KernelPackage/mac80211/Default) TITLE:=Linux 802.11 Wireless Networking Stack # +kmod-crypto-cmac is a runtime only dependency of net/mac80211/aes_cmac.c - DEPENDS+= +kmod-cfg80211 +kmod-crypto-cmac +kmod-crypto-ccm +kmod-crypto-gcm +hostapd-common + DEPENDS+= +kmod-cfg80211 +kmod-crypto-cmac +kmod-crypto-ccm +kmod-crypto-gcm +hostapd-common +PACKAGE_kmod-qca-nss-drv:kmod-qca-nss-drv KCONFIG:=\ CONFIG_AVERAGE=y FILES:= $(PKG_BUILD_DIR)/net/mac80211/mac80211.ko @@ -137,6 +138,14 @@ endef define KernelPackage/mac80211/config if PACKAGE_kmod-mac80211 + + if PACKAGE_kmod-qca-nss-drv + config PACKAGE_MAC80211_NSS_SUPPORT + bool "Enable NSS support for IPQ platform" + default y + help + This option enables support for NSS in boards. + endif config PACKAGE_MAC80211_DEBUGFS bool "Export mac80211 internals in DebugFS" @@ -436,7 +445,8 @@ config-$(CONFIG_LEDS_TRIGGERS) += MAC80211_LEDS MAKE_OPTS:= -C "$(PKG_BUILD_DIR)" \ $(KERNEL_MAKE_FLAGS) \ - EXTRA_CFLAGS="-I$(PKG_BUILD_DIR)/include $(IREMAP_CFLAGS)" \ + EXTRA_CFLAGS="-I$(PKG_BUILD_DIR)/include $(IREMAP_CFLAGS) \ + -I$(STAGING_DIR)/usr/include/qca-nss-drv" \ KLIB_BUILD="$(LINUX_DIR)" \ MODPROBE=true \ KLIB=$(TARGET_MODULES_DIR) \ diff --git a/package/kernel/mac80211/patches/subsys/999-mac80211-add-option-for-NSS-support.patch b/package/kernel/mac80211/patches/subsys/999-mac80211-add-option-for-NSS-support.patch new file mode 100644 index 000000000..dd3768c41 --- /dev/null +++ b/package/kernel/mac80211/patches/subsys/999-mac80211-add-option-for-NSS-support.patch @@ -0,0 +1,234 @@ +--- a/net/mac80211/Kconfig 2019-01-03 21:03:17.839001000 +0800 ++++ b/net/mac80211/Kconfig 2019-01-03 21:04:43.931001000 +0800 +@@ -16,6 +16,13 @@ + + if MAC80211 != n + ++config MAC80211_NSS_SUPPORT ++ bool "Enable NSS support for IPQ platform" ++ default n ++ ---help--- ++ This option enables support for NSS in boards ++ like AP148. ++ + config MAC80211_HAS_RC + bool + +--- a/local-symbols 2019-01-03 21:24:00.087001000 +0800 ++++ b/local-symbols 2019-01-03 21:24:56.535001000 +0800 +@@ -47,6 +47,7 @@ LIB80211_CRYPT_CCMP= + LIB80211_CRYPT_TKIP= + LIB80211_DEBUG= + MAC80211= ++MAC80211_NSS_SUPPORT= + MAC80211_HAS_RC= + MAC80211_RC_MINSTREL= + MAC80211_RC_DEFAULT_MINSTREL= +--- a/net/mac80211/ieee80211_i.h 2019-01-03 21:04:57.527001000 +0800 ++++ b/net/mac80211/ieee80211_i.h 2019-01-03 21:05:44.827001000 +0800 +@@ -35,6 +35,10 @@ + + extern const struct cfg80211_ops mac80211_config_ops; + ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT ++#include ++#endif ++ + struct ieee80211_local; + + /* Maximum number of broadcast/multicast frames to buffer when some of the +@@ -988,6 +992,10 @@ struct ieee80211_sub_if_data { + + bool hw_80211_encap; + ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT ++ struct nss_virt_if_handle *nssctx; ++#endif ++ + /* must be last, dynamically sized area in this! */ + struct ieee80211_vif vif; + }; +--- a/net/mac80211/iface.c 2019-01-03 21:06:00.007001000 +0800 ++++ b/net/mac80211/iface.c 2019-01-03 21:08:49.535001000 +0800 +@@ -15,6 +15,7 @@ + #include + #include + #include ++#include + #include + #include + #include "ieee80211_i.h" +@@ -26,6 +27,12 @@ + #include "wme.h" + #include "rate.h" + ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT ++bool is_nss_enable = true; ++module_param(is_nss_enable, bool, 0644); ++MODULE_PARM_DESC(is_nss_enable, "NSS enable module param"); ++#endif ++ + /** + * DOC: Interface list locking + * +@@ -645,6 +652,13 @@ + { + struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); + ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT ++ if (sdata->nssctx) { ++ nss_virt_if_destroy_sync(sdata->nssctx); ++ sdata_info(sdata, "Destroyed NSS virtual interface\n"); ++ } ++#endif ++ + ieee80211_do_stop(sdata, true); + + return 0; +@@ -1343,6 +1357,18 @@ + + ieee80211_recalc_ps(local); + ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT ++ if (is_nss_enable) { ++ sdata->nssctx = nss_virt_if_create_sync(dev); ++ if (sdata->nssctx) ++ sdata_info(sdata, "Created a NSS virtual interface\n"); ++ else ++ sdata_err(sdata, "Failed to create a NSS virtual interface\n"); ++ } else { ++ sdata->nssctx = NULL; ++ } ++#endif ++ + if (sdata->vif.type == NL80211_IFTYPE_MONITOR || + sdata->vif.type == NL80211_IFTYPE_AP_VLAN || + local->ops->wake_tx_queue) { +--- a/net/mac80211/rx.c 2019-01-03 21:09:29.503001000 +0800 ++++ b/net/mac80211/rx.c 2019-01-03 21:17:42.463001000 +0800 +@@ -32,6 +32,10 @@ + #include "wme.h" + #include "rate.h" + ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT ++extern bool is_nss_enable; ++#endif ++ + static inline void ieee80211_rx_stats(struct net_device *dev, u32 len) + { + struct pcpu_sw_netstats *tstats = this_cpu_ptr(netdev_tstats(dev)); +@@ -42,6 +46,63 @@ + u64_stats_update_end(&tstats->syncp); + } + ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT ++ ++#define case_rtn_string(val) case val: return #val ++ ++static const char *nss_tx_status_str(nss_tx_status_t status) ++{ ++ switch (status) { ++ case_rtn_string(NSS_TX_SUCCESS); ++ case_rtn_string(NSS_TX_FAILURE); ++ case_rtn_string(NSS_TX_FAILURE_QUEUE); ++ case_rtn_string(NSS_TX_FAILURE_NOT_READY); ++ case_rtn_string(NSS_TX_FAILURE_TOO_LARGE); ++ case_rtn_string(NSS_TX_FAILURE_TOO_SHORT); ++ case_rtn_string(NSS_TX_FAILURE_NOT_SUPPORTED); ++ case_rtn_string(NSS_TX_FAILURE_BAD_PARAM); ++ case_rtn_string(NSS_TX_FAILURE_NOT_ENABLED); ++ case_rtn_string(NSS_TX_FAILURE_SYNC_BAD_PARAM); ++ case_rtn_string(NSS_TX_FAILURE_SYNC_TIMEOUT); ++ case_rtn_string(NSS_TX_FAILURE_SYNC_FW_ERR); ++ default: ++ return "Unknown NSS TX status"; ++ } ++} ++ ++static void netif_rx_nss(struct ieee80211_sub_if_data *sdata, ++ struct sk_buff *skb) ++{ ++ int ret; ++ int push_mac_header = 0; ++ ++ if (!sdata->nssctx) ++ goto out; ++ ++ if (unlikely((skb->data - skb_mac_header(skb)) == ETH_HLEN)) { ++ skb_push(skb, ETH_HLEN); ++ push_mac_header = 1; ++ } ++ ++ ret = nss_virt_if_tx_buf(sdata->nssctx, skb); ++ if (ret) { ++ if (net_ratelimit()) { ++ sdata_err(sdata, "NSS TX failed with error[%d]: %s\n", ret, ++ nss_tx_status_str(ret)); ++ } ++ goto out; ++ } ++ ++ return; ++out: ++ if (unlikely(push_mac_header)) { ++ skb_pull(skb, ETH_HLEN); ++ } ++ netif_receive_skb(skb); ++} ++#endif ++ ++ + /* + * monitor mode reception + * +@@ -2604,6 +2665,16 @@ + ether_addr_copy(ehdr->h_dest, sdata->vif.addr); + + /* deliver to local stack */ ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT ++ if (likely(is_nss_enable)) ++ netif_rx_nss(sdata, skb); ++ else { ++ if (rx->napi) ++ napi_gro_receive(rx->napi, skb); ++ else ++ netif_receive_skb(skb); ++ } ++#else + if (rx->list) + #if LINUX_VERSION_IS_GEQ(4,19,0) + list_add_tail(&skb->list, rx->list); +@@ -2612,6 +2683,7 @@ + #endif + else + netif_receive_skb(skb); ++#endif + } + } + +@@ -4461,6 +4533,16 @@ + /* deliver to local stack */ + skb->protocol = eth_type_trans(skb, fast_rx->dev); + memset(skb->cb, 0, sizeof(skb->cb)); ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT ++ if (likely(is_nss_enable)) ++ netif_rx_nss(rx->sdata, skb); ++ else { ++ if (rx->napi) ++ napi_gro_receive(rx->napi, skb); ++ else ++ netif_receive_skb(skb); ++ } ++#else + if (rx->list) + #if LINUX_VERSION_IS_GEQ(4,19,0) + list_add_tail(&skb->list, rx->list); +@@ -4469,7 +4551,7 @@ + #endif + else + netif_receive_skb(skb); +- ++#endif + } + + static bool ieee80211_invoke_fast_rx(struct ieee80211_rx_data *rx, \ No newline at end of file diff --git a/target/linux/mvebu/image/cortexa9.mk b/target/linux/mvebu/image/cortexa9.mk index 3f227259e..71f485aee 100644 --- a/target/linux/mvebu/image/cortexa9.mk +++ b/target/linux/mvebu/image/cortexa9.mk @@ -77,7 +77,7 @@ TARGET_DEVICES += kobol_helios4 define Device/linksys $(Device/NAND-128K) DEVICE_VENDOR := Linksys - DEVICE_PACKAGES := kmod-mwlwifi wpad-basic-wolfssl + DEVICE_PACKAGES := kmod-mwlwifi wpad-openssl luci-app-advanced-reboot automount autosamba IMAGES += factory.img IMAGE/factory.img := append-kernel | pad-to $$$$(KERNEL_SIZE) | \ append-ubi | pad-to $$$$(PAGESIZE)