From 870505bcd946a6976cd394a638fd43c2898d2648 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=B6ntgen?= Date: Mon, 23 Apr 2018 15:45:47 +0200 Subject: [PATCH] wifi: update iwlwifi to 4.16.3 --- repos/dde_linux/lib/mk/iwl_firmware.mk | 4 + .../lib/mk/spec/x86/wpa_driver_nl80211.mk | 4 + .../lib/mk/spec/x86/wpa_supplicant.mk | 21 +- repos/dde_linux/lib/mk/spec/x86_32/wifi.mk | 2 + repos/dde_linux/lib/mk/spec/x86_64/wifi.mk | 2 + repos/dde_linux/lib/mk/wifi.inc | 23 +- repos/dde_linux/patches/wifi.patch | 405 ++------ repos/dde_linux/patches/wifi_crypto.patch | 100 -- repos/dde_linux/patches/wifi_mem.patch | 146 +-- repos/dde_linux/patches/wpa_supplicant.patch | 147 +-- repos/dde_linux/ports/dde_linux.port | 76 +- repos/dde_linux/recipes/pkg/wifi/runtime | 12 +- .../recipes/raw/wifi_firmware/content.mk | 7 +- repos/dde_linux/run/wifi.run | 27 +- repos/dde_linux/src/drivers/wifi/target.mk | 3 +- .../src/lib/libnl/include/linux/errqueue.h | 0 .../src/lib/libnl/include/linux/filter.h | 0 .../src/lib/libnl/include/netpacket/packet.h | 0 repos/dde_linux/src/lib/libnl/socket.cc | 23 +- repos/dde_linux/src/lib/wifi/dummies.cc | 19 +- repos/dde_linux/src/lib/wifi/dummies_new.c | 515 +++++++++ repos/dde_linux/src/lib/wifi/firmware.cc | 107 ++ .../dde_linux/src/lib/wifi/include/lx_emul.h | 980 ++++++++++++++++-- repos/dde_linux/src/lib/wifi/init.cc | 69 +- repos/dde_linux/src/lib/wifi/lxc_emul.c | 117 ++- repos/dde_linux/src/lib/wifi/lxcc_emul.cc | 535 ++++++---- repos/dde_linux/src/lib/wifi/nic.cc | 166 ++- repos/dde_linux/src/lib/wifi/random.cc | 104 ++ .../src/lib/wpa_driver_nl80211/ioctl.cc | 4 + .../lib/wpa_supplicant/ctrl_iface_genode.c | 96 ++ repos/dde_linux/src/lib/wpa_supplicant/main.c | 3 +- .../src/lib/wpa_supplicant/reporter.cc | 4 +- .../src/lib/wpa_supplicant/symbol.map | 3 + repos/dde_linux/wifi.list | 289 +++--- 34 files changed, 2756 insertions(+), 1257 deletions(-) delete mode 100644 repos/dde_linux/patches/wifi_crypto.patch mode change 100755 => 100644 repos/dde_linux/recipes/pkg/wifi/runtime create mode 100644 repos/dde_linux/src/lib/libnl/include/linux/errqueue.h create mode 100644 repos/dde_linux/src/lib/libnl/include/linux/filter.h create mode 100644 repos/dde_linux/src/lib/libnl/include/netpacket/packet.h create mode 100644 repos/dde_linux/src/lib/wifi/dummies_new.c create mode 100644 repos/dde_linux/src/lib/wifi/firmware.cc create mode 100644 repos/dde_linux/src/lib/wifi/random.cc create mode 100644 repos/dde_linux/src/lib/wpa_supplicant/ctrl_iface_genode.c diff --git a/repos/dde_linux/lib/mk/iwl_firmware.mk b/repos/dde_linux/lib/mk/iwl_firmware.mk index 899b61eed..fb37e7e42 100644 --- a/repos/dde_linux/lib/mk/iwl_firmware.mk +++ b/repos/dde_linux/lib/mk/iwl_firmware.mk @@ -13,4 +13,8 @@ all: $(addprefix $(BIN_DIR)/,$(IMAGES)) $(BIN_DIR)/%.ucode: $(FW_DIR)/%.ucode $(VERBOSE)cp $^ $@ +$(BIN_DIR)/%.db: $(FW_DIR)/%.db + $(VERBOSE)cp $^ $@ + + CC_CXX_WARN_STRICT = diff --git a/repos/dde_linux/lib/mk/spec/x86/wpa_driver_nl80211.mk b/repos/dde_linux/lib/mk/spec/x86/wpa_driver_nl80211.mk index 9e47f0f63..0844ed055 100644 --- a/repos/dde_linux/lib/mk/spec/x86/wpa_driver_nl80211.mk +++ b/repos/dde_linux/lib/mk/spec/x86/wpa_driver_nl80211.mk @@ -18,6 +18,10 @@ INC_DIR += $(WS_CONTRIB_DIR)/src/l2_packet # nl80211 driver SRC_C_drivers = drivers.c \ driver_nl80211.c \ + driver_nl80211_capa.c \ + driver_nl80211_event.c \ + driver_nl80211_monitor.c \ + driver_nl80211_scan.c \ netlink.c \ rfkill.c SRC_C += $(addprefix src/drivers/, $(SRC_C_drivers)) diff --git a/repos/dde_linux/lib/mk/spec/x86/wpa_supplicant.mk b/repos/dde_linux/lib/mk/spec/x86/wpa_supplicant.mk index a28c5ad7f..dda03b011 100644 --- a/repos/dde_linux/lib/mk/spec/x86/wpa_supplicant.mk +++ b/repos/dde_linux/lib/mk/spec/x86/wpa_supplicant.mk @@ -10,7 +10,7 @@ CC_OPT += -Wno-unused-function CC_CXX_OPT += -fpermissive -SRC_C += main.c +SRC_C += main.c ctrl_iface_genode.c SRC_CC += reporter.cc # wpa_supplicant @@ -18,29 +18,34 @@ SRC_C_wpa_supplicant = blacklist.c \ bss.c \ config.c \ config_file.c \ + ctrl_iface.c \ eap_register.c \ events.c \ notify.c \ + op_classes.c \ + rrm.c \ scan.c \ sme.c \ + wmm_ac.c \ wpa_supplicant.c \ wpas_glue.c SRC_C += $(addprefix wpa_supplicant/, $(SRC_C_wpa_supplicant)) INC_DIR += $(WS_CONTRIB_DIR)/wpa_supplicant CC_OPT += -DCONFIG_BACKEND_FILE -DCONFIG_NO_CONFIG_WRITE \ - -DCONFIG_SME + -DCONFIG_SME -DCONFIG_CTRL_IFACE + +CC_OPT += -DTLS_DEFAULT_CIPHERS=\"DEFAULT:!EXP:!LOW\" INC_DIR += $(WS_CONTRIB_DIR)/src/ # common -SRC_C_common = ieee802_11_common.c wpa_common.c +SRC_C_common = ieee802_11_common.c wpa_common.c hw_features_common.c \ + ctrl_iface_common.c SRC_C += $(addprefix src/common/, $(SRC_C_common)) INC_DIR += $(WS_CONTRIB_DIR)/src/common # crypto -SRC_C_crypto = aes-unwrap.c \ - crypto_openssl.c \ - md5.c \ +SRC_C_crypto = crypto_openssl.c \ ms_funcs.c \ random.c \ sha1-prf.c \ @@ -82,8 +87,7 @@ INC_DIR += $(WS_CONTRIB_DIR)/src/eapol_supp CC_OPT += -DIEEE8021X_EAPOL # rsn_supp -SRC_C_rsn_supp = peerkey.c \ - pmksa_cache.c \ +SRC_C_rsn_supp = pmksa_cache.c \ preauth.c \ wpa.c \ wpa_ie.c @@ -93,6 +97,7 @@ CC_OPT += -DCONFIG_PEERKEY # utils SRC_C_utils = base64.c \ + bitfield.c \ common.c \ eloop.c \ os_unix.c \ diff --git a/repos/dde_linux/lib/mk/spec/x86_32/wifi.mk b/repos/dde_linux/lib/mk/spec/x86_32/wifi.mk index 6f6b71327..db9638742 100644 --- a/repos/dde_linux/lib/mk/spec/x86_32/wifi.mk +++ b/repos/dde_linux/lib/mk/spec/x86_32/wifi.mk @@ -2,6 +2,8 @@ include $(REP_DIR)/lib/mk/wifi.inc INC_DIR += $(LIB_INC_DIR)/spec/32bit $(LIB_INC_DIR)/spec/x86_32 $(LIB_INC_DIR)/spec/x86 +CC_OPT += -DCONFIG_64BIT=0 + vpath %.S $(REP_DIR)/src/lx_kit/spec/x86_32 CC_CXX_WARN_STRICT = diff --git a/repos/dde_linux/lib/mk/spec/x86_64/wifi.mk b/repos/dde_linux/lib/mk/spec/x86_64/wifi.mk index 6a93f9904..afbd8b570 100644 --- a/repos/dde_linux/lib/mk/spec/x86_64/wifi.mk +++ b/repos/dde_linux/lib/mk/spec/x86_64/wifi.mk @@ -2,6 +2,8 @@ include $(REP_DIR)/lib/mk/wifi.inc INC_DIR += $(LIB_INC_DIR)/spec/64bit $(LIB_INC_DIR)/spec/x86_64 $(LIB_INC_DIR)/spec/x86 +CC_OPT += -DCONFIG_64BIT=1 + vpath %.S $(REP_DIR)/src/lx_kit/spec/x86_64 CC_CXX_WARN_STRICT = diff --git a/repos/dde_linux/lib/mk/wifi.inc b/repos/dde_linux/lib/mk/wifi.inc index 6fbd83621..ed8b41d63 100644 --- a/repos/dde_linux/lib/mk/wifi.inc +++ b/repos/dde_linux/lib/mk/wifi.inc @@ -11,17 +11,18 @@ SHARED_LIB = yes # wifi_include *must* be the first library, otherwise the include # order is wrong # -LIBS += wifi_include lx_kit_setjmp libc +LIBS += wifi_include lx_kit_setjmp LD_OPT += --version-script=$(LIB_DIR)/symbol.map -SRC_CC += dummies.cc init.cc lxcc_emul.cc nic.cc socket_call.cc +SRC_CC += dummies.cc init.cc lxcc_emul.cc nic.cc socket_call.cc random.cc \ + firmware.cc # lx_kit SRC_CC += mapped_io_mem_range.cc irq.cc pci.cc malloc.cc scheduler.cc \ work.cc timer.cc printf.cc env.cc -SRC_C += lxc_emul.c +SRC_C += lxc_emul.c dummies_new.c CC_WARN = CC_OPT += -fno-builtin-toupper @@ -36,6 +37,9 @@ CC_OPT += -U__linux__ -D __KERNEL__ -DCONFIG_PCI #CC_OPT += -DCONFIG_INET CC_OPT += -DCONFIG_NET -DCONFIG_NET_NS -DCONFIG_WLAN #-D__MAC80211_DRIVER_TRACE +# CONFIG options +CC_OPT += -DCONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=1 + # needed for firmware loading CC_OPT += -DCONFIG_FW_LOADER @@ -53,14 +57,19 @@ CC_OPT += -DCONFIG_RFKILL # choose default pid algorithm CC_OPT += -DCONFIG_MAC80211_RC_PID -DCONFIG_MAC80211_RC_DEFAULT=\"pid\" +CC_OPT += -DCONFIG_CFG80211 + # # Suffix of global 'module_init' function # MOD_SUFFIX = CC_OPT += -DMOD_SUFFIX=$(MOD_SUFFIX) -SRC_C += lib/ctype.c +SRC_C += lib/bsearch.c +SRC_C += lib/bucket_locks.c SRC_C += lib/crc32.c +SRC_C += lib/ctype.c +SRC_C += lib/gcd.c # crypto SRC_C += $(addprefix crypto/, $(notdir $(wildcard $(WIFI_CONTRIB_DIR)/crypto/*.c))) @@ -101,11 +110,15 @@ CC_OPT += -DCONFIG_LEDS_TRIGGERS CC_OPT += -D__CHECK_ENDIAN__ # iwlwifi driver -DRV_DIR_IWLWIFI := drivers/net/wireless/iwlwifi +DRV_DIR_IWLWIFI := drivers/net/wireless/intel/iwlwifi SRC_C += $(addprefix $(DRV_DIR_IWLWIFI)/, $(notdir $(wildcard $(WIFI_CONTRIB_DIR)/$(DRV_DIR_IWLWIFI)/*.c))) +SRC_C += $(addprefix $(DRV_DIR_IWLWIFI)/cfg/, $(notdir $(wildcard $(WIFI_CONTRIB_DIR)/$(DRV_DIR_IWLWIFI)/cfg/*.c))) SRC_C += $(addprefix $(DRV_DIR_IWLWIFI)/dvm/, $(notdir $(wildcard $(WIFI_CONTRIB_DIR)/$(DRV_DIR_IWLWIFI)/dvm/*.c))) +SRC_C += $(addprefix $(DRV_DIR_IWLWIFI)/fw/, $(notdir $(wildcard $(WIFI_CONTRIB_DIR)/$(DRV_DIR_IWLWIFI)/fw/*.c))) SRC_C += $(addprefix $(DRV_DIR_IWLWIFI)/mvm/, $(notdir $(wildcard $(WIFI_CONTRIB_DIR)/$(DRV_DIR_IWLWIFI)/mvm/*.c))) SRC_C += $(addprefix $(DRV_DIR_IWLWIFI)/pcie/, $(notdir $(wildcard $(WIFI_CONTRIB_DIR)/$(DRV_DIR_IWLWIFI)/pcie/*.c))) +INC_DIR += $(WIFI_CONTRIB_DIR)/$(DRV_DIR_IWLWIFI) +INC_DIR += $(WIFI_CONTRIB_DIR)/$(DRV_DIR_IWLWIFI)/fw CC_OPT += -DCONFIG_IWLMVM -DCONFIG_IWLDVM -DCONFIG_IWLWIFI_LEDS CC_OPT += -DCONFIG_IWLWIFI_DEBUG diff --git a/repos/dde_linux/patches/wifi.patch b/repos/dde_linux/patches/wifi.patch index 9d432bc94..60e8d09f9 100644 --- a/repos/dde_linux/patches/wifi.patch +++ b/repos/dde_linux/patches/wifi.patch @@ -1,88 +1,77 @@ -diff --git a/drivers/net/wireless/iwlwifi/dvm/rs.c b/drivers/net/wireless/iwlwifi/dvm/rs.c -index 0977d93..3ccfd0e 100644 ---- a/drivers/net/wireless/iwlwifi/dvm/rs.c -+++ b/drivers/net/wireless/iwlwifi/dvm/rs.c -@@ -2309,7 +2309,7 @@ static void rs_rate_scale_perform(struct iwl_priv *priv, - rate_scale_index_msk = rate_mask; - - if (!((1 << index) & rate_scale_index_msk)) { -- IWL_ERR(priv, "Current Rate is not valid\n"); -+ // IWL_ERR(priv, "Current Rate is not valid\n"); - if (lq_sta->search_better_tbl) { - /* revert to active table if search table is not valid*/ - tbl->lq_type = LQ_NONE; -diff --git a/drivers/net/wireless/iwlwifi/iwl-debug.c b/drivers/net/wireless/iwlwifi/iwl-debug.c -index 09feff4..f218fe6 100644 ---- a/drivers/net/wireless/iwlwifi/iwl-debug.c -+++ b/drivers/net/wireless/iwlwifi/iwl-debug.c -@@ -78,7 +78,9 @@ void __iwl_ ##fn(struct device *dev, const char *fmt, ...) \ - \ - va_start(args, fmt); \ - vaf.va = &args; \ -- dev_ ##fn(dev, "%pV", &vaf); \ -+ char buf[256]; \ -+ vsnprintf(buf, sizeof(buf), vaf.fmt, *vaf.va); \ -+ dev_ ##fn(dev, "%s", buf); \ - trace_iwlwifi_ ##fn(&vaf); \ - va_end(args); \ +diff --git a/crypto/algboss.c b/crypto/algboss.c +index 5e6df2a..6ec2ce3 100644 +--- a/crypto/algboss.c ++++ b/crypto/algboss.c +@@ -90,6 +90,8 @@ out: + crypto_alg_put(¶m->larval->alg); + kfree(param); + module_put_and_exit(0); ++ ++ return 0; } -@@ -101,10 +103,12 @@ void __iwl_err(struct device *dev, bool rfkill_prefix, bool trace_only, - va_start(args, fmt); - vaf.va = &args; - if (!trace_only) { -+ char buf[256]; -+ vsnprintf(buf, sizeof(buf), vaf.fmt, *vaf.va); - if (rfkill_prefix) -- dev_err(dev, "(RFKILL) %pV", &vaf); -+ dev_err(dev, "(RFKILL) %s", buf); - else -- dev_err(dev, "%pV", &vaf); -+ dev_err(dev, "%s", buf); - } - trace_iwlwifi_err(&vaf); - va_end(args); -@@ -125,9 +129,12 @@ void __iwl_dbg(struct device *dev, - vaf.va = &args; - #ifdef CONFIG_IWLWIFI_DEBUG - if (iwl_have_debug_level(level) && -- (!limit || net_ratelimit())) -- dev_printk(KERN_DEBUG, dev, "%c %s %pV", -- in_interrupt() ? 'I' : 'U', function, &vaf); -+ (!limit || net_ratelimit())) { -+ char buf[256]; -+ vsnprintf(buf, sizeof(buf), vaf.fmt, *vaf.va); -+ dev_printk(KERN_DEBUG, dev, "%c %s %s", -+ in_interrupt() ? 'I' : 'U', function, buf); -+ } - #endif - trace_iwlwifi_dbg(level, in_interrupt(), function, &vaf); - va_end(args); ---- a/drivers/net/wireless/iwlwifi/iwl-trans.c -+++ b/drivers/net/wireless/iwlwifi/iwl-trans.c -@@ -96,7 +96,7 @@ - sizeof(struct iwl_device_cmd) - + trans->dev_cmd_headroom, - sizeof(void *), -- SLAB_HWCACHE_ALIGN, -+ SLAB_HWCACHE_ALIGN | SLAB_LX_DMA, - NULL); - if (!trans->dev_cmd_pool) - goto free; -diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c -index 9a856e5..e70f9b7 100644 ---- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c -+++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c -@@ -566,7 +566,9 @@ - else - hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; -+/* don't enable broken scheduled scanning - hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN; -+*/ - hw->wiphy->max_sched_scan_ssids = PROBE_OPTION_MAX; - hw->wiphy->max_match_sets = IWL_SCAN_MAX_PROFILES; - /* we create the 802.11 header and zero length SSID IE. */ -@@ -4200,7 +4202,7 @@ + static int cryptomgr_schedule_probe(struct crypto_larval *larval) +@@ -227,6 +229,8 @@ skiptest: + + kfree(param); + module_put_and_exit(0); ++ ++ return 0; + } + + static int cryptomgr_schedule_test(struct crypto_alg *alg) +diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c +index 7bd704a..d329673 100644 +--- a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c ++++ b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c +@@ -549,6 +549,8 @@ static struct scatterlist *alloc_sgtable(int size) + + void iwl_fw_error_dump(struct iwl_fw_runtime *fwrt) + { ++ return; ++ + struct iwl_fw_error_dump_file *dump_file; + struct iwl_fw_error_dump_data *dump_data; + struct iwl_fw_error_dump_info *dump_info; +@@ -1106,6 +1108,8 @@ IWL_EXPORT_SYMBOL(iwl_fw_start_dbg_conf); + + void iwl_fw_error_dump_wk(struct work_struct *work) + { ++ return; ++ + struct iwl_fw_runtime *fwrt = + container_of(work, struct iwl_fw_runtime, dump.wk.work); + +diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c +index 9c4a7f6..3bf610f 100644 +--- a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c ++++ b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c +@@ -1776,6 +1776,7 @@ MODULE_PARM_DESC(debug, "debug output mask"); + module_param_named(swcrypto, iwlwifi_mod_params.swcrypto, int, S_IRUGO); + MODULE_PARM_DESC(swcrypto, "using crypto in software (default 0 [hardware])"); + module_param_named(11n_disable, iwlwifi_mod_params.disable_11n, uint, S_IRUGO); ++unsigned int *module_param_11n_disable = &iwlwifi_mod_params.disable_11n; + MODULE_PARM_DESC(11n_disable, + "disable 11n functionality, bitmap: 1: full, 2: disable agg TX, 4: disable agg RX, 8 enable agg TX"); + module_param_named(amsdu_size, iwlwifi_mod_params.amsdu_size, +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/led.c b/drivers/net/wireless/intel/iwlwifi/mvm/led.c +index b272695..143130d 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/led.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/led.c +@@ -142,7 +142,7 @@ int iwl_mvm_leds_init(struct iwl_mvm *mvm) + if (ret) { + kfree(mvm->led.name); + IWL_INFO(mvm, "Failed to enable led\n"); +- return ret; ++ return 0; + } + + mvm->init_status |= IWL_MVM_INIT_STATUS_LEDS_INIT_COMPLETE; +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +index 7152fdc..5d133e5 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +@@ -4368,7 +4368,7 @@ const struct ieee80211_ops iwl_mvm_hw_ops = { .add_interface = iwl_mvm_mac_add_interface, .remove_interface = iwl_mvm_mac_remove_interface, .config = iwl_mvm_mac_config, @@ -91,159 +80,46 @@ index 9a856e5..e70f9b7 100644 .configure_filter = iwl_mvm_configure_filter, .config_iface_filter = iwl_mvm_config_iface_filter, .bss_info_changed = iwl_mvm_bss_info_changed, -diff --git a/drivers/net/wireless/iwlwifi/mvm/mvm.h b/drivers/net/wireless/iwlwifi/mvm/mvm.h -index 2b0ba1f..8de16d0 100644 ---- a/drivers/net/wireless/iwlwifi/mvm/mvm.h -+++ b/drivers/net/wireless/iwlwifi/mvm/mvm.h -@@ -64,7 +64,7 @@ - #ifndef __IWL_MVM_H__ - #define __IWL_MVM_H__ +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c +index f25ce3a..85007fc 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c +@@ -1601,7 +1601,7 @@ irqreturn_t iwl_pcie_irq_handler(int irq, void *dev_id) + * Re-enable interrupts here since we don't + * have anything to service + */ +- if (test_bit(STATUS_INT_ENABLED, &trans->status)) ++ // if (test_bit(STATUS_INT_ENABLED, &trans->status)) + _iwl_enable_interrupts(trans); + spin_unlock(&trans_pcie->irq_lock); + lock_map_release(&trans->sync_cmd_lockdep_map); +diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h +index 99df171..4632cdf 100644 +--- a/include/linux/skbuff.h ++++ b/include/linux/skbuff.h +@@ -3781,7 +3781,7 @@ static inline void skb_remcsum_process(struct sk_buff *skb, void *ptr, --#include -+/* #include */ - #include - #include - #include -diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h -index e526a8c..f3134fe 100644 ---- a/include/linux/ieee80211.h -+++ b/include/linux/ieee80211.h -@@ -2231,7 +2231,7 @@ static inline bool ieee80211_is_robust_mgmt_frame(struct ieee80211_hdr *hdr) - static inline bool ieee80211_is_public_action(struct ieee80211_hdr *hdr, - size_t len) - { -- struct ieee80211_mgmt *mgmt = (void *)hdr; -+ struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)hdr; - - if (len < IEEE80211_MIN_ACTION_SIZE) - return false; -diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h -index b1f84b0..890da1b 100644 ---- a/include/net/cfg80211.h -+++ b/include/net/cfg80211.h -@@ -191,6 +191,7 @@ struct ieee80211_channel { - * @IEEE80211_RATE_SUPPORTS_10MHZ: Rate can be used in 10 MHz mode - */ - enum ieee80211_rate_flags { -+ IEEE80211_RATE_NULL = 0, - IEEE80211_RATE_SHORT_PREAMBLE = 1<<0, - IEEE80211_RATE_MANDATORY_A = 1<<1, - IEEE80211_RATE_MANDATORY_B = 1<<2, -@@ -465,7 +466,7 @@ ieee80211_chandef_rate_flags(struct cfg80211_chan_def *chandef) - default: - break; + if (unlikely(skb->ip_summed != CHECKSUM_COMPLETE)) { + __skb_checksum_complete(skb); +- skb_postpull_rcsum(skb, skb->data, ptr - (void *)skb->data); ++ skb_postpull_rcsum(skb, skb->data, (unsigned char*)ptr - skb->data); } -- return 0; -+ return IEEE80211_RATE_NULL; - } - - /** -@@ -2990,7 +2991,7 @@ struct wiphy { - const struct nl80211_vendor_cmd_info *vendor_events; - int n_vendor_commands, n_vendor_events; - -- char priv[0] __aligned(NETDEV_ALIGN); -+ char priv[0] __attribute__ ((__aligned__(32)));//__aligned(NETDEV_ALIGN); - }; - - static inline struct net *wiphy_net(struct wiphy *wiphy) -diff --git a/include/net/netlink.h b/include/net/netlink.h -index 2b47eaa..6bd2cb1 100644 ---- a/include/net/netlink.h -+++ b/include/net/netlink.h -@@ -308,7 +308,7 @@ static inline int nlmsg_len(const struct nlmsghdr *nlh) - static inline struct nlattr *nlmsg_attrdata(const struct nlmsghdr *nlh, - int hdrlen) - { -- unsigned char *data = nlmsg_data(nlh); -+ unsigned char *data = (unsigned char *)nlmsg_data(nlh); - return (struct nlattr *) (data + NLMSG_ALIGN(hdrlen)); - } - -@@ -717,7 +717,7 @@ static inline struct nlattr *nla_next(const struct nlattr *nla, int *remaining) - static inline struct nlattr * - nla_find_nested(const struct nlattr *nla, int attrtype) - { -- return nla_find(nla_data(nla), nla_len(nla), attrtype); -+ return nla_find((const struct nlattr *)nla_data(nla), nla_len(nla), attrtype); - } - - /** -@@ -733,7 +733,7 @@ static inline int nla_parse_nested(struct nlattr *tb[], int maxtype, - const struct nlattr *nla, - const struct nla_policy *policy) - { -- return nla_parse(tb, maxtype, nla_data(nla), nla_len(nla), policy); -+ return nla_parse(tb, maxtype, (const struct nlattr *)nla_data(nla), nla_len(nla), policy); - } - - /** -@@ -1161,7 +1161,7 @@ static inline void nla_nest_cancel(struct sk_buff *skb, struct nlattr *start) - static inline int nla_validate_nested(const struct nlattr *start, int maxtype, - const struct nla_policy *policy) - { -- return nla_validate(nla_data(start), nla_len(start), maxtype, policy); -+ return nla_validate((const struct nlattr *)nla_data(start), nla_len(start), maxtype, policy); - } - - /** -diff --git a/include/net/sock.h b/include/net/sock.h -index b9586a1..d95959f 100644 ---- a/include/net/sock.h -+++ b/include/net/sock.h -@@ -1854,7 +1854,7 @@ static inline int skb_add_data_nocache(struct sock *sk, struct sk_buff *skb, - { - int err, offset = skb->len; - -- err = skb_do_copy_data_nocache(sk, skb, from, skb_put(skb, copy), -+ err = skb_do_copy_data_nocache(sk, skb, from, (char *)skb_put(skb, copy), - copy, offset); - if (err) - __skb_trim(skb, offset); -@@ -1869,7 +1869,7 @@ static inline int skb_copy_to_page_nocache(struct sock *sk, char __user *from, - { - int err; - -- err = skb_do_copy_data_nocache(sk, skb, from, page_address(page) + off, -+ err = skb_do_copy_data_nocache(sk, skb, from, (char *)(page_address(page) + off), - copy, skb->len); - if (err) - return err; -diff --git a/net/core/sock.c b/net/core/sock.c -index c0fc6bd..29f7035 100644 ---- a/net/core/sock.c -+++ b/net/core/sock.c -@@ -142,6 +142,8 @@ - - #include - -+#include -+ - static DEFINE_MUTEX(proto_list_mutex); - static LIST_HEAD(proto_list); + delta = remcsum_adjust(ptr, skb->csum, start, offset); diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c -index 48a6a93..598f469 100644 +index e0f3f4a..a309257 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c -@@ -93,6 +93,8 @@ - #include - #endif - -+#include -+ - #include "internal.h" - - /* -@@ -3508,6 +3510,7 @@ static int packet_notifier(struct notifier_block *this, +@@ -3977,6 +3977,8 @@ static int packet_notifier(struct notifier_block *this, struct net_device *dev = netdev_notifier_info_to_dev(ptr); struct net *net = dev_net(dev); ++// XXX check if still needed +#if 0 rcu_read_lock(); sk_for_each_rcu(sk, &net->packet.sklist) { struct packet_sock *po = pkt_sk(sk); -@@ -3548,6 +3551,7 @@ static int packet_notifier(struct notifier_block *this, +@@ -4017,6 +4019,7 @@ static int packet_notifier(struct notifier_block *this, } } rcu_read_unlock(); @@ -251,7 +127,7 @@ index 48a6a93..598f469 100644 return NOTIFY_DONE; } -@@ -4062,8 +4066,10 @@ static int __net_init packet_net_init(struct net *net) +@@ -4544,8 +4547,10 @@ static int __net_init packet_net_init(struct net *net) mutex_init(&net->packet.sklist_lock); INIT_HLIST_HEAD(&net->packet.sklist); @@ -262,84 +138,3 @@ index 48a6a93..598f469 100644 return 0; } -diff --git a/net/wireless/core.h b/net/wireless/core.h -index f1d193b..24220b3 100644 ---- a/net/wireless/core.h -+++ b/net/wireless/core.h -@@ -82,7 +82,7 @@ struct cfg80211_registered_device { - - /* must be last because of the way we do wiphy_priv(), - * and it should at least be aligned to NETDEV_ALIGN */ -- struct wiphy wiphy __aligned(NETDEV_ALIGN); -+ struct wiphy wiphy __attribute__((__aligned__(32))); - }; - - static inline -diff --git a/net/wireless/sysfs.c b/net/wireless/sysfs.c -index 9ee6bc1..02d740d 100644 ---- a/net/wireless/sysfs.c -+++ b/net/wireless/sysfs.c -@@ -156,7 +156,7 @@ struct class ieee80211_class = { - .resume = wiphy_resume, - #endif - .ns_type = &net_ns_type_operations, -- .namespace = wiphy_namespace, -+ ._namespace = wiphy_namespace, - }; - - int wiphy_sysfs_init(void) ---- a/include/linux/skbuff.h -+++ b/include/linux/skbuff.h -@@ -3281,7 +3281,7 @@ - - if (unlikely(skb->ip_summed != CHECKSUM_COMPLETE)) { - __skb_checksum_complete(skb); -- skb_postpull_rcsum(skb, skb->data, ptr - (void *)skb->data); -+ skb_postpull_rcsum(skb, skb->data, (unsigned char*)ptr - skb->data); - } - - delta = remcsum_adjust(ptr, skb->csum, start, offset); ---- a/drivers/net/wireless/iwlwifi/mvm/rx.c -+++ b/drivers/net/wireless/iwlwifi/mvm/rx.c -@@ -115,7 +115,11 @@ - * to do so) we should revisit this and ieee80211_data_to_8023(). - */ - hdrlen = (len <= skb_tailroom(skb)) ? len : -- sizeof(*hdr) + crypt_len + 8; -+ sizeof(*hdr);// + crypt_len + 8; -+ /* -+ * XXX decreasing the hdrlen by removing the appendage makes the -+ * driver work... why? -+ */ - - memcpy(skb_put(skb, hdrlen), hdr, hdrlen); - fraglen = len - hdrlen; ---- a/crypto/scatterwalk.c -+++ b/crypto/scatterwalk.c -@@ -115,9 +115,13 @@ - - sg = scatterwalk_ffwd(tmp, sg, start); - -- if (sg_page(sg) == virt_to_page(buf) && -- sg->offset == offset_in_page(buf)) -- return; -+ // -+ // We have no working virt_to_page and offset_in_page -+ // for this use case. -+ // -+ // if (sg_page(sg) == virt_to_page(buf) && -+ // sg->offset == offset_in_page(buf)) -+ // return; - - scatterwalk_start(&walk, sg); - scatterwalk_copychunks(buf, &walk, nbytes, out); ---- a/drivers/net/wireless/iwlwifi/iwl-drv.c -+++ b/drivers/net/wireless/iwlwifi/iwl-drv.c -@@ -1635,6 +1635,7 @@ - module_param_named(swcrypto, iwlwifi_mod_params.sw_crypto, int, S_IRUGO); - MODULE_PARM_DESC(swcrypto, "using crypto in software (default 0 [hardware])"); - module_param_named(11n_disable, iwlwifi_mod_params.disable_11n, uint, S_IRUGO); -+unsigned int *module_param_11n_disable = &iwlwifi_mod_params.disable_11n; - MODULE_PARM_DESC(11n_disable, - "disable 11n functionality, bitmap: 1: full, 2: disable agg TX, 4: disable agg RX, 8 enable agg TX"); - module_param_named(amsdu_size_8K, iwlwifi_mod_params.amsdu_size_8K, diff --git a/repos/dde_linux/patches/wifi_crypto.patch b/repos/dde_linux/patches/wifi_crypto.patch deleted file mode 100644 index 5b4ba3988..000000000 --- a/repos/dde_linux/patches/wifi_crypto.patch +++ /dev/null @@ -1,100 +0,0 @@ -diff --git a/crypto/ccm.c b/crypto/ccm.c -index cc31ea4..7eabdb8 100644 ---- a/crypto/ccm.c -+++ b/crypto/ccm.c -@@ -58,7 +58,8 @@ static inline struct crypto_ccm_req_priv_ctx *crypto_ccm_reqctx( - { - unsigned long align = crypto_aead_alignmask(crypto_aead_reqtfm(req)); - -- return (void *)PTR_ALIGN((u8 *)aead_request_ctx(req), align + 1); -+ u8 *p = (u8 *) aead_request_ctx(req); -+ return (void *)PTR_ALIGN(p, (align + 1)); - } - - static int set_msg_len(u8 *block, unsigned int msglen, int csize) -@@ -710,8 +711,9 @@ static struct aead_request *crypto_rfc4309_crypt(struct aead_request *req) - struct crypto_rfc4309_ctx *ctx = crypto_aead_ctx(aead); - struct crypto_aead *child = ctx->child; - struct scatterlist *sg; -- u8 *iv = PTR_ALIGN((u8 *)(subreq + 1) + crypto_aead_reqsize(child), -- crypto_aead_alignmask(child) + 1); -+ unsigned long m = crypto_aead_alignmask(child) + 1; -+ u8 *p = (u8 *)(subreq + 1) + crypto_aead_reqsize(child); -+ u8 *iv = PTR_ALIGN(p, m); - - /* L' */ - iv[0] = 3; -diff --git a/crypto/ctr.c b/crypto/ctr.c -index f2b94f2..b345689 100644 ---- a/crypto/ctr.c -+++ b/crypto/ctr.c -@@ -59,7 +59,9 @@ static void crypto_ctr_crypt_final(struct blkcipher_walk *walk, - unsigned long alignmask = crypto_cipher_alignmask(tfm); - u8 *ctrblk = walk->iv; - u8 tmp[bsize + alignmask]; -- u8 *keystream = PTR_ALIGN(tmp + 0, alignmask + 1); -+ u8 *p = (u8*)(tmp + 0); -+ unsigned long m = alignmask + 1; -+ u8 *keystream = PTR_ALIGN(p, m); - u8 *src = walk->src.virt.addr; - u8 *dst = walk->dst.virt.addr; - unsigned int nbytes = walk->nbytes; -@@ -108,7 +110,9 @@ static int crypto_ctr_crypt_inplace(struct blkcipher_walk *walk, - u8 *ctrblk = walk->iv; - u8 *src = walk->src.virt.addr; - u8 tmp[bsize + alignmask]; -- u8 *keystream = PTR_ALIGN(tmp + 0, alignmask + 1); -+ unsigned long m = alignmask + 1; -+ u8 *p = (u8*)(tmp + 0); -+ u8 *keystream = PTR_ALIGN(p , m); - - do { - /* create keystream */ -@@ -281,8 +285,11 @@ static int crypto_rfc3686_crypt(struct ablkcipher_request *req) - struct crypto_rfc3686_ctx *ctx = crypto_ablkcipher_ctx(tfm); - struct crypto_ablkcipher *child = ctx->child; - unsigned long align = crypto_ablkcipher_alignmask(tfm); -+ -+ unsigned long m = align + 1; -+ u8 *p = (u8*) ablkcipher_request_ctx(req); - struct crypto_rfc3686_req_ctx *rctx = -- (void *)PTR_ALIGN((u8 *)ablkcipher_request_ctx(req), align + 1); -+ (void *)PTR_ALIGN(p, m); - struct ablkcipher_request *subreq = &rctx->subreq; - u8 *iv = rctx->iv; - ---- a/include/crypto/algapi.h -+++ b/include/crypto/algapi.h -@@ -201,8 +201,10 @@ void __ablkcipher_walk_complete(struct ablkcipher_walk *walk); - - static inline void *crypto_tfm_ctx_aligned(struct crypto_tfm *tfm) - { -- return PTR_ALIGN(crypto_tfm_ctx(tfm), -- crypto_tfm_alg_alignmask(tfm) + 1); -+ void *p = crypto_tfm_ctx(tfm); -+ unsigned int m = crypto_tfm_alg_alignmask(tfm) + 1; -+ -+ return PTR_ALIGN(p, m); - } - - static inline struct crypto_instance *crypto_tfm_alg_instance( ---- a/crypto/algboss.c -+++ b/crypto/algboss.c -@@ -90,6 +90,8 @@ out: - crypto_alg_put(¶m->larval->alg); - kfree(param); - module_put_and_exit(0); -+ -+ return 0; - } - - static int cryptomgr_schedule_probe(struct crypto_larval *larval) -@@ -228,6 +230,8 @@ skiptest: - - kfree(param); - module_put_and_exit(0); -+ -+ return 0; - } - - static int cryptomgr_schedule_test(struct crypto_alg *alg) diff --git a/repos/dde_linux/patches/wifi_mem.patch b/repos/dde_linux/patches/wifi_mem.patch index f4c31fa27..3bdc5730f 100644 --- a/repos/dde_linux/patches/wifi_mem.patch +++ b/repos/dde_linux/patches/wifi_mem.patch @@ -1,6 +1,6 @@ ---- a/drivers/net/wireless/iwlwifi/dvm/calib.c -+++ b/drivers/net/wireless/iwlwifi/dvm/calib.c -@@ -121,7 +121,7 @@ int iwl_calib_set(struct iwl_priv *priv, +--- a/drivers/net/wireless/intel/iwlwifi/dvm/calib.c ++++ b/drivers/net/wireless/intel/iwlwifi/dvm/calib.c +@@ -120,7 +120,7 @@ int iwl_calib_set(struct iwl_priv *priv, struct iwl_calib_result *res, *tmp; res = kmalloc(sizeof(*res) + len - sizeof(struct iwl_calib_hdr), @@ -9,9 +9,9 @@ if (!res) return -ENOMEM; memcpy(&res->hdr, cmd, len); ---- a/drivers/net/wireless/iwlwifi/dvm/scan.c -+++ b/drivers/net/wireless/iwlwifi/dvm/scan.c -@@ -672,7 +672,7 @@ static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif) +--- a/drivers/net/wireless/intel/iwlwifi/dvm/scan.c ++++ b/drivers/net/wireless/intel/iwlwifi/dvm/scan.c +@@ -666,7 +666,7 @@ static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif) ctx = iwl_rxon_ctx_from_vif(vif); if (!priv->scan_cmd) { @@ -20,9 +20,67 @@ if (!priv->scan_cmd) { IWL_DEBUG_SCAN(priv, "fail to allocate memory for scan\n"); ---- a/drivers/net/wireless/iwlwifi/pcie/tx.c -+++ b/drivers/net/wireless/iwlwifi/pcie/tx.c -@@ -492,7 +492,7 @@ static int iwl_pcie_txq_alloc(struct iwl_trans *trans, +--- a/drivers/net/wireless/intel/iwlwifi/iwl-phy-db.c ++++ b/drivers/net/wireless/intel/iwlwifi/iwl-phy-db.c +@@ -251,7 +251,7 @@ int iwl_phy_db_set_section(struct iwl_phy_db *phy_db, + return -EINVAL; + + kfree(entry->data); +- entry->data = kmemdup(phy_db_notif->data, size, GFP_ATOMIC); ++ entry->data = kmemdup(phy_db_notif->data, size, GFP_ATOMIC | GFP_LX_DMA); + if (!entry->data) { + entry->size = 0; + return -ENOMEM; +--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.c ++++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.c +@@ -99,7 +99,7 @@ struct iwl_trans *iwl_trans_alloc(unsigned int priv_size, + kmem_cache_create(trans->dev_cmd_pool_name, + sizeof(struct iwl_device_cmd), + sizeof(void *), +- SLAB_HWCACHE_ALIGN, ++ SLAB_HWCACHE_ALIGN|SLAB_LX_DMA, + NULL); + if (!trans->dev_cmd_pool) + return NULL; +--- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c +@@ -767,7 +767,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg, + + scan_size = iwl_mvm_scan_size(mvm); + +- mvm->scan_cmd = kmalloc(scan_size, GFP_KERNEL); ++ mvm->scan_cmd = kmalloc(scan_size, GFP_KERNEL | GFP_LX_DMA); + if (!mvm->scan_cmd) + goto out_free; + +--- a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c +@@ -501,11 +501,11 @@ iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm, + else + blacklist_len = IWL_SCAN_MAX_BLACKLIST_LEN; + +- blacklist = kzalloc(sizeof(*blacklist) * blacklist_len, GFP_KERNEL); ++ blacklist = kzalloc(sizeof(*blacklist) * blacklist_len, GFP_KERNEL | GFP_LX_DMA); + if (!blacklist) + return -ENOMEM; + +- profile_cfg = kzalloc(sizeof(*profile_cfg), GFP_KERNEL); ++ profile_cfg = kzalloc(sizeof(*profile_cfg), GFP_KERNEL | GFP_LX_DMA); + if (!profile_cfg) { + ret = -ENOMEM; + goto free_blacklist; +@@ -1052,7 +1052,7 @@ int iwl_mvm_config_scan(struct iwl_mvm *mvm) + cmd_size = sizeof(struct iwl_scan_config_v1); + cmd_size += mvm->fw->ucode_capa.n_scan_channels; + +- cfg = kzalloc(cmd_size, GFP_KERNEL); ++ cfg = kzalloc(cmd_size, GFP_KERNEL | GFP_LX_DMA); + if (!cfg) + return -ENOMEM; + +--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c +@@ -502,7 +502,7 @@ int iwl_pcie_txq_alloc(struct iwl_trans *trans, struct iwl_txq *txq, txq->entries = kcalloc(slots_num, sizeof(struct iwl_pcie_txq_entry), @@ -31,7 +89,7 @@ if (!txq->entries) goto error; -@@ -501,7 +501,7 @@ static int iwl_pcie_txq_alloc(struct iwl_trans *trans, +@@ -511,7 +511,7 @@ int iwl_pcie_txq_alloc(struct iwl_trans *trans, struct iwl_txq *txq, for (i = 0; i < slots_num; i++) { txq->entries[i].cmd = kmalloc(sizeof(struct iwl_device_cmd), @@ -40,16 +98,16 @@ if (!txq->entries[i].cmd) goto error; } -@@ -840,7 +840,7 @@ static int iwl_pcie_tx_alloc(struct iwl_trans *trans) +@@ -938,7 +938,7 @@ static int iwl_pcie_tx_alloc(struct iwl_trans *trans) } - trans_pcie->txq = kcalloc(trans->cfg->base_params->num_of_queues, -- sizeof(struct iwl_txq), GFP_KERNEL); -+ sizeof(struct iwl_txq), GFP_KERNEL | GFP_LX_DMA); - if (!trans_pcie->txq) { + trans_pcie->txq_memory = kcalloc(trans->cfg->base_params->num_of_queues, +- sizeof(struct iwl_txq), GFP_KERNEL); ++ sizeof(struct iwl_txq), GFP_KERNEL | GFP_LX_DMA); + if (!trans_pcie->txq_memory) { IWL_ERR(trans, "Not enough memory for txq\n"); ret = -ENOMEM; -@@ -1255,7 +1255,7 @@ static int iwl_pcie_enqueue_hcmd(struct iwl_trans *trans, +@@ -1539,7 +1539,7 @@ static int iwl_pcie_enqueue_hcmd(struct iwl_trans *trans, } dup_buf = kmemdup(cmddata[i], cmdlen[i], @@ -60,7 +118,7 @@ } else { --- a/net/core/skbuff.c +++ b/net/core/skbuff.c -@@ -125,6 +125,8 @@ static void *__kmalloc_reserve(size_t size, gfp_t flags, int node, +@@ -130,6 +130,8 @@ static void *__kmalloc_reserve(size_t size, gfp_t flags, int node, void *obj; bool ret_pfmemalloc = false; @@ -69,52 +127,12 @@ /* * Try a regular allocation, when that fails and we're not entitled * to the reserves, fail. ---- a/drivers/net/wireless/iwlwifi/iwl-phy-db.c -+++ a/drivers/net/wireless/iwlwifi/iwl-phy-db.c -@@ -233,7 +233,7 @@ - return -EINVAL; +@@ -278,7 +280,7 @@ struct sk_buff *__build_skb(void *data, unsigned int frag_size) + struct sk_buff *skb; + unsigned int size = frag_size ? : ksize(data); - kfree(entry->data); -- entry->data = kmemdup(phy_db_notif->data, size, alloc_ctx); -+ entry->data = kmemdup(phy_db_notif->data, size, alloc_ctx | GFP_LX_DMA); - if (!entry->data) { - entry->size = 0; - return -ENOMEM; -diff --git a/drivers/net/wireless/iwlwifi/mvm/ops.c b/drivers/net/wireless/iwlwifi/mvm/ops.c -index 13c97f6..68a8657 100644 ---- a/drivers/net/wireless/iwlwifi/mvm/ops.c -+++ b/drivers/net/wireless/iwlwifi/mvm/ops.c -@@ -574,7 +574,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg, - - scan_size = iwl_mvm_scan_size(mvm); - -- mvm->scan_cmd = kmalloc(scan_size, GFP_KERNEL); -+ mvm->scan_cmd = kmalloc(scan_size, GFP_KERNEL | GFP_LX_DMA); - if (!mvm->scan_cmd) - goto out_free; - ---- a/drivers/net/wireless/iwlwifi/mvm/scan.c -+++ b/drivers/net/wireless/iwlwifi/mvm/scan.c -@@ -481,11 +481,11 @@ - else - blacklist_len = IWL_SCAN_MAX_BLACKLIST_LEN; - -- blacklist = kzalloc(sizeof(*blacklist) * blacklist_len, GFP_KERNEL); -+ blacklist = kzalloc(sizeof(*blacklist) * blacklist_len, GFP_KERNEL|GFP_LX_DMA); - if (!blacklist) - return -ENOMEM; - -- profile_cfg = kzalloc(sizeof(*profile_cfg), GFP_KERNEL); -+ profile_cfg = kzalloc(sizeof(*profile_cfg), GFP_KERNEL|GFP_LX_DMA); - if (!profile_cfg) { - ret = -ENOMEM; - goto free_blacklist; -@@ -916,7 +916,7 @@ - - cmd_size = sizeof(*scan_config) + mvm->fw->ucode_capa.n_scan_channels; - -- scan_config = kzalloc(cmd_size, GFP_KERNEL); -+ scan_config = kzalloc(cmd_size, GFP_KERNEL|GFP_LX_DMA); - if (!scan_config) - return -ENOMEM; +- skb = kmem_cache_alloc(skbuff_head_cache, GFP_ATOMIC); ++ skb = kmem_cache_alloc(skbuff_head_cache, GFP_ATOMIC|GFP_LX_DMA); + if (!skb) + return NULL; diff --git a/repos/dde_linux/patches/wpa_supplicant.patch b/repos/dde_linux/patches/wpa_supplicant.patch index 641395ff7..1e8bdeeba 100644 --- a/repos/dde_linux/patches/wpa_supplicant.patch +++ b/repos/dde_linux/patches/wpa_supplicant.patch @@ -1,56 +1,8 @@ ---- a/wpa_supplicant/config.c -+++ b/wpa_supplicant/config.c -@@ -1187,6 +1187,7 @@ static int wpa_config_parse_password(const struct parse_data *data, - } - - -+#if 0 - static char * wpa_config_write_password(const struct parse_data *data, - struct wpa_ssid *ssid) - { -@@ -1221,6 +1222,7 @@ static char * wpa_config_write_password(const struct parse_data *data, - return buf; - } - #endif /* IEEE8021X_EAPOL */ -+#endif - - - static int wpa_config_parse_wep_key(u8 *key, size_t *len, int line, -@@ -2264,6 +2266,7 @@ int wpa_config_set_quoted(struct wpa_ssid *ssid, const char *var, - } - - -+#ifndef NO_CONFIG_WRITE - /** - * wpa_config_get_all - Get all options from network configuration - * @ssid: Pointer to network configuration data -@@ -2326,7 +2329,6 @@ err: - } - - --#ifndef NO_CONFIG_WRITE - /** - * wpa_config_get - Get a variable in network configuration - * @ssid: Pointer to network configuration data +diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c +index 5cff47fab..5cba03efe 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c -@@ -20,11 +20,12 @@ - #include - #include - #include --#include --#include --#include -+//#include -+//#include -+//#include - #include "nl80211_copy.h" - -+ - #include "common.h" - #include "eloop.h" - #include "utils/list.h" -@@ -10924,7 +10925,7 @@ static void * nl80211_global_init(void) +@@ -7645,7 +7645,7 @@ static void * nl80211_global_init(void *ctx) if (wpa_driver_nl80211_init_nl_global(global) < 0) goto err; @@ -59,6 +11,8 @@ if (global->ioctl_sock < 0) { wpa_printf(MSG_ERROR, "nl80211: socket(PF_INET,SOCK_DGRAM) failed: %s", strerror(errno)); +diff --git a/src/drivers/netlink.c b/src/drivers/netlink.c +index 0e960f48c..38fb26c18 100644 --- a/src/drivers/netlink.c +++ b/src/drivers/netlink.c @@ -13,6 +13,8 @@ @@ -70,9 +24,11 @@ struct netlink_data { struct netlink_config *cfg; +diff --git a/src/utils/eloop.c b/src/utils/eloop.c +index 436bc8c99..fd72eaef3 100644 --- a/src/utils/eloop.c +++ b/src/utils/eloop.c -@@ -23,7 +23,7 @@ +@@ -28,7 +28,7 @@ #endif #ifdef CONFIG_ELOOP_POLL @@ -81,82 +37,39 @@ #endif /* CONFIG_ELOOP_POLL */ #ifdef CONFIG_ELOOP_EPOLL -@@ -801,7 +801,7 @@ +@@ -961,7 +961,7 @@ static void eloop_handle_alarm(int sig) #endif /* CONFIG_NATIVE_WINDOWS */ -static void eloop_handle_signal(int sig) +void eloop_handle_signal(int sig) { - int i; + int i; +diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c +index fb77f1dbd..9142f3f1b 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c -@@ -1245,6 +1245,9 @@ +@@ -1754,6 +1754,9 @@ static int wpa_supplicant_need_to_roam(struct wpa_supplicant *wpa_s, } +extern void wpa_report_scan_results(struct wpa_supplicant *); + + - /* Return != 0 if no scan results could be fetched or if scan results should not - * be shared with other virtual interfaces. */ - static int _wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s, -@@ -1281,6 +1284,8 @@ - goto scan_work_done; - } + /* + * Return a negative value if no scan results could be fetched or if scan + * results should not be shared with other virtual interfaces. +@@ -1799,6 +1802,8 @@ static int _wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s, + goto scan_work_done; + } -+ wpa_report_scan_results(wpa_s); ++ wpa_report_scan_results(wpa_s); + #ifndef CONFIG_NO_RANDOM_POOL - num = scan_res->num; - if (num > 10) ---- a/src/drivers/driver.h -+++ b/src/drivers/driver.h -@@ -267,6 +267,20 @@ - - #define WPAS_MAX_SCAN_SSIDS 16 - -+struct wpa_driver_scan_ssid { -+ /** -+ * ssid - specific SSID to scan for (ProbeReq) -+ * %NULL or zero-length SSID is used to indicate active scan -+ * with wildcard SSID. -+ */ -+ const u8 *ssid; -+ /** -+ * ssid_len: Length of the SSID in octets -+ */ -+ size_t ssid_len; -+}; -+ -+ - /** - * struct wpa_driver_scan_params - Scan parameters - * Data for struct wpa_driver_ops::scan2(). -@@ -275,18 +289,7 @@ - /** - * ssids - SSIDs to scan for - */ -- struct wpa_driver_scan_ssid { -- /** -- * ssid - specific SSID to scan for (ProbeReq) -- * %NULL or zero-length SSID is used to indicate active scan -- * with wildcard SSID. -- */ -- const u8 *ssid; -- /** -- * ssid_len: Length of the SSID in octets -- */ -- size_t ssid_len; -- } ssids[WPAS_MAX_SCAN_SSIDS]; -+ struct wpa_driver_scan_ssid ssids[WPAS_MAX_SCAN_SSIDS]; - - /** - * num_ssids - Number of entries in ssids array ---- a/wpa_supplicant/events.c -+++ b/wpa_supplicant/events.c -@@ -2067,6 +2067,9 @@ static int disconnect_reason_recoverable(u16 reason_code) + num = scan_res->num; + if (num > 10) +@@ -2813,6 +2818,9 @@ static int disconnect_reason_recoverable(u16 reason_code) } @@ -166,7 +79,7 @@ static void wpa_supplicant_event_disassoc(struct wpa_supplicant *wpa_s, u16 reason_code, int locally_generated) -@@ -2088,6 +2091,7 @@ static void wpa_supplicant_event_disassoc(struct wpa_supplicant *wpa_s, +@@ -2834,6 +2842,7 @@ static void wpa_supplicant_event_disassoc(struct wpa_supplicant *wpa_s, if (!is_zero_ether_addr(bssid) || wpa_s->wpa_state >= WPA_AUTHENTICATING) { @@ -174,9 +87,11 @@ wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_DISCONNECTED "bssid=" MACSTR " reason=%d%s", MAC2STR(bssid), reason_code, +diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c +index 185a8d50f..4baedabb3 100644 --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c -@@ -656,6 +656,9 @@ void wpa_supplicant_reinit_autoscan(struct wpa_supplicant *wpa_s) +@@ -822,6 +822,9 @@ void wpa_supplicant_reinit_autoscan(struct wpa_supplicant *wpa_s) } @@ -186,11 +101,11 @@ /** * wpa_supplicant_set_state - Set current connection state * @wpa_s: Pointer to wpa_supplicant data -@@ -689,6 +692,7 @@ void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s, +@@ -879,6 +882,7 @@ void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s, if (state == WPA_COMPLETED && wpa_s->new_connection) { struct wpa_ssid *ssid = wpa_s->current_ssid; + wpa_report_connect_event(wpa_s); - #if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG) - wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_CONNECTED "- Connection to " - MACSTR " completed [id=%d id_str=%s]", + int fils_hlp_sent = 0; + + #ifdef CONFIG_SME diff --git a/repos/dde_linux/ports/dde_linux.port b/repos/dde_linux/ports/dde_linux.port index fd50ea3c9..566bd9c3a 100644 --- a/repos/dde_linux/ports/dde_linux.port +++ b/repos/dde_linux/ports/dde_linux.port @@ -1,9 +1,8 @@ LICENSE := GPLv2 VERSION := 2 DOWNLOADS := dwc_otg.git usb.archive intel_fb.archive lxip.archive \ - wifi.archive fec.archive libnl.archive wpa_supplicant.archive \ - fw_3160.archive fw_6000.archive fw_6205a.archive fw_6205b.archive \ - fw_7260.archive fw_7265.archive fw_8260.archive fw_1000.archive + wifi.archive fec.archive libnl.archive wpa_supplicant.git \ + fw.archive # # The git checkout checks for the existence of SRC_DIR, which is created by the @@ -52,9 +51,9 @@ HASH_INPUT += $(REP_DIR)/intel_fb.list # mac80211 stack, iwlwifi sources # SRC_DIR_WIFI := src/lib/wifi -VERSION_WIFI := 4.4.3 +VERSION_WIFI := 4.16.3 URL(wifi) := https://www.kernel.org/pub/linux/kernel/v4.x/linux-$(VERSION_WIFI).tar.xz -SHA(wifi) := 0b379cb19bbd7e38fc5a9a000ea927db55cce519a7400ec7fa705c581a6491dd +SHA(wifi) := 0d6971a81da97e38b974c5eba31a74803bfe41aabc46d406c3acda56306c81a3 DIR(wifi) := $(SRC_DIR_WIFI) TAR_OPT(wifi) := --strip-components=1 --files-from - < <(sed 's/-x.x.x/-$(VERSION_WIFI)/g' $(REP_DIR)/wifi.list) HASH_INPUT += $(REP_DIR)/wifi.list @@ -92,73 +91,25 @@ DIR(libnl) := src/lib/libnl # # wpa_supplicant sources # -URL(wpa_supplicant) := https://w1.fi/releases/wpa_supplicant-2.2.tar.gz -SHA(wpa_supplicant) := e0d8b8fd68a659636eaba246bb2caacbf53d22d53b2b6b90eb4b4fef0993c8ed +URL(wpa_supplicant) := git://w1.fi/srv/git/hostap.git +REV(wpa_supplicant) := 25bd4e7beb582509596fe60cb3591e1299f3121b DIR(wpa_supplicant) := src/app/wpa_supplicant -# -# Firmware images for iwlwifi Intel Wireless 3160 -# -URL(fw_3160) := https://wireless.wiki.kernel.org/_media/en/users/drivers/iwlwifi-3160-ucode-16.242414.0.tgz -SHA(fw_3160) := ea2f272f40b7a76fde049449813a5d6e323769efd603acd303d1e9a4e0e57820 -DIR(fw_3160) := firmware # -# Firmware images for iwlwifi Ultimate-N 6300 and Advanced-N 6200 +# Firmware images # -URL(fw_6000) := https://wireless.wiki.kernel.org/_media/en/users/drivers/iwlwifi-6000-ucode-9.221.4.1.tgz -SHA(fw_6000) := 7f04623231663dc4ee63df32fd890bfa9514dce1fab9dc7a25fda90350da836b -DIR(fw_6000) := firmware - -# -# Firmware images for iwlwifi Advanced-N 6205 -# -URL(fw_6205a) := https://wireless.wiki.kernel.org/_media/en/users/drivers/iwlwifi-6000g2a-ucode-18.168.6.1.tgz -SHA(fw_6205a) := a7f2615756addafbf3e6912cb0265f9650b2807d1ccdf54b620735772725bbe9 -DIR(fw_6205a) := firmware - -# -# Firmware images for iwlwifi Advanced-N 6230 / 6235 and Wireless-N 130 / 1030 -# -URL(fw_6205b) := https://wireless.wiki.kernel.org/_media/en/users/drivers/iwlwifi-6000g2b-ucode-18.168.6.1.tgz -SHA(fw_6205b) := 1683c76b52c3505205447c338603ad08611fcc2da024f476e56e1298b4f10bea -DIR(fw_6205b) := firmware - -# -# Firmware images for iwlwifi Wireless 7260 -# -URL(fw_7260) := https://wireless.wiki.kernel.org/_media/en/users/drivers/iwlwifi-7260-ucode-16.242414.0.tgz -SHA(fw_7260) := 3bf102cd3ea8a720bef89dca120c94aa5ff34bcc756413fc5982a39613641d84 -DIR(fw_7260) := firmware - -# -# Firmware images for iwlwifi Wireless 7265 -# -URL(fw_7265) := https://wireless.wiki.kernel.org/_media/en/users/drivers/iwlwifi-7265-ucode-16.242414.0.tgz -SHA(fw_7265) := 2d599b091fa81b66a3e2cb1e607e060a8e82d178d26f3077146ce5483d798d65 -DIR(fw_7265) := firmware - -# -# Firmware images for iwlwifi Wireless 8260 -# -URL(fw_8260) := https://wireless.wiki.kernel.org/_media/en/users/drivers/iwlwifi-8000-ucode-16.242414.0.tgz -SHA(fw_8260) := 802d7406354016b98d1b485f0446b5a16c4ac795278315a55a7b901b223cb871 -DIR(fw_8260) := firmware - -# -# Firmware images for iwlwifi Wireless-N 1000 -# -URL(fw_1000) := https://wireless.wiki.kernel.org/_media/en/users/drivers/iwlwifi-1000-ucode-39.31.5.1.tgz -SHA(fw_1000) := ed0f1fbc2571c8da9a0cd9410fa8883494a9e1ac469d5000bc2c9dceaf83c970 -DIR(fw_1000) := firmware - -https://wireless.wiki.kernel.org/_media/en/users/drivers/iwlwifi-1000-ucode-39.31.5.1.tgz +FW_REV := 8903435737fd897185eaf64229d870412b558a0e +URL(fw) := https://github.com/cnuke/dde_linux_firmware/archive/$(FW_REV).tar.gz +SHA(fw) := 3adea3ebaeb58e27b5002b883423fc8e9224d60c2045c43df5b3c0fdc1adf2f5 +DIR(fw) := firmware # # Patches # -PATCHES := $(addprefix patches/,$(notdir $(wildcard $(REP_DIR)/patches/w*.patch))) +PATCHES := $(addprefix patches/,$(notdir $(wildcard $(REP_DIR)/patches/wpa*.patch))) PATCHES += $(addprefix patches/,$(notdir $(wildcard $(REP_DIR)/patches/libnl*.patch))) +PATCHES += $(addprefix patches/,$(notdir $(wildcard $(REP_DIR)/patches/wifi*.patch))) PATCHES += $(addprefix patches/,$(notdir $(wildcard $(REP_DIR)/patches/lxip*.patch))) PATCHES += $(addprefix patches/,$(notdir $(wildcard $(REP_DIR)/patches/intel*.patch))) PATCHES += $(addprefix patches/,$(notdir $(wildcard $(REP_DIR)/patches/usb*.patch))) @@ -177,7 +128,6 @@ PATCH_OPT(patches/lxip_skbuff_cast.patch) := $(LXIP_OPT) # WIFI WIFI_OPT = -p1 -d$(SRC_DIR_WIFI) PATCH_OPT(patches/wifi.patch) := $(WIFI_OPT) -PATCH_OPT(patches/wifi_crypto.patch) := $(WIFI_OPT) PATCH_OPT(patches/wifi_mem.patch) := $(WIFI_OPT) # libnl diff --git a/repos/dde_linux/recipes/pkg/wifi/runtime b/repos/dde_linux/recipes/pkg/wifi/runtime old mode 100755 new mode 100644 index ed1eec506..2a6568275 --- a/repos/dde_linux/recipes/pkg/wifi/runtime +++ b/repos/dde_linux/recipes/pkg/wifi/runtime @@ -27,13 +27,15 @@ - + + - - - - + + + + + diff --git a/repos/dde_linux/recipes/raw/wifi_firmware/content.mk b/repos/dde_linux/recipes/raw/wifi_firmware/content.mk index 270f5b817..e4fafce22 100644 --- a/repos/dde_linux/recipes/raw/wifi_firmware/content.mk +++ b/repos/dde_linux/recipes/raw/wifi_firmware/content.mk @@ -1,14 +1,15 @@ PORT_DIR := $(call port_dir,$(REP_DIR)/ports/dde_linux) -content: ucode_files LICENSE.iwlwifi +content: ucode_files LICENSE.wifi_drv .PHONY: ucode_files ucode_files: cp $(PORT_DIR)/firmware/*.ucode . + cp $(PORT_DIR)/firmware/regulatory.db . -LICENSE.iwlwifi: - for i in $(PORT_DIR)/firmware/LICENSE.*; do \ +LICENSE.wifi_drv: + for i in $(PORT_DIR)/firmware/LICEN*E.*; do \ echo "$${i##*/}:" >> $@; \ cat $$i >> $@; \ echo >> $@; \ diff --git a/repos/dde_linux/run/wifi.run b/repos/dde_linux/run/wifi.run index a84e6bfb4..e2f35b1d2 100644 --- a/repos/dde_linux/run/wifi.run +++ b/repos/dde_linux/run/wifi.run @@ -86,15 +86,14 @@ append config { - - - - - - - - - + + + + + + + + @@ -123,10 +122,12 @@ set firmware_modules { iwlwifi-6000-4.ucode iwlwifi-6000g2a-6.ucode iwlwifi-6000g2b-6.ucode - iwlwifi-7260-16.ucode - iwlwifi-7265-16.ucode - iwlwifi-7265D-16.ucode - iwlwifi-8000C-16.ucode + iwlwifi-7260-17.ucode + iwlwifi-7265-17.ucode + iwlwifi-7265D-29.ucode + iwlwifi-8000C-36.ucode + iwlwifi-8265-36.ucode + regulatory.db } # diff --git a/repos/dde_linux/src/drivers/wifi/target.mk b/repos/dde_linux/src/drivers/wifi/target.mk index b16efb588..2e953c2a2 100644 --- a/repos/dde_linux/src/drivers/wifi/target.mk +++ b/repos/dde_linux/src/drivers/wifi/target.mk @@ -2,7 +2,8 @@ REQUIRES = x86 TARGET = wifi_drv SRC_CC = main.cc -LIBS = base wifi iwl_firmware wpa_supplicant +LIBS = base wifi iwl_firmware +LIBS += wpa_supplicant # needed for firmware.h INC_DIR += $(REP_DIR)/src/lib/wifi/include diff --git a/repos/dde_linux/src/lib/libnl/include/linux/errqueue.h b/repos/dde_linux/src/lib/libnl/include/linux/errqueue.h new file mode 100644 index 000000000..e69de29bb diff --git a/repos/dde_linux/src/lib/libnl/include/linux/filter.h b/repos/dde_linux/src/lib/libnl/include/linux/filter.h new file mode 100644 index 000000000..e69de29bb diff --git a/repos/dde_linux/src/lib/libnl/include/netpacket/packet.h b/repos/dde_linux/src/lib/libnl/include/netpacket/packet.h new file mode 100644 index 000000000..e69de29bb diff --git a/repos/dde_linux/src/lib/libnl/socket.cc b/repos/dde_linux/src/lib/libnl/socket.cc index ce1bc52d3..61afe0c6a 100644 --- a/repos/dde_linux/src/lib/libnl/socket.cc +++ b/repos/dde_linux/src/lib/libnl/socket.cc @@ -393,17 +393,20 @@ int setsockopt(int sockfd, int level, int optname, const void *optval, if (!s) return -1; - /* FIXME optval values */ - int const err = socket_call.setsockopt(s, - sockopt_level(level), - sockopt_name(level, optname), - optval, optlen); - if (err < 0) { - errno = -err; - return 1; - } + try { + /* FIXME optval values */ + int const err = + socket_call.setsockopt(s, + sockopt_level(level), + sockopt_name(level, optname), + optval, optlen); + if (err < 0) { + errno = -err; + return 1; + } + } catch (Invalid_arg) { return -1; } - return err; + return 0; } diff --git a/repos/dde_linux/src/lib/wifi/dummies.cc b/repos/dde_linux/src/lib/wifi/dummies.cc index ea311378a..70b44e4c9 100644 --- a/repos/dde_linux/src/lib/wifi/dummies.cc +++ b/repos/dde_linux/src/lib/wifi/dummies.cc @@ -78,6 +78,7 @@ DUMMY_RET(1, ns_capable) DUMMY_RET(0, sock_tx_timestamp) /* not needed */ +DUMMY_SKIP(0, module_put_and_exit) DUMMY_SKIP(-1, might_sleep) DUMMY_SKIP(-1, read_lock_bh) DUMMY_SKIP(-1, read_unlock_bh) @@ -173,7 +174,6 @@ DUMMY(-1, raw_notifier_chain_unregister) DUMMY(-1, vlan_do_receive) DUMMY(-1, vlan_untag) DUMMY(-1, yield) -DUMMY(0, IS_ERR) DUMMY(0, __raise_softirq_irqoff) DUMMY(0, __this_cpu_read) DUMMY(-1, add_device_randomness) @@ -201,13 +201,10 @@ DUMMY(0, genlmsg_multicast_netns) DUMMY(0, genlmsg_reply) DUMMY(0, genlmsg_unicast) DUMMY(0, get_cpu) -DUMMY(0, get_random_bytes) DUMMY(0, get_seconds) DUMMY(0, hweight16) DUMMY(0, hweight64) -DUMMY(0, idr_alloc) DUMMY(0, idr_destroy) -DUMMY(0, idr_find) DUMMY(0, idr_for_each) DUMMY(0, idr_init) DUMMY(0, idr_remove) @@ -313,7 +310,7 @@ DUMMY(0, atomic_notifier_chain_register) DUMMY(0, __get_free_pages) DUMMY(0, __get_free_page) DUMMY(0, __set_current_state) -DUMMY(0, add_wait_queue) +// DUMMY(0, add_wait_queue) DUMMY(0, add_wait_queue_exclusive) DUMMY(0, atomic_notifier_call_chain) DUMMY(0, cond_resched) @@ -342,7 +339,6 @@ DUMMY(-1, __this_cpu_write) DUMMY(-1, csum_block_add_ext) DUMMY(-1, csum_partial_ext) DUMMY(-1, genl_register_family_with_ops_groups) -DUMMY(-1, ktime_sub) DUMMY(-1, sg_init_one) DUMMY(-1, vlan_hw_offload_capable) DUMMY(-1, vlan_tx_tag_get_id) @@ -427,7 +423,6 @@ DUMMY(0, csum_sub) DUMMY(0, csum_tcpudp_nofold) DUMMY(0, devm_clk_get) DUMMY(0, devm_gpiod_get_index) -DUMMY(0, devm_kzalloc) DUMMY(0, file_inode) DUMMY(0, gpiod_direction_output) DUMMY(0, gpiod_set_value) @@ -443,8 +438,6 @@ DUMMY(0, input_unregister_handler) DUMMY(0, ip_hdrlen) DUMMY(0, ipv6_authlen) DUMMY(0, ipv6_optlen) -DUMMY(0, ktime_to_timespec) -DUMMY(0, ktime_to_timeval) DUMMY(0, misc_deregister) DUMMY(0, net_gso_ok) DUMMY(0, nosteal_pipe_buf_ops) @@ -496,7 +489,6 @@ DUMMY(0, ethtool_cmd_speed) DUMMY(0, flush_dcache_page) DUMMY(0, getnstimeofday) DUMMY(0, ip_check_defrag) -DUMMY(0, ktime_to_timespec_cond) DUMMY(0, netdev_get_tx_queue) DUMMY(0, offset_in_page) DUMMY(0, prandom_u32_max) @@ -541,8 +533,7 @@ DUMMY(0, release_pages) DUMMY(0, sk_busy_loop) DUMMY(0, sk_can_busy_loop) -DUMMY_SKIP(0, complete_all) -DUMMY_SKIP(0, module_put_and_exit) +// DUMMY_SKIP(0, complete_all) DUMMY_SKIP(0, simple_strtol) DUMMY_SKIP(0, alg_test) @@ -559,13 +550,13 @@ DUMMY(0, config_enabled) DUMMY(0, dev_change_proto_down) DUMMY(0, dev_get_iflink) DUMMY(0, dev_get_phys_port_name) -DUMMY(0, device_create_with_groups) +DUMMY(-1, device_create_with_groups) DUMMY(0, device_enable_async_suspend) DUMMY(0, fatal_signal_pending) DUMMY_RET(1, file_ns_capable) DUMMY(0, flow_keys_dissector) DUMMY(0, get_net_ns_by_id) -DUMMY(0, gfpflags_allow_blocking) +DUMMY_SKIP(0, gfpflags_allow_blocking) DUMMY(0, init_dummy_netdev) DUMMY(0, napi_gro_flush) DUMMY(0, netdev_start_xmit) diff --git a/repos/dde_linux/src/lib/wifi/dummies_new.c b/repos/dde_linux/src/lib/wifi/dummies_new.c new file mode 100644 index 000000000..ca47648a9 --- /dev/null +++ b/repos/dde_linux/src/lib/wifi/dummies_new.c @@ -0,0 +1,515 @@ +/* + * \brief Dummy functions + * \author Josef Soentgen + * \date 2018-04-26 + */ + +/* + * Copyright (C) 2018 Genode Labs GmbH + * + * This file is distributed under the terms of the GNU General Public License + * version 2. + */ + +/* local includes */ +#include + +#if 1 +#define TRACE \ + do { \ + lx_printf("%s not implemented from: %p\n", __func__, \ + __builtin_return_address(0)); \ + } while (0) +#define TRACE_OK \ + do { \ + lx_printf("%s not implemented but OK\n", __func__); \ + } while (0) +#else +#define TRACE do { ; } while (0) +#define TRACE_OK do { ; } while (0) +#endif + + +void __dev_xdp_query(struct net_device *dev, bpf_op_t xdp_op, struct netdev_bpf *xdp) +{ + TRACE; +} + + +int __ethtool_get_link_ksettings(struct net_device *dev, + struct ethtool_link_ksettings *link_ksettings) +{ + TRACE; + return -1; +} + + +u32 __skb_get_hash_symmetric(const struct sk_buff *skb) +{ + TRACE; + return 0; +} + + +// typedef int (*bpf_op_t)(struct net_device *dev, struct netdev_bpf *bpf); +// struct bpf_prog *bpf_prog_get_type(u32 ufd, enum bpf_prog_type type) +// { +// TRACE; +// return NULL; +// } + + +struct sk_buff **call_gro_receive(gro_receive_t cb, struct sk_buff **head, struct sk_buff *skb) +{ + TRACE; + return NULL; +} + + +struct user_struct *current_user() +{ + TRACE; + return NULL; +} + + +int dev_change_tx_queue_len(struct net_device *dev, unsigned long d) +{ + TRACE; + return -1; +} + + +int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack, + int fd, u32 flags) +{ + TRACE; + return -1; +} + + +int dev_get_alias(const struct net_device *dev, char *p, size_t n) +{ + TRACE; + return -1; +} + + +int dev_recursion_level(void) +{ + TRACE; + return 0; +} + + +bool dev_validate_header(const struct net_device *dev, char *ll_header, int len) +{ + TRACE; + return false; +} + + +void free_uid(struct user_struct *user) +{ + TRACE; +} + + +void iov_iter_revert(struct iov_iter *i, size_t bytes) +{ + TRACE; +} + + +kuid_t make_kuid(struct user_namespace *from, uid_t uid) +{ + TRACE; + return 0; +} + + +void memalloc_noreclaim_restore(unsigned int flags) +{ + TRACE; +} + + +unsigned int memalloc_noreclaim_save(void) +{ + TRACE; + return 0; +} + + +u64 ktime_get_ns(void) +{ + TRACE; + return 0; +} + +struct fq_flow *fq_flow_classify(struct fq *fq, struct fq_tin *tin, + struct sk_buff *skb, + fq_flow_get_default_t get_default_func) +{ + TRACE; + return 0; +} + + + +void fq_flow_init(struct fq_flow *flow) +{ + TRACE; +} + + +int fq_init(struct fq *fq, int flows_cnt) +{ + TRACE; + return -1; +} + + +void fq_recalc_backlog(struct fq *fq, struct fq_tin *tin, struct fq_flow *flow) +{ + TRACE; +} + + +void fq_reset(struct fq *fq, fq_skb_free_t free_func) +{ + TRACE; +} + + +void fq_tin_enqueue(struct fq *fq, struct fq_tin *tin, struct sk_buff *skb, + fq_skb_free_t free_func, fq_flow_get_default_t get_default_func) +{ + TRACE; +} + + +void fq_tin_filter(struct fq *fq, struct fq_tin *tin, fq_skb_filter_t filter_func, + void *filter_data, fq_skb_free_t free_func) +{ + TRACE; +} + + +void fq_tin_init(struct fq_tin *tin) +{ + TRACE; +} + + +void fq_tin_reset(struct fq *fq, struct fq_tin *tin, fq_skb_free_t free_func) +{ + TRACE; +} + + +int irq_set_affinity_hint(unsigned int irq, const struct cpumask *m) +{ + TRACE; + return 0; +} + + +struct net_device *netdev_master_upper_dev_get_rcu(struct net_device *dev) +{ + TRACE; + return NULL; +} + + +void netdev_rss_key_fill(void *buffer, size_t len) +{ + TRACE; + /* XXX get_random_once() to fill cmd.secret_key */ +} + + +const void *of_get_mac_address(struct device_node *np) +{ + TRACE; + return NULL; +} + + +struct device_node * pci_device_to_OF_node(const struct pci_dev *pdev) +{ + TRACE; + return NULL; +} + + +int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, + int minvec, int maxvec) +{ + TRACE; + return -1; +} + + +int pci_find_ext_capability(struct pci_dev *dev, int cap) +{ + TRACE; + return -1; +} + + +int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask) +{ + // TRACE_OK; + return 0; +} + + +int pci_set_dma_mask(struct pci_dev *dev, u64 mask) +{ + // TRACE_OK; + return 0; +} + + +struct pci_dev *pcie_find_root_port(struct pci_dev *dev) +{ + TRACE; + return NULL; +} + + +int pcim_enable_device(struct pci_dev *pdev) +{ + TRACE; + return 0; +} + + +bool pm_runtime_active(struct device *dev) +{ + TRACE; + return true; +} + + +void pm_runtime_allow(struct device *dev) +{ + TRACE; +} + + +void pm_runtime_forbid(struct device *dev) +{ + TRACE; +} + + +int pm_runtime_get(struct device *dev) +{ + TRACE; + return 1; +} + + +void pm_runtime_mark_last_busy(struct device *dev) +{ + TRACE; +} + + +int pm_runtime_put_autosuspend(struct device *dev) +{ + TRACE; + return -1; +} + + +int pm_runtime_resume(struct device *dev) +{ + TRACE; + return 1; +} + + +int pm_runtime_set_active(struct device *dev) +{ + TRACE; + return 0; +} + + +void pm_runtime_set_autosuspend_delay(struct device *dev, int delay) +{ + TRACE; +} + + +bool pm_runtime_suspended(struct device *dev) +{ + // TRACE_OK; + return false; +} + + +void pm_runtime_use_autosuspend(struct device *dev) +{ + TRACE; +} + + +void pm_wakeup_event(struct device *dev, unsigned int msec) +{ + TRACE; +} + + +void reuseport_detach_sock(struct sock *sk) +{ + TRACE; +} + + +int sg_nents(struct scatterlist *sg) +{ + TRACE; + return -1; +} + + +size_t sg_pcopy_from_buffer(struct scatterlist *sgl, unsigned int nents, + const void *buf, size_t buflen, off_t skip) +{ + TRACE; + return 0; +} + + +int sk_reuseport_attach_bpf(u32 ufd, struct sock *sk) +{ + TRACE; + return -1; +} + + +int sk_reuseport_attach_filter(struct sock_fprog *fprog, struct sock *sk) +{ + TRACE; + return -1; +} + + +void skb_gro_flush_final(struct sk_buff *skb, struct sk_buff **pp, int flush) +{ + TRACE; +} + + +void *skb_gro_header_fast(struct sk_buff *skb, unsigned int offset) +{ + TRACE; + return NULL; +} + + +int skb_gro_header_hard(struct sk_buff *skb, unsigned int hlen) +{ + TRACE; + return 0; // XXX +} + + +void *skb_gro_header_slow(struct sk_buff *skb, unsigned int hlen, unsigned int offset) +{ + TRACE; + return NULL; +} + + +void skb_gro_postpull_rcsum(struct sk_buff *skb, const void *start, unsigned int len) +{ + TRACE; +} + + +void skb_gro_pull(struct sk_buff *skb, unsigned int len) +{ + TRACE; +} + + +u64 sock_gen_cookie(struct sock *sk) +{ + TRACE; + return 0; +} + + +unsigned int u64_stats_fetch_begin(const struct u64_stats_sync *syncp) +{ + // TRACE; + return 0; +} + + +unsigned int u64_stats_fetch_begin_irq(const struct u64_stats_sync *syncp) +{ + // TRACE; + return 0; +} + + +bool u64_stats_fetch_retry(const struct u64_stats_sync *syncp, unsigned int start) +{ + // TRACE; + return false; +} + + +bool u64_stats_fetch_retry_irq(const struct u64_stats_sync *syncp, unsigned int start) +{ + // TRACE; + return false; +} + + +void u64_stats_init(struct u64_stats_sync *syncp) +{ + // TRACE; +} + + +struct sk_buff *validate_xmit_skb_list(struct sk_buff *skb, struct net_device *dev, + bool *again) +{ + TRACE; + return NULL; +} + +int virtio_net_hdr_from_skb(const struct sk_buff *skb, struct virtio_net_hdr *hdr, + bool little_endian, bool has_data_valid) +{ + TRACE; + return -1; +} + + +int virtio_net_hdr_to_skb(struct sk_buff *skb, const struct virtio_net_hdr *hdr, + bool little_endian) +{ + TRACE; + return -1; +} + + +void wireless_nlevent_flush(void) +{ + TRACE; +} + + +bool wq_has_sleeper(struct wait_queue_head *wq_head) +{ + TRACE; + return true; +} diff --git a/repos/dde_linux/src/lib/wifi/firmware.cc b/repos/dde_linux/src/lib/wifi/firmware.cc new file mode 100644 index 000000000..d2797b87f --- /dev/null +++ b/repos/dde_linux/src/lib/wifi/firmware.cc @@ -0,0 +1,107 @@ +/* + * \brief Linux wireless stack + * \author Josef Soentgen + * \date 2018-06-29 + */ + +/* + * Copyright (C) 2018 Genode Labs GmbH + * + * This file is distributed under the terms of the GNU General Public License + * version 2. + */ + +/* Genode includes */ +#include + +/* local includes */ +#include +#include +#include + + +Firmware_list fw_list[] = { + { "regulatory.db", 4144, nullptr }, + + { "iwlwifi-1000-5.ucode", 337520, nullptr }, + { "iwlwifi-3160-17.ucode", 918268, nullptr }, + { "iwlwifi-6000-4.ucode", 454608, nullptr }, + { "iwlwifi-6000-6.ucode", 454608, "iwlwifi-6000-4.ucode" }, + { "iwlwifi-6000g2a-6.ucode", 677296, nullptr }, + { "iwlwifi-6000g2b-6.ucode", 679436, nullptr }, + { "iwlwifi-7260-17.ucode", 1049340, nullptr }, + { "iwlwifi-7265-16.ucode", 1180412, nullptr }, + { "iwlwifi-7265D-22.ucode", 1028376, nullptr }, + { "iwlwifi-7265D-29.ucode", 1036432, nullptr }, + { "iwlwifi-8000C-22.ucode", 2120860, nullptr }, + { "iwlwifi-8000C-36.ucode", 2486572, nullptr }, + { "iwlwifi-8265-22.ucode", 1811984, nullptr }, + { "iwlwifi-8265-36.ucode", 2498044, nullptr } +}; + + +size_t fw_list_len = sizeof(fw_list) / sizeof(fw_list[0]); + + +/********************** + ** linux/firmware.h ** + **********************/ + +int request_firmware_nowait(struct module *module, bool uevent, + const char *name, struct device *device, + gfp_t gfp, void *context, + void (*cont)(const struct firmware *, void *)) +{ + /* only try to load known firmware images */ + Firmware_list *fwl = 0; + for (size_t i = 0; i < fw_list_len; i++) { + if (Genode::strcmp(name, fw_list[i].requested_name) == 0) { + fwl = &fw_list[i]; + break; + } + } + + if (!fwl) { + Genode::error("firmware '", name, "' is not in the firmware white list"); + return -1; + } + + char const *fw_name = fwl->available_name + ? fwl->available_name : fwl->requested_name; + Genode::Rom_connection rom(Lx_kit::env().env(), fw_name); + Genode::Dataspace_capability ds_cap = rom.dataspace(); + + if (!ds_cap.valid()) { + Genode::error("could not get firmware ROM dataspace"); + return -1; + } + + struct firmware *fw = (struct firmware *)kzalloc(sizeof(struct firmware), 0); + if (!fw) { + Genode::error("could not allocate memory for firmware metadata"); + return -1; + } + + /* use allocator because fw is too big for slab */ + if (!Lx_kit::env().heap().alloc(fwl->size, (void**)&fw->data)) { + Genode::error("Could not allocate memory for firmware image"); + kfree(fw); + return -1; + } + + void const *image = Lx_kit::env().env().rm().attach(ds_cap); + Genode::memcpy((void*)fw->data, image, fwl->size); + Lx_kit::env().env().rm().detach(image); + + fw->size = fwl->size; + + cont(fw, context); + + return 0; +} + +void release_firmware(const struct firmware *fw) +{ + Lx_kit::env().heap().free(const_cast(fw->data), fw->size); + kfree(fw); +} diff --git a/repos/dde_linux/src/lib/wifi/include/lx_emul.h b/repos/dde_linux/src/lib/wifi/include/lx_emul.h index bb39546d9..4b3972536 100644 --- a/repos/dde_linux/src/lib/wifi/include/lx_emul.h +++ b/repos/dde_linux/src/lib/wifi/include/lx_emul.h @@ -34,17 +34,13 @@ enum { HZ = 100 }; #include + /*************** ** asm/bug.h ** ***************/ #include -#define BUILD_BUG_ON(condition) - -#define BUILD_BUG_ON_NOT_POWER_OF_2(n) \ - BUILD_BUG_ON((n) == 0 || (((n) & ((n) - 1)) != 0)) - /********************* ** asm/processor.h ** @@ -59,19 +55,19 @@ void cpu_relax(void); #include -static inline int atomic_dec_if_positive(atomic_t *v) -{ - int c, old, dec; - c = atomic_read(v); - for (;;) { - dec = c - 1; - if (dec < 0) break; - old = atomic_cmpxchg((v), c, dec); - if (old == c) break; - c = old; - } - return dec; -} +// static inline int atomic_dec_if_positive(atomic_t *v) +// { +// int c, old, dec; +// c = atomic_read(v); +// for (;;) { +// dec = c - 1; +// if (dec < 0) break; +// old = atomic_cmpxchg((v), c, dec); +// if (old == c) break; +// c = old; +// } +// return dec; +// } static inline void atomic_long_set(atomic_long_t *l, long i) { @@ -79,6 +75,14 @@ static inline void atomic_long_set(atomic_long_t *l, long i) } +static inline int atomic_long_cmpxchg(atomic_long_t *v, long old, long n) +{ + return cmpxchg(&v->counter, old, n); +} + + + + /******************* ** linux/types.h ** *******************/ @@ -96,6 +100,36 @@ typedef long __kernel_suseconds_t; #define DECLARE_BITMAP(name,bits) \ unsigned long name[BITS_TO_LONGS(bits)] +typedef unsigned __poll_t; + + +/****************** + ** linux/init.h ** + ******************/ + +#define fs_initcall(fn) void fs_##fn(void) { fn(); } +#define late_initcall(fn) void late_##fn(void) { fn(); } + + +/********************* + ** linux/cpumask.h ** + *********************/ + +#define NR_CPUS 1U +#define cpu_online_mask (NULL) +#define num_online_cpus() NR_CPUS +typedef struct cpumask { unsigned long bits[1]; } cpumask_t; + +static inline void cpumask_set_cpu(unsigned int cpu, struct cpumask *dstp) +{ + dstp->bits[0] = 1U << cpu; +} + +static inline unsigned int cpumask_next(int n, const struct cpumask *srcp) +{ + return n+1; +} + /************************ ** uapi/linux/types.h ** @@ -195,12 +229,22 @@ static inline void __read_once_size(const volatile void *p, void *res, int size) } } +#ifdef __cplusplus +#define READ_ONCE(x) \ +({ \ + barrier(); \ + x; \ +}) +#else #define READ_ONCE(x) \ ({ \ union { typeof(x) __val; char __c[1]; } __u; \ __read_once_size(&(x), __u.__c, sizeof(x)); \ __u.__val; \ }) +#endif /* __cplusplus */ + +#define __randomize_layout /************************** @@ -215,6 +259,31 @@ static inline void __read_once_size(const volatile void *p, void *res, int size) #define OPTIMIZER_HIDE_VAR(var) __asm__ ("" : "=r" (var) : "0" (var)) +#define __pure __attribute__((pure)) +#define __weak __attribute__((weak)) +#define __aligned_largest __attribute__((aligned)) + + +/********************** + ** linux/refcount.h ** + **********************/ + +typedef struct +{ + atomic_t refs; +} refcount_t; + + +void refcount_add(unsigned int i, refcount_t *r); +void refcount_inc(refcount_t *r); +bool refcount_inc_not_zero(refcount_t *r); +void refcount_dec(refcount_t *r); +unsigned int refcount_read(const refcount_t *r); +bool refcount_dec_and_test(refcount_t *r); +void refcount_set(refcount_t *r, unsigned int n); +bool refcount_dec_and_test(refcount_t *r); +bool refcount_sub_and_test(unsigned int i, refcount_t *r); + /******************** ** linux/module.h ** @@ -287,6 +356,21 @@ struct page } __attribute((packed)); +/********************** + ** linux/page_ref.h ** + **********************/ + +static inline void page_ref_inc(struct page *page) +{ + atomic_inc(&page->_count); +} + +static inline int page_ref_count(struct page *page) +{ + return atomic_read(&page->_count); +} + + /************************ ** linux/page-flags.h ** ************************/ @@ -297,6 +381,7 @@ enum pageflags }; #define PageSlab(page) test_bit(PG_slab, &(page)->flags) +#define PageHighMem(__p) 0 /********************** @@ -360,11 +445,15 @@ void free_pages(unsigned long, unsigned int); void __free_pages(struct page *page, unsigned int order); void __free_page_frag(void *addr); +#define __free_page(page) __free_pages((page), 0) + bool gfpflags_allow_blocking(const gfp_t gfp_flags); void *__alloc_page_frag(struct page_frag_cache *nc, unsigned int fragsz, gfp_t gfp_mask); +void page_frag_free(void *addr); +void *page_frag_alloc(struct page_frag_cache *nc, unsigned int fragsz, gfp_t gfp_mask); /******************** ** linux/string.h ** @@ -372,6 +461,10 @@ void *__alloc_page_frag(struct page_frag_cache *nc, #include +void memzero_explicit(void *s, size_t count); + +bool sysfs_streq(const char *s1, const char *s2); + /********************** ** linux/spinlock.h ** @@ -379,6 +472,11 @@ void *__alloc_page_frag(struct page_frag_cache *nc, #include +int spin_is_locked(spinlock_t *lock); +void free_bucket_spinlocks(spinlock_t *locks); +int alloc_bucket_spinlocks(spinlock_t **locks, unsigned int *locks_mask, + size_t max_size, unsigned int cpu_mult, gfp_t gfp); + /******************* ** linux/mutex.h ** @@ -405,12 +503,7 @@ void *__alloc_page_frag(struct page_frag_cache *nc, char *kasprintf(gfp_t gfp, const char *fmt, ...); int kstrtouint(const char *s, unsigned int base, unsigned int *res); -#define PTR_ALIGN(p, a) ({ \ - unsigned long _p = (unsigned long)p; \ - _p = (_p + a - 1) & ~(a - 1); \ - p = (typeof(p))_p; \ - p; \ -}) +#define PTR_ALIGN(p, a) ((typeof(p))ALIGN((unsigned long)(p), (a))) static inline u32 reciprocal_scale(u32 val, u32 ep_ro) { @@ -446,6 +539,8 @@ int sscanf(const char *, const char *, ...); #define S32_MAX ((s32)(U32_MAX>>1)) #define S32_MIN ((s32)(-S32_MAX - 1)) +#define sched_annotate_sleep() do { } while (0) + /********************* ** linux/jiffies.h ** @@ -455,6 +550,8 @@ int sscanf(const char *, const char *, ...); static inline unsigned int jiffies_to_usecs(const unsigned long j) { return j * JIFFIES_TICK_US; } +#define time_is_before_jiffies(a) time_after(jiffies, a) + /****************** ** linux/time.h ** @@ -472,7 +569,7 @@ unsigned long get_seconds(void); void getnstimeofday(struct timespec *); #define do_posix_clock_monotonic_gettime(ts) ktime_get_ts(ts) -#define ktime_to_ns(kt) ((kt).tv64) +#define ktime_to_ns(kt) ((kt) struct timespec ktime_to_timespec(const ktime_t kt); bool ktime_to_timespec_cond(const ktime_t kt, struct timespec *ts); @@ -482,7 +579,7 @@ s64 ktime_us_delta(const ktime_t, const ktime_t); static inline s64 ktime_to_ms(const ktime_t kt) { - return kt.tv64 / NSEC_PER_MSEC; + return kt / NSEC_PER_MSEC; } static inline void ktime_get_ts(struct timespec *ts) @@ -498,6 +595,13 @@ static inline void ktime_get_ts(struct timespec *ts) #include +#define from_timer(var, callback_timer, timer_fieldname) \ + container_of(callback_timer, typeof(*var), timer_fieldname) + +enum { + TIMER_DEFERRABLE = 0x00080000, +}; + /********************* ** linux/kconfig.h ** @@ -543,6 +647,9 @@ static inline void put_unaligned_be16(u16 val, void *p) { static inline void put_unaligned_le32(u32 val, void *p) { *((__le32 *)p) = cpu_to_le32(val); } +static inline void put_unaligned_be64(u64 val, void *p) { + *((__be64 *)p) = cpu_to_be64(val); } + static inline u16 get_unaligned_le16(const void *p) { const struct __una_u16 *ptr = (const struct __una_u16 *)p; @@ -561,6 +668,13 @@ static inline u16 get_unaligned_be16(const void *p) return (be[1]<<0)|(be[0]<<8); } +static inline u64 get_unaligned_be64(const void *p) +{ + const __u64 *be = (__u64*)p; + return ((((u64)(be[3]<<0)|(be[2]<<8)|(be[1]<<16)|(be[0]<<24))<<32)| + (((u32)(be[7]<<0)|(be[6]<<8)|(be[5]<<16)|(be[4]<<24)))); +} + void put_unaligned_le64(u64 val, void *p); #define put_unaligned(val, ptr) ({ \ @@ -581,11 +695,12 @@ void put_unaligned_le64(u64 val, void *p); } \ (void)0; }) +static inline void le16_add_cpu(__le16 *var, u16 val) { + *var = cpu_to_le16(le16_to_cpu(*var) + val); } static inline void le32_add_cpu(__le32 *var, u32 val) { *var = cpu_to_le32(le32_to_cpu(*var) + val); } - static inline u32 __get_unaligned_cpu32(const void *p) { const struct __una_u32 *ptr = (const struct __una_u32 *)p; @@ -623,6 +738,16 @@ unsigned int hweight64(__u64 w); static inline unsigned long hweight_long(unsigned long w) { return sizeof(w) == 4 ? hweight32(w) : hweight64(w); } +#define GENMASK(h, l) \ + (((~0UL) - (1UL << (l)) + 1) & (~0UL >> (BITS_PER_LONG - 1 - (h)))) + + +/************************************* + ** asm-generic/bitops/non-atomic.h ** + *************************************/ + +static inline int test_bit(int nr, const volatile unsigned long *addr); + /******************************* ** asm-generic/bitops/find.h ** @@ -676,6 +801,14 @@ bool page_is_pfmemalloc(struct page *page); #define PAGE_ALIGNED(addr) IS_ALIGNED((unsigned long)addr, PAGE_SIZE) +/********************** + ** linux/sched/mm.h ** + **********************/ + +void memalloc_noreclaim_restore(unsigned int flags); +unsigned int memalloc_noreclaim_save(void); + + /********************* ** linux/kobject.h ** *********************/ @@ -689,7 +822,6 @@ enum kobject_action KOBJ_CHANGE, }; -void kobject_put(struct kobject *); int kobject_uevent(struct kobject *, enum kobject_action); int kobject_uevent_env(struct kobject *kobj, enum kobject_action action, char *envp[]); @@ -728,15 +860,21 @@ enum { }; void *kzalloc(size_t size, gfp_t flags); +void *kvzalloc(size_t size, gfp_t flags); void kfree(const void *); void kzfree(const void *); void *kmalloc(size_t size, gfp_t flags); void *kcalloc(size_t n, size_t size, gfp_t flags); void *kmalloc_array(size_t n, size_t size, gfp_t flags); +void *kvmalloc(size_t size, gfp_t flags); void kvfree(const void *); struct kmem_cache; struct kmem_cache *kmem_cache_create(const char *, size_t, size_t, unsigned long, void (*)(void *)); +struct kmem_cache *kmem_cache_create_usercopy(const char *name, + size_t size, size_t align, slab_flags_t flags, + size_t useroffset, size_t usersize, + void (*ctor)(void *)); void kmem_cache_destroy(struct kmem_cache *); void *kmem_cache_alloc(struct kmem_cache *, gfp_t); void *kmem_cache_zalloc(struct kmem_cache *k, gfp_t flags); @@ -748,6 +886,7 @@ static inline void *kmem_cache_alloc_node(struct kmem_cache *s, gfp_t flags, int return kmem_cache_alloc(s, flags); } +void kmem_cache_free_bulk(struct kmem_cache *, size_t, void **); /************************* ** linux/irq_cpustat.h ** @@ -783,8 +922,10 @@ static inline int no_printk(const char *fmt, ...) { return 0; } #define pr_alert(fmt, ...) printk(KERN_ALERT fmt, ##__VA_ARGS__) #define pr_crit(fmt, ...) printk(KERN_CRIT fmt, ##__VA_ARGS__) #define pr_err(fmt, ...) printk(KERN_ERR fmt, ##__VA_ARGS__) +#define pr_err_once(fmt, ...) printk(KERN_ERR fmt, ##__VA_ARGS__) #define pr_warning(fmt, ...) printk(KERN_WARN fmt, ##__VA_ARGS__) #define pr_warn(fmt, ...) printk(KERN_WARN fmt, ##__VA_ARGS__) +#define pr_warn_once pr_warn #define pr_notice(fmt, ...) printk(KERN_NOTICE fmt, ##__VA_ARGS__) #define pr_info(fmt, ...) printk(KERN_INFO fmt, ##__VA_ARGS__) #define pr_cont(fmt, ...) printk(KERN_CONT fmt, ##__VA_ARGS__) @@ -835,23 +976,22 @@ struct workqueue_struct; /* XXX fix in lx_emul/work.h */ enum { WQ_UNBOUND = 1<<1, // WQ_MEM_RECLAIM = 1<<3, - WQ_HIGHPRI = 1<<4, + // WQ_HIGHPRI = 1<<4, // WQ_CPU_INTENSIVE = 1<<5, }; extern struct workqueue_struct *system_power_efficient_wq; -#undef DECLARE_DELAYED_WORK -/* XXX gives incompatible pointers warning */ -#define DECLARE_DELAYED_WORK(n, f) \ - struct delayed_work n = { { .function = f } }; - /****************** ** linux/wait.h ** ******************/ -long wait_woken(wait_queue_t *wait, unsigned mode, long timeout); +#define key_to_poll(m) ((__force __poll_t)(uintptr_t)(void *)(m)) + +long wait_woken(wait_queue_entry_t *wait, unsigned mode, long timeout); + +bool wq_has_sleeper(struct wait_queue_head *wq_head); /****************** @@ -965,6 +1105,12 @@ void pm_runtime_set_autosuspend_delay(struct device *dev, int delay); int pm_runtime_get_sync(struct device *dev); int pm_runtime_put_sync(struct device *dev); int pm_runtime_put(struct device *dev); +bool pm_runtime_suspended(struct device *dev); +bool pm_runtime_active(struct device *dev); +int pm_runtime_resume(struct device *dev); +int pm_runtime_get(struct device *dev); +void pm_runtime_mark_last_busy(struct device *dev); +int pm_runtime_put_autosuspend(struct device *dev); /*********************** @@ -977,6 +1123,8 @@ bool device_may_wakeup(struct device *dev); int device_set_wakeup_enable(struct device *dev, bool enable); bool device_can_wakeup(struct device *dev); +void pm_wakeup_event(struct device *dev, unsigned int msec); + /******************** ** linux/pm_qos.h ** @@ -1158,7 +1306,7 @@ struct class int (*resume)(struct device *dev); const struct kobj_ns_type_operations *ns_type; - const void *(*_namespace)(struct device *dev); + const void *(*namespace)(struct device *dev); const struct dev_pm_ops *pm; }; @@ -1312,6 +1460,8 @@ int devres_release(struct device *dev, dr_release_t release, void *devm_kzalloc(struct device *dev, size_t size, gfp_t gfp); +#define devm_kasprintf(device, ftp, fmt, ...) kasprintf(ftp, "wifi_drv" # fmt, __VA_ARGS__) + static inline const char *dev_driver_string(const struct device *dev) { struct device_driver *drv = dev->driver; @@ -1391,6 +1541,7 @@ struct ifmap { enum { ARPHRD_ETHER = 1, + ARPHRD_INFINIBAND = 32, ARPHRD_IEEE80211_RADIOTAP = 803, ARPHRD_NETLINK = 824, }; @@ -1403,6 +1554,7 @@ enum { enum { ETH_ALEN = 6, /* octets in one ethernet addr */ ETH_HLEN = 14, /* total octets in header */ + ETH_TLEN = 2, ETH_DATA_LEN = 1500, /* Max. octets in payload */ ETH_P_8021Q = 0x8100, /* 802.1Q VLAN Extended Header */ ETH_P_8021AD = 0x88A8, /* 802.1ad Service VLAN */ @@ -1462,6 +1614,29 @@ struct virtio_net_hdr }; +/************************ + ** linux/virtio_net.h ** + ************************/ + +struct sk_buff; + +int virtio_net_hdr_from_skb(const struct sk_buff *skb, + struct virtio_net_hdr *hdr, bool little_endian, + bool has_data_valid); +int virtio_net_hdr_to_skb(struct sk_buff *skb, + const struct virtio_net_hdr *hdr, bool little_endian); + + +/************************** + ** uapi/linux/ethtool.h ** + **************************/ + +struct ethtool_link_settings +{ + __u32 speed; +}; + + /********************* ** linux/ethtool.h ** *********************/ @@ -1528,6 +1703,12 @@ struct ethtool_wolinfo { u32 wolopts; }; + +struct ethtool_link_ksettings +{ + struct ethtool_link_settings base; +}; + struct ethtool_ts_info; struct net_device; @@ -1564,6 +1745,9 @@ int __ethtool_get_settings(struct net_device *dev, struct ethtool_cmd *cmd); u32 ethtool_op_get_link(struct net_device *); int ethtool_op_get_ts_info(struct net_device *, struct ethtool_ts_info *); +int __ethtool_get_link_ksettings(struct net_device *dev, + struct ethtool_link_ksettings *link_ksettings); + /************************** ** uapi/linux/ethtool.h ** @@ -1628,6 +1812,8 @@ int softirq_count(void); #define preempt_disable() barrier() #define preempt_enable() barrier() +#define in_task() (1) + /*********************** ** linux/interrupt.h ** @@ -1673,7 +1859,7 @@ struct idr { int idr_alloc(struct idr *idp, void *ptr, int start, int end, gfp_t gfp_mask); int idr_for_each(struct idr *idp, int (*fn)(int id, void *p, void *data), void *data); -void idr_remove(struct idr *idp, int id); +void *idr_remove(struct idr *, unsigned long id); void idr_destroy(struct idr *idp); void idr_init(struct idr *idp); void *idr_find(struct idr *idr, int id); @@ -1681,6 +1867,15 @@ void *idr_find(struct idr *idr, int id); #define DEFINE_IDA(name) struct ida name; struct ida { unsigned unused; }; +void *idr_get_next(struct idr *idp, int *nextid); + +#define idr_for_each_entry(idp, entry, id) \ + for (id = 0; ((entry) = idr_get_next(idp, &(id))) != NULL; ++id) + +#define IDR_INIT_BASE(base) { 0 } +#define IDR_INIT IDR_INIT_BASE(0) +#define DEFINE_IDR(name) struct idr name = IDR_INIT + /********************** ** linux/rcupdate.h ** @@ -1780,6 +1975,8 @@ void hlist_add_before_rcu(struct hlist_node *,struct hlist_node *); void list_replace_rcu(struct list_head *, struct list_head *); +void hlist_add_tail_rcu(struct hlist_node *n, struct hlist_head *h); + #include @@ -1926,6 +2123,10 @@ void percpu_counter_destroy(struct percpu_counter *fbc); struct u64_stats_sync { unsigned unused; }; +unsigned int u64_stats_fetch_begin_irq(const struct u64_stats_sync *syncp); +bool u64_stats_fetch_retry_irq(const struct u64_stats_sync *syncp, unsigned int start); +void u64_stats_init(struct u64_stats_sync *syncp); + /******************** ** linux/uidgid.h ** @@ -1937,10 +2138,11 @@ typedef unsigned kgid_t; #define GLOBAL_ROOT_UID (kuid_t)0 struct user_namespace; +extern kuid_t make_kuid(struct user_namespace *from, uid_t uid); + extern uid_t from_kuid_munged(struct user_namespace *to, kuid_t uid); extern gid_t from_kgid_munged(struct user_namespace *to, kgid_t gid); - /************************* ** linux/bottom_half.h ** *************************/ @@ -2066,6 +2268,9 @@ static inline unsigned long compare_ether_header(const void *a, const void *b) } +unsigned char *arch_get_platform_mac_address(void); + + /************************ ** net/netns/packet.h ** ************************/ @@ -2076,6 +2281,15 @@ struct netns_packet { }; +/****************************** + ** uapi/net/net_namespace.h ** + ******************************/ + +enum { + NETNSA_NSID_NOT_ASSIGNED = -1, +}; + + /************************* ** net/net_namespace.h ** *************************/ @@ -2135,6 +2349,7 @@ struct pernet_operations extern struct list_head net_namespace_list; +extern struct net init_net; #define __net_initdata #define __net_init @@ -2172,18 +2387,25 @@ int rt_genid(struct net *); void rt_genid_bump(struct net *); int peernet2id(struct net *net, struct net *peer); +int peernet2id_alloc(struct net *net, struct net *peer); +struct net *get_net_ns_by_id(struct net *net, int id); +bool peernet_has_id(struct net *net, struct net *peer); /************************* ** net/netns/generic.h ** *************************/ +enum { MAX_NET_GENERIC_PTR = 16, }; + struct net_generic { unsigned int len; void *ptr[0]; }; +void *net_generic(const struct net *net, unsigned int id); + /******************** ** linux/socket.h ** @@ -2211,19 +2433,30 @@ enum { NETDEV_UP = 0x0001, NETDEV_DOWN = 0x0002, + NETDEV_REBOOT = 0x0003, NETDEV_CHANGE = 0x0004, NETDEV_REGISTER = 0x0005, NETDEV_UNREGISTER = 0x0006, + NETDEV_CHANGEMTU = 0x0007, NETDEV_CHANGEADDR = 0x0008, NETDEV_GOING_DOWN = 0x0009, NETDEV_CHANGENAME = 0x000A, + NETDEV_FEAT_CHANGE = 0x000B, + NETDEV_BONDING_FAILOVER = 0x000C, NETDEV_PRE_UP = 0x000D, NETDEV_PRE_TYPE_CHANGE = 0x000E, + NETDEV_POST_TYPE_CHANGE = 0x000F, NETDEV_POST_INIT = 0x0010, NETDEV_UNREGISTER_FINAL = 0x0011, NETDEV_RELEASE = 0x0012, + NETDEV_NOTIFY_PEERS = 0x0013, NETDEV_JOIN = 0x0014, + NETDEV_CHANGEUPPER = 0x0015, + NETDEV_RESEND_IGMP = 0x0016, + NETDEV_CHANGEINFODATA = 0x0018, NETDEV_BONDING_INFO = 0x0019, + NETDEV_CHANGELOWERSTATE = 0x001B, + NETDEV_CHANGE_TX_QUEUE_LEN = 0x001E, }; enum { @@ -2235,6 +2468,8 @@ enum { enum netdev_priv_flags { IFF_EBRIDGE = 1<<1, + IFF_NO_QUEUE = 1<<21, + }; @@ -2295,6 +2530,20 @@ struct nlmsghdr; struct netdev_phys_item_id; +struct netlink_ext_ack; + +struct netdev_bpf +{ + struct { + u8 prog_attached; + u32 prog_id; + /* flags with which program was installed */ + // u32 prog_flags; + }; +}; + +struct rtnl_link_stats64; + struct net_device_ops { int (*ndo_init)(struct net_device *dev); @@ -2313,13 +2562,17 @@ struct net_device_ops struct ifmap *map); void (*ndo_tx_timeout) (struct net_device *dev); int (*ndo_change_mtu)(struct net_device *dev, int new_mtu); - struct rtnl_link_stats64* (*ndo_get_stats64)(struct net_device *dev, - struct rtnl_link_stats64 *storage); + void (*ndo_get_stats64)(struct net_device *dev, + struct rtnl_link_stats64 *storage); + bool (*ndo_has_offload_stats)(const struct net_device *dev, int attr_id); + int (*ndo_get_offload_stats)(int attr_id, + const struct net_device *dev, + void *attr_data); int (*ndo_set_features)(struct net_device *dev, netdev_features_t features); int (*ndo_set_vf_mac)(struct net_device *dev, int queue, u8 *mac); int (*ndo_set_vf_vlan)(struct net_device *dev, - int queue, u16 vlan, u8 qos); + int queue, u16 vlan, u8 qos, __be16 proto); int (*ndo_set_vf_rate)(struct net_device *dev, int vf, int min_tx_rate, int max_tx_rate); @@ -2340,12 +2593,14 @@ struct net_device_ops struct nlattr *port[]); int (*ndo_get_vf_port)(struct net_device *dev, int vf, struct sk_buff *skb); + int (*ndo_set_vf_guid)(struct net_device *dev, int vf, u64 guid, int guid_type); int (*ndo_set_vf_rss_query_en)(struct net_device *dev, int vf, bool setting); int (*ndo_del_slave)(struct net_device *dev, struct net_device *slave_dev); int (*ndo_add_slave)(struct net_device *dev, - struct net_device *slave_dev); + struct net_device *slave_dev, + struct netlink_ext_ack *extack); int (*ndo_fdb_add)(struct ndmsg *ndm, struct nlattr *tb[], struct net_device *dev, @@ -2361,7 +2616,7 @@ struct net_device_ops struct netlink_callback *cb, struct net_device *dev, struct net_device *filter_dev, - int idx); + int *idx); int (*ndo_bridge_setlink)(struct net_device *dev, struct nlmsghdr *nlh, u16 flags); @@ -2376,6 +2631,7 @@ struct net_device_ops int (*ndo_get_iflink)(const struct net_device *dev); // int (*ndo_change_proto_down)(struct net_device *dev, // bool proto_down); + int (*ndo_bpf)(struct net_device *dev, struct netdev_bpf *bpf); }; struct net_device_stats @@ -2453,6 +2709,9 @@ struct net_device struct net_device_stats stats; atomic_long_t tx_dropped; + atomic_t carrier_up_count; + atomic_t carrier_down_count; + const struct net_device_ops *netdev_ops; const struct ethtool_ops *ethtool_ops; @@ -2472,7 +2731,10 @@ struct net_device unsigned char if_port; /* Selectable AUI, TP,..*/ unsigned char dma; /* DMA channel */ unsigned short hard_header_len; /* hardware hdr length */ + unsigned char min_header_len; unsigned int mtu; + unsigned int min_mtu; + unsigned int max_mtu; unsigned short type; unsigned short needed_headroom; unsigned short needed_tailroom; @@ -2488,6 +2750,8 @@ struct net_device unsigned char *dev_addr; unsigned char _dev_addr[ETH_ALEN]; + struct bpf_prog *xdp_prog; + unsigned int real_num_tx_queues; struct netdev_queue *_tx; @@ -2510,7 +2774,7 @@ struct net_device // NETREG_UNREGISTERING, // NETREG_UNREGISTERED, // NETREG_RELEASED, - // NETREG_DUMMY, + NETREG_DUMMY, } reg_state; union { @@ -2522,7 +2786,9 @@ struct net_device RTNL_LINK_INITIALIZING, } rtnl_link_state:16; - void (*destructor)(struct net_device *dev); + bool needs_free_netdev; + + void (*priv_destructor)(struct net_device *dev); const struct rtnl_link_ops *rtnl_link_ops; unsigned int gso_max_size; @@ -2597,6 +2863,9 @@ bool netif_dormant(const struct net_device *dev); netdev_features_t netif_skb_features(struct sk_buff *skb); bool netif_supports_nofcs(struct net_device *dev); bool netif_xmit_frozen_or_stopped(const struct netdev_queue *dev_queue); +bool netif_xmit_frozen_or_drv_stopped(const struct netdev_queue *dev_queue); + +void netif_set_gso_max_size(struct net_device *dev, unsigned int size); static inline void netif_addr_lock_bh(struct net_device *dev) { } static inline void netif_addr_unlock_bh(struct net_device *dev) { } @@ -2662,6 +2931,7 @@ int dev_set_allmulti(struct net_device *dev, int inc); void dev_set_group(struct net_device *, int); int dev_change_name(struct net_device *, const char *); int dev_set_alias(struct net_device *, const char *, size_t); +int dev_get_alias(const struct net_device *, char *, size_t); int __dev_change_flags(struct net_device *, unsigned int flags); void __dev_notify_flags(struct net_device *, unsigned int old_flags, unsigned int gchanges); int dev_change_flags(struct net_device *, unsigned int); @@ -2687,6 +2957,15 @@ int dev_change_proto_down(struct net_device *dev, bool proto_down); int dev_get_iflink(const struct net_device *dev); int dev_get_phys_port_name(struct net_device *dev, char *name, size_t len); +typedef int (*bpf_op_t)(struct net_device *dev, struct netdev_bpf *bpf); +int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack, int fd, u32 flags); +void __dev_xdp_query(struct net_device *dev, bpf_op_t xdp_op, struct netdev_bpf *xdp); + +int dev_change_tx_queue_len(struct net_device *, unsigned long); +bool dev_validate_header(const struct net_device *dev, char *ll_header, int len); + +void dev_consume_skb_any(struct sk_buff *skb); + enum { LL_MAX_HEADER = 96, /* XXX check CONFIG_WLAN_MESH */ }; @@ -2767,6 +3046,8 @@ unsigned int skb_gro_len(const struct sk_buff *skb); __be16 skb_network_protocol(struct sk_buff *skb, int *depth); bool can_checksum_protocol(netdev_features_t features, __be16 protocol); +struct sk_buff *validate_xmit_skb_list(struct sk_buff *skb, struct net_device *dev, bool *again); + static inline void dev_kfree_skb_any(struct sk_buff *skb) { consume_skb(skb); @@ -2849,6 +3130,30 @@ int init_dummy_netdev(struct net_device *dev); void dev_add_offload(struct packet_offload *po); +struct net_device *netdev_master_upper_dev_get_rcu(struct net_device *dev); + +void netdev_rss_key_fill(void *buffer, size_t len); + +struct packet_offload *gro_find_complete_by_type(__be16 type); +struct packet_offload *gro_find_receive_by_type(__be16 type); +void skb_gro_flush_final(struct sk_buff *skb, struct sk_buff **pp, int flush); +void *skb_gro_header_fast(struct sk_buff *skb, unsigned int offset); +int skb_gro_header_hard(struct sk_buff *skb, unsigned int hlen); +void *skb_gro_header_slow(struct sk_buff *skb, unsigned int hlen, unsigned int offset); + +void skb_gro_pull(struct sk_buff *skb, unsigned int len); +void skb_gro_postpull_rcsum(struct sk_buff *skb, const void *start, unsigned int len); +typedef struct sk_buff **(*gro_receive_t)(struct sk_buff **, struct sk_buff *); +struct sk_buff **call_gro_receive(gro_receive_t cb, struct sk_buff **head, struct sk_buff *skb); +int dev_recursion_level(void); + +struct sk_buff *skb_gso_segment(struct sk_buff *skb, netdev_features_t features); +int skb_checksum_help(struct sk_buff *skb); + +struct netdev_queue *skb_get_tx_queue(const struct net_device *dev, const struct sk_buff *skb); + +netdev_tx_t netdev_start_xmit(struct sk_buff *skb, struct net_device *dev, struct netdev_queue *txq, bool more); + /************************* ** linux/percpu-defs.h ** @@ -2881,6 +3186,7 @@ enum { CAP_NET_BROADCAST = 11, CAP_NET_ADMIN = 12, CAP_NET_RAW = 13, + CAP_IPC_LOCK = 14, CAP_SYS_ADMIN = 21, }; @@ -2888,6 +3194,13 @@ bool capable(int cap); bool ns_capable(struct user_namespace *ns, int cap); +/************************ + ** linux/capability.h ** + ************************/ + +bool file_ns_capable(const struct file *file, struct user_namespace *ns, int cap); + + /****************** ** linux/stat.h ** ******************/ @@ -2947,6 +3260,10 @@ struct inode int send_sigurg(struct fown_struct *fown); +typedef struct +{ +} read_descriptor_t; + /************************* ** asm-generic/fcntl.h ** @@ -2998,6 +3315,9 @@ void platform_device_unregister(struct platform_device *); /* needed by drivers/net/wireless/iwlwifi/iwl-devtrace.h */ #define TP_PROTO(args...) args +#define TRACE_DEFINE_ENUM(x) +#define TRACE_DEFINE_SIZEOF(x) + /******************** ** linux/dcache.h ** @@ -3111,6 +3431,8 @@ void wait_for_completion(struct completion *x); int wait_for_completion_interruptible(struct completion *x); long wait_for_completion_interruptible_timeout(struct completion *x, unsigned long timeout); long wait_for_completion_killable_timeout(struct completion *x, unsigned long timeout); +void reinit_completion(struct completion *x); + /********************** @@ -3159,9 +3481,13 @@ int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, co void free_irq(unsigned int, void *); int request_threaded_irq(unsigned int irq, irq_handler_t handler, irq_handler_t thread_fn, unsigned long flags, const char *name, void *dev); +#define devm_request_threaded_irq(__device__, ...) request_threaded_irq(__VA_ARGS__) + void tasklet_disable(struct tasklet_struct *t); void tasklet_enable(struct tasklet_struct *t); +int irq_set_affinity_hint(unsigned int irq, const struct cpumask *m); + /*********************** ** uapi/linux/uuid.h ** @@ -3178,7 +3504,12 @@ struct uuid_le ** linux/pci.h ** *****************/ -struct pci_bus; +struct pci_dev; + +struct pci_bus +{ + struct pci_dev *self; +}; enum { DEVICE_COUNT_RESOURCE = 6 }; @@ -3204,7 +3535,25 @@ void pci_set_drvdata(struct pci_dev *pdev, void *data); /* XXX needed for iwl device table, maybe remove later? */ #include -#include +//#include + +struct msix_entry { + u32 vector; + u16 entry; +}; + +void * const *pcim_iomap_table(struct pci_dev *pdev); +int pcim_enable_device(struct pci_dev *pdev); +int pcim_iomap_regions_request_all(struct pci_dev *pdev, int mask, const char *name); + + +int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec, int maxvec); +int pci_find_ext_capability(struct pci_dev *dev, int cap); +int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask); +int pci_set_dma_mask(struct pci_dev *dev, u64 mask); +struct pci_dev *pcie_find_root_port(struct pci_dev *dev); + +struct device_node * pci_device_to_OF_node(const struct pci_dev *pdev); /****************** @@ -3277,6 +3626,11 @@ ssize_t iov_iter_get_pages(struct iov_iter *i, struct page **pages, size_t csum_and_copy_to_iter(void *addr, size_t bytes, __wsum *csum, struct iov_iter *i); size_t csum_and_copy_from_iter(void *addr, size_t bytes, __wsum *csum, struct iov_iter *i); +bool csum_and_copy_from_iter_full(void *addr, size_t bytes, __wsum *csum, struct iov_iter *i); +bool copy_from_iter_full(void *addr, size_t bytes, struct iov_iter *i); +bool copy_from_iter_full_nocache(void *addr, size_t bytes, struct iov_iter *i); + +void iov_iter_revert(struct iov_iter *i, size_t bytes); /*********************** ** linux/if_bridge.h ** @@ -3327,6 +3681,23 @@ u16 vlan_tx_tag_present(struct sk_buff *); bool vlan_do_receive(struct sk_buff **); bool vlan_tx_nonzero_tag_present(struct sk_buff *); +#define skb_vlan_tag_present(__skb) (0) +#define skb_vlan_tag_get(__skb) (0xffff) + +void __vlan_hwaccel_put_tag(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci); +void vlan_set_encap_proto(struct sk_buff *skb, struct vlan_hdr *vhdr); + +static inline bool eth_type_vlan(__be16 ethertype) +{ + return false; +} + + +static inline int __vlan_insert_tag(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci) +{ + return 1; +} + /******************** ** linux/percpu.h ** @@ -3334,6 +3705,9 @@ bool vlan_tx_nonzero_tag_present(struct sk_buff *); void *__alloc_percpu(size_t size, size_t align); +#define alloc_percpu_gfp(type, gfp) \ + (typeof(type) __percpu *)__alloc_percpu(sizeof(type), __alignof__(type)) + #define alloc_percpu(type) \ (typeof(type) __percpu *)__alloc_percpu(sizeof(type), __alignof__(type)) @@ -3405,6 +3779,19 @@ struct cg_proto long sysctl_mem[3]; }; +#define mem_cgroup_sockets_enabled 0 + +static inline bool mem_cgroup_under_socket_pressure(struct mem_cgroup *memcg) +{ + return false; +} + +static inline void mem_cgroup_sk_alloc(struct sock *sk) { }; +static inline void mem_cgroup_sk_free(struct sock *sk) { }; + +bool mem_cgroup_charge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages); +void mem_cgroup_uncharge_skmem(struct mem_cgroup *memcg, unsigned int nr_pages); + /******************* ** linux/sched.h ** @@ -3451,6 +3838,19 @@ u64 local_clock(void); int fatal_signal_pending(struct task_struct *p); +/************************ + ** linux/sched/user.h ** + ************************/ + +struct user_struct +{ + atomic_long_t locked_vm; +}; + +void free_uid(struct user_struct *); +struct user_struct *get_uid(struct user_struct *u); + + /************************ ** uapi/linux/sched.h ** ************************/ @@ -3475,14 +3875,20 @@ extern int audit_enabled; ** linux/cred.h ** ******************/ +struct group_info +{ + int ngroups; + kgid_t gid[0]; +}; + struct cred { struct user_namespace *user_ns; kuid_t euid; kgid_t egid; -}; -extern struct user_namespace init_user_ns; + struct group_info *group_info; +}; static inline void current_uid_gid(kuid_t *u, kgid_t *g) { @@ -3494,6 +3900,8 @@ static inline void current_uid_gid(kuid_t *u, kgid_t *g) extern struct user_namespace init_user_ns; #define current_user_ns() (&init_user_ns) +struct user_struct *current_user(); + void put_cred(const struct cred *_cred); @@ -3616,6 +4024,8 @@ struct frag_hdr ***************/ __sum16 tcp_v4_check(int len, __be32 saddr, __be32 daddr, __wsum base); +unsigned int inner_tcp_hdrlen(const struct sk_buff *skb); +bool skb_is_tcp_pure_ack(const struct sk_buff *skb); @@ -3829,12 +4239,15 @@ enum bpf_prog_type { struct sk_buff; struct sock_filter; struct sock_fprog; +struct bpf_prog_aux; struct bpf_prog { u32 len; enum bpf_prog_type type; + struct bpf_prog_aux *aux; + union { struct sock_filter insns[0]; }; @@ -3854,6 +4267,9 @@ unsigned int sk_run_filter(const struct sk_buff *skb, int sk_attach_filter(struct sock_fprog *, struct sock *); int sk_detach_filter(struct sock *); int sk_get_filter(struct sock *, struct sock_filter *, unsigned); +int sk_filter_trim_cap(struct sock *sk, struct sk_buff *skb, unsigned int cap); +void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp); +bool sk_filter_charge(struct sock *sk, struct sk_filter *fp); #define SK_RUN_FILTER(FILTER, SKB) sk_run_filter(SKB, FILTER->insns) @@ -3867,16 +4283,26 @@ int bpf_prog_create_from_user(struct bpf_prog **pfp, struct sock_fprog *fprog, void bpf_prog_destroy(struct bpf_prog *fp); u32 bpf_prog_run_clear_cb(const struct bpf_prog *prog, struct sk_buff *skb); +int sk_reuseport_attach_bpf(u32 ufd, struct sock *sk); +int sk_reuseport_attach_filter(struct sock_fprog *fprog, struct sock *sk); +int sk_attach_bpf(u32 ufd, struct sock *sk); /***************** ** linux/bpf.h ** *****************/ +struct bpf_prog_aux +{ + u32 id; +}; + static inline struct bpf_prog *bpf_prog_get(u32 ufd) { return (struct bpf_prog*)ERR_PTR(-EOPNOTSUPP); } static inline void bpf_prog_put(struct bpf_prog *prog) { } +static inline struct bpf_prog *bpf_prog_get_type(u32 ufd, enum bpf_prog_type type) { + return (struct bpf_prog*)ERR_PTR(-EOPNOTSUPP); } /************************** @@ -3925,8 +4351,8 @@ void put_pid(struct pid *pid); enum { VERIFY_READ = 0 }; -#define get_user(x, ptr) ({ x = *ptr; 0; }) -#define put_user(x, ptr) ({ *ptr = x; 0; }) +#define get_user(x, ptr) ({ x = *(ptr); 0; }) +#define put_user(x, ptr) ({ *(ptr) = x; 0; }) static inline long copy_from_user(void *to, const void *from, unsigned long n) { @@ -3998,6 +4424,15 @@ static inline struct page *sg_page(struct scatterlist *sg) { void sg_chain(struct scatterlist *prv, unsigned int prv_nents, struct scatterlist *sgl); +int sg_nents(struct scatterlist *sg); + +struct scatterlist *sg_next(struct scatterlist *); + +#define for_each_sg(sglist, sg, nr, __i) \ + for (__i = 0, sg = (sglist); __i < (nr); __i++, sg = sg_next(sg)) + +size_t sg_pcopy_from_buffer(struct scatterlist *sgl, unsigned int nents, const void *buf, size_t buflen, off_t skip); + /************** ** net/ip.h ** @@ -4005,7 +4440,10 @@ void sg_chain(struct scatterlist *prv, unsigned int prv_nents, struct scatterlis enum { IP_DEFRAG_AF_PACKET = 42, }; -struct inet_skb_parm { unsigned unused; }; +struct inet_skb_parm +{ + int iif; +}; unsigned int ip_hdrlen(const struct sk_buff *skb); struct sk_buff *ip_check_defrag(struct net *net, struct sk_buff *skb, u32 user); @@ -4142,11 +4580,20 @@ enum { SOF_TIMESTAMPING_SYS_HARDWARE = 1 << 5, SOF_TIMESTAMPING_RAW_HARDWARE = 1 << 6, SOF_TIMESTAMPING_OPT_ID = 1 << 7, + SOF_TIMESTAMPING_TX_SCHED = 1 << 8, + SOF_TIMESTAMPING_TX_ACK = 1 << 9, SOF_TIMESTAMPING_OPT_TSONLY = 1 << 11, + SOF_TIMESTAMPING_OPT_STATS = 1 << 12, + SOF_TIMESTAMPING_OPT_TX_SWHW = 1 << 14, SOF_TIMESTAMPING_MASK = (SOF_TIMESTAMPING_RAW_HARDWARE - 1) | SOF_TIMESTAMPING_RAW_HARDWARE, }; +#define SOF_TIMESTAMPING_TX_RECORD_MASK (SOF_TIMESTAMPING_TX_HARDWARE | \ + SOF_TIMESTAMPING_TX_SOFTWARE | \ + SOF_TIMESTAMPING_TX_SCHED | \ + SOF_TIMESTAMPING_TX_ACK) + /************************* ** uapi/linux/filter.h ** @@ -4270,6 +4717,13 @@ __u32 __get_hash_from_flowi4(const struct flowi4 *fl4, struct flow_keys *keys); __u32 __get_hash_from_flowi6(const struct flowi6 *fl6, struct flow_keys *keys); +/************************** + ** net/flow_dissector.h ** + **************************/ + +#define FLOW_DISSECTOR_F_PARSE_1ST_FRAG BIT(0) + + /*********************** ** linux/pipe_fs_i.h ** ***********************/ @@ -4308,24 +4762,28 @@ static inline int acpi_dev_add_driver_gpios(struct acpi_device *adev, static inline void acpi_dev_remove_driver_gpios(struct acpi_device *adev) {} +static inline int devm_acpi_dev_add_driver_gpios(struct device *dev, const struct acpi_gpio_mapping *gpios) +{ + return -ENXIO; +} + /******************** ** linux/random.h ** ********************/ -static inline void get_random_bytes(void *buf, int nbytes) -{ - char *b = (char *)buf; +u32 prandom_u32(void); +void get_random_bytes(void *buf, int nbytes); - /* FIXME not random */ - int i; - for (i = 0; i < nbytes; ++i) - b[i] = i + 1; +static inline int get_random_bytes_wait(void *buf, int nbytes) +{ + get_random_bytes(buf, nbytes); + return 0; } -static inline u32 prandom_u32(void) +static inline u32 get_random_u32(void) { - return 4; // fair dice roll + return prandom_u32(); } static inline u32 prandom_u32_max(u32 ep_ro) { return (u32)(((u64) prandom_u32() * ep_ro) >> 32); } @@ -4419,6 +4877,13 @@ enum { }; +/********************************* + ** uapi/asm-generic/resource.h ** + *********************************/ + +#define RLIMIT_MEMLOCK 8 + + /************************* ** linux/sch_generic.h ** *************************/ @@ -4527,6 +4992,9 @@ int __xfrm_sk_clone_policy(struct sock *sk); void xfrm_sk_free_policy(struct sock *sk); int xfrm_sk_clone_policy(struct sock *sk, const struct sock *osk); +struct dst_entry; +bool xfrm_dst_offload_ok(struct dst_entry *dst); + /************************* ** linux/debug_locks.h ** @@ -4539,14 +5007,16 @@ static inline void debug_check_no_locks_freed(const void *from, unsigned long le ** net/cls_cgroup.h ** **********************/ -void sock_update_classid(struct sock *sk); +struct sock_cgroup_data; + +void sock_update_classid(struct sock_cgroup_data *skcd); /************************** ** net/netprio_cgroup.h ** **************************/ -void sock_update_netprioidx(struct sock *sk); +void sock_update_netprioidx(struct sock_cgroup_data *skcd); /******************* @@ -4578,9 +5048,18 @@ void regulator_put(struct regulator *regulator); struct gpio_desc; +enum gpiod_flags { + GPIOD_FLAGS_BIT_DIR_SET = 1 << 0, + GPIOD_FLAGS_BIT_DIR_OUT = 1 << 1, + GPIOD_OUT_LOW = GPIOD_FLAGS_BIT_DIR_SET | GPIOD_FLAGS_BIT_DIR_OUT, +}; + + struct gpio_desc * devm_gpiod_get_index(struct device *dev, const char *con_id, unsigned int idx); int gpiod_direction_output(struct gpio_desc *desc, int value); void gpiod_set_value(struct gpio_desc *desc, int value); +void gpiod_set_value_cansleep(struct gpio_desc *desc, int value); +struct gpio_desc *devm_gpiod_get_optional(struct device *dev, const char *con_id, enum gpiod_flags flags); /***************** @@ -4608,6 +5087,8 @@ struct iw_point; struct iw_request_info; +void wireless_nlevent_flush(void); + /********************* ** linux/debugfs.h ** @@ -4646,6 +5127,7 @@ enum switchdev_attr_id { struct switchdev_attr { + struct net_device *orig_dev; enum switchdev_attr_id id; u32 flags; union { @@ -4680,25 +5162,15 @@ enum { }; -/********************* - ** gpio/consumer.h ** - *********************/ - -enum gpiod_flags { - GPIOD_FLAGS_BIT_DIR_SET = 1 << 0, - GPIOD_FLAGS_BIT_DIR_OUT = 1 << 1, - GPIOD_OUT_LOW = GPIOD_FLAGS_BIT_DIR_SET | GPIOD_FLAGS_BIT_DIR_OUT, -}; - /******************* ** linux/input.h ** *******************/ struct input_dev { - unsigned long evbit;//[BITS_TO_LONGS(EV_CNT)]; - unsigned long swbit;//[BITS_TO_LONGS(SW_CNT)]; - unsigned long sw;//[BITS_TO_LONGS(SW_CNT)]; + unsigned long evbit[1];//[BITS_TO_LONGS(EV_CNT)]; + unsigned long swbit[1];//[BITS_TO_LONGS(SW_CNT)]; + unsigned long sw[1];//[BITS_TO_LONGS(SW_CNT)]; spinlock_t event_lock; }; @@ -4725,6 +5197,14 @@ struct input_handle struct input_handler *handler; }; +int input_register_handle(struct input_handle *); +int input_open_device(struct input_handle *); +void input_unregister_handle(struct input_handle *); +void input_close_device(struct input_handle *); +int input_register_handler(struct input_handler *); +void input_unregister_handler(struct input_handler *); + + /*********************** ** uapi/linux/mlps.h ** ***********************/ @@ -4753,6 +5233,14 @@ static inline void dev_coredumpm(struct device *dev, struct module *owner, free(data); } +static inline void dev_coredumpsg(struct device *dev, struct scatterlist *table, + size_t datalen, gfp_t gfp) +{ + // _devcd_free_sgtable(table); + lx_printf("%s:%d: WARNING: leaking memory for table: %p\n", + __func__, __LINE__, table); +} + /************************* ** linux/timekeeping.h ** @@ -4762,6 +5250,9 @@ typedef __s64 time64_t; time64_t ktime_get_seconds(void); +u64 ktime_get_ns(void); +u64 ktime_get_boot_ns(void); + /*********************************** ** uapi/linux/virtio_types.h:42: ** @@ -4806,15 +5297,340 @@ static inline void u64_stats_update_begin(struct u64_stats_sync *p) { } static inline void u64_stats_update_end(struct u64_stats_sync *p) { } -static inline unsigned int u64_stats_fetch_begin_irq(const struct u64_stats_sync *p) +unsigned int u64_stats_fetch_begin(const struct u64_stats_sync *syncp); +unsigned int u64_stats_fetch_begin_irq(const struct u64_stats_sync *p); +bool u64_stats_fetch_retry(const struct u64_stats_sync *syncp, unsigned int start); +bool u64_stats_fetch_retry_irq(const struct u64_stats_sync *p, unsigned int s); + + +/************************ + ** uapi/linux/uleds.h ** + ************************/ + +#define LED_MAX_NAME_SIZE 64 + + +/************************* + ** linux/cgroup-defs.h ** + *************************/ + +struct sock_cgroup_data { - return 0; + union { + u64 val; + }; +}; + +struct cgroup +{ + unsigned long foo; +}; + + +/********************* + ** net/pkg_sched.h ** + *********************/ + +#define DEFAULT_TX_QUEUE_LEN 1000 + + +/**************************** + ** uapi/linux/eventpoll.h ** + ****************************/ + +#define EPOLLIN 0x00000001 +#define EPOLLPRI 0x00000002 +#define EPOLLOUT 0x00000004 +#define EPOLLERR 0x00000008 +#define EPOLLHUP 0x00000010 +// #define EPOLLNVAL 0x00000020 +#define EPOLLRDNORM 0x00000040 +#define EPOLLRDBAND 0x00000080 +#define EPOLLWRNORM 0x00000100 +#define EPOLLWRBAND 0x00000200 +// #define EPOLLMSG 0x00000400 +#define EPOLLRDHUP 0x00002000 + + +/****************** + ** linux/sctp.h ** + ******************/ + +struct sctphdr +{ + unsigned unused; +}; + +struct sctp_header +{ + unsigned unused; +}; + + +/**************************** + ** uapi/linux/sock_diag.h ** + ****************************/ + +enum { + SK_MEMINFO_RMEM_ALLOC, + SK_MEMINFO_RCVBUF, + SK_MEMINFO_WMEM_ALLOC, + SK_MEMINFO_SNDBUF, + SK_MEMINFO_FWD_ALLOC, + SK_MEMINFO_WMEM_QUEUED, + SK_MEMINFO_OPTMEM, + SK_MEMINFO_BACKLOG, + SK_MEMINFO_DROPS, + + SK_MEMINFO_VARS, +}; + + +/*********************** + ** linux/sock_diag.h ** + ***********************/ + +u64 sock_gen_cookie(struct sock *sk); +bool sock_diag_has_destroy_listeners(const struct sock *sk); +void sock_diag_broadcast_destroy(struct sock *sk); + + +/************************** + ** net/timewait_sock.h ** + **************************/ + +struct timewait_sock_ops +{ + struct kmem_cache *twsk_slab; + char *twsk_slab_name; + unsigned int twsk_obj_size; +}; + + +/******************** + ** linux/stddef.h ** + ********************/ + +#define sizeof_field(TYPE, MEMBER) sizeof((((TYPE *)0)->MEMBER)) +#define offsetofend(TYPE, MEMBER) \ + (offsetof(TYPE, MEMBER) + sizeof_field(TYPE, MEMBER)) + + + +/***************** + ** net/codel.h ** + *****************/ + +#define CODEL_SHIFT 10 +#define MS2TIME(a) ((a * NSEC_PER_MSEC) >> CODEL_SHIFT) + +#define CODEL_DISABLED_THRESHOLD INT_MAX + +typedef u32 codel_time_t; + +struct codel_params +{ + codel_time_t target; + codel_time_t ce_threshold; + codel_time_t interval; + u32 mtu; + bool ecn; +}; + +struct codel_vars +{ + unsigned unused; +}; + +struct codel_stats +{ + unsigned unused; +}; + +codel_time_t codel_get_time(void); + +typedef u32 (*codel_skb_len_t)(const struct sk_buff *skb); +typedef codel_time_t (*codel_skb_time_t)(const struct sk_buff *skb); +typedef void (*codel_skb_drop_t)(struct sk_buff *skb, void *ctx); +typedef struct sk_buff * (*codel_skb_dequeue_t)(struct codel_vars *vars, void *ctx); + + +/********************** + ** net/codel_impl.h ** + **********************/ + +void codel_params_init(struct codel_params *params); +void codel_vars_init(struct codel_vars *vars); +void codel_stats_init(struct codel_stats *stats); + +struct sk_buff *codel_dequeue(void *ctx, u32 *backlog, struct codel_params *params, + struct codel_vars *vars, struct codel_stats *stats, + codel_skb_len_t skb_len_func, codel_skb_time_t skb_time_func, + codel_skb_drop_t drop_func, codel_skb_dequeue_t dequeue_func); + + +/************** + ** net/fq.h ** + **************/ + +struct fq_tin; + +#include + +struct fq_flow +{ + struct sk_buff_head queue; + u32 backlog; +}; + +struct fq_tin +{ + u32 backlog_bytes; + u32 backlog_packets; +}; + +struct fq +{ + struct fq_flow *flows; + spinlock_t lock; + u32 flows_cnt; + u32 memory_limit; + u32 backlog; +}; + + +typedef struct sk_buff *fq_tin_dequeue_t(struct fq *, struct fq_tin *, struct fq_flow *flow); +typedef void fq_skb_free_t(struct fq *, struct fq_tin *, struct fq_flow *, struct sk_buff *); +typedef bool fq_skb_filter_t(struct fq *, struct fq_tin *, struct fq_flow *, struct sk_buff *, void *); +typedef struct fq_flow *fq_flow_get_default_t(struct fq *, struct fq_tin *, int idx, struct sk_buff *); + + +/******************* + ** net/fq_impl.h ** + *******************/ + +struct sk_buff *fq_flow_dequeue(struct fq *fq, struct fq_flow *flow); +void fq_tin_enqueue(struct fq *fq, struct fq_tin *tin, struct sk_buff *skb, + fq_skb_free_t free_func, fq_flow_get_default_t get_default_func); +void fq_tin_filter(struct fq *fq, struct fq_tin *tin, fq_skb_filter_t filter_func, + void *filter_data, fq_skb_free_t free_func); +void fq_tin_init(struct fq_tin *tin); +void fq_flow_init(struct fq_flow *flow); +void fq_tin_reset(struct fq *fq, struct fq_tin *tin, fq_skb_free_t free_func); +int fq_init(struct fq *fq, int flows_cnt); +void fq_reset(struct fq *fq, fq_skb_free_t free_func); +struct fq_flow *fq_flow_classify(struct fq *fq, struct fq_tin *tin, struct sk_buff *skb, fq_flow_get_default_t get_default_func); +void fq_recalc_backlog(struct fq *fq, struct fq_tin *tin, struct fq_flow *flow); +struct sk_buff *fq_tin_dequeue(struct fq *fq, struct fq_tin *tin, fq_tin_dequeue_t dequeue_func); + + +/******************************* + ** XXX needed by af_packet.c ** + *******************************/ + +#include + + +/******************* + ** linux/cache.h ** + *******************/ + +#define __ro_after_init + + +/****************** + ** net/l3mdev.h ** + ******************/ + +int l3mdev_master_ifindex_by_index(struct net *net, int ifindex); + + +/******************** + ** linux/cgroup.h ** + ********************/ + +static inline void cgroup_sk_alloc(struct sock_cgroup_data *skcd) { } +static inline void cgroup_sk_free(struct sock_cgroup_data *skcd) { } + + +/******************* + ** acpi/actype.h ** + *******************/ + +typedef char *acpi_string; + + +/********************** + ** linux/bitfield.h ** + **********************/ + +#define __bf_shf(x) (__builtin_ffsll(x) - 1) +#define FIELD_PREP(_mask, _val) \ + ({ ((typeof(_mask))(_val) << __bf_shf(_mask)) & (_mask); }) +#define FIELD_GET(_mask, _reg) \ + ({ (typeof(_mask))(((_reg) & (_mask)) >> __bf_shf(_mask)); }) + +/******************** + ** linux/nospec.h ** + ********************/ + +static inline unsigned long array_index_mask_nospec(unsigned long index, + unsigned long size) +{ + (void)index; + return ~(long)(index | (size - 1UL - index)) >> (BITS_PER_LONG - 1); } -static inline bool u64_stats_fetch_retry_irq(const struct u64_stats_sync *p, unsigned int s) -{ - return false; -} + +#define array_index_nospec(index, size) \ + ({ \ + typeof(index) _i = (index); \ + typeof(size) _s = (size); \ + unsigned long _mask = array_index_mask_nospec(_i, _s); \ + \ + BUILD_BUG_ON(sizeof(_i) > sizeof(long)); \ + BUILD_BUG_ON(sizeof(_s) > sizeof(long)); \ + \ + (typeof(_i)) (_i & _mask); \ + }) + + +/**************************** + ** linux/sock_reuseport.h ** + ****************************/ + +void reuseport_detach_sock(struct sock *sk); + +/* XXX figure out why we need to include this header */ +#include + + +/*************** + ** net/dsa.h ** + ***************/ + +bool netdev_uses_dsa(struct net_device *dev); + + +/******************** + ** linux/of_net.h ** + ********************/ + +const void *of_get_mac_address(struct device_node *np); + + +/************************** + ** linux/sched/signal.h ** + **************************/ + +unsigned long rlimit(unsigned int limit); + + +/********************** + ** linux/property.h ** + **********************/ + +int device_property_read_string(struct device *dev, const char *propname, const char **val); #include diff --git a/repos/dde_linux/src/lib/wifi/init.cc b/repos/dde_linux/src/lib/wifi/init.cc index 6b03c8930..e8f40cc10 100644 --- a/repos/dde_linux/src/lib/wifi/init.cc +++ b/repos/dde_linux/src/lib/wifi/init.cc @@ -34,15 +34,15 @@ extern "C" void core_sock_init(void); extern "C" void module_packet_init(void); extern "C" void subsys_genl_init(void); extern "C" void subsys_rfkill_init(void); -extern "C" void subsys_cfg80211_init(void); +extern "C" void fs_cfg80211_init(void); extern "C" void subsys_ieee80211_init(void); -extern "C" void module_iwl_drv_init(void); +extern "C" int module_iwl_drv_init(void); extern "C" void subsys_cryptomgr_init(void); extern "C" void module_crypto_ccm_module_init(void); extern "C" void module_crypto_ctr_module_init(void); extern "C" void module_aes_init(void); extern "C" void module_arc4_init(void); -extern "C" void module_chainiv_module_init(void); +// extern "C" void module_chainiv_module_init(void); extern "C" void module_krng_mod_init(void); extern "C" unsigned int *module_param_11n_disable; @@ -56,55 +56,10 @@ struct net init_net; LIST_HEAD(net_namespace_list); -Firmware_list fw_list[] = { - { "iwlwifi-1000-3.ucode", 335056, nullptr }, - { "iwlwifi-1000-5.ucode", 337520, nullptr }, - { "iwlwifi-105-6.ucode", 689680, nullptr }, - { "iwlwifi-135-6.ucode", 701228, nullptr }, - { "iwlwifi-2000-6.ucode", 695876, nullptr }, - { "iwlwifi-2030-6.ucode", 707392, nullptr }, - { "iwlwifi-3160-7.ucode", 670484, nullptr }, - { "iwlwifi-3160-8.ucode", 667284, nullptr }, - { "iwlwifi-3160-9.ucode", 666792, nullptr }, - { "iwlwifi-3945-2.ucode", 150100, nullptr }, - { "iwlwifi-4965-2.ucode", 187972, nullptr }, - { "iwlwifi-5000-1.ucode", 345008, nullptr }, - { "iwlwifi-5000-2.ucode", 353240, nullptr }, - { "iwlwifi-5000-5.ucode", 340696, nullptr }, - { "iwlwifi-5150-2.ucode", 337400, nullptr }, - { "iwlwifi-6000-4.ucode", 454608, nullptr }, - /** - * Actually, there is no -6 firmware. The last one is revision 4, - * but certain devices support up to revision 6 and want to use - * this one. To make things simple we refer to the available - * firmware under the requested name. - */ - { "iwlwifi-6000-6.ucode", 454608, "iwlwifi-6000-4.ucode" }, - { "iwlwifi-6000g2a-5.ucode", 444128, nullptr }, - { "iwlwifi-6000g2a-6.ucode", 677296, nullptr }, - { "iwlwifi-6000g2b-5.ucode", 460236, nullptr }, - { "iwlwifi-6000g2b-6.ucode", 679436, nullptr }, - { "iwlwifi-6050-4.ucode", 463692, nullptr }, - { "iwlwifi-6050-5.ucode", 469780, nullptr }, - { "iwlwifi-7260-16.ucode", 1049284, nullptr }, - { "iwlwifi-7260-17.ucode", 1049284, "iwlwifi-7260-16.ucode" }, - { "iwlwifi-7265-16.ucode", 1180356, nullptr }, - { "iwlwifi-7265D-16.ucode", 1384500, nullptr }, - { "iwlwifi-7265D-19.ucode", 1384500, "iwlwifi-7265D-16.ucode" }, - { "iwlwifi-8000C-16.ucode", 2351636, nullptr }, - { "iwlwifi-8000C-19.ucode", 2351636, "iwlwifi-8000C-16.ucode" }, - { "iwlwifi-3160-16.ucode", 918212, nullptr }, - { "iwlwifi-3160-17.ucode", 918212, "iwlwifi-3160-16.ucode" } -}; - - -size_t fw_list_len = sizeof(fw_list) / sizeof(fw_list[0]); - - static Genode::Lock *_wpa_lock; -static void run_linux(void *) +static void run_linux(void *args) { system_power_efficient_wq = alloc_workqueue("system_power_efficient_wq", 0, 0); system_wq = alloc_workqueue("system_wq", 0, 0); @@ -114,7 +69,7 @@ static void run_linux(void *) module_packet_init(); subsys_genl_init(); subsys_rfkill_init(); - subsys_cfg80211_init(); + fs_cfg80211_init(); subsys_ieee80211_init(); subsys_cryptomgr_init(); @@ -122,9 +77,17 @@ static void run_linux(void *) module_crypto_ctr_module_init(); module_aes_init(); module_arc4_init(); - module_chainiv_module_init(); + // module_chainiv_module_init(); - module_iwl_drv_init(); + try { + int const err = module_iwl_drv_init(); + if (err) { throw -1; } + } catch (...) { + Genode::Env &env = *(Genode::Env*)args; + + env.parent().exit(1); + Genode::sleep_forever(); + } _wpa_lock->unlock(); @@ -166,7 +129,7 @@ void wifi_init(Genode::Env &env, Genode::Lock &lock, bool disable_11n) } /* Linux task (handles the initialization only currently) */ - static Lx::Task linux(run_linux, nullptr, "linux", + static Lx::Task linux(run_linux, &env, "linux", Lx::Task::PRIORITY_0, Lx::scheduler()); /* give all task a first kick before returning */ diff --git a/repos/dde_linux/src/lib/wifi/lxc_emul.c b/repos/dde_linux/src/lib/wifi/lxc_emul.c index b0614e03c..487be4766 100644 --- a/repos/dde_linux/src/lib/wifi/lxc_emul.c +++ b/repos/dde_linux/src/lib/wifi/lxc_emul.c @@ -80,22 +80,6 @@ unsigned char *lxc_skb_put(struct sk_buff *skb, size_t len) } -/**************************** - ** asm-generic/getorder.h ** - ****************************/ - -int get_order(unsigned long size) -{ - int order; - - size--; - size >>= PAGE_SHIFT; - - order = __builtin_ctzl(size); - return order; -} - - /**************************** ** asm-generic/atomic64.h ** ****************************/ @@ -111,6 +95,57 @@ long long atomic64_add_return(long long i, atomic64_t *p) } +/********************** + ** linux/refcount.h ** + **********************/ + +void refcount_add(unsigned int i, refcount_t *r) +{ + atomic_add(i, &r->refs); +} + + +void refcount_dec(refcount_t *r) +{ + atomic_dec(&r->refs); +} + + +bool refcount_dec_and_test(refcount_t *r) +{ + return atomic_dec_and_test(&r->refs); +} + + +void refcount_inc(refcount_t *r) +{ + atomic_inc(&r->refs); +} + + +bool refcount_inc_not_zero(refcount_t *r) +{ + return atomic_add_unless(&r->refs, 1, 0); +} + + +unsigned int refcount_read(const refcount_t *r) +{ + return atomic_read(&r->refs); +} + + +void refcount_set(refcount_t *r, unsigned int n) +{ + atomic_set(&r->refs, n); +} + +bool refcount_sub_and_test(unsigned int i, refcount_t *r) +{ + return atomic_sub_and_test(i, &r->refs); +} + + /********************************** ** linux/bitops.h, asm/bitops.h ** **********************************/ @@ -217,6 +252,12 @@ void netdev_run_todo() { } +void netif_set_gso_max_size(struct net_device *dev, unsigned int size) +{ + dev->gso_max_size = size; +} + + /******************** ** linux/kernel.h ** ********************/ @@ -394,3 +435,47 @@ static void sock_init(void) core_initcall(sock_init); + + +/***************** + ** net/codel.h ** + *****************/ + +codel_time_t codel_get_time(void) +{ + u64 ns = ktime_get_ns(); + return ns >> CODEL_SHIFT; +} + + +/********************** + ** net/codel_impl.h ** + **********************/ + +void codel_params_init(struct codel_params *params) +{ + params->interval = MS2TIME(100); + params->target = MS2TIME(5); + params->ce_threshold = CODEL_DISABLED_THRESHOLD; + params->ecn = false; +} + +void codel_vars_init(struct codel_vars *vars) +{ + memset(vars, 0, sizeof(*vars)); +} + +void codel_stats_init(struct codel_stats *stats) +{ + // stats->maxpacket = 0; +} + + +/************************* + ** linux/timekeeping.h ** + *************************/ + +u64 ktime_get_boot_ns(void) +{ + return (u64)ktime_get(); +} diff --git a/repos/dde_linux/src/lib/wifi/lxcc_emul.cc b/repos/dde_linux/src/lib/wifi/lxcc_emul.cc index 2c2989ca1..fb5a1c21d 100644 --- a/repos/dde_linux/src/lib/wifi/lxcc_emul.cc +++ b/repos/dde_linux/src/lib/wifi/lxcc_emul.cc @@ -15,16 +15,17 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include /* local includes */ -#include #include #include @@ -300,6 +301,24 @@ size_t copy_from_iter(void *addr, size_t bytes, struct iov_iter *i) } +bool copy_from_iter_full(void *addr, size_t bytes, struct iov_iter *i) +{ + if (bytes > i->count) + return false; + + if (bytes == 0) + return true; + + size_t const copied = copy_from_iter(addr, bytes, i); + if (copied != bytes) { + Genode::error(__func__, ":", __LINE__, " could not copy all bytes"); + return false; + } + + return true; +} + + size_t copy_to_iter(void *addr, size_t bytes, struct iov_iter *i) { if (bytes > i->count) @@ -375,6 +394,11 @@ extern "C" int memcpy_fromiovecend(unsigned char *kdata, const struct iovec *iov #include +void *kvmalloc(size_t size, gfp_t flags) +{ + return kmalloc(size, flags); +} + void *kmalloc_array(size_t n, size_t size, gfp_t flags) { @@ -389,6 +413,12 @@ void kvfree(const void *p) } +void *devm_kzalloc(struct device *dev, size_t size, gfp_t gfp) +{ + return kzalloc(size, gfp | GFP_LX_DMA); +} + + /********************* ** linux/vmalloc.h ** *********************/ @@ -583,40 +613,15 @@ int strict_strtoul(const char *s, unsigned int base, unsigned long *res) ** linux/delay.h ** *******************/ -static Timer::Connection &timer_for_msleep() -{ - static Timer::Connection inst(Lx_kit::env().env()); - return inst; -} - - -void udelay(unsigned long usecs) -{ - timer_for_msleep().usleep(usecs); - - Lx::scheduler().current()->schedule(); -} +#include void usleep_range(unsigned long min, unsigned long max) { - timer_for_msleep().usleep(min); - - Lx::scheduler().current()->schedule(); + udelay(min); } -void msleep(unsigned int msecs) -{ - timer_for_msleep().msleep(msecs); - - Lx::scheduler().current()->schedule(); -} - - -void mdelay(unsigned long msecs) { msleep(msecs); } - - /******************* ** linux/timer.h ** *******************/ @@ -669,7 +674,49 @@ unsigned long round_jiffies_relative(unsigned long j) ktime_t ktime_get_real(void) { - return (ktime_t) { .tv64 = (s64)(jiffies * (1000 / HZ) * NSEC_PER_MSEC) }; + return (ktime_t) (s64)(jiffies * (1000 / HZ) * NSEC_PER_MSEC); +} + + +ktime_t ktime_sub(ktime_t const lhs, ktime_t const rhs) +{ + return lhs - rhs; +} + + +struct timespec ktime_to_timespec(ktime_t const nsec) +{ + struct timespec ts; + if (!nsec) { return (struct timespec) {0, 0}; } + + /* XXX check nsec < NSEC_PER_SEC */ + ts.tv_sec = nsec / NSEC_PER_SEC; + ts.tv_nsec = (nsec % NSEC_PER_SEC) * (1000*1000); + + return ts; +} + + +bool ktime_to_timespec_cond(ktime_t const kt, struct timespec *ts) +{ + if (kt) { + *ts = ktime_to_timespec(kt); + return true; + } + + return false; +} + + +struct timeval ns_to_timeval(ktime_t const nsec) +{ + struct timespec ts = ktime_to_timespec(nsec); + struct timeval tv; + + tv.tv_sec = ts.tv_sec; + tv.tv_usec = ts.tv_nsec / 1000; + + return tv; } @@ -705,90 +752,25 @@ struct workqueue_struct *alloc_workqueue(const char *fmt, unsigned int flags, } -/********************** - ** linux/firmware.h ** - **********************/ - -extern Firmware_list fw_list[]; -extern size_t fw_list_len; - - -int request_firmware_nowait(struct module *module, bool uevent, - const char *name, struct device *device, - gfp_t gfp, void *context, - void (*cont)(const struct firmware *, void *)) -{ - /* only try to load known firmware images */ - Firmware_list *fwl = 0; - for (size_t i = 0; i < fw_list_len; i++) { - if (Genode::strcmp(name, fw_list[i].requested_name) == 0) { - fwl = &fw_list[i]; - break; - } - } - - if (!fwl) { - Genode::error("firmware '", name, "' is not in the firmware white list"); - return -1; - } - - char const *fw_name = fwl->available_name - ? fwl->available_name : fwl->requested_name; - Genode::Rom_connection rom(Lx_kit::env().env(), fw_name); - Genode::Dataspace_capability ds_cap = rom.dataspace(); - - if (!ds_cap.valid()) { - Genode::error("could not get firmware ROM dataspace"); - return -1; - } - - struct firmware *fw = (struct firmware *)kzalloc(sizeof(struct firmware), 0); - if (!fw) { - Genode::error("could not allocate memory for firmware metadata"); - return -1; - } - - /* use allocator because fw is too big for slab */ - if (!Lx_kit::env().heap().alloc(fwl->size, (void**)&fw->data)) { - Genode::error("Could not allocate memory for firmware image"); - kfree(fw); - return -1; - } - - void const *image = Lx_kit::env().env().rm().attach(ds_cap); - Genode::memcpy((void*)fw->data, image, fwl->size); - Lx_kit::env().env().rm().detach(image); - - fw->size = fwl->size; - - cont(fw, context); - - return 0; -} - -void release_firmware(const struct firmware *fw) -{ - Lx_kit::env().heap().free(const_cast(fw->data), fw->size); - kfree(fw); -} - - /************************* ** linux/dma-mapping.h ** *************************/ +/* use a smaller limit then possible to cover potential overhead */ +enum { DMA_LARGE_ALLOC_SIZE = 60u << 10, }; + void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag) { - dma_addr_t dma_addr; - void *addr = Lx::Malloc::dma().alloc(size, 12, &dma_addr); + bool const large_alloc = size >= DMA_LARGE_ALLOC_SIZE; + dma_addr_t dma_addr = 0; + void *addr = large_alloc ? Lx::Malloc::dma().alloc_large(size) + : Lx::Malloc::dma().alloc(size, 12, &dma_addr); - if (!addr) { - return 0; + if (addr) { + *dma_handle = large_alloc ? Lx::Malloc::dma().phys_addr(addr) + : dma_addr; } - - *dma_handle = dma_addr; - return addr; } @@ -808,6 +790,11 @@ void *dma_zalloc_coherent(struct device *dev, size_t size, void dma_free_coherent(struct device *dev, size_t size, void *vaddr, dma_addr_t dma_handle) { + if (size >= DMA_LARGE_ALLOC_SIZE) { + Lx::Malloc::dma().free_large(vaddr); + return; + } + if (Lx::Malloc::dma().inside((Genode::addr_t)vaddr)) { Lx::Malloc::dma().free(vaddr); } else { @@ -841,7 +828,8 @@ dma_addr_t dma_map_single(struct device *dev, void *cpu_addr, size_t size, if (dma_addr == ~0UL) { Genode::error(__func__, ": virtual address ", cpu_addr, - " not registered for DMA"); + " not registered for DMA ", __builtin_return_address(0)); + BUG(); } return dma_addr; @@ -983,6 +971,18 @@ void *__alloc_page_frag(struct page_frag_cache *nc, } +void *page_frag_alloc(struct page_frag_cache *nc, unsigned int fragsz, gfp_t gfp_mask) +{ + return __alloc_page_frag(nc, fragsz, gfp_mask); +} + + +void page_frag_free(void *addr) +{ + __free_page_frag(addr); +} + + void __free_page_frag(void *addr) { struct page *page = virt_to_head_page(addr); @@ -1150,12 +1150,55 @@ void *__alloc_percpu(size_t size, size_t align) } +/********************** + ** net/ns/generic.h ** + **********************/ + +void *net_generic(const struct net *net, unsigned int id) +{ + if (id >= MAX_NET_GENERIC_PTR) { + Genode::error(__func__, ":", " id ", id, " invalid"); + return NULL; + } + + struct net_generic *ng = net->gen; + void *ptr = ng->ptr[id]; + if (!ptr) { + Genode::error(__func__, ":", " cannot get ptr"); + BUG(); + } + + return ptr; +} + + /******************************* ** net/core/net/namespace.h ** *******************************/ int register_pernet_subsys(struct pernet_operations *ops) { + if (!init_net.gen) { + init_net.gen = (struct net_generic*)kzalloc( + offsetof(struct net_generic, ptr[MAX_NET_GENERIC_PTR]), 0); + if (!init_net.gen) { + Genode::error("could not allocate net_generic memory"); + return -1; + } + } + + if (ops->id && ops->size) { + /* XXX AFAICS there is only netlink_tap_net_ops that requires it */ + unsigned int id = *ops->id; + if (id >= MAX_NET_GENERIC_PTR) { + Genode::error(__func__, ":", " id ", id, " invalid"); + return -1; + } + + void *data = kzalloc(ops->size, 0); + init_net.gen->ptr[id] = data; + } + if (ops->init) ops->init(&init_net); @@ -1232,114 +1275,7 @@ int request_module(char const* format, ...) ** kernel/locking/mutex.c ** ****************************/ -/* - * XXX We have to create the waiters list lazy because the way - * DEFINE_MUTEX is currently implemented does not work w/o - * a global Env that was constructed before the static ctors - * are called - */ -static inline void __check_or_initialize_mutex(struct mutex *m) -{ - if (!m->waiters) { - m->waiters = new (&Lx_kit::env().heap()) Lx::Task::List; - } -} - - -enum { MUTEX_UNLOCKED = 1, MUTEX_LOCKED = 0, MUTEX_WAITERS = -1 }; - - -void mutex_init(struct mutex *m) -{ - static unsigned id = 0; - - m->state = MUTEX_UNLOCKED; - m->holder = nullptr; - m->waiters = nullptr; - m->id = ++id; -} - - -void mutex_destroy(struct mutex *m) -{ - /* FIXME potentially blocked tasks are not unblocked */ - - Genode::destroy(&Lx_kit::env().heap(), - static_cast(m->waiters)); - - m->holder = nullptr; - m->waiters = nullptr; - m->id = 0; -} - - -void mutex_lock(struct mutex *m) -{ - __check_or_initialize_mutex(m); - - while (1) { - if (m->state == MUTEX_UNLOCKED) { - m->state = MUTEX_LOCKED; - m->holder = Lx::scheduler().current(); - - break; - } - - Lx::Task *t = reinterpret_cast(m->holder); - - if (t == Lx::scheduler().current()) { - Genode::error("BUG: mutex does not support recursive locking"); - Genode::sleep_forever(); - } - - /* notice that a task waits for the mutex to be released */ - m->state = MUTEX_WAITERS; - - /* block until the mutex is released (and retry then) */ - Lx::scheduler().current()->mutex_block(static_cast(m->waiters)); - Lx::scheduler().current()->schedule(); - } -} - - -void mutex_unlock(struct mutex *m) -{ - __check_or_initialize_mutex(m); - - if (m->state == MUTEX_UNLOCKED) { - Genode::error("BUG: multiple mutex unlock detected"); - Genode::sleep_forever(); - } - if (m->holder != Lx::scheduler().current()) { - Genode::error("BUG: mutex unlock by task not holding the mutex"); - Genode::sleep_forever(); - } - - Lx::Task::List *waiters = static_cast(m->waiters); - - if (m->state == MUTEX_WAITERS) - while (Lx::Task::List_element *le = waiters->first()) - le->object()->mutex_unblock(waiters); - - m->state = MUTEX_UNLOCKED; - m->holder = nullptr; -} - - -int mutex_is_locked(struct mutex *m) -{ - return m->state != MUTEX_UNLOCKED; -} - - -int mutex_trylock(struct mutex *m) -{ - if (mutex_is_locked(m)) - return false; - - mutex_lock(m); - return true; -} +#include /****************** @@ -1383,6 +1319,30 @@ void pci_set_drvdata(struct pci_dev *pdev, void *data) } +static struct pcim_iomap_devres { + void *table[6]; +} _devres_table; + + +int pcim_iomap_regions_request_all(struct pci_dev *pdev, int mask, const char *name) +{ + /* XXX iwlwifi just want to map the first BAR */ + void *addr = pci_ioremap_bar(pdev, 0); + if (!addr) { return -1; } + + printk("%s:%d from: %p addr: %p\n", __func__, __LINE__, __builtin_return_address(0), addr); + + _devres_table.table[0] = addr; + return 0; +} + + +void * const *pcim_iomap_table(struct pci_dev *pdev) +{ + return _devres_table.table; +} + + /*********************** ** linux/interrupt.h ** ***********************/ @@ -1423,22 +1383,10 @@ void pci_dev_put(struct pci_dev *pci_dev) #include -static void execute_delayed_work(unsigned long dwork) -{ - Lx::Work::work_queue().schedule_delayed((struct delayed_work *)dwork, 0); - Lx::Work::work_queue().unblock(); -} - - bool mod_delayed_work(struct workqueue_struct *wq, struct delayed_work *dwork, unsigned long delay) { - /* treat delayed work without delay like any other work */ - if (delay == 0) { - execute_delayed_work((unsigned long)dwork); - } else { - mod_timer(&dwork->timer, jiffies + delay); - } + queue_delayed_work(wq, dwork, delay); return true; } @@ -1520,3 +1468,138 @@ int wake_up_process(struct task_struct *tsk) { return 0; } *******************/ #include + + +/***************** + ** linux/idr.h ** + *****************/ + +struct Idr +{ + enum { INVALID_ENTRY = ~0ul, }; + enum { MAX_ENTRIES = 1024, }; + + Genode::Bit_array _barray { }; + addr_t _ptr[MAX_ENTRIES] { }; + void *_idp { nullptr }; + + bool _check(addr_t index) { return index < MAX_ENTRIES ? true : false; } + + Idr(struct idr *idp) : _idp(idp) { } + + virtual ~Idr() { } + + bool handles(void *ptr) { return _idp == ptr; } + + bool set_id(addr_t index, void *ptr) + { + if (_barray.get(index, 1)) { return false; } + + _barray.set(index, 1); + _ptr[index] = ptr; + return true; + } + + addr_t alloc(addr_t start, void *ptr) + { + addr_t index = INVALID_ENTRY; + for (addr_t i = start; i < MAX_ENTRIES; i++) { + if (_barray.get(i, 1)) { continue; } + index = i; + break; + } + + if (index == INVALID_ENTRY) { return INVALID_ENTRY; } + + _barray.set(index, 1); + _ptr[index] = ptr; + return index; + } + + void clear(addr_t index) + { + if (!_check(index)) { return; } + + _barray.clear(index, 1); + _ptr[index] = 0; + } + + addr_t next(addr_t index) + { + for (addr_t i = index; i < MAX_ENTRIES; i++) { + if (_barray.get(i, 1)) { return i; } + } + return INVALID_ENTRY; + } + + void *get_ptr(addr_t index) + { + if (!_check(index)) { return NULL; } + return (void*)_ptr[index]; + } +}; + + +static Genode::Registry> _idr_registry; + + +static Idr &idp_to_idr(struct idr *idp) +{ + Idr *idr = nullptr; + auto lookup = [&](Idr &i) { + if (i.handles(idp)) { idr = &i; } + }; + _idr_registry.for_each(lookup); + + if (!idr) { + Genode::Registered *i = new (&Lx_kit::env().heap()) + Genode::Registered(_idr_registry, idp); + idr = &*i; + } + + return *idr; +} + + +int idr_alloc(struct idr *idp, void *ptr, int start, int end, gfp_t gfp_mask) +{ + Idr &idr = idp_to_idr(idp); + + if ((end - start) > 1) { + addr_t const id = idr.alloc(start, ptr); + return id != Idr::INVALID_ENTRY ? id : -1; + } else { + if (idr.set_id(start, ptr)) { return start; } + } + + return -1; +} + + +void *idr_find(struct idr *idp, int id) +{ + Idr &idr = idp_to_idr(idp); + return idr.get_ptr(id); +} + + +void *idr_get_next(struct idr *idp, int *nextid) +{ + Idr &idr = idp_to_idr(idp); + addr_t i = idr.next(*nextid); + if (i == Idr::INVALID_ENTRY) { return NULL; } + + *nextid = i; + return idr.get_ptr(i); +} + + +/**************************** + ** asm-generic/getorder.h ** + ****************************/ + +int get_order(unsigned long size) +{ + if (size < PAGE_SIZE) { return 0; } + return Genode::log2(size) - PAGE_SHIFT; +} diff --git a/repos/dde_linux/src/lib/wifi/nic.cc b/repos/dde_linux/src/lib/wifi/nic.cc index 42fd30934..983ab9185 100644 --- a/repos/dde_linux/src/lib/wifi/nic.cc +++ b/repos/dde_linux/src/lib/wifi/nic.cc @@ -26,6 +26,8 @@ #include #include +#include + #include # include # include @@ -38,6 +40,66 @@ enum { }; +struct Tx_data +{ + net_device *ndev; + struct sk_buff *skb; + Lx::Task *task; + int err; +}; + +static Lx::Task *_tx_task; +static Tx_data _tx_data; + + +static void _run_tx_task(void *args) +{ + Tx_data *data = static_cast(args); + + while (1) { + Lx::scheduler().current()->block_and_schedule(); + + net_device *ndev = data->ndev; + struct sk_buff *skb = data->skb; + + data->err = ndev->netdev_ops->ndo_start_xmit(skb, ndev); + if (data->err) { + Genode::warning("xmit failed: ", data->err, " skb: ", skb); + } + + data->skb = nullptr; + + if (data->task) { + data->task->unblock(); + data->task = nullptr; + } + } +} + + +bool tx_task_send(struct sk_buff *skb) +{ + if (_tx_data.skb) { + Genode::error("skb: ", skb, " already queued"); + return false; + } + + if (!_tx_task) { + Genode::error("no TX task available"); + return false; + } + + _tx_data.ndev = skb->dev; + _tx_data.skb = skb; + _tx_data.task = Lx::scheduler().current(); + + _tx_task->unblock(); + Lx::scheduler().current()->block_and_schedule(); + + return true; +} + + /** * Nic::Session implementation */ @@ -48,29 +110,6 @@ class Wifi_session_component : public Nic::Session_component net_device *_ndev; bool _has_link = !(_ndev->state & 1UL << __LINK_STATE_NOCARRIER); - struct Tx_data - { - net_device *ndev; - struct sk_buff *skb; - } _tx_data; - - static void _run_tx_task(void *args) - { - Tx_data *data = static_cast(args); - - while (1) { - Lx::scheduler().current()->block_and_schedule(); - - net_device *ndev = data->ndev; - struct sk_buff *skb = data->skb; - - ndev->netdev_ops->ndo_start_xmit(skb, ndev); - } - } - - Lx::Task _tx_task { _run_tx_task, &_tx_data, "tx_task", - Lx::Task::PRIORITY_1, Lx::scheduler() }; - protected: bool _send() @@ -86,6 +125,15 @@ class Wifi_session_component : public Nic::Session_component return false; } + /* XXX enable as soon as the other stack plays along + if (!_has_link) { + Packet_descriptor packet = _tx.sink()->get_packet(); + _tx.sink()->acknowledge_packet(packet); + Genode::warning("no link, drop packet"); + return true; + } + */ + if (!_tx.sink()->ready_to_ack()) { return false; } if (!_tx.sink()->packet_avail()) { return false; } @@ -97,13 +145,15 @@ class Wifi_session_component : public Nic::Session_component struct sk_buff *skb = lxc_alloc_skb(packet.size() + HEAD_ROOM, HEAD_ROOM); + skb->dev = _ndev; + unsigned char *data = lxc_skb_put(skb, packet.size()); Genode::memcpy(data, _tx.sink()->packet_content(packet), packet.size()); _tx_data.ndev = _ndev; _tx_data.skb = skb; - _tx_task.unblock(); + _tx_task->unblock(); Lx::scheduler().schedule(); _tx.sink()->acknowledge_packet(packet); @@ -180,7 +230,6 @@ class Wifi_session_component : public Nic::Session_component } } - /***************************** ** NIC-component interface ** *****************************/ @@ -264,17 +313,10 @@ class Root : public Genode::Root_component _list; Genode::Tslab _block_alloc; + void *_ptr; + public: - Notifier() : _block_alloc(_alloc) { } + Notifier(Genode::Allocator &alloc, void *ptr) + : _block_alloc(&alloc), _ptr(ptr) { } + + virtual ~Notifier() { }; + + bool handles(void *ptr) + { + return _ptr == ptr; + } void register_block(struct notifier_block *nb) { @@ -335,29 +388,46 @@ class Lx::Notifier }; +static Genode::Registry> _blocking_notifier_registry; + + /* XXX move blocking_notifier_call to proper location */ /********************** ** linux/notifier.h ** **********************/ -static Lx::Notifier &blocking_notifier() +static Lx::Notifier &blocking_notifier(struct blocking_notifier_head *nh) { - static Lx::Notifier inst; - return inst; + Lx::Notifier *notifier = nullptr; + auto lookup = [&](Lx::Notifier &n) { + if (!n.handles(nh)) { return; } + + notifier = &n; + }; + _blocking_notifier_registry.for_each(lookup); + + if (!notifier) { + Genode::Registered *n = new (&Lx_kit::env().heap()) + Genode::Registered(_blocking_notifier_registry, + Lx_kit::env().heap(), nh); + notifier = &*n; + } + + return *notifier; } int blocking_notifier_chain_register(struct blocking_notifier_head *nh, struct notifier_block *nb) { - blocking_notifier().register_block(nb); + blocking_notifier(nh).register_block(nb); return 0; } int blocking_notifier_chain_unregister(struct blocking_notifier_head *nh, struct notifier_block *nb) { - blocking_notifier().unregister_block(nb); + blocking_notifier(nh).unregister_block(nb); return 0; } @@ -365,7 +435,7 @@ int blocking_notifier_chain_unregister(struct blocking_notifier_head *nh, int blocking_notifier_call_chain(struct blocking_notifier_head *nh, unsigned long val, void *v) { - return blocking_notifier().call_all_blocks(val, v); + return blocking_notifier(nh).call_all_blocks(val, v); } @@ -375,7 +445,7 @@ int blocking_notifier_call_chain(struct blocking_notifier_head *nh, static Lx::Notifier &net_notifier() { - static Lx::Notifier inst; + static Lx::Notifier inst(Lx_kit::env().heap(), NULL); return inst; } @@ -446,7 +516,7 @@ class Proto_hook_list static Proto_hook_list& proto_hook_list() { - static Proto_hook_list inst(*_alloc); + static Proto_hook_list inst(Lx_kit::env().heap()); return inst; } @@ -512,15 +582,12 @@ extern "C" int dev_queue_xmit(struct sk_buff *skb) { struct net_device *dev = skb->dev; struct net_device_ops const *ops = dev->netdev_ops; - int rv = NETDEV_TX_OK; if (skb->next) { Genode::warning("more skb's queued"); } - rv = ops->ndo_start_xmit(skb, dev); - - return rv; + return tx_task_send(skb) ? NETDEV_TX_OK : -1; } @@ -568,10 +635,15 @@ extern "C" int register_netdevice(struct net_device *ndev) int err = ndev->netdev_ops->ndo_open(ndev); if (err) { - Genode::error("ndo_open() failed: ", err); + Genode::error("Initializing device failed"); + throw -1; return err; } + static Lx::Task tx_task { _run_tx_task, &_tx_data, "tx_task", + Lx::Task::PRIORITY_1, Lx::scheduler() }; + _tx_task = &tx_task; + if (ndev->netdev_ops->ndo_set_rx_mode) ndev->netdev_ops->ndo_set_rx_mode(ndev); @@ -693,7 +765,7 @@ extern "C" struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name /* ensure 32-byte alignment of whole construct */ alloc_size += NETDEV_ALIGN - 1; - p = (net_device *)kzalloc(alloc_size, GFP_KERNEL | __GFP_NOWARN | __GFP_REPEAT); + p = (net_device *)kzalloc(alloc_size, GFP_KERNEL); if (!p) return NULL; diff --git a/repos/dde_linux/src/lib/wifi/random.cc b/repos/dde_linux/src/lib/wifi/random.cc new file mode 100644 index 000000000..e8038cc1e --- /dev/null +++ b/repos/dde_linux/src/lib/wifi/random.cc @@ -0,0 +1,104 @@ +/* + * \brief Linux random emulation code + * \author Josef Soentgen + * \date 2016-10-19 + */ + +/* + * Copyright (C) 2016-2017 Genode Labs GmbH + * + * This file is distributed under the terms of the GNU General Public License + * version 2. + */ + +/* Genode includes */ +#include +#include + + +using Genode::uint64_t; + +/* + * Xoroshiro128+ written in 2014-2016 by Sebastiano Vigna (vigna@acm.org) + * + * (see http://xoroshiro.di.unimi.it/xorshift128plus.c and + * http://xoroshiro.di.unimi.it/splitmix64.c) + */ + +struct Xoroshiro +{ + uint64_t seed; + + uint64_t splitmix64() + { + uint64_t z = (seed += __UINT64_C(0x9E3779B97F4A7C15)); + z = (z ^ (z >> 30)) * __UINT64_C(0xBF58476D1CE4E5B9); + z = (z ^ (z >> 27)) * __UINT64_C(0x94D049BB133111EB); + return z ^ (z >> 31); + } + + Xoroshiro(uint64_t seed) : seed(seed) + { + s[0] = splitmix64(); + s[1] = splitmix64(); + } + + uint64_t s[2]; + + static uint64_t rotl(uint64_t const x, int k) { + return (x << k) | (x >> (64 - k)); + } + + uint64_t get() + { + uint64_t const s0 = s[0]; + uint64_t s1 = s[1]; + uint64_t const result = s0 + s1; + + s1 ^= s0; + + s[0] = rotl(s0, 55) ^ s1 ^ (s1 << 14); + s[1] = rotl(s1, 36); + + return result; + } +}; + + +static Xoroshiro xoroshiro(0x636864324d766931); + + +/******************** + ** linux/random.h ** + ********************/ + +extern "C" void get_random_bytes(void *buf, int nbytes) +{ + if (nbytes <= 0) { + return; + } + + char *p = reinterpret_cast(buf); + + int const rounds = nbytes / 8; + for (int i = 0; i < rounds; i++) { + uint64_t const v = xoroshiro.get(); + + Genode::memcpy(p, &v, 8); + p += 8; + } + + int const remain = nbytes - rounds * 8; + if (!remain) { + return; + } + + uint64_t const v = xoroshiro.get(); + Genode::memcpy(p, &v, remain); +} + + +extern "C" unsigned int prandom_u32(void) +{ + return xoroshiro.get(); +} diff --git a/repos/dde_linux/src/lib/wpa_driver_nl80211/ioctl.cc b/repos/dde_linux/src/lib/wpa_driver_nl80211/ioctl.cc index 2c5b676b6..37ba5eff9 100644 --- a/repos/dde_linux/src/lib/wpa_driver_nl80211/ioctl.cc +++ b/repos/dde_linux/src/lib/wpa_driver_nl80211/ioctl.cc @@ -100,4 +100,8 @@ int linux_br_del_if(int sock, const char *brname, const char *ifname) { int linux_br_get(char *brname, const char *ifname) { return -1; } + +int linux_master_get(char *master_ifname, const char *ifname) { + return -1; } + } /* extern "C" */ diff --git a/repos/dde_linux/src/lib/wpa_supplicant/ctrl_iface_genode.c b/repos/dde_linux/src/lib/wpa_supplicant/ctrl_iface_genode.c new file mode 100644 index 000000000..9bbad80ce --- /dev/null +++ b/repos/dde_linux/src/lib/wpa_supplicant/ctrl_iface_genode.c @@ -0,0 +1,96 @@ +/* + * WPA Supplicant / UNIX domain socket -based control interface + * Copyright (c) 2004-2014, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#include "includes.h" + +#include "utils/common.h" +#include "utils/eloop.h" +#include "utils/list.h" +#include "common/ctrl_iface_common.h" +#include "eapol_supp/eapol_supp_sm.h" +#include "config.h" +#include "wpa_supplicant_i.h" +#include "ctrl_iface.h" + +struct ctrl_iface_priv { + struct wpa_supplicant *wpa_s; +}; + + +struct ctrl_iface_global_priv { + struct wpa_global *global; +}; + +struct ctrl_iface_msg { + struct wpa_supplicant *wpa_s; +}; + + +struct ctrl_iface_priv * +wpa_supplicant_ctrl_iface_init(struct wpa_supplicant *wpa_s) +{ + printf("%s:%d\n", __func__, __LINE__); + + struct ctrl_iface_priv *priv; + + priv = os_zalloc(sizeof(*priv)); + if (priv == NULL) + return NULL; + + if (wpa_s->conf->ctrl_interface == NULL) + return priv; + + return priv; +} + + +void wpa_supplicant_ctrl_iface_deinit(struct ctrl_iface_priv *priv) +{ + printf("%s:%d\n", __func__, __LINE__); + + struct wpa_ctrl_dst *dst, *prev; + struct ctrl_iface_msg *msg, *prev_msg; + struct ctrl_iface_global_priv *gpriv; + + os_free(priv); +} + + +void wpa_supplicant_ctrl_iface_wait(struct ctrl_iface_priv *priv) +{ + printf("%s:%d\n", __func__, __LINE__); +} + + +struct ctrl_iface_global_priv * +wpa_supplicant_global_ctrl_iface_init(struct wpa_global *global) +{ + printf("%s:%d\n", __func__, __LINE__); + + struct ctrl_iface_global_priv *priv; + + priv = os_zalloc(sizeof(*priv)); + if (priv == NULL) + return NULL; + + if (global->params.ctrl_interface == NULL) + return priv; + + return priv; +} + + +void wpa_supplicant_global_ctrl_iface_deinit(struct ctrl_iface_global_priv *priv) +{ + printf("%s:%d\n", __func__, __LINE__); + + struct wpa_ctrl_dst *dst, *prev; + struct ctrl_iface_msg *msg, *prev_msg; + + os_free(priv); +} diff --git a/repos/dde_linux/src/lib/wpa_supplicant/main.c b/repos/dde_linux/src/lib/wpa_supplicant/main.c index b6cf81074..55a1ff5f8 100644 --- a/repos/dde_linux/src/lib/wpa_supplicant/main.c +++ b/repos/dde_linux/src/lib/wpa_supplicant/main.c @@ -63,6 +63,7 @@ int wpa_main(int debug_msg, int interval) memset(¶ms, 0, sizeof(params)); params.wpa_debug_level = debug_msg ? MSG_DEBUG : MSG_INFO; + params.ctrl_interface = "GENODE"; global = wpa_supplicant_init(¶ms); if (global == NULL) @@ -73,7 +74,7 @@ int wpa_main(int debug_msg, int interval) iface.ifname = "wlan0"; iface.confname = conf_file; - if (wpa_supplicant_add_iface(global, &iface) == NULL) + if (wpa_supplicant_add_iface(global, &iface, NULL) == NULL) exitcode = -1; if (connected_scan_interval > 0) diff --git a/repos/dde_linux/src/lib/wpa_supplicant/reporter.cc b/repos/dde_linux/src/lib/wpa_supplicant/reporter.cc index e4ee4cce5..ed41ee332 100644 --- a/repos/dde_linux/src/lib/wpa_supplicant/reporter.cc +++ b/repos/dde_linux/src/lib/wpa_supplicant/reporter.cc @@ -43,7 +43,7 @@ extern "C" void wpa_reporter_init(void *env) } -enum { SSID_MAX_LEN = 32 + 1, MAC_STR_LEN = 6*2 + 5 + 1}; +enum { SSID_STRING_MAX_LEN = 32 + 1, MAC_STR_LEN = 6*2 + 5 + 1}; static inline void mac2str(char *buf, u8 const *mac) @@ -60,7 +60,7 @@ extern "C" void wpa_report_connect_event(struct wpa_supplicant *wpa_s) struct wpa_ssid *wpa_ssid = wpa_s->current_ssid; /* FIXME ssid may contain any characters, even NUL */ - Genode::String + Genode::String ssid(Genode::Cstring((char *)wpa_ssid->ssid, wpa_ssid->ssid_len)); char bssid_buf[MAC_STR_LEN]; diff --git a/repos/dde_linux/src/lib/wpa_supplicant/symbol.map b/repos/dde_linux/src/lib/wpa_supplicant/symbol.map index 01695c3d2..bebca77a1 100644 --- a/repos/dde_linux/src/lib/wpa_supplicant/symbol.map +++ b/repos/dde_linux/src/lib/wpa_supplicant/symbol.map @@ -17,6 +17,9 @@ os_*; wpa_*; wpabuf_*; + sha1_vector*; + get_ie*; + fc2str*; local: diff --git a/repos/dde_linux/wifi.list b/repos/dde_linux/wifi.list index da48689f8..a7a48951f 100644 --- a/repos/dde_linux/wifi.list +++ b/repos/dde_linux/wifi.list @@ -1,13 +1,13 @@ linux-x.x.x/crypto/ablkcipher.c linux-x.x.x/crypto/aead.c linux-x.x.x/crypto/aes_generic.c +linux-x.x.x/crypto/ahash.c linux-x.x.x/crypto/algapi.c linux-x.x.x/crypto/algboss.c linux-x.x.x/crypto/api.c linux-x.x.x/crypto/arc4.c linux-x.x.x/crypto/blkcipher.c linux-x.x.x/crypto/ccm.c -linux-x.x.x/crypto/chainiv.c linux-x.x.x/crypto/cipher.c linux-x.x.x/crypto/compress.c linux-x.x.x/crypto/crypto_wq.c @@ -16,123 +16,162 @@ linux-x.x.x/crypto/internal.h linux-x.x.x/crypto/memneq.c linux-x.x.x/crypto/rng.c linux-x.x.x/crypto/scatterwalk.c +linux-x.x.x/crypto/shash.c +linux-x.x.x/crypto/skcipher.c linux-x.x.x/drivers/leds/led-class.c linux-x.x.x/drivers/leds/led-core.c linux-x.x.x/drivers/leds/led-triggers.c linux-x.x.x/drivers/leds/leds.h -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/agn.h -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/calib.c -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/calib.h -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/commands.h -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/dev.h -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/devices.c -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/led.c -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/led.h -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/lib.c -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/mac80211.c -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/main.c -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/power.c -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/power.h -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/rs.c -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/rs.h -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/rx.c -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/rxon.c -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/scan.c -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/sta.c -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/tt.c -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/tt.h -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/tx.c -linux-x.x.x/drivers/net/wireless/iwlwifi/dvm/ucode.c -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-1000.c -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-2000.c -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-5000.c -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-6000.c -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-7000.c -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-8000.c -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-agn-hw.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-config.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-csr.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-debug.c -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-debug.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-devtrace.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-devtrace-data.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-devtrace-io.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-devtrace-iwlwifi.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-devtrace-msg.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-devtrace-ucode.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-drv.c -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-drv.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-eeprom-parse.c -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-eeprom-parse.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-eeprom-read.c -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-eeprom-read.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-fh.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-fw-error-dump.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-fw-file.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-fw.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-io.c -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-io.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-modparams.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-notif-wait.c -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-notif-wait.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-nvm-parse.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-op-mode.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-phy-db.c -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-phy-db.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-prph.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-scd.h -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-trans.c -linux-x.x.x/drivers/net/wireless/iwlwifi/iwl-trans.h -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/binding.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/coex.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/coex_legacy.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/constants.h -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/d3.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/fw-api-coex.h -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/fw-api-d3.h -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/fw-api-mac.h -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/fw-api-power.h -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/fw-api-rs.h -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/fw-api-rx.h -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/fw-api-sta.h -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/fw-api-stats.h -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/fw-api-tof.h -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/fw-api-tx.h -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/fw-api.h -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/fw.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/led.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/mac80211.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/mvm.h -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/nvm.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/offloading.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/ops.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/phy-ctxt.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/power.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/quota.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/rs.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/rs.h -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/rx.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/scan.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/sf.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/sta.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/sta.h -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/testmode.h -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/time-event.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/time-event.h -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/tdls.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/tof.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/tof.h -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/tt.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/tx.c -linux-x.x.x/drivers/net/wireless/iwlwifi/mvm/utils.c -linux-x.x.x/drivers/net/wireless/iwlwifi/pcie/drv.c -linux-x.x.x/drivers/net/wireless/iwlwifi/pcie/internal.h -linux-x.x.x/drivers/net/wireless/iwlwifi/pcie/rx.c -linux-x.x.x/drivers/net/wireless/iwlwifi/pcie/trans.c -linux-x.x.x/drivers/net/wireless/iwlwifi/pcie/tx.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/cfg/1000.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/cfg/2000.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/cfg/22000.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/cfg/5000.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/cfg/6000.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/cfg/7000.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/cfg/8000.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/cfg/9000.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/agn.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/calib.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/calib.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/commands.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/dev.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/devices.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/led.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/led.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/lib.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/mac80211.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/main.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/power.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/power.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/rs.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/rs.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/rx.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/rxon.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/scan.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/sta.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/tt.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/tt.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/tx.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/dvm/ucode.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/acpi.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/alive.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/binding.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/cmdhdr.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/coex.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/commands.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/config.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/context.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/d3.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/datapath.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/debug.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/filter.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/led.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/mac-cfg.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/mac.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/offload.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/paging.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/phy-ctxt.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/phy.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/power.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/rs.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/rx.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/scan.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/sf.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/sta.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/stats.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/tdls.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/time-event.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/tof.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/tx.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/api/txq.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/common_rx.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/dbg.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/dbg.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/debugfs.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/error-dump.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/file.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/img.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/init.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/notif-wait.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/notif-wait.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/nvm.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/paging.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/runtime.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/fw/smem.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-agn-hw.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-config.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-context-info.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-csr.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-debug.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-debug.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-data.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-io.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-iwlwifi.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-msg.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-ucode.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-devtrace.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-drv.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-drv.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-read.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-read.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-fh.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-io.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-io.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-modparams.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-op-mode.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-phy-db.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-phy-db.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-prph.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-scd.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-trans.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/iwl-trans.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/binding.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/coex.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/constants.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/d3.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/fw-api.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/fw.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/led.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/offloading.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/ops.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/phy-ctxt.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/power.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/quota.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/rs.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/rs.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/rx.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/scan.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/sf.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/sta.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/sta.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/tdls.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/testmode.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/time-event.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/time-event.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/tof.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/tof.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/tt.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/tx.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/mvm/utils.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/pcie/drv.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/pcie/internal.h +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/pcie/rx.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/pcie/trans.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/pcie/tx.c +linux-x.x.x/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c linux-x.x.x/include/asm-generic/atomic64.h linux-x.x.x/include/asm-generic/bitops/__ffs.h linux-x.x.x/include/asm-generic/bitops/__fls.h @@ -140,14 +179,15 @@ linux-x.x.x/include/asm-generic/bitops/ffs.h linux-x.x.x/include/asm-generic/bitops/fls.h linux-x.x.x/include/asm-generic/bitops/fls64.h linux-x.x.x/include/asm-generic/bitops/non-atomic.h -linux-x.x.x/include/asm-generic/pci-dma-compat.h linux-x.x.x/include/crypto/aead.h linux-x.x.x/include/crypto/aes.h linux-x.x.x/include/crypto/algapi.h linux-x.x.x/include/crypto/crypto_wq.h linux-x.x.x/include/crypto/ctr.h +linux-x.x.x/include/crypto/hash.h linux-x.x.x/include/crypto/internal/aead.h linux-x.x.x/include/crypto/internal/geniv.h +linux-x.x.x/include/crypto/internal/hash.h linux-x.x.x/include/crypto/internal/rng.h linux-x.x.x/include/crypto/internal/skcipher.h linux-x.x.x/include/crypto/null.h @@ -155,10 +195,12 @@ linux-x.x.x/include/crypto/rng.h linux-x.x.x/include/crypto/scatterwalk.h linux-x.x.x/include/crypto/skcipher.h linux-x.x.x/include/linux/average.h +linux-x.x.x/include/linux/bsearch.h linux-x.x.x/include/linux/crypto.h linux-x.x.x/include/linux/ctype.h -linux-x.x.x/include/linux/ethtool.h linux-x.x.x/include/linux/errqueue.h +linux-x.x.x/include/linux/ethtool.h +linux-x.x.x/include/linux/gcd.h linux-x.x.x/include/linux/genetlink.h linux-x.x.x/include/linux/hashtable.h linux-x.x.x/include/linux/ieee80211.h @@ -177,10 +219,8 @@ linux-x.x.x/include/linux/netlink.h linux-x.x.x/include/linux/pci_ids.h linux-x.x.x/include/linux/rbtree.h linux-x.x.x/include/linux/rbtree_augmented.h -linux-x.x.x/include/linux/rhashtable.h -linux-x.x.x/include/linux/rfkill-gpio.h -linux-x.x.x/include/linux/rfkill-regulator.h linux-x.x.x/include/linux/rfkill.h +linux-x.x.x/include/linux/rhashtable.h linux-x.x.x/include/linux/rtnetlink.h linux-x.x.x/include/linux/skbuff.h linux-x.x.x/include/linux/socket.h @@ -227,9 +267,12 @@ linux-x.x.x/include/uapi/linux/snmp.h linux-x.x.x/include/uapi/linux/socket.h linux-x.x.x/include/uapi/linux/sockios.h linux-x.x.x/include/uapi/linux/swab.h +linux-x.x.x/lib/bsearch.c +linux-x.x.x/lib/bucket_locks.c linux-x.x.x/lib/crc32.c linux-x.x.x/lib/crc32defs.h linux-x.x.x/lib/ctype.c +linux-x.x.x/lib/gcd.c linux-x.x.x/lib/nlattr.c linux-x.x.x/lib/rbtree.c linux-x.x.x/lib/rhashtable.c @@ -238,11 +281,11 @@ linux-x.x.x/net/core/rtnetlink.c linux-x.x.x/net/core/skbuff.c linux-x.x.x/net/core/sock.c linux-x.x.x/net/ethernet/eth.c -linux-x.x.x/net/mac80211/aes_ccm.c +linux-x.x.x/net/mac80211/aead_api.c +linux-x.x.x/net/mac80211/aead_api.h linux-x.x.x/net/mac80211/aes_ccm.h linux-x.x.x/net/mac80211/aes_cmac.c linux-x.x.x/net/mac80211/aes_cmac.h -linux-x.x.x/net/mac80211/aes_gcm.c linux-x.x.x/net/mac80211/aes_gcm.h linux-x.x.x/net/mac80211/aes_gmac.c linux-x.x.x/net/mac80211/aes_gmac.h @@ -258,6 +301,8 @@ linux-x.x.x/net/mac80211/debugfs_sta.h linux-x.x.x/net/mac80211/driver-ops.c linux-x.x.x/net/mac80211/driver-ops.h linux-x.x.x/net/mac80211/ethtool.c +linux-x.x.x/net/mac80211/fils_aead.c +linux-x.x.x/net/mac80211/fils_aead.h linux-x.x.x/net/mac80211/ht.c linux-x.x.x/net/mac80211/ibss.c linux-x.x.x/net/mac80211/ieee80211_i.h @@ -315,7 +360,6 @@ linux-x.x.x/net/packet/internal.h linux-x.x.x/net/rfkill/core.c linux-x.x.x/net/rfkill/input.c linux-x.x.x/net/rfkill/rfkill-gpio.c -linux-x.x.x/net/rfkill/rfkill-regulator.c linux-x.x.x/net/rfkill/rfkill.h linux-x.x.x/net/wireless/ap.c linux-x.x.x/net/wireless/chan.c @@ -332,7 +376,6 @@ linux-x.x.x/net/wireless/radiotap.c linux-x.x.x/net/wireless/rdev-ops.h linux-x.x.x/net/wireless/reg.c linux-x.x.x/net/wireless/reg.h -linux-x.x.x/net/wireless/regdb.h linux-x.x.x/net/wireless/scan.c linux-x.x.x/net/wireless/sme.c linux-x.x.x/net/wireless/sysfs.c