mac80211-NSS.patch 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. From fc0a9dd3c5f4e6a545b98239affd1d1e3f8c55ca Mon Sep 17 00:00:00 2001
  2. From: ACwifidude <[email protected]>
  3. Date: Fri, 30 Sep 2022 11:33:18 -0500
  4. Subject: [PATCH] ipq806x: NSS Hardware Offloading mac80211 support
  5. ---
  6. package/kernel/mac80211/Makefile | 22 +-
  7. .../subsys/999-mac80211-NSS-support.patch | 292 ++++++++++++++++++
  8. 2 files changed, 310 insertions(+), 4 deletions(-)
  9. create mode 100644 package/kernel/mac80211/patches/subsys/999-mac80211-NSS-support.patch
  10. diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile
  11. index 248b48c3c15..d1840c91758 100644
  12. --- a/package/kernel/mac80211/Makefile
  13. +++ b/package/kernel/mac80211/Makefile
  14. @@ -78,6 +78,7 @@ config-$(CONFIG_PACKAGE_CFG80211_TESTMODE) += NL80211_TESTMODE
  15. config-$(call config_package,mac80211) += MAC80211
  16. config-$(CONFIG_PACKAGE_MAC80211_MESH) += MAC80211_MESH
  17. +config-$(CONFIG_PACKAGE_MAC80211_NSS_SUPPORT) += MAC80211_NSS_SUPPORT
  18. include ath.mk
  19. include broadcom.mk
  20. @@ -121,7 +122,7 @@ define KernelPackage/mac80211
  21. $(call KernelPackage/mac80211/Default)
  22. TITLE:=Linux 802.11 Wireless Networking Stack
  23. # +kmod-crypto-cmac is a runtime only dependency of net/mac80211/aes_cmac.c
  24. - DEPENDS+= +kmod-cfg80211 +kmod-crypto-cmac +kmod-crypto-ccm +kmod-crypto-gcm +hostapd-common
  25. + DEPENDS+= +kmod-cfg80211 +kmod-crypto-cmac +kmod-crypto-ccm +kmod-crypto-gcm +hostapd-common +PACKAGE_kmod-qca-nss-drv:kmod-qca-nss-drv
  26. KCONFIG:=\
  27. CONFIG_AVERAGE=y
  28. FILES:= $(PKG_BUILD_DIR)/net/mac80211/mac80211.ko
  29. @@ -132,6 +133,16 @@ endef
  30. define KernelPackage/mac80211/config
  31. if PACKAGE_kmod-mac80211
  32. + if PACKAGE_kmod-qca-nss-drv
  33. + config PACKAGE_MAC80211_NSS_SUPPORT
  34. + bool "Enable NSS support for IPQ platform"
  35. + default y
  36. + help
  37. + This option enables support for NSS in boards
  38. + like Netgear R7800.
  39. + endif
  40. +
  41. +
  42. config PACKAGE_MAC80211_DEBUGFS
  43. bool "Export mac80211 internals in DebugFS"
  44. select KERNEL_DEBUG_FS
  45. @@ -273,9 +284,12 @@ ifeq ($(BUILD_VARIANT),smallbuffers)
  46. C_DEFINES+= -DCONFIG_ATH10K_SMALLBUFFERS
  47. endif
  48. -MAKE_OPTS:= \
  49. - $(subst -C $(LINUX_DIR),-C "$(PKG_BUILD_DIR)",$(KERNEL_MAKEOPTS)) \
  50. - EXTRA_CFLAGS="-I$(PKG_BUILD_DIR)/include $(IREMAP_CFLAGS) $(C_DEFINES)" \
  51. +C_DEFINES+= -DSTANDALONE_CT
  52. +
  53. +MAKE_OPTS:= -C "$(PKG_BUILD_DIR)" \
  54. + $(KERNEL_MAKE_FLAGS) \
  55. + EXTRA_CFLAGS="-I$(PKG_BUILD_DIR)/include $(IREMAP_CFLAGS) $(C_DEFINES) \
  56. + -I$(STAGING_DIR)/usr/include/qca-nss-drv" \
  57. KLIB_BUILD="$(LINUX_DIR)" \
  58. MODPROBE=true \
  59. KLIB=$(TARGET_MODULES_DIR) \
  60. diff --git a/package/kernel/mac80211/patches/subsys/999-mac80211-NSS-support.patch b/package/kernel/mac80211/patches/subsys/999-mac80211-NSS-support.patch
  61. new file mode 100644
  62. index 00000000000..a0c1720c71a
  63. --- /dev/null
  64. +++ b/package/kernel/mac80211/patches/subsys/999-mac80211-NSS-support.patch
  65. @@ -0,0 +1,344 @@
  66. +--- a/net/mac80211/Kconfig
  67. ++++ b/net/mac80211/Kconfig
  68. +@@ -19,6 +19,13 @@ comment "CFG80211 needs to be enabled fo
  69. +
  70. + if MAC80211 != n
  71. +
  72. ++config MAC80211_NSS_SUPPORT
  73. ++ bool "Enable NSS support for IPQ platform"
  74. ++ default n
  75. ++ ---help---
  76. ++ This option enables support for NSS in boards
  77. ++ like AP148.
  78. ++
  79. + config MAC80211_HAS_RC
  80. + bool
  81. +
  82. +--- a/local-symbols
  83. ++++ b/local-symbols
  84. +@@ -39,6 +39,7 @@ LIB80211_CRYPT_CCMP=
  85. + LIB80211_CRYPT_TKIP=
  86. + LIB80211_DEBUG=
  87. + MAC80211=
  88. ++MAC80211_NSS_SUPPORT=
  89. + MAC80211_HAS_RC=
  90. + MAC80211_RC_MINSTREL=
  91. + MAC80211_RC_DEFAULT_MINSTREL=
  92. +--- a/net/mac80211/ieee80211_i.h
  93. ++++ b/net/mac80211/ieee80211_i.h
  94. +@@ -36,6 +36,10 @@
  95. +
  96. + extern const struct cfg80211_ops mac80211_config_ops;
  97. +
  98. ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT
  99. ++#include <nss_api_if.h>
  100. ++#endif
  101. ++
  102. + struct ieee80211_local;
  103. +
  104. + /* Maximum number of broadcast/multicast frames to buffer when some of the
  105. +@@ -1097,6 +1101,12 @@ struct ieee80211_sub_if_data {
  106. + } debugfs;
  107. + #endif
  108. +
  109. ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT
  110. ++ struct nss_virt_if_handle *nssctx;
  111. ++ struct sk_buff_head rx_queue;
  112. ++ struct work_struct rx_work;
  113. ++#endif
  114. ++
  115. + /* must be last, dynamically sized area in this! */
  116. + struct ieee80211_vif vif;
  117. + };
  118. +--- a/net/mac80211/iface.c
  119. ++++ b/net/mac80211/iface.c
  120. +@@ -15,6 +15,7 @@
  121. + #include <linux/if_arp.h>
  122. + #include <linux/netdevice.h>
  123. + #include <linux/rtnetlink.h>
  124. ++#include <linux/module.h>
  125. + #include <linux/kcov.h>
  126. + #include <net/mac80211.h>
  127. + #include <net/ieee80211_radiotap.h>
  128. +@@ -27,6 +28,12 @@
  129. + #include "wme.h"
  130. + #include "rate.h"
  131. +
  132. ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT
  133. ++bool nss_redirect = true;
  134. ++module_param(nss_redirect, bool, 0644);
  135. ++MODULE_PARM_DESC(nss_redirect, "module param to enable NSS Redirect; 1-enable, 0-disable");
  136. ++#endif
  137. ++
  138. + /**
  139. + * DOC: Interface list locking
  140. + *
  141. +@@ -439,6 +446,64 @@ static int ieee80211_open(struct net_dev
  142. + return err;
  143. + }
  144. +
  145. ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT
  146. ++/* This callback is registered for nss redirect to receive packet exceptioned from nss in Rx path.
  147. ++ * When packet does not match any of the ecm rules is redirected back here.
  148. ++ */
  149. ++void receive_from_nss(struct net_device *dev, struct sk_buff *sk_buff, struct napi_struct *napi)
  150. ++{
  151. ++ struct net_device *netdev;
  152. ++ struct sk_buff *skb;
  153. ++ struct ieee80211_sub_if_data *sdata;
  154. ++
  155. ++ if (!dev) {
  156. ++ kfree(sk_buff);
  157. ++ return;
  158. ++ }
  159. ++
  160. ++ netdev = (struct net_device *)dev;
  161. ++ sdata = netdev_priv(netdev);
  162. ++ if (sdata->dev != dev) {
  163. ++ kfree(sk_buff);
  164. ++ return;
  165. ++ }
  166. ++ skb = (struct sk_buff *)sk_buff;
  167. ++ skb->dev = netdev;
  168. ++ skb->protocol = eth_type_trans(skb, netdev);
  169. ++ napi_gro_receive(napi, skb);
  170. ++}
  171. ++
  172. ++static int ieee80211_create_nss_virtif(struct ieee80211_sub_if_data *sdata, struct net_device *dev)
  173. ++{
  174. ++ if (sdata->nssctx != NULL) {
  175. ++ sdata_err(sdata, "Cannot create a NSS virtual interface. Already exists[n2h:%d, h2n:%d]!\n",
  176. ++ sdata->nssctx->if_num_n2h, sdata->nssctx->if_num_h2n);
  177. ++ return 1;
  178. ++ }
  179. ++
  180. ++ sdata->nssctx = NULL;
  181. ++ if (nss_redirect) {
  182. ++ sdata->nssctx = nss_virt_if_create_sync(dev);
  183. ++ if (sdata->nssctx) {
  184. ++ sdata_info(sdata, "Created a NSS virtual interface\n");
  185. ++ nss_virt_if_register(sdata->nssctx, receive_from_nss, sdata->dev);
  186. ++ }
  187. ++ else
  188. ++ sdata_err(sdata, "Failed to create a NSS virtual interface\n");
  189. ++ }
  190. ++
  191. ++ return 0;
  192. ++}
  193. ++
  194. ++static void ieee80211_destroy_nss_virtif(struct ieee80211_sub_if_data *sdata)
  195. ++{
  196. ++ if (sdata->nssctx) {
  197. ++ nss_virt_if_destroy_sync(sdata->nssctx);
  198. ++ sdata_info(sdata, "Destroyed NSS virtual interface\n");
  199. ++ }
  200. ++}
  201. ++#endif
  202. ++
  203. + static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_down)
  204. + {
  205. + struct ieee80211_local *local = sdata->local;
  206. +@@ -800,8 +865,24 @@ static void ieee80211_teardown_sdata(str
  207. + ieee80211_link_stop(&sdata->deflink);
  208. + }
  209. +
  210. ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT
  211. ++static int ieee80211_init(struct net_device *dev)
  212. ++{
  213. ++ struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  214. ++
  215. ++ ieee80211_create_nss_virtif(sdata, dev);
  216. ++
  217. ++ return 0;
  218. ++}
  219. ++#endif
  220. ++
  221. + static void ieee80211_uninit(struct net_device *dev)
  222. + {
  223. ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT
  224. ++ struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  225. ++
  226. ++ ieee80211_destroy_nss_virtif(sdata);
  227. ++#endif
  228. + ieee80211_teardown_sdata(IEEE80211_DEV_TO_SUB_IF(dev));
  229. + }
  230. +
  231. +@@ -814,6 +895,9 @@ ieee80211_get_stats64(struct net_device
  232. + static const struct net_device_ops ieee80211_dataif_ops = {
  233. + .ndo_open = ieee80211_open,
  234. + .ndo_stop = ieee80211_stop,
  235. ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT
  236. ++ .ndo_init = ieee80211_init,
  237. ++#endif
  238. + .ndo_uninit = ieee80211_uninit,
  239. + .ndo_start_xmit = ieee80211_subif_start_xmit,
  240. + .ndo_set_rx_mode = ieee80211_set_multicast_list,
  241. +--- a/net/mac80211/rx.c
  242. ++++ b/net/mac80211/rx.c
  243. +@@ -33,6 +33,60 @@
  244. + #include "wme.h"
  245. + #include "rate.h"
  246. +
  247. ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT
  248. ++extern bool nss_redirect;
  249. ++
  250. ++#define case_rtn_string(val) case val: return #val
  251. ++
  252. ++static const char *nss_tx_status_str(nss_tx_status_t status)
  253. ++{
  254. ++ switch (status) {
  255. ++ case_rtn_string(NSS_TX_SUCCESS);
  256. ++ case_rtn_string(NSS_TX_FAILURE);
  257. ++ case_rtn_string(NSS_TX_FAILURE_QUEUE);
  258. ++ case_rtn_string(NSS_TX_FAILURE_NOT_READY);
  259. ++ case_rtn_string(NSS_TX_FAILURE_TOO_LARGE);
  260. ++ case_rtn_string(NSS_TX_FAILURE_TOO_SHORT);
  261. ++ case_rtn_string(NSS_TX_FAILURE_NOT_SUPPORTED);
  262. ++ case_rtn_string(NSS_TX_FAILURE_BAD_PARAM);
  263. ++ case_rtn_string(NSS_TX_FAILURE_NOT_ENABLED);
  264. ++ case_rtn_string(NSS_TX_FAILURE_SYNC_BAD_PARAM);
  265. ++ case_rtn_string(NSS_TX_FAILURE_SYNC_TIMEOUT);
  266. ++ case_rtn_string(NSS_TX_FAILURE_SYNC_FW_ERR);
  267. ++ default:
  268. ++ return "Unknown NSS TX status";
  269. ++ }
  270. ++}
  271. ++
  272. ++static void netif_rx_nss(struct ieee80211_rx_data *rx,
  273. ++ struct sk_buff *skb)
  274. ++{
  275. ++ struct ieee80211_sub_if_data *sdata = rx->sdata;
  276. ++ int ret;
  277. ++
  278. ++ if (!sdata->nssctx)
  279. ++ goto out;
  280. ++
  281. ++ /* NSS expects ethernet header in skb data so resetting here */
  282. ++ skb_push(skb, ETH_HLEN);
  283. ++ ret = nss_virt_if_tx_buf(sdata->nssctx, skb);
  284. ++ if (ret) {
  285. ++ if (net_ratelimit()) {
  286. ++ sdata_err(sdata, "NSS TX failed with error: %s\n",
  287. ++ nss_tx_status_str(ret));
  288. ++ }
  289. ++ goto out;
  290. ++ }
  291. ++
  292. ++ return;
  293. ++out:
  294. ++ if (rx->list)
  295. ++ list_add_tail(&skb->list, rx->list);
  296. ++ else
  297. ++ netif_receive_skb(skb);
  298. ++}
  299. ++#endif
  300. ++
  301. + /*
  302. + * monitor mode reception
  303. + *
  304. +@@ -2635,10 +2689,16 @@ static void ieee80211_deliver_skb_to_loc
  305. + ether_addr_copy(ehdr->h_dest, sdata->vif.addr);
  306. +
  307. + /* deliver to local stack */
  308. ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT
  309. ++ if (likely(nss_redirect)) {
  310. ++ netif_rx_nss(rx, skb);
  311. ++ }
  312. ++#else
  313. + if (rx->list)
  314. + list_add_tail(&skb->list, rx->list);
  315. + else
  316. + netif_receive_skb(skb);
  317. ++#endif
  318. + }
  319. + }
  320. +
  321. +--- a/net/mac80211/tx.c
  322. ++++ b/net/mac80211/tx.c
  323. +@@ -36,6 +36,11 @@
  324. + #include "wme.h"
  325. + #include "rate.h"
  326. +
  327. ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT
  328. ++#include <net/ip.h>
  329. ++#include <net/dsfield.h>
  330. ++#endif
  331. ++
  332. + /* misc utils */
  333. +
  334. + static __le16 ieee80211_duration(struct ieee80211_tx_data *tx,
  335. +@@ -1729,6 +1734,16 @@ static bool ieee80211_tx_frags(struct ie
  336. + return true;
  337. + }
  338. + } else {
  339. ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT
  340. ++ if (skb_queue_len(&local->pending[q]) >= 1000) {
  341. ++ spin_unlock_irqrestore(
  342. ++ &local->queue_stop_reason_lock,
  343. ++ flags);
  344. ++ ieee80211_purge_tx_queue(&local->hw,
  345. ++ skbs);
  346. ++ return false;
  347. ++ }
  348. ++#endif
  349. +
  350. + /*
  351. + * Since queue is stopped, queue up frames for
  352. +@@ -4448,6 +4463,35 @@ static void ieee80211_mlo_multicast_tx(s
  353. + kfree_skb(skb);
  354. + }
  355. +
  356. ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT
  357. ++void ieee80211_xmit_nss_fixup(struct sk_buff *skb,
  358. ++ struct net_device *dev)
  359. ++{
  360. ++ struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  361. ++
  362. ++ /* Packets from NSS does not have valid protocol, priority and other
  363. ++ * network stack values. Derive required parameters (priority
  364. ++ * and network_header) from payload for QoS header.
  365. ++ * XXX: Here the assumption is that packet are in 802.3 format.
  366. ++ * As of now priority is handled only for IPv4 and IPv6.
  367. ++ */
  368. ++
  369. ++ if (sdata->nssctx && likely(!skb->protocol)) {
  370. ++ skb_set_network_header(skb, 14);
  371. ++ switch (((struct ethhdr *)skb->data)->h_proto) {
  372. ++ case htons(ETH_P_IP):
  373. ++ skb->priority = (ipv4_get_dsfield(ip_hdr(skb)) &
  374. ++ 0xfc) >> 5;
  375. ++ break;
  376. ++ case htons(ETH_P_IPV6):
  377. ++ skb->priority = (ipv6_get_dsfield(ipv6_hdr(skb)) &
  378. ++ 0xfc) >> 5;
  379. ++ break;
  380. ++ }
  381. ++ }
  382. ++}
  383. ++#endif
  384. ++
  385. + /**
  386. + * ieee80211_subif_start_xmit - netif start_xmit function for 802.3 vifs
  387. + * @skb: packet to be sent
  388. +@@ -4461,6 +4505,10 @@ netdev_tx_t ieee80211_subif_start_xmit(s
  389. + struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  390. + const struct ethhdr *eth = (void *)skb->data;
  391. +
  392. ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT
  393. ++ ieee80211_xmit_nss_fixup(skb, dev);
  394. ++#endif
  395. ++
  396. + if (likely(!is_multicast_ether_addr(eth->h_dest)))
  397. + goto normal;
  398. +
  399. +@@ -4646,6 +4694,10 @@ netdev_tx_t ieee80211_subif_start_xmit_8
  400. + struct ieee80211_key *key;
  401. + struct sta_info *sta;
  402. +
  403. ++#ifdef CPTCFG_MAC80211_NSS_SUPPORT
  404. ++ ieee80211_xmit_nss_fixup(skb, dev);
  405. ++#endif
  406. ++
  407. + if (unlikely(!ieee80211_sdata_running(sdata) || skb->len < ETH_HLEN)) {
  408. + kfree_skb(skb);
  409. + return NETDEV_TX_OK;